Priority File Manager

๐Ÿ“ public_html
Base Directory:
/home/toolrmtm/crazyespresso.com/wp-includes
NameTypeSizeActions
๐Ÿ“ .. Folder -
๐Ÿ“ ID3 Folder -
๐Ÿ“ IXR Folder -
๐Ÿ“ PHPMailer Folder -
๐Ÿ“ Requests Folder -
๐Ÿ“ SimplePie Folder -
๐Ÿ“ Text Folder -
๐Ÿ“ abilities-api Folder -
๐Ÿ“„ abilities-api.php File 24369
Edit Download
๐Ÿ“„ abilities.php File 7983
Edit Download
๐Ÿ“„ admin-bar.php File 36966
Edit Download
๐Ÿ“ assets Folder -
๐Ÿ“„ atomlib.php File 12181
Edit Download
๐Ÿ“„ author-template.php File 19391
Edit Download
๐Ÿ“ block-bindings Folder -
๐Ÿ“„ block-bindings.php File 7526
Edit Download
๐Ÿ“„ block-editor.php File 29282
Edit Download
๐Ÿ“„ block-i18n.json File 316
Edit Download
๐Ÿ“ block-patterns Folder -
๐Ÿ“„ block-patterns.php File 13213
Edit Download
๐Ÿ“ block-supports Folder -
๐Ÿ“„ block-template-utils.php File 62484
Edit Download
๐Ÿ“„ block-template.php File 15359
Edit Download
๐Ÿ“ blocks Folder -
๐Ÿ“„ blocks.php File 114739
Edit Download
๐Ÿ“„ bookmark-template.php File 12768
Edit Download
๐Ÿ“„ bookmark.php File 15427
Edit Download
๐Ÿ“„ cache-compat.php File 10078
Edit Download
๐Ÿ“„ cache.php File 13486
Edit Download
๐Ÿ“„ canonical.php File 34645
Edit Download
๐Ÿ“„ capabilities.php File 43652
Edit Download
๐Ÿ“„ category-template.php File 57045
Edit Download
๐Ÿ“„ category.php File 12829
Edit Download
๐Ÿ“ certificates Folder -
๐Ÿ“„ class-IXR.php File 2616
Edit Download
๐Ÿ“„ class-avif-info.php File 29615
Edit Download
๐Ÿ“„ class-feed.php File 539
Edit Download
๐Ÿ“„ class-http.php File 367
Edit Download
๐Ÿ“„ class-json.php File 43676
Edit Download
๐Ÿ“„ class-oembed.php File 401
Edit Download
๐Ÿ“„ class-phpass.php File 6771
Edit Download
๐Ÿ“„ class-phpmailer.php File 664
Edit Download
๐Ÿ“„ class-pop3.php File 21121
Edit Download
๐Ÿ“„ class-requests.php File 2237
Edit Download
๐Ÿ“„ class-simplepie.php File 453
Edit Download
๐Ÿ“„ class-smtp.php File 457
Edit Download
๐Ÿ“„ class-snoopy.php File 37715
Edit Download
๐Ÿ“„ class-walker-category-dropdown.php File 2469
Edit Download
๐Ÿ“„ class-walker-category.php File 8477
Edit Download
๐Ÿ“„ class-walker-comment.php File 14221
Edit Download
๐Ÿ“„ class-walker-nav-menu.php File 12044
Edit Download
๐Ÿ“„ class-walker-page-dropdown.php File 2710
Edit Download
๐Ÿ“„ class-walker-page.php File 7612
Edit Download
๐Ÿ“„ class-wp-admin-bar.php File 17874
Edit Download
๐Ÿ“„ class-wp-ajax-response.php File 5266
Edit Download
๐Ÿ“„ class-wp-application-passwords.php File 17099
Edit Download
๐Ÿ“„ class-wp-block-bindings-registry.php File 8482
Edit Download
๐Ÿ“„ class-wp-block-bindings-source.php File 2992
Edit Download
๐Ÿ“„ class-wp-block-editor-context.php File 1350
Edit Download
๐Ÿ“„ class-wp-block-list.php File 4713
Edit Download
๐Ÿ“„ class-wp-block-metadata-registry.php File 11895
Edit Download
๐Ÿ“„ class-wp-block-parser-block.php File 2555
Edit Download
๐Ÿ“„ class-wp-block-parser-frame.php File 2017
Edit Download
๐Ÿ“„ class-wp-block-parser.php File 11516
Edit Download
๐Ÿ“„ class-wp-block-pattern-categories-registry.php File 5450
Edit Download
๐Ÿ“„ class-wp-block-patterns-registry.php File 10851
Edit Download
๐Ÿ“„ class-wp-block-processor.php File 69469
Edit Download
๐Ÿ“„ class-wp-block-styles-registry.php File 6497
Edit Download
๐Ÿ“„ class-wp-block-supports.php File 5626
Edit Download
๐Ÿ“„ class-wp-block-template.php File 2033
Edit Download
๐Ÿ“„ class-wp-block-templates-registry.php File 7193
Edit Download
๐Ÿ“„ class-wp-block-type-registry.php File 5030
Edit Download
๐Ÿ“„ class-wp-block-type.php File 17265
Edit Download
๐Ÿ“„ class-wp-block.php File 24812
Edit Download
๐Ÿ“„ class-wp-classic-to-block-menu-converter.php File 4070
Edit Download
๐Ÿ“„ class-wp-comment-query.php File 48804
Edit Download
๐Ÿ“„ class-wp-comment.php File 9437
Edit Download
๐Ÿ“„ class-wp-customize-control.php File 26119
Edit Download
๐Ÿ“„ class-wp-customize-manager.php File 203139
Edit Download
๐Ÿ“„ class-wp-customize-nav-menus.php File 58013
Edit Download
๐Ÿ“„ class-wp-customize-panel.php File 10710
Edit Download
๐Ÿ“„ class-wp-customize-section.php File 11209
Edit Download
๐Ÿ“„ class-wp-customize-setting.php File 29962
Edit Download
๐Ÿ“„ class-wp-customize-widgets.php File 72607
Edit Download
๐Ÿ“„ class-wp-date-query.php File 36147
Edit Download
๐Ÿ“„ class-wp-dependencies.php File 15381
Edit Download
๐Ÿ“„ class-wp-dependency.php File 2633
Edit Download
๐Ÿ“„ class-wp-duotone.php File 40783
Edit Download
๐Ÿ“„ class-wp-editor.php File 72335
Edit Download
๐Ÿ“„ class-wp-embed.php File 15931
Edit Download
๐Ÿ“„ class-wp-error.php File 7502
Edit Download
๐Ÿ“„ class-wp-exception.php File 253
Edit Download
๐Ÿ“„ class-wp-fatal-error-handler.php File 8150
Edit Download
๐Ÿ“„ class-wp-feed-cache-transient.php File 3304
Edit Download
๐Ÿ“„ class-wp-feed-cache.php File 969
Edit Download
๐Ÿ“„ class-wp-hook.php File 16674
Edit Download
๐Ÿ“„ class-wp-http-cookie.php File 7389
Edit Download
๐Ÿ“„ class-wp-http-curl.php File 13261
Edit Download
๐Ÿ“„ class-wp-http-encoding.php File 6689
Edit Download
๐Ÿ“„ class-wp-http-ixr-client.php File 3501
Edit Download
๐Ÿ“„ class-wp-http-proxy.php File 5980
Edit Download
๐Ÿ“„ class-wp-http-requests-hooks.php File 2022
Edit Download
๐Ÿ“„ class-wp-http-requests-response.php File 4400
Edit Download
๐Ÿ“„ class-wp-http-response.php File 2977
Edit Download
๐Ÿ“„ class-wp-http-streams.php File 16859
Edit Download
๐Ÿ“„ class-wp-http.php File 41570
Edit Download
๐Ÿ“„ class-wp-image-editor-gd.php File 20705
Edit Download
๐Ÿ“„ class-wp-image-editor-imagick.php File 36977
Edit Download
๐Ÿ“„ class-wp-image-editor.php File 17415
Edit Download
๐Ÿ“„ class-wp-list-util.php File 7443
Edit Download
๐Ÿ“„ class-wp-locale-switcher.php File 6776
Edit Download
๐Ÿ“„ class-wp-locale.php File 16883
Edit Download
๐Ÿ“„ class-wp-matchesmapregex.php File 1828
Edit Download
๐Ÿ“„ class-wp-meta-query.php File 30533
Edit Download
๐Ÿ“„ class-wp-metadata-lazyloader.php File 6833
Edit Download
๐Ÿ“„ class-wp-navigation-fallback.php File 9193
Edit Download
๐Ÿ“„ class-wp-network-query.php File 19887
Edit Download
๐Ÿ“„ class-wp-network.php File 12296
Edit Download
๐Ÿ“„ class-wp-object-cache.php File 17524
Edit Download
๐Ÿ“„ class-wp-oembed-controller.php File 6905
Edit Download
๐Ÿ“„ class-wp-oembed.php File 31670
Edit Download
๐Ÿ“„ class-wp-paused-extensions-storage.php File 5111
Edit Download
๐Ÿ“„ class-wp-phpmailer.php File 4348
Edit Download
๐Ÿ“„ class-wp-plugin-dependencies.php File 25315
Edit Download
๐Ÿ“„ class-wp-post-type.php File 30680
Edit Download
๐Ÿ“„ class-wp-post.php File 6491
Edit Download
๐Ÿ“„ class-wp-query.php File 163744
Edit Download
๐Ÿ“„ class-wp-recovery-mode-cookie-service.php File 6877
Edit Download
๐Ÿ“„ class-wp-recovery-mode-email-service.php File 11183
Edit Download
๐Ÿ“„ class-wp-recovery-mode-key-service.php File 4884
Edit Download
๐Ÿ“„ class-wp-recovery-mode-link-service.php File 3463
Edit Download
๐Ÿ“„ class-wp-recovery-mode.php File 11453
Edit Download
๐Ÿ“„ class-wp-rewrite.php File 63687
Edit Download
๐Ÿ“„ class-wp-role.php File 2523
Edit Download
๐Ÿ“„ class-wp-roles.php File 9394
Edit Download
๐Ÿ“„ class-wp-script-modules.php File 31882
Edit Download
๐Ÿ“„ class-wp-scripts.php File 34177
Edit Download
๐Ÿ“„ class-wp-session-tokens.php File 7319
Edit Download
๐Ÿ“„ class-wp-simplepie-file.php File 3552
Edit Download
๐Ÿ“„ class-wp-simplepie-sanitize-kses.php File 1910
Edit Download
๐Ÿ“„ class-wp-site-query.php File 31655
Edit Download
๐Ÿ“„ class-wp-site.php File 7467
Edit Download
๐Ÿ“„ class-wp-speculation-rules.php File 7527
Edit Download
๐Ÿ“„ class-wp-styles.php File 12144
Edit Download
๐Ÿ“„ class-wp-tax-query.php File 19577
Edit Download
๐Ÿ“„ class-wp-taxonomy.php File 18559
Edit Download
๐Ÿ“„ class-wp-term-query.php File 40953
Edit Download
๐Ÿ“„ class-wp-term.php File 5298
Edit Download
๐Ÿ“„ class-wp-text-diff-renderer-inline.php File 979
Edit Download
๐Ÿ“„ class-wp-text-diff-renderer-table.php File 18880
Edit Download
๐Ÿ“„ class-wp-textdomain-registry.php File 10481
Edit Download
๐Ÿ“„ class-wp-theme-json-data.php File 1809
Edit Download
๐Ÿ“„ class-wp-theme-json-resolver.php File 35738
Edit Download
๐Ÿ“„ class-wp-theme-json-schema.php File 7367
Edit Download
๐Ÿ“„ class-wp-theme-json.php File 164347
Edit Download
๐Ÿ“„ class-wp-theme.php File 65810
Edit Download
๐Ÿ“„ class-wp-token-map.php File 28618
Edit Download
๐Ÿ“„ class-wp-url-pattern-prefixer.php File 4802
Edit Download
๐Ÿ“„ class-wp-user-meta-session-tokens.php File 3011
Edit Download
๐Ÿ“„ class-wp-user-query.php File 44166
Edit Download
๐Ÿ“„ class-wp-user-request.php File 2305
Edit Download
๐Ÿ“„ class-wp-user.php File 23044
Edit Download
๐Ÿ“„ class-wp-walker.php File 13322
Edit Download
๐Ÿ“„ class-wp-widget-factory.php File 3347
Edit Download
๐Ÿ“„ class-wp-widget.php File 18429
Edit Download
๐Ÿ“„ class-wp-xmlrpc-server.php File 215447
Edit Download
๐Ÿ“„ class-wp.php File 26481
Edit Download
๐Ÿ“„ class-wpdb.php File 118627
Edit Download
๐Ÿ“„ class.wp-dependencies.php File 373
Edit Download
๐Ÿ“„ class.wp-scripts.php File 343
Edit Download
๐Ÿ“„ class.wp-styles.php File 338
Edit Download
๐Ÿ“„ comment-template.php File 103145
Edit Download
๐Ÿ“„ comment.php File 134069
Edit Download
๐Ÿ“„ compat-utf8.php File 19554
Edit Download
๐Ÿ“„ compat.php File 17830
Edit Download
๐Ÿ“„ cron.php File 42988
Edit Download
๐Ÿ“ css Folder -
๐Ÿ“ customize Folder -
๐Ÿ“„ date.php File 400
Edit Download
๐Ÿ“„ default-constants.php File 11365
Edit Download
๐Ÿ“„ default-filters.php File 37910
Edit Download
๐Ÿ“„ default-widgets.php File 2295
Edit Download
๐Ÿ“„ deprecated.php File 192644
Edit Download
๐Ÿ“„ embed-template.php File 338
Edit Download
๐Ÿ“„ embed.php File 38911
Edit Download
๐Ÿ“„ error-protection.php File 4121
Edit Download
๐Ÿ“„ feed-atom-comments.php File 5504
Edit Download
๐Ÿ“„ feed-atom.php File 3121
Edit Download
๐Ÿ“„ feed-rdf.php File 2668
Edit Download
๐Ÿ“„ feed-rss.php File 1189
Edit Download
๐Ÿ“„ feed-rss2-comments.php File 4136
Edit Download
๐Ÿ“„ feed-rss2.php File 3799
Edit Download
๐Ÿ“„ feed.php File 23579
Edit Download
๐Ÿ“ fonts Folder -
๐Ÿ“„ fonts.php File 9790
Edit Download
๐Ÿ“„ formatting.php File 354741
Edit Download
๐Ÿ“„ functions.php File 288600
Edit Download
๐Ÿ“„ functions.wp-scripts.php File 15311
Edit Download
๐Ÿ“„ functions.wp-styles.php File 8641
Edit Download
๐Ÿ“„ general-template.php File 173004
Edit Download
๐Ÿ“„ global-styles-and-settings.php File 21204
Edit Download
๐Ÿ“ html-api Folder -
๐Ÿ“„ http.php File 25878
Edit Download
๐Ÿ“„ https-detection.php File 5857
Edit Download
๐Ÿ“„ https-migration.php File 4741
Edit Download
๐Ÿ“ images Folder -
๐Ÿ“ interactivity-api Folder -
๐Ÿ“ js Folder -
๐Ÿ“„ kses.php File 83677
Edit Download
๐Ÿ“ l10n Folder -
๐Ÿ“„ l10n.php File 68797
Edit Download
๐Ÿ“„ link-template.php File 160117
Edit Download
๐Ÿ“„ load.php File 56510
Edit Download
๐Ÿ“„ locale.php File 162
Edit Download
๐Ÿ“„ media-template.php File 63197
Edit Download
๐Ÿ“„ media.php File 221186
Edit Download
๐Ÿ“„ meta.php File 66556
Edit Download
๐Ÿ“„ ms-blogs.php File 25845
Edit Download
๐Ÿ“„ ms-default-constants.php File 4921
Edit Download
๐Ÿ“„ ms-default-filters.php File 6636
Edit Download
๐Ÿ“„ ms-deprecated.php File 21759
Edit Download
๐Ÿ“„ ms-files.php File 2857
Edit Download
๐Ÿ“„ ms-functions.php File 91842
Edit Download
๐Ÿ“„ ms-load.php File 19887
Edit Download
๐Ÿ“„ ms-network.php File 3782
Edit Download
๐Ÿ“„ ms-settings.php File 4204
Edit Download
๐Ÿ“„ ms-site.php File 41717
Edit Download
๐Ÿ“„ nav-menu-template.php File 25990
Edit Download
๐Ÿ“„ nav-menu.php File 44373
Edit Download
๐Ÿ“„ option.php File 105035
Edit Download
๐Ÿ“ php-compat Folder -
๐Ÿ“„ pluggable-deprecated.php File 6324
Edit Download
๐Ÿ“„ pluggable.php File 127440
Edit Download
๐Ÿ“„ plugin.php File 36501
Edit Download
๐Ÿ“ pomo Folder -
๐Ÿ“„ post-formats.php File 7102
Edit Download
๐Ÿ“„ post-template.php File 68648
Edit Download
๐Ÿ“„ post-thumbnail-template.php File 10879
Edit Download
๐Ÿ“„ post.php File 296072
Edit Download
๐Ÿ“„ query.php File 37095
Edit Download
๐Ÿ“„ registration-functions.php File 200
Edit Download
๐Ÿ“„ registration.php File 200
Edit Download
๐Ÿ“ rest-api Folder -
๐Ÿ“„ rest-api.php File 100654
Edit Download
๐Ÿ“„ revision.php File 30741
Edit Download
๐Ÿ“„ rewrite.php File 19490
Edit Download
๐Ÿ“„ robots-template.php File 5185
Edit Download
๐Ÿ“„ rss-functions.php File 255
Edit Download
๐Ÿ“„ rss.php File 23203
Edit Download
๐Ÿ“„ script-loader.php File 153993
Edit Download
๐Ÿ“„ script-modules.php File 9911
Edit Download
๐Ÿ“„ session.php File 258
Edit Download
๐Ÿ“„ shortcodes.php File 24050
Edit Download
๐Ÿ“ sitemaps Folder -
๐Ÿ“„ sitemaps.php File 3238
Edit Download
๐Ÿ“ sodium_compat Folder -
๐Ÿ“„ speculative-loading.php File 8600
Edit Download
๐Ÿ“„ spl-autoload-compat.php File 441
Edit Download
๐Ÿ“ style-engine Folder -
๐Ÿ“„ style-engine.php File 7563
Edit Download
๐Ÿ“„ taxonomy.php File 177058
Edit Download
๐Ÿ“„ template-canvas.php File 544
Edit Download
๐Ÿ“„ template-loader.php File 3929
Edit Download
๐Ÿ“„ template.php File 36834
Edit Download
๐Ÿ“ theme-compat Folder -
๐Ÿ“„ theme-i18n.json File 1526
Edit Download
๐Ÿ“„ theme-previews.php File 2910
Edit Download
๐Ÿ“„ theme-templates.php File 6238
Edit Download
๐Ÿ“„ theme.json File 8921
Edit Download
๐Ÿ“„ theme.php File 135008
Edit Download
๐Ÿ“„ update.php File 38353
Edit Download
๐Ÿ“„ user.php File 178062
Edit Download
๐Ÿ“„ utf8.php File 7260
Edit Download
๐Ÿ“„ vars.php File 6562
Edit Download
๐Ÿ“„ version.php File 1104
Edit Download
๐Ÿ“ widgets Folder -
๐Ÿ“„ widgets.php File 71129
Edit Download
๐Ÿ“„ wp-db.php File 445
Edit Download
๐Ÿ“„ wp-diff.php File 799
Edit Download

