SILENT KILLERPanel

Current Path: > > > home > codekrsu > ameliagraphics.com > wp-includes >


Operation   : Linux premium131.web-hosting.com 4.18.0-553.44.1.lve.el8.x86_64 #1 SMP Thu Mar 13 14:29:12 UTC 2025 x86_64
Software     : Apache
Server IP    : 162.0.232.56 | Your IP: 216.73.216.111
Domains      : 1034 Domain(s)
Permission   : [ 0755 ]

Files and Folders in: ///home/codekrsu/ameliagraphics.com/wp-includes/

NameTypeSizeLast ModifiedActions
ID3 Directory - -
IXR Directory - -
PHPMailer Directory - -
Requests Directory - -
SimplePie Directory - -
Text Directory - -
assets Directory - -
block-bindings Directory - -
block-patterns Directory - -
block-supports Directory - -
blocks Directory - -
certificates Directory - -
css Directory - -
customize Directory - -
fonts Directory - -
html-api Directory - -
images Directory - -
interactivity-api Directory - -
js Directory - -
l10n Directory - -
php-compat Directory - -
pomo Directory - -
rest-api Directory - -
sitemaps Directory - -
sodium_compat Directory - -
style-engine Directory - -
theme-compat Directory - -
widgets Directory - -
admin-bar.php File 37106 bytes April 28 2025 19:12:28.
atomlib.php File 12078 bytes September 19 2024 01:20:16.
author-template.php File 18951 bytes May 14 2023 21:58:24.
block-bindings.php File 5594 bytes June 12 2024 16:44:14.
block-editor.php File 28797 bytes March 17 2025 17:03:30.
block-i18n.json File 316 bytes August 11 2021 13:08:02.
block-patterns.php File 13213 bytes November 30 2024 03:46:22.
block-template-utils.php File 61907 bytes March 07 2025 22:55:24.
block-template.php File 15356 bytes March 19 2025 02:08:26.
blocks.php File 113051 bytes July 08 2025 13:01:26.
bookmark-template.php File 12768 bytes March 20 2025 03:15:36.
bookmark.php File 15427 bytes March 23 2024 18:20:12.
cache-compat.php File 5969 bytes October 10 2022 22:22:12.
cache.php File 13474 bytes October 10 2022 22:22:12.
canonical.php File 34523 bytes August 23 2024 03:47:16.
capabilities.php File 42718 bytes October 15 2024 18:13:20.
category-template.php File 57003 bytes September 26 2023 04:27:12.
category.php File 12829 bytes January 25 2025 04:28:24.
class-IXR.php File 2616 bytes January 23 2025 00:48:26.
class-avif-info.php File 29615 bytes April 26 2024 19:02:14.
class-feed.php File 539 bytes October 01 2024 02:50:20.
class-http.php File 367 bytes June 17 2022 15:20:14.
class-json.php File 43684 bytes February 03 2023 18:35:20.
class-oembed.php File 401 bytes June 17 2022 15:20:14.
class-phpass.php File 6771 bytes September 18 2024 01:08:16.
class-phpmailer.php File 664 bytes July 21 2020 16:58:02.
class-pop3.php File 21121 bytes October 26 2024 00:26:20.
class-requests.php File 2237 bytes April 05 2023 17:12:26.
class-simplepie.php File 453 bytes October 01 2024 02:50:20.
class-smtp.php File 457 bytes January 26 2021 18:45:58.
class-snoopy.php File 37715 bytes February 03 2023 18:35:20.
class-walker-category-dropdown.php File 2469 bytes September 14 2023 16:46:20.
class-walker-category.php File 8477 bytes September 08 2023 13:32:24.
class-walker-comment.php File 14221 bytes March 18 2024 19:46:14.
class-walker-nav-menu.php File 12044 bytes January 22 2025 02:26:24.
class-walker-page-dropdown.php File 2710 bytes September 14 2023 16:46:20.
class-walker-page.php File 7612 bytes September 14 2023 16:46:20.
class-wp-admin-bar.php File 17874 bytes July 18 2024 04:52:18.
class-wp-ajax-response.php File 5266 bytes September 12 2022 19:47:14.
class-wp-application-passwords.php File 17099 bytes April 03 2025 18:38:28.
class-wp-block-bindings-registry.php File 8463 bytes September 23 2024 16:35:16.
class-wp-block-bindings-source.php File 2992 bytes September 03 2024 20:33:16.
class-wp-block-editor-context.php File 1350 bytes September 12 2022 19:47:14.
class-wp-block-list.php File 4757 bytes November 02 2023 04:04:24.
class-wp-block-metadata-registry.php File 11895 bytes March 06 2025 03:17:24.
class-wp-block-parser-block.php File 2555 bytes June 27 2023 04:45:38.
class-wp-block-parser-frame.php File 2017 bytes September 20 2024 05:55:36.
class-wp-block-parser.php File 11532 bytes May 03 2024 00:09:16.
class-wp-block-pattern-categories-registry.php File 5371 bytes September 12 2022 19:47:14.
class-wp-block-patterns-registry.php File 10783 bytes September 27 2024 13:20:18.
class-wp-block-styles-registry.php File 6403 bytes February 04 2025 13:42:26.
class-wp-block-supports.php File 5626 bytes March 04 2025 18:06:28.
class-wp-block-template.php File 2033 bytes September 20 2024 06:07:12.
class-wp-block-templates-registry.php File 7231 bytes January 31 2025 02:19:26.
class-wp-block-type-registry.php File 5013 bytes October 12 2023 16:34:34.
class-wp-block-type.php File 17265 bytes May 02 2024 04:01:10.
class-wp-block.php File 23041 bytes February 14 2025 23:38:22.
class-wp-classic-to-block-menu-converter.php File 4088 bytes August 21 2023 21:51:20.
class-wp-comment-query.php File 48395 bytes June 21 2024 21:26:14.
class-wp-comment.php File 9437 bytes February 11 2025 18:40:30.
class-wp-customize-control.php File 25851 bytes February 08 2025 17:00:20.
class-wp-customize-manager.php File 202593 bytes February 08 2025 21:00:20.
class-wp-customize-nav-menus.php File 57412 bytes March 07 2025 04:48:24.
class-wp-customize-panel.php File 10710 bytes January 23 2025 00:48:26.
class-wp-customize-section.php File 11209 bytes October 13 2024 23:09:12.
class-wp-customize-setting.php File 29962 bytes January 23 2025 00:48:26.
class-wp-customize-widgets.php File 72210 bytes January 22 2025 03:38:24.
class-wp-date-query.php File 35732 bytes November 27 2024 16:40:18.
class-wp-dependencies.php File 15139 bytes August 26 2024 03:48:14.
class-wp-dependency.php File 2627 bytes November 25 2022 20:12:16.
class-wp-duotone.php File 40783 bytes June 14 2024 16:18:12.
class-wp-editor.php File 72335 bytes April 25 2025 22:28:30.
class-wp-embed.php File 15931 bytes April 14 2025 18:31:24.
class-wp-error.php File 7502 bytes February 21 2023 21:39:20.
class-wp-exception.php File 253 bytes September 27 2024 23:28:14.
class-wp-fatal-error-handler.php File 8150 bytes October 22 2024 14:16:16.
class-wp-feed-cache-transient.php File 3176 bytes October 01 2024 02:50:20.
class-wp-feed-cache.php File 969 bytes October 01 2024 02:50:20.
class-wp-hook.php File 16000 bytes September 18 2023 16:41:18.
class-wp-http-cookie.php File 7389 bytes June 24 2023 21:17:24.
class-wp-http-curl.php File 12541 bytes September 21 2023 22:29:12.
class-wp-http-encoding.php File 6689 bytes June 22 2023 18:57:24.
class-wp-http-ixr-client.php File 3501 bytes September 12 2022 19:47:14.
class-wp-http-proxy.php File 5980 bytes June 22 2023 18:36:26.
class-wp-http-requests-hooks.php File 2022 bytes December 16 2022 02:32:18.
class-wp-http-requests-response.php File 4400 bytes October 11 2023 11:05:26.
class-wp-http-response.php File 2977 bytes September 12 2022 19:47:14.
class-wp-http-streams.php File 16859 bytes September 21 2023 22:29:12.
class-wp-http.php File 41579 bytes January 23 2025 00:48:26.
class-wp-image-editor-gd.php File 20162 bytes November 30 2024 04:48:16.
class-wp-image-editor-imagick.php File 34735 bytes March 19 2025 03:25:32.
class-wp-image-editor.php File 17527 bytes February 22 2025 01:25:24.
class-wp-list-util.php File 7443 bytes February 28 2024 03:38:16.
class-wp-locale-switcher.php File 6776 bytes January 08 2025 17:54:18.
class-wp-locale.php File 16883 bytes February 26 2025 03:40:22.
class-wp-matchesmapregex.php File 1828 bytes February 06 2024 06:25:14.
class-wp-meta-query.php File 30531 bytes April 23 2024 00:25:08.
class-wp-metadata-lazyloader.php File 6833 bytes May 11 2023 15:15:24.
class-wp-navigation-fallback.php File 9211 bytes October 06 2023 18:06:22.
class-wp-network-query.php File 19857 bytes June 21 2024 21:26:14.
class-wp-network.php File 12296 bytes September 14 2024 02:12:16.
class-wp-object-cache.php File 17524 bytes September 19 2024 16:12:16.
class-wp-oembed-controller.php File 6905 bytes March 06 2024 10:05:12.
class-wp-oembed.php File 31606 bytes June 26 2025 23:06:34.
class-wp-paused-extensions-storage.php File 5111 bytes September 03 2024 22:19:14.
class-wp-phpmailer.php File 3802 bytes January 08 2025 17:54:18.
class-wp-plugin-dependencies.php File 25315 bytes March 18 2025 02:40:26.
class-wp-post-type.php File 30680 bytes February 09 2025 16:09:22.
class-wp-post.php File 6488 bytes February 12 2025 23:11:26.
class-wp-query.php File 158023 bytes March 19 2025 03:34:26.
class-wp-recovery-mode-cookie-service.php File 6877 bytes October 04 2022 07:59:14.
class-wp-recovery-mode-email-service.php File 11183 bytes May 02 2023 19:45:22.
class-wp-recovery-mode-key-service.php File 4884 bytes February 17 2025 16:24:22.
class-wp-recovery-mode-link-service.php File 3463 bytes September 12 2022 19:47:14.
class-wp-recovery-mode.php File 11453 bytes February 23 2025 16:11:22.
class-wp-rewrite.php File 63688 bytes October 20 2024 03:54:18.
class-wp-role.php File 2523 bytes September 08 2023 13:32:24.
class-wp-roles.php File 8586 bytes September 03 2024 22:19:14.
class-wp-script-modules.php File 19463 bytes December 11 2024 20:20:18.
class-wp-scripts.php File 28344 bytes August 11 2024 03:00:14.
class-wp-session-tokens.php File 7319 bytes February 11 2025 16:14:22.
class-wp-simplepie-file.php File 3408 bytes October 01 2024 02:50:20.
class-wp-simplepie-sanitize-kses.php File 1910 bytes January 23 2025 00:48:26.
class-wp-site-query.php File 31625 bytes September 11 2024 16:08:20.
class-wp-site.php File 7454 bytes September 12 2022 19:47:14.
class-wp-speculation-rules.php File 7527 bytes February 19 2025 03:32:22.
class-wp-styles.php File 11010 bytes August 11 2024 03:00:14.
class-wp-tax-query.php File 19555 bytes February 17 2024 02:47:12.
class-wp-taxonomy.php File 18559 bytes March 27 2025 02:07:28.
class-wp-term-query.php File 40869 bytes October 31 2024 02:34:20.
class-wp-term.php File 5298 bytes September 12 2022 19:47:14.
class-wp-text-diff-renderer-inline.php File 979 bytes February 15 2024 00:27:10.
class-wp-text-diff-renderer-table.php File 18880 bytes January 23 2025 00:48:26.
class-wp-textdomain-registry.php File 10481 bytes November 20 2024 07:50:24.
class-wp-theme-json-data.php File 1809 bytes June 04 2024 15:55:14.
class-wp-theme-json-resolver.php File 35738 bytes November 04 2024 07:34:16.
class-wp-theme-json-schema.php File 7367 bytes June 06 2024 12:02:16.
class-wp-theme-json.php File 163545 bytes March 19 2025 22:46:30.
class-wp-theme.php File 65810 bytes April 08 2025 18:18:28.
class-wp-token-map.php File 28618 bytes July 20 2024 03:44:16.
class-wp-url-pattern-prefixer.php File 4802 bytes February 19 2025 03:32:22.
class-wp-user-meta-session-tokens.php File 2990 bytes January 09 2019 10:04:50.
class-wp-user-query.php File 43655 bytes December 19 2024 15:24:24.
class-wp-user-request.php File 2305 bytes February 17 2025 16:24:22.
class-wp-user.php File 22994 bytes March 04 2025 19:19:22.
class-wp-walker.php File 13322 bytes July 26 2024 11:56:14.
class-wp-widget-factory.php File 3347 bytes September 12 2022 19:47:14.
class-wp-widget.php File 18429 bytes November 02 2024 19:01:20.
class-wp-xmlrpc-server.php File 215444 bytes February 08 2025 21:00:20.
class-wp.php File 26318 bytes January 29 2025 23:12:26.
class-wpdb.php File 118284 bytes February 11 2025 16:14:22.
class.wp-dependencies.php File 373 bytes September 20 2022 18:17:12.
class.wp-scripts.php File 343 bytes September 20 2022 18:17:12.
class.wp-styles.php File 338 bytes September 20 2022 18:17:12.
comment-template.php File 103104 bytes July 05 2025 10:53:38.
comment.php File 131547 bytes March 12 2025 01:58:24.
compat.php File 16376 bytes February 11 2025 16:14:22.
cron.php File 42658 bytes February 15 2025 00:37:24.
date.php File 400 bytes June 17 2022 15:20:14.
default-constants.php File 11365 bytes October 01 2024 03:58:16.
default-filters.php File 36697 bytes March 25 2025 10:45:28.
default-widgets.php File 2295 bytes January 23 2025 00:48:26.
deprecated.php File 191563 bytes March 14 2025 03:00:32.
embed-template.php File 338 bytes June 17 2022 15:20:14.
embed.php File 38172 bytes January 24 2025 18:32:22.
error-protection.php File 4121 bytes May 02 2023 19:45:22.
feed-atom-comments.php File 5504 bytes March 04 2024 17:41:10.
feed-atom.php File 3121 bytes January 23 2025 00:48:26.
feed-rdf.php File 2668 bytes January 29 2020 05:45:18.
feed-rss.php File 1189 bytes January 29 2020 05:45:18.
feed-rss2-comments.php File 4136 bytes March 04 2024 17:41:10.
feed-rss2.php File 3799 bytes January 29 2020 05:45:18.
feed.php File 23411 bytes November 11 2024 22:50:18.
fonts.php File 9751 bytes October 24 2024 02:39:18.
formatting.php File 342921 bytes July 05 2025 10:35:32.
functions.php File 287546 bytes April 07 2025 02:29:28.
functions.wp-scripts.php File 14558 bytes May 27 2024 00:51:14.
functions.wp-styles.php File 8583 bytes May 27 2024 00:51:14.
general-template.php File 172498 bytes April 08 2025 06:01:30.
global-styles-and-settings.php File 21261 bytes February 14 2025 23:38:22.
http.php File 25312 bytes October 27 2024 23:05:18.
https-detection.php File 5857 bytes February 24 2025 18:43:24.
https-migration.php File 4741 bytes July 11 2023 02:38:26.
kses.php File 74472 bytes January 22 2025 03:59:18.
l10n.php File 68530 bytes January 28 2025 14:46:30.
link-template.php File 157801 bytes February 24 2025 18:43:24.
load.php File 56440 bytes February 11 2025 16:14:22.
locale.php File 162 bytes October 08 2019 21:19:04.
media-template.php File 63060 bytes February 18 2025 03:58:24.
media.php File 220496 bytes July 07 2025 21:09:42.
meta.php File 65243 bytes February 24 2025 02:53:26.
ms-blogs.php File 25845 bytes January 23 2025 00:48:26.
ms-default-constants.php File 4921 bytes June 14 2024 00:50:14.
ms-default-filters.php File 6636 bytes February 24 2023 06:23:20.
ms-deprecated.php File 21759 bytes April 12 2024 21:47:14.
ms-files.php File 2744 bytes April 17 2025 02:23:30.
ms-functions.php File 91582 bytes February 04 2025 00:52:24.
ms-load.php File 19883 bytes March 25 2024 21:19:18.
ms-network.php File 3782 bytes May 02 2023 15:26:24.
ms-settings.php File 4197 bytes January 23 2025 00:48:26.
ms-site.php File 41320 bytes January 17 2025 05:12:26.
nav-menu-template.php File 25990 bytes January 23 2025 00:48:26.
nav-menu.php File 44373 bytes August 05 2024 23:00:20.
option.php File 103065 bytes March 06 2025 03:59:22.
pluggable-deprecated.php File 6324 bytes February 04 2025 00:52:24.
pluggable.php File 122700 bytes February 28 2025 23:53:24.
plugin.php File 35465 bytes June 08 2023 11:54:22.
post-formats.php File 7102 bytes May 27 2024 20:29:16.
post-template.php File 68648 bytes February 04 2025 05:32:24.
post-thumbnail-template.php File 10879 bytes December 21 2024 04:35:24.
post.php File 291712 bytes March 25 2025 10:45:28.
query.php File 37035 bytes August 24 2023 13:01:16.
registration-functions.php File 200 bytes November 12 2020 16:17:08.
registration.php File 200 bytes November 12 2020 16:17:08.
rest-api.php File 100257 bytes March 29 2025 02:44:30.
revision.php File 30741 bytes January 28 2025 04:07:24.
rewrite.php File 19541 bytes September 18 2024 23:08:12.
robots-template.php File 5185 bytes April 06 2022 19:33:04.
rss-functions.php File 255 bytes November 17 2020 03:52:06.
rss.php File 23113 bytes September 19 2024 01:40:12.
script-loader.php File 133262 bytes April 25 2025 22:38:30.
script-modules.php File 7712 bytes October 13 2024 22:49:16.
session.php File 258 bytes February 06 2020 11:33:12.
shortcodes.php File 24051 bytes May 25 2024 07:04:12.
sitemaps.php File 3238 bytes May 15 2021 21:38:06.
speculative-loading.php File 8558 bytes February 28 2025 03:14:26.
spl-autoload-compat.php File 441 bytes November 12 2020 16:17:08.
style-engine.php File 7563 bytes May 03 2024 08:47:12.
taxonomy.php File 176227 bytes February 08 2025 16:44:24.
template-canvas.php File 544 bytes October 01 2023 04:22:28.
template-loader.php File 3012 bytes May 26 2020 13:37:10.
template.php File 24154 bytes February 22 2024 00:26:08.
theme-i18n.json File 1526 bytes January 08 2025 17:36:24.
theme-previews.php File 2832 bytes December 08 2023 11:32:24.
theme-templates.php File 6238 bytes February 17 2025 22:49:20.
theme.json File 8704 bytes June 12 2024 10:11:14.
theme.php File 134303 bytes March 18 2025 16:30:26.
update.php File 37503 bytes March 18 2025 02:40:26.
user.php File 175823 bytes March 04 2025 19:19:22.
vars.php File 6562 bytes January 23 2025 00:48:26.
version.php File 1090 bytes July 15 2025 19:09:38.
widgets.php File 70719 bytes January 25 2025 02:20:24.
wp-db.php File 445 bytes July 22 2022 02:45:12.
wp-diff.php File 799 bytes January 23 2025 00:48:26.

