MailPoet Newsletters (New) - Version 3.100.1

Version Description

  • 2022-10-06 =
  • Fixed: In some instances the sending stuck because the EntityManager was closed.
Download this release

Release Info

Developer MailPoet
Plugin Icon 128x128 MailPoet Newsletters (New)
Version 3.100.1
Comparing to
See all releases

Code changes from version 3.100.0 to 3.100.1

generated/FreeCachedContainer.php CHANGED
@@ -1805,7 +1805,7 @@ class FreeCachedContainer extends Container
1805
  */
1806
  protected function getCronWorkerRunnerService()
1807
  {
1808
- return $this->services['MailPoet\\Cron\\CronWorkerRunner'] = new \MailPoet\Cron\CronWorkerRunner(($this->services['MailPoet\\Cron\\CronHelper'] ?? $this->getCronHelperService()), ($this->services['MailPoet\\Cron\\CronWorkerScheduler'] ?? $this->getCronWorkerSchedulerService()), ($this->services['MailPoet\\WP\\Functions'] ?? ($this->services['MailPoet\\WP\\Functions'] = new \MailPoet\WP\Functions())), ($this->services['MailPoet\\Newsletter\\Sending\\ScheduledTasksRepository'] ?? $this->getScheduledTasksRepositoryService()));
1809
  }
1810
 
1811
  /**
@@ -1825,7 +1825,7 @@ class FreeCachedContainer extends Container
1825
  */
1826
  protected function getDaemonService()
1827
  {
1828
- return $this->services['MailPoet\\Cron\\Daemon'] = new \MailPoet\Cron\Daemon(($this->services['MailPoet\\Cron\\CronHelper'] ?? $this->getCronHelperService()), ($this->services['MailPoet\\Cron\\CronWorkerRunner'] ?? $this->getCronWorkerRunnerService()), ($this->services['MailPoet\\Cron\\Workers\\WorkersFactory'] ?? $this->getWorkersFactoryService()));
1829
  }
1830
 
1831
  /**
1805
  */
1806
  protected function getCronWorkerRunnerService()
1807
  {
1808
+ return $this->services['MailPoet\\Cron\\CronWorkerRunner'] = new \MailPoet\Cron\CronWorkerRunner(($this->services['MailPoet\\Cron\\CronHelper'] ?? $this->getCronHelperService()), ($this->services['MailPoet\\Cron\\CronWorkerScheduler'] ?? $this->getCronWorkerSchedulerService()), ($this->services['MailPoet\\WP\\Functions'] ?? ($this->services['MailPoet\\WP\\Functions'] = new \MailPoet\WP\Functions())), ($this->services['MailPoet\\Newsletter\\Sending\\ScheduledTasksRepository'] ?? $this->getScheduledTasksRepositoryService()), ($this->privates['MailPoet\\Logging\\LoggerFactory'] ?? $this->getLoggerFactoryService()));
1809
  }
1810
 
1811
  /**
1825
  */
1826
  protected function getDaemonService()
1827
  {
1828
+ return $this->services['MailPoet\\Cron\\Daemon'] = new \MailPoet\Cron\Daemon(($this->services['MailPoet\\Cron\\CronHelper'] ?? $this->getCronHelperService()), ($this->services['MailPoet\\Cron\\CronWorkerRunner'] ?? $this->getCronWorkerRunnerService()), ($this->services['MailPoet\\Cron\\Workers\\WorkersFactory'] ?? $this->getWorkersFactoryService()), ($this->privates['MailPoet\\Logging\\LoggerFactory'] ?? $this->getLoggerFactoryService()));
1829
  }
1830
 