View File: compat-utf8.php

<?php

/**
 * Finds spans of valid and invalid UTF-8 bytes in a given string.
 *
 * This is a low-level tool to power various UTF-8 functionality.
 * It scans through a string until it finds invalid byte spans.
 * When it does this, it does three things:
 *
 *  - Assigns `$at` to the position after the last successful code point.
 *  - Assigns `$invalid_length` to the length of the maximal subpart of
 *    the invalid bytes starting at `$at`.
 *  - Returns how many code points were successfully scanned.
 *
 * This information is enough to build a number of useful UTF-8 functions.
 *
 * Example:
 *
 *     // รฑ is U+F1, which in `ISO-8859-1`/`latin1`/`Windows-1252`/`cp1252` is 0xF1.
 *     "Pi\xF1a" === $pineapple = mb_convert_encoding( "Piรฑa", 'Windows-1252', 'UTF-8' );
 *     $at = $invalid_length = 0;
 *
 *     // The first step finds the invalid 0xF1 byte.
 *     2 === _wp_scan_utf8( $pineapple, $at, $invalid_length );
 *     $at === 2; $invalid_length === 1;
 *
 *     // The second step continues to the end of the string.
 *     1 === _wp_scan_utf8( $pineapple, $at, $invalid_length );
 *     $at === 4; $invalid_length === 0;
 *
 * Note! While passing an options array here might be convenient from a calling-code standpoint,
 *       this function is intended to serve as a very low-level foundation upon which to build
 *       higher level functionality. For the sake of keeping costs explicit all arguments are
 *       passed directly.
 *
 * @since 6.9.0
 * @access private
 *
 * @param string    $bytes             UTF-8 encoded string which might include invalid spans of bytes.
 * @param int       $at                Where to start scanning.
 * @param int       $invalid_length    Will be set to how many bytes are to be ignored after `$at`.
 * @param int|null  $max_bytes         Stop scanning after this many bytes have been seen.
 * @param int|null  $max_code_points   Stop scanning after this many code points have been seen.
 * @param bool|null $has_noncharacters Set to indicate if scanned string contained noncharacters.
 * @return int How many code points were successfully scanned.
 */