Reading File: ///home/codekrsu/ameliagraphics.com/wp-includes//cron.php

<?php
/**
 * WordPress Cron API
 *
 * @package WordPress
 */

/**
 * Schedules an event to run only once.
 *
 * Schedules a hook which will be triggered by WordPress at the specified UTC time.
 * The action will trigger when someone visits your WordPress site if the scheduled
 * time has passed.
 *
 * Note that scheduling an event to occur within 10 minutes of an existing event
 * with the same action hook will be ignored unless you pass unique `$args` values
 * for each scheduled event.
 *
 * Use wp_next_scheduled() to prevent duplicate events.
 *
 * Use wp_schedule_event() to schedule a recurring event.
 *
 * @since 2.1.0
 * @since 5.1.0 Return value modified to boolean indicating success or failure,
 *              {@see 'pre_schedule_event'} filter added to short-circuit the function.
 * @since 5.7.0 The `$wp_error` parameter was added.
 *
 * @link https://developer.wordpress.org/reference/functions/wp_schedule_single_event/
 *
 * @param int    $timestamp  Unix timestamp (UTC) for when to next run the event.
 * @param string $hook       Action hook to execute when the event is run.
 * @param array  $args       Optional. Array containing arguments to pass to the
 *                           hook's callback function. Each value in the array
 *                           is passed to the callback as an individual parameter.
 *                           The array keys are ignored. Default empty array.
 * @param bool   $wp_error   Optional. Whether to return a WP_Error on failure. Default false.
 * @return bool|WP_Error True if event successfully scheduled. False or WP_Error on failure.
 */