1831
  /**
lang/mailpoet.pot CHANGED
@@ -2,9 +2,9 @@
2
  # This file is distributed under the same license as the MailPoet package.
3
  msgid ""
4
  msgstr ""
5
- "Project-Id-Version: MailPoet 3.100.0\n"
6
  "Report-Msgid-Bugs-To: http://support.mailpoet.com/\n"
7
- "POT-Creation-Date: 2022-10-03 14:00:12+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=utf-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
2
  # This file is distributed under the same license as the MailPoet package.
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: MailPoet 3.100.1\n"
6
  "Report-Msgid-Bugs-To: http://support.mailpoet.com/\n"
7
+ "POT-Creation-Date: 2022-10-06 10:47:17+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=utf-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
lib/Config/Migrator.php CHANGED
@@ -221,7 +221,7 @@ class Migrator {
221
  $attributes = [
222
  'id int(11) unsigned NOT NULL AUTO_INCREMENT,',
223
  'task_id int(11) unsigned NOT NULL,',
224
- 'newsletter_id int(11) unsigned NOT NULL,',
225
  'newsletter_rendered_body longtext,',
226
  'newsletter_rendered_subject varchar(250) NULL DEFAULT NULL,',
227
  'subscribers longtext,',
221
  $attributes = [
222
  'id int(11) unsigned NOT NULL AUTO_INCREMENT,',
223
  'task_id int(11) unsigned NOT NULL,',
224
+ 'newsletter_id int(11) unsigned NULL,',
225
  'newsletter_rendered_body longtext,',
226
  'newsletter_rendered_subject varchar(250) NULL DEFAULT NULL,',
227
  'subscribers longtext,',
lib/Cron/CronWorkerRunner.php CHANGED
@@ -6,6 +6,7 @@ if (!defined('ABSPATH')) exit;
6
 
7
 
8
  use MailPoet\Entities\ScheduledTaskEntity;
 
9
  use MailPoet\Newsletter\Sending\ScheduledTasksRepository;
10
  use MailPoet\WP\Functions as WPFunctions;
11
  use MailPoetVendor\Carbon\Carbon;
@@ -30,17 +31,22 @@ class CronWorkerRunner {
30
  /** @var ScheduledTasksRepository */
31
  private $scheduledTasksRepository;
32
 
 
 
 
33
  public function __construct(
34
  CronHelper $cronHelper,
35
  CronWorkerScheduler $cronWorkerScheduler,
36
  WPFunctions $wp,
37
- ScheduledTasksRepository $scheduledTasksRepository
 
38
  ) {
39
  $this->timer = microtime(true);
40
  $this->cronHelper = $cronHelper;
41
  $this->cronWorkerScheduler = $cronWorkerScheduler;
42
  $this->wp = $wp;
43
  $this->scheduledTasksRepository = $scheduledTasksRepository;
 
44
  }
45
 