function _wp_scan_utf8( string $bytes, int &$at, int &$invalid_length, ?int $max_bytes = null, ?int $max_code_points = null, ?bool &$has_noncharacters = null ): int {
	$byte_length       = strlen( $bytes );
	$end               = min( $byte_length, $at + ( $max_bytes ?? PHP_INT_MAX ) );
	$invalid_length    = 0;
	$count             = 0;
	$max_count         = $max_code_points ?? PHP_INT_MAX;
	$has_noncharacters = false;

	for ( $i = $at; $i < $end && $count <= $max_count; $i++ ) {
		/*
		 * Quickly skip past US-ASCII bytes, all of which are valid UTF-8.
		 *
		 * This optimization step improves the speed from 10x to 100x
		 * depending on whether the JIT has optimized the function.
		 */
		$ascii_byte_count = strspn(
			$bytes,
			"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f" .
			"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f" .
			" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f",
			$i,
			$end - $i
		);

		if ( $count + $ascii_byte_count >= $max_count ) {
			$at    = $i + ( $max_count - $count );
			$count = $max_count;
			return $count;
		}

		$count += $ascii_byte_count;
		$i     += $ascii_byte_count;

		if ( $i >= $end ) {
			$at = $end;
			return $count;
		}

		/**
		 * The above fast-track handled all single-byte UTF-8 characters. What
		 * follows MUST be a multibyte sequence otherwise thereโ€™s invalid UTF-8.
		 *
		 * Therefore everything past here is checking those multibyte sequences.
		 *
		 * It may look like thereโ€™s a need to check against the max bytes here,
		 * but since each match of a single character returns, this functions will
		 * bail already if crossing the max-bytes threshold. This function SHALL
		 * NOT return in the middle of a multi-byte character, so if a character
		 * falls on each side of the max bytes, the entire character will be scanned.
		 *
		 * Because itโ€™s possible that there are truncated characters, the use of
		 * the null-coalescing operator with "\xC0" is a convenience for skipping
		 * length checks on every continuation bytes. This works because 0xC0 is
		 * always invalid in a UTF-8 string, meaning that if the string has been
		 * truncated, it will find 0xC0 and reject as invalid UTF-8.
		 *
		 * > [The following table] lists all of the byte sequences that are well-formed
		 * > in UTF-8. A range of byte values such as A0..BF indicates that any byte
		 * > from A0 to BF (inclusive) is well-formed in that position. Any byte value
		 * > outside of the ranges listed is ill-formed.
		 *
		 * > Table 3-7. Well-Formed UTF-8 Byte Sequences
		 *  โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ
		 *  โ”‚ Code Points         โ”‚ First Byte โ”‚ Second Byte  โ”‚ Third Byte  โ”‚ Fourth Byte  โ”‚
		 *  โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
		 *  โ”‚ U+0000..U+007F      โ”‚ 00..7F     โ”‚              โ”‚             โ”‚              โ”‚
		 *  โ”‚ U+0080..U+07FF      โ”‚ C2..DF     โ”‚ 80..BF       โ”‚             โ”‚              โ”‚
		 *  โ”‚ U+0800..U+0FFF      โ”‚ E0         โ”‚ A0..BF       โ”‚ 80..BF      โ”‚              โ”‚
		 *  โ”‚ U+1000..U+CFFF      โ”‚ E1..EC     โ”‚ 80..BF       โ”‚ 80..BF      โ”‚              โ”‚
		 *  โ”‚ U+D000..U+D7FF      โ”‚ ED         โ”‚ 80..9F       โ”‚ 80..BF      โ”‚              โ”‚
		 *  โ”‚ U+E000..U+FFFF      โ”‚ EE..EF     โ”‚ 80..BF       โ”‚ 80..BF      โ”‚              โ”‚
		 *  โ”‚ U+10000..U+3FFFF    โ”‚ F0         โ”‚ 90..BF       โ”‚ 80..BF      โ”‚ 80..BF       โ”‚
		 *  โ”‚ U+40000..U+FFFFF    โ”‚ F1..F3     โ”‚ 80..BF       โ”‚ 80..BF      โ”‚ 80..BF       โ”‚
		 *  โ”‚ U+100000..U+10FFFF  โ”‚ F4         โ”‚ 80..8F       โ”‚ 80..BF      โ”‚ 80..BF       โ”‚
		 *  โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ
		 *
		 * @see https://www.unicode.org/versions/Unicode16.0.0/core-spec/chapter-3/#G27506
		 */

		// Valid two-byte code points.
		$b1 = ord( $bytes[ $i ] );
		$b2 = ord( $bytes[ $i + 1 ] ?? "\xC0" );

		if ( $b1 >= 0xC2 && $b1 <= 0xDF && $b2 >= 0x80 && $b2 <= 0xBF ) {
			++$count;
			++$i;
			continue;
		}

		// Valid three-byte code points.
		$b3 = ord( $bytes[ $i + 2 ] ?? "\xC0" );

		if ( $b3 < 0x80 || $b3 > 0xBF ) {
			goto invalid_utf8;
		}

		if (
			( 0xE0 === $b1 && $b2 >= 0xA0 && $b2 <= 0xBF ) ||
			( $b1 >= 0xE1 && $b1 <= 0xEC && $b2 >= 0x80 && $b2 <= 0xBF ) ||
			( 0xED === $b1 && $b2 >= 0x80 && $b2 <= 0x9F ) ||
			( $b1 >= 0xEE && $b1 <= 0xEF && $b2 >= 0x80 && $b2 <= 0xBF )
		) {
			++$count;
			$i += 2;

			// Covers the range U+FDD0โ€“U+FDEF, U+FFFE, U+FFFF.
			if ( 0xEF === $b1 ) {
				$has_noncharacters |= (
					( 0xB7 === $b2 && $b3 >= 0x90 && $b3 <= 0xAF ) ||
					( 0xBF === $b2 && ( 0xBE === $b3 || 0xBF === $b3 ) )
				);
			}

			continue;
		}

		// Valid four-byte code points.
		$b4 = ord( $bytes[ $i + 3 ] ?? "\xC0" );

		if ( $b4 < 0x80 || $b4 > 0xBF ) {
			goto invalid_utf8;
		}

		if (
			( 0xF0 === $b1 && $b2 >= 0x90 && $b2 <= 0xBF ) ||
			( $b1 >= 0xF1 && $b1 <= 0xF3 && $b2 >= 0x80 && $b2 <= 0xBF ) ||
			( 0xF4 === $b1 && $b2 >= 0x80 && $b2 <= 0x8F )
		) {
			++$count;
			$i += 3;

			// Covers U+1FFFE, U+1FFFF, U+2FFFE, U+2FFFF, โ€ฆ, U+10FFFE, U+10FFFF.
			$has_noncharacters |= (
				( 0x0F === ( $b2 & 0x0F ) ) &&
				0xBF === $b3 &&
				( 0xBE === $b4 || 0xBF === $b4 )
			);

			continue;
		}

		/**
		 * When encountering invalid byte sequences, Unicode suggests finding the
		 * maximal subpart of a text and replacing that subpart with a single
		 * replacement character.
		 *
		 * > This practice is more secure because it does not result in the
		 * > conversion consuming parts of valid sequences as though they were
		 * > invalid. It also guarantees at least one replacement character will
		 * > occur for each instance of an invalid sequence in the original text.
		 * > Furthermore, this practice can be defined consistently for better
		 * > interoperability between different implementations of conversion.
		 *
		 * @see https://www.unicode.org/versions/Unicode16.0.0/core-spec/chapter-5/#G40630
		 */
		invalid_utf8:
		$at             = $i;
		$invalid_length = 1;

		// Single-byte and two-byte characters.
		if ( ( 0x00 === ( $b1 & 0x80 ) ) || ( 0xC0 === ( $b1 & 0xE0 ) ) ) {
			return $count;
		}

		$b2 = ord( $bytes[ $i + 1 ] ?? "\xC0" );
		$b3 = ord( $bytes[ $i + 2 ] ?? "\xC0" );

		// Find the maximal subpart and skip past it.
		if ( 0xE0 === ( $b1 & 0xF0 ) ) {
			// Three-byte characters.
			$b2_valid = (
				( 0xE0 === $b1 && $b2 >= 0xA0 && $b2 <= 0xBF ) ||
				( $b1 >= 0xE1 && $b1 <= 0xEC && $b2 >= 0x80 && $b2 <= 0xBF ) ||
				( 0xED === $b1 && $b2 >= 0x80 && $b2 <= 0x9F ) ||
				( $b1 >= 0xEE && $b1 <= 0xEF && $b2 >= 0x80 && $b2 <= 0xBF )
			);

			$invalid_length = min( $end - $i, $b2_valid ? 2 : 1 );
			return $count;
		} elseif ( 0xF0 === ( $b1 & 0xF8 ) ) {
			// Four-byte characters.
			$b2_valid = (
				( 0xF0 === $b1 && $b2 >= 0x90 && $b2 <= 0xBF ) ||
				( $b1 >= 0xF1 && $b1 <= 0xF3 && $b2 >= 0x80 && $b2 <= 0xBF ) ||
				( 0xF4 === $b1 && $b2 >= 0x80 && $b2 <= 0x8F )
			);

			$b3_valid = $b3 >= 0x80 && $b3 <= 0xBF;

			$invalid_length = min( $end - $i, $b2_valid ? ( $b3_valid ? 3 : 2 ) : 1 );
			return $count;
		}

		return $count;
	}

	$at = $i;
	return $count;
}