function wp_schedule_single_event( $timestamp, $hook, $args = array(), $wp_error = false ) {
	// Make sure timestamp is a positive integer.
	if ( ! is_numeric( $timestamp ) || $timestamp <= 0 ) {
		if ( $wp_error ) {
			return new WP_Error(
				'invalid_timestamp',
				__( 'Event timestamp must be a valid Unix timestamp.' )
			);
		}

		return false;
	}

	$event = (object) array(
		'hook'      => $hook,
		'timestamp' => $timestamp,
		'schedule'  => false,
		'args'      => $args,
	);

	/**
	 * Filter to override scheduling an event.
	 *
	 * Returning a non-null value will short-circuit adding the event to the
	 * cron array, causing the function to return the filtered value instead.
	 *
	 * Both single events and recurring events are passed through this filter;
	 * single events have `$event->schedule` as false, whereas recurring events
	 * have this set to a recurrence from wp_get_schedules(). Recurring
	 * events also have the integer recurrence interval set as `$event->interval`.
	 *
	 * For plugins replacing wp-cron, it is recommended you check for an
	 * identical event within ten minutes and apply the {@see 'schedule_event'}
	 * filter to check if another plugin has disallowed the event before scheduling.
	 *
	 * Return true if the event was scheduled, false or a WP_Error if not.
	 *
	 * @since 5.1.0
	 * @since 5.7.0 The `$wp_error` parameter was added, and a `WP_Error` object can now be returned.
	 *
	 * @param null|bool|WP_Error $result   The value to return instead. Default null to continue adding the event.
	 * @param object             $event    {
	 *     An object containing an event's data.
	 *
	 *     @type string       $hook      Action hook to execute when the event is run.
	 *     @type int          $timestamp Unix timestamp (UTC) for when to next run the event.
	 *     @type string|false $schedule  How often the event should subsequently recur.
	 *     @type array        $args      Array containing each separate argument to pass to the hook's callback function.
	 *     @type int          $interval  Optional. The interval time in seconds for the schedule. Only present for recurring events.
	 * }
	 * @param bool               $wp_error Whether to return a WP_Error on failure.
	 */
	$pre = apply_filters( 'pre_schedule_event', null, $event, $wp_error );

	if ( null !== $pre ) {
		if ( $wp_error && false === $pre ) {
			return new WP_Error(
				'pre_schedule_event_false',
				__( 'A plugin prevented the event from being scheduled.' )
			);
		}

		if ( ! $wp_error && is_wp_error( $pre ) ) {
			return false;
		}

		return $pre;
	}

	/*
	 * Check for a duplicated event.
	 *
	 * Don't schedule an event if there's already an identical event
	 * within 10 minutes.
	 *
	 * When scheduling events within ten minutes of the current time,
	 * all past identical events are considered duplicates.
	 *
	 * When scheduling an event with a past timestamp (ie, before the
	 * current time) all events scheduled within the next ten minutes
	 * are considered duplicates.
	 */
	$crons = _get_cron_array();

	$key       = md5( serialize( $event->args ) );
	$duplicate = false;

	if ( $event->timestamp < time() + 10 * MINUTE_IN_SECONDS ) {
		$min_timestamp = 0;
	} else {
		$min_timestamp = $event->timestamp - 10 * MINUTE_IN_SECONDS;
	}

	if ( $event->timestamp < time() ) {
		$max_timestamp = time() + 10 * MINUTE_IN_SECONDS;
	} else {
		$max_timestamp = $event->timestamp + 10 * MINUTE_IN_SECONDS;
	}

	foreach ( $crons as $event_timestamp => $cron ) {
		if ( $event_timestamp < $min_timestamp ) {
			continue;
		}

		if ( $event_timestamp > $max_timestamp ) {
			break;
		}

		if ( isset( $cron[ $event->hook ][ $key ] ) ) {
			$duplicate = true;
			break;
		}
	}

	if ( $duplicate ) {
		if ( $wp_error ) {
			return new WP_Error(
				'duplicate_event',
				__( 'A duplicate event already exists.' )
			);
		}

		return false;
	}

	/**
	 * Modify an event before it is scheduled.
	 *
	 * @since 3.1.0
	 *
	 * @param object|false $event {
	 *     An object containing an event's data, or boolean false to prevent the event from being scheduled.
	 *
	 *     @type string       $hook      Action hook to execute when the event is run.
	 *     @type int          $timestamp Unix timestamp (UTC) for when to next run the event.
	 *     @type string|false $schedule  How often the event should subsequently recur.
	 *     @type array        $args      Array containing each separate argument to pass to the hook's callback function.
	 *     @type int          $interval  Optional. The interval time in seconds for the schedule. Only present for recurring events.
	 * }
	 */
	$event = apply_filters( 'schedule_event', $event );

	// A plugin disallowed this event.
	if ( ! $event ) {
		if ( $wp_error ) {
			return new WP_Error(
				'schedule_event_false',
				__( 'A plugin disallowed this event.' )
			);
		}

		return false;
	}

	$crons[ $event->timestamp ][ $event->hook ][ $key ] = array(
		'schedule' => $event->schedule,
		'args'     => $event->args,
	);
	uksort( $crons, 'strnatcasecmp' );

	return _set_cron_array( $crons, $wp_error );
}

