 part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Stopwatch;

/**
 * Represents a Period for an Event.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class StopwatchPeriod
{
    private int|float $start;
    private int|float $end;
    private int $memory;

    /**
     * @param int|float $start         The rel

o keep the original microsecond precision
     */
    public function __construct(int|float $start, int|float $end, bool $morePrecision = false)
    {
        $this->start = $morePrecision ? (float) $start : (int) $start;
        $this->end = $morePrecisio

ative time of the start of the period (in milliseconds)
     * @param int|float $end           The relative time of the end of the period (in milliseconds)
     * @param bool      $morePrecision If true, time is stored as float t


buted with this source code.
 */

namespace Symfony\Component\Stopwatch\Tests;

use PHPUnit\Framework\Attributes\Group;
use PHPUnit\Framework\TestCase;
use Symfony\Component\Stopwatch\StopwatchEvent;

/**
 * StopwatchEventTest.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
#[Group('time-sensitive')]
class StopwatchEventTest extends TestCase
{
    private const DELTA = 37;

    public function testGetOrigin()
    {
        $event = new StopwatchEvent(12);
        $this->assertEquals(12, $event->get

ime(true) * 1000, 'cat');
        $this->assertEquals('cat', $event->getCategory());
    }

    public function testGetPeriods()
    {
        $event = new StopwatchEvent(microtime(true) * 1000);
        $this->assertEquals([], $event->getPeriods());

Origin());
    }

    public function testGetCategory()
    {
        $event = new StopwatchEvent(microtime(true) * 1000);
        $this->assertEquals('default', $event->getCategory());

        $event = new StopwatchEvent(microt


 part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Stopwatch\Tests;

use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\TestCase;
use Symfony\Component\Stopwatch\StopwatchPeriod;

class StopwatchPeriodTest extends TestCase
{
    #[DataProvider('provideTimeValues')]
    public function testGetStartTime($

   public function testGetEndTime($end, $useMorePrecision, $expected)
    {
        $period = new StopwatchPeriod($end, $end, $useMorePrecision);
        $this->assertSame($expected, $period->getEndTime());
    }

    #[DataProvider('provideDurationValues'

start, $useMorePrecision, $expected)
    {
        $period = new StopwatchPeriod($start, $start, $useMorePrecision);
        $this->assertSame($expected, $period->getStartTime());
    }

    #[DataProvider('provideTimeValues')]


buted with this source code.
 */

namespace Symfony\Component\Stopwatch\Tests;

use PHPUnit\Framework\Attributes\Group;
use PHPUnit\Framework\TestCase;
use Symfony\Component\Stopwatch\Section;
use Symfony\Component\Stopwatch\Stopwatch;
use Symfony\Component\Stopwatch\StopwatchEvent;

/**
 * StopwatchTest.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
#[Group('time-sensitive')]
class StopwatchTest extends TestCase
{
    private const DELTA = 20;

    public function testStart()
    {
        $stopw

t, $stopwatch->getEvent('foo'));
    }

    public function testStartWithoutCategory()
    {
        $stopwatch = new Stopwatch();
        $stopwatchEvent = $stopwatch->start('bar');
        $this->assertSame('default', $stopwatchEvent->getCategory());

atch = new Stopwatch();
        $event = $stopwatch->start('foo', 'cat');

        $this->assertInstanceOf(StopwatchEvent::class, $event);
        $this->assertEquals('cat', $event->getCategory());
        $this->assertSame($even


 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HtmlSanitizer;

use Symfony\Component\HtmlSanitizer\Parser\NativeParser;
use Symfony\Component\HtmlSanitizer\Parser\ParserInterface;
use Symfony\Component\HtmlSanitizer\Reference\W3CReference;
use Symfony\Component\HtmlSanitizer\TextSanitizer\StringSanitizer;
use Symfony\Component\HtmlSanitizer\Visitor\DomVisitor;

/**
 * @author Titouan Galopin

blic function __construct(
        private HtmlSanitizerConfig $config,
        ?ParserInterface $parser = null,
    ) {
        $this->parser = $parser ?? new NativeParser();
    }

    public function sanitize(string $input): string
    {
        return

<galopintitouan@gmail.com>
 */
final class HtmlSanitizer implements HtmlSanitizerInterface
{
    private ParserInterface $parser;

    /**
     * @var array<string, DomVisitor>
     */
    private array $domVisitors = [];

    pu


ge.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\AssetMapper\Command;

use Symfony\Component\AssetMapper\ImportMap\RemotePackageDownloader;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Helper\ProgressBar;
use Symfony\Component\Console\Input\InputInterface;
use Sy

Scheiber <contact@jmsche.fr>
 */
#[AsCommand(name: 'importmap:install', description: 'Download all assets that should be downloaded')]
final class ImportMapInstallCommand extends Command
{
    public function __construct(
        private readonly RemotePac

mfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;
use Symfony\Contracts\HttpClient\ResponseInterface;

/**
 * Downloads all assets that should be downloaded.
 *
 * @author Jonathan


ge.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\AssetMapper\Command;

use Symfony\Component\AssetMapper\ImportMap\ImportMapManager;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\

inal class ImportMapRemoveCommand extends Command
{
    public function __construct(
        protected readonly ImportMapManager $importMapManager,
    ) {
        parent::__construct();
    }

    protected function configure(): void
    {
        $this

Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;

/**
 * @author Kévin Dunglas <kevin@dunglas.dev>
 */
#[AsCommand(name: 'importmap:remove', description: 'Remove JavaScript packages')]
f


buted with this source code.
 */

namespace Symfony\Component\AssetMapper\Command;

use Symfony\Component\AssetMapper\ImportMap\ImportMapEntries;
use Symfony\Component\AssetMapper\ImportMap\ImportMapEntry;
use Symfony\Component\AssetMapper\ImportMap\ImportMapManager;
use Symfony\Component\AssetMapper\ImportMap\ImportMapVersionChecker;
use Symfony\Component\AssetMapper\ImportMap\PackageRequireOptions;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfon

le\SymfonyStyle;
use Symfony\Component\Filesystem\Path;

/**
 * @author Kévin Dunglas <kevin@dunglas.dev>
 */
#[AsCommand(name: 'importmap:require', description: 'Require JavaScript packages')]
final class ImportMapRequireCommand extends Command
{
    use

y\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Sty


 This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\AssetMapper\Command;

use Symfony\Component\AssetMapper\ImportMap\ImportMapVersionChecker;
use Symfony\Component\Console\Output\OutputInterface;

/**
 * @internal
 */
trait VersionProblemCommandTrait
{
    private function renderVersionProblems(ImportMapVers

n) {
                $output->writeln(\sprintf('[warning] <info>%s</info> requires <info>%s</info> but it is not in the importmap.php. You may need to run "php bin/console importmap:require %s".', $problem->packageName, $problem->dependencyPackageName, $pr

ionChecker $importMapVersionChecker, OutputInterface $output): void
    {
        $problems = $importMapVersionChecker->checkVersions();
        foreach ($problems as $problem) {
            if (null === $problem->installedVersio


buted with this source code.
 */

namespace Symfony\Component\AssetMapper\Tests;

use PHPUnit\Framework\TestCase;
use Symfony\Component\AssetMapper\AssetMapperRepository;
use Symfony\Component\Finder\Glob;

class AssetMapperRepositoryTest extends TestCase
{
    public function testFindWithAbsolutePaths()
    {
        $repository = new AssetMapperRepository([
            __DIR__.'/Fixtures/dir1' => '',
            __DIR__.'/Fixtures/dir2' => '',
        ], __DIR__);

        $this->assertSame(realpath(__DIR

bdir/file5.js'), $repository->find('subdir/file5.js'));
        $this->assertNull($repository->find('file5.css'));
    }

    public function testFindWithRelativePaths()
    {
        $repository = new AssetMapperRepository([
            'dir1' => '',

__.'/Fixtures/dir1/file1.css'), $repository->find('file1.css'));
        $this->assertSame(realpath(__DIR__.'/Fixtures/dir2/file4.js'), $repository->find('file4.js'));
        $this->assertSame(realpath(__DIR__.'/Fixtures/dir2/su


ge.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\AssetMapper\Tests;

use PHPUnit\Framework\TestCase;
use Symfony\Component\AssetMapper\CompiledAssetMapperConfigReader;
use Symfony\Component\Filesystem\Filesystem;

class CompiledAssetMapperConfigReaderTest extends TestCase
{
    private Filesystem $filesystem;
    private string $writableRoot;

piled_asset_mapper_config_reader')) {
            $this->filesystem->mkdir($this->writableRoot);
        }
        // realpath to help path comparisons in the tests
        $this->writableRoot = realpath($this->writableRoot);
    }

    protected function

    protected function setUp(): void
    {
        $this->filesystem = new Filesystem();
        $this->writableRoot = __DIR__.'/../Fixtures/compiled_asset_mapper_config_reader';
        if (!file_exists(__DIR__.'/../Fixtures/com


 This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\AssetMapper\Tests;

use PHPUnit\Framework\TestCase;
use Symfony\Component\Asset\Packages;
use Symfony\Component\AssetMapper\Tests\Fixtures\AssetMapperTestAppKernel;
use Symfony\Component\Filesystem\Filesystem;

class MapperAwareAssetPackageIntegrationTest ex

estAppKernel('test', true);
        $this->kernel->boot();
    }

    protected function tearDown(): void
    {
        $this->filesystem->remove($this->kernel->getProjectDir().'/var');
    }

    public function testDefaultAssetPackageIsDecorated()
    {

tends TestCase
{
    private AssetMapperTestAppKernel $kernel;
    private Filesystem $filesystem;

    protected function setUp(): void
    {
        $this->filesystem = new Filesystem();
        $this->kernel = new AssetMapperT


 part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\AssetMapper\Tests\Fixtures;

use Psr\Log\NullLogger;
use Symfony\Bundle\FrameworkBundle\FrameworkBundle;
use Symfony\Component\Config\Loader\LoaderInterface;
use Symfony\Component\DependencyInjection\Alias;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use

 getProjectDir(): string
    {
        return __DIR__;
    }

    public function registerContainerConfiguration(LoaderInterface $loader): void
    {
        $loader->load(static function (ContainerBuilder $container) {
            $container->loadFromExte

Symfony\Component\HttpKernel\Kernel;

class AssetMapperTestAppKernel extends Kernel
{
    public function registerBundles(): iterable
    {
        return [
            new FrameworkBundle(),
        ];
    }

    public function


php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

return [
    '@hotwired/stimulus' => [
        'version' => '3.2.1',
    ],
    'lodash' => [
        'version' => '4.17.21',
    ],
    'app' => [
        'path' => 'app.js',
    ],
    'other_app' => [
        // "namespaced_assets2" is defined as a namespaced path in the t

ath' => 'namespaced_assets2/app2.js',
    ],
    'app.css' => [
        'path' => 'namespaced_assets2/styles/app.css',
        'type' => 'css',
    ],
    'app2.css' => [
        'path' => 'namespaced_assets2/styles/app2.css',
        'type' => 'css',


 part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\AssetMapper\Tests\Compressor;

use PHPUnit\Framework\TestCase;
use Symfony\Component\AssetMapper\Compressor\BrotliCompressor;
use Symfony\Component\AssetMapper\Compressor\ChainCompressor;
use Symfony\Component\AssetMapper\Compressor\GzipCompressor;
use Symfony\Component\

.'/../Fixtures/chain_compressor_filesystem';

    private Filesystem $filesystem;

    protected function setUp(): void
    {
        $this->filesystem = new Filesystem();
        if (!file_exists(self::WRITABLE_ROOT)) {
            $this->filesystem->mkdi

AssetMapper\Compressor\ZstandardCompressor;
use Symfony\Component\Filesystem\Filesystem;

/**
 * @author Kévin Dunglas <kevin@dunglas.dev>
 */
class ChainCompressorTest extends TestCase
{
    private const WRITABLE_ROOT = __DIR__


 This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\AssetMapper\Tests\Compressor;

use PHPUnit\Framework\TestCase;
use Symfony\Component\AssetMapper\Compressor\ZstandardCompressor;
use Symfony\Component\Filesystem\Filesystem;

/**
 * @author Kévin Dunglas <kevin@dunglas.dev>
 */
class ZstandardCompressorTest

(new ZstandardCompressor())->getUnsupportedReason()) {
            $this->markTestSkipped($reason);
        }

        $this->filesystem = new Filesystem();
        if (!file_exists(self::WRITABLE_ROOT)) {
            $this->filesystem->mkdir(self::WRITABL

extends TestCase
{
    private const WRITABLE_ROOT = __DIR__.'/../Fixtures/zstandard_compressor_filesystem';

    private ?Filesystem $filesystem = null;

    protected function setUp(): void
    {
        if (null !== $reason =


 This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\AssetMapper\Tests\Path;

use PHPUnit\Framework\TestCase;
use Symfony\Component\AssetMapper\Path\PublicAssetsPathResolver;

class PublicAssetsPathResolverTest extends TestCase
{
    public function testResolvePublicPath()
    {
        $resolver = new PublicA

ar'));
        $this->assertSame('/assets-prefix/foo/bar', $resolver->resolvePublicPath('foo/bar'));

        $resolver = new PublicAssetsPathResolver(
            'assets-prefix', // The leading and trailing slash should be added automatically
        );

ssetsPathResolver(
            '/assets-prefix/',
        );
        $this->assertSame('/assets-prefix/', $resolver->resolvePublicPath(''));
        $this->assertSame('/assets-prefix/foo/bar', $resolver->resolvePublicPath('/foo/b


ule_in_importmap_local_asset', ImportMapType::JS, 'module_in_importmap_local_asset.js', false),
                    'module_in_importmap_remote' => ImportMapEntry::createRemote('module_in_importmap_remote', ImportMapType::JS, './vendor/module_in_importmap_remote.js', '1.2.3', 'could_be_anything', false),
                    '@popperjs/core' => ImportMapEntry::createRemote('@popperjs/core', ImportMapType::JS, '/project/assets/vendor/@popperjs/core.js', '1.2.3', 'could_be_anything', false),

th) {
                    './vendor/module_in_importmap_remote.js' => '/project/assets/vendor/module_in_importmap_remote.js',
                    '/project/assets/vendor/@popperjs/core.js' => '/project/assets/vendor/@popperjs/core.js',

  default => null,
                };
            });
        $importMapConfigReader
            ->method('convertPathToFilesystemPath')
            ->willReturnCallback(static function ($path) {
                return match ($pa


buted with this source code.
 */

namespace Symfony\Component\AssetMapper\Tests\Compiler\Parser;

use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\TestCase;
use Symfony\Component\AssetMapper\Compiler\Parser\JavascriptSequenceParser;

class JavascriptSequenceParserTest extends TestCase
{
    public function testParseEmptyContent()
    {
        $parser = new JavascriptSequenceParser('');

        $this->assertTrue($parser->isExecutable());
    }

    public function testItThrowsWhenOutOfB

parseUntil(1);
    }

    public function testItThrowWhenBackward()
    {
        $parser = new JavascriptSequenceParser('  ');

        $parser->parseUntil(2);

        $this->expectException(\RuntimeException::class);
        $this->expectExceptionMessag

ounds()
    {
        $parser = new JavascriptSequenceParser('');

        $this->expectException(\RuntimeException::class);
        $this->expectExceptionMessage('Cannot parse beyond the end of the content.');

        $parser->


buted with this source code.
 */

namespace Symfony\Component\AssetMapper\Tests\Factory;

use PHPUnit\Framework\TestCase;
use Symfony\Component\AssetMapper\Factory\CachedMappedAssetFactory;
use Symfony\Component\AssetMapper\Factory\MappedAssetFactoryInterface;
use Symfony\Component\AssetMapper\ImportMap\JavaScriptImport;
use Symfony\Component\AssetMapper\MappedAsset;
use Symfony\Component\Config\ConfigCache;
use Symfony\Component\Config\Resource\DirectoryResource;
use Symfony\Component\Config\Resource\FileE

heDir = __DIR__.'/../Fixtures/var/cache_for_mapped_asset_factory_test';

    protected function setUp(): void
    {
        $this->filesystem = new Filesystem();
        $this->filesystem->mkdir($this->cacheDir);
    }

    protected function tearDown(): v

xistenceResource;
use Symfony\Component\Config\Resource\FileResource;
use Symfony\Component\Filesystem\Filesystem;

class CachedMappedAssetFactoryTest extends TestCase
{
    private Filesystem $filesystem;
    private string $cac


buted with this source code.
 */

namespace Symfony\Component\AssetMapper\Command;

use Symfony\Component\AssetMapper\AssetMapperInterface;
use Symfony\Component\AssetMapper\AssetMapperRepository;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony

 class DebugAssetMapperCommand extends Command
{
    private bool $didShortenPaths = false;

    public function __construct(
        private readonly AssetMapperInterface $assetMapper,
        private readonly AssetMapperRepository $assetMapperRepository,

\Component\Console\Style\SymfonyStyle;

/**
 * Outputs all the assets in the asset mapper.
 *
 * @author Ryan Weaver <ryan@symfonycasts.com>
 */
#[AsCommand(name: 'debug:asset-map', description: 'Output all mapped assets')]
final


 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\AssetMapper\Command;

use Symfony\Component\AssetMapper\ImportMap\ImportMapUpdateChecker;
use Symfony\Component\AssetMapper\ImportMap\PackageUpdateInfo;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Completion\CompletionInput;
use Symfony\Component\Console\Completio

;
use Symfony\Component\Console\Style\SymfonyStyle;

#[AsCommand(name: 'importmap:outdated', description: 'List outdated JavaScript packages and their latest versions')]
final class ImportMapOutdatedCommand extends Command
{
    private const COLOR_MAPPING

n\CompletionSuggestions;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface


ge.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\AssetMapper\Tests;

use PHPUnit\Framework\TestCase;
use Symfony\Component\AssetMapper\AssetMapperCompiler;
use Symfony\Component\AssetMapper\AssetMapperInterface;
use Symfony\Component\AssetMapper\Compiler\AssetCompilerInterface;
use Symfony\Component\AssetMapper\MappedAsset;

class AssetMapperCo

 return 'css' === $asset->publicExtension;
            }

            public function compile(string $content, MappedAsset $asset, AssetMapperInterface $assetMapper): string
            {
                return 'should_not_be_called';
            }

mpilerTest extends TestCase
{
    public function testCompile()
    {
        $compiler1 = new class implements AssetCompilerInterface {
            public function supports(MappedAsset $asset): bool
            {


ge.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\AssetMapper\Tests;

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
use Symfony\Component\AssetMapper\Tests\Fixtures\AssetMapperTestAppKernel;
use Symfony\Component\HttpFoundation\BinaryFileResponse;

class AssetMapperDevServerSubscriberFunctionalTest extends WebTestCase
{
    public functio

tusCode());
        $this->assertInstanceOf(BinaryFileResponse::class, $response);
        $this->assertSame(<<<EOF
            /* file1.css */
            body {}

            EOF,
            $response->getFile()->getContent()
        );
        $this->a

n testGettingAssetWorks()
    {
        $client = static::createClient();

        $client->request('GET', '/assets/file1-s0Rct6h.css');
        $response = $client->getResponse();
        $this->assertSame(200, $response->getSta


 part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\AssetMapper\Tests;

use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\TestCase;
use Symfony\Component\AssetMapper\ImportMap\JavaScriptImport;
use Symfony\Component\AssetMapper\MappedAsset;

class MappedAssetTest extends TestCase
{
    public function t

ame, string $expectedExtension)
    {
        $asset = new MappedAsset('anything', publicPathWithoutDigest: $filename);

        $this->assertSame($expectedExtension, $asset->publicExtension);
    }

    public static function getExtensionTests(): iterable

estGetLogicalPath()
    {
        $asset = new MappedAsset('foo.css');

        $this->assertSame('foo.css', $asset->logicalPath);
    }

    #[DataProvider('getExtensionTests')]
    public function testGetExtension(string $filen


 This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\AssetMapper\Tests\Compressor;

use PHPUnit\Framework\TestCase;
use Symfony\Component\AssetMapper\Compressor\BrotliCompressor;
use Symfony\Component\Filesystem\Filesystem;

/**
 * @author Kévin Dunglas <kevin@dunglas.dev>
 */
class BrotliCompressorTest extend

liCompressor())->getUnsupportedReason()) {
            $this->markTestSkipped($reason);
        }

        $this->filesystem = new Filesystem();
        if (!file_exists(self::WRITABLE_ROOT)) {
            $this->filesystem->mkdir(self::WRITABLE_ROOT);

s TestCase
{
    private const WRITABLE_ROOT = __DIR__.'/../Fixtures/brotli_compressor_filesystem';

    private ?Filesystem $filesystem = null;

    protected function setUp(): void
    {
        if (null !== $reason = (new Brot


ge.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\AssetMapper\Tests\Path;

use PHPUnit\Framework\TestCase;
use Symfony\Component\AssetMapper\Compressor\GzipCompressor;
use Symfony\Component\AssetMapper\Path\LocalPublicAssetsFilesystem;
use Symfony\Component\Filesystem\Filesystem;

class LocalPublicAssetsFilesystemTest extends TestCase
{
    priv

ile_exists(__DIR__.'/../Fixtures/local_public_assets_filesystem')) {
            $this->filesystem->mkdir(self::$writableRoot);
        }
    }

    protected function tearDown(): void
    {
        $this->filesystem->remove(self::$writableRoot);
    }

ate Filesystem $filesystem;
    private static string $writableRoot = __DIR__.'/../Fixtures/local_public_assets_filesystem';

    protected function setUp(): void
    {
        $this->filesystem = new Filesystem();
        if (!f


\Component\AssetMapper\AssetMapperInterface;
use Symfony\Component\AssetMapper\Compiler\AssetCompilerInterface;
use Symfony\Component\AssetMapper\Compiler\CssAssetUrlCompiler;
use Symfony\Component\AssetMapper\MappedAsset;

class CssAssetUrlCompilerTest extends TestCase
{
    #[DataProvider('provideCompileTests')]
    public function testCompile(string $input, string $expectedOutput, array $expectedDependencies)
    {
        $assetMapper = $this->createStub(AssetMapperInterface::class);
        $assetMappe

o.png',
                        publicPathWithoutDigest: '/assets/images/foo.png',
                        publicPath: '/assets/images/foo.123456.png',
                    ),
                    '/project/assets/more-styles.css' => new MappedAsset('more-st

r
            ->method('getAssetFromSourcePath')
            ->willReturnCallback(static function ($path) {
                return match ($path) {
                    '/project/assets/images/foo.png' => new MappedAsset('images/fo


buted with this source code.
 */

namespace Symfony\Component\AssetMapper\Command;

use Symfony\Component\AssetMapper\ImportMap\ImportMapAuditor;
use Symfony\Component\AssetMapper\ImportMap\ImportMapPackageAuditVulnerability;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Completion\CompletionInput;
use Symfony\Component\Console\Completion\CompletionSuggestions;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Co

ories for dependencies')]
class ImportMapAuditCommand extends Command
{
    private const SEVERITY_COLORS = [
        'critical' => 'red',
        'high' => 'red',
        'medium' => 'yellow',
        'low' => 'default',
        'unknown' => 'default',

mponent\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;

#[AsCommand(name: 'importmap:audit', description: 'Check for security vulnerability advis


ge.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\AssetMapper\Command;

use Symfony\Component\AssetMapper\ImportMap\ImportMapEntry;
use Symfony\Component\AssetMapper\ImportMap\ImportMapManager;
use Symfony\Component\AssetMapper\ImportMap\ImportMapVersionChecker;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Com

@author Kévin Dunglas <kevin@dunglas.dev>
 */
#[AsCommand(name: 'importmap:update', description: 'Update JavaScript packages to their latest versions')]
final class ImportMapUpdateCommand extends Command
{
    use VersionProblemCommandTrait;

    public fu

mand\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;

/**
 *


ge.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\AssetMapper\Tests;

use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\TestCase;
use Symfony\Component\Asset\PackageInterface;
use Symfony\Component\AssetMapper\AssetMapperInterface;
use Symfony\Component\AssetMapper\MapperAwareAssetPackage;

class MapperAwareAssetPackageTest ex

    ->willReturn('2.0');

        $assetMapperPackage = new MapperAwareAssetPackage($inner, $this->createStub(AssetMapperInterface::class));

        $this->assertSame('2.0', $assetMapperPackage->getVersion('foo'));
    }

    #[DataProvider('getUrlTests')

tends TestCase
{
    public function testGetVersion()
    {
        $inner = $this->createMock(PackageInterface::class);
        $inner->expects($this->once())
            ->method('getVersion')
            ->with('foo')


ge.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\AssetMapper\Tests\Compressor;

use PHPUnit\Framework\TestCase;
use Psr\Log\LoggerInterface;
use Symfony\Component\AssetMapper\Compressor\GzipCompressor;
use Symfony\Component\AssetMapper\Compressor\ZopfliCompressor;
use Symfony\Component\Filesystem\Filesystem;

/**
 * @author Kévin Dunglas <kevin

       $this->filesystem = new Filesystem();
        if (!file_exists(self::WRITABLE_ROOT)) {
            $this->filesystem->mkdir(self::WRITABLE_ROOT);
        }
    }

    protected function tearDown(): void
    {
        $this->filesystem->remove(self::

@dunglas.dev>
 */
class GzipCompressorTest extends TestCase
{
    private const WRITABLE_ROOT = __DIR__.'/../Fixtures/gzip_compressor_filesystem';

    private Filesystem $filesystem;

    protected function setUp(): void
    {


buted with this source code.
 */

namespace Symfony\Component\AssetMapper\Tests\Factory;

use PHPUnit\Framework\TestCase;
use Symfony\Component\AssetMapper\AssetMapperCompiler;
use Symfony\Component\AssetMapper\AssetMapperInterface;
use Symfony\Component\AssetMapper\Compiler\AssetCompilerInterface;
use Symfony\Component\AssetMapper\Compiler\CssAssetUrlCompiler;
use Symfony\Component\AssetMapper\Compiler\JavaScriptImportPathCompiler;
use Symfony\Component\AssetMapper\Exception\CircularAssetsException;
use Sy

lverInterface;

class MappedAssetFactoryTest extends TestCase
{
    private const FIXTURES_DIR = __DIR__.'/../Fixtures';
    private const VENDOR_FIXTURES_DIR = self::FIXTURES_DIR.'/assets/vendor';

    private AssetMapperInterface $assetMapper;

    publi

mfony\Component\AssetMapper\Factory\MappedAssetFactory;
use Symfony\Component\AssetMapper\ImportMap\ImportMapConfigReader;
use Symfony\Component\AssetMapper\MappedAsset;
use Symfony\Component\AssetMapper\Path\PublicAssetsPathReso


 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\AssetMapper\Tests;

use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
use Symfony\Component\AssetMapper\AssetMapper;
use Symfony\Component\AssetMapper\AssetMapperRepository;
use Symfony\Component\AssetMapper\CompiledAssetMapperConfigReader;
use Symfony\Component\AssetMapper\Factory\MappedAssetFactoryInterface;
use Symfo

eAssetMapper();

        $file1Asset = new MappedAsset('file1.css');
        $this->mappedAssetFactory->expects($this->once())
            ->method('createMappedAsset')
            ->with('file1.css', realpath(__DIR__.'/Fixtures/dir1/file1.css'))

ny\Component\AssetMapper\MappedAsset;

class AssetMapperTest extends TestCase
{
    private MappedAssetFactoryInterface&MockObject $mappedAssetFactory;

    public function testGetAsset()
    {
        $assetMapper = $this->creat


buted with this source code.
 */

namespace Symfony\Component\AssetMapper\Tests\Compiler;

use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\TestCase;
use Symfony\Component\AssetMapper\AssetMapperInterface;
use Symfony\Component\AssetMapper\Compiler\SourceMappingUrlsCompiler;
use Symfony\Component\AssetMapper\MappedAsset;

class SourceMappingUrlsCompilerTest extends TestCase
{
    #[DataProvider('provideCompileTests')]
    public function testCompile(string $sourceLogicalName, string $inp

static function ($path) {
                return match ($path) {
                    '/project/assets/foo.js.map' => new MappedAsset('foo.js.map',
                        publicPathWithoutDigest: '/assets/foo.js.map',
                        publicPath: '/

ut, string $expectedOutput, $expectedDependencies)
    {
        $assetMapper = $this->createStub(AssetMapperInterface::class);
        $assetMapper
            ->method('getAssetFromSourcePath')
            ->willReturnCallback(


 This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\AssetMapper\Tests\Fixtures;

use Psr\Log\NullLogger;
use Symfony\Bundle\FrameworkBundle\FrameworkBundle;
use Symfony\Component\Config\Loader\LoaderInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\HttpKernel\Kernel;

 return __DIR__;
    }

    public function registerContainerConfiguration(LoaderInterface $loader): void
    {
        $loader->load(static function (ContainerBuilder $container) {
            $container->loadFromExtension('framework', [
                '

class ImportMapTestAppKernel extends Kernel
{
    public function registerBundles(): iterable
    {
        return [
            new FrameworkBundle(),
        ];
    }

    public function getProjectDir(): string
    {


 part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Intl;

use Symfony\Component\Intl\Exception\MissingResourceException;

/**
 * Gives access to script-related ICU data.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 * @author Roland Franssen <franssen.roland@gmail.com>
 */
final class Scripts extends ResourceBun

    try {
            self::readEntry(['Names', $script]);

            return true;
        } catch (MissingResourceException) {
            return false;
        }
    }

    /**
     * @throws MissingResourceException if the script code does not exist

dle
{
    /**
     * @return string[]
     */
    public static function getScriptCodes(): array
    {
        return self::readEntry(['Scripts'], 'meta');
    }

    public static function exists(string $script): bool
    {


ge.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Intl\Util;

/**
 * @internal
 */
class GzipStreamWrapper
{
    /** @var resource|null */
    public $context;

    /** @var resource */
    private $handle;
    private string $path;

    public static function require(string $path): array
    {
        if (!\extension_loaded('zlib')) {

ache_is_script_cached') || !@opcache_is_script_cached($path)) {
            stream_wrapper_unregister('file');
            stream_wrapper_register('file', self::class);
        }

        return require $path;
    }

    public function stream_open(string

   throw new \LogicException(\sprintf('The "zlib" extension is required to load the "%s/%s" map, please enable it in your php.ini file.', basename(\dirname($path)), basename($path)));
        }

        if (!\function_exists('opc


ibuteSanitizerInterface;

/**
 * @author Titouan Galopin <galopintitouan@gmail.com>
 */
class HtmlSanitizerConfig
{
    private HtmlSanitizerAction $defaultAction = HtmlSanitizerAction::Drop;

    /**
     * Elements that should be removed.
     *
     * @var array<string, true>
     */
    private array $droppedElements = [];

    /**
     * Elements that should be removed but their children should be retained.
     *
     * @var array<string, true>
     */
    private array $blockedElements = [];

    /**

d to certain elements.
     *
     * @var array<string, array<string, string>>
     */
    private array $forcedAttributes = [];

    /**
     * Links schemes that should be retained, other being dropped.
     *
     * @var list<string>
     */
    private

     * Elements that should be retained, with their allowed attributes.
     *
     * @var array<string, array<string, true>>
     */
    private array $allowedElements = [];

    /**
     * Attributes that should always be adde


php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HtmlSanitizer\Parser;

/**
 * Transforms an untrusted HTML input string into a DOM tree.
 *
 * @author Titouan Galopin <galopintitouan@gmail.com>
 */
interface ParserInterface
{
    /**
     * Parse a given string and returns a DOMNode tree.
     *

ethod must return null if the string cannot be parsed as HTML.
     *
     * @param string $context The name of the context element in which the HTML is parsed
     */
    public function parse(string $html, string $context = 'body'): \Dom\Node|\DOMNode|nu


fault-configuration
 *
 * @author Titouan Galopin <galopintitouan@gmail.com>
 *
 * @internal
 */
final class W3CReference
{
    /**
     * Sanitizer supported contexts.
     *
     * A parent element name can be passed as an argument to {@see HtmlSanitizer::sanitizeFor()}.
     * When doing so, depending on the given context, different elements will be allowed.
     */
    public const CONTEXT_HEAD = 'head';
    public const CONTEXT_BODY = 'body';
    public const CONTEXT_TEXT = 'text';

    // Which contex

* Elements allowed by the Sanitizer standard in <head> as keys, including whether
     * they are safe or not as values (safe meaning no global display/audio/video impact).
     */
    public const HEAD_ELEMENTS = [
        'head' => true,
        'link' =

t to apply depending on the passed parent element name
    public const CONTEXTS_MAP = [
        'head' => self::CONTEXT_HEAD,
        'textarea' => self::CONTEXT_TEXT,
        'title' => self::CONTEXT_TEXT,
    ];

    /**


lSanitizer($config))->sanitizeFor('head', '
Hello world
')
        );
    }

    public function testSanitizeForTextarea()
    {
        $config = (new HtmlSanitizerConfig())
            ->allowElement('div')
        ;

        $this->assertSame(
            '<div style="width: 100px">Hello</div> world',
            (new HtmlSanitizer($config))->sanitizeFor('textarea', '
Hello
 world')
        );
    }

    public function t

(new HtmlSanitizer($config))->sanitizeFor('title', '
Hello
 world')
        );
    }

    public function testSanitizeDeepNestedString()
    {
        $config = (new HtmlSanitizerConfig())
            ->allowElemen

estSanitizeForTitle()
    {
        $config = (new HtmlSanitizerConfig())
            ->allowElement('div')
        ;

        $this->assertSame(
            '
Hello
 world',


 This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HtmlSanitizer\Tests\Reference;

use PHPUnit\Framework\TestCase;
use Symfony\Component\HtmlSanitizer\Reference\W3CReference;

/**
 * Check that the W3CReference class is up to date with the standard resources.
 */
class W3CReferenceTest extends TestCase
{

ertSame(
            $this->getResourceData(__DIR__.'/../Fixtures/baseline-element-allow-list.json'),
            $referenceElements
        );
    }

    public function testAttributes()
    {
        $this->assertSame(
            $this->getResourceData(

 public function testElements()
    {
        $referenceElements = array_values(array_merge(array_keys(W3CReference::HEAD_ELEMENTS), array_keys(W3CReference::BODY_ELEMENTS)));
        sort($referenceElements);

        $this->ass


 part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HtmlSanitizer\Tests\TextSanitizer;

use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\TestCase;
use Symfony\Component\HtmlSanitizer\TextSanitizer\StringSanitizer;

class StringSanitizerTest extends TestCase
{
    public static function provideHtmlLower

es as $input => $expected) {
            yield $input => [$input, $expected];
        }
    }

    #[DataProvider('provideHtmlLower')]
    public function testHtmlLower(string $input, string $expected)
    {
        $this->assertSame($expected, StringSanit

()
    {
        $cases = [
            'exampleAttr' => 'exampleattr',
            'aTTrΔ' => 'attrΔ',
            'data-attr' => 'data-attr',
            'test with space' => 'test with space',
        ];

        foreach ($cas


 part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HtmlSanitizer\TextSanitizer;

/**
 * @internal
 */
final class StringSanitizer
{
    private const REPLACEMENTS = [
        // """ is shorter than """
        '"' => '"',

        // Fix several potential issues in how browsers interpret attribute value

in a non-UTF8 field
        '＜' => '＜',
        '＞' => '＞',
        '＋' => '＋',
        '＝' => '＝',
        '＠' => '＠',
        '｀' => '｀',
    ];

    /**
     * Applies a transformation to lowercase following W3C

s
        '+' => '+',
        '=' => '=',
        '@' => '@',
        '`' => '`',

        // Some DB engines will transform UTF8 full-width characters with
        // their classical version if the data is saved


ony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HtmlSanitizer\Visitor\Node;

/**
 * @author Titouan Galopin <galopintitouan@gmail.com>
 */
final class BlockedNode implements NodeInterface
{
    private array $children = [];

    public function __construct(
        private NodeInterface $parentNode,
    ) {
    }

    public function addChild(NodeInterface $node): void
    {
        $t

getParent(): ?NodeInterface
    {
        return $this->parentNode;
    }

    public function render(): string
    {
        $rendered = '';
        foreach ($this->children as $child) {
            $rendered .= $child->render();
        }

        return

his->children[] = $node;
    }

    public function


 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HtmlSanitizer\Visitor\Node;

use Symfony\Component\HtmlSanitizer\TextSanitizer\StringSanitizer;

/**
 * @author Titouan Galopin <galopintitouan@gmail.com>
 */
final class Node implements NodeInterface
{
    // HTML5 elements which are self-closing
    private const VOID_ELEMENTS = [
        'area' => true,
        'base' => true,
        'br' =>

  'source' => true,
        'track' => true,
        'wbr' => true,
    ];

    private array $attributes = [];
    private array $children = [];

    public function __construct(
        private NodeInterface $parent,
        private string $tagName,

true,
        'col' => true,
        'embed' => true,
        'hr' => true,
        'img' => true,
        'input' => true,
        'keygen' => true,
        'link' => true,
        'meta' => true,
        'param' => true,


ony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HtmlSanitizer\Visitor\Node;

use Symfony\Component\HtmlSanitizer\TextSanitizer\StringSanitizer;

/**
 * @author Titouan Galopin <galopintitouan@gmail.com>
 */
final class TextNode implements NodeInterface
{
    public function __construct(
        private NodeInterface $parentNode,
        private string $text,
    ) {
    }

    public f

      throw new \LogicException('Text nodes cannot have children.');
    }

    public function getParent(): ?NodeInterface
    {
        return $this->parentNode;
    }

    public function render(): string
    {
        return StringSanitizer::encodeHtml

unction addChild(NodeInterface $node): void
    {


/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HtmlSanitizer\Visitor\AttributeSanitizer;

use Symfony\Component\HtmlSanitizer\HtmlSanitizerConfig;

/**
 * Implements attribute-specific sanitization logic.
 *
 * @author Titouan Galopin <galopintitouan@gmail.com>
 */
interface AttributeSanitizerInter

ist of attributes names supported, or null to support all attributes.
     *
     * @return list<string>|null
     */
    public function getSupportedAttributes(): ?array;

    /**
     * Returns the sanitized value of a given attribute for the given eleme

face
{
    /**
     * Returns the list of element names supported, or null to support all elements.
     *
     * @return list<string>|null
     */
    public function getSupportedElements(): ?array;

    /**
     * Returns the l


 part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HtmlSanitizer\Visitor\AttributeSanitizer;

use Symfony\Component\HtmlSanitizer\HtmlSanitizerConfig;
use Symfony\Component\HtmlSanitizer\TextSanitizer\UrlSanitizer;

/**
 * @author Titouan Galopin <galopintitouan@gmail.com>
 */
final class UrlAttributeSanitizer implements

   return ['src', 'href', 'lowsrc', 'background', 'ping', 'action', 'formaction', 'poster', 'cite', 'data', 'codebase', 'archive', 'longdesc'];
    }

    public function sanitizeAttribute(string $element, string $attribute, string $value, HtmlSanitizerCon

 AttributeSanitizerInterface
{
    public function getSupportedElements(): ?array
    {
        // Check all elements for URL attributes
        return null;
    }

    public function getSupportedAttributes(): ?array
    {


 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Intl;

/**
 * Gives access to internationalization data.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
final class Intl
{
    /**
     * The number of resource bundles to buffer. Loading the same resource
     * bundle for n locales takes up n spots in the buffer.
     */
    public const BUFFER_SIZE = 10;

    /**
     * The director

f the script data.
     */
    public const SCRIPT_DIR = 'scripts';

    /**
     * The directory name of the locale data.
     */
    public const LOCALE_DIR = 'locales';

    /**
     * The directory name of the region data.
     */
    public const REGI

y name of the currency data.
     */
    public const CURRENCY_DIR = 'currencies';

    /**
     * The directory name of the language data.
     */
    public const LANGUAGE_DIR = 'languages';

    /**
     * The directory name o


 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Intl;

if (!class_exists(\Locale::class)) {
    throw new \LogicException(\sprintf('You cannot use the "%s\Locale" class as the "intl" extension is not installed. See https://php.net/intl.', __NAMESPACE__));
}

/**
 * Provides access to locale-related data.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @internal
 */
final class Loca

erwise.
     *
     * @see getFallback()
     */
    public static function setDefaultFallback(?string $locale): void
    {
        self::$defaultFallback = $locale;
    }

    /**
     * Returns the default fallback locale.
     *
     * @see setDefaultFa

le extends \Locale
{
    private static ?string $defaultFallback = 'en';

    /**
     * Sets the default fallback locale.
     *
     * The default fallback locale is used as fallback for locales that have no
     * fallback oth


ge.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Intl;

use Symfony\Component\Intl\Data\Bundle\Reader\BufferedBundleReader;
use Symfony\Component\Intl\Data\Bundle\Reader\BundleEntryReader;
use Symfony\Component\Intl\Data\Bundle\Reader\BundleEntryReaderInterface;
use Symfony\Component\Intl\Data\Bundle\Reader\PhpBundleReader;

/**
 * @author Rola

try from a resource bundle.
     *
     * @see BundleEntryReaderInterface::readEntry()
     *
     * @param string[]    $indices  The indices to read from the bundle
     * @param string|null $locale   The locale to read
     * @param bool        $fallback

nd Franssen <franssen.roland@gmail.com>
 *
 * @internal
 */
abstract class ResourceBundle
{
    private static BundleEntryReader $entryReader;

    abstract protected static function getPath(): string;

    /**
     * Reads an en


zer\Visitor\AttributeSanitizer\AttributeSanitizerInterface;

class HtmlSanitizerConfigTest extends TestCase
{
    public function testCreateEmpty()
    {
        $config = new HtmlSanitizerConfig();
        $this->assertSame([], $config->getAllowedElements());
        $this->assertSame([], $config->getBlockedElements());
        $this->assertSame(['http', 'https', 'mailto', 'tel'], $config->getAllowedLinkSchemes());
        $this->assertNull($config->getAllowedLinkHosts());
        $this->assertSame(['http'

      $config = new HtmlSanitizerConfig();
        $this->assertSame(['http', 'https', 'mailto', 'tel'], $config->getAllowedLinkSchemes());
        $this->assertNull($config->getAllowedLinkHosts());
        $this->assertSame(['http', 'https', 'data'], $con

, 'https', 'data'], $config->getAllowedMediaSchemes());
        $this->assertNull($config->getAllowedMediaHosts());
        $this->assertFalse($config->getForceHttpsUrls());
    }

    public function testSimpleOptions()
    {


' => [
            'AOK',
            'Angolijska kvanza (1977–1991)',
        ],
        'AON' => [
            'AON',
            'Angolijska nova kvanza (1990–2000)',
        ],
        'AOR' => [
            'AOR',
            'Angolijska kvanza reajustado (1995–1999)',
        ],
        'ARA' => [
            'ARA',
            'Argentinski austral',
        ],
        'ARP' => [
            'ARP',
            'Argentinski pezo (1983–1985)',
        ],
        'ARS' => [
            'ARS',

'AWG',
            'Arubanski florin',
        ],
        'AZM' => [
            'AZM',
            'Azerbejdžanski manat (1993–2006)',
        ],
        'AZN' => [
            'AZN',
            'Azerbejdžanski manat',
        ],
        'BAD' => [

 'Argentinski pezos',
        ],
        'ATS' => [
            'ATS',
            'Austrijski šiling',
        ],
        'AUD' => [
            'AUD',
            'Australijski dolar',
        ],
        'AWG' => [


N' => [
            'AON',
            'Анголијска нова кванза (1990–2000)',
        ],
        'AOR' => [
            'AOR',
            'Анголска кванза реађустадо (1995–1999)',
        ],
        'ARA' => [
            'ARA',
            'Аргентински аустрал',
        ],
        'ARP' => [
            'ARP',
            'аргентински пезо (1983–1985)',
        ],
        'ARS' => [
            'ARS',
            'Аргентински пезос',
        ],
        'ATS' => [
            'ATS',
            'Аустријски

    'Азербејџански манат (1993–2006)',
        ],
        'AZN' => [
            'AZN',
            'Азербејџански манат',
        ],
        'BAD' => [
            'BAD',
            'Босанско-Херцеговачки динар',
        ],
        'BAM' => [

шилинг',
        ],
        'AUD' => [
            'A$',
            'Аустралијски долар',
        ],
        'AWG' => [
            'AWG',
            'Арубански флорин',
        ],
        'AZM' => [
            'AZM',


',
            'kwanza angolès (1977–1991)',
        ],
        'AON' => [
            'AON',
            'nou kwanza angolès (1990–2000)',
        ],
        'AOR' => [
            'AOR',
            'kwanza angolès reajustat (1995–1999)',
        ],
        'ARA' => [
            'ARA',
            'austral argentí',
        ],
        'ARL' => [
            'ARL',
            'peso ley argentí (1970–1983)',
        ],
        'ARM' => [
            'ARM',
            'peso argentí (1981–1970)',
        ]

tríac',
        ],
        'AUD' => [
            'AU$',
            'dòlar australià',
        ],
        'AWG' => [
            'AWG',
            'florí d’Aruba',
        ],
        'AZM' => [
            'AZM',
            'manat azerbaidjanès (1993–20

,
        'ARP' => [
            'ARP',
            'peso argentí (1983–1985)',
        ],
        'ARS' => [
            'ARS',
            'peso argentí',
        ],
        'ATS' => [
            'ATS',
            'xíling aus


идерландин Антилин гульден',
        ],
        'AOA' => [
            'AOA',
            'Анголан кванза',
        ],
        'ARS' => [
            'ARS',
            'Аргентинан песо',
        ],
        'AUD' => [
            'A$',
            'Австралин доллар',
        ],
        'AWG' => [
            'AWG',
            'Арубан флорин',
        ],
        'AZN' => [
            'AZN',
            'Азербайджанан манат',
        ],
        'BAM' => [
            'BAM',
            'Боснин а, Герцеговин

GN',
            'Болгарин лев',
        ],
        'BHD' => [
            'BHD',
            'Бахрейнан динар',
        ],
        'BIF' => [
            'BIF',
            'Бурундин франк',
        ],
        'BMD' => [
            'BMD',
            'Бе

ан а хийцалун марка',
        ],
        'BBD' => [
            'BBD',
            'Барбадосан доллар',
        ],
        'BDT' => [
            'BDT',
            'Бангладешан така',
        ],
        'BGN' => [
            'B


        'angolská kwanza (1977–1991)',
        ],
        'AON' => [
            'AON',
            'angolská kwanza (1990–2000)',
        ],
        'AOR' => [
            'AOR',
            'angolská kwanza (1995–1999)',
        ],
        'ARA' => [
            'ARA',
            'argentinský austral',
        ],
        'ARL' => [
            'ARL',
            'argentinské peso ley (1970–1983)',
        ],
        'ARM' => [
            'ARM',
            'argentinské peso (1881–1970)',
        ],

 šilink',
        ],
        'AUD' => [
            'AU$',
            'australský dolar',
        ],
        'AWG' => [
            'AWG',
            'arubský zlatý',
        ],
        'AZM' => [
            'AZM',
            'ázerbájdžánský manat (199

    'ARP' => [
            'ARP',
            'argentinské peso (1983–1985)',
        ],
        'ARS' => [
            'ARS',
            'argentinské peso',
        ],
        'ATS' => [
            'ATS',
            'rakouský


         'AOK',
            'Ангола кванзи (1977–1991)',
        ],
        'AON' => [
            'AON',
            'Ангола ҫӗнӗ кванзи (1990–2000)',
        ],
        'AOR' => [
            'AOR',
            'Ангола реюстадо кванзӗ (1995–1999)',
        ],
        'ARA' => [
            'ARA',
            'Аргентина аустралӗ',
        ],
        'ARL' => [
            'ARL',
            'Аргентина песо-лейӗ (1970–1983)',
        ],
        'ARM' => [
            'ARM',
            'Аргентина песи (1881

           'Австри шиллингӗ',
        ],
        'AUD' => [
            'A$',
            'Австрали долларӗ',
        ],
        'AWG' => [
            'AWG',
            'Аруба флоринӗ',
        ],
        'AZM' => [
            'AZM',
            'Азерба


    ],
        'AOR' => [
            'AOR',
            'Kwanza Ailgymhwysedig Angola (1995–1999)',
        ],
        'ARA' => [
            'ARA',
            'Austral yr Ariannin',
        ],
        'ARL' => [
            'ARL',
            'Peso Ley yr Ariannin (1970–1983)',
        ],
        'ARM' => [
            'ARM',
            'Peso yr Ariannin (1881–1970)',
        ],
        'ARP' => [
            'ARP',
            'Peso yr Ariannin (1983–1985)',
        ],
        'ARS' => [
            'A

       'AWG',
            'Fflorin Aruba',
        ],
        'AZM' => [
            'AZM',
            'Manat Azerbaijan (1993–2006)',
        ],
        'AZN' => [
            'AZN',
            'Manat Azerbaijan',
        ],
        'BAM' => [

RS',
            'Peso yr Ariannin',
        ],
        'ATS' => [
            'ATS',
            'Swllt Awstria',
        ],
        'AUD' => [
            'A$',
            'Doler Awstralia',
        ],
        'AWG' => [


   'AON' => [
            'AON',
            'Angolansk nye kwanza (1990–2000)',
        ],
        'AOR' => [
            'AOR',
            'Angolansk kwanza (1995–1999)',
        ],
        'ARA' => [
            'ARA',
            'Argentinsk austral',
        ],
        'ARP' => [
            'ARP',
            'Argentinsk peso (1983–1985)',
        ],
        'ARS' => [
            'ARS',
            'argentinsk peso',
        ],
        'ATS' => [
            'ATS',
            'Østrigsk schilling',

jdsjansk manat (1993–2006)',
        ],
        'AZN' => [
            'AZN',
            'aserbajdsjansk manat',
        ],
        'BAD' => [
            'BAD',
            'Bosnien-Hercegovinsk dinar',
        ],
        'BAM' => [
            'BAM',

        ],
        'AUD' => [
            'AU$',
            'australsk dollar',
        ],
        'AWG' => [
            'AWG',
            'arubansk florin',
        ],
        'AZM' => [
            'AZM',
            'Aserba


K' => [
            'AOK',
            'Angolanischer Kwanza (1977–1990)',
        ],
        'AON' => [
            'AON',
            'Angolanischer Neuer Kwanza (1990–2000)',
        ],
        'AOR' => [
            'AOR',
            'Angolanischer Kwanza Reajustado (1995–1999)',
        ],
        'ARA' => [
            'ARA',
            'Argentinischer Austral',
        ],
        'ARL' => [
            'ARL',
            'Argentinischer Peso Ley (1970–1983)',
        ],
        'ARM' => [

 Peso',
        ],
        'ATS' => [
            'öS',
            'Österreichischer Schilling',
        ],
        'AUD' => [
            'AU$',
            'Australischer Dollar',
        ],
        'AWG' => [
            'AWG',
            'Aruba-Flori

   'ARM',
            'Argentinischer Peso (1881–1970)',
        ],
        'ARP' => [
            'ARP',
            'Argentinischer Peso (1983–1985)',
        ],
        'ARS' => [
            'ARS',
            'Argentinischer


ྱི་དངུལ་ ཨཕ་ག་ནི',
        ],
        'AUD' => [
            'AU$',
            'ཨཱོས་ཊྲེ་ལི་ཡ་གི་དངུལ་ ཌོ་ལར',
        ],
        'BDT' => [
            'BDT',
            'བྷང་ལ་དེཤ་གི་དངུལ་ ཏ་ཀ',
        ],
        'BMD' => [
            'BMD',
            'བར་མུ་ཌ་གི་དངུལ་ ཌོ་ལར',
        ],
        'BRL' => [
            'R$',
            'བྲ་ཛིལ་གྱི་དངུལ་ རེ་ཡལ',
        ],
        'BTN' => [
            'Nu.',
            'དངུལ་ཀྲམ',
        ],
        'CAD' => [
            'CA$',
            'ཀེ་ན་

   'CN¥',
            'རྒྱ་ནག་གི་དངུལ་ ཡུ་ཝཱན',
        ],
        'COP' => [
            'COP',
            'ཀོ་ལོམ་བྷི་ཡ་གི་དངུལ་ པེ་སོ',
        ],
        'CUP' => [
            'CUP',
            'ཀིའུ་བྷ་གི་དངུལ་ པེ་སོ',
        ],
        'DKK' => [

ཌ་གི་དངུལ་ ཌོ་ལར',
        ],
        'CHF' => [
            'CHF',
            'སུ་ཡིས་ཀྱི་དངུལ་ ཕྲངཀ',
        ],
        'CLP' => [
            'CLP',
            'ཅི་ལི་གི་དངུལ་ པེ་སོ',
        ],
        'CNY' => [


   'AOK' => [
            'AOK',
            'angolaga kwanza (1977–1991)',
        ],
        'AON' => [
            'AON',
            'angolaga kwanza (1990–2000)',
        ],
        'AOR' => [
            'AOR',
            'angolaga kwanza xoxotɔ (1995–1999)',
        ],
        'ARA' => [
            'ARA',
            'argentinaga austral',
        ],
        'ARL' => [
            'ARL',
            'argentinaga peso ley (1970–1983)',
        ],
        'ARM' => [
            'ARM',
            'ar

> [
            'ATS',
            'ɔstriaga schilling',
        ],
        'AUD' => [
            'AU$',
            'Australiaga dollar',
        ],
        'AWG' => [
            'AWG',
            'arubaga lorin',
        ],
        'AZM' => [

gentinaga peso (1881–1970)',
        ],
        'ARP' => [
            'ARP',
            'argentinaga peso (1983–1985)',
        ],
        'ARS' => [
            'ARS',
            'argentinaga peso',
        ],
        'ATS' =


N' => [
            'AON',
            'Νέα Κουάνζα Ανγκόλας (1990–2000)',
        ],
        'ARA' => [
            'ARA',
            'Ωστράλ Αργετινής',
        ],
        'ARP' => [
            'ARP',
            'Πέσο Αργεντινής (1983–1985)',
        ],
        'ARS' => [
            'ARS',
            'Πέσο Αργεντινής',
        ],
        'ATS' => [
            'ATS',
            'Σελίνι Αυστρίας',
        ],
        'AUD' => [
            'A$',
            'Δολάριο Αυστραλίας',
        ],
        'AW

ϊτζάν',
        ],
        'BAD' => [
            'BAD',
            'Δηνάριο Βοσνίας-Ερζεγοβίνης',
        ],
        'BAM' => [
            'BAM',
            'Μετατρέψιμο Μάρκο Βοσνίας-Ερζεγοβίνης',
        ],
        'BBD' => [
            'BBD',

G' => [
            'AWG',
            'Φλορίνι Αρούμπας',
        ],
        'AZM' => [
            'AZM',
            'Μανάτ Αζερμπαϊτζάν (1993–2006)',
        ],
        'AZN' => [
            'AZN',
            'Μανάτ Αζερμπα


    'AOK',
            'Angolan Kwanza (1977–1991)',
        ],
        'AON' => [
            'AON',
            'Angolan New Kwanza (1990–2000)',
        ],
        'AOR' => [
            'AOR',
            'Angolan Readjusted Kwanza (1995–1999)',
        ],
        'ARA' => [
            'ARA',
            'Argentine Austral',
        ],
        'ARL' => [
            'ARL',
            'Argentine Peso Ley (1970–1983)',
        ],
        'ARM' => [
            'ARM',
            'Argentine Peso (1881–19

        'Austrian Schilling',
        ],
        'AUD' => [
            'A$',
            'Australian Dollar',
        ],
        'AWG' => [
            'AWG',
            'Aruban Florin',
        ],
        'AZM' => [
            'AZM',
            'Azerb


            'Bermudian Dollar',
        ],
        'BYB' => [
            'BYB',
            'Belarusian New Rouble (1994–1999)',
        ],
        'BYN' => [
            'BYN',
            'Belarusian Rouble',
        ],
        'BYR' => [
            'BYR',
            'Belarusian Rouble (2000–2016)',
        ],
        'JPY' => [
            'JP¥',
            'Japanese Yen',
        ],
        'LVR' => [
            'LVR',
            'Latvian Rouble',
        ],
        'RUB' => [
            'RUB',

R' => [
            'RUR',
            'Russian Rouble (1991–1998)',
        ],
        'SHP' => [
            'SHP',
            'St Helena Pound',
        ],
        'TJR' => [
            'TJR',
            'Tajikistani Rouble',
        ],
        'USD'

            'Russian Rouble',
        ],
        'RU


            '$',
            'Australian Dollar',
        ],
        'BAM' => [
            'BAM',
            'Bosnia-Herzegovina Convertible Marka',
        ],
        'BBD' => [
            'BBD',
            'Barbados Dollar',
        ],
        'BMD' => [
            'BMD',
            'Bermuda Dollar',
        ],
        'BOB' => [
            'BOB',
            'Bolivian boliviano',
        ],
        'BRL' => [
            'BRL',
            'Brazilian Real',
        ],
        'CAD' => [

'GBP',
            'British Pound',
        ],
        'HKD' => [
            'HKD',
            'Hong Kong Dollar',
        ],
        'ILS' => [
            'ILS',
            'Israeli Shekel',
        ],
        'INR' => [
            'INR',

   'CAD',
            'Canadian Dollar',
        ],
        'CNY' => [
            'CNY',
            'Chinese Yuan',
        ],
        'EUR' => [
            'EUR',
            'Euro',
        ],
        'GBP' => [


 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Intl\Util;

use PHPUnit\Framework\TestCase;
use Symfony\Component\Intl\Intl;

/**
 * Helper class for preparing test cases that rely on the Intl component.
 *
 * Any test that tests functionality relying on either the intl classes or
 * the resource bundle data should call either of the methods
 * {@link requireIntl()} or {@link requireFullIntl()

r
{
    /**
     * Should be called before tests that work fine with the stub implementation.
     */
    public static function requireIntl(TestCase $testCase, ?string $minimumIcuVersion = null): void
    {
        $minimumIcuVersion ??= Intl::getIcuStubV

}. Calling
 * {@link requireFullIntl()} is only necessary if you use functionality in the
 * test that is not provided by the stub intl implementation.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class IntlTestHelpe


ge.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Intl\Util;

/**
 * Facilitates the comparison of version strings.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class Version
{
    /**
     * Compares two versions with an operator.
     *
     * This method is identical to {@link version_compare()}, except that you
     * can pass t

, '1.2.4', '==', 2)
     *     // => true
     *
     * @param int|null $precision The number of components to compare. Pass
     *                            NULL to compare the versions unchanged.
     *
     * @see normalize()
     */
    public static

he number of regarded version components in the last argument
     * $precision.
     *
     * Examples:
     *
     *     Version::compare('1.2.3', '1.2.4', '==')
     *     // => false
     *
     *     Version::compare('1.2.3'


ጊልደር',
        ],
        'AOA' => [
            'AOA',
            'የአንጎላ ኩዋንዛ',
        ],
        'ARS' => [
            'ARS',
            'የአርጀንቲና ፔሶ',
        ],
        'AUD' => [
            'AU$',
            'የአውስትራሊያ ዶላር',
        ],
        'AWG' => [
            'AWG',
            'አሩባን ፍሎሪን',
        ],
        'AZN' => [
            'AZN',
            'የአዛርባጃን ማናት',
        ],
        'BAM' => [
            'BAM',
            'የቦስኒያ ሄርዞጎቪና የሚመነዘር ማርክ',
        ],
        'BBD' => [

D',
            'የባኽሬን ዲናር',
        ],
        'BIF' => [
            'BIF',
            'የብሩንዲ ፍራንክ',
        ],
        'BMD' => [
            'BMD',
            'የቤርሙዳ ዶላር',
        ],
        'BND' => [
            'BND',
            'የብሩኔ ዶላር',

  'BBD',
            'የባርቤዶስ ዶላር',
        ],
        'BDT' => [
            'BDT',
            'የባንግላዲሽ ታካ',
        ],
        'BGN' => [
            'BGN',
            'የቡልጋሪያ ሌቭ',
        ],
        'BHD' => [
            'BH


1990-2000',
        ],
        'AOR' => [
            'AOR',
            'كوانزا أنجولي معدلة - 1995 - 1999',
        ],
        'ARA' => [
            'ARA',
            'استرال أرجنتيني',
        ],
        'ARP' => [
            'ARP',
            'بيزو أرجنتيني - 1983-1985',
        ],
        'ARS' => [
            'ARS',
            'بيزو أرجنتيني',
        ],
        'ATS' => [
            'ATS',
            'شلن نمساوي',
        ],
        'AUD' => [
            'AU$',
            'دولار أسترالي',

ان',
        ],
        'BAD' => [
            'BAD',
            'دينار البوسنة والهرسك',
        ],
        'BAM' => [
            'BAM',
            'مارك البوسنة والهرسك قابل للتحويل',
        ],
        'BBD' => [
            'BBD',
            'دولار

       ],
        'AWG' => [
            'AWG',
            'فلورن أروبي',
        ],
        'AZM' => [
            'AZM',
            'مانات أذريبجاني',
        ],
        'AZN' => [
            'AZN',
            'مانات أذربيج


       'AOK',
            'Ангола кванзаһы (1977–1991)',
        ],
        'AON' => [
            'AON',
            'Ангола яңы кванзаһы (1990–2000)',
        ],
        'AOR' => [
            'AOR',
            'Ангола көйләнгән кванзаһы (1995–1999)',
        ],
        'ARA' => [
            'ARA',
            'Аргентина аустралы',
        ],
        'ARL' => [
            'ARL',
            'Аргентина песоһы (1970–1983)',
        ],
        'ARM' => [
            'ARM',
            'Аргентина песоһы (1

ATS',
            'Австрия шиллингы',
        ],
        'AUD' => [
            'A$',
            'Австралия доллары',
        ],
        'AWG' => [
            'AWG',
            'Аруба флорины',
        ],
        'AZM' => [
            'AZM',


 [
            'AON',
            'Анголска нова кванца (1990–2000)',
        ],
        'AOR' => [
            'AOR',
            'Анголска нова кванца (1995–1999)',
        ],
        'ARA' => [
            'ARA',
            'Аржентински австрал',
        ],
        'ARP' => [
            'ARP',
            'Аржентинско песо (1983–1985)',
        ],
        'ARS' => [
            'ARS',
            'Аржентинско песо',
        ],
        'ATS' => [
            'ATS',
            'Австрийски шилинг',

нски манат (1993–2006)',
        ],
        'AZN' => [
            'AZN',
            'Азербайджански манат',
        ],
        'BAD' => [
            'BAD',
            'Босна и Херцеговина-динар',
        ],
        'BAM' => [
            'BAM',

   ],
        'AUD' => [
            'AUD',
            'Австралийски долар',
        ],
        'AWG' => [
            'AWG',
            'Арубски флорин',
        ],
        'AZM' => [
            'AZM',
            'Азербайджа


N' => [
            'AON',
            'এ্যাঙ্গোলান নতুন কওয়ানজা (১৯৯৫–২০০০)',
        ],
        'AOR' => [
            'AOR',
            'এ্যাঙ্গোলান কওয়ানজা (১৯৯৫–১৯৯৯)',
        ],
        'ARA' => [
            'ARA',
            'আর্জেন্টিনা অস্ট্রাল',
        ],
        'ARP' => [
            'ARP',
            'আর্জেন্টিনা পেসো (১৯৮৩–১৯৮৫)',
        ],
        'ARS' => [
            'ARS',
            'আর্জেন্টিনা পেসো',
        ],
        'ATS' => [
            'ATS',
            'অস্ট্রিয়ান শি

জারবাইজান মানাত (১৯৯৩–২০০৬)',
        ],
        'AZN' => [
            'AZN',
            'আজারবাইজান মানাত',
        ],
        'BAD' => [
            'BAD',
            'বসনিয়া এবং হার্জেগোভিনা দিনার',
        ],
        'BAM' => [
            'BAM',

লিং',
        ],
        'AUD' => [
            'A$',
            'অস্ট্রেলিয়ান ডলার',
        ],
        'AWG' => [
            'AWG',
            'আরুবা ফ্লোরিন',
        ],
        'AZM' => [
            'AZM',
            'আ


         'kwanza Angola (1977–1991)',
        ],
        'AON' => [
            'AON',
            'kwanza nevez Angola (1990–2000)',
        ],
        'ARM' => [
            'ARM',
            'peso Arcʼhantina (1881–1970)',
        ],
        'ARP' => [
            'ARP',
            'peso Arcʼhantina (1983–1985)',
        ],
        'ARS' => [
            'ARS',
            'peso Arcʼhantina',
        ],
        'ATS' => [
            'ATS',
            'schilling Aostria',
        ],
        'AUD' => [

 ],
        'AZN' => [
            'AZN',
            'manat Azerbaidjan',
        ],
        'BAD' => [
            'BAD',
            'dinar Bosnia ha Herzegovina (1992–1994)',
        ],
        'BAM' => [
            'BAM',
            'mark kemmadus B

            '$A',
            'dollar Aostralia',
        ],
        'AWG' => [
            'AWG',
            'florin Aruba',
        ],
        'AZM' => [
            'AZM',
            'manat Azerbaidjan (1993–2006)',


/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HtmlSanitizer\Tests\Parser;

use PHPUnit\Framework\TestCase;
use Symfony\Component\HtmlSanitizer\Parser\NativeParser;

class NativeParserTest extends TestCase
{
    public function testParseValid()
    {
        $node = (new NativeParser())->parse('<di

0)->nodeName);
    }

    public function testParseHtml()
    {
        $html = '

Hello World!

';
        $node = (new NativeParser())->parse($html);
        $this->assertInstanceOf(\Dom\Node::class, $node);
        $this->

v></div>');
        $this->assertInstanceOf(\Dom\Node::class, $node);
        $this->assertSame('BODY', $node->nodeName);
        $this->assertCount(1, $node->childNodes);
        $this->assertSame('DIV', $node->childNodes->item(


ted' => 'http://trusted.com/link.php',
        ];

        yield [
            'input' => 'https://trusted.com/link.php',
            'allowedSchemes' => null,
            'allowedHosts' => null,
            'forceHttps' => false,
            'allowRelative' => false,
            'expected' => 'https://trusted.com/link.php',
        ];

        yield [
            'input' => 'data:text/plain;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7',
            'allowedSchemes' => null,
            '

d [
            'input' => 'https://trusted.com/link.php',
            'allowedSchemes' => ['https'],
            'allowedHosts' => null,
            'forceHttps' => false,
            'allowRelative' => false,
            'expected' => 'https://trusted.co

allowedHosts' => null,
            'forceHttps' => false,
            'allowRelative' => false,
            'expected' => 'data:text/plain;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7',
        ];

        yiel


* This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HtmlSanitizer\Visitor\Node;

/**
 * @author Titouan Galopin <galopintitouan@gmail.com>
 */
final class DocumentNode implements NodeInterface
{
    private array $children = [];

    public function addChild(NodeInterface $node): void
    {
        $this->ch

nt(): ?NodeInterface
    {
        return null;
    }

    public function render(): string
    {
        $rendered = '';
        foreach ($this->children as $child) {
            $rendered .= $child->render();
        }

        return $rendered;
    }
}

ildren[] = $node;
    }

    public function getPare


 part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HtmlSanitizer\Visitor\AttributeSanitizer;

use Symfony\Component\HtmlSanitizer\HtmlSanitizerConfig;
use Symfony\Component\HtmlSanitizer\TextSanitizer\UrlSanitizer;

/**
 * Sanitizes the URL embedded in the content attribute of a <meta http-equiv="refresh">
 * element, si

nal class MetaRefreshAttributeSanitizer implements AttributeSanitizerInterface
{
    public function getSupportedElements(): ?array
    {
        return ['meta'];
    }

    public function getSupportedAttributes(): ?array
    {
        return ['content'];

nce the http-equiv value is not visible from a per-attribute sanitizer.
 *
 * The content attribute carries an unrelated value for other meta types (description,
 * keywords, generator…), which is passed through unchanged.
 */
fi


 Schussek <bschussek@gmail.com>
 * @author Roland Franssen <franssen.roland@gmail.com>
 */
final class Currencies extends ResourceBundle
{
    private const INDEX_SYMBOL = 0;
    private const INDEX_NAME = 1;
    private const INDEX_FRACTION_DIGITS = 0;
    private const INDEX_ROUNDING_INCREMENT = 1;
    private const INDEX_CASH_FRACTION_DIGITS = 2;
    private const INDEX_CASH_ROUNDING_INCREMENT = 3;

    /**
     * @return string[]
     */
    public static function getCurrencyCodes(): array
    {

        } catch (MissingResourceException) {
            return false;
        }
    }

    /**
     * @throws MissingResourceException if the currency code does not exist
     */
    public static function getName(string $currency, ?string $displayLocale

 return self::readEntry(['Currencies'], 'meta');
    }

    public static function exists(string $currency): bool
    {
        try {
            self::readEntry(['Names', $currency, self::INDEX_NAME]);

            return true;


 part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Intl;

use Symfony\Component\Intl\Exception\MissingResourceException;

/**
 * Gives access to locale-related ICU data.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 * @author Roland Franssen <franssen.roland@gmail.com>
 */
final class Locales extends ResourceBun

Aliases(): array
    {
        return self::readEntry(['Aliases'], 'meta');
    }

    public static function exists(string $locale): bool
    {
        try {
            self::readEntry(['Names', $locale]);

            return true;
        } catch (Missi

dle
{
    /**
     * @return string[]
     */
    public static function getLocales(): array
    {
        return self::readEntry(['Locales'], 'meta');
    }

    /**
     * @return string[]
     */
    public static function get


 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Intl;

use Symfony\Component\Intl\Exception\MissingResourceException;
use Symfony\Component\Intl\Exception\RuntimeException;

/**
 * Gives access to timezone-related ICU data.
 *
 * @author Roland Franssen <franssen.roland@gmail.com>
 */
final class Timezones extends ResourceBundle
{
    /**
     * @return string[]
     */
    public static funct

urn true;
        } catch (MissingResourceException) {
            try {
                new \DateTimeZone($timezone);

                return true;
            } catch (\Exception) {
                return false;
            }
        }
    }

    /**

ion getIds(): array
    {
        return self::readEntry(['Zones'], 'meta');
    }

    public static function exists(string $timezone): bool
    {
        try {
            self::readEntry(['Names', $timezone]);

            ret


 This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HtmlSanitizer;

/**
 * Sanitizes an untrusted HTML input for safe insertion into a document's DOM.
 *
 * This interface is inspired by the W3C Standard Draft about a HTML Sanitizer API
 * ({@see https://wicg.github.io/sanitizer-api/}).
 *
 * @author Titouan

ing
     * will be injected in a "body" context, and therefore will drop tags only
     * allowed in the "head" element. To sanitize a string for injection
     * in the "head" element, use {@see HtmlSanitizerInterface::sanitizeFor()}.
     */
    public f

Galopin <galopintitouan@gmail.com>
 */
interface HtmlSanitizerInterface
{
    /**
     * Sanitizes an untrusted HTML input for a <body> context.
     *
     * This method is NOT context sensitive: it assumes the returned HTML str


       'Nederlands-Antilliaanse gulde',
        ],
        'AOA' => [
            'AOA',
            'Angolese kwanza',
        ],
        'ARS' => [
            'ARS',
            'Argentynse peso',
        ],
        'AUD' => [
            'A$',
            'Australiese dollar',
        ],
        'AWG' => [
            'AWG',
            'Arubaanse floryn',
        ],
        'AZN' => [
            'AZN',
            'Azerbeidjaanse manat',
        ],
        'BAM' => [
            'BAM',
            'Bo

' => [
            'BGN',
            'Bulgaarse lev',
        ],
        'BHD' => [
            'BHD',
            'Bahreinse dinar',
        ],
        'BIF' => [
            'BIF',
            'Burundiese frank',
        ],
        'BMD' => [

snies-Herzegowiniese omskakelbare marka',
        ],
        'BBD' => [
            'BBD',
            'Barbados-dollar',
        ],
        'BDT' => [
            'BDT',
            'Bangladesjiese taka',
        ],
        'BGN


'নেডাৰলেণ্ডছ এণ্টিলিয়েন গিল্ডাৰ',
        ],
        'AOA' => [
            'AOA',
            'এংগোলান কোৱাঞ্জা',
        ],
        'ARS' => [
            'ARS',
            'আৰ্জেণ্টাইন পেছো',
        ],
        'AUD' => [
            'A$',
            'অষ্ট্ৰেলিয়ান ডলাৰ',
        ],
        'AWG' => [
            'AWG',
            'আৰুবান ফ্ল’ৰিন',
        ],
        'AZN' => [
            'AZN',
            'আজেৰবাইজানী মানাত',
        ],
        'BAM' => [
            'BAM',
            'ব’ছনিয়া আ

           'BGN',
            'বুলগেৰীয় লেভ',
        ],
        'BHD' => [
            'BHD',
            'বাহৰেইনী ডিনাৰ',
        ],
        'BIF' => [
            'BIF',
            'বুৰুণ্ডিয়ান ফ্ৰেংক',
        ],
        'BMD' => [
            'BMD

ৰু হাৰ্জেগ’ভিনা কনভাৰ্টিব্‌ল মাৰ্ক',
        ],
        'BBD' => [
            'BBD',
            'বাৰ্বাডিয়ান ডলাৰ',
        ],
        'BDT' => [
            'BDT',
            'বাংলাদেশী টাকা',
        ],
        'BGN' => [


  'AOK' => [
            'AOK',
            'Anqola Kvanzasi (1977–1990)',
        ],
        'AON' => [
            'AON',
            'Anqola Yeni Kvanzası (1990–2000)',
        ],
        'AOR' => [
            'AOR',
            'Anqola Kvanzası (1995–1999)',
        ],
        'ARA' => [
            'ARA',
            'Argentina avstralı',
        ],
        'ARP' => [
            'ARP',
            'Argentina pesosu (1983–1985)',
        ],
        'ARS' => [
            'ARS',
            'Argentina

     'Aruba Florini',
        ],
        'AZM' => [
            'AZM',
            'Azərbaycan Manatı (1993–2006)',
        ],
        'AZN' => [
            '₼',
            'Azərbaycan Manatı',
        ],
        'BAD' => [
            'BAD',

Pesosu',
        ],
        'ATS' => [
            'ATS',
            'Avstriya Şillinqi',
        ],
        'AUD' => [
            'A$',
            'Avstraliya Dolları',
        ],
        'AWG' => [
            'AWG',


Diram',
        ],
        'AOA' => [
            'AOA',
            'angola Kwanza',
        ],
        'AUD' => [
            'A$',
            'ositirali Dolar',
        ],
        'BHD' => [
            'BHD',
            'bareyini Dinar',
        ],
        'BIF' => [
            'BIF',
            'burundi Fraŋ',
        ],
        'BWP' => [
            'BWP',
            'bɔtisiwana Pula',
        ],
        'CAD' => [
            'CA$',
            'kanada Dolar',
        ],
        'CDF' => [

         'CVE',
            'capivɛrdi Esekudo',
        ],
        'DJF' => [
            'DJF',
            'jibuti Fraŋ',
        ],
        'DZD' => [
            'DZD',
            'alizeri Dinar',
        ],
        'EGP' => [
            'EGP',

        'CDF',
            'kongole Fraŋ',
        ],
        'CHF' => [
            'CHF',
            'suwisi Fraŋ',
        ],
        'CNY' => [
            'CN¥',
            'siniwa Yuwan',
        ],
        'CVE' => [


buted with this source code.
 */

namespace Symfony\Component\HtmlSanitizer\TextSanitizer;

use League\Uri\Exceptions\SyntaxError;
use League\Uri\UriString;

/**
 * @internal
 */
final class UrlSanitizer
{
    /**
     * Characters with no legitimate place in a URL: explicit-direction BiDi
     * formatting marks plus Unicode whitespace and the zero-width no-break
     * space. ASCII space is tolerated and percent-encoded by parse().
     */
    private const DENIED_CHARS_PATTERN = '/[\t\n\v\f\r\x{0085}\x{0

sanitizer checks that:
     *   * the URL's host is allowed ;
     *   * the URL's scheme is allowed ;
     *   * the URL is allowed to be relative if it is ;
     *
     * It also transforms the URL to HTTPS if requested.
     */
    public static functio


ony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HtmlSanitizer\Visitor\Node;

/**
 * Represents the sanitized version of a DOM node in the sanitized tree.
 *
 * Once the sanitization is done, nodes are rendered into the final output string.
 *
 * @author Titouan Galopin <galopintitouan@gmail.com>
 */
interface NodeInterface
{
    /**
     * Add a child node to this node.
     */
    pub

   * Return the parent node of this node, or null if it has no parent node.
     */
    public function getParent(): ?self;

    /**
     * Render this node as a string, recursively rendering its children as well.
     */
    public function render(): stri

lic function addChild(self $node): void;

    /**


buted with this source code.
 */

namespace Symfony\Component\Intl;

use Symfony\Component\Intl\Exception\MissingResourceException;

/**
 * Gives access to region-related ICU data.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 * @author Roland Franssen <franssen.roland@gmail.com>
 */
final class Countries extends ResourceBundle
{
    private static bool $withUserAssigned;

    /**
     * Returns all available countries.
     *
     * Countries are returned as uppercase ISO 3166 two-letter country c

try codes.
     *
     * @return string[]
     */
    public static function getCountryCodes(): array
    {
        if (!self::withUserAssigned()) {
            return self::readEntry(['Regions'], 'meta');
        }

        return array_merge(self::readEn

odes.
     *
     * A full table of ISO 3166 country codes can be found here:
     * https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes
     *
     * This list only contains "officially assigned ISO 3166-1 alpha-2" coun


                ->allowMediaHosts(['trusted.com', 'external.com'])
                ->allowRelativeLinks()
                ->allowRelativeMedias()
                ->forceHttpsUrls()
        );
    }

    #[DataProvider('provideSanitizeHead')]
    public function testSanitizeHead(string $input, string $expected)
    {
        $this->assertSame($expected, $this->createSanitizer()->sanitizeFor('head', $input));
    }

    public static function provideSanitizeHead()
    {
        $cases = [
            // Scrip

sheet" href="http://trusted.com" />',
                '<link rel="stylesheet" href="https://trusted.com" />',
            ],
            [
                '<link rel="stylesheet" href="http://untrusted.com" />',
                '<link rel="stylesheet" />',

ts
            [
                '<LINK REL="stylesheet" HREF="javascript:alert(\'XSS\');">',
                '<link rel="stylesheet" />',
            ],

            // Normal tags
            [
                '<link rel="style


Nɛdɛlande Antɛlia guuda',
        ],
        'AOA' => [
            'AOA',
            'Angola Kwanza',
        ],
        'ARS' => [
            'ARS',
            'Agɛntina peso',
        ],
        'AUD' => [
            'A$',
            'Ɔstrelia Dɔla',
        ],
        'AWG' => [
            'AWG',
            'Aruba flɔrin',
        ],
        'AZN' => [
            'AZN',
            'Azɛbagyan manat',
        ],
        'BAM' => [
            'BAM',
            'Bɔsnia-Hɛzegɔvina nsesa maake',

ɛv',
        ],
        'BHD' => [
            'BHD',
            'Baren Dina',
        ],
        'BIF' => [
            'BIF',
            'Burundi Frank',
        ],
        'BMD' => [
            'BMD',
            'Bɛɛmuda dɔla',
        ],
        'B

      ],
        'BBD' => [
            'BBD',
            'Babadɔso dɔla',
        ],
        'BDT' => [
            'BDT',
            'Bangladehye taka',
        ],
        'BGN' => [
            'BGN',
            'Bɔɔgaria l


php

return [
    'Names' => [
        'ANG' => [
            'ANG',
            'নেদারল্যান্ডস অ্যান্টিলিয়ান গিল্ডার',
        ],
        'AWG' => [
            'AWG',
            'আরুবান গিল্ডার',
        ],
        'BMD' => [
            'BMD',
            'বারমুডান ডলার',
        ],
        'GTQ' => [
            'GTQ',
            'গুয়াতেমালান কেৎসাল',
        ],
        'HNL' => [
            'HNL',
            'হন্ডুরান লেম্পিরা',
        ],
        'HTG' => [
            'HTG',
            'হাইতিয

      ],
        'MXN' => [
            'MX$',
            'মেক্সিকান পেসো',
        ],
        'USD' => [
            '$',
            'মার্কিন ডলার',
        ],
        'XCD' => [
            'EC$',
            'পূর্ব ক্যারিবিয়ান ডলার',
        ],
    ]


buted with this source code.
 */

namespace Symfony\Component\Intl;

use Symfony\Component\Intl\Exception\MissingResourceException;

/**
 * Gives access to language-related ICU data.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 * @author Roland Franssen <franssen.roland@gmail.com>
 */
final class Languages extends ResourceBundle
{
    /**
     * Returns all available languages as two-letter codes.
     *
     * Languages are returned as lowercase ISO 639-1 two-letter language codes.
     * For lan

 * @return string[] an array of canonical ISO 639-1 language codes
     */
    public static function getLanguageCodes(): array
    {
        return self::readEntry(['Languages'], 'meta');
    }

    public static function exists(string $language): bool

guages that don't have a two-letter code, the ISO 639-2
     * three-letter code is used instead.
     *
     * A full table of ISO 639 language codes can be found here:
     * http://www-01.sil.org/iso639-3/codes.asp
     *


ge.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Intl\Util;

/**
 * Facilitates the comparison of ICU version strings.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class IcuVersion
{
    /**
     * Compares two ICU versions with an operator.
     *
     * This method is identical to {@link version_compare()}, except that you
     *

 If no major version
     * is given, it is substituted by zero.
     *
     * Examples:
     *
     *     IcuVersion::compare('1.2.3', '1.2.4', '==')
     *     // => false
     *
     *     IcuVersion::compare('1.2.3', '1.2.4', '==', 2)
     *     // =>

 can pass the number of regarded version components in the last argument
     * $precision.
     *
     * Also, a single digit release version and a single digit major version
     * are contracted to a two digit release version.


buted with this source code.
 */

namespace Symfony\Component\HtmlSanitizer\Visitor;

use Symfony\Component\HtmlSanitizer\HtmlSanitizerAction;
use Symfony\Component\HtmlSanitizer\HtmlSanitizerConfig;
use Symfony\Component\HtmlSanitizer\TextSanitizer\StringSanitizer;
use Symfony\Component\HtmlSanitizer\Visitor\AttributeSanitizer\AttributeSanitizerInterface;
use Symfony\Component\HtmlSanitizer\Visitor\Model\Cursor;
use Symfony\Component\HtmlSanitizer\Visitor\Node\BlockedNode;
use Symfony\Component\HtmlSanitiz

 the parsed DOM tree to build the sanitized tree.
 *
 * The DomVisitor iterates over the parsed DOM tree, visits its nodes and build
 * a sanitized tree with their attributes and content.
 *
 * @author Titouan Galopin <galopintitouan@gmail.com>
 *
 * @inte

er\Visitor\Node\DocumentNode;
use Symfony\Component\HtmlSanitizer\Visitor\Node\Node;
use Symfony\Component\HtmlSanitizer\Visitor\Node\NodeInterface;
use Symfony\Component\HtmlSanitizer\Visitor\Node\TextNode;

/**
 * Iterates over


ge.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Intl\Util;

use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\Intl\Exception\RuntimeException;

/**
 * @internal
 */
final class GitRepository
{
    public function __construct(
        private string $path,
    ) {
        $this->getUrl();
    }

    public static function downl

    $filesystem->remove($targetDir);
            $filesystem->mkdir($targetDir);

            self::exec(\sprintf('git clone %s %s', escapeshellarg($remote), escapeshellarg($targetDir)));
        }

        return new self(realpath($targetDir));
    }

oad(string $remote, string $targetDir): self
    {
        self::exec('which git', 'The command "git" is not installed.');

        $filesystem = new Filesystem();

        if (!$filesystem->exists($targetDir.'/.git')) {


тыльскі гульдэн',
        ],
        'AOA' => [
            'AOA',
            'ангольская кванза',
        ],
        'ARS' => [
            'ARS',
            'аргенцінскае песа',
        ],
        'AUD' => [
            'A$',
            'аўстралійскі долар',
        ],
        'AWG' => [
            'AWG',
            'арубанскі фларын',
        ],
        'AZN' => [
            'AZN',
            'азербайджанскі манат',
        ],
        'BAM' => [
            'BAM',
            'канверсоўная марка Б

BGN',
            'балгарскі леў',
        ],
        'BHD' => [
            'BHD',
            'бахрэйнскі дынар',
        ],
        'BIF' => [
            'BIF',
            'бурундзійскі франк',
        ],
        'BMD' => [
            'BMD',

осніі і Герцагавіны',
        ],
        'BBD' => [
            'BBD',
            'барбадаскі долар',
        ],
        'BDT' => [
            'BDT',
            'бангладэшская така',
        ],
        'BGN' => [
            '


            'AON',
            'Angolese nieuwe kwanza (1990–2000)',
        ],
        'AOR' => [
            'AOR',
            'Angolese kwanza reajustado (1995–1999)',
        ],
        'ARA' => [
            'ARA',
            'Argentynske austral',
        ],
        'ARL' => [
            'ARL',
            'Argentynske peso ley (1970–1983)',
        ],
        'ARM' => [
            'ARM',
            'Argentynske peso (1881–1970)',
        ],
        'ARP' => [
            'ARP',
            'Arg

        'AU$',
            'Australyske dollar',
        ],
        'AWG' => [
            'AWG',
            'Arubaanske gulden',
        ],
        'AZM' => [
            'AZM',
            'Azerbeidzjaanske manat (1993–2006)',
        ],
        'AZN' =

entynske peso (1983–1985)',
        ],
        'ARS' => [
            'ARS',
            'Argentynske peso',
        ],
        'ATS' => [
            'ATS',
            'Eastenrykse schilling',
        ],
        'AUD' => [


  ],
        'ARS' => [
            'ARS',
            'アルゼンチン ペソ',
        ],
        'ATS' => [
            'ATS',
            'オーストリア シリング',
        ],
        'AUD' => [
            'A$',
            'オーストラリア ドル',
        ],


ilder Antilla Walanda',
        ],
        'AOA' => [
            'AOA',
            'Kwanza Angola',
        ],
        'ARS' => [
            'ARS',
            'Peso Argentina',
        ],
        'AUD' => [
            'A$',
            'Dolar Australia',
        ],
        'AWG' => [
            'AWG',
            'Florin Aruban',
        ],
        'AZN' => [
            'AZN',
            'Manat Azerbaijan',
        ],
        'BAM' => [
            'BAM',
            'Mark Konvertibel Bosnia-Herzego

Lev Bulgaria',
        ],
        'BHD' => [
            'BHD',
            'Bahrain Dinar',
        ],
        'BIF' => [
            'BIF',
            'Franc Burundi',
        ],
        'BMD' => [
            'BMD',
            'Dolar Bermuda',

vina',
        ],
        'BBD' => [
            'BBD',
            'Dolar Barbadian',
        ],
        'BDT' => [
            'BDT',
            'Taka Bangladesh',
        ],
        'BGN' => [
            'BGN',
            '