/**
 * Fallback mechanism for safely validating UTF-8 bytes.
 *
 * @since 6.9.0
 * @access private
 *
 * @see wp_is_valid_utf8()
 *
 * @param string $bytes String which might contain text encoded as UTF-8.
 * @return bool Whether the provided bytes can decode as valid UTF-8.
 */
function _wp_is_valid_utf8_fallback( string $bytes ): bool {
	$bytes_length = strlen( $bytes );
	if ( 0 === $bytes_length ) {
		return true;
	}

	$next_byte_at   = 0;
	$invalid_length = 0;

	_wp_scan_utf8( $bytes, $next_byte_at, $invalid_length );

	return $bytes_length === $next_byte_at && 0 === $invalid_length;
}

/**
 * Fallback mechanism for replacing invalid spans of UTF-8 bytes.
 *
 * Example:
 *
 *     'Pi๏ฟฝa' === _wp_scrub_utf8_fallback( "Pi\xF1a" ); // โ€œรฑโ€ is 0xF1 in Windows-1252.
 *
 * @since 6.9.0
 * @access private
 *
 * @see wp_scrub_utf8()
 *
 * @param string $bytes UTF-8 encoded string which might contain spans of invalid bytes.
 * @return string Input string with spans of invalid bytes swapped with the replacement character.
 */