/**
 * Schedules a recurring event.
 *
 * Schedules a hook which will be triggered by WordPress at the specified interval.
 * The action will trigger when someone visits your WordPress site if the scheduled
 * time has passed.
 *
 * Valid values for the recurrence are 'hourly', 'twicedaily', 'daily', and 'weekly'.
 * These can be extended using the {@see 'cron_schedules'} filter in wp_get_schedules().
 *
 * Use wp_next_scheduled() to prevent duplicate events.
 *
 * Use wp_schedule_single_event() to schedule a non-recurring event.
 *
 * @since 2.1.0
 * @since 5.1.0 Return value modified to boolean indicating success or failure,
 *              {@see 'pre_schedule_event'} filter added to short-circuit the function.
 * @since 5.7.0 The `$wp_error` parameter was added.
 *
 * @link https://developer.wordpress.org/reference/functions/wp_schedule_event/
 *
 * @param int    $timestamp  Unix timestamp (UTC) for when to next run the event.
 * @param string $recurrence How often the event should subsequently recur.
 *                           See wp_get_schedules() for accepted values.
 * @param string $hook       Action hook to execute when the event is run.
 * @param array  $args       Optional. Array containing arguments to pass to the
 *                           hook's callback function. Each value in the array
 *                           is passed to the callback as an individual parameter.
 *                           The array keys are ignored. Default empty array.
 * @param bool   $wp_error   Optional. Whether to return a WP_Error on failure. Default false.
 * @return bool|WP_Error True if event successfully scheduled. False or WP_Error on failure.
 */
function wp_schedule_event( $timestamp, $recurrence, $hook, $args = array(), $wp_error = false ) {
	// Make sure timestamp is a positive integer.
	if ( ! is_numeric( $timestamp ) || $timestamp <= 0 ) {
		if ( $wp_error ) {
			return new WP_Error(
				'invalid_timestamp',
				__( 'Event timestamp must be a valid Unix timestamp.' )
			);
		}

		return false;
	}

	$schedules = wp_get_schedules();

	if ( ! isset( $schedules[ $recurrence ] ) ) {
		if ( $wp_error ) {
			return new WP_Error(
				'invalid_schedule',
				__( 'Event schedule does not exist.' )
			);
		}

		return false;
	}

	$event = (object) array(
		'hook'      => $hook,
		'timestamp' => $timestamp,
		'schedule'  => $recurrence,
		'args'      => $args,
		'interval'  => $schedules[ $recurrence ]['interval'],
	);

	/** This filter is documented in wp-includes/cron.php */
	$pre = apply_filters( 'pre_schedule_event', null, $event, $wp_error );

	if ( null !== $pre ) {
		if ( $wp_error && false === $pre ) {
			return new WP_Error(
				'pre_schedule_event_false',
				__( 'A plugin prevented the event from being scheduled.' )
			);
		}

		if ( ! $wp_error && is_wp_error( $pre ) ) {
			return false;
		}

		return $pre;
	}

	/** This filter is documented in wp-includes/cron.php */
	$event = apply_filters( 'schedule_event', $event );

	// A plugin disallowed this event.
	if ( ! $event ) {
		if ( $wp_error ) {
			return new WP_Error(
				'schedule_event_false',
				__( 'A plugin disallowed this event.' )
			);
		}

		return false;
	}

	$key = md5( serialize( $event->args ) );

	$crons = _get_cron_array();

	$crons[ $event->timestamp ][ $event->hook ][ $key ] = array(
		'schedule' => $event->schedule,
		'args'     => $event->args,
		'interval' => $event->interval,
	);
	uksort( $crons, 'strnatcasecmp' );

	return _set_cron_array( $crons, $wp_error );
}

/**
 * Reschedules a recurring event.
 *
 * Mainly for internal use, this takes the Unix timestamp (UTC) of a previously run
 * recurring event and reschedules it for its next run.
 *
 * To change upcoming scheduled events, use wp_schedule_event() to
 * change the recurrence frequency.
 *
 * @since 2.1.0
 * @since 5.1.0 Return value modified to boolean indicating success or failure,
 *              {@see 'pre_reschedule_event'} filter added to short-circuit the function.
 * @since 5.7.0 The `$wp_error` parameter was added.
 *
 * @param int    $timestamp  Unix timestamp (UTC) for when the event was scheduled.
 * @param string $recurrence How often the event should subsequently recur.
 *                           See wp_get_schedules() for accepted values.
 * @param string $hook       Action hook to execute when the event is run.
 * @param array  $args       Optional. Array containing arguments to pass to the
 *                           hook's callback function. Each value in the array
 *                           is passed to the callback as an individual parameter.
 *                           The array keys are ignored. Default empty array.
 * @param bool   $wp_error   Optional. Whether to return a WP_Error on failure. Default false.
 * @return bool|WP_Error True if event successfully rescheduled. False or WP_Error on failure.
 */