46
  public function run(CronWorkerInterface $worker) {
@@ -75,6 +81,10 @@ class CronWorkerRunner {
75
  }
76
  } catch (\Exception $e) {
77
  if (isset($task) && $task && $e->getCode() !== CronHelper::DAEMON_EXECUTION_LIMIT_REACHED) {
 
 
 
 
78
  $this->cronWorkerScheduler->rescheduleProgressively($task);
79
  }
80
  throw $e;
6
 
7
 
8
  use MailPoet\Entities\ScheduledTaskEntity;
9
+ use MailPoet\Logging\LoggerFactory;
10
  use MailPoet\Newsletter\Sending\ScheduledTasksRepository;
11
  use MailPoet\WP\Functions as WPFunctions;
12
  use MailPoetVendor\Carbon\Carbon;
31
  /** @var ScheduledTasksRepository */
32
  private $scheduledTasksRepository;
33
 
34
+ /** @var LoggerFactory */
35
+ private $loggerFactory;
36
+
37
  public function __construct(
38
  CronHelper $cronHelper,
39
  CronWorkerScheduler $cronWorkerScheduler,
40
  WPFunctions $wp,
41
+ ScheduledTasksRepository $scheduledTasksRepository,
42
+ LoggerFactory $loggerFactory
43
  ) {
44
  $this->timer = microtime(true);
45
  $this->cronHelper = $cronHelper;
46
  $this->cronWorkerScheduler = $cronWorkerScheduler;
47
  $this->wp = $wp;
48
  $this->scheduledTasksRepository = $scheduledTasksRepository;
49
+ $this->loggerFactory = $loggerFactory;
50
  }
51
 
52
  public function run(CronWorkerInterface $worker) {
81
  }
82
  } catch (\Exception $e) {
83
  if (isset($task) && $task && $e->getCode() !== CronHelper::DAEMON_EXECUTION_LIMIT_REACHED) {
84
+ /**
85
+ * ToDo: Use \LoggerFactory::TOPIC_CRON as logger topic, once it is available
86
+ */
87
+ $this->loggerFactory->getLogger()->error($e->getMessage(), ['error' => $e]);
88
  $this->cronWorkerScheduler->rescheduleProgressively($task);
89
  }
90
  throw $e;
lib/Cron/Daemon.php CHANGED
@@ -6,6 +6,7 @@ if (!defined('ABSPATH')) exit;
6
 
7
 
8
  use MailPoet\Cron\Workers\WorkersFactory;
 
9
 
10
  class Daemon {
11
  public $timer;
@@ -19,15 +20,20 @@ class Daemon {
19
  /** @var WorkersFactory */
20
  private $workersFactory;
21
 
 
 
 
22
  public function __construct(
23
  CronHelper $cronHelper,
24
  CronWorkerRunner $cronWorkerRunner,
25
- WorkersFactory $workersFactory
 
26
  ) {
27
  $this->timer = microtime(true);
28
  $this->workersFactory = $workersFactory;
29
  $this->cronWorkerRunner = $cronWorkerRunner;
30
  $this->cronHelper = $cronHelper;
 
31
  }
32
 
33
  public function run($settingsDaemonData) {
@@ -44,10 +50,16 @@ class Daemon {
44
  }
45
  } catch (\Exception $e) {
46
  $workerClassNameParts = explode('\\', get_class($worker));
 
47
  $errors[] = [
48
- 'worker' => end($workerClassNameParts),
49
  'message' => $e->getMessage(),
50
  ];
 
 
 
 
 
51
  }
52
  }
53
 
6
 
7
 
8
  use MailPoet\Cron\Workers\WorkersFactory;
9
+ use MailPoet\Logging\LoggerFactory;
10
 
11
  class Daemon {
12
  public $timer;
20
  /** @var WorkersFactory */
21
  private $workersFactory;
22
 
23
+ /** @var LoggerFactory */
24
+ private $loggerFactory;
25
+
26
  public function __construct(
27
  CronHelper $cronHelper,
28
  CronWorkerRunner $cronWorkerRunner,
29
+ WorkersFactory $workersFactory,
30
+ LoggerFactory $loggerFactory
31
  ) {
32
  $this->timer = microtime(true);
33
  $this->workersFactory = $workersFactory;
34
  $this->cronWorkerRunner = $cronWorkerRunner;
35
  $this->cronHelper = $cronHelper;
36
+ $this->loggerFactory = $loggerFactory;
37
  }
38
 
39
  public function run($settingsDaemonData) {
50
  }
51
  } catch (\Exception $e) {
52
  $workerClassNameParts = explode('\\', get_class($worker));
53
+ $workerName = end($workerClassNameParts);
54
  $errors[] = [
55
+ 'worker' => $workerName,
56
  'message' => $e->getMessage(),
57
  ];
58
+
59
+ /**
60
+ * ToDo: Use \LoggerFactory::TOPIC_CRON as logger topic, once it is available
61
+ */
62
+ $this->loggerFactory->getLogger()->error($e->getMessage(), ['error' => $e, 'worker' => $workerName]);
63
  }
64
  }
65
 
lib/Cron/Workers/SendingQueue/SendingQueue.php CHANGED
@@ -159,22 +159,20 @@ class SendingQueue {
159
 
160
  $newsletterEntity = $this->newsletterTask->getNewsletterFromQueue($queue);
161
  if (!$newsletterEntity) {
 
162
  return;
163
  }
164
 
165
  $newsletter = Newsletter::findOne($newsletterEntity->getId());
166
  if (!$newsletter) {
 
167
  return;
168
  }
169
 
170
  // pre-process newsletter (render, replace shortcodes/links, etc.)
171
  $newsletter = $this->newsletterTask->preProcessNewsletter($newsletter, $queue);
172
  if (!$newsletter) {
173
- $this->loggerFactory->getLogger(LoggerFactory::TOPIC_NEWSLETTERS)->info(
174
- 'delete task in sending queue',
175
- ['task_id' => $queue->taskId]
176
- );
177
- $queue->delete();
178
  return;
179
  }
180
  // clone the original object to be used for processing
@@ -267,6 +265,14 @@ class SendingQueue {
267
  }
268
  }
269
 
 
 
 
 
 
 
 
 
270
  public function getBatchSize(): int {
271
  return $this->throttlingHandler->getBatchSize();
272
  }
159
 
160
  $newsletterEntity = $this->newsletterTask->getNewsletterFromQueue($queue);
161
  if (!$newsletterEntity) {
162
+ $this->deleteTask($queue);
163
  return;
164
  }
165
 
166
  $newsletter = Newsletter::findOne($newsletterEntity->getId());
167
  if (!$newsletter) {
168
+ $this->deleteTask($queue);
169
  return;
170
  }
171
 
172
  // pre-process newsletter (render, replace shortcodes/links, etc.)
173
  $newsletter = $this->newsletterTask->preProcessNewsletter($newsletter, $queue);
174
  if (!$newsletter) {
175
+ $this->deleteTask($queue);
 
 
 
 
176
  return;
177
  }
178
  // clone the original object to be used for processing
265
  }