function _wp_scrub_utf8_fallback( string $bytes ): string {
	$bytes_length   = strlen( $bytes );
	$next_byte_at   = 0;
	$was_at         = 0;
	$invalid_length = 0;
	$scrubbed       = '';

	while ( $next_byte_at <= $bytes_length ) {
		_wp_scan_utf8( $bytes, $next_byte_at, $invalid_length );

		if ( $next_byte_at >= $bytes_length ) {
			if ( 0 === $was_at ) {
				return $bytes;
			}

			return $scrubbed . substr( $bytes, $was_at, $next_byte_at - $was_at - $invalid_length );
		}

		$scrubbed .= substr( $bytes, $was_at, $next_byte_at - $was_at );
		$scrubbed .= "\u{FFFD}";

		$next_byte_at += $invalid_length;
		$was_at        = $next_byte_at;
	}

	return $scrubbed;
}

/**
 * Returns how many code points are found in the given UTF-8 string.
 *
 * Invalid spans of bytes count as a single code point according
 * to the maximal subpart rule. This function is a fallback method
 * for calling `mb_strlen( $text, 'UTF-8' )`.
 *
 * When negative values are provided for the byte offsets or length,
 * this will always report zero code points.
 *
 * Example:
 *
 *     4  === _wp_utf8_codepoint_count( 'text' );
 *
 *     // Groups are 'test', "\x90" as '๏ฟฝ', 'wp', "\xE2\x80" as '๏ฟฝ', "\xC0" as '๏ฟฝ', and 'test'.
 *     13 === _wp_utf8_codepoint_count( "test\x90wp\xE2\x80\xC0test" );
 *
 * @since 6.9.0
 * @access private
 *
 * @param string $text            Count code points in this string.
 * @param ?int   $byte_offset     Start counting after this many bytes in `$text`. Must be positive.
 * @param ?int   $max_byte_length Optional. Stop counting after having scanned past this many bytes.
 *                                Default is to scan until the end of the string. Must be positive.
 * @return int How many code points were found.
 */