function wp_reschedule_event( $timestamp, $recurrence, $hook, $args = array(), $wp_error = false ) {
	// Make sure timestamp is a positive integer.
	if ( ! is_numeric( $timestamp ) || $timestamp <= 0 ) {
		if ( $wp_error ) {
			return new WP_Error(
				'invalid_timestamp',
				__( 'Event timestamp must be a valid Unix timestamp.' )
			);
		}

		return false;
	}

	$schedules = wp_get_schedules();
	$interval  = 0;

	// First we try to get the interval from the schedule.
	if ( isset( $schedules[ $recurrence ] ) ) {
		$interval = $schedules[ $recurrence ]['interval'];
	}

	// Now we try to get it from the saved interval in case the schedule disappears.
	if ( 0 === $interval ) {
		$scheduled_event = wp_get_scheduled_event( $hook, $args, $timestamp );

		if ( $scheduled_event && isset( $scheduled_event->interval ) ) {
			$interval = $scheduled_event->interval;
		}
	}

	$event = (object) array(
		'hook'      => $hook,
		'timestamp' => $timestamp,
		'schedule'  => $recurrence,
		'args'      => $args,
		'interval'  => $interval,
	);

	/**
	 * Filter to override rescheduling of a recurring event.
	 *
	 * Returning a non-null value will short-circuit the normal rescheduling
	 * process, causing the function to return the filtered value instead.
	 *
	 * For plugins replacing wp-cron, return true if the event was successfully
	 * rescheduled, false or a WP_Error if not.
	 *
	 * @since 5.1.0
	 * @since 5.7.0 The `$wp_error` parameter was added, and a `WP_Error` object can now be returned.
	 *
	 * @param null|bool|WP_Error $pre      Value to return instead. Default null to continue adding the event.
	 * @param object             $event    {
	 *     An object containing an event's data.
	 *
	 *     @type string $hook      Action hook to execute when the event is run.
	 *     @type int    $timestamp Unix timestamp (UTC) for when to next run the event.
	 *     @type string $schedule  How often the event should subsequently recur.
	 *     @type array  $args      Array containing each separate argument to pass to the hook's callback function.
	 *     @type int    $interval  The interval time in seconds for the schedule.
	 * }
	 * @param bool               $wp_error Whether to return a WP_Error on failure.
	 */
	$pre = apply_filters( 'pre_reschedule_event', null, $event, $wp_error );

	if ( null !== $pre ) {
		if ( $wp_error && false === $pre ) {
			return new WP_Error(
				'pre_reschedule_event_false',
				__( 'A plugin prevented the event from being rescheduled.' )
			);
		}

		if ( ! $wp_error && is_wp_error( $pre ) ) {
			return false;
		}

		return $pre;
	}

	// Now we assume something is wrong and fail to schedule.
	if ( 0 === $interval ) {
		if ( $wp_error ) {
			return new WP_Error(
				'invalid_schedule',
				__( 'Event schedule does not exist.' )
			);
		}

		return false;
	}

	$now = time();

	if ( $timestamp >= $now ) {
		$timestamp = $now + $interval;
	} else {
		$timestamp = $now + ( $interval - ( ( $now - $timestamp ) % $interval ) );
	}

	return wp_schedule_event( $timestamp, $recurrence, $hook, $args, $wp_error );
}

/**
 * Unschedules a previously scheduled event.
 *
 * The `$timestamp` and `$hook` parameters are required so that the event can be
 * identified.
 *
 * @since 2.1.0
 * @since 5.1.0 Return value modified to boolean indicating success or failure,
 *              {@see 'pre_unschedule_event'} filter added to short-circuit the function.
 * @since 5.7.0 The `$wp_error` parameter was added.
 *
 * @param int    $timestamp Unix timestamp (UTC) of the event.
 * @param string $hook      Action hook of the event.
 * @param array  $args      Optional. Array containing each separate argument to pass to the hook's callback function.
 *                          Although not passed to a callback, these arguments are used to uniquely identify the
 *                          event, so they should be the same as those used when originally scheduling the event.
 *                          Default empty array.
 * @param bool   $wp_error  Optional. Whether to return a WP_Error on failure. Default false.
 * @return bool|WP_Error True if event successfully unscheduled. False or WP_Error on failure.
 */
function wp_unschedule_event( $timestamp, $hook, $args = array(), $wp_error = false ) {
	// Make sure timestamp is a positive integer.
	if ( ! is_numeric( $timestamp ) || $timestamp <= 0 ) {
		if ( $wp_error ) {
			return new WP_Error(
				'invalid_timestamp',
				__( 'Event timestamp must be a valid Unix timestamp.' )
			);
		}

		return false;
	}

	/**
	 * Filter to override unscheduling of events.
	 *
	 * Returning a non-null value will short-circuit the normal unscheduling
	 * process, causing the function to return the filtered value instead.
	 *
	 * For plugins replacing wp-cron, return true if the event was successfully
	 * unscheduled, false or a WP_Error if not.
	 *
	 * @since 5.1.0
	 * @since 5.7.0 The `$wp_error` parameter was added, and a `WP_Error` object can now be returned.
	 *
	 * @param null|bool|WP_Error $pre       Value to return instead. Default null to continue unscheduling the event.
	 * @param int                $timestamp Unix timestamp (UTC) for when to run the event.
	 * @param string             $hook      Action hook, the execution of which will be unscheduled.
	 * @param array              $args      Arguments to pass to the hook's callback function.
	 * @param bool               $wp_error  Whether to return a WP_Error on failure.
	 */
	$pre = apply_filters( 'pre_unschedule_event', null, $timestamp, $hook, $args, $wp_error );

	if ( null !== $pre ) {
		if ( $wp_error && false === $pre ) {
			return new WP_Error(
				'pre_unschedule_event_false',
				__( 'A plugin prevented the event from being unscheduled.' )
			);
		}

		if ( ! $wp_error && is_wp_error( $pre ) ) {
			return false;
		}

		return $pre;
	}

	$crons = _get_cron_array();
	$key   = md5( serialize( $args ) );

	unset( $crons[ $timestamp ][ $hook ][ $key ] );

	if ( empty( $crons[ $timestamp ][ $hook ] ) ) {
		unset( $crons[ $timestamp ][ $hook ] );
	}

	if ( empty( $crons[ $timestamp ] ) ) {
		unset( $crons[ $timestamp ] );
	}

	return _set_cron_array( $crons, $wp_error );
}

/**
 * Unschedules all events attached to the hook with the specified arguments.
 *
 * Warning: This function may return boolean false, but may also return a non-boolean
 * value which evaluates to false. For information about casting to booleans see the
 * {@link https://www.php.net/manual/en/language.types.boolean.php PHP documentation}. Use
 * the `===` operator for testing the return value of this function.
 *
 * @since 2.1.0
 * @since 5.1.0 Return value modified to indicate success or failure,
 *              {@see 'pre_clear_scheduled_hook'} filter added to short-circuit the function.
 * @since 5.7.0 The `$wp_error` parameter was added.
 *
 * @param string $hook     Action hook, the execution of which will be unscheduled.
 * @param array  $args     Optional. Array containing each separate argument to pass to the hook's callback function.
 *                         Although not passed to a callback, these arguments are used to uniquely identify the
 *                         event, so they should be the same as those used when originally scheduling the event.
 *                         Default empty array.
 * @param bool   $wp_error Optional. Whether to return a WP_Error on failure. Default false.
 * @return int|false|WP_Error On success an integer indicating number of events unscheduled (0 indicates no
 *                            events were registered with the hook and arguments combination), false or WP_Error
 *                            if unscheduling one or more events fail.
 */