266
  }
267
 
268
+ private function deleteTask(SendingTask $queue) {
269
+ $this->loggerFactory->getLogger(LoggerFactory::TOPIC_NEWSLETTERS)->info(
270
+ 'delete task in sending queue',
271
+ ['task_id' => $queue->taskId]
272
+ );
273
+ $queue->delete();
274
+ }
275
+
276
  public function getBatchSize(): int {
277
  return $this->throttlingHandler->getBatchSize();
278
  }
mailpoet.php CHANGED
@@ -5,7 +5,7 @@ if (!defined('ABSPATH')) exit;
5
 
6
  /*
7
  * Plugin Name: MailPoet
8
- * Version: 3.100.0
9
  * Plugin URI: http://www.mailpoet.com
10
  * Description: Create and send newsletters, post notifications and welcome emails from your WordPress.
11
  * Author: MailPoet
@@ -20,7 +20,7 @@ if (!defined('ABSPATH')) exit;
20
  */
21
 
22
  $mailpoetPlugin = [
23
- 'version' => '3.100.0',
24
  'filename' => __FILE__,
25
  'path' => dirname(__FILE__),
26
  'autoloader' => dirname(__FILE__) . '/vendor/autoload.php',
5
 
6
  /*
7
  * Plugin Name: MailPoet
8
+ * Version: 3.100.1
9
  * Plugin URI: http://www.mailpoet.com
10
  * Description: Create and send newsletters, post notifications and welcome emails from your WordPress.
11
  * Author: MailPoet
20
  */
21
 
22
  $mailpoetPlugin = [
23
+ 'version' => '3.100.1',
24
  'filename' => __FILE__,
25
  'path' => dirname(__FILE__),
26
  'autoloader' => dirname(__FILE__) . '/vendor/autoload.php',
readme.txt CHANGED
@@ -3,7 +3,7 @@ Contributors: mailpoet
3
  Tags: email, email marketing, post notification, woocommerce emails, email automation, newsletter, newsletter builder, newsletter subscribers
4
  Requires at least: 5.6
5
  Tested up to: 6.0
6
- Stable tag: 3.100.0
7
  Requires PHP: 7.2
8
  License: GPLv3
9
  License URI: https://www.gnu.org/licenses/gpl-3.0.html
@@ -12,14 +12,6 @@ Send beautiful newsletters from WordPress. Collect subscribers with signup forms
12
 
13
  == Description ==
14
 
15
- = Get ready for Black Friday with 40% off MailPoet plans =
16
-
17
- Save 40% on all annual plans until 2 pm UTC, October 7. Terms & conditions apply.
18
-
19
- [Shop Now](https://account.mailpoet.com/?billing=yearly&ref=sale-october-2022-wporg&utm_source=WP&utm_medium=repotext&utm_campaign=mp_prebfcm)
20
-
21
- = What is MailPoet? =
22
-
23
  Use MailPoet to create, send, manage, and grow your email marketing campaigns – all without leaving your WordPress dashboard.
24
 
25
  Our newsletter builder integrates perfectly with WordPress so any website owner can create beautiful emails from scratch, or by using our responsive templates that display flawlessly across all devices.
@@ -227,6 +219,9 @@ Check our [Knowledge Base](https://kb.mailpoet.com) or contact us through our [s
227
 
228
  == Changelog ==
229
 
 
 
 
230
  = 3.100.0 - 2022-10-03 =
231
  * Added: tagging subscribers when signed up via a form;
232
  * Improved: linux cron error message;
3
  Tags: email, email marketing, post notification, woocommerce emails, email automation, newsletter, newsletter builder, newsletter subscribers
4
  Requires at least: 5.6
5
  Tested up to: 6.0
6
+ Stable tag: 3.100.1
7
  Requires PHP: 7.2
8
  License: GPLv3
9
  License URI: https://www.gnu.org/licenses/gpl-3.0.html
12
 
13
  == Description ==
14
 
 
 
 
 
 
 
 
 
15
  Use MailPoet to create, send, manage, and grow your email marketing campaigns – all without leaving your WordPress dashboard.
16
 
17
  Our newsletter builder integrates perfectly with WordPress so any website owner can create beautiful emails from scratch, or by using our responsive templates that display flawlessly across all devices.
219
 
220
  == Changelog ==
221
 
222
+ = 3.100.1 - 2022-10-06 =
223
+ * Fixed: In some instances the sending stuck because the EntityManager was closed.
224
+
225
  = 3.100.0 - 2022-10-03 =
226
  * Added: tagging subscribers when signed up via a form;
227
  * Improved: linux cron error message;
vendor/autoload.php CHANGED
@@ -6,4 +6,4 @@ if (PHP_VERSION_ID < 50600) {
6
  exit(1);
7
  }
8
  require_once __DIR__ . '/composer/autoload_real.php';
9
- return ComposerAutoloaderInit8732704d75c2c5a1298e37717fc3bfed::getLoader();
6
  exit(1);
7
  }
8
  require_once __DIR__ . '/composer/autoload_real.php';
9
+ return ComposerAutoloaderInit7154c0f5b1249ad627f98ad41d1eb05d::getLoader();
vendor/composer/autoload_real.php CHANGED
@@ -1,7 +1,7 @@
1
  <?php
2
  if (!defined('ABSPATH')) exit;
3
  // autoload_real.php @generated by Composer
4
- class ComposerAutoloaderInit8732704d75c2c5a1298e37717fc3bfed
5
  {
6
  private static $loader;
7
  public static function loadClassLoader($class)
@@ -16,20 +16,20 @@ class ComposerAutoloaderInit8732704d75c2c5a1298e37717fc3bfed
16
  return self::$loader;
17
  }
18
  require __DIR__ . '/platform_check.php';
19
- spl_autoload_register(array('ComposerAutoloaderInit8732704d75c2c5a1298e37717fc3bfed', 'loadClassLoader'), true, true);
20
  self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
21
- spl_autoload_unregister(array('ComposerAutoloaderInit8732704d75c2c5a1298e37717fc3bfed', 'loadClassLoader'));
22
  require __DIR__ . '/autoload_static.php';
23
- call_user_func(\Composer\Autoload\ComposerStaticInit8732704d75c2c5a1298e37717fc3bfed::getInitializer($loader));
24
  $loader->register(true);
25
- $includeFiles = \Composer\Autoload\ComposerStaticInit8732704d75c2c5a1298e37717fc3bfed::$files;
26
  foreach ($includeFiles as $fileIdentifier => $file) {
27
- composerRequire8732704d75c2c5a1298e37717fc3bfed($fileIdentifier, $file);
28
  }
29
  return $loader;
30
  }
31
  }
32
- function composerRequire8732704d75c2c5a1298e37717fc3bfed($fileIdentifier, $file)
33
  {
34
  if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
35
  $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
1
  <?php
2
  if (!defined('ABSPATH')) exit;
3
  // autoload_real.php @generated by Composer
4
+ class ComposerAutoloaderInit7154c0f5b1249ad627f98ad41d1eb05d
5
  {
6
  private static $loader;
7
  public static function loadClassLoader($class)
16
  return self::$loader;
17
  }
18
  require __DIR__ . '/platform_check.php';
19
+ spl_autoload_register(array('ComposerAutoloaderInit7154c0f5b1249ad627f98ad41d1eb05d', 'loadClassLoader'), true, true);
20
  self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
21
+ spl_autoload_unregister(array('ComposerAutoloaderInit7154c0f5b1249ad627f98ad41d1eb05d', 'loadClassLoader'));
22
  require __DIR__ . '/autoload_static.php';
23
+ call_user_func(\Composer\Autoload\ComposerStaticInit7154c0f5b1249ad627f98ad41d1eb05d::getInitializer($loader));
24
  $loader->register(true);
25
+ $includeFiles = \Composer\Autoload\ComposerStaticInit7154c0f5b1249ad627f98ad41d1eb05d::$files;
26
  foreach ($includeFiles as $fileIdentifier => $file) {
27
+ composerRequire7154c0f5b1249ad627f98ad41d1eb05d($fileIdentifier, $file);
28
  }
29
  return $loader;
30
  }
31
  }