function _wp_utf8_codepoint_count( string $text, ?int $byte_offset = 0, ?int $max_byte_length = PHP_INT_MAX ): int {
	if ( $byte_offset < 0 ) {
		return 0;
	}

	$count           = 0;
	$at              = $byte_offset;
	$end             = strlen( $text );
	$invalid_length  = 0;
	$max_byte_length = min( $end - $at, $max_byte_length );

	while ( $at < $end && ( $at - $byte_offset ) < $max_byte_length ) {
		$count += _wp_scan_utf8( $text, $at, $invalid_length, $max_byte_length - ( $at - $byte_offset ) );
		$count += $invalid_length > 0 ? 1 : 0;
		$at    += $invalid_length;
	}

	return $count;
}

/**
 * Given a starting offset within a string and a maximum number of code points,
 * return how many bytes are occupied by the span of characters.
 *
 * Invalid spans of bytes count as a single code point according to the maximal
 * subpart rule. This function is a fallback method for calling
 * `strlen( mb_substr( substr( $text, $at ), 0, $max_code_points ) )`.
 *
 * @since 6.9.0
 * @access private
 *
 * @param string $text              Count bytes of span in this text.
 * @param int    $byte_offset       Start counting at this byte offset.
 * @param int    $max_code_points   Stop counting after this many code points have been seen,
 *                                  or at the end of the string.
 * @param ?int   $found_code_points Optional. Will be set to number of found code points in
 *                                  span, as this might be smaller than the maximum count if
 *                                  the string is not long enough.
 * @return int Number of bytes spanned by the code points.
 */