function wp_clear_scheduled_hook( $hook, $args = array(), $wp_error = false ) {
	/*
	 * Backward compatibility.
	 * Previously, this function took the arguments as discrete vars rather than an array like the rest of the API.
	 */
	if ( ! is_array( $args ) ) {
		_deprecated_argument(
			__FUNCTION__,
			'3.0.0',
			__( 'This argument has changed to an array to match the behavior of the other cron functions.' )
		);

		$args     = array_slice( func_get_args(), 1 ); // phpcs:ignore PHPCompatibility.FunctionUse.ArgumentFunctionsReportCurrentValue.NeedsInspection
		$wp_error = false;
	}

	/**
	 * Filter to override clearing a scheduled hook.
	 *
	 * Returning a non-null value will short-circuit the normal unscheduling
	 * process, causing the function to return the filtered value instead.
	 *
	 * For plugins replacing wp-cron, return the number of events successfully
	 * unscheduled (zero if no events were registered with the hook) or false
	 * or a WP_Error if unscheduling one or more events fails.
	 *
	 * @since 5.1.0
	 * @since 5.7.0 The `$wp_error` parameter was added, and a `WP_Error` object can now be returned.
	 *
	 * @param null|int|false|WP_Error $pre      Value to return instead. Default null to continue unscheduling the event.
	 * @param string                  $hook     Action hook, the execution of which will be unscheduled.
	 * @param array                   $args     Arguments to pass to the hook's callback function.
	 * @param bool                    $wp_error Whether to return a WP_Error on failure.
	 */
	$pre = apply_filters( 'pre_clear_scheduled_hook', null, $hook, $args, $wp_error );

	if ( null !== $pre ) {
		if ( $wp_error && false === $pre ) {
			return new WP_Error(
				'pre_clear_scheduled_hook_false',
				__( 'A plugin prevented the hook from being cleared.' )
			);
		}

		if ( ! $wp_error && is_wp_error( $pre ) ) {
			return false;
		}

		return $pre;
	}

	/*
	 * This logic duplicates wp_next_scheduled().
	 * It's required due to a scenario where wp_unschedule_event() fails due to update_option() failing,
	 * and, wp_next_scheduled() returns the same schedule in an infinite loop.
	 */
	$crons = _get_cron_array();
	if ( empty( $crons ) ) {
		return 0;
	}

	$results = array();
	$key     = md5( serialize( $args ) );

	foreach ( $crons as $timestamp => $cron ) {
		if ( isset( $cron[ $hook ][ $key ] ) ) {
			$results[] = wp_unschedule_event( $timestamp, $hook, $args, true );
		}
	}

	$errors = array_filter( $results, 'is_wp_error' );
	$error  = new WP_Error();

	if ( $errors ) {
		if ( $wp_error ) {
			array_walk( $errors, array( $error, 'merge_from' ) );

			return $error;
		}

		return false;
	}

	return count( $results );
}

/**
 * Unschedules all events attached to the hook.
 *
 * Can be useful for plugins when deactivating to clean up the cron queue.
 *
 * Warning: This function may return boolean false, but may also return a non-boolean
 * value which evaluates to false. For information about casting to booleans see the
 * {@link https://www.php.net/manual/en/language.types.boolean.php PHP documentation}. Use
 * the `===` operator for testing the return value of this function.
 *
 * @since 4.9.0
 * @since 5.1.0 Return value added to indicate success or failure.
 * @since 5.7.0 The `$wp_error` parameter was added.
 *
 * @param string $hook     Action hook, the execution of which will be unscheduled.
 * @param bool   $wp_error Optional. Whether to return a WP_Error on failure. Default false.
 * @return int|false|WP_Error On success an integer indicating number of events unscheduled (0 indicates no
 *                            events were registered on the hook), false or WP_Error if unscheduling fails.
 */
function wp_unschedule_hook( $hook, $wp_error = false ) {
	/**
	 * Filter to override clearing all events attached to the hook.
	 *
	 * Returning a non-null value will short-circuit the normal unscheduling
	 * process, causing the function to return the filtered value instead.
	 *
	 * For plugins replacing wp-cron, return the number of events successfully
	 * unscheduled (zero if no events were registered with the hook). If unscheduling
	 * one or more events fails then return either a WP_Error object or false depending
	 * on the value of the `$wp_error` parameter.
	 *
	 * @since 5.1.0
	 * @since 5.7.0 The `$wp_error` parameter was added, and a `WP_Error` object can now be returned.
	 *
	 * @param null|int|false|WP_Error $pre      Value to return instead. Default null to continue unscheduling the hook.
	 * @param string                  $hook     Action hook, the execution of which will be unscheduled.
	 * @param bool                    $wp_error Whether to return a WP_Error on failure.
	 */
	$pre = apply_filters( 'pre_unschedule_hook', null, $hook, $wp_error );

	if ( null !== $pre ) {
		if ( $wp_error && false === $pre ) {
			return new WP_Error(
				'pre_unschedule_hook_false',
				__( 'A plugin prevented the hook from being cleared.' )
			);
		}

		if ( ! $wp_error && is_wp_error( $pre ) ) {
			return false;
		}

		return $pre;
	}

	$crons = _get_cron_array();
	if ( empty( $crons ) ) {
		return 0;
	}

	$results = array();

	foreach ( $crons as $timestamp => $args ) {
		if ( ! empty( $crons[ $timestamp ][ $hook ] ) ) {
			$results[] = count( $crons[ $timestamp ][ $hook ] );
		}

		unset( $crons[ $timestamp ][ $hook ] );

		if ( empty( $crons[ $timestamp ] ) ) {
			unset( $crons[ $timestamp ] );
		}
	}

	/*
	 * If the results are empty (zero events to unschedule), no attempt
	 * to update the cron array is required.
	 */
	if ( empty( $results ) ) {
		return 0;
	}

	$set = _set_cron_array( $crons, $wp_error );

	if ( true === $set ) {
		return array_sum( $results );
	}

	return $set;
}

/**
 * Retrieves a scheduled event.
 *
 * Retrieves the full event object for a given event, if no timestamp is specified the next
 * scheduled event is returned.
 *
 * @since 5.1.0
 *
 * @param string   $hook      Action hook of the event.
 * @param array    $args      Optional. Array containing each separate argument to pass to the hook's callback function.
 *                            Although not passed to a callback, these arguments are used to uniquely identify the
 *                            event, so they should be the same as those used when originally scheduling the event.
 *                            Default empty array.
 * @param int|null $timestamp Optional. Unix timestamp (UTC) of the event. If not specified, the next scheduled event
 *                            is returned. Default null.
 * @return object|false {
 *     The event object. False if the event does not exist.
 *
 *     @type string       $hook      Action hook to execute when the event is run.
 *     @type int          $timestamp Unix timestamp (UTC) for when to next run the event.
 *     @type string|false $schedule  How often the event should subsequently recur.
 *     @type array        $args      Array containing each separate argument to pass to the hook's callback function.
 *     @type int          $interval  Optional. The interval time in seconds for the schedule. Only present for recurring events.
 * }
 */
function wp_get_scheduled_event( $hook, $args = array(), $timestamp = null ) {
	/**
	 * Filter to override retrieving a scheduled event.
	 *
	 * Returning a non-null value will short-circuit the normal process,
	 * returning the filtered value instead.
	 *
	 * Return false if the event does not exist, otherwise an event object
	 * should be returned.
	 *
	 * @since 5.1.0
	 *
	 * @param null|false|object $pre  Value to return instead. Default null to continue retrieving the event.
	 * @param string            $hook Action hook of the event.
	 * @param array             $args Array containing each separate argument to pass to the hook's callback function.
	 *                                Although not passed to a callback, these arguments are used to uniquely identify
	 *                                the event.
	 * @param int|null  $timestamp Unix timestamp (UTC) of the event. Null to retrieve next scheduled event.
	 */
	$pre = apply_filters( 'pre_get_scheduled_event', null, $hook, $args, $timestamp );

	if ( null !== $pre ) {
		return $pre;
	}

	if ( null !== $timestamp && ! is_numeric( $timestamp ) ) {
		return false;
	}

	$crons = _get_cron_array();
	if ( empty( $crons ) ) {
		return false;
	}

	$key = md5( serialize( $args ) );

	if ( ! $timestamp ) {
		// Get next event.
		$next = false;
		foreach ( $crons as $timestamp => $cron ) {
			if ( isset( $cron[ $hook ][ $key ] ) ) {
				$next = $timestamp;
				break;
			}
		}

		if ( ! $next ) {
			return false;
		}

		$timestamp = $next;
	} elseif ( ! isset( $crons[ $timestamp ][ $hook ][ $key ] ) ) {
		return false;
	}

	$event = (object) array(
		'hook'      => $hook,
		'timestamp' => $timestamp,
		'schedule'  => $crons[ $timestamp ][ $hook ][ $key ]['schedule'],
		'args'      => $args,
	);

	if ( isset( $crons[ $timestamp ][ $hook ][ $key ]['interval'] ) ) {
		$event->interval = $crons[ $timestamp ][ $hook ][ $key ]['interval'];
	}

	return $event;
}