32
+ function composerRequire7154c0f5b1249ad627f98ad41d1eb05d($fileIdentifier, $file)
33
  {
34
  if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
35
  $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
vendor/composer/autoload_static.php CHANGED
@@ -2,7 +2,7 @@
2
  // autoload_static.php @generated by Composer
3
  namespace Composer\Autoload;
4
  if (!defined('ABSPATH')) exit;
5
- class ComposerStaticInit8732704d75c2c5a1298e37717fc3bfed
6
  {
7
  public static $files = array (
8
  'e65c52a9094ad098d9369d5cad5421fa' => __DIR__ . '/../..' . '/lib/exceptions.php',
@@ -1371,9 +1371,9 @@ class ComposerStaticInit8732704d75c2c5a1298e37717fc3bfed
1371
  public static function getInitializer(ClassLoader $loader)
1372
  {
1373
  return \Closure::bind(function () use ($loader) {
1374
- $loader->prefixLengthsPsr4 = ComposerStaticInit8732704d75c2c5a1298e37717fc3bfed::$prefixLengthsPsr4;
1375
- $loader->prefixDirsPsr4 = ComposerStaticInit8732704d75c2c5a1298e37717fc3bfed::$prefixDirsPsr4;
1376
- $loader->classMap = ComposerStaticInit8732704d75c2c5a1298e37717fc3bfed::$classMap;
1377
  }, null, ClassLoader::class);
1378
  }
1379
  }
2
  // autoload_static.php @generated by Composer
3
  namespace Composer\Autoload;
4
  if (!defined('ABSPATH')) exit;
5
+ class ComposerStaticInit7154c0f5b1249ad627f98ad41d1eb05d
6
  {
7
  public static $files = array (
8
  'e65c52a9094ad098d9369d5cad5421fa' => __DIR__ . '/../..' . '/lib/exceptions.php',
1371
  public static function getInitializer(ClassLoader $loader)
1372
  {
1373
  return \Closure::bind(function () use ($loader) {
1374
+ $loader->prefixLengthsPsr4 = ComposerStaticInit7154c0f5b1249ad627f98ad41d1eb05d::$prefixLengthsPsr4;
1375
+ $loader->prefixDirsPsr4 = ComposerStaticInit7154c0f5b1249ad627f98ad41d1eb05d::$prefixDirsPsr4;
1376
+ $loader->classMap = ComposerStaticInit7154c0f5b1249ad627f98ad41d1eb05d::$classMap;
1377
  }, null, ClassLoader::class);
1378
  }
1379
  }
vendor/composer/installed.php CHANGED
@@ -7,7 +7,7 @@ if (!defined('ABSPATH')) exit;
7
  'type' => 'library',
8
  'install_path' => __DIR__ . '/../../',
9
  'aliases' => array(),
10
- 'reference' => 'ef990a21823996506440fe8de518b8f856b612a2',
11
  'name' => '__root__',
12
  'dev' => false,
13
  ),
@@ -18,7 +18,7 @@ if (!defined('ABSPATH')) exit;
18
  'type' => 'library',
19
  'install_path' => __DIR__ . '/../../',
20
  'aliases' => array(),
21
- 'reference' => 'ef990a21823996506440fe8de518b8f856b612a2',
22
  'dev_requirement' => false,
23
  ),
24
  'mtdowling/cron-expression' => array(
7
  'type' => 'library',
8
  'install_path' => __DIR__ . '/../../',
9
  'aliases' => array(),
10
+ 'reference' => '0fe57f61e63e3a64cf1c327aa4e764483925c04f',
11
  'name' => '__root__',
12
  'dev' => false,
13
  ),
18
  'type' => 'library',
19
  'install_path' => __DIR__ . '/../../',
20
  'aliases' => array(),
21
+ 'reference' => '0fe57f61e63e3a64cf1c327aa4e764483925c04f',
22
  'dev_requirement' => false,
23
  ),
24
  'mtdowling/cron-expression' => array(