function _wp_utf8_codepoint_span( string $text, int $byte_offset, int $max_code_points, ?int &$found_code_points = 0 ): int {
	$was_at            = $byte_offset;
	$invalid_length    = 0;
	$end               = strlen( $text );
	$found_code_points = 0;

	while ( $byte_offset < $end && $found_code_points < $max_code_points ) {
		$needed      = $max_code_points - $found_code_points;
		$chunk_count = _wp_scan_utf8( $text, $byte_offset, $invalid_length, null, $needed );

		$found_code_points += $chunk_count;

		// Invalid spans only convey one code point count regardless of how long they are.
		if ( 0 !== $invalid_length && $found_code_points < $max_code_points ) {
			++$found_code_points;
			$byte_offset += $invalid_length;
		}
	}

	return $byte_offset - $was_at;
}

/**
 * Fallback support for determining if a string contains Unicode noncharacters.
 *
 * @since 6.9.0
 * @access private
 *
 * @see \wp_has_noncharacters()
 *
 * @param string $text Are there noncharacters in this string?
 * @return bool Whether noncharacters were found in the string.
 */
function _wp_has_noncharacters_fallback( string $text ): bool {
	$at                = 0;
	$invalid_length    = 0;
	$has_noncharacters = false;
	$end               = strlen( $text );

	while ( $at < $end && ! $has_noncharacters ) {
		_wp_scan_utf8( $text, $at, $invalid_length, null, null, $has_noncharacters );
		$at += $invalid_length;
	}

	return $has_noncharacters;
}