/**
 * Retrieves the timestamp of the next scheduled event for the given hook.
 *
 * @since 2.1.0
 *
 * @param string $hook Action hook of the event.
 * @param array  $args Optional. Array containing each separate argument to pass to the hook's callback function.
 *                     Although not passed to a callback, these arguments are used to uniquely identify the
 *                     event, so they should be the same as those used when originally scheduling the event.
 *                     Default empty array.
 * @return int|false The Unix timestamp (UTC) of the next time the event will occur. False if the event doesn't exist.
 */
function wp_next_scheduled( $hook, $args = array() ) {
	$next_event = wp_get_scheduled_event( $hook, $args );

	if ( ! $next_event ) {
		return false;
	}

	/**
	 * Filters the timestamp of the next scheduled event for the given hook.
	 *
	 * @since 6.8.0
	 *
	 * @param int    $timestamp  Unix timestamp (UTC) for when to next run the event.
	 * @param object $next_event {
	 *     An object containing an event's data.
	 *
	 *     @type string $hook      Action hook of the event.
	 *     @type int    $timestamp Unix timestamp (UTC) for when to next run the event.
	 *     @type string $schedule  How often the event should subsequently recur.
	 *     @type array  $args      Array containing each separate argument to pass to the hook
	 *                             callback function.
	 *     @type int    $interval  Optional. The interval time in seconds for the schedule. Only
	 *                             present for recurring events.
	 * }
	 * @param array  $args       Array containing each separate argument to pass to the hook
	 *                           callback function.
	 */
	return apply_filters( 'wp_next_scheduled', $next_event->timestamp, $next_event, $hook, $args );
}

/**
 * Sends a request to run cron through HTTP request that doesn't halt page loading.
 *
 * @since 2.1.0
 * @since 5.1.0 Return values added.
 *
 * @param int $gmt_time Optional. Unix timestamp (UTC). Default 0 (current time is used).
 * @return bool True if spawned, false if no events spawned.
 */
function spawn_cron( $gmt_time = 0 ) {
	if ( ! $gmt_time ) {
		$gmt_time = microtime( true );
	}

	if ( defined( 'DOING_CRON' ) || isset( $_GET['doing_wp_cron'] ) ) {
		return false;
	}

	/*
	 * Get the cron lock, which is a Unix timestamp of when the last cron was spawned
	 * and has not finished running.
	 *
	 * Multiple processes on multiple web servers can run this code concurrently,
	 * this lock attempts to make spawning as atomic as possible.
	 */
	$lock = (float) get_transient( 'doing_cron' );

	if ( $lock > $gmt_time + 10 * MINUTE_IN_SECONDS ) {
		$lock = 0;
	}

	// Don't run if another process is currently running it or more than once every 60 sec.
	if ( $lock + WP_CRON_LOCK_TIMEOUT > $gmt_time ) {
		return false;
	}

	// Confidence check.
	$crons = wp_get_ready_cron_jobs();
	if ( empty( $crons ) ) {
		return false;
	}

	$keys = array_keys( $crons );
	if ( isset( $keys[0] ) && $keys[0] > $gmt_time ) {
		return false;
	}

	if ( defined( 'ALTERNATE_WP_CRON' ) && ALTERNATE_WP_CRON ) {
		if ( 'GET' !== $_SERVER['REQUEST_METHOD'] || defined( 'DOING_AJAX' ) || defined( 'XMLRPC_REQUEST' ) ) {
			return false;
		}

		$doing_wp_cron = sprintf( '%.22F', $gmt_time );
		set_transient( 'doing_cron', $doing_wp_cron );

		ob_start();
		wp_redirect( add_query_arg( 'doing_wp_cron', $doing_wp_cron, wp_unslash( $_SERVER['REQUEST_URI'] ) ) );
		echo ' ';

		// Flush any buffers and send the headers.
		wp_ob_end_flush_all();
		flush();

		require_once ABSPATH . 'wp-cron.php';
		return true;
	}

	// Set the cron lock with the current unix timestamp, when the cron is being spawned.
	$doing_wp_cron = sprintf( '%.22F', $gmt_time );
	set_transient( 'doing_cron', $doing_wp_cron );

	/**
	 * Filters the cron request arguments.
	 *
	 * @since 3.5.0
	 * @since 4.5.0 The `$doing_wp_cron` parameter was added.
	 *
	 * @param array $cron_request_array {
	 *     An array of cron request URL arguments.
	 *
	 *     @type string $url  The cron request URL.
	 *     @type int    $key  The 22 digit GMT microtime.
	 *     @type array  $args {
	 *         An array of cron request arguments.
	 *
	 *         @type int  $timeout   The request timeout in seconds. Default .01 seconds.
	 *         @type bool $blocking  Whether to set blocking for the request. Default false.
	 *         @type bool $sslverify Whether SSL should be verified for the request. Default false.
	 *     }
	 * }
	 * @param string $doing_wp_cron The Unix timestamp (UTC) of the cron lock.
	 */
	$cron_request = apply_filters(
		'cron_request',
		array(
			'url'  => add_query_arg( 'doing_wp_cron', $doing_wp_cron, site_url( 'wp-cron.php' ) ),
			'key'  => $doing_wp_cron,
			'args' => array(
				'timeout'   => 0.01,
				'blocking'  => false,
				/** This filter is documented in wp-includes/class-wp-http-streams.php */
				'sslverify' => apply_filters( 'https_local_ssl_verify', false ),
			),
		),
		$doing_wp_cron
	);

	$result = wp_remote_post( $cron_request['url'], $cron_request['args'] );

	return ! is_wp_error( $result );
}

/**
 * Registers _wp_cron() to run on the {@see 'wp_loaded'} action.
 *
 * If the {@see 'wp_loaded'} action has already fired, this function calls
 * _wp_cron() directly.
 *
 * Warning: This function may return Boolean FALSE, but may also return a non-Boolean
 * value which evaluates to FALSE. For information about casting to booleans see the
 * {@link https://www.php.net/manual/en/language.types.boolean.php PHP documentation}. Use
 * the `===` operator for testing the return value of this function.
 *
 * @since 2.1.0
 * @since 5.1.0 Return value added to indicate success or failure.
 * @since 5.7.0 Functionality moved to _wp_cron() to which this becomes a wrapper.
 *
 * @return false|int|void On success an integer indicating number of events spawned (0 indicates no
 *                        events needed to be spawned), false if spawning fails for one or more events or
 *                        void if the function registered _wp_cron() to run on the action.
 */
function wp_cron() {
	if ( did_action( 'wp_loaded' ) ) {
		return _wp_cron();
	}

	add_action( 'wp_loaded', '_wp_cron', 20 );
}

/**
 * Runs scheduled callbacks or spawns cron for all scheduled events.
 *
 * Warning: This function may return Boolean FALSE, but may also return a non-Boolean
 * value which evaluates to FALSE. For information about casting to booleans see the
 * {@link https://www.php.net/manual/en/language.types.boolean.php PHP documentation}. Use
 * the `===` operator for testing the return value of this function.
 *
 * @since 5.7.0
 * @access private
 *
 * @return int|false On success an integer indicating number of events spawned (0 indicates no
 *                   events needed to be spawned), false if spawning fails for one or more events.
 */