/**
 * Converts a string from ISO-8859-1 to UTF-8, maintaining backwards compatibility
 * with the deprecated function from the PHP standard library.
 *
 * @since 6.9.0
 * @access private
 *
 * @see \utf8_encode()
 *
 * @param string $iso_8859_1_text Text treated as ISO-8859-1 (latin1) bytes.
 * @return string Text converted into UTF-8.
 */
function _wp_utf8_encode_fallback( $iso_8859_1_text ) {
	$iso_8859_1_text = (string) $iso_8859_1_text;
	$at              = 0;
	$was_at          = 0;
	$end             = strlen( $iso_8859_1_text );
	$utf8            = '';

	while ( $at < $end ) {
		// US-ASCII bytes are identical in ISO-8859-1 and UTF-8. These are 0x00โ€“0x7F.
		$ascii_byte_count = strspn(
			$iso_8859_1_text,
			"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f" .
			"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f" .
			" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f",
			$at
		);

		if ( $ascii_byte_count > 0 ) {
			$at += $ascii_byte_count;
			continue;
		}

		// All other bytes transform into two-byte UTF-8 sequences.
		$code_point = ord( $iso_8859_1_text[ $at ] );
		$byte1      = chr( 0xC0 | ( $code_point >> 6 ) );
		$byte2      = chr( 0x80 | ( $code_point & 0x3F ) );

		$utf8 .= substr( $iso_8859_1_text, $was_at, $at - $was_at );
		$utf8 .= "{$byte1}{$byte2}";

		++$at;
		$was_at = $at;
	}

	if ( 0 === $was_at ) {
		return $iso_8859_1_text;
	}

	$utf8 .= substr( $iso_8859_1_text, $was_at );
	return $utf8;
}

/**
 * Converts a string from UTF-8 to ISO-8859-1, maintaining backwards compatibility
 * with the deprecated function from the PHP standard library.
 *
 * @since 6.9.0
 * @access private
 *
 * @see \utf8_decode()
 *
 * @param string $utf8_text Text treated as UTF-8 bytes.
 * @return string Text converted into ISO-8859-1.
 */
function _wp_utf8_decode_fallback( $utf8_text ) {
	$utf8_text       = (string) $utf8_text;
	$at              = 0;
	$was_at          = 0;
	$end             = strlen( $utf8_text );
	$iso_8859_1_text = '';

	while ( $at < $end ) {
		// US-ASCII bytes are identical in ISO-8859-1 and UTF-8. These are 0x00โ€“0x7F.
		$ascii_byte_count = strspn(
			$utf8_text,
			"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f" .
			"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f" .
			" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f",
			$at
		);

		if ( $ascii_byte_count > 0 ) {
			$at += $ascii_byte_count;
			continue;
		}

		$next_at        = $at;
		$invalid_length = 0;
		$found          = _wp_scan_utf8( $utf8_text, $next_at, $invalid_length, null, 1 );
		$span_length    = $next_at - $at;
		$next_byte      = '?';

		if ( 1 !== $found ) {
			if ( $invalid_length > 0 ) {
				$next_byte = '';
				goto flush_sub_part;
			}

			break;
		}

		// All convertible code points are two-bytes long.
		$byte1 = ord( $utf8_text[ $at ] );
		if ( 0xC0 !== ( $byte1 & 0xE0 ) ) {
			goto flush_sub_part;
		}

		// All convertible code points are not greater than U+FF.
		$byte2      = ord( $utf8_text[ $at + 1 ] );
		$code_point = ( ( $byte1 & 0x1F ) << 6 ) | ( ( $byte2 & 0x3F ) );
		if ( $code_point > 0xFF ) {
			goto flush_sub_part;
		}

		$next_byte = chr( $code_point );

		flush_sub_part:
		$iso_8859_1_text .= substr( $utf8_text, $was_at, $at - $was_at );
		$iso_8859_1_text .= $next_byte;
		$at              += $span_length;
		$was_at           = $at;

		if ( $invalid_length > 0 ) {
			$iso_8859_1_text .= '?';
			$at              += $invalid_length;
			$was_at           = $at;
		}
	}

	if ( 0 === $was_at ) {
		return $utf8_text;
	}

	$iso_8859_1_text .= substr( $utf8_text, $was_at );
	return $iso_8859_1_text;
}