function _wp_cron() {
	// Prevent infinite loops caused by lack of wp-cron.php.
	if ( str_contains( $_SERVER['REQUEST_URI'], '/wp-cron.php' )
		|| ( defined( 'DISABLE_WP_CRON' ) && DISABLE_WP_CRON )
	) {
		return 0;
	}

	$crons = wp_get_ready_cron_jobs();
	if ( empty( $crons ) ) {
		return 0;
	}

	$gmt_time = microtime( true );
	$keys     = array_keys( $crons );
	if ( isset( $keys[0] ) && $keys[0] > $gmt_time ) {
		return 0;
	}

	$schedules = wp_get_schedules();
	$results   = array();

	foreach ( $crons as $timestamp => $cronhooks ) {
		if ( $timestamp > $gmt_time ) {
			break;
		}

		foreach ( (array) $cronhooks as $hook => $args ) {
			if ( isset( $schedules[ $hook ]['callback'] )
				&& ! call_user_func( $schedules[ $hook ]['callback'] )
			) {
				continue;
			}

			$results[] = spawn_cron( $gmt_time );
			break 2;
		}
	}

	if ( in_array( false, $results, true ) ) {
		return false;
	}

	return count( $results );
}

/**
 * Retrieves supported event recurrence schedules.
 *
 * The default supported recurrences are 'hourly', 'twicedaily', 'daily', and 'weekly'.
 * A plugin may add more by hooking into the {@see 'cron_schedules'} filter.
 * The filter accepts an array of arrays. The outer array has a key that is the name
 * of the schedule, for example 'monthly'. The value is an array with two keys,
 * one is 'interval' and the other is 'display'.
 *
 * The 'interval' is a number in seconds of when the cron job should run.
 * So for 'hourly' the time is `HOUR_IN_SECONDS` (`60 * 60` or `3600`). For 'monthly',
 * the value would be `MONTH_IN_SECONDS` (`30 * 24 * 60 * 60` or `2592000`).
 *
 * The 'display' is the description. For the 'monthly' key, the 'display'
 * would be `__( 'Once Monthly' )`.
 *
 * For your plugin, you will be passed an array. You can add your
 * schedule by doing the following:
 *
 *     // Filter parameter variable name is 'array'.
 *     $array['monthly'] = array(
 *         'interval' => MONTH_IN_SECONDS,
 *         'display'  => __( 'Once Monthly' )
 *     );
 *
 * @since 2.1.0
 * @since 5.4.0 The 'weekly' schedule was added.
 *
 * @return array {
 *     The array of cron schedules keyed by the schedule name.
 *
 *     @type array ...$0 {
 *         Cron schedule information.
 *
 *         @type int    $interval The schedule interval in seconds.
 *         @type string $display  The schedule display name.
 *     }
 * }
 */
function wp_get_schedules() {
	$schedules = array(
		'hourly'     => array(
			'interval' => HOUR_IN_SECONDS,
			'display'  => __( 'Once Hourly' ),
		),
		'twicedaily' => array(
			'interval' => 12 * HOUR_IN_SECONDS,
			'display'  => __( 'Twice Daily' ),
		),
		'daily'      => array(
			'interval' => DAY_IN_SECONDS,
			'display'  => __( 'Once Daily' ),
		),
		'weekly'     => array(
			'interval' => WEEK_IN_SECONDS,
			'display'  => __( 'Once Weekly' ),
		),
	);

	/**
	 * Filters the non-default cron schedules.
	 *
	 * @since 2.1.0
	 *
	 * @param array $new_schedules {
	 *     An array of non-default cron schedules keyed by the schedule name. Default empty array.
	 *
	 *     @type array ...$0 {
	 *         Cron schedule information.
	 *
	 *         @type int    $interval The schedule interval in seconds.
	 *         @type string $display  The schedule display name.
	 *     }
	 * }
	 */
	return array_merge( apply_filters( 'cron_schedules', array() ), $schedules );
}

/**
 * Retrieves the name of the recurrence schedule for an event.
 *
 * @see wp_get_schedules() for available schedules.
 *
 * @since 2.1.0
 * @since 5.1.0 {@see 'get_schedule'} filter added.
 *
 * @param string $hook Action hook to identify the event.
 * @param array  $args Optional. Arguments passed to the event's callback function.
 *                     Default empty array.
 * @return string|false Schedule name on success, false if no schedule.
 */
function wp_get_schedule( $hook, $args = array() ) {
	$schedule = false;
	$event    = wp_get_scheduled_event( $hook, $args );

	if ( $event ) {
		$schedule = $event->schedule;
	}

	/**
	 * Filters the schedule name for a hook.
	 *
	 * @since 5.1.0
	 *
	 * @param string|false $schedule Schedule for the hook. False if not found.
	 * @param string       $hook     Action hook to execute when cron is run.
	 * @param array        $args     Arguments to pass to the hook's callback function.
	 */
	return apply_filters( 'get_schedule', $schedule, $hook, $args );
}

/**
 * Retrieves cron jobs ready to be run.
 *
 * Returns the results of _get_cron_array() limited to events ready to be run,
 * ie, with a timestamp in the past.
 *
 * @since 5.1.0
 *
 * @return array[] Array of cron job arrays ready to be run.
 */
function wp_get_ready_cron_jobs() {
	/**
	 * Filter to override retrieving ready cron jobs.
	 *
	 * Returning an array will short-circuit the normal retrieval of ready
	 * cron jobs, causing the function to return the filtered value instead.
	 *
	 * @since 5.1.0
	 *
	 * @param null|array[] $pre Array of ready cron tasks to return instead. Default null
	 *                          to continue using results from _get_cron_array().
	 */
	$pre = apply_filters( 'pre_get_ready_cron_jobs', null );

	if ( null !== $pre ) {
		return $pre;
	}

	$crons    = _get_cron_array();
	$gmt_time = microtime( true );
	$results  = array();

	foreach ( $crons as $timestamp => $cronhooks ) {
		if ( $timestamp > $gmt_time ) {
			break;
		}

		$results[ $timestamp ] = $cronhooks;
	}

	return $results;
}

//
// Private functions.
//

/**
 * Retrieves cron info array option.
 *
 * @since 2.1.0
 * @since 6.1.0 Return type modified to consistently return an array.
 * @access private
 *
 * @return array[] Array of cron events.
 */
function _get_cron_array() {
	$cron = get_option( 'cron' );
	if ( ! is_array( $cron ) ) {
		return array();
	}

	if ( ! isset( $cron['version'] ) ) {
		$cron = _upgrade_cron_array( $cron );
	}

	unset( $cron['version'] );

	return $cron;
}

/**
 * Updates the cron option with the new cron array.
 *
 * @since 2.1.0
 * @since 5.1.0 Return value modified to outcome of update_option().
 * @since 5.7.0 The `$wp_error` parameter was added.
 *
 * @access private
 *
 * @param array[] $cron     Array of cron info arrays from _get_cron_array().
 * @param bool    $wp_error Optional. Whether to return a WP_Error on failure. Default false.
 * @return bool|WP_Error True if cron array updated. False or WP_Error on failure.
 */
function _set_cron_array( $cron, $wp_error = false ) {
	if ( ! is_array( $cron ) ) {
		$cron = array();
	}

	$cron['version'] = 2;

	$result = update_option( 'cron', $cron, true );

	if ( $wp_error && ! $result ) {
		return new WP_Error(
			'could_not_set',
			__( 'The cron event list could not be saved.' )
		);
	}

	return $result;
}

/**
 * Upgrades a cron info array.
 *
 * This function upgrades the cron info array to version 2.
 *
 * @since 2.1.0
 * @access private
 *
 * @param array $cron Cron info array from _get_cron_array().
 * @return array An upgraded cron info array.
 */
function _upgrade_cron_array( $cron ) {
	if ( isset( $cron['version'] ) && 2 === $cron['version'] ) {
		return $cron;
	}

	$new_cron = array();

	foreach ( (array) $cron as $timestamp => $hooks ) {
		foreach ( (array) $hooks as $hook => $args ) {
			$key = md5( serialize( $args['args'] ) );

			$new_cron[ $timestamp ][ $hook ][ $key ] = $args;
		}
	}

	$new_cron['version'] = 2;

	update_option( 'cron', $new_cron, true );

	return $new_cron;
}

SILENT KILLER Tool