From 171a0d38f876a1af3db48a83e312fb52d3bdac75 Mon Sep 17 00:00:00 2001 From: johnnyq Date: Wed, 24 Jun 2026 13:39:07 -0400 Subject: [PATCH] Mail Parser: Completely remove Webklex IMAP and all dependcies --- cron/legacy_ticket_email_parser.php | 932 ------ plugins/composer.json | 1 - plugins/composer.lock | 556 +--- plugins/vendor/autoload.php | 2 +- plugins/vendor/composer/autoload_classmap.php | 906 +++++ plugins/vendor/composer/autoload_files.php | 21 +- plugins/vendor/composer/autoload_psr4.php | 9 +- plugins/vendor/composer/autoload_real.php | 14 +- plugins/vendor/composer/autoload_static.php | 978 +++++- plugins/vendor/composer/installed.json | 585 +--- plugins/vendor/composer/installed.php | 99 +- .../src/Connection/ImapQueryBuilder.php | 8 + plugins/vendor/doctrine/inflector/LICENSE | 19 - plugins/vendor/doctrine/inflector/README.md | 7 - .../vendor/doctrine/inflector/composer.json | 67 - .../doctrine/inflector/docs/en/index.rst | 227 -- .../inflector/src/CachedWordInflector.php | 24 - .../src/GenericLanguageInflectorFactory.php | 66 - .../doctrine/inflector/src/Inflector.php | 507 --- .../inflector/src/InflectorFactory.php | 60 - .../doctrine/inflector/src/Language.php | 21 - .../src/LanguageInflectorFactory.php | 33 - .../inflector/src/NoopWordInflector.php | 13 - .../src/Rules/English/Inflectible.php | 185 -- .../src/Rules/English/InflectorFactory.php | 21 - .../inflector/src/Rules/English/Rules.php | 31 - .../src/Rules/English/Uninflected.php | 189 -- .../src/Rules/Esperanto/Inflectible.php | 31 - .../src/Rules/Esperanto/InflectorFactory.php | 21 - .../inflector/src/Rules/Esperanto/Rules.php | 31 - .../src/Rules/Esperanto/Uninflected.php | 28 - .../src/Rules/French/Inflectible.php | 44 - .../src/Rules/French/InflectorFactory.php | 21 - .../inflector/src/Rules/French/Rules.php | 31 - .../src/Rules/French/Uninflected.php | 31 - .../src/Rules/Italian/Inflectible.php | 218 -- .../src/Rules/Italian/InflectorFactory.php | 21 - .../inflector/src/Rules/Italian/Rules.php | 31 - .../src/Rules/Italian/Uninflected.php | 80 - .../src/Rules/NorwegianBokmal/Inflectible.php | 34 - .../NorwegianBokmal/InflectorFactory.php | 21 - .../src/Rules/NorwegianBokmal/Rules.php | 31 - .../src/Rules/NorwegianBokmal/Uninflected.php | 30 - .../doctrine/inflector/src/Rules/Pattern.php | 42 - .../doctrine/inflector/src/Rules/Patterns.php | 29 - .../src/Rules/Portuguese/Inflectible.php | 98 - .../src/Rules/Portuguese/InflectorFactory.php | 21 - .../inflector/src/Rules/Portuguese/Rules.php | 31 - .../src/Rules/Portuguese/Uninflected.php | 32 - .../doctrine/inflector/src/Rules/Ruleset.php | 39 - .../src/Rules/Spanish/Inflectible.php | 47 - .../src/Rules/Spanish/InflectorFactory.php | 21 - .../inflector/src/Rules/Spanish/Rules.php | 31 - .../src/Rules/Spanish/Uninflected.php | 30 - .../inflector/src/Rules/Substitution.php | 30 - .../inflector/src/Rules/Substitutions.php | 57 - .../inflector/src/Rules/Transformation.php | 39 - .../inflector/src/Rules/Transformations.php | 29 - .../src/Rules/Turkish/Inflectible.php | 34 - .../src/Rules/Turkish/InflectorFactory.php | 21 - .../inflector/src/Rules/Turkish/Rules.php | 31 - .../src/Rules/Turkish/Uninflected.php | 30 - .../doctrine/inflector/src/Rules/Word.php | 21 - .../inflector/src/RulesetInflector.php | 56 - .../doctrine/inflector/src/WordInflector.php | 10 - plugins/vendor/guzzlehttp/psr7/CHANGELOG.md | 35 + plugins/vendor/guzzlehttp/psr7/composer.json | 2 +- .../vendor/guzzlehttp/psr7/src/Message.php | 60 +- .../guzzlehttp/psr7/src/MessageTrait.php | 25 + .../guzzlehttp/psr7/src/MultipartStream.php | 27 +- plugins/vendor/guzzlehttp/psr7/src/Query.php | 27 +- .../vendor/guzzlehttp/psr7/src/Request.php | 12 +- .../vendor/guzzlehttp/psr7/src/Response.php | 12 +- .../vendor/guzzlehttp/psr7/src/Rfc7230.php | 8 +- plugins/vendor/guzzlehttp/psr7/src/Uri.php | 95 +- .../guzzlehttp/psr7/src/UriNormalizer.php | 10 +- plugins/vendor/guzzlehttp/psr7/src/Utils.php | 19 + .../pagination/AbstractCursorPaginator.php | 688 ---- .../pagination/AbstractPaginator.php | 830 ----- .../vendor/illuminate/pagination/Cursor.php | 134 - .../illuminate/pagination/CursorPaginator.php | 195 -- .../vendor/illuminate/pagination/LICENSE.md | 21 - .../pagination/LengthAwarePaginator.php | 257 -- .../pagination/PaginationServiceProvider.php | 34 - .../illuminate/pagination/PaginationState.php | 35 - .../illuminate/pagination/Paginator.php | 200 -- .../illuminate/pagination/UrlWindow.php | 219 -- .../illuminate/pagination/composer.json | 37 - .../resources/views/bootstrap-4.blade.php | 46 - .../resources/views/bootstrap-5.blade.php | 88 - .../resources/views/default.blade.php | 46 - .../resources/views/semantic-ui.blade.php | 36 - .../views/simple-bootstrap-4.blade.php | 27 - .../views/simple-bootstrap-5.blade.php | 29 - .../resources/views/simple-default.blade.php | 19 - .../resources/views/simple-tailwind.blade.php | 25 - .../resources/views/tailwind.blade.php | 111 - .../vendor/illuminate/reflection/LICENSE.md | 21 - .../illuminate/reflection/Reflector.php | 213 -- .../reflection/Traits/ReflectsClosures.php | 126 - .../illuminate/reflection/composer.json | 38 - .../vendor/illuminate/reflection/helpers.php | 97 - .../support/AggregateServiceProvider.php | 52 - .../vendor/illuminate/support/Benchmark.php | 72 - .../vendor/illuminate/support/BinaryCodec.php | 99 - plugins/vendor/illuminate/support/Carbon.php | 74 - .../vendor/illuminate/support/Composer.php | 254 -- .../support/ConfigurationUrlParser.php | 191 -- .../vendor/illuminate/support/DateFactory.php | 250 -- .../illuminate/support/DefaultProviders.php | 101 - .../support/Defer/DeferredCallback.php | 54 - .../Defer/DeferredCallbackCollection.php | 157 - .../illuminate/support/EncodedHtmlString.php | 100 - plugins/vendor/illuminate/support/Env.php | 309 -- .../support/Exceptions/MathException.php | 10 - .../vendor/illuminate/support/Facades/App.php | 162 - .../illuminate/support/Facades/Artisan.php | 39 - .../illuminate/support/Facades/Auth.php | 99 - .../illuminate/support/Facades/Blade.php | 63 - .../illuminate/support/Facades/Broadcast.php | 50 - .../vendor/illuminate/support/Facades/Bus.php | 103 - .../illuminate/support/Facades/Cache.php | 106 - .../support/Facades/Concurrency.php | 36 - .../illuminate/support/Facades/Config.php | 37 - .../illuminate/support/Facades/Context.php | 63 - .../illuminate/support/Facades/Cookie.php | 58 - .../illuminate/support/Facades/Crypt.php | 31 - .../vendor/illuminate/support/Facades/DB.php | 150 - .../illuminate/support/Facades/Date.php | 141 - .../illuminate/support/Facades/Event.php | 136 - .../illuminate/support/Facades/Exceptions.php | 70 - .../illuminate/support/Facades/Facade.php | 365 -- .../illuminate/support/Facades/File.php | 73 - .../illuminate/support/Facades/Gate.php | 48 - .../illuminate/support/Facades/Hash.php | 36 - .../illuminate/support/Facades/Http.php | 174 - .../illuminate/support/Facades/Lang.php | 48 - .../vendor/illuminate/support/Facades/Log.php | 51 - .../illuminate/support/Facades/Mail.php | 92 - .../support/Facades/MaintenanceMode.php | 29 - .../support/Facades/Notification.php | 96 - .../support/Facades/ParallelTesting.php | 36 - .../illuminate/support/Facades/Password.php | 75 - .../illuminate/support/Facades/Pipeline.php | 42 - .../illuminate/support/Facades/Process.php | 75 - .../illuminate/support/Facades/Queue.php | 168 - .../support/Facades/RateLimiter.php | 34 - .../illuminate/support/Facades/Redirect.php | 39 - .../illuminate/support/Facades/Redis.php | 320 -- .../illuminate/support/Facades/Request.php | 210 -- .../illuminate/support/Facades/Response.php | 42 - .../illuminate/support/Facades/Route.php | 119 - .../illuminate/support/Facades/Schedule.php | 100 - .../illuminate/support/Facades/Schema.php | 88 - .../illuminate/support/Facades/Session.php | 90 - .../illuminate/support/Facades/Storage.php | 183 - .../vendor/illuminate/support/Facades/URL.php | 66 - .../illuminate/support/Facades/Validator.php | 34 - .../illuminate/support/Facades/View.php | 99 - .../illuminate/support/Facades/Vite.php | 49 - plugins/vendor/illuminate/support/Fluent.php | 354 -- .../support/HigherOrderTapProxy.php | 37 - .../vendor/illuminate/support/HtmlString.php | 66 - .../illuminate/support/InteractsWithTime.php | 83 - plugins/vendor/illuminate/support/Js.php | 159 - plugins/vendor/illuminate/support/LICENSE.md | 21 - plugins/vendor/illuminate/support/Lottery.php | 284 -- plugins/vendor/illuminate/support/Manager.php | 188 -- .../vendor/illuminate/support/MessageBag.php | 454 --- .../support/MultipleInstanceManager.php | 230 -- .../support/NamespacedItemResolver.php | 112 - plugins/vendor/illuminate/support/Number.php | 456 --- plugins/vendor/illuminate/support/Once.php | 99 - .../vendor/illuminate/support/Onceable.php | 92 - .../vendor/illuminate/support/Optional.php | 130 - .../vendor/illuminate/support/Pluralizer.php | 127 - .../illuminate/support/ProcessUtils.php | 69 - .../illuminate/support/ServiceProvider.php | 662 ---- plugins/vendor/illuminate/support/Sleep.php | 551 --- plugins/vendor/illuminate/support/Str.php | 2154 ------------ .../vendor/illuminate/support/Stringable.php | 1623 --------- .../support/Testing/Fakes/BatchFake.php | 168 - .../Testing/Fakes/BatchRepositoryFake.php | 163 - .../support/Testing/Fakes/BusFake.php | 926 ------ .../Testing/Fakes/ChainedBatchTruthTest.php | 36 - .../support/Testing/Fakes/EventFake.php | 452 --- .../Testing/Fakes/ExceptionHandlerFake.php | 285 -- .../illuminate/support/Testing/Fakes/Fake.php | 8 - .../support/Testing/Fakes/MailFake.php | 600 ---- .../Testing/Fakes/NotificationFake.php | 405 --- .../Testing/Fakes/PendingBatchFake.php | 87 - .../Testing/Fakes/PendingChainFake.php | 55 - .../support/Testing/Fakes/PendingMailFake.php | 52 - .../support/Testing/Fakes/QueueFake.php | 719 ---- plugins/vendor/illuminate/support/Timebox.php | 86 - .../support/Traits/CapsuleManagerTrait.php | 69 - .../illuminate/support/Traits/Dumpable.php | 30 - .../support/Traits/ForwardsCalls.php | 71 - .../support/Traits/InteractsWithData.php | 468 --- .../illuminate/support/Traits/Localizable.php | 34 - .../illuminate/support/Traits/Tappable.php | 17 - plugins/vendor/illuminate/support/Uri.php | 450 --- .../illuminate/support/UriQueryString.php | 96 - .../illuminate/support/ValidatedInput.php | 226 -- .../illuminate/support/ViewErrorBag.php | 131 - .../vendor/illuminate/support/composer.json | 67 - .../vendor/illuminate/support/functions.php | 157 - plugins/vendor/illuminate/support/helpers.php | 528 --- plugins/vendor/nesbot/carbon/SECURITY.md | 7 + plugins/vendor/nesbot/carbon/composer.json | 4 +- plugins/vendor/nesbot/carbon/readme.md | 153 +- .../carbon/src/Carbon/AbstractTranslator.php | 26 +- .../nesbot/carbon/src/Carbon/Carbon.php | 1592 ++++----- .../carbon/src/Carbon/CarbonImmutable.php | 1592 ++++----- .../carbon/src/Carbon/CarbonInterface.php | 1696 +++++----- .../carbon/src/Carbon/CarbonInterval.php | 143 +- .../nesbot/carbon/src/Carbon/CarbonPeriod.php | 199 +- .../Carbon/Exceptions/ImmutableException.php | 37 +- .../nesbot/carbon/src/Carbon/Factory.php | 24 +- .../carbon/src/Carbon/FactoryImmutable.php | 2 +- .../nesbot/carbon/src/Carbon/OverflowMode.php | 21 + .../nesbot/carbon/src/Carbon/Traits/Date.php | 1792 +++++----- .../carbon/src/Carbon/Traits/IntervalStep.php | 27 +- .../carbon/src/Carbon/Traits/Localization.php | 13 +- .../nesbot/carbon/src/Carbon/Traits/Test.php | 7 +- .../nesbot/carbon/src/Carbon/Traits/Units.php | 222 +- .../carbon/src/Carbon/TranslatorImmutable.php | 2 +- .../symfony/http-foundation/AcceptHeader.php | 304 -- .../http-foundation/AcceptHeaderItem.php | 159 - .../http-foundation/BinaryFileResponse.php | 396 --- .../symfony/http-foundation/CHANGELOG.md | 409 --- .../http-foundation/ChainRequestMatcher.php | 38 - .../vendor/symfony/http-foundation/Cookie.php | 405 --- .../http-foundation/EventStreamResponse.php | 110 - .../Exception/BadRequestException.php | 19 - .../Exception/ConflictingHeadersException.php | 21 - .../Exception/ExceptionInterface.php | 16 - .../Exception/ExpiredSignedUriException.php | 29 - .../Exception/JsonException.php | 21 - .../Exception/LogicException.php | 19 - .../Exception/RequestExceptionInterface.php | 21 - .../Exception/SessionNotFoundException.php | 27 - .../Exception/SignedUriException.php | 22 - .../SuspiciousOperationException.php | 20 - .../Exception/UnexpectedValueException.php | 16 - .../Exception/UnsignedUriException.php | 26 - .../UnverifiedSignedUriException.php | 26 - .../File/Exception/AccessDeniedException.php | 25 - .../Exception/CannotWriteFileException.php | 21 - .../File/Exception/ExtensionFileException.php | 21 - .../File/Exception/FileException.php | 21 - .../File/Exception/FileNotFoundException.php | 25 - .../File/Exception/FormSizeFileException.php | 21 - .../File/Exception/IniSizeFileException.php | 21 - .../File/Exception/NoFileException.php | 21 - .../File/Exception/NoTmpDirFileException.php | 21 - .../File/Exception/PartialFileException.php | 21 - .../Exception/UnexpectedTypeException.php | 20 - .../File/Exception/UploadException.php | 21 - .../symfony/http-foundation/File/File.php | 141 - .../symfony/http-foundation/File/Stream.php | 25 - .../http-foundation/File/UploadedFile.php | 297 -- .../symfony/http-foundation/FileBag.php | 127 - .../symfony/http-foundation/HeaderBag.php | 273 -- .../symfony/http-foundation/HeaderUtils.php | 298 -- .../symfony/http-foundation/InputBag.php | 152 - .../symfony/http-foundation/IpUtils.php | 278 -- .../symfony/http-foundation/JsonResponse.php | 187 -- .../vendor/symfony/http-foundation/LICENSE | 19 - .../symfony/http-foundation/ParameterBag.php | 271 -- .../vendor/symfony/http-foundation/README.md | 14 - .../AbstractRequestRateLimiter.php | 81 - .../PeekableRequestRateLimiterInterface.php | 35 - .../RequestRateLimiterInterface.php | 30 - .../http-foundation/RedirectResponse.php | 92 - .../symfony/http-foundation/Request.php | 2267 ------------- .../AttributesRequestMatcher.php | 45 - .../ExpressionRequestMatcher.php | 43 - .../RequestMatcher/HeaderRequestMatcher.php | 52 - .../RequestMatcher/HostRequestMatcher.php | 32 - .../RequestMatcher/IpsRequestMatcher.php | 44 - .../RequestMatcher/IsJsonRequestMatcher.php | 28 - .../RequestMatcher/MethodRequestMatcher.php | 46 - .../RequestMatcher/PathRequestMatcher.php | 32 - .../RequestMatcher/PortRequestMatcher.php | 32 - .../QueryParameterRequestMatcher.php | 46 - .../RequestMatcher/SchemeRequestMatcher.php | 46 - .../RequestMatcherInterface.php | 25 - .../symfony/http-foundation/RequestStack.php | 124 - .../symfony/http-foundation/Response.php | 1323 -------- .../http-foundation/ResponseHeaderBag.php | 271 -- .../symfony/http-foundation/ServerBag.php | 97 - .../symfony/http-foundation/ServerEvent.php | 145 - .../Session/Attribute/AttributeBag.php | 117 - .../Attribute/AttributeBagInterface.php | 53 - .../Session/Flash/AutoExpireFlashBag.php | 121 - .../Session/Flash/FlashBag.php | 112 - .../Session/Flash/FlashBagInterface.php | 72 - .../Session/FlashBagAwareSessionInterface.php | 22 - .../http-foundation/Session/Session.php | 223 -- .../Session/SessionBagInterface.php | 42 - .../Session/SessionBagProxy.php | 86 - .../Session/SessionFactory.php | 39 - .../Session/SessionFactoryInterface.php | 20 - .../Session/SessionInterface.php | 140 - .../http-foundation/Session/SessionUtils.php | 59 - .../Handler/AbstractSessionHandler.php | 121 - .../Storage/Handler/IdentityMarshaller.php | 36 - .../Handler/MarshallingSessionHandler.php | 73 - .../Handler/MemcachedSessionHandler.php | 110 - .../Handler/MigratingSessionHandler.php | 100 - .../Storage/Handler/MongoDbSessionHandler.php | 186 -- .../Handler/NativeFileSessionHandler.php | 55 - .../Storage/Handler/NullSessionHandler.php | 55 - .../Storage/Handler/PdoSessionHandler.php | 923 ------ .../Storage/Handler/RedisSessionHandler.php | 103 - .../Storage/Handler/SessionHandlerFactory.php | 98 - .../Storage/Handler/StrictSessionHandler.php | 87 - .../Session/Storage/MetadataBag.php | 133 - .../Storage/MockArraySessionStorage.php | 188 -- .../Storage/MockFileSessionStorage.php | 149 - .../Storage/MockFileSessionStorageFactory.php | 38 - .../Session/Storage/NativeSessionStorage.php | 408 --- .../Storage/NativeSessionStorageFactory.php | 45 - .../Storage/PhpBridgeSessionStorage.php | 55 - .../PhpBridgeSessionStorageFactory.php | 41 - .../Session/Storage/Proxy/AbstractProxy.php | 98 - .../Storage/Proxy/SessionHandlerProxy.php | 74 - .../SessionStorageFactoryInterface.php | 25 - .../Storage/SessionStorageInterface.php | 116 - .../http-foundation/StreamedJsonResponse.php | 162 - .../http-foundation/StreamedResponse.php | 150 - .../Constraint/RequestAttributeValueSame.php | 45 - .../Constraint/ResponseCookieValueSame.php | 70 - .../Test/Constraint/ResponseFormatSame.php | 60 - .../Test/Constraint/ResponseHasCookie.php | 64 - .../Test/Constraint/ResponseHasHeader.php | 44 - .../Constraint/ResponseHeaderLocationSame.php | 65 - .../Test/Constraint/ResponseHeaderSame.php | 45 - .../Test/Constraint/ResponseIsRedirected.php | 54 - .../Test/Constraint/ResponseIsSuccessful.php | 54 - .../Constraint/ResponseIsUnprocessable.php | 54 - .../Constraint/ResponseStatusCodeSame.php | 53 - .../symfony/http-foundation/UriSigner.php | 216 -- .../symfony/http-foundation/UrlHelper.php | 108 - .../symfony/http-foundation/composer.json | 45 - .../voku/portable-ascii/.deepsource.toml | 4 - .../vendor/voku/portable-ascii/CHANGELOG.md | 224 -- .../vendor/voku/portable-ascii/LICENSE.txt | 19 - plugins/vendor/voku/portable-ascii/README.md | 451 --- .../vendor/voku/portable-ascii/composer.json | 37 - .../portable-ascii/src/voku/helper/ASCII.php | 1679 ---------- .../voku/helper/data/ascii_by_languages.php | 2950 ----------------- .../helper/data/ascii_extras_by_languages.php | 759 ----- .../helper/data/ascii_language_max_key.php | 65 - .../src/voku/helper/data/ascii_ord.php | 1 - .../src/voku/helper/data/x000.php | 16 - .../src/voku/helper/data/x001.php | 1 - .../src/voku/helper/data/x002.php | 1 - .../src/voku/helper/data/x003.php | 1 - .../src/voku/helper/data/x004.php | 1 - .../src/voku/helper/data/x005.php | 1 - .../src/voku/helper/data/x006.php | 1 - .../src/voku/helper/data/x007.php | 1 - .../src/voku/helper/data/x009.php | 1 - .../src/voku/helper/data/x00a.php | 1 - .../src/voku/helper/data/x00b.php | 1 - .../src/voku/helper/data/x00c.php | 1 - .../src/voku/helper/data/x00d.php | 1 - .../src/voku/helper/data/x00e.php | 1 - .../src/voku/helper/data/x00f.php | 1 - .../src/voku/helper/data/x010.php | 1 - .../src/voku/helper/data/x011.php | 1 - .../src/voku/helper/data/x012.php | 1 - .../src/voku/helper/data/x013.php | 1 - .../src/voku/helper/data/x014.php | 1 - .../src/voku/helper/data/x015.php | 1 - .../src/voku/helper/data/x016.php | 1 - .../src/voku/helper/data/x017.php | 1 - .../src/voku/helper/data/x018.php | 1 - .../src/voku/helper/data/x01d.php | 1 - .../src/voku/helper/data/x01e.php | 1 - .../src/voku/helper/data/x01f.php | 1 - .../src/voku/helper/data/x020.php | 4 - .../src/voku/helper/data/x021.php | 1 - .../src/voku/helper/data/x022.php | 1 - .../src/voku/helper/data/x023.php | 1 - .../src/voku/helper/data/x024.php | 1 - .../src/voku/helper/data/x025.php | 1 - .../src/voku/helper/data/x026.php | 1 - .../src/voku/helper/data/x027.php | 1 - .../src/voku/helper/data/x028.php | 1 - .../src/voku/helper/data/x029.php | 1 - .../src/voku/helper/data/x02a.php | 1 - .../src/voku/helper/data/x02c.php | 1 - .../src/voku/helper/data/x02e.php | 1 - .../src/voku/helper/data/x02f.php | 1 - .../src/voku/helper/data/x030.php | 9 - .../src/voku/helper/data/x031.php | 1 - .../src/voku/helper/data/x032.php | 1 - .../src/voku/helper/data/x033.php | 1 - .../src/voku/helper/data/x04d.php | 1 - .../src/voku/helper/data/x04e.php | 1 - .../src/voku/helper/data/x04f.php | 1 - .../src/voku/helper/data/x050.php | 1 - .../src/voku/helper/data/x051.php | 1 - .../src/voku/helper/data/x052.php | 1 - .../src/voku/helper/data/x053.php | 1 - .../src/voku/helper/data/x054.php | 1 - .../src/voku/helper/data/x055.php | 1 - .../src/voku/helper/data/x056.php | 1 - .../src/voku/helper/data/x057.php | 1 - .../src/voku/helper/data/x058.php | 1 - .../src/voku/helper/data/x059.php | 1 - .../src/voku/helper/data/x05a.php | 1 - .../src/voku/helper/data/x05b.php | 1 - .../src/voku/helper/data/x05c.php | 1 - .../src/voku/helper/data/x05d.php | 1 - .../src/voku/helper/data/x05e.php | 1 - .../src/voku/helper/data/x05f.php | 1 - .../src/voku/helper/data/x060.php | 1 - .../src/voku/helper/data/x061.php | 1 - .../src/voku/helper/data/x062.php | 1 - .../src/voku/helper/data/x063.php | 1 - .../src/voku/helper/data/x064.php | 1 - .../src/voku/helper/data/x065.php | 1 - .../src/voku/helper/data/x066.php | 1 - .../src/voku/helper/data/x067.php | 1 - .../src/voku/helper/data/x068.php | 1 - .../src/voku/helper/data/x069.php | 1 - .../src/voku/helper/data/x06a.php | 1 - .../src/voku/helper/data/x06b.php | 1 - .../src/voku/helper/data/x06c.php | 1 - .../src/voku/helper/data/x06d.php | 1 - .../src/voku/helper/data/x06e.php | 1 - .../src/voku/helper/data/x06f.php | 1 - .../src/voku/helper/data/x070.php | 1 - .../src/voku/helper/data/x071.php | 1 - .../src/voku/helper/data/x072.php | 1 - .../src/voku/helper/data/x073.php | 1 - .../src/voku/helper/data/x074.php | 1 - .../src/voku/helper/data/x075.php | 1 - .../src/voku/helper/data/x076.php | 1 - .../src/voku/helper/data/x077.php | 1 - .../src/voku/helper/data/x078.php | 1 - .../src/voku/helper/data/x079.php | 1 - .../src/voku/helper/data/x07a.php | 1 - .../src/voku/helper/data/x07b.php | 1 - .../src/voku/helper/data/x07c.php | 1 - .../src/voku/helper/data/x07d.php | 1 - .../src/voku/helper/data/x07e.php | 1 - .../src/voku/helper/data/x07f.php | 1 - .../src/voku/helper/data/x080.php | 1 - .../src/voku/helper/data/x081.php | 1 - .../src/voku/helper/data/x082.php | 1 - .../src/voku/helper/data/x083.php | 1 - .../src/voku/helper/data/x084.php | 1 - .../src/voku/helper/data/x085.php | 1 - .../src/voku/helper/data/x086.php | 1 - .../src/voku/helper/data/x087.php | 1 - .../src/voku/helper/data/x088.php | 1 - .../src/voku/helper/data/x089.php | 1 - .../src/voku/helper/data/x08a.php | 1 - .../src/voku/helper/data/x08b.php | 1 - .../src/voku/helper/data/x08c.php | 1 - .../src/voku/helper/data/x08d.php | 1 - .../src/voku/helper/data/x08e.php | 1 - .../src/voku/helper/data/x08f.php | 1 - .../src/voku/helper/data/x090.php | 1 - .../src/voku/helper/data/x091.php | 1 - .../src/voku/helper/data/x092.php | 1 - .../src/voku/helper/data/x093.php | 1 - .../src/voku/helper/data/x094.php | 1 - .../src/voku/helper/data/x095.php | 1 - .../src/voku/helper/data/x096.php | 1 - .../src/voku/helper/data/x097.php | 1 - .../src/voku/helper/data/x098.php | 1 - .../src/voku/helper/data/x099.php | 1 - .../src/voku/helper/data/x09a.php | 1 - .../src/voku/helper/data/x09b.php | 1 - .../src/voku/helper/data/x09c.php | 1 - .../src/voku/helper/data/x09d.php | 1 - .../src/voku/helper/data/x09e.php | 1 - .../src/voku/helper/data/x09f.php | 1 - .../src/voku/helper/data/x0a0.php | 1 - .../src/voku/helper/data/x0a1.php | 1 - .../src/voku/helper/data/x0a2.php | 1 - .../src/voku/helper/data/x0a3.php | 1 - .../src/voku/helper/data/x0a4.php | 1 - .../src/voku/helper/data/x0ac.php | 1 - .../src/voku/helper/data/x0ad.php | 1 - .../src/voku/helper/data/x0ae.php | 1 - .../src/voku/helper/data/x0af.php | 1 - .../src/voku/helper/data/x0b0.php | 1 - .../src/voku/helper/data/x0b1.php | 1 - .../src/voku/helper/data/x0b2.php | 1 - .../src/voku/helper/data/x0b3.php | 1 - .../src/voku/helper/data/x0b4.php | 1 - .../src/voku/helper/data/x0b5.php | 1 - .../src/voku/helper/data/x0b6.php | 1 - .../src/voku/helper/data/x0b7.php | 1 - .../src/voku/helper/data/x0b8.php | 1 - .../src/voku/helper/data/x0b9.php | 1 - .../src/voku/helper/data/x0ba.php | 1 - .../src/voku/helper/data/x0bb.php | 1 - .../src/voku/helper/data/x0bc.php | 1 - .../src/voku/helper/data/x0bd.php | 1 - .../src/voku/helper/data/x0be.php | 1 - .../src/voku/helper/data/x0bf.php | 1 - .../src/voku/helper/data/x0c0.php | 1 - .../src/voku/helper/data/x0c1.php | 1 - .../src/voku/helper/data/x0c2.php | 1 - .../src/voku/helper/data/x0c3.php | 1 - .../src/voku/helper/data/x0c4.php | 1 - .../src/voku/helper/data/x0c5.php | 1 - .../src/voku/helper/data/x0c6.php | 1 - .../src/voku/helper/data/x0c7.php | 1 - .../src/voku/helper/data/x0c8.php | 1 - .../src/voku/helper/data/x0c9.php | 1 - .../src/voku/helper/data/x0ca.php | 1 - .../src/voku/helper/data/x0cb.php | 1 - .../src/voku/helper/data/x0cc.php | 1 - .../src/voku/helper/data/x0cd.php | 1 - .../src/voku/helper/data/x0ce.php | 1 - .../src/voku/helper/data/x0cf.php | 1 - .../src/voku/helper/data/x0d0.php | 1 - .../src/voku/helper/data/x0d1.php | 1 - .../src/voku/helper/data/x0d2.php | 1 - .../src/voku/helper/data/x0d3.php | 1 - .../src/voku/helper/data/x0d4.php | 1 - .../src/voku/helper/data/x0d5.php | 1 - .../src/voku/helper/data/x0d6.php | 1 - .../src/voku/helper/data/x0d7.php | 1 - .../src/voku/helper/data/x0f9.php | 1 - .../src/voku/helper/data/x0fa.php | 1 - .../src/voku/helper/data/x0fb.php | 1 - .../src/voku/helper/data/x0fc.php | 1 - .../src/voku/helper/data/x0fd.php | 1 - .../src/voku/helper/data/x0fe.php | 1 - .../src/voku/helper/data/x0ff.php | 1 - .../src/voku/helper/data/x1d4.php | 1 - .../src/voku/helper/data/x1d5.php | 4 - .../src/voku/helper/data/x1d6.php | 1 - .../src/voku/helper/data/x1d7.php | 1 - .../src/voku/helper/data/x1f1.php | 2 - .../webklex/php-imap/.github/FUNDING.yml | 2 - .../.github/ISSUE_TEMPLATE/bug_report.md | 32 - .../.github/ISSUE_TEMPLATE/feature_request.md | 17 - .../ISSUE_TEMPLATE/general-help-request.md | 12 - .../php-imap/.github/docker/Dockerfile | 23 - .../php-imap/.github/docker/dovecot_setup.sh | 63 - .../php-imap/.github/workflows/tests.yaml | 50 - plugins/vendor/webklex/php-imap/.gitignore | 7 - plugins/vendor/webklex/php-imap/CHANGELOG.md | 964 ------ .../webklex/php-imap/CODE_OF_CONDUCT.md | 46 - plugins/vendor/webklex/php-imap/LICENSE | 21 - plugins/vendor/webklex/php-imap/LICENSE.md | 21 - plugins/vendor/webklex/php-imap/README.md | 245 -- plugins/vendor/webklex/php-imap/_config.yml | 1 - plugins/vendor/webklex/php-imap/composer.json | 61 - .../examples/custom_attachment_mask.php | 57 - .../php-imap/examples/custom_message_mask.php | 51 - .../examples/folder_structure.blade.php | 42 - .../php-imap/examples/message_table.blade.php | 46 - .../vendor/webklex/php-imap/phpunit.xml.dist | 35 - .../vendor/webklex/php-imap/src/Address.php | 108 - .../webklex/php-imap/src/Attachment.php | 515 --- .../vendor/webklex/php-imap/src/Attribute.php | 325 -- .../vendor/webklex/php-imap/src/Client.php | 969 ------ .../webklex/php-imap/src/ClientManager.php | 131 - .../vendor/webklex/php-imap/src/Config.php | 295 -- .../src/Connection/Protocols/ImapProtocol.php | 1485 --------- .../Connection/Protocols/LegacyProtocol.php | 825 ----- .../src/Connection/Protocols/Protocol.php | 417 --- .../Protocols/ProtocolInterface.php | 458 --- .../src/Connection/Protocols/Response.php | 417 --- .../src/Decoder/AttachmentDecoder.php | 25 - .../webklex/php-imap/src/Decoder/Decoder.php | 161 - .../php-imap/src/Decoder/DecoderInterface.php | 52 - .../php-imap/src/Decoder/HeaderDecoder.php | 98 - .../php-imap/src/Decoder/MessageDecoder.php | 119 - .../webklex/php-imap/src/EncodingAliases.php | 591 ---- .../webklex/php-imap/src/Events/Event.php | 28 - .../php-imap/src/Events/FlagDeletedEvent.php | 22 - .../php-imap/src/Events/FlagNewEvent.php | 40 - .../src/Events/FolderDeletedEvent.php | 22 - .../php-imap/src/Events/FolderMovedEvent.php | 40 - .../php-imap/src/Events/FolderNewEvent.php | 36 - .../src/Events/MessageCopiedEvent.php | 22 - .../src/Events/MessageDeletedEvent.php | 22 - .../php-imap/src/Events/MessageMovedEvent.php | 40 - .../php-imap/src/Events/MessageNewEvent.php | 36 - .../src/Events/MessageRestoredEvent.php | 22 - .../src/Exceptions/AuthFailedException.php | 24 - .../Exceptions/ConnectionFailedException.php | 24 - .../Exceptions/DecoderNotFoundException.php | 24 - .../src/Exceptions/EventNotFoundException.php | 24 - .../Exceptions/FolderFetchingException.php | 24 - .../Exceptions/GetMessagesFailedException.php | 24 - .../Exceptions/ImapBadRequestException.php | 24 - .../Exceptions/ImapServerErrorException.php | 24 - .../InvalidMessageDateException.php | 24 - .../InvalidWhereQueryCriteriaException.php | 24 - .../src/Exceptions/MaskNotFoundException.php | 24 - .../MessageContentFetchingException.php | 24 - .../src/Exceptions/MessageFlagException.php | 24 - .../MessageHeaderFetchingException.php | 24 - .../Exceptions/MessageNotFoundException.php | 24 - .../MessageSearchValidationException.php | 24 - .../MessageSizeFetchingException.php | 24 - .../Exceptions/MethodNotFoundException.php | 24 - .../MethodNotSupportedException.php | 24 - .../NotSupportedCapabilityException.php | 24 - .../ProtocolNotSupportedException.php | 24 - .../src/Exceptions/ResponseException.php | 91 - .../src/Exceptions/RuntimeException.php | 24 - .../SpoofingAttemptDetectedException.php | 24 - .../vendor/webklex/php-imap/src/Folder.php | 597 ---- .../vendor/webklex/php-imap/src/Header.php | 871 ----- plugins/vendor/webklex/php-imap/src/IMAP.php | 375 --- .../vendor/webklex/php-imap/src/Message.php | 1674 ---------- plugins/vendor/webklex/php-imap/src/Part.php | 324 -- .../webklex/php-imap/src/Query/Query.php | 1103 ------ .../webklex/php-imap/src/Query/WhereQuery.php | 555 ---- .../vendor/webklex/php-imap/src/Structure.php | 172 - .../src/Support/AttachmentCollection.php | 26 - .../php-imap/src/Support/FlagCollection.php | 25 - .../php-imap/src/Support/FolderCollection.php | 26 - .../src/Support/Masks/AttachmentMask.php | 45 - .../php-imap/src/Support/Masks/Mask.php | 137 - .../src/Support/Masks/MessageMask.php | 87 - .../src/Support/MessageCollection.php | 26 - .../src/Support/PaginatedCollection.php | 82 - .../webklex/php-imap/src/Traits/HasEvents.php | 86 - .../webklex/php-imap/src/config/imap.php | 274 -- .../webklex/php-imap/tests/AddressTest.php | 72 - .../webklex/php-imap/tests/AttachmentTest.php | 37 - .../webklex/php-imap/tests/AttributeTest.php | 75 - .../php-imap/tests/ClientManagerTest.php | 94 - .../webklex/php-imap/tests/ClientTest.php | 348 -- .../webklex/php-imap/tests/HeaderTest.php | 204 -- .../php-imap/tests/ImapProtocolTest.php | 64 - .../webklex/php-imap/tests/MessageTest.php | 302 -- .../webklex/php-imap/tests/PartTest.php | 107 - .../webklex/php-imap/tests/StructureTest.php | 68 - .../AttachmentEncodedFilenameTest.php | 52 - .../fixtures/AttachmentLongFilenameTest.php | 79 - .../fixtures/AttachmentNoDispositionTest.php | 55 - .../php-imap/tests/fixtures/BccTest.php | 49 - .../fixtures/BooleanDecodedContentTest.php | 55 - .../tests/fixtures/DateTemplateTest.php | 116 - .../tests/fixtures/EmailAddressTest.php | 59 - .../tests/fixtures/EmbeddedEmailTest.php | 63 - ...lWithoutContentDispositionEmbeddedTest.php | 74 - ...ddedEmailWithoutContentDispositionTest.php | 97 - .../tests/fixtures/ExampleBounceTest.php | 103 - .../tests/fixtures/FixtureTestCase.php | 94 - .../tests/fixtures/FourNestedEmailsTest.php | 55 - .../tests/fixtures/GbkCharsetTest.php | 37 - .../php-imap/tests/fixtures/HtmlOnlyTest.php | 37 - .../ImapMimeHeaderDecodeReturnsFalseTest.php | 37 - .../tests/fixtures/InlineAttachmentTest.php | 62 - .../tests/fixtures/KsC56011987HeadersTest.php | 46 - .../fixtures/MailThatIsAttachmentTest.php | 63 - .../tests/fixtures/MissingDateTest.php | 37 - .../tests/fixtures/MissingFromTest.php | 37 - .../tests/fixtures/MixedFilenameTest.php | 61 - .../fixtures/MultipartWithoutBodyTest.php | 62 - .../MultipleHtmlPartsAndAttachmentsTest.php | 76 - .../MultipleNestedAttachmentsTest.php | 69 - .../NestesEmbeddedWithAttachmentTest.php | 69 - .../tests/fixtures/NullContentCharsetTest.php | 39 - .../php-imap/tests/fixtures/PecTest.php | 82 - .../php-imap/tests/fixtures/PlainOnlyTest.php | 37 - .../fixtures/PlainTextAttachmentTest.php | 54 - .../tests/fixtures/ReferencesTest.php | 54 - .../tests/fixtures/SimpleMultipartTest.php | 37 - .../fixtures/StructuredWithAttachmentTest.php | 55 - .../fixtures/UndefinedCharsetHeaderTest.php | 64 - .../UndisclosedRecipientsMinusTest.php | 42 - .../UndisclosedRecipientsSpaceTest.php | 42 - .../fixtures/UndisclosedRecipientsTest.php | 42 - .../tests/fixtures/UnknownEncodingTest.php | 37 - .../fixtures/WithoutCharsetPlainOnlyTest.php | 37 - .../WithoutCharsetSimpleMultipartTest.php | 37 - .../php-imap/tests/issues/Issue275Test.php | 38 - .../php-imap/tests/issues/Issue355Test.php | 30 - .../php-imap/tests/issues/Issue379Test.php | 61 - .../php-imap/tests/issues/Issue382Test.php | 33 - .../php-imap/tests/issues/Issue383Test.php | 69 - .../php-imap/tests/issues/Issue393Test.php | 62 - .../php-imap/tests/issues/Issue401Test.php | 27 - .../php-imap/tests/issues/Issue407Test.php | 57 - .../php-imap/tests/issues/Issue40Test.php | 74 - .../php-imap/tests/issues/Issue410Test.php | 111 - .../php-imap/tests/issues/Issue412Test.php | 31 - .../php-imap/tests/issues/Issue413Test.php | 82 - .../php-imap/tests/issues/Issue414Test.php | 43 - .../php-imap/tests/issues/Issue420Test.php | 31 - .../php-imap/tests/issues/Issue462Test.php | 48 - .../php-imap/tests/issues/Issue469Test.php | 42 - .../php-imap/tests/issues/Issue511Test.php | 50 - .../php-imap/tests/issues/Issue544Test.php | 61 - .../php-imap/tests/live/ClientTest.php | 318 -- .../php-imap/tests/live/FolderTest.php | 447 --- .../php-imap/tests/live/LegacyTest.php | 475 --- .../tests/live/LiveMailboxTestCase.php | 220 -- .../php-imap/tests/live/MessageTest.php | 2410 -------------- .../webklex/php-imap/tests/live/QueryTest.php | 283 -- .../tests/messages/1366671050@github.com.eml | 108 - .../messages/attachment_encoded_filename.eml | 10 - .../messages/attachment_long_filename.eml | 55 - .../messages/attachment_no_disposition.eml | 9 - .../webklex/php-imap/tests/messages/bcc.eml | 12 - .../messages/boolean_decoded_content.eml | 31 - .../php-imap/tests/messages/date-template.eml | 8 - .../php-imap/tests/messages/email_address.eml | 9 - .../tests/messages/embedded_email.eml | 63 - ...l_without_content_disposition-embedded.eml | 61 - ...dded_email_without_content_disposition.eml | 141 - .../tests/messages/example_attachment.eml | 56 - .../tests/messages/example_bounce.eml | 96 - .../tests/messages/four_nested_emails.eml | 69 - .../php-imap/tests/messages/gbk_charset.eml | 9 - .../php-imap/tests/messages/html_only.eml | 9 - .../imap_mime_header_decode_returns_false.eml | 9 - .../tests/messages/inline_attachment.eml | 41 - .../php-imap/tests/messages/issue-275-2.eml | 123 - .../php-imap/tests/messages/issue-275.eml | 208 -- .../php-imap/tests/messages/issue-348.eml | 1261 ------- .../php-imap/tests/messages/issue-382.eml | 9 - .../php-imap/tests/messages/issue-40.eml | 39 - .../php-imap/tests/messages/issue-401.eml | 9 - .../php-imap/tests/messages/issue-410.eml | 16 - .../php-imap/tests/messages/issue-410b.eml | 22 - .../tests/messages/issue-410symbols.eml | 22 - .../php-imap/tests/messages/issue-412.eml | 216 -- .../php-imap/tests/messages/issue-413.eml | 32 - .../php-imap/tests/messages/issue-414.eml | 27 - .../php-imap/tests/messages/issue-462.eml | 5 - .../php-imap/tests/messages/issue-511.eml | 5 - .../php-imap/tests/messages/issue-544.eml | 220 -- .../tests/messages/ks_c_5601-1987_headers.eml | 10 - .../messages/mail_that_is_attachment.eml | 28 - .../php-imap/tests/messages/missing_date.eml | 7 - .../php-imap/tests/messages/missing_from.eml | 7 - .../tests/messages/mixed_filename.eml | 25 - .../tests/messages/multipart_without_body.eml | 110 - .../multiple_html_parts_and_attachments.eml | 203 -- .../messages/multiple_nested_attachments.eml | 84 - .../nestes_embedded_with_attachment.eml | 145 - .../tests/messages/null_content_charset.eml | 8 - .../webklex/php-imap/tests/messages/pec.eml | 65 - .../webklex/php-imap/tests/messages/plain.eml | 9 - .../php-imap/tests/messages/plain_only.eml | 9 - .../tests/messages/plain_text_attachment.eml | 21 - .../php-imap/tests/messages/references.eml | 11 - .../tests/messages/simple_multipart.eml | 23 - .../messages/structured_with_attachment.eml | 24 - .../tests/messages/thread_my_topic.eml | 10 - .../tests/messages/thread_re_my_topic.eml | 11 - .../tests/messages/thread_unrelated.eml | 10 - .../messages/undefined_charset_header.eml | 20 - .../tests/messages/undisclosed_recipients.eml | 8 - .../messages/undisclosed_recipients_minus.eml | 8 - .../messages/undisclosed_recipients_space.eml | 8 - .../tests/messages/unknown_encoding.eml | 24 - .../messages/without_charset_plain_only.eml | 8 - .../without_charset_simple_multipart.eml | 23 - .../mail-mime-parser/src/ErrorBag.php | 8 + .../src/Header/Part/MimeToken.php | 3 +- .../src/Header/Part/ParameterPart.php | 8 +- .../src/Message/Helper/MultipartHelper.php | 5 +- .../src/Message/PartChildrenContainer.php | 17 +- .../src/Message/PartHeaderContainer.php | 1 + .../src/Parser/HeaderParserService.php | 22 + .../src/Parser/MimeParserService.php | 31 +- .../mail-mime-parser/src/di_config.php | 18 + .../zbateson/mail-mime-parser/version.txt | 2 +- 779 files changed, 6408 insertions(+), 82971 deletions(-) delete mode 100644 cron/legacy_ticket_email_parser.php delete mode 100644 plugins/vendor/doctrine/inflector/LICENSE delete mode 100644 plugins/vendor/doctrine/inflector/README.md delete mode 100644 plugins/vendor/doctrine/inflector/composer.json delete mode 100644 plugins/vendor/doctrine/inflector/docs/en/index.rst delete mode 100644 plugins/vendor/doctrine/inflector/src/CachedWordInflector.php delete mode 100644 plugins/vendor/doctrine/inflector/src/GenericLanguageInflectorFactory.php delete mode 100644 plugins/vendor/doctrine/inflector/src/Inflector.php delete mode 100644 plugins/vendor/doctrine/inflector/src/InflectorFactory.php delete mode 100644 plugins/vendor/doctrine/inflector/src/Language.php delete mode 100644 plugins/vendor/doctrine/inflector/src/LanguageInflectorFactory.php delete mode 100644 plugins/vendor/doctrine/inflector/src/NoopWordInflector.php delete mode 100644 plugins/vendor/doctrine/inflector/src/Rules/English/Inflectible.php delete mode 100644 plugins/vendor/doctrine/inflector/src/Rules/English/InflectorFactory.php delete mode 100644 plugins/vendor/doctrine/inflector/src/Rules/English/Rules.php delete mode 100644 plugins/vendor/doctrine/inflector/src/Rules/English/Uninflected.php delete mode 100644 plugins/vendor/doctrine/inflector/src/Rules/Esperanto/Inflectible.php delete mode 100644 plugins/vendor/doctrine/inflector/src/Rules/Esperanto/InflectorFactory.php delete mode 100644 plugins/vendor/doctrine/inflector/src/Rules/Esperanto/Rules.php delete mode 100644 plugins/vendor/doctrine/inflector/src/Rules/Esperanto/Uninflected.php delete mode 100644 plugins/vendor/doctrine/inflector/src/Rules/French/Inflectible.php delete mode 100644 plugins/vendor/doctrine/inflector/src/Rules/French/InflectorFactory.php delete mode 100644 plugins/vendor/doctrine/inflector/src/Rules/French/Rules.php delete mode 100644 plugins/vendor/doctrine/inflector/src/Rules/French/Uninflected.php delete mode 100644 plugins/vendor/doctrine/inflector/src/Rules/Italian/Inflectible.php delete mode 100644 plugins/vendor/doctrine/inflector/src/Rules/Italian/InflectorFactory.php delete mode 100644 plugins/vendor/doctrine/inflector/src/Rules/Italian/Rules.php delete mode 100644 plugins/vendor/doctrine/inflector/src/Rules/Italian/Uninflected.php delete mode 100644 plugins/vendor/doctrine/inflector/src/Rules/NorwegianBokmal/Inflectible.php delete mode 100644 plugins/vendor/doctrine/inflector/src/Rules/NorwegianBokmal/InflectorFactory.php delete mode 100644 plugins/vendor/doctrine/inflector/src/Rules/NorwegianBokmal/Rules.php delete mode 100644 plugins/vendor/doctrine/inflector/src/Rules/NorwegianBokmal/Uninflected.php delete mode 100644 plugins/vendor/doctrine/inflector/src/Rules/Pattern.php delete mode 100644 plugins/vendor/doctrine/inflector/src/Rules/Patterns.php delete mode 100644 plugins/vendor/doctrine/inflector/src/Rules/Portuguese/Inflectible.php delete mode 100644 plugins/vendor/doctrine/inflector/src/Rules/Portuguese/InflectorFactory.php delete mode 100644 plugins/vendor/doctrine/inflector/src/Rules/Portuguese/Rules.php delete mode 100644 plugins/vendor/doctrine/inflector/src/Rules/Portuguese/Uninflected.php delete mode 100644 plugins/vendor/doctrine/inflector/src/Rules/Ruleset.php delete mode 100644 plugins/vendor/doctrine/inflector/src/Rules/Spanish/Inflectible.php delete mode 100644 plugins/vendor/doctrine/inflector/src/Rules/Spanish/InflectorFactory.php delete mode 100644 plugins/vendor/doctrine/inflector/src/Rules/Spanish/Rules.php delete mode 100644 plugins/vendor/doctrine/inflector/src/Rules/Spanish/Uninflected.php delete mode 100644 plugins/vendor/doctrine/inflector/src/Rules/Substitution.php delete mode 100644 plugins/vendor/doctrine/inflector/src/Rules/Substitutions.php delete mode 100644 plugins/vendor/doctrine/inflector/src/Rules/Transformation.php delete mode 100644 plugins/vendor/doctrine/inflector/src/Rules/Transformations.php delete mode 100644 plugins/vendor/doctrine/inflector/src/Rules/Turkish/Inflectible.php delete mode 100644 plugins/vendor/doctrine/inflector/src/Rules/Turkish/InflectorFactory.php delete mode 100644 plugins/vendor/doctrine/inflector/src/Rules/Turkish/Rules.php delete mode 100644 plugins/vendor/doctrine/inflector/src/Rules/Turkish/Uninflected.php delete mode 100644 plugins/vendor/doctrine/inflector/src/Rules/Word.php delete mode 100644 plugins/vendor/doctrine/inflector/src/RulesetInflector.php delete mode 100644 plugins/vendor/doctrine/inflector/src/WordInflector.php delete mode 100644 plugins/vendor/illuminate/pagination/AbstractCursorPaginator.php delete mode 100644 plugins/vendor/illuminate/pagination/AbstractPaginator.php delete mode 100644 plugins/vendor/illuminate/pagination/Cursor.php delete mode 100644 plugins/vendor/illuminate/pagination/CursorPaginator.php delete mode 100644 plugins/vendor/illuminate/pagination/LICENSE.md delete mode 100644 plugins/vendor/illuminate/pagination/LengthAwarePaginator.php delete mode 100755 plugins/vendor/illuminate/pagination/PaginationServiceProvider.php delete mode 100644 plugins/vendor/illuminate/pagination/PaginationState.php delete mode 100644 plugins/vendor/illuminate/pagination/Paginator.php delete mode 100644 plugins/vendor/illuminate/pagination/UrlWindow.php delete mode 100755 plugins/vendor/illuminate/pagination/composer.json delete mode 100644 plugins/vendor/illuminate/pagination/resources/views/bootstrap-4.blade.php delete mode 100644 plugins/vendor/illuminate/pagination/resources/views/bootstrap-5.blade.php delete mode 100644 plugins/vendor/illuminate/pagination/resources/views/default.blade.php delete mode 100644 plugins/vendor/illuminate/pagination/resources/views/semantic-ui.blade.php delete mode 100644 plugins/vendor/illuminate/pagination/resources/views/simple-bootstrap-4.blade.php delete mode 100644 plugins/vendor/illuminate/pagination/resources/views/simple-bootstrap-5.blade.php delete mode 100644 plugins/vendor/illuminate/pagination/resources/views/simple-default.blade.php delete mode 100644 plugins/vendor/illuminate/pagination/resources/views/simple-tailwind.blade.php delete mode 100644 plugins/vendor/illuminate/pagination/resources/views/tailwind.blade.php delete mode 100644 plugins/vendor/illuminate/reflection/LICENSE.md delete mode 100644 plugins/vendor/illuminate/reflection/Reflector.php delete mode 100644 plugins/vendor/illuminate/reflection/Traits/ReflectsClosures.php delete mode 100644 plugins/vendor/illuminate/reflection/composer.json delete mode 100644 plugins/vendor/illuminate/reflection/helpers.php delete mode 100644 plugins/vendor/illuminate/support/AggregateServiceProvider.php delete mode 100644 plugins/vendor/illuminate/support/Benchmark.php delete mode 100644 plugins/vendor/illuminate/support/BinaryCodec.php delete mode 100644 plugins/vendor/illuminate/support/Carbon.php delete mode 100644 plugins/vendor/illuminate/support/Composer.php delete mode 100644 plugins/vendor/illuminate/support/ConfigurationUrlParser.php delete mode 100644 plugins/vendor/illuminate/support/DateFactory.php delete mode 100644 plugins/vendor/illuminate/support/DefaultProviders.php delete mode 100644 plugins/vendor/illuminate/support/Defer/DeferredCallback.php delete mode 100644 plugins/vendor/illuminate/support/Defer/DeferredCallbackCollection.php delete mode 100644 plugins/vendor/illuminate/support/EncodedHtmlString.php delete mode 100644 plugins/vendor/illuminate/support/Env.php delete mode 100644 plugins/vendor/illuminate/support/Exceptions/MathException.php delete mode 100755 plugins/vendor/illuminate/support/Facades/App.php delete mode 100755 plugins/vendor/illuminate/support/Facades/Artisan.php delete mode 100755 plugins/vendor/illuminate/support/Facades/Auth.php delete mode 100755 plugins/vendor/illuminate/support/Facades/Blade.php delete mode 100644 plugins/vendor/illuminate/support/Facades/Broadcast.php delete mode 100644 plugins/vendor/illuminate/support/Facades/Bus.php delete mode 100755 plugins/vendor/illuminate/support/Facades/Cache.php delete mode 100644 plugins/vendor/illuminate/support/Facades/Concurrency.php delete mode 100755 plugins/vendor/illuminate/support/Facades/Config.php delete mode 100644 plugins/vendor/illuminate/support/Facades/Context.php delete mode 100755 plugins/vendor/illuminate/support/Facades/Cookie.php delete mode 100755 plugins/vendor/illuminate/support/Facades/Crypt.php delete mode 100644 plugins/vendor/illuminate/support/Facades/DB.php delete mode 100644 plugins/vendor/illuminate/support/Facades/Date.php delete mode 100755 plugins/vendor/illuminate/support/Facades/Event.php delete mode 100644 plugins/vendor/illuminate/support/Facades/Exceptions.php delete mode 100755 plugins/vendor/illuminate/support/Facades/Facade.php delete mode 100755 plugins/vendor/illuminate/support/Facades/File.php delete mode 100644 plugins/vendor/illuminate/support/Facades/Gate.php delete mode 100755 plugins/vendor/illuminate/support/Facades/Hash.php delete mode 100644 plugins/vendor/illuminate/support/Facades/Http.php delete mode 100755 plugins/vendor/illuminate/support/Facades/Lang.php delete mode 100755 plugins/vendor/illuminate/support/Facades/Log.php delete mode 100755 plugins/vendor/illuminate/support/Facades/Mail.php delete mode 100644 plugins/vendor/illuminate/support/Facades/MaintenanceMode.php delete mode 100644 plugins/vendor/illuminate/support/Facades/Notification.php delete mode 100644 plugins/vendor/illuminate/support/Facades/ParallelTesting.php delete mode 100755 plugins/vendor/illuminate/support/Facades/Password.php delete mode 100644 plugins/vendor/illuminate/support/Facades/Pipeline.php delete mode 100644 plugins/vendor/illuminate/support/Facades/Process.php delete mode 100755 plugins/vendor/illuminate/support/Facades/Queue.php delete mode 100644 plugins/vendor/illuminate/support/Facades/RateLimiter.php delete mode 100755 plugins/vendor/illuminate/support/Facades/Redirect.php delete mode 100755 plugins/vendor/illuminate/support/Facades/Redis.php delete mode 100755 plugins/vendor/illuminate/support/Facades/Request.php delete mode 100755 plugins/vendor/illuminate/support/Facades/Response.php delete mode 100755 plugins/vendor/illuminate/support/Facades/Route.php delete mode 100644 plugins/vendor/illuminate/support/Facades/Schedule.php delete mode 100755 plugins/vendor/illuminate/support/Facades/Schema.php delete mode 100755 plugins/vendor/illuminate/support/Facades/Session.php delete mode 100644 plugins/vendor/illuminate/support/Facades/Storage.php delete mode 100755 plugins/vendor/illuminate/support/Facades/URL.php delete mode 100755 plugins/vendor/illuminate/support/Facades/Validator.php delete mode 100755 plugins/vendor/illuminate/support/Facades/View.php delete mode 100644 plugins/vendor/illuminate/support/Facades/Vite.php delete mode 100755 plugins/vendor/illuminate/support/Fluent.php delete mode 100644 plugins/vendor/illuminate/support/HigherOrderTapProxy.php delete mode 100644 plugins/vendor/illuminate/support/HtmlString.php delete mode 100644 plugins/vendor/illuminate/support/InteractsWithTime.php delete mode 100644 plugins/vendor/illuminate/support/Js.php delete mode 100644 plugins/vendor/illuminate/support/LICENSE.md delete mode 100644 plugins/vendor/illuminate/support/Lottery.php delete mode 100755 plugins/vendor/illuminate/support/Manager.php delete mode 100755 plugins/vendor/illuminate/support/MessageBag.php delete mode 100644 plugins/vendor/illuminate/support/MultipleInstanceManager.php delete mode 100755 plugins/vendor/illuminate/support/NamespacedItemResolver.php delete mode 100644 plugins/vendor/illuminate/support/Number.php delete mode 100644 plugins/vendor/illuminate/support/Once.php delete mode 100644 plugins/vendor/illuminate/support/Onceable.php delete mode 100644 plugins/vendor/illuminate/support/Optional.php delete mode 100755 plugins/vendor/illuminate/support/Pluralizer.php delete mode 100644 plugins/vendor/illuminate/support/ProcessUtils.php delete mode 100755 plugins/vendor/illuminate/support/ServiceProvider.php delete mode 100644 plugins/vendor/illuminate/support/Sleep.php delete mode 100644 plugins/vendor/illuminate/support/Str.php delete mode 100644 plugins/vendor/illuminate/support/Stringable.php delete mode 100644 plugins/vendor/illuminate/support/Testing/Fakes/BatchFake.php delete mode 100644 plugins/vendor/illuminate/support/Testing/Fakes/BatchRepositoryFake.php delete mode 100644 plugins/vendor/illuminate/support/Testing/Fakes/BusFake.php delete mode 100644 plugins/vendor/illuminate/support/Testing/Fakes/ChainedBatchTruthTest.php delete mode 100644 plugins/vendor/illuminate/support/Testing/Fakes/EventFake.php delete mode 100644 plugins/vendor/illuminate/support/Testing/Fakes/ExceptionHandlerFake.php delete mode 100644 plugins/vendor/illuminate/support/Testing/Fakes/Fake.php delete mode 100644 plugins/vendor/illuminate/support/Testing/Fakes/MailFake.php delete mode 100644 plugins/vendor/illuminate/support/Testing/Fakes/NotificationFake.php delete mode 100644 plugins/vendor/illuminate/support/Testing/Fakes/PendingBatchFake.php delete mode 100644 plugins/vendor/illuminate/support/Testing/Fakes/PendingChainFake.php delete mode 100644 plugins/vendor/illuminate/support/Testing/Fakes/PendingMailFake.php delete mode 100644 plugins/vendor/illuminate/support/Testing/Fakes/QueueFake.php delete mode 100644 plugins/vendor/illuminate/support/Timebox.php delete mode 100644 plugins/vendor/illuminate/support/Traits/CapsuleManagerTrait.php delete mode 100644 plugins/vendor/illuminate/support/Traits/Dumpable.php delete mode 100644 plugins/vendor/illuminate/support/Traits/ForwardsCalls.php delete mode 100644 plugins/vendor/illuminate/support/Traits/InteractsWithData.php delete mode 100644 plugins/vendor/illuminate/support/Traits/Localizable.php delete mode 100644 plugins/vendor/illuminate/support/Traits/Tappable.php delete mode 100644 plugins/vendor/illuminate/support/Uri.php delete mode 100644 plugins/vendor/illuminate/support/UriQueryString.php delete mode 100644 plugins/vendor/illuminate/support/ValidatedInput.php delete mode 100644 plugins/vendor/illuminate/support/ViewErrorBag.php delete mode 100644 plugins/vendor/illuminate/support/composer.json delete mode 100644 plugins/vendor/illuminate/support/functions.php delete mode 100644 plugins/vendor/illuminate/support/helpers.php create mode 100644 plugins/vendor/nesbot/carbon/SECURITY.md create mode 100644 plugins/vendor/nesbot/carbon/src/Carbon/OverflowMode.php delete mode 100644 plugins/vendor/symfony/http-foundation/AcceptHeader.php delete mode 100644 plugins/vendor/symfony/http-foundation/AcceptHeaderItem.php delete mode 100644 plugins/vendor/symfony/http-foundation/BinaryFileResponse.php delete mode 100644 plugins/vendor/symfony/http-foundation/CHANGELOG.md delete mode 100644 plugins/vendor/symfony/http-foundation/ChainRequestMatcher.php delete mode 100644 plugins/vendor/symfony/http-foundation/Cookie.php delete mode 100644 plugins/vendor/symfony/http-foundation/EventStreamResponse.php delete mode 100644 plugins/vendor/symfony/http-foundation/Exception/BadRequestException.php delete mode 100644 plugins/vendor/symfony/http-foundation/Exception/ConflictingHeadersException.php delete mode 100644 plugins/vendor/symfony/http-foundation/Exception/ExceptionInterface.php delete mode 100644 plugins/vendor/symfony/http-foundation/Exception/ExpiredSignedUriException.php delete mode 100644 plugins/vendor/symfony/http-foundation/Exception/JsonException.php delete mode 100644 plugins/vendor/symfony/http-foundation/Exception/LogicException.php delete mode 100644 plugins/vendor/symfony/http-foundation/Exception/RequestExceptionInterface.php delete mode 100644 plugins/vendor/symfony/http-foundation/Exception/SessionNotFoundException.php delete mode 100644 plugins/vendor/symfony/http-foundation/Exception/SignedUriException.php delete mode 100644 plugins/vendor/symfony/http-foundation/Exception/SuspiciousOperationException.php delete mode 100644 plugins/vendor/symfony/http-foundation/Exception/UnexpectedValueException.php delete mode 100644 plugins/vendor/symfony/http-foundation/Exception/UnsignedUriException.php delete mode 100644 plugins/vendor/symfony/http-foundation/Exception/UnverifiedSignedUriException.php delete mode 100644 plugins/vendor/symfony/http-foundation/File/Exception/AccessDeniedException.php delete mode 100644 plugins/vendor/symfony/http-foundation/File/Exception/CannotWriteFileException.php delete mode 100644 plugins/vendor/symfony/http-foundation/File/Exception/ExtensionFileException.php delete mode 100644 plugins/vendor/symfony/http-foundation/File/Exception/FileException.php delete mode 100644 plugins/vendor/symfony/http-foundation/File/Exception/FileNotFoundException.php delete mode 100644 plugins/vendor/symfony/http-foundation/File/Exception/FormSizeFileException.php delete mode 100644 plugins/vendor/symfony/http-foundation/File/Exception/IniSizeFileException.php delete mode 100644 plugins/vendor/symfony/http-foundation/File/Exception/NoFileException.php delete mode 100644 plugins/vendor/symfony/http-foundation/File/Exception/NoTmpDirFileException.php delete mode 100644 plugins/vendor/symfony/http-foundation/File/Exception/PartialFileException.php delete mode 100644 plugins/vendor/symfony/http-foundation/File/Exception/UnexpectedTypeException.php delete mode 100644 plugins/vendor/symfony/http-foundation/File/Exception/UploadException.php delete mode 100644 plugins/vendor/symfony/http-foundation/File/File.php delete mode 100644 plugins/vendor/symfony/http-foundation/File/Stream.php delete mode 100644 plugins/vendor/symfony/http-foundation/File/UploadedFile.php delete mode 100644 plugins/vendor/symfony/http-foundation/FileBag.php delete mode 100644 plugins/vendor/symfony/http-foundation/HeaderBag.php delete mode 100644 plugins/vendor/symfony/http-foundation/HeaderUtils.php delete mode 100644 plugins/vendor/symfony/http-foundation/InputBag.php delete mode 100644 plugins/vendor/symfony/http-foundation/IpUtils.php delete mode 100644 plugins/vendor/symfony/http-foundation/JsonResponse.php delete mode 100644 plugins/vendor/symfony/http-foundation/LICENSE delete mode 100644 plugins/vendor/symfony/http-foundation/ParameterBag.php delete mode 100644 plugins/vendor/symfony/http-foundation/README.md delete mode 100644 plugins/vendor/symfony/http-foundation/RateLimiter/AbstractRequestRateLimiter.php delete mode 100644 plugins/vendor/symfony/http-foundation/RateLimiter/PeekableRequestRateLimiterInterface.php delete mode 100644 plugins/vendor/symfony/http-foundation/RateLimiter/RequestRateLimiterInterface.php delete mode 100644 plugins/vendor/symfony/http-foundation/RedirectResponse.php delete mode 100644 plugins/vendor/symfony/http-foundation/Request.php delete mode 100644 plugins/vendor/symfony/http-foundation/RequestMatcher/AttributesRequestMatcher.php delete mode 100644 plugins/vendor/symfony/http-foundation/RequestMatcher/ExpressionRequestMatcher.php delete mode 100644 plugins/vendor/symfony/http-foundation/RequestMatcher/HeaderRequestMatcher.php delete mode 100644 plugins/vendor/symfony/http-foundation/RequestMatcher/HostRequestMatcher.php delete mode 100644 plugins/vendor/symfony/http-foundation/RequestMatcher/IpsRequestMatcher.php delete mode 100644 plugins/vendor/symfony/http-foundation/RequestMatcher/IsJsonRequestMatcher.php delete mode 100644 plugins/vendor/symfony/http-foundation/RequestMatcher/MethodRequestMatcher.php delete mode 100644 plugins/vendor/symfony/http-foundation/RequestMatcher/PathRequestMatcher.php delete mode 100644 plugins/vendor/symfony/http-foundation/RequestMatcher/PortRequestMatcher.php delete mode 100644 plugins/vendor/symfony/http-foundation/RequestMatcher/QueryParameterRequestMatcher.php delete mode 100644 plugins/vendor/symfony/http-foundation/RequestMatcher/SchemeRequestMatcher.php delete mode 100644 plugins/vendor/symfony/http-foundation/RequestMatcherInterface.php delete mode 100644 plugins/vendor/symfony/http-foundation/RequestStack.php delete mode 100644 plugins/vendor/symfony/http-foundation/Response.php delete mode 100644 plugins/vendor/symfony/http-foundation/ResponseHeaderBag.php delete mode 100644 plugins/vendor/symfony/http-foundation/ServerBag.php delete mode 100644 plugins/vendor/symfony/http-foundation/ServerEvent.php delete mode 100644 plugins/vendor/symfony/http-foundation/Session/Attribute/AttributeBag.php delete mode 100644 plugins/vendor/symfony/http-foundation/Session/Attribute/AttributeBagInterface.php delete mode 100644 plugins/vendor/symfony/http-foundation/Session/Flash/AutoExpireFlashBag.php delete mode 100644 plugins/vendor/symfony/http-foundation/Session/Flash/FlashBag.php delete mode 100644 plugins/vendor/symfony/http-foundation/Session/Flash/FlashBagInterface.php delete mode 100644 plugins/vendor/symfony/http-foundation/Session/FlashBagAwareSessionInterface.php delete mode 100644 plugins/vendor/symfony/http-foundation/Session/Session.php delete mode 100644 plugins/vendor/symfony/http-foundation/Session/SessionBagInterface.php delete mode 100644 plugins/vendor/symfony/http-foundation/Session/SessionBagProxy.php delete mode 100644 plugins/vendor/symfony/http-foundation/Session/SessionFactory.php delete mode 100644 plugins/vendor/symfony/http-foundation/Session/SessionFactoryInterface.php delete mode 100644 plugins/vendor/symfony/http-foundation/Session/SessionInterface.php delete mode 100644 plugins/vendor/symfony/http-foundation/Session/SessionUtils.php delete mode 100644 plugins/vendor/symfony/http-foundation/Session/Storage/Handler/AbstractSessionHandler.php delete mode 100644 plugins/vendor/symfony/http-foundation/Session/Storage/Handler/IdentityMarshaller.php delete mode 100644 plugins/vendor/symfony/http-foundation/Session/Storage/Handler/MarshallingSessionHandler.php delete mode 100644 plugins/vendor/symfony/http-foundation/Session/Storage/Handler/MemcachedSessionHandler.php delete mode 100644 plugins/vendor/symfony/http-foundation/Session/Storage/Handler/MigratingSessionHandler.php delete mode 100644 plugins/vendor/symfony/http-foundation/Session/Storage/Handler/MongoDbSessionHandler.php delete mode 100644 plugins/vendor/symfony/http-foundation/Session/Storage/Handler/NativeFileSessionHandler.php delete mode 100644 plugins/vendor/symfony/http-foundation/Session/Storage/Handler/NullSessionHandler.php delete mode 100644 plugins/vendor/symfony/http-foundation/Session/Storage/Handler/PdoSessionHandler.php delete mode 100644 plugins/vendor/symfony/http-foundation/Session/Storage/Handler/RedisSessionHandler.php delete mode 100644 plugins/vendor/symfony/http-foundation/Session/Storage/Handler/SessionHandlerFactory.php delete mode 100644 plugins/vendor/symfony/http-foundation/Session/Storage/Handler/StrictSessionHandler.php delete mode 100644 plugins/vendor/symfony/http-foundation/Session/Storage/MetadataBag.php delete mode 100644 plugins/vendor/symfony/http-foundation/Session/Storage/MockArraySessionStorage.php delete mode 100644 plugins/vendor/symfony/http-foundation/Session/Storage/MockFileSessionStorage.php delete mode 100644 plugins/vendor/symfony/http-foundation/Session/Storage/MockFileSessionStorageFactory.php delete mode 100644 plugins/vendor/symfony/http-foundation/Session/Storage/NativeSessionStorage.php delete mode 100644 plugins/vendor/symfony/http-foundation/Session/Storage/NativeSessionStorageFactory.php delete mode 100644 plugins/vendor/symfony/http-foundation/Session/Storage/PhpBridgeSessionStorage.php delete mode 100644 plugins/vendor/symfony/http-foundation/Session/Storage/PhpBridgeSessionStorageFactory.php delete mode 100644 plugins/vendor/symfony/http-foundation/Session/Storage/Proxy/AbstractProxy.php delete mode 100644 plugins/vendor/symfony/http-foundation/Session/Storage/Proxy/SessionHandlerProxy.php delete mode 100644 plugins/vendor/symfony/http-foundation/Session/Storage/SessionStorageFactoryInterface.php delete mode 100644 plugins/vendor/symfony/http-foundation/Session/Storage/SessionStorageInterface.php delete mode 100644 plugins/vendor/symfony/http-foundation/StreamedJsonResponse.php delete mode 100644 plugins/vendor/symfony/http-foundation/StreamedResponse.php delete mode 100644 plugins/vendor/symfony/http-foundation/Test/Constraint/RequestAttributeValueSame.php delete mode 100644 plugins/vendor/symfony/http-foundation/Test/Constraint/ResponseCookieValueSame.php delete mode 100644 plugins/vendor/symfony/http-foundation/Test/Constraint/ResponseFormatSame.php delete mode 100644 plugins/vendor/symfony/http-foundation/Test/Constraint/ResponseHasCookie.php delete mode 100644 plugins/vendor/symfony/http-foundation/Test/Constraint/ResponseHasHeader.php delete mode 100644 plugins/vendor/symfony/http-foundation/Test/Constraint/ResponseHeaderLocationSame.php delete mode 100644 plugins/vendor/symfony/http-foundation/Test/Constraint/ResponseHeaderSame.php delete mode 100644 plugins/vendor/symfony/http-foundation/Test/Constraint/ResponseIsRedirected.php delete mode 100644 plugins/vendor/symfony/http-foundation/Test/Constraint/ResponseIsSuccessful.php delete mode 100644 plugins/vendor/symfony/http-foundation/Test/Constraint/ResponseIsUnprocessable.php delete mode 100644 plugins/vendor/symfony/http-foundation/Test/Constraint/ResponseStatusCodeSame.php delete mode 100644 plugins/vendor/symfony/http-foundation/UriSigner.php delete mode 100644 plugins/vendor/symfony/http-foundation/UrlHelper.php delete mode 100644 plugins/vendor/symfony/http-foundation/composer.json delete mode 100644 plugins/vendor/voku/portable-ascii/.deepsource.toml delete mode 100644 plugins/vendor/voku/portable-ascii/CHANGELOG.md delete mode 100644 plugins/vendor/voku/portable-ascii/LICENSE.txt delete mode 100644 plugins/vendor/voku/portable-ascii/README.md delete mode 100644 plugins/vendor/voku/portable-ascii/composer.json delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/ASCII.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/ascii_by_languages.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/ascii_extras_by_languages.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/ascii_language_max_key.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/ascii_ord.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x000.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x001.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x002.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x003.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x004.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x005.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x006.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x007.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x009.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x00a.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x00b.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x00c.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x00d.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x00e.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x00f.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x010.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x011.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x012.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x013.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x014.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x015.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x016.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x017.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x018.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x01d.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x01e.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x01f.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x020.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x021.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x022.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x023.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x024.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x025.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x026.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x027.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x028.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x029.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x02a.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x02c.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x02e.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x02f.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x030.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x031.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x032.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x033.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x04d.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x04e.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x04f.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x050.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x051.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x052.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x053.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x054.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x055.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x056.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x057.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x058.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x059.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x05a.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x05b.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x05c.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x05d.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x05e.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x05f.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x060.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x061.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x062.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x063.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x064.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x065.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x066.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x067.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x068.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x069.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x06a.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x06b.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x06c.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x06d.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x06e.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x06f.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x070.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x071.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x072.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x073.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x074.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x075.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x076.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x077.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x078.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x079.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x07a.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x07b.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x07c.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x07d.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x07e.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x07f.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x080.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x081.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x082.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x083.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x084.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x085.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x086.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x087.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x088.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x089.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x08a.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x08b.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x08c.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x08d.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x08e.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x08f.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x090.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x091.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x092.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x093.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x094.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x095.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x096.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x097.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x098.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x099.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x09a.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x09b.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x09c.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x09d.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x09e.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x09f.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0a0.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0a1.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0a2.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0a3.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0a4.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0ac.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0ad.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0ae.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0af.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0b0.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0b1.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0b2.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0b3.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0b4.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0b5.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0b6.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0b7.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0b8.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0b9.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0ba.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0bb.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0bc.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0bd.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0be.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0bf.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0c0.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0c1.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0c2.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0c3.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0c4.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0c5.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0c6.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0c7.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0c8.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0c9.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0ca.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0cb.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0cc.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0cd.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0ce.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0cf.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0d0.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0d1.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0d2.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0d3.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0d4.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0d5.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0d6.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0d7.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0f9.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0fa.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0fb.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0fc.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0fd.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0fe.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0ff.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x1d4.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x1d5.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x1d6.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x1d7.php delete mode 100644 plugins/vendor/voku/portable-ascii/src/voku/helper/data/x1f1.php delete mode 100644 plugins/vendor/webklex/php-imap/.github/FUNDING.yml delete mode 100644 plugins/vendor/webklex/php-imap/.github/ISSUE_TEMPLATE/bug_report.md delete mode 100644 plugins/vendor/webklex/php-imap/.github/ISSUE_TEMPLATE/feature_request.md delete mode 100644 plugins/vendor/webklex/php-imap/.github/ISSUE_TEMPLATE/general-help-request.md delete mode 100644 plugins/vendor/webklex/php-imap/.github/docker/Dockerfile delete mode 100644 plugins/vendor/webklex/php-imap/.github/docker/dovecot_setup.sh delete mode 100644 plugins/vendor/webklex/php-imap/.github/workflows/tests.yaml delete mode 100644 plugins/vendor/webklex/php-imap/.gitignore delete mode 100755 plugins/vendor/webklex/php-imap/CHANGELOG.md delete mode 100644 plugins/vendor/webklex/php-imap/CODE_OF_CONDUCT.md delete mode 100644 plugins/vendor/webklex/php-imap/LICENSE delete mode 100644 plugins/vendor/webklex/php-imap/LICENSE.md delete mode 100755 plugins/vendor/webklex/php-imap/README.md delete mode 100644 plugins/vendor/webklex/php-imap/_config.yml delete mode 100644 plugins/vendor/webklex/php-imap/composer.json delete mode 100644 plugins/vendor/webklex/php-imap/examples/custom_attachment_mask.php delete mode 100644 plugins/vendor/webklex/php-imap/examples/custom_message_mask.php delete mode 100644 plugins/vendor/webklex/php-imap/examples/folder_structure.blade.php delete mode 100644 plugins/vendor/webklex/php-imap/examples/message_table.blade.php delete mode 100644 plugins/vendor/webklex/php-imap/phpunit.xml.dist delete mode 100644 plugins/vendor/webklex/php-imap/src/Address.php delete mode 100755 plugins/vendor/webklex/php-imap/src/Attachment.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Attribute.php delete mode 100755 plugins/vendor/webklex/php-imap/src/Client.php delete mode 100644 plugins/vendor/webklex/php-imap/src/ClientManager.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Config.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Connection/Protocols/ImapProtocol.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Connection/Protocols/LegacyProtocol.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Connection/Protocols/Protocol.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Connection/Protocols/ProtocolInterface.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Connection/Protocols/Response.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Decoder/AttachmentDecoder.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Decoder/Decoder.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Decoder/DecoderInterface.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Decoder/HeaderDecoder.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Decoder/MessageDecoder.php delete mode 100644 plugins/vendor/webklex/php-imap/src/EncodingAliases.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Events/Event.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Events/FlagDeletedEvent.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Events/FlagNewEvent.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Events/FolderDeletedEvent.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Events/FolderMovedEvent.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Events/FolderNewEvent.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Events/MessageCopiedEvent.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Events/MessageDeletedEvent.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Events/MessageMovedEvent.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Events/MessageNewEvent.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Events/MessageRestoredEvent.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Exceptions/AuthFailedException.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Exceptions/ConnectionFailedException.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Exceptions/DecoderNotFoundException.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Exceptions/EventNotFoundException.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Exceptions/FolderFetchingException.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Exceptions/GetMessagesFailedException.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Exceptions/ImapBadRequestException.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Exceptions/ImapServerErrorException.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Exceptions/InvalidMessageDateException.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Exceptions/InvalidWhereQueryCriteriaException.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Exceptions/MaskNotFoundException.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Exceptions/MessageContentFetchingException.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Exceptions/MessageFlagException.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Exceptions/MessageHeaderFetchingException.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Exceptions/MessageNotFoundException.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Exceptions/MessageSearchValidationException.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Exceptions/MessageSizeFetchingException.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Exceptions/MethodNotFoundException.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Exceptions/MethodNotSupportedException.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Exceptions/NotSupportedCapabilityException.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Exceptions/ProtocolNotSupportedException.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Exceptions/ResponseException.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Exceptions/RuntimeException.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Exceptions/SpoofingAttemptDetectedException.php delete mode 100755 plugins/vendor/webklex/php-imap/src/Folder.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Header.php delete mode 100644 plugins/vendor/webklex/php-imap/src/IMAP.php delete mode 100755 plugins/vendor/webklex/php-imap/src/Message.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Part.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Query/Query.php delete mode 100755 plugins/vendor/webklex/php-imap/src/Query/WhereQuery.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Structure.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Support/AttachmentCollection.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Support/FlagCollection.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Support/FolderCollection.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Support/Masks/AttachmentMask.php delete mode 100755 plugins/vendor/webklex/php-imap/src/Support/Masks/Mask.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Support/Masks/MessageMask.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Support/MessageCollection.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Support/PaginatedCollection.php delete mode 100644 plugins/vendor/webklex/php-imap/src/Traits/HasEvents.php delete mode 100644 plugins/vendor/webklex/php-imap/src/config/imap.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/AddressTest.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/AttachmentTest.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/AttributeTest.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/ClientManagerTest.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/ClientTest.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/HeaderTest.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/ImapProtocolTest.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/MessageTest.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/PartTest.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/StructureTest.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/fixtures/AttachmentEncodedFilenameTest.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/fixtures/AttachmentLongFilenameTest.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/fixtures/AttachmentNoDispositionTest.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/fixtures/BccTest.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/fixtures/BooleanDecodedContentTest.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/fixtures/DateTemplateTest.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/fixtures/EmailAddressTest.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/fixtures/EmbeddedEmailTest.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/fixtures/EmbeddedEmailWithoutContentDispositionEmbeddedTest.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/fixtures/EmbeddedEmailWithoutContentDispositionTest.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/fixtures/ExampleBounceTest.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/fixtures/FixtureTestCase.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/fixtures/FourNestedEmailsTest.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/fixtures/GbkCharsetTest.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/fixtures/HtmlOnlyTest.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/fixtures/ImapMimeHeaderDecodeReturnsFalseTest.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/fixtures/InlineAttachmentTest.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/fixtures/KsC56011987HeadersTest.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/fixtures/MailThatIsAttachmentTest.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/fixtures/MissingDateTest.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/fixtures/MissingFromTest.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/fixtures/MixedFilenameTest.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/fixtures/MultipartWithoutBodyTest.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/fixtures/MultipleHtmlPartsAndAttachmentsTest.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/fixtures/MultipleNestedAttachmentsTest.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/fixtures/NestesEmbeddedWithAttachmentTest.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/fixtures/NullContentCharsetTest.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/fixtures/PecTest.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/fixtures/PlainOnlyTest.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/fixtures/PlainTextAttachmentTest.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/fixtures/ReferencesTest.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/fixtures/SimpleMultipartTest.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/fixtures/StructuredWithAttachmentTest.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/fixtures/UndefinedCharsetHeaderTest.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/fixtures/UndisclosedRecipientsMinusTest.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/fixtures/UndisclosedRecipientsSpaceTest.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/fixtures/UndisclosedRecipientsTest.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/fixtures/UnknownEncodingTest.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/fixtures/WithoutCharsetPlainOnlyTest.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/fixtures/WithoutCharsetSimpleMultipartTest.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/issues/Issue275Test.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/issues/Issue355Test.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/issues/Issue379Test.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/issues/Issue382Test.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/issues/Issue383Test.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/issues/Issue393Test.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/issues/Issue401Test.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/issues/Issue407Test.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/issues/Issue40Test.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/issues/Issue410Test.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/issues/Issue412Test.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/issues/Issue413Test.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/issues/Issue414Test.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/issues/Issue420Test.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/issues/Issue462Test.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/issues/Issue469Test.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/issues/Issue511Test.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/issues/Issue544Test.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/live/ClientTest.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/live/FolderTest.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/live/LegacyTest.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/live/LiveMailboxTestCase.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/live/MessageTest.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/live/QueryTest.php delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/1366671050@github.com.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/attachment_encoded_filename.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/attachment_long_filename.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/attachment_no_disposition.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/bcc.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/boolean_decoded_content.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/date-template.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/email_address.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/embedded_email.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/embedded_email_without_content_disposition-embedded.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/embedded_email_without_content_disposition.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/example_attachment.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/example_bounce.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/four_nested_emails.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/gbk_charset.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/html_only.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/imap_mime_header_decode_returns_false.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/inline_attachment.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/issue-275-2.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/issue-275.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/issue-348.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/issue-382.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/issue-40.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/issue-401.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/issue-410.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/issue-410b.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/issue-410symbols.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/issue-412.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/issue-413.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/issue-414.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/issue-462.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/issue-511.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/issue-544.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/ks_c_5601-1987_headers.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/mail_that_is_attachment.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/missing_date.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/missing_from.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/mixed_filename.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/multipart_without_body.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/multiple_html_parts_and_attachments.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/multiple_nested_attachments.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/nestes_embedded_with_attachment.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/null_content_charset.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/pec.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/plain.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/plain_only.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/plain_text_attachment.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/references.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/simple_multipart.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/structured_with_attachment.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/thread_my_topic.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/thread_re_my_topic.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/thread_unrelated.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/undefined_charset_header.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/undisclosed_recipients.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/undisclosed_recipients_minus.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/undisclosed_recipients_space.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/unknown_encoding.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/without_charset_plain_only.eml delete mode 100644 plugins/vendor/webklex/php-imap/tests/messages/without_charset_simple_multipart.eml diff --git a/cron/legacy_ticket_email_parser.php b/cron/legacy_ticket_email_parser.php deleted file mode 100644 index 49295951..00000000 --- a/cron/legacy_ticket_email_parser.php +++ /dev/null @@ -1,932 +0,0 @@ - Ticketing > Email-to-ticket parsing. See https://docs.itflow.org/ticket_email_parse -- Quitting.."); -} - -// System temp directory & lock -$temp_dir = sys_get_temp_dir(); -$lock_file_path = "{$temp_dir}/itflow_email_parser_{$installation_id}.lock"; - -if (file_exists($lock_file_path)) { - $file_age = time() - filemtime($lock_file_path); - if ($file_age > 300) { - unlink($lock_file_path); - logApp("Cron-Email-Parser", "warning", "Cron Email Parser detected a lock file was present but was over 5 minutes old so it removed it."); - } else { - logApp("Cron-Email-Parser", "warning", "Lock file present. Cron Email Parser attempted to execute but was already executing, so instead it terminated."); - exit("Script is already running. Exiting."); - } -} -file_put_contents($lock_file_path, "Locked"); - -// Ensure lock gets removed even on fatal error -register_shutdown_function(function() use ($lock_file_path) { - if (file_exists($lock_file_path)) { - @unlink($lock_file_path); - } -}); - -// Allowed attachment extensions -$allowed_extensions = array('jpg', 'jpeg', 'gif', 'png', 'webp', 'svg', 'pdf', 'txt', 'md', 'doc', 'docx', 'csv', 'xls', 'xlsx', 'xlsm', 'zip', 'tar', 'gz'); - -/** ------------------------------------------------------------------ - * Ticket / Reply helpers (unchanged) - * ------------------------------------------------------------------ */ -function addTicket($contact_id, $contact_name, $contact_email, $client_id, $date, $subject, $message, $attachments, $original_message_file, $ccs) { - global $mysqli, $config_app_name, $company_name, $company_phone, $config_ticket_prefix, $config_ticket_client_general_notifications, $config_ticket_new_ticket_notification_email, $config_base_url, $config_ticket_from_name, $config_ticket_from_email, $config_ticket_default_billable, $allowed_extensions; - $bad_pattern = "/do[\W_]*not[\W_]*reply|no[\W_]*reply/i"; // Email addresses to ignore - - // Atomically increment and get the new ticket number - mysqli_query($mysqli, " - UPDATE settings - SET - config_ticket_next_number = LAST_INSERT_ID(config_ticket_next_number), - config_ticket_next_number = config_ticket_next_number + 1 - WHERE company_id = 1 - "); - - $ticket_number = mysqli_insert_id($mysqli); - - // Clean up the message - $message = trim($message); - // Remove DOCTYPE and meta tags - $message = preg_replace('/]*>/i', '', $message); - $message = preg_replace('/]*>/i', '', $message); - // Remove , , and their closing tags - $message = preg_replace('/<\/?(html|head|body)[^>]*>/i', '', $message); - // Collapse excess whitespace - $message = preg_replace('/\s+/', ' ', $message); - // Convert newlines to
- $message = nl2br($message); - // Wrap final formatted message - $message = "Email from: $contact_name <$contact_email> at $date:-

$message
"; - - $ticket_prefix_esc = mysqli_real_escape_string($mysqli, $config_ticket_prefix); - $message_esc = mysqli_real_escape_string($mysqli, $message); - $contact_email_esc = mysqli_real_escape_string($mysqli, $contact_email); - $client_id = intval($client_id); - - $url_key = randomString(32); - - mysqli_query($mysqli, "INSERT INTO tickets SET ticket_prefix = '$ticket_prefix_esc', ticket_number = $ticket_number, ticket_source = 'Email', ticket_subject = '$subject', ticket_details = '$message_esc', ticket_priority = 'Low', ticket_status = 1, ticket_billable = $config_ticket_default_billable, ticket_created_by = 0, ticket_contact_id = $contact_id, ticket_url_key = '$url_key', ticket_client_id = $client_id"); - $id = mysqli_insert_id($mysqli); - - // Logging - logAction("Ticket", "Create", "Email parser: Client contact $contact_email_esc created ticket $ticket_prefix_esc$ticket_number ($subject) ($id)", $client_id, $id); - - mkdirMissing('../uploads/tickets/'); - $att_dir = "../uploads/tickets/" . $id . "/"; - mkdirMissing($att_dir); - - // Move original .eml into the ticket folder - rename("../uploads/tmp/{$original_message_file}", "{$att_dir}/{$original_message_file}"); - $original_message_file_esc = mysqli_real_escape_string($mysqli, $original_message_file); - mysqli_query($mysqli, "INSERT INTO ticket_attachments SET ticket_attachment_name = 'Original-parsed-email.eml', ticket_attachment_reference_name = '$original_message_file_esc', ticket_attachment_ticket_id = $id"); - - // Save non-inline attachments - foreach ($attachments as $attachment) { - $att_name = $attachment['name']; - $att_extension = strtolower(pathinfo($att_name, PATHINFO_EXTENSION)); - - if (in_array($att_extension, $allowed_extensions)) { - $att_saved_filename = md5(uniqid(rand(), true)) . '.' . $att_extension; - $att_saved_path = $att_dir . $att_saved_filename; - file_put_contents($att_saved_path, $attachment['content']); - - $ticket_attachment_name = sanitizeInput($att_name); - $ticket_attachment_reference_name = sanitizeInput($att_saved_filename); - - $ticket_attachment_name_esc = mysqli_real_escape_string($mysqli, $ticket_attachment_name); - $ticket_attachment_reference_name_esc = mysqli_real_escape_string($mysqli, $ticket_attachment_reference_name); - mysqli_query($mysqli, "INSERT INTO ticket_attachments SET ticket_attachment_name = '$ticket_attachment_name_esc', ticket_attachment_reference_name = '$ticket_attachment_reference_name_esc', ticket_attachment_ticket_id = $id"); - } else { - $ticket_attachment_name_esc = mysqli_real_escape_string($mysqli, $att_name); - logAction("Ticket", "Edit", "Email parser: Blocked attachment $ticket_attachment_name_esc from Client contact $contact_email_esc for ticket $ticket_prefix_esc$ticket_number", $client_id, $id); - } - } - - // Add unknown guests as ticket watcher - if ($client_id == 0 && !preg_match($bad_pattern, $contact_email_esc)) { - mysqli_query($mysqli, "INSERT INTO ticket_watchers SET watcher_email = '$contact_email_esc', watcher_ticket_id = $id"); - } - - // Add CCs as ticket watchers - foreach ($ccs as $cc) { - if (filter_var($cc, FILTER_VALIDATE_EMAIL) && !preg_match($bad_pattern, $cc)) { - $cc_esc = mysqli_real_escape_string($mysqli, $cc); - mysqli_query($mysqli, "INSERT INTO ticket_watchers SET watcher_email = '$cc_esc', watcher_ticket_id = $id"); - } - } - - // External email - $data = []; - if ($config_ticket_client_general_notifications == 1 && !preg_match($bad_pattern, $contact_email)) { - $subject_email = "Ticket created - [$config_ticket_prefix$ticket_number] - $subject"; - $body = "##- Please type your reply above this line -##

Hello $contact_name,

Thank you for your email. A ticket regarding \"$subject\" has been automatically created for you.

Ticket: $config_ticket_prefix$ticket_number
Subject: $subject
Status: New
Portal: View ticket

--
$company_name - Support
$config_ticket_from_email
$company_phone"; - $data[] = [ - 'from' => $config_ticket_from_email, - 'from_name' => $config_ticket_from_name, - 'recipient' => $contact_email, - 'recipient_name' => $contact_name, - 'subject' => $subject_email, - 'body' => mysqli_real_escape_string($mysqli, $body) - ]; - } - - // Internal email - if ($config_ticket_new_ticket_notification_email) { - if ($client_id == 0) { - $client_name = "Guest"; - $client_uri = ''; - } else { - $client_sql = mysqli_query($mysqli, "SELECT client_name FROM clients WHERE client_id = $client_id"); - $client_row = mysqli_fetch_assoc($client_sql); - $client_name = sanitizeInput($client_row['client_name']); - $client_uri = "&client_id=$client_id"; - } - $email_subject = "$config_app_name - New Ticket - $client_name: $subject"; - $email_body = "Hello,

This is a notification that a new ticket has been raised in ITFlow.
Client: $client_name
Priority: Low (email parsed)
Link: https://$config_base_url/agent/ticket.php?ticket_id=$id$client_uri

--------------------------------

$subject
$message"; - - $data[] = [ - 'from' => $config_ticket_from_email, - 'from_name' => $config_ticket_from_name, - 'recipient' => $config_ticket_new_ticket_notification_email, - 'recipient_name' => $config_ticket_from_name, - 'subject' => $email_subject, - 'body' => mysqli_real_escape_string($mysqli, $email_body) - ]; - } - - addToMailQueue($data); - customAction('ticket_create', $id); - - return true; -} - -function addReply($from_email, $date, $subject, $ticket_number, $message, $attachments) { - global $mysqli, $config_app_name, $company_name, $company_phone, $config_ticket_prefix, $config_base_url, $config_ticket_from_name, $config_ticket_from_email, $allowed_extensions; - - $ticket_reply_type = 'Client'; - // $message contains the raw HTML body from IMAP - - // 1) Remove the reply separator and everything below it (HTML-aware) - // This matches: ##- Please type your reply above this line -## and EVERYTHING after it - $message = preg_replace( - '/]*>##-\s*Please\s+type\s+your\s+reply\s+above\s+this\s+line\s*-##<\/i>.*$/is', - '', - $message - ); - - // 2) Clean up the remaining message - - // Remove DOCTYPE and meta tags - $message = preg_replace('/]*>/i', '', $message); - $message = preg_replace('/]*>/i', '', $message); - - // Remove , , and their closing tags - $message = preg_replace('/<\/?(html|head|body)[^>]*>/i', '', $message); - - // Trim leading/trailing whitespace - $message = trim($message); - - // Normalize line breaks to spaces - $message = preg_replace('/\r\n|\r|\n/', ' ', $message); - - // Convert to
for HTML display - $message = nl2br($message); - - // 3) Final wrapper - $message = "Email from: $from_email at $date:-

$message
"; - - $ticket_number_esc = intval($ticket_number); - $message_esc = mysqli_real_escape_string($mysqli, $message); - $from_email_esc = mysqli_real_escape_string($mysqli, $from_email); - - $row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT ticket_id, ticket_subject, ticket_status, ticket_contact_id, ticket_client_id, contact_email, client_name - FROM tickets - LEFT JOIN contacts on tickets.ticket_contact_id = contacts.contact_id - LEFT JOIN clients on tickets.ticket_client_id = clients.client_id - WHERE ticket_number = $ticket_number_esc LIMIT 1")); - - if ($row) { - $ticket_id = intval($row['ticket_id']); - $ticket_subject = sanitizeInput($row['ticket_subject']); - $ticket_status = sanitizeInput($row['ticket_status']); - $ticket_reply_contact = intval($row['ticket_contact_id']); - $ticket_contact_email = sanitizeInput($row['contact_email']); - $client_id = intval($row['ticket_client_id']); - if ($client_id) { - $client_uri = "&client_id=$client_id"; - } else { - $client_uri = ''; - } - $client_name = sanitizeInput($row['client_name']); - - if ($ticket_status == 5) { - $config_ticket_prefix_esc = mysqli_real_escape_string($mysqli, $config_ticket_prefix); - $ticket_number_esc2 = mysqli_real_escape_string($mysqli, $ticket_number); - - appNotify("Ticket", "Email parser: $from_email attempted to re-open ticket $config_ticket_prefix_esc$ticket_number_esc2 (ID $ticket_id) - check inbox manually to see email", "/agent/ticket.php?ticket_id=$ticket_id$client_uri", $client_id); - - $email_subject = "Action required: This ticket is already closed"; - $email_body = "Hi there,

You've tried to reply to a ticket that is closed - we won't see your response.

Please raise a new ticket by sending a new e-mail to our support address below.

--
$company_name - Support
$config_ticket_from_email
$company_phone"; - - $data = [ - [ - 'from' => $config_ticket_from_email, - 'from_name' => $config_ticket_from_name, - 'recipient' => $from_email, - 'recipient_name' => $from_email, - 'subject' => $email_subject, - 'body' => mysqli_real_escape_string($mysqli, $email_body) - ] - ]; - - addToMailQueue($data); - return true; - } - - if (empty($ticket_contact_email) || $ticket_contact_email !== $from_email) { - $from_email_esc2 = mysqli_real_escape_string($mysqli, $from_email); - $row2 = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT contact_id FROM contacts WHERE contact_email = '$from_email_esc2' AND contact_client_id = $client_id LIMIT 1")); - if ($row2) { - $ticket_reply_contact = intval($row2['contact_id']); - } else { - $ticket_reply_type = 'Internal'; - $ticket_reply_contact = '0'; - $message = "WARNING: Contact email mismatch
$message"; - $message_esc = mysqli_real_escape_string($mysqli, $message); - } - } - - mysqli_query($mysqli, "INSERT INTO ticket_replies SET ticket_reply = '$message_esc', ticket_reply_type = '$ticket_reply_type', ticket_reply_time_worked = '00:00:00', ticket_reply_by = $ticket_reply_contact, ticket_reply_ticket_id = $ticket_id"); - $reply_id = mysqli_insert_id($mysqli); - - $ticket_dir = "../uploads/tickets/" . $ticket_id . "/"; - mkdirMissing($ticket_dir); - - foreach ($attachments as $attachment) { - $att_name = $attachment['name']; - $att_extension = strtolower(pathinfo($att_name, PATHINFO_EXTENSION)); - - if (in_array($att_extension, $allowed_extensions)) { - $att_saved_filename = md5(uniqid(rand(), true)) . '.' . $att_extension; - $att_saved_path = $ticket_dir . $att_saved_filename; - file_put_contents($att_saved_path, $attachment['content']); - - $ticket_attachment_name = sanitizeInput($att_name); - $ticket_attachment_reference_name = sanitizeInput($att_saved_filename); - - $ticket_attachment_name_esc = mysqli_real_escape_string($mysqli, $ticket_attachment_name); - $ticket_attachment_reference_name_esc = mysqli_real_escape_string($mysqli, $ticket_attachment_reference_name); - mysqli_query($mysqli, "INSERT INTO ticket_attachments SET ticket_attachment_name = '$ticket_attachment_name_esc', ticket_attachment_reference_name = '$ticket_attachment_reference_name_esc', ticket_attachment_reply_id = $reply_id, ticket_attachment_ticket_id = $ticket_id"); - } else { - $ticket_attachment_name_esc = mysqli_real_escape_string($mysqli, $att_name); - logAction("Ticket", "Edit", "Email parser: Blocked attachment $ticket_attachment_name_esc from Client contact $from_email_esc for ticket $config_ticket_prefix$ticket_number_esc", $client_id, $ticket_id); - } - } - - $ticket_assigned_to_sql = mysqli_query($mysqli, "SELECT ticket_assigned_to FROM tickets WHERE ticket_id = $ticket_id LIMIT 1"); - if ($ticket_assigned_to_sql) { - $row3 = mysqli_fetch_assoc($ticket_assigned_to_sql); - $ticket_assigned_to = intval($row3['ticket_assigned_to']); - - if ($ticket_assigned_to) { - $tech_sql = mysqli_query($mysqli, "SELECT user_email, user_name FROM users WHERE user_id = $ticket_assigned_to LIMIT 1"); - $tech_row = mysqli_fetch_assoc($tech_sql); - $tech_email = sanitizeInput($tech_row['user_email']); - $tech_name = sanitizeInput($tech_row['user_name']); - - $email_subject = "$config_app_name - Ticket updated - [$config_ticket_prefix$ticket_number] $ticket_subject"; - $email_body = "Hello $tech_name,

A new reply has been added to the below ticket.

Client: $client_name
Ticket: $config_ticket_prefix$ticket_number
Subject: $ticket_subject
Link: https://$config_base_url/agent/ticket.php?ticket_id=$ticket_id$client_uri

--------------------------------
$message_esc"; - - $data = [ - [ - 'from' => $config_ticket_from_email, - 'from_name' => $config_ticket_from_name, - 'recipient' => $tech_email, - 'recipient_name' => $tech_name, - 'subject' => mysqli_real_escape_string($mysqli, $email_subject), - 'body' => mysqli_real_escape_string($mysqli, $email_body) - ] - ]; - addToMailQueue($data); - } - } - - mysqli_query($mysqli, "UPDATE tickets SET ticket_status = 2, ticket_resolved_at = NULL WHERE ticket_id = $ticket_id AND ticket_client_id = $client_id LIMIT 1"); - - logAction("Ticket", "Edit", "Email parser: Client contact $from_email_esc updated ticket $config_ticket_prefix$ticket_number_esc ($subject)", $client_id, $ticket_id); - customAction('ticket_reply_client', $ticket_id); - return true; - } else { - return false; - } -} - -/** ------------------------------------------------------------------ - * OAuth helpers + provider guard - * ------------------------------------------------------------------ */ - -// returns true if expires_at ('Y-m-d H:i:s') is in the past (or missing) -function tokenExpired(?string $expires_at): bool { - if (empty($expires_at)) return true; - $ts = strtotime($expires_at); - if ($ts === false) return true; - // refresh a little early (60s) to avoid race - return ($ts - 60) <= time(); -} - -// very small form-encoded POST helper using curl -function httpFormPost(string $url, array $fields): array { - $ch = curl_init($url); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt($ch, CURLOPT_POST, true); - curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($fields, '', '&')); - curl_setopt($ch, CURLOPT_TIMEOUT, 20); - $raw = curl_exec($ch); - $err = curl_error($ch); - $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); - curl_close($ch); - return ['ok' => ($raw !== false && $code >= 200 && $code < 300), 'body' => $raw, 'code' => $code, 'err' => $err]; -} - -/** - * Get a valid access token for Google Workspace IMAP via refresh token if needed. - * Uses settings: config_mail_oauth_client_id / _client_secret / _refresh_token / _access_token / _access_token_expires_at - * Updates globals if refreshed (so later logging can reflect it if you want to persist). - */ -function getGoogleAccessToken(string $username): ?string { - // pull from global settings variables you already load - global $mysqli, - $config_mail_oauth_client_id, - $config_mail_oauth_client_secret, - $config_mail_oauth_refresh_token, - $config_mail_oauth_access_token, - $config_mail_oauth_access_token_expires_at; - - // If we have a not-expired token, use it - if (!empty($config_mail_oauth_access_token) && !tokenExpired($config_mail_oauth_access_token_expires_at)) { - return $config_mail_oauth_access_token; - } - - // Need to refresh? - if (empty($config_mail_oauth_client_id) || empty($config_mail_oauth_client_secret) || empty($config_mail_oauth_refresh_token)) { - // Nothing we can do - return null; - } - - $resp = httpFormPost( - 'https://oauth2.googleapis.com/token', - [ - 'client_id' => $config_mail_oauth_client_id, - 'client_secret' => $config_mail_oauth_client_secret, - 'refresh_token' => $config_mail_oauth_refresh_token, - 'grant_type' => 'refresh_token', - ] - ); - - if (!$resp['ok']) return null; - - $json = json_decode($resp['body'], true); - if (!is_array($json) || empty($json['access_token'])) return null; - - // Calculate new expiry - $expires_at = date('Y-m-d H:i:s', time() + (int)($json['expires_in'] ?? 3600)); - - // Update in-memory globals (and persist to DB) - $config_mail_oauth_access_token = $json['access_token']; - $config_mail_oauth_access_token_expires_at = $expires_at; - - $at_esc = mysqli_real_escape_string($mysqli, $config_mail_oauth_access_token); - $exp_esc = mysqli_real_escape_string($mysqli, $config_mail_oauth_access_token_expires_at); - mysqli_query($mysqli, "UPDATE settings SET - config_mail_oauth_access_token = '{$at_esc}', - config_mail_oauth_access_token_expires_at = '{$exp_esc}' - WHERE company_id = 1 - "); - - return $config_mail_oauth_access_token; -} - -/** - * Get a valid access token for Microsoft 365 IMAP via refresh token if needed. - * Uses settings: config_mail_oauth_client_id / _client_secret / _tenant_id / _refresh_token / _access_token / _access_token_expires_at - */ -function getMicrosoftAccessToken(string $username): ?string { - global $mysqli, - $config_mail_oauth_client_id, - $config_mail_oauth_client_secret, - $config_mail_oauth_tenant_id, - $config_mail_oauth_refresh_token, - $config_mail_oauth_access_token, - $config_mail_oauth_access_token_expires_at; - - if (!empty($config_mail_oauth_access_token) && !tokenExpired($config_mail_oauth_access_token_expires_at)) { - return $config_mail_oauth_access_token; - } - - if (empty($config_mail_oauth_client_id) || empty($config_mail_oauth_client_secret) || empty($config_mail_oauth_refresh_token) || empty($config_mail_oauth_tenant_id)) { - return null; - } - - $url = "https://login.microsoftonline.com/".rawurlencode($config_mail_oauth_tenant_id)."/oauth2/v2.0/token"; - - $resp = httpFormPost($url, [ - 'client_id' => $config_mail_oauth_client_id, - 'client_secret' => $config_mail_oauth_client_secret, - 'refresh_token' => $config_mail_oauth_refresh_token, - 'grant_type' => 'refresh_token', - // IMAP/SMTP scopes typically included at initial consent; not needed for refresh - ]); - - if (!$resp['ok']) return null; - - $json = json_decode($resp['body'], true); - if (!is_array($json) || empty($json['access_token'])) return null; - - $expires_at = date('Y-m-d H:i:s', time() + (int)($json['expires_in'] ?? 3600)); - - $config_mail_oauth_access_token = $json['access_token']; - $config_mail_oauth_access_token_expires_at = $expires_at; - - $at_esc = mysqli_real_escape_string($mysqli, $config_mail_oauth_access_token); - $exp_esc = mysqli_real_escape_string($mysqli, $config_mail_oauth_access_token_expires_at); - mysqli_query($mysqli, "UPDATE settings SET - config_mail_oauth_access_token = '{$at_esc}', - config_mail_oauth_access_token_expires_at = '{$exp_esc}' - WHERE company_id = 1 - "); - - return $config_mail_oauth_access_token; -} - -// Provider from settings (may be NULL/empty to disable IMAP polling) -$imap_provider = $config_imap_provider ?? ''; -if ($imap_provider === null) $imap_provider = ''; - -if ($imap_provider === '') { - // IMAP disabled by admin: exit cleanly - logApp("Cron-Email-Parser", "info", "IMAP polling skipped: provider not configured."); - @unlink($lock_file_path); - exit(0); -} - -/** ------------------------------------------------------------------ - * Webklex IMAP setup (supports Standard / Google OAuth / Microsoft OAuth) - * ------------------------------------------------------------------ */ -use Webklex\PHPIMAP\ClientManager; - -$validate_cert = true; - -// Defaults from settings (standard IMAP) -$host = $config_imap_host; -$port = (int)$config_imap_port; -$encr = !empty($config_imap_encryption) ? $config_imap_encryption : 'notls'; // 'ssl'|'tls'|'notls' -$user = $config_imap_username; -$pass = $config_imap_password; -$auth = null; // 'oauth' for OAuth providers - -if ($imap_provider === 'google_oauth') { - $host = 'imap.gmail.com'; - $port = 993; - $encr = 'ssl'; - $auth = 'oauth'; - $pass = getGoogleAccessToken($user); - if (empty($pass)) { - logApp("Cron-Email-Parser", "error", "Google OAuth: no usable access token (check refresh token/client credentials)."); - @unlink($lock_file_path); - exit(1); - } -} elseif ($imap_provider === 'microsoft_oauth') { - $host = 'outlook.office365.com'; - $port = 993; - $encr = 'ssl'; - $auth = 'oauth'; - $pass = getMicrosoftAccessToken($user); - if (empty($pass)) { - logApp("Cron-Email-Parser", "error", "Microsoft OAuth: no usable access token (check refresh token/client credentials/tenant)."); - @unlink($lock_file_path); - exit(1); - } -} else { - // standard_imap (username/password) - if (empty($host) || empty($port) || empty($user)) { - logApp("Cron-Email-Parser", "error", "Standard IMAP: missing host/port/username."); - @unlink($lock_file_path); - exit(1); - } -} - -$cm = new ClientManager(); - -$client = $cm->make(array_filter([ - 'host' => $host, - 'port' => $port, - 'encryption' => $encr, // 'ssl' | 'tls' | null - 'validate_cert' => (bool)$validate_cert, - 'username' => $user, // full mailbox address (OAuth uses user as principal) - 'password' => $pass, // access token when $auth === 'oauth' - 'authentication' => $auth, // 'oauth' or null - 'protocol' => 'imap', -])); - -try { - $client->connect(); -} catch (\Throwable $e) { - echo "Error connecting to IMAP server: " . $e->getMessage(); - @unlink($lock_file_path); - exit(1); -} - -$inbox = $client->getFolderByPath('INBOX'); - -$targetFolderPath = 'ITFlow'; -try { - $targetFolder = $client->getFolderByPath($targetFolderPath); -} catch (\Throwable $e) { - $client->createFolder($targetFolderPath); - $targetFolder = $client->getFolderByPath($targetFolderPath); -} - -// Fetch unseen messages -$messages = $inbox->messages()->leaveUnread()->unseen()->get(); - -// Counters -$processed_count = 0; -$unprocessed_count = 0; - -// Process messages -foreach ($messages as $message) { - $email_processed = false; - - // Save original message as .eml (getRawMessage() doesn't seem to work properly) - mkdirMissing('../uploads/tmp/'); - $original_message_file = "processed-eml-" . randomString(200) . ".eml"; - $raw_message = (string)$message->getHeader()->raw . "\r\n\r\n" . ($message->getRawBody() ?? $message->getHTMLBody() ?? $message->getTextBody()); - file_put_contents("../uploads/tmp/{$original_message_file}", $raw_message); - - // From - $from_col = $message->getFrom(); - $from_first = ($from_col && $from_col->count()) ? $from_col->first() : null; - $from_email = sanitizeInput($from_first->mail ?? 'itflow-guest@example.com'); - $from_name = sanitizeInput($from_first->personal ?? 'Unknown'); - - $from_domain = explode("@", $from_email); - $from_domain = sanitizeInput(end($from_domain)); - - // Subject - $subject = sanitizeInput((string)$message->getSubject() ?: 'No Subject'); - - // CC - $ccs = array(); - $cc_attr = $message->header->cc; - $cc_list = $cc_attr->toArray(); - foreach ($cc_list as $cc_addr) { - if ($cc_addr instanceof \Webklex\PHPIMAP\Address) { - $ccs[] = $cc_addr->mail; - } - } - - // Date (string) - $dateAttr = $message->getDate(); // Attribute - $dateRaw = $dateAttr ? (string)$dateAttr : ''; // e.g. "Tue, 10 Sep 2025 13:22:05 +0000" - $ts = $dateRaw ? strtotime($dateRaw) : false; - $date = sanitizeInput($ts !== false ? date('Y-m-d H:i:s', $ts) : date('Y-m-d H:i:s')); - - // Body (prefer HTML) - $message_body_html = $message->getHTMLBody(); - $message_body_text = $message->getTextBody(); - $message_body_raw = $message->getRawBody(); - - if (!empty($message_body_html)) { - $message_body = $message_body_html; - } elseif (!empty($message_body_text)) { - $message_body = nl2br(htmlspecialchars($message_body_text)); - } else { - // Final fallback - $message_body = nl2br(htmlspecialchars($message_body_raw)); - } - - // Handle attachments (inline vs regular) - $attachments = []; - foreach ($message->getAttachments() as $att) { - $attrs = $att->getAttributes(); // v6.2: canonical source - $dispo = strtolower((string)($attrs['disposition'] ?? '')); - $cid = $attrs['id'] ?? null; // Content-ID - $content = $attrs['content'] ?? null; // binary - $mime = $att->getMimeType(); - $name = $att->getName() ?: 'attachment'; - - $is_inline = false; - if ($dispo === 'inline' && $cid && $content !== null) { - $cid_trim = trim($cid, '<>'); - $dataUri = "data:$mime;base64,".base64_encode($content); - $message_body = str_replace(["cid:$cid_trim", "cid:$cid"], $dataUri, $message_body); - $is_inline = true; - } - - if (!$is_inline && $content !== null) { - $attachments[] = ['name' => $name, 'content' => $content]; - } - } - - // 1. Reply to existing ticket with the number in subject - if (preg_match("/\[$config_ticket_prefix(\d+)\]/", $subject, $ticket_number_matches)) { - $ticket_number = intval($ticket_number_matches[1]); - $email_processed = addReply($from_email, $date, $subject, $ticket_number, $message_body, $attachments); - } - - // 2. Fuzzy duplicate check using a known contact/domain and similar_text subject - if (!$email_processed && strlen(trim($subject)) > 10) { - $contact_id = 0; - $client_id = 0; - - // First: check if sender is a registered contact - $from_email_esc = mysqli_real_escape_string($mysqli, $from_email); - $contact_sql = mysqli_query($mysqli, "SELECT * FROM contacts WHERE contact_email = '$from_email_esc' AND contact_archived_at IS NULL LIMIT 1"); - $contact_row = mysqli_fetch_assoc($contact_sql); - - if ($contact_row) { - $contact_id = intval($contact_row['contact_id']); - $client_id = intval($contact_row['contact_client_id']); - } else { - // Else: check if sender domain is registered - $from_domain_esc = mysqli_real_escape_string($mysqli, $from_domain); - $domain_sql = mysqli_query($mysqli, "SELECT * FROM domains WHERE domain_name = '$from_domain_esc' AND domain_archived_at IS NULL LIMIT 1"); - $domain_row = mysqli_fetch_assoc($domain_sql); - - if ($domain_row && $from_domain == $domain_row['domain_name']) { - $client_id = intval($domain_row['domain_client_id']); - } - } - - // If we found either a contact or a domain, check recent tickets for a matching subject - if ($client_id) { - $recent_tickets_sql = mysqli_query($mysqli, - "SELECT ticket_id, ticket_number, ticket_subject - FROM tickets - WHERE ticket_client_id = $client_id AND ticket_resolved_at IS NULL - AND ticket_created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY)" - ); - - while ($rowt = mysqli_fetch_assoc($recent_tickets_sql)) { - $ticket_number = intval($rowt['ticket_number']); - $existing_subject = $rowt['ticket_subject']; - - // Calculate similarity percentage - similar_text(strtolower($subject), strtolower($existing_subject), $percent); - - if ($percent >= 95) { - // Treat as a reply/duplicate - $email_processed = addReply($from_email, $date, $subject, $ticket_number, $message_body, $attachments); - break; - } - } - } - } - - // 3. A known, registered contact? - if (!$email_processed) { - $from_email_esc = mysqli_real_escape_string($mysqli, $from_email); - $any_contact_sql = mysqli_query($mysqli, "SELECT * FROM contacts WHERE contact_email = '$from_email_esc' AND contact_archived_at IS NULL LIMIT 1"); - $rowc = mysqli_fetch_assoc($any_contact_sql); - - if ($rowc) { - $contact_name = sanitizeInput($rowc['contact_name']); - $contact_id = intval($rowc['contact_id']); - $contact_email = sanitizeInput($rowc['contact_email']); - $client_id = intval($rowc['contact_client_id']); - - $email_processed = addTicket($contact_id, $contact_name, $contact_email, $client_id, $date, $subject, $message_body, $attachments, $original_message_file, $ccs); - } - } - - // 4. A known domain? - if (!$email_processed) { - $from_domain_esc = mysqli_real_escape_string($mysqli, $from_domain); - $domain_sql = mysqli_query($mysqli, "SELECT * FROM domains WHERE domain_name = '$from_domain_esc' AND domain_archived_at IS NULL LIMIT 1"); - $rowd = mysqli_fetch_assoc($domain_sql); - - if ($rowd && $from_domain == $rowd['domain_name']) { - $client_id = intval($rowd['domain_client_id']); - - // Create a new contact - $contact_name = $from_name; - $contact_email = $from_email; - mysqli_query($mysqli, "INSERT INTO contacts SET contact_name = '".mysqli_real_escape_string($mysqli, $contact_name)."', contact_email = '".mysqli_real_escape_string($mysqli, $contact_email)."', contact_notes = 'Added automatically via email parsing.', contact_client_id = $client_id"); - $contact_id = mysqli_insert_id($mysqli); - - logAction("Contact", "Create", "Email parser: created contact " . mysqli_real_escape_string($mysqli, $contact_name), $client_id, $contact_id); - customAction('contact_create', $contact_id); - - $email_processed = addTicket($contact_id, $contact_name, $contact_email, $client_id, $date, $subject, $message_body, $attachments, $original_message_file, $ccs); - } - } - - // 5. Unknown sender allowed? - if (!$email_processed && $config_ticket_email_parse_unknown_senders) { - - $bad_from_pattern = "/daemon|postmaster|bounce|mta/i"; // Stop NDRs with bad subjects raising new tickets - if (!preg_match($bad_from_pattern, $from_email)) { - $email_processed = addTicket(0, $from_name, $from_email, 0, $date, $subject, $message_body, $attachments, $original_message_file, $ccs); - - } else { - - // Probably an NDR message without a ticket ref in the subject - - $failed_recipient = null; - $diagnostic_code = null; - $status_code = null; - $original_subject = null; - $original_to = null; - - // Webklex stores DSN info in attachments, not parts - foreach ($message->getAttachments() as $attachment) { - - $ctype = strtolower($attachment->getContentType()); - $body = $attachment->getContent() ?? ''; - - // 1. Delivery status block - if (strpos($ctype, 'delivery-status') !== false) { - - if (preg_match('/Final-Recipient:\s*rfc822;\s*(.+)/i', $body, $m)) { - $failed_recipient = sanitizeInput(trim($m[1])); - } - - if (preg_match('/Diagnostic-Code:\s*(.+)/i', $body, $m)) { - $diagnostic_code = sanitizeInput(trim($m[1])); - } - - if (preg_match('/Status:\s*([0-9\.]+)/i', $body, $m)) { - $status_code = sanitizeInput(trim($m[1])); - } - } - - // 2. Original message headers - if (strpos($ctype, 'message/rfc822') !== false) { - - if (preg_match('/^To:\s*(.+)$/mi', $body, $m)) { - $original_to = sanitizeInput(trim($m[1])); - } - - if (preg_match('/^Subject:\s*(.+)$/mi', $body, $m)) { - $original_subject = sanitizeInput(trim($m[1])); - } - } - } - - // 3. Fallback: extract diagnostic from human-readable text/plain - if (!$diagnostic_code) { - $text = $message->getTextBody() ?? ''; - - // Exim puts diagnostics on an indented line - if (preg_match('/\n\s{2,}(.+)/', $text, $m)) { - $diagnostic_code = sanitizeInput(trim($m[1])); - } - } - - // Fallbacks - $failed_recipient = $failed_recipient ?: 'unknown recipient'; - $diagnostic_code = $diagnostic_code ?: 'unknown diagnostic code'; - $status_code = $status_code ?: 'unknown status code'; - $original_subject = $original_subject ?: $subject; - - appNotify( - "Ticket", - "Email parser NDR: Message to $failed_recipient bounced. Subject: $original_subject Diagnostics: $status_code / $diagnostic_code - check ITFlow folder manually to see email", - "", - 0 - ); - - // If the original subject has a ticket, add the NDR there too - if (preg_match("/\[$config_ticket_prefix(\d+)\]/", $original_subject, $ticket_number_matches)) { - - $ticket_number = intval($ticket_number_matches[1]); - - // Craft a clean bounce message - $reply_body = "Email delivery failed.\n". - "Recipient: $failed_recipient\n". - "Status: $status_code\n". - "Diagnostic: $diagnostic_code\n"; - - // No attachments - addReply( - $from_email, - $date, - $original_subject, - $ticket_number, - $reply_body, - [] - ); - - } - - $email_processed = true; - } - } - - - // Flag/move based on processing result - if ($email_processed) { - $processed_count++; // increment first so a move failure doesn't hide the success - try { - $message->setFlag('Seen'); - // Move using the Folder object (top-level "ITFlow") - $message->move($targetFolderPath); - // optional: logApp("Cron-Email-Parser", "info", "Moved message to ITFlow"); - } catch (\Throwable $e) { - // >>> Put the extra logging RIGHT HERE - $subj = (string)$message->getSubject(); - $uid = method_exists($message, 'getUid') ? $message->getUid() : 'n/a'; - $path = (is_object($targetFolder) && property_exists($targetFolder, 'path')) ? (string)$targetFolder->path : $targetFolderPath; - logApp( - "Cron-Email-Parser", - "warning", - "Move failed (subject=\"$subj\", uid=$uid) to [$path]: ".$e->getMessage() - ); - } - } else { - $unprocessed_count++; - try { - $message->setFlag('Flagged'); - $message->unsetFlag('Seen'); - } catch (\Throwable $e) { - logApp("Cron-Email-Parser", "warning", "Flag update failed: ".$e->getMessage()); - } - } - - // Cleanup temp .eml if still present (e.g., reply path) - if (isset($original_message_file)) { - $tmp_path = "../uploads/tmp/{$original_message_file}"; - if (file_exists($tmp_path)) { @unlink($tmp_path); } - } -} - -// Expunge & disconnect -try { - $client->expunge(); -} catch (\Throwable $e) { - // ignore -} -$client->disconnect(); - -// Execution timing (optional) -$script_end_time = microtime(true); -$execution_time = $script_end_time - $script_start_time; -$execution_time_formatted = number_format($execution_time, 2); - -$processed_info = "Processed: $processed_count email(s), Unprocessed: $unprocessed_count email(s)"; -// logAction("Cron-Email-Parser", "Execution", "Cron Email Parser executed in $execution_time_formatted seconds. $processed_info"); - -// Remove the lock file -unlink($lock_file_path); - -// DEBUG -echo "\nLock File Path: $lock_file_path\n"; -if (file_exists($lock_file_path)) { - echo "\nLock is present\n\n"; -} -echo "Processed Emails: $processed_count\n"; -echo "Unprocessed Emails: $unprocessed_count\n"; diff --git a/plugins/composer.json b/plugins/composer.json index 7564f75b..c8002a1e 100644 --- a/plugins/composer.json +++ b/plugins/composer.json @@ -1,6 +1,5 @@ { "require": { - "webklex/php-imap": "^6.2", "directorytree/imapengine": "^1.24" }, "config": { diff --git a/plugins/composer.lock b/plugins/composer.lock index bcba470b..14c52d41 100644 --- a/plugins/composer.lock +++ b/plugins/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "ab8e2fdad19a8ca7b697fc24a24b9194", + "content-hash": "2c0fb0fc225c899ec2e8e5f612429def", "packages": [ { "name": "carbonphp/carbon-doctrine-types", @@ -77,16 +77,16 @@ }, { "name": "directorytree/imapengine", - "version": "v1.24.1", + "version": "v1.25.0", "source": { "type": "git", "url": "https://github.com/DirectoryTree/ImapEngine.git", - "reference": "d545ff3f6d2155ce7f9f612f0444579477d7bab8" + "reference": "ac8a4d028334c2d3a4bc8fd975317a75cd968a47" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/DirectoryTree/ImapEngine/zipball/d545ff3f6d2155ce7f9f612f0444579477d7bab8", - "reference": "d545ff3f6d2155ce7f9f612f0444579477d7bab8", + "url": "https://api.github.com/repos/DirectoryTree/ImapEngine/zipball/ac8a4d028334c2d3a4bc8fd975317a75cd968a47", + "reference": "ac8a4d028334c2d3a4bc8fd975317a75cd968a47", "shasum": "" }, "require": { @@ -127,7 +127,7 @@ ], "support": { "issues": "https://github.com/DirectoryTree/ImapEngine/issues", - "source": "https://github.com/DirectoryTree/ImapEngine/tree/v1.24.1" + "source": "https://github.com/DirectoryTree/ImapEngine/tree/v1.25.0" }, "funding": [ { @@ -135,97 +135,7 @@ "type": "github" } ], - "time": "2026-05-20T13:36:53+00:00" - }, - { - "name": "doctrine/inflector", - "version": "2.1.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/inflector.git", - "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/6d6c96277ea252fc1304627204c3d5e6e15faa3b", - "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^12.0 || ^13.0", - "phpstan/phpstan": "^1.12 || ^2.0", - "phpstan/phpstan-phpunit": "^1.4 || ^2.0", - "phpstan/phpstan-strict-rules": "^1.6 || ^2.0", - "phpunit/phpunit": "^8.5 || ^12.2" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Inflector\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", - "homepage": "https://www.doctrine-project.org/projects/inflector.html", - "keywords": [ - "inflection", - "inflector", - "lowercase", - "manipulation", - "php", - "plural", - "singular", - "strings", - "uppercase", - "words" - ], - "support": { - "issues": "https://github.com/doctrine/inflector/issues", - "source": "https://github.com/doctrine/inflector/tree/2.1.0" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", - "type": "tidelift" - } - ], - "time": "2025-08-10T19:31:58+00:00" + "time": "2026-06-19T17:03:06+00:00" }, { "name": "doctrine/lexer", @@ -373,16 +283,16 @@ }, { "name": "guzzlehttp/psr7", - "version": "2.11.0", + "version": "2.12.3", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "bbb5e61349fa5cb822b3e87842b951088b76b81f" + "reference": "7ec62dc3f44aa218487dbed81a9bf9bc647be55d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/bbb5e61349fa5cb822b3e87842b951088b76b81f", - "reference": "bbb5e61349fa5cb822b3e87842b951088b76b81f", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/7ec62dc3f44aa218487dbed81a9bf9bc647be55d", + "reference": "7ec62dc3f44aa218487dbed81a9bf9bc647be55d", "shasum": "" }, "require": { @@ -391,7 +301,7 @@ "psr/http-message": "^1.1 || ^2.0", "ralouphie/getallheaders": "^3.0", "symfony/deprecation-contracts": "^2.5 || ^3.0", - "symfony/polyfill-php80": "^1.24" + "symfony/polyfill-php80": "^1.25" }, "provide": { "psr/http-factory-implementation": "1.0", @@ -472,7 +382,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.11.0" + "source": "https://github.com/guzzle/psr7/tree/2.12.3" }, "funding": [ { @@ -488,7 +398,7 @@ "type": "tidelift" } ], - "time": "2026-06-02T12:30:48+00:00" + "time": "2026-06-23T15:21:08+00:00" }, { "name": "illuminate/collections", @@ -690,187 +600,6 @@ }, "time": "2026-03-30T19:05:19+00:00" }, - { - "name": "illuminate/pagination", - "version": "v12.62.0", - "source": { - "type": "git", - "url": "https://github.com/illuminate/pagination.git", - "reference": "8327d828676654053906a771abf5eea5426354ec" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/pagination/zipball/8327d828676654053906a771abf5eea5426354ec", - "reference": "8327d828676654053906a771abf5eea5426354ec", - "shasum": "" - }, - "require": { - "ext-filter": "*", - "illuminate/collections": "^12.0", - "illuminate/contracts": "^12.0", - "illuminate/support": "^12.0", - "php": "^8.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "12.x-dev" - } - }, - "autoload": { - "psr-4": { - "Illuminate\\Pagination\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Illuminate Pagination package.", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "time": "2026-02-25T15:25:18+00:00" - }, - { - "name": "illuminate/reflection", - "version": "v12.62.0", - "source": { - "type": "git", - "url": "https://github.com/illuminate/reflection.git", - "reference": "348cf5da9de89b596d7723be6425fb048e2bf4bb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/reflection/zipball/348cf5da9de89b596d7723be6425fb048e2bf4bb", - "reference": "348cf5da9de89b596d7723be6425fb048e2bf4bb", - "shasum": "" - }, - "require": { - "illuminate/collections": "^12.0", - "illuminate/contracts": "^12.0", - "php": "^8.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "12.x-dev" - } - }, - "autoload": { - "files": [ - "helpers.php" - ], - "psr-4": { - "Illuminate\\Support\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Illuminate Reflection package.", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "time": "2026-02-25T15:25:18+00:00" - }, - { - "name": "illuminate/support", - "version": "v12.62.0", - "source": { - "type": "git", - "url": "https://github.com/illuminate/support.git", - "reference": "3a8772095ef7d6b1961a77f2f0b8921c056c48ea" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/support/zipball/3a8772095ef7d6b1961a77f2f0b8921c056c48ea", - "reference": "3a8772095ef7d6b1961a77f2f0b8921c056c48ea", - "shasum": "" - }, - "require": { - "doctrine/inflector": "^2.0", - "ext-ctype": "*", - "ext-filter": "*", - "ext-mbstring": "*", - "illuminate/collections": "^12.0", - "illuminate/conditionable": "^12.0", - "illuminate/contracts": "^12.0", - "illuminate/macroable": "^12.0", - "illuminate/reflection": "^12.0", - "nesbot/carbon": "^3.8.4", - "php": "^8.2", - "symfony/polyfill-php83": "^1.33", - "symfony/polyfill-php85": "^1.33", - "voku/portable-ascii": "^2.0.2" - }, - "conflict": { - "tightenco/collect": "<5.5.33" - }, - "replace": { - "spatie/once": "*" - }, - "suggest": { - "illuminate/filesystem": "Required to use the Composer class (^12.0).", - "laravel/serializable-closure": "Required to use the once function (^1.3|^2.0).", - "league/commonmark": "Required to use Str::markdown() and Stringable::markdown() (^2.7).", - "league/uri": "Required to use the Uri class (^7.5.1).", - "ramsey/uuid": "Required to use Str::uuid() (^4.7).", - "symfony/process": "Required to use the Composer class (^7.2).", - "symfony/uid": "Required to use Str::ulid() (^7.2).", - "symfony/var-dumper": "Required to use the dd function (^7.2).", - "vlucas/phpdotenv": "Required to use the Env class and env helper (^5.6.1)." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "12.x-dev" - } - }, - "autoload": { - "files": [ - "functions.php", - "helpers.php" - ], - "psr-4": { - "Illuminate\\Support\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Illuminate Support package.", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "time": "2026-05-31T22:10:17+00:00" - }, { "name": "laravel/serializable-closure", "version": "v2.0.13", @@ -934,16 +663,16 @@ }, { "name": "nesbot/carbon", - "version": "3.11.4", + "version": "3.13.0", "source": { "type": "git", "url": "https://github.com/CarbonPHP/carbon.git", - "reference": "e890471a3494740f7d9326d72ce6a8c559ffee60" + "reference": "40f6618f052df16b545f626fbf9a878e6497d16a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/e890471a3494740f7d9326d72ce6a8c559ffee60", - "reference": "e890471a3494740f7d9326d72ce6a8c559ffee60", + "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/40f6618f052df16b545f626fbf9a878e6497d16a", + "reference": "40f6618f052df16b545f626fbf9a878e6497d16a", "shasum": "" }, "require": { @@ -1035,7 +764,7 @@ "type": "tidelift" } ], - "time": "2026-04-07T09:57:54+00:00" + "time": "2026-06-18T13:49:15+00:00" }, { "name": "php-di/invoker", @@ -1668,88 +1397,6 @@ ], "time": "2026-04-13T15:52:40+00:00" }, - { - "name": "symfony/http-foundation", - "version": "v7.4.13", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-foundation.git", - "reference": "bc354f47c62301e990b7874fa662326368508e2c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/bc354f47c62301e990b7874fa662326368508e2c", - "reference": "bc354f47c62301e990b7874fa662326368508e2c", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-mbstring": "^1.1" - }, - "conflict": { - "doctrine/dbal": "<3.6", - "symfony/cache": "<6.4.12|>=7.0,<7.1.5" - }, - "require-dev": { - "doctrine/dbal": "^3.6|^4", - "predis/predis": "^1.1|^2.0", - "symfony/cache": "^6.4.12|^7.1.5|^8.0", - "symfony/clock": "^6.4|^7.0|^8.0", - "symfony/dependency-injection": "^6.4|^7.0|^8.0", - "symfony/expression-language": "^6.4|^7.0|^8.0", - "symfony/http-kernel": "^6.4|^7.0|^8.0", - "symfony/mime": "^6.4|^7.0|^8.0", - "symfony/rate-limiter": "^6.4|^7.0|^8.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\HttpFoundation\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Defines an object-oriented layer for the HTTP specification", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/http-foundation/tree/v7.4.13" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2026-05-24T11:20:33+00:00" - }, { "name": "symfony/mime", "version": "v7.4.13", @@ -2686,173 +2333,18 @@ ], "time": "2026-01-05T13:30:16+00:00" }, - { - "name": "voku/portable-ascii", - "version": "2.1.1", - "source": { - "type": "git", - "url": "https://github.com/voku/portable-ascii.git", - "reference": "8e1051fe39379367aecf014f41744ce7539a856f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/voku/portable-ascii/zipball/8e1051fe39379367aecf014f41744ce7539a856f", - "reference": "8e1051fe39379367aecf014f41744ce7539a856f", - "shasum": "" - }, - "require": { - "php": ">=7.1.0" - }, - "require-dev": { - "phpunit/phpunit": "~8.5 || ~9.6 || ~10.5 || ~11.5" - }, - "suggest": { - "ext-intl": "Use Intl for transliterator_transliterate() support" - }, - "type": "library", - "autoload": { - "psr-4": { - "voku\\": "src/voku/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Lars Moelleken", - "homepage": "https://www.moelleken.org/" - } - ], - "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", - "homepage": "https://github.com/voku/portable-ascii", - "keywords": [ - "ascii", - "clean", - "php" - ], - "support": { - "issues": "https://github.com/voku/portable-ascii/issues", - "source": "https://github.com/voku/portable-ascii/tree/2.1.1" - }, - "funding": [ - { - "url": "https://www.paypal.me/moelleken", - "type": "custom" - }, - { - "url": "https://github.com/voku", - "type": "github" - }, - { - "url": "https://opencollective.com/portable-ascii", - "type": "open_collective" - }, - { - "url": "https://www.patreon.com/voku", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii", - "type": "tidelift" - } - ], - "time": "2026-04-26T05:33:54+00:00" - }, - { - "name": "webklex/php-imap", - "version": "6.2.0", - "source": { - "type": "git", - "url": "https://github.com/Webklex/php-imap.git", - "reference": "6b8ef85d621bbbaf52741b00cca8e9237e2b2e05" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Webklex/php-imap/zipball/6b8ef85d621bbbaf52741b00cca8e9237e2b2e05", - "reference": "6b8ef85d621bbbaf52741b00cca8e9237e2b2e05", - "shasum": "" - }, - "require": { - "ext-fileinfo": "*", - "ext-iconv": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-openssl": "*", - "ext-zip": "*", - "illuminate/pagination": ">=5.0.0", - "nesbot/carbon": "^2.62.1|^3.2.4", - "php": "^8.0.2", - "symfony/http-foundation": ">=2.8.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.5.10" - }, - "suggest": { - "symfony/mime": "Recomended for better extension support", - "symfony/var-dumper": "Usefull tool for debugging" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "6.0-dev" - } - }, - "autoload": { - "psr-4": { - "Webklex\\PHPIMAP\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Malte Goldenbaum", - "email": "github@webklex.com", - "role": "Developer" - } - ], - "description": "PHP IMAP client", - "homepage": "https://github.com/webklex/php-imap", - "keywords": [ - "imap", - "mail", - "php-imap", - "pop3", - "webklex" - ], - "support": { - "issues": "https://github.com/Webklex/php-imap/issues", - "source": "https://github.com/Webklex/php-imap/tree/6.2.0" - }, - "funding": [ - { - "url": "https://www.buymeacoffee.com/webklex", - "type": "custom" - }, - { - "url": "https://ko-fi.com/webklex", - "type": "ko_fi" - } - ], - "time": "2025-04-25T06:02:37+00:00" - }, { "name": "zbateson/mail-mime-parser", - "version": "3.0.5", + "version": "3.0.6", "source": { "type": "git", "url": "https://github.com/zbateson/mail-mime-parser.git", - "reference": "ff054c8e05310c445c2028c6128a4319cc9f6aa8" + "reference": "395c406cc1c5d1eb171d9decb0a3b509e8bd6bc0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/zbateson/mail-mime-parser/zipball/ff054c8e05310c445c2028c6128a4319cc9f6aa8", - "reference": "ff054c8e05310c445c2028c6128a4319cc9f6aa8", + "url": "https://api.github.com/repos/zbateson/mail-mime-parser/zipball/395c406cc1c5d1eb171d9decb0a3b509e8bd6bc0", + "reference": "395c406cc1c5d1eb171d9decb0a3b509e8bd6bc0", "shasum": "" }, "require": { @@ -2915,7 +2407,7 @@ "type": "github" } ], - "time": "2025-12-02T00:29:16+00:00" + "time": "2026-06-24T13:42:46+00:00" }, { "name": "zbateson/mb-wrapper", diff --git a/plugins/vendor/autoload.php b/plugins/vendor/autoload.php index 165b0733..9dbe0fe3 100644 --- a/plugins/vendor/autoload.php +++ b/plugins/vendor/autoload.php @@ -4,4 +4,4 @@ require_once __DIR__ . '/composer/autoload_real.php'; -return ComposerAutoloaderInit9b9826e5b5cc7806cd328c4112cca75e::getLoader(); +return ComposerAutoloaderInitc3c4b7d024f8d7c21b5ca31de3cb6066::getLoader(); diff --git a/plugins/vendor/composer/autoload_classmap.php b/plugins/vendor/composer/autoload_classmap.php index a1e05575..b9426f74 100644 --- a/plugins/vendor/composer/autoload_classmap.php +++ b/plugins/vendor/composer/autoload_classmap.php @@ -7,7 +7,162 @@ $baseDir = dirname($vendorDir); return array( 'Attribute' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Attribute.php', + 'Carbon\\AbstractTranslator' => $vendorDir . '/nesbot/carbon/src/Carbon/AbstractTranslator.php', + 'Carbon\\Callback' => $vendorDir . '/nesbot/carbon/src/Carbon/Callback.php', + 'Carbon\\Carbon' => $vendorDir . '/nesbot/carbon/src/Carbon/Carbon.php', + 'Carbon\\CarbonConverterInterface' => $vendorDir . '/nesbot/carbon/src/Carbon/CarbonConverterInterface.php', + 'Carbon\\CarbonImmutable' => $vendorDir . '/nesbot/carbon/src/Carbon/CarbonImmutable.php', + 'Carbon\\CarbonInterface' => $vendorDir . '/nesbot/carbon/src/Carbon/CarbonInterface.php', + 'Carbon\\CarbonInterval' => $vendorDir . '/nesbot/carbon/src/Carbon/CarbonInterval.php', + 'Carbon\\CarbonPeriod' => $vendorDir . '/nesbot/carbon/src/Carbon/CarbonPeriod.php', + 'Carbon\\CarbonPeriodImmutable' => $vendorDir . '/nesbot/carbon/src/Carbon/CarbonPeriodImmutable.php', + 'Carbon\\CarbonTimeZone' => $vendorDir . '/nesbot/carbon/src/Carbon/CarbonTimeZone.php', + 'Carbon\\Cli\\Invoker' => $vendorDir . '/nesbot/carbon/src/Carbon/Cli/Invoker.php', + 'Carbon\\Constants\\DiffOptions' => $vendorDir . '/nesbot/carbon/src/Carbon/Constants/DiffOptions.php', + 'Carbon\\Constants\\Format' => $vendorDir . '/nesbot/carbon/src/Carbon/Constants/Format.php', + 'Carbon\\Constants\\TranslationOptions' => $vendorDir . '/nesbot/carbon/src/Carbon/Constants/TranslationOptions.php', + 'Carbon\\Constants\\UnitValue' => $vendorDir . '/nesbot/carbon/src/Carbon/Constants/UnitValue.php', + 'Carbon\\Doctrine\\CarbonDoctrineType' => $vendorDir . '/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/CarbonDoctrineType.php', + 'Carbon\\Doctrine\\CarbonImmutableType' => $vendorDir . '/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/CarbonImmutableType.php', + 'Carbon\\Doctrine\\CarbonType' => $vendorDir . '/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/CarbonType.php', + 'Carbon\\Doctrine\\CarbonTypeConverter' => $vendorDir . '/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/CarbonTypeConverter.php', + 'Carbon\\Doctrine\\DateTimeDefaultPrecision' => $vendorDir . '/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/DateTimeDefaultPrecision.php', + 'Carbon\\Doctrine\\DateTimeImmutableType' => $vendorDir . '/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/DateTimeImmutableType.php', + 'Carbon\\Doctrine\\DateTimeType' => $vendorDir . '/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/DateTimeType.php', + 'Carbon\\Exceptions\\BadComparisonUnitException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/BadComparisonUnitException.php', + 'Carbon\\Exceptions\\BadFluentConstructorException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/BadFluentConstructorException.php', + 'Carbon\\Exceptions\\BadFluentSetterException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/BadFluentSetterException.php', + 'Carbon\\Exceptions\\BadMethodCallException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/BadMethodCallException.php', + 'Carbon\\Exceptions\\EndLessPeriodException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/EndLessPeriodException.php', + 'Carbon\\Exceptions\\Exception' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/Exception.php', + 'Carbon\\Exceptions\\ImmutableException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/ImmutableException.php', + 'Carbon\\Exceptions\\InvalidArgumentException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/InvalidArgumentException.php', + 'Carbon\\Exceptions\\InvalidCastException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/InvalidCastException.php', + 'Carbon\\Exceptions\\InvalidDateException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/InvalidDateException.php', + 'Carbon\\Exceptions\\InvalidFormatException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/InvalidFormatException.php', + 'Carbon\\Exceptions\\InvalidIntervalException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/InvalidIntervalException.php', + 'Carbon\\Exceptions\\InvalidPeriodDateException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodDateException.php', + 'Carbon\\Exceptions\\InvalidPeriodParameterException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodParameterException.php', + 'Carbon\\Exceptions\\InvalidTimeZoneException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/InvalidTimeZoneException.php', + 'Carbon\\Exceptions\\InvalidTypeException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/InvalidTypeException.php', + 'Carbon\\Exceptions\\NotACarbonClassException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/NotACarbonClassException.php', + 'Carbon\\Exceptions\\NotAPeriodException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/NotAPeriodException.php', + 'Carbon\\Exceptions\\NotLocaleAwareException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/NotLocaleAwareException.php', + 'Carbon\\Exceptions\\OutOfRangeException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/OutOfRangeException.php', + 'Carbon\\Exceptions\\ParseErrorException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/ParseErrorException.php', + 'Carbon\\Exceptions\\RuntimeException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/RuntimeException.php', + 'Carbon\\Exceptions\\UnitException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/UnitException.php', + 'Carbon\\Exceptions\\UnitNotConfiguredException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/UnitNotConfiguredException.php', + 'Carbon\\Exceptions\\UnknownGetterException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/UnknownGetterException.php', + 'Carbon\\Exceptions\\UnknownMethodException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/UnknownMethodException.php', + 'Carbon\\Exceptions\\UnknownSetterException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/UnknownSetterException.php', + 'Carbon\\Exceptions\\UnknownUnitException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/UnknownUnitException.php', + 'Carbon\\Exceptions\\UnreachableException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/UnreachableException.php', + 'Carbon\\Exceptions\\UnsupportedUnitException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/UnsupportedUnitException.php', + 'Carbon\\Factory' => $vendorDir . '/nesbot/carbon/src/Carbon/Factory.php', + 'Carbon\\FactoryImmutable' => $vendorDir . '/nesbot/carbon/src/Carbon/FactoryImmutable.php', + 'Carbon\\Language' => $vendorDir . '/nesbot/carbon/src/Carbon/Language.php', + 'Carbon\\Laravel\\ServiceProvider' => $vendorDir . '/nesbot/carbon/src/Carbon/Laravel/ServiceProvider.php', + 'Carbon\\MessageFormatter\\MessageFormatterMapper' => $vendorDir . '/nesbot/carbon/src/Carbon/MessageFormatter/MessageFormatterMapper.php', + 'Carbon\\Month' => $vendorDir . '/nesbot/carbon/src/Carbon/Month.php', + 'Carbon\\OverflowMode' => $vendorDir . '/nesbot/carbon/src/Carbon/OverflowMode.php', + 'Carbon\\PHPStan\\MacroExtension' => $vendorDir . '/nesbot/carbon/src/Carbon/PHPStan/MacroExtension.php', + 'Carbon\\PHPStan\\MacroMethodReflection' => $vendorDir . '/nesbot/carbon/src/Carbon/PHPStan/MacroMethodReflection.php', + 'Carbon\\Traits\\Boundaries' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Boundaries.php', + 'Carbon\\Traits\\Cast' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Cast.php', + 'Carbon\\Traits\\Comparison' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Comparison.php', + 'Carbon\\Traits\\Converter' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Converter.php', + 'Carbon\\Traits\\Creator' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Creator.php', + 'Carbon\\Traits\\Date' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Date.php', + 'Carbon\\Traits\\DeprecatedPeriodProperties' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/DeprecatedPeriodProperties.php', + 'Carbon\\Traits\\Difference' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Difference.php', + 'Carbon\\Traits\\IntervalRounding' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/IntervalRounding.php', + 'Carbon\\Traits\\IntervalStep' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/IntervalStep.php', + 'Carbon\\Traits\\LocalFactory' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/LocalFactory.php', + 'Carbon\\Traits\\Localization' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Localization.php', + 'Carbon\\Traits\\Macro' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Macro.php', + 'Carbon\\Traits\\MagicParameter' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/MagicParameter.php', + 'Carbon\\Traits\\Mixin' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Mixin.php', + 'Carbon\\Traits\\Modifiers' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Modifiers.php', + 'Carbon\\Traits\\Mutability' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Mutability.php', + 'Carbon\\Traits\\ObjectInitialisation' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/ObjectInitialisation.php', + 'Carbon\\Traits\\Options' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Options.php', + 'Carbon\\Traits\\Rounding' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Rounding.php', + 'Carbon\\Traits\\Serialization' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Serialization.php', + 'Carbon\\Traits\\StaticLocalization' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/StaticLocalization.php', + 'Carbon\\Traits\\StaticOptions' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/StaticOptions.php', + 'Carbon\\Traits\\Test' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Test.php', + 'Carbon\\Traits\\Timestamp' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Timestamp.php', + 'Carbon\\Traits\\ToStringFormat' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/ToStringFormat.php', + 'Carbon\\Traits\\Units' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Units.php', + 'Carbon\\Traits\\Week' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Week.php', + 'Carbon\\Translator' => $vendorDir . '/nesbot/carbon/src/Carbon/Translator.php', + 'Carbon\\TranslatorImmutable' => $vendorDir . '/nesbot/carbon/src/Carbon/TranslatorImmutable.php', + 'Carbon\\TranslatorStrongTypeInterface' => $vendorDir . '/nesbot/carbon/src/Carbon/TranslatorStrongTypeInterface.php', + 'Carbon\\Unit' => $vendorDir . '/nesbot/carbon/src/Carbon/Unit.php', + 'Carbon\\WeekDay' => $vendorDir . '/nesbot/carbon/src/Carbon/WeekDay.php', + 'Carbon\\WrapperClock' => $vendorDir . '/nesbot/carbon/src/Carbon/WrapperClock.php', 'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php', + 'DI\\Attribute\\Inject' => $vendorDir . '/php-di/php-di/src/Attribute/Inject.php', + 'DI\\Attribute\\Injectable' => $vendorDir . '/php-di/php-di/src/Attribute/Injectable.php', + 'DI\\CompiledContainer' => $vendorDir . '/php-di/php-di/src/CompiledContainer.php', + 'DI\\Compiler\\Compiler' => $vendorDir . '/php-di/php-di/src/Compiler/Compiler.php', + 'DI\\Compiler\\ObjectCreationCompiler' => $vendorDir . '/php-di/php-di/src/Compiler/ObjectCreationCompiler.php', + 'DI\\Compiler\\RequestedEntryHolder' => $vendorDir . '/php-di/php-di/src/Compiler/RequestedEntryHolder.php', + 'DI\\Container' => $vendorDir . '/php-di/php-di/src/Container.php', + 'DI\\ContainerBuilder' => $vendorDir . '/php-di/php-di/src/ContainerBuilder.php', + 'DI\\Definition\\ArrayDefinition' => $vendorDir . '/php-di/php-di/src/Definition/ArrayDefinition.php', + 'DI\\Definition\\ArrayDefinitionExtension' => $vendorDir . '/php-di/php-di/src/Definition/ArrayDefinitionExtension.php', + 'DI\\Definition\\AutowireDefinition' => $vendorDir . '/php-di/php-di/src/Definition/AutowireDefinition.php', + 'DI\\Definition\\DecoratorDefinition' => $vendorDir . '/php-di/php-di/src/Definition/DecoratorDefinition.php', + 'DI\\Definition\\Definition' => $vendorDir . '/php-di/php-di/src/Definition/Definition.php', + 'DI\\Definition\\Dumper\\ObjectDefinitionDumper' => $vendorDir . '/php-di/php-di/src/Definition/Dumper/ObjectDefinitionDumper.php', + 'DI\\Definition\\EnvironmentVariableDefinition' => $vendorDir . '/php-di/php-di/src/Definition/EnvironmentVariableDefinition.php', + 'DI\\Definition\\Exception\\InvalidAttribute' => $vendorDir . '/php-di/php-di/src/Definition/Exception/InvalidAttribute.php', + 'DI\\Definition\\Exception\\InvalidDefinition' => $vendorDir . '/php-di/php-di/src/Definition/Exception/InvalidDefinition.php', + 'DI\\Definition\\ExtendsPreviousDefinition' => $vendorDir . '/php-di/php-di/src/Definition/ExtendsPreviousDefinition.php', + 'DI\\Definition\\FactoryDefinition' => $vendorDir . '/php-di/php-di/src/Definition/FactoryDefinition.php', + 'DI\\Definition\\Helper\\AutowireDefinitionHelper' => $vendorDir . '/php-di/php-di/src/Definition/Helper/AutowireDefinitionHelper.php', + 'DI\\Definition\\Helper\\CreateDefinitionHelper' => $vendorDir . '/php-di/php-di/src/Definition/Helper/CreateDefinitionHelper.php', + 'DI\\Definition\\Helper\\DefinitionHelper' => $vendorDir . '/php-di/php-di/src/Definition/Helper/DefinitionHelper.php', + 'DI\\Definition\\Helper\\FactoryDefinitionHelper' => $vendorDir . '/php-di/php-di/src/Definition/Helper/FactoryDefinitionHelper.php', + 'DI\\Definition\\InstanceDefinition' => $vendorDir . '/php-di/php-di/src/Definition/InstanceDefinition.php', + 'DI\\Definition\\ObjectDefinition' => $vendorDir . '/php-di/php-di/src/Definition/ObjectDefinition.php', + 'DI\\Definition\\ObjectDefinition\\MethodInjection' => $vendorDir . '/php-di/php-di/src/Definition/ObjectDefinition/MethodInjection.php', + 'DI\\Definition\\ObjectDefinition\\PropertyInjection' => $vendorDir . '/php-di/php-di/src/Definition/ObjectDefinition/PropertyInjection.php', + 'DI\\Definition\\Reference' => $vendorDir . '/php-di/php-di/src/Definition/Reference.php', + 'DI\\Definition\\Resolver\\ArrayResolver' => $vendorDir . '/php-di/php-di/src/Definition/Resolver/ArrayResolver.php', + 'DI\\Definition\\Resolver\\DecoratorResolver' => $vendorDir . '/php-di/php-di/src/Definition/Resolver/DecoratorResolver.php', + 'DI\\Definition\\Resolver\\DefinitionResolver' => $vendorDir . '/php-di/php-di/src/Definition/Resolver/DefinitionResolver.php', + 'DI\\Definition\\Resolver\\EnvironmentVariableResolver' => $vendorDir . '/php-di/php-di/src/Definition/Resolver/EnvironmentVariableResolver.php', + 'DI\\Definition\\Resolver\\FactoryResolver' => $vendorDir . '/php-di/php-di/src/Definition/Resolver/FactoryResolver.php', + 'DI\\Definition\\Resolver\\InstanceInjector' => $vendorDir . '/php-di/php-di/src/Definition/Resolver/InstanceInjector.php', + 'DI\\Definition\\Resolver\\ObjectCreator' => $vendorDir . '/php-di/php-di/src/Definition/Resolver/ObjectCreator.php', + 'DI\\Definition\\Resolver\\ParameterResolver' => $vendorDir . '/php-di/php-di/src/Definition/Resolver/ParameterResolver.php', + 'DI\\Definition\\Resolver\\ResolverDispatcher' => $vendorDir . '/php-di/php-di/src/Definition/Resolver/ResolverDispatcher.php', + 'DI\\Definition\\SelfResolvingDefinition' => $vendorDir . '/php-di/php-di/src/Definition/SelfResolvingDefinition.php', + 'DI\\Definition\\Source\\AttributeBasedAutowiring' => $vendorDir . '/php-di/php-di/src/Definition/Source/AttributeBasedAutowiring.php', + 'DI\\Definition\\Source\\Autowiring' => $vendorDir . '/php-di/php-di/src/Definition/Source/Autowiring.php', + 'DI\\Definition\\Source\\DefinitionArray' => $vendorDir . '/php-di/php-di/src/Definition/Source/DefinitionArray.php', + 'DI\\Definition\\Source\\DefinitionFile' => $vendorDir . '/php-di/php-di/src/Definition/Source/DefinitionFile.php', + 'DI\\Definition\\Source\\DefinitionNormalizer' => $vendorDir . '/php-di/php-di/src/Definition/Source/DefinitionNormalizer.php', + 'DI\\Definition\\Source\\DefinitionSource' => $vendorDir . '/php-di/php-di/src/Definition/Source/DefinitionSource.php', + 'DI\\Definition\\Source\\MutableDefinitionSource' => $vendorDir . '/php-di/php-di/src/Definition/Source/MutableDefinitionSource.php', + 'DI\\Definition\\Source\\NoAutowiring' => $vendorDir . '/php-di/php-di/src/Definition/Source/NoAutowiring.php', + 'DI\\Definition\\Source\\ReflectionBasedAutowiring' => $vendorDir . '/php-di/php-di/src/Definition/Source/ReflectionBasedAutowiring.php', + 'DI\\Definition\\Source\\SourceCache' => $vendorDir . '/php-di/php-di/src/Definition/Source/SourceCache.php', + 'DI\\Definition\\Source\\SourceChain' => $vendorDir . '/php-di/php-di/src/Definition/Source/SourceChain.php', + 'DI\\Definition\\StringDefinition' => $vendorDir . '/php-di/php-di/src/Definition/StringDefinition.php', + 'DI\\Definition\\ValueDefinition' => $vendorDir . '/php-di/php-di/src/Definition/ValueDefinition.php', + 'DI\\DependencyException' => $vendorDir . '/php-di/php-di/src/DependencyException.php', + 'DI\\FactoryInterface' => $vendorDir . '/php-di/php-di/src/FactoryInterface.php', + 'DI\\Factory\\RequestedEntry' => $vendorDir . '/php-di/php-di/src/Factory/RequestedEntry.php', + 'DI\\Invoker\\DefinitionParameterResolver' => $vendorDir . '/php-di/php-di/src/Invoker/DefinitionParameterResolver.php', + 'DI\\Invoker\\FactoryParameterResolver' => $vendorDir . '/php-di/php-di/src/Invoker/FactoryParameterResolver.php', + 'DI\\NotFoundException' => $vendorDir . '/php-di/php-di/src/NotFoundException.php', + 'DI\\Proxy\\NativeProxyFactory' => $vendorDir . '/php-di/php-di/src/Proxy/NativeProxyFactory.php', + 'DI\\Proxy\\ProxyFactory' => $vendorDir . '/php-di/php-di/src/Proxy/ProxyFactory.php', + 'DI\\Proxy\\ProxyFactoryInterface' => $vendorDir . '/php-di/php-di/src/Proxy/ProxyFactoryInterface.php', 'DateError' => $vendorDir . '/symfony/polyfill-php83/Resources/stubs/DateError.php', 'DateException' => $vendorDir . '/symfony/polyfill-php83/Resources/stubs/DateException.php', 'DateInvalidOperationException' => $vendorDir . '/symfony/polyfill-php83/Resources/stubs/DateInvalidOperationException.php', @@ -19,8 +174,413 @@ return array( 'DateRangeError' => $vendorDir . '/symfony/polyfill-php83/Resources/stubs/DateRangeError.php', 'DelayedTargetValidation' => $vendorDir . '/symfony/polyfill-php85/Resources/stubs/DelayedTargetValidation.php', 'Deprecated' => $vendorDir . '/symfony/polyfill-php84/Resources/stubs/Deprecated.php', + 'DirectoryTree\\ImapEngine\\Address' => $vendorDir . '/directorytree/imapengine/src/Address.php', + 'DirectoryTree\\ImapEngine\\Attachment' => $vendorDir . '/directorytree/imapengine/src/Attachment.php', + 'DirectoryTree\\ImapEngine\\BodyStructureCollection' => $vendorDir . '/directorytree/imapengine/src/BodyStructureCollection.php', + 'DirectoryTree\\ImapEngine\\BodyStructurePart' => $vendorDir . '/directorytree/imapengine/src/BodyStructurePart.php', + 'DirectoryTree\\ImapEngine\\Collections\\FolderCollection' => $vendorDir . '/directorytree/imapengine/src/Collections/FolderCollection.php', + 'DirectoryTree\\ImapEngine\\Collections\\MessageCollection' => $vendorDir . '/directorytree/imapengine/src/Collections/MessageCollection.php', + 'DirectoryTree\\ImapEngine\\Collections\\PaginatedCollection' => $vendorDir . '/directorytree/imapengine/src/Collections/PaginatedCollection.php', + 'DirectoryTree\\ImapEngine\\Collections\\ResponseCollection' => $vendorDir . '/directorytree/imapengine/src/Collections/ResponseCollection.php', + 'DirectoryTree\\ImapEngine\\ComparesFolders' => $vendorDir . '/directorytree/imapengine/src/ComparesFolders.php', + 'DirectoryTree\\ImapEngine\\Connection\\ConnectionInterface' => $vendorDir . '/directorytree/imapengine/src/Connection/ConnectionInterface.php', + 'DirectoryTree\\ImapEngine\\Connection\\ImapCommand' => $vendorDir . '/directorytree/imapengine/src/Connection/ImapCommand.php', + 'DirectoryTree\\ImapEngine\\Connection\\ImapConnection' => $vendorDir . '/directorytree/imapengine/src/Connection/ImapConnection.php', + 'DirectoryTree\\ImapEngine\\Connection\\ImapParser' => $vendorDir . '/directorytree/imapengine/src/Connection/ImapParser.php', + 'DirectoryTree\\ImapEngine\\Connection\\ImapQueryBuilder' => $vendorDir . '/directorytree/imapengine/src/Connection/ImapQueryBuilder.php', + 'DirectoryTree\\ImapEngine\\Connection\\ImapTokenizer' => $vendorDir . '/directorytree/imapengine/src/Connection/ImapTokenizer.php', + 'DirectoryTree\\ImapEngine\\Connection\\Loggers\\EchoLogger' => $vendorDir . '/directorytree/imapengine/src/Connection/Loggers/EchoLogger.php', + 'DirectoryTree\\ImapEngine\\Connection\\Loggers\\FileLogger' => $vendorDir . '/directorytree/imapengine/src/Connection/Loggers/FileLogger.php', + 'DirectoryTree\\ImapEngine\\Connection\\Loggers\\Logger' => $vendorDir . '/directorytree/imapengine/src/Connection/Loggers/Logger.php', + 'DirectoryTree\\ImapEngine\\Connection\\Loggers\\LoggerInterface' => $vendorDir . '/directorytree/imapengine/src/Connection/Loggers/LoggerInterface.php', + 'DirectoryTree\\ImapEngine\\Connection\\Loggers\\RayLogger' => $vendorDir . '/directorytree/imapengine/src/Connection/Loggers/RayLogger.php', + 'DirectoryTree\\ImapEngine\\Connection\\RawQueryValue' => $vendorDir . '/directorytree/imapengine/src/Connection/RawQueryValue.php', + 'DirectoryTree\\ImapEngine\\Connection\\Responses\\ContinuationResponse' => $vendorDir . '/directorytree/imapengine/src/Connection/Responses/ContinuationResponse.php', + 'DirectoryTree\\ImapEngine\\Connection\\Responses\\Data\\Data' => $vendorDir . '/directorytree/imapengine/src/Connection/Responses/Data/Data.php', + 'DirectoryTree\\ImapEngine\\Connection\\Responses\\Data\\ListData' => $vendorDir . '/directorytree/imapengine/src/Connection/Responses/Data/ListData.php', + 'DirectoryTree\\ImapEngine\\Connection\\Responses\\Data\\ResponseCodeData' => $vendorDir . '/directorytree/imapengine/src/Connection/Responses/Data/ResponseCodeData.php', + 'DirectoryTree\\ImapEngine\\Connection\\Responses\\HasTokens' => $vendorDir . '/directorytree/imapengine/src/Connection/Responses/HasTokens.php', + 'DirectoryTree\\ImapEngine\\Connection\\Responses\\MessageResponseParser' => $vendorDir . '/directorytree/imapengine/src/Connection/Responses/MessageResponseParser.php', + 'DirectoryTree\\ImapEngine\\Connection\\Responses\\Response' => $vendorDir . '/directorytree/imapengine/src/Connection/Responses/Response.php', + 'DirectoryTree\\ImapEngine\\Connection\\Responses\\TaggedResponse' => $vendorDir . '/directorytree/imapengine/src/Connection/Responses/TaggedResponse.php', + 'DirectoryTree\\ImapEngine\\Connection\\Responses\\UntaggedResponse' => $vendorDir . '/directorytree/imapengine/src/Connection/Responses/UntaggedResponse.php', + 'DirectoryTree\\ImapEngine\\Connection\\Result' => $vendorDir . '/directorytree/imapengine/src/Connection/Result.php', + 'DirectoryTree\\ImapEngine\\Connection\\Streams\\FakeStream' => $vendorDir . '/directorytree/imapengine/src/Connection/Streams/FakeStream.php', + 'DirectoryTree\\ImapEngine\\Connection\\Streams\\ImapStream' => $vendorDir . '/directorytree/imapengine/src/Connection/Streams/ImapStream.php', + 'DirectoryTree\\ImapEngine\\Connection\\Streams\\StreamInterface' => $vendorDir . '/directorytree/imapengine/src/Connection/Streams/StreamInterface.php', + 'DirectoryTree\\ImapEngine\\Connection\\Tokens\\Atom' => $vendorDir . '/directorytree/imapengine/src/Connection/Tokens/Atom.php', + 'DirectoryTree\\ImapEngine\\Connection\\Tokens\\Crlf' => $vendorDir . '/directorytree/imapengine/src/Connection/Tokens/Crlf.php', + 'DirectoryTree\\ImapEngine\\Connection\\Tokens\\EmailAddress' => $vendorDir . '/directorytree/imapengine/src/Connection/Tokens/EmailAddress.php', + 'DirectoryTree\\ImapEngine\\Connection\\Tokens\\ListClose' => $vendorDir . '/directorytree/imapengine/src/Connection/Tokens/ListClose.php', + 'DirectoryTree\\ImapEngine\\Connection\\Tokens\\ListOpen' => $vendorDir . '/directorytree/imapengine/src/Connection/Tokens/ListOpen.php', + 'DirectoryTree\\ImapEngine\\Connection\\Tokens\\Literal' => $vendorDir . '/directorytree/imapengine/src/Connection/Tokens/Literal.php', + 'DirectoryTree\\ImapEngine\\Connection\\Tokens\\Nil' => $vendorDir . '/directorytree/imapengine/src/Connection/Tokens/Nil.php', + 'DirectoryTree\\ImapEngine\\Connection\\Tokens\\Number' => $vendorDir . '/directorytree/imapengine/src/Connection/Tokens/Number.php', + 'DirectoryTree\\ImapEngine\\Connection\\Tokens\\QuotedString' => $vendorDir . '/directorytree/imapengine/src/Connection/Tokens/QuotedString.php', + 'DirectoryTree\\ImapEngine\\Connection\\Tokens\\ResponseCodeClose' => $vendorDir . '/directorytree/imapengine/src/Connection/Tokens/ResponseCodeClose.php', + 'DirectoryTree\\ImapEngine\\Connection\\Tokens\\ResponseCodeOpen' => $vendorDir . '/directorytree/imapengine/src/Connection/Tokens/ResponseCodeOpen.php', + 'DirectoryTree\\ImapEngine\\Connection\\Tokens\\Token' => $vendorDir . '/directorytree/imapengine/src/Connection/Tokens/Token.php', + 'DirectoryTree\\ImapEngine\\ContentDisposition' => $vendorDir . '/directorytree/imapengine/src/ContentDisposition.php', + 'DirectoryTree\\ImapEngine\\DraftMessage' => $vendorDir . '/directorytree/imapengine/src/DraftMessage.php', + 'DirectoryTree\\ImapEngine\\Enums\\ContentDispositionType' => $vendorDir . '/directorytree/imapengine/src/Enums/ContentDispositionType.php', + 'DirectoryTree\\ImapEngine\\Enums\\ImapFetchIdentifier' => $vendorDir . '/directorytree/imapengine/src/Enums/ImapFetchIdentifier.php', + 'DirectoryTree\\ImapEngine\\Enums\\ImapFlag' => $vendorDir . '/directorytree/imapengine/src/Enums/ImapFlag.php', + 'DirectoryTree\\ImapEngine\\Enums\\ImapSearchKey' => $vendorDir . '/directorytree/imapengine/src/Enums/ImapSearchKey.php', + 'DirectoryTree\\ImapEngine\\Enums\\ImapSortKey' => $vendorDir . '/directorytree/imapengine/src/Enums/ImapSortKey.php', + 'DirectoryTree\\ImapEngine\\Exceptions\\Exception' => $vendorDir . '/directorytree/imapengine/src/Exceptions/Exception.php', + 'DirectoryTree\\ImapEngine\\Exceptions\\ImapCapabilityException' => $vendorDir . '/directorytree/imapengine/src/Exceptions/ImapCapabilityException.php', + 'DirectoryTree\\ImapEngine\\Exceptions\\ImapCommandException' => $vendorDir . '/directorytree/imapengine/src/Exceptions/ImapCommandException.php', + 'DirectoryTree\\ImapEngine\\Exceptions\\ImapConnectionClosedException' => $vendorDir . '/directorytree/imapengine/src/Exceptions/ImapConnectionClosedException.php', + 'DirectoryTree\\ImapEngine\\Exceptions\\ImapConnectionException' => $vendorDir . '/directorytree/imapengine/src/Exceptions/ImapConnectionException.php', + 'DirectoryTree\\ImapEngine\\Exceptions\\ImapConnectionFailedException' => $vendorDir . '/directorytree/imapengine/src/Exceptions/ImapConnectionFailedException.php', + 'DirectoryTree\\ImapEngine\\Exceptions\\ImapConnectionTimedOutException' => $vendorDir . '/directorytree/imapengine/src/Exceptions/ImapConnectionTimedOutException.php', + 'DirectoryTree\\ImapEngine\\Exceptions\\ImapParserException' => $vendorDir . '/directorytree/imapengine/src/Exceptions/ImapParserException.php', + 'DirectoryTree\\ImapEngine\\Exceptions\\ImapResponseException' => $vendorDir . '/directorytree/imapengine/src/Exceptions/ImapResponseException.php', + 'DirectoryTree\\ImapEngine\\Exceptions\\ImapStreamException' => $vendorDir . '/directorytree/imapengine/src/Exceptions/ImapStreamException.php', + 'DirectoryTree\\ImapEngine\\Exceptions\\RuntimeException' => $vendorDir . '/directorytree/imapengine/src/Exceptions/RuntimeException.php', + 'DirectoryTree\\ImapEngine\\FileMessage' => $vendorDir . '/directorytree/imapengine/src/FileMessage.php', + 'DirectoryTree\\ImapEngine\\FlaggableInterface' => $vendorDir . '/directorytree/imapengine/src/FlaggableInterface.php', + 'DirectoryTree\\ImapEngine\\Folder' => $vendorDir . '/directorytree/imapengine/src/Folder.php', + 'DirectoryTree\\ImapEngine\\FolderInterface' => $vendorDir . '/directorytree/imapengine/src/FolderInterface.php', + 'DirectoryTree\\ImapEngine\\FolderRepository' => $vendorDir . '/directorytree/imapengine/src/FolderRepository.php', + 'DirectoryTree\\ImapEngine\\FolderRepositoryInterface' => $vendorDir . '/directorytree/imapengine/src/FolderRepositoryInterface.php', + 'DirectoryTree\\ImapEngine\\HasFlags' => $vendorDir . '/directorytree/imapengine/src/HasFlags.php', + 'DirectoryTree\\ImapEngine\\HasMessageAccessors' => $vendorDir . '/directorytree/imapengine/src/HasMessageAccessors.php', + 'DirectoryTree\\ImapEngine\\HasParsedMessage' => $vendorDir . '/directorytree/imapengine/src/HasParsedMessage.php', + 'DirectoryTree\\ImapEngine\\Idle' => $vendorDir . '/directorytree/imapengine/src/Idle.php', + 'DirectoryTree\\ImapEngine\\Mailbox' => $vendorDir . '/directorytree/imapengine/src/Mailbox.php', + 'DirectoryTree\\ImapEngine\\MailboxInterface' => $vendorDir . '/directorytree/imapengine/src/MailboxInterface.php', + 'DirectoryTree\\ImapEngine\\Mbox' => $vendorDir . '/directorytree/imapengine/src/Mbox.php', + 'DirectoryTree\\ImapEngine\\Message' => $vendorDir . '/directorytree/imapengine/src/Message.php', + 'DirectoryTree\\ImapEngine\\MessageInterface' => $vendorDir . '/directorytree/imapengine/src/MessageInterface.php', + 'DirectoryTree\\ImapEngine\\MessageParser' => $vendorDir . '/directorytree/imapengine/src/MessageParser.php', + 'DirectoryTree\\ImapEngine\\MessageQuery' => $vendorDir . '/directorytree/imapengine/src/MessageQuery.php', + 'DirectoryTree\\ImapEngine\\MessageQueryInterface' => $vendorDir . '/directorytree/imapengine/src/MessageQueryInterface.php', + 'DirectoryTree\\ImapEngine\\Pagination\\LengthAwarePaginator' => $vendorDir . '/directorytree/imapengine/src/Pagination/LengthAwarePaginator.php', + 'DirectoryTree\\ImapEngine\\Poll' => $vendorDir . '/directorytree/imapengine/src/Poll.php', + 'DirectoryTree\\ImapEngine\\QueriesMessages' => $vendorDir . '/directorytree/imapengine/src/QueriesMessages.php', + 'DirectoryTree\\ImapEngine\\Support\\BodyPartDecoder' => $vendorDir . '/directorytree/imapengine/src/Support/BodyPartDecoder.php', + 'DirectoryTree\\ImapEngine\\Support\\ForwardsCalls' => $vendorDir . '/directorytree/imapengine/src/Support/ForwardsCalls.php', + 'DirectoryTree\\ImapEngine\\Support\\LazyBodyPartStream' => $vendorDir . '/directorytree/imapengine/src/Support/LazyBodyPartStream.php', + 'DirectoryTree\\ImapEngine\\Support\\MimeMessage' => $vendorDir . '/directorytree/imapengine/src/Support/MimeMessage.php', + 'DirectoryTree\\ImapEngine\\Support\\Str' => $vendorDir . '/directorytree/imapengine/src/Support/Str.php', + 'DirectoryTree\\ImapEngine\\Testing\\FakeFolder' => $vendorDir . '/directorytree/imapengine/src/Testing/FakeFolder.php', + 'DirectoryTree\\ImapEngine\\Testing\\FakeFolderRepository' => $vendorDir . '/directorytree/imapengine/src/Testing/FakeFolderRepository.php', + 'DirectoryTree\\ImapEngine\\Testing\\FakeMailbox' => $vendorDir . '/directorytree/imapengine/src/Testing/FakeMailbox.php', + 'DirectoryTree\\ImapEngine\\Testing\\FakeMessage' => $vendorDir . '/directorytree/imapengine/src/Testing/FakeMessage.php', + 'DirectoryTree\\ImapEngine\\Testing\\FakeMessageQuery' => $vendorDir . '/directorytree/imapengine/src/Testing/FakeMessageQuery.php', + 'Doctrine\\Common\\Lexer\\AbstractLexer' => $vendorDir . '/doctrine/lexer/src/AbstractLexer.php', + 'Doctrine\\Common\\Lexer\\Token' => $vendorDir . '/doctrine/lexer/src/Token.php', + 'Egulias\\EmailValidator\\EmailLexer' => $vendorDir . '/egulias/email-validator/src/EmailLexer.php', + 'Egulias\\EmailValidator\\EmailParser' => $vendorDir . '/egulias/email-validator/src/EmailParser.php', + 'Egulias\\EmailValidator\\EmailValidator' => $vendorDir . '/egulias/email-validator/src/EmailValidator.php', + 'Egulias\\EmailValidator\\MessageIDParser' => $vendorDir . '/egulias/email-validator/src/MessageIDParser.php', + 'Egulias\\EmailValidator\\Parser' => $vendorDir . '/egulias/email-validator/src/Parser.php', + 'Egulias\\EmailValidator\\Parser\\Comment' => $vendorDir . '/egulias/email-validator/src/Parser/Comment.php', + 'Egulias\\EmailValidator\\Parser\\CommentStrategy\\CommentStrategy' => $vendorDir . '/egulias/email-validator/src/Parser/CommentStrategy/CommentStrategy.php', + 'Egulias\\EmailValidator\\Parser\\CommentStrategy\\DomainComment' => $vendorDir . '/egulias/email-validator/src/Parser/CommentStrategy/DomainComment.php', + 'Egulias\\EmailValidator\\Parser\\CommentStrategy\\LocalComment' => $vendorDir . '/egulias/email-validator/src/Parser/CommentStrategy/LocalComment.php', + 'Egulias\\EmailValidator\\Parser\\DomainLiteral' => $vendorDir . '/egulias/email-validator/src/Parser/DomainLiteral.php', + 'Egulias\\EmailValidator\\Parser\\DomainPart' => $vendorDir . '/egulias/email-validator/src/Parser/DomainPart.php', + 'Egulias\\EmailValidator\\Parser\\DoubleQuote' => $vendorDir . '/egulias/email-validator/src/Parser/DoubleQuote.php', + 'Egulias\\EmailValidator\\Parser\\FoldingWhiteSpace' => $vendorDir . '/egulias/email-validator/src/Parser/FoldingWhiteSpace.php', + 'Egulias\\EmailValidator\\Parser\\IDLeftPart' => $vendorDir . '/egulias/email-validator/src/Parser/IDLeftPart.php', + 'Egulias\\EmailValidator\\Parser\\IDRightPart' => $vendorDir . '/egulias/email-validator/src/Parser/IDRightPart.php', + 'Egulias\\EmailValidator\\Parser\\LocalPart' => $vendorDir . '/egulias/email-validator/src/Parser/LocalPart.php', + 'Egulias\\EmailValidator\\Parser\\PartParser' => $vendorDir . '/egulias/email-validator/src/Parser/PartParser.php', + 'Egulias\\EmailValidator\\Result\\InvalidEmail' => $vendorDir . '/egulias/email-validator/src/Result/InvalidEmail.php', + 'Egulias\\EmailValidator\\Result\\MultipleErrors' => $vendorDir . '/egulias/email-validator/src/Result/MultipleErrors.php', + 'Egulias\\EmailValidator\\Result\\Reason\\AtextAfterCFWS' => $vendorDir . '/egulias/email-validator/src/Result/Reason/AtextAfterCFWS.php', + 'Egulias\\EmailValidator\\Result\\Reason\\CRLFAtTheEnd' => $vendorDir . '/egulias/email-validator/src/Result/Reason/CRLFAtTheEnd.php', + 'Egulias\\EmailValidator\\Result\\Reason\\CRLFX2' => $vendorDir . '/egulias/email-validator/src/Result/Reason/CRLFX2.php', + 'Egulias\\EmailValidator\\Result\\Reason\\CRNoLF' => $vendorDir . '/egulias/email-validator/src/Result/Reason/CRNoLF.php', + 'Egulias\\EmailValidator\\Result\\Reason\\CharNotAllowed' => $vendorDir . '/egulias/email-validator/src/Result/Reason/CharNotAllowed.php', + 'Egulias\\EmailValidator\\Result\\Reason\\CommaInDomain' => $vendorDir . '/egulias/email-validator/src/Result/Reason/CommaInDomain.php', + 'Egulias\\EmailValidator\\Result\\Reason\\CommentsInIDRight' => $vendorDir . '/egulias/email-validator/src/Result/Reason/CommentsInIDRight.php', + 'Egulias\\EmailValidator\\Result\\Reason\\ConsecutiveAt' => $vendorDir . '/egulias/email-validator/src/Result/Reason/ConsecutiveAt.php', + 'Egulias\\EmailValidator\\Result\\Reason\\ConsecutiveDot' => $vendorDir . '/egulias/email-validator/src/Result/Reason/ConsecutiveDot.php', + 'Egulias\\EmailValidator\\Result\\Reason\\DetailedReason' => $vendorDir . '/egulias/email-validator/src/Result/Reason/DetailedReason.php', + 'Egulias\\EmailValidator\\Result\\Reason\\DomainAcceptsNoMail' => $vendorDir . '/egulias/email-validator/src/Result/Reason/DomainAcceptsNoMail.php', + 'Egulias\\EmailValidator\\Result\\Reason\\DomainHyphened' => $vendorDir . '/egulias/email-validator/src/Result/Reason/DomainHyphened.php', + 'Egulias\\EmailValidator\\Result\\Reason\\DomainTooLong' => $vendorDir . '/egulias/email-validator/src/Result/Reason/DomainTooLong.php', + 'Egulias\\EmailValidator\\Result\\Reason\\DotAtEnd' => $vendorDir . '/egulias/email-validator/src/Result/Reason/DotAtEnd.php', + 'Egulias\\EmailValidator\\Result\\Reason\\DotAtStart' => $vendorDir . '/egulias/email-validator/src/Result/Reason/DotAtStart.php', + 'Egulias\\EmailValidator\\Result\\Reason\\EmptyReason' => $vendorDir . '/egulias/email-validator/src/Result/Reason/EmptyReason.php', + 'Egulias\\EmailValidator\\Result\\Reason\\ExceptionFound' => $vendorDir . '/egulias/email-validator/src/Result/Reason/ExceptionFound.php', + 'Egulias\\EmailValidator\\Result\\Reason\\ExpectingATEXT' => $vendorDir . '/egulias/email-validator/src/Result/Reason/ExpectingATEXT.php', + 'Egulias\\EmailValidator\\Result\\Reason\\ExpectingCTEXT' => $vendorDir . '/egulias/email-validator/src/Result/Reason/ExpectingCTEXT.php', + 'Egulias\\EmailValidator\\Result\\Reason\\ExpectingDTEXT' => $vendorDir . '/egulias/email-validator/src/Result/Reason/ExpectingDTEXT.php', + 'Egulias\\EmailValidator\\Result\\Reason\\ExpectingDomainLiteralClose' => $vendorDir . '/egulias/email-validator/src/Result/Reason/ExpectingDomainLiteralClose.php', + 'Egulias\\EmailValidator\\Result\\Reason\\LabelTooLong' => $vendorDir . '/egulias/email-validator/src/Result/Reason/LabelTooLong.php', + 'Egulias\\EmailValidator\\Result\\Reason\\LocalOrReservedDomain' => $vendorDir . '/egulias/email-validator/src/Result/Reason/LocalOrReservedDomain.php', + 'Egulias\\EmailValidator\\Result\\Reason\\NoDNSRecord' => $vendorDir . '/egulias/email-validator/src/Result/Reason/NoDNSRecord.php', + 'Egulias\\EmailValidator\\Result\\Reason\\NoDomainPart' => $vendorDir . '/egulias/email-validator/src/Result/Reason/NoDomainPart.php', + 'Egulias\\EmailValidator\\Result\\Reason\\NoLocalPart' => $vendorDir . '/egulias/email-validator/src/Result/Reason/NoLocalPart.php', + 'Egulias\\EmailValidator\\Result\\Reason\\RFCWarnings' => $vendorDir . '/egulias/email-validator/src/Result/Reason/RFCWarnings.php', + 'Egulias\\EmailValidator\\Result\\Reason\\Reason' => $vendorDir . '/egulias/email-validator/src/Result/Reason/Reason.php', + 'Egulias\\EmailValidator\\Result\\Reason\\SpoofEmail' => $vendorDir . '/egulias/email-validator/src/Result/Reason/SpoofEmail.php', + 'Egulias\\EmailValidator\\Result\\Reason\\UnOpenedComment' => $vendorDir . '/egulias/email-validator/src/Result/Reason/UnOpenedComment.php', + 'Egulias\\EmailValidator\\Result\\Reason\\UnableToGetDNSRecord' => $vendorDir . '/egulias/email-validator/src/Result/Reason/UnableToGetDNSRecord.php', + 'Egulias\\EmailValidator\\Result\\Reason\\UnclosedComment' => $vendorDir . '/egulias/email-validator/src/Result/Reason/UnclosedComment.php', + 'Egulias\\EmailValidator\\Result\\Reason\\UnclosedQuotedString' => $vendorDir . '/egulias/email-validator/src/Result/Reason/UnclosedQuotedString.php', + 'Egulias\\EmailValidator\\Result\\Reason\\UnusualElements' => $vendorDir . '/egulias/email-validator/src/Result/Reason/UnusualElements.php', + 'Egulias\\EmailValidator\\Result\\Result' => $vendorDir . '/egulias/email-validator/src/Result/Result.php', + 'Egulias\\EmailValidator\\Result\\SpoofEmail' => $vendorDir . '/egulias/email-validator/src/Result/SpoofEmail.php', + 'Egulias\\EmailValidator\\Result\\ValidEmail' => $vendorDir . '/egulias/email-validator/src/Result/ValidEmail.php', + 'Egulias\\EmailValidator\\Validation\\DNSCheckValidation' => $vendorDir . '/egulias/email-validator/src/Validation/DNSCheckValidation.php', + 'Egulias\\EmailValidator\\Validation\\DNSGetRecordWrapper' => $vendorDir . '/egulias/email-validator/src/Validation/DNSGetRecordWrapper.php', + 'Egulias\\EmailValidator\\Validation\\DNSRecords' => $vendorDir . '/egulias/email-validator/src/Validation/DNSRecords.php', + 'Egulias\\EmailValidator\\Validation\\EmailValidation' => $vendorDir . '/egulias/email-validator/src/Validation/EmailValidation.php', + 'Egulias\\EmailValidator\\Validation\\Exception\\EmptyValidationList' => $vendorDir . '/egulias/email-validator/src/Validation/Exception/EmptyValidationList.php', + 'Egulias\\EmailValidator\\Validation\\Extra\\SpoofCheckValidation' => $vendorDir . '/egulias/email-validator/src/Validation/Extra/SpoofCheckValidation.php', + 'Egulias\\EmailValidator\\Validation\\MessageIDValidation' => $vendorDir . '/egulias/email-validator/src/Validation/MessageIDValidation.php', + 'Egulias\\EmailValidator\\Validation\\MultipleValidationWithAnd' => $vendorDir . '/egulias/email-validator/src/Validation/MultipleValidationWithAnd.php', + 'Egulias\\EmailValidator\\Validation\\NoRFCWarningsValidation' => $vendorDir . '/egulias/email-validator/src/Validation/NoRFCWarningsValidation.php', + 'Egulias\\EmailValidator\\Validation\\RFCValidation' => $vendorDir . '/egulias/email-validator/src/Validation/RFCValidation.php', + 'Egulias\\EmailValidator\\Warning\\AddressLiteral' => $vendorDir . '/egulias/email-validator/src/Warning/AddressLiteral.php', + 'Egulias\\EmailValidator\\Warning\\CFWSNearAt' => $vendorDir . '/egulias/email-validator/src/Warning/CFWSNearAt.php', + 'Egulias\\EmailValidator\\Warning\\CFWSWithFWS' => $vendorDir . '/egulias/email-validator/src/Warning/CFWSWithFWS.php', + 'Egulias\\EmailValidator\\Warning\\Comment' => $vendorDir . '/egulias/email-validator/src/Warning/Comment.php', + 'Egulias\\EmailValidator\\Warning\\DeprecatedComment' => $vendorDir . '/egulias/email-validator/src/Warning/DeprecatedComment.php', + 'Egulias\\EmailValidator\\Warning\\DomainLiteral' => $vendorDir . '/egulias/email-validator/src/Warning/DomainLiteral.php', + 'Egulias\\EmailValidator\\Warning\\EmailTooLong' => $vendorDir . '/egulias/email-validator/src/Warning/EmailTooLong.php', + 'Egulias\\EmailValidator\\Warning\\IPV6BadChar' => $vendorDir . '/egulias/email-validator/src/Warning/IPV6BadChar.php', + 'Egulias\\EmailValidator\\Warning\\IPV6ColonEnd' => $vendorDir . '/egulias/email-validator/src/Warning/IPV6ColonEnd.php', + 'Egulias\\EmailValidator\\Warning\\IPV6ColonStart' => $vendorDir . '/egulias/email-validator/src/Warning/IPV6ColonStart.php', + 'Egulias\\EmailValidator\\Warning\\IPV6Deprecated' => $vendorDir . '/egulias/email-validator/src/Warning/IPV6Deprecated.php', + 'Egulias\\EmailValidator\\Warning\\IPV6DoubleColon' => $vendorDir . '/egulias/email-validator/src/Warning/IPV6DoubleColon.php', + 'Egulias\\EmailValidator\\Warning\\IPV6GroupCount' => $vendorDir . '/egulias/email-validator/src/Warning/IPV6GroupCount.php', + 'Egulias\\EmailValidator\\Warning\\IPV6MaxGroups' => $vendorDir . '/egulias/email-validator/src/Warning/IPV6MaxGroups.php', + 'Egulias\\EmailValidator\\Warning\\LocalTooLong' => $vendorDir . '/egulias/email-validator/src/Warning/LocalTooLong.php', + 'Egulias\\EmailValidator\\Warning\\NoDNSMXRecord' => $vendorDir . '/egulias/email-validator/src/Warning/NoDNSMXRecord.php', + 'Egulias\\EmailValidator\\Warning\\ObsoleteDTEXT' => $vendorDir . '/egulias/email-validator/src/Warning/ObsoleteDTEXT.php', + 'Egulias\\EmailValidator\\Warning\\QuotedPart' => $vendorDir . '/egulias/email-validator/src/Warning/QuotedPart.php', + 'Egulias\\EmailValidator\\Warning\\QuotedString' => $vendorDir . '/egulias/email-validator/src/Warning/QuotedString.php', + 'Egulias\\EmailValidator\\Warning\\TLD' => $vendorDir . '/egulias/email-validator/src/Warning/TLD.php', + 'Egulias\\EmailValidator\\Warning\\Warning' => $vendorDir . '/egulias/email-validator/src/Warning/Warning.php', 'Filter\\FilterException' => $vendorDir . '/symfony/polyfill-php85/Resources/stubs/Filter/FilterException.php', 'Filter\\FilterFailedException' => $vendorDir . '/symfony/polyfill-php85/Resources/stubs/Filter/FilterFailedException.php', + 'GuzzleHttp\\Psr7\\AppendStream' => $vendorDir . '/guzzlehttp/psr7/src/AppendStream.php', + 'GuzzleHttp\\Psr7\\BufferStream' => $vendorDir . '/guzzlehttp/psr7/src/BufferStream.php', + 'GuzzleHttp\\Psr7\\CachingStream' => $vendorDir . '/guzzlehttp/psr7/src/CachingStream.php', + 'GuzzleHttp\\Psr7\\DroppingStream' => $vendorDir . '/guzzlehttp/psr7/src/DroppingStream.php', + 'GuzzleHttp\\Psr7\\Exception\\MalformedUriException' => $vendorDir . '/guzzlehttp/psr7/src/Exception/MalformedUriException.php', + 'GuzzleHttp\\Psr7\\FnStream' => $vendorDir . '/guzzlehttp/psr7/src/FnStream.php', + 'GuzzleHttp\\Psr7\\Header' => $vendorDir . '/guzzlehttp/psr7/src/Header.php', + 'GuzzleHttp\\Psr7\\HttpFactory' => $vendorDir . '/guzzlehttp/psr7/src/HttpFactory.php', + 'GuzzleHttp\\Psr7\\InflateStream' => $vendorDir . '/guzzlehttp/psr7/src/InflateStream.php', + 'GuzzleHttp\\Psr7\\LazyOpenStream' => $vendorDir . '/guzzlehttp/psr7/src/LazyOpenStream.php', + 'GuzzleHttp\\Psr7\\LimitStream' => $vendorDir . '/guzzlehttp/psr7/src/LimitStream.php', + 'GuzzleHttp\\Psr7\\Message' => $vendorDir . '/guzzlehttp/psr7/src/Message.php', + 'GuzzleHttp\\Psr7\\MessageTrait' => $vendorDir . '/guzzlehttp/psr7/src/MessageTrait.php', + 'GuzzleHttp\\Psr7\\MimeType' => $vendorDir . '/guzzlehttp/psr7/src/MimeType.php', + 'GuzzleHttp\\Psr7\\MultipartStream' => $vendorDir . '/guzzlehttp/psr7/src/MultipartStream.php', + 'GuzzleHttp\\Psr7\\NoSeekStream' => $vendorDir . '/guzzlehttp/psr7/src/NoSeekStream.php', + 'GuzzleHttp\\Psr7\\PumpStream' => $vendorDir . '/guzzlehttp/psr7/src/PumpStream.php', + 'GuzzleHttp\\Psr7\\Query' => $vendorDir . '/guzzlehttp/psr7/src/Query.php', + 'GuzzleHttp\\Psr7\\Request' => $vendorDir . '/guzzlehttp/psr7/src/Request.php', + 'GuzzleHttp\\Psr7\\Response' => $vendorDir . '/guzzlehttp/psr7/src/Response.php', + 'GuzzleHttp\\Psr7\\Rfc3986' => $vendorDir . '/guzzlehttp/psr7/src/Rfc3986.php', + 'GuzzleHttp\\Psr7\\Rfc7230' => $vendorDir . '/guzzlehttp/psr7/src/Rfc7230.php', + 'GuzzleHttp\\Psr7\\ServerRequest' => $vendorDir . '/guzzlehttp/psr7/src/ServerRequest.php', + 'GuzzleHttp\\Psr7\\Stream' => $vendorDir . '/guzzlehttp/psr7/src/Stream.php', + 'GuzzleHttp\\Psr7\\StreamDecoratorTrait' => $vendorDir . '/guzzlehttp/psr7/src/StreamDecoratorTrait.php', + 'GuzzleHttp\\Psr7\\StreamWrapper' => $vendorDir . '/guzzlehttp/psr7/src/StreamWrapper.php', + 'GuzzleHttp\\Psr7\\UploadedFile' => $vendorDir . '/guzzlehttp/psr7/src/UploadedFile.php', + 'GuzzleHttp\\Psr7\\Uri' => $vendorDir . '/guzzlehttp/psr7/src/Uri.php', + 'GuzzleHttp\\Psr7\\UriComparator' => $vendorDir . '/guzzlehttp/psr7/src/UriComparator.php', + 'GuzzleHttp\\Psr7\\UriNormalizer' => $vendorDir . '/guzzlehttp/psr7/src/UriNormalizer.php', + 'GuzzleHttp\\Psr7\\UriResolver' => $vendorDir . '/guzzlehttp/psr7/src/UriResolver.php', + 'GuzzleHttp\\Psr7\\Utils' => $vendorDir . '/guzzlehttp/psr7/src/Utils.php', + 'Illuminate\\Contracts\\Auth\\Access\\Authorizable' => $vendorDir . '/illuminate/contracts/Auth/Access/Authorizable.php', + 'Illuminate\\Contracts\\Auth\\Access\\Gate' => $vendorDir . '/illuminate/contracts/Auth/Access/Gate.php', + 'Illuminate\\Contracts\\Auth\\Authenticatable' => $vendorDir . '/illuminate/contracts/Auth/Authenticatable.php', + 'Illuminate\\Contracts\\Auth\\CanResetPassword' => $vendorDir . '/illuminate/contracts/Auth/CanResetPassword.php', + 'Illuminate\\Contracts\\Auth\\Factory' => $vendorDir . '/illuminate/contracts/Auth/Factory.php', + 'Illuminate\\Contracts\\Auth\\Guard' => $vendorDir . '/illuminate/contracts/Auth/Guard.php', + 'Illuminate\\Contracts\\Auth\\Middleware\\AuthenticatesRequests' => $vendorDir . '/illuminate/contracts/Auth/Middleware/AuthenticatesRequests.php', + 'Illuminate\\Contracts\\Auth\\MustVerifyEmail' => $vendorDir . '/illuminate/contracts/Auth/MustVerifyEmail.php', + 'Illuminate\\Contracts\\Auth\\PasswordBroker' => $vendorDir . '/illuminate/contracts/Auth/PasswordBroker.php', + 'Illuminate\\Contracts\\Auth\\PasswordBrokerFactory' => $vendorDir . '/illuminate/contracts/Auth/PasswordBrokerFactory.php', + 'Illuminate\\Contracts\\Auth\\StatefulGuard' => $vendorDir . '/illuminate/contracts/Auth/StatefulGuard.php', + 'Illuminate\\Contracts\\Auth\\SupportsBasicAuth' => $vendorDir . '/illuminate/contracts/Auth/SupportsBasicAuth.php', + 'Illuminate\\Contracts\\Auth\\UserProvider' => $vendorDir . '/illuminate/contracts/Auth/UserProvider.php', + 'Illuminate\\Contracts\\Broadcasting\\Broadcaster' => $vendorDir . '/illuminate/contracts/Broadcasting/Broadcaster.php', + 'Illuminate\\Contracts\\Broadcasting\\Factory' => $vendorDir . '/illuminate/contracts/Broadcasting/Factory.php', + 'Illuminate\\Contracts\\Broadcasting\\HasBroadcastChannel' => $vendorDir . '/illuminate/contracts/Broadcasting/HasBroadcastChannel.php', + 'Illuminate\\Contracts\\Broadcasting\\ShouldBeUnique' => $vendorDir . '/illuminate/contracts/Broadcasting/ShouldBeUnique.php', + 'Illuminate\\Contracts\\Broadcasting\\ShouldBroadcast' => $vendorDir . '/illuminate/contracts/Broadcasting/ShouldBroadcast.php', + 'Illuminate\\Contracts\\Broadcasting\\ShouldBroadcastNow' => $vendorDir . '/illuminate/contracts/Broadcasting/ShouldBroadcastNow.php', + 'Illuminate\\Contracts\\Broadcasting\\ShouldRescue' => $vendorDir . '/illuminate/contracts/Broadcasting/ShouldRescue.php', + 'Illuminate\\Contracts\\Bus\\Dispatcher' => $vendorDir . '/illuminate/contracts/Bus/Dispatcher.php', + 'Illuminate\\Contracts\\Bus\\QueueingDispatcher' => $vendorDir . '/illuminate/contracts/Bus/QueueingDispatcher.php', + 'Illuminate\\Contracts\\Cache\\Factory' => $vendorDir . '/illuminate/contracts/Cache/Factory.php', + 'Illuminate\\Contracts\\Cache\\Lock' => $vendorDir . '/illuminate/contracts/Cache/Lock.php', + 'Illuminate\\Contracts\\Cache\\LockProvider' => $vendorDir . '/illuminate/contracts/Cache/LockProvider.php', + 'Illuminate\\Contracts\\Cache\\LockTimeoutException' => $vendorDir . '/illuminate/contracts/Cache/LockTimeoutException.php', + 'Illuminate\\Contracts\\Cache\\Repository' => $vendorDir . '/illuminate/contracts/Cache/Repository.php', + 'Illuminate\\Contracts\\Cache\\Store' => $vendorDir . '/illuminate/contracts/Cache/Store.php', + 'Illuminate\\Contracts\\Concurrency\\Driver' => $vendorDir . '/illuminate/contracts/Concurrency/Driver.php', + 'Illuminate\\Contracts\\Config\\Repository' => $vendorDir . '/illuminate/contracts/Config/Repository.php', + 'Illuminate\\Contracts\\Console\\Application' => $vendorDir . '/illuminate/contracts/Console/Application.php', + 'Illuminate\\Contracts\\Console\\Isolatable' => $vendorDir . '/illuminate/contracts/Console/Isolatable.php', + 'Illuminate\\Contracts\\Console\\Kernel' => $vendorDir . '/illuminate/contracts/Console/Kernel.php', + 'Illuminate\\Contracts\\Console\\PromptsForMissingInput' => $vendorDir . '/illuminate/contracts/Console/PromptsForMissingInput.php', + 'Illuminate\\Contracts\\Container\\BindingResolutionException' => $vendorDir . '/illuminate/contracts/Container/BindingResolutionException.php', + 'Illuminate\\Contracts\\Container\\CircularDependencyException' => $vendorDir . '/illuminate/contracts/Container/CircularDependencyException.php', + 'Illuminate\\Contracts\\Container\\Container' => $vendorDir . '/illuminate/contracts/Container/Container.php', + 'Illuminate\\Contracts\\Container\\ContextualAttribute' => $vendorDir . '/illuminate/contracts/Container/ContextualAttribute.php', + 'Illuminate\\Contracts\\Container\\ContextualBindingBuilder' => $vendorDir . '/illuminate/contracts/Container/ContextualBindingBuilder.php', + 'Illuminate\\Contracts\\Container\\SelfBuilding' => $vendorDir . '/illuminate/contracts/Container/SelfBuilding.php', + 'Illuminate\\Contracts\\Cookie\\Factory' => $vendorDir . '/illuminate/contracts/Cookie/Factory.php', + 'Illuminate\\Contracts\\Cookie\\QueueingFactory' => $vendorDir . '/illuminate/contracts/Cookie/QueueingFactory.php', + 'Illuminate\\Contracts\\Database\\ConcurrencyErrorDetector' => $vendorDir . '/illuminate/contracts/Database/ConcurrencyErrorDetector.php', + 'Illuminate\\Contracts\\Database\\Eloquent\\Builder' => $vendorDir . '/illuminate/contracts/Database/Eloquent/Builder.php', + 'Illuminate\\Contracts\\Database\\Eloquent\\Castable' => $vendorDir . '/illuminate/contracts/Database/Eloquent/Castable.php', + 'Illuminate\\Contracts\\Database\\Eloquent\\CastsAttributes' => $vendorDir . '/illuminate/contracts/Database/Eloquent/CastsAttributes.php', + 'Illuminate\\Contracts\\Database\\Eloquent\\CastsInboundAttributes' => $vendorDir . '/illuminate/contracts/Database/Eloquent/CastsInboundAttributes.php', + 'Illuminate\\Contracts\\Database\\Eloquent\\ComparesCastableAttributes' => $vendorDir . '/illuminate/contracts/Database/Eloquent/ComparesCastableAttributes.php', + 'Illuminate\\Contracts\\Database\\Eloquent\\DeviatesCastableAttributes' => $vendorDir . '/illuminate/contracts/Database/Eloquent/DeviatesCastableAttributes.php', + 'Illuminate\\Contracts\\Database\\Eloquent\\SerializesCastableAttributes' => $vendorDir . '/illuminate/contracts/Database/Eloquent/SerializesCastableAttributes.php', + 'Illuminate\\Contracts\\Database\\Eloquent\\SupportsPartialRelations' => $vendorDir . '/illuminate/contracts/Database/Eloquent/SupportsPartialRelations.php', + 'Illuminate\\Contracts\\Database\\Events\\MigrationEvent' => $vendorDir . '/illuminate/contracts/Database/Events/MigrationEvent.php', + 'Illuminate\\Contracts\\Database\\LostConnectionDetector' => $vendorDir . '/illuminate/contracts/Database/LostConnectionDetector.php', + 'Illuminate\\Contracts\\Database\\ModelIdentifier' => $vendorDir . '/illuminate/contracts/Database/ModelIdentifier.php', + 'Illuminate\\Contracts\\Database\\Query\\Builder' => $vendorDir . '/illuminate/contracts/Database/Query/Builder.php', + 'Illuminate\\Contracts\\Database\\Query\\ConditionExpression' => $vendorDir . '/illuminate/contracts/Database/Query/ConditionExpression.php', + 'Illuminate\\Contracts\\Database\\Query\\Expression' => $vendorDir . '/illuminate/contracts/Database/Query/Expression.php', + 'Illuminate\\Contracts\\Debug\\ExceptionHandler' => $vendorDir . '/illuminate/contracts/Debug/ExceptionHandler.php', + 'Illuminate\\Contracts\\Debug\\ShouldntReport' => $vendorDir . '/illuminate/contracts/Debug/ShouldntReport.php', + 'Illuminate\\Contracts\\Encryption\\DecryptException' => $vendorDir . '/illuminate/contracts/Encryption/DecryptException.php', + 'Illuminate\\Contracts\\Encryption\\EncryptException' => $vendorDir . '/illuminate/contracts/Encryption/EncryptException.php', + 'Illuminate\\Contracts\\Encryption\\Encrypter' => $vendorDir . '/illuminate/contracts/Encryption/Encrypter.php', + 'Illuminate\\Contracts\\Encryption\\StringEncrypter' => $vendorDir . '/illuminate/contracts/Encryption/StringEncrypter.php', + 'Illuminate\\Contracts\\Events\\Dispatcher' => $vendorDir . '/illuminate/contracts/Events/Dispatcher.php', + 'Illuminate\\Contracts\\Events\\ShouldDispatchAfterCommit' => $vendorDir . '/illuminate/contracts/Events/ShouldDispatchAfterCommit.php', + 'Illuminate\\Contracts\\Events\\ShouldHandleEventsAfterCommit' => $vendorDir . '/illuminate/contracts/Events/ShouldHandleEventsAfterCommit.php', + 'Illuminate\\Contracts\\Filesystem\\Cloud' => $vendorDir . '/illuminate/contracts/Filesystem/Cloud.php', + 'Illuminate\\Contracts\\Filesystem\\Factory' => $vendorDir . '/illuminate/contracts/Filesystem/Factory.php', + 'Illuminate\\Contracts\\Filesystem\\FileNotFoundException' => $vendorDir . '/illuminate/contracts/Filesystem/FileNotFoundException.php', + 'Illuminate\\Contracts\\Filesystem\\Filesystem' => $vendorDir . '/illuminate/contracts/Filesystem/Filesystem.php', + 'Illuminate\\Contracts\\Filesystem\\LockTimeoutException' => $vendorDir . '/illuminate/contracts/Filesystem/LockTimeoutException.php', + 'Illuminate\\Contracts\\Foundation\\Application' => $vendorDir . '/illuminate/contracts/Foundation/Application.php', + 'Illuminate\\Contracts\\Foundation\\CachesConfiguration' => $vendorDir . '/illuminate/contracts/Foundation/CachesConfiguration.php', + 'Illuminate\\Contracts\\Foundation\\CachesRoutes' => $vendorDir . '/illuminate/contracts/Foundation/CachesRoutes.php', + 'Illuminate\\Contracts\\Foundation\\ExceptionRenderer' => $vendorDir . '/illuminate/contracts/Foundation/ExceptionRenderer.php', + 'Illuminate\\Contracts\\Foundation\\MaintenanceMode' => $vendorDir . '/illuminate/contracts/Foundation/MaintenanceMode.php', + 'Illuminate\\Contracts\\Hashing\\Hasher' => $vendorDir . '/illuminate/contracts/Hashing/Hasher.php', + 'Illuminate\\Contracts\\Http\\Kernel' => $vendorDir . '/illuminate/contracts/Http/Kernel.php', + 'Illuminate\\Contracts\\JsonSchema\\JsonSchema' => $vendorDir . '/illuminate/contracts/JsonSchema/JsonSchema.php', + 'Illuminate\\Contracts\\Log\\ContextLogProcessor' => $vendorDir . '/illuminate/contracts/Log/ContextLogProcessor.php', + 'Illuminate\\Contracts\\Mail\\Attachable' => $vendorDir . '/illuminate/contracts/Mail/Attachable.php', + 'Illuminate\\Contracts\\Mail\\Factory' => $vendorDir . '/illuminate/contracts/Mail/Factory.php', + 'Illuminate\\Contracts\\Mail\\MailQueue' => $vendorDir . '/illuminate/contracts/Mail/MailQueue.php', + 'Illuminate\\Contracts\\Mail\\Mailable' => $vendorDir . '/illuminate/contracts/Mail/Mailable.php', + 'Illuminate\\Contracts\\Mail\\Mailer' => $vendorDir . '/illuminate/contracts/Mail/Mailer.php', + 'Illuminate\\Contracts\\Notifications\\Dispatcher' => $vendorDir . '/illuminate/contracts/Notifications/Dispatcher.php', + 'Illuminate\\Contracts\\Notifications\\Factory' => $vendorDir . '/illuminate/contracts/Notifications/Factory.php', + 'Illuminate\\Contracts\\Pagination\\CursorPaginator' => $vendorDir . '/illuminate/contracts/Pagination/CursorPaginator.php', + 'Illuminate\\Contracts\\Pagination\\LengthAwarePaginator' => $vendorDir . '/illuminate/contracts/Pagination/LengthAwarePaginator.php', + 'Illuminate\\Contracts\\Pagination\\Paginator' => $vendorDir . '/illuminate/contracts/Pagination/Paginator.php', + 'Illuminate\\Contracts\\Pipeline\\Hub' => $vendorDir . '/illuminate/contracts/Pipeline/Hub.php', + 'Illuminate\\Contracts\\Pipeline\\Pipeline' => $vendorDir . '/illuminate/contracts/Pipeline/Pipeline.php', + 'Illuminate\\Contracts\\Process\\InvokedProcess' => $vendorDir . '/illuminate/contracts/Process/InvokedProcess.php', + 'Illuminate\\Contracts\\Process\\ProcessResult' => $vendorDir . '/illuminate/contracts/Process/ProcessResult.php', + 'Illuminate\\Contracts\\Queue\\ClearableQueue' => $vendorDir . '/illuminate/contracts/Queue/ClearableQueue.php', + 'Illuminate\\Contracts\\Queue\\EntityNotFoundException' => $vendorDir . '/illuminate/contracts/Queue/EntityNotFoundException.php', + 'Illuminate\\Contracts\\Queue\\EntityResolver' => $vendorDir . '/illuminate/contracts/Queue/EntityResolver.php', + 'Illuminate\\Contracts\\Queue\\Factory' => $vendorDir . '/illuminate/contracts/Queue/Factory.php', + 'Illuminate\\Contracts\\Queue\\Job' => $vendorDir . '/illuminate/contracts/Queue/Job.php', + 'Illuminate\\Contracts\\Queue\\Monitor' => $vendorDir . '/illuminate/contracts/Queue/Monitor.php', + 'Illuminate\\Contracts\\Queue\\Queue' => $vendorDir . '/illuminate/contracts/Queue/Queue.php', + 'Illuminate\\Contracts\\Queue\\QueueableCollection' => $vendorDir . '/illuminate/contracts/Queue/QueueableCollection.php', + 'Illuminate\\Contracts\\Queue\\QueueableEntity' => $vendorDir . '/illuminate/contracts/Queue/QueueableEntity.php', + 'Illuminate\\Contracts\\Queue\\ShouldBeEncrypted' => $vendorDir . '/illuminate/contracts/Queue/ShouldBeEncrypted.php', + 'Illuminate\\Contracts\\Queue\\ShouldBeUnique' => $vendorDir . '/illuminate/contracts/Queue/ShouldBeUnique.php', + 'Illuminate\\Contracts\\Queue\\ShouldBeUniqueUntilProcessing' => $vendorDir . '/illuminate/contracts/Queue/ShouldBeUniqueUntilProcessing.php', + 'Illuminate\\Contracts\\Queue\\ShouldQueue' => $vendorDir . '/illuminate/contracts/Queue/ShouldQueue.php', + 'Illuminate\\Contracts\\Queue\\ShouldQueueAfterCommit' => $vendorDir . '/illuminate/contracts/Queue/ShouldQueueAfterCommit.php', + 'Illuminate\\Contracts\\Redis\\Connection' => $vendorDir . '/illuminate/contracts/Redis/Connection.php', + 'Illuminate\\Contracts\\Redis\\Connector' => $vendorDir . '/illuminate/contracts/Redis/Connector.php', + 'Illuminate\\Contracts\\Redis\\Factory' => $vendorDir . '/illuminate/contracts/Redis/Factory.php', + 'Illuminate\\Contracts\\Redis\\LimiterTimeoutException' => $vendorDir . '/illuminate/contracts/Redis/LimiterTimeoutException.php', + 'Illuminate\\Contracts\\Routing\\BindingRegistrar' => $vendorDir . '/illuminate/contracts/Routing/BindingRegistrar.php', + 'Illuminate\\Contracts\\Routing\\Registrar' => $vendorDir . '/illuminate/contracts/Routing/Registrar.php', + 'Illuminate\\Contracts\\Routing\\ResponseFactory' => $vendorDir . '/illuminate/contracts/Routing/ResponseFactory.php', + 'Illuminate\\Contracts\\Routing\\UrlGenerator' => $vendorDir . '/illuminate/contracts/Routing/UrlGenerator.php', + 'Illuminate\\Contracts\\Routing\\UrlRoutable' => $vendorDir . '/illuminate/contracts/Routing/UrlRoutable.php', + 'Illuminate\\Contracts\\Session\\Middleware\\AuthenticatesSessions' => $vendorDir . '/illuminate/contracts/Session/Middleware/AuthenticatesSessions.php', + 'Illuminate\\Contracts\\Session\\Session' => $vendorDir . '/illuminate/contracts/Session/Session.php', + 'Illuminate\\Contracts\\Support\\Arrayable' => $vendorDir . '/illuminate/contracts/Support/Arrayable.php', + 'Illuminate\\Contracts\\Support\\CanBeEscapedWhenCastToString' => $vendorDir . '/illuminate/contracts/Support/CanBeEscapedWhenCastToString.php', + 'Illuminate\\Contracts\\Support\\DeferrableProvider' => $vendorDir . '/illuminate/contracts/Support/DeferrableProvider.php', + 'Illuminate\\Contracts\\Support\\DeferringDisplayableValue' => $vendorDir . '/illuminate/contracts/Support/DeferringDisplayableValue.php', + 'Illuminate\\Contracts\\Support\\HasOnceHash' => $vendorDir . '/illuminate/contracts/Support/HasOnceHash.php', + 'Illuminate\\Contracts\\Support\\Htmlable' => $vendorDir . '/illuminate/contracts/Support/Htmlable.php', + 'Illuminate\\Contracts\\Support\\Jsonable' => $vendorDir . '/illuminate/contracts/Support/Jsonable.php', + 'Illuminate\\Contracts\\Support\\MessageBag' => $vendorDir . '/illuminate/contracts/Support/MessageBag.php', + 'Illuminate\\Contracts\\Support\\MessageProvider' => $vendorDir . '/illuminate/contracts/Support/MessageProvider.php', + 'Illuminate\\Contracts\\Support\\Renderable' => $vendorDir . '/illuminate/contracts/Support/Renderable.php', + 'Illuminate\\Contracts\\Support\\Responsable' => $vendorDir . '/illuminate/contracts/Support/Responsable.php', + 'Illuminate\\Contracts\\Support\\ValidatedData' => $vendorDir . '/illuminate/contracts/Support/ValidatedData.php', + 'Illuminate\\Contracts\\Translation\\HasLocalePreference' => $vendorDir . '/illuminate/contracts/Translation/HasLocalePreference.php', + 'Illuminate\\Contracts\\Translation\\Loader' => $vendorDir . '/illuminate/contracts/Translation/Loader.php', + 'Illuminate\\Contracts\\Translation\\Translator' => $vendorDir . '/illuminate/contracts/Translation/Translator.php', + 'Illuminate\\Contracts\\Validation\\CompilableRules' => $vendorDir . '/illuminate/contracts/Validation/CompilableRules.php', + 'Illuminate\\Contracts\\Validation\\DataAwareRule' => $vendorDir . '/illuminate/contracts/Validation/DataAwareRule.php', + 'Illuminate\\Contracts\\Validation\\Factory' => $vendorDir . '/illuminate/contracts/Validation/Factory.php', + 'Illuminate\\Contracts\\Validation\\ImplicitRule' => $vendorDir . '/illuminate/contracts/Validation/ImplicitRule.php', + 'Illuminate\\Contracts\\Validation\\InvokableRule' => $vendorDir . '/illuminate/contracts/Validation/InvokableRule.php', + 'Illuminate\\Contracts\\Validation\\Rule' => $vendorDir . '/illuminate/contracts/Validation/Rule.php', + 'Illuminate\\Contracts\\Validation\\UncompromisedVerifier' => $vendorDir . '/illuminate/contracts/Validation/UncompromisedVerifier.php', + 'Illuminate\\Contracts\\Validation\\ValidatesWhenResolved' => $vendorDir . '/illuminate/contracts/Validation/ValidatesWhenResolved.php', + 'Illuminate\\Contracts\\Validation\\ValidationRule' => $vendorDir . '/illuminate/contracts/Validation/ValidationRule.php', + 'Illuminate\\Contracts\\Validation\\Validator' => $vendorDir . '/illuminate/contracts/Validation/Validator.php', + 'Illuminate\\Contracts\\Validation\\ValidatorAwareRule' => $vendorDir . '/illuminate/contracts/Validation/ValidatorAwareRule.php', + 'Illuminate\\Contracts\\View\\Engine' => $vendorDir . '/illuminate/contracts/View/Engine.php', + 'Illuminate\\Contracts\\View\\Factory' => $vendorDir . '/illuminate/contracts/View/Factory.php', + 'Illuminate\\Contracts\\View\\View' => $vendorDir . '/illuminate/contracts/View/View.php', + 'Illuminate\\Contracts\\View\\ViewCompilationException' => $vendorDir . '/illuminate/contracts/View/ViewCompilationException.php', + 'Illuminate\\Support\\Arr' => $vendorDir . '/illuminate/collections/Arr.php', + 'Illuminate\\Support\\Collection' => $vendorDir . '/illuminate/collections/Collection.php', + 'Illuminate\\Support\\Enumerable' => $vendorDir . '/illuminate/collections/Enumerable.php', + 'Illuminate\\Support\\HigherOrderCollectionProxy' => $vendorDir . '/illuminate/collections/HigherOrderCollectionProxy.php', + 'Illuminate\\Support\\HigherOrderWhenProxy' => $vendorDir . '/illuminate/conditionable/HigherOrderWhenProxy.php', + 'Illuminate\\Support\\ItemNotFoundException' => $vendorDir . '/illuminate/collections/ItemNotFoundException.php', + 'Illuminate\\Support\\LazyCollection' => $vendorDir . '/illuminate/collections/LazyCollection.php', + 'Illuminate\\Support\\MultipleItemsFoundException' => $vendorDir . '/illuminate/collections/MultipleItemsFoundException.php', + 'Illuminate\\Support\\Traits\\Conditionable' => $vendorDir . '/illuminate/conditionable/Traits/Conditionable.php', + 'Illuminate\\Support\\Traits\\EnumeratesValues' => $vendorDir . '/illuminate/collections/Traits/EnumeratesValues.php', + 'Illuminate\\Support\\Traits\\Macroable' => $vendorDir . '/illuminate/macroable/Traits/Macroable.php', + 'Illuminate\\Support\\Traits\\TransformsToResourceCollection' => $vendorDir . '/illuminate/collections/Traits/TransformsToResourceCollection.php', + 'Invoker\\CallableResolver' => $vendorDir . '/php-di/invoker/src/CallableResolver.php', + 'Invoker\\Exception\\InvocationException' => $vendorDir . '/php-di/invoker/src/Exception/InvocationException.php', + 'Invoker\\Exception\\NotCallableException' => $vendorDir . '/php-di/invoker/src/Exception/NotCallableException.php', + 'Invoker\\Exception\\NotEnoughParametersException' => $vendorDir . '/php-di/invoker/src/Exception/NotEnoughParametersException.php', + 'Invoker\\Invoker' => $vendorDir . '/php-di/invoker/src/Invoker.php', + 'Invoker\\InvokerInterface' => $vendorDir . '/php-di/invoker/src/InvokerInterface.php', + 'Invoker\\ParameterResolver\\AssociativeArrayResolver' => $vendorDir . '/php-di/invoker/src/ParameterResolver/AssociativeArrayResolver.php', + 'Invoker\\ParameterResolver\\Container\\ParameterNameContainerResolver' => $vendorDir . '/php-di/invoker/src/ParameterResolver/Container/ParameterNameContainerResolver.php', + 'Invoker\\ParameterResolver\\Container\\TypeHintContainerResolver' => $vendorDir . '/php-di/invoker/src/ParameterResolver/Container/TypeHintContainerResolver.php', + 'Invoker\\ParameterResolver\\DefaultValueResolver' => $vendorDir . '/php-di/invoker/src/ParameterResolver/DefaultValueResolver.php', + 'Invoker\\ParameterResolver\\NumericArrayResolver' => $vendorDir . '/php-di/invoker/src/ParameterResolver/NumericArrayResolver.php', + 'Invoker\\ParameterResolver\\ParameterResolver' => $vendorDir . '/php-di/invoker/src/ParameterResolver/ParameterResolver.php', + 'Invoker\\ParameterResolver\\ResolverChain' => $vendorDir . '/php-di/invoker/src/ParameterResolver/ResolverChain.php', + 'Invoker\\ParameterResolver\\TypeHintResolver' => $vendorDir . '/php-di/invoker/src/ParameterResolver/TypeHintResolver.php', + 'Invoker\\Reflection\\CallableReflection' => $vendorDir . '/php-di/invoker/src/Reflection/CallableReflection.php', + 'Laravel\\SerializableClosure\\Contracts\\Serializable' => $vendorDir . '/laravel/serializable-closure/src/Contracts/Serializable.php', + 'Laravel\\SerializableClosure\\Contracts\\Signer' => $vendorDir . '/laravel/serializable-closure/src/Contracts/Signer.php', + 'Laravel\\SerializableClosure\\Exceptions\\InvalidSignatureException' => $vendorDir . '/laravel/serializable-closure/src/Exceptions/InvalidSignatureException.php', + 'Laravel\\SerializableClosure\\Exceptions\\MissingSecretKeyException' => $vendorDir . '/laravel/serializable-closure/src/Exceptions/MissingSecretKeyException.php', + 'Laravel\\SerializableClosure\\SerializableClosure' => $vendorDir . '/laravel/serializable-closure/src/SerializableClosure.php', + 'Laravel\\SerializableClosure\\Serializers\\Native' => $vendorDir . '/laravel/serializable-closure/src/Serializers/Native.php', + 'Laravel\\SerializableClosure\\Serializers\\Signed' => $vendorDir . '/laravel/serializable-closure/src/Serializers/Signed.php', + 'Laravel\\SerializableClosure\\Signers\\Hmac' => $vendorDir . '/laravel/serializable-closure/src/Signers/Hmac.php', + 'Laravel\\SerializableClosure\\Support\\ClosureScope' => $vendorDir . '/laravel/serializable-closure/src/Support/ClosureScope.php', + 'Laravel\\SerializableClosure\\Support\\ClosureStream' => $vendorDir . '/laravel/serializable-closure/src/Support/ClosureStream.php', + 'Laravel\\SerializableClosure\\Support\\ReflectionClosure' => $vendorDir . '/laravel/serializable-closure/src/Support/ReflectionClosure.php', + 'Laravel\\SerializableClosure\\Support\\SelfReference' => $vendorDir . '/laravel/serializable-closure/src/Support/SelfReference.php', + 'Laravel\\SerializableClosure\\UnsignedSerializableClosure' => $vendorDir . '/laravel/serializable-closure/src/UnsignedSerializableClosure.php', 'NoDiscard' => $vendorDir . '/symfony/polyfill-php85/Resources/stubs/NoDiscard.php', 'Normalizer' => $vendorDir . '/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php', 'Override' => $vendorDir . '/symfony/polyfill-php83/Resources/stubs/Override.php', @@ -31,10 +591,356 @@ return array( 'Pdo\\Pgsql' => $vendorDir . '/symfony/polyfill-php84/Resources/stubs/Pdo/Pgsql.php', 'Pdo\\Sqlite' => $vendorDir . '/symfony/polyfill-php84/Resources/stubs/Pdo/Sqlite.php', 'PhpToken' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php', + 'Psr\\Clock\\ClockInterface' => $vendorDir . '/psr/clock/src/ClockInterface.php', + 'Psr\\Container\\ContainerExceptionInterface' => $vendorDir . '/psr/container/src/ContainerExceptionInterface.php', + 'Psr\\Container\\ContainerInterface' => $vendorDir . '/psr/container/src/ContainerInterface.php', + 'Psr\\Container\\NotFoundExceptionInterface' => $vendorDir . '/psr/container/src/NotFoundExceptionInterface.php', + 'Psr\\Http\\Message\\MessageInterface' => $vendorDir . '/psr/http-message/src/MessageInterface.php', + 'Psr\\Http\\Message\\RequestFactoryInterface' => $vendorDir . '/psr/http-factory/src/RequestFactoryInterface.php', + 'Psr\\Http\\Message\\RequestInterface' => $vendorDir . '/psr/http-message/src/RequestInterface.php', + 'Psr\\Http\\Message\\ResponseFactoryInterface' => $vendorDir . '/psr/http-factory/src/ResponseFactoryInterface.php', + 'Psr\\Http\\Message\\ResponseInterface' => $vendorDir . '/psr/http-message/src/ResponseInterface.php', + 'Psr\\Http\\Message\\ServerRequestFactoryInterface' => $vendorDir . '/psr/http-factory/src/ServerRequestFactoryInterface.php', + 'Psr\\Http\\Message\\ServerRequestInterface' => $vendorDir . '/psr/http-message/src/ServerRequestInterface.php', + 'Psr\\Http\\Message\\StreamFactoryInterface' => $vendorDir . '/psr/http-factory/src/StreamFactoryInterface.php', + 'Psr\\Http\\Message\\StreamInterface' => $vendorDir . '/psr/http-message/src/StreamInterface.php', + 'Psr\\Http\\Message\\UploadedFileFactoryInterface' => $vendorDir . '/psr/http-factory/src/UploadedFileFactoryInterface.php', + 'Psr\\Http\\Message\\UploadedFileInterface' => $vendorDir . '/psr/http-message/src/UploadedFileInterface.php', + 'Psr\\Http\\Message\\UriFactoryInterface' => $vendorDir . '/psr/http-factory/src/UriFactoryInterface.php', + 'Psr\\Http\\Message\\UriInterface' => $vendorDir . '/psr/http-message/src/UriInterface.php', + 'Psr\\Log\\AbstractLogger' => $vendorDir . '/psr/log/src/AbstractLogger.php', + 'Psr\\Log\\InvalidArgumentException' => $vendorDir . '/psr/log/src/InvalidArgumentException.php', + 'Psr\\Log\\LogLevel' => $vendorDir . '/psr/log/src/LogLevel.php', + 'Psr\\Log\\LoggerAwareInterface' => $vendorDir . '/psr/log/src/LoggerAwareInterface.php', + 'Psr\\Log\\LoggerAwareTrait' => $vendorDir . '/psr/log/src/LoggerAwareTrait.php', + 'Psr\\Log\\LoggerInterface' => $vendorDir . '/psr/log/src/LoggerInterface.php', + 'Psr\\Log\\LoggerTrait' => $vendorDir . '/psr/log/src/LoggerTrait.php', + 'Psr\\Log\\NullLogger' => $vendorDir . '/psr/log/src/NullLogger.php', + 'Psr\\SimpleCache\\CacheException' => $vendorDir . '/psr/simple-cache/src/CacheException.php', + 'Psr\\SimpleCache\\CacheInterface' => $vendorDir . '/psr/simple-cache/src/CacheInterface.php', + 'Psr\\SimpleCache\\InvalidArgumentException' => $vendorDir . '/psr/simple-cache/src/InvalidArgumentException.php', 'ReflectionConstant' => $vendorDir . '/symfony/polyfill-php84/Resources/stubs/ReflectionConstant.php', 'RoundingMode' => $vendorDir . '/symfony/polyfill-php84/Resources/stubs/RoundingMode.php', 'SQLite3Exception' => $vendorDir . '/symfony/polyfill-php83/Resources/stubs/SQLite3Exception.php', 'Stringable' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Stringable.php', + 'Symfony\\Component\\Clock\\Clock' => $vendorDir . '/symfony/clock/Clock.php', + 'Symfony\\Component\\Clock\\ClockAwareTrait' => $vendorDir . '/symfony/clock/ClockAwareTrait.php', + 'Symfony\\Component\\Clock\\ClockInterface' => $vendorDir . '/symfony/clock/ClockInterface.php', + 'Symfony\\Component\\Clock\\DatePoint' => $vendorDir . '/symfony/clock/DatePoint.php', + 'Symfony\\Component\\Clock\\MockClock' => $vendorDir . '/symfony/clock/MockClock.php', + 'Symfony\\Component\\Clock\\MonotonicClock' => $vendorDir . '/symfony/clock/MonotonicClock.php', + 'Symfony\\Component\\Clock\\NativeClock' => $vendorDir . '/symfony/clock/NativeClock.php', + 'Symfony\\Component\\Clock\\Test\\ClockSensitiveTrait' => $vendorDir . '/symfony/clock/Test/ClockSensitiveTrait.php', + 'Symfony\\Component\\Mime\\Address' => $vendorDir . '/symfony/mime/Address.php', + 'Symfony\\Component\\Mime\\BodyRendererInterface' => $vendorDir . '/symfony/mime/BodyRendererInterface.php', + 'Symfony\\Component\\Mime\\CharacterStream' => $vendorDir . '/symfony/mime/CharacterStream.php', + 'Symfony\\Component\\Mime\\Crypto\\DkimOptions' => $vendorDir . '/symfony/mime/Crypto/DkimOptions.php', + 'Symfony\\Component\\Mime\\Crypto\\DkimSigner' => $vendorDir . '/symfony/mime/Crypto/DkimSigner.php', + 'Symfony\\Component\\Mime\\Crypto\\SMime' => $vendorDir . '/symfony/mime/Crypto/SMime.php', + 'Symfony\\Component\\Mime\\Crypto\\SMimeEncrypter' => $vendorDir . '/symfony/mime/Crypto/SMimeEncrypter.php', + 'Symfony\\Component\\Mime\\Crypto\\SMimeSigner' => $vendorDir . '/symfony/mime/Crypto/SMimeSigner.php', + 'Symfony\\Component\\Mime\\DependencyInjection\\AddMimeTypeGuesserPass' => $vendorDir . '/symfony/mime/DependencyInjection/AddMimeTypeGuesserPass.php', + 'Symfony\\Component\\Mime\\DraftEmail' => $vendorDir . '/symfony/mime/DraftEmail.php', + 'Symfony\\Component\\Mime\\Email' => $vendorDir . '/symfony/mime/Email.php', + 'Symfony\\Component\\Mime\\Encoder\\AddressEncoderInterface' => $vendorDir . '/symfony/mime/Encoder/AddressEncoderInterface.php', + 'Symfony\\Component\\Mime\\Encoder\\Base64ContentEncoder' => $vendorDir . '/symfony/mime/Encoder/Base64ContentEncoder.php', + 'Symfony\\Component\\Mime\\Encoder\\Base64Encoder' => $vendorDir . '/symfony/mime/Encoder/Base64Encoder.php', + 'Symfony\\Component\\Mime\\Encoder\\Base64MimeHeaderEncoder' => $vendorDir . '/symfony/mime/Encoder/Base64MimeHeaderEncoder.php', + 'Symfony\\Component\\Mime\\Encoder\\ContentEncoderInterface' => $vendorDir . '/symfony/mime/Encoder/ContentEncoderInterface.php', + 'Symfony\\Component\\Mime\\Encoder\\EightBitContentEncoder' => $vendorDir . '/symfony/mime/Encoder/EightBitContentEncoder.php', + 'Symfony\\Component\\Mime\\Encoder\\EncoderInterface' => $vendorDir . '/symfony/mime/Encoder/EncoderInterface.php', + 'Symfony\\Component\\Mime\\Encoder\\IdnAddressEncoder' => $vendorDir . '/symfony/mime/Encoder/IdnAddressEncoder.php', + 'Symfony\\Component\\Mime\\Encoder\\MimeHeaderEncoderInterface' => $vendorDir . '/symfony/mime/Encoder/MimeHeaderEncoderInterface.php', + 'Symfony\\Component\\Mime\\Encoder\\QpContentEncoder' => $vendorDir . '/symfony/mime/Encoder/QpContentEncoder.php', + 'Symfony\\Component\\Mime\\Encoder\\QpEncoder' => $vendorDir . '/symfony/mime/Encoder/QpEncoder.php', + 'Symfony\\Component\\Mime\\Encoder\\QpMimeHeaderEncoder' => $vendorDir . '/symfony/mime/Encoder/QpMimeHeaderEncoder.php', + 'Symfony\\Component\\Mime\\Encoder\\Rfc2231Encoder' => $vendorDir . '/symfony/mime/Encoder/Rfc2231Encoder.php', + 'Symfony\\Component\\Mime\\Exception\\AddressEncoderException' => $vendorDir . '/symfony/mime/Exception/AddressEncoderException.php', + 'Symfony\\Component\\Mime\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/mime/Exception/ExceptionInterface.php', + 'Symfony\\Component\\Mime\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/mime/Exception/InvalidArgumentException.php', + 'Symfony\\Component\\Mime\\Exception\\LogicException' => $vendorDir . '/symfony/mime/Exception/LogicException.php', + 'Symfony\\Component\\Mime\\Exception\\RfcComplianceException' => $vendorDir . '/symfony/mime/Exception/RfcComplianceException.php', + 'Symfony\\Component\\Mime\\Exception\\RuntimeException' => $vendorDir . '/symfony/mime/Exception/RuntimeException.php', + 'Symfony\\Component\\Mime\\FileBinaryMimeTypeGuesser' => $vendorDir . '/symfony/mime/FileBinaryMimeTypeGuesser.php', + 'Symfony\\Component\\Mime\\FileinfoMimeTypeGuesser' => $vendorDir . '/symfony/mime/FileinfoMimeTypeGuesser.php', + 'Symfony\\Component\\Mime\\Header\\AbstractHeader' => $vendorDir . '/symfony/mime/Header/AbstractHeader.php', + 'Symfony\\Component\\Mime\\Header\\DateHeader' => $vendorDir . '/symfony/mime/Header/DateHeader.php', + 'Symfony\\Component\\Mime\\Header\\HeaderInterface' => $vendorDir . '/symfony/mime/Header/HeaderInterface.php', + 'Symfony\\Component\\Mime\\Header\\Headers' => $vendorDir . '/symfony/mime/Header/Headers.php', + 'Symfony\\Component\\Mime\\Header\\IdentificationHeader' => $vendorDir . '/symfony/mime/Header/IdentificationHeader.php', + 'Symfony\\Component\\Mime\\Header\\MailboxHeader' => $vendorDir . '/symfony/mime/Header/MailboxHeader.php', + 'Symfony\\Component\\Mime\\Header\\MailboxListHeader' => $vendorDir . '/symfony/mime/Header/MailboxListHeader.php', + 'Symfony\\Component\\Mime\\Header\\ParameterizedHeader' => $vendorDir . '/symfony/mime/Header/ParameterizedHeader.php', + 'Symfony\\Component\\Mime\\Header\\PathHeader' => $vendorDir . '/symfony/mime/Header/PathHeader.php', + 'Symfony\\Component\\Mime\\Header\\UnstructuredHeader' => $vendorDir . '/symfony/mime/Header/UnstructuredHeader.php', + 'Symfony\\Component\\Mime\\HtmlToTextConverter\\DefaultHtmlToTextConverter' => $vendorDir . '/symfony/mime/HtmlToTextConverter/DefaultHtmlToTextConverter.php', + 'Symfony\\Component\\Mime\\HtmlToTextConverter\\HtmlToTextConverterInterface' => $vendorDir . '/symfony/mime/HtmlToTextConverter/HtmlToTextConverterInterface.php', + 'Symfony\\Component\\Mime\\HtmlToTextConverter\\LeagueHtmlToMarkdownConverter' => $vendorDir . '/symfony/mime/HtmlToTextConverter/LeagueHtmlToMarkdownConverter.php', + 'Symfony\\Component\\Mime\\Message' => $vendorDir . '/symfony/mime/Message.php', + 'Symfony\\Component\\Mime\\MessageConverter' => $vendorDir . '/symfony/mime/MessageConverter.php', + 'Symfony\\Component\\Mime\\MimeTypeGuesserInterface' => $vendorDir . '/symfony/mime/MimeTypeGuesserInterface.php', + 'Symfony\\Component\\Mime\\MimeTypes' => $vendorDir . '/symfony/mime/MimeTypes.php', + 'Symfony\\Component\\Mime\\MimeTypesInterface' => $vendorDir . '/symfony/mime/MimeTypesInterface.php', + 'Symfony\\Component\\Mime\\Part\\AbstractMultipartPart' => $vendorDir . '/symfony/mime/Part/AbstractMultipartPart.php', + 'Symfony\\Component\\Mime\\Part\\AbstractPart' => $vendorDir . '/symfony/mime/Part/AbstractPart.php', + 'Symfony\\Component\\Mime\\Part\\DataPart' => $vendorDir . '/symfony/mime/Part/DataPart.php', + 'Symfony\\Component\\Mime\\Part\\File' => $vendorDir . '/symfony/mime/Part/File.php', + 'Symfony\\Component\\Mime\\Part\\MessagePart' => $vendorDir . '/symfony/mime/Part/MessagePart.php', + 'Symfony\\Component\\Mime\\Part\\Multipart\\AlternativePart' => $vendorDir . '/symfony/mime/Part/Multipart/AlternativePart.php', + 'Symfony\\Component\\Mime\\Part\\Multipart\\DigestPart' => $vendorDir . '/symfony/mime/Part/Multipart/DigestPart.php', + 'Symfony\\Component\\Mime\\Part\\Multipart\\FormDataPart' => $vendorDir . '/symfony/mime/Part/Multipart/FormDataPart.php', + 'Symfony\\Component\\Mime\\Part\\Multipart\\MixedPart' => $vendorDir . '/symfony/mime/Part/Multipart/MixedPart.php', + 'Symfony\\Component\\Mime\\Part\\Multipart\\RelatedPart' => $vendorDir . '/symfony/mime/Part/Multipart/RelatedPart.php', + 'Symfony\\Component\\Mime\\Part\\SMimePart' => $vendorDir . '/symfony/mime/Part/SMimePart.php', + 'Symfony\\Component\\Mime\\Part\\TextPart' => $vendorDir . '/symfony/mime/Part/TextPart.php', + 'Symfony\\Component\\Mime\\RawMessage' => $vendorDir . '/symfony/mime/RawMessage.php', + 'Symfony\\Component\\Mime\\Test\\Constraint\\EmailAddressContains' => $vendorDir . '/symfony/mime/Test/Constraint/EmailAddressContains.php', + 'Symfony\\Component\\Mime\\Test\\Constraint\\EmailAttachmentCount' => $vendorDir . '/symfony/mime/Test/Constraint/EmailAttachmentCount.php', + 'Symfony\\Component\\Mime\\Test\\Constraint\\EmailHasHeader' => $vendorDir . '/symfony/mime/Test/Constraint/EmailHasHeader.php', + 'Symfony\\Component\\Mime\\Test\\Constraint\\EmailHeaderSame' => $vendorDir . '/symfony/mime/Test/Constraint/EmailHeaderSame.php', + 'Symfony\\Component\\Mime\\Test\\Constraint\\EmailHtmlBodyContains' => $vendorDir . '/symfony/mime/Test/Constraint/EmailHtmlBodyContains.php', + 'Symfony\\Component\\Mime\\Test\\Constraint\\EmailSubjectContains' => $vendorDir . '/symfony/mime/Test/Constraint/EmailSubjectContains.php', + 'Symfony\\Component\\Mime\\Test\\Constraint\\EmailTextBodyContains' => $vendorDir . '/symfony/mime/Test/Constraint/EmailTextBodyContains.php', + 'Symfony\\Component\\Translation\\CatalogueMetadataAwareInterface' => $vendorDir . '/symfony/translation/CatalogueMetadataAwareInterface.php', + 'Symfony\\Component\\Translation\\Catalogue\\AbstractOperation' => $vendorDir . '/symfony/translation/Catalogue/AbstractOperation.php', + 'Symfony\\Component\\Translation\\Catalogue\\MergeOperation' => $vendorDir . '/symfony/translation/Catalogue/MergeOperation.php', + 'Symfony\\Component\\Translation\\Catalogue\\OperationInterface' => $vendorDir . '/symfony/translation/Catalogue/OperationInterface.php', + 'Symfony\\Component\\Translation\\Catalogue\\TargetOperation' => $vendorDir . '/symfony/translation/Catalogue/TargetOperation.php', + 'Symfony\\Component\\Translation\\Command\\TranslationLintCommand' => $vendorDir . '/symfony/translation/Command/TranslationLintCommand.php', + 'Symfony\\Component\\Translation\\Command\\TranslationPullCommand' => $vendorDir . '/symfony/translation/Command/TranslationPullCommand.php', + 'Symfony\\Component\\Translation\\Command\\TranslationPushCommand' => $vendorDir . '/symfony/translation/Command/TranslationPushCommand.php', + 'Symfony\\Component\\Translation\\Command\\TranslationTrait' => $vendorDir . '/symfony/translation/Command/TranslationTrait.php', + 'Symfony\\Component\\Translation\\Command\\XliffLintCommand' => $vendorDir . '/symfony/translation/Command/XliffLintCommand.php', + 'Symfony\\Component\\Translation\\DataCollectorTranslator' => $vendorDir . '/symfony/translation/DataCollectorTranslator.php', + 'Symfony\\Component\\Translation\\DataCollector\\TranslationDataCollector' => $vendorDir . '/symfony/translation/DataCollector/TranslationDataCollector.php', + 'Symfony\\Component\\Translation\\DependencyInjection\\DataCollectorTranslatorPass' => $vendorDir . '/symfony/translation/DependencyInjection/DataCollectorTranslatorPass.php', + 'Symfony\\Component\\Translation\\DependencyInjection\\LoggingTranslatorPass' => $vendorDir . '/symfony/translation/DependencyInjection/LoggingTranslatorPass.php', + 'Symfony\\Component\\Translation\\DependencyInjection\\TranslationDumperPass' => $vendorDir . '/symfony/translation/DependencyInjection/TranslationDumperPass.php', + 'Symfony\\Component\\Translation\\DependencyInjection\\TranslationExtractorPass' => $vendorDir . '/symfony/translation/DependencyInjection/TranslationExtractorPass.php', + 'Symfony\\Component\\Translation\\DependencyInjection\\TranslatorPass' => $vendorDir . '/symfony/translation/DependencyInjection/TranslatorPass.php', + 'Symfony\\Component\\Translation\\DependencyInjection\\TranslatorPathsPass' => $vendorDir . '/symfony/translation/DependencyInjection/TranslatorPathsPass.php', + 'Symfony\\Component\\Translation\\Dumper\\CsvFileDumper' => $vendorDir . '/symfony/translation/Dumper/CsvFileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\DumperInterface' => $vendorDir . '/symfony/translation/Dumper/DumperInterface.php', + 'Symfony\\Component\\Translation\\Dumper\\FileDumper' => $vendorDir . '/symfony/translation/Dumper/FileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\IcuResFileDumper' => $vendorDir . '/symfony/translation/Dumper/IcuResFileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\IniFileDumper' => $vendorDir . '/symfony/translation/Dumper/IniFileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\JsonFileDumper' => $vendorDir . '/symfony/translation/Dumper/JsonFileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\MoFileDumper' => $vendorDir . '/symfony/translation/Dumper/MoFileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\PhpFileDumper' => $vendorDir . '/symfony/translation/Dumper/PhpFileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\PoFileDumper' => $vendorDir . '/symfony/translation/Dumper/PoFileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\QtFileDumper' => $vendorDir . '/symfony/translation/Dumper/QtFileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\XliffFileDumper' => $vendorDir . '/symfony/translation/Dumper/XliffFileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\YamlFileDumper' => $vendorDir . '/symfony/translation/Dumper/YamlFileDumper.php', + 'Symfony\\Component\\Translation\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/translation/Exception/ExceptionInterface.php', + 'Symfony\\Component\\Translation\\Exception\\IncompleteDsnException' => $vendorDir . '/symfony/translation/Exception/IncompleteDsnException.php', + 'Symfony\\Component\\Translation\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/translation/Exception/InvalidArgumentException.php', + 'Symfony\\Component\\Translation\\Exception\\InvalidResourceException' => $vendorDir . '/symfony/translation/Exception/InvalidResourceException.php', + 'Symfony\\Component\\Translation\\Exception\\LogicException' => $vendorDir . '/symfony/translation/Exception/LogicException.php', + 'Symfony\\Component\\Translation\\Exception\\MissingRequiredOptionException' => $vendorDir . '/symfony/translation/Exception/MissingRequiredOptionException.php', + 'Symfony\\Component\\Translation\\Exception\\NotFoundResourceException' => $vendorDir . '/symfony/translation/Exception/NotFoundResourceException.php', + 'Symfony\\Component\\Translation\\Exception\\ProviderException' => $vendorDir . '/symfony/translation/Exception/ProviderException.php', + 'Symfony\\Component\\Translation\\Exception\\ProviderExceptionInterface' => $vendorDir . '/symfony/translation/Exception/ProviderExceptionInterface.php', + 'Symfony\\Component\\Translation\\Exception\\RuntimeException' => $vendorDir . '/symfony/translation/Exception/RuntimeException.php', + 'Symfony\\Component\\Translation\\Exception\\UnsupportedSchemeException' => $vendorDir . '/symfony/translation/Exception/UnsupportedSchemeException.php', + 'Symfony\\Component\\Translation\\Extractor\\AbstractFileExtractor' => $vendorDir . '/symfony/translation/Extractor/AbstractFileExtractor.php', + 'Symfony\\Component\\Translation\\Extractor\\ChainExtractor' => $vendorDir . '/symfony/translation/Extractor/ChainExtractor.php', + 'Symfony\\Component\\Translation\\Extractor\\ExtractorInterface' => $vendorDir . '/symfony/translation/Extractor/ExtractorInterface.php', + 'Symfony\\Component\\Translation\\Extractor\\PhpAstExtractor' => $vendorDir . '/symfony/translation/Extractor/PhpAstExtractor.php', + 'Symfony\\Component\\Translation\\Extractor\\Visitor\\AbstractVisitor' => $vendorDir . '/symfony/translation/Extractor/Visitor/AbstractVisitor.php', + 'Symfony\\Component\\Translation\\Extractor\\Visitor\\ConstraintVisitor' => $vendorDir . '/symfony/translation/Extractor/Visitor/ConstraintVisitor.php', + 'Symfony\\Component\\Translation\\Extractor\\Visitor\\TransMethodVisitor' => $vendorDir . '/symfony/translation/Extractor/Visitor/TransMethodVisitor.php', + 'Symfony\\Component\\Translation\\Extractor\\Visitor\\TranslatableMessageVisitor' => $vendorDir . '/symfony/translation/Extractor/Visitor/TranslatableMessageVisitor.php', + 'Symfony\\Component\\Translation\\Formatter\\IntlFormatter' => $vendorDir . '/symfony/translation/Formatter/IntlFormatter.php', + 'Symfony\\Component\\Translation\\Formatter\\IntlFormatterInterface' => $vendorDir . '/symfony/translation/Formatter/IntlFormatterInterface.php', + 'Symfony\\Component\\Translation\\Formatter\\MessageFormatter' => $vendorDir . '/symfony/translation/Formatter/MessageFormatter.php', + 'Symfony\\Component\\Translation\\Formatter\\MessageFormatterInterface' => $vendorDir . '/symfony/translation/Formatter/MessageFormatterInterface.php', + 'Symfony\\Component\\Translation\\IdentityTranslator' => $vendorDir . '/symfony/translation/IdentityTranslator.php', + 'Symfony\\Component\\Translation\\Loader\\ArrayLoader' => $vendorDir . '/symfony/translation/Loader/ArrayLoader.php', + 'Symfony\\Component\\Translation\\Loader\\CsvFileLoader' => $vendorDir . '/symfony/translation/Loader/CsvFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\FileLoader' => $vendorDir . '/symfony/translation/Loader/FileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\IcuDatFileLoader' => $vendorDir . '/symfony/translation/Loader/IcuDatFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\IcuResFileLoader' => $vendorDir . '/symfony/translation/Loader/IcuResFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\IniFileLoader' => $vendorDir . '/symfony/translation/Loader/IniFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\JsonFileLoader' => $vendorDir . '/symfony/translation/Loader/JsonFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\LoaderInterface' => $vendorDir . '/symfony/translation/Loader/LoaderInterface.php', + 'Symfony\\Component\\Translation\\Loader\\MoFileLoader' => $vendorDir . '/symfony/translation/Loader/MoFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\PhpFileLoader' => $vendorDir . '/symfony/translation/Loader/PhpFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\PoFileLoader' => $vendorDir . '/symfony/translation/Loader/PoFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\QtFileLoader' => $vendorDir . '/symfony/translation/Loader/QtFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\XliffFileLoader' => $vendorDir . '/symfony/translation/Loader/XliffFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\YamlFileLoader' => $vendorDir . '/symfony/translation/Loader/YamlFileLoader.php', + 'Symfony\\Component\\Translation\\LocaleSwitcher' => $vendorDir . '/symfony/translation/LocaleSwitcher.php', + 'Symfony\\Component\\Translation\\LoggingTranslator' => $vendorDir . '/symfony/translation/LoggingTranslator.php', + 'Symfony\\Component\\Translation\\MessageCatalogue' => $vendorDir . '/symfony/translation/MessageCatalogue.php', + 'Symfony\\Component\\Translation\\MessageCatalogueInterface' => $vendorDir . '/symfony/translation/MessageCatalogueInterface.php', + 'Symfony\\Component\\Translation\\MetadataAwareInterface' => $vendorDir . '/symfony/translation/MetadataAwareInterface.php', + 'Symfony\\Component\\Translation\\Provider\\AbstractProviderFactory' => $vendorDir . '/symfony/translation/Provider/AbstractProviderFactory.php', + 'Symfony\\Component\\Translation\\Provider\\Dsn' => $vendorDir . '/symfony/translation/Provider/Dsn.php', + 'Symfony\\Component\\Translation\\Provider\\FilteringProvider' => $vendorDir . '/symfony/translation/Provider/FilteringProvider.php', + 'Symfony\\Component\\Translation\\Provider\\NullProvider' => $vendorDir . '/symfony/translation/Provider/NullProvider.php', + 'Symfony\\Component\\Translation\\Provider\\NullProviderFactory' => $vendorDir . '/symfony/translation/Provider/NullProviderFactory.php', + 'Symfony\\Component\\Translation\\Provider\\ProviderFactoryInterface' => $vendorDir . '/symfony/translation/Provider/ProviderFactoryInterface.php', + 'Symfony\\Component\\Translation\\Provider\\ProviderInterface' => $vendorDir . '/symfony/translation/Provider/ProviderInterface.php', + 'Symfony\\Component\\Translation\\Provider\\TranslationProviderCollection' => $vendorDir . '/symfony/translation/Provider/TranslationProviderCollection.php', + 'Symfony\\Component\\Translation\\Provider\\TranslationProviderCollectionFactory' => $vendorDir . '/symfony/translation/Provider/TranslationProviderCollectionFactory.php', + 'Symfony\\Component\\Translation\\PseudoLocalizationTranslator' => $vendorDir . '/symfony/translation/PseudoLocalizationTranslator.php', + 'Symfony\\Component\\Translation\\Reader\\TranslationReader' => $vendorDir . '/symfony/translation/Reader/TranslationReader.php', + 'Symfony\\Component\\Translation\\Reader\\TranslationReaderInterface' => $vendorDir . '/symfony/translation/Reader/TranslationReaderInterface.php', + 'Symfony\\Component\\Translation\\StaticMessage' => $vendorDir . '/symfony/translation/StaticMessage.php', + 'Symfony\\Component\\Translation\\Test\\AbstractProviderFactoryTestCase' => $vendorDir . '/symfony/translation/Test/AbstractProviderFactoryTestCase.php', + 'Symfony\\Component\\Translation\\Test\\IncompleteDsnTestTrait' => $vendorDir . '/symfony/translation/Test/IncompleteDsnTestTrait.php', + 'Symfony\\Component\\Translation\\Test\\ProviderFactoryTestCase' => $vendorDir . '/symfony/translation/Test/ProviderFactoryTestCase.php', + 'Symfony\\Component\\Translation\\Test\\ProviderTestCase' => $vendorDir . '/symfony/translation/Test/ProviderTestCase.php', + 'Symfony\\Component\\Translation\\TranslatableMessage' => $vendorDir . '/symfony/translation/TranslatableMessage.php', + 'Symfony\\Component\\Translation\\Translator' => $vendorDir . '/symfony/translation/Translator.php', + 'Symfony\\Component\\Translation\\TranslatorBag' => $vendorDir . '/symfony/translation/TranslatorBag.php', + 'Symfony\\Component\\Translation\\TranslatorBagInterface' => $vendorDir . '/symfony/translation/TranslatorBagInterface.php', + 'Symfony\\Component\\Translation\\Util\\ArrayConverter' => $vendorDir . '/symfony/translation/Util/ArrayConverter.php', + 'Symfony\\Component\\Translation\\Util\\XliffUtils' => $vendorDir . '/symfony/translation/Util/XliffUtils.php', + 'Symfony\\Component\\Translation\\Writer\\TranslationWriter' => $vendorDir . '/symfony/translation/Writer/TranslationWriter.php', + 'Symfony\\Component\\Translation\\Writer\\TranslationWriterInterface' => $vendorDir . '/symfony/translation/Writer/TranslationWriterInterface.php', + 'Symfony\\Contracts\\Translation\\LocaleAwareInterface' => $vendorDir . '/symfony/translation-contracts/LocaleAwareInterface.php', + 'Symfony\\Contracts\\Translation\\TranslatableInterface' => $vendorDir . '/symfony/translation-contracts/TranslatableInterface.php', + 'Symfony\\Contracts\\Translation\\TranslatorInterface' => $vendorDir . '/symfony/translation-contracts/TranslatorInterface.php', + 'Symfony\\Contracts\\Translation\\TranslatorTrait' => $vendorDir . '/symfony/translation-contracts/TranslatorTrait.php', + 'Symfony\\Polyfill\\Iconv\\Iconv' => $vendorDir . '/symfony/polyfill-iconv/Iconv.php', + 'Symfony\\Polyfill\\Intl\\Idn\\Idn' => $vendorDir . '/symfony/polyfill-intl-idn/Idn.php', + 'Symfony\\Polyfill\\Intl\\Idn\\Info' => $vendorDir . '/symfony/polyfill-intl-idn/Info.php', + 'Symfony\\Polyfill\\Intl\\Idn\\Resources\\unidata\\DisallowedRanges' => $vendorDir . '/symfony/polyfill-intl-idn/Resources/unidata/DisallowedRanges.php', + 'Symfony\\Polyfill\\Intl\\Idn\\Resources\\unidata\\Regex' => $vendorDir . '/symfony/polyfill-intl-idn/Resources/unidata/Regex.php', + 'Symfony\\Polyfill\\Intl\\Normalizer\\Normalizer' => $vendorDir . '/symfony/polyfill-intl-normalizer/Normalizer.php', + 'Symfony\\Polyfill\\Mbstring\\Mbstring' => $vendorDir . '/symfony/polyfill-mbstring/Mbstring.php', + 'Symfony\\Polyfill\\Php80\\Php80' => $vendorDir . '/symfony/polyfill-php80/Php80.php', + 'Symfony\\Polyfill\\Php80\\PhpToken' => $vendorDir . '/symfony/polyfill-php80/PhpToken.php', + 'Symfony\\Polyfill\\Php83\\Php83' => $vendorDir . '/symfony/polyfill-php83/Php83.php', + 'Symfony\\Polyfill\\Php84\\Php84' => $vendorDir . '/symfony/polyfill-php84/Php84.php', + 'Symfony\\Polyfill\\Php85\\Php85' => $vendorDir . '/symfony/polyfill-php85/Php85.php', 'UnhandledMatchError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php', 'ValueError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/ValueError.php', + 'ZBateson\\MailMimeParser\\Error' => $vendorDir . '/zbateson/mail-mime-parser/src/Error.php', + 'ZBateson\\MailMimeParser\\ErrorBag' => $vendorDir . '/zbateson/mail-mime-parser/src/ErrorBag.php', + 'ZBateson\\MailMimeParser\\Header\\AbstractHeader' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/AbstractHeader.php', + 'ZBateson\\MailMimeParser\\Header\\AddressHeader' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/AddressHeader.php', + 'ZBateson\\MailMimeParser\\Header\\Consumer\\AbstractConsumerService' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Consumer/AbstractConsumerService.php', + 'ZBateson\\MailMimeParser\\Header\\Consumer\\AbstractGenericConsumerService' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Consumer/AbstractGenericConsumerService.php', + 'ZBateson\\MailMimeParser\\Header\\Consumer\\AddressBaseConsumerService' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Consumer/AddressBaseConsumerService.php', + 'ZBateson\\MailMimeParser\\Header\\Consumer\\AddressConsumerService' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Consumer/AddressConsumerService.php', + 'ZBateson\\MailMimeParser\\Header\\Consumer\\AddressEmailConsumerService' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Consumer/AddressEmailConsumerService.php', + 'ZBateson\\MailMimeParser\\Header\\Consumer\\AddressGroupConsumerService' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Consumer/AddressGroupConsumerService.php', + 'ZBateson\\MailMimeParser\\Header\\Consumer\\CommentConsumerService' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Consumer/CommentConsumerService.php', + 'ZBateson\\MailMimeParser\\Header\\Consumer\\DateConsumerService' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Consumer/DateConsumerService.php', + 'ZBateson\\MailMimeParser\\Header\\Consumer\\GenericConsumerMimeLiteralPartService' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Consumer/GenericConsumerMimeLiteralPartService.php', + 'ZBateson\\MailMimeParser\\Header\\Consumer\\GenericConsumerService' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Consumer/GenericConsumerService.php', + 'ZBateson\\MailMimeParser\\Header\\Consumer\\IConsumerService' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Consumer/IConsumerService.php', + 'ZBateson\\MailMimeParser\\Header\\Consumer\\IdBaseConsumerService' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Consumer/IdBaseConsumerService.php', + 'ZBateson\\MailMimeParser\\Header\\Consumer\\IdConsumerService' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Consumer/IdConsumerService.php', + 'ZBateson\\MailMimeParser\\Header\\Consumer\\ParameterConsumerService' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Consumer/ParameterConsumerService.php', + 'ZBateson\\MailMimeParser\\Header\\Consumer\\ParameterNameValueConsumerService' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Consumer/ParameterNameValueConsumerService.php', + 'ZBateson\\MailMimeParser\\Header\\Consumer\\ParameterValueConsumerService' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Consumer/ParameterValueConsumerService.php', + 'ZBateson\\MailMimeParser\\Header\\Consumer\\QuotedStringConsumerService' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Consumer/QuotedStringConsumerService.php', + 'ZBateson\\MailMimeParser\\Header\\Consumer\\QuotedStringMimeLiteralPartConsumerService' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Consumer/QuotedStringMimeLiteralPartConsumerService.php', + 'ZBateson\\MailMimeParser\\Header\\Consumer\\QuotedStringMimeLiteralPartTokenSplitPatternTrait' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Consumer/QuotedStringMimeLiteralPartTokenSplitPatternTrait.php', + 'ZBateson\\MailMimeParser\\Header\\Consumer\\ReceivedConsumerService' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Consumer/ReceivedConsumerService.php', + 'ZBateson\\MailMimeParser\\Header\\Consumer\\Received\\DomainConsumerService' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Consumer/Received/DomainConsumerService.php', + 'ZBateson\\MailMimeParser\\Header\\Consumer\\Received\\GenericReceivedConsumerService' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Consumer/Received/GenericReceivedConsumerService.php', + 'ZBateson\\MailMimeParser\\Header\\Consumer\\Received\\ReceivedDateConsumerService' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Consumer/Received/ReceivedDateConsumerService.php', + 'ZBateson\\MailMimeParser\\Header\\Consumer\\SubjectConsumerService' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Consumer/SubjectConsumerService.php', + 'ZBateson\\MailMimeParser\\Header\\DateHeader' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/DateHeader.php', + 'ZBateson\\MailMimeParser\\Header\\GenericHeader' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/GenericHeader.php', + 'ZBateson\\MailMimeParser\\Header\\HeaderConsts' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/HeaderConsts.php', + 'ZBateson\\MailMimeParser\\Header\\HeaderFactory' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/HeaderFactory.php', + 'ZBateson\\MailMimeParser\\Header\\IHeader' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/IHeader.php', + 'ZBateson\\MailMimeParser\\Header\\IHeaderPart' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/IHeaderPart.php', + 'ZBateson\\MailMimeParser\\Header\\IdHeader' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/IdHeader.php', + 'ZBateson\\MailMimeParser\\Header\\MimeEncodedHeader' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/MimeEncodedHeader.php', + 'ZBateson\\MailMimeParser\\Header\\ParameterHeader' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/ParameterHeader.php', + 'ZBateson\\MailMimeParser\\Header\\Part\\AddressGroupPart' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Part/AddressGroupPart.php', + 'ZBateson\\MailMimeParser\\Header\\Part\\AddressPart' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Part/AddressPart.php', + 'ZBateson\\MailMimeParser\\Header\\Part\\CommentPart' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Part/CommentPart.php', + 'ZBateson\\MailMimeParser\\Header\\Part\\ContainerPart' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Part/ContainerPart.php', + 'ZBateson\\MailMimeParser\\Header\\Part\\DatePart' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Part/DatePart.php', + 'ZBateson\\MailMimeParser\\Header\\Part\\HeaderPart' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Part/HeaderPart.php', + 'ZBateson\\MailMimeParser\\Header\\Part\\HeaderPartFactory' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Part/HeaderPartFactory.php', + 'ZBateson\\MailMimeParser\\Header\\Part\\MimeToken' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Part/MimeToken.php', + 'ZBateson\\MailMimeParser\\Header\\Part\\MimeTokenPartFactory' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Part/MimeTokenPartFactory.php', + 'ZBateson\\MailMimeParser\\Header\\Part\\NameValuePart' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Part/NameValuePart.php', + 'ZBateson\\MailMimeParser\\Header\\Part\\ParameterPart' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Part/ParameterPart.php', + 'ZBateson\\MailMimeParser\\Header\\Part\\QuotedLiteralPart' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Part/QuotedLiteralPart.php', + 'ZBateson\\MailMimeParser\\Header\\Part\\ReceivedDomainPart' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Part/ReceivedDomainPart.php', + 'ZBateson\\MailMimeParser\\Header\\Part\\ReceivedPart' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Part/ReceivedPart.php', + 'ZBateson\\MailMimeParser\\Header\\Part\\SplitParameterPart' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Part/SplitParameterPart.php', + 'ZBateson\\MailMimeParser\\Header\\Part\\SubjectToken' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Part/SubjectToken.php', + 'ZBateson\\MailMimeParser\\Header\\Part\\Token' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Part/Token.php', + 'ZBateson\\MailMimeParser\\Header\\ReceivedHeader' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/ReceivedHeader.php', + 'ZBateson\\MailMimeParser\\Header\\SubjectHeader' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/SubjectHeader.php', + 'ZBateson\\MailMimeParser\\IErrorBag' => $vendorDir . '/zbateson/mail-mime-parser/src/IErrorBag.php', + 'ZBateson\\MailMimeParser\\IMessage' => $vendorDir . '/zbateson/mail-mime-parser/src/IMessage.php', + 'ZBateson\\MailMimeParser\\MailMimeParser' => $vendorDir . '/zbateson/mail-mime-parser/src/MailMimeParser.php', + 'ZBateson\\MailMimeParser\\Message' => $vendorDir . '/zbateson/mail-mime-parser/src/Message.php', + 'ZBateson\\MailMimeParser\\Message\\Factory\\IMessagePartFactory' => $vendorDir . '/zbateson/mail-mime-parser/src/Message/Factory/IMessagePartFactory.php', + 'ZBateson\\MailMimeParser\\Message\\Factory\\IMimePartFactory' => $vendorDir . '/zbateson/mail-mime-parser/src/Message/Factory/IMimePartFactory.php', + 'ZBateson\\MailMimeParser\\Message\\Factory\\IUUEncodedPartFactory' => $vendorDir . '/zbateson/mail-mime-parser/src/Message/Factory/IUUEncodedPartFactory.php', + 'ZBateson\\MailMimeParser\\Message\\Factory\\PartChildrenContainerFactory' => $vendorDir . '/zbateson/mail-mime-parser/src/Message/Factory/PartChildrenContainerFactory.php', + 'ZBateson\\MailMimeParser\\Message\\Factory\\PartHeaderContainerFactory' => $vendorDir . '/zbateson/mail-mime-parser/src/Message/Factory/PartHeaderContainerFactory.php', + 'ZBateson\\MailMimeParser\\Message\\Factory\\PartStreamContainerFactory' => $vendorDir . '/zbateson/mail-mime-parser/src/Message/Factory/PartStreamContainerFactory.php', + 'ZBateson\\MailMimeParser\\Message\\Helper\\AbstractHelper' => $vendorDir . '/zbateson/mail-mime-parser/src/Message/Helper/AbstractHelper.php', + 'ZBateson\\MailMimeParser\\Message\\Helper\\GenericHelper' => $vendorDir . '/zbateson/mail-mime-parser/src/Message/Helper/GenericHelper.php', + 'ZBateson\\MailMimeParser\\Message\\Helper\\MultipartHelper' => $vendorDir . '/zbateson/mail-mime-parser/src/Message/Helper/MultipartHelper.php', + 'ZBateson\\MailMimeParser\\Message\\Helper\\PrivacyHelper' => $vendorDir . '/zbateson/mail-mime-parser/src/Message/Helper/PrivacyHelper.php', + 'ZBateson\\MailMimeParser\\Message\\IMessagePart' => $vendorDir . '/zbateson/mail-mime-parser/src/Message/IMessagePart.php', + 'ZBateson\\MailMimeParser\\Message\\IMimePart' => $vendorDir . '/zbateson/mail-mime-parser/src/Message/IMimePart.php', + 'ZBateson\\MailMimeParser\\Message\\IMultiPart' => $vendorDir . '/zbateson/mail-mime-parser/src/Message/IMultiPart.php', + 'ZBateson\\MailMimeParser\\Message\\IUUEncodedPart' => $vendorDir . '/zbateson/mail-mime-parser/src/Message/IUUEncodedPart.php', + 'ZBateson\\MailMimeParser\\Message\\MessagePart' => $vendorDir . '/zbateson/mail-mime-parser/src/Message/MessagePart.php', + 'ZBateson\\MailMimeParser\\Message\\MimePart' => $vendorDir . '/zbateson/mail-mime-parser/src/Message/MimePart.php', + 'ZBateson\\MailMimeParser\\Message\\MultiPart' => $vendorDir . '/zbateson/mail-mime-parser/src/Message/MultiPart.php', + 'ZBateson\\MailMimeParser\\Message\\NonMimePart' => $vendorDir . '/zbateson/mail-mime-parser/src/Message/NonMimePart.php', + 'ZBateson\\MailMimeParser\\Message\\PartChildrenContainer' => $vendorDir . '/zbateson/mail-mime-parser/src/Message/PartChildrenContainer.php', + 'ZBateson\\MailMimeParser\\Message\\PartFilter' => $vendorDir . '/zbateson/mail-mime-parser/src/Message/PartFilter.php', + 'ZBateson\\MailMimeParser\\Message\\PartHeaderContainer' => $vendorDir . '/zbateson/mail-mime-parser/src/Message/PartHeaderContainer.php', + 'ZBateson\\MailMimeParser\\Message\\PartStreamContainer' => $vendorDir . '/zbateson/mail-mime-parser/src/Message/PartStreamContainer.php', + 'ZBateson\\MailMimeParser\\Message\\UUEncodedPart' => $vendorDir . '/zbateson/mail-mime-parser/src/Message/UUEncodedPart.php', + 'ZBateson\\MailMimeParser\\Parser\\AbstractParserService' => $vendorDir . '/zbateson/mail-mime-parser/src/Parser/AbstractParserService.php', + 'ZBateson\\MailMimeParser\\Parser\\CompatibleParserNotFoundException' => $vendorDir . '/zbateson/mail-mime-parser/src/Parser/CompatibleParserNotFoundException.php', + 'ZBateson\\MailMimeParser\\Parser\\HeaderParserService' => $vendorDir . '/zbateson/mail-mime-parser/src/Parser/HeaderParserService.php', + 'ZBateson\\MailMimeParser\\Parser\\IParserService' => $vendorDir . '/zbateson/mail-mime-parser/src/Parser/IParserService.php', + 'ZBateson\\MailMimeParser\\Parser\\MessageParserService' => $vendorDir . '/zbateson/mail-mime-parser/src/Parser/MessageParserService.php', + 'ZBateson\\MailMimeParser\\Parser\\MimeParserService' => $vendorDir . '/zbateson/mail-mime-parser/src/Parser/MimeParserService.php', + 'ZBateson\\MailMimeParser\\Parser\\NonMimeParserService' => $vendorDir . '/zbateson/mail-mime-parser/src/Parser/NonMimeParserService.php', + 'ZBateson\\MailMimeParser\\Parser\\ParserManagerService' => $vendorDir . '/zbateson/mail-mime-parser/src/Parser/ParserManagerService.php', + 'ZBateson\\MailMimeParser\\Parser\\PartBuilder' => $vendorDir . '/zbateson/mail-mime-parser/src/Parser/PartBuilder.php', + 'ZBateson\\MailMimeParser\\Parser\\PartBuilderFactory' => $vendorDir . '/zbateson/mail-mime-parser/src/Parser/PartBuilderFactory.php', + 'ZBateson\\MailMimeParser\\Parser\\Part\\ParserPartChildrenContainer' => $vendorDir . '/zbateson/mail-mime-parser/src/Parser/Part/ParserPartChildrenContainer.php', + 'ZBateson\\MailMimeParser\\Parser\\Part\\ParserPartChildrenContainerFactory' => $vendorDir . '/zbateson/mail-mime-parser/src/Parser/Part/ParserPartChildrenContainerFactory.php', + 'ZBateson\\MailMimeParser\\Parser\\Part\\ParserPartStreamContainer' => $vendorDir . '/zbateson/mail-mime-parser/src/Parser/Part/ParserPartStreamContainer.php', + 'ZBateson\\MailMimeParser\\Parser\\Part\\ParserPartStreamContainerFactory' => $vendorDir . '/zbateson/mail-mime-parser/src/Parser/Part/ParserPartStreamContainerFactory.php', + 'ZBateson\\MailMimeParser\\Parser\\Part\\UUEncodedPartHeaderContainer' => $vendorDir . '/zbateson/mail-mime-parser/src/Parser/Part/UUEncodedPartHeaderContainer.php', + 'ZBateson\\MailMimeParser\\Parser\\Part\\UUEncodedPartHeaderContainerFactory' => $vendorDir . '/zbateson/mail-mime-parser/src/Parser/Part/UUEncodedPartHeaderContainerFactory.php', + 'ZBateson\\MailMimeParser\\Parser\\Proxy\\ParserMessageProxy' => $vendorDir . '/zbateson/mail-mime-parser/src/Parser/Proxy/ParserMessageProxy.php', + 'ZBateson\\MailMimeParser\\Parser\\Proxy\\ParserMessageProxyFactory' => $vendorDir . '/zbateson/mail-mime-parser/src/Parser/Proxy/ParserMessageProxyFactory.php', + 'ZBateson\\MailMimeParser\\Parser\\Proxy\\ParserMimePartProxy' => $vendorDir . '/zbateson/mail-mime-parser/src/Parser/Proxy/ParserMimePartProxy.php', + 'ZBateson\\MailMimeParser\\Parser\\Proxy\\ParserMimePartProxyFactory' => $vendorDir . '/zbateson/mail-mime-parser/src/Parser/Proxy/ParserMimePartProxyFactory.php', + 'ZBateson\\MailMimeParser\\Parser\\Proxy\\ParserNonMimeMessageProxy' => $vendorDir . '/zbateson/mail-mime-parser/src/Parser/Proxy/ParserNonMimeMessageProxy.php', + 'ZBateson\\MailMimeParser\\Parser\\Proxy\\ParserNonMimeMessageProxyFactory' => $vendorDir . '/zbateson/mail-mime-parser/src/Parser/Proxy/ParserNonMimeMessageProxyFactory.php', + 'ZBateson\\MailMimeParser\\Parser\\Proxy\\ParserPartProxy' => $vendorDir . '/zbateson/mail-mime-parser/src/Parser/Proxy/ParserPartProxy.php', + 'ZBateson\\MailMimeParser\\Parser\\Proxy\\ParserPartProxyFactory' => $vendorDir . '/zbateson/mail-mime-parser/src/Parser/Proxy/ParserPartProxyFactory.php', + 'ZBateson\\MailMimeParser\\Parser\\Proxy\\ParserUUEncodedPartProxy' => $vendorDir . '/zbateson/mail-mime-parser/src/Parser/Proxy/ParserUUEncodedPartProxy.php', + 'ZBateson\\MailMimeParser\\Parser\\Proxy\\ParserUUEncodedPartProxyFactory' => $vendorDir . '/zbateson/mail-mime-parser/src/Parser/Proxy/ParserUUEncodedPartProxyFactory.php', + 'ZBateson\\MailMimeParser\\Stream\\HeaderStream' => $vendorDir . '/zbateson/mail-mime-parser/src/Stream/HeaderStream.php', + 'ZBateson\\MailMimeParser\\Stream\\MessagePartStream' => $vendorDir . '/zbateson/mail-mime-parser/src/Stream/MessagePartStream.php', + 'ZBateson\\MailMimeParser\\Stream\\MessagePartStreamDecorator' => $vendorDir . '/zbateson/mail-mime-parser/src/Stream/MessagePartStreamDecorator.php', + 'ZBateson\\MailMimeParser\\Stream\\MessagePartStreamReadException' => $vendorDir . '/zbateson/mail-mime-parser/src/Stream/MessagePartStreamReadException.php', + 'ZBateson\\MailMimeParser\\Stream\\StreamFactory' => $vendorDir . '/zbateson/mail-mime-parser/src/Stream/StreamFactory.php', + 'ZBateson\\MbWrapper\\MbWrapper' => $vendorDir . '/zbateson/mb-wrapper/src/MbWrapper.php', + 'ZBateson\\MbWrapper\\UnsupportedCharsetException' => $vendorDir . '/zbateson/mb-wrapper/src/UnsupportedCharsetException.php', + 'ZBateson\\StreamDecorators\\Base64Stream' => $vendorDir . '/zbateson/stream-decorators/src/Base64Stream.php', + 'ZBateson\\StreamDecorators\\CharsetStream' => $vendorDir . '/zbateson/stream-decorators/src/CharsetStream.php', + 'ZBateson\\StreamDecorators\\ChunkSplitStream' => $vendorDir . '/zbateson/stream-decorators/src/ChunkSplitStream.php', + 'ZBateson\\StreamDecorators\\DecoratedCachingStream' => $vendorDir . '/zbateson/stream-decorators/src/DecoratedCachingStream.php', + 'ZBateson\\StreamDecorators\\NonClosingStream' => $vendorDir . '/zbateson/stream-decorators/src/NonClosingStream.php', + 'ZBateson\\StreamDecorators\\PregReplaceFilterStream' => $vendorDir . '/zbateson/stream-decorators/src/PregReplaceFilterStream.php', + 'ZBateson\\StreamDecorators\\QuotedPrintableStream' => $vendorDir . '/zbateson/stream-decorators/src/QuotedPrintableStream.php', + 'ZBateson\\StreamDecorators\\SeekingLimitStream' => $vendorDir . '/zbateson/stream-decorators/src/SeekingLimitStream.php', + 'ZBateson\\StreamDecorators\\TellZeroStream' => $vendorDir . '/zbateson/stream-decorators/src/TellZeroStream.php', + 'ZBateson\\StreamDecorators\\UUStream' => $vendorDir . '/zbateson/stream-decorators/src/UUStream.php', ); diff --git a/plugins/vendor/composer/autoload_files.php b/plugins/vendor/composer/autoload_files.php index a153e8e8..ae825e35 100644 --- a/plugins/vendor/composer/autoload_files.php +++ b/plugins/vendor/composer/autoload_files.php @@ -6,22 +6,19 @@ $vendorDir = dirname(dirname(__FILE__)); $baseDir = dirname($vendorDir); return array( - '662a729f963d39afe703c9d9b7ab4a8c' => $vendorDir . '/symfony/polyfill-php83/bootstrap.php', '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php', '6e3fae29631ef280660b3cdad06f25a8' => $vendorDir . '/symfony/deprecation-contracts/function.php', + '662a729f963d39afe703c9d9b7ab4a8c' => $vendorDir . '/symfony/polyfill-php83/bootstrap.php', + '2203a247e6fda86070a5e4e07aed533a' => $vendorDir . '/symfony/clock/Resources/now.php', + 'a1105708a18b76903365ca1c4aa61b02' => $vendorDir . '/symfony/translation/Resources/functions.php', + 'e69f7f6ee287b969198c3c9d6777bd38' => $vendorDir . '/symfony/polyfill-intl-normalizer/bootstrap.php', + 'a4a119a56e50fbb293281d9a48007e0e' => $vendorDir . '/symfony/polyfill-php80/bootstrap.php', + '7b11c4dc42b3b3023073cb14e519683c' => $vendorDir . '/ralouphie/getallheaders/src/getallheaders.php', + 'def43f6c87e4f8dfd0c9e1b1bab14fe8' => $vendorDir . '/symfony/polyfill-iconv/bootstrap.php', + 'f598d06aa772fa33d905e87be6398fb1' => $vendorDir . '/symfony/polyfill-intl-idn/bootstrap.php', + 'b33e3d135e5d9e47d845c576147bda89' => $vendorDir . '/php-di/php-di/src/functions.php', '606a39d89246991a373564698c2d8383' => $vendorDir . '/symfony/polyfill-php85/bootstrap.php', '9d2b9fc6db0f153a0a149fefb182415e' => $vendorDir . '/symfony/polyfill-php84/bootstrap.php', '23f09fe3194f8c2f70923f90d6702129' => $vendorDir . '/illuminate/collections/functions.php', '60799491728b879e74601d83e38b2cad' => $vendorDir . '/illuminate/collections/helpers.php', - '2203a247e6fda86070a5e4e07aed533a' => $vendorDir . '/symfony/clock/Resources/now.php', - 'a1105708a18b76903365ca1c4aa61b02' => $vendorDir . '/symfony/translation/Resources/functions.php', - 'e69f7f6ee287b969198c3c9d6777bd38' => $vendorDir . '/symfony/polyfill-intl-normalizer/bootstrap.php', - 'f598d06aa772fa33d905e87be6398fb1' => $vendorDir . '/symfony/polyfill-intl-idn/bootstrap.php', - '19e6faa27d773988183e0f384143fcad' => $vendorDir . '/illuminate/reflection/helpers.php', - '7b11c4dc42b3b3023073cb14e519683c' => $vendorDir . '/ralouphie/getallheaders/src/getallheaders.php', - 'def43f6c87e4f8dfd0c9e1b1bab14fe8' => $vendorDir . '/symfony/polyfill-iconv/bootstrap.php', - 'a4a119a56e50fbb293281d9a48007e0e' => $vendorDir . '/symfony/polyfill-php80/bootstrap.php', - 'f625ee536139dfb962a398b200bdb2bd' => $vendorDir . '/illuminate/support/functions.php', - '72579e7bd17821bb1321b87411366eae' => $vendorDir . '/illuminate/support/helpers.php', - 'b33e3d135e5d9e47d845c576147bda89' => $vendorDir . '/php-di/php-di/src/functions.php', ); diff --git a/plugins/vendor/composer/autoload_psr4.php b/plugins/vendor/composer/autoload_psr4.php index da339ba4..1cd61ced 100644 --- a/plugins/vendor/composer/autoload_psr4.php +++ b/plugins/vendor/composer/autoload_psr4.php @@ -6,11 +6,9 @@ $vendorDir = dirname(dirname(__FILE__)); $baseDir = dirname($vendorDir); return array( - 'voku\\' => array($vendorDir . '/voku/portable-ascii/src/voku'), 'ZBateson\\StreamDecorators\\' => array($vendorDir . '/zbateson/stream-decorators/src'), 'ZBateson\\MbWrapper\\' => array($vendorDir . '/zbateson/mb-wrapper/src'), 'ZBateson\\MailMimeParser\\' => array($vendorDir . '/zbateson/mail-mime-parser/src'), - 'Webklex\\PHPIMAP\\' => array($vendorDir . '/webklex/php-imap/src'), 'Symfony\\Polyfill\\Php85\\' => array($vendorDir . '/symfony/polyfill-php85'), 'Symfony\\Polyfill\\Php84\\' => array($vendorDir . '/symfony/polyfill-php84'), 'Symfony\\Polyfill\\Php83\\' => array($vendorDir . '/symfony/polyfill-php83'), @@ -22,21 +20,18 @@ return array( 'Symfony\\Contracts\\Translation\\' => array($vendorDir . '/symfony/translation-contracts'), 'Symfony\\Component\\Translation\\' => array($vendorDir . '/symfony/translation'), 'Symfony\\Component\\Mime\\' => array($vendorDir . '/symfony/mime'), - 'Symfony\\Component\\HttpFoundation\\' => array($vendorDir . '/symfony/http-foundation'), 'Symfony\\Component\\Clock\\' => array($vendorDir . '/symfony/clock'), 'Psr\\SimpleCache\\' => array($vendorDir . '/psr/simple-cache/src'), 'Psr\\Log\\' => array($vendorDir . '/psr/log/src'), - 'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-factory/src', $vendorDir . '/psr/http-message/src'), + 'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src', $vendorDir . '/psr/http-factory/src'), 'Psr\\Container\\' => array($vendorDir . '/psr/container/src'), 'Psr\\Clock\\' => array($vendorDir . '/psr/clock/src'), 'Laravel\\SerializableClosure\\' => array($vendorDir . '/laravel/serializable-closure/src'), 'Invoker\\' => array($vendorDir . '/php-di/invoker/src'), - 'Illuminate\\Support\\' => array($vendorDir . '/illuminate/reflection', $vendorDir . '/illuminate/macroable', $vendorDir . '/illuminate/conditionable', $vendorDir . '/illuminate/collections', $vendorDir . '/illuminate/support'), - 'Illuminate\\Pagination\\' => array($vendorDir . '/illuminate/pagination'), + 'Illuminate\\Support\\' => array($vendorDir . '/illuminate/macroable', $vendorDir . '/illuminate/conditionable', $vendorDir . '/illuminate/collections'), 'Illuminate\\Contracts\\' => array($vendorDir . '/illuminate/contracts'), 'GuzzleHttp\\Psr7\\' => array($vendorDir . '/guzzlehttp/psr7/src'), 'Egulias\\EmailValidator\\' => array($vendorDir . '/egulias/email-validator/src'), - 'Doctrine\\Inflector\\' => array($vendorDir . '/doctrine/inflector/src'), 'Doctrine\\Common\\Lexer\\' => array($vendorDir . '/doctrine/lexer/src'), 'DirectoryTree\\ImapEngine\\' => array($vendorDir . '/directorytree/imapengine/src'), 'DI\\' => array($vendorDir . '/php-di/php-di/src'), diff --git a/plugins/vendor/composer/autoload_real.php b/plugins/vendor/composer/autoload_real.php index d60da886..dee252bc 100644 --- a/plugins/vendor/composer/autoload_real.php +++ b/plugins/vendor/composer/autoload_real.php @@ -2,7 +2,7 @@ // autoload_real.php @generated by Composer -class ComposerAutoloaderInit9b9826e5b5cc7806cd328c4112cca75e +class ComposerAutoloaderInitc3c4b7d024f8d7c21b5ca31de3cb6066 { private static $loader; @@ -24,15 +24,15 @@ class ComposerAutoloaderInit9b9826e5b5cc7806cd328c4112cca75e require __DIR__ . '/platform_check.php'; - spl_autoload_register(array('ComposerAutoloaderInit9b9826e5b5cc7806cd328c4112cca75e', 'loadClassLoader'), true, true); + spl_autoload_register(array('ComposerAutoloaderInitc3c4b7d024f8d7c21b5ca31de3cb6066', 'loadClassLoader'), true, true); self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(\dirname(__FILE__))); - spl_autoload_unregister(array('ComposerAutoloaderInit9b9826e5b5cc7806cd328c4112cca75e', 'loadClassLoader')); + spl_autoload_unregister(array('ComposerAutoloaderInitc3c4b7d024f8d7c21b5ca31de3cb6066', 'loadClassLoader')); $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); if ($useStaticLoader) { require __DIR__ . '/autoload_static.php'; - call_user_func(\Composer\Autoload\ComposerStaticInit9b9826e5b5cc7806cd328c4112cca75e::getInitializer($loader)); + call_user_func(\Composer\Autoload\ComposerStaticInitc3c4b7d024f8d7c21b5ca31de3cb6066::getInitializer($loader)); } else { $map = require __DIR__ . '/autoload_namespaces.php'; foreach ($map as $namespace => $path) { @@ -53,12 +53,12 @@ class ComposerAutoloaderInit9b9826e5b5cc7806cd328c4112cca75e $loader->register(true); if ($useStaticLoader) { - $includeFiles = Composer\Autoload\ComposerStaticInit9b9826e5b5cc7806cd328c4112cca75e::$files; + $includeFiles = Composer\Autoload\ComposerStaticInitc3c4b7d024f8d7c21b5ca31de3cb6066::$files; } else { $includeFiles = require __DIR__ . '/autoload_files.php'; } foreach ($includeFiles as $fileIdentifier => $file) { - composerRequire9b9826e5b5cc7806cd328c4112cca75e($fileIdentifier, $file); + composerRequirec3c4b7d024f8d7c21b5ca31de3cb6066($fileIdentifier, $file); } return $loader; @@ -70,7 +70,7 @@ class ComposerAutoloaderInit9b9826e5b5cc7806cd328c4112cca75e * @param string $file * @return void */ -function composerRequire9b9826e5b5cc7806cd328c4112cca75e($fileIdentifier, $file) +function composerRequirec3c4b7d024f8d7c21b5ca31de3cb6066($fileIdentifier, $file) { if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; diff --git a/plugins/vendor/composer/autoload_static.php b/plugins/vendor/composer/autoload_static.php index 152907cb..28f3fc3b 100644 --- a/plugins/vendor/composer/autoload_static.php +++ b/plugins/vendor/composer/autoload_static.php @@ -4,44 +4,33 @@ namespace Composer\Autoload; -class ComposerStaticInit9b9826e5b5cc7806cd328c4112cca75e +class ComposerStaticInitc3c4b7d024f8d7c21b5ca31de3cb6066 { public static $files = array ( - '662a729f963d39afe703c9d9b7ab4a8c' => __DIR__ . '/..' . '/symfony/polyfill-php83/bootstrap.php', '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php', '6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php', + '662a729f963d39afe703c9d9b7ab4a8c' => __DIR__ . '/..' . '/symfony/polyfill-php83/bootstrap.php', + '2203a247e6fda86070a5e4e07aed533a' => __DIR__ . '/..' . '/symfony/clock/Resources/now.php', + 'a1105708a18b76903365ca1c4aa61b02' => __DIR__ . '/..' . '/symfony/translation/Resources/functions.php', + 'e69f7f6ee287b969198c3c9d6777bd38' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/bootstrap.php', + 'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php', + '7b11c4dc42b3b3023073cb14e519683c' => __DIR__ . '/..' . '/ralouphie/getallheaders/src/getallheaders.php', + 'def43f6c87e4f8dfd0c9e1b1bab14fe8' => __DIR__ . '/..' . '/symfony/polyfill-iconv/bootstrap.php', + 'f598d06aa772fa33d905e87be6398fb1' => __DIR__ . '/..' . '/symfony/polyfill-intl-idn/bootstrap.php', + 'b33e3d135e5d9e47d845c576147bda89' => __DIR__ . '/..' . '/php-di/php-di/src/functions.php', '606a39d89246991a373564698c2d8383' => __DIR__ . '/..' . '/symfony/polyfill-php85/bootstrap.php', '9d2b9fc6db0f153a0a149fefb182415e' => __DIR__ . '/..' . '/symfony/polyfill-php84/bootstrap.php', '23f09fe3194f8c2f70923f90d6702129' => __DIR__ . '/..' . '/illuminate/collections/functions.php', '60799491728b879e74601d83e38b2cad' => __DIR__ . '/..' . '/illuminate/collections/helpers.php', - '2203a247e6fda86070a5e4e07aed533a' => __DIR__ . '/..' . '/symfony/clock/Resources/now.php', - 'a1105708a18b76903365ca1c4aa61b02' => __DIR__ . '/..' . '/symfony/translation/Resources/functions.php', - 'e69f7f6ee287b969198c3c9d6777bd38' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/bootstrap.php', - 'f598d06aa772fa33d905e87be6398fb1' => __DIR__ . '/..' . '/symfony/polyfill-intl-idn/bootstrap.php', - '19e6faa27d773988183e0f384143fcad' => __DIR__ . '/..' . '/illuminate/reflection/helpers.php', - '7b11c4dc42b3b3023073cb14e519683c' => __DIR__ . '/..' . '/ralouphie/getallheaders/src/getallheaders.php', - 'def43f6c87e4f8dfd0c9e1b1bab14fe8' => __DIR__ . '/..' . '/symfony/polyfill-iconv/bootstrap.php', - 'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php', - 'f625ee536139dfb962a398b200bdb2bd' => __DIR__ . '/..' . '/illuminate/support/functions.php', - '72579e7bd17821bb1321b87411366eae' => __DIR__ . '/..' . '/illuminate/support/helpers.php', - 'b33e3d135e5d9e47d845c576147bda89' => __DIR__ . '/..' . '/php-di/php-di/src/functions.php', ); public static $prefixLengthsPsr4 = array ( - 'v' => - array ( - 'voku\\' => 5, - ), 'Z' => array ( 'ZBateson\\StreamDecorators\\' => 26, 'ZBateson\\MbWrapper\\' => 19, 'ZBateson\\MailMimeParser\\' => 24, ), - 'W' => - array ( - 'Webklex\\PHPIMAP\\' => 16, - ), 'S' => array ( 'Symfony\\Polyfill\\Php85\\' => 23, @@ -55,7 +44,6 @@ class ComposerStaticInit9b9826e5b5cc7806cd328c4112cca75e 'Symfony\\Contracts\\Translation\\' => 30, 'Symfony\\Component\\Translation\\' => 30, 'Symfony\\Component\\Mime\\' => 23, - 'Symfony\\Component\\HttpFoundation\\' => 33, 'Symfony\\Component\\Clock\\' => 24, ), 'P' => @@ -74,7 +62,6 @@ class ComposerStaticInit9b9826e5b5cc7806cd328c4112cca75e array ( 'Invoker\\' => 8, 'Illuminate\\Support\\' => 19, - 'Illuminate\\Pagination\\' => 22, 'Illuminate\\Contracts\\' => 21, ), 'G' => @@ -87,7 +74,6 @@ class ComposerStaticInit9b9826e5b5cc7806cd328c4112cca75e ), 'D' => array ( - 'Doctrine\\Inflector\\' => 19, 'Doctrine\\Common\\Lexer\\' => 22, 'DirectoryTree\\ImapEngine\\' => 25, 'DI\\' => 3, @@ -100,10 +86,6 @@ class ComposerStaticInit9b9826e5b5cc7806cd328c4112cca75e ); public static $prefixDirsPsr4 = array ( - 'voku\\' => - array ( - 0 => __DIR__ . '/..' . '/voku/portable-ascii/src/voku', - ), 'ZBateson\\StreamDecorators\\' => array ( 0 => __DIR__ . '/..' . '/zbateson/stream-decorators/src', @@ -116,10 +98,6 @@ class ComposerStaticInit9b9826e5b5cc7806cd328c4112cca75e array ( 0 => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src', ), - 'Webklex\\PHPIMAP\\' => - array ( - 0 => __DIR__ . '/..' . '/webklex/php-imap/src', - ), 'Symfony\\Polyfill\\Php85\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-php85', @@ -164,10 +142,6 @@ class ComposerStaticInit9b9826e5b5cc7806cd328c4112cca75e array ( 0 => __DIR__ . '/..' . '/symfony/mime', ), - 'Symfony\\Component\\HttpFoundation\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/http-foundation', - ), 'Symfony\\Component\\Clock\\' => array ( 0 => __DIR__ . '/..' . '/symfony/clock', @@ -182,8 +156,8 @@ class ComposerStaticInit9b9826e5b5cc7806cd328c4112cca75e ), 'Psr\\Http\\Message\\' => array ( - 0 => __DIR__ . '/..' . '/psr/http-factory/src', - 1 => __DIR__ . '/..' . '/psr/http-message/src', + 0 => __DIR__ . '/..' . '/psr/http-message/src', + 1 => __DIR__ . '/..' . '/psr/http-factory/src', ), 'Psr\\Container\\' => array ( @@ -203,15 +177,9 @@ class ComposerStaticInit9b9826e5b5cc7806cd328c4112cca75e ), 'Illuminate\\Support\\' => array ( - 0 => __DIR__ . '/..' . '/illuminate/reflection', - 1 => __DIR__ . '/..' . '/illuminate/macroable', - 2 => __DIR__ . '/..' . '/illuminate/conditionable', - 3 => __DIR__ . '/..' . '/illuminate/collections', - 4 => __DIR__ . '/..' . '/illuminate/support', - ), - 'Illuminate\\Pagination\\' => - array ( - 0 => __DIR__ . '/..' . '/illuminate/pagination', + 0 => __DIR__ . '/..' . '/illuminate/macroable', + 1 => __DIR__ . '/..' . '/illuminate/conditionable', + 2 => __DIR__ . '/..' . '/illuminate/collections', ), 'Illuminate\\Contracts\\' => array ( @@ -225,10 +193,6 @@ class ComposerStaticInit9b9826e5b5cc7806cd328c4112cca75e array ( 0 => __DIR__ . '/..' . '/egulias/email-validator/src', ), - 'Doctrine\\Inflector\\' => - array ( - 0 => __DIR__ . '/..' . '/doctrine/inflector/src', - ), 'Doctrine\\Common\\Lexer\\' => array ( 0 => __DIR__ . '/..' . '/doctrine/lexer/src', @@ -253,7 +217,162 @@ class ComposerStaticInit9b9826e5b5cc7806cd328c4112cca75e public static $classMap = array ( 'Attribute' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Attribute.php', + 'Carbon\\AbstractTranslator' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/AbstractTranslator.php', + 'Carbon\\Callback' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Callback.php', + 'Carbon\\Carbon' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Carbon.php', + 'Carbon\\CarbonConverterInterface' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/CarbonConverterInterface.php', + 'Carbon\\CarbonImmutable' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/CarbonImmutable.php', + 'Carbon\\CarbonInterface' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/CarbonInterface.php', + 'Carbon\\CarbonInterval' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/CarbonInterval.php', + 'Carbon\\CarbonPeriod' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/CarbonPeriod.php', + 'Carbon\\CarbonPeriodImmutable' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/CarbonPeriodImmutable.php', + 'Carbon\\CarbonTimeZone' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/CarbonTimeZone.php', + 'Carbon\\Cli\\Invoker' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Cli/Invoker.php', + 'Carbon\\Constants\\DiffOptions' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Constants/DiffOptions.php', + 'Carbon\\Constants\\Format' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Constants/Format.php', + 'Carbon\\Constants\\TranslationOptions' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Constants/TranslationOptions.php', + 'Carbon\\Constants\\UnitValue' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Constants/UnitValue.php', + 'Carbon\\Doctrine\\CarbonDoctrineType' => __DIR__ . '/..' . '/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/CarbonDoctrineType.php', + 'Carbon\\Doctrine\\CarbonImmutableType' => __DIR__ . '/..' . '/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/CarbonImmutableType.php', + 'Carbon\\Doctrine\\CarbonType' => __DIR__ . '/..' . '/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/CarbonType.php', + 'Carbon\\Doctrine\\CarbonTypeConverter' => __DIR__ . '/..' . '/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/CarbonTypeConverter.php', + 'Carbon\\Doctrine\\DateTimeDefaultPrecision' => __DIR__ . '/..' . '/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/DateTimeDefaultPrecision.php', + 'Carbon\\Doctrine\\DateTimeImmutableType' => __DIR__ . '/..' . '/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/DateTimeImmutableType.php', + 'Carbon\\Doctrine\\DateTimeType' => __DIR__ . '/..' . '/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/DateTimeType.php', + 'Carbon\\Exceptions\\BadComparisonUnitException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/BadComparisonUnitException.php', + 'Carbon\\Exceptions\\BadFluentConstructorException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/BadFluentConstructorException.php', + 'Carbon\\Exceptions\\BadFluentSetterException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/BadFluentSetterException.php', + 'Carbon\\Exceptions\\BadMethodCallException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/BadMethodCallException.php', + 'Carbon\\Exceptions\\EndLessPeriodException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/EndLessPeriodException.php', + 'Carbon\\Exceptions\\Exception' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/Exception.php', + 'Carbon\\Exceptions\\ImmutableException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/ImmutableException.php', + 'Carbon\\Exceptions\\InvalidArgumentException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/InvalidArgumentException.php', + 'Carbon\\Exceptions\\InvalidCastException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/InvalidCastException.php', + 'Carbon\\Exceptions\\InvalidDateException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/InvalidDateException.php', + 'Carbon\\Exceptions\\InvalidFormatException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/InvalidFormatException.php', + 'Carbon\\Exceptions\\InvalidIntervalException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/InvalidIntervalException.php', + 'Carbon\\Exceptions\\InvalidPeriodDateException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodDateException.php', + 'Carbon\\Exceptions\\InvalidPeriodParameterException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodParameterException.php', + 'Carbon\\Exceptions\\InvalidTimeZoneException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/InvalidTimeZoneException.php', + 'Carbon\\Exceptions\\InvalidTypeException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/InvalidTypeException.php', + 'Carbon\\Exceptions\\NotACarbonClassException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/NotACarbonClassException.php', + 'Carbon\\Exceptions\\NotAPeriodException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/NotAPeriodException.php', + 'Carbon\\Exceptions\\NotLocaleAwareException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/NotLocaleAwareException.php', + 'Carbon\\Exceptions\\OutOfRangeException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/OutOfRangeException.php', + 'Carbon\\Exceptions\\ParseErrorException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/ParseErrorException.php', + 'Carbon\\Exceptions\\RuntimeException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/RuntimeException.php', + 'Carbon\\Exceptions\\UnitException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/UnitException.php', + 'Carbon\\Exceptions\\UnitNotConfiguredException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/UnitNotConfiguredException.php', + 'Carbon\\Exceptions\\UnknownGetterException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/UnknownGetterException.php', + 'Carbon\\Exceptions\\UnknownMethodException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/UnknownMethodException.php', + 'Carbon\\Exceptions\\UnknownSetterException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/UnknownSetterException.php', + 'Carbon\\Exceptions\\UnknownUnitException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/UnknownUnitException.php', + 'Carbon\\Exceptions\\UnreachableException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/UnreachableException.php', + 'Carbon\\Exceptions\\UnsupportedUnitException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/UnsupportedUnitException.php', + 'Carbon\\Factory' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Factory.php', + 'Carbon\\FactoryImmutable' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/FactoryImmutable.php', + 'Carbon\\Language' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Language.php', + 'Carbon\\Laravel\\ServiceProvider' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Laravel/ServiceProvider.php', + 'Carbon\\MessageFormatter\\MessageFormatterMapper' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/MessageFormatter/MessageFormatterMapper.php', + 'Carbon\\Month' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Month.php', + 'Carbon\\OverflowMode' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/OverflowMode.php', + 'Carbon\\PHPStan\\MacroExtension' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/PHPStan/MacroExtension.php', + 'Carbon\\PHPStan\\MacroMethodReflection' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/PHPStan/MacroMethodReflection.php', + 'Carbon\\Traits\\Boundaries' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Boundaries.php', + 'Carbon\\Traits\\Cast' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Cast.php', + 'Carbon\\Traits\\Comparison' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Comparison.php', + 'Carbon\\Traits\\Converter' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Converter.php', + 'Carbon\\Traits\\Creator' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Creator.php', + 'Carbon\\Traits\\Date' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Date.php', + 'Carbon\\Traits\\DeprecatedPeriodProperties' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/DeprecatedPeriodProperties.php', + 'Carbon\\Traits\\Difference' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Difference.php', + 'Carbon\\Traits\\IntervalRounding' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/IntervalRounding.php', + 'Carbon\\Traits\\IntervalStep' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/IntervalStep.php', + 'Carbon\\Traits\\LocalFactory' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/LocalFactory.php', + 'Carbon\\Traits\\Localization' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Localization.php', + 'Carbon\\Traits\\Macro' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Macro.php', + 'Carbon\\Traits\\MagicParameter' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/MagicParameter.php', + 'Carbon\\Traits\\Mixin' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Mixin.php', + 'Carbon\\Traits\\Modifiers' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Modifiers.php', + 'Carbon\\Traits\\Mutability' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Mutability.php', + 'Carbon\\Traits\\ObjectInitialisation' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/ObjectInitialisation.php', + 'Carbon\\Traits\\Options' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Options.php', + 'Carbon\\Traits\\Rounding' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Rounding.php', + 'Carbon\\Traits\\Serialization' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Serialization.php', + 'Carbon\\Traits\\StaticLocalization' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/StaticLocalization.php', + 'Carbon\\Traits\\StaticOptions' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/StaticOptions.php', + 'Carbon\\Traits\\Test' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Test.php', + 'Carbon\\Traits\\Timestamp' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Timestamp.php', + 'Carbon\\Traits\\ToStringFormat' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/ToStringFormat.php', + 'Carbon\\Traits\\Units' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Units.php', + 'Carbon\\Traits\\Week' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Week.php', + 'Carbon\\Translator' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Translator.php', + 'Carbon\\TranslatorImmutable' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/TranslatorImmutable.php', + 'Carbon\\TranslatorStrongTypeInterface' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/TranslatorStrongTypeInterface.php', + 'Carbon\\Unit' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Unit.php', + 'Carbon\\WeekDay' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/WeekDay.php', + 'Carbon\\WrapperClock' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/WrapperClock.php', 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', + 'DI\\Attribute\\Inject' => __DIR__ . '/..' . '/php-di/php-di/src/Attribute/Inject.php', + 'DI\\Attribute\\Injectable' => __DIR__ . '/..' . '/php-di/php-di/src/Attribute/Injectable.php', + 'DI\\CompiledContainer' => __DIR__ . '/..' . '/php-di/php-di/src/CompiledContainer.php', + 'DI\\Compiler\\Compiler' => __DIR__ . '/..' . '/php-di/php-di/src/Compiler/Compiler.php', + 'DI\\Compiler\\ObjectCreationCompiler' => __DIR__ . '/..' . '/php-di/php-di/src/Compiler/ObjectCreationCompiler.php', + 'DI\\Compiler\\RequestedEntryHolder' => __DIR__ . '/..' . '/php-di/php-di/src/Compiler/RequestedEntryHolder.php', + 'DI\\Container' => __DIR__ . '/..' . '/php-di/php-di/src/Container.php', + 'DI\\ContainerBuilder' => __DIR__ . '/..' . '/php-di/php-di/src/ContainerBuilder.php', + 'DI\\Definition\\ArrayDefinition' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/ArrayDefinition.php', + 'DI\\Definition\\ArrayDefinitionExtension' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/ArrayDefinitionExtension.php', + 'DI\\Definition\\AutowireDefinition' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/AutowireDefinition.php', + 'DI\\Definition\\DecoratorDefinition' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/DecoratorDefinition.php', + 'DI\\Definition\\Definition' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/Definition.php', + 'DI\\Definition\\Dumper\\ObjectDefinitionDumper' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/Dumper/ObjectDefinitionDumper.php', + 'DI\\Definition\\EnvironmentVariableDefinition' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/EnvironmentVariableDefinition.php', + 'DI\\Definition\\Exception\\InvalidAttribute' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/Exception/InvalidAttribute.php', + 'DI\\Definition\\Exception\\InvalidDefinition' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/Exception/InvalidDefinition.php', + 'DI\\Definition\\ExtendsPreviousDefinition' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/ExtendsPreviousDefinition.php', + 'DI\\Definition\\FactoryDefinition' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/FactoryDefinition.php', + 'DI\\Definition\\Helper\\AutowireDefinitionHelper' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/Helper/AutowireDefinitionHelper.php', + 'DI\\Definition\\Helper\\CreateDefinitionHelper' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/Helper/CreateDefinitionHelper.php', + 'DI\\Definition\\Helper\\DefinitionHelper' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/Helper/DefinitionHelper.php', + 'DI\\Definition\\Helper\\FactoryDefinitionHelper' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/Helper/FactoryDefinitionHelper.php', + 'DI\\Definition\\InstanceDefinition' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/InstanceDefinition.php', + 'DI\\Definition\\ObjectDefinition' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/ObjectDefinition.php', + 'DI\\Definition\\ObjectDefinition\\MethodInjection' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/ObjectDefinition/MethodInjection.php', + 'DI\\Definition\\ObjectDefinition\\PropertyInjection' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/ObjectDefinition/PropertyInjection.php', + 'DI\\Definition\\Reference' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/Reference.php', + 'DI\\Definition\\Resolver\\ArrayResolver' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/Resolver/ArrayResolver.php', + 'DI\\Definition\\Resolver\\DecoratorResolver' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/Resolver/DecoratorResolver.php', + 'DI\\Definition\\Resolver\\DefinitionResolver' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/Resolver/DefinitionResolver.php', + 'DI\\Definition\\Resolver\\EnvironmentVariableResolver' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/Resolver/EnvironmentVariableResolver.php', + 'DI\\Definition\\Resolver\\FactoryResolver' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/Resolver/FactoryResolver.php', + 'DI\\Definition\\Resolver\\InstanceInjector' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/Resolver/InstanceInjector.php', + 'DI\\Definition\\Resolver\\ObjectCreator' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/Resolver/ObjectCreator.php', + 'DI\\Definition\\Resolver\\ParameterResolver' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/Resolver/ParameterResolver.php', + 'DI\\Definition\\Resolver\\ResolverDispatcher' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/Resolver/ResolverDispatcher.php', + 'DI\\Definition\\SelfResolvingDefinition' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/SelfResolvingDefinition.php', + 'DI\\Definition\\Source\\AttributeBasedAutowiring' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/Source/AttributeBasedAutowiring.php', + 'DI\\Definition\\Source\\Autowiring' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/Source/Autowiring.php', + 'DI\\Definition\\Source\\DefinitionArray' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/Source/DefinitionArray.php', + 'DI\\Definition\\Source\\DefinitionFile' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/Source/DefinitionFile.php', + 'DI\\Definition\\Source\\DefinitionNormalizer' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/Source/DefinitionNormalizer.php', + 'DI\\Definition\\Source\\DefinitionSource' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/Source/DefinitionSource.php', + 'DI\\Definition\\Source\\MutableDefinitionSource' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/Source/MutableDefinitionSource.php', + 'DI\\Definition\\Source\\NoAutowiring' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/Source/NoAutowiring.php', + 'DI\\Definition\\Source\\ReflectionBasedAutowiring' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/Source/ReflectionBasedAutowiring.php', + 'DI\\Definition\\Source\\SourceCache' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/Source/SourceCache.php', + 'DI\\Definition\\Source\\SourceChain' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/Source/SourceChain.php', + 'DI\\Definition\\StringDefinition' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/StringDefinition.php', + 'DI\\Definition\\ValueDefinition' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/ValueDefinition.php', + 'DI\\DependencyException' => __DIR__ . '/..' . '/php-di/php-di/src/DependencyException.php', + 'DI\\FactoryInterface' => __DIR__ . '/..' . '/php-di/php-di/src/FactoryInterface.php', + 'DI\\Factory\\RequestedEntry' => __DIR__ . '/..' . '/php-di/php-di/src/Factory/RequestedEntry.php', + 'DI\\Invoker\\DefinitionParameterResolver' => __DIR__ . '/..' . '/php-di/php-di/src/Invoker/DefinitionParameterResolver.php', + 'DI\\Invoker\\FactoryParameterResolver' => __DIR__ . '/..' . '/php-di/php-di/src/Invoker/FactoryParameterResolver.php', + 'DI\\NotFoundException' => __DIR__ . '/..' . '/php-di/php-di/src/NotFoundException.php', + 'DI\\Proxy\\NativeProxyFactory' => __DIR__ . '/..' . '/php-di/php-di/src/Proxy/NativeProxyFactory.php', + 'DI\\Proxy\\ProxyFactory' => __DIR__ . '/..' . '/php-di/php-di/src/Proxy/ProxyFactory.php', + 'DI\\Proxy\\ProxyFactoryInterface' => __DIR__ . '/..' . '/php-di/php-di/src/Proxy/ProxyFactoryInterface.php', 'DateError' => __DIR__ . '/..' . '/symfony/polyfill-php83/Resources/stubs/DateError.php', 'DateException' => __DIR__ . '/..' . '/symfony/polyfill-php83/Resources/stubs/DateException.php', 'DateInvalidOperationException' => __DIR__ . '/..' . '/symfony/polyfill-php83/Resources/stubs/DateInvalidOperationException.php', @@ -265,8 +384,413 @@ class ComposerStaticInit9b9826e5b5cc7806cd328c4112cca75e 'DateRangeError' => __DIR__ . '/..' . '/symfony/polyfill-php83/Resources/stubs/DateRangeError.php', 'DelayedTargetValidation' => __DIR__ . '/..' . '/symfony/polyfill-php85/Resources/stubs/DelayedTargetValidation.php', 'Deprecated' => __DIR__ . '/..' . '/symfony/polyfill-php84/Resources/stubs/Deprecated.php', + 'DirectoryTree\\ImapEngine\\Address' => __DIR__ . '/..' . '/directorytree/imapengine/src/Address.php', + 'DirectoryTree\\ImapEngine\\Attachment' => __DIR__ . '/..' . '/directorytree/imapengine/src/Attachment.php', + 'DirectoryTree\\ImapEngine\\BodyStructureCollection' => __DIR__ . '/..' . '/directorytree/imapengine/src/BodyStructureCollection.php', + 'DirectoryTree\\ImapEngine\\BodyStructurePart' => __DIR__ . '/..' . '/directorytree/imapengine/src/BodyStructurePart.php', + 'DirectoryTree\\ImapEngine\\Collections\\FolderCollection' => __DIR__ . '/..' . '/directorytree/imapengine/src/Collections/FolderCollection.php', + 'DirectoryTree\\ImapEngine\\Collections\\MessageCollection' => __DIR__ . '/..' . '/directorytree/imapengine/src/Collections/MessageCollection.php', + 'DirectoryTree\\ImapEngine\\Collections\\PaginatedCollection' => __DIR__ . '/..' . '/directorytree/imapengine/src/Collections/PaginatedCollection.php', + 'DirectoryTree\\ImapEngine\\Collections\\ResponseCollection' => __DIR__ . '/..' . '/directorytree/imapengine/src/Collections/ResponseCollection.php', + 'DirectoryTree\\ImapEngine\\ComparesFolders' => __DIR__ . '/..' . '/directorytree/imapengine/src/ComparesFolders.php', + 'DirectoryTree\\ImapEngine\\Connection\\ConnectionInterface' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/ConnectionInterface.php', + 'DirectoryTree\\ImapEngine\\Connection\\ImapCommand' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/ImapCommand.php', + 'DirectoryTree\\ImapEngine\\Connection\\ImapConnection' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/ImapConnection.php', + 'DirectoryTree\\ImapEngine\\Connection\\ImapParser' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/ImapParser.php', + 'DirectoryTree\\ImapEngine\\Connection\\ImapQueryBuilder' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/ImapQueryBuilder.php', + 'DirectoryTree\\ImapEngine\\Connection\\ImapTokenizer' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/ImapTokenizer.php', + 'DirectoryTree\\ImapEngine\\Connection\\Loggers\\EchoLogger' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Loggers/EchoLogger.php', + 'DirectoryTree\\ImapEngine\\Connection\\Loggers\\FileLogger' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Loggers/FileLogger.php', + 'DirectoryTree\\ImapEngine\\Connection\\Loggers\\Logger' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Loggers/Logger.php', + 'DirectoryTree\\ImapEngine\\Connection\\Loggers\\LoggerInterface' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Loggers/LoggerInterface.php', + 'DirectoryTree\\ImapEngine\\Connection\\Loggers\\RayLogger' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Loggers/RayLogger.php', + 'DirectoryTree\\ImapEngine\\Connection\\RawQueryValue' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/RawQueryValue.php', + 'DirectoryTree\\ImapEngine\\Connection\\Responses\\ContinuationResponse' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Responses/ContinuationResponse.php', + 'DirectoryTree\\ImapEngine\\Connection\\Responses\\Data\\Data' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Responses/Data/Data.php', + 'DirectoryTree\\ImapEngine\\Connection\\Responses\\Data\\ListData' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Responses/Data/ListData.php', + 'DirectoryTree\\ImapEngine\\Connection\\Responses\\Data\\ResponseCodeData' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Responses/Data/ResponseCodeData.php', + 'DirectoryTree\\ImapEngine\\Connection\\Responses\\HasTokens' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Responses/HasTokens.php', + 'DirectoryTree\\ImapEngine\\Connection\\Responses\\MessageResponseParser' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Responses/MessageResponseParser.php', + 'DirectoryTree\\ImapEngine\\Connection\\Responses\\Response' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Responses/Response.php', + 'DirectoryTree\\ImapEngine\\Connection\\Responses\\TaggedResponse' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Responses/TaggedResponse.php', + 'DirectoryTree\\ImapEngine\\Connection\\Responses\\UntaggedResponse' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Responses/UntaggedResponse.php', + 'DirectoryTree\\ImapEngine\\Connection\\Result' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Result.php', + 'DirectoryTree\\ImapEngine\\Connection\\Streams\\FakeStream' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Streams/FakeStream.php', + 'DirectoryTree\\ImapEngine\\Connection\\Streams\\ImapStream' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Streams/ImapStream.php', + 'DirectoryTree\\ImapEngine\\Connection\\Streams\\StreamInterface' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Streams/StreamInterface.php', + 'DirectoryTree\\ImapEngine\\Connection\\Tokens\\Atom' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Tokens/Atom.php', + 'DirectoryTree\\ImapEngine\\Connection\\Tokens\\Crlf' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Tokens/Crlf.php', + 'DirectoryTree\\ImapEngine\\Connection\\Tokens\\EmailAddress' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Tokens/EmailAddress.php', + 'DirectoryTree\\ImapEngine\\Connection\\Tokens\\ListClose' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Tokens/ListClose.php', + 'DirectoryTree\\ImapEngine\\Connection\\Tokens\\ListOpen' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Tokens/ListOpen.php', + 'DirectoryTree\\ImapEngine\\Connection\\Tokens\\Literal' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Tokens/Literal.php', + 'DirectoryTree\\ImapEngine\\Connection\\Tokens\\Nil' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Tokens/Nil.php', + 'DirectoryTree\\ImapEngine\\Connection\\Tokens\\Number' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Tokens/Number.php', + 'DirectoryTree\\ImapEngine\\Connection\\Tokens\\QuotedString' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Tokens/QuotedString.php', + 'DirectoryTree\\ImapEngine\\Connection\\Tokens\\ResponseCodeClose' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Tokens/ResponseCodeClose.php', + 'DirectoryTree\\ImapEngine\\Connection\\Tokens\\ResponseCodeOpen' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Tokens/ResponseCodeOpen.php', + 'DirectoryTree\\ImapEngine\\Connection\\Tokens\\Token' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Tokens/Token.php', + 'DirectoryTree\\ImapEngine\\ContentDisposition' => __DIR__ . '/..' . '/directorytree/imapengine/src/ContentDisposition.php', + 'DirectoryTree\\ImapEngine\\DraftMessage' => __DIR__ . '/..' . '/directorytree/imapengine/src/DraftMessage.php', + 'DirectoryTree\\ImapEngine\\Enums\\ContentDispositionType' => __DIR__ . '/..' . '/directorytree/imapengine/src/Enums/ContentDispositionType.php', + 'DirectoryTree\\ImapEngine\\Enums\\ImapFetchIdentifier' => __DIR__ . '/..' . '/directorytree/imapengine/src/Enums/ImapFetchIdentifier.php', + 'DirectoryTree\\ImapEngine\\Enums\\ImapFlag' => __DIR__ . '/..' . '/directorytree/imapengine/src/Enums/ImapFlag.php', + 'DirectoryTree\\ImapEngine\\Enums\\ImapSearchKey' => __DIR__ . '/..' . '/directorytree/imapengine/src/Enums/ImapSearchKey.php', + 'DirectoryTree\\ImapEngine\\Enums\\ImapSortKey' => __DIR__ . '/..' . '/directorytree/imapengine/src/Enums/ImapSortKey.php', + 'DirectoryTree\\ImapEngine\\Exceptions\\Exception' => __DIR__ . '/..' . '/directorytree/imapengine/src/Exceptions/Exception.php', + 'DirectoryTree\\ImapEngine\\Exceptions\\ImapCapabilityException' => __DIR__ . '/..' . '/directorytree/imapengine/src/Exceptions/ImapCapabilityException.php', + 'DirectoryTree\\ImapEngine\\Exceptions\\ImapCommandException' => __DIR__ . '/..' . '/directorytree/imapengine/src/Exceptions/ImapCommandException.php', + 'DirectoryTree\\ImapEngine\\Exceptions\\ImapConnectionClosedException' => __DIR__ . '/..' . '/directorytree/imapengine/src/Exceptions/ImapConnectionClosedException.php', + 'DirectoryTree\\ImapEngine\\Exceptions\\ImapConnectionException' => __DIR__ . '/..' . '/directorytree/imapengine/src/Exceptions/ImapConnectionException.php', + 'DirectoryTree\\ImapEngine\\Exceptions\\ImapConnectionFailedException' => __DIR__ . '/..' . '/directorytree/imapengine/src/Exceptions/ImapConnectionFailedException.php', + 'DirectoryTree\\ImapEngine\\Exceptions\\ImapConnectionTimedOutException' => __DIR__ . '/..' . '/directorytree/imapengine/src/Exceptions/ImapConnectionTimedOutException.php', + 'DirectoryTree\\ImapEngine\\Exceptions\\ImapParserException' => __DIR__ . '/..' . '/directorytree/imapengine/src/Exceptions/ImapParserException.php', + 'DirectoryTree\\ImapEngine\\Exceptions\\ImapResponseException' => __DIR__ . '/..' . '/directorytree/imapengine/src/Exceptions/ImapResponseException.php', + 'DirectoryTree\\ImapEngine\\Exceptions\\ImapStreamException' => __DIR__ . '/..' . '/directorytree/imapengine/src/Exceptions/ImapStreamException.php', + 'DirectoryTree\\ImapEngine\\Exceptions\\RuntimeException' => __DIR__ . '/..' . '/directorytree/imapengine/src/Exceptions/RuntimeException.php', + 'DirectoryTree\\ImapEngine\\FileMessage' => __DIR__ . '/..' . '/directorytree/imapengine/src/FileMessage.php', + 'DirectoryTree\\ImapEngine\\FlaggableInterface' => __DIR__ . '/..' . '/directorytree/imapengine/src/FlaggableInterface.php', + 'DirectoryTree\\ImapEngine\\Folder' => __DIR__ . '/..' . '/directorytree/imapengine/src/Folder.php', + 'DirectoryTree\\ImapEngine\\FolderInterface' => __DIR__ . '/..' . '/directorytree/imapengine/src/FolderInterface.php', + 'DirectoryTree\\ImapEngine\\FolderRepository' => __DIR__ . '/..' . '/directorytree/imapengine/src/FolderRepository.php', + 'DirectoryTree\\ImapEngine\\FolderRepositoryInterface' => __DIR__ . '/..' . '/directorytree/imapengine/src/FolderRepositoryInterface.php', + 'DirectoryTree\\ImapEngine\\HasFlags' => __DIR__ . '/..' . '/directorytree/imapengine/src/HasFlags.php', + 'DirectoryTree\\ImapEngine\\HasMessageAccessors' => __DIR__ . '/..' . '/directorytree/imapengine/src/HasMessageAccessors.php', + 'DirectoryTree\\ImapEngine\\HasParsedMessage' => __DIR__ . '/..' . '/directorytree/imapengine/src/HasParsedMessage.php', + 'DirectoryTree\\ImapEngine\\Idle' => __DIR__ . '/..' . '/directorytree/imapengine/src/Idle.php', + 'DirectoryTree\\ImapEngine\\Mailbox' => __DIR__ . '/..' . '/directorytree/imapengine/src/Mailbox.php', + 'DirectoryTree\\ImapEngine\\MailboxInterface' => __DIR__ . '/..' . '/directorytree/imapengine/src/MailboxInterface.php', + 'DirectoryTree\\ImapEngine\\Mbox' => __DIR__ . '/..' . '/directorytree/imapengine/src/Mbox.php', + 'DirectoryTree\\ImapEngine\\Message' => __DIR__ . '/..' . '/directorytree/imapengine/src/Message.php', + 'DirectoryTree\\ImapEngine\\MessageInterface' => __DIR__ . '/..' . '/directorytree/imapengine/src/MessageInterface.php', + 'DirectoryTree\\ImapEngine\\MessageParser' => __DIR__ . '/..' . '/directorytree/imapengine/src/MessageParser.php', + 'DirectoryTree\\ImapEngine\\MessageQuery' => __DIR__ . '/..' . '/directorytree/imapengine/src/MessageQuery.php', + 'DirectoryTree\\ImapEngine\\MessageQueryInterface' => __DIR__ . '/..' . '/directorytree/imapengine/src/MessageQueryInterface.php', + 'DirectoryTree\\ImapEngine\\Pagination\\LengthAwarePaginator' => __DIR__ . '/..' . '/directorytree/imapengine/src/Pagination/LengthAwarePaginator.php', + 'DirectoryTree\\ImapEngine\\Poll' => __DIR__ . '/..' . '/directorytree/imapengine/src/Poll.php', + 'DirectoryTree\\ImapEngine\\QueriesMessages' => __DIR__ . '/..' . '/directorytree/imapengine/src/QueriesMessages.php', + 'DirectoryTree\\ImapEngine\\Support\\BodyPartDecoder' => __DIR__ . '/..' . '/directorytree/imapengine/src/Support/BodyPartDecoder.php', + 'DirectoryTree\\ImapEngine\\Support\\ForwardsCalls' => __DIR__ . '/..' . '/directorytree/imapengine/src/Support/ForwardsCalls.php', + 'DirectoryTree\\ImapEngine\\Support\\LazyBodyPartStream' => __DIR__ . '/..' . '/directorytree/imapengine/src/Support/LazyBodyPartStream.php', + 'DirectoryTree\\ImapEngine\\Support\\MimeMessage' => __DIR__ . '/..' . '/directorytree/imapengine/src/Support/MimeMessage.php', + 'DirectoryTree\\ImapEngine\\Support\\Str' => __DIR__ . '/..' . '/directorytree/imapengine/src/Support/Str.php', + 'DirectoryTree\\ImapEngine\\Testing\\FakeFolder' => __DIR__ . '/..' . '/directorytree/imapengine/src/Testing/FakeFolder.php', + 'DirectoryTree\\ImapEngine\\Testing\\FakeFolderRepository' => __DIR__ . '/..' . '/directorytree/imapengine/src/Testing/FakeFolderRepository.php', + 'DirectoryTree\\ImapEngine\\Testing\\FakeMailbox' => __DIR__ . '/..' . '/directorytree/imapengine/src/Testing/FakeMailbox.php', + 'DirectoryTree\\ImapEngine\\Testing\\FakeMessage' => __DIR__ . '/..' . '/directorytree/imapengine/src/Testing/FakeMessage.php', + 'DirectoryTree\\ImapEngine\\Testing\\FakeMessageQuery' => __DIR__ . '/..' . '/directorytree/imapengine/src/Testing/FakeMessageQuery.php', + 'Doctrine\\Common\\Lexer\\AbstractLexer' => __DIR__ . '/..' . '/doctrine/lexer/src/AbstractLexer.php', + 'Doctrine\\Common\\Lexer\\Token' => __DIR__ . '/..' . '/doctrine/lexer/src/Token.php', + 'Egulias\\EmailValidator\\EmailLexer' => __DIR__ . '/..' . '/egulias/email-validator/src/EmailLexer.php', + 'Egulias\\EmailValidator\\EmailParser' => __DIR__ . '/..' . '/egulias/email-validator/src/EmailParser.php', + 'Egulias\\EmailValidator\\EmailValidator' => __DIR__ . '/..' . '/egulias/email-validator/src/EmailValidator.php', + 'Egulias\\EmailValidator\\MessageIDParser' => __DIR__ . '/..' . '/egulias/email-validator/src/MessageIDParser.php', + 'Egulias\\EmailValidator\\Parser' => __DIR__ . '/..' . '/egulias/email-validator/src/Parser.php', + 'Egulias\\EmailValidator\\Parser\\Comment' => __DIR__ . '/..' . '/egulias/email-validator/src/Parser/Comment.php', + 'Egulias\\EmailValidator\\Parser\\CommentStrategy\\CommentStrategy' => __DIR__ . '/..' . '/egulias/email-validator/src/Parser/CommentStrategy/CommentStrategy.php', + 'Egulias\\EmailValidator\\Parser\\CommentStrategy\\DomainComment' => __DIR__ . '/..' . '/egulias/email-validator/src/Parser/CommentStrategy/DomainComment.php', + 'Egulias\\EmailValidator\\Parser\\CommentStrategy\\LocalComment' => __DIR__ . '/..' . '/egulias/email-validator/src/Parser/CommentStrategy/LocalComment.php', + 'Egulias\\EmailValidator\\Parser\\DomainLiteral' => __DIR__ . '/..' . '/egulias/email-validator/src/Parser/DomainLiteral.php', + 'Egulias\\EmailValidator\\Parser\\DomainPart' => __DIR__ . '/..' . '/egulias/email-validator/src/Parser/DomainPart.php', + 'Egulias\\EmailValidator\\Parser\\DoubleQuote' => __DIR__ . '/..' . '/egulias/email-validator/src/Parser/DoubleQuote.php', + 'Egulias\\EmailValidator\\Parser\\FoldingWhiteSpace' => __DIR__ . '/..' . '/egulias/email-validator/src/Parser/FoldingWhiteSpace.php', + 'Egulias\\EmailValidator\\Parser\\IDLeftPart' => __DIR__ . '/..' . '/egulias/email-validator/src/Parser/IDLeftPart.php', + 'Egulias\\EmailValidator\\Parser\\IDRightPart' => __DIR__ . '/..' . '/egulias/email-validator/src/Parser/IDRightPart.php', + 'Egulias\\EmailValidator\\Parser\\LocalPart' => __DIR__ . '/..' . '/egulias/email-validator/src/Parser/LocalPart.php', + 'Egulias\\EmailValidator\\Parser\\PartParser' => __DIR__ . '/..' . '/egulias/email-validator/src/Parser/PartParser.php', + 'Egulias\\EmailValidator\\Result\\InvalidEmail' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/InvalidEmail.php', + 'Egulias\\EmailValidator\\Result\\MultipleErrors' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/MultipleErrors.php', + 'Egulias\\EmailValidator\\Result\\Reason\\AtextAfterCFWS' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/AtextAfterCFWS.php', + 'Egulias\\EmailValidator\\Result\\Reason\\CRLFAtTheEnd' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/CRLFAtTheEnd.php', + 'Egulias\\EmailValidator\\Result\\Reason\\CRLFX2' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/CRLFX2.php', + 'Egulias\\EmailValidator\\Result\\Reason\\CRNoLF' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/CRNoLF.php', + 'Egulias\\EmailValidator\\Result\\Reason\\CharNotAllowed' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/CharNotAllowed.php', + 'Egulias\\EmailValidator\\Result\\Reason\\CommaInDomain' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/CommaInDomain.php', + 'Egulias\\EmailValidator\\Result\\Reason\\CommentsInIDRight' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/CommentsInIDRight.php', + 'Egulias\\EmailValidator\\Result\\Reason\\ConsecutiveAt' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/ConsecutiveAt.php', + 'Egulias\\EmailValidator\\Result\\Reason\\ConsecutiveDot' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/ConsecutiveDot.php', + 'Egulias\\EmailValidator\\Result\\Reason\\DetailedReason' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/DetailedReason.php', + 'Egulias\\EmailValidator\\Result\\Reason\\DomainAcceptsNoMail' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/DomainAcceptsNoMail.php', + 'Egulias\\EmailValidator\\Result\\Reason\\DomainHyphened' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/DomainHyphened.php', + 'Egulias\\EmailValidator\\Result\\Reason\\DomainTooLong' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/DomainTooLong.php', + 'Egulias\\EmailValidator\\Result\\Reason\\DotAtEnd' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/DotAtEnd.php', + 'Egulias\\EmailValidator\\Result\\Reason\\DotAtStart' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/DotAtStart.php', + 'Egulias\\EmailValidator\\Result\\Reason\\EmptyReason' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/EmptyReason.php', + 'Egulias\\EmailValidator\\Result\\Reason\\ExceptionFound' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/ExceptionFound.php', + 'Egulias\\EmailValidator\\Result\\Reason\\ExpectingATEXT' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/ExpectingATEXT.php', + 'Egulias\\EmailValidator\\Result\\Reason\\ExpectingCTEXT' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/ExpectingCTEXT.php', + 'Egulias\\EmailValidator\\Result\\Reason\\ExpectingDTEXT' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/ExpectingDTEXT.php', + 'Egulias\\EmailValidator\\Result\\Reason\\ExpectingDomainLiteralClose' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/ExpectingDomainLiteralClose.php', + 'Egulias\\EmailValidator\\Result\\Reason\\LabelTooLong' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/LabelTooLong.php', + 'Egulias\\EmailValidator\\Result\\Reason\\LocalOrReservedDomain' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/LocalOrReservedDomain.php', + 'Egulias\\EmailValidator\\Result\\Reason\\NoDNSRecord' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/NoDNSRecord.php', + 'Egulias\\EmailValidator\\Result\\Reason\\NoDomainPart' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/NoDomainPart.php', + 'Egulias\\EmailValidator\\Result\\Reason\\NoLocalPart' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/NoLocalPart.php', + 'Egulias\\EmailValidator\\Result\\Reason\\RFCWarnings' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/RFCWarnings.php', + 'Egulias\\EmailValidator\\Result\\Reason\\Reason' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/Reason.php', + 'Egulias\\EmailValidator\\Result\\Reason\\SpoofEmail' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/SpoofEmail.php', + 'Egulias\\EmailValidator\\Result\\Reason\\UnOpenedComment' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/UnOpenedComment.php', + 'Egulias\\EmailValidator\\Result\\Reason\\UnableToGetDNSRecord' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/UnableToGetDNSRecord.php', + 'Egulias\\EmailValidator\\Result\\Reason\\UnclosedComment' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/UnclosedComment.php', + 'Egulias\\EmailValidator\\Result\\Reason\\UnclosedQuotedString' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/UnclosedQuotedString.php', + 'Egulias\\EmailValidator\\Result\\Reason\\UnusualElements' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/UnusualElements.php', + 'Egulias\\EmailValidator\\Result\\Result' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Result.php', + 'Egulias\\EmailValidator\\Result\\SpoofEmail' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/SpoofEmail.php', + 'Egulias\\EmailValidator\\Result\\ValidEmail' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/ValidEmail.php', + 'Egulias\\EmailValidator\\Validation\\DNSCheckValidation' => __DIR__ . '/..' . '/egulias/email-validator/src/Validation/DNSCheckValidation.php', + 'Egulias\\EmailValidator\\Validation\\DNSGetRecordWrapper' => __DIR__ . '/..' . '/egulias/email-validator/src/Validation/DNSGetRecordWrapper.php', + 'Egulias\\EmailValidator\\Validation\\DNSRecords' => __DIR__ . '/..' . '/egulias/email-validator/src/Validation/DNSRecords.php', + 'Egulias\\EmailValidator\\Validation\\EmailValidation' => __DIR__ . '/..' . '/egulias/email-validator/src/Validation/EmailValidation.php', + 'Egulias\\EmailValidator\\Validation\\Exception\\EmptyValidationList' => __DIR__ . '/..' . '/egulias/email-validator/src/Validation/Exception/EmptyValidationList.php', + 'Egulias\\EmailValidator\\Validation\\Extra\\SpoofCheckValidation' => __DIR__ . '/..' . '/egulias/email-validator/src/Validation/Extra/SpoofCheckValidation.php', + 'Egulias\\EmailValidator\\Validation\\MessageIDValidation' => __DIR__ . '/..' . '/egulias/email-validator/src/Validation/MessageIDValidation.php', + 'Egulias\\EmailValidator\\Validation\\MultipleValidationWithAnd' => __DIR__ . '/..' . '/egulias/email-validator/src/Validation/MultipleValidationWithAnd.php', + 'Egulias\\EmailValidator\\Validation\\NoRFCWarningsValidation' => __DIR__ . '/..' . '/egulias/email-validator/src/Validation/NoRFCWarningsValidation.php', + 'Egulias\\EmailValidator\\Validation\\RFCValidation' => __DIR__ . '/..' . '/egulias/email-validator/src/Validation/RFCValidation.php', + 'Egulias\\EmailValidator\\Warning\\AddressLiteral' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/AddressLiteral.php', + 'Egulias\\EmailValidator\\Warning\\CFWSNearAt' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/CFWSNearAt.php', + 'Egulias\\EmailValidator\\Warning\\CFWSWithFWS' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/CFWSWithFWS.php', + 'Egulias\\EmailValidator\\Warning\\Comment' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/Comment.php', + 'Egulias\\EmailValidator\\Warning\\DeprecatedComment' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/DeprecatedComment.php', + 'Egulias\\EmailValidator\\Warning\\DomainLiteral' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/DomainLiteral.php', + 'Egulias\\EmailValidator\\Warning\\EmailTooLong' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/EmailTooLong.php', + 'Egulias\\EmailValidator\\Warning\\IPV6BadChar' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/IPV6BadChar.php', + 'Egulias\\EmailValidator\\Warning\\IPV6ColonEnd' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/IPV6ColonEnd.php', + 'Egulias\\EmailValidator\\Warning\\IPV6ColonStart' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/IPV6ColonStart.php', + 'Egulias\\EmailValidator\\Warning\\IPV6Deprecated' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/IPV6Deprecated.php', + 'Egulias\\EmailValidator\\Warning\\IPV6DoubleColon' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/IPV6DoubleColon.php', + 'Egulias\\EmailValidator\\Warning\\IPV6GroupCount' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/IPV6GroupCount.php', + 'Egulias\\EmailValidator\\Warning\\IPV6MaxGroups' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/IPV6MaxGroups.php', + 'Egulias\\EmailValidator\\Warning\\LocalTooLong' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/LocalTooLong.php', + 'Egulias\\EmailValidator\\Warning\\NoDNSMXRecord' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/NoDNSMXRecord.php', + 'Egulias\\EmailValidator\\Warning\\ObsoleteDTEXT' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/ObsoleteDTEXT.php', + 'Egulias\\EmailValidator\\Warning\\QuotedPart' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/QuotedPart.php', + 'Egulias\\EmailValidator\\Warning\\QuotedString' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/QuotedString.php', + 'Egulias\\EmailValidator\\Warning\\TLD' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/TLD.php', + 'Egulias\\EmailValidator\\Warning\\Warning' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/Warning.php', 'Filter\\FilterException' => __DIR__ . '/..' . '/symfony/polyfill-php85/Resources/stubs/Filter/FilterException.php', 'Filter\\FilterFailedException' => __DIR__ . '/..' . '/symfony/polyfill-php85/Resources/stubs/Filter/FilterFailedException.php', + 'GuzzleHttp\\Psr7\\AppendStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/AppendStream.php', + 'GuzzleHttp\\Psr7\\BufferStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/BufferStream.php', + 'GuzzleHttp\\Psr7\\CachingStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/CachingStream.php', + 'GuzzleHttp\\Psr7\\DroppingStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/DroppingStream.php', + 'GuzzleHttp\\Psr7\\Exception\\MalformedUriException' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Exception/MalformedUriException.php', + 'GuzzleHttp\\Psr7\\FnStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/FnStream.php', + 'GuzzleHttp\\Psr7\\Header' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Header.php', + 'GuzzleHttp\\Psr7\\HttpFactory' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/HttpFactory.php', + 'GuzzleHttp\\Psr7\\InflateStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/InflateStream.php', + 'GuzzleHttp\\Psr7\\LazyOpenStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/LazyOpenStream.php', + 'GuzzleHttp\\Psr7\\LimitStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/LimitStream.php', + 'GuzzleHttp\\Psr7\\Message' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Message.php', + 'GuzzleHttp\\Psr7\\MessageTrait' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/MessageTrait.php', + 'GuzzleHttp\\Psr7\\MimeType' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/MimeType.php', + 'GuzzleHttp\\Psr7\\MultipartStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/MultipartStream.php', + 'GuzzleHttp\\Psr7\\NoSeekStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/NoSeekStream.php', + 'GuzzleHttp\\Psr7\\PumpStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/PumpStream.php', + 'GuzzleHttp\\Psr7\\Query' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Query.php', + 'GuzzleHttp\\Psr7\\Request' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Request.php', + 'GuzzleHttp\\Psr7\\Response' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Response.php', + 'GuzzleHttp\\Psr7\\Rfc3986' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Rfc3986.php', + 'GuzzleHttp\\Psr7\\Rfc7230' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Rfc7230.php', + 'GuzzleHttp\\Psr7\\ServerRequest' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/ServerRequest.php', + 'GuzzleHttp\\Psr7\\Stream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Stream.php', + 'GuzzleHttp\\Psr7\\StreamDecoratorTrait' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/StreamDecoratorTrait.php', + 'GuzzleHttp\\Psr7\\StreamWrapper' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/StreamWrapper.php', + 'GuzzleHttp\\Psr7\\UploadedFile' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/UploadedFile.php', + 'GuzzleHttp\\Psr7\\Uri' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Uri.php', + 'GuzzleHttp\\Psr7\\UriComparator' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/UriComparator.php', + 'GuzzleHttp\\Psr7\\UriNormalizer' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/UriNormalizer.php', + 'GuzzleHttp\\Psr7\\UriResolver' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/UriResolver.php', + 'GuzzleHttp\\Psr7\\Utils' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Utils.php', + 'Illuminate\\Contracts\\Auth\\Access\\Authorizable' => __DIR__ . '/..' . '/illuminate/contracts/Auth/Access/Authorizable.php', + 'Illuminate\\Contracts\\Auth\\Access\\Gate' => __DIR__ . '/..' . '/illuminate/contracts/Auth/Access/Gate.php', + 'Illuminate\\Contracts\\Auth\\Authenticatable' => __DIR__ . '/..' . '/illuminate/contracts/Auth/Authenticatable.php', + 'Illuminate\\Contracts\\Auth\\CanResetPassword' => __DIR__ . '/..' . '/illuminate/contracts/Auth/CanResetPassword.php', + 'Illuminate\\Contracts\\Auth\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Auth/Factory.php', + 'Illuminate\\Contracts\\Auth\\Guard' => __DIR__ . '/..' . '/illuminate/contracts/Auth/Guard.php', + 'Illuminate\\Contracts\\Auth\\Middleware\\AuthenticatesRequests' => __DIR__ . '/..' . '/illuminate/contracts/Auth/Middleware/AuthenticatesRequests.php', + 'Illuminate\\Contracts\\Auth\\MustVerifyEmail' => __DIR__ . '/..' . '/illuminate/contracts/Auth/MustVerifyEmail.php', + 'Illuminate\\Contracts\\Auth\\PasswordBroker' => __DIR__ . '/..' . '/illuminate/contracts/Auth/PasswordBroker.php', + 'Illuminate\\Contracts\\Auth\\PasswordBrokerFactory' => __DIR__ . '/..' . '/illuminate/contracts/Auth/PasswordBrokerFactory.php', + 'Illuminate\\Contracts\\Auth\\StatefulGuard' => __DIR__ . '/..' . '/illuminate/contracts/Auth/StatefulGuard.php', + 'Illuminate\\Contracts\\Auth\\SupportsBasicAuth' => __DIR__ . '/..' . '/illuminate/contracts/Auth/SupportsBasicAuth.php', + 'Illuminate\\Contracts\\Auth\\UserProvider' => __DIR__ . '/..' . '/illuminate/contracts/Auth/UserProvider.php', + 'Illuminate\\Contracts\\Broadcasting\\Broadcaster' => __DIR__ . '/..' . '/illuminate/contracts/Broadcasting/Broadcaster.php', + 'Illuminate\\Contracts\\Broadcasting\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Broadcasting/Factory.php', + 'Illuminate\\Contracts\\Broadcasting\\HasBroadcastChannel' => __DIR__ . '/..' . '/illuminate/contracts/Broadcasting/HasBroadcastChannel.php', + 'Illuminate\\Contracts\\Broadcasting\\ShouldBeUnique' => __DIR__ . '/..' . '/illuminate/contracts/Broadcasting/ShouldBeUnique.php', + 'Illuminate\\Contracts\\Broadcasting\\ShouldBroadcast' => __DIR__ . '/..' . '/illuminate/contracts/Broadcasting/ShouldBroadcast.php', + 'Illuminate\\Contracts\\Broadcasting\\ShouldBroadcastNow' => __DIR__ . '/..' . '/illuminate/contracts/Broadcasting/ShouldBroadcastNow.php', + 'Illuminate\\Contracts\\Broadcasting\\ShouldRescue' => __DIR__ . '/..' . '/illuminate/contracts/Broadcasting/ShouldRescue.php', + 'Illuminate\\Contracts\\Bus\\Dispatcher' => __DIR__ . '/..' . '/illuminate/contracts/Bus/Dispatcher.php', + 'Illuminate\\Contracts\\Bus\\QueueingDispatcher' => __DIR__ . '/..' . '/illuminate/contracts/Bus/QueueingDispatcher.php', + 'Illuminate\\Contracts\\Cache\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Cache/Factory.php', + 'Illuminate\\Contracts\\Cache\\Lock' => __DIR__ . '/..' . '/illuminate/contracts/Cache/Lock.php', + 'Illuminate\\Contracts\\Cache\\LockProvider' => __DIR__ . '/..' . '/illuminate/contracts/Cache/LockProvider.php', + 'Illuminate\\Contracts\\Cache\\LockTimeoutException' => __DIR__ . '/..' . '/illuminate/contracts/Cache/LockTimeoutException.php', + 'Illuminate\\Contracts\\Cache\\Repository' => __DIR__ . '/..' . '/illuminate/contracts/Cache/Repository.php', + 'Illuminate\\Contracts\\Cache\\Store' => __DIR__ . '/..' . '/illuminate/contracts/Cache/Store.php', + 'Illuminate\\Contracts\\Concurrency\\Driver' => __DIR__ . '/..' . '/illuminate/contracts/Concurrency/Driver.php', + 'Illuminate\\Contracts\\Config\\Repository' => __DIR__ . '/..' . '/illuminate/contracts/Config/Repository.php', + 'Illuminate\\Contracts\\Console\\Application' => __DIR__ . '/..' . '/illuminate/contracts/Console/Application.php', + 'Illuminate\\Contracts\\Console\\Isolatable' => __DIR__ . '/..' . '/illuminate/contracts/Console/Isolatable.php', + 'Illuminate\\Contracts\\Console\\Kernel' => __DIR__ . '/..' . '/illuminate/contracts/Console/Kernel.php', + 'Illuminate\\Contracts\\Console\\PromptsForMissingInput' => __DIR__ . '/..' . '/illuminate/contracts/Console/PromptsForMissingInput.php', + 'Illuminate\\Contracts\\Container\\BindingResolutionException' => __DIR__ . '/..' . '/illuminate/contracts/Container/BindingResolutionException.php', + 'Illuminate\\Contracts\\Container\\CircularDependencyException' => __DIR__ . '/..' . '/illuminate/contracts/Container/CircularDependencyException.php', + 'Illuminate\\Contracts\\Container\\Container' => __DIR__ . '/..' . '/illuminate/contracts/Container/Container.php', + 'Illuminate\\Contracts\\Container\\ContextualAttribute' => __DIR__ . '/..' . '/illuminate/contracts/Container/ContextualAttribute.php', + 'Illuminate\\Contracts\\Container\\ContextualBindingBuilder' => __DIR__ . '/..' . '/illuminate/contracts/Container/ContextualBindingBuilder.php', + 'Illuminate\\Contracts\\Container\\SelfBuilding' => __DIR__ . '/..' . '/illuminate/contracts/Container/SelfBuilding.php', + 'Illuminate\\Contracts\\Cookie\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Cookie/Factory.php', + 'Illuminate\\Contracts\\Cookie\\QueueingFactory' => __DIR__ . '/..' . '/illuminate/contracts/Cookie/QueueingFactory.php', + 'Illuminate\\Contracts\\Database\\ConcurrencyErrorDetector' => __DIR__ . '/..' . '/illuminate/contracts/Database/ConcurrencyErrorDetector.php', + 'Illuminate\\Contracts\\Database\\Eloquent\\Builder' => __DIR__ . '/..' . '/illuminate/contracts/Database/Eloquent/Builder.php', + 'Illuminate\\Contracts\\Database\\Eloquent\\Castable' => __DIR__ . '/..' . '/illuminate/contracts/Database/Eloquent/Castable.php', + 'Illuminate\\Contracts\\Database\\Eloquent\\CastsAttributes' => __DIR__ . '/..' . '/illuminate/contracts/Database/Eloquent/CastsAttributes.php', + 'Illuminate\\Contracts\\Database\\Eloquent\\CastsInboundAttributes' => __DIR__ . '/..' . '/illuminate/contracts/Database/Eloquent/CastsInboundAttributes.php', + 'Illuminate\\Contracts\\Database\\Eloquent\\ComparesCastableAttributes' => __DIR__ . '/..' . '/illuminate/contracts/Database/Eloquent/ComparesCastableAttributes.php', + 'Illuminate\\Contracts\\Database\\Eloquent\\DeviatesCastableAttributes' => __DIR__ . '/..' . '/illuminate/contracts/Database/Eloquent/DeviatesCastableAttributes.php', + 'Illuminate\\Contracts\\Database\\Eloquent\\SerializesCastableAttributes' => __DIR__ . '/..' . '/illuminate/contracts/Database/Eloquent/SerializesCastableAttributes.php', + 'Illuminate\\Contracts\\Database\\Eloquent\\SupportsPartialRelations' => __DIR__ . '/..' . '/illuminate/contracts/Database/Eloquent/SupportsPartialRelations.php', + 'Illuminate\\Contracts\\Database\\Events\\MigrationEvent' => __DIR__ . '/..' . '/illuminate/contracts/Database/Events/MigrationEvent.php', + 'Illuminate\\Contracts\\Database\\LostConnectionDetector' => __DIR__ . '/..' . '/illuminate/contracts/Database/LostConnectionDetector.php', + 'Illuminate\\Contracts\\Database\\ModelIdentifier' => __DIR__ . '/..' . '/illuminate/contracts/Database/ModelIdentifier.php', + 'Illuminate\\Contracts\\Database\\Query\\Builder' => __DIR__ . '/..' . '/illuminate/contracts/Database/Query/Builder.php', + 'Illuminate\\Contracts\\Database\\Query\\ConditionExpression' => __DIR__ . '/..' . '/illuminate/contracts/Database/Query/ConditionExpression.php', + 'Illuminate\\Contracts\\Database\\Query\\Expression' => __DIR__ . '/..' . '/illuminate/contracts/Database/Query/Expression.php', + 'Illuminate\\Contracts\\Debug\\ExceptionHandler' => __DIR__ . '/..' . '/illuminate/contracts/Debug/ExceptionHandler.php', + 'Illuminate\\Contracts\\Debug\\ShouldntReport' => __DIR__ . '/..' . '/illuminate/contracts/Debug/ShouldntReport.php', + 'Illuminate\\Contracts\\Encryption\\DecryptException' => __DIR__ . '/..' . '/illuminate/contracts/Encryption/DecryptException.php', + 'Illuminate\\Contracts\\Encryption\\EncryptException' => __DIR__ . '/..' . '/illuminate/contracts/Encryption/EncryptException.php', + 'Illuminate\\Contracts\\Encryption\\Encrypter' => __DIR__ . '/..' . '/illuminate/contracts/Encryption/Encrypter.php', + 'Illuminate\\Contracts\\Encryption\\StringEncrypter' => __DIR__ . '/..' . '/illuminate/contracts/Encryption/StringEncrypter.php', + 'Illuminate\\Contracts\\Events\\Dispatcher' => __DIR__ . '/..' . '/illuminate/contracts/Events/Dispatcher.php', + 'Illuminate\\Contracts\\Events\\ShouldDispatchAfterCommit' => __DIR__ . '/..' . '/illuminate/contracts/Events/ShouldDispatchAfterCommit.php', + 'Illuminate\\Contracts\\Events\\ShouldHandleEventsAfterCommit' => __DIR__ . '/..' . '/illuminate/contracts/Events/ShouldHandleEventsAfterCommit.php', + 'Illuminate\\Contracts\\Filesystem\\Cloud' => __DIR__ . '/..' . '/illuminate/contracts/Filesystem/Cloud.php', + 'Illuminate\\Contracts\\Filesystem\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Filesystem/Factory.php', + 'Illuminate\\Contracts\\Filesystem\\FileNotFoundException' => __DIR__ . '/..' . '/illuminate/contracts/Filesystem/FileNotFoundException.php', + 'Illuminate\\Contracts\\Filesystem\\Filesystem' => __DIR__ . '/..' . '/illuminate/contracts/Filesystem/Filesystem.php', + 'Illuminate\\Contracts\\Filesystem\\LockTimeoutException' => __DIR__ . '/..' . '/illuminate/contracts/Filesystem/LockTimeoutException.php', + 'Illuminate\\Contracts\\Foundation\\Application' => __DIR__ . '/..' . '/illuminate/contracts/Foundation/Application.php', + 'Illuminate\\Contracts\\Foundation\\CachesConfiguration' => __DIR__ . '/..' . '/illuminate/contracts/Foundation/CachesConfiguration.php', + 'Illuminate\\Contracts\\Foundation\\CachesRoutes' => __DIR__ . '/..' . '/illuminate/contracts/Foundation/CachesRoutes.php', + 'Illuminate\\Contracts\\Foundation\\ExceptionRenderer' => __DIR__ . '/..' . '/illuminate/contracts/Foundation/ExceptionRenderer.php', + 'Illuminate\\Contracts\\Foundation\\MaintenanceMode' => __DIR__ . '/..' . '/illuminate/contracts/Foundation/MaintenanceMode.php', + 'Illuminate\\Contracts\\Hashing\\Hasher' => __DIR__ . '/..' . '/illuminate/contracts/Hashing/Hasher.php', + 'Illuminate\\Contracts\\Http\\Kernel' => __DIR__ . '/..' . '/illuminate/contracts/Http/Kernel.php', + 'Illuminate\\Contracts\\JsonSchema\\JsonSchema' => __DIR__ . '/..' . '/illuminate/contracts/JsonSchema/JsonSchema.php', + 'Illuminate\\Contracts\\Log\\ContextLogProcessor' => __DIR__ . '/..' . '/illuminate/contracts/Log/ContextLogProcessor.php', + 'Illuminate\\Contracts\\Mail\\Attachable' => __DIR__ . '/..' . '/illuminate/contracts/Mail/Attachable.php', + 'Illuminate\\Contracts\\Mail\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Mail/Factory.php', + 'Illuminate\\Contracts\\Mail\\MailQueue' => __DIR__ . '/..' . '/illuminate/contracts/Mail/MailQueue.php', + 'Illuminate\\Contracts\\Mail\\Mailable' => __DIR__ . '/..' . '/illuminate/contracts/Mail/Mailable.php', + 'Illuminate\\Contracts\\Mail\\Mailer' => __DIR__ . '/..' . '/illuminate/contracts/Mail/Mailer.php', + 'Illuminate\\Contracts\\Notifications\\Dispatcher' => __DIR__ . '/..' . '/illuminate/contracts/Notifications/Dispatcher.php', + 'Illuminate\\Contracts\\Notifications\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Notifications/Factory.php', + 'Illuminate\\Contracts\\Pagination\\CursorPaginator' => __DIR__ . '/..' . '/illuminate/contracts/Pagination/CursorPaginator.php', + 'Illuminate\\Contracts\\Pagination\\LengthAwarePaginator' => __DIR__ . '/..' . '/illuminate/contracts/Pagination/LengthAwarePaginator.php', + 'Illuminate\\Contracts\\Pagination\\Paginator' => __DIR__ . '/..' . '/illuminate/contracts/Pagination/Paginator.php', + 'Illuminate\\Contracts\\Pipeline\\Hub' => __DIR__ . '/..' . '/illuminate/contracts/Pipeline/Hub.php', + 'Illuminate\\Contracts\\Pipeline\\Pipeline' => __DIR__ . '/..' . '/illuminate/contracts/Pipeline/Pipeline.php', + 'Illuminate\\Contracts\\Process\\InvokedProcess' => __DIR__ . '/..' . '/illuminate/contracts/Process/InvokedProcess.php', + 'Illuminate\\Contracts\\Process\\ProcessResult' => __DIR__ . '/..' . '/illuminate/contracts/Process/ProcessResult.php', + 'Illuminate\\Contracts\\Queue\\ClearableQueue' => __DIR__ . '/..' . '/illuminate/contracts/Queue/ClearableQueue.php', + 'Illuminate\\Contracts\\Queue\\EntityNotFoundException' => __DIR__ . '/..' . '/illuminate/contracts/Queue/EntityNotFoundException.php', + 'Illuminate\\Contracts\\Queue\\EntityResolver' => __DIR__ . '/..' . '/illuminate/contracts/Queue/EntityResolver.php', + 'Illuminate\\Contracts\\Queue\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Queue/Factory.php', + 'Illuminate\\Contracts\\Queue\\Job' => __DIR__ . '/..' . '/illuminate/contracts/Queue/Job.php', + 'Illuminate\\Contracts\\Queue\\Monitor' => __DIR__ . '/..' . '/illuminate/contracts/Queue/Monitor.php', + 'Illuminate\\Contracts\\Queue\\Queue' => __DIR__ . '/..' . '/illuminate/contracts/Queue/Queue.php', + 'Illuminate\\Contracts\\Queue\\QueueableCollection' => __DIR__ . '/..' . '/illuminate/contracts/Queue/QueueableCollection.php', + 'Illuminate\\Contracts\\Queue\\QueueableEntity' => __DIR__ . '/..' . '/illuminate/contracts/Queue/QueueableEntity.php', + 'Illuminate\\Contracts\\Queue\\ShouldBeEncrypted' => __DIR__ . '/..' . '/illuminate/contracts/Queue/ShouldBeEncrypted.php', + 'Illuminate\\Contracts\\Queue\\ShouldBeUnique' => __DIR__ . '/..' . '/illuminate/contracts/Queue/ShouldBeUnique.php', + 'Illuminate\\Contracts\\Queue\\ShouldBeUniqueUntilProcessing' => __DIR__ . '/..' . '/illuminate/contracts/Queue/ShouldBeUniqueUntilProcessing.php', + 'Illuminate\\Contracts\\Queue\\ShouldQueue' => __DIR__ . '/..' . '/illuminate/contracts/Queue/ShouldQueue.php', + 'Illuminate\\Contracts\\Queue\\ShouldQueueAfterCommit' => __DIR__ . '/..' . '/illuminate/contracts/Queue/ShouldQueueAfterCommit.php', + 'Illuminate\\Contracts\\Redis\\Connection' => __DIR__ . '/..' . '/illuminate/contracts/Redis/Connection.php', + 'Illuminate\\Contracts\\Redis\\Connector' => __DIR__ . '/..' . '/illuminate/contracts/Redis/Connector.php', + 'Illuminate\\Contracts\\Redis\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Redis/Factory.php', + 'Illuminate\\Contracts\\Redis\\LimiterTimeoutException' => __DIR__ . '/..' . '/illuminate/contracts/Redis/LimiterTimeoutException.php', + 'Illuminate\\Contracts\\Routing\\BindingRegistrar' => __DIR__ . '/..' . '/illuminate/contracts/Routing/BindingRegistrar.php', + 'Illuminate\\Contracts\\Routing\\Registrar' => __DIR__ . '/..' . '/illuminate/contracts/Routing/Registrar.php', + 'Illuminate\\Contracts\\Routing\\ResponseFactory' => __DIR__ . '/..' . '/illuminate/contracts/Routing/ResponseFactory.php', + 'Illuminate\\Contracts\\Routing\\UrlGenerator' => __DIR__ . '/..' . '/illuminate/contracts/Routing/UrlGenerator.php', + 'Illuminate\\Contracts\\Routing\\UrlRoutable' => __DIR__ . '/..' . '/illuminate/contracts/Routing/UrlRoutable.php', + 'Illuminate\\Contracts\\Session\\Middleware\\AuthenticatesSessions' => __DIR__ . '/..' . '/illuminate/contracts/Session/Middleware/AuthenticatesSessions.php', + 'Illuminate\\Contracts\\Session\\Session' => __DIR__ . '/..' . '/illuminate/contracts/Session/Session.php', + 'Illuminate\\Contracts\\Support\\Arrayable' => __DIR__ . '/..' . '/illuminate/contracts/Support/Arrayable.php', + 'Illuminate\\Contracts\\Support\\CanBeEscapedWhenCastToString' => __DIR__ . '/..' . '/illuminate/contracts/Support/CanBeEscapedWhenCastToString.php', + 'Illuminate\\Contracts\\Support\\DeferrableProvider' => __DIR__ . '/..' . '/illuminate/contracts/Support/DeferrableProvider.php', + 'Illuminate\\Contracts\\Support\\DeferringDisplayableValue' => __DIR__ . '/..' . '/illuminate/contracts/Support/DeferringDisplayableValue.php', + 'Illuminate\\Contracts\\Support\\HasOnceHash' => __DIR__ . '/..' . '/illuminate/contracts/Support/HasOnceHash.php', + 'Illuminate\\Contracts\\Support\\Htmlable' => __DIR__ . '/..' . '/illuminate/contracts/Support/Htmlable.php', + 'Illuminate\\Contracts\\Support\\Jsonable' => __DIR__ . '/..' . '/illuminate/contracts/Support/Jsonable.php', + 'Illuminate\\Contracts\\Support\\MessageBag' => __DIR__ . '/..' . '/illuminate/contracts/Support/MessageBag.php', + 'Illuminate\\Contracts\\Support\\MessageProvider' => __DIR__ . '/..' . '/illuminate/contracts/Support/MessageProvider.php', + 'Illuminate\\Contracts\\Support\\Renderable' => __DIR__ . '/..' . '/illuminate/contracts/Support/Renderable.php', + 'Illuminate\\Contracts\\Support\\Responsable' => __DIR__ . '/..' . '/illuminate/contracts/Support/Responsable.php', + 'Illuminate\\Contracts\\Support\\ValidatedData' => __DIR__ . '/..' . '/illuminate/contracts/Support/ValidatedData.php', + 'Illuminate\\Contracts\\Translation\\HasLocalePreference' => __DIR__ . '/..' . '/illuminate/contracts/Translation/HasLocalePreference.php', + 'Illuminate\\Contracts\\Translation\\Loader' => __DIR__ . '/..' . '/illuminate/contracts/Translation/Loader.php', + 'Illuminate\\Contracts\\Translation\\Translator' => __DIR__ . '/..' . '/illuminate/contracts/Translation/Translator.php', + 'Illuminate\\Contracts\\Validation\\CompilableRules' => __DIR__ . '/..' . '/illuminate/contracts/Validation/CompilableRules.php', + 'Illuminate\\Contracts\\Validation\\DataAwareRule' => __DIR__ . '/..' . '/illuminate/contracts/Validation/DataAwareRule.php', + 'Illuminate\\Contracts\\Validation\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Validation/Factory.php', + 'Illuminate\\Contracts\\Validation\\ImplicitRule' => __DIR__ . '/..' . '/illuminate/contracts/Validation/ImplicitRule.php', + 'Illuminate\\Contracts\\Validation\\InvokableRule' => __DIR__ . '/..' . '/illuminate/contracts/Validation/InvokableRule.php', + 'Illuminate\\Contracts\\Validation\\Rule' => __DIR__ . '/..' . '/illuminate/contracts/Validation/Rule.php', + 'Illuminate\\Contracts\\Validation\\UncompromisedVerifier' => __DIR__ . '/..' . '/illuminate/contracts/Validation/UncompromisedVerifier.php', + 'Illuminate\\Contracts\\Validation\\ValidatesWhenResolved' => __DIR__ . '/..' . '/illuminate/contracts/Validation/ValidatesWhenResolved.php', + 'Illuminate\\Contracts\\Validation\\ValidationRule' => __DIR__ . '/..' . '/illuminate/contracts/Validation/ValidationRule.php', + 'Illuminate\\Contracts\\Validation\\Validator' => __DIR__ . '/..' . '/illuminate/contracts/Validation/Validator.php', + 'Illuminate\\Contracts\\Validation\\ValidatorAwareRule' => __DIR__ . '/..' . '/illuminate/contracts/Validation/ValidatorAwareRule.php', + 'Illuminate\\Contracts\\View\\Engine' => __DIR__ . '/..' . '/illuminate/contracts/View/Engine.php', + 'Illuminate\\Contracts\\View\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/View/Factory.php', + 'Illuminate\\Contracts\\View\\View' => __DIR__ . '/..' . '/illuminate/contracts/View/View.php', + 'Illuminate\\Contracts\\View\\ViewCompilationException' => __DIR__ . '/..' . '/illuminate/contracts/View/ViewCompilationException.php', + 'Illuminate\\Support\\Arr' => __DIR__ . '/..' . '/illuminate/collections/Arr.php', + 'Illuminate\\Support\\Collection' => __DIR__ . '/..' . '/illuminate/collections/Collection.php', + 'Illuminate\\Support\\Enumerable' => __DIR__ . '/..' . '/illuminate/collections/Enumerable.php', + 'Illuminate\\Support\\HigherOrderCollectionProxy' => __DIR__ . '/..' . '/illuminate/collections/HigherOrderCollectionProxy.php', + 'Illuminate\\Support\\HigherOrderWhenProxy' => __DIR__ . '/..' . '/illuminate/conditionable/HigherOrderWhenProxy.php', + 'Illuminate\\Support\\ItemNotFoundException' => __DIR__ . '/..' . '/illuminate/collections/ItemNotFoundException.php', + 'Illuminate\\Support\\LazyCollection' => __DIR__ . '/..' . '/illuminate/collections/LazyCollection.php', + 'Illuminate\\Support\\MultipleItemsFoundException' => __DIR__ . '/..' . '/illuminate/collections/MultipleItemsFoundException.php', + 'Illuminate\\Support\\Traits\\Conditionable' => __DIR__ . '/..' . '/illuminate/conditionable/Traits/Conditionable.php', + 'Illuminate\\Support\\Traits\\EnumeratesValues' => __DIR__ . '/..' . '/illuminate/collections/Traits/EnumeratesValues.php', + 'Illuminate\\Support\\Traits\\Macroable' => __DIR__ . '/..' . '/illuminate/macroable/Traits/Macroable.php', + 'Illuminate\\Support\\Traits\\TransformsToResourceCollection' => __DIR__ . '/..' . '/illuminate/collections/Traits/TransformsToResourceCollection.php', + 'Invoker\\CallableResolver' => __DIR__ . '/..' . '/php-di/invoker/src/CallableResolver.php', + 'Invoker\\Exception\\InvocationException' => __DIR__ . '/..' . '/php-di/invoker/src/Exception/InvocationException.php', + 'Invoker\\Exception\\NotCallableException' => __DIR__ . '/..' . '/php-di/invoker/src/Exception/NotCallableException.php', + 'Invoker\\Exception\\NotEnoughParametersException' => __DIR__ . '/..' . '/php-di/invoker/src/Exception/NotEnoughParametersException.php', + 'Invoker\\Invoker' => __DIR__ . '/..' . '/php-di/invoker/src/Invoker.php', + 'Invoker\\InvokerInterface' => __DIR__ . '/..' . '/php-di/invoker/src/InvokerInterface.php', + 'Invoker\\ParameterResolver\\AssociativeArrayResolver' => __DIR__ . '/..' . '/php-di/invoker/src/ParameterResolver/AssociativeArrayResolver.php', + 'Invoker\\ParameterResolver\\Container\\ParameterNameContainerResolver' => __DIR__ . '/..' . '/php-di/invoker/src/ParameterResolver/Container/ParameterNameContainerResolver.php', + 'Invoker\\ParameterResolver\\Container\\TypeHintContainerResolver' => __DIR__ . '/..' . '/php-di/invoker/src/ParameterResolver/Container/TypeHintContainerResolver.php', + 'Invoker\\ParameterResolver\\DefaultValueResolver' => __DIR__ . '/..' . '/php-di/invoker/src/ParameterResolver/DefaultValueResolver.php', + 'Invoker\\ParameterResolver\\NumericArrayResolver' => __DIR__ . '/..' . '/php-di/invoker/src/ParameterResolver/NumericArrayResolver.php', + 'Invoker\\ParameterResolver\\ParameterResolver' => __DIR__ . '/..' . '/php-di/invoker/src/ParameterResolver/ParameterResolver.php', + 'Invoker\\ParameterResolver\\ResolverChain' => __DIR__ . '/..' . '/php-di/invoker/src/ParameterResolver/ResolverChain.php', + 'Invoker\\ParameterResolver\\TypeHintResolver' => __DIR__ . '/..' . '/php-di/invoker/src/ParameterResolver/TypeHintResolver.php', + 'Invoker\\Reflection\\CallableReflection' => __DIR__ . '/..' . '/php-di/invoker/src/Reflection/CallableReflection.php', + 'Laravel\\SerializableClosure\\Contracts\\Serializable' => __DIR__ . '/..' . '/laravel/serializable-closure/src/Contracts/Serializable.php', + 'Laravel\\SerializableClosure\\Contracts\\Signer' => __DIR__ . '/..' . '/laravel/serializable-closure/src/Contracts/Signer.php', + 'Laravel\\SerializableClosure\\Exceptions\\InvalidSignatureException' => __DIR__ . '/..' . '/laravel/serializable-closure/src/Exceptions/InvalidSignatureException.php', + 'Laravel\\SerializableClosure\\Exceptions\\MissingSecretKeyException' => __DIR__ . '/..' . '/laravel/serializable-closure/src/Exceptions/MissingSecretKeyException.php', + 'Laravel\\SerializableClosure\\SerializableClosure' => __DIR__ . '/..' . '/laravel/serializable-closure/src/SerializableClosure.php', + 'Laravel\\SerializableClosure\\Serializers\\Native' => __DIR__ . '/..' . '/laravel/serializable-closure/src/Serializers/Native.php', + 'Laravel\\SerializableClosure\\Serializers\\Signed' => __DIR__ . '/..' . '/laravel/serializable-closure/src/Serializers/Signed.php', + 'Laravel\\SerializableClosure\\Signers\\Hmac' => __DIR__ . '/..' . '/laravel/serializable-closure/src/Signers/Hmac.php', + 'Laravel\\SerializableClosure\\Support\\ClosureScope' => __DIR__ . '/..' . '/laravel/serializable-closure/src/Support/ClosureScope.php', + 'Laravel\\SerializableClosure\\Support\\ClosureStream' => __DIR__ . '/..' . '/laravel/serializable-closure/src/Support/ClosureStream.php', + 'Laravel\\SerializableClosure\\Support\\ReflectionClosure' => __DIR__ . '/..' . '/laravel/serializable-closure/src/Support/ReflectionClosure.php', + 'Laravel\\SerializableClosure\\Support\\SelfReference' => __DIR__ . '/..' . '/laravel/serializable-closure/src/Support/SelfReference.php', + 'Laravel\\SerializableClosure\\UnsignedSerializableClosure' => __DIR__ . '/..' . '/laravel/serializable-closure/src/UnsignedSerializableClosure.php', 'NoDiscard' => __DIR__ . '/..' . '/symfony/polyfill-php85/Resources/stubs/NoDiscard.php', 'Normalizer' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php', 'Override' => __DIR__ . '/..' . '/symfony/polyfill-php83/Resources/stubs/Override.php', @@ -277,20 +801,366 @@ class ComposerStaticInit9b9826e5b5cc7806cd328c4112cca75e 'Pdo\\Pgsql' => __DIR__ . '/..' . '/symfony/polyfill-php84/Resources/stubs/Pdo/Pgsql.php', 'Pdo\\Sqlite' => __DIR__ . '/..' . '/symfony/polyfill-php84/Resources/stubs/Pdo/Sqlite.php', 'PhpToken' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php', + 'Psr\\Clock\\ClockInterface' => __DIR__ . '/..' . '/psr/clock/src/ClockInterface.php', + 'Psr\\Container\\ContainerExceptionInterface' => __DIR__ . '/..' . '/psr/container/src/ContainerExceptionInterface.php', + 'Psr\\Container\\ContainerInterface' => __DIR__ . '/..' . '/psr/container/src/ContainerInterface.php', + 'Psr\\Container\\NotFoundExceptionInterface' => __DIR__ . '/..' . '/psr/container/src/NotFoundExceptionInterface.php', + 'Psr\\Http\\Message\\MessageInterface' => __DIR__ . '/..' . '/psr/http-message/src/MessageInterface.php', + 'Psr\\Http\\Message\\RequestFactoryInterface' => __DIR__ . '/..' . '/psr/http-factory/src/RequestFactoryInterface.php', + 'Psr\\Http\\Message\\RequestInterface' => __DIR__ . '/..' . '/psr/http-message/src/RequestInterface.php', + 'Psr\\Http\\Message\\ResponseFactoryInterface' => __DIR__ . '/..' . '/psr/http-factory/src/ResponseFactoryInterface.php', + 'Psr\\Http\\Message\\ResponseInterface' => __DIR__ . '/..' . '/psr/http-message/src/ResponseInterface.php', + 'Psr\\Http\\Message\\ServerRequestFactoryInterface' => __DIR__ . '/..' . '/psr/http-factory/src/ServerRequestFactoryInterface.php', + 'Psr\\Http\\Message\\ServerRequestInterface' => __DIR__ . '/..' . '/psr/http-message/src/ServerRequestInterface.php', + 'Psr\\Http\\Message\\StreamFactoryInterface' => __DIR__ . '/..' . '/psr/http-factory/src/StreamFactoryInterface.php', + 'Psr\\Http\\Message\\StreamInterface' => __DIR__ . '/..' . '/psr/http-message/src/StreamInterface.php', + 'Psr\\Http\\Message\\UploadedFileFactoryInterface' => __DIR__ . '/..' . '/psr/http-factory/src/UploadedFileFactoryInterface.php', + 'Psr\\Http\\Message\\UploadedFileInterface' => __DIR__ . '/..' . '/psr/http-message/src/UploadedFileInterface.php', + 'Psr\\Http\\Message\\UriFactoryInterface' => __DIR__ . '/..' . '/psr/http-factory/src/UriFactoryInterface.php', + 'Psr\\Http\\Message\\UriInterface' => __DIR__ . '/..' . '/psr/http-message/src/UriInterface.php', + 'Psr\\Log\\AbstractLogger' => __DIR__ . '/..' . '/psr/log/src/AbstractLogger.php', + 'Psr\\Log\\InvalidArgumentException' => __DIR__ . '/..' . '/psr/log/src/InvalidArgumentException.php', + 'Psr\\Log\\LogLevel' => __DIR__ . '/..' . '/psr/log/src/LogLevel.php', + 'Psr\\Log\\LoggerAwareInterface' => __DIR__ . '/..' . '/psr/log/src/LoggerAwareInterface.php', + 'Psr\\Log\\LoggerAwareTrait' => __DIR__ . '/..' . '/psr/log/src/LoggerAwareTrait.php', + 'Psr\\Log\\LoggerInterface' => __DIR__ . '/..' . '/psr/log/src/LoggerInterface.php', + 'Psr\\Log\\LoggerTrait' => __DIR__ . '/..' . '/psr/log/src/LoggerTrait.php', + 'Psr\\Log\\NullLogger' => __DIR__ . '/..' . '/psr/log/src/NullLogger.php', + 'Psr\\SimpleCache\\CacheException' => __DIR__ . '/..' . '/psr/simple-cache/src/CacheException.php', + 'Psr\\SimpleCache\\CacheInterface' => __DIR__ . '/..' . '/psr/simple-cache/src/CacheInterface.php', + 'Psr\\SimpleCache\\InvalidArgumentException' => __DIR__ . '/..' . '/psr/simple-cache/src/InvalidArgumentException.php', 'ReflectionConstant' => __DIR__ . '/..' . '/symfony/polyfill-php84/Resources/stubs/ReflectionConstant.php', 'RoundingMode' => __DIR__ . '/..' . '/symfony/polyfill-php84/Resources/stubs/RoundingMode.php', 'SQLite3Exception' => __DIR__ . '/..' . '/symfony/polyfill-php83/Resources/stubs/SQLite3Exception.php', 'Stringable' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Stringable.php', + 'Symfony\\Component\\Clock\\Clock' => __DIR__ . '/..' . '/symfony/clock/Clock.php', + 'Symfony\\Component\\Clock\\ClockAwareTrait' => __DIR__ . '/..' . '/symfony/clock/ClockAwareTrait.php', + 'Symfony\\Component\\Clock\\ClockInterface' => __DIR__ . '/..' . '/symfony/clock/ClockInterface.php', + 'Symfony\\Component\\Clock\\DatePoint' => __DIR__ . '/..' . '/symfony/clock/DatePoint.php', + 'Symfony\\Component\\Clock\\MockClock' => __DIR__ . '/..' . '/symfony/clock/MockClock.php', + 'Symfony\\Component\\Clock\\MonotonicClock' => __DIR__ . '/..' . '/symfony/clock/MonotonicClock.php', + 'Symfony\\Component\\Clock\\NativeClock' => __DIR__ . '/..' . '/symfony/clock/NativeClock.php', + 'Symfony\\Component\\Clock\\Test\\ClockSensitiveTrait' => __DIR__ . '/..' . '/symfony/clock/Test/ClockSensitiveTrait.php', + 'Symfony\\Component\\Mime\\Address' => __DIR__ . '/..' . '/symfony/mime/Address.php', + 'Symfony\\Component\\Mime\\BodyRendererInterface' => __DIR__ . '/..' . '/symfony/mime/BodyRendererInterface.php', + 'Symfony\\Component\\Mime\\CharacterStream' => __DIR__ . '/..' . '/symfony/mime/CharacterStream.php', + 'Symfony\\Component\\Mime\\Crypto\\DkimOptions' => __DIR__ . '/..' . '/symfony/mime/Crypto/DkimOptions.php', + 'Symfony\\Component\\Mime\\Crypto\\DkimSigner' => __DIR__ . '/..' . '/symfony/mime/Crypto/DkimSigner.php', + 'Symfony\\Component\\Mime\\Crypto\\SMime' => __DIR__ . '/..' . '/symfony/mime/Crypto/SMime.php', + 'Symfony\\Component\\Mime\\Crypto\\SMimeEncrypter' => __DIR__ . '/..' . '/symfony/mime/Crypto/SMimeEncrypter.php', + 'Symfony\\Component\\Mime\\Crypto\\SMimeSigner' => __DIR__ . '/..' . '/symfony/mime/Crypto/SMimeSigner.php', + 'Symfony\\Component\\Mime\\DependencyInjection\\AddMimeTypeGuesserPass' => __DIR__ . '/..' . '/symfony/mime/DependencyInjection/AddMimeTypeGuesserPass.php', + 'Symfony\\Component\\Mime\\DraftEmail' => __DIR__ . '/..' . '/symfony/mime/DraftEmail.php', + 'Symfony\\Component\\Mime\\Email' => __DIR__ . '/..' . '/symfony/mime/Email.php', + 'Symfony\\Component\\Mime\\Encoder\\AddressEncoderInterface' => __DIR__ . '/..' . '/symfony/mime/Encoder/AddressEncoderInterface.php', + 'Symfony\\Component\\Mime\\Encoder\\Base64ContentEncoder' => __DIR__ . '/..' . '/symfony/mime/Encoder/Base64ContentEncoder.php', + 'Symfony\\Component\\Mime\\Encoder\\Base64Encoder' => __DIR__ . '/..' . '/symfony/mime/Encoder/Base64Encoder.php', + 'Symfony\\Component\\Mime\\Encoder\\Base64MimeHeaderEncoder' => __DIR__ . '/..' . '/symfony/mime/Encoder/Base64MimeHeaderEncoder.php', + 'Symfony\\Component\\Mime\\Encoder\\ContentEncoderInterface' => __DIR__ . '/..' . '/symfony/mime/Encoder/ContentEncoderInterface.php', + 'Symfony\\Component\\Mime\\Encoder\\EightBitContentEncoder' => __DIR__ . '/..' . '/symfony/mime/Encoder/EightBitContentEncoder.php', + 'Symfony\\Component\\Mime\\Encoder\\EncoderInterface' => __DIR__ . '/..' . '/symfony/mime/Encoder/EncoderInterface.php', + 'Symfony\\Component\\Mime\\Encoder\\IdnAddressEncoder' => __DIR__ . '/..' . '/symfony/mime/Encoder/IdnAddressEncoder.php', + 'Symfony\\Component\\Mime\\Encoder\\MimeHeaderEncoderInterface' => __DIR__ . '/..' . '/symfony/mime/Encoder/MimeHeaderEncoderInterface.php', + 'Symfony\\Component\\Mime\\Encoder\\QpContentEncoder' => __DIR__ . '/..' . '/symfony/mime/Encoder/QpContentEncoder.php', + 'Symfony\\Component\\Mime\\Encoder\\QpEncoder' => __DIR__ . '/..' . '/symfony/mime/Encoder/QpEncoder.php', + 'Symfony\\Component\\Mime\\Encoder\\QpMimeHeaderEncoder' => __DIR__ . '/..' . '/symfony/mime/Encoder/QpMimeHeaderEncoder.php', + 'Symfony\\Component\\Mime\\Encoder\\Rfc2231Encoder' => __DIR__ . '/..' . '/symfony/mime/Encoder/Rfc2231Encoder.php', + 'Symfony\\Component\\Mime\\Exception\\AddressEncoderException' => __DIR__ . '/..' . '/symfony/mime/Exception/AddressEncoderException.php', + 'Symfony\\Component\\Mime\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/mime/Exception/ExceptionInterface.php', + 'Symfony\\Component\\Mime\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/mime/Exception/InvalidArgumentException.php', + 'Symfony\\Component\\Mime\\Exception\\LogicException' => __DIR__ . '/..' . '/symfony/mime/Exception/LogicException.php', + 'Symfony\\Component\\Mime\\Exception\\RfcComplianceException' => __DIR__ . '/..' . '/symfony/mime/Exception/RfcComplianceException.php', + 'Symfony\\Component\\Mime\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/mime/Exception/RuntimeException.php', + 'Symfony\\Component\\Mime\\FileBinaryMimeTypeGuesser' => __DIR__ . '/..' . '/symfony/mime/FileBinaryMimeTypeGuesser.php', + 'Symfony\\Component\\Mime\\FileinfoMimeTypeGuesser' => __DIR__ . '/..' . '/symfony/mime/FileinfoMimeTypeGuesser.php', + 'Symfony\\Component\\Mime\\Header\\AbstractHeader' => __DIR__ . '/..' . '/symfony/mime/Header/AbstractHeader.php', + 'Symfony\\Component\\Mime\\Header\\DateHeader' => __DIR__ . '/..' . '/symfony/mime/Header/DateHeader.php', + 'Symfony\\Component\\Mime\\Header\\HeaderInterface' => __DIR__ . '/..' . '/symfony/mime/Header/HeaderInterface.php', + 'Symfony\\Component\\Mime\\Header\\Headers' => __DIR__ . '/..' . '/symfony/mime/Header/Headers.php', + 'Symfony\\Component\\Mime\\Header\\IdentificationHeader' => __DIR__ . '/..' . '/symfony/mime/Header/IdentificationHeader.php', + 'Symfony\\Component\\Mime\\Header\\MailboxHeader' => __DIR__ . '/..' . '/symfony/mime/Header/MailboxHeader.php', + 'Symfony\\Component\\Mime\\Header\\MailboxListHeader' => __DIR__ . '/..' . '/symfony/mime/Header/MailboxListHeader.php', + 'Symfony\\Component\\Mime\\Header\\ParameterizedHeader' => __DIR__ . '/..' . '/symfony/mime/Header/ParameterizedHeader.php', + 'Symfony\\Component\\Mime\\Header\\PathHeader' => __DIR__ . '/..' . '/symfony/mime/Header/PathHeader.php', + 'Symfony\\Component\\Mime\\Header\\UnstructuredHeader' => __DIR__ . '/..' . '/symfony/mime/Header/UnstructuredHeader.php', + 'Symfony\\Component\\Mime\\HtmlToTextConverter\\DefaultHtmlToTextConverter' => __DIR__ . '/..' . '/symfony/mime/HtmlToTextConverter/DefaultHtmlToTextConverter.php', + 'Symfony\\Component\\Mime\\HtmlToTextConverter\\HtmlToTextConverterInterface' => __DIR__ . '/..' . '/symfony/mime/HtmlToTextConverter/HtmlToTextConverterInterface.php', + 'Symfony\\Component\\Mime\\HtmlToTextConverter\\LeagueHtmlToMarkdownConverter' => __DIR__ . '/..' . '/symfony/mime/HtmlToTextConverter/LeagueHtmlToMarkdownConverter.php', + 'Symfony\\Component\\Mime\\Message' => __DIR__ . '/..' . '/symfony/mime/Message.php', + 'Symfony\\Component\\Mime\\MessageConverter' => __DIR__ . '/..' . '/symfony/mime/MessageConverter.php', + 'Symfony\\Component\\Mime\\MimeTypeGuesserInterface' => __DIR__ . '/..' . '/symfony/mime/MimeTypeGuesserInterface.php', + 'Symfony\\Component\\Mime\\MimeTypes' => __DIR__ . '/..' . '/symfony/mime/MimeTypes.php', + 'Symfony\\Component\\Mime\\MimeTypesInterface' => __DIR__ . '/..' . '/symfony/mime/MimeTypesInterface.php', + 'Symfony\\Component\\Mime\\Part\\AbstractMultipartPart' => __DIR__ . '/..' . '/symfony/mime/Part/AbstractMultipartPart.php', + 'Symfony\\Component\\Mime\\Part\\AbstractPart' => __DIR__ . '/..' . '/symfony/mime/Part/AbstractPart.php', + 'Symfony\\Component\\Mime\\Part\\DataPart' => __DIR__ . '/..' . '/symfony/mime/Part/DataPart.php', + 'Symfony\\Component\\Mime\\Part\\File' => __DIR__ . '/..' . '/symfony/mime/Part/File.php', + 'Symfony\\Component\\Mime\\Part\\MessagePart' => __DIR__ . '/..' . '/symfony/mime/Part/MessagePart.php', + 'Symfony\\Component\\Mime\\Part\\Multipart\\AlternativePart' => __DIR__ . '/..' . '/symfony/mime/Part/Multipart/AlternativePart.php', + 'Symfony\\Component\\Mime\\Part\\Multipart\\DigestPart' => __DIR__ . '/..' . '/symfony/mime/Part/Multipart/DigestPart.php', + 'Symfony\\Component\\Mime\\Part\\Multipart\\FormDataPart' => __DIR__ . '/..' . '/symfony/mime/Part/Multipart/FormDataPart.php', + 'Symfony\\Component\\Mime\\Part\\Multipart\\MixedPart' => __DIR__ . '/..' . '/symfony/mime/Part/Multipart/MixedPart.php', + 'Symfony\\Component\\Mime\\Part\\Multipart\\RelatedPart' => __DIR__ . '/..' . '/symfony/mime/Part/Multipart/RelatedPart.php', + 'Symfony\\Component\\Mime\\Part\\SMimePart' => __DIR__ . '/..' . '/symfony/mime/Part/SMimePart.php', + 'Symfony\\Component\\Mime\\Part\\TextPart' => __DIR__ . '/..' . '/symfony/mime/Part/TextPart.php', + 'Symfony\\Component\\Mime\\RawMessage' => __DIR__ . '/..' . '/symfony/mime/RawMessage.php', + 'Symfony\\Component\\Mime\\Test\\Constraint\\EmailAddressContains' => __DIR__ . '/..' . '/symfony/mime/Test/Constraint/EmailAddressContains.php', + 'Symfony\\Component\\Mime\\Test\\Constraint\\EmailAttachmentCount' => __DIR__ . '/..' . '/symfony/mime/Test/Constraint/EmailAttachmentCount.php', + 'Symfony\\Component\\Mime\\Test\\Constraint\\EmailHasHeader' => __DIR__ . '/..' . '/symfony/mime/Test/Constraint/EmailHasHeader.php', + 'Symfony\\Component\\Mime\\Test\\Constraint\\EmailHeaderSame' => __DIR__ . '/..' . '/symfony/mime/Test/Constraint/EmailHeaderSame.php', + 'Symfony\\Component\\Mime\\Test\\Constraint\\EmailHtmlBodyContains' => __DIR__ . '/..' . '/symfony/mime/Test/Constraint/EmailHtmlBodyContains.php', + 'Symfony\\Component\\Mime\\Test\\Constraint\\EmailSubjectContains' => __DIR__ . '/..' . '/symfony/mime/Test/Constraint/EmailSubjectContains.php', + 'Symfony\\Component\\Mime\\Test\\Constraint\\EmailTextBodyContains' => __DIR__ . '/..' . '/symfony/mime/Test/Constraint/EmailTextBodyContains.php', + 'Symfony\\Component\\Translation\\CatalogueMetadataAwareInterface' => __DIR__ . '/..' . '/symfony/translation/CatalogueMetadataAwareInterface.php', + 'Symfony\\Component\\Translation\\Catalogue\\AbstractOperation' => __DIR__ . '/..' . '/symfony/translation/Catalogue/AbstractOperation.php', + 'Symfony\\Component\\Translation\\Catalogue\\MergeOperation' => __DIR__ . '/..' . '/symfony/translation/Catalogue/MergeOperation.php', + 'Symfony\\Component\\Translation\\Catalogue\\OperationInterface' => __DIR__ . '/..' . '/symfony/translation/Catalogue/OperationInterface.php', + 'Symfony\\Component\\Translation\\Catalogue\\TargetOperation' => __DIR__ . '/..' . '/symfony/translation/Catalogue/TargetOperation.php', + 'Symfony\\Component\\Translation\\Command\\TranslationLintCommand' => __DIR__ . '/..' . '/symfony/translation/Command/TranslationLintCommand.php', + 'Symfony\\Component\\Translation\\Command\\TranslationPullCommand' => __DIR__ . '/..' . '/symfony/translation/Command/TranslationPullCommand.php', + 'Symfony\\Component\\Translation\\Command\\TranslationPushCommand' => __DIR__ . '/..' . '/symfony/translation/Command/TranslationPushCommand.php', + 'Symfony\\Component\\Translation\\Command\\TranslationTrait' => __DIR__ . '/..' . '/symfony/translation/Command/TranslationTrait.php', + 'Symfony\\Component\\Translation\\Command\\XliffLintCommand' => __DIR__ . '/..' . '/symfony/translation/Command/XliffLintCommand.php', + 'Symfony\\Component\\Translation\\DataCollectorTranslator' => __DIR__ . '/..' . '/symfony/translation/DataCollectorTranslator.php', + 'Symfony\\Component\\Translation\\DataCollector\\TranslationDataCollector' => __DIR__ . '/..' . '/symfony/translation/DataCollector/TranslationDataCollector.php', + 'Symfony\\Component\\Translation\\DependencyInjection\\DataCollectorTranslatorPass' => __DIR__ . '/..' . '/symfony/translation/DependencyInjection/DataCollectorTranslatorPass.php', + 'Symfony\\Component\\Translation\\DependencyInjection\\LoggingTranslatorPass' => __DIR__ . '/..' . '/symfony/translation/DependencyInjection/LoggingTranslatorPass.php', + 'Symfony\\Component\\Translation\\DependencyInjection\\TranslationDumperPass' => __DIR__ . '/..' . '/symfony/translation/DependencyInjection/TranslationDumperPass.php', + 'Symfony\\Component\\Translation\\DependencyInjection\\TranslationExtractorPass' => __DIR__ . '/..' . '/symfony/translation/DependencyInjection/TranslationExtractorPass.php', + 'Symfony\\Component\\Translation\\DependencyInjection\\TranslatorPass' => __DIR__ . '/..' . '/symfony/translation/DependencyInjection/TranslatorPass.php', + 'Symfony\\Component\\Translation\\DependencyInjection\\TranslatorPathsPass' => __DIR__ . '/..' . '/symfony/translation/DependencyInjection/TranslatorPathsPass.php', + 'Symfony\\Component\\Translation\\Dumper\\CsvFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/CsvFileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\DumperInterface' => __DIR__ . '/..' . '/symfony/translation/Dumper/DumperInterface.php', + 'Symfony\\Component\\Translation\\Dumper\\FileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/FileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\IcuResFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/IcuResFileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\IniFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/IniFileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\JsonFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/JsonFileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\MoFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/MoFileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\PhpFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/PhpFileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\PoFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/PoFileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\QtFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/QtFileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\XliffFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/XliffFileDumper.php', + 'Symfony\\Component\\Translation\\Dumper\\YamlFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/YamlFileDumper.php', + 'Symfony\\Component\\Translation\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/translation/Exception/ExceptionInterface.php', + 'Symfony\\Component\\Translation\\Exception\\IncompleteDsnException' => __DIR__ . '/..' . '/symfony/translation/Exception/IncompleteDsnException.php', + 'Symfony\\Component\\Translation\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/translation/Exception/InvalidArgumentException.php', + 'Symfony\\Component\\Translation\\Exception\\InvalidResourceException' => __DIR__ . '/..' . '/symfony/translation/Exception/InvalidResourceException.php', + 'Symfony\\Component\\Translation\\Exception\\LogicException' => __DIR__ . '/..' . '/symfony/translation/Exception/LogicException.php', + 'Symfony\\Component\\Translation\\Exception\\MissingRequiredOptionException' => __DIR__ . '/..' . '/symfony/translation/Exception/MissingRequiredOptionException.php', + 'Symfony\\Component\\Translation\\Exception\\NotFoundResourceException' => __DIR__ . '/..' . '/symfony/translation/Exception/NotFoundResourceException.php', + 'Symfony\\Component\\Translation\\Exception\\ProviderException' => __DIR__ . '/..' . '/symfony/translation/Exception/ProviderException.php', + 'Symfony\\Component\\Translation\\Exception\\ProviderExceptionInterface' => __DIR__ . '/..' . '/symfony/translation/Exception/ProviderExceptionInterface.php', + 'Symfony\\Component\\Translation\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/translation/Exception/RuntimeException.php', + 'Symfony\\Component\\Translation\\Exception\\UnsupportedSchemeException' => __DIR__ . '/..' . '/symfony/translation/Exception/UnsupportedSchemeException.php', + 'Symfony\\Component\\Translation\\Extractor\\AbstractFileExtractor' => __DIR__ . '/..' . '/symfony/translation/Extractor/AbstractFileExtractor.php', + 'Symfony\\Component\\Translation\\Extractor\\ChainExtractor' => __DIR__ . '/..' . '/symfony/translation/Extractor/ChainExtractor.php', + 'Symfony\\Component\\Translation\\Extractor\\ExtractorInterface' => __DIR__ . '/..' . '/symfony/translation/Extractor/ExtractorInterface.php', + 'Symfony\\Component\\Translation\\Extractor\\PhpAstExtractor' => __DIR__ . '/..' . '/symfony/translation/Extractor/PhpAstExtractor.php', + 'Symfony\\Component\\Translation\\Extractor\\Visitor\\AbstractVisitor' => __DIR__ . '/..' . '/symfony/translation/Extractor/Visitor/AbstractVisitor.php', + 'Symfony\\Component\\Translation\\Extractor\\Visitor\\ConstraintVisitor' => __DIR__ . '/..' . '/symfony/translation/Extractor/Visitor/ConstraintVisitor.php', + 'Symfony\\Component\\Translation\\Extractor\\Visitor\\TransMethodVisitor' => __DIR__ . '/..' . '/symfony/translation/Extractor/Visitor/TransMethodVisitor.php', + 'Symfony\\Component\\Translation\\Extractor\\Visitor\\TranslatableMessageVisitor' => __DIR__ . '/..' . '/symfony/translation/Extractor/Visitor/TranslatableMessageVisitor.php', + 'Symfony\\Component\\Translation\\Formatter\\IntlFormatter' => __DIR__ . '/..' . '/symfony/translation/Formatter/IntlFormatter.php', + 'Symfony\\Component\\Translation\\Formatter\\IntlFormatterInterface' => __DIR__ . '/..' . '/symfony/translation/Formatter/IntlFormatterInterface.php', + 'Symfony\\Component\\Translation\\Formatter\\MessageFormatter' => __DIR__ . '/..' . '/symfony/translation/Formatter/MessageFormatter.php', + 'Symfony\\Component\\Translation\\Formatter\\MessageFormatterInterface' => __DIR__ . '/..' . '/symfony/translation/Formatter/MessageFormatterInterface.php', + 'Symfony\\Component\\Translation\\IdentityTranslator' => __DIR__ . '/..' . '/symfony/translation/IdentityTranslator.php', + 'Symfony\\Component\\Translation\\Loader\\ArrayLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/ArrayLoader.php', + 'Symfony\\Component\\Translation\\Loader\\CsvFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/CsvFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\FileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/FileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\IcuDatFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/IcuDatFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\IcuResFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/IcuResFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\IniFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/IniFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\JsonFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/JsonFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\LoaderInterface' => __DIR__ . '/..' . '/symfony/translation/Loader/LoaderInterface.php', + 'Symfony\\Component\\Translation\\Loader\\MoFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/MoFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\PhpFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/PhpFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\PoFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/PoFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\QtFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/QtFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\XliffFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/XliffFileLoader.php', + 'Symfony\\Component\\Translation\\Loader\\YamlFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/YamlFileLoader.php', + 'Symfony\\Component\\Translation\\LocaleSwitcher' => __DIR__ . '/..' . '/symfony/translation/LocaleSwitcher.php', + 'Symfony\\Component\\Translation\\LoggingTranslator' => __DIR__ . '/..' . '/symfony/translation/LoggingTranslator.php', + 'Symfony\\Component\\Translation\\MessageCatalogue' => __DIR__ . '/..' . '/symfony/translation/MessageCatalogue.php', + 'Symfony\\Component\\Translation\\MessageCatalogueInterface' => __DIR__ . '/..' . '/symfony/translation/MessageCatalogueInterface.php', + 'Symfony\\Component\\Translation\\MetadataAwareInterface' => __DIR__ . '/..' . '/symfony/translation/MetadataAwareInterface.php', + 'Symfony\\Component\\Translation\\Provider\\AbstractProviderFactory' => __DIR__ . '/..' . '/symfony/translation/Provider/AbstractProviderFactory.php', + 'Symfony\\Component\\Translation\\Provider\\Dsn' => __DIR__ . '/..' . '/symfony/translation/Provider/Dsn.php', + 'Symfony\\Component\\Translation\\Provider\\FilteringProvider' => __DIR__ . '/..' . '/symfony/translation/Provider/FilteringProvider.php', + 'Symfony\\Component\\Translation\\Provider\\NullProvider' => __DIR__ . '/..' . '/symfony/translation/Provider/NullProvider.php', + 'Symfony\\Component\\Translation\\Provider\\NullProviderFactory' => __DIR__ . '/..' . '/symfony/translation/Provider/NullProviderFactory.php', + 'Symfony\\Component\\Translation\\Provider\\ProviderFactoryInterface' => __DIR__ . '/..' . '/symfony/translation/Provider/ProviderFactoryInterface.php', + 'Symfony\\Component\\Translation\\Provider\\ProviderInterface' => __DIR__ . '/..' . '/symfony/translation/Provider/ProviderInterface.php', + 'Symfony\\Component\\Translation\\Provider\\TranslationProviderCollection' => __DIR__ . '/..' . '/symfony/translation/Provider/TranslationProviderCollection.php', + 'Symfony\\Component\\Translation\\Provider\\TranslationProviderCollectionFactory' => __DIR__ . '/..' . '/symfony/translation/Provider/TranslationProviderCollectionFactory.php', + 'Symfony\\Component\\Translation\\PseudoLocalizationTranslator' => __DIR__ . '/..' . '/symfony/translation/PseudoLocalizationTranslator.php', + 'Symfony\\Component\\Translation\\Reader\\TranslationReader' => __DIR__ . '/..' . '/symfony/translation/Reader/TranslationReader.php', + 'Symfony\\Component\\Translation\\Reader\\TranslationReaderInterface' => __DIR__ . '/..' . '/symfony/translation/Reader/TranslationReaderInterface.php', + 'Symfony\\Component\\Translation\\StaticMessage' => __DIR__ . '/..' . '/symfony/translation/StaticMessage.php', + 'Symfony\\Component\\Translation\\Test\\AbstractProviderFactoryTestCase' => __DIR__ . '/..' . '/symfony/translation/Test/AbstractProviderFactoryTestCase.php', + 'Symfony\\Component\\Translation\\Test\\IncompleteDsnTestTrait' => __DIR__ . '/..' . '/symfony/translation/Test/IncompleteDsnTestTrait.php', + 'Symfony\\Component\\Translation\\Test\\ProviderFactoryTestCase' => __DIR__ . '/..' . '/symfony/translation/Test/ProviderFactoryTestCase.php', + 'Symfony\\Component\\Translation\\Test\\ProviderTestCase' => __DIR__ . '/..' . '/symfony/translation/Test/ProviderTestCase.php', + 'Symfony\\Component\\Translation\\TranslatableMessage' => __DIR__ . '/..' . '/symfony/translation/TranslatableMessage.php', + 'Symfony\\Component\\Translation\\Translator' => __DIR__ . '/..' . '/symfony/translation/Translator.php', + 'Symfony\\Component\\Translation\\TranslatorBag' => __DIR__ . '/..' . '/symfony/translation/TranslatorBag.php', + 'Symfony\\Component\\Translation\\TranslatorBagInterface' => __DIR__ . '/..' . '/symfony/translation/TranslatorBagInterface.php', + 'Symfony\\Component\\Translation\\Util\\ArrayConverter' => __DIR__ . '/..' . '/symfony/translation/Util/ArrayConverter.php', + 'Symfony\\Component\\Translation\\Util\\XliffUtils' => __DIR__ . '/..' . '/symfony/translation/Util/XliffUtils.php', + 'Symfony\\Component\\Translation\\Writer\\TranslationWriter' => __DIR__ . '/..' . '/symfony/translation/Writer/TranslationWriter.php', + 'Symfony\\Component\\Translation\\Writer\\TranslationWriterInterface' => __DIR__ . '/..' . '/symfony/translation/Writer/TranslationWriterInterface.php', + 'Symfony\\Contracts\\Translation\\LocaleAwareInterface' => __DIR__ . '/..' . '/symfony/translation-contracts/LocaleAwareInterface.php', + 'Symfony\\Contracts\\Translation\\TranslatableInterface' => __DIR__ . '/..' . '/symfony/translation-contracts/TranslatableInterface.php', + 'Symfony\\Contracts\\Translation\\TranslatorInterface' => __DIR__ . '/..' . '/symfony/translation-contracts/TranslatorInterface.php', + 'Symfony\\Contracts\\Translation\\TranslatorTrait' => __DIR__ . '/..' . '/symfony/translation-contracts/TranslatorTrait.php', + 'Symfony\\Polyfill\\Iconv\\Iconv' => __DIR__ . '/..' . '/symfony/polyfill-iconv/Iconv.php', + 'Symfony\\Polyfill\\Intl\\Idn\\Idn' => __DIR__ . '/..' . '/symfony/polyfill-intl-idn/Idn.php', + 'Symfony\\Polyfill\\Intl\\Idn\\Info' => __DIR__ . '/..' . '/symfony/polyfill-intl-idn/Info.php', + 'Symfony\\Polyfill\\Intl\\Idn\\Resources\\unidata\\DisallowedRanges' => __DIR__ . '/..' . '/symfony/polyfill-intl-idn/Resources/unidata/DisallowedRanges.php', + 'Symfony\\Polyfill\\Intl\\Idn\\Resources\\unidata\\Regex' => __DIR__ . '/..' . '/symfony/polyfill-intl-idn/Resources/unidata/Regex.php', + 'Symfony\\Polyfill\\Intl\\Normalizer\\Normalizer' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/Normalizer.php', + 'Symfony\\Polyfill\\Mbstring\\Mbstring' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/Mbstring.php', + 'Symfony\\Polyfill\\Php80\\Php80' => __DIR__ . '/..' . '/symfony/polyfill-php80/Php80.php', + 'Symfony\\Polyfill\\Php80\\PhpToken' => __DIR__ . '/..' . '/symfony/polyfill-php80/PhpToken.php', + 'Symfony\\Polyfill\\Php83\\Php83' => __DIR__ . '/..' . '/symfony/polyfill-php83/Php83.php', + 'Symfony\\Polyfill\\Php84\\Php84' => __DIR__ . '/..' . '/symfony/polyfill-php84/Php84.php', + 'Symfony\\Polyfill\\Php85\\Php85' => __DIR__ . '/..' . '/symfony/polyfill-php85/Php85.php', 'UnhandledMatchError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php', 'ValueError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/ValueError.php', + 'ZBateson\\MailMimeParser\\Error' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Error.php', + 'ZBateson\\MailMimeParser\\ErrorBag' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/ErrorBag.php', + 'ZBateson\\MailMimeParser\\Header\\AbstractHeader' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/AbstractHeader.php', + 'ZBateson\\MailMimeParser\\Header\\AddressHeader' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/AddressHeader.php', + 'ZBateson\\MailMimeParser\\Header\\Consumer\\AbstractConsumerService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Consumer/AbstractConsumerService.php', + 'ZBateson\\MailMimeParser\\Header\\Consumer\\AbstractGenericConsumerService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Consumer/AbstractGenericConsumerService.php', + 'ZBateson\\MailMimeParser\\Header\\Consumer\\AddressBaseConsumerService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Consumer/AddressBaseConsumerService.php', + 'ZBateson\\MailMimeParser\\Header\\Consumer\\AddressConsumerService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Consumer/AddressConsumerService.php', + 'ZBateson\\MailMimeParser\\Header\\Consumer\\AddressEmailConsumerService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Consumer/AddressEmailConsumerService.php', + 'ZBateson\\MailMimeParser\\Header\\Consumer\\AddressGroupConsumerService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Consumer/AddressGroupConsumerService.php', + 'ZBateson\\MailMimeParser\\Header\\Consumer\\CommentConsumerService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Consumer/CommentConsumerService.php', + 'ZBateson\\MailMimeParser\\Header\\Consumer\\DateConsumerService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Consumer/DateConsumerService.php', + 'ZBateson\\MailMimeParser\\Header\\Consumer\\GenericConsumerMimeLiteralPartService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Consumer/GenericConsumerMimeLiteralPartService.php', + 'ZBateson\\MailMimeParser\\Header\\Consumer\\GenericConsumerService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Consumer/GenericConsumerService.php', + 'ZBateson\\MailMimeParser\\Header\\Consumer\\IConsumerService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Consumer/IConsumerService.php', + 'ZBateson\\MailMimeParser\\Header\\Consumer\\IdBaseConsumerService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Consumer/IdBaseConsumerService.php', + 'ZBateson\\MailMimeParser\\Header\\Consumer\\IdConsumerService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Consumer/IdConsumerService.php', + 'ZBateson\\MailMimeParser\\Header\\Consumer\\ParameterConsumerService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Consumer/ParameterConsumerService.php', + 'ZBateson\\MailMimeParser\\Header\\Consumer\\ParameterNameValueConsumerService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Consumer/ParameterNameValueConsumerService.php', + 'ZBateson\\MailMimeParser\\Header\\Consumer\\ParameterValueConsumerService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Consumer/ParameterValueConsumerService.php', + 'ZBateson\\MailMimeParser\\Header\\Consumer\\QuotedStringConsumerService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Consumer/QuotedStringConsumerService.php', + 'ZBateson\\MailMimeParser\\Header\\Consumer\\QuotedStringMimeLiteralPartConsumerService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Consumer/QuotedStringMimeLiteralPartConsumerService.php', + 'ZBateson\\MailMimeParser\\Header\\Consumer\\QuotedStringMimeLiteralPartTokenSplitPatternTrait' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Consumer/QuotedStringMimeLiteralPartTokenSplitPatternTrait.php', + 'ZBateson\\MailMimeParser\\Header\\Consumer\\ReceivedConsumerService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Consumer/ReceivedConsumerService.php', + 'ZBateson\\MailMimeParser\\Header\\Consumer\\Received\\DomainConsumerService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Consumer/Received/DomainConsumerService.php', + 'ZBateson\\MailMimeParser\\Header\\Consumer\\Received\\GenericReceivedConsumerService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Consumer/Received/GenericReceivedConsumerService.php', + 'ZBateson\\MailMimeParser\\Header\\Consumer\\Received\\ReceivedDateConsumerService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Consumer/Received/ReceivedDateConsumerService.php', + 'ZBateson\\MailMimeParser\\Header\\Consumer\\SubjectConsumerService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Consumer/SubjectConsumerService.php', + 'ZBateson\\MailMimeParser\\Header\\DateHeader' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/DateHeader.php', + 'ZBateson\\MailMimeParser\\Header\\GenericHeader' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/GenericHeader.php', + 'ZBateson\\MailMimeParser\\Header\\HeaderConsts' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/HeaderConsts.php', + 'ZBateson\\MailMimeParser\\Header\\HeaderFactory' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/HeaderFactory.php', + 'ZBateson\\MailMimeParser\\Header\\IHeader' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/IHeader.php', + 'ZBateson\\MailMimeParser\\Header\\IHeaderPart' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/IHeaderPart.php', + 'ZBateson\\MailMimeParser\\Header\\IdHeader' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/IdHeader.php', + 'ZBateson\\MailMimeParser\\Header\\MimeEncodedHeader' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/MimeEncodedHeader.php', + 'ZBateson\\MailMimeParser\\Header\\ParameterHeader' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/ParameterHeader.php', + 'ZBateson\\MailMimeParser\\Header\\Part\\AddressGroupPart' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Part/AddressGroupPart.php', + 'ZBateson\\MailMimeParser\\Header\\Part\\AddressPart' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Part/AddressPart.php', + 'ZBateson\\MailMimeParser\\Header\\Part\\CommentPart' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Part/CommentPart.php', + 'ZBateson\\MailMimeParser\\Header\\Part\\ContainerPart' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Part/ContainerPart.php', + 'ZBateson\\MailMimeParser\\Header\\Part\\DatePart' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Part/DatePart.php', + 'ZBateson\\MailMimeParser\\Header\\Part\\HeaderPart' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Part/HeaderPart.php', + 'ZBateson\\MailMimeParser\\Header\\Part\\HeaderPartFactory' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Part/HeaderPartFactory.php', + 'ZBateson\\MailMimeParser\\Header\\Part\\MimeToken' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Part/MimeToken.php', + 'ZBateson\\MailMimeParser\\Header\\Part\\MimeTokenPartFactory' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Part/MimeTokenPartFactory.php', + 'ZBateson\\MailMimeParser\\Header\\Part\\NameValuePart' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Part/NameValuePart.php', + 'ZBateson\\MailMimeParser\\Header\\Part\\ParameterPart' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Part/ParameterPart.php', + 'ZBateson\\MailMimeParser\\Header\\Part\\QuotedLiteralPart' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Part/QuotedLiteralPart.php', + 'ZBateson\\MailMimeParser\\Header\\Part\\ReceivedDomainPart' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Part/ReceivedDomainPart.php', + 'ZBateson\\MailMimeParser\\Header\\Part\\ReceivedPart' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Part/ReceivedPart.php', + 'ZBateson\\MailMimeParser\\Header\\Part\\SplitParameterPart' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Part/SplitParameterPart.php', + 'ZBateson\\MailMimeParser\\Header\\Part\\SubjectToken' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Part/SubjectToken.php', + 'ZBateson\\MailMimeParser\\Header\\Part\\Token' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Part/Token.php', + 'ZBateson\\MailMimeParser\\Header\\ReceivedHeader' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/ReceivedHeader.php', + 'ZBateson\\MailMimeParser\\Header\\SubjectHeader' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/SubjectHeader.php', + 'ZBateson\\MailMimeParser\\IErrorBag' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/IErrorBag.php', + 'ZBateson\\MailMimeParser\\IMessage' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/IMessage.php', + 'ZBateson\\MailMimeParser\\MailMimeParser' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/MailMimeParser.php', + 'ZBateson\\MailMimeParser\\Message' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Message.php', + 'ZBateson\\MailMimeParser\\Message\\Factory\\IMessagePartFactory' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Message/Factory/IMessagePartFactory.php', + 'ZBateson\\MailMimeParser\\Message\\Factory\\IMimePartFactory' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Message/Factory/IMimePartFactory.php', + 'ZBateson\\MailMimeParser\\Message\\Factory\\IUUEncodedPartFactory' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Message/Factory/IUUEncodedPartFactory.php', + 'ZBateson\\MailMimeParser\\Message\\Factory\\PartChildrenContainerFactory' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Message/Factory/PartChildrenContainerFactory.php', + 'ZBateson\\MailMimeParser\\Message\\Factory\\PartHeaderContainerFactory' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Message/Factory/PartHeaderContainerFactory.php', + 'ZBateson\\MailMimeParser\\Message\\Factory\\PartStreamContainerFactory' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Message/Factory/PartStreamContainerFactory.php', + 'ZBateson\\MailMimeParser\\Message\\Helper\\AbstractHelper' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Message/Helper/AbstractHelper.php', + 'ZBateson\\MailMimeParser\\Message\\Helper\\GenericHelper' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Message/Helper/GenericHelper.php', + 'ZBateson\\MailMimeParser\\Message\\Helper\\MultipartHelper' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Message/Helper/MultipartHelper.php', + 'ZBateson\\MailMimeParser\\Message\\Helper\\PrivacyHelper' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Message/Helper/PrivacyHelper.php', + 'ZBateson\\MailMimeParser\\Message\\IMessagePart' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Message/IMessagePart.php', + 'ZBateson\\MailMimeParser\\Message\\IMimePart' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Message/IMimePart.php', + 'ZBateson\\MailMimeParser\\Message\\IMultiPart' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Message/IMultiPart.php', + 'ZBateson\\MailMimeParser\\Message\\IUUEncodedPart' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Message/IUUEncodedPart.php', + 'ZBateson\\MailMimeParser\\Message\\MessagePart' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Message/MessagePart.php', + 'ZBateson\\MailMimeParser\\Message\\MimePart' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Message/MimePart.php', + 'ZBateson\\MailMimeParser\\Message\\MultiPart' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Message/MultiPart.php', + 'ZBateson\\MailMimeParser\\Message\\NonMimePart' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Message/NonMimePart.php', + 'ZBateson\\MailMimeParser\\Message\\PartChildrenContainer' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Message/PartChildrenContainer.php', + 'ZBateson\\MailMimeParser\\Message\\PartFilter' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Message/PartFilter.php', + 'ZBateson\\MailMimeParser\\Message\\PartHeaderContainer' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Message/PartHeaderContainer.php', + 'ZBateson\\MailMimeParser\\Message\\PartStreamContainer' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Message/PartStreamContainer.php', + 'ZBateson\\MailMimeParser\\Message\\UUEncodedPart' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Message/UUEncodedPart.php', + 'ZBateson\\MailMimeParser\\Parser\\AbstractParserService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Parser/AbstractParserService.php', + 'ZBateson\\MailMimeParser\\Parser\\CompatibleParserNotFoundException' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Parser/CompatibleParserNotFoundException.php', + 'ZBateson\\MailMimeParser\\Parser\\HeaderParserService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Parser/HeaderParserService.php', + 'ZBateson\\MailMimeParser\\Parser\\IParserService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Parser/IParserService.php', + 'ZBateson\\MailMimeParser\\Parser\\MessageParserService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Parser/MessageParserService.php', + 'ZBateson\\MailMimeParser\\Parser\\MimeParserService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Parser/MimeParserService.php', + 'ZBateson\\MailMimeParser\\Parser\\NonMimeParserService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Parser/NonMimeParserService.php', + 'ZBateson\\MailMimeParser\\Parser\\ParserManagerService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Parser/ParserManagerService.php', + 'ZBateson\\MailMimeParser\\Parser\\PartBuilder' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Parser/PartBuilder.php', + 'ZBateson\\MailMimeParser\\Parser\\PartBuilderFactory' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Parser/PartBuilderFactory.php', + 'ZBateson\\MailMimeParser\\Parser\\Part\\ParserPartChildrenContainer' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Parser/Part/ParserPartChildrenContainer.php', + 'ZBateson\\MailMimeParser\\Parser\\Part\\ParserPartChildrenContainerFactory' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Parser/Part/ParserPartChildrenContainerFactory.php', + 'ZBateson\\MailMimeParser\\Parser\\Part\\ParserPartStreamContainer' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Parser/Part/ParserPartStreamContainer.php', + 'ZBateson\\MailMimeParser\\Parser\\Part\\ParserPartStreamContainerFactory' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Parser/Part/ParserPartStreamContainerFactory.php', + 'ZBateson\\MailMimeParser\\Parser\\Part\\UUEncodedPartHeaderContainer' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Parser/Part/UUEncodedPartHeaderContainer.php', + 'ZBateson\\MailMimeParser\\Parser\\Part\\UUEncodedPartHeaderContainerFactory' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Parser/Part/UUEncodedPartHeaderContainerFactory.php', + 'ZBateson\\MailMimeParser\\Parser\\Proxy\\ParserMessageProxy' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Parser/Proxy/ParserMessageProxy.php', + 'ZBateson\\MailMimeParser\\Parser\\Proxy\\ParserMessageProxyFactory' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Parser/Proxy/ParserMessageProxyFactory.php', + 'ZBateson\\MailMimeParser\\Parser\\Proxy\\ParserMimePartProxy' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Parser/Proxy/ParserMimePartProxy.php', + 'ZBateson\\MailMimeParser\\Parser\\Proxy\\ParserMimePartProxyFactory' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Parser/Proxy/ParserMimePartProxyFactory.php', + 'ZBateson\\MailMimeParser\\Parser\\Proxy\\ParserNonMimeMessageProxy' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Parser/Proxy/ParserNonMimeMessageProxy.php', + 'ZBateson\\MailMimeParser\\Parser\\Proxy\\ParserNonMimeMessageProxyFactory' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Parser/Proxy/ParserNonMimeMessageProxyFactory.php', + 'ZBateson\\MailMimeParser\\Parser\\Proxy\\ParserPartProxy' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Parser/Proxy/ParserPartProxy.php', + 'ZBateson\\MailMimeParser\\Parser\\Proxy\\ParserPartProxyFactory' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Parser/Proxy/ParserPartProxyFactory.php', + 'ZBateson\\MailMimeParser\\Parser\\Proxy\\ParserUUEncodedPartProxy' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Parser/Proxy/ParserUUEncodedPartProxy.php', + 'ZBateson\\MailMimeParser\\Parser\\Proxy\\ParserUUEncodedPartProxyFactory' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Parser/Proxy/ParserUUEncodedPartProxyFactory.php', + 'ZBateson\\MailMimeParser\\Stream\\HeaderStream' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Stream/HeaderStream.php', + 'ZBateson\\MailMimeParser\\Stream\\MessagePartStream' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Stream/MessagePartStream.php', + 'ZBateson\\MailMimeParser\\Stream\\MessagePartStreamDecorator' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Stream/MessagePartStreamDecorator.php', + 'ZBateson\\MailMimeParser\\Stream\\MessagePartStreamReadException' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Stream/MessagePartStreamReadException.php', + 'ZBateson\\MailMimeParser\\Stream\\StreamFactory' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Stream/StreamFactory.php', + 'ZBateson\\MbWrapper\\MbWrapper' => __DIR__ . '/..' . '/zbateson/mb-wrapper/src/MbWrapper.php', + 'ZBateson\\MbWrapper\\UnsupportedCharsetException' => __DIR__ . '/..' . '/zbateson/mb-wrapper/src/UnsupportedCharsetException.php', + 'ZBateson\\StreamDecorators\\Base64Stream' => __DIR__ . '/..' . '/zbateson/stream-decorators/src/Base64Stream.php', + 'ZBateson\\StreamDecorators\\CharsetStream' => __DIR__ . '/..' . '/zbateson/stream-decorators/src/CharsetStream.php', + 'ZBateson\\StreamDecorators\\ChunkSplitStream' => __DIR__ . '/..' . '/zbateson/stream-decorators/src/ChunkSplitStream.php', + 'ZBateson\\StreamDecorators\\DecoratedCachingStream' => __DIR__ . '/..' . '/zbateson/stream-decorators/src/DecoratedCachingStream.php', + 'ZBateson\\StreamDecorators\\NonClosingStream' => __DIR__ . '/..' . '/zbateson/stream-decorators/src/NonClosingStream.php', + 'ZBateson\\StreamDecorators\\PregReplaceFilterStream' => __DIR__ . '/..' . '/zbateson/stream-decorators/src/PregReplaceFilterStream.php', + 'ZBateson\\StreamDecorators\\QuotedPrintableStream' => __DIR__ . '/..' . '/zbateson/stream-decorators/src/QuotedPrintableStream.php', + 'ZBateson\\StreamDecorators\\SeekingLimitStream' => __DIR__ . '/..' . '/zbateson/stream-decorators/src/SeekingLimitStream.php', + 'ZBateson\\StreamDecorators\\TellZeroStream' => __DIR__ . '/..' . '/zbateson/stream-decorators/src/TellZeroStream.php', + 'ZBateson\\StreamDecorators\\UUStream' => __DIR__ . '/..' . '/zbateson/stream-decorators/src/UUStream.php', ); public static function getInitializer(ClassLoader $loader) { return \Closure::bind(function () use ($loader) { - $loader->prefixLengthsPsr4 = ComposerStaticInit9b9826e5b5cc7806cd328c4112cca75e::$prefixLengthsPsr4; - $loader->prefixDirsPsr4 = ComposerStaticInit9b9826e5b5cc7806cd328c4112cca75e::$prefixDirsPsr4; - $loader->classMap = ComposerStaticInit9b9826e5b5cc7806cd328c4112cca75e::$classMap; + $loader->prefixLengthsPsr4 = ComposerStaticInitc3c4b7d024f8d7c21b5ca31de3cb6066::$prefixLengthsPsr4; + $loader->prefixDirsPsr4 = ComposerStaticInitc3c4b7d024f8d7c21b5ca31de3cb6066::$prefixDirsPsr4; + $loader->classMap = ComposerStaticInitc3c4b7d024f8d7c21b5ca31de3cb6066::$classMap; }, null, ClassLoader::class); } diff --git a/plugins/vendor/composer/installed.json b/plugins/vendor/composer/installed.json index 953d1fcc..6fd94ea3 100644 --- a/plugins/vendor/composer/installed.json +++ b/plugins/vendor/composer/installed.json @@ -74,17 +74,17 @@ }, { "name": "directorytree/imapengine", - "version": "v1.24.1", - "version_normalized": "1.24.1.0", + "version": "v1.25.0", + "version_normalized": "1.25.0.0", "source": { "type": "git", "url": "https://github.com/DirectoryTree/ImapEngine.git", - "reference": "d545ff3f6d2155ce7f9f612f0444579477d7bab8" + "reference": "ac8a4d028334c2d3a4bc8fd975317a75cd968a47" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/DirectoryTree/ImapEngine/zipball/d545ff3f6d2155ce7f9f612f0444579477d7bab8", - "reference": "d545ff3f6d2155ce7f9f612f0444579477d7bab8", + "url": "https://api.github.com/repos/DirectoryTree/ImapEngine/zipball/ac8a4d028334c2d3a4bc8fd975317a75cd968a47", + "reference": "ac8a4d028334c2d3a4bc8fd975317a75cd968a47", "shasum": "" }, "require": { @@ -99,7 +99,7 @@ "pestphp/pest": "^2.0|^3.0|^4.0", "spatie/ray": "^1.0" }, - "time": "2026-05-20T13:36:53+00:00", + "time": "2026-06-19T17:03:06+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -127,7 +127,7 @@ ], "support": { "issues": "https://github.com/DirectoryTree/ImapEngine/issues", - "source": "https://github.com/DirectoryTree/ImapEngine/tree/v1.24.1" + "source": "https://github.com/DirectoryTree/ImapEngine/tree/v1.25.0" }, "funding": [ { @@ -137,99 +137,6 @@ ], "install-path": "../directorytree/imapengine" }, - { - "name": "doctrine/inflector", - "version": "2.1.0", - "version_normalized": "2.1.0.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/inflector.git", - "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/6d6c96277ea252fc1304627204c3d5e6e15faa3b", - "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^12.0 || ^13.0", - "phpstan/phpstan": "^1.12 || ^2.0", - "phpstan/phpstan-phpunit": "^1.4 || ^2.0", - "phpstan/phpstan-strict-rules": "^1.6 || ^2.0", - "phpunit/phpunit": "^8.5 || ^12.2" - }, - "time": "2025-08-10T19:31:58+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "Doctrine\\Inflector\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", - "homepage": "https://www.doctrine-project.org/projects/inflector.html", - "keywords": [ - "inflection", - "inflector", - "lowercase", - "manipulation", - "php", - "plural", - "singular", - "strings", - "uppercase", - "words" - ], - "support": { - "issues": "https://github.com/doctrine/inflector/issues", - "source": "https://github.com/doctrine/inflector/tree/2.1.0" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", - "type": "tidelift" - } - ], - "install-path": "../doctrine/inflector" - }, { "name": "doctrine/lexer", "version": "3.0.1", @@ -382,17 +289,17 @@ }, { "name": "guzzlehttp/psr7", - "version": "2.11.0", - "version_normalized": "2.11.0.0", + "version": "2.12.3", + "version_normalized": "2.12.3.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "bbb5e61349fa5cb822b3e87842b951088b76b81f" + "reference": "7ec62dc3f44aa218487dbed81a9bf9bc647be55d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/bbb5e61349fa5cb822b3e87842b951088b76b81f", - "reference": "bbb5e61349fa5cb822b3e87842b951088b76b81f", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/7ec62dc3f44aa218487dbed81a9bf9bc647be55d", + "reference": "7ec62dc3f44aa218487dbed81a9bf9bc647be55d", "shasum": "" }, "require": { @@ -401,7 +308,7 @@ "psr/http-message": "^1.1 || ^2.0", "ralouphie/getallheaders": "^3.0", "symfony/deprecation-contracts": "^2.5 || ^3.0", - "symfony/polyfill-php80": "^1.24" + "symfony/polyfill-php80": "^1.25" }, "provide": { "psr/http-factory-implementation": "1.0", @@ -416,7 +323,7 @@ "suggest": { "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" }, - "time": "2026-06-02T12:30:48+00:00", + "time": "2026-06-23T15:21:08+00:00", "type": "library", "extra": { "bamarni-bin": { @@ -484,7 +391,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.11.0" + "source": "https://github.com/guzzle/psr7/tree/2.12.3" }, "funding": [ { @@ -714,196 +621,6 @@ }, "install-path": "../illuminate/macroable" }, - { - "name": "illuminate/pagination", - "version": "v12.62.0", - "version_normalized": "12.62.0.0", - "source": { - "type": "git", - "url": "https://github.com/illuminate/pagination.git", - "reference": "8327d828676654053906a771abf5eea5426354ec" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/pagination/zipball/8327d828676654053906a771abf5eea5426354ec", - "reference": "8327d828676654053906a771abf5eea5426354ec", - "shasum": "" - }, - "require": { - "ext-filter": "*", - "illuminate/collections": "^12.0", - "illuminate/contracts": "^12.0", - "illuminate/support": "^12.0", - "php": "^8.2" - }, - "time": "2026-02-25T15:25:18+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "12.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Illuminate\\Pagination\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Illuminate Pagination package.", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "install-path": "../illuminate/pagination" - }, - { - "name": "illuminate/reflection", - "version": "v12.62.0", - "version_normalized": "12.62.0.0", - "source": { - "type": "git", - "url": "https://github.com/illuminate/reflection.git", - "reference": "348cf5da9de89b596d7723be6425fb048e2bf4bb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/reflection/zipball/348cf5da9de89b596d7723be6425fb048e2bf4bb", - "reference": "348cf5da9de89b596d7723be6425fb048e2bf4bb", - "shasum": "" - }, - "require": { - "illuminate/collections": "^12.0", - "illuminate/contracts": "^12.0", - "php": "^8.2" - }, - "time": "2026-02-25T15:25:18+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "12.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "files": [ - "helpers.php" - ], - "psr-4": { - "Illuminate\\Support\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Illuminate Reflection package.", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "install-path": "../illuminate/reflection" - }, - { - "name": "illuminate/support", - "version": "v12.62.0", - "version_normalized": "12.62.0.0", - "source": { - "type": "git", - "url": "https://github.com/illuminate/support.git", - "reference": "3a8772095ef7d6b1961a77f2f0b8921c056c48ea" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/support/zipball/3a8772095ef7d6b1961a77f2f0b8921c056c48ea", - "reference": "3a8772095ef7d6b1961a77f2f0b8921c056c48ea", - "shasum": "" - }, - "require": { - "doctrine/inflector": "^2.0", - "ext-ctype": "*", - "ext-filter": "*", - "ext-mbstring": "*", - "illuminate/collections": "^12.0", - "illuminate/conditionable": "^12.0", - "illuminate/contracts": "^12.0", - "illuminate/macroable": "^12.0", - "illuminate/reflection": "^12.0", - "nesbot/carbon": "^3.8.4", - "php": "^8.2", - "symfony/polyfill-php83": "^1.33", - "symfony/polyfill-php85": "^1.33", - "voku/portable-ascii": "^2.0.2" - }, - "conflict": { - "tightenco/collect": "<5.5.33" - }, - "replace": { - "spatie/once": "*" - }, - "suggest": { - "illuminate/filesystem": "Required to use the Composer class (^12.0).", - "laravel/serializable-closure": "Required to use the once function (^1.3|^2.0).", - "league/commonmark": "Required to use Str::markdown() and Stringable::markdown() (^2.7).", - "league/uri": "Required to use the Uri class (^7.5.1).", - "ramsey/uuid": "Required to use Str::uuid() (^4.7).", - "symfony/process": "Required to use the Composer class (^7.2).", - "symfony/uid": "Required to use Str::ulid() (^7.2).", - "symfony/var-dumper": "Required to use the dd function (^7.2).", - "vlucas/phpdotenv": "Required to use the Env class and env helper (^5.6.1)." - }, - "time": "2026-05-31T22:10:17+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "12.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "files": [ - "functions.php", - "helpers.php" - ], - "psr-4": { - "Illuminate\\Support\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Illuminate Support package.", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "install-path": "../illuminate/support" - }, { "name": "laravel/serializable-closure", "version": "v2.0.13", @@ -970,17 +687,17 @@ }, { "name": "nesbot/carbon", - "version": "3.11.4", - "version_normalized": "3.11.4.0", + "version": "3.13.0", + "version_normalized": "3.13.0.0", "source": { "type": "git", "url": "https://github.com/CarbonPHP/carbon.git", - "reference": "e890471a3494740f7d9326d72ce6a8c559ffee60" + "reference": "40f6618f052df16b545f626fbf9a878e6497d16a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/e890471a3494740f7d9326d72ce6a8c559ffee60", - "reference": "e890471a3494740f7d9326d72ce6a8c559ffee60", + "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/40f6618f052df16b545f626fbf9a878e6497d16a", + "reference": "40f6618f052df16b545f626fbf9a878e6497d16a", "shasum": "" }, "require": { @@ -1006,7 +723,7 @@ "phpunit/phpunit": "^10.5.53", "squizlabs/php_codesniffer": "^3.13.4 || ^4.0.0" }, - "time": "2026-04-07T09:57:54+00:00", + "time": "2026-06-18T13:49:15+00:00", "bin": [ "bin/carbon" ], @@ -1740,91 +1457,6 @@ ], "install-path": "../symfony/deprecation-contracts" }, - { - "name": "symfony/http-foundation", - "version": "v7.4.13", - "version_normalized": "7.4.13.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-foundation.git", - "reference": "bc354f47c62301e990b7874fa662326368508e2c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/bc354f47c62301e990b7874fa662326368508e2c", - "reference": "bc354f47c62301e990b7874fa662326368508e2c", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-mbstring": "^1.1" - }, - "conflict": { - "doctrine/dbal": "<3.6", - "symfony/cache": "<6.4.12|>=7.0,<7.1.5" - }, - "require-dev": { - "doctrine/dbal": "^3.6|^4", - "predis/predis": "^1.1|^2.0", - "symfony/cache": "^6.4.12|^7.1.5|^8.0", - "symfony/clock": "^6.4|^7.0|^8.0", - "symfony/dependency-injection": "^6.4|^7.0|^8.0", - "symfony/expression-language": "^6.4|^7.0|^8.0", - "symfony/http-kernel": "^6.4|^7.0|^8.0", - "symfony/mime": "^6.4|^7.0|^8.0", - "symfony/rate-limiter": "^6.4|^7.0|^8.0" - }, - "time": "2026-05-24T11:20:33+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Component\\HttpFoundation\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Defines an object-oriented layer for the HTTP specification", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/http-foundation/tree/v7.4.13" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "install-path": "../symfony/http-foundation" - }, { "name": "symfony/mime", "version": "v7.4.13", @@ -2794,180 +2426,19 @@ ], "install-path": "../symfony/translation-contracts" }, - { - "name": "voku/portable-ascii", - "version": "2.1.1", - "version_normalized": "2.1.1.0", - "source": { - "type": "git", - "url": "https://github.com/voku/portable-ascii.git", - "reference": "8e1051fe39379367aecf014f41744ce7539a856f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/voku/portable-ascii/zipball/8e1051fe39379367aecf014f41744ce7539a856f", - "reference": "8e1051fe39379367aecf014f41744ce7539a856f", - "shasum": "" - }, - "require": { - "php": ">=7.1.0" - }, - "require-dev": { - "phpunit/phpunit": "~8.5 || ~9.6 || ~10.5 || ~11.5" - }, - "suggest": { - "ext-intl": "Use Intl for transliterator_transliterate() support" - }, - "time": "2026-04-26T05:33:54+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "voku\\": "src/voku/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Lars Moelleken", - "homepage": "https://www.moelleken.org/" - } - ], - "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", - "homepage": "https://github.com/voku/portable-ascii", - "keywords": [ - "ascii", - "clean", - "php" - ], - "support": { - "issues": "https://github.com/voku/portable-ascii/issues", - "source": "https://github.com/voku/portable-ascii/tree/2.1.1" - }, - "funding": [ - { - "url": "https://www.paypal.me/moelleken", - "type": "custom" - }, - { - "url": "https://github.com/voku", - "type": "github" - }, - { - "url": "https://opencollective.com/portable-ascii", - "type": "open_collective" - }, - { - "url": "https://www.patreon.com/voku", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii", - "type": "tidelift" - } - ], - "install-path": "../voku/portable-ascii" - }, - { - "name": "webklex/php-imap", - "version": "6.2.0", - "version_normalized": "6.2.0.0", - "source": { - "type": "git", - "url": "https://github.com/Webklex/php-imap.git", - "reference": "6b8ef85d621bbbaf52741b00cca8e9237e2b2e05" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Webklex/php-imap/zipball/6b8ef85d621bbbaf52741b00cca8e9237e2b2e05", - "reference": "6b8ef85d621bbbaf52741b00cca8e9237e2b2e05", - "shasum": "" - }, - "require": { - "ext-fileinfo": "*", - "ext-iconv": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-openssl": "*", - "ext-zip": "*", - "illuminate/pagination": ">=5.0.0", - "nesbot/carbon": "^2.62.1|^3.2.4", - "php": "^8.0.2", - "symfony/http-foundation": ">=2.8.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.5.10" - }, - "suggest": { - "symfony/mime": "Recomended for better extension support", - "symfony/var-dumper": "Usefull tool for debugging" - }, - "time": "2025-04-25T06:02:37+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "6.0-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Webklex\\PHPIMAP\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Malte Goldenbaum", - "email": "github@webklex.com", - "role": "Developer" - } - ], - "description": "PHP IMAP client", - "homepage": "https://github.com/webklex/php-imap", - "keywords": [ - "imap", - "mail", - "php-imap", - "pop3", - "webklex" - ], - "support": { - "issues": "https://github.com/Webklex/php-imap/issues", - "source": "https://github.com/Webklex/php-imap/tree/6.2.0" - }, - "funding": [ - { - "url": "https://www.buymeacoffee.com/webklex", - "type": "custom" - }, - { - "url": "https://ko-fi.com/webklex", - "type": "ko_fi" - } - ], - "install-path": "../webklex/php-imap" - }, { "name": "zbateson/mail-mime-parser", - "version": "3.0.5", - "version_normalized": "3.0.5.0", + "version": "3.0.6", + "version_normalized": "3.0.6.0", "source": { "type": "git", "url": "https://github.com/zbateson/mail-mime-parser.git", - "reference": "ff054c8e05310c445c2028c6128a4319cc9f6aa8" + "reference": "395c406cc1c5d1eb171d9decb0a3b509e8bd6bc0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/zbateson/mail-mime-parser/zipball/ff054c8e05310c445c2028c6128a4319cc9f6aa8", - "reference": "ff054c8e05310c445c2028c6128a4319cc9f6aa8", + "url": "https://api.github.com/repos/zbateson/mail-mime-parser/zipball/395c406cc1c5d1eb171d9decb0a3b509e8bd6bc0", + "reference": "395c406cc1c5d1eb171d9decb0a3b509e8bd6bc0", "shasum": "" }, "require": { @@ -2988,7 +2459,7 @@ "ext-iconv": "For best support/performance", "ext-mbstring": "For best support/performance" }, - "time": "2025-12-02T00:29:16+00:00", + "time": "2026-06-24T13:42:46+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -3173,6 +2644,6 @@ "install-path": "../zbateson/stream-decorators" } ], - "dev": true, + "dev": false, "dev-package-names": [] } diff --git a/plugins/vendor/composer/installed.php b/plugins/vendor/composer/installed.php index b7c4e55d..81ed8964 100644 --- a/plugins/vendor/composer/installed.php +++ b/plugins/vendor/composer/installed.php @@ -5,9 +5,9 @@ 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), - 'reference' => '2204bd52f45d06ee1ec2b39342b3cf74bd8a2c8b', + 'reference' => '63ad3256ee5a661d2a34105ed69d198f585a025a', 'name' => '__root__', - 'dev' => true, + 'dev' => false, ), 'versions' => array( '__root__' => array( @@ -16,7 +16,7 @@ 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), - 'reference' => '2204bd52f45d06ee1ec2b39342b3cf74bd8a2c8b', + 'reference' => '63ad3256ee5a661d2a34105ed69d198f585a025a', 'dev_requirement' => false, ), 'carbonphp/carbon-doctrine-types' => array( @@ -29,21 +29,12 @@ 'dev_requirement' => false, ), 'directorytree/imapengine' => array( - 'pretty_version' => 'v1.24.1', - 'version' => '1.24.1.0', + 'pretty_version' => 'v1.25.0', + 'version' => '1.25.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../directorytree/imapengine', 'aliases' => array(), - 'reference' => 'd545ff3f6d2155ce7f9f612f0444579477d7bab8', - 'dev_requirement' => false, - ), - 'doctrine/inflector' => array( - 'pretty_version' => '2.1.0', - 'version' => '2.1.0.0', - 'type' => 'library', - 'install_path' => __DIR__ . '/../doctrine/inflector', - 'aliases' => array(), - 'reference' => '6d6c96277ea252fc1304627204c3d5e6e15faa3b', + 'reference' => 'ac8a4d028334c2d3a4bc8fd975317a75cd968a47', 'dev_requirement' => false, ), 'doctrine/lexer' => array( @@ -65,12 +56,12 @@ 'dev_requirement' => false, ), 'guzzlehttp/psr7' => array( - 'pretty_version' => '2.11.0', - 'version' => '2.11.0.0', + 'pretty_version' => '2.12.3', + 'version' => '2.12.3.0', 'type' => 'library', 'install_path' => __DIR__ . '/../guzzlehttp/psr7', 'aliases' => array(), - 'reference' => 'bbb5e61349fa5cb822b3e87842b951088b76b81f', + 'reference' => '7ec62dc3f44aa218487dbed81a9bf9bc647be55d', 'dev_requirement' => false, ), 'illuminate/collections' => array( @@ -109,33 +100,6 @@ 'reference' => 'e295d62d89dcdb87e2b1bd70dd14d074a0ed73cc', 'dev_requirement' => false, ), - 'illuminate/pagination' => array( - 'pretty_version' => 'v12.62.0', - 'version' => '12.62.0.0', - 'type' => 'library', - 'install_path' => __DIR__ . '/../illuminate/pagination', - 'aliases' => array(), - 'reference' => '8327d828676654053906a771abf5eea5426354ec', - 'dev_requirement' => false, - ), - 'illuminate/reflection' => array( - 'pretty_version' => 'v12.62.0', - 'version' => '12.62.0.0', - 'type' => 'library', - 'install_path' => __DIR__ . '/../illuminate/reflection', - 'aliases' => array(), - 'reference' => '348cf5da9de89b596d7723be6425fb048e2bf4bb', - 'dev_requirement' => false, - ), - 'illuminate/support' => array( - 'pretty_version' => 'v12.62.0', - 'version' => '12.62.0.0', - 'type' => 'library', - 'install_path' => __DIR__ . '/../illuminate/support', - 'aliases' => array(), - 'reference' => '3a8772095ef7d6b1961a77f2f0b8921c056c48ea', - 'dev_requirement' => false, - ), 'laravel/serializable-closure' => array( 'pretty_version' => 'v2.0.13', 'version' => '2.0.13.0', @@ -146,12 +110,12 @@ 'dev_requirement' => false, ), 'nesbot/carbon' => array( - 'pretty_version' => '3.11.4', - 'version' => '3.11.4.0', + 'pretty_version' => '3.13.0', + 'version' => '3.13.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../nesbot/carbon', 'aliases' => array(), - 'reference' => 'e890471a3494740f7d9326d72ce6a8c559ffee60', + 'reference' => '40f6618f052df16b545f626fbf9a878e6497d16a', 'dev_requirement' => false, ), 'php-di/invoker' => array( @@ -259,12 +223,6 @@ 'reference' => '120b605dfeb996808c31b6477290a714d356e822', 'dev_requirement' => false, ), - 'spatie/once' => array( - 'dev_requirement' => false, - 'replaced' => array( - 0 => '*', - ), - ), 'symfony/clock' => array( 'pretty_version' => 'v7.4.8', 'version' => '7.4.8.0', @@ -283,15 +241,6 @@ 'reference' => '50f59d1f3ca46d41ac911f97a78626b6756af35b', 'dev_requirement' => false, ), - 'symfony/http-foundation' => array( - 'pretty_version' => 'v7.4.13', - 'version' => '7.4.13.0', - 'type' => 'library', - 'install_path' => __DIR__ . '/../symfony/http-foundation', - 'aliases' => array(), - 'reference' => 'bc354f47c62301e990b7874fa662326368508e2c', - 'dev_requirement' => false, - ), 'symfony/mime' => array( 'pretty_version' => 'v7.4.13', 'version' => '7.4.13.0', @@ -397,31 +346,13 @@ 0 => '2.3|3.0', ), ), - 'voku/portable-ascii' => array( - 'pretty_version' => '2.1.1', - 'version' => '2.1.1.0', - 'type' => 'library', - 'install_path' => __DIR__ . '/../voku/portable-ascii', - 'aliases' => array(), - 'reference' => '8e1051fe39379367aecf014f41744ce7539a856f', - 'dev_requirement' => false, - ), - 'webklex/php-imap' => array( - 'pretty_version' => '6.2.0', - 'version' => '6.2.0.0', - 'type' => 'library', - 'install_path' => __DIR__ . '/../webklex/php-imap', - 'aliases' => array(), - 'reference' => '6b8ef85d621bbbaf52741b00cca8e9237e2b2e05', - 'dev_requirement' => false, - ), 'zbateson/mail-mime-parser' => array( - 'pretty_version' => '3.0.5', - 'version' => '3.0.5.0', + 'pretty_version' => '3.0.6', + 'version' => '3.0.6.0', 'type' => 'library', 'install_path' => __DIR__ . '/../zbateson/mail-mime-parser', 'aliases' => array(), - 'reference' => 'ff054c8e05310c445c2028c6128a4319cc9f6aa8', + 'reference' => '395c406cc1c5d1eb171d9decb0a3b509e8bd6bc0', 'dev_requirement' => false, ), 'zbateson/mb-wrapper' => array( diff --git a/plugins/vendor/directorytree/imapengine/src/Connection/ImapQueryBuilder.php b/plugins/vendor/directorytree/imapengine/src/Connection/ImapQueryBuilder.php index 4fdc0e0c..fd2db7fe 100644 --- a/plugins/vendor/directorytree/imapengine/src/Connection/ImapQueryBuilder.php +++ b/plugins/vendor/directorytree/imapengine/src/Connection/ImapQueryBuilder.php @@ -270,6 +270,14 @@ class ImapQueryBuilder return $this->where(ImapSearchKey::Header->value." $header", $value); } + /** + * Add a where "HEADER Message-ID" clause to the query. + */ + public function messageId(string $messageId): static + { + return $this->header('Message-ID', trim(trim($messageId), '<>')); + } + /** * Add a where "UID" clause to the query. */ diff --git a/plugins/vendor/doctrine/inflector/LICENSE b/plugins/vendor/doctrine/inflector/LICENSE deleted file mode 100644 index 8c38cc1b..00000000 --- a/plugins/vendor/doctrine/inflector/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2006-2015 Doctrine Project - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/plugins/vendor/doctrine/inflector/README.md b/plugins/vendor/doctrine/inflector/README.md deleted file mode 100644 index 6e3a97f7..00000000 --- a/plugins/vendor/doctrine/inflector/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# Doctrine Inflector - -Doctrine Inflector is a small library that can perform string manipulations -with regard to uppercase/lowercase and singular/plural forms of words. - -[![Build Status](https://github.com/doctrine/inflector/workflows/Continuous%20Integration/badge.svg)](https://github.com/doctrine/inflector/actions?query=workflow%3A%22Continuous+Integration%22+branch%3A4.0.x) -[![Code Coverage](https://codecov.io/gh/doctrine/inflector/branch/2.0.x/graph/badge.svg)](https://codecov.io/gh/doctrine/inflector/branch/2.0.x) diff --git a/plugins/vendor/doctrine/inflector/composer.json b/plugins/vendor/doctrine/inflector/composer.json deleted file mode 100644 index 6102926f..00000000 --- a/plugins/vendor/doctrine/inflector/composer.json +++ /dev/null @@ -1,67 +0,0 @@ -{ - "name": "doctrine/inflector", - "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", - "license": "MIT", - "type": "library", - "keywords": [ - "php", - "strings", - "words", - "manipulation", - "inflector", - "inflection", - "uppercase", - "lowercase", - "singular", - "plural" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "homepage": "https://www.doctrine-project.org/projects/inflector.html", - "require": { - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^12.0 || ^13.0", - "phpstan/phpstan": "^1.12 || ^2.0", - "phpstan/phpstan-phpunit": "^1.4 || ^2.0", - "phpstan/phpstan-strict-rules": "^1.6 || ^2.0", - "phpunit/phpunit": "^8.5 || ^12.2" - }, - "autoload": { - "psr-4": { - "Doctrine\\Inflector\\": "src" - } - }, - "autoload-dev": { - "psr-4": { - "Doctrine\\Tests\\Inflector\\": "tests" - } - }, - "config": { - "allow-plugins": { - "dealerdirect/phpcodesniffer-composer-installer": true - }, - "sort-packages": true - } -} diff --git a/plugins/vendor/doctrine/inflector/docs/en/index.rst b/plugins/vendor/doctrine/inflector/docs/en/index.rst deleted file mode 100644 index 1e094c8e..00000000 --- a/plugins/vendor/doctrine/inflector/docs/en/index.rst +++ /dev/null @@ -1,227 +0,0 @@ -Introduction -============ - -The Doctrine Inflector has methods for inflecting text. The features include pluralization, -singularization, converting between camelCase and under_score and capitalizing -words. - -Installation -============ - -You can install the Inflector with composer: - -.. code-block:: console - - $ composer require doctrine/inflector - -Usage -===== - -Using the inflector is easy, you can create a new ``Doctrine\Inflector\Inflector`` instance by using -the ``Doctrine\Inflector\InflectorFactory`` class: - -.. code-block:: php - - use Doctrine\Inflector\InflectorFactory; - - $inflector = InflectorFactory::create()->build(); - -By default it will create an English inflector. If you want to use another language, just pass the language -you want to create an inflector for to the ``createForLanguage()`` method: - -.. code-block:: php - - use Doctrine\Inflector\InflectorFactory; - use Doctrine\Inflector\Language; - - $inflector = InflectorFactory::createForLanguage(Language::SPANISH)->build(); - -The supported languages are as follows: - -- ``Language::ENGLISH`` -- ``Language::ESPERANTO`` -- ``Language::FRENCH`` -- ``Language::NORWEGIAN_BOKMAL`` -- ``Language::PORTUGUESE`` -- ``Language::SPANISH`` -- ``Language::TURKISH`` - -If you want to manually construct the inflector instead of using a factory, you can do so like this: - -.. code-block:: php - - use Doctrine\Inflector\CachedWordInflector; - use Doctrine\Inflector\RulesetInflector; - use Doctrine\Inflector\Rules\English; - - $inflector = new Inflector( - new CachedWordInflector(new RulesetInflector( - English\Rules::getSingularRuleset() - )), - new CachedWordInflector(new RulesetInflector( - English\Rules::getPluralRuleset() - )) - ); - -Adding Languages ----------------- - -If you are interested in adding support for your language, take a look at the other languages defined in the -``Doctrine\Inflector\Rules`` namespace and the tests located in ``Doctrine\Tests\Inflector\Rules``. You can copy -one of the languages and update the rules for your language. - -Once you have done this, send a pull request to the ``doctrine/inflector`` repository with the additions. - -Custom Setup -============ - -If you want to setup custom singular and plural rules, you can configure these in the factory: - -.. code-block:: php - - use Doctrine\Inflector\InflectorFactory; - use Doctrine\Inflector\Rules\Pattern; - use Doctrine\Inflector\Rules\Patterns; - use Doctrine\Inflector\Rules\Ruleset; - use Doctrine\Inflector\Rules\Substitution; - use Doctrine\Inflector\Rules\Substitutions; - use Doctrine\Inflector\Rules\Transformation; - use Doctrine\Inflector\Rules\Transformations; - use Doctrine\Inflector\Rules\Word; - - $inflector = InflectorFactory::create() - ->withSingularRules( - new Ruleset( - new Transformations( - new Transformation(new Pattern('/^(bil)er$/i'), '\1'), - new Transformation(new Pattern('/^(inflec|contribu)tors$/i'), '\1ta') - ), - new Patterns(new Pattern('singulars')), - new Substitutions(new Substitution(new Word('spins'), new Word('spinor'))) - ) - ) - ->withPluralRules( - new Ruleset( - new Transformations( - new Transformation(new Pattern('^(bil)er$'), '\1'), - new Transformation(new Pattern('^(inflec|contribu)tors$'), '\1ta') - ), - new Patterns(new Pattern('noflect'), new Pattern('abtuse')), - new Substitutions( - new Substitution(new Word('amaze'), new Word('amazable')), - new Substitution(new Word('phone'), new Word('phonezes')) - ) - ) - ) - ->build(); - -No operation inflector ----------------------- - -The ``Doctrine\Inflector\NoopWordInflector`` may be used to configure an inflector that doesn't perform any operation for -pluralization and/or singularization. If will simply return the input as output. - -This is an implementation of the `Null Object design pattern `_. - -.. code-block:: php - - use Doctrine\Inflector\Inflector; - use Doctrine\Inflector\NoopWordInflector; - - $inflector = new Inflector(new NoopWordInflector(), new NoopWordInflector()); - -Tableize -======== - -Converts ``ModelName`` to ``model_name``: - -.. code-block:: php - - echo $inflector->tableize('ModelName'); // model_name - -Classify -======== - -Converts ``model_name`` to ``ModelName``: - -.. code-block:: php - - echo $inflector->classify('model_name'); // ModelName - -Camelize -======== - -This method uses `Classify`_ and then converts the first character to lowercase: - -.. code-block:: php - - echo $inflector->camelize('model_name'); // modelName - -Capitalize -========== - -Takes a string and capitalizes all of the words, like PHP's built-in -``ucwords`` function. This extends that behavior, however, by allowing the -word delimiters to be configured, rather than only separating on -whitespace. - -Here is an example: - -.. code-block:: php - - $string = 'top-o-the-morning to all_of_you!'; - - echo $inflector->capitalize($string); // Top-O-The-Morning To All_of_you! - - echo $inflector->capitalize($string, '-_ '); // Top-O-The-Morning To All_Of_You! - -Pluralize -========= - -Returns a word in plural form. - -.. code-block:: php - - echo $inflector->pluralize('browser'); // browsers - -Singularize -=========== - -Returns a word in singular form. - -.. code-block:: php - - echo $inflector->singularize('browsers'); // browser - -Urlize -====== - -Generate a URL friendly string from a string of text: - -.. code-block:: php - - echo $inflector->urlize('My first blog post'); // my-first-blog-post - -Unaccent -======== - -You can unaccent a string of text using the ``unaccent()`` method: - -.. code-block:: php - - echo $inflector->unaccent('año'); // ano - -Legacy API -========== - -The API present in Inflector 1.x is still available, but will be deprecated in a future release and dropped for 3.0. -Support for languages other than English is available in the 2.0 API only. - -Acknowledgements -================ - -The language rules in this library have been adapted from several different sources, including but not limited to: - -- `Ruby On Rails Inflector `_ -- `ICanBoogie Inflector `_ -- `CakePHP Inflector `_ diff --git a/plugins/vendor/doctrine/inflector/src/CachedWordInflector.php b/plugins/vendor/doctrine/inflector/src/CachedWordInflector.php deleted file mode 100644 index 2d529087..00000000 --- a/plugins/vendor/doctrine/inflector/src/CachedWordInflector.php +++ /dev/null @@ -1,24 +0,0 @@ -wordInflector = $wordInflector; - } - - public function inflect(string $word): string - { - return $this->cache[$word] ?? $this->cache[$word] = $this->wordInflector->inflect($word); - } -} diff --git a/plugins/vendor/doctrine/inflector/src/GenericLanguageInflectorFactory.php b/plugins/vendor/doctrine/inflector/src/GenericLanguageInflectorFactory.php deleted file mode 100644 index 166061d2..00000000 --- a/plugins/vendor/doctrine/inflector/src/GenericLanguageInflectorFactory.php +++ /dev/null @@ -1,66 +0,0 @@ -singularRulesets[] = $this->getSingularRuleset(); - $this->pluralRulesets[] = $this->getPluralRuleset(); - } - - final public function build(): Inflector - { - return new Inflector( - new CachedWordInflector(new RulesetInflector( - ...$this->singularRulesets - )), - new CachedWordInflector(new RulesetInflector( - ...$this->pluralRulesets - )) - ); - } - - final public function withSingularRules(?Ruleset $singularRules, bool $reset = false): LanguageInflectorFactory - { - if ($reset) { - $this->singularRulesets = []; - } - - if ($singularRules instanceof Ruleset) { - array_unshift($this->singularRulesets, $singularRules); - } - - return $this; - } - - final public function withPluralRules(?Ruleset $pluralRules, bool $reset = false): LanguageInflectorFactory - { - if ($reset) { - $this->pluralRulesets = []; - } - - if ($pluralRules instanceof Ruleset) { - array_unshift($this->pluralRulesets, $pluralRules); - } - - return $this; - } - - abstract protected function getSingularRuleset(): Ruleset; - - abstract protected function getPluralRuleset(): Ruleset; -} diff --git a/plugins/vendor/doctrine/inflector/src/Inflector.php b/plugins/vendor/doctrine/inflector/src/Inflector.php deleted file mode 100644 index 610a4cf4..00000000 --- a/plugins/vendor/doctrine/inflector/src/Inflector.php +++ /dev/null @@ -1,507 +0,0 @@ - 'A', - 'Á' => 'A', - 'Â' => 'A', - 'Ã' => 'A', - 'Ä' => 'Ae', - 'Æ' => 'Ae', - 'Å' => 'Aa', - 'æ' => 'a', - 'Ç' => 'C', - 'È' => 'E', - 'É' => 'E', - 'Ê' => 'E', - 'Ë' => 'E', - 'Ì' => 'I', - 'Í' => 'I', - 'Î' => 'I', - 'Ï' => 'I', - 'Ñ' => 'N', - 'Ò' => 'O', - 'Ó' => 'O', - 'Ô' => 'O', - 'Õ' => 'O', - 'Ö' => 'Oe', - 'Ù' => 'U', - 'Ú' => 'U', - 'Û' => 'U', - 'Ü' => 'Ue', - 'Ý' => 'Y', - 'ß' => 'ss', - 'à' => 'a', - 'á' => 'a', - 'â' => 'a', - 'ã' => 'a', - 'ä' => 'ae', - 'å' => 'aa', - 'ç' => 'c', - 'è' => 'e', - 'é' => 'e', - 'ê' => 'e', - 'ë' => 'e', - 'ì' => 'i', - 'í' => 'i', - 'î' => 'i', - 'ï' => 'i', - 'ñ' => 'n', - 'ò' => 'o', - 'ó' => 'o', - 'ô' => 'o', - 'õ' => 'o', - 'ö' => 'oe', - 'ù' => 'u', - 'ú' => 'u', - 'û' => 'u', - 'ü' => 'ue', - 'ý' => 'y', - 'ÿ' => 'y', - 'Ā' => 'A', - 'ā' => 'a', - 'Ă' => 'A', - 'ă' => 'a', - 'Ą' => 'A', - 'ą' => 'a', - 'Ć' => 'C', - 'ć' => 'c', - 'Ĉ' => 'C', - 'ĉ' => 'c', - 'Ċ' => 'C', - 'ċ' => 'c', - 'Č' => 'C', - 'č' => 'c', - 'Ď' => 'D', - 'ď' => 'd', - 'Đ' => 'D', - 'đ' => 'd', - 'Ē' => 'E', - 'ē' => 'e', - 'Ĕ' => 'E', - 'ĕ' => 'e', - 'Ė' => 'E', - 'ė' => 'e', - 'Ę' => 'E', - 'ę' => 'e', - 'Ě' => 'E', - 'ě' => 'e', - 'Ĝ' => 'G', - 'ĝ' => 'g', - 'Ğ' => 'G', - 'ğ' => 'g', - 'Ġ' => 'G', - 'ġ' => 'g', - 'Ģ' => 'G', - 'ģ' => 'g', - 'Ĥ' => 'H', - 'ĥ' => 'h', - 'Ħ' => 'H', - 'ħ' => 'h', - 'Ĩ' => 'I', - 'ĩ' => 'i', - 'Ī' => 'I', - 'ī' => 'i', - 'Ĭ' => 'I', - 'ĭ' => 'i', - 'Į' => 'I', - 'į' => 'i', - 'İ' => 'I', - 'ı' => 'i', - 'IJ' => 'IJ', - 'ij' => 'ij', - 'Ĵ' => 'J', - 'ĵ' => 'j', - 'Ķ' => 'K', - 'ķ' => 'k', - 'ĸ' => 'k', - 'Ĺ' => 'L', - 'ĺ' => 'l', - 'Ļ' => 'L', - 'ļ' => 'l', - 'Ľ' => 'L', - 'ľ' => 'l', - 'Ŀ' => 'L', - 'ŀ' => 'l', - 'Ł' => 'L', - 'ł' => 'l', - 'Ń' => 'N', - 'ń' => 'n', - 'Ņ' => 'N', - 'ņ' => 'n', - 'Ň' => 'N', - 'ň' => 'n', - 'ʼn' => 'N', - 'Ŋ' => 'n', - 'ŋ' => 'N', - 'Ō' => 'O', - 'ō' => 'o', - 'Ŏ' => 'O', - 'ŏ' => 'o', - 'Ő' => 'O', - 'ő' => 'o', - 'Œ' => 'OE', - 'œ' => 'oe', - 'Ø' => 'O', - 'ø' => 'o', - 'Ŕ' => 'R', - 'ŕ' => 'r', - 'Ŗ' => 'R', - 'ŗ' => 'r', - 'Ř' => 'R', - 'ř' => 'r', - 'Ś' => 'S', - 'ś' => 's', - 'Ŝ' => 'S', - 'ŝ' => 's', - 'Ş' => 'S', - 'ş' => 's', - 'Š' => 'S', - 'š' => 's', - 'Ţ' => 'T', - 'ţ' => 't', - 'Ť' => 'T', - 'ť' => 't', - 'Ŧ' => 'T', - 'ŧ' => 't', - 'Ũ' => 'U', - 'ũ' => 'u', - 'Ū' => 'U', - 'ū' => 'u', - 'Ŭ' => 'U', - 'ŭ' => 'u', - 'Ů' => 'U', - 'ů' => 'u', - 'Ű' => 'U', - 'ű' => 'u', - 'Ų' => 'U', - 'ų' => 'u', - 'Ŵ' => 'W', - 'ŵ' => 'w', - 'Ŷ' => 'Y', - 'ŷ' => 'y', - 'Ÿ' => 'Y', - 'Ź' => 'Z', - 'ź' => 'z', - 'Ż' => 'Z', - 'ż' => 'z', - 'Ž' => 'Z', - 'ž' => 'z', - 'ſ' => 's', - '€' => 'E', - '£' => '', - ]; - - /** @var WordInflector */ - private $singularizer; - - /** @var WordInflector */ - private $pluralizer; - - public function __construct(WordInflector $singularizer, WordInflector $pluralizer) - { - $this->singularizer = $singularizer; - $this->pluralizer = $pluralizer; - } - - /** - * Converts a word into the format for a Doctrine table name. Converts 'ModelName' to 'model_name'. - */ - public function tableize(string $word): string - { - $tableized = preg_replace('~(?<=\\w)([A-Z])~u', '_$1', $word); - - if ($tableized === null) { - throw new RuntimeException(sprintf( - 'preg_replace returned null for value "%s"', - $word - )); - } - - return mb_strtolower($tableized); - } - - /** - * Converts a word into the format for a Doctrine class name. Converts 'table_name' to 'TableName'. - */ - public function classify(string $word): string - { - return str_replace([' ', '_', '-'], '', ucwords($word, ' _-')); - } - - /** - * Camelizes a word. This uses the classify() method and turns the first character to lowercase. - */ - public function camelize(string $word): string - { - return lcfirst($this->classify($word)); - } - - /** - * Uppercases words with configurable delimiters between words. - * - * Takes a string and capitalizes all of the words, like PHP's built-in - * ucwords function. This extends that behavior, however, by allowing the - * word delimiters to be configured, rather than only separating on - * whitespace. - * - * Here is an example: - * - * capitalize($string); - * // Top-O-The-Morning To All_of_you! - * - * echo $inflector->capitalize($string, '-_ '); - * // Top-O-The-Morning To All_Of_You! - * ?> - * - * - * @param string $string The string to operate on. - * @param string $delimiters A list of word separators. - * - * @return string The string with all delimiter-separated words capitalized. - */ - public function capitalize(string $string, string $delimiters = " \n\t\r\0\x0B-"): string - { - return ucwords($string, $delimiters); - } - - /** - * Checks if the given string seems like it has utf8 characters in it. - * - * @param string $string The string to check for utf8 characters in. - */ - public function seemsUtf8(string $string): bool - { - for ($i = 0; $i < strlen($string); $i++) { - if (ord($string[$i]) < 0x80) { - continue; // 0bbbbbbb - } - - if ((ord($string[$i]) & 0xE0) === 0xC0) { - $n = 1; // 110bbbbb - } elseif ((ord($string[$i]) & 0xF0) === 0xE0) { - $n = 2; // 1110bbbb - } elseif ((ord($string[$i]) & 0xF8) === 0xF0) { - $n = 3; // 11110bbb - } elseif ((ord($string[$i]) & 0xFC) === 0xF8) { - $n = 4; // 111110bb - } elseif ((ord($string[$i]) & 0xFE) === 0xFC) { - $n = 5; // 1111110b - } else { - return false; // Does not match any model - } - - for ($j = 0; $j < $n; $j++) { // n bytes matching 10bbbbbb follow ? - if (++$i === strlen($string) || ((ord($string[$i]) & 0xC0) !== 0x80)) { - return false; - } - } - } - - return true; - } - - /** - * Remove any illegal characters, accents, etc. - * - * @param string $string String to unaccent - * - * @return string Unaccented string - */ - public function unaccent(string $string): string - { - if (preg_match('/[\x80-\xff]/', $string) === false) { - return $string; - } - - if ($this->seemsUtf8($string)) { - $string = strtr($string, self::ACCENTED_CHARACTERS); - } else { - $characters = []; - - // Assume ISO-8859-1 if not UTF-8 - $characters['in'] = - chr(128) - . chr(131) - . chr(138) - . chr(142) - . chr(154) - . chr(158) - . chr(159) - . chr(162) - . chr(165) - . chr(181) - . chr(192) - . chr(193) - . chr(194) - . chr(195) - . chr(196) - . chr(197) - . chr(199) - . chr(200) - . chr(201) - . chr(202) - . chr(203) - . chr(204) - . chr(205) - . chr(206) - . chr(207) - . chr(209) - . chr(210) - . chr(211) - . chr(212) - . chr(213) - . chr(214) - . chr(216) - . chr(217) - . chr(218) - . chr(219) - . chr(220) - . chr(221) - . chr(224) - . chr(225) - . chr(226) - . chr(227) - . chr(228) - . chr(229) - . chr(231) - . chr(232) - . chr(233) - . chr(234) - . chr(235) - . chr(236) - . chr(237) - . chr(238) - . chr(239) - . chr(241) - . chr(242) - . chr(243) - . chr(244) - . chr(245) - . chr(246) - . chr(248) - . chr(249) - . chr(250) - . chr(251) - . chr(252) - . chr(253) - . chr(255); - - $characters['out'] = 'EfSZszYcYuAAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaceeeeiiiinoooooouuuuyy'; - - $string = strtr($string, $characters['in'], $characters['out']); - - $doubleChars = []; - - $doubleChars['in'] = [ - chr(140), - chr(156), - chr(198), - chr(208), - chr(222), - chr(223), - chr(230), - chr(240), - chr(254), - ]; - - $doubleChars['out'] = ['OE', 'oe', 'AE', 'DH', 'TH', 'ss', 'ae', 'dh', 'th']; - - $string = str_replace($doubleChars['in'], $doubleChars['out'], $string); - } - - return $string; - } - - /** - * Convert any passed string to a url friendly string. - * Converts 'My first blog post' to 'my-first-blog-post' - * - * @param string $string String to urlize. - * - * @return string Urlized string. - */ - public function urlize(string $string): string - { - // Remove all non url friendly characters with the unaccent function - $unaccented = $this->unaccent($string); - - if (function_exists('mb_strtolower')) { - $lowered = mb_strtolower($unaccented); - } else { - $lowered = strtolower($unaccented); - } - - $replacements = [ - '/\W/' => ' ', - '/([A-Z]+)([A-Z][a-z])/' => '\1_\2', - '/([a-z\d])([A-Z])/' => '\1_\2', - '/[^A-Z^a-z^0-9^\/]+/' => '-', - ]; - - $urlized = $lowered; - - foreach ($replacements as $pattern => $replacement) { - $replaced = preg_replace($pattern, $replacement, $urlized); - - if ($replaced === null) { - throw new RuntimeException(sprintf( - 'preg_replace returned null for value "%s"', - $urlized - )); - } - - $urlized = $replaced; - } - - return trim($urlized, '-'); - } - - /** - * Returns a word in singular form. - * - * @param string $word The word in plural form. - * - * @return string The word in singular form. - */ - public function singularize(string $word): string - { - return $this->singularizer->inflect($word); - } - - /** - * Returns a word in plural form. - * - * @param string $word The word in singular form. - * - * @return string The word in plural form. - */ - public function pluralize(string $word): string - { - return $this->pluralizer->inflect($word); - } -} diff --git a/plugins/vendor/doctrine/inflector/src/InflectorFactory.php b/plugins/vendor/doctrine/inflector/src/InflectorFactory.php deleted file mode 100644 index 3556b783..00000000 --- a/plugins/vendor/doctrine/inflector/src/InflectorFactory.php +++ /dev/null @@ -1,60 +0,0 @@ -getFlippedSubstitutions() - ); - } - - public static function getPluralRuleset(): Ruleset - { - return new Ruleset( - new Transformations(...Inflectible::getPlural()), - new Patterns(...Uninflected::getPlural()), - new Substitutions(...Inflectible::getIrregular()) - ); - } -} diff --git a/plugins/vendor/doctrine/inflector/src/Rules/English/Uninflected.php b/plugins/vendor/doctrine/inflector/src/Rules/English/Uninflected.php deleted file mode 100644 index 02257de1..00000000 --- a/plugins/vendor/doctrine/inflector/src/Rules/English/Uninflected.php +++ /dev/null @@ -1,189 +0,0 @@ -getFlippedSubstitutions() - ); - } - - public static function getPluralRuleset(): Ruleset - { - return new Ruleset( - new Transformations(...Inflectible::getPlural()), - new Patterns(...Uninflected::getPlural()), - new Substitutions(...Inflectible::getIrregular()) - ); - } -} diff --git a/plugins/vendor/doctrine/inflector/src/Rules/Esperanto/Uninflected.php b/plugins/vendor/doctrine/inflector/src/Rules/Esperanto/Uninflected.php deleted file mode 100644 index ed04c931..00000000 --- a/plugins/vendor/doctrine/inflector/src/Rules/Esperanto/Uninflected.php +++ /dev/null @@ -1,28 +0,0 @@ -getFlippedSubstitutions() - ); - } - - public static function getPluralRuleset(): Ruleset - { - return new Ruleset( - new Transformations(...Inflectible::getPlural()), - new Patterns(...Uninflected::getPlural()), - new Substitutions(...Inflectible::getIrregular()) - ); - } -} diff --git a/plugins/vendor/doctrine/inflector/src/Rules/French/Uninflected.php b/plugins/vendor/doctrine/inflector/src/Rules/French/Uninflected.php deleted file mode 100644 index 1c2b99a3..00000000 --- a/plugins/vendor/doctrine/inflector/src/Rules/French/Uninflected.php +++ /dev/null @@ -1,31 +0,0 @@ - */ - public static function getSingular(): iterable - { - // Reverse of -sce → -scia (fasce → fascia) - yield new Transformation(new Pattern('([aeiou])sce$'), '\\1scia'); - - // Reverse of -cie → -cia (farmacia → farmacie) - yield new Transformation(new Pattern('cie$'), 'cia'); - - // Reverse of -gie → -gia (bugia → bugie) - yield new Transformation(new Pattern('gie$'), 'gia'); - - // Reverse of -ce → -cia (arance → arancia) - yield new Transformation(new Pattern('([^aeiou])ce$'), '\1cia'); - - // Reverse of -ge → -gia (valige → valigia) - yield new Transformation(new Pattern('([^aeiou])ge$'), '\1gia'); - - // Reverse of -chi → -co (bachi → baco) - yield new Transformation(new Pattern('([bcdfghjklmnpqrstvwxyz][aeiou])chi$'), '\1co'); - - // Reverse of -ghi → -go (laghi → lago) - yield new Transformation(new Pattern('([bcdfghjklmnpqrstvwxyz][aeiou])ghi$'), '\1go'); - - // Reverse of -ci → -co (medici → medico) - yield new Transformation(new Pattern('([aeiou][bcdfghjklmnpqrstvwxyz])ci$'), '\1co'); - - // Reverse of -gi → -go (psicologi → psicologo) - yield new Transformation(new Pattern('([aeiou][bcdfghjklmnpqrstvwxyz])gi$'), '\1go'); - - // Reverse of -i → -io (zii → zio, negozi → negozio) - // This is more complex due to Italian's stress patterns, but we'll handle the basic case - yield new Transformation(new Pattern('([^aeiou])i$'), '\1io'); - - // Handle words that end with -i but should go to -co/-go (amici → amico, not amice) - yield new Transformation(new Pattern('([^aeiou])ci$'), '\1co'); - yield new Transformation(new Pattern('([^aeiou])gi$'), '\1go'); - - // Reverse of -a → -e - yield new Transformation(new Pattern('e$'), 'a'); - - // Reverse of -e → -i - yield new Transformation(new Pattern('i$'), 'e'); - - // Reverse of -o → -i - yield new Transformation(new Pattern('i$'), 'o'); - } - - /** @return iterable */ - public static function getPlural(): iterable - { - // Words ending in -scia without stress on 'i' become -sce (e.g. fascia → fasce) - yield new Transformation(new Pattern('([aeiou])scia$'), '\\1sce'); - - // Words ending in -cia/gia with stress on 'i' keep the 'i' in plural - yield new Transformation(new Pattern('cia$'), 'cie'); // e.g. farmacia → farmacie - yield new Transformation(new Pattern('gia$'), 'gie'); // e.g. bugia → bugie - - // Words ending in -cia/gia without stress on 'i' lose the 'i' in plural - yield new Transformation(new Pattern('([^aeiou])cia$'), '\\1ce'); // e.g. arancia → arance - yield new Transformation(new Pattern('([^aeiou])gia$'), '\\1ge'); // e.g. valigia → valige - - // Words ending in -co/-go with stress on 'o' become -chi/-ghi - yield new Transformation(new Pattern('([bcdfghjklmnpqrstvwxyz][aeiou])co$'), '\\1chi'); // e.g. baco → bachi - yield new Transformation(new Pattern('([bcdfghjklmnpqrstvwxyz][aeiou])go$'), '\\1ghi'); // e.g. lago → laghi - - // Words ending in -co/-go with stress on the penultimate syllable become -ci/-gi - yield new Transformation(new Pattern('([aeiou][bcdfghjklmnpqrstvwxyz])co$'), '\\1ci'); // e.g. medico → medici - yield new Transformation(new Pattern('([aeiou][bcdfghjklmnpqrstvwxyz])go$'), '\\1gi'); // e.g. psicologo → psicologi - - // Words ending in -io with stress on 'i' keep the 'i' in plural - yield new Transformation(new Pattern('([^aeiou])io$'), '\\1i'); // e.g. zio → zii - - // Words ending in -io with stress on 'o' lose the 'i' in plural - yield new Transformation(new Pattern('([aeiou])io$'), '\\1i'); // e.g. negozio → negozi - - // Standard ending rules - yield new Transformation(new Pattern('a$'), 'e'); // -a → -e - yield new Transformation(new Pattern('e$'), 'i'); // -e → -i - yield new Transformation(new Pattern('o$'), 'i'); // -o → -i - } - - /** @return iterable */ - public static function getIrregular(): iterable - { - // Irregular substitutions (singular => plural) - $irregulars = [ - 'ala' => 'ali', - 'albergo' => 'alberghi', - 'amica' => 'amiche', - 'amico' => 'amici', - 'ampio' => 'ampi', - 'arancia' => 'arance', - 'arma' => 'armi', - 'asparago' => 'asparagi', - 'banca' => 'banche', - 'belga' => 'belgi', - 'braccio' => 'braccia', - 'budello' => 'budella', - 'bue' => 'buoi', - 'caccia' => 'cacce', - 'calcagno' => 'calcagna', - 'camicia' => 'camicie', - 'cane' => 'cani', - 'capitale' => 'capitali', - 'carcere' => 'carceri', - 'casa' => 'case', - 'cavaliere' => 'cavalieri', - 'centinaio' => 'centinaia', - 'cerchio' => 'cerchia', - 'cervello' => 'cervella', - 'chiave' => 'chiavi', - 'chirurgo' => 'chirurgi', - 'ciglio' => 'ciglia', - 'città' => 'città', - 'corno' => 'corna', - 'corpo' => 'corpi', - 'crisi' => 'crisi', - 'dente' => 'denti', - 'dio' => 'dei', - 'dito' => 'dita', - 'dottore' => 'dottori', - 'fiore' => 'fiori', - 'fratello' => 'fratelli', - 'fuoco' => 'fuochi', - 'gamba' => 'gambe', - 'ginocchio' => 'ginocchia', - 'gioco' => 'giochi', - 'giornale' => 'giornali', - 'giraffa' => 'giraffe', - 'labbro' => 'labbra', - 'lenzuolo' => 'lenzuola', - 'libro' => 'libri', - 'madre' => 'madri', - 'maestro' => 'maestri', - 'magico' => 'magici', - 'mago' => 'maghi', - 'maniaco' => 'maniaci', - 'manico' => 'manici', - 'mano' => 'mani', - 'medico' => 'medici', - 'membro' => 'membri', - 'metropoli' => 'metropoli', - 'migliaio' => 'migliaia', - 'miglio' => 'miglia', - 'mille' => 'mila', - 'mio' => 'miei', - 'moglie' => 'mogli', - 'mosaico' => 'mosaici', - 'muro' => 'muri', - 'nemico' => 'nemici', - 'nome' => 'nomi', - 'occhio' => 'occhi', - 'orecchio' => 'orecchi', - 'osso' => 'ossa', - 'paio' => 'paia', - 'pane' => 'pani', - 'papa' => 'papi', - 'pasta' => 'paste', - 'penna' => 'penne', - 'pesce' => 'pesci', - 'piede' => 'piedi', - 'pittore' => 'pittori', - 'poeta' => 'poeti', - 'porco' => 'porci', - 'porto' => 'porti', - 'problema' => 'problemi', - 'ragazzo' => 'ragazzi', - 're' => 're', - 'rene' => 'reni', - 'riso' => 'risa', - 'rosa' => 'rosa', - 'sale' => 'sali', - 'sarto' => 'sarti', - 'scuola' => 'scuole', - 'serie' => 'serie', - 'serramento' => 'serramenta', - 'sorella' => 'sorelle', - 'specie' => 'specie', - 'staio' => 'staia', - 'stazione' => 'stazioni', - 'strido' => 'strida', - 'strillo' => 'strilla', - 'studio' => 'studi', - 'suo' => 'suoi', - 'superficie' => 'superfici', - 'tavolo' => 'tavoli', - 'tempio' => 'templi', - 'treno' => 'treni', - 'tuo' => 'tuoi', - 'uomo' => 'uomini', - 'uovo' => 'uova', - 'urlo' => 'urla', - 'valigia' => 'valigie', - 'vestigio' => 'vestigia', - 'vino' => 'vini', - 'viola' => 'viola', - 'zio' => 'zii', - ]; - - foreach ($irregulars as $singular => $plural) { - yield new Substitution(new Word($singular), new Word($plural)); - } - } -} diff --git a/plugins/vendor/doctrine/inflector/src/Rules/Italian/InflectorFactory.php b/plugins/vendor/doctrine/inflector/src/Rules/Italian/InflectorFactory.php deleted file mode 100644 index 41685c4a..00000000 --- a/plugins/vendor/doctrine/inflector/src/Rules/Italian/InflectorFactory.php +++ /dev/null @@ -1,21 +0,0 @@ -getFlippedSubstitutions() - ); - } - - public static function getPluralRuleset(): Ruleset - { - return new Ruleset( - new Transformations(...Inflectible::getPlural()), - new Patterns(...Uninflected::getPlural()), - new Substitutions(...Inflectible::getIrregular()) - ); - } -} diff --git a/plugins/vendor/doctrine/inflector/src/Rules/Italian/Uninflected.php b/plugins/vendor/doctrine/inflector/src/Rules/Italian/Uninflected.php deleted file mode 100644 index 067a92a6..00000000 --- a/plugins/vendor/doctrine/inflector/src/Rules/Italian/Uninflected.php +++ /dev/null @@ -1,80 +0,0 @@ - */ - public static function getSingular(): iterable - { - yield from self::getDefault(); - } - - /** @return iterable */ - public static function getPlural(): iterable - { - yield from self::getDefault(); - } - - /** @return iterable */ - private static function getDefault(): iterable - { - // Invariable words (same form in singular and plural) - $invariables = [ - 'alpaca', - 'auto', - 'bar', - 'blu', - 'boia', - 'boomerang', - 'brindisi', - 'campus', - 'computer', - 'crisi', - 'crocevia', - 'dopocena', - 'film', - 'foto', - 'fuchsia', - 'gnu', - 'gorilla', - 'gru', - 'iguana', - 'kamikaze', - 'karaoke', - 'koala', - 'lama', - 'menu', - 'metropoli', - 'moto', - 'opossum', - 'panda', - 'quiz', - 'radio', - 're', - 'scacciapensieri', - 'serie', - 'smartphone', - 'sosia', - 'sottoscala', - 'specie', - 'sport', - 'tablet', - 'taxi', - 'vaglia', - 'virtù', - 'virus', - 'yogurt', - 'foto', - 'fuchsia', - ]; - - foreach ($invariables as $word) { - yield new Pattern($word); - } - } -} diff --git a/plugins/vendor/doctrine/inflector/src/Rules/NorwegianBokmal/Inflectible.php b/plugins/vendor/doctrine/inflector/src/Rules/NorwegianBokmal/Inflectible.php deleted file mode 100644 index 1e952d84..00000000 --- a/plugins/vendor/doctrine/inflector/src/Rules/NorwegianBokmal/Inflectible.php +++ /dev/null @@ -1,34 +0,0 @@ -getFlippedSubstitutions() - ); - } - - public static function getPluralRuleset(): Ruleset - { - return new Ruleset( - new Transformations(...Inflectible::getPlural()), - new Patterns(...Uninflected::getPlural()), - new Substitutions(...Inflectible::getIrregular()) - ); - } -} diff --git a/plugins/vendor/doctrine/inflector/src/Rules/NorwegianBokmal/Uninflected.php b/plugins/vendor/doctrine/inflector/src/Rules/NorwegianBokmal/Uninflected.php deleted file mode 100644 index 5d8d3b3a..00000000 --- a/plugins/vendor/doctrine/inflector/src/Rules/NorwegianBokmal/Uninflected.php +++ /dev/null @@ -1,30 +0,0 @@ -pattern = $pattern; - - if (isset($this->pattern[0]) && $this->pattern[0] === '/') { - $this->regex = $this->pattern; - } else { - $this->regex = '/' . $this->pattern . '/i'; - } - } - - public function getPattern(): string - { - return $this->pattern; - } - - public function getRegex(): string - { - return $this->regex; - } - - public function matches(string $word): bool - { - return preg_match($this->getRegex(), $word) === 1; - } -} diff --git a/plugins/vendor/doctrine/inflector/src/Rules/Patterns.php b/plugins/vendor/doctrine/inflector/src/Rules/Patterns.php deleted file mode 100644 index 16594c4f..00000000 --- a/plugins/vendor/doctrine/inflector/src/Rules/Patterns.php +++ /dev/null @@ -1,29 +0,0 @@ -getPattern(); - }, $patterns); - - $this->regex = '/^(?:' . implode('|', $patterns) . ')$/i'; - } - - public function matches(string $word): bool - { - return preg_match($this->regex, $word, $regs) === 1; - } -} diff --git a/plugins/vendor/doctrine/inflector/src/Rules/Portuguese/Inflectible.php b/plugins/vendor/doctrine/inflector/src/Rules/Portuguese/Inflectible.php deleted file mode 100644 index 0d41fe7e..00000000 --- a/plugins/vendor/doctrine/inflector/src/Rules/Portuguese/Inflectible.php +++ /dev/null @@ -1,98 +0,0 @@ -getFlippedSubstitutions() - ); - } - - public static function getPluralRuleset(): Ruleset - { - return new Ruleset( - new Transformations(...Inflectible::getPlural()), - new Patterns(...Uninflected::getPlural()), - new Substitutions(...Inflectible::getIrregular()) - ); - } -} diff --git a/plugins/vendor/doctrine/inflector/src/Rules/Portuguese/Uninflected.php b/plugins/vendor/doctrine/inflector/src/Rules/Portuguese/Uninflected.php deleted file mode 100644 index b8e988f8..00000000 --- a/plugins/vendor/doctrine/inflector/src/Rules/Portuguese/Uninflected.php +++ /dev/null @@ -1,32 +0,0 @@ -regular = $regular; - $this->uninflected = $uninflected; - $this->irregular = $irregular; - } - - public function getRegular(): Transformations - { - return $this->regular; - } - - public function getUninflected(): Patterns - { - return $this->uninflected; - } - - public function getIrregular(): Substitutions - { - return $this->irregular; - } -} diff --git a/plugins/vendor/doctrine/inflector/src/Rules/Spanish/Inflectible.php b/plugins/vendor/doctrine/inflector/src/Rules/Spanish/Inflectible.php deleted file mode 100644 index 91294609..00000000 --- a/plugins/vendor/doctrine/inflector/src/Rules/Spanish/Inflectible.php +++ /dev/null @@ -1,47 +0,0 @@ -getFlippedSubstitutions() - ); - } - - public static function getPluralRuleset(): Ruleset - { - return new Ruleset( - new Transformations(...Inflectible::getPlural()), - new Patterns(...Uninflected::getPlural()), - new Substitutions(...Inflectible::getIrregular()) - ); - } -} diff --git a/plugins/vendor/doctrine/inflector/src/Rules/Spanish/Uninflected.php b/plugins/vendor/doctrine/inflector/src/Rules/Spanish/Uninflected.php deleted file mode 100644 index c26ebe9c..00000000 --- a/plugins/vendor/doctrine/inflector/src/Rules/Spanish/Uninflected.php +++ /dev/null @@ -1,30 +0,0 @@ -from = $from; - $this->to = $to; - } - - public function getFrom(): Word - { - return $this->from; - } - - public function getTo(): Word - { - return $this->to; - } -} diff --git a/plugins/vendor/doctrine/inflector/src/Rules/Substitutions.php b/plugins/vendor/doctrine/inflector/src/Rules/Substitutions.php deleted file mode 100644 index 17ee2961..00000000 --- a/plugins/vendor/doctrine/inflector/src/Rules/Substitutions.php +++ /dev/null @@ -1,57 +0,0 @@ -substitutions[$substitution->getFrom()->getWord()] = $substitution; - } - } - - public function getFlippedSubstitutions(): Substitutions - { - $substitutions = []; - - foreach ($this->substitutions as $substitution) { - $substitutions[] = new Substitution( - $substitution->getTo(), - $substitution->getFrom() - ); - } - - return new Substitutions(...$substitutions); - } - - public function inflect(string $word): string - { - $lowerWord = strtolower($word); - - if (isset($this->substitutions[$lowerWord])) { - $firstLetterUppercase = $lowerWord[0] !== $word[0]; - - $toWord = $this->substitutions[$lowerWord]->getTo()->getWord(); - - if ($firstLetterUppercase) { - return strtoupper($toWord[0]) . substr($toWord, 1); - } - - return $toWord; - } - - return $word; - } -} diff --git a/plugins/vendor/doctrine/inflector/src/Rules/Transformation.php b/plugins/vendor/doctrine/inflector/src/Rules/Transformation.php deleted file mode 100644 index 30dcd594..00000000 --- a/plugins/vendor/doctrine/inflector/src/Rules/Transformation.php +++ /dev/null @@ -1,39 +0,0 @@ -pattern = $pattern; - $this->replacement = $replacement; - } - - public function getPattern(): Pattern - { - return $this->pattern; - } - - public function getReplacement(): string - { - return $this->replacement; - } - - public function inflect(string $word): string - { - return (string) preg_replace($this->pattern->getRegex(), $this->replacement, $word); - } -} diff --git a/plugins/vendor/doctrine/inflector/src/Rules/Transformations.php b/plugins/vendor/doctrine/inflector/src/Rules/Transformations.php deleted file mode 100644 index b6a48fa8..00000000 --- a/plugins/vendor/doctrine/inflector/src/Rules/Transformations.php +++ /dev/null @@ -1,29 +0,0 @@ -transformations = $transformations; - } - - public function inflect(string $word): string - { - foreach ($this->transformations as $transformation) { - if ($transformation->getPattern()->matches($word)) { - return $transformation->inflect($word); - } - } - - return $word; - } -} diff --git a/plugins/vendor/doctrine/inflector/src/Rules/Turkish/Inflectible.php b/plugins/vendor/doctrine/inflector/src/Rules/Turkish/Inflectible.php deleted file mode 100644 index a2bda0d9..00000000 --- a/plugins/vendor/doctrine/inflector/src/Rules/Turkish/Inflectible.php +++ /dev/null @@ -1,34 +0,0 @@ -getFlippedSubstitutions() - ); - } - - public static function getPluralRuleset(): Ruleset - { - return new Ruleset( - new Transformations(...Inflectible::getPlural()), - new Patterns(...Uninflected::getPlural()), - new Substitutions(...Inflectible::getIrregular()) - ); - } -} diff --git a/plugins/vendor/doctrine/inflector/src/Rules/Turkish/Uninflected.php b/plugins/vendor/doctrine/inflector/src/Rules/Turkish/Uninflected.php deleted file mode 100644 index ec1c37dd..00000000 --- a/plugins/vendor/doctrine/inflector/src/Rules/Turkish/Uninflected.php +++ /dev/null @@ -1,30 +0,0 @@ -word = $word; - } - - public function getWord(): string - { - return $this->word; - } -} diff --git a/plugins/vendor/doctrine/inflector/src/RulesetInflector.php b/plugins/vendor/doctrine/inflector/src/RulesetInflector.php deleted file mode 100644 index 12b2ed5b..00000000 --- a/plugins/vendor/doctrine/inflector/src/RulesetInflector.php +++ /dev/null @@ -1,56 +0,0 @@ -rulesets = array_merge([$ruleset], $rulesets); - } - - public function inflect(string $word): string - { - if ($word === '') { - return ''; - } - - foreach ($this->rulesets as $ruleset) { - if ($ruleset->getUninflected()->matches($word)) { - return $word; - } - - $inflected = $ruleset->getIrregular()->inflect($word); - - if ($inflected !== $word) { - return $inflected; - } - - $inflected = $ruleset->getRegular()->inflect($word); - - if ($inflected !== $word) { - return $inflected; - } - } - - return $word; - } -} diff --git a/plugins/vendor/doctrine/inflector/src/WordInflector.php b/plugins/vendor/doctrine/inflector/src/WordInflector.php deleted file mode 100644 index b88b1d69..00000000 --- a/plugins/vendor/doctrine/inflector/src/WordInflector.php +++ /dev/null @@ -1,10 +0,0 @@ -assertProtocolVersion($version); + if ($this->protocol === $version) { return $this; } @@ -273,6 +275,12 @@ trait MessageTrait )); } + // Convert non-finite floats explicitly, as implicit coercion of + // NAN emits a warning on PHP 8.5. + if (is_float($value) && !is_finite($value)) { + $value = is_nan($value) ? 'NAN' : ($value > 0 ? 'INF' : '-INF'); + } + $trimmed = trim((string) $value, " \t"); $this->assertValue($trimmed); @@ -301,6 +309,23 @@ trait MessageTrait } } + /** + * @param mixed $version + */ + private function assertProtocolVersion($version): void + { + if (is_string($version)) { + $this->assertNoLineSeparators($version, 'Protocol version'); + } + } + + private function assertNoLineSeparators(string $value, string $field): void + { + if (strpbrk($value, "\r\n") !== false) { + throw new \InvalidArgumentException($field.' must not contain CR or LF characters.'); + } + } + /** * @see https://datatracker.ietf.org/doc/html/rfc7230#section-3.2 * diff --git a/plugins/vendor/guzzlehttp/psr7/src/MultipartStream.php b/plugins/vendor/guzzlehttp/psr7/src/MultipartStream.php index 0031da38..c8d4301d 100644 --- a/plugins/vendor/guzzlehttp/psr7/src/MultipartStream.php +++ b/plugins/vendor/guzzlehttp/psr7/src/MultipartStream.php @@ -26,8 +26,9 @@ final class MultipartStream implements StreamInterface * @param array $elements Array of associative arrays, each containing a * required "name" key mapping to the form field, * name, a required "contents" key mapping to any - * non-array value accepted by Utils::streamFor(), - * or an array for nested expansion. + * non-array value accepted by Utils::streamFor() + * (non-string scalar field values are cast to + * string), or an array for nested expansion. * Optional keys include "headers" (associative * array of custom headers) and "filename" (string * to send as the filename in the part). @@ -124,7 +125,27 @@ final class MultipartStream implements StreamInterface return; } - $element['contents'] = Utils::streamFor($element['contents']); + $contents = $element['contents']; + if (is_scalar($contents) && !is_string($contents)) { + // Multipart field values are byte strings on the wire, so finite + // numeric and boolean field values are cast to string here rather + // than tripping streamFor()'s non-string-scalar deprecation. Non-finite + // floats are deprecated and normalized here too, so the deprecation is + // reported against MultipartStream instead of transitively through + // streamFor(). + if (is_float($contents) && !is_finite($contents)) { + \trigger_deprecation( + 'guzzlehttp/psr7', + '2.12', + 'Passing a non-finite float as multipart contents is deprecated; guzzlehttp/psr7 3.0 rejects non-finite floats.' + ); + + $contents = is_nan($contents) ? 'NAN' : ($contents > 0 ? 'INF' : '-INF'); + } + + $contents = (string) $contents; + } + $element['contents'] = Utils::streamFor($contents); if (empty($element['filename'])) { $uri = $element['contents']->getMetadata('uri'); diff --git a/plugins/vendor/guzzlehttp/psr7/src/Query.php b/plugins/vendor/guzzlehttp/psr7/src/Query.php index ccf867a0..a7b8997a 100644 --- a/plugins/vendor/guzzlehttp/psr7/src/Query.php +++ b/plugins/vendor/guzzlehttp/psr7/src/Query.php @@ -96,7 +96,7 @@ final class Query $k = $encoder((string) $k); if (!is_array($v)) { $qs .= $k; - $v = is_bool($v) ? $castBool($v) : $v; + $v = is_bool($v) ? $castBool($v) : self::normalizeNonFiniteFloat($v); if ($v !== null) { $qs .= '='.$encoder((string) $v); } @@ -104,7 +104,7 @@ final class Query } else { foreach ($v as $vv) { $qs .= $k; - $vv = is_bool($vv) ? $castBool($vv) : $vv; + $vv = is_bool($vv) ? $castBool($vv) : self::normalizeNonFiniteFloat($vv); if ($vv !== null) { $qs .= '='.$encoder((string) $vv); } @@ -115,4 +115,27 @@ final class Query return $qs ? (string) substr($qs, 0, -1) : ''; } + + /** + * Converts non-finite floats to the strings PHP coerces them to, as + * implicit coercion of NAN emits a warning on PHP 8.5. + * + * @param mixed $value + * + * @return mixed + */ + private static function normalizeNonFiniteFloat($value) + { + if (is_float($value) && !is_finite($value)) { + \trigger_deprecation( + 'guzzlehttp/psr7', + '2.12', + 'Passing a non-finite float to Query::build() is deprecated; guzzlehttp/psr7 3.0 rejects non-finite floats.' + ); + + return is_nan($value) ? 'NAN' : ($value > 0 ? 'INF' : '-INF'); + } + + return $value; + } } diff --git a/plugins/vendor/guzzlehttp/psr7/src/Request.php b/plugins/vendor/guzzlehttp/psr7/src/Request.php index 64b38f3a..26c51044 100644 --- a/plugins/vendor/guzzlehttp/psr7/src/Request.php +++ b/plugins/vendor/guzzlehttp/psr7/src/Request.php @@ -40,6 +40,8 @@ class Request implements RequestInterface string $version = '1.1' ) { $this->assertMethod($method); + $this->assertProtocolVersion($version); + if (!$uri instanceof UriInterface) { $uri = new Uri($uri); } @@ -78,7 +80,13 @@ class Request implements RequestInterface public function withRequestTarget($requestTarget): RequestInterface { - if (preg_match('#\s#', $requestTarget)) { + $hasWhitespace = preg_match('#\s#', $requestTarget); + + if ($hasWhitespace === false) { + throw new \RuntimeException('Unable to validate request target: '.preg_last_error_msg()); + } + + if ($hasWhitespace === 1) { throw new InvalidArgumentException( 'Invalid request target provided; cannot contain whitespace' ); @@ -170,6 +178,8 @@ class Request implements RequestInterface if (!is_string($method) || $method === '') { throw new InvalidArgumentException('Method must be a non-empty string.'); } + + $this->assertNoLineSeparators($method, 'Method'); } private static function warnOnMethodCasingChange(string $method): void diff --git a/plugins/vendor/guzzlehttp/psr7/src/Response.php b/plugins/vendor/guzzlehttp/psr7/src/Response.php index 8beec966..4bec8163 100644 --- a/plugins/vendor/guzzlehttp/psr7/src/Response.php +++ b/plugins/vendor/guzzlehttp/psr7/src/Response.php @@ -99,6 +99,7 @@ class Response implements ResponseInterface ?string $reason = null ) { $this->assertStatusCodeRange($status); + $this->assertProtocolVersion($version); $this->statusCode = $status; @@ -108,11 +109,14 @@ class Response implements ResponseInterface $this->setHeaders($headers); if ($reason == '' && isset(self::PHRASES[$this->statusCode])) { - $this->reasonPhrase = self::PHRASES[$this->statusCode]; + $reasonPhrase = self::PHRASES[$this->statusCode]; } else { - $this->reasonPhrase = (string) $reason; + $reasonPhrase = (string) $reason; } + $this->assertNoLineSeparators($reasonPhrase, 'Reason phrase'); + $this->reasonPhrase = $reasonPhrase; + $this->protocol = $version; } @@ -155,7 +159,9 @@ class Response implements ResponseInterface if ($reasonPhrase == '' && isset(self::PHRASES[$new->statusCode])) { $reasonPhrase = self::PHRASES[$new->statusCode]; } - $new->reasonPhrase = (string) $reasonPhrase; + $reasonPhrase = (string) $reasonPhrase; + $this->assertNoLineSeparators($reasonPhrase, 'Reason phrase'); + $new->reasonPhrase = $reasonPhrase; return $new; } diff --git a/plugins/vendor/guzzlehttp/psr7/src/Rfc7230.php b/plugins/vendor/guzzlehttp/psr7/src/Rfc7230.php index 9cd48633..6557f905 100644 --- a/plugins/vendor/guzzlehttp/psr7/src/Rfc7230.php +++ b/plugins/vendor/guzzlehttp/psr7/src/Rfc7230.php @@ -68,7 +68,13 @@ final class Rfc7230 private static function isValidHostHeaderHost(string $host): bool { - if (preg_match('/[\x00-\x20\x7F\/\?#@\\\\]/', $host)) { + $invalidHost = preg_match('/[\x00-\x20\x7F\/\?#@\\\\]/', $host); + + if ($invalidHost === false) { + return false; + } + + if ($invalidHost === 1) { return false; } diff --git a/plugins/vendor/guzzlehttp/psr7/src/Uri.php b/plugins/vendor/guzzlehttp/psr7/src/Uri.php index 332cdf5c..24bd4aa1 100644 --- a/plugins/vendor/guzzlehttp/psr7/src/Uri.php +++ b/plugins/vendor/guzzlehttp/psr7/src/Uri.php @@ -101,10 +101,22 @@ class Uri implements UriInterface, \JsonSerializable // Preserve bracketed IPv6 literals before encoding, including dotted IPv4 tails. $prefix = ''; - if (preg_match('%^([0-9A-Za-z+.-]+://\[[0-9:.a-fA-F]+\])(.*?)$%', $url, $matches)) { + $ipv6Prefix = preg_match('%\A([0-9A-Za-z+.-]+://\[[^\]\x00-\x20/?#@]+\])(.*)\z%s', $url, $matches); + + if ($ipv6Prefix === false) { + return false; + } + + if ($ipv6Prefix === 1) { /** @var array{0:string, 1:string, 2:string} $matches */ + $suffix = $matches[2]; + + if ($suffix !== '' && strpos(':/?#', $suffix[0]) === false) { + return false; + } + $prefix = $matches[1]; - $url = $matches[2]; + $url = $suffix; } /** @var string|null */ @@ -371,12 +383,38 @@ class Uri implements UriInterface, \JsonSerializable $result = self::getFilteredQueryString($uri, array_keys($keyValueArray)); foreach ($keyValueArray as $key => $value) { - $result[] = self::generateQueryString((string) $key, $value !== null ? (string) $value : null); + $result[] = self::generateQueryString((string) $key, $value !== null ? self::stringifyQueryValue($value) : null); } return $uri->withQuery(implode('&', $result)); } + /** + * Stringifies a non-null query value, deprecating non-string values that + * guzzlehttp/psr7 3.0 will reject. Non-finite floats are normalized to the + * strings PHP coerces them to, as implicit coercion of NAN emits a warning + * on PHP 8.5. + * + * @param mixed $value + */ + private static function stringifyQueryValue($value): string + { + if (!is_string($value)) { + \trigger_deprecation( + 'guzzlehttp/psr7', + '2.12', + 'Passing %s to Uri::withQueryValues() is deprecated; cast it to a string. guzzlehttp/psr7 3.0 will only accept string or null query values.', + \gettype($value) + ); + + if (is_float($value) && !is_finite($value)) { + return is_nan($value) ? 'NAN' : ($value > 0 ? 'INF' : '-INF'); + } + } + + return (string) $value; + } + /** * Creates a URI from a hash of `parse_url` components. * @@ -410,7 +448,27 @@ class Uri implements UriInterface, \JsonSerializable return; } - if (preg_match('/[\x00-\x20\x7F]/', $host)) { + // Reject control characters and URI authority delimiters so getHost() + // cannot disagree with the on-wire authority. + $invalidHost = preg_match('/[\x00-\x20\x7F\/\?#@\\\\]/', $host); + + if ($invalidHost === false) { + throw new \RuntimeException('Unable to validate URI host: '.preg_last_error_msg()); + } + + if ($invalidHost === 1) { + throw new \InvalidArgumentException(sprintf('Invalid host: "%s"', $host)); + } + + if (strpos($host, '[') !== false || strpos($host, ']') !== false) { + if ($host[0] !== '[' || substr($host, -1) !== ']') { + throw new \InvalidArgumentException(sprintf('Invalid host: "%s"', $host)); + } + + return; + } + + if (strpos($host, ':') !== false) { throw new \InvalidArgumentException(sprintf('Invalid host: "%s"', $host)); } } @@ -657,10 +715,10 @@ class Uri implements UriInterface, \JsonSerializable throw new \InvalidArgumentException('User info must be a string'); } - return preg_replace_callback( + return $this->filterComponent( '/(?:[^%'.Rfc3986::CHAR_UNRESERVED.Rfc3986::CHAR_SUB_DELIMS.']+|%(?![A-Fa-f0-9]{2}))/', - [$this, 'rawurlencodeMatchZero'], - $component + $component, + 'Unable to filter URI user info' ); } @@ -759,10 +817,10 @@ class Uri implements UriInterface, \JsonSerializable throw new \InvalidArgumentException('Path must be a string'); } - return preg_replace_callback( + return $this->filterComponent( '/(?:[^'.Rfc3986::CHAR_UNRESERVED.Rfc3986::CHAR_SUB_DELIMS.'%:@\/]++|%(?![A-Fa-f0-9]{2}))/', - [$this, 'rawurlencodeMatchZero'], - $path + $path, + 'Unable to filter URI path' ); } @@ -779,13 +837,24 @@ class Uri implements UriInterface, \JsonSerializable throw new \InvalidArgumentException('Query and fragment must be a string'); } - return preg_replace_callback( + return $this->filterComponent( '/(?:[^'.Rfc3986::CHAR_UNRESERVED.Rfc3986::CHAR_SUB_DELIMS.'%:@\/\?]++|%(?![A-Fa-f0-9]{2}))/', - [$this, 'rawurlencodeMatchZero'], - $str + $str, + 'Unable to filter URI query or fragment' ); } + private function filterComponent(string $pattern, string $component, string $context): string + { + $filtered = preg_replace_callback($pattern, [$this, 'rawurlencodeMatchZero'], $component); + + if ($filtered === null) { + throw new \RuntimeException($context.': '.preg_last_error_msg()); + } + + return $filtered; + } + private function rawurlencodeMatchZero(array $match): string { return rawurlencode($match[0]); diff --git a/plugins/vendor/guzzlehttp/psr7/src/UriNormalizer.php b/plugins/vendor/guzzlehttp/psr7/src/UriNormalizer.php index 0764d983..bfa1808d 100644 --- a/plugins/vendor/guzzlehttp/psr7/src/UriNormalizer.php +++ b/plugins/vendor/guzzlehttp/psr7/src/UriNormalizer.php @@ -150,7 +150,13 @@ final class UriNormalizer } if ($flags & self::REMOVE_DUPLICATE_SLASHES) { - $uri = $uri->withPath(preg_replace('#//++#', '/', $uri->getPath())); + $path = preg_replace('#//++#', '/', $uri->getPath()); + + if ($path === null) { + throw new \RuntimeException('Unable to remove duplicate slashes from URI path: '.preg_last_error_msg()); + } + + $uri = $uri->withPath($path); } if ($flags & self::SORT_QUERY_PARAMETERS && $uri->getQuery() !== '') { @@ -217,7 +223,7 @@ final class UriNormalizer $normalized = preg_replace_callback($regex, $callback, $component); if ($normalized === null) { - throw new \RuntimeException('Unable to normalize URI component percent-encoding'); + throw new \RuntimeException('Unable to normalize URI component percent-encoding: '.preg_last_error_msg()); } return $normalized; diff --git a/plugins/vendor/guzzlehttp/psr7/src/Utils.php b/plugins/vendor/guzzlehttp/psr7/src/Utils.php index 5e22e244..4c6357f7 100644 --- a/plugins/vendor/guzzlehttp/psr7/src/Utils.php +++ b/plugins/vendor/guzzlehttp/psr7/src/Utils.php @@ -462,6 +462,9 @@ final class Utils * in subsequent reads. String inputs are always treated as string bodies, * even when they name callable functions. * + * Passing a non-string scalar (`int`, `float`, or `bool`) is deprecated; cast + * it to a string instead. guzzlehttp/psr7 3.0 will reject non-string scalars. + * * @param resource|string|int|float|bool|StreamInterface|callable|\Iterator|null $resource Entity body data * @param array{size?: int, metadata?: array} $options Additional options * @@ -470,6 +473,22 @@ final class Utils public static function streamFor($resource = '', array $options = []): StreamInterface { if (is_scalar($resource)) { + if (!is_string($resource)) { + \trigger_deprecation( + 'guzzlehttp/psr7', + '2.12', + 'Passing %s to Utils::streamFor() is deprecated; cast it to a string. guzzlehttp/psr7 3.0 will only accept string, resource, StreamInterface, Stringable, Iterator, callable, or null.', + \gettype($resource) + ); + + if (is_float($resource) && !is_finite($resource)) { + // Normalized only to avoid PHP 8.5's (string) NAN warning + // while deprecated; 3.0 rejects non-finite floats with every + // other non-string scalar. + $resource = is_nan($resource) ? 'NAN' : ($resource > 0 ? 'INF' : '-INF'); + } + } + $stream = self::tryFopen('php://temp', 'r+'); if ($resource !== '') { fwrite($stream, (string) $resource); diff --git a/plugins/vendor/illuminate/pagination/AbstractCursorPaginator.php b/plugins/vendor/illuminate/pagination/AbstractCursorPaginator.php deleted file mode 100644 index 84c8ec03..00000000 --- a/plugins/vendor/illuminate/pagination/AbstractCursorPaginator.php +++ /dev/null @@ -1,688 +0,0 @@ - - */ -abstract class AbstractCursorPaginator implements Htmlable, Stringable -{ - use ForwardsCalls, Tappable, TransformsToResourceCollection; - - /** - * All of the items being paginated. - * - * @var \Illuminate\Support\Collection - */ - protected $items; - - /** - * The number of items to be shown per page. - * - * @var int - */ - protected $perPage; - - /** - * The base path to assign to all URLs. - * - * @var string - */ - protected $path = '/'; - - /** - * The query parameters to add to all URLs. - * - * @var array - */ - protected $query = []; - - /** - * The URL fragment to add to all URLs. - * - * @var string|null - */ - protected $fragment; - - /** - * The cursor string variable used to store the page. - * - * @var string - */ - protected $cursorName = 'cursor'; - - /** - * The current cursor. - * - * @var \Illuminate\Pagination\Cursor|null - */ - protected $cursor; - - /** - * The paginator parameters for the cursor. - * - * @var array - */ - protected $parameters; - - /** - * The paginator options. - * - * @var array - */ - protected $options; - - /** - * The current cursor resolver callback. - * - * @var \Closure - */ - protected static $currentCursorResolver; - - /** - * Get the URL for a given cursor. - * - * @param \Illuminate\Pagination\Cursor|null $cursor - * @return string - */ - public function url($cursor) - { - // If we have any extra query string key / value pairs that need to be added - // onto the URL, we will put them in query string form and then attach it - // to the URL. This allows for extra information like sortings storage. - $parameters = is_null($cursor) ? [] : [$this->cursorName => $cursor->encode()]; - - if (count($this->query) > 0) { - $parameters = array_merge($this->query, $parameters); - } - - return $this->path() - .(str_contains($this->path(), '?') ? '&' : '?') - .Arr::query($parameters) - .$this->buildFragment(); - } - - /** - * Get the URL for the previous page. - * - * @return string|null - */ - public function previousPageUrl() - { - if (is_null($previousCursor = $this->previousCursor())) { - return null; - } - - return $this->url($previousCursor); - } - - /** - * The URL for the next page, or null. - * - * @return string|null - */ - public function nextPageUrl() - { - if (is_null($nextCursor = $this->nextCursor())) { - return null; - } - - return $this->url($nextCursor); - } - - /** - * Get the "cursor" that points to the previous set of items. - * - * @return \Illuminate\Pagination\Cursor|null - */ - public function previousCursor() - { - if (is_null($this->cursor) || - ($this->cursor->pointsToPreviousItems() && ! $this->hasMore)) { - return null; - } - - if ($this->items->isEmpty()) { - return null; - } - - return $this->getCursorForItem($this->items->first(), false); - } - - /** - * Get the "cursor" that points to the next set of items. - * - * @return \Illuminate\Pagination\Cursor|null - */ - public function nextCursor() - { - if ((is_null($this->cursor) && ! $this->hasMore) || - (! is_null($this->cursor) && $this->cursor->pointsToNextItems() && ! $this->hasMore)) { - return null; - } - - if ($this->items->isEmpty()) { - return null; - } - - return $this->getCursorForItem($this->items->last(), true); - } - - /** - * Get a cursor instance for the given item. - * - * @param \ArrayAccess|\stdClass $item - * @param bool $isNext - * @return \Illuminate\Pagination\Cursor - */ - public function getCursorForItem($item, $isNext = true) - { - return new Cursor($this->getParametersForItem($item), $isNext); - } - - /** - * Get the cursor parameters for a given object. - * - * @param \ArrayAccess|\stdClass $item - * @return array - * - * @throws \Exception - */ - public function getParametersForItem($item) - { - return (new Collection($this->parameters)) - ->filter() - ->flip() - ->map(function ($_, $parameterName) use ($item) { - if ($item instanceof JsonResource) { - $item = $item->resource; - } - - if ($item instanceof Model && - ! is_null($parameter = $this->getPivotParameterForItem($item, $parameterName))) { - return $parameter; - } elseif ($item instanceof ArrayAccess || is_array($item)) { - return $this->ensureParameterIsPrimitive( - $item[$parameterName] ?? $item[Str::afterLast($parameterName, '.')] - ); - } elseif (is_object($item)) { - return $this->ensureParameterIsPrimitive( - $item->{$parameterName} ?? $item->{Str::afterLast($parameterName, '.')} - ); - } - - throw new Exception('Only arrays and objects are supported when cursor paginating items.'); - })->toArray(); - } - - /** - * Get the cursor parameter value from a pivot model if applicable. - * - * @param \ArrayAccess|\stdClass $item - * @param string $parameterName - * @return string|null - */ - protected function getPivotParameterForItem($item, $parameterName) - { - $table = Str::beforeLast($parameterName, '.'); - - foreach ($item->getRelations() as $relation) { - if ($relation instanceof Pivot && $relation->getTable() === $table) { - return $this->ensureParameterIsPrimitive( - $relation->getAttribute(Str::afterLast($parameterName, '.')) - ); - } - } - } - - /** - * Ensure the parameter is a primitive type. - * - * This can resolve issues that arise the developer uses a value object for an attribute. - * - * @param mixed $parameter - * @return mixed - */ - protected function ensureParameterIsPrimitive($parameter) - { - return is_object($parameter) && method_exists($parameter, '__toString') - ? (string) $parameter - : $parameter; - } - - /** - * Get / set the URL fragment to be appended to URLs. - * - * @param string|null $fragment - * @return $this|string|null - */ - public function fragment($fragment = null) - { - if (is_null($fragment)) { - return $this->fragment; - } - - $this->fragment = $fragment; - - return $this; - } - - /** - * Add a set of query string values to the paginator. - * - * @param array|string|null $key - * @param string|null $value - * @return $this - */ - public function appends($key, $value = null) - { - if (is_null($key)) { - return $this; - } - - if (is_array($key)) { - return $this->appendArray($key); - } - - return $this->addQuery($key, $value); - } - - /** - * Add an array of query string values. - * - * @param array $keys - * @return $this - */ - protected function appendArray(array $keys) - { - foreach ($keys as $key => $value) { - $this->addQuery($key, $value); - } - - return $this; - } - - /** - * Add all current query string values to the paginator. - * - * @return $this - */ - public function withQueryString() - { - if (! is_null($query = Paginator::resolveQueryString())) { - return $this->appends($query); - } - - return $this; - } - - /** - * Add a query string value to the paginator. - * - * @param string $key - * @param string $value - * @return $this - */ - protected function addQuery($key, $value) - { - if ($key !== $this->cursorName) { - $this->query[$key] = $value; - } - - return $this; - } - - /** - * Build the full fragment portion of a URL. - * - * @return string - */ - protected function buildFragment() - { - return $this->fragment ? '#'.$this->fragment : ''; - } - - /** - * Load a set of relationships onto the mixed relationship collection. - * - * @param string $relation - * @param array $relations - * @return $this - */ - public function loadMorph($relation, $relations) - { - $this->getCollection()->loadMorph($relation, $relations); - - return $this; - } - - /** - * Load a set of relationship counts onto the mixed relationship collection. - * - * @param string $relation - * @param array $relations - * @return $this - */ - public function loadMorphCount($relation, $relations) - { - $this->getCollection()->loadMorphCount($relation, $relations); - - return $this; - } - - /** - * Get the slice of items being paginated. - * - * @return array - */ - public function items() - { - return $this->items->all(); - } - - /** - * Transform each item in the slice of items using a callback. - * - * @template TThroughValue - * - * @param callable(TValue, TKey): TThroughValue $callback - * @return $this - * - * @phpstan-this-out static - */ - public function through(callable $callback) - { - $this->items->transform($callback); - - return $this; - } - - /** - * Get the number of items shown per page. - * - * @return int - */ - public function perPage() - { - return $this->perPage; - } - - /** - * Get the current cursor being paginated. - * - * @return \Illuminate\Pagination\Cursor|null - */ - public function cursor() - { - return $this->cursor; - } - - /** - * Get the query string variable used to store the cursor. - * - * @return string - */ - public function getCursorName() - { - return $this->cursorName; - } - - /** - * Set the query string variable used to store the cursor. - * - * @param string $name - * @return $this - */ - public function setCursorName($name) - { - $this->cursorName = $name; - - return $this; - } - - /** - * Set the base path to assign to all URLs. - * - * @param string $path - * @return $this - */ - public function withPath($path) - { - return $this->setPath($path); - } - - /** - * Set the base path to assign to all URLs. - * - * @param string $path - * @return $this - */ - public function setPath($path) - { - $this->path = $path; - - return $this; - } - - /** - * Get the base path for paginator generated URLs. - * - * @return string|null - */ - public function path() - { - return $this->path; - } - - /** - * Resolve the current cursor or return the default value. - * - * @param string $cursorName - * @param \Illuminate\Pagination\Cursor|null $default - * @return \Illuminate\Pagination\Cursor|null - */ - public static function resolveCurrentCursor($cursorName = 'cursor', $default = null) - { - if (isset(static::$currentCursorResolver)) { - return call_user_func(static::$currentCursorResolver, $cursorName); - } - - return $default; - } - - /** - * Set the current cursor resolver callback. - * - * @param \Closure $resolver - * @return void - */ - public static function currentCursorResolver(Closure $resolver) - { - static::$currentCursorResolver = $resolver; - } - - /** - * Get an instance of the view factory from the resolver. - * - * @return \Illuminate\Contracts\View\Factory - */ - public static function viewFactory() - { - return Paginator::viewFactory(); - } - - /** - * Get an iterator for the items. - * - * @return \ArrayIterator - */ - public function getIterator(): Traversable - { - return $this->items->getIterator(); - } - - /** - * Determine if the list of items is empty. - * - * @return bool - */ - public function isEmpty() - { - return $this->items->isEmpty(); - } - - /** - * Determine if the list of items is not empty. - * - * @return bool - */ - public function isNotEmpty() - { - return $this->items->isNotEmpty(); - } - - /** - * Get the number of items for the current page. - * - * @return int - */ - public function count(): int - { - return $this->items->count(); - } - - /** - * Get the paginator's underlying collection. - * - * @return \Illuminate\Support\Collection - */ - public function getCollection() - { - return $this->items; - } - - /** - * Set the paginator's underlying collection. - * - * @template TSetKey of array-key - * @template TSetValue - * - * @param \Illuminate\Support\Collection $collection - * @return $this - * - * @phpstan-this-out static - */ - public function setCollection(Collection $collection) - { - $this->items = $collection; - - return $this; - } - - /** - * Get the paginator options. - * - * @return array - */ - public function getOptions() - { - return $this->options; - } - - /** - * Determine if the given item exists. - * - * @param TKey $key - * @return bool - */ - public function offsetExists($key): bool - { - return $this->items->has($key); - } - - /** - * Get the item at the given offset. - * - * @param TKey $key - * @return TValue|null - */ - public function offsetGet($key): mixed - { - return $this->items->get($key); - } - - /** - * Set the item at the given offset. - * - * @param TKey|null $key - * @param TValue $value - * @return void - */ - public function offsetSet($key, $value): void - { - $this->items->put($key, $value); - } - - /** - * Unset the item at the given key. - * - * @param TKey $key - * @return void - */ - public function offsetUnset($key): void - { - $this->items->forget($key); - } - - /** - * Render the contents of the paginator to HTML. - * - * @return string - */ - public function toHtml() - { - return (string) $this->render(); - } - - /** - * Make dynamic calls into the collection. - * - * @param string $method - * @param array $parameters - * @return mixed - */ - public function __call($method, $parameters) - { - return $this->forwardCallTo($this->getCollection(), $method, $parameters); - } - - /** - * Render the contents of the paginator when casting to a string. - * - * @return string - */ - public function __toString() - { - return (string) $this->render(); - } -} diff --git a/plugins/vendor/illuminate/pagination/AbstractPaginator.php b/plugins/vendor/illuminate/pagination/AbstractPaginator.php deleted file mode 100644 index bce700f7..00000000 --- a/plugins/vendor/illuminate/pagination/AbstractPaginator.php +++ /dev/null @@ -1,830 +0,0 @@ - - */ -abstract class AbstractPaginator implements CanBeEscapedWhenCastToString, Htmlable, Stringable -{ - use ForwardsCalls, Tappable, TransformsToResourceCollection; - - /** - * All of the items being paginated. - * - * @var \Illuminate\Support\Collection - */ - protected $items; - - /** - * The number of items to be shown per page. - * - * @var int - */ - protected $perPage; - - /** - * The current page being "viewed". - * - * @var int - */ - protected $currentPage; - - /** - * The base path to assign to all URLs. - * - * @var string - */ - protected $path = '/'; - - /** - * The query parameters to add to all URLs. - * - * @var array - */ - protected $query = []; - - /** - * The URL fragment to add to all URLs. - * - * @var string|null - */ - protected $fragment; - - /** - * The query string variable used to store the page. - * - * @var string - */ - protected $pageName = 'page'; - - /** - * Indicates that the paginator's string representation should be escaped when __toString is invoked. - * - * @var bool - */ - protected $escapeWhenCastingToString = false; - - /** - * The number of links to display on each side of current page link. - * - * @var int - */ - public $onEachSide = 3; - - /** - * The paginator options. - * - * @var array - */ - protected $options; - - /** - * The current path resolver callback. - * - * @var \Closure - */ - protected static $currentPathResolver; - - /** - * The current page resolver callback. - * - * @var \Closure - */ - protected static $currentPageResolver; - - /** - * The query string resolver callback. - * - * @var \Closure - */ - protected static $queryStringResolver; - - /** - * The view factory resolver callback. - * - * @var \Closure - */ - protected static $viewFactoryResolver; - - /** - * The default pagination view. - * - * @var string - */ - public static $defaultView = 'pagination::tailwind'; - - /** - * The default "simple" pagination view. - * - * @var string - */ - public static $defaultSimpleView = 'pagination::simple-tailwind'; - - /** - * Determine if the given value is a valid page number. - * - * @param int $page - * @return bool - */ - protected function isValidPageNumber($page) - { - return $page >= 1 && filter_var($page, FILTER_VALIDATE_INT) !== false; - } - - /** - * Get the URL for the previous page. - * - * @return string|null - */ - public function previousPageUrl() - { - if ($this->currentPage() > 1) { - return $this->url($this->currentPage() - 1); - } - } - - /** - * Create a range of pagination URLs. - * - * @param int $start - * @param int $end - * @return array - */ - public function getUrlRange($start, $end) - { - return Collection::range($start, $end) - ->mapWithKeys(fn ($page) => [$page => $this->url($page)]) - ->all(); - } - - /** - * Get the URL for a given page number. - * - * @param int $page - * @return string - */ - public function url($page) - { - if ($page <= 0) { - $page = 1; - } - - // If we have any extra query string key / value pairs that need to be added - // onto the URL, we will put them in query string form and then attach it - // to the URL. This allows for extra information like sortings storage. - $parameters = [$this->pageName => $page]; - - if (count($this->query) > 0) { - $parameters = array_merge($this->query, $parameters); - } - - return $this->path() - .(str_contains($this->path(), '?') ? '&' : '?') - .Arr::query($parameters) - .$this->buildFragment(); - } - - /** - * Get / set the URL fragment to be appended to URLs. - * - * @param string|null $fragment - * @return $this|string|null - */ - public function fragment($fragment = null) - { - if (is_null($fragment)) { - return $this->fragment; - } - - $this->fragment = $fragment; - - return $this; - } - - /** - * Add a set of query string values to the paginator. - * - * @param array|string|null $key - * @param string|null $value - * @return $this - */ - public function appends($key, $value = null) - { - if (is_null($key)) { - return $this; - } - - if (is_array($key)) { - return $this->appendArray($key); - } - - return $this->addQuery($key, $value); - } - - /** - * Add an array of query string values. - * - * @param array $keys - * @return $this - */ - protected function appendArray(array $keys) - { - foreach ($keys as $key => $value) { - $this->addQuery($key, $value); - } - - return $this; - } - - /** - * Add all current query string values to the paginator. - * - * @return $this - */ - public function withQueryString() - { - if (isset(static::$queryStringResolver)) { - return $this->appends(call_user_func(static::$queryStringResolver)); - } - - return $this; - } - - /** - * Add a query string value to the paginator. - * - * @param string $key - * @param string $value - * @return $this - */ - protected function addQuery($key, $value) - { - if ($key !== $this->pageName) { - $this->query[$key] = $value; - } - - return $this; - } - - /** - * Build the full fragment portion of a URL. - * - * @return string - */ - protected function buildFragment() - { - return $this->fragment ? '#'.$this->fragment : ''; - } - - /** - * Load a set of relationships onto the mixed relationship collection. - * - * @param string $relation - * @param array $relations - * @return $this - */ - public function loadMorph($relation, $relations) - { - $this->getCollection()->loadMorph($relation, $relations); - - return $this; - } - - /** - * Load a set of relationship counts onto the mixed relationship collection. - * - * @param string $relation - * @param array $relations - * @return $this - */ - public function loadMorphCount($relation, $relations) - { - $this->getCollection()->loadMorphCount($relation, $relations); - - return $this; - } - - /** - * Get the slice of items being paginated. - * - * @return array - */ - public function items() - { - return $this->items->all(); - } - - /** - * Get the number of the first item in the slice. - * - * @return int|null - */ - public function firstItem() - { - return count($this->items) > 0 ? ($this->currentPage - 1) * $this->perPage + 1 : null; - } - - /** - * Get the number of the last item in the slice. - * - * @return int|null - */ - public function lastItem() - { - return count($this->items) > 0 ? $this->firstItem() + $this->count() - 1 : null; - } - - /** - * Transform each item in the slice of items using a callback. - * - * @template TMapValue - * - * @param callable(TValue, TKey): TMapValue $callback - * @return $this - * - * @phpstan-this-out static - */ - public function through(callable $callback) - { - $this->items->transform($callback); - - return $this; - } - - /** - * Get the number of items shown per page. - * - * @return int - */ - public function perPage() - { - return $this->perPage; - } - - /** - * Determine if there are enough items to split into multiple pages. - * - * @return bool - */ - public function hasPages() - { - return $this->currentPage() != 1 || $this->hasMorePages(); - } - - /** - * Determine if the paginator is on the first page. - * - * @return bool - */ - public function onFirstPage() - { - return $this->currentPage() <= 1; - } - - /** - * Determine if the paginator is on the last page. - * - * @return bool - */ - public function onLastPage() - { - return ! $this->hasMorePages(); - } - - /** - * Get the current page. - * - * @return int - */ - public function currentPage() - { - return $this->currentPage; - } - - /** - * Get the query string variable used to store the page. - * - * @return string - */ - public function getPageName() - { - return $this->pageName; - } - - /** - * Set the query string variable used to store the page. - * - * @param string $name - * @return $this - */ - public function setPageName($name) - { - $this->pageName = $name; - - return $this; - } - - /** - * Set the base path to assign to all URLs. - * - * @param string $path - * @return $this - */ - public function withPath($path) - { - return $this->setPath($path); - } - - /** - * Set the base path to assign to all URLs. - * - * @param string $path - * @return $this - */ - public function setPath($path) - { - $this->path = $path; - - return $this; - } - - /** - * Set the number of links to display on each side of current page link. - * - * @param int $count - * @return $this - */ - public function onEachSide($count) - { - $this->onEachSide = $count; - - return $this; - } - - /** - * Get the base path for paginator generated URLs. - * - * @return string|null - */ - public function path() - { - return $this->path; - } - - /** - * Resolve the current request path or return the default value. - * - * @param string $default - * @return string - */ - public static function resolveCurrentPath($default = '/') - { - if (isset(static::$currentPathResolver)) { - return call_user_func(static::$currentPathResolver); - } - - return $default; - } - - /** - * Set the current request path resolver callback. - * - * @param \Closure $resolver - * @return void - */ - public static function currentPathResolver(Closure $resolver) - { - static::$currentPathResolver = $resolver; - } - - /** - * Resolve the current page or return the default value. - * - * @param string $pageName - * @param int $default - * @return int - */ - public static function resolveCurrentPage($pageName = 'page', $default = 1) - { - if (isset(static::$currentPageResolver)) { - return (int) call_user_func(static::$currentPageResolver, $pageName); - } - - return $default; - } - - /** - * Set the current page resolver callback. - * - * @param \Closure $resolver - * @return void - */ - public static function currentPageResolver(Closure $resolver) - { - static::$currentPageResolver = $resolver; - } - - /** - * Resolve the query string or return the default value. - * - * @param string|array|null $default - * @return string - */ - public static function resolveQueryString($default = null) - { - if (isset(static::$queryStringResolver)) { - return (static::$queryStringResolver)(); - } - - return $default; - } - - /** - * Set with query string resolver callback. - * - * @param \Closure $resolver - * @return void - */ - public static function queryStringResolver(Closure $resolver) - { - static::$queryStringResolver = $resolver; - } - - /** - * Get an instance of the view factory from the resolver. - * - * @return \Illuminate\Contracts\View\Factory - */ - public static function viewFactory() - { - return call_user_func(static::$viewFactoryResolver); - } - - /** - * Set the view factory resolver callback. - * - * @param \Closure $resolver - * @return void - */ - public static function viewFactoryResolver(Closure $resolver) - { - static::$viewFactoryResolver = $resolver; - } - - /** - * Set the default pagination view. - * - * @param string $view - * @return void - */ - public static function defaultView($view) - { - static::$defaultView = $view; - } - - /** - * Set the default "simple" pagination view. - * - * @param string $view - * @return void - */ - public static function defaultSimpleView($view) - { - static::$defaultSimpleView = $view; - } - - /** - * Indicate that Tailwind styling should be used for generated links. - * - * @return void - */ - public static function useTailwind() - { - static::defaultView('pagination::tailwind'); - static::defaultSimpleView('pagination::simple-tailwind'); - } - - /** - * Indicate that Bootstrap 4 styling should be used for generated links. - * - * @return void - */ - public static function useBootstrap() - { - static::useBootstrapFour(); - } - - /** - * Indicate that Bootstrap 3 styling should be used for generated links. - * - * @return void - */ - public static function useBootstrapThree() - { - static::defaultView('pagination::default'); - static::defaultSimpleView('pagination::simple-default'); - } - - /** - * Indicate that Bootstrap 4 styling should be used for generated links. - * - * @return void - */ - public static function useBootstrapFour() - { - static::defaultView('pagination::bootstrap-4'); - static::defaultSimpleView('pagination::simple-bootstrap-4'); - } - - /** - * Indicate that Bootstrap 5 styling should be used for generated links. - * - * @return void - */ - public static function useBootstrapFive() - { - static::defaultView('pagination::bootstrap-5'); - static::defaultSimpleView('pagination::simple-bootstrap-5'); - } - - /** - * Get an iterator for the items. - * - * @return \ArrayIterator - */ - public function getIterator(): Traversable - { - return $this->items->getIterator(); - } - - /** - * Determine if the list of items is empty. - * - * @return bool - */ - public function isEmpty() - { - return $this->items->isEmpty(); - } - - /** - * Determine if the list of items is not empty. - * - * @return bool - */ - public function isNotEmpty() - { - return $this->items->isNotEmpty(); - } - - /** - * Get the number of items for the current page. - * - * @return int - */ - public function count(): int - { - return $this->items->count(); - } - - /** - * Get the paginator's underlying collection. - * - * @return \Illuminate\Support\Collection - */ - public function getCollection() - { - return $this->items; - } - - /** - * Set the paginator's underlying collection. - * - * @param \Illuminate\Support\Collection $collection - * @return $this - */ - public function setCollection(Collection $collection) - { - $this->items = $collection; - - return $this; - } - - /** - * Get the paginator options. - * - * @return array - */ - public function getOptions() - { - return $this->options; - } - - /** - * Determine if the given item exists. - * - * @param TKey $key - * @return bool - */ - public function offsetExists($key): bool - { - return $this->items->has($key); - } - - /** - * Get the item at the given offset. - * - * @param TKey $key - * @return TValue|null - */ - public function offsetGet($key): mixed - { - return $this->items->get($key); - } - - /** - * Set the item at the given offset. - * - * @param TKey|null $key - * @param TValue $value - * @return void - */ - public function offsetSet($key, $value): void - { - $this->items->put($key, $value); - } - - /** - * Unset the item at the given key. - * - * @param TKey $key - * @return void - */ - public function offsetUnset($key): void - { - $this->items->forget($key); - } - - /** - * Render the contents of the paginator to HTML. - * - * @return string - */ - public function toHtml() - { - return (string) $this->render(); - } - - /** - * Make dynamic calls into the collection. - * - * @param string $method - * @param array $parameters - * @return mixed - */ - public function __call($method, $parameters) - { - return $this->forwardCallTo($this->getCollection(), $method, $parameters); - } - - /** - * Render the contents of the paginator when casting to a string. - * - * @return string - */ - public function __toString() - { - return $this->escapeWhenCastingToString - ? e((string) $this->render()) - : (string) $this->render(); - } - - /** - * Indicate that the paginator's string representation should be escaped when __toString is invoked. - * - * @param bool $escape - * @return $this - */ - public function escapeWhenCastingToString($escape = true) - { - $this->escapeWhenCastingToString = $escape; - - return $this; - } -} diff --git a/plugins/vendor/illuminate/pagination/Cursor.php b/plugins/vendor/illuminate/pagination/Cursor.php deleted file mode 100644 index 433e33e0..00000000 --- a/plugins/vendor/illuminate/pagination/Cursor.php +++ /dev/null @@ -1,134 +0,0 @@ - */ -class Cursor implements Arrayable -{ - /** - * The parameters associated with the cursor. - * - * @var array - */ - protected $parameters; - - /** - * Determine whether the cursor points to the next or previous set of items. - * - * @var bool - */ - protected $pointsToNextItems; - - /** - * Create a new cursor instance. - * - * @param array $parameters - * @param bool $pointsToNextItems - */ - public function __construct(array $parameters, $pointsToNextItems = true) - { - $this->parameters = $parameters; - $this->pointsToNextItems = $pointsToNextItems; - } - - /** - * Get the given parameter from the cursor. - * - * @param string $parameterName - * @return string|null - * - * @throws \UnexpectedValueException - */ - public function parameter(string $parameterName) - { - if (! array_key_exists($parameterName, $this->parameters)) { - throw new UnexpectedValueException("Unable to find parameter [{$parameterName}] in pagination item."); - } - - return $this->parameters[$parameterName]; - } - - /** - * Get the given parameters from the cursor. - * - * @param array $parameterNames - * @return array - */ - public function parameters(array $parameterNames) - { - return (new Collection($parameterNames)) - ->map(fn ($parameterName) => $this->parameter($parameterName)) - ->toArray(); - } - - /** - * Determine whether the cursor points to the next set of items. - * - * @return bool - */ - public function pointsToNextItems() - { - return $this->pointsToNextItems; - } - - /** - * Determine whether the cursor points to the previous set of items. - * - * @return bool - */ - public function pointsToPreviousItems() - { - return ! $this->pointsToNextItems; - } - - /** - * Get the array representation of the cursor. - * - * @return array - */ - public function toArray() - { - return array_merge($this->parameters, [ - '_pointsToNextItems' => $this->pointsToNextItems, - ]); - } - - /** - * Get the encoded string representation of the cursor to construct a URL. - * - * @return string - */ - public function encode() - { - return str_replace(['+', '/', '='], ['-', '_', ''], base64_encode(json_encode($this->toArray()))); - } - - /** - * Get a cursor instance from the encoded string representation. - * - * @param string|null $encodedString - * @return static|null - */ - public static function fromEncoded($encodedString) - { - if (! is_string($encodedString)) { - return null; - } - - $parameters = json_decode(base64_decode(str_replace(['-', '_'], ['+', '/'], $encodedString)), true); - - if (json_last_error() !== JSON_ERROR_NONE) { - return null; - } - - $pointsToNextItems = $parameters['_pointsToNextItems']; - - unset($parameters['_pointsToNextItems']); - - return new static($parameters, $pointsToNextItems); - } -} diff --git a/plugins/vendor/illuminate/pagination/CursorPaginator.php b/plugins/vendor/illuminate/pagination/CursorPaginator.php deleted file mode 100644 index 314365ae..00000000 --- a/plugins/vendor/illuminate/pagination/CursorPaginator.php +++ /dev/null @@ -1,195 +0,0 @@ - - * - * @implements Arrayable - * @implements ArrayAccess - * @implements IteratorAggregate - * @implements PaginatorContract - */ -class CursorPaginator extends AbstractCursorPaginator implements Arrayable, ArrayAccess, Countable, IteratorAggregate, Jsonable, JsonSerializable, PaginatorContract -{ - /** - * Indicates whether there are more items in the data source. - * - * @return bool - */ - protected $hasMore; - - /** - * Create a new paginator instance. - * - * @param Collection|Arrayable|iterable|null $items - * @param int $perPage - * @param \Illuminate\Pagination\Cursor|null $cursor - * @param array $options (path, query, fragment, pageName) - */ - public function __construct($items, $perPage, $cursor = null, array $options = []) - { - $this->options = $options; - - foreach ($options as $key => $value) { - $this->{$key} = $value; - } - - $this->perPage = (int) $perPage; - $this->cursor = $cursor; - $this->path = $this->path !== '/' ? rtrim($this->path, '/') : $this->path; - - $this->setItems($items); - } - - /** - * Set the items for the paginator. - * - * @param Collection|Arrayable|iterable|null $items - * @return void - */ - protected function setItems($items) - { - $this->items = $items instanceof Collection ? $items : new Collection($items); - - $this->hasMore = $this->items->count() > $this->perPage; - - $this->items = $this->items->slice(0, $this->perPage); - - if (! is_null($this->cursor) && $this->cursor->pointsToPreviousItems()) { - $this->items = $this->items->reverse()->values(); - } - } - - /** - * Render the paginator using the given view. - * - * @param string|null $view - * @param array $data - * @return \Illuminate\Contracts\Support\Htmlable - */ - public function links($view = null, $data = []) - { - return $this->render($view, $data); - } - - /** - * Render the paginator using the given view. - * - * @param string|null $view - * @param array $data - * @return \Illuminate\Contracts\Support\Htmlable - */ - public function render($view = null, $data = []) - { - return static::viewFactory()->make($view ?: Paginator::$defaultSimpleView, array_merge($data, [ - 'paginator' => $this, - ])); - } - - /** - * Determine if there are more items in the data source. - * - * @return bool - */ - public function hasMorePages() - { - return (is_null($this->cursor) && $this->hasMore) || - (! is_null($this->cursor) && $this->cursor->pointsToNextItems() && $this->hasMore) || - (! is_null($this->cursor) && $this->cursor->pointsToPreviousItems()); - } - - /** - * Determine if there are enough items to split into multiple pages. - * - * @return bool - */ - public function hasPages() - { - return ! $this->onFirstPage() || $this->hasMorePages(); - } - - /** - * Determine if the paginator is on the first page. - * - * @return bool - */ - public function onFirstPage() - { - return is_null($this->cursor) || ($this->cursor->pointsToPreviousItems() && ! $this->hasMore); - } - - /** - * Determine if the paginator is on the last page. - * - * @return bool - */ - public function onLastPage() - { - return ! $this->hasMorePages(); - } - - /** - * Get the instance as an array. - * - * @return array - */ - public function toArray() - { - return [ - 'data' => $this->items->toArray(), - 'path' => $this->path(), - 'per_page' => $this->perPage(), - 'next_cursor' => $this->nextCursor()?->encode(), - 'next_page_url' => $this->nextPageUrl(), - 'prev_cursor' => $this->previousCursor()?->encode(), - 'prev_page_url' => $this->previousPageUrl(), - ]; - } - - /** - * Convert the object into something JSON serializable. - * - * @return array - */ - public function jsonSerialize(): array - { - return $this->toArray(); - } - - /** - * Convert the object to its JSON representation. - * - * @param int $options - * @return string - */ - public function toJson($options = 0) - { - return json_encode($this->jsonSerialize(), $options); - } - - /** - * Convert the object to pretty print formatted JSON. - * - * @params int $options - * - * @return string - */ - public function toPrettyJson(int $options = 0) - { - return $this->toJson(JSON_PRETTY_PRINT | $options); - } -} diff --git a/plugins/vendor/illuminate/pagination/LICENSE.md b/plugins/vendor/illuminate/pagination/LICENSE.md deleted file mode 100644 index 79810c84..00000000 --- a/plugins/vendor/illuminate/pagination/LICENSE.md +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Taylor Otwell - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/plugins/vendor/illuminate/pagination/LengthAwarePaginator.php b/plugins/vendor/illuminate/pagination/LengthAwarePaginator.php deleted file mode 100644 index aafa1447..00000000 --- a/plugins/vendor/illuminate/pagination/LengthAwarePaginator.php +++ /dev/null @@ -1,257 +0,0 @@ - - * - * @implements Arrayable - * @implements ArrayAccess - * @implements IteratorAggregate - * @implements LengthAwarePaginatorContract - */ -class LengthAwarePaginator extends AbstractPaginator implements Arrayable, ArrayAccess, Countable, IteratorAggregate, Jsonable, JsonSerializable, LengthAwarePaginatorContract -{ - /** - * The total number of items before slicing. - * - * @var int - */ - protected $total; - - /** - * The last available page. - * - * @var int - */ - protected $lastPage; - - /** - * Create a new paginator instance. - * - * @param Collection|Arrayable|iterable|null $items - * @param int $total - * @param int $perPage - * @param int|null $currentPage - * @param array $options (path, query, fragment, pageName) - */ - public function __construct($items, $total, $perPage, $currentPage = null, array $options = []) - { - $this->options = $options; - - foreach ($options as $key => $value) { - $this->{$key} = $value; - } - - $this->total = $total; - $this->perPage = (int) $perPage; - $this->lastPage = max((int) ceil($total / $perPage), 1); - $this->path = $this->path !== '/' ? rtrim($this->path, '/') : $this->path; - $this->currentPage = $this->setCurrentPage($currentPage, $this->pageName); - $this->items = $items instanceof Collection ? $items : new Collection($items); - } - - /** - * Get the current page for the request. - * - * @param int $currentPage - * @param string $pageName - * @return int - */ - protected function setCurrentPage($currentPage, $pageName) - { - $currentPage = $currentPage ?: static::resolveCurrentPage($pageName); - - return $this->isValidPageNumber($currentPage) ? (int) $currentPage : 1; - } - - /** - * Render the paginator using the given view. - * - * @param string|null $view - * @param array $data - * @return \Illuminate\Contracts\Support\Htmlable - */ - public function links($view = null, $data = []) - { - return $this->render($view, $data); - } - - /** - * Render the paginator using the given view. - * - * @param string|null $view - * @param array $data - * @return \Illuminate\Contracts\Support\Htmlable - */ - public function render($view = null, $data = []) - { - return static::viewFactory()->make($view ?: static::$defaultView, array_merge($data, [ - 'paginator' => $this, - 'elements' => $this->elements(), - ])); - } - - /** - * Get the paginator links as a collection (for JSON responses). - * - * @return \Illuminate\Support\Collection - */ - public function linkCollection() - { - return (new Collection($this->elements()))->flatMap(function ($item) { - if (! is_array($item)) { - return [['url' => null, 'label' => '...', 'active' => false]]; - } - - return (new Collection($item))->map(function ($url, $page) { - return [ - 'url' => $url, - 'label' => (string) $page, - 'page' => $page, - 'active' => $this->currentPage() === $page, - ]; - }); - })->prepend([ - 'url' => $this->previousPageUrl(), - 'label' => function_exists('__') ? __('pagination.previous') : 'Previous', - 'page' => $this->currentPage() > 1 ? $this->currentPage() - 1 : null, - 'active' => false, - ])->push([ - 'url' => $this->nextPageUrl(), - 'label' => function_exists('__') ? __('pagination.next') : 'Next', - 'page' => $this->hasMorePages() ? $this->currentPage() + 1 : null, - 'active' => false, - ]); - } - - /** - * Get the array of elements to pass to the view. - * - * @return array - */ - protected function elements() - { - $window = UrlWindow::make($this); - - return array_filter([ - $window['first'], - is_array($window['slider']) ? '...' : null, - $window['slider'], - is_array($window['last']) ? '...' : null, - $window['last'], - ]); - } - - /** - * Get the total number of items being paginated. - * - * @return int - */ - public function total() - { - return $this->total; - } - - /** - * Determine if there are more items in the data source. - * - * @return bool - */ - public function hasMorePages() - { - return $this->currentPage() < $this->lastPage(); - } - - /** - * Get the URL for the next page. - * - * @return string|null - */ - public function nextPageUrl() - { - if ($this->hasMorePages()) { - return $this->url($this->currentPage() + 1); - } - } - - /** - * Get the last page. - * - * @return int - */ - public function lastPage() - { - return $this->lastPage; - } - - /** - * Get the instance as an array. - * - * @return array - */ - public function toArray() - { - return [ - 'current_page' => $this->currentPage(), - 'data' => $this->items->toArray(), - 'first_page_url' => $this->url(1), - 'from' => $this->firstItem(), - 'last_page' => $this->lastPage(), - 'last_page_url' => $this->url($this->lastPage()), - 'links' => $this->linkCollection()->toArray(), - 'next_page_url' => $this->nextPageUrl(), - 'path' => $this->path(), - 'per_page' => $this->perPage(), - 'prev_page_url' => $this->previousPageUrl(), - 'to' => $this->lastItem(), - 'total' => $this->total(), - ]; - } - - /** - * Convert the object into something JSON serializable. - * - * @return array - */ - public function jsonSerialize(): array - { - return $this->toArray(); - } - - /** - * Convert the object to its JSON representation. - * - * @param int $options - * @return string - */ - public function toJson($options = 0) - { - return json_encode($this->jsonSerialize(), $options); - } - - /** - * Convert the object to pretty print formatted JSON. - * - * @params int $options - * - * @return string - */ - public function toPrettyJson(int $options = 0) - { - return $this->toJson(JSON_PRETTY_PRINT | $options); - } -} diff --git a/plugins/vendor/illuminate/pagination/PaginationServiceProvider.php b/plugins/vendor/illuminate/pagination/PaginationServiceProvider.php deleted file mode 100755 index e94cebd6..00000000 --- a/plugins/vendor/illuminate/pagination/PaginationServiceProvider.php +++ /dev/null @@ -1,34 +0,0 @@ -loadViewsFrom(__DIR__.'/resources/views', 'pagination'); - - if ($this->app->runningInConsole()) { - $this->publishes([ - __DIR__.'/resources/views' => $this->app->resourcePath('views/vendor/pagination'), - ], 'laravel-pagination'); - } - } - - /** - * Register the service provider. - * - * @return void - */ - public function register() - { - PaginationState::resolveUsing($this->app); - } -} diff --git a/plugins/vendor/illuminate/pagination/PaginationState.php b/plugins/vendor/illuminate/pagination/PaginationState.php deleted file mode 100644 index 347c6e22..00000000 --- a/plugins/vendor/illuminate/pagination/PaginationState.php +++ /dev/null @@ -1,35 +0,0 @@ - $app['view']); - - Paginator::currentPathResolver(fn () => $app['request']->url()); - - Paginator::currentPageResolver(function ($pageName = 'page') use ($app) { - $page = $app['request']->input($pageName); - - if (filter_var($page, FILTER_VALIDATE_INT) !== false && (int) $page >= 1) { - return (int) $page; - } - - return 1; - }); - - Paginator::queryStringResolver(fn () => $app['request']->query()); - - CursorPaginator::currentCursorResolver(function ($cursorName = 'cursor') use ($app) { - return Cursor::fromEncoded($app['request']->input($cursorName)); - }); - } -} diff --git a/plugins/vendor/illuminate/pagination/Paginator.php b/plugins/vendor/illuminate/pagination/Paginator.php deleted file mode 100644 index 32e5ca57..00000000 --- a/plugins/vendor/illuminate/pagination/Paginator.php +++ /dev/null @@ -1,200 +0,0 @@ - - * - * @implements Arrayable - * @implements ArrayAccess - * @implements IteratorAggregate - * @implements PaginatorContract - */ -class Paginator extends AbstractPaginator implements Arrayable, ArrayAccess, Countable, IteratorAggregate, Jsonable, JsonSerializable, PaginatorContract -{ - /** - * Determine if there are more items in the data source. - * - * @return bool - */ - protected $hasMore; - - /** - * Create a new paginator instance. - * - * @param Collection|Arrayable|iterable $items - * @param int $perPage - * @param int|null $currentPage - * @param array $options (path, query, fragment, pageName) - */ - public function __construct($items, $perPage, $currentPage = null, array $options = []) - { - $this->options = $options; - - foreach ($options as $key => $value) { - $this->{$key} = $value; - } - - $this->perPage = $perPage; - $this->currentPage = $this->setCurrentPage($currentPage); - $this->path = $this->path !== '/' ? rtrim($this->path, '/') : $this->path; - - $this->setItems($items); - } - - /** - * Get the current page for the request. - * - * @param int $currentPage - * @return int - */ - protected function setCurrentPage($currentPage) - { - $currentPage = $currentPage ?: static::resolveCurrentPage(); - - return $this->isValidPageNumber($currentPage) ? (int) $currentPage : 1; - } - - /** - * Set the items for the paginator. - * - * @param Collection|Arrayable|iterable|null $items - * @return void - */ - protected function setItems($items) - { - $this->items = $items instanceof Collection ? $items : new Collection($items); - - $this->hasMore = $this->items->count() > $this->perPage; - - $this->items = $this->items->slice(0, $this->perPage); - } - - /** - * Get the URL for the next page. - * - * @return string|null - */ - public function nextPageUrl() - { - if ($this->hasMorePages()) { - return $this->url($this->currentPage() + 1); - } - } - - /** - * Render the paginator using the given view. - * - * @param string|null $view - * @param array $data - * @return string - */ - public function links($view = null, $data = []) - { - return $this->render($view, $data); - } - - /** - * Render the paginator using the given view. - * - * @param string|null $view - * @param array $data - * @return \Illuminate\Contracts\Support\Htmlable - */ - public function render($view = null, $data = []) - { - return static::viewFactory()->make($view ?: static::$defaultSimpleView, array_merge($data, [ - 'paginator' => $this, - ])); - } - - /** - * Manually indicate that the paginator does have more pages. - * - * @param bool $hasMore - * @return $this - */ - public function hasMorePagesWhen($hasMore = true) - { - $this->hasMore = $hasMore; - - return $this; - } - - /** - * Determine if there are more items in the data source. - * - * @return bool - */ - public function hasMorePages() - { - return $this->hasMore; - } - - /** - * Get the instance as an array. - * - * @return array - */ - public function toArray() - { - return [ - 'current_page' => $this->currentPage(), - 'current_page_url' => $this->url($this->currentPage()), - 'data' => $this->items->toArray(), - 'first_page_url' => $this->url(1), - 'from' => $this->firstItem(), - 'next_page_url' => $this->nextPageUrl(), - 'path' => $this->path(), - 'per_page' => $this->perPage(), - 'prev_page_url' => $this->previousPageUrl(), - 'to' => $this->lastItem(), - ]; - } - - /** - * Convert the object into something JSON serializable. - * - * @return array - */ - public function jsonSerialize(): array - { - return $this->toArray(); - } - - /** - * Convert the object to its JSON representation. - * - * @param int $options - * @return string - */ - public function toJson($options = 0) - { - return json_encode($this->jsonSerialize(), $options); - } - - /** - * Convert the object to pretty print formatted JSON. - * - * @params int $options - * - * @return string - */ - public function toPrettyJson(int $options = 0) - { - return $this->toJson(JSON_PRETTY_PRINT | $options); - } -} diff --git a/plugins/vendor/illuminate/pagination/UrlWindow.php b/plugins/vendor/illuminate/pagination/UrlWindow.php deleted file mode 100644 index 863d4c59..00000000 --- a/plugins/vendor/illuminate/pagination/UrlWindow.php +++ /dev/null @@ -1,219 +0,0 @@ -paginator = $paginator; - } - - /** - * Create a new URL window instance. - * - * @param \Illuminate\Contracts\Pagination\LengthAwarePaginator $paginator - * @return array - */ - public static function make(PaginatorContract $paginator) - { - return (new static($paginator))->get(); - } - - /** - * Get the window of URLs to be shown. - * - * @return array - */ - public function get() - { - $onEachSide = $this->paginator->onEachSide; - - if ($this->paginator->lastPage() < ($onEachSide * 2) + 8) { - return $this->getSmallSlider(); - } - - return $this->getUrlSlider($onEachSide); - } - - /** - * Get the slider of URLs there are not enough pages to slide. - * - * @return array - */ - protected function getSmallSlider() - { - return [ - 'first' => $this->paginator->getUrlRange(1, $this->lastPage()), - 'slider' => null, - 'last' => null, - ]; - } - - /** - * Create a URL slider links. - * - * @param int $onEachSide - * @return array - */ - protected function getUrlSlider($onEachSide) - { - $window = $onEachSide + 4; - - if (! $this->hasPages()) { - return ['first' => null, 'slider' => null, 'last' => null]; - } - - // If the current page is very close to the beginning of the page range, we will - // just render the beginning of the page range, followed by the last 2 of the - // links in this list, since we will not have room to create a full slider. - if ($this->currentPage() <= $window) { - return $this->getSliderTooCloseToBeginning($window, $onEachSide); - } - - // If the current page is close to the ending of the page range we will just get - // this first couple pages, followed by a larger window of these ending pages - // since we're too close to the end of the list to create a full on slider. - elseif ($this->currentPage() > ($this->lastPage() - $window)) { - return $this->getSliderTooCloseToEnding($window, $onEachSide); - } - - // If we have enough room on both sides of the current page to build a slider we - // will surround it with both the beginning and ending caps, with this window - // of pages in the middle providing a Google style sliding paginator setup. - return $this->getFullSlider($onEachSide); - } - - /** - * Get the slider of URLs when too close to the beginning of the window. - * - * @param int $window - * @param int $onEachSide - * @return array - */ - protected function getSliderTooCloseToBeginning($window, $onEachSide) - { - return [ - 'first' => $this->paginator->getUrlRange(1, $window + $onEachSide), - 'slider' => null, - 'last' => $this->getFinish(), - ]; - } - - /** - * Get the slider of URLs when too close to the ending of the window. - * - * @param int $window - * @param int $onEachSide - * @return array - */ - protected function getSliderTooCloseToEnding($window, $onEachSide) - { - $last = $this->paginator->getUrlRange( - $this->lastPage() - ($window + ($onEachSide - 1)), - $this->lastPage() - ); - - return [ - 'first' => $this->getStart(), - 'slider' => null, - 'last' => $last, - ]; - } - - /** - * Get the slider of URLs when a full slider can be made. - * - * @param int $onEachSide - * @return array - */ - protected function getFullSlider($onEachSide) - { - return [ - 'first' => $this->getStart(), - 'slider' => $this->getAdjacentUrlRange($onEachSide), - 'last' => $this->getFinish(), - ]; - } - - /** - * Get the page range for the current page window. - * - * @param int $onEachSide - * @return array - */ - public function getAdjacentUrlRange($onEachSide) - { - return $this->paginator->getUrlRange( - $this->currentPage() - $onEachSide, - $this->currentPage() + $onEachSide - ); - } - - /** - * Get the starting URLs of a pagination slider. - * - * @return array - */ - public function getStart() - { - return $this->paginator->getUrlRange(1, 2); - } - - /** - * Get the ending URLs of a pagination slider. - * - * @return array - */ - public function getFinish() - { - return $this->paginator->getUrlRange( - $this->lastPage() - 1, - $this->lastPage() - ); - } - - /** - * Determine if the underlying paginator being presented has pages to show. - * - * @return bool - */ - public function hasPages() - { - return $this->paginator->lastPage() > 1; - } - - /** - * Get the current page from the paginator. - * - * @return int - */ - protected function currentPage() - { - return $this->paginator->currentPage(); - } - - /** - * Get the last page from the paginator. - * - * @return int - */ - protected function lastPage() - { - return $this->paginator->lastPage(); - } -} diff --git a/plugins/vendor/illuminate/pagination/composer.json b/plugins/vendor/illuminate/pagination/composer.json deleted file mode 100755 index b848b4a3..00000000 --- a/plugins/vendor/illuminate/pagination/composer.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "name": "illuminate/pagination", - "description": "The Illuminate Pagination package.", - "license": "MIT", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "require": { - "php": "^8.2", - "ext-filter": "*", - "illuminate/collections": "^12.0", - "illuminate/contracts": "^12.0", - "illuminate/support": "^12.0" - }, - "autoload": { - "psr-4": { - "Illuminate\\Pagination\\": "" - } - }, - "extra": { - "branch-alias": { - "dev-master": "12.x-dev" - } - }, - "config": { - "sort-packages": true - }, - "minimum-stability": "dev" -} diff --git a/plugins/vendor/illuminate/pagination/resources/views/bootstrap-4.blade.php b/plugins/vendor/illuminate/pagination/resources/views/bootstrap-4.blade.php deleted file mode 100644 index 63c6f56b..00000000 --- a/plugins/vendor/illuminate/pagination/resources/views/bootstrap-4.blade.php +++ /dev/null @@ -1,46 +0,0 @@ -@if ($paginator->hasPages()) - -@endif diff --git a/plugins/vendor/illuminate/pagination/resources/views/bootstrap-5.blade.php b/plugins/vendor/illuminate/pagination/resources/views/bootstrap-5.blade.php deleted file mode 100644 index a1795a4d..00000000 --- a/plugins/vendor/illuminate/pagination/resources/views/bootstrap-5.blade.php +++ /dev/null @@ -1,88 +0,0 @@ -@if ($paginator->hasPages()) - -@endif diff --git a/plugins/vendor/illuminate/pagination/resources/views/default.blade.php b/plugins/vendor/illuminate/pagination/resources/views/default.blade.php deleted file mode 100644 index 0db70b56..00000000 --- a/plugins/vendor/illuminate/pagination/resources/views/default.blade.php +++ /dev/null @@ -1,46 +0,0 @@ -@if ($paginator->hasPages()) - -@endif diff --git a/plugins/vendor/illuminate/pagination/resources/views/semantic-ui.blade.php b/plugins/vendor/illuminate/pagination/resources/views/semantic-ui.blade.php deleted file mode 100644 index ef0dbb18..00000000 --- a/plugins/vendor/illuminate/pagination/resources/views/semantic-ui.blade.php +++ /dev/null @@ -1,36 +0,0 @@ -@if ($paginator->hasPages()) - -@endif diff --git a/plugins/vendor/illuminate/pagination/resources/views/simple-bootstrap-4.blade.php b/plugins/vendor/illuminate/pagination/resources/views/simple-bootstrap-4.blade.php deleted file mode 100644 index 4bb49174..00000000 --- a/plugins/vendor/illuminate/pagination/resources/views/simple-bootstrap-4.blade.php +++ /dev/null @@ -1,27 +0,0 @@ -@if ($paginator->hasPages()) - -@endif diff --git a/plugins/vendor/illuminate/pagination/resources/views/simple-bootstrap-5.blade.php b/plugins/vendor/illuminate/pagination/resources/views/simple-bootstrap-5.blade.php deleted file mode 100644 index 7006add8..00000000 --- a/plugins/vendor/illuminate/pagination/resources/views/simple-bootstrap-5.blade.php +++ /dev/null @@ -1,29 +0,0 @@ -@if ($paginator->hasPages()) - -@endif diff --git a/plugins/vendor/illuminate/pagination/resources/views/simple-default.blade.php b/plugins/vendor/illuminate/pagination/resources/views/simple-default.blade.php deleted file mode 100644 index 36bdbc18..00000000 --- a/plugins/vendor/illuminate/pagination/resources/views/simple-default.blade.php +++ /dev/null @@ -1,19 +0,0 @@ -@if ($paginator->hasPages()) - -@endif diff --git a/plugins/vendor/illuminate/pagination/resources/views/simple-tailwind.blade.php b/plugins/vendor/illuminate/pagination/resources/views/simple-tailwind.blade.php deleted file mode 100644 index 79514721..00000000 --- a/plugins/vendor/illuminate/pagination/resources/views/simple-tailwind.blade.php +++ /dev/null @@ -1,25 +0,0 @@ -@if ($paginator->hasPages()) - -@endif diff --git a/plugins/vendor/illuminate/pagination/resources/views/tailwind.blade.php b/plugins/vendor/illuminate/pagination/resources/views/tailwind.blade.php deleted file mode 100644 index fbba0a84..00000000 --- a/plugins/vendor/illuminate/pagination/resources/views/tailwind.blade.php +++ /dev/null @@ -1,111 +0,0 @@ -@if ($paginator->hasPages()) - -@endif diff --git a/plugins/vendor/illuminate/reflection/LICENSE.md b/plugins/vendor/illuminate/reflection/LICENSE.md deleted file mode 100644 index 79810c84..00000000 --- a/plugins/vendor/illuminate/reflection/LICENSE.md +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Taylor Otwell - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/plugins/vendor/illuminate/reflection/Reflector.php b/plugins/vendor/illuminate/reflection/Reflector.php deleted file mode 100644 index 9ef142e1..00000000 --- a/plugins/vendor/illuminate/reflection/Reflector.php +++ /dev/null @@ -1,213 +0,0 @@ -isPublic(); - } - - if (is_object($var[0]) && method_exists($class, '__call')) { - return (new ReflectionMethod($class, '__call'))->isPublic(); - } - - if (! is_object($var[0]) && method_exists($class, '__callStatic')) { - return (new ReflectionMethod($class, '__callStatic'))->isPublic(); - } - - return false; - } - - /** - * Get the specified class attribute, optionally following an inheritance chain. - * - * @template TAttribute of object - * - * @param object|class-string $objectOrClass - * @param class-string $attribute - * @param bool $ascend - * @return TAttribute|null - */ - public static function getClassAttribute($objectOrClass, $attribute, $ascend = false) - { - return static::getClassAttributes($objectOrClass, $attribute, $ascend)->flatten()->first(); - } - - /** - * Get the specified class attribute(s), optionally following an inheritance chain. - * - * @template TTarget of object - * @template TAttribute of object - * - * @param TTarget|class-string $objectOrClass - * @param class-string $attribute - * @param bool $includeParents - * @return ($includeParents is true ? Collection, Collection> : Collection) - */ - public static function getClassAttributes($objectOrClass, $attribute, $includeParents = false) - { - $reflectionClass = new ReflectionClass($objectOrClass); - - $attributes = []; - - do { - $attributes[$reflectionClass->name] = new Collection(array_map( - fn (ReflectionAttribute $reflectionAttribute) => $reflectionAttribute->newInstance(), - $reflectionClass->getAttributes($attribute) - )); - } while ($includeParents && false !== $reflectionClass = $reflectionClass->getParentClass()); - - return $includeParents ? new Collection($attributes) : array_first($attributes); - } - - /** - * Get the class name of the given parameter's type, if possible. - * - * @param \ReflectionParameter $parameter - * @return string|null - */ - public static function getParameterClassName($parameter) - { - $type = $parameter->getType(); - - if (! $type instanceof ReflectionNamedType || $type->isBuiltin()) { - return; - } - - return static::getTypeName($parameter, $type); - } - - /** - * Get the class names of the given parameter's type, including union types. - * - * @param \ReflectionParameter $parameter - * @return array - */ - public static function getParameterClassNames($parameter) - { - $type = $parameter->getType(); - - if (! $type instanceof ReflectionUnionType) { - return array_filter([static::getParameterClassName($parameter)]); - } - - $unionTypes = []; - - foreach ($type->getTypes() as $listedType) { - if (! $listedType instanceof ReflectionNamedType || $listedType->isBuiltin()) { - continue; - } - - $unionTypes[] = static::getTypeName($parameter, $listedType); - } - - return array_filter($unionTypes); - } - - /** - * Get the given type's class name. - * - * @param \ReflectionParameter $parameter - * @param \ReflectionNamedType $type - * @return string - */ - protected static function getTypeName($parameter, $type) - { - $name = $type->getName(); - - if (! is_null($class = $parameter->getDeclaringClass())) { - if ($name === 'self') { - return $class->getName(); - } - - if ($name === 'parent' && $parent = $class->getParentClass()) { - return $parent->getName(); - } - } - - return $name; - } - - /** - * Determine if the parameter's type is a subclass of the given type. - * - * @param \ReflectionParameter $parameter - * @param string $className - * @return bool - */ - public static function isParameterSubclassOf($parameter, $className) - { - $paramClassName = static::getParameterClassName($parameter); - - return $paramClassName - && (class_exists($paramClassName) || interface_exists($paramClassName)) - && (new ReflectionClass($paramClassName))->isSubclassOf($className); - } - - /** - * Determine if the parameter's type is a Backed Enum with a string backing type. - * - * @param \ReflectionParameter $parameter - * @return bool - */ - public static function isParameterBackedEnumWithStringBackingType($parameter) - { - if (! $parameter->getType() instanceof ReflectionNamedType) { - return false; - } - - $backedEnumClass = $parameter->getType()?->getName(); - - if (is_null($backedEnumClass)) { - return false; - } - - if (enum_exists($backedEnumClass)) { - $reflectionBackedEnum = new ReflectionEnum($backedEnumClass); - - return $reflectionBackedEnum->isBacked() - && $reflectionBackedEnum->getBackingType()->getName() == 'string'; - } - - return false; - } -} diff --git a/plugins/vendor/illuminate/reflection/Traits/ReflectsClosures.php b/plugins/vendor/illuminate/reflection/Traits/ReflectsClosures.php deleted file mode 100644 index df658040..00000000 --- a/plugins/vendor/illuminate/reflection/Traits/ReflectsClosures.php +++ /dev/null @@ -1,126 +0,0 @@ -closureParameterTypes($closure)); - - if (! $types) { - throw new RuntimeException('The given Closure has no parameters.'); - } - - if ($types[0] === null) { - throw new RuntimeException('The first parameter of the given Closure is missing a type hint.'); - } - - return $types[0]; - } - - /** - * Get the class names of the first parameter of the given Closure, including union types. - * - * @param \Closure $closure - * @return array - * - * @throws \ReflectionException - * @throws \RuntimeException - */ - protected function firstClosureParameterTypes(Closure $closure) - { - $reflection = new ReflectionFunction($closure); - - $types = (new Collection($reflection->getParameters())) - ->mapWithKeys(function ($parameter) { - if ($parameter->isVariadic()) { - return [$parameter->getName() => null]; - } - - return [$parameter->getName() => Reflector::getParameterClassNames($parameter)]; - }) - ->filter() - ->values() - ->all(); - - if (empty($types)) { - throw new RuntimeException('The given Closure has no parameters.'); - } - - if (isset($types[0]) && empty($types[0])) { - throw new RuntimeException('The first parameter of the given Closure is missing a type hint.'); - } - - return $types[0]; - } - - /** - * Get the class names / types of the parameters of the given Closure. - * - * @param \Closure $closure - * @return array - * - * @throws \ReflectionException - */ - protected function closureParameterTypes(Closure $closure) - { - $reflection = new ReflectionFunction($closure); - - return (new Collection($reflection->getParameters())) - ->mapWithKeys(function ($parameter) { - if ($parameter->isVariadic()) { - return [$parameter->getName() => null]; - } - - return [$parameter->getName() => Reflector::getParameterClassName($parameter)]; - }) - ->all(); - } - - /** - * Get the class names / types of the return type of the given Closure. - * - * @param \Closure $closure - * @return list - * - * @throws \ReflectionException - */ - protected function closureReturnTypes(Closure $closure) - { - $reflection = new ReflectionFunction($closure); - - if ($reflection->getReturnType() === null || - $reflection->getReturnType() instanceof ReflectionIntersectionType) { - return []; - } - - $types = $reflection->getReturnType() instanceof ReflectionUnionType - ? $reflection->getReturnType()->getTypes() - : [$reflection->getReturnType()]; - - return (new Collection($types)) - ->reject(fn ($type) => $type->isBuiltin()) - ->reject(fn ($type) => in_array($type->getName(), ['static', 'self'])) - ->map(fn ($type) => $type->getName()) - ->values() - ->all(); - } -} diff --git a/plugins/vendor/illuminate/reflection/composer.json b/plugins/vendor/illuminate/reflection/composer.json deleted file mode 100644 index 495d6eba..00000000 --- a/plugins/vendor/illuminate/reflection/composer.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "name": "illuminate/reflection", - "description": "The Illuminate Reflection package.", - "license": "MIT", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "require": { - "php": "^8.2", - "illuminate/contracts": "^12.0", - "illuminate/collections": "^12.0" - }, - "autoload": { - "psr-4": { - "Illuminate\\Support\\": "" - }, - "files": [ - "helpers.php" - ] - }, - "extra": { - "branch-alias": { - "dev-master": "12.x-dev" - } - }, - "config": { - "sort-packages": true - }, - "minimum-stability": "dev" -} diff --git a/plugins/vendor/illuminate/reflection/helpers.php b/plugins/vendor/illuminate/reflection/helpers.php deleted file mode 100644 index cdece52c..00000000 --- a/plugins/vendor/illuminate/reflection/helpers.php +++ /dev/null @@ -1,97 +0,0 @@ -|(\Closure(TValue): mixed) $class - * @param (\Closure(TValue): mixed)|int $callback - * @param int $options - * @param array $eager - * @return TValue - */ - function lazy($class, $callback = 0, $options = 0, $eager = []) - { - static $closureReflector; - - $closureReflector ??= new class - { - use ReflectsClosures; - - public function typeFromParameter($callback) - { - return $this->firstClosureParameterType($callback); - } - }; - - [$class, $callback, $options] = is_string($class) - ? [$class, $callback, $options] - : [$closureReflector->typeFromParameter($class), $class, $callback ?: $options]; - - $reflectionClass = new ReflectionClass($class); - - $instance = $reflectionClass->newLazyGhost(function ($instance) use ($callback) { - $result = $callback($instance); - - if (is_array($result)) { - $instance->__construct(...$result); - } - }, $options); - - foreach ($eager as $property => $value) { - $reflectionClass->getProperty($property)->setRawValueWithoutLazyInitialization($instance, $value); - } - - return $instance; - } -} - -if (! function_exists('proxy')) { - /** - * Create a lazy proxy instance. - * - * @template TValue of object - * - * @param class-string|(\Closure(TValue): TValue) $class - * @param (\Closure(TValue): TValue)|int $callback - * @param int $options - * @param array $eager - * @return TValue - */ - function proxy($class, $callback = 0, $options = 0, $eager = []) - { - static $closureReflector; - - $closureReflector = new class - { - use ReflectsClosures; - - public function get($callback) - { - return $this->closureReturnTypes($callback)[0] ?? $this->firstClosureParameterType($callback); - } - }; - - [$class, $callback, $options] = is_string($class) - ? [$class, $callback, $options] - : [$closureReflector->get($class), $class, $callback ?: $options]; - - $reflectionClass = new ReflectionClass($class); - - $proxy = $reflectionClass->newLazyProxy(function () use ($callback, $eager, &$proxy) { - $instance = $callback($proxy, $eager); - - return $instance; - }, $options); - - foreach ($eager as $property => $value) { - $reflectionClass->getProperty($property)->setRawValueWithoutLazyInitialization($proxy, $value); - } - - return $proxy; - } -} diff --git a/plugins/vendor/illuminate/support/AggregateServiceProvider.php b/plugins/vendor/illuminate/support/AggregateServiceProvider.php deleted file mode 100644 index 3d162c6a..00000000 --- a/plugins/vendor/illuminate/support/AggregateServiceProvider.php +++ /dev/null @@ -1,52 +0,0 @@ -> - */ - protected $providers = []; - - /** - * An array of the service provider instances. - * - * @var array - */ - protected $instances = []; - - /** - * Register the service provider. - * - * @return void - */ - public function register() - { - $this->instances = []; - - foreach ($this->providers as $provider) { - $this->instances[] = $this->app->register($provider); - } - } - - /** - * Get the services provided by the provider. - * - * @return array - */ - public function provides() - { - $provides = []; - - foreach ($this->providers as $provider) { - $instance = $this->app->resolveProvider($provider); - - $provides = array_merge($provides, $instance->provides()); - } - - return $provides; - } -} diff --git a/plugins/vendor/illuminate/support/Benchmark.php b/plugins/vendor/illuminate/support/Benchmark.php deleted file mode 100644 index 0204c974..00000000 --- a/plugins/vendor/illuminate/support/Benchmark.php +++ /dev/null @@ -1,72 +0,0 @@ -map(function ($callback) use ($iterations) { - return Collection::range(1, $iterations)->map(function () use ($callback) { - gc_collect_cycles(); - - $start = hrtime(true); - - $callback(); - - return (hrtime(true) - $start) / 1_000_000; - })->average(); - })->when( - $benchmarkables instanceof Closure, - fn ($c) => $c->first(), - fn ($c) => $c->all(), - ); - } - - /** - * Measure a callable once and return the result and duration in milliseconds. - * - * @template TReturn of mixed - * - * @param (callable(): TReturn) $callback - * @return array{0: TReturn, 1: float} - */ - public static function value(callable $callback): array - { - gc_collect_cycles(); - - $start = hrtime(true); - - $result = $callback(); - - return [$result, (hrtime(true) - $start) / 1_000_000]; - } - - /** - * Measure a callable or array of callables over the given number of iterations, then dump and die. - * - * @param \Closure|array $benchmarkables - * @param int $iterations - * @return never - */ - public static function dd(Closure|array $benchmarkables, int $iterations = 1): never - { - $result = (new Collection(static::measure(Arr::wrap($benchmarkables), $iterations))) - ->map(fn ($average) => number_format($average, 3).'ms') - ->when($benchmarkables instanceof Closure, fn ($c) => $c->first(), fn ($c) => $c->all()); - - dd($result); - } -} diff --git a/plugins/vendor/illuminate/support/BinaryCodec.php b/plugins/vendor/illuminate/support/BinaryCodec.php deleted file mode 100644 index d98be2da..00000000 --- a/plugins/vendor/illuminate/support/BinaryCodec.php +++ /dev/null @@ -1,99 +0,0 @@ - */ - protected static array $customCodecs = []; - - /** - * Register a custom codec. - */ - public static function register(string $name, callable $encode, callable $decode): void - { - self::$customCodecs[$name] = [ - 'encode' => $encode, - 'decode' => $decode, - ]; - } - - /** - * Encode a value to binary. - */ - public static function encode(UuidInterface|Ulid|string|null $value, string $format): ?string - { - if (blank($value)) { - return null; - } - - if (isset(self::$customCodecs[$format])) { - return (self::$customCodecs[$format]['encode'])($value); - } - - return match ($format) { - 'uuid' => match (true) { - $value instanceof UuidInterface => $value->getBytes(), - self::isBinary($value) => $value, - default => Uuid::fromString($value)->getBytes(), - }, - 'ulid' => match (true) { - $value instanceof Ulid => $value->toBinary(), - self::isBinary($value) => $value, - default => Ulid::fromString($value)->toBinary(), - }, - default => throw new InvalidArgumentException("Format [$format] is invalid."), - }; - } - - /** - * Decode a binary value to string. - */ - public static function decode(?string $value, string $format): ?string - { - if (blank($value)) { - return null; - } - - if (isset(self::$customCodecs[$format])) { - return (self::$customCodecs[$format]['decode'])($value); - } - - return match ($format) { - 'uuid' => (self::isBinary($value) ? Uuid::fromBytes($value) : Uuid::fromString($value))->toString(), - 'ulid' => (self::isBinary($value) ? Ulid::fromBinary($value) : Ulid::fromString($value))->toString(), - default => throw new InvalidArgumentException("Format [$format] is invalid."), - }; - } - - /** - * Get all available format names. - * - * @return list - */ - public static function formats(): array - { - return array_unique([...['uuid', 'ulid'], ...array_keys(self::$customCodecs)]); - } - - /** - * Determine if the given value is binary data. - */ - public static function isBinary(mixed $value): bool - { - if (! is_string($value) || $value === '') { - return false; - } - - if (str_contains($value, "\0")) { - return true; - } - - return ! mb_check_encoding($value, 'UTF-8'); - } -} diff --git a/plugins/vendor/illuminate/support/Carbon.php b/plugins/vendor/illuminate/support/Carbon.php deleted file mode 100644 index 80d5fb3d..00000000 --- a/plugins/vendor/illuminate/support/Carbon.php +++ /dev/null @@ -1,74 +0,0 @@ -getDateTime()); - } - - /** - * Get the current date / time plus a given amount of time. - */ - public function plus( - int $years = 0, - int $months = 0, - int $weeks = 0, - int $days = 0, - int $hours = 0, - int $minutes = 0, - int $seconds = 0, - int $microseconds = 0 - ): static { - return $this->add(" - $years years $months months $weeks weeks $days days - $hours hours $minutes minutes $seconds seconds $microseconds microseconds - "); - } - - /** - * Get the current date / time minus a given amount of time. - */ - public function minus( - int $years = 0, - int $months = 0, - int $weeks = 0, - int $days = 0, - int $hours = 0, - int $minutes = 0, - int $seconds = 0, - int $microseconds = 0 - ): static { - return $this->sub(" - $years years $months months $weeks weeks $days days - $hours hours $minutes minutes $seconds seconds $microseconds microseconds - "); - } -} diff --git a/plugins/vendor/illuminate/support/Composer.php b/plugins/vendor/illuminate/support/Composer.php deleted file mode 100644 index 4f9ddaa6..00000000 --- a/plugins/vendor/illuminate/support/Composer.php +++ /dev/null @@ -1,254 +0,0 @@ -files = $files; - $this->workingPath = $workingPath; - } - - /** - * Determine if the given Composer package is installed. - * - * @param string $package - * @return bool - * - * @throws \RuntimeException - */ - public function hasPackage($package) - { - $composer = json_decode(file_get_contents($this->findComposerFile()), true); - - return array_key_exists($package, $composer['require'] ?? []) - || array_key_exists($package, $composer['require-dev'] ?? []); - } - - /** - * Install the given Composer packages into the application. - * - * @param array $packages - * @param bool $dev - * @param \Closure|\Symfony\Component\Console\Output\OutputInterface|null $output - * @param string|null $composerBinary - * @return bool - */ - public function requirePackages(array $packages, bool $dev = false, Closure|OutputInterface|null $output = null, $composerBinary = null) - { - $command = (new Collection([ - ...$this->findComposer($composerBinary), - 'require', - ...$packages, - ])) - ->when($dev, function ($command) { - $command->push('--dev'); - })->all(); - - return 0 === $this->getProcess($command, ['COMPOSER_MEMORY_LIMIT' => '-1']) - ->run( - $output instanceof OutputInterface - ? function ($type, $line) use ($output) { - $output->write(' '.$line); - } : $output - ); - } - - /** - * Remove the given Composer packages from the application. - * - * @param array $packages - * @param bool $dev - * @param \Closure|\Symfony\Component\Console\Output\OutputInterface|null $output - * @param string|null $composerBinary - * @return bool - */ - public function removePackages(array $packages, bool $dev = false, Closure|OutputInterface|null $output = null, $composerBinary = null) - { - $command = (new Collection([ - ...$this->findComposer($composerBinary), - 'remove', - ...$packages, - ])) - ->when($dev, function ($command) { - $command->push('--dev'); - })->all(); - - return 0 === $this->getProcess($command, ['COMPOSER_MEMORY_LIMIT' => '-1']) - ->run( - $output instanceof OutputInterface - ? function ($type, $line) use ($output) { - $output->write(' '.$line); - } : $output - ); - } - - /** - * Modify the "composer.json" file contents using the given callback. - * - * @param callable(array):array $callback - * @return void - * - * @throws \RuntimeException - */ - public function modify(callable $callback) - { - $composerFile = $this->findComposerFile(); - - $composer = json_decode(file_get_contents($composerFile), true, 512, JSON_THROW_ON_ERROR); - - file_put_contents( - $composerFile, - json_encode( - call_user_func($callback, $composer), - JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE - ) - ); - } - - /** - * Regenerate the Composer autoloader files. - * - * @param string|array $extra - * @param string|null $composerBinary - * @return int - */ - public function dumpAutoloads($extra = '', $composerBinary = null) - { - $extra = $extra ? (array) $extra : []; - - $command = array_merge($this->findComposer($composerBinary), ['dump-autoload'], $extra); - - return $this->getProcess($command)->run(); - } - - /** - * Regenerate the optimized Composer autoloader files. - * - * @param string|null $composerBinary - * @return int - */ - public function dumpOptimized($composerBinary = null) - { - return $this->dumpAutoloads('--optimize', $composerBinary); - } - - /** - * Get the Composer binary / command for the environment. - * - * @param string|null $composerBinary - * @return array - */ - public function findComposer($composerBinary = null) - { - if (! is_null($composerBinary) && $this->files->exists($composerBinary)) { - return [$this->phpBinary(), $composerBinary]; - } elseif ($this->files->exists($this->workingPath.'/composer.phar')) { - return [$this->phpBinary(), 'composer.phar']; - } - - return ['composer']; - } - - /** - * Get the path to the "composer.json" file. - * - * @return string - * - * @throws \RuntimeException - */ - protected function findComposerFile() - { - $composerFile = "{$this->workingPath}/composer.json"; - - if (! file_exists($composerFile)) { - throw new RuntimeException("Unable to locate `composer.json` file at [{$this->workingPath}]."); - } - - return $composerFile; - } - - /** - * Get the PHP binary. - * - * @return string - */ - protected function phpBinary() - { - return php_binary(); - } - - /** - * Get a new Symfony process instance. - * - * @param array $command - * @param array $env - * @return \Symfony\Component\Process\Process - */ - protected function getProcess(array $command, array $env = []) - { - return (new Process($command, $this->workingPath, $env))->setTimeout(null); - } - - /** - * Set the working path used by the class. - * - * @param string $path - * @return $this - */ - public function setWorkingPath($path) - { - $this->workingPath = realpath($path); - - return $this; - } - - /** - * Get the version of Composer. - * - * @return string|null - */ - public function getVersion() - { - $command = array_merge($this->findComposer(), ['-V', '--no-ansi']); - - $process = $this->getProcess($command); - - $process->run(); - - $output = $process->getOutput(); - - if (preg_match('/(\d+(\.\d+){2})/', $output, $version)) { - return $version[1]; - } - - return explode(' ', $output)[2] ?? null; - } -} diff --git a/plugins/vendor/illuminate/support/ConfigurationUrlParser.php b/plugins/vendor/illuminate/support/ConfigurationUrlParser.php deleted file mode 100644 index b841b65e..00000000 --- a/plugins/vendor/illuminate/support/ConfigurationUrlParser.php +++ /dev/null @@ -1,191 +0,0 @@ - 'sqlsrv', - 'mysql2' => 'mysql', // RDS - 'postgres' => 'pgsql', - 'postgresql' => 'pgsql', - 'sqlite3' => 'sqlite', - 'redis' => 'tcp', - 'rediss' => 'tls', - ]; - - /** - * Parse the database configuration, hydrating options using a database configuration URL if possible. - * - * @param array|string $config - * @return array - */ - public function parseConfiguration($config) - { - if (is_string($config)) { - $config = ['url' => $config]; - } - - $url = Arr::pull($config, 'url'); - - if (! $url) { - return $config; - } - - $rawComponents = $this->parseUrl($url); - - $decodedComponents = $this->parseStringsToNativeTypes( - array_map(rawurldecode(...), $rawComponents) - ); - - return array_merge( - $config, - $this->getPrimaryOptions($decodedComponents), - $this->getQueryOptions($rawComponents) - ); - } - - /** - * Get the primary database connection options. - * - * @param array $url - * @return array - */ - protected function getPrimaryOptions($url) - { - return array_filter([ - 'driver' => $this->getDriver($url), - 'database' => $this->getDatabase($url), - 'host' => $url['host'] ?? null, - 'port' => $url['port'] ?? null, - 'username' => $url['user'] ?? null, - 'password' => $url['pass'] ?? null, - ], fn ($value) => ! is_null($value)); - } - - /** - * Get the database driver from the URL. - * - * @param array $url - * @return string|null - */ - protected function getDriver($url) - { - $alias = $url['scheme'] ?? null; - - if (! $alias) { - return; - } - - return static::$driverAliases[$alias] ?? $alias; - } - - /** - * Get the database name from the URL. - * - * @param array $url - * @return string|null - */ - protected function getDatabase($url) - { - $path = $url['path'] ?? null; - - return $path && $path !== '/' ? substr($path, 1) : null; - } - - /** - * Get all of the additional database options from the query string. - * - * @param array $url - * @return array - */ - protected function getQueryOptions($url) - { - $queryString = $url['query'] ?? null; - - if (! $queryString) { - return []; - } - - $query = []; - - parse_str($queryString, $query); - - return $this->parseStringsToNativeTypes($query); - } - - /** - * Parse the string URL to an array of components. - * - * @param string $url - * @return array - * - * @throws \InvalidArgumentException - */ - protected function parseUrl($url) - { - $url = preg_replace('#^(sqlite3?):///#', '$1://null/', $url); - - $parsedUrl = parse_url($url); - - if ($parsedUrl === false) { - throw new InvalidArgumentException('The database configuration URL is malformed.'); - } - - return $parsedUrl; - } - - /** - * Convert string casted values to their native types. - * - * @param mixed $value - * @return mixed - */ - protected function parseStringsToNativeTypes($value) - { - if (is_array($value)) { - return array_map($this->parseStringsToNativeTypes(...), $value); - } - - if (! is_string($value)) { - return $value; - } - - $parsedValue = json_decode($value, true); - - if (json_last_error() === JSON_ERROR_NONE) { - return $parsedValue; - } - - return $value; - } - - /** - * Get all of the current drivers' aliases. - * - * @return array - */ - public static function getDriverAliases() - { - return static::$driverAliases; - } - - /** - * Add the given driver alias to the driver aliases array. - * - * @param string $alias - * @param string $driver - * @return void - */ - public static function addDriverAlias($alias, $driver) - { - static::$driverAliases[$alias] = $driver; - } -} diff --git a/plugins/vendor/illuminate/support/DateFactory.php b/plugins/vendor/illuminate/support/DateFactory.php deleted file mode 100644 index 5a2feb59..00000000 --- a/plugins/vendor/illuminate/support/DateFactory.php +++ /dev/null @@ -1,250 +0,0 @@ -$method(...$parameters); - } - - $dateClass = static::$dateClass ?: $defaultClassName; - - // Check if the date can be created using the public class method... - if (method_exists($dateClass, $method) || - method_exists($dateClass, 'hasMacro') && $dateClass::hasMacro($method)) { - return $dateClass::$method(...$parameters); - } - - // If that fails, create the date with the default class... - $date = $defaultClassName::$method(...$parameters); - - // If the configured class has an "instance" method, we'll try to pass our date into there... - if (method_exists($dateClass, 'instance')) { - return $dateClass::instance($date); - } - - // Otherwise, assume the configured class has a DateTime compatible constructor... - return new $dateClass($date->format('Y-m-d H:i:s.u'), $date->getTimezone()); - } -} diff --git a/plugins/vendor/illuminate/support/DefaultProviders.php b/plugins/vendor/illuminate/support/DefaultProviders.php deleted file mode 100644 index 6430e843..00000000 --- a/plugins/vendor/illuminate/support/DefaultProviders.php +++ /dev/null @@ -1,101 +0,0 @@ -providers = $providers ?: [ - \Illuminate\Auth\AuthServiceProvider::class, - \Illuminate\Broadcasting\BroadcastServiceProvider::class, - \Illuminate\Bus\BusServiceProvider::class, - \Illuminate\Cache\CacheServiceProvider::class, - \Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class, - \Illuminate\Concurrency\ConcurrencyServiceProvider::class, - \Illuminate\Cookie\CookieServiceProvider::class, - \Illuminate\Database\DatabaseServiceProvider::class, - \Illuminate\Encryption\EncryptionServiceProvider::class, - \Illuminate\Filesystem\FilesystemServiceProvider::class, - \Illuminate\Foundation\Providers\FoundationServiceProvider::class, - \Illuminate\Hashing\HashServiceProvider::class, - \Illuminate\Mail\MailServiceProvider::class, - \Illuminate\Notifications\NotificationServiceProvider::class, - \Illuminate\Pagination\PaginationServiceProvider::class, - \Illuminate\Auth\Passwords\PasswordResetServiceProvider::class, - \Illuminate\Pipeline\PipelineServiceProvider::class, - \Illuminate\Queue\QueueServiceProvider::class, - \Illuminate\Redis\RedisServiceProvider::class, - \Illuminate\Session\SessionServiceProvider::class, - \Illuminate\Translation\TranslationServiceProvider::class, - \Illuminate\Validation\ValidationServiceProvider::class, - \Illuminate\View\ViewServiceProvider::class, - ]; - } - - /** - * Merge the given providers into the provider collection. - * - * @param array $providers - * @return static - */ - public function merge(array $providers) - { - $this->providers = array_merge($this->providers, $providers); - - return new static($this->providers); - } - - /** - * Replace the given providers with other providers. - * - * @param array $replacements - * @return static - */ - public function replace(array $replacements) - { - $current = new Collection($this->providers); - - foreach ($replacements as $from => $to) { - $key = $current->search($from); - - $current = is_int($key) ? $current->replace([$key => $to]) : $current; - } - - return new static($current->values()->toArray()); - } - - /** - * Disable the given providers. - * - * @param array $providers - * @return static - */ - public function except(array $providers) - { - return new static((new Collection($this->providers)) - ->reject(fn ($p) => in_array($p, $providers)) - ->values() - ->toArray()); - } - - /** - * Convert the provider collection to an array. - * - * @return array - */ - public function toArray() - { - return $this->providers; - } -} diff --git a/plugins/vendor/illuminate/support/Defer/DeferredCallback.php b/plugins/vendor/illuminate/support/Defer/DeferredCallback.php deleted file mode 100644 index 6840b495..00000000 --- a/plugins/vendor/illuminate/support/Defer/DeferredCallback.php +++ /dev/null @@ -1,54 +0,0 @@ -name = $name ?? (string) Str::uuid(); - } - - /** - * Specify the name of the deferred callback so it can be cancelled later. - * - * @param string $name - * @return $this - */ - public function name(string $name): static - { - $this->name = $name; - - return $this; - } - - /** - * Indicate that the deferred callback should run even on unsuccessful requests and jobs. - * - * @param bool $always - * @return $this - */ - public function always(bool $always = true): static - { - $this->always = $always; - - return $this; - } - - /** - * Invoke the deferred callback. - * - * @return void - */ - public function __invoke(): void - { - call_user_func($this->callback); - } -} diff --git a/plugins/vendor/illuminate/support/Defer/DeferredCallbackCollection.php b/plugins/vendor/illuminate/support/Defer/DeferredCallbackCollection.php deleted file mode 100644 index 93116ef9..00000000 --- a/plugins/vendor/illuminate/support/Defer/DeferredCallbackCollection.php +++ /dev/null @@ -1,157 +0,0 @@ -callbacks)[0]; - } - - /** - * Invoke the deferred callbacks. - * - * @return void - */ - public function invoke(): void - { - $this->invokeWhen(fn () => true); - } - - /** - * Invoke the deferred callbacks if the given truth test evaluates to true. - * - * @param \Closure|null $when - * @return void - */ - public function invokeWhen(?Closure $when = null): void - { - $when ??= fn () => true; - - $this->forgetDuplicates(); - - foreach ($this->callbacks as $index => $callback) { - if ($when($callback)) { - rescue($callback); - } - - unset($this->callbacks[$index]); - } - } - - /** - * Remove any deferred callbacks with the given name. - * - * @param string $name - * @return void - */ - public function forget(string $name): void - { - $this->callbacks = (new Collection($this->callbacks)) - ->reject(fn ($callback) => $callback->name === $name) - ->values() - ->all(); - } - - /** - * Remove any duplicate callbacks. - * - * @return $this - */ - protected function forgetDuplicates(): static - { - $this->callbacks = (new Collection($this->callbacks)) - ->reverse() - ->unique(fn ($c) => $c->name) - ->reverse() - ->values() - ->all(); - - return $this; - } - - /** - * Determine if the collection has a callback with the given key. - * - * @param mixed $offset - * @return bool - */ - public function offsetExists(mixed $offset): bool - { - $this->forgetDuplicates(); - - return isset($this->callbacks[$offset]); - } - - /** - * Get the callback with the given key. - * - * @param mixed $offset - * @return mixed - */ - public function offsetGet(mixed $offset): mixed - { - $this->forgetDuplicates(); - - return $this->callbacks[$offset]; - } - - /** - * Set the callback with the given key. - * - * @param mixed $offset - * @param mixed $value - * @return void - */ - public function offsetSet(mixed $offset, mixed $value): void - { - if (is_null($offset)) { - $this->callbacks[] = $value; - } else { - $this->callbacks[$offset] = $value; - } - } - - /** - * Remove the callback with the given key from the collection. - * - * @param mixed $offset - * @return void - */ - public function offsetUnset(mixed $offset): void - { - $this->forgetDuplicates(); - - unset($this->callbacks[$offset]); - } - - /** - * Determine how many callbacks are in the collection. - * - * @return int - */ - public function count(): int - { - $this->forgetDuplicates(); - - return count($this->callbacks); - } -} diff --git a/plugins/vendor/illuminate/support/EncodedHtmlString.php b/plugins/vendor/illuminate/support/EncodedHtmlString.php deleted file mode 100644 index 36b29cc3..00000000 --- a/plugins/vendor/illuminate/support/EncodedHtmlString.php +++ /dev/null @@ -1,100 +0,0 @@ -html; - - if ($value instanceof DeferringDisplayableValue) { - $value = $value->resolveDisplayableValue(); - } - - if ($value instanceof Htmlable) { - return $value->toHtml(); - } - - if ($value instanceof BackedEnum) { - $value = $value->value; - } - - return (static::$encodeUsingFactory ?? function ($value, $doubleEncode) { - return static::convert($value, doubleEncode: $doubleEncode); - })($value, $this->doubleEncode); - } - - /** - * Set the callable that will be used to encode the HTML strings. - * - * @param callable|null $factory - * @return void - */ - public static function encodeUsing(?callable $factory = null) - { - static::$encodeUsingFactory = $factory; - } - - /** - * Flush the class's global state. - * - * @return void - */ - public static function flushState() - { - static::$encodeUsingFactory = null; - } -} diff --git a/plugins/vendor/illuminate/support/Env.php b/plugins/vendor/illuminate/support/Env.php deleted file mode 100644 index 8889e7ad..00000000 --- a/plugins/vendor/illuminate/support/Env.php +++ /dev/null @@ -1,309 +0,0 @@ - - */ - protected static $customAdapters = []; - - /** - * Enable the putenv adapter. - * - * @return void - */ - public static function enablePutenv() - { - static::$putenv = true; - static::$repository = null; - } - - /** - * Disable the putenv adapter. - * - * @return void - */ - public static function disablePutenv() - { - static::$putenv = false; - static::$repository = null; - } - - /** - * Register a custom adapter creator Closure. - */ - public static function extend(Closure $callback, ?string $name = null): void - { - if (! is_null($name)) { - static::$customAdapters[$name] = $callback; - } else { - static::$customAdapters[] = $callback; - } - - static::$repository = null; - } - - /** - * Get the environment repository instance. - * - * @return \Dotenv\Repository\RepositoryInterface - */ - public static function getRepository() - { - if (static::$repository === null) { - $builder = RepositoryBuilder::createWithDefaultAdapters(); - - if (static::$putenv) { - $builder = $builder->addAdapter(PutenvAdapter::class); - } - - foreach (static::$customAdapters as $adapter) { - $builder = $builder->addAdapter($adapter()); - } - - static::$repository = $builder->immutable()->make(); - } - - return static::$repository; - } - - /** - * Get the value of an environment variable. - * - * @param string $key - * @param mixed $default - * @return mixed - */ - public static function get($key, $default = null) - { - return self::getOption($key)->getOrCall(fn () => value($default)); - } - - /** - * Get the value of a required environment variable. - * - * @param string $key - * @return mixed - * - * @throws \RuntimeException - */ - public static function getOrFail($key) - { - return self::getOption($key)->getOrThrow(new RuntimeException("Environment variable [$key] has no value.")); - } - - /** - * Write an array of key-value pairs to the environment file. - * - * @param array $variables - * @param string $pathToFile - * @param bool $overwrite - * @return void - * - * @throws \RuntimeException - * @throws \Illuminate\Contracts\Filesystem\FileNotFoundException - */ - public static function writeVariables(array $variables, string $pathToFile, bool $overwrite = false): void - { - $filesystem = new Filesystem; - - if ($filesystem->missing($pathToFile)) { - throw new RuntimeException("The file [{$pathToFile}] does not exist."); - } - - $lines = explode(PHP_EOL, $filesystem->get($pathToFile)); - - foreach ($variables as $key => $value) { - $lines = self::addVariableToEnvContents($key, $value, $lines, $overwrite); - } - - $filesystem->put($pathToFile, implode(PHP_EOL, $lines)); - } - - /** - * Write a single key-value pair to the environment file. - * - * @param string $key - * @param mixed $value - * @param string $pathToFile - * @param bool $overwrite - * @return void - * - * @throws \RuntimeException - * @throws \Illuminate\Contracts\Filesystem\FileNotFoundException - */ - public static function writeVariable(string $key, mixed $value, string $pathToFile, bool $overwrite = false): void - { - $filesystem = new Filesystem; - - if ($filesystem->missing($pathToFile)) { - throw new RuntimeException("The file [{$pathToFile}] does not exist."); - } - - $envContent = $filesystem->get($pathToFile); - - $lines = explode(PHP_EOL, $envContent); - $lines = self::addVariableToEnvContents($key, $value, $lines, $overwrite); - - $filesystem->put($pathToFile, implode(PHP_EOL, $lines)); - } - - /** - * Add a variable to the environment file contents. - * - * @param string $key - * @param mixed $value - * @param array $envLines - * @param bool $overwrite - * @return array - */ - protected static function addVariableToEnvContents(string $key, mixed $value, array $envLines, bool $overwrite): array - { - $prefix = explode('_', $key)[0].'_'; - $lastPrefixIndex = -1; - - $shouldQuote = preg_match('/^[a-zA-Z0-9]+$/', $value) === 0; - - $lineToAddVariations = [ - $key.'='.(is_string($value) ? self::prepareQuotedValue($value) : $value), - $key.'='.$value, - ]; - - $lineToAdd = $shouldQuote ? $lineToAddVariations[0] : $lineToAddVariations[1]; - - if ($value === '') { - $lineToAdd = $key.'='; - } - - foreach ($envLines as $index => $line) { - if (str_starts_with($line, $prefix)) { - $lastPrefixIndex = $index; - } - - if (in_array($line, $lineToAddVariations)) { - // This exact line already exists, so we don't need to add it again. - return $envLines; - } - - if ($line === $key.'=') { - // If the value is empty, we can replace it with the new value. - $envLines[$index] = $lineToAdd; - - return $envLines; - } - - if (str_starts_with($line, $key.'=')) { - if (! $overwrite) { - return $envLines; - } - - $envLines[$index] = $lineToAdd; - - return $envLines; - } - } - - if ($lastPrefixIndex === -1) { - if (count($envLines) && $envLines[count($envLines) - 1] !== '') { - $envLines[] = ''; - } - - return array_merge($envLines, [$lineToAdd]); - } - - return array_merge( - array_slice($envLines, 0, $lastPrefixIndex + 1), - [$lineToAdd], - array_slice($envLines, $lastPrefixIndex + 1) - ); - } - - /** - * Get the possible option for this environment variable. - * - * @param string $key - * @return \PhpOption\Option|\PhpOption\Some - */ - protected static function getOption($key) - { - return Option::fromValue(static::getRepository()->get($key)) - ->map(function ($value) { - switch (strtolower($value)) { - case 'true': - case '(true)': - return true; - case 'false': - case '(false)': - return false; - case 'empty': - case '(empty)': - return ''; - case 'null': - case '(null)': - return; - } - - if (preg_match('/\A([\'"])(.*)\1\z/', $value, $matches)) { - return $matches[2]; - } - - return $value; - }); - } - - /** - * Wrap a string in quotes, choosing double or single quotes. - * - * @param string $input - * @return string - */ - protected static function prepareQuotedValue(string $input) - { - return str_contains($input, '"') - ? "'".self::addSlashesExceptFor($input, ['"'])."'" - : '"'.self::addSlashesExceptFor($input, ["'"]).'"'; - } - - /** - * Escape a string using addslashes, excluding the specified characters from being escaped. - * - * @param string $value - * @param array $except - * @return string - */ - protected static function addSlashesExceptFor(string $value, array $except = []) - { - $escaped = addslashes($value); - - foreach ($except as $character) { - $escaped = str_replace('\\'.$character, $character, $escaped); - } - - return $escaped; - } -} diff --git a/plugins/vendor/illuminate/support/Exceptions/MathException.php b/plugins/vendor/illuminate/support/Exceptions/MathException.php deleted file mode 100644 index 6f9158df..00000000 --- a/plugins/vendor/illuminate/support/Exceptions/MathException.php +++ /dev/null @@ -1,10 +0,0 @@ -providerIsLoaded(UiServiceProvider::class)) { - throw new RuntimeException('In order to use the Auth::routes() method, please install the laravel/ui package.'); - } - - static::$app->make('router')->auth($options); - } -} diff --git a/plugins/vendor/illuminate/support/Facades/Blade.php b/plugins/vendor/illuminate/support/Facades/Blade.php deleted file mode 100755 index ccab9ce1..00000000 --- a/plugins/vendor/illuminate/support/Facades/Blade.php +++ /dev/null @@ -1,63 +0,0 @@ -dispatcher - : static::getFacadeRoot(); - - return tap(new BusFake($actualDispatcher, $jobsToFake, $batchRepository), function ($fake) { - static::swap($fake); - }); - } - - /** - * Dispatch the given chain of jobs. - * - * @param mixed $jobs - * @return \Illuminate\Foundation\Bus\PendingDispatch - */ - public static function dispatchChain($jobs) - { - $jobs = is_array($jobs) ? $jobs : func_get_args(); - - return (new PendingChain(array_shift($jobs), $jobs)) - ->dispatch(); - } - - /** - * Get the registered name of the component. - * - * @return string - */ - protected static function getFacadeAccessor() - { - return BusDispatcherContract::class; - } -} diff --git a/plugins/vendor/illuminate/support/Facades/Cache.php b/plugins/vendor/illuminate/support/Facades/Cache.php deleted file mode 100755 index 5d98d4c9..00000000 --- a/plugins/vendor/illuminate/support/Facades/Cache.php +++ /dev/null @@ -1,106 +0,0 @@ -makePartial(), function ($spy) { - static::swap($spy); - }); - } - - return tap($class ? Mockery::spy($class) : Mockery::spy(), function ($spy) { - static::swap($spy); - }); - } - } -} diff --git a/plugins/vendor/illuminate/support/Facades/Concurrency.php b/plugins/vendor/illuminate/support/Facades/Concurrency.php deleted file mode 100644 index a79bf93c..00000000 --- a/plugins/vendor/illuminate/support/Facades/Concurrency.php +++ /dev/null @@ -1,36 +0,0 @@ -cookie($key, null)); - } - - /** - * Retrieve a cookie from the request. - * - * @param string|null $key - * @param mixed $default - * @return string|array|null - */ - public static function get($key = null, $default = null) - { - return static::$app['request']->cookie($key, $default); - } - - /** - * Get the registered name of the component. - * - * @return string - */ - protected static function getFacadeAccessor() - { - return 'cookie'; - } -} diff --git a/plugins/vendor/illuminate/support/Facades/Crypt.php b/plugins/vendor/illuminate/support/Facades/Crypt.php deleted file mode 100755 index d785eaf4..00000000 --- a/plugins/vendor/illuminate/support/Facades/Crypt.php +++ /dev/null @@ -1,31 +0,0 @@ -dispatcher - : static::getFacadeRoot(); - - return tap(new EventFake($actualDispatcher, $eventsToFake), function ($fake) { - static::swap($fake); - - Model::setEventDispatcher($fake); - Cache::refreshEventDispatcher(); - }); - } - - /** - * Replace the bound instance with a fake that fakes all events except the given events. - * - * @param string[]|string $eventsToAllow - * @return \Illuminate\Support\Testing\Fakes\EventFake - */ - public static function fakeExcept($eventsToAllow) - { - return static::fake([ - function ($eventName) use ($eventsToAllow) { - return ! in_array($eventName, (array) $eventsToAllow); - }, - ]); - } - - /** - * Replace the bound instance with a fake during the given callable's execution. - * - * @param callable $callable - * @param array $eventsToFake - * @return mixed - */ - public static function fakeFor(callable $callable, array $eventsToFake = []) - { - $originalDispatcher = static::getFacadeRoot(); - - static::fake($eventsToFake); - - try { - return $callable(); - } finally { - static::swap($originalDispatcher); - - Model::setEventDispatcher($originalDispatcher); - Cache::refreshEventDispatcher(); - } - } - - /** - * Replace the bound instance with a fake during the given callable's execution. - * - * @param callable $callable - * @param array $eventsToAllow - * @return mixed - */ - public static function fakeExceptFor(callable $callable, array $eventsToAllow = []) - { - $originalDispatcher = static::getFacadeRoot(); - - static::fakeExcept($eventsToAllow); - - try { - return $callable(); - } finally { - static::swap($originalDispatcher); - - Model::setEventDispatcher($originalDispatcher); - Cache::refreshEventDispatcher(); - } - } - - /** - * Get the registered name of the component. - * - * @return string - */ - protected static function getFacadeAccessor() - { - return 'events'; - } -} diff --git a/plugins/vendor/illuminate/support/Facades/Exceptions.php b/plugins/vendor/illuminate/support/Facades/Exceptions.php deleted file mode 100644 index 263b95bd..00000000 --- a/plugins/vendor/illuminate/support/Facades/Exceptions.php +++ /dev/null @@ -1,70 +0,0 @@ ->|class-string<\Throwable> $exceptions - * @return \Illuminate\Support\Testing\Fakes\ExceptionHandlerFake - */ - public static function fake(array|string $exceptions = []) - { - $exceptionHandler = static::isFake() - ? static::getFacadeRoot()->handler() - : static::getFacadeRoot(); - - return tap(new ExceptionHandlerFake($exceptionHandler, Arr::wrap($exceptions)), function ($fake) { - static::swap($fake); - }); - } - - /** - * Get the registered name of the component. - * - * @return string - */ - protected static function getFacadeAccessor() - { - return ExceptionHandler::class; - } -} diff --git a/plugins/vendor/illuminate/support/Facades/Facade.php b/plugins/vendor/illuminate/support/Facades/Facade.php deleted file mode 100755 index 33e3cae9..00000000 --- a/plugins/vendor/illuminate/support/Facades/Facade.php +++ /dev/null @@ -1,365 +0,0 @@ -resolved($accessor) === true) { - $callback(static::getFacadeRoot(), static::$app); - } - - static::$app->afterResolving($accessor, function ($service, $app) use ($callback) { - $callback($service, $app); - }); - } - - /** - * Convert the facade into a Mockery spy. - * - * @return \Mockery\MockInterface - */ - public static function spy() - { - if (! static::isMock()) { - $class = static::getMockableClass(); - - return tap($class ? Mockery::spy($class) : Mockery::spy(), function ($spy) { - static::swap($spy); - }); - } - } - - /** - * Initiate a partial mock on the facade. - * - * @return \Mockery\MockInterface - */ - public static function partialMock() - { - $name = static::getFacadeAccessor(); - - $mock = static::isMock() - ? static::$resolvedInstance[$name] - : static::createFreshMockInstance(); - - return $mock->makePartial(); - } - - /** - * Initiate a mock expectation on the facade. - * - * @return \Mockery\Expectation - */ - public static function shouldReceive() - { - $name = static::getFacadeAccessor(); - - $mock = static::isMock() - ? static::$resolvedInstance[$name] - : static::createFreshMockInstance(); - - return $mock->shouldReceive(...func_get_args()); - } - - /** - * Initiate a mock expectation on the facade. - * - * @return \Mockery\Expectation - */ - public static function expects() - { - $name = static::getFacadeAccessor(); - - $mock = static::isMock() - ? static::$resolvedInstance[$name] - : static::createFreshMockInstance(); - - return $mock->expects(...func_get_args()); - } - - /** - * Create a fresh mock instance for the given class. - * - * @return \Mockery\MockInterface - */ - protected static function createFreshMockInstance() - { - return tap(static::createMock(), function ($mock) { - static::swap($mock); - - $mock->shouldAllowMockingProtectedMethods(); - }); - } - - /** - * Create a fresh mock instance for the given class. - * - * @return \Mockery\MockInterface - */ - protected static function createMock() - { - $class = static::getMockableClass(); - - return $class ? Mockery::mock($class) : Mockery::mock(); - } - - /** - * Determines whether a mock is set as the instance of the facade. - * - * @return bool - */ - protected static function isMock() - { - $name = static::getFacadeAccessor(); - - return isset(static::$resolvedInstance[$name]) && - static::$resolvedInstance[$name] instanceof LegacyMockInterface; - } - - /** - * Get the mockable class for the bound instance. - * - * @return string|null - */ - protected static function getMockableClass() - { - if ($root = static::getFacadeRoot()) { - return get_class($root); - } - } - - /** - * Hotswap the underlying instance behind the facade. - * - * @param mixed $instance - * @return void - */ - public static function swap($instance) - { - static::$resolvedInstance[static::getFacadeAccessor()] = $instance; - - if (isset(static::$app)) { - static::$app->instance(static::getFacadeAccessor(), $instance); - } - } - - /** - * Determines whether a "fake" has been set as the facade instance. - * - * @return bool - */ - public static function isFake() - { - $name = static::getFacadeAccessor(); - - return isset(static::$resolvedInstance[$name]) && - static::$resolvedInstance[$name] instanceof Fake; - } - - /** - * Get the root object behind the facade. - * - * @return mixed - */ - public static function getFacadeRoot() - { - return static::resolveFacadeInstance(static::getFacadeAccessor()); - } - - /** - * Get the registered name of the component. - * - * @return string - * - * @throws \RuntimeException - */ - protected static function getFacadeAccessor() - { - throw new RuntimeException('Facade does not implement getFacadeAccessor method.'); - } - - /** - * Resolve the facade root instance from the container. - * - * @param string $name - * @return mixed - */ - protected static function resolveFacadeInstance($name) - { - if (isset(static::$resolvedInstance[$name])) { - return static::$resolvedInstance[$name]; - } - - if (static::$app) { - if (static::$cached) { - return static::$resolvedInstance[$name] = static::$app[$name]; - } - - return static::$app[$name]; - } - } - - /** - * Clear a resolved facade instance. - * - * @param ?string $name - * @return void - */ - public static function clearResolvedInstance($name = null) - { - unset(static::$resolvedInstance[$name ?? static::getFacadeAccessor()]); - } - - /** - * Clear all of the resolved instances. - * - * @return void - */ - public static function clearResolvedInstances() - { - static::$resolvedInstance = []; - } - - /** - * Get the application default aliases. - * - * @return \Illuminate\Support\Collection - */ - public static function defaultAliases() - { - return new Collection([ - 'App' => App::class, - 'Arr' => Arr::class, - 'Artisan' => Artisan::class, - 'Auth' => Auth::class, - 'Benchmark' => Benchmark::class, - 'Blade' => Blade::class, - 'Broadcast' => Broadcast::class, - 'Bus' => Bus::class, - 'Cache' => Cache::class, - 'Concurrency' => Concurrency::class, - 'Config' => Config::class, - 'Context' => Context::class, - 'Cookie' => Cookie::class, - 'Crypt' => Crypt::class, - 'Date' => Date::class, - 'DB' => DB::class, - 'Eloquent' => Model::class, - 'Event' => Event::class, - 'File' => File::class, - 'Gate' => Gate::class, - 'Hash' => Hash::class, - 'Http' => Http::class, - 'Js' => Js::class, - 'Lang' => Lang::class, - 'Log' => Log::class, - 'Mail' => Mail::class, - 'Notification' => Notification::class, - 'Number' => Number::class, - 'Password' => Password::class, - 'Process' => Process::class, - 'Queue' => Queue::class, - 'RateLimiter' => RateLimiter::class, - 'Redirect' => Redirect::class, - 'Request' => Request::class, - 'Response' => Response::class, - 'Route' => Route::class, - 'Schedule' => Schedule::class, - 'Schema' => Schema::class, - 'Session' => Session::class, - 'Storage' => Storage::class, - 'Str' => Str::class, - 'Uri' => Uri::class, - 'URL' => URL::class, - 'Validator' => Validator::class, - 'View' => View::class, - 'Vite' => Vite::class, - ]); - } - - /** - * Get the application instance behind the facade. - * - * @return \Illuminate\Contracts\Foundation\Application|null - */ - public static function getFacadeApplication() - { - return static::$app; - } - - /** - * Set the application instance. - * - * @param \Illuminate\Contracts\Foundation\Application|null $app - * @return void - */ - public static function setFacadeApplication($app) - { - static::$app = $app; - } - - /** - * Handle dynamic, static calls to the object. - * - * @param string $method - * @param array $args - * @return mixed - * - * @throws \RuntimeException - */ - public static function __callStatic($method, $args) - { - $instance = static::getFacadeRoot(); - - if (! $instance) { - throw new RuntimeException('A facade root has not been set.'); - } - - return $instance->$method(...$args); - } -} diff --git a/plugins/vendor/illuminate/support/Facades/File.php b/plugins/vendor/illuminate/support/Facades/File.php deleted file mode 100755 index 79bbad33..00000000 --- a/plugins/vendor/illuminate/support/Facades/File.php +++ /dev/null @@ -1,73 +0,0 @@ -fake($callback)); - }); - } - - /** - * Register a response sequence for the given URL pattern. - * - * @param string $urlPattern - * @return \Illuminate\Http\Client\ResponseSequence - */ - public static function fakeSequence(string $urlPattern = '*') - { - $fake = tap(static::getFacadeRoot(), function ($fake) { - static::swap($fake); - }); - - return $fake->fakeSequence($urlPattern); - } - - /** - * Indicate that an exception should be thrown if any request is not faked. - * - * @param bool $prevent - * @return \Illuminate\Http\Client\Factory - */ - public static function preventStrayRequests($prevent = true) - { - return tap(static::getFacadeRoot(), function ($fake) use ($prevent) { - static::swap($fake->preventStrayRequests($prevent)); - }); - } - - /** - * Stub the given URL using the given callback. - * - * @param string $url - * @param \Illuminate\Http\Client\Response|\GuzzleHttp\Promise\PromiseInterface|callable $callback - * @return \Illuminate\Http\Client\Factory - */ - public static function stubUrl($url, $callback) - { - return tap(static::getFacadeRoot(), function ($fake) use ($url, $callback) { - static::swap($fake->stubUrl($url, $callback)); - }); - } -} diff --git a/plugins/vendor/illuminate/support/Facades/Lang.php b/plugins/vendor/illuminate/support/Facades/Lang.php deleted file mode 100755 index 7dc08da5..00000000 --- a/plugins/vendor/illuminate/support/Facades/Lang.php +++ /dev/null @@ -1,48 +0,0 @@ -manager - : static::getFacadeRoot(); - - return tap(new MailFake($actualMailManager), function ($fake) { - static::swap($fake); - }); - } - - /** - * Get the registered name of the component. - * - * @return string - */ - protected static function getFacadeAccessor() - { - return 'mail.manager'; - } -} diff --git a/plugins/vendor/illuminate/support/Facades/MaintenanceMode.php b/plugins/vendor/illuminate/support/Facades/MaintenanceMode.php deleted file mode 100644 index b63d4819..00000000 --- a/plugins/vendor/illuminate/support/Facades/MaintenanceMode.php +++ /dev/null @@ -1,29 +0,0 @@ - $route) { - $notifiable->route($channel, $route); - } - - return $notifiable; - } - - /** - * Begin sending a notification to an anonymous notifiable. - * - * @param string $channel - * @param mixed $route - * @return \Illuminate\Notifications\AnonymousNotifiable - */ - public static function route($channel, $route) - { - return (new AnonymousNotifiable)->route($channel, $route); - } - - /** - * Get the registered name of the component. - * - * @return string - */ - protected static function getFacadeAccessor() - { - return ChannelManager::class; - } -} diff --git a/plugins/vendor/illuminate/support/Facades/ParallelTesting.php b/plugins/vendor/illuminate/support/Facades/ParallelTesting.php deleted file mode 100644 index 4a228901..00000000 --- a/plugins/vendor/illuminate/support/Facades/ParallelTesting.php +++ /dev/null @@ -1,36 +0,0 @@ -fake($callback)); - }); - } -} diff --git a/plugins/vendor/illuminate/support/Facades/Queue.php b/plugins/vendor/illuminate/support/Facades/Queue.php deleted file mode 100755 index 71036545..00000000 --- a/plugins/vendor/illuminate/support/Facades/Queue.php +++ /dev/null @@ -1,168 +0,0 @@ - $fake->releaseUniqueJobLocks())->queue - : static::getFacadeRoot(); - - return tap(new QueueFake(static::getFacadeApplication(), $jobsToFake, $actualQueueManager), function ($fake) { - static::swap($fake); - }); - } - - /** - * Replace the bound instance with a fake that fakes all jobs except the given jobs. - * - * @param string[]|string $jobsToAllow - * @return \Illuminate\Support\Testing\Fakes\QueueFake - */ - public static function fakeExcept($jobsToAllow) - { - return static::fake()->except($jobsToAllow); - } - - /** - * Replace the bound instance with a fake during the given callable's execution. - * - * @param callable $callable - * @param array $jobsToFake - * @return mixed - */ - public static function fakeFor(callable $callable, array $jobsToFake = []) - { - $originalQueueManager = static::getFacadeRoot(); - - static::fake($jobsToFake); - - try { - return $callable(); - } finally { - static::swap($originalQueueManager); - } - } - - /** - * Replace the bound instance with a fake during the given callable's execution. - * - * @param callable $callable - * @param array $jobsToAllow - * @return mixed - */ - public static function fakeExceptFor(callable $callable, array $jobsToAllow = []) - { - $originalQueueManager = static::getFacadeRoot(); - - static::fakeExcept($jobsToAllow); - - try { - return $callable(); - } finally { - static::swap($originalQueueManager); - } - } - - /** - * Get the registered name of the component. - * - * @return string - */ - protected static function getFacadeAccessor() - { - return 'queue'; - } -} diff --git a/plugins/vendor/illuminate/support/Facades/RateLimiter.php b/plugins/vendor/illuminate/support/Facades/RateLimiter.php deleted file mode 100644 index 182a700a..00000000 --- a/plugins/vendor/illuminate/support/Facades/RateLimiter.php +++ /dev/null @@ -1,34 +0,0 @@ -') - * @method static \Symfony\Component\HttpFoundation\StreamedResponse stream(callable|null $callback, int $status = 200, array $headers = []) - * @method static \Symfony\Component\HttpFoundation\StreamedJsonResponse streamJson(array $data, int $status = 200, array $headers = [], int $encodingOptions = 15) - * @method static \Symfony\Component\HttpFoundation\StreamedResponse streamDownload(callable $callback, string|null $name = null, array $headers = [], string|null $disposition = 'attachment') - * @method static \Symfony\Component\HttpFoundation\BinaryFileResponse download(\SplFileInfo|string $file, string|null $name = null, array $headers = [], string|null $disposition = 'attachment') - * @method static \Symfony\Component\HttpFoundation\BinaryFileResponse file(\SplFileInfo|string $file, array $headers = []) - * @method static \Illuminate\Http\RedirectResponse redirectTo(string $path, int $status = 302, array $headers = [], bool|null $secure = null) - * @method static \Illuminate\Http\RedirectResponse redirectToRoute(\BackedEnum|string $route, mixed $parameters = [], int $status = 302, array $headers = []) - * @method static \Illuminate\Http\RedirectResponse redirectToAction(array|string $action, mixed $parameters = [], int $status = 302, array $headers = []) - * @method static \Illuminate\Http\RedirectResponse redirectGuest(string $path, int $status = 302, array $headers = [], bool|null $secure = null) - * @method static \Illuminate\Http\RedirectResponse redirectToIntended(string $default = '/', int $status = 302, array $headers = [], bool|null $secure = null) - * @method static void macro(string $name, object|callable $macro) - * @method static void mixin(object $mixin, bool $replace = true) - * @method static bool hasMacro(string $name) - * @method static void flushMacros() - * - * @see \Illuminate\Routing\ResponseFactory - */ -class Response extends Facade -{ - /** - * Get the registered name of the component. - * - * @return string - */ - protected static function getFacadeAccessor() - { - return ResponseFactoryContract::class; - } -} diff --git a/plugins/vendor/illuminate/support/Facades/Route.php b/plugins/vendor/illuminate/support/Facades/Route.php deleted file mode 100755 index 7b0e1c0c..00000000 --- a/plugins/vendor/illuminate/support/Facades/Route.php +++ /dev/null @@ -1,119 +0,0 @@ -connection($name)->getSchemaBuilder(); - } - - /** - * Get the registered name of the component. - * - * @return string - */ - protected static function getFacadeAccessor() - { - return 'db.schema'; - } -} diff --git a/plugins/vendor/illuminate/support/Facades/Session.php b/plugins/vendor/illuminate/support/Facades/Session.php deleted file mode 100755 index 269a9851..00000000 --- a/plugins/vendor/illuminate/support/Facades/Session.php +++ /dev/null @@ -1,90 +0,0 @@ -get('filesystems.default')); - - if ($token = ParallelTesting::token()) { - $root = "{$root}_test_{$token}"; - } - - (new Filesystem)->cleanDirectory($root); - - static::set($disk, $fake = static::createLocalDriver( - self::buildDiskConfiguration($disk, $config, root: $root) - )); - - return tap($fake, function ($fake) { - $fake->buildTemporaryUrlsUsing(function ($path, $expiration) { - return URL::to($path.'?expiration='.$expiration->getTimestamp()); - }); - - $fake->buildTemporaryUploadUrlsUsing(function ($path, $expiration) { - return ['url' => URL::to($path.'?expiration='.$expiration->getTimestamp()), 'headers' => []]; - }); - }); - } - - /** - * Replace the given disk with a persistent local testing disk. - * - * @param \UnitEnum|string|null $disk - * @param array $config - * @return \Illuminate\Filesystem\LocalFilesystemAdapter - */ - public static function persistentFake($disk = null, array $config = []) - { - $disk = enum_value($disk) ?: static::$app['config']->get('filesystems.default'); - - static::set($disk, $fake = static::createLocalDriver( - self::buildDiskConfiguration($disk, $config, root: self::getRootPath($disk)) - )); - - return $fake; - } - - /** - * Get the root path of the given disk. - * - * @param string $disk - * @return string - */ - protected static function getRootPath(string $disk): string - { - return storage_path('framework/testing/disks/'.$disk); - } - - /** - * Assemble the configuration of the given disk. - * - * @param string $disk - * @param array $config - * @param string $root - * @return array - */ - protected static function buildDiskConfiguration(string $disk, array $config, string $root): array - { - $originalConfig = static::$app['config']["filesystems.disks.{$disk}"] ?? []; - - return array_merge([ - 'throw' => $originalConfig['throw'] ?? false], - $config, - ['root' => $root] - ); - } - - /** - * Get the registered name of the component. - * - * @return string - */ - protected static function getFacadeAccessor() - { - return 'filesystem'; - } -} diff --git a/plugins/vendor/illuminate/support/Facades/URL.php b/plugins/vendor/illuminate/support/Facades/URL.php deleted file mode 100755 index acd1107c..00000000 --- a/plugins/vendor/illuminate/support/Facades/URL.php +++ /dev/null @@ -1,66 +0,0 @@ - - * @implements \ArrayAccess - */ -class Fluent implements Arrayable, ArrayAccess, IteratorAggregate, Jsonable, JsonSerializable -{ - use Conditionable, InteractsWithData, Macroable { - __call as macroCall; - } - - /** - * All of the attributes set on the fluent instance. - * - * @var array - */ - protected $attributes = []; - - /** - * Create a new fluent instance. - * - * @param iterable $attributes - */ - public function __construct($attributes = []) - { - $this->fill($attributes); - } - - /** - * Create a new fluent instance. - * - * @param iterable $attributes - * @return static - */ - public static function make($attributes = []) - { - return new static($attributes); - } - - /** - * Get an attribute from the fluent instance using "dot" notation. - * - * @template TGetDefault - * - * @param TKey $key - * @param TGetDefault|(\Closure(): TGetDefault) $default - * @return TValue|TGetDefault - */ - public function get($key, $default = null) - { - return data_get($this->attributes, $key, $default); - } - - /** - * Set an attribute on the fluent instance using "dot" notation. - * - * @param TKey $key - * @param TValue $value - * @return $this - */ - public function set($key, $value) - { - data_set($this->attributes, $key, $value); - - return $this; - } - - /** - * Fill the fluent instance with an array of attributes. - * - * @param iterable $attributes - * @return $this - */ - public function fill($attributes) - { - foreach ($attributes as $key => $value) { - $this->attributes[$key] = $value; - } - - return $this; - } - - /** - * Get an attribute from the fluent instance. - * - * @param string $key - * @param mixed $default - * @return mixed - */ - public function value($key, $default = null) - { - if (array_key_exists($key, $this->attributes)) { - return $this->attributes[$key]; - } - - return value($default); - } - - /** - * Get the value of the given key as a new Fluent instance. - * - * @param string $key - * @param mixed $default - * @return static - */ - public function scope($key, $default = null) - { - return new static( - (array) $this->get($key, $default) - ); - } - - /** - * Get all of the attributes from the fluent instance. - * - * @param mixed $keys - * @return array - */ - public function all($keys = null) - { - $data = $this->data(); - - if (! $keys) { - return $data; - } - - $results = []; - - foreach (is_array($keys) ? $keys : func_get_args() as $key) { - Arr::set($results, $key, Arr::get($data, $key)); - } - - return $results; - } - - /** - * Get data from the fluent instance. - * - * @param string|null $key - * @param mixed $default - * @return mixed - */ - protected function data($key = null, $default = null) - { - return $this->get($key, $default); - } - - /** - * Get the attributes from the fluent instance. - * - * @return array - */ - public function getAttributes() - { - return $this->attributes; - } - - /** - * Convert the fluent instance to an array. - * - * @return array - */ - public function toArray() - { - return $this->attributes; - } - - /** - * Convert the object into something JSON serializable. - * - * @return array - */ - public function jsonSerialize(): array - { - return $this->toArray(); - } - - /** - * Convert the fluent instance to JSON. - * - * @param int $options - * @return string - */ - public function toJson($options = 0) - { - return json_encode($this->jsonSerialize(), $options); - } - - /** - * Convert the fluent instance to pretty print formatted JSON. - * - * @param int $options - * @return string - */ - public function toPrettyJson(int $options = 0) - { - return $this->toJson(JSON_PRETTY_PRINT | $options); - } - - /** - * Determine if the fluent instance is empty. - * - * @return bool - */ - public function isEmpty(): bool - { - return empty($this->attributes); - } - - /** - * Determine if the fluent instance is not empty. - * - * @return bool - */ - public function isNotEmpty(): bool - { - return ! $this->isEmpty(); - } - - /** - * Determine if the given offset exists. - * - * @param TKey $offset - * @return bool - */ - public function offsetExists($offset): bool - { - return isset($this->attributes[$offset]); - } - - /** - * Get the value for a given offset. - * - * @param TKey $offset - * @return TValue|null - */ - public function offsetGet($offset): mixed - { - return $this->value($offset); - } - - /** - * Set the value at the given offset. - * - * @param TKey $offset - * @param TValue $value - * @return void - */ - public function offsetSet($offset, $value): void - { - $this->attributes[$offset] = $value; - } - - /** - * Unset the value at the given offset. - * - * @param TKey $offset - * @return void - */ - public function offsetUnset($offset): void - { - unset($this->attributes[$offset]); - } - - /** - * Get an iterator for the attributes. - * - * @return ArrayIterator - */ - public function getIterator(): Traversable - { - return new ArrayIterator($this->attributes); - } - - /** - * Handle dynamic calls to the fluent instance to set attributes. - * - * @param TKey $method - * @param array{0: ?TValue} $parameters - * @return $this - */ - public function __call($method, $parameters) - { - if (static::hasMacro($method)) { - return $this->macroCall($method, $parameters); - } - - $this->attributes[$method] = count($parameters) > 0 ? array_first($parameters) : true; - - return $this; - } - - /** - * Dynamically retrieve the value of an attribute. - * - * @param TKey $key - * @return TValue|null - */ - public function __get($key) - { - return $this->value($key); - } - - /** - * Dynamically set the value of an attribute. - * - * @param TKey $key - * @param TValue $value - * @return void - */ - public function __set($key, $value) - { - $this->offsetSet($key, $value); - } - - /** - * Dynamically check if an attribute is set. - * - * @param TKey $key - * @return bool - */ - public function __isset($key) - { - return $this->offsetExists($key); - } - - /** - * Dynamically unset an attribute. - * - * @param TKey $key - * @return void - */ - public function __unset($key) - { - $this->offsetUnset($key); - } -} diff --git a/plugins/vendor/illuminate/support/HigherOrderTapProxy.php b/plugins/vendor/illuminate/support/HigherOrderTapProxy.php deleted file mode 100644 index 85201f08..00000000 --- a/plugins/vendor/illuminate/support/HigherOrderTapProxy.php +++ /dev/null @@ -1,37 +0,0 @@ -target = $target; - } - - /** - * Dynamically pass method calls to the target. - * - * @param string $method - * @param array $parameters - * @return mixed - */ - public function __call($method, $parameters) - { - $this->target->{$method}(...$parameters); - - return $this->target; - } -} diff --git a/plugins/vendor/illuminate/support/HtmlString.php b/plugins/vendor/illuminate/support/HtmlString.php deleted file mode 100644 index 6b8d98cc..00000000 --- a/plugins/vendor/illuminate/support/HtmlString.php +++ /dev/null @@ -1,66 +0,0 @@ -html = $html; - } - - /** - * Get the HTML string. - * - * @return string - */ - public function toHtml() - { - return $this->html; - } - - /** - * Determine if the given HTML string is empty. - * - * @return bool - */ - public function isEmpty() - { - return ($this->html ?? '') === ''; - } - - /** - * Determine if the given HTML string is not empty. - * - * @return bool - */ - public function isNotEmpty() - { - return ! $this->isEmpty(); - } - - /** - * Get the HTML string. - * - * @return string - */ - public function __toString() - { - return $this->toHtml() ?? ''; - } -} diff --git a/plugins/vendor/illuminate/support/InteractsWithTime.php b/plugins/vendor/illuminate/support/InteractsWithTime.php deleted file mode 100644 index 43a747cb..00000000 --- a/plugins/vendor/illuminate/support/InteractsWithTime.php +++ /dev/null @@ -1,83 +0,0 @@ -parseDateInterval($delay); - - return $delay instanceof DateTimeInterface - ? max(0, $delay->getTimestamp() - $this->currentTime()) - : (int) $delay; - } - - /** - * Get the "available at" UNIX timestamp. - * - * @param \DateTimeInterface|\DateInterval|int $delay - * @return int - */ - protected function availableAt($delay = 0) - { - $delay = $this->parseDateInterval($delay); - - return $delay instanceof DateTimeInterface - ? $delay->getTimestamp() - : Carbon::now()->addSeconds($delay)->getTimestamp(); - } - - /** - * If the given value is an interval, convert it to a DateTime instance. - * - * @param \DateTimeInterface|\DateInterval|int $delay - * @return \DateTimeInterface|int - */ - protected function parseDateInterval($delay) - { - if ($delay instanceof DateInterval) { - $delay = Carbon::now()->add($delay); - } - - return $delay; - } - - /** - * Get the current system time as a UNIX timestamp. - * - * @return int - */ - protected function currentTime() - { - return Carbon::now()->getTimestamp(); - } - - /** - * Given a start time, format the total run time for human readability. - * - * @param float $startTime - * @param float|null $endTime - * @return string - */ - protected function runTimeForHumans($startTime, $endTime = null) - { - $endTime ??= microtime(true); - - $runTime = ($endTime - $startTime) * 1000; - - return $runTime > 1000 - ? CarbonInterval::milliseconds($runTime)->cascade()->forHumans(short: true) - : number_format($runTime, 2).'ms'; - } -} diff --git a/plugins/vendor/illuminate/support/Js.php b/plugins/vendor/illuminate/support/Js.php deleted file mode 100644 index 7203fbcd..00000000 --- a/plugins/vendor/illuminate/support/Js.php +++ /dev/null @@ -1,159 +0,0 @@ -js = $this->convertDataToJavaScriptExpression($data, $flags, $depth); - } - - /** - * Create a new JavaScript string from the given data. - * - * @param mixed $data - * @param int $flags - * @param int $depth - * @return static - * - * @throws \JsonException - */ - public static function from($data, $flags = 0, $depth = 512) - { - return new static($data, $flags, $depth); - } - - /** - * Convert the given data to a JavaScript expression. - * - * @param mixed $data - * @param int $flags - * @param int $depth - * @return string - * - * @throws \JsonException - */ - protected function convertDataToJavaScriptExpression($data, $flags = 0, $depth = 512) - { - if ($data instanceof self) { - return $data->toHtml(); - } - - if ($data instanceof Htmlable && - ! $data instanceof Arrayable && - ! $data instanceof Jsonable && - ! $data instanceof JsonSerializable) { - $data = $data->toHtml(); - } - - if ($data instanceof UnitEnum) { - $data = enum_value($data); - } - - $json = static::encode($data, $flags, $depth); - - if (is_string($data)) { - return "'".substr($json, 1, -1)."'"; - } - - return $this->convertJsonToJavaScriptExpression($json, $flags); - } - - /** - * Encode the given data as JSON. - * - * Invalid UTF-8 sequences are replaced with � instead of throwing. - * - * @param mixed $data - * @param int $flags - * @param int $depth - * @return string - * - * @throws \JsonException - */ - public static function encode($data, $flags = 0, $depth = 512) - { - if ($data instanceof Jsonable) { - return $data->toJson($flags | static::REQUIRED_FLAGS); - } - - if ($data instanceof Arrayable && ! ($data instanceof JsonSerializable)) { - $data = $data->toArray(); - } - - return json_encode($data, $flags | static::REQUIRED_FLAGS | JSON_INVALID_UTF8_SUBSTITUTE, $depth); - } - - /** - * Convert the given JSON to a JavaScript expression. - * - * @param string $json - * @param int $flags - * @return string - * - * @throws \JsonException - */ - protected function convertJsonToJavaScriptExpression($json, $flags = 0) - { - if ($json === '[]' || $json === '{}') { - return $json; - } - - if (Str::startsWith($json, ['"', '{', '['])) { - return "JSON.parse('".substr(json_encode($json, $flags | static::REQUIRED_FLAGS), 1, -1)."')"; - } - - return $json; - } - - /** - * Get the string representation of the data for use in HTML. - * - * @return string - */ - public function toHtml() - { - return $this->js; - } - - /** - * Get the string representation of the data for use in HTML. - * - * @return string - */ - public function __toString() - { - return $this->toHtml(); - } -} diff --git a/plugins/vendor/illuminate/support/LICENSE.md b/plugins/vendor/illuminate/support/LICENSE.md deleted file mode 100644 index 79810c84..00000000 --- a/plugins/vendor/illuminate/support/LICENSE.md +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Taylor Otwell - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/plugins/vendor/illuminate/support/Lottery.php b/plugins/vendor/illuminate/support/Lottery.php deleted file mode 100644 index 183cf957..00000000 --- a/plugins/vendor/illuminate/support/Lottery.php +++ /dev/null @@ -1,284 +0,0 @@ -|null $outOf - */ - public function __construct($chances, $outOf = null) - { - if ($outOf === null && is_float($chances) && $chances > 1) { - throw new RuntimeException('Float must not be greater than 1.'); - } - - if ($outOf !== null && $outOf < 1) { - throw new RuntimeException('Lottery "out of" value must be greater than or equal to 1.'); - } - - $this->chances = $chances; - - $this->outOf = $outOf; - } - - /** - * Create a new Lottery instance. - * - * @param int|float $chances - * @param int|null $outOf - * @return static - */ - public static function odds($chances, $outOf = null) - { - return new static($chances, $outOf); - } - - /** - * Set the winner callback. - * - * @param callable $callback - * @return $this - */ - public function winner($callback) - { - $this->winner = $callback; - - return $this; - } - - /** - * Set the loser callback. - * - * @param callable $callback - * @return $this - */ - public function loser($callback) - { - $this->loser = $callback; - - return $this; - } - - /** - * Run the lottery. - * - * @param mixed ...$args - * @return mixed - */ - public function __invoke(...$args) - { - return $this->runCallback(...$args); - } - - /** - * Run the lottery. - * - * @param null|int $times - * @return mixed - */ - public function choose($times = null) - { - if ($times === null) { - return $this->runCallback(); - } - - $results = []; - - for ($i = 0; $i < $times; $i++) { - $results[] = $this->runCallback(); - } - - return $results; - } - - /** - * Run the winner or loser callback, randomly. - * - * @param mixed ...$args - * @return callable - */ - protected function runCallback(...$args) - { - return $this->wins() - ? ($this->winner ?? fn () => true)(...$args) - : ($this->loser ?? fn () => false)(...$args); - } - - /** - * Determine if the lottery "wins" or "loses". - * - * @return bool - */ - protected function wins() - { - return static::resultFactory()($this->chances, $this->outOf); - } - - /** - * The factory that determines the lottery result. - * - * @return callable - */ - protected static function resultFactory() - { - return static::$resultFactory ?? fn ($chances, $outOf) => $outOf === null - ? random_int(0, PHP_INT_MAX) / PHP_INT_MAX <= $chances - : random_int(1, $outOf) <= $chances; - } - - /** - * Force the lottery to always result in a win. - * - * @param callable|null $callback - * @return void - */ - public static function alwaysWin($callback = null) - { - self::setResultFactory(fn () => true); - - if ($callback === null) { - return; - } - - $callback(); - - static::determineResultNormally(); - } - - /** - * Force the lottery to always result in a lose. - * - * @param callable|null $callback - * @return void - */ - public static function alwaysLose($callback = null) - { - self::setResultFactory(fn () => false); - - if ($callback === null) { - return; - } - - $callback(); - - static::determineResultNormally(); - } - - /** - * Set the sequence that will be used to determine lottery results. - * - * @param array $sequence - * @param callable|null $whenMissing - * @return void - */ - public static function fix($sequence, $whenMissing = null) - { - static::forceResultWithSequence($sequence, $whenMissing); - } - - /** - * Set the sequence that will be used to determine lottery results. - * - * @param array $sequence - * @param callable|null $whenMissing - * @return void - */ - public static function forceResultWithSequence($sequence, $whenMissing = null) - { - $next = 0; - - $whenMissing ??= function ($chances, $outOf) use (&$next) { - $factoryCache = static::$resultFactory; - - static::$resultFactory = null; - - $result = static::resultFactory()($chances, $outOf); - - static::$resultFactory = $factoryCache; - - $next++; - - return $result; - }; - - static::setResultFactory(function ($chances, $outOf) use (&$next, $sequence, $whenMissing) { - if (array_key_exists($next, $sequence)) { - return $sequence[$next++]; - } - - return $whenMissing($chances, $outOf); - }); - } - - /** - * Indicate that the lottery results should be determined normally. - * - * @return void - */ - public static function determineResultsNormally() - { - static::determineResultNormally(); - } - - /** - * Indicate that the lottery results should be determined normally. - * - * @return void - */ - public static function determineResultNormally() - { - static::$resultFactory = null; - } - - /** - * Set the factory that should be used to determine the lottery results. - * - * @param callable $factory - * @return void - */ - public static function setResultFactory($factory) - { - self::$resultFactory = $factory; - } -} diff --git a/plugins/vendor/illuminate/support/Manager.php b/plugins/vendor/illuminate/support/Manager.php deleted file mode 100755 index 5a1052e4..00000000 --- a/plugins/vendor/illuminate/support/Manager.php +++ /dev/null @@ -1,188 +0,0 @@ -container = $container; - $this->config = $container->make('config'); - } - - /** - * Get the default driver name. - * - * @return string|null - */ - abstract public function getDefaultDriver(); - - /** - * Get a driver instance. - * - * @param string|null $driver - * @return mixed - * - * @throws \InvalidArgumentException - */ - public function driver($driver = null) - { - $driver = $driver ?: $this->getDefaultDriver(); - - if (is_null($driver)) { - throw new InvalidArgumentException(sprintf( - 'Unable to resolve NULL driver for [%s].', static::class - )); - } - - // If the given driver has not been created before, we will create the instances - // here and cache it so we can return it next time very quickly. If there is - // already a driver created by this name, we'll just return that instance. - return $this->drivers[$driver] ??= $this->createDriver($driver); - } - - /** - * Create a new driver instance. - * - * @param string $driver - * @return mixed - * - * @throws \InvalidArgumentException - */ - protected function createDriver($driver) - { - // First, we will determine if a custom driver creator exists for the given driver and - // if it does not we will check for a creator method for the driver. Custom creator - // callbacks allow developers to build their own "drivers" easily using Closures. - if (isset($this->customCreators[$driver])) { - return $this->callCustomCreator($driver); - } - - $method = 'create'.Str::studly($driver).'Driver'; - - if (method_exists($this, $method)) { - return $this->$method(); - } - - throw new InvalidArgumentException("Driver [$driver] not supported."); - } - - /** - * Call a custom driver creator. - * - * @param string $driver - * @return mixed - */ - protected function callCustomCreator($driver) - { - return $this->customCreators[$driver]($this->container); - } - - /** - * Register a custom driver creator Closure. - * - * @param string $driver - * @param \Closure $callback - * @return $this - */ - public function extend($driver, Closure $callback) - { - $this->customCreators[$driver] = $callback; - - return $this; - } - - /** - * Get all of the created "drivers". - * - * @return array - */ - public function getDrivers() - { - return $this->drivers; - } - - /** - * Get the container instance used by the manager. - * - * @return \Illuminate\Contracts\Container\Container - */ - public function getContainer() - { - return $this->container; - } - - /** - * Set the container instance used by the manager. - * - * @param \Illuminate\Contracts\Container\Container $container - * @return $this - */ - public function setContainer(Container $container) - { - $this->container = $container; - - return $this; - } - - /** - * Forget all of the resolved driver instances. - * - * @return $this - */ - public function forgetDrivers() - { - $this->drivers = []; - - return $this; - } - - /** - * Dynamically call the default driver instance. - * - * @param string $method - * @param array $parameters - * @return mixed - */ - public function __call($method, $parameters) - { - return $this->driver()->$method(...$parameters); - } -} diff --git a/plugins/vendor/illuminate/support/MessageBag.php b/plugins/vendor/illuminate/support/MessageBag.php deleted file mode 100755 index 983d5d8c..00000000 --- a/plugins/vendor/illuminate/support/MessageBag.php +++ /dev/null @@ -1,454 +0,0 @@ -> - */ - protected $messages = []; - - /** - * Default format for message output. - * - * @var string - */ - protected $format = ':message'; - - /** - * Create a new message bag instance. - * - * @param array> $messages - */ - public function __construct(array $messages = []) - { - foreach ($messages as $key => $value) { - $value = $value instanceof Arrayable ? $value->toArray() : (array) $value; - - $this->messages[$key] = array_unique($value); - } - } - - /** - * Get the keys present in the message bag. - * - * @return array - */ - public function keys() - { - return array_keys($this->messages); - } - - /** - * Add a message to the message bag. - * - * @param string $key - * @param string $message - * @return $this - */ - public function add($key, $message) - { - if ($this->isUnique($key, $message)) { - $this->messages[$key][] = $message; - } - - return $this; - } - - /** - * Add a message to the message bag if the given conditional is "true". - * - * @param bool $boolean - * @param string $key - * @param string $message - * @return $this - */ - public function addIf($boolean, $key, $message) - { - return $boolean ? $this->add($key, $message) : $this; - } - - /** - * Determine if a key and message combination already exists. - * - * @param string $key - * @param string $message - * @return bool - */ - protected function isUnique($key, $message) - { - $messages = (array) $this->messages; - - return ! isset($messages[$key]) || ! in_array($message, $messages[$key]); - } - - /** - * Merge a new array of messages into the message bag. - * - * @param \Illuminate\Contracts\Support\MessageProvider|array> $messages - * @return $this - */ - public function merge($messages) - { - if ($messages instanceof MessageProvider) { - $messages = $messages->getMessageBag()->getMessages(); - } - - $this->messages = array_merge_recursive($this->messages, $messages); - - return $this; - } - - /** - * Determine if messages exist for all of the given keys. - * - * @param array|string|null $key - * @return bool - */ - public function has($key) - { - if ($this->isEmpty()) { - return false; - } - - if (is_null($key)) { - return $this->any(); - } - - $keys = is_array($key) ? $key : func_get_args(); - - foreach ($keys as $key) { - if ($this->first($key) === '') { - return false; - } - } - - return true; - } - - /** - * Determine if messages exist for any of the given keys. - * - * @param array|string|null $keys - * @return bool - */ - public function hasAny($keys = []) - { - if ($this->isEmpty()) { - return false; - } - - $keys = is_array($keys) ? $keys : func_get_args(); - - foreach ($keys as $key) { - if ($this->has($key)) { - return true; - } - } - - return false; - } - - /** - * Determine if messages don't exist for all of the given keys. - * - * @param array|string|null $key - * @return bool - */ - public function missing($key) - { - $keys = is_array($key) ? $key : func_get_args(); - - return ! $this->hasAny($keys); - } - - /** - * Get the first message from the message bag for a given key. - * - * @param string|null $key - * @param string|null $format - * @return string - */ - public function first($key = null, $format = null) - { - $messages = is_null($key) ? $this->all($format) : $this->get($key, $format); - - $firstMessage = Arr::first($messages, null, ''); - - return is_array($firstMessage) ? Arr::first($firstMessage) : $firstMessage; - } - - /** - * Get all of the messages from the message bag for a given key. - * - * @param string $key - * @param string|null $format - * @return array|array> - */ - public function get($key, $format = null) - { - // If the message exists in the message bag, we will transform it and return - // the message. Otherwise, we will check if the key is implicit & collect - // all the messages that match the given key and output it as an array. - if (array_key_exists($key, $this->messages)) { - return $this->transform( - $this->messages[$key], $this->checkFormat($format), $key - ); - } - - if (str_contains($key, '*')) { - return $this->getMessagesForWildcardKey($key, $format); - } - - return []; - } - - /** - * Get the messages for a wildcard key. - * - * @param string $key - * @param string|null $format - * @return array> - */ - protected function getMessagesForWildcardKey($key, $format) - { - return (new Collection($this->messages)) - ->filter(fn ($messages, $messageKey) => Str::is($key, $messageKey)) - ->map(function ($messages, $messageKey) use ($format) { - return $this->transform($messages, $this->checkFormat($format), $messageKey); - }) - ->all(); - } - - /** - * Get all of the messages for every key in the message bag. - * - * @param string|null $format - * @return array - */ - public function all($format = null) - { - $format = $this->checkFormat($format); - - $all = []; - - foreach ($this->messages as $key => $messages) { - array_push($all, ...$this->transform($messages, $format, $key)); - } - - return $all; - } - - /** - * Get all of the unique messages for every key in the message bag. - * - * @param string|null $format - * @return array - */ - public function unique($format = null) - { - return array_unique($this->all($format)); - } - - /** - * Remove a message from the message bag. - * - * @param string $key - * @return $this - */ - public function forget($key) - { - unset($this->messages[$key]); - - return $this; - } - - /** - * Format an array of messages. - * - * @param array $messages - * @param string $format - * @param string $messageKey - * @return array - */ - protected function transform($messages, $format, $messageKey) - { - if ($format == ':message') { - return (array) $messages; - } - - return (new Collection((array) $messages)) - ->map(function ($message) use ($format, $messageKey) { - // We will simply spin through the given messages and transform each one - // replacing the :message place holder with the real message allowing - // the messages to be easily formatted to each developer's desires. - return str_replace([':message', ':key'], [$message, $messageKey], $format); - })->all(); - } - - /** - * Get the appropriate format based on the given format. - * - * @param string $format - * @return string - */ - protected function checkFormat($format) - { - return $format ?: $this->format; - } - - /** - * Get the raw messages in the message bag. - * - * @return array> - */ - public function messages() - { - return $this->messages; - } - - /** - * Get the raw messages in the message bag. - * - * @return array> - */ - public function getMessages() - { - return $this->messages(); - } - - /** - * Get the messages for the instance. - * - * @return \Illuminate\Support\MessageBag - */ - public function getMessageBag() - { - return $this; - } - - /** - * Get the default message format. - * - * @return string - */ - public function getFormat() - { - return $this->format; - } - - /** - * Set the default message format. - * - * @param string $format - * @return \Illuminate\Support\MessageBag - */ - public function setFormat($format = ':message') - { - $this->format = $format; - - return $this; - } - - /** - * Determine if the message bag has any messages. - * - * @return bool - */ - public function isEmpty() - { - return ! $this->any(); - } - - /** - * Determine if the message bag has any messages. - * - * @return bool - */ - public function isNotEmpty() - { - return $this->any(); - } - - /** - * Determine if the message bag has any messages. - * - * @return bool - */ - public function any() - { - return $this->count() > 0; - } - - /** - * Get the number of messages in the message bag. - * - * @return int - */ - public function count(): int - { - return count($this->messages, COUNT_RECURSIVE) - count($this->messages); - } - - /** - * Get the instance as an array. - * - * @return array - */ - public function toArray() - { - return $this->getMessages(); - } - - /** - * Convert the object into something JSON serializable. - * - * @return array - */ - public function jsonSerialize(): array - { - return $this->toArray(); - } - - /** - * Convert the object to its JSON representation. - * - * @param int $options - * @return string - */ - public function toJson($options = 0) - { - return json_encode($this->jsonSerialize(), $options); - } - - /** - * Convert the object to pretty print formatted JSON. - * - * @param int $options - * @return string - */ - public function toPrettyJson(int $options = 0) - { - return $this->toJson(JSON_PRETTY_PRINT | $options); - } - - /** - * Convert the message bag to its string representation. - * - * @return string - */ - public function __toString() - { - return $this->toJson(); - } -} diff --git a/plugins/vendor/illuminate/support/MultipleInstanceManager.php b/plugins/vendor/illuminate/support/MultipleInstanceManager.php deleted file mode 100644 index 66fff08e..00000000 --- a/plugins/vendor/illuminate/support/MultipleInstanceManager.php +++ /dev/null @@ -1,230 +0,0 @@ -app = $app; - $this->config = $app->make('config'); - } - - /** - * Get the default instance name. - * - * @return string - */ - abstract public function getDefaultInstance(); - - /** - * Set the default instance name. - * - * @param string $name - * @return void - */ - abstract public function setDefaultInstance($name); - - /** - * Get the instance specific configuration. - * - * @param string $name - * @return array - */ - abstract public function getInstanceConfig($name); - - /** - * Get an instance by name. - * - * @param string|null $name - * @return mixed - */ - public function instance($name = null) - { - $name = $name ?: $this->getDefaultInstance(); - - return $this->instances[$name] = $this->get($name); - } - - /** - * Attempt to get an instance from the local cache. - * - * @param string $name - * @return mixed - */ - protected function get($name) - { - return $this->instances[$name] ?? $this->resolve($name); - } - - /** - * Resolve the given instance. - * - * @param string $name - * @return mixed - * - * @throws \InvalidArgumentException - * @throws \RuntimeException - */ - protected function resolve($name) - { - $config = $this->getInstanceConfig($name); - - if (is_null($config)) { - throw new InvalidArgumentException("Instance [{$name}] is not defined."); - } - - if (! array_key_exists($this->driverKey, $config)) { - throw new RuntimeException("Instance [{$name}] does not specify a {$this->driverKey}."); - } - - $driverName = $config[$this->driverKey]; - - if (isset($this->customCreators[$driverName])) { - return $this->callCustomCreator($config); - } else { - $createMethod = 'create'.ucfirst($driverName).ucfirst($this->driverKey); - - if (method_exists($this, $createMethod)) { - return $this->{$createMethod}($config); - } - - $createMethod = 'create'.Str::studly($driverName).ucfirst($this->driverKey); - - if (method_exists($this, $createMethod)) { - return $this->{$createMethod}($config); - } - - throw new InvalidArgumentException("Instance {$this->driverKey} [{$config[$this->driverKey]}] is not supported."); - } - } - - /** - * Call a custom instance creator. - * - * @param array $config - * @return mixed - */ - protected function callCustomCreator(array $config) - { - return $this->customCreators[$config[$this->driverKey]]($this->app, $config); - } - - /** - * Unset the given instances. - * - * @param array|string|null $name - * @return $this - */ - public function forgetInstance($name = null) - { - $name ??= $this->getDefaultInstance(); - - foreach ((array) $name as $instanceName) { - if (isset($this->instances[$instanceName])) { - unset($this->instances[$instanceName]); - } - } - - return $this; - } - - /** - * Disconnect the given instance and remove from local cache. - * - * @param string|null $name - * @return void - */ - public function purge($name = null) - { - $name ??= $this->getDefaultInstance(); - - unset($this->instances[$name]); - } - - /** - * Register a custom instance creator Closure. - * - * @param string $name - * @param \Closure $callback - * - * @param-closure-this $this $callback - * - * @return $this - */ - public function extend($name, Closure $callback) - { - $this->customCreators[$name] = $callback->bindTo($this, $this); - - return $this; - } - - /** - * Set the application instance used by the manager. - * - * @param \Illuminate\Contracts\Foundation\Application $app - * @return $this - */ - public function setApplication($app) - { - $this->app = $app; - - return $this; - } - - /** - * Dynamically call the default instance. - * - * @param string $method - * @param array $parameters - * @return mixed - */ - public function __call($method, $parameters) - { - return $this->instance()->$method(...$parameters); - } -} diff --git a/plugins/vendor/illuminate/support/NamespacedItemResolver.php b/plugins/vendor/illuminate/support/NamespacedItemResolver.php deleted file mode 100755 index 10007be9..00000000 --- a/plugins/vendor/illuminate/support/NamespacedItemResolver.php +++ /dev/null @@ -1,112 +0,0 @@ -parsed[$key])) { - return $this->parsed[$key]; - } - - // If the key does not contain a double colon, it means the key is not in a - // namespace, and is just a regular configuration item. Namespaces are a - // tool for organizing configuration items for things such as modules. - if (! str_contains($key, '::')) { - $segments = explode('.', $key); - - $parsed = $this->parseBasicSegments($segments); - } else { - $parsed = $this->parseNamespacedSegments($key); - } - - // Once we have the parsed array of this key's elements, such as its groups - // and namespace, we will cache each array inside a simple list that has - // the key and the parsed array for quick look-ups for later requests. - return $this->parsed[$key] = $parsed; - } - - /** - * Parse an array of basic segments. - * - * @param array $segments - * @return array - */ - protected function parseBasicSegments(array $segments) - { - // The first segment in a basic array will always be the group, so we can go - // ahead and grab that segment. If there is only one total segment we are - // just pulling an entire group out of the array and not a single item. - $group = $segments[0]; - - // If there is more than one segment in this group, it means we are pulling - // a specific item out of a group and will need to return this item name - // as well as the group so we know which item to pull from the arrays. - $item = count($segments) === 1 - ? null - : implode('.', array_slice($segments, 1)); - - return [null, $group, $item]; - } - - /** - * Parse an array of namespaced segments. - * - * @param string $key - * @return array - */ - protected function parseNamespacedSegments($key) - { - [$namespace, $item] = explode('::', $key); - - // First we'll just explode the first segment to get the namespace and group - // since the item should be in the remaining segments. Once we have these - // two pieces of data we can proceed with parsing out the item's value. - $itemSegments = explode('.', $item); - - $groupAndItem = array_slice( - $this->parseBasicSegments($itemSegments), 1 - ); - - return array_merge([$namespace], $groupAndItem); - } - - /** - * Set the parsed value of a key. - * - * @param string $key - * @param array $parsed - * @return void - */ - public function setParsedKey($key, $parsed) - { - $this->parsed[$key] = $parsed; - } - - /** - * Flush the cache of parsed keys. - * - * @return void - */ - public function flushParsedKeys() - { - $this->parsed = []; - } -} diff --git a/plugins/vendor/illuminate/support/Number.php b/plugins/vendor/illuminate/support/Number.php deleted file mode 100644 index 6673ad26..00000000 --- a/plugins/vendor/illuminate/support/Number.php +++ /dev/null @@ -1,456 +0,0 @@ -setAttribute(NumberFormatter::MAX_FRACTION_DIGITS, $maxPrecision); - } elseif (! is_null($precision)) { - $formatter->setAttribute(NumberFormatter::FRACTION_DIGITS, $precision); - } - - return $formatter->format($number); - } - - /** - * Parse the given string according to the specified format type. - * - * @param string $string - * @param int|null $type - * @param string|null $locale - * @return int|float|false - */ - public static function parse(string $string, ?int $type = NumberFormatter::TYPE_DOUBLE, ?string $locale = null): int|float|false - { - static::ensureIntlExtensionIsInstalled(); - - $formatter = new NumberFormatter($locale ?? static::$locale, NumberFormatter::DECIMAL); - - return $formatter->parse($string, $type); - } - - /** - * Parse a string into an integer according to the specified locale. - * - * @param string $string - * @param string|null $locale - * @return int|false - */ - public static function parseInt(string $string, ?string $locale = null): int|false - { - return self::parse($string, NumberFormatter::TYPE_INT32, $locale); - } - - /** - * Parse a string into a float according to the specified locale. - * - * @param string $string - * @param string|null $locale - * @return float|false - */ - public static function parseFloat(string $string, ?string $locale = null): float|false - { - return self::parse($string, NumberFormatter::TYPE_DOUBLE, $locale); - } - - /** - * Spell out the given number in the given locale. - * - * @param int|float $number - * @param string|null $locale - * @param int|null $after - * @param int|null $until - * @return string - */ - public static function spell(int|float $number, ?string $locale = null, ?int $after = null, ?int $until = null) - { - static::ensureIntlExtensionIsInstalled(); - - if (! is_null($after) && $number <= $after) { - return static::format($number, locale: $locale); - } - - if (! is_null($until) && $number >= $until) { - return static::format($number, locale: $locale); - } - - $formatter = new NumberFormatter($locale ?? static::$locale, NumberFormatter::SPELLOUT); - - return $formatter->format($number); - } - - /** - * Convert the given number to ordinal form. - * - * @param int|float $number - * @param string|null $locale - * @return string - */ - public static function ordinal(int|float $number, ?string $locale = null) - { - static::ensureIntlExtensionIsInstalled(); - - $formatter = new NumberFormatter($locale ?? static::$locale, NumberFormatter::ORDINAL); - - return $formatter->format($number); - } - - /** - * Spell out the given number in the given locale in ordinal form. - * - * @param int|float $number - * @param string|null $locale - * @return string - */ - public static function spellOrdinal(int|float $number, ?string $locale = null) - { - static::ensureIntlExtensionIsInstalled(); - - $formatter = new NumberFormatter($locale ?? static::$locale, NumberFormatter::SPELLOUT); - - $formatter->setTextAttribute(NumberFormatter::DEFAULT_RULESET, '%spellout-ordinal'); - - return $formatter->format($number); - } - - /** - * Convert the given number to its percentage equivalent. - * - * @param int|float $number - * @param int $precision - * @param int|null $maxPrecision - * @param string|null $locale - * @return string|false - */ - public static function percentage(int|float $number, int $precision = 0, ?int $maxPrecision = null, ?string $locale = null) - { - static::ensureIntlExtensionIsInstalled(); - - $formatter = new NumberFormatter($locale ?? static::$locale, NumberFormatter::PERCENT); - - if (! is_null($maxPrecision)) { - $formatter->setAttribute(NumberFormatter::MAX_FRACTION_DIGITS, $maxPrecision); - } else { - $formatter->setAttribute(NumberFormatter::FRACTION_DIGITS, $precision); - } - - return $formatter->format($number / 100); - } - - /** - * Convert the given number to its currency equivalent. - * - * @param int|float $number - * @param string $in - * @param string|null $locale - * @param int|null $precision - * @return string|false - */ - public static function currency(int|float $number, string $in = '', ?string $locale = null, ?int $precision = null) - { - static::ensureIntlExtensionIsInstalled(); - - $formatter = new NumberFormatter($locale ?? static::$locale, NumberFormatter::CURRENCY); - - if (! is_null($precision)) { - $formatter->setAttribute(NumberFormatter::FRACTION_DIGITS, $precision); - } - - return $formatter->formatCurrency($number, ! empty($in) ? $in : static::$currency); - } - - /** - * Convert the given number to its file size equivalent. - * - * @param int|float $bytes - * @param int $precision - * @param int|null $maxPrecision - * @return string - */ - public static function fileSize(int|float $bytes, int $precision = 0, ?int $maxPrecision = null) - { - $units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; - - $unitCount = count($units); - - for ($i = 0; (abs($bytes) / 1024) > 0.9 && ($i < $unitCount - 1); $i++) { - $bytes /= 1024; - } - - return sprintf('%s %s', static::format($bytes, $precision, $maxPrecision), $units[$i]); - } - - /** - * Convert the number to its human-readable equivalent. - * - * @param int|float $number - * @param int $precision - * @param int|null $maxPrecision - * @return string|false - */ - public static function abbreviate(int|float $number, int $precision = 0, ?int $maxPrecision = null) - { - return static::forHumans($number, $precision, $maxPrecision, abbreviate: true); - } - - /** - * Convert the number to its human-readable equivalent. - * - * @param int|float $number - * @param int $precision - * @param int|null $maxPrecision - * @param bool $abbreviate - * @return string|false - */ - public static function forHumans(int|float $number, int $precision = 0, ?int $maxPrecision = null, bool $abbreviate = false) - { - return static::summarize($number, $precision, $maxPrecision, $abbreviate ? [ - 3 => 'K', - 6 => 'M', - 9 => 'B', - 12 => 'T', - 15 => 'Q', - ] : [ - 3 => ' thousand', - 6 => ' million', - 9 => ' billion', - 12 => ' trillion', - 15 => ' quadrillion', - ]); - } - - /** - * Convert the number to its human-readable equivalent. - * - * @param int|float $number - * @param int $precision - * @param int|null $maxPrecision - * @param array $units - * @return string|false - */ - protected static function summarize(int|float $number, int $precision = 0, ?int $maxPrecision = null, array $units = []) - { - if (empty($units)) { - $units = [ - 3 => 'K', - 6 => 'M', - 9 => 'B', - 12 => 'T', - 15 => 'Q', - ]; - } - - switch (true) { - case (float) $number === 0.0: - return $precision > 0 ? static::format(0, $precision, $maxPrecision) : '0'; - case $number < 0: - return sprintf('-%s', static::summarize(abs($number), $precision, $maxPrecision, $units)); - case $number >= 1e15: - return sprintf('%s'.end($units), static::summarize($number / 1e15, $precision, $maxPrecision, $units)); - } - - $numberExponent = floor(log10($number)); - $displayExponent = $numberExponent - ($numberExponent % 3); - $number /= pow(10, $displayExponent); - - return trim(sprintf('%s%s', static::format($number, $precision, $maxPrecision), $units[$displayExponent] ?? '')); - } - - /** - * Clamp the given number between the given minimum and maximum. - * - * @param int|float $number - * @param int|float $min - * @param int|float $max - * @return int|float - */ - public static function clamp(int|float $number, int|float $min, int|float $max) - { - return min(max($number, $min), $max); - } - - /** - * Split the given number into pairs of min/max values. - * - * @param int|float $to - * @param int|float $by - * @param int|float $start - * @param int|float $offset - * @return list - */ - public static function pairs(int|float $to, int|float $by, int|float $start = 0, int|float $offset = 1) - { - if ($by == 0) { - throw new \InvalidArgumentException('The $by argument must not be zero.'); - } - - $by = abs($by); - - $output = []; - - for ($lower = $start; $lower < $to; $lower += $by) { - $upper = $lower + $by - $offset; - - if ($upper > $to) { - $upper = $to; - } - - $output[] = [$lower, $upper]; - } - - return $output; - } - - /** - * Remove any trailing zero digits after the decimal point of the given number. - * - * @param int|float $number - * @return int|float - */ - public static function trim(int|float $number) - { - if (is_infinite($number) || is_nan($number)) { - return $number; - } - - return json_decode(json_encode($number)); - } - - /** - * Execute the given callback using the given locale. - * - * @template TReturn - * - * @param string $locale - * @param callable(): TReturn $callback - * @return TReturn - */ - public static function withLocale(string $locale, callable $callback) - { - $previousLocale = static::$locale; - - static::useLocale($locale); - - try { - return $callback(); - } finally { - static::useLocale($previousLocale); - } - } - - /** - * Execute the given callback using the given currency. - * - * @template TReturn - * - * @param string $currency - * @param callable(): TReturn $callback - * @return TReturn - */ - public static function withCurrency(string $currency, callable $callback) - { - $previousCurrency = static::$currency; - - static::useCurrency($currency); - - try { - return $callback(); - } finally { - static::useCurrency($previousCurrency); - } - } - - /** - * Set the default locale. - * - * @param string $locale - * @return void - */ - public static function useLocale(string $locale) - { - static::$locale = $locale; - } - - /** - * Set the default currency. - * - * @param string $currency - * @return void - */ - public static function useCurrency(string $currency) - { - static::$currency = $currency; - } - - /** - * Get the default locale. - * - * @return string - */ - public static function defaultLocale() - { - return static::$locale; - } - - /** - * Get the default currency. - * - * @return string - */ - public static function defaultCurrency() - { - return static::$currency; - } - - /** - * Ensure the "intl" PHP extension is installed. - * - * @return void - * - * @throws \RuntimeException - */ - protected static function ensureIntlExtensionIsInstalled() - { - if (! extension_loaded('intl')) { - $method = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2)[1]['function']; - - throw new RuntimeException('The "intl" PHP extension is required to use the ['.$method.'] method.'); - } - } -} diff --git a/plugins/vendor/illuminate/support/Once.php b/plugins/vendor/illuminate/support/Once.php deleted file mode 100644 index 4d860b29..00000000 --- a/plugins/vendor/illuminate/support/Once.php +++ /dev/null @@ -1,99 +0,0 @@ -> $values - */ - protected function __construct(protected WeakMap $values) - { - // - } - - /** - * Create a new once instance. - * - * @return static - */ - public static function instance() - { - return static::$instance ??= new static(new WeakMap); - } - - /** - * Get the value of the given onceable. - * - * @param Onceable $onceable - * @return mixed - */ - public function value(Onceable $onceable) - { - if (! static::$enabled) { - return call_user_func($onceable->callable); - } - - $object = $onceable->object ?: $this; - - $hash = $onceable->hash; - - if (! isset($this->values[$object])) { - $this->values[$object] = []; - } - - if (array_key_exists($hash, $this->values[$object])) { - return $this->values[$object][$hash]; - } - - return $this->values[$object][$hash] = call_user_func($onceable->callable); - } - - /** - * Re-enable the once instance if it was disabled. - * - * @return void - */ - public static function enable() - { - static::$enabled = true; - } - - /** - * Disable the once instance. - * - * @return void - */ - public static function disable() - { - static::$enabled = false; - } - - /** - * Flush the once instance. - * - * @return void - */ - public static function flush() - { - static::$instance = null; - } -} diff --git a/plugins/vendor/illuminate/support/Onceable.php b/plugins/vendor/illuminate/support/Onceable.php deleted file mode 100644 index 3621e393..00000000 --- a/plugins/vendor/illuminate/support/Onceable.php +++ /dev/null @@ -1,92 +0,0 @@ -> $trace - * @return static|null - */ - public static function tryFromTrace(array $trace, callable $callable) - { - if (! is_null($hash = static::hashFromTrace($trace, $callable))) { - $object = static::objectFromTrace($trace); - - return new static($hash, $object, $callable); - } - } - - /** - * Computes the object of the onceable from the given trace, if any. - * - * @param array> $trace - * @return object|null - */ - protected static function objectFromTrace(array $trace) - { - return $trace[1]['object'] ?? null; - } - - /** - * Computes the hash of the onceable from the given trace. - * - * @param array> $trace - * @return string|null - */ - protected static function hashFromTrace(array $trace, callable $callable) - { - if (str_contains($trace[0]['file'] ?? '', 'eval()\'d code')) { - return null; - } - - $uses = array_map( - static function (mixed $argument) { - if ($argument instanceof HasOnceHash) { - return $argument->onceHash(); - } - - if (is_object($argument)) { - return spl_object_hash($argument); - } - - return $argument; - }, - $callable instanceof Closure ? (new ReflectionClosure($callable))->getClosureUsedVariables() : [], - ); - - $class = $callable instanceof Closure ? (new ReflectionClosure($callable))->getClosureCalledClass()?->getName() : null; - - $class ??= isset($trace[1]['class']) ? $trace[1]['class'] : null; - - return hash('xxh128', sprintf( - '%s@%s%s:%s (%s)', - $trace[0]['file'], - $class ? $class.'@' : '', - $trace[1]['function'], - $trace[0]['line'], - serialize($uses), - )); - } -} diff --git a/plugins/vendor/illuminate/support/Optional.php b/plugins/vendor/illuminate/support/Optional.php deleted file mode 100644 index fcf71ed0..00000000 --- a/plugins/vendor/illuminate/support/Optional.php +++ /dev/null @@ -1,130 +0,0 @@ -value = $value; - } - - /** - * Dynamically access a property on the underlying object. - * - * @param string $key - * @return mixed - */ - public function __get($key) - { - if (is_object($this->value)) { - return $this->value->{$key} ?? null; - } - } - - /** - * Dynamically check a property exists on the underlying object. - * - * @param mixed $name - * @return bool - */ - public function __isset($name) - { - if (is_object($this->value)) { - return isset($this->value->{$name}); - } - - if (is_array($this->value) || $this->value instanceof ArrayObject) { - return isset($this->value[$name]); - } - - return false; - } - - /** - * Determine if an item exists at an offset. - * - * @param mixed $key - * @return bool - */ - public function offsetExists($key): bool - { - return Arr::accessible($this->value) && Arr::exists($this->value, $key); - } - - /** - * Get an item at a given offset. - * - * @param mixed $key - * @return mixed - */ - public function offsetGet($key): mixed - { - return Arr::get($this->value, $key); - } - - /** - * Set the item at a given offset. - * - * @param mixed $key - * @param mixed $value - * @return void - */ - public function offsetSet($key, $value): void - { - if (Arr::accessible($this->value)) { - $this->value[$key] = $value; - } - } - - /** - * Unset the item at a given offset. - * - * @param string $key - * @return void - */ - public function offsetUnset($key): void - { - if (Arr::accessible($this->value)) { - unset($this->value[$key]); - } - } - - /** - * Dynamically pass a method to the underlying object. - * - * @param string $method - * @param array $parameters - * @return mixed - */ - public function __call($method, $parameters) - { - if (static::hasMacro($method)) { - return $this->macroCall($method, $parameters); - } - - if (is_object($this->value)) { - return $this->value->{$method}(...$parameters); - } - } -} diff --git a/plugins/vendor/illuminate/support/Pluralizer.php b/plugins/vendor/illuminate/support/Pluralizer.php deleted file mode 100755 index 0d909de1..00000000 --- a/plugins/vendor/illuminate/support/Pluralizer.php +++ /dev/null @@ -1,127 +0,0 @@ -pluralize($value); - - return static::matchCase($plural, $value); - } - - /** - * Get the singular form of an English word. - * - * @param string $value - * @return string - */ - public static function singular($value) - { - $singular = static::inflector()->singularize($value); - - return static::matchCase($singular, $value); - } - - /** - * Determine if the given value is uncountable. - * - * @param string $value - * @return bool - */ - protected static function uncountable($value) - { - return in_array(strtolower($value), static::$uncountable); - } - - /** - * Attempt to match the case on two strings. - * - * @param string $value - * @param string $comparison - * @return string - */ - protected static function matchCase($value, $comparison) - { - $functions = ['mb_strtolower', 'mb_strtoupper', 'ucfirst', 'ucwords']; - - foreach ($functions as $function) { - if ($function($comparison) === $comparison) { - return $function($value); - } - } - - return $value; - } - - /** - * Get the inflector instance. - * - * @return \Doctrine\Inflector\Inflector - */ - public static function inflector() - { - if (is_null(static::$inflector)) { - static::$inflector = InflectorFactory::createForLanguage(static::$language)->build(); - } - - return static::$inflector; - } - - /** - * Specify the language that should be used by the inflector. - * - * @param string $language - * @return void - */ - public static function useLanguage(string $language) - { - static::$language = $language; - - static::$inflector = null; - } -} diff --git a/plugins/vendor/illuminate/support/ProcessUtils.php b/plugins/vendor/illuminate/support/ProcessUtils.php deleted file mode 100644 index 165e7516..00000000 --- a/plugins/vendor/illuminate/support/ProcessUtils.php +++ /dev/null @@ -1,69 +0,0 @@ - 2 && $char === $arg[0] && $char === $arg[strlen($arg) - 1]; - } -} diff --git a/plugins/vendor/illuminate/support/ServiceProvider.php b/plugins/vendor/illuminate/support/ServiceProvider.php deleted file mode 100755 index 67eb5a94..00000000 --- a/plugins/vendor/illuminate/support/ServiceProvider.php +++ /dev/null @@ -1,662 +0,0 @@ - $bindings All of the container bindings that should be registered. - * @property array $singletons All of the singletons that should be registered. - */ -abstract class ServiceProvider -{ - /** - * The application instance. - * - * @var \Illuminate\Contracts\Foundation\Application - */ - protected $app; - - /** - * All of the registered booting callbacks. - * - * @var array - */ - protected $bootingCallbacks = []; - - /** - * All of the registered booted callbacks. - * - * @var array - */ - protected $bootedCallbacks = []; - - /** - * The paths that should be published. - * - * @var array - */ - public static $publishes = []; - - /** - * The paths that should be published by group. - * - * @var array - */ - public static $publishGroups = []; - - /** - * The migration paths available for publishing. - * - * @var array - */ - protected static $publishableMigrationPaths = []; - - /** - * Commands that should be run during the "optimize" command. - * - * @var array - */ - public static array $optimizeCommands = []; - - /** - * Commands that should be run during the "optimize:clear" command. - * - * @var array - */ - public static array $optimizeClearCommands = []; - - /** - * Commands that should be run during the "reload" command. - * - * @var array - */ - public static array $reloadCommands = []; - - /** - * Create a new service provider instance. - * - * @param \Illuminate\Contracts\Foundation\Application $app - */ - public function __construct($app) - { - $this->app = $app; - } - - /** - * Register any application services. - * - * @return void - */ - public function register() - { - // - } - - /** - * Register a booting callback to be run before the "boot" method is called. - * - * @param \Closure $callback - * @return void - */ - public function booting(Closure $callback) - { - $this->bootingCallbacks[] = $callback; - } - - /** - * Register a booted callback to be run after the "boot" method is called. - * - * @param \Closure $callback - * @return void - */ - public function booted(Closure $callback) - { - $this->bootedCallbacks[] = $callback; - } - - /** - * Call the registered booting callbacks. - * - * @return void - */ - public function callBootingCallbacks() - { - $index = 0; - - while ($index < count($this->bootingCallbacks)) { - $this->app->call($this->bootingCallbacks[$index]); - - $index++; - } - } - - /** - * Call the registered booted callbacks. - * - * @return void - */ - public function callBootedCallbacks() - { - $index = 0; - - while ($index < count($this->bootedCallbacks)) { - $this->app->call($this->bootedCallbacks[$index]); - - $index++; - } - } - - /** - * Merge the given configuration with the existing configuration. - * - * @param string $path - * @param string $key - * @return void - */ - protected function mergeConfigFrom($path, $key) - { - if (! ($this->app instanceof CachesConfiguration && $this->app->configurationIsCached())) { - $config = $this->app->make('config'); - - $config->set($key, array_merge( - require $path, $config->get($key, []) - )); - } - } - - /** - * Replace the given configuration with the existing configuration recursively. - * - * @param string $path - * @param string $key - * @return void - */ - protected function replaceConfigRecursivelyFrom($path, $key) - { - if (! ($this->app instanceof CachesConfiguration && $this->app->configurationIsCached())) { - $config = $this->app->make('config'); - - $config->set($key, array_replace_recursive( - require $path, $config->get($key, []) - )); - } - } - - /** - * Load the given routes file if routes are not already cached. - * - * @param string $path - * @return void - */ - protected function loadRoutesFrom($path) - { - if (! ($this->app instanceof CachesRoutes && $this->app->routesAreCached())) { - require $path; - } - } - - /** - * Register a view file namespace. - * - * @param string|array $path - * @param string $namespace - * @return void - */ - protected function loadViewsFrom($path, $namespace) - { - $this->callAfterResolving('view', function ($view) use ($path, $namespace) { - if (isset($this->app->config['view']['paths']) && - is_array($this->app->config['view']['paths'])) { - foreach ($this->app->config['view']['paths'] as $viewPath) { - if (is_dir($appPath = $viewPath.'/vendor/'.$namespace)) { - $view->addNamespace($namespace, $appPath); - } - } - } - - $view->addNamespace($namespace, $path); - }); - } - - /** - * Register the given view components with a custom prefix. - * - * @param string $prefix - * @param array $components - * @return void - */ - protected function loadViewComponentsAs($prefix, array $components) - { - $this->callAfterResolving(BladeCompiler::class, function ($blade) use ($prefix, $components) { - foreach ($components as $alias => $component) { - $blade->component($component, is_string($alias) ? $alias : null, $prefix); - } - }); - } - - /** - * Register a translation file namespace or path. - * - * @param string $path - * @param string|null $namespace - * @return void - */ - protected function loadTranslationsFrom($path, $namespace = null) - { - $this->callAfterResolving('translator', fn ($translator) => is_null($namespace) - ? $translator->addPath($path) - : $translator->addNamespace($namespace, $path)); - } - - /** - * Register a JSON translation file path. - * - * @param string $path - * @return void - */ - protected function loadJsonTranslationsFrom($path) - { - $this->callAfterResolving('translator', function ($translator) use ($path) { - $translator->addJsonPath($path); - }); - } - - /** - * Register database migration paths. - * - * @param array|string $paths - * @return void - */ - protected function loadMigrationsFrom($paths) - { - $this->callAfterResolving('migrator', function ($migrator) use ($paths) { - foreach ((array) $paths as $path) { - $migrator->path($path); - } - }); - } - - /** - * Register Eloquent model factory paths. - * - * @deprecated Will be removed in a future Laravel version. - * - * @param array|string $paths - * @return void - */ - protected function loadFactoriesFrom($paths) - { - $this->callAfterResolving(ModelFactory::class, function ($factory) use ($paths) { - foreach ((array) $paths as $path) { - $factory->load($path); - } - }); - } - - /** - * Setup an after resolving listener, or fire immediately if already resolved. - * - * @param string $name - * @param callable $callback - * @return void - */ - protected function callAfterResolving($name, $callback) - { - $this->app->afterResolving($name, $callback); - - if ($this->app->resolved($name)) { - $callback($this->app->make($name), $this->app); - } - } - - /** - * Register migration paths to be published by the publish command. - * - * @param array $paths - * @param mixed $groups - * @return void - */ - protected function publishesMigrations(array $paths, $groups = null) - { - $this->publishes($paths, $groups); - - if ($this->app->config->get('database.migrations.update_date_on_publish', false)) { - static::$publishableMigrationPaths = array_unique(array_merge(static::$publishableMigrationPaths, array_keys($paths))); - } - } - - /** - * Register paths to be published by the publish command. - * - * @param array $paths - * @param mixed $groups - * @return void - */ - protected function publishes(array $paths, $groups = null) - { - $this->ensurePublishArrayInitialized($class = static::class); - - static::$publishes[$class] = array_merge(static::$publishes[$class], $paths); - - foreach ((array) $groups as $group) { - $this->addPublishGroup($group, $paths); - } - } - - /** - * Ensure the publish array for the service provider is initialized. - * - * @param string $class - * @return void - */ - protected function ensurePublishArrayInitialized($class) - { - if (! array_key_exists($class, static::$publishes)) { - static::$publishes[$class] = []; - } - } - - /** - * Add a publish group / tag to the service provider. - * - * @param string $group - * @param array $paths - * @return void - */ - protected function addPublishGroup($group, $paths) - { - if (! array_key_exists($group, static::$publishGroups)) { - static::$publishGroups[$group] = []; - } - - static::$publishGroups[$group] = array_merge( - static::$publishGroups[$group], $paths - ); - } - - /** - * Get the paths to publish. - * - * @param string|null $provider - * @param string|null $group - * @return array - */ - public static function pathsToPublish($provider = null, $group = null) - { - if (! is_null($paths = static::pathsForProviderOrGroup($provider, $group))) { - return $paths; - } - - return (new Collection(static::$publishes))->reduce(function ($paths, $p) { - return array_merge($paths, $p); - }, []); - } - - /** - * Get the paths for the provider or group (or both). - * - * @param string|null $provider - * @param string|null $group - * @return array - */ - protected static function pathsForProviderOrGroup($provider, $group) - { - if ($provider && $group) { - return static::pathsForProviderAndGroup($provider, $group); - } elseif ($group && array_key_exists($group, static::$publishGroups)) { - return static::$publishGroups[$group]; - } elseif ($provider && array_key_exists($provider, static::$publishes)) { - return static::$publishes[$provider]; - } elseif ($group || $provider) { - return []; - } - } - - /** - * Get the paths for the provider and group. - * - * @param string $provider - * @param string $group - * @return array - */ - protected static function pathsForProviderAndGroup($provider, $group) - { - if (! empty(static::$publishes[$provider]) && ! empty(static::$publishGroups[$group])) { - return array_intersect_key(static::$publishes[$provider], static::$publishGroups[$group]); - } - - return []; - } - - /** - * Get the service providers available for publishing. - * - * @return array - */ - public static function publishableProviders() - { - return array_keys(static::$publishes); - } - - /** - * Get the migration paths available for publishing. - * - * @return array - */ - public static function publishableMigrationPaths() - { - return static::$publishableMigrationPaths; - } - - /** - * Get the groups available for publishing. - * - * @return array - */ - public static function publishableGroups() - { - return array_keys(static::$publishGroups); - } - - /** - * Register the package's custom Artisan commands. - * - * @param mixed $commands - * @return void - */ - public function commands($commands) - { - $commands = is_array($commands) ? $commands : func_get_args(); - - Artisan::starting(function ($artisan) use ($commands) { - $artisan->resolveCommands($commands); - }); - } - - /** - * Register commands that should run on "optimize" or "optimize:clear". - * - * @param string|null $optimize - * @param string|null $clear - * @param string|null $key - * @return void - */ - protected function optimizes(?string $optimize = null, ?string $clear = null, ?string $key = null) - { - $key = $this->getProviderKey($key); - - if ($optimize) { - static::$optimizeCommands[$key] = $optimize; - } - - if ($clear) { - static::$optimizeClearCommands[$key] = $clear; - } - } - - /** - * Register commands that should run on "reload". - * - * @param string|null $reload - * @param string|null $key - * @return void - */ - protected function reloads(string $reload, ?string $key = null) - { - $key = $this->getProviderKey($key); - - static::$reloadCommands[$key] = $reload; - } - - /** - * Get a short descriptive key for the current service provider. - * - * @param string|null $key - * @return string - */ - protected function getProviderKey(?string $key = null): string - { - $key ??= (string) Str::of(get_class($this)) - ->classBasename() - ->before('ServiceProvider') - ->kebab() - ->lower() - ->trim(); - - if (empty($key)) { - $key = class_basename(get_class($this)); - } - - return $key; - } - - /** - * Get the services provided by the provider. - * - * @return array - */ - public function provides() - { - return []; - } - - /** - * Get the events that trigger this service provider to register. - * - * @return array - */ - public function when() - { - return []; - } - - /** - * Determine if the provider is deferred. - * - * @return bool - */ - public function isDeferred() - { - return $this instanceof DeferrableProvider; - } - - /** - * Get the default providers for a Laravel application. - * - * @return \Illuminate\Support\DefaultProviders - */ - public static function defaultProviders() - { - return new DefaultProviders; - } - - /** - * Add the given provider to the application's provider bootstrap file. - * - * @param string $provider - * @param string|null $path - * @return bool - */ - public static function addProviderToBootstrapFile(string $provider, ?string $path = null) - { - $path ??= app()->getBootstrapProvidersPath(); - - if (! file_exists($path)) { - return false; - } - - if (function_exists('opcache_invalidate')) { - opcache_invalidate($path, true); - } - - $providers = (new Collection(require $path)) - ->merge([$provider]) - ->unique() - ->sort() - ->values() - ->map(fn ($p) => ' '.$p.'::class,') - ->implode(PHP_EOL); - - $content = 'getBootstrapProvidersPath(); - - if (! file_exists($path)) { - return false; - } - - if (function_exists('opcache_invalidate')) { - opcache_invalidate($path, true); - } - - $providersToRemove = Arr::wrap($providersToRemove); - - $providers = (new Collection(require $path)) - ->unique() - ->sort() - ->values() - ->when( - $strict, - static fn (Collection $providerCollection) => $providerCollection->reject(fn (string $p) => in_array($p, $providersToRemove, true)), - static fn (Collection $providerCollection) => $providerCollection->reject(fn (string $p) => Str::contains($p, $providersToRemove)) - ) - ->map(fn ($p) => ' '.$p.'::class,') - ->implode(PHP_EOL); - - $content = ' - */ - protected static $sequence = []; - - /** - * Indicates if the instance should sleep. - * - * @var bool - */ - protected $shouldSleep = true; - - /** - * Indicates if the instance already slept via `then()`. - * - * @var bool - */ - protected $alreadySlept = false; - - /** - * Create a new class instance. - * - * @param int|float|\DateInterval $duration - */ - public function __construct($duration) - { - $this->duration($duration); - } - - /** - * Sleep for the given duration. - * - * @param \DateInterval|int|float $duration - * @return static - */ - public static function for($duration) - { - return new static($duration); - } - - /** - * Sleep until the given timestamp. - * - * @param \DateTimeInterface|int|float|numeric-string $timestamp - * @return static - */ - public static function until($timestamp) - { - if (is_numeric($timestamp)) { - $timestamp = Carbon::createFromTimestamp($timestamp, date_default_timezone_get()); - } - - return new static(Carbon::now()->diff($timestamp)); - } - - /** - * Sleep for the given number of microseconds. - * - * @param int $duration - * @return static - */ - public static function usleep($duration) - { - return (new static($duration))->microseconds(); - } - - /** - * Sleep for the given number of seconds. - * - * @param int|float $duration - * @return static - */ - public static function sleep($duration) - { - return (new static($duration))->seconds(); - } - - /** - * Sleep for the given duration. Replaces any previously defined duration. - * - * @param \DateInterval|int|float $duration - * @return $this - */ - protected function duration($duration) - { - if (! $duration instanceof DateInterval) { - $this->duration = CarbonInterval::microsecond(0); - - $this->pending = $duration; - } else { - $duration = CarbonInterval::instance($duration); - - if ($duration->totalMicroseconds < 0) { - $duration = CarbonInterval::seconds(0); - } - - $this->duration = $duration; - $this->pending = null; - } - - return $this; - } - - /** - * Sleep for the given number of minutes. - * - * @return $this - */ - public function minutes() - { - $this->duration->add('minutes', $this->pullPending()); - - return $this; - } - - /** - * Sleep for one minute. - * - * @return $this - */ - public function minute() - { - return $this->minutes(); - } - - /** - * Sleep for the given number of seconds. - * - * @return $this - */ - public function seconds() - { - $this->duration->add('seconds', $this->pullPending()); - - return $this; - } - - /** - * Sleep for one second. - * - * @return $this - */ - public function second() - { - return $this->seconds(); - } - - /** - * Sleep for the given number of milliseconds. - * - * @return $this - */ - public function milliseconds() - { - $this->duration->add('milliseconds', $this->pullPending()); - - return $this; - } - - /** - * Sleep for one millisecond. - * - * @return $this - */ - public function millisecond() - { - return $this->milliseconds(); - } - - /** - * Sleep for the given number of microseconds. - * - * @return $this - */ - public function microseconds() - { - $this->duration->add('microseconds', $this->pullPending()); - - return $this; - } - - /** - * Sleep for on microsecond. - * - * @return $this - */ - public function microsecond() - { - return $this->microseconds(); - } - - /** - * Add additional time to sleep for. - * - * @param int|float $duration - * @return $this - */ - public function and($duration) - { - $this->pending = $duration; - - return $this; - } - - /** - * Sleep while a given callback returns "true". - * - * @param \Closure $callback - * @return $this - */ - public function while(Closure $callback) - { - $this->while = $callback; - - return $this; - } - - /** - * Specify a callback that should be executed after sleeping. - * - * @param callable $then - * @return mixed - */ - public function then(callable $then) - { - $this->goodnight(); - - $this->alreadySlept = true; - - return $then(); - } - - /** - * Handle the object's destruction. - * - * @return void - */ - public function __destruct() - { - $this->goodnight(); - } - - /** - * Handle the object's destruction. - * - * @return void - */ - protected function goodnight() - { - if ($this->alreadySlept || ! $this->shouldSleep) { - return; - } - - if ($this->pending !== null) { - throw new RuntimeException('Unknown duration unit.'); - } - - if (static::$fake) { - static::$sequence[] = $this->duration; - - if (static::$syncWithCarbon) { - Carbon::setTestNow(Carbon::now()->add($this->duration)); - } - - foreach (static::$fakeSleepCallbacks as $callback) { - $callback($this->duration); - } - - return; - } - - $remaining = $this->duration->copy(); - - $seconds = (int) $remaining->totalSeconds; - - $while = $this->while ?: function () { - static $return = [true, false]; - - return array_shift($return); - }; - - while ($while()) { - if ($seconds > 0) { - sleep($seconds); - - $remaining = $remaining->subSeconds($seconds); - } - - $microseconds = (int) $remaining->totalMicroseconds; - - if ($microseconds > 0) { - usleep($microseconds); - } - } - } - - /** - * Resolve the pending duration. - * - * @return int|float - */ - protected function pullPending() - { - if ($this->pending === null) { - $this->shouldNotSleep(); - - throw new RuntimeException('No duration specified.'); - } - - if ($this->pending < 0) { - $this->pending = 0; - } - - return tap($this->pending, function () { - $this->pending = null; - }); - } - - /** - * Stay awake and capture any attempts to sleep. - * - * @param bool $value - * @param bool $syncWithCarbon - * @return void - */ - public static function fake($value = true, $syncWithCarbon = false) - { - static::$fake = $value; - - static::$sequence = []; - static::$fakeSleepCallbacks = []; - static::$syncWithCarbon = $syncWithCarbon; - } - - /** - * Assert a given amount of sleeping occurred a specific number of times. - * - * @param \Closure $expected - * @param int $times - * @return void - */ - public static function assertSlept($expected, $times = 1) - { - $count = (new Collection(static::$sequence))->filter($expected)->count(); - - PHPUnit::assertSame( - $times, - $count, - "The expected sleep was found [{$count}] times instead of [{$times}]." - ); - } - - /** - * Assert sleeping occurred a given number of times. - * - * @param int $expected - * @return void - */ - public static function assertSleptTimes($expected) - { - PHPUnit::assertSame($expected, $count = count(static::$sequence), "Expected [{$expected}] sleeps but found [{$count}]."); - } - - /** - * Assert the given sleep sequence was encountered. - * - * @param array $sequence - * @return void - */ - public static function assertSequence($sequence) - { - try { - static::assertSleptTimes(count($sequence)); - - (new Collection($sequence)) - ->zip(static::$sequence) - ->eachSpread(function (?Sleep $expected, CarbonInterval $actual) { - if ($expected === null) { - return; - } - - PHPUnit::assertTrue( - $expected->shouldNotSleep()->duration->equalTo($actual), - vsprintf('Expected sleep duration of [%s] but actually slept for [%s].', [ - $expected->duration->cascade()->forHumans([ - 'options' => 0, - 'minimumUnit' => 'microsecond', - ]), - $actual->cascade()->forHumans([ - 'options' => 0, - 'minimumUnit' => 'microsecond', - ]), - ]) - ); - }); - } finally { - foreach ($sequence as $expected) { - if ($expected instanceof self) { - $expected->shouldNotSleep(); - } - } - } - } - - /** - * Assert that no sleeping occurred. - * - * @return void - */ - public static function assertNeverSlept() - { - static::assertSleptTimes(0); - } - - /** - * Assert that no sleeping occurred. - * - * @return void - */ - public static function assertInsomniac() - { - if (static::$sequence === []) { - PHPUnit::assertTrue(true); - } - - foreach (static::$sequence as $duration) { - PHPUnit::assertSame(0, (int) $duration->totalMicroseconds, vsprintf('Unexpected sleep duration of [%s] found.', [ - $duration->cascade()->forHumans([ - 'options' => 0, - 'minimumUnit' => 'microsecond', - ]), - ])); - } - } - - /** - * Indicate that the instance should not sleep. - * - * @return $this - */ - protected function shouldNotSleep() - { - $this->shouldSleep = false; - - return $this; - } - - /** - * Only sleep when the given condition is true. - * - * @param (\Closure($this): bool)|bool $condition - * @return $this - */ - public function when($condition) - { - $this->shouldSleep = (bool) value($condition, $this); - - return $this; - } - - /** - * Don't sleep when the given condition is true. - * - * @param (\Closure($this): bool)|bool $condition - * @return $this - */ - public function unless($condition) - { - return $this->when(! value($condition, $this)); - } - - /** - * Specify a callback that should be invoked when faking sleep within a test. - * - * @param callable $callback - * @return void - */ - public static function whenFakingSleep($callback) - { - static::$fakeSleepCallbacks[] = $callback; - } - - /** - * Indicate that Carbon's "now" should be kept in sync when sleeping. - * - * @return void - */ - public static function syncWithCarbon($value = true) - { - static::$syncWithCarbon = $value; - } -} diff --git a/plugins/vendor/illuminate/support/Str.php b/plugins/vendor/illuminate/support/Str.php deleted file mode 100644 index 13cb50b7..00000000 --- a/plugins/vendor/illuminate/support/Str.php +++ /dev/null @@ -1,2154 +0,0 @@ - - */ - protected static $snakeCache = []; - - /** - * The cache of camel-cased words. - * - * @var array - */ - protected static $camelCache = []; - - /** - * The cache of studly-cased words. - * - * @var array - */ - protected static $studlyCache = []; - - /** - * The callback that should be used to generate UUIDs. - * - * @var (callable(): \Ramsey\Uuid\UuidInterface)|null - */ - protected static $uuidFactory; - - /** - * The callback that should be used to generate ULIDs. - * - * @var (callable(): \Symfony\Component\Uid\Ulid)|null - */ - protected static $ulidFactory; - - /** - * The callback that should be used to generate random strings. - * - * @var (callable(int): string)|null - */ - protected static $randomStringFactory; - - /** - * Get a new stringable object from the given string. - * - * @param string $string - * @return \Illuminate\Support\Stringable - */ - public static function of($string) - { - return new Stringable($string); - } - - /** - * Return the remainder of a string after the first occurrence of a given value. - * - * @param string $subject - * @param string $search - * @return string - */ - public static function after($subject, $search) - { - return $search === '' ? $subject : array_reverse(explode($search, $subject, 2))[0]; - } - - /** - * Return the remainder of a string after the last occurrence of a given value. - * - * @param string $subject - * @param string $search - * @return string - */ - public static function afterLast($subject, $search) - { - if ($search === '') { - return $subject; - } - - $position = mb_strrpos($subject, $search); - - if ($position === false) { - return $subject; - } - - return static::substr($subject, $position + static::length($search)); - } - - /** - * Transliterate a UTF-8 value to ASCII. - * - * @param string $value - * @param string $language - * @return string - */ - public static function ascii($value, $language = 'en') - { - return ASCII::to_ascii((string) $value, $language, replace_single_chars_only: false); - } - - /** - * Transliterate a string to its closest ASCII representation. - * - * @param string $string - * @param string|null $unknown - * @param bool|null $strict - * @return string - */ - public static function transliterate($string, $unknown = '?', $strict = false) - { - return ASCII::to_transliterate($string, $unknown, $strict); - } - - /** - * Get the portion of a string before the first occurrence of a given value. - * - * @param string $subject - * @param string $search - * @return string - */ - public static function before($subject, $search) - { - if ($search === '') { - return $subject; - } - - $result = strstr($subject, (string) $search, true); - - return $result === false ? $subject : $result; - } - - /** - * Get the portion of a string before the last occurrence of a given value. - * - * @param string $subject - * @param string $search - * @return string - */ - public static function beforeLast($subject, $search) - { - if ($search === '') { - return $subject; - } - - $pos = mb_strrpos($subject, $search); - - if ($pos === false) { - return $subject; - } - - return static::substr($subject, 0, $pos); - } - - /** - * Get the portion of a string between two given values. - * - * @param string $subject - * @param string $from - * @param string $to - * @return string - */ - public static function between($subject, $from, $to) - { - if ($from === '' || $to === '') { - return $subject; - } - - return static::beforeLast(static::after($subject, $from), $to); - } - - /** - * Get the smallest possible portion of a string between two given values. - * - * @param string $subject - * @param string $from - * @param string $to - * @return string - */ - public static function betweenFirst($subject, $from, $to) - { - if ($from === '' || $to === '') { - return $subject; - } - - return static::before(static::after($subject, $from), $to); - } - - /** - * Convert a value to camel case. - * - * @param string $value - * @return ($value is '' ? '' : string) - */ - public static function camel($value) - { - if (isset(static::$camelCache[$value])) { - return static::$camelCache[$value]; - } - - return static::$camelCache[$value] = lcfirst(static::studly($value)); - } - - /** - * Get the character at the specified index. - * - * @param string $subject - * @param int $index - * @return string|false - */ - public static function charAt($subject, $index) - { - $length = mb_strlen($subject); - - if ($index < 0 ? $index < -$length : $index > $length - 1) { - return false; - } - - return mb_substr($subject, $index, 1); - } - - /** - * Remove the given string(s) if it exists at the start of the haystack. - * - * @param string $subject - * @param string|string[] $needle - * @return string - */ - public static function chopStart($subject, $needle) - { - foreach ((array) $needle as $n) { - if ($n !== '' && str_starts_with($subject, $n)) { - return mb_substr($subject, mb_strlen($n)); - } - } - - return $subject; - } - - /** - * Remove the given string(s) if it exists at the end of the haystack. - * - * @param string $subject - * @param string|string[] $needle - * @return string - */ - public static function chopEnd($subject, $needle) - { - foreach ((array) $needle as $n) { - if ($n !== '' && str_ends_with($subject, $n)) { - return mb_substr($subject, 0, -mb_strlen($n)); - } - } - - return $subject; - } - - /** - * Determine if a given string contains a given substring. - * - * @param string $haystack - * @param string|iterable $needles - * @param bool $ignoreCase - * @return ($needles is array{} ? false : ($haystack is non-empty-string ? bool : false)) - */ - public static function contains($haystack, $needles, $ignoreCase = false) - { - if (is_null($haystack)) { - return false; - } - - if ($ignoreCase) { - $haystack = mb_strtolower($haystack); - } - - if (! is_iterable($needles)) { - $needles = (array) $needles; - } - - foreach ($needles as $needle) { - if ($ignoreCase) { - $needle = mb_strtolower($needle); - } - - if ($needle !== '' && str_contains($haystack, $needle)) { - return true; - } - } - - return false; - } - - /** - * Determine if a given string contains all array values. - * - * @param string $haystack - * @param iterable $needles - * @param bool $ignoreCase - * @return ($needles is array{} ? false : ($haystack is non-empty-string ? bool : false)) - */ - public static function containsAll($haystack, $needles, $ignoreCase = false) - { - foreach ($needles as $needle) { - if (! static::contains($haystack, $needle, $ignoreCase)) { - return false; - } - } - - return true; - } - - /** - * Determine if a given string doesn't contain a given substring. - * - * @param string $haystack - * @param string|iterable $needles - * @param bool $ignoreCase - * @return ($needles is array{} ? true : ($haystack is non-empty-string ? bool : true)) - */ - public static function doesntContain($haystack, $needles, $ignoreCase = false) - { - return ! static::contains($haystack, $needles, $ignoreCase); - } - - /** - * Convert the case of a string. - * - * @param string $string - * @param MB_CASE_UPPER|MB_CASE_LOWER|MB_CASE_TITLE|MB_CASE_FOLD|MB_CASE_UPPER_SIMPLE|MB_CASE_LOWER_SIMPLE|MB_CASE_TITLE_SIMPLE|MB_CASE_FOLD_SIMPLE $mode - * @param string|null $encoding - * @return ($string is '' ? '' : string) - */ - public static function convertCase(string $string, int $mode = MB_CASE_FOLD, ?string $encoding = 'UTF-8') - { - return mb_convert_case($string, $mode, $encoding); - } - - /** - * Replace consecutive instances of a given character with a single character in the given string. - * - * @param string $string - * @param array|string $characters - * @return ($string is '' ? '' : string) - */ - public static function deduplicate(string $string, array|string $characters = ' ') - { - if (is_string($characters)) { - return preg_replace('/'.preg_quote($characters, '/').'+/u', $characters, $string); - } - - return array_reduce( - $characters, - fn ($carry, $character) => preg_replace('/'.preg_quote($character, '/').'+/u', $character, $carry), - $string - ); - } - - /** - * Determine if a given string ends with a given substring. - * - * @param string $haystack - * @param string|iterable $needles - * @return ($needles is array{} ? false : ($haystack is non-empty-string ? bool : false)) - */ - public static function endsWith($haystack, $needles) - { - if (is_null($haystack)) { - return false; - } - - if (! is_iterable($needles)) { - $needles = (array) $needles; - } - - foreach ($needles as $needle) { - if ((string) $needle !== '' && str_ends_with($haystack, $needle)) { - return true; - } - } - - return false; - } - - /** - * Determine if a given string doesn't end with a given substring. - * - * @param string $haystack - * @param string|iterable $needles - * @return ($needles is array{} ? true : ($haystack is non-empty-string ? bool : true)) - */ - public static function doesntEndWith($haystack, $needles) - { - return ! static::endsWith($haystack, $needles); - } - - /** - * Extracts an excerpt from text that matches the first instance of a phrase. - * - * @param string $text - * @param string $phrase - * @param array{radius?: int|float, omission?: string} $options - * @return string|null - */ - public static function excerpt($text, $phrase = '', $options = []) - { - $radius = $options['radius'] ?? 100; - $omission = $options['omission'] ?? '...'; - - preg_match('/^(.*?)('.preg_quote((string) $phrase, '/').')(.*)$/iu', (string) $text, $matches); - - if (empty($matches)) { - return null; - } - - $start = ltrim($matches[1]); - - $start = Str::of(mb_substr($start, max(mb_strlen($start, 'UTF-8') - $radius, 0), $radius, 'UTF-8'))->ltrim()->unless( - fn ($startWithRadius) => $startWithRadius->exactly($start), - fn ($startWithRadius) => $startWithRadius->prepend($omission), - ); - - $end = rtrim($matches[3]); - - $end = Str::of(mb_substr($end, 0, $radius, 'UTF-8'))->rtrim()->unless( - fn ($endWithRadius) => $endWithRadius->exactly($end), - fn ($endWithRadius) => $endWithRadius->append($omission), - ); - - return $start->append($matches[2], $end)->toString(); - } - - /** - * Cap a string with a single instance of a given value. - * - * @param string $value - * @param string $cap - * @return ($value is '' ? ($cap is '' ? '' : non-empty-string) : non-empty-string) - */ - public static function finish($value, $cap) - { - $quoted = preg_quote($cap, '/'); - - return preg_replace('/(?:'.$quoted.')+$/u', '', $value).$cap; - } - - /** - * Wrap the string with the given strings. - * - * @param string $value - * @param string $before - * @param string|null $after - * @return ($value is '' ? ($before is '' ? ($after is '' ? '' : ($after is null ? '' : non-empty-string)) : non-empty-string) : non-empty-string) - */ - public static function wrap($value, $before, $after = null) - { - return $before.$value.($after ?? $before); - } - - /** - * Unwrap the string with the given strings. - * - * @param string $value - * @param string $before - * @param string|null $after - * @return string - */ - public static function unwrap($value, $before, $after = null) - { - if (static::startsWith($value, $before)) { - $value = static::substr($value, static::length($before)); - } - - if (static::endsWith($value, $after ??= $before)) { - $value = static::substr($value, 0, -static::length($after)); - } - - return $value; - } - - /** - * Determine if a given string matches a given pattern. - * - * @param string|iterable $pattern - * @param string $value - * @param bool $ignoreCase - * @return bool - */ - public static function is($pattern, $value, $ignoreCase = false) - { - $value = (string) $value; - - if (! is_iterable($pattern)) { - $pattern = [$pattern]; - } - - foreach ($pattern as $pattern) { - $pattern = (string) $pattern; - - // If the given value is an exact match we can of course return true right - // from the beginning. Otherwise, we will translate asterisks and do an - // actual pattern match against the two strings to see if they match. - if ($pattern === '*' || $pattern === $value) { - return true; - } - - if ($ignoreCase && mb_strtolower($pattern) === mb_strtolower($value)) { - return true; - } - - $pattern = preg_quote($pattern, '#'); - - // Asterisks are translated into zero-or-more regular expression wildcards - // to make it convenient to check if the strings starts with the given - // pattern such as "library/*", making any string check convenient. - $pattern = str_replace('\*', '.*', $pattern); - - if (preg_match('#^'.$pattern.'\z#'.($ignoreCase ? 'isu' : 'su'), $value) === 1) { - return true; - } - } - - return false; - } - - /** - * Determine if a given string is 7 bit ASCII. - * - * @param string $value - * @return bool - */ - public static function isAscii($value) - { - return ASCII::is_ascii((string) $value); - } - - /** - * Determine if a given value is valid JSON. - * - * @param mixed $value - * @return bool - * - * @phpstan-assert-if-true =non-empty-string $value - */ - public static function isJson($value) - { - if (! is_string($value)) { - return false; - } - - return json_validate($value, 512); - } - - /** - * Determine if a given value is a valid URL. - * - * @param mixed $value - * @param string[] $protocols - * @return bool - * - * @phpstan-assert-if-true =non-empty-string $value - */ - public static function isUrl($value, array $protocols = []) - { - if (! is_string($value)) { - return false; - } - - $protocolList = empty($protocols) - ? 'aaa|aaas|about|acap|acct|acd|acr|adiumxtra|adt|afp|afs|aim|amss|android|appdata|apt|ark|attachment|aw|barion|beshare|bitcoin|bitcoincash|blob|bolo|browserext|calculator|callto|cap|cast|casts|chrome|chrome-extension|cid|coap|coap\+tcp|coap\+ws|coaps|coaps\+tcp|coaps\+ws|com-eventbrite-attendee|content|conti|crid|cvs|dab|data|dav|diaspora|dict|did|dis|dlna-playcontainer|dlna-playsingle|dns|dntp|dpp|drm|drop|dtn|dvb|ed2k|elsi|example|facetime|fax|feed|feedready|file|filesystem|finger|first-run-pen-experience|fish|fm|ftp|fuchsia-pkg|geo|gg|git|gizmoproject|go|gopher|graph|gtalk|h323|ham|hcap|hcp|http|https|hxxp|hxxps|hydrazone|iax|icap|icon|im|imap|info|iotdisco|ipn|ipp|ipps|irc|irc6|ircs|iris|iris\.beep|iris\.lwz|iris\.xpc|iris\.xpcs|isostore|itms|jabber|jar|jms|keyparc|lastfm|ldap|ldaps|leaptofrogans|lorawan|lvlt|magnet|mailserver|mailto|maps|market|message|mid|mms|modem|mongodb|moz|ms-access|ms-browser-extension|ms-calculator|ms-drive-to|ms-enrollment|ms-excel|ms-eyecontrolspeech|ms-gamebarservices|ms-gamingoverlay|ms-getoffice|ms-help|ms-infopath|ms-inputapp|ms-lockscreencomponent-config|ms-media-stream-id|ms-mixedrealitycapture|ms-mobileplans|ms-officeapp|ms-people|ms-project|ms-powerpoint|ms-publisher|ms-restoretabcompanion|ms-screenclip|ms-screensketch|ms-search|ms-search-repair|ms-secondary-screen-controller|ms-secondary-screen-setup|ms-settings|ms-settings-airplanemode|ms-settings-bluetooth|ms-settings-camera|ms-settings-cellular|ms-settings-cloudstorage|ms-settings-connectabledevices|ms-settings-displays-topology|ms-settings-emailandaccounts|ms-settings-language|ms-settings-location|ms-settings-lock|ms-settings-nfctransactions|ms-settings-notifications|ms-settings-power|ms-settings-privacy|ms-settings-proximity|ms-settings-screenrotation|ms-settings-wifi|ms-settings-workplace|ms-spd|ms-sttoverlay|ms-transit-to|ms-useractivityset|ms-virtualtouchpad|ms-visio|ms-walk-to|ms-whiteboard|ms-whiteboard-cmd|ms-word|msnim|msrp|msrps|mss|mtqp|mumble|mupdate|mvn|news|nfs|ni|nih|nntp|notes|ocf|oid|onenote|onenote-cmd|opaquelocktoken|openpgp4fpr|pack|palm|paparazzi|payto|pkcs11|platform|pop|pres|prospero|proxy|pwid|psyc|pttp|qb|query|redis|rediss|reload|res|resource|rmi|rsync|rtmfp|rtmp|rtsp|rtsps|rtspu|s3|secondlife|service|session|sftp|sgn|shttp|sieve|simpleledger|sip|sips|skype|smb|sms|smtp|snews|snmp|soap\.beep|soap\.beeps|soldat|spiffe|spotify|ssh|steam|stun|stuns|submit|svn|tag|teamspeak|tel|teliaeid|telnet|tftp|tg|things|thismessage|tip|tn3270|tool|ts3server|turn|turns|tv|udp|unreal|urn|ut2004|v-event|vemmi|ventrilo|videotex|vnc|view-source|wais|webcal|wpid|ws|wss|wtai|wyciwyg|xcon|xcon-userid|xfire|xmlrpc\.beep|xmlrpc\.beeps|xmpp|xri|ymsgr|z39\.50|z39\.50r|z39\.50s' - : implode('|', $protocols); - - /* - * This pattern is derived from Symfony\Component\Validator\Constraints\UrlValidator (5.0.7). - * - * (c) Fabien Potencier http://symfony.com - */ - $pattern = '~^ - (LARAVEL_PROTOCOLS):// # protocol - (((?:[\_\.\pL\pN-]|%[0-9A-Fa-f]{2})+:)?((?:[\_\.\pL\pN-]|%[0-9A-Fa-f]{2})+)@)? # basic auth - ( - (?: - (?: - (?:[\pL\pN\pS\pM\-\_]++\.)+ - (?: - (?:xn--[a-z0-9-]++) # punycode in tld - | - (?:[\pL\pN\pM]++) # no punycode in tld - ) - ) # a multi-level domain name - | - [a-z0-9\-\_]++ # a single-level domain name - )\.? - | # or - \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} # an IP address - | # or - \[ - (?:(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){6})(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:::(?:(?:(?:[0-9a-f]{1,4})):){5})(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:[0-9a-f]{1,4})))?::(?:(?:(?:[0-9a-f]{1,4})):){4})(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,1}(?:(?:[0-9a-f]{1,4})))?::(?:(?:(?:[0-9a-f]{1,4})):){3})(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,2}(?:(?:[0-9a-f]{1,4})))?::(?:(?:(?:[0-9a-f]{1,4})):){2})(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,3}(?:(?:[0-9a-f]{1,4})))?::(?:(?:[0-9a-f]{1,4})):)(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,4}(?:(?:[0-9a-f]{1,4})))?::)(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,5}(?:(?:[0-9a-f]{1,4})))?::)(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,6}(?:(?:[0-9a-f]{1,4})))?::)))) - \] # an IPv6 address - ) - (:[0-9]+)? # a port (optional) - (?:/ (?:[\pL\pN\-._\~!$&\'()*+,;=:@]|%[0-9A-Fa-f]{2})* )* # a path - (?:\? (?:[\pL\pN\-._\~!$&\'\[\]()*+,;=:@/?]|%[0-9A-Fa-f]{2})* )? # a query (optional) - (?:\# (?:[\pL\pN\-._\~!$&\'()*+,;=:@/?]|%[0-9A-Fa-f]{2})* )? # a fragment (optional) - $~ixu'; - - return preg_match(str_replace('LARAVEL_PROTOCOLS', $protocolList, $pattern), $value) > 0; - } - - /** - * Determine if a given value is a valid UUID. - * - * @param mixed $value - * @param int<0, 8>|'nil'|'max'|null $version - * @return bool - * - * @phpstan-assert-if-true =non-empty-string $value - */ - public static function isUuid($value, $version = null) - { - if (! is_string($value)) { - return false; - } - - if ($version === null) { - return preg_match('/^[\da-fA-F]{8}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{12}$/D', $value) > 0; - } - - $factory = new UuidFactory; - - try { - $factoryUuid = $factory->fromString($value); - } catch (InvalidUuidStringException) { - return false; - } - - $fields = $factoryUuid->getFields(); - - if (! ($fields instanceof FieldsInterface)) { - return false; - } - - if ($version === 0 || $version === 'nil') { - return $fields->isNil(); - } - - if ($version === 'max') { - return $fields->isMax(); - } - - return $fields->getVersion() === $version; - } - - /** - * Determine if a given value is a valid ULID. - * - * @param mixed $value - * @return bool - * - * @phpstan-assert-if-true =non-empty-string $value - */ - public static function isUlid($value) - { - if (! is_string($value)) { - return false; - } - - return Ulid::isValid($value); - } - - /** - * Convert a string to kebab case. - * - * @param string $value - * @return ($value is '' ? '' : string) - */ - public static function kebab($value) - { - return static::snake($value, '-'); - } - - /** - * Return the length of the given string. - * - * @param string $value - * @param string|null $encoding - * @return non-negative-int - */ - public static function length($value, $encoding = null) - { - return mb_strlen($value, $encoding); - } - - /** - * Limit the number of characters in a string. - * - * @param string $value - * @param int $limit - * @param string $end - * @param bool $preserveWords - * @return string - */ - public static function limit($value, $limit = 100, $end = '...', $preserveWords = false) - { - if (mb_strwidth($value, 'UTF-8') <= $limit) { - return $value; - } - - if (! $preserveWords) { - return rtrim(mb_strimwidth($value, 0, $limit, '', 'UTF-8')).$end; - } - - $value = trim(preg_replace('/[\n\r]+/', ' ', strip_tags($value))); - - $trimmed = rtrim(mb_strimwidth($value, 0, $limit, '', 'UTF-8')); - - if (mb_substr($value, $limit, 1, 'UTF-8') === ' ') { - return $trimmed.$end; - } - - return preg_replace("/(.*)\s.*/", '$1', $trimmed).$end; - } - - /** - * Convert the given string to lower-case. - * - * @param string $value - * @return ($value is '' ? '' : non-empty-string&lowercase-string) - */ - public static function lower($value) - { - return mb_strtolower($value, 'UTF-8'); - } - - /** - * Limit the number of words in a string. - * - * @param string $value - * @param int $words - * @param string $end - * @return string - */ - public static function words($value, $words = 100, $end = '...') - { - preg_match('/^\s*+(?:\S++\s*+){1,'.$words.'}/u', $value, $matches); - - if (! isset($matches[0]) || static::length($value) === static::length($matches[0])) { - return $value; - } - - return rtrim($matches[0]).$end; - } - - /** - * Converts GitHub flavored Markdown into HTML. - * - * @param string $string - * @param array $options - * @param \League\CommonMark\Extension\ExtensionInterface[] $extensions - * @return ($string is '' ? '' : string) - */ - public static function markdown($string, array $options = [], array $extensions = []) - { - $converter = new GithubFlavoredMarkdownConverter($options); - - $environment = $converter->getEnvironment(); - - foreach ($extensions as $extension) { - $environment->addExtension($extension); - } - - return (string) $converter->convert($string); - } - - /** - * Converts inline Markdown into HTML. - * - * @param string $string - * @param array $options - * @param \League\CommonMark\Extension\ExtensionInterface[] $extensions - * @return ($string is '' ? '' : string) - */ - public static function inlineMarkdown($string, array $options = [], array $extensions = []) - { - $environment = new Environment($options); - - $environment->addExtension(new GithubFlavoredMarkdownExtension()); - $environment->addExtension(new InlinesOnlyExtension()); - - foreach ($extensions as $extension) { - $environment->addExtension($extension); - } - - $converter = new MarkdownConverter($environment); - - return (string) $converter->convert($string); - } - - /** - * Masks a portion of a string with a repeated character. - * - * @param string $string - * @param string $character - * @param int $index - * @param int|null $length - * @param string $encoding - * @return string - */ - public static function mask($string, $character, $index, $length = null, $encoding = 'UTF-8') - { - if ($character === '') { - return $string; - } - - $segment = mb_substr($string, $index, $length, $encoding); - - if ($segment === '') { - return $string; - } - - $strlen = mb_strlen($string, $encoding); - $startIndex = $index; - - if ($index < 0) { - $startIndex = $index < -$strlen ? 0 : $strlen + $index; - } - - $start = mb_substr($string, 0, $startIndex, $encoding); - $segmentLen = mb_strlen($segment, $encoding); - $end = mb_substr($string, $startIndex + $segmentLen); - - return $start.str_repeat(mb_substr($character, 0, 1, $encoding), $segmentLen).$end; - } - - /** - * Get the string matching the given pattern. - * - * @param string $pattern - * @param string $subject - * @return string - */ - public static function match($pattern, $subject) - { - preg_match($pattern, $subject, $matches); - - if (! $matches) { - return ''; - } - - return $matches[1] ?? $matches[0]; - } - - /** - * Determine if a given string matches a given pattern. - * - * @param string|iterable $pattern - * @param string $value - * @return ($pattern is array{} ? false : bool) - */ - public static function isMatch($pattern, $value) - { - $value = (string) $value; - - if (! is_iterable($pattern)) { - $pattern = [$pattern]; - } - - foreach ($pattern as $pattern) { - $pattern = (string) $pattern; - - if (preg_match($pattern, $value) === 1) { - return true; - } - } - - return false; - } - - /** - * Get the string matching the given pattern. - * - * @param string $pattern - * @param string $subject - * @return \Illuminate\Support\Collection - */ - public static function matchAll($pattern, $subject) - { - preg_match_all($pattern, $subject, $matches); - - if (empty($matches[0])) { - return new Collection; - } - - return new Collection($matches[1] ?? $matches[0]); - } - - /** - * Remove all non-numeric characters from a string. - * - * @param string $value - * @return string - */ - public static function numbers($value) - { - return preg_replace('/[^0-9]/', '', $value); - } - - /** - * Pad both sides of a string with another. - * - * @param string $value - * @param int $length - * @param string $pad - * @return string - */ - public static function padBoth($value, $length, $pad = ' ') - { - return mb_str_pad($value, $length, $pad, STR_PAD_BOTH); - } - - /** - * Pad the left side of a string with another. - * - * @param string $value - * @param int $length - * @param string $pad - * @return string - */ - public static function padLeft($value, $length, $pad = ' ') - { - return mb_str_pad($value, $length, $pad, STR_PAD_LEFT); - } - - /** - * Pad the right side of a string with another. - * - * @param string $value - * @param int $length - * @param string $pad - * @return string - */ - public static function padRight($value, $length, $pad = ' ') - { - return mb_str_pad($value, $length, $pad, STR_PAD_RIGHT); - } - - /** - * Parse a Class[@]method style callback into class and method. - * - * @param string $callback - * @param string|null $default - * @return array - */ - public static function parseCallback($callback, $default = null) - { - if (static::contains($callback, "@anonymous\0")) { - if (static::substrCount($callback, '@') > 1) { - return [ - static::beforeLast($callback, '@'), - static::afterLast($callback, '@'), - ]; - } - - return [$callback, $default]; - } - - return static::contains($callback, '@') ? explode('@', $callback, 2) : [$callback, $default]; - } - - /** - * Get the plural form of an English word. - * - * @param string $value - * @param int|array|\Countable $count - * @param bool $prependCount - * @return string - */ - public static function plural($value, $count = 2, $prependCount = false) - { - if (is_countable($count)) { - $count = count($count); - } - - return ($prependCount ? Number::format($count).' ' : '').Pluralizer::plural($value, $count); - } - - /** - * Pluralize the last word of an English, studly caps case string. - * - * @param string $value - * @param int|array|\Countable $count - * @return string - */ - public static function pluralStudly($value, $count = 2) - { - $parts = preg_split('/(.)(?=[A-Z])/u', $value, -1, PREG_SPLIT_DELIM_CAPTURE); - - $lastWord = array_pop($parts); - - return implode('', $parts).self::plural($lastWord, $count); - } - - /** - * Pluralize the last word of an English, Pascal caps case string. - * - * @param string $value - * @param int|array|\Countable $count - * @return string - */ - public static function pluralPascal($value, $count = 2) - { - return static::pluralStudly($value, $count); - } - - /** - * Generate a random, secure password. - * - * @param int $length - * @param bool $letters - * @param bool $numbers - * @param bool $symbols - * @param bool $spaces - * @return ($letters is false ? ($numbers is true ? ($symbols is false ? ($spaces is false ? numeric-string : string) : string) : string) : string) - */ - public static function password($length = 32, $letters = true, $numbers = true, $symbols = true, $spaces = false) - { - $password = new Collection(); - - $options = (new Collection([ - 'letters' => $letters === true ? [ - 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', - 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', - 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', - 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', - 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', - ] : null, - 'numbers' => $numbers === true ? [ - '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', - ] : null, - 'symbols' => $symbols === true ? [ - '~', '!', '#', '$', '%', '^', '&', '*', '(', ')', '-', - '_', '.', ',', '<', '>', '?', '/', '\\', '{', '}', '[', - ']', '|', ':', ';', - ] : null, - 'spaces' => $spaces === true ? [' '] : null, - ])) - ->filter() - ->each(fn ($c) => $password->push($c[random_int(0, count($c) - 1)])) - ->flatten(); - - $length = $length - $password->count(); - - return $password->merge($options->pipe( - fn ($c) => Collection::times($length, fn () => $c[random_int(0, $c->count() - 1)]) - ))->shuffle()->implode(''); - } - - /** - * Find the multi-byte safe position of the first occurrence of a given substring in a string. - * - * @param string $haystack - * @param string $needle - * @param int $offset - * @param string|null $encoding - * @return ($haystack is '' ? false : ($needle is '' ? false : int|false)) - */ - public static function position($haystack, $needle, $offset = 0, $encoding = null) - { - return mb_strpos($haystack, (string) $needle, $offset, $encoding); - } - - /** - * Generate a more truly "random" alpha-numeric string. - * - * @param int $length - * @return string - */ - public static function random($length = 16) - { - return (static::$randomStringFactory ?? function ($length) { - $string = ''; - - while (($len = strlen($string)) < $length) { - $size = $length - $len; - - $bytesSize = (int) ceil($size / 3) * 3; - - $bytes = random_bytes($bytesSize); - - $string .= substr(str_replace(['/', '+', '='], '', base64_encode($bytes)), 0, $size); - } - - return $string; - })($length); - } - - /** - * Set the callable that will be used to generate random strings. - * - * @param (callable(int): string)|null $factory - * @return void - */ - public static function createRandomStringsUsing(?callable $factory = null) - { - static::$randomStringFactory = $factory; - } - - /** - * Set the sequence that will be used to generate random strings. - * - * @param string[] $sequence - * @param (callable(int): string)|null $whenMissing - * @return void - */ - public static function createRandomStringsUsingSequence(array $sequence, $whenMissing = null) - { - $next = 0; - - $whenMissing ??= function ($length) use (&$next) { - $factoryCache = static::$randomStringFactory; - - static::$randomStringFactory = null; - - $randomString = static::random($length); - - static::$randomStringFactory = $factoryCache; - - $next++; - - return $randomString; - }; - - static::createRandomStringsUsing(function ($length) use (&$next, $sequence, $whenMissing) { - if (array_key_exists($next, $sequence)) { - return $sequence[$next++]; - } - - return $whenMissing($length); - }); - } - - /** - * Indicate that random strings should be created normally and not using a custom factory. - * - * @return void - */ - public static function createRandomStringsNormally() - { - static::$randomStringFactory = null; - } - - /** - * Repeat the given string. - * - * @param string $string - * @param int $times - * @return string - */ - public static function repeat(string $string, int $times) - { - return str_repeat($string, $times); - } - - /** - * Replace a given value in the string sequentially with an array. - * - * @param string $search - * @param iterable $replace - * @param string $subject - * @return string - */ - public static function replaceArray($search, $replace, $subject) - { - if ($replace instanceof Traversable) { - $replace = Arr::from($replace); - } - - $segments = explode($search, $subject); - - $result = array_shift($segments); - - foreach ($segments as $segment) { - $result .= self::toStringOr(array_shift($replace) ?? $search, $search).$segment; - } - - return $result; - } - - /** - * Convert the given value to a string or return the given fallback on failure. - * - * @param mixed $value - * @param string $fallback - * @return string - */ - private static function toStringOr($value, $fallback) - { - try { - return (string) $value; - } catch (Throwable $e) { - return $fallback; - } - } - - /** - * Replace the given value in the given string. - * - * @param string|iterable $search - * @param string|iterable $replace - * @param string|iterable $subject - * @param bool $caseSensitive - * @return ($subject is string ? string : string[]) - */ - public static function replace($search, $replace, $subject, $caseSensitive = true) - { - if ($search instanceof Traversable) { - $search = Arr::from($search); - } - - if ($replace instanceof Traversable) { - $replace = Arr::from($replace); - } - - if ($subject instanceof Traversable) { - $subject = Arr::from($subject); - } - - return $caseSensitive - ? str_replace($search, $replace, $subject) - : str_ireplace($search, $replace, $subject); - } - - /** - * Replace the first occurrence of a given value in the string. - * - * @param string $search - * @param string $replace - * @param string $subject - * @return string - */ - public static function replaceFirst($search, $replace, $subject) - { - $search = (string) $search; - - if ($search === '') { - return $subject; - } - - $position = strpos($subject, $search); - - if ($position !== false) { - return substr_replace($subject, $replace, $position, strlen($search)); - } - - return $subject; - } - - /** - * Replace the first occurrence of the given value if it appears at the start of the string. - * - * @param string $search - * @param string $replace - * @param string $subject - * @return string - */ - public static function replaceStart($search, $replace, $subject) - { - $search = (string) $search; - - if ($search === '') { - return $subject; - } - - if (static::startsWith($subject, $search)) { - return static::replaceFirst($search, $replace, $subject); - } - - return $subject; - } - - /** - * Replace the last occurrence of a given value in the string. - * - * @param string $search - * @param string $replace - * @param string $subject - * @return string - */ - public static function replaceLast($search, $replace, $subject) - { - $search = (string) $search; - - if ($search === '') { - return $subject; - } - - $position = strrpos($subject, $search); - - if ($position !== false) { - return substr_replace($subject, $replace, $position, strlen($search)); - } - - return $subject; - } - - /** - * Replace the last occurrence of a given value if it appears at the end of the string. - * - * @param string $search - * @param string $replace - * @param string $subject - * @return string - */ - public static function replaceEnd($search, $replace, $subject) - { - $search = (string) $search; - - if ($search === '') { - return $subject; - } - - if (static::endsWith($subject, $search)) { - return static::replaceLast($search, $replace, $subject); - } - - return $subject; - } - - /** - * Replace the patterns matching the given regular expression. - * - * @param string|string[] $pattern - * @param (\Closure(array): string)|string[]|string $replace - * @param string[]|string $subject - * @param int $limit - * @return ($subject is array ? string[]|null : string|null) - */ - public static function replaceMatches($pattern, $replace, $subject, $limit = -1) - { - if ($replace instanceof Closure) { - return preg_replace_callback($pattern, $replace, $subject, $limit); - } - - return preg_replace($pattern, $replace, $subject, $limit); - } - - /** - * Remove any occurrence of the given string in the subject. - * - * @param string|iterable $search - * @param string|iterable $subject - * @param bool $caseSensitive - * @return string - */ - public static function remove($search, $subject, $caseSensitive = true) - { - if ($search instanceof Traversable) { - $search = Arr::from($search); - } - - return $caseSensitive - ? str_replace($search, '', $subject) - : str_ireplace($search, '', $subject); - } - - /** - * Reverse the given string. - * - * @param string $value - * @return string - */ - public static function reverse(string $value) - { - return implode(array_reverse(mb_str_split($value))); - } - - /** - * Begin a string with a single instance of a given value. - * - * @param string $value - * @param string $prefix - * @return ($value is '' ? ($prefix is '' ? '' : non-empty-string): non-empty-string) - */ - public static function start($value, $prefix) - { - $quoted = preg_quote($prefix, '/'); - - return $prefix.preg_replace('/^(?:'.$quoted.')+/u', '', $value); - } - - /** - * Convert the given string to upper-case. - * - * @param string $value - * @return ($value is '' ? '' : non-empty-string&uppercase-string) - */ - public static function upper($value) - { - return mb_strtoupper($value, 'UTF-8'); - } - - /** - * Convert the given string to proper case. - * - * @param string $value - * @return string - */ - public static function title($value) - { - return mb_convert_case($value, MB_CASE_TITLE, 'UTF-8'); - } - - /** - * Convert the given string to proper case for each word. - * - * @param string $value - * @return string - */ - public static function headline($value) - { - $parts = mb_split('\s+', $value); - - $parts = count($parts) > 1 - ? array_map(static::title(...), $parts) - : array_map(static::title(...), static::ucsplit(implode('_', $parts))); - - $collapsed = static::replace(['-', '_', ' '], '_', implode('_', $parts)); - - return implode(' ', array_filter(explode('_', $collapsed))); - } - - /** - * Get the "initials" representing each word in the provided string, optionally capitalizing. - * - * @param string $value - * @param bool $capitalize - * @return string - */ - public static function initials($value, $capitalize = false) - { - $parts = mb_split("\s+", $value); - - $parts = array_map(fn ($part) => mb_substr($part, 0, 1), $parts); - - $initials = implode('', $parts); - - return $capitalize ? static::upper($initials) : $initials; - } - - /** - * Convert the given string to APA-style title case. - * - * See: https://apastyle.apa.org/style-grammar-guidelines/capitalization/title-case - * - * @param string $value - * @return string - */ - public static function apa($value) - { - if (trim($value) === '') { - return $value; - } - - $minorWords = [ - 'and', 'as', 'but', 'for', 'if', 'nor', 'or', 'so', 'yet', 'a', 'an', - 'the', 'at', 'by', 'in', 'of', 'off', 'on', 'per', 'to', 'up', 'via', - 'et', 'ou', 'un', 'une', 'la', 'le', 'les', 'de', 'du', 'des', 'par', 'à', - ]; - - $endPunctuation = ['.', '!', '?', ':', '—', ',']; - - $words = mb_split('\s+', $value); - $wordCount = count($words); - - for ($i = 0; $i < $wordCount; $i++) { - $lowercaseWord = mb_strtolower($words[$i]); - - if (str_contains($lowercaseWord, '-')) { - $hyphenatedWords = explode('-', $lowercaseWord); - - $hyphenatedWords = array_map(function ($part) use ($minorWords) { - return (in_array($part, $minorWords) && mb_strlen($part) <= 3) - ? $part - : mb_strtoupper(mb_substr($part, 0, 1)).mb_substr($part, 1); - }, $hyphenatedWords); - - $words[$i] = implode('-', $hyphenatedWords); - } else { - if (in_array($lowercaseWord, $minorWords) && - mb_strlen($lowercaseWord) <= 3 && - ! ($i === 0 || in_array(mb_substr($words[$i - 1], -1), $endPunctuation))) { - $words[$i] = $lowercaseWord; - } else { - $words[$i] = mb_strtoupper(mb_substr($lowercaseWord, 0, 1)).mb_substr($lowercaseWord, 1); - } - } - } - - return implode(' ', $words); - } - - /** - * Get the singular form of an English word. - * - * @param string $value - * @return string - */ - public static function singular($value) - { - return Pluralizer::singular($value); - } - - /** - * Generate a URL friendly "slug" from a given string. - * - * @param string $title - * @param string $separator - * @param string|null $language - * @param array $dictionary - * @return string - */ - public static function slug($title, $separator = '-', $language = 'en', $dictionary = ['@' => 'at']) - { - $title = $language ? static::ascii($title, $language) : $title; - - // Convert all dashes/underscores into separator - $flip = $separator === '-' ? '_' : '-'; - - $title = preg_replace('!['.preg_quote($flip).']+!u', $separator, $title); - - // Replace dictionary words - foreach ($dictionary as $key => $value) { - $dictionary[$key] = $separator.$value.$separator; - } - - $title = str_replace(array_keys($dictionary), array_values($dictionary), $title); - - // Remove all characters that are not the separator, letters, numbers, or whitespace - $title = preg_replace('![^'.preg_quote($separator).'\pL\pN\s]+!u', '', static::lower($title)); - - // Replace all separator characters and whitespace by a single separator - $title = preg_replace('!['.preg_quote($separator).'\s]+!u', $separator, $title); - - return trim($title, $separator); - } - - /** - * Convert a string to snake case. - * - * @param string $value - * @param string $delimiter - * @return string - */ - public static function snake($value, $delimiter = '_') - { - $key = $value; - - if (isset(static::$snakeCache[$key][$delimiter])) { - return static::$snakeCache[$key][$delimiter]; - } - - if (! ctype_lower($value)) { - $value = preg_replace('/\s+/u', '', ucwords($value)); - - $value = static::lower(preg_replace('/(.)(?=[A-Z])/u', '$1'.$delimiter, $value)); - } - - return static::$snakeCache[$key][$delimiter] = $value; - } - - /** - * Remove all whitespace from both ends of a string. - * - * @param string $value - * @param string|null $charlist - * @return string - */ - public static function trim($value, $charlist = null) - { - if ($charlist === null) { - $trimDefaultCharacters = " \n\r\t\v\0"; - - return preg_replace('~^[\s'.self::INVISIBLE_CHARACTERS.$trimDefaultCharacters.']+|[\s'.self::INVISIBLE_CHARACTERS.$trimDefaultCharacters.']+$~u', '', $value) ?? trim($value); - } - - return trim($value, $charlist); - } - - /** - * Remove all whitespace from the beginning of a string. - * - * @param string $value - * @param string|null $charlist - * @return string - */ - public static function ltrim($value, $charlist = null) - { - if ($charlist === null) { - $ltrimDefaultCharacters = " \n\r\t\v\0"; - - return preg_replace('~^[\s'.self::INVISIBLE_CHARACTERS.$ltrimDefaultCharacters.']+~u', '', $value) ?? ltrim($value); - } - - return ltrim($value, $charlist); - } - - /** - * Remove all whitespace from the end of a string. - * - * @param string $value - * @param string|null $charlist - * @return string - */ - public static function rtrim($value, $charlist = null) - { - if ($charlist === null) { - $rtrimDefaultCharacters = " \n\r\t\v\0"; - - return preg_replace('~[\s'.self::INVISIBLE_CHARACTERS.$rtrimDefaultCharacters.']+$~u', '', $value) ?? rtrim($value); - } - - return rtrim($value, $charlist); - } - - /** - * Remove all "extra" blank space from the given string. - * - * @param string $value - * @return string - */ - public static function squish($value) - { - return preg_replace('~(\s|\x{3164}|\x{1160})+~u', ' ', static::trim($value)); - } - - /** - * Determine if a given string starts with a given substring. - * - * @param string $haystack - * @param string|iterable $needles - * @return ($needles is array{} ? false : ($haystack is non-empty-string ? bool : false)) - * - * @phpstan-assert-if-true =non-empty-string $haystack - */ - public static function startsWith($haystack, $needles) - { - if (is_null($haystack)) { - return false; - } - - if (! is_iterable($needles)) { - $needles = [$needles]; - } - - foreach ($needles as $needle) { - if ((string) $needle !== '' && str_starts_with($haystack, $needle)) { - return true; - } - } - - return false; - } - - /** - * Determine if a given string doesn't start with a given substring. - * - * @param string $haystack - * @param string|iterable $needles - * @return ($needles is array{} ? true : ($haystack is non-empty-string ? bool : true)) - * - * @phpstan-assert-if-false =non-empty-string $haystack - */ - public static function doesntStartWith($haystack, $needles) - { - return ! static::startsWith($haystack, $needles); - } - - /** - * Convert a value to studly caps case. - * - * @param string $value - * @return ($value is '' ? '' : string) - */ - public static function studly($value) - { - $key = $value; - - if (isset(static::$studlyCache[$key])) { - return static::$studlyCache[$key]; - } - - $words = mb_split('\s+', static::replace(['-', '_'], ' ', $value)); - - $studlyWords = array_map(fn ($word) => static::ucfirst($word), $words); - - return static::$studlyCache[$key] = implode($studlyWords); - } - - /** - * Convert a value to Pascal case. - * - * @param string $value - * @return ($value is '' ? '' : string) - */ - public static function pascal($value) - { - return static::studly($value); - } - - /** - * Returns the portion of the string specified by the start and length parameters. - * - * @param string $string - * @param int $start - * @param int|null $length - * @param string $encoding - * @return string - */ - public static function substr($string, $start, $length = null, $encoding = 'UTF-8') - { - return mb_substr($string, $start, $length, $encoding); - } - - /** - * Returns the number of substring occurrences. - * - * @param string $haystack - * @param string $needle - * @param int $offset - * @param int|null $length - * @return int - */ - public static function substrCount($haystack, $needle, $offset = 0, $length = null) - { - if (! is_null($length)) { - return substr_count($haystack, $needle, $offset, $length); - } - - return substr_count($haystack, $needle, $offset); - } - - /** - * Replace text within a portion of a string. - * - * @param string|string[] $string - * @param string|string[] $replace - * @param int|int[] $offset - * @param int|int[]|null $length - * @return string|string[] - */ - public static function substrReplace($string, $replace, $offset = 0, $length = null) - { - if ($length === null) { - $length = static::length($string); - } - - return mb_substr($string, 0, $offset) - .$replace - .mb_substr(mb_substr($string, $offset), $length); - } - - /** - * Swap multiple keywords in a string with other keywords. - * - * @param array $map - * @param string $subject - * @return string - */ - public static function swap(array $map, $subject) - { - return strtr($subject, $map); - } - - /** - * Take the first or last {$limit} characters of a string. - * - * @param string $string - * @param int $limit - * @return string - */ - public static function take($string, int $limit): string - { - if ($limit < 0) { - return static::substr($string, $limit); - } - - return static::substr($string, 0, $limit); - } - - /** - * Convert the given string to Base64 encoding. - * - * @param string $string - * @return ($string is '' ? '' : string) - */ - public static function toBase64($string): string - { - return base64_encode($string); - } - - /** - * Decode the given Base64 encoded string. - * - * @param string $string - * @param bool $strict - * @return ($strict is true ? ($string is '' ? '' : string|false) : ($string is '' ? '' : string)) - */ - public static function fromBase64($string, $strict = false) - { - return base64_decode($string, $strict); - } - - /** - * Make a string's first character lowercase. - * - * @param string $string - * @return ($string is '' ? '' : non-empty-string) - */ - public static function lcfirst($string) - { - return static::lower(static::substr($string, 0, 1)).static::substr($string, 1); - } - - /** - * Make a string's first character uppercase. - * - * @param string $string - * @return ($string is '' ? '' : non-empty-string) - */ - public static function ucfirst($string) - { - return static::upper(static::substr($string, 0, 1)).static::substr($string, 1); - } - - /** - * Capitalize the first character of each word in a string. - * - * @param string $string - * @param string $separators - * @return ($string is '' ? '' : non-empty-string) - */ - public static function ucwords($string, $separators = " \t\r\n\f\v") - { - $pattern = '/(^|['.preg_quote($separators, '/').'])(\p{Ll})/u'; - - return preg_replace_callback($pattern, function ($matches) { - return $matches[1].mb_strtoupper($matches[2]); - }, $string); - } - - /** - * Split a string into pieces by uppercase characters. - * - * @param string $string - * @return ($string is '' ? array{} : string[]) - */ - public static function ucsplit($string) - { - return preg_split('/(?=\p{Lu})/u', $string, -1, PREG_SPLIT_NO_EMPTY); - } - - /** - * Get the number of words a string contains. - * - * @param string $string - * @param string|null $characters - * @return non-negative-int - */ - public static function wordCount($string, $characters = null) - { - return str_word_count($string, 0, $characters); - } - - /** - * Wrap a string to a given number of characters. - * - * @param string $string - * @param int $characters - * @param string $break - * @param bool $cutLongWords - * @return string - */ - public static function wordWrap($string, $characters = 75, $break = "\n", $cutLongWords = false) - { - return wordwrap($string, $characters, $break, $cutLongWords); - } - - /** - * Generate a UUID (version 4). - * - * @return \Ramsey\Uuid\UuidInterface - */ - public static function uuid() - { - return static::$uuidFactory - ? call_user_func(static::$uuidFactory) - : Uuid::uuid4(); - } - - /** - * Generate a UUID (version 7). - * - * @param \DateTimeInterface|null $time - * @return \Ramsey\Uuid\UuidInterface - */ - public static function uuid7($time = null) - { - return static::$uuidFactory - ? call_user_func(static::$uuidFactory) - : Uuid::uuid7($time); - } - - /** - * Generate a time-ordered UUID. - * - * @return \Ramsey\Uuid\UuidInterface - */ - public static function orderedUuid() - { - if (static::$uuidFactory) { - return call_user_func(static::$uuidFactory); - } - - $factory = new UuidFactory; - - $factory->setRandomGenerator(new CombGenerator( - $factory->getRandomGenerator(), - $factory->getNumberConverter() - )); - - $factory->setCodec(new TimestampFirstCombCodec( - $factory->getUuidBuilder() - )); - - return $factory->uuid4(); - } - - /** - * Set the callable that will be used to generate UUIDs. - * - * @param (callable(): \Ramsey\Uuid\UuidInterface)|null $factory - * @return void - */ - public static function createUuidsUsing(?callable $factory = null) - { - static::$uuidFactory = $factory; - } - - /** - * Set the sequence that will be used to generate UUIDs. - * - * @param \Ramsey\Uuid\UuidInterface[] $sequence - * @param (callable(): \Ramsey\Uuid\UuidInterface)|null $whenMissing - * @return void - */ - public static function createUuidsUsingSequence(array $sequence, $whenMissing = null) - { - $next = 0; - - $whenMissing ??= function () use (&$next) { - $factoryCache = static::$uuidFactory; - - static::$uuidFactory = null; - - $uuid = static::uuid(); - - static::$uuidFactory = $factoryCache; - - $next++; - - return $uuid; - }; - - static::createUuidsUsing(function () use (&$next, $sequence, $whenMissing) { - if (array_key_exists($next, $sequence)) { - return $sequence[$next++]; - } - - return $whenMissing(); - }); - } - - /** - * Always return the same UUID when generating new UUIDs. - * - * @param (\Closure(\Ramsey\Uuid\UuidInterface): mixed)|null $callback - * @return \Ramsey\Uuid\UuidInterface - */ - public static function freezeUuids(?Closure $callback = null) - { - $uuid = Str::uuid(); - - Str::createUuidsUsing(fn () => $uuid); - - if ($callback !== null) { - try { - $callback($uuid); - } finally { - Str::createUuidsNormally(); - } - } - - return $uuid; - } - - /** - * Indicate that UUIDs should be created normally and not using a custom factory. - * - * @return void - */ - public static function createUuidsNormally() - { - static::$uuidFactory = null; - } - - /** - * Generate a ULID. - * - * @param \DateTimeInterface|null $time - * @return \Symfony\Component\Uid\Ulid - */ - public static function ulid($time = null) - { - if (static::$ulidFactory) { - return call_user_func(static::$ulidFactory); - } - - if ($time === null) { - return new Ulid(); - } - - return new Ulid(Ulid::generate($time)); - } - - /** - * Indicate that ULIDs should be created normally and not using a custom factory. - * - * @return void - */ - public static function createUlidsNormally() - { - static::$ulidFactory = null; - } - - /** - * Set the callable that will be used to generate ULIDs. - * - * @param (callable(): \Symfony\Component\Uid\Ulid)|null $factory - * @return void - */ - public static function createUlidsUsing(?callable $factory = null) - { - static::$ulidFactory = $factory; - } - - /** - * Set the sequence that will be used to generate ULIDs. - * - * @param \Symfony\Component\Uid\Ulid[] $sequence - * @param (callable(): \Symfony\Component\Uid\Ulid)|null $whenMissing - * @return void - */ - public static function createUlidsUsingSequence(array $sequence, $whenMissing = null) - { - $next = 0; - - $whenMissing ??= function () use (&$next) { - $factoryCache = static::$ulidFactory; - - static::$ulidFactory = null; - - $ulid = static::ulid(); - - static::$ulidFactory = $factoryCache; - - $next++; - - return $ulid; - }; - - static::createUlidsUsing(function () use (&$next, $sequence, $whenMissing) { - if (array_key_exists($next, $sequence)) { - return $sequence[$next++]; - } - - return $whenMissing(); - }); - } - - /** - * Always return the same ULID when generating new ULIDs. - * - * @param (Closure(Ulid): mixed)|null $callback - * @return Ulid - */ - public static function freezeUlids(?Closure $callback = null) - { - $ulid = Str::ulid(); - - Str::createUlidsUsing(fn () => $ulid); - - if ($callback !== null) { - try { - $callback($ulid); - } finally { - Str::createUlidsNormally(); - } - } - - return $ulid; - } - - /** - * Remove all strings from the casing caches. - * - * @return void - */ - public static function flushCache() - { - static::$snakeCache = []; - static::$camelCache = []; - static::$studlyCache = []; - } -} diff --git a/plugins/vendor/illuminate/support/Stringable.php b/plugins/vendor/illuminate/support/Stringable.php deleted file mode 100644 index 64b4cf5d..00000000 --- a/plugins/vendor/illuminate/support/Stringable.php +++ /dev/null @@ -1,1623 +0,0 @@ -value = (string) $value; - } - - /** - * Return the remainder of a string after the first occurrence of a given value. - * - * @param string $search - * @return static - */ - public function after($search) - { - return new static(Str::after($this->value, $search)); - } - - /** - * Return the remainder of a string after the last occurrence of a given value. - * - * @param string $search - * @return static - */ - public function afterLast($search) - { - return new static(Str::afterLast($this->value, $search)); - } - - /** - * Append the given values to the string. - * - * @param array|string ...$values - * @return static - */ - public function append(...$values) - { - return new static($this->value.implode('', $values)); - } - - /** - * Append a new line to the string. - * - * @param int $count - * @return $this - */ - public function newLine($count = 1) - { - return $this->append(str_repeat(PHP_EOL, $count)); - } - - /** - * Transliterate a UTF-8 value to ASCII. - * - * @param string $language - * @return static - */ - public function ascii($language = 'en') - { - return new static(Str::ascii($this->value, $language)); - } - - /** - * Get the trailing name component of the path. - * - * @param string $suffix - * @return static - */ - public function basename($suffix = '') - { - return new static(basename($this->value, $suffix)); - } - - /** - * Get the character at the specified index. - * - * @param int $index - * @return string|false - */ - public function charAt($index) - { - return Str::charAt($this->value, $index); - } - - /** - * Remove the given string if it exists at the start of the current string. - * - * @param string|array $needle - * @return static - */ - public function chopStart($needle) - { - return new static(Str::chopStart($this->value, $needle)); - } - - /** - * Remove the given string if it exists at the end of the current string. - * - * @param string|array $needle - * @return static - */ - public function chopEnd($needle) - { - return new static(Str::chopEnd($this->value, $needle)); - } - - /** - * Get the basename of the class path. - * - * @return static - */ - public function classBasename() - { - return new static(class_basename($this->value)); - } - - /** - * Get the portion of a string before the first occurrence of a given value. - * - * @param string $search - * @return static - */ - public function before($search) - { - return new static(Str::before($this->value, $search)); - } - - /** - * Get the portion of a string before the last occurrence of a given value. - * - * @param string $search - * @return static - */ - public function beforeLast($search) - { - return new static(Str::beforeLast($this->value, $search)); - } - - /** - * Get the portion of a string between two given values. - * - * @param string $from - * @param string $to - * @return static - */ - public function between($from, $to) - { - return new static(Str::between($this->value, $from, $to)); - } - - /** - * Get the smallest possible portion of a string between two given values. - * - * @param string $from - * @param string $to - * @return static - */ - public function betweenFirst($from, $to) - { - return new static(Str::betweenFirst($this->value, $from, $to)); - } - - /** - * Convert a value to camel case. - * - * @return static - */ - public function camel() - { - return new static(Str::camel($this->value)); - } - - /** - * Determine if a given string contains a given substring. - * - * @param string|iterable $needles - * @param bool $ignoreCase - * @return bool - */ - public function contains($needles, $ignoreCase = false) - { - return Str::contains($this->value, $needles, $ignoreCase); - } - - /** - * Determine if a given string contains all array values. - * - * @param iterable $needles - * @param bool $ignoreCase - * @return bool - */ - public function containsAll($needles, $ignoreCase = false) - { - return Str::containsAll($this->value, $needles, $ignoreCase); - } - - /** - * Determine if a given string doesn't contain a given substring. - * - * @param string|iterable $needles - * @param bool $ignoreCase - * @return bool - */ - public function doesntContain($needles, $ignoreCase = false) - { - return Str::doesntContain($this->value, $needles, $ignoreCase); - } - - /** - * Convert the case of a string. - * - * @param int $mode - * @param string|null $encoding - * @return static - */ - public function convertCase(int $mode = MB_CASE_FOLD, ?string $encoding = 'UTF-8') - { - return new static(Str::convertCase($this->value, $mode, $encoding)); - } - - /** - * Replace consecutive instances of a given character with a single character. - * - * @param array|string $characters - * @return static - */ - public function deduplicate(array|string $characters = ' ') - { - return new static(Str::deduplicate($this->value, $characters)); - } - - /** - * Get the parent directory's path. - * - * @param int $levels - * @return static - */ - public function dirname($levels = 1) - { - return new static(dirname($this->value, $levels)); - } - - /** - * Determine if a given string ends with a given substring. - * - * @param string|iterable $needles - * @return bool - */ - public function endsWith($needles) - { - return Str::endsWith($this->value, $needles); - } - - /** - * Determine if a given string doesn't end with a given substring. - * - * @param string|iterable $needles - * @return bool - */ - public function doesntEndWith($needles) - { - return Str::doesntEndWith($this->value, $needles); - } - - /** - * Determine if the string is an exact match with the given value. - * - * @param \Illuminate\Support\Stringable|string $value - * @return bool - */ - public function exactly($value) - { - if ($value instanceof Stringable) { - $value = $value->toString(); - } - - return $this->value === $value; - } - - /** - * Extracts an excerpt from text that matches the first instance of a phrase. - * - * @param string $phrase - * @param array $options - * @return string|null - */ - public function excerpt($phrase = '', $options = []) - { - return Str::excerpt($this->value, $phrase, $options); - } - - /** - * Explode the string into a collection. - * - * @param string $delimiter - * @param int $limit - * @return \Illuminate\Support\Collection - */ - public function explode($delimiter, $limit = PHP_INT_MAX) - { - return new Collection(explode($delimiter, $this->value, $limit)); - } - - /** - * Split a string using a regular expression or by length. - * - * @param string|int $pattern - * @param int $limit - * @param int $flags - * @return \Illuminate\Support\Collection - */ - public function split($pattern, $limit = -1, $flags = 0) - { - if (filter_var($pattern, FILTER_VALIDATE_INT) !== false) { - return new Collection(mb_str_split($this->value, $pattern)); - } - - $segments = preg_split($pattern, $this->value, $limit, $flags); - - return ! empty($segments) ? new Collection($segments) : new Collection; - } - - /** - * Cap a string with a single instance of a given value. - * - * @param string $cap - * @return static - */ - public function finish($cap) - { - return new static(Str::finish($this->value, $cap)); - } - - /** - * Determine if a given string matches a given pattern. - * - * @param string|iterable $pattern - * @param bool $ignoreCase - * @return bool - */ - public function is($pattern, $ignoreCase = false) - { - return Str::is($pattern, $this->value, $ignoreCase); - } - - /** - * Determine if a given string is 7 bit ASCII. - * - * @return bool - */ - public function isAscii() - { - return Str::isAscii($this->value); - } - - /** - * Determine if a given string is valid JSON. - * - * @return bool - */ - public function isJson() - { - return Str::isJson($this->value); - } - - /** - * Determine if a given value is a valid URL. - * - * @param array $protocols - * @return bool - */ - public function isUrl(array $protocols = []) - { - return Str::isUrl($this->value, $protocols); - } - - /** - * Determine if a given string is a valid UUID. - * - * @param int<0, 8>|'max'|null $version - * @return bool - */ - public function isUuid($version = null) - { - return Str::isUuid($this->value, $version); - } - - /** - * Determine if a given string is a valid ULID. - * - * @return bool - */ - public function isUlid() - { - return Str::isUlid($this->value); - } - - /** - * Determine if the given string is empty. - * - * @return bool - */ - public function isEmpty() - { - return $this->value === ''; - } - - /** - * Determine if the given string is not empty. - * - * @return bool - */ - public function isNotEmpty() - { - return ! $this->isEmpty(); - } - - /** - * Convert a string to kebab case. - * - * @return static - */ - public function kebab() - { - return new static(Str::kebab($this->value)); - } - - /** - * Return the length of the given string. - * - * @param string|null $encoding - * @return int - */ - public function length($encoding = null) - { - return Str::length($this->value, $encoding); - } - - /** - * Limit the number of characters in a string. - * - * @param int $limit - * @param string $end - * @param bool $preserveWords - * @return static - */ - public function limit($limit = 100, $end = '...', $preserveWords = false) - { - return new static(Str::limit($this->value, $limit, $end, $preserveWords)); - } - - /** - * Convert the given string to lower-case. - * - * @return static - */ - public function lower() - { - return new static(Str::lower($this->value)); - } - - /** - * Convert GitHub flavored Markdown into HTML. - * - * @param array $options - * @param array $extensions - * @return static - */ - public function markdown(array $options = [], array $extensions = []) - { - return new static(Str::markdown($this->value, $options, $extensions)); - } - - /** - * Convert inline Markdown into HTML. - * - * @param array $options - * @param array $extensions - * @return static - */ - public function inlineMarkdown(array $options = [], array $extensions = []) - { - return new static(Str::inlineMarkdown($this->value, $options, $extensions)); - } - - /** - * Masks a portion of a string with a repeated character. - * - * @param string $character - * @param int $index - * @param int|null $length - * @param string $encoding - * @return static - */ - public function mask($character, $index, $length = null, $encoding = 'UTF-8') - { - return new static(Str::mask($this->value, $character, $index, $length, $encoding)); - } - - /** - * Get the string matching the given pattern. - * - * @param string $pattern - * @return static - */ - public function match($pattern) - { - return new static(Str::match($pattern, $this->value)); - } - - /** - * Determine if a given string matches a given pattern. - * - * @param string|iterable $pattern - * @return bool - */ - public function isMatch($pattern) - { - return Str::isMatch($pattern, $this->value); - } - - /** - * Get the string matching the given pattern. - * - * @param string $pattern - * @return \Illuminate\Support\Collection - */ - public function matchAll($pattern) - { - return Str::matchAll($pattern, $this->value); - } - - /** - * Determine if the string matches the given pattern. - * - * @param string $pattern - * @return bool - */ - public function test($pattern) - { - return $this->isMatch($pattern); - } - - /** - * Remove all non-numeric characters from a string. - * - * @return static - */ - public function numbers() - { - return new static(Str::numbers($this->value)); - } - - /** - * Pad both sides of the string with another. - * - * @param int $length - * @param string $pad - * @return static - */ - public function padBoth($length, $pad = ' ') - { - return new static(Str::padBoth($this->value, $length, $pad)); - } - - /** - * Pad the left side of the string with another. - * - * @param int $length - * @param string $pad - * @return static - */ - public function padLeft($length, $pad = ' ') - { - return new static(Str::padLeft($this->value, $length, $pad)); - } - - /** - * Pad the right side of the string with another. - * - * @param int $length - * @param string $pad - * @return static - */ - public function padRight($length, $pad = ' ') - { - return new static(Str::padRight($this->value, $length, $pad)); - } - - /** - * Parse a Class@method style callback into class and method. - * - * @param string|null $default - * @return array - */ - public function parseCallback($default = null) - { - return Str::parseCallback($this->value, $default); - } - - /** - * Call the given callback and return a new string. - * - * @param callable $callback - * @return static - */ - public function pipe(callable $callback) - { - return new static($callback($this)); - } - - /** - * Get the plural form of an English word. - * - * @param int|array|\Countable $count - * @param bool $prependCount - * @return static - */ - public function plural($count = 2, $prependCount = false) - { - return new static(Str::plural($this->value, $count, $prependCount)); - } - - /** - * Pluralize the last word of an English, studly caps case string. - * - * @param int|array|\Countable $count - * @return static - */ - public function pluralStudly($count = 2) - { - return new static(Str::pluralStudly($this->value, $count)); - } - - /** - * Pluralize the last word of an English, Pascal caps case string. - * - * @param int|array|\Countable $count - * @return static - */ - public function pluralPascal($count = 2) - { - return new static(Str::pluralStudly($this->value, $count)); - } - - /** - * Find the multi-byte safe position of the first occurrence of the given substring. - * - * @param string $needle - * @param int $offset - * @param string|null $encoding - * @return int|false - */ - public function position($needle, $offset = 0, $encoding = null) - { - return Str::position($this->value, $needle, $offset, $encoding); - } - - /** - * Prepend the given values to the string. - * - * @param string ...$values - * @return static - */ - public function prepend(...$values) - { - return new static(implode('', $values).$this->value); - } - - /** - * Remove any occurrence of the given string in the subject. - * - * @param string|iterable $search - * @param bool $caseSensitive - * @return static - */ - public function remove($search, $caseSensitive = true) - { - return new static(Str::remove($search, $this->value, $caseSensitive)); - } - - /** - * Reverse the string. - * - * @return static - */ - public function reverse() - { - return new static(Str::reverse($this->value)); - } - - /** - * Repeat the string. - * - * @param int $times - * @return static - */ - public function repeat(int $times) - { - return new static(str_repeat($this->value, $times)); - } - - /** - * Replace the given value in the given string. - * - * @param string|iterable $search - * @param string|iterable $replace - * @param bool $caseSensitive - * @return static - */ - public function replace($search, $replace, $caseSensitive = true) - { - return new static(Str::replace($search, $replace, $this->value, $caseSensitive)); - } - - /** - * Replace a given value in the string sequentially with an array. - * - * @param string $search - * @param iterable $replace - * @return static - */ - public function replaceArray($search, $replace) - { - return new static(Str::replaceArray($search, $replace, $this->value)); - } - - /** - * Replace the first occurrence of a given value in the string. - * - * @param string $search - * @param string $replace - * @return static - */ - public function replaceFirst($search, $replace) - { - return new static(Str::replaceFirst($search, $replace, $this->value)); - } - - /** - * Replace the first occurrence of the given value if it appears at the start of the string. - * - * @param string $search - * @param string $replace - * @return static - */ - public function replaceStart($search, $replace) - { - return new static(Str::replaceStart($search, $replace, $this->value)); - } - - /** - * Replace the last occurrence of a given value in the string. - * - * @param string $search - * @param string $replace - * @return static - */ - public function replaceLast($search, $replace) - { - return new static(Str::replaceLast($search, $replace, $this->value)); - } - - /** - * Replace the last occurrence of a given value if it appears at the end of the string. - * - * @param string $search - * @param string $replace - * @return static - */ - public function replaceEnd($search, $replace) - { - return new static(Str::replaceEnd($search, $replace, $this->value)); - } - - /** - * Replace the patterns matching the given regular expression. - * - * @param array|string $pattern - * @param \Closure|string[]|string $replace - * @param int $limit - * @return static - */ - public function replaceMatches($pattern, $replace, $limit = -1) - { - if ($replace instanceof Closure) { - return new static(preg_replace_callback($pattern, $replace, $this->value, $limit)); - } - - return new static(preg_replace($pattern, $replace, $this->value, $limit)); - } - - /** - * Parse input from a string to a collection, according to a format. - * - * @param string $format - * @return \Illuminate\Support\Collection - */ - public function scan($format) - { - return new Collection(sscanf($this->value, $format)); - } - - /** - * Remove all "extra" blank space from the given string. - * - * @return static - */ - public function squish() - { - return new static(Str::squish($this->value)); - } - - /** - * Begin a string with a single instance of a given value. - * - * @param string $prefix - * @return static - */ - public function start($prefix) - { - return new static(Str::start($this->value, $prefix)); - } - - /** - * Strip HTML and PHP tags from the given string. - * - * @param string[]|string|null $allowedTags - * @return static - */ - public function stripTags($allowedTags = null) - { - return new static(strip_tags($this->value, $allowedTags)); - } - - /** - * Convert the given string to upper-case. - * - * @return static - */ - public function upper() - { - return new static(Str::upper($this->value)); - } - - /** - * Convert the given string to proper case. - * - * @return static - */ - public function title() - { - return new static(Str::title($this->value)); - } - - /** - * Convert the given string to proper case for each word. - * - * @return static - */ - public function headline() - { - return new static(Str::headline($this->value)); - } - - /** - * Convert the given string to only its initials. - * - * @return static - */ - public function initials() - { - return new static(Str::initials($this->value)); - } - - /** - * Convert the given string to APA-style title case. - * - * @return static - */ - public function apa() - { - return new static(Str::apa($this->value)); - } - - /** - * Transliterate a string to its closest ASCII representation. - * - * @param string|null $unknown - * @param bool|null $strict - * @return static - */ - public function transliterate($unknown = '?', $strict = false) - { - return new static(Str::transliterate($this->value, $unknown, $strict)); - } - - /** - * Get the singular form of an English word. - * - * @return static - */ - public function singular() - { - return new static(Str::singular($this->value)); - } - - /** - * Generate a URL friendly "slug" from a given string. - * - * @param string $separator - * @param string|null $language - * @param array $dictionary - * @return static - */ - public function slug($separator = '-', $language = 'en', $dictionary = ['@' => 'at']) - { - return new static(Str::slug($this->value, $separator, $language, $dictionary)); - } - - /** - * Convert a string to snake case. - * - * @param string $delimiter - * @return static - */ - public function snake($delimiter = '_') - { - return new static(Str::snake($this->value, $delimiter)); - } - - /** - * Determine if a given string starts with a given substring. - * - * @param string|iterable $needles - * @return bool - */ - public function startsWith($needles) - { - return Str::startsWith($this->value, $needles); - } - - /** - * Determine if a given string doesn't start with a given substring. - * - * @param string|iterable $needles - * @return bool - */ - public function doesntStartWith($needles) - { - return Str::doesntStartWith($this->value, $needles); - } - - /** - * Convert a value to studly caps case. - * - * @return static - */ - public function studly() - { - return new static(Str::studly($this->value)); - } - - /** - * Convert the string to Pascal case. - * - * @return static - */ - public function pascal() - { - return new static(Str::pascal($this->value)); - } - - /** - * Returns the portion of the string specified by the start and length parameters. - * - * @param int $start - * @param int|null $length - * @param string $encoding - * @return static - */ - public function substr($start, $length = null, $encoding = 'UTF-8') - { - return new static(Str::substr($this->value, $start, $length, $encoding)); - } - - /** - * Returns the number of substring occurrences. - * - * @param string $needle - * @param int $offset - * @param int|null $length - * @return int - */ - public function substrCount($needle, $offset = 0, $length = null) - { - return Str::substrCount($this->value, $needle, $offset, $length); - } - - /** - * Replace text within a portion of a string. - * - * @param string|string[] $replace - * @param int|int[] $offset - * @param int|int[]|null $length - * @return static - */ - public function substrReplace($replace, $offset = 0, $length = null) - { - return new static(Str::substrReplace($this->value, $replace, $offset, $length)); - } - - /** - * Swap multiple keywords in a string with other keywords. - * - * @param array $map - * @return static - */ - public function swap(array $map) - { - return new static(strtr($this->value, $map)); - } - - /** - * Take the first or last {$limit} characters. - * - * @param int $limit - * @return static - */ - public function take(int $limit) - { - if ($limit < 0) { - return $this->substr($limit); - } - - return $this->substr(0, $limit); - } - - /** - * Trim the string of the given characters. - * - * @param string|null $characters - * @return static - */ - public function trim($characters = null) - { - return new static(Str::trim(...array_merge([$this->value], func_get_args()))); - } - - /** - * Left trim the string of the given characters. - * - * @param string|null $characters - * @return static - */ - public function ltrim($characters = null) - { - return new static(Str::ltrim(...array_merge([$this->value], func_get_args()))); - } - - /** - * Right trim the string of the given characters. - * - * @param string|null $characters - * @return static - */ - public function rtrim($characters = null) - { - return new static(Str::rtrim(...array_merge([$this->value], func_get_args()))); - } - - /** - * Make a string's first character lowercase. - * - * @return static - */ - public function lcfirst() - { - return new static(Str::lcfirst($this->value)); - } - - /** - * Make a string's first character uppercase. - * - * @return static - */ - public function ucfirst() - { - return new static(Str::ucfirst($this->value)); - } - - /** - * Capitalize the first character of each word in a string. - * - * @param string $separators - * @return static - */ - public function ucwords($separators = " \t\r\n\f\v") - { - return new static(Str::ucwords($this->value, $separators)); - } - - /** - * Split a string by uppercase characters. - * - * @return \Illuminate\Support\Collection - */ - public function ucsplit() - { - return new Collection(Str::ucsplit($this->value)); - } - - /** - * Execute the given callback if the string contains a given substring. - * - * @param string|iterable $needles - * @param callable $callback - * @param callable|null $default - * @return static - */ - public function whenContains($needles, $callback, $default = null) - { - return $this->when($this->contains($needles), $callback, $default); - } - - /** - * Execute the given callback if the string contains all array values. - * - * @param iterable $needles - * @param callable $callback - * @param callable|null $default - * @return static - */ - public function whenContainsAll(array $needles, $callback, $default = null) - { - return $this->when($this->containsAll($needles), $callback, $default); - } - - /** - * Execute the given callback if the string is empty. - * - * @param callable $callback - * @param callable|null $default - * @return static - */ - public function whenEmpty($callback, $default = null) - { - return $this->when($this->isEmpty(), $callback, $default); - } - - /** - * Execute the given callback if the string is not empty. - * - * @param callable $callback - * @param callable|null $default - * @return static - */ - public function whenNotEmpty($callback, $default = null) - { - return $this->when($this->isNotEmpty(), $callback, $default); - } - - /** - * Execute the given callback if the string ends with a given substring. - * - * @param string|iterable $needles - * @param callable $callback - * @param callable|null $default - * @return static - */ - public function whenEndsWith($needles, $callback, $default = null) - { - return $this->when($this->endsWith($needles), $callback, $default); - } - - /** - * Execute the given callback if the string doesn't end with a given substring. - * - * @param string|iterable $needles - * @param callable $callback - * @param callable|null $default - * @return static - */ - public function whenDoesntEndWith($needles, $callback, $default = null) - { - return $this->when($this->doesntEndWith($needles), $callback, $default); - } - - /** - * Execute the given callback if the string is an exact match with the given value. - * - * @param string $value - * @param callable $callback - * @param callable|null $default - * @return static - */ - public function whenExactly($value, $callback, $default = null) - { - return $this->when($this->exactly($value), $callback, $default); - } - - /** - * Execute the given callback if the string is not an exact match with the given value. - * - * @param string $value - * @param callable $callback - * @param callable|null $default - * @return static - */ - public function whenNotExactly($value, $callback, $default = null) - { - return $this->when(! $this->exactly($value), $callback, $default); - } - - /** - * Execute the given callback if the string matches a given pattern. - * - * @param string|iterable $pattern - * @param callable $callback - * @param callable|null $default - * @return static - */ - public function whenIs($pattern, $callback, $default = null) - { - return $this->when($this->is($pattern), $callback, $default); - } - - /** - * Execute the given callback if the string is 7 bit ASCII. - * - * @param callable $callback - * @param callable|null $default - * @return static - */ - public function whenIsAscii($callback, $default = null) - { - return $this->when($this->isAscii(), $callback, $default); - } - - /** - * Execute the given callback if the string is a valid UUID. - * - * @param callable $callback - * @param callable|null $default - * @return static - */ - public function whenIsUuid($callback, $default = null) - { - return $this->when($this->isUuid(), $callback, $default); - } - - /** - * Execute the given callback if the string is a valid ULID. - * - * @param callable $callback - * @param callable|null $default - * @return static - */ - public function whenIsUlid($callback, $default = null) - { - return $this->when($this->isUlid(), $callback, $default); - } - - /** - * Execute the given callback if the string starts with a given substring. - * - * @param string|iterable $needles - * @param callable $callback - * @param callable|null $default - * @return static - */ - public function whenStartsWith($needles, $callback, $default = null) - { - return $this->when($this->startsWith($needles), $callback, $default); - } - - /** - * Execute the given callback if the string doesn't start with a given substring. - * - * @param string|iterable $needles - * @param callable $callback - * @param callable|null $default - * @return static - */ - public function whenDoesntStartWith($needles, $callback, $default = null) - { - return $this->when($this->doesntStartWith($needles), $callback, $default); - } - - /** - * Execute the given callback if the string matches the given pattern. - * - * @param string $pattern - * @param callable $callback - * @param callable|null $default - * @return static - */ - public function whenTest($pattern, $callback, $default = null) - { - return $this->when($this->test($pattern), $callback, $default); - } - - /** - * Limit the number of words in a string. - * - * @param int $words - * @param string $end - * @return static - */ - public function words($words = 100, $end = '...') - { - return new static(Str::words($this->value, $words, $end)); - } - - /** - * Get the number of words a string contains. - * - * @param string|null $characters - * @return int - */ - public function wordCount($characters = null) - { - return Str::wordCount($this->value, $characters); - } - - /** - * Wrap a string to a given number of characters. - * - * @param int $characters - * @param string $break - * @param bool $cutLongWords - * @return static - */ - public function wordWrap($characters = 75, $break = "\n", $cutLongWords = false) - { - return new static(Str::wordWrap($this->value, $characters, $break, $cutLongWords)); - } - - /** - * Wrap the string with the given strings. - * - * @param string $before - * @param string|null $after - * @return static - */ - public function wrap($before, $after = null) - { - return new static(Str::wrap($this->value, $before, $after)); - } - - /** - * Unwrap the string with the given strings. - * - * @param string $before - * @param string|null $after - * @return static - */ - public function unwrap($before, $after = null) - { - return new static(Str::unwrap($this->value, $before, $after)); - } - - /** - * Convert the string into a `HtmlString` instance. - * - * @return \Illuminate\Support\HtmlString - */ - public function toHtmlString() - { - return new HtmlString($this->value); - } - - /** - * Convert the string to Base64 encoding. - * - * @return static - */ - public function toBase64() - { - return new static(base64_encode($this->value)); - } - - /** - * Decode the Base64 encoded string. - * - * @param bool $strict - * @return static - */ - public function fromBase64($strict = false) - { - return new static(base64_decode($this->value, $strict)); - } - - /** - * Hash the string using the given algorithm. - * - * @param string $algorithm - * @return static - */ - public function hash(string $algorithm) - { - return new static(hash($algorithm, $this->value)); - } - - /** - * Encrypt the string. - * - * @param bool $serialize - * @return static - */ - public function encrypt(bool $serialize = false) - { - return new static(encrypt($this->value, $serialize)); - } - - /** - * Decrypt the string. - * - * @param bool $serialize - * @return static - */ - public function decrypt(bool $serialize = false) - { - return new static(decrypt($this->value, $serialize)); - } - - /** - * Dump the string. - * - * @param mixed ...$args - * @return $this - */ - public function dump(...$args) - { - dump($this->value, ...$args); - - return $this; - } - - /** - * Get the underlying string value. - * - * @return string - */ - public function value() - { - return $this->toString(); - } - - /** - * Get the underlying string value. - * - * @return string - */ - public function toString() - { - return $this->value; - } - - /** - * Get the underlying string value as an integer. - * - * @param int $base - * @return int - */ - public function toInteger($base = 10) - { - return intval($this->value, $base); - } - - /** - * Get the underlying string value as a float. - * - * @return float - */ - public function toFloat() - { - return (float) $this->value; - } - - /** - * Get the underlying string value as a boolean. - * - * Returns true when value is "1", "true", "on", and "yes". Otherwise, returns false. - * - * @return bool - */ - public function toBoolean() - { - return filter_var($this->value, FILTER_VALIDATE_BOOLEAN); - } - - /** - * Get the underlying string value as a Carbon instance. - * - * @param string|null $format - * @param string|null $tz - * @return \Illuminate\Support\Carbon - * - * @throws \Carbon\Exceptions\InvalidFormatException - */ - public function toDate($format = null, $tz = null) - { - if (is_null($format)) { - return Date::parse($this->value, $tz); - } - - return Date::createFromFormat($format, $this->value, $tz); - } - - /** - * Get the underlying string value as a Uri instance. - * - * @return \Illuminate\Support\Uri - */ - public function toUri() - { - return Uri::of($this->value); - } - - /** - * Convert the object to a string when JSON encoded. - * - * @return string - */ - public function jsonSerialize(): string - { - return $this->__toString(); - } - - /** - * Determine if the given offset exists. - * - * @param mixed $offset - * @return bool - */ - public function offsetExists(mixed $offset): bool - { - return isset($this->value[$offset]); - } - - /** - * Get the value at the given offset. - * - * @param mixed $offset - * @return string - */ - public function offsetGet(mixed $offset): string - { - return $this->value[$offset]; - } - - /** - * Set the value at the given offset. - * - * @param mixed $offset - * @return void - */ - public function offsetSet(mixed $offset, mixed $value): void - { - $this->value[$offset] = $value; - } - - /** - * Unset the value at the given offset. - * - * @param mixed $offset - * @return void - */ - public function offsetUnset(mixed $offset): void - { - unset($this->value[$offset]); - } - - /** - * Proxy dynamic properties onto methods. - * - * @param string $key - * @return mixed - */ - public function __get($key) - { - return $this->{$key}(); - } - - /** - * Get the raw string value. - * - * @return string - */ - public function __toString() - { - return (string) $this->value; - } -} diff --git a/plugins/vendor/illuminate/support/Testing/Fakes/BatchFake.php b/plugins/vendor/illuminate/support/Testing/Fakes/BatchFake.php deleted file mode 100644 index 0d1176c2..00000000 --- a/plugins/vendor/illuminate/support/Testing/Fakes/BatchFake.php +++ /dev/null @@ -1,168 +0,0 @@ -id = $id; - $this->name = $name; - $this->totalJobs = $totalJobs; - $this->pendingJobs = $pendingJobs; - $this->failedJobs = $failedJobs; - $this->failedJobIds = $failedJobIds; - $this->options = $options; - $this->createdAt = $createdAt; - $this->cancelledAt = $cancelledAt; - $this->finishedAt = $finishedAt; - } - - /** - * Get a fresh instance of the batch represented by this ID. - * - * @return self - */ - public function fresh() - { - return $this; - } - - /** - * Add additional jobs to the batch. - * - * @param \Illuminate\Support\Enumerable|object|array $jobs - * @return self - */ - public function add($jobs) - { - $jobs = Collection::wrap($jobs); - - foreach ($jobs as $job) { - $this->added[] = $job; - } - - $this->totalJobs += $jobs->count(); - - return $this; - } - - /** - * Record that a job within the batch finished successfully, executing any callbacks if necessary. - * - * @param string $jobId - * @return void - */ - public function recordSuccessfulJob(string $jobId) - { - // - } - - /** - * Decrement the pending jobs for the batch. - * - * @param string $jobId - * @return void - */ - public function decrementPendingJobs(string $jobId) - { - // - } - - /** - * Record that a job within the batch failed to finish successfully, executing any callbacks if necessary. - * - * @param string $jobId - * @param \Throwable $e - * @return void - */ - public function recordFailedJob(string $jobId, $e) - { - // - } - - /** - * Increment the failed jobs for the batch. - * - * @param string $jobId - * @return \Illuminate\Bus\UpdatedBatchJobCounts - */ - public function incrementFailedJobs(string $jobId) - { - return new UpdatedBatchJobCounts; - } - - /** - * Cancel the batch. - * - * @return void - */ - public function cancel() - { - $this->cancelledAt = Carbon::now(); - } - - /** - * Delete the batch from storage. - * - * @return void - */ - public function delete() - { - $this->deleted = true; - } - - /** - * Determine if the batch has been deleted. - * - * @return bool - */ - public function deleted() - { - return $this->deleted; - } -} diff --git a/plugins/vendor/illuminate/support/Testing/Fakes/BatchRepositoryFake.php b/plugins/vendor/illuminate/support/Testing/Fakes/BatchRepositoryFake.php deleted file mode 100644 index 2afa4ab9..00000000 --- a/plugins/vendor/illuminate/support/Testing/Fakes/BatchRepositoryFake.php +++ /dev/null @@ -1,163 +0,0 @@ -batches; - } - - /** - * Retrieve information about an existing batch. - * - * @param string $batchId - * @return \Illuminate\Bus\Batch|null - */ - public function find(string $batchId) - { - return $this->batches[$batchId] ?? null; - } - - /** - * Store a new pending batch. - * - * @param \Illuminate\Bus\PendingBatch $batch - * @return \Illuminate\Bus\Batch - */ - public function store(PendingBatch $batch) - { - $id = (string) Str::orderedUuid(); - - $this->batches[$id] = new BatchFake( - $id, - $batch->name, - count($batch->jobs), - count($batch->jobs), - 0, - [], - $batch->options, - CarbonImmutable::now(), - null, - null - ); - - return $this->batches[$id]; - } - - /** - * Increment the total number of jobs within the batch. - * - * @param string $batchId - * @param int $amount - * @return void - */ - public function incrementTotalJobs(string $batchId, int $amount) - { - // - } - - /** - * Decrement the total number of pending jobs for the batch. - * - * @param string $batchId - * @param string $jobId - * @return \Illuminate\Bus\UpdatedBatchJobCounts - */ - public function decrementPendingJobs(string $batchId, string $jobId) - { - return new UpdatedBatchJobCounts; - } - - /** - * Increment the total number of failed jobs for the batch. - * - * @param string $batchId - * @param string $jobId - * @return \Illuminate\Bus\UpdatedBatchJobCounts - */ - public function incrementFailedJobs(string $batchId, string $jobId) - { - return new UpdatedBatchJobCounts; - } - - /** - * Mark the batch that has the given ID as finished. - * - * @param string $batchId - * @return void - */ - public function markAsFinished(string $batchId) - { - if (isset($this->batches[$batchId])) { - $this->batches[$batchId]->finishedAt = now(); - } - } - - /** - * Cancel the batch that has the given ID. - * - * @param string $batchId - * @return void - */ - public function cancel(string $batchId) - { - if (isset($this->batches[$batchId])) { - $this->batches[$batchId]->cancel(); - } - } - - /** - * Delete the batch that has the given ID. - * - * @param string $batchId - * @return void - */ - public function delete(string $batchId) - { - unset($this->batches[$batchId]); - } - - /** - * Execute the given Closure within a storage specific transaction. - * - * @param \Closure $callback - * @return mixed - */ - public function transaction(Closure $callback) - { - return $callback(); - } - - /** - * Rollback the last database transaction for the connection. - * - * @return void - */ - public function rollBack() - { - // - } -} diff --git a/plugins/vendor/illuminate/support/Testing/Fakes/BusFake.php b/plugins/vendor/illuminate/support/Testing/Fakes/BusFake.php deleted file mode 100644 index 75e28d7f..00000000 --- a/plugins/vendor/illuminate/support/Testing/Fakes/BusFake.php +++ /dev/null @@ -1,926 +0,0 @@ -dispatcher = $dispatcher; - $this->jobsToFake = Arr::wrap($jobsToFake); - $this->batchRepository = $batchRepository ?: new BatchRepositoryFake; - } - - /** - * Specify the jobs that should be dispatched instead of faked. - * - * @param array|string $jobsToDispatch - * @return $this - */ - public function except($jobsToDispatch) - { - $this->jobsToDispatch = array_merge($this->jobsToDispatch, Arr::wrap($jobsToDispatch)); - - return $this; - } - - /** - * Assert if a job was dispatched based on a truth-test callback. - * - * @param string|\Closure $command - * @param callable|int|null $callback - * @return void - */ - public function assertDispatched($command, $callback = null) - { - if ($command instanceof Closure) { - [$command, $callback] = [$this->firstClosureParameterType($command), $command]; - } - - if (is_numeric($callback)) { - return $this->assertDispatchedTimes($command, $callback); - } - - PHPUnit::assertTrue( - $this->dispatched($command, $callback)->count() > 0 || - $this->dispatchedAfterResponse($command, $callback)->count() > 0 || - $this->dispatchedSync($command, $callback)->count() > 0, - "The expected [{$command}] job was not dispatched." - ); - } - - /** - * Assert if a job was pushed exactly once. - * - * @param string|\Closure $command - * @return void - */ - public function assertDispatchedOnce($command) - { - $this->assertDispatchedTimes($command, 1); - } - - /** - * Assert if a job was pushed a number of times. - * - * @param string|\Closure $command - * @param int $times - * @return void - */ - public function assertDispatchedTimes($command, $times = 1) - { - $callback = null; - - if ($command instanceof Closure) { - [$command, $callback] = [$this->firstClosureParameterType($command), $command]; - } - - $count = $this->dispatched($command, $callback)->count() + - $this->dispatchedAfterResponse($command, $callback)->count() + - $this->dispatchedSync($command, $callback)->count(); - - PHPUnit::assertSame( - $times, $count, - sprintf( - "The expected [{$command}] job was pushed {$count} %s instead of {$times} %s.", - Str::plural('time', $count), - Str::plural('time', $times) - ) - ); - } - - /** - * Determine if a job was dispatched based on a truth-test callback. - * - * @param string|\Closure $command - * @param callable|null $callback - * @return void - */ - public function assertNotDispatched($command, $callback = null) - { - if ($command instanceof Closure) { - [$command, $callback] = [$this->firstClosureParameterType($command), $command]; - } - - PHPUnit::assertTrue( - $this->dispatched($command, $callback)->count() === 0 && - $this->dispatchedAfterResponse($command, $callback)->count() === 0 && - $this->dispatchedSync($command, $callback)->count() === 0, - "The unexpected [{$command}] job was dispatched." - ); - } - - /** - * Assert that no jobs were dispatched. - * - * @return void - */ - public function assertNothingDispatched() - { - $commandNames = implode("\n- ", array_keys($this->commands)); - - PHPUnit::assertEmpty($this->commands, "The following jobs were dispatched unexpectedly:\n\n- $commandNames\n"); - } - - /** - * Assert if a job was explicitly dispatched synchronously based on a truth-test callback. - * - * @param string|\Closure $command - * @param callable|int|null $callback - * @return void - */ - public function assertDispatchedSync($command, $callback = null) - { - if ($command instanceof Closure) { - [$command, $callback] = [$this->firstClosureParameterType($command), $command]; - } - - if (is_numeric($callback)) { - return $this->assertDispatchedSyncTimes($command, $callback); - } - - PHPUnit::assertTrue( - $this->dispatchedSync($command, $callback)->count() > 0, - "The expected [{$command}] job was not dispatched synchronously." - ); - } - - /** - * Assert if a job was pushed synchronously a number of times. - * - * @param string|\Closure $command - * @param int $times - * @return void - */ - public function assertDispatchedSyncTimes($command, $times = 1) - { - $callback = null; - - if ($command instanceof Closure) { - [$command, $callback] = [$this->firstClosureParameterType($command), $command]; - } - - $count = $this->dispatchedSync($command, $callback)->count(); - - PHPUnit::assertSame( - $times, $count, - sprintf( - "The expected [{$command}] job was synchronously pushed {$count} %s instead of {$times} %s.", - Str::plural('time', $count), - Str::plural('time', $times) - ) - ); - } - - /** - * Determine if a job was dispatched based on a truth-test callback. - * - * @param string|\Closure $command - * @param callable|null $callback - * @return void - */ - public function assertNotDispatchedSync($command, $callback = null) - { - if ($command instanceof Closure) { - [$command, $callback] = [$this->firstClosureParameterType($command), $command]; - } - - PHPUnit::assertCount( - 0, $this->dispatchedSync($command, $callback), - "The unexpected [{$command}] job was dispatched synchronously." - ); - } - - /** - * Assert if a job was dispatched after the response was sent based on a truth-test callback. - * - * @param string|\Closure $command - * @param callable|int|null $callback - * @return void - */ - public function assertDispatchedAfterResponse($command, $callback = null) - { - if ($command instanceof Closure) { - [$command, $callback] = [$this->firstClosureParameterType($command), $command]; - } - - if (is_numeric($callback)) { - return $this->assertDispatchedAfterResponseTimes($command, $callback); - } - - PHPUnit::assertTrue( - $this->dispatchedAfterResponse($command, $callback)->count() > 0, - "The expected [{$command}] job was not dispatched after sending the response." - ); - } - - /** - * Assert if a job was pushed after the response was sent a number of times. - * - * @param string|\Closure $command - * @param int $times - * @return void - */ - public function assertDispatchedAfterResponseTimes($command, $times = 1) - { - $callback = null; - - if ($command instanceof Closure) { - [$command, $callback] = [$this->firstClosureParameterType($command), $command]; - } - - $count = $this->dispatchedAfterResponse($command, $callback)->count(); - - PHPUnit::assertSame( - $times, $count, - sprintf( - "The expected [{$command}] job was pushed {$count} %s instead of {$times} %s.", - Str::plural('time', $count), - Str::plural('time', $times) - ) - ); - } - - /** - * Determine if a job was dispatched based on a truth-test callback. - * - * @param string|\Closure $command - * @param callable|null $callback - * @return void - */ - public function assertNotDispatchedAfterResponse($command, $callback = null) - { - if ($command instanceof Closure) { - [$command, $callback] = [$this->firstClosureParameterType($command), $command]; - } - - PHPUnit::assertCount( - 0, $this->dispatchedAfterResponse($command, $callback), - "The unexpected [{$command}] job was dispatched after sending the response." - ); - } - - /** - * Assert if a chain of jobs was dispatched. - * - * @param array $expectedChain - * @return void - */ - public function assertChained(array $expectedChain) - { - $command = $expectedChain[0]; - - $expectedChain = array_slice($expectedChain, 1); - - $callback = null; - - if ($command instanceof Closure) { - [$command, $callback] = [$this->firstClosureParameterType($command), $command]; - } elseif ($command instanceof ChainedBatchTruthTest) { - $instance = $command; - - $command = ChainedBatch::class; - - $callback = fn ($job) => $instance($job->toPendingBatch()); - } elseif (! is_string($command)) { - $instance = $command; - - $command = get_class($instance); - - $callback = function ($job) use ($instance) { - return serialize($this->resetChainPropertiesToDefaults($job)) === serialize($instance); - }; - } - - PHPUnit::assertTrue( - $this->dispatched($command, $callback)->isNotEmpty(), - "The expected [{$command}] job was not dispatched." - ); - - $this->assertDispatchedWithChainOfObjects($command, $expectedChain, $callback); - } - - /** - * Assert no chained jobs was dispatched. - * - * @return void - */ - public function assertNothingChained() - { - $this->assertNothingDispatched(); - } - - /** - * Reset the chain properties to their default values on the job. - * - * @param mixed $job - * @return mixed - */ - protected function resetChainPropertiesToDefaults($job) - { - return tap(clone $job, function ($job) { - $job->chainConnection = null; - $job->chainQueue = null; - $job->chainCatchCallbacks = null; - $job->chained = []; - }); - } - - /** - * Assert if a job was dispatched with an empty chain based on a truth-test callback. - * - * @param string|\Closure $command - * @param callable|null $callback - * @return void - */ - public function assertDispatchedWithoutChain($command, $callback = null) - { - if ($command instanceof Closure) { - [$command, $callback] = [$this->firstClosureParameterType($command), $command]; - } - - PHPUnit::assertTrue( - $this->dispatched($command, $callback)->isNotEmpty(), - "The expected [{$command}] job was not dispatched." - ); - - $this->assertDispatchedWithChainOfObjects($command, [], $callback); - } - - /** - * Assert if a job was dispatched with chained jobs based on a truth-test callback. - * - * @param string $command - * @param array $expectedChain - * @param callable|null $callback - * @return void - */ - protected function assertDispatchedWithChainOfObjects($command, $expectedChain, $callback) - { - $chain = $expectedChain; - - PHPUnit::assertTrue( - $this->dispatched($command, $callback)->filter(function ($job) use ($chain) { - if (count($chain) !== count($job->chained)) { - return false; - } - - foreach ($job->chained as $index => $serializedChainedJob) { - if ($chain[$index] instanceof ChainedBatchTruthTest) { - $chainedBatch = unserialize($serializedChainedJob); - - if (! $chainedBatch instanceof ChainedBatch || - ! $chain[$index]($chainedBatch->toPendingBatch())) { - return false; - } - } elseif ($chain[$index] instanceof Closure) { - [$expectedType, $callback] = [$this->firstClosureParameterType($chain[$index]), $chain[$index]]; - - $chainedJob = unserialize($serializedChainedJob); - - if (! $chainedJob instanceof $expectedType) { - throw new RuntimeException('The chained job was expected to be of type '.$expectedType.', '.$chainedJob::class.' chained.'); - } - - if (! $callback($chainedJob)) { - return false; - } - } elseif (is_string($chain[$index])) { - if ($chain[$index] != get_class(unserialize($serializedChainedJob))) { - return false; - } - } elseif (serialize($chain[$index]) != $serializedChainedJob) { - return false; - } - } - - return true; - })->isNotEmpty(), - 'The expected chain was not dispatched.' - ); - } - - /** - * Create a new assertion about a chained batch. - * - * @param \Closure(\Illuminate\Bus\PendingBatch): bool $callback - * @return \Illuminate\Support\Testing\Fakes\ChainedBatchTruthTest - */ - public function chainedBatch(Closure $callback) - { - return new ChainedBatchTruthTest($callback); - } - - /** - * Assert if a batch was dispatched based on a truth-test callback. - * - * @param array|callable(\Illuminate\Bus\PendingBatch): bool $callback - * @return void - */ - public function assertBatched(callable|array $callback) - { - $callback = is_array($callback) ? fn (PendingBatchFake $batch) => $batch->hasJobs($callback) : $callback; - - PHPUnit::assertTrue( - $this->batched($callback)->count() > 0, - 'The expected batch was not dispatched.' - ); - } - - /** - * Assert the number of batches that have been dispatched. - * - * @param int $count - * @return void - */ - public function assertBatchCount($count) - { - PHPUnit::assertCount( - $count, $this->batches, - ); - } - - /** - * Assert that no batched jobs were dispatched. - * - * @return void - */ - public function assertNothingBatched() - { - $jobNames = (new Collection($this->batches)) - ->map(fn ($batch) => $batch->jobs->map(fn ($job) => get_class($job))) - ->flatten() - ->join("\n- "); - - PHPUnit::assertEmpty($this->batches, "The following batched jobs were dispatched unexpectedly:\n\n- $jobNames\n"); - } - - /** - * Assert that no jobs were dispatched, chained, or batched. - * - * @return void - */ - public function assertNothingPlaced() - { - $this->assertNothingDispatched(); - $this->assertNothingBatched(); - } - - /** - * Get all of the jobs matching a truth-test callback. - * - * @param string $command - * @param callable|null $callback - * @return \Illuminate\Support\Collection - */ - public function dispatched($command, $callback = null) - { - if (! $this->hasDispatched($command)) { - return new Collection; - } - - $callback = $callback ?: fn () => true; - - return (new Collection($this->commands[$command]))->filter(fn ($command) => $callback($command)); - } - - /** - * Get all of the jobs dispatched synchronously matching a truth-test callback. - * - * @param string $command - * @param callable|null $callback - * @return \Illuminate\Support\Collection - */ - public function dispatchedSync(string $command, $callback = null) - { - if (! $this->hasDispatchedSync($command)) { - return new Collection; - } - - $callback = $callback ?: fn () => true; - - return (new Collection($this->commandsSync[$command]))->filter(fn ($command) => $callback($command)); - } - - /** - * Get all of the jobs dispatched after the response was sent matching a truth-test callback. - * - * @param string $command - * @param callable|null $callback - * @return \Illuminate\Support\Collection - */ - public function dispatchedAfterResponse(string $command, $callback = null) - { - if (! $this->hasDispatchedAfterResponse($command)) { - return new Collection; - } - - $callback = $callback ?: fn () => true; - - return (new Collection($this->commandsAfterResponse[$command]))->filter(fn ($command) => $callback($command)); - } - - /** - * Get all of the pending batches matching a truth-test callback. - * - * @param callable(\Illuminate\Bus\PendingBatch): bool $callback - * @return \Illuminate\Support\Collection - */ - public function batched(callable $callback) - { - if (empty($this->batches)) { - return new Collection; - } - - return (new Collection($this->batches))->filter(fn ($batch) => $callback($batch)); - } - - /** - * Determine if there are any stored commands for a given class. - * - * @param string $command - * @return bool - */ - public function hasDispatched($command) - { - return isset($this->commands[$command]) && ! empty($this->commands[$command]); - } - - /** - * Determine if there are any stored commands for a given class. - * - * @param string $command - * @return bool - */ - public function hasDispatchedSync($command) - { - return isset($this->commandsSync[$command]) && ! empty($this->commandsSync[$command]); - } - - /** - * Determine if there are any stored commands for a given class. - * - * @param string $command - * @return bool - */ - public function hasDispatchedAfterResponse($command) - { - return isset($this->commandsAfterResponse[$command]) && ! empty($this->commandsAfterResponse[$command]); - } - - /** - * Dispatch a command to its appropriate handler. - * - * @param mixed $command - * @return mixed - */ - public function dispatch($command) - { - if ($this->shouldFakeJob($command)) { - $this->commands[get_class($command)][] = $this->getCommandRepresentation($command); - } else { - return $this->dispatcher->dispatch($command); - } - } - - /** - * Dispatch a command to its appropriate handler in the current process. - * - * Queueable jobs will be dispatched to the "sync" queue. - * - * @param mixed $command - * @param mixed $handler - * @return mixed - */ - public function dispatchSync($command, $handler = null) - { - if ($this->shouldFakeJob($command)) { - $this->commandsSync[get_class($command)][] = $this->getCommandRepresentation($command); - } else { - return $this->dispatcher->dispatchSync($command, $handler); - } - } - - /** - * Dispatch a command to its appropriate handler in the current process. - * - * @param mixed $command - * @param mixed $handler - * @return mixed - */ - public function dispatchNow($command, $handler = null) - { - if ($this->shouldFakeJob($command)) { - $this->commands[get_class($command)][] = $this->getCommandRepresentation($command); - } else { - return $this->dispatcher->dispatchNow($command, $handler); - } - } - - /** - * Dispatch a command to its appropriate handler behind a queue. - * - * @param mixed $command - * @return mixed - */ - public function dispatchToQueue($command) - { - if ($this->shouldFakeJob($command)) { - $this->commands[get_class($command)][] = $this->getCommandRepresentation($command); - } else { - return $this->dispatcher->dispatchToQueue($command); - } - } - - /** - * Dispatch a command to its appropriate handler. - * - * @param mixed $command - * @return mixed - */ - public function dispatchAfterResponse($command) - { - if ($this->shouldFakeJob($command)) { - $this->commandsAfterResponse[get_class($command)][] = $this->getCommandRepresentation($command); - } else { - return $this->dispatcher->dispatch($command); - } - } - - /** - * Create a new chain of queueable jobs. - * - * @param \Illuminate\Support\Collection|array|null $jobs - * @return \Illuminate\Foundation\Bus\PendingChain - */ - public function chain($jobs = null) - { - $jobs = Collection::wrap($jobs); - $jobs = ChainedBatch::prepareNestedBatches($jobs); - - return new PendingChainFake($this, $jobs->shift(), $jobs->toArray()); - } - - /** - * Attempt to find the batch with the given ID. - * - * @param string $batchId - * @return \Illuminate\Bus\Batch|null - */ - public function findBatch(string $batchId) - { - return $this->batchRepository->find($batchId); - } - - /** - * Create a new batch of queueable jobs. - * - * @param \Illuminate\Support\Collection|array $jobs - * @return \Illuminate\Bus\PendingBatch - */ - public function batch($jobs) - { - return new PendingBatchFake($this, Collection::wrap($jobs)); - } - - /** - * Dispatch an empty job batch for testing. - * - * @param string $name - * @return \Illuminate\Bus\Batch - */ - public function dispatchFakeBatch($name = '') - { - return $this->batch([])->name($name)->dispatch(); - } - - /** - * Record the fake pending batch dispatch. - * - * @param \Illuminate\Bus\PendingBatch $pendingBatch - * @return \Illuminate\Bus\Batch - */ - public function recordPendingBatch(PendingBatch $pendingBatch) - { - $this->batches[] = $pendingBatch; - - return $this->batchRepository->store($pendingBatch); - } - - /** - * Determine if a command should be faked or actually dispatched. - * - * @param mixed $command - * @return bool - */ - protected function shouldFakeJob($command) - { - if ($this->shouldDispatchCommand($command)) { - return false; - } - - if (empty($this->jobsToFake)) { - return true; - } - - return (new Collection($this->jobsToFake)) - ->filter(function ($job) use ($command) { - return $job instanceof Closure - ? $job($command) - : $job === get_class($command); - })->isNotEmpty(); - } - - /** - * Determine if a command should be dispatched or not. - * - * @param mixed $command - * @return bool - */ - protected function shouldDispatchCommand($command) - { - return (new Collection($this->jobsToDispatch)) - ->filter(function ($job) use ($command) { - return $job instanceof Closure - ? $job($command) - : $job === get_class($command); - })->isNotEmpty(); - } - - /** - * Specify if commands should be serialized and restored when being batched. - * - * @param bool $serializeAndRestore - * @return $this - */ - public function serializeAndRestore(bool $serializeAndRestore = true) - { - $this->serializeAndRestore = $serializeAndRestore; - - return $this; - } - - /** - * Serialize and unserialize the command to simulate the queueing process. - * - * @param mixed $command - * @return mixed - */ - protected function serializeAndRestoreCommand($command) - { - return unserialize(serialize($command)); - } - - /** - * Return the command representation that should be stored. - * - * @param mixed $command - * @return mixed - */ - protected function getCommandRepresentation($command) - { - return $this->serializeAndRestore ? $this->serializeAndRestoreCommand($command) : $command; - } - - /** - * Set the pipes commands should be piped through before dispatching. - * - * @param array $pipes - * @return $this - */ - public function pipeThrough(array $pipes) - { - $this->dispatcher->pipeThrough($pipes); - - return $this; - } - - /** - * Determine if the given command has a handler. - * - * @param mixed $command - * @return bool - */ - public function hasCommandHandler($command) - { - return $this->dispatcher->hasCommandHandler($command); - } - - /** - * Retrieve the handler for a command. - * - * @param mixed $command - * @return mixed - */ - public function getCommandHandler($command) - { - return $this->dispatcher->getCommandHandler($command); - } - - /** - * Map a command to a handler. - * - * @param array $map - * @return $this - */ - public function map(array $map) - { - $this->dispatcher->map($map); - - return $this; - } - - /** - * Get the batches that have been dispatched. - * - * @return array - */ - public function dispatchedBatches() - { - return $this->batches; - } -} diff --git a/plugins/vendor/illuminate/support/Testing/Fakes/ChainedBatchTruthTest.php b/plugins/vendor/illuminate/support/Testing/Fakes/ChainedBatchTruthTest.php deleted file mode 100644 index 2e5ba779..00000000 --- a/plugins/vendor/illuminate/support/Testing/Fakes/ChainedBatchTruthTest.php +++ /dev/null @@ -1,36 +0,0 @@ -callback = $callback; - } - - /** - * Invoke the truth test with the given pending batch. - * - * @param \Illuminate\Bus\PendingBatch $pendingBatch - * @return bool - */ - public function __invoke($pendingBatch) - { - return call_user_func($this->callback, $pendingBatch); - } -} diff --git a/plugins/vendor/illuminate/support/Testing/Fakes/EventFake.php b/plugins/vendor/illuminate/support/Testing/Fakes/EventFake.php deleted file mode 100644 index 33042a93..00000000 --- a/plugins/vendor/illuminate/support/Testing/Fakes/EventFake.php +++ /dev/null @@ -1,452 +0,0 @@ -dispatcher = $dispatcher; - - $this->eventsToFake = Arr::wrap($eventsToFake); - } - - /** - * Specify the events that should be dispatched instead of faked. - * - * @param array|string $eventsToDispatch - * @return $this - */ - public function except($eventsToDispatch) - { - $this->eventsToDispatch = array_merge( - $this->eventsToDispatch, - Arr::wrap($eventsToDispatch) - ); - - return $this; - } - - /** - * Assert if an event has a listener attached to it. - * - * @param string $expectedEvent - * @param string|array $expectedListener - * @return void - */ - public function assertListening($expectedEvent, $expectedListener) - { - foreach ($this->dispatcher->getListeners($expectedEvent) as $listenerClosure) { - $actualListener = (new ReflectionFunction($listenerClosure)) - ->getStaticVariables()['listener']; - - $normalizedListener = $expectedListener; - - if (is_string($actualListener) && Str::contains($actualListener, '@')) { - $actualListener = Str::parseCallback($actualListener); - - if (is_string($expectedListener)) { - if (Str::contains($expectedListener, '@')) { - $normalizedListener = Str::parseCallback($expectedListener); - } else { - $normalizedListener = [ - $expectedListener, - method_exists($expectedListener, 'handle') ? 'handle' : '__invoke', - ]; - } - } - } - - if ($actualListener === $normalizedListener || - ($actualListener instanceof Closure && - $normalizedListener === Closure::class)) { - PHPUnit::assertTrue(true); - - return; - } - } - - PHPUnit::assertTrue( - false, - sprintf( - 'Event [%s] does not have the [%s] listener attached to it', - $expectedEvent, - print_r($expectedListener, true) - ) - ); - } - - /** - * Assert if an event was dispatched based on a truth-test callback. - * - * @param string|\Closure $event - * @param callable|int|null $callback - * @return void - */ - public function assertDispatched($event, $callback = null) - { - if ($event instanceof Closure) { - [$event, $callback] = [$this->firstClosureParameterType($event), $event]; - } - - if (is_int($callback)) { - return $this->assertDispatchedTimes($event, $callback); - } - - PHPUnit::assertTrue( - $this->dispatched($event, $callback)->count() > 0, - "The expected [{$event}] event was not dispatched." - ); - } - - /** - * Assert if an event was dispatched exactly once. - * - * @param string $event - * @return void - */ - public function assertDispatchedOnce($event) - { - $this->assertDispatchedTimes($event, 1); - } - - /** - * Assert if an event was dispatched a number of times. - * - * @param string $event - * @param int $times - * @return void - */ - public function assertDispatchedTimes($event, $times = 1) - { - $count = $this->dispatched($event)->count(); - - PHPUnit::assertSame( - $times, $count, - sprintf( - "The expected [{$event}] event was dispatched {$count} %s instead of {$times} %s.", - Str::plural('time', $count), - Str::plural('time', $times) - ) - ); - } - - /** - * Determine if an event was dispatched based on a truth-test callback. - * - * @param string|\Closure $event - * @param callable|null $callback - * @return void - */ - public function assertNotDispatched($event, $callback = null) - { - if ($event instanceof Closure) { - [$event, $callback] = [$this->firstClosureParameterType($event), $event]; - } - - PHPUnit::assertCount( - 0, $this->dispatched($event, $callback), - "The unexpected [{$event}] event was dispatched." - ); - } - - /** - * Assert that no events were dispatched. - * - * @return void - */ - public function assertNothingDispatched() - { - $count = count(Arr::flatten($this->events)); - - $eventNames = (new Collection($this->events)) - ->map(fn ($events, $eventName) => sprintf( - '%s dispatched %s %s', - $eventName, - count($events), - Str::plural('time', count($events)), - )) - ->join("\n- "); - - PHPUnit::assertSame( - 0, $count, - "{$count} unexpected events were dispatched:\n\n- $eventNames\n" - ); - } - - /** - * Get all of the events matching a truth-test callback. - * - * @param string $event - * @param callable|null $callback - * @return \Illuminate\Support\Collection - */ - public function dispatched($event, $callback = null) - { - if (! $this->hasDispatched($event)) { - return new Collection; - } - - $callback = $callback ?: fn () => true; - - return (new Collection($this->events[$event]))->filter( - fn ($arguments) => $callback(...$arguments) - ); - } - - /** - * Determine if the given event has been dispatched. - * - * @param string $event - * @return bool - */ - public function hasDispatched($event) - { - return isset($this->events[$event]) && ! empty($this->events[$event]); - } - - /** - * Register an event listener with the dispatcher. - * - * @param \Closure|string|array $events - * @param mixed $listener - * @return void - */ - public function listen($events, $listener = null) - { - $this->dispatcher->listen($events, $listener); - } - - /** - * Determine if a given event has listeners. - * - * @param string $eventName - * @return bool - */ - public function hasListeners($eventName) - { - return $this->dispatcher->hasListeners($eventName); - } - - /** - * Register an event and payload to be dispatched later. - * - * @param string $event - * @param array $payload - * @return void - */ - public function push($event, $payload = []) - { - // - } - - /** - * Register an event subscriber with the dispatcher. - * - * @param object|string $subscriber - * @return void - */ - public function subscribe($subscriber) - { - $this->dispatcher->subscribe($subscriber); - } - - /** - * Flush a set of pushed events. - * - * @param string $event - * @return void - */ - public function flush($event) - { - // - } - - /** - * Fire an event and call the listeners. - * - * @param string|object $event - * @param mixed $payload - * @param bool $halt - * @return array|null - */ - public function dispatch($event, $payload = [], $halt = false) - { - $name = is_object($event) ? get_class($event) : (string) $event; - - if ($this->shouldFakeEvent($name, $payload)) { - $this->fakeEvent($event, $name, func_get_args()); - } else { - return $this->dispatcher->dispatch($event, $payload, $halt); - } - } - - /** - * Determine if an event should be faked or actually dispatched. - * - * @param string $eventName - * @param mixed $payload - * @return bool - */ - protected function shouldFakeEvent($eventName, $payload) - { - if ($this->shouldDispatchEvent($eventName, $payload)) { - return false; - } - - if (empty($this->eventsToFake)) { - return true; - } - - return (new Collection($this->eventsToFake)) - ->filter(function ($event) use ($eventName, $payload) { - return $event instanceof Closure - ? $event($eventName, $payload) - : $event === $eventName; - }) - ->isNotEmpty(); - } - - /** - * Push the event onto the fake events array immediately or after the next database transaction. - * - * @param string|object $event - * @param string $name - * @param array $arguments - * @return void - */ - protected function fakeEvent($event, $name, $arguments) - { - if ($event instanceof ShouldDispatchAfterCommit && Container::getInstance()->bound('db.transactions')) { - return Container::getInstance()->make('db.transactions') - ->addCallback(fn () => $this->events[$name][] = $arguments); - } - - $this->events[$name][] = $arguments; - } - - /** - * Determine whether an event should be dispatched or not. - * - * @param string $eventName - * @param mixed $payload - * @return bool - */ - protected function shouldDispatchEvent($eventName, $payload) - { - if (empty($this->eventsToDispatch)) { - return false; - } - - return (new Collection($this->eventsToDispatch)) - ->filter(function ($event) use ($eventName, $payload) { - return $event instanceof Closure - ? $event($eventName, $payload) - : $event === $eventName; - }) - ->isNotEmpty(); - } - - /** - * Remove a set of listeners from the dispatcher. - * - * @param string $event - * @return void - */ - public function forget($event) - { - // - } - - /** - * Forget all of the queued listeners. - * - * @return void - */ - public function forgetPushed() - { - // - } - - /** - * Dispatch an event and call the listeners. - * - * @param string|object $event - * @param mixed $payload - * @return mixed - */ - public function until($event, $payload = []) - { - return $this->dispatch($event, $payload, true); - } - - /** - * Get the events that have been dispatched. - * - * @return array - */ - public function dispatchedEvents() - { - return $this->events; - } - - /** - * Handle dynamic method calls to the dispatcher. - * - * @param string $method - * @param array $parameters - * @return mixed - */ - public function __call($method, $parameters) - { - return $this->forwardCallTo($this->dispatcher, $method, $parameters); - } -} diff --git a/plugins/vendor/illuminate/support/Testing/Fakes/ExceptionHandlerFake.php b/plugins/vendor/illuminate/support/Testing/Fakes/ExceptionHandlerFake.php deleted file mode 100644 index bbf5f29b..00000000 --- a/plugins/vendor/illuminate/support/Testing/Fakes/ExceptionHandlerFake.php +++ /dev/null @@ -1,285 +0,0 @@ - - */ - protected $reported = []; - - /** - * If the fake should throw exceptions when they are reported. - * - * @var bool - */ - protected $throwOnReport = false; - - /** - * Create a new exception handler fake. - * - * @param \Illuminate\Contracts\Debug\ExceptionHandler $handler - * @param list> $exceptions - */ - public function __construct( - protected ExceptionHandler $handler, - protected array $exceptions = [], - ) { - // - } - - /** - * Get the underlying handler implementation. - * - * @return \Illuminate\Contracts\Debug\ExceptionHandler - */ - public function handler() - { - return $this->handler; - } - - /** - * Assert if an exception of the given type has been reported. - * - * @param (\Closure(\Throwable): bool)|class-string<\Throwable> $exception - * @return void - */ - public function assertReported(Closure|string $exception) - { - $message = sprintf( - 'The expected [%s] exception was not reported.', - is_string($exception) ? $exception : $this->firstClosureParameterType($exception) - ); - - if (is_string($exception)) { - Assert::assertTrue( - in_array($exception, array_map(get_class(...), $this->reported), true), - $message, - ); - - return; - } - - Assert::assertTrue( - (new Collection($this->reported))->contains( - fn (Throwable $e) => $this->firstClosureParameterType($exception) === get_class($e) - && $exception($e) === true, - ), $message, - ); - } - - /** - * Assert the number of exceptions that have been reported. - * - * @param int $count - * @return void - */ - public function assertReportedCount(int $count) - { - $total = (new Collection($this->reported))->count(); - - PHPUnit::assertSame( - $count, $total, - "The total number of exceptions reported was {$total} instead of {$count}." - ); - } - - /** - * Assert if an exception of the given type has not been reported. - * - * @param (\Closure(\Throwable): bool)|class-string<\Throwable> $exception - * @return void - */ - public function assertNotReported(Closure|string $exception) - { - try { - $this->assertReported($exception); - } catch (ExpectationFailedException) { - return; - } - - throw new ExpectationFailedException(sprintf( - 'The expected [%s] exception was reported.', - is_string($exception) ? $exception : $this->firstClosureParameterType($exception) - )); - } - - /** - * Assert nothing has been reported. - * - * @return void - */ - public function assertNothingReported() - { - Assert::assertEmpty( - $this->reported, - sprintf( - 'The following exceptions were reported: %s.', - implode(', ', array_map(get_class(...), $this->reported)), - ), - ); - } - - /** - * Report or log an exception. - * - * @param \Throwable $e - * @return void - */ - public function report($e) - { - if (! $this->isFakedException($e)) { - $this->handler->report($e); - - return; - } - - if (! $this->shouldReport($e)) { - return; - } - - $this->reported[] = $e; - - if ($this->throwOnReport) { - throw $e; - } - } - - /** - * Determine if the given exception is faked. - * - * @param \Throwable $e - * @return bool - */ - protected function isFakedException(Throwable $e) - { - return count($this->exceptions) === 0 || in_array(get_class($e), $this->exceptions, true); - } - - /** - * Determine if the exception should be reported. - * - * @param \Throwable $e - * @return bool - */ - public function shouldReport($e) - { - return $this->runningWithoutExceptionHandling() || $this->handler->shouldReport($e); - } - - /** - * Determine if the handler is running without exception handling. - * - * @return bool - */ - protected function runningWithoutExceptionHandling() - { - return $this->handler instanceof WithoutExceptionHandlingHandler; - } - - /** - * Render an exception into an HTTP response. - * - * @param \Illuminate\Http\Request $request - * @param \Throwable $e - * @return \Symfony\Component\HttpFoundation\Response - */ - public function render($request, $e) - { - return $this->handler->render($request, $e); - } - - /** - * Render an exception to the console. - * - * @param \Symfony\Component\Console\Output\OutputInterface $output - * @param \Throwable $e - * @return void - */ - public function renderForConsole($output, Throwable $e) - { - $this->handler->renderForConsole($output, $e); - } - - /** - * Throw exceptions when they are reported. - * - * @return $this - */ - public function throwOnReport() - { - $this->throwOnReport = true; - - return $this; - } - - /** - * Throw the first reported exception. - * - * @return $this - * - * @throws \Throwable - */ - public function throwFirstReported() - { - foreach ($this->reported as $e) { - throw $e; - } - - return $this; - } - - /** - * Get the exceptions that have been reported. - * - * @return list<\Throwable> - */ - public function reported() - { - return $this->reported; - } - - /** - * Set the "original" handler that should be used by the fake. - * - * @param \Illuminate\Contracts\Debug\ExceptionHandler $handler - * @return $this - */ - public function setHandler(ExceptionHandler $handler) - { - $this->handler = $handler; - - return $this; - } - - /** - * Handle dynamic method calls to the handler. - * - * @param string $method - * @param array $parameters - * @return mixed - */ - public function __call(string $method, array $parameters) - { - return $this->forwardCallTo($this->handler, $method, $parameters); - } -} diff --git a/plugins/vendor/illuminate/support/Testing/Fakes/Fake.php b/plugins/vendor/illuminate/support/Testing/Fakes/Fake.php deleted file mode 100644 index 4a243c4e..00000000 --- a/plugins/vendor/illuminate/support/Testing/Fakes/Fake.php +++ /dev/null @@ -1,8 +0,0 @@ -manager = $manager; - $this->currentMailer = $manager->getDefaultDriver(); - } - - /** - * Assert if a mailable was sent based on a truth-test callback. - * - * @param string|\Closure $mailable - * @param callable|array|string|int|null $callback - * @return void - */ - public function assertSent($mailable, $callback = null) - { - [$mailable, $callback] = $this->prepareMailableAndCallback($mailable, $callback); - - if (is_numeric($callback)) { - return $this->assertSentTimes($mailable, $callback); - } - - $suggestion = count($this->queuedMailables) ? ' Did you mean to use assertQueued() instead?' : ''; - - if (is_array($callback) || is_string($callback)) { - foreach (Arr::wrap($callback) as $address) { - $callback = fn ($mail) => $mail->hasTo($address); - - PHPUnit::assertTrue( - $this->sent($mailable, $callback)->count() > 0, - "The expected [{$mailable}] mailable was not sent to address [{$address}].".$suggestion - ); - } - - return; - } - - PHPUnit::assertTrue( - $this->sent($mailable, $callback)->count() > 0, - "The expected [{$mailable}] mailable was not sent.".$suggestion - ); - } - - /** - * Assert if a mailable was sent a number of times. - * - * @param string $mailable - * @param int $times - * @return void - */ - public function assertSentTimes($mailable, $times = 1) - { - $count = $this->sent($mailable)->count(); - - PHPUnit::assertSame( - $times, $count, - sprintf( - "The expected [{$mailable}] mailable was sent {$count} %s instead of {$times} %s.", - Str::plural('time', $count), - Str::plural('time', $times) - ) - ); - } - - /** - * Determine if a mailable was not sent or queued to be sent based on a truth-test callback. - * - * @param string|\Closure $mailable - * @param callable|null $callback - * @return void - */ - public function assertNotOutgoing($mailable, $callback = null) - { - $this->assertNotSent($mailable, $callback); - $this->assertNotQueued($mailable, $callback); - } - - /** - * Determine if a mailable was not sent based on a truth-test callback. - * - * @param string|\Closure $mailable - * @param callable|array|string|null $callback - * @return void - */ - public function assertNotSent($mailable, $callback = null) - { - if (is_string($callback) || is_array($callback)) { - foreach (Arr::wrap($callback) as $address) { - $callback = fn ($mail) => $mail->hasTo($address); - - PHPUnit::assertCount( - 0, $this->sent($mailable, $callback), - "The unexpected [{$mailable}] mailable was sent to address [{$address}]." - ); - } - - return; - } - - [$mailable, $callback] = $this->prepareMailableAndCallback($mailable, $callback); - - PHPUnit::assertCount( - 0, $this->sent($mailable, $callback), - "The unexpected [{$mailable}] mailable was sent." - ); - } - - /** - * Assert that no mailables were sent or queued to be sent. - * - * @return void - */ - public function assertNothingOutgoing() - { - $this->assertNothingSent(); - $this->assertNothingQueued(); - } - - /** - * Assert that no mailables were sent. - * - * @return void - */ - public function assertNothingSent() - { - $mailableNames = (new Collection($this->mailables))->map( - fn ($mailable) => get_class($mailable) - )->join("\n- "); - - PHPUnit::assertEmpty($this->mailables, "The following mailables were sent unexpectedly:\n\n- $mailableNames\n"); - } - - /** - * Assert if a mailable was queued based on a truth-test callback. - * - * @param string|\Closure $mailable - * @param callable|array|string|int|null $callback - * @return void - */ - public function assertQueued($mailable, $callback = null) - { - [$mailable, $callback] = $this->prepareMailableAndCallback($mailable, $callback); - - if (is_numeric($callback)) { - return $this->assertQueuedTimes($mailable, $callback); - } - - if (is_string($callback) || is_array($callback)) { - foreach (Arr::wrap($callback) as $address) { - $callback = fn ($mail) => $mail->hasTo($address); - - PHPUnit::assertTrue( - $this->queued($mailable, $callback)->count() > 0, - "The expected [{$mailable}] mailable was not queued to address [{$address}]." - ); - } - - return; - } - - PHPUnit::assertTrue( - $this->queued($mailable, $callback)->count() > 0, - "The expected [{$mailable}] mailable was not queued." - ); - } - - /** - * Assert if a mailable was queued a number of times. - * - * @param string $mailable - * @param int $times - * @return void - */ - protected function assertQueuedTimes($mailable, $times = 1) - { - $count = $this->queued($mailable)->count(); - - PHPUnit::assertSame( - $times, $count, - sprintf( - "The expected [{$mailable}] mailable was queued {$count} %s instead of {$times} %s.", - Str::plural('time', $count), - Str::plural('time', $times) - ) - ); - } - - /** - * Determine if a mailable was not queued based on a truth-test callback. - * - * @param string|\Closure $mailable - * @param callable|array|string|null $callback - * @return void - */ - public function assertNotQueued($mailable, $callback = null) - { - if (is_string($callback) || is_array($callback)) { - foreach (Arr::wrap($callback) as $address) { - $callback = fn ($mail) => $mail->hasTo($address); - - PHPUnit::assertCount( - 0, $this->queued($mailable, $callback), - "The unexpected [{$mailable}] mailable was queued to address [{$address}]." - ); - } - - return; - } - - [$mailable, $callback] = $this->prepareMailableAndCallback($mailable, $callback); - - PHPUnit::assertCount( - 0, $this->queued($mailable, $callback), - "The unexpected [{$mailable}] mailable was queued." - ); - } - - /** - * Assert that no mailables were queued. - * - * @return void - */ - public function assertNothingQueued() - { - $mailableNames = (new Collection($this->queuedMailables))->map( - fn ($mailable) => get_class($mailable) - )->join("\n- "); - - PHPUnit::assertEmpty($this->queuedMailables, "The following mailables were queued unexpectedly:\n\n- $mailableNames\n"); - } - - /** - * Assert the total number of mailables that were sent. - * - * @param int $count - * @return void - */ - public function assertSentCount($count) - { - $total = (new Collection($this->mailables))->count(); - - PHPUnit::assertSame( - $count, $total, - "The total number of mailables sent was {$total} instead of {$count}." - ); - } - - /** - * Assert the total number of mailables that were queued. - * - * @param int $count - * @return void - */ - public function assertQueuedCount($count) - { - $total = (new Collection($this->queuedMailables))->count(); - - PHPUnit::assertSame( - $count, $total, - "The total number of mailables queued was {$total} instead of {$count}." - ); - } - - /** - * Assert the total number of mailables that were sent or queued. - * - * @param int $count - * @return void - */ - public function assertOutgoingCount($count) - { - $total = (new Collection($this->mailables)) - ->concat($this->queuedMailables) - ->count(); - - PHPUnit::assertSame( - $count, $total, - "The total number of outgoing mailables was {$total} instead of {$count}." - ); - } - - /** - * Get all of the mailables matching a truth-test callback. - * - * @param string|\Closure $mailable - * @param callable|null $callback - * @return \Illuminate\Support\Collection - */ - public function sent($mailable, $callback = null) - { - [$mailable, $callback] = $this->prepareMailableAndCallback($mailable, $callback); - - if (! $this->hasSent($mailable)) { - return new Collection; - } - - $callback = $callback ?: fn () => true; - - return $this->mailablesOf($mailable)->filter(fn ($mailable) => $callback($mailable)); - } - - /** - * Determine if the given mailable has been sent. - * - * @param string $mailable - * @return bool - */ - public function hasSent($mailable) - { - return $this->mailablesOf($mailable)->count() > 0; - } - - /** - * Get all of the queued mailables matching a truth-test callback. - * - * @param string|\Closure $mailable - * @param callable|null $callback - * @return \Illuminate\Support\Collection - */ - public function queued($mailable, $callback = null) - { - [$mailable, $callback] = $this->prepareMailableAndCallback($mailable, $callback); - - if (! $this->hasQueued($mailable)) { - return new Collection; - } - - $callback = $callback ?: fn () => true; - - return $this->queuedMailablesOf($mailable)->filter(fn ($mailable) => $callback($mailable)); - } - - /** - * Determine if the given mailable has been queued. - * - * @param string $mailable - * @return bool - */ - public function hasQueued($mailable) - { - return $this->queuedMailablesOf($mailable)->count() > 0; - } - - /** - * Get all of the mailed mailables for a given type. - * - * @param string $type - * @return \Illuminate\Support\Collection - */ - protected function mailablesOf($type) - { - return (new Collection($this->mailables))->filter(fn ($mailable) => $mailable instanceof $type); - } - - /** - * Get all of the mailed mailables for a given type. - * - * @param string $type - * @return \Illuminate\Support\Collection - */ - protected function queuedMailablesOf($type) - { - return (new Collection($this->queuedMailables))->filter(fn ($mailable) => $mailable instanceof $type); - } - - /** - * Get a mailer instance by name. - * - * @param string|null $name - * @return \Illuminate\Contracts\Mail\Mailer - */ - public function mailer($name = null) - { - $this->currentMailer = $name; - - return $this; - } - - /** - * Begin the process of mailing a mailable class instance. - * - * @param mixed $users - * @return \Illuminate\Mail\PendingMail - */ - public function to($users) - { - return (new PendingMailFake($this))->to($users); - } - - /** - * Begin the process of mailing a mailable class instance. - * - * @param mixed $users - * @return \Illuminate\Mail\PendingMail - */ - public function cc($users) - { - return (new PendingMailFake($this))->cc($users); - } - - /** - * Begin the process of mailing a mailable class instance. - * - * @param mixed $users - * @return \Illuminate\Mail\PendingMail - */ - public function bcc($users) - { - return (new PendingMailFake($this))->bcc($users); - } - - /** - * Send a new message with only a raw text part. - * - * @param string $text - * @param \Closure|string $callback - * @return void - */ - public function raw($text, $callback) - { - // - } - - /** - * Send a new message using a view. - * - * @param \Illuminate\Contracts\Mail\Mailable|string|array $view - * @param array $data - * @param \Closure|string|null $callback - * @return mixed|void - */ - public function send($view, array $data = [], $callback = null) - { - return $this->sendMail($view, $view instanceof ShouldQueue); - } - - /** - * Send a new message synchronously using a view. - * - * @param \Illuminate\Contracts\Mail\Mailable|string|array $mailable - * @param array $data - * @param \Closure|string|null $callback - * @return void - */ - public function sendNow($mailable, array $data = [], $callback = null) - { - $this->sendMail($mailable, shouldQueue: false); - } - - /** - * Send a new message using a view. - * - * @param \Illuminate\Contracts\Mail\Mailable|string|array $view - * @param bool $shouldQueue - * @return mixed|void - */ - protected function sendMail($view, $shouldQueue = false) - { - if (! $view instanceof Mailable) { - return; - } - - $view->mailer($this->currentMailer); - - if ($shouldQueue) { - return $this->queue($view); - } - - $this->currentMailer = null; - - $this->mailables[] = $view; - } - - /** - * Queue a new message for sending. - * - * @param \Illuminate\Contracts\Mail\Mailable|string|array $view - * @param string|null $queue - * @return mixed - */ - public function queue($view, $queue = null) - { - if (! $view instanceof Mailable) { - return; - } - - $view->mailer($this->currentMailer); - - $this->currentMailer = null; - - $this->queuedMailables[] = $view; - } - - /** - * Queue a new e-mail message for sending after (n) seconds. - * - * @param \DateTimeInterface|\DateInterval|int $delay - * @param \Illuminate\Contracts\Mail\Mailable|string|array $view - * @param string|null $queue - * @return mixed - */ - public function later($delay, $view, $queue = null) - { - $this->queue($view, $queue); - } - - /** - * Infer mailable class using reflection if a typehinted closure is passed to assertion. - * - * @param string|\Closure $mailable - * @param callable|null $callback - * @return array - */ - protected function prepareMailableAndCallback($mailable, $callback) - { - if ($mailable instanceof Closure) { - return [$this->firstClosureParameterType($mailable), $mailable]; - } - - return [$mailable, $callback]; - } - - /** - * Forget all of the resolved mailer instances. - * - * @return $this - */ - public function forgetMailers() - { - $this->currentMailer = null; - - return $this; - } - - /** - * Handle dynamic method calls to the mailer. - * - * @param string $method - * @param array $parameters - * @return mixed - */ - public function __call($method, $parameters) - { - return $this->forwardCallTo($this->manager, $method, $parameters); - } -} diff --git a/plugins/vendor/illuminate/support/Testing/Fakes/NotificationFake.php b/plugins/vendor/illuminate/support/Testing/Fakes/NotificationFake.php deleted file mode 100644 index c55f493f..00000000 --- a/plugins/vendor/illuminate/support/Testing/Fakes/NotificationFake.php +++ /dev/null @@ -1,405 +0,0 @@ -assertSentTo(new AnonymousNotifiable, $notification, $callback); - } - - /** - * Assert if a notification was sent based on a truth-test callback. - * - * @param mixed $notifiable - * @param string|\Closure $notification - * @param callable|null $callback - * @return void - * - * @throws \Exception - */ - public function assertSentTo($notifiable, $notification, $callback = null) - { - if (is_array($notifiable) || $notifiable instanceof Collection) { - if (count($notifiable) === 0) { - throw new Exception('No notifiable given.'); - } - - foreach ($notifiable as $singleNotifiable) { - $this->assertSentTo($singleNotifiable, $notification, $callback); - } - - return; - } - - if ($notification instanceof Closure) { - [$notification, $callback] = [$this->firstClosureParameterType($notification), $notification]; - } - - if (is_numeric($callback)) { - return $this->assertSentToTimes($notifiable, $notification, $callback); - } - - PHPUnit::assertTrue( - $this->sent($notifiable, $notification, $callback)->count() > 0, - "The expected [{$notification}] notification was not sent." - ); - } - - /** - * Assert if a notification was sent on-demand a number of times. - * - * @param string $notification - * @param int $times - * @return void - */ - public function assertSentOnDemandTimes($notification, $times = 1) - { - $this->assertSentToTimes(new AnonymousNotifiable, $notification, $times); - } - - /** - * Assert if a notification was sent a number of times. - * - * @param mixed $notifiable - * @param string $notification - * @param int $times - * @return void - */ - public function assertSentToTimes($notifiable, $notification, $times = 1) - { - $count = $this->sent($notifiable, $notification)->count(); - - PHPUnit::assertSame( - $times, $count, - "Expected [{$notification}] to be sent {$times} times, but was sent {$count} times." - ); - } - - /** - * Determine if a notification was sent based on a truth-test callback. - * - * @param mixed $notifiable - * @param string|\Closure $notification - * @param callable|null $callback - * @return void - * - * @throws \Exception - */ - public function assertNotSentTo($notifiable, $notification, $callback = null) - { - if (is_array($notifiable) || $notifiable instanceof Collection) { - if (count($notifiable) === 0) { - throw new Exception('No notifiable given.'); - } - - foreach ($notifiable as $singleNotifiable) { - $this->assertNotSentTo($singleNotifiable, $notification, $callback); - } - - return; - } - - if ($notification instanceof Closure) { - [$notification, $callback] = [$this->firstClosureParameterType($notification), $notification]; - } - - PHPUnit::assertCount( - 0, $this->sent($notifiable, $notification, $callback), - "The unexpected [{$notification}] notification was sent." - ); - } - - /** - * Assert that no notifications were sent. - * - * @return void - */ - public function assertNothingSent() - { - $notificationNames = (new Collection($this->notifications)) - ->map(fn ($notifiableModels) => (new Collection($notifiableModels)) - ->map(fn ($notifiables) => (new Collection($notifiables))->keys()) - ) - ->flatten()->join("\n- "); - - PHPUnit::assertEmpty($this->notifications, "The following notifications were sent unexpectedly:\n\n- $notificationNames\n"); - } - - /** - * Assert that no notifications were sent to the given notifiable. - * - * @param mixed $notifiable - * @return void - * - * @throws \Exception - */ - public function assertNothingSentTo($notifiable) - { - if (is_array($notifiable) || $notifiable instanceof Collection) { - if (count($notifiable) === 0) { - throw new Exception('No notifiable given.'); - } - - foreach ($notifiable as $singleNotifiable) { - $this->assertNothingSentTo($singleNotifiable); - } - - return; - } - - PHPUnit::assertEmpty( - $this->notifications[get_class($notifiable)][$notifiable->getKey() ?? ''] ?? [], - 'Notifications were sent unexpectedly.', - ); - } - - /** - * Assert the total amount of times a notification was sent. - * - * @param string $notification - * @param int $expectedCount - * @return void - */ - public function assertSentTimes($notification, $expectedCount) - { - $actualCount = (new Collection($this->notifications)) - ->flatten(1) - ->reduce(fn ($count, $sent) => $count + count($sent[$notification] ?? []), 0); - - PHPUnit::assertSame( - $expectedCount, $actualCount, - sprintf( - "Expected [{$notification}] to be sent {$expectedCount} %s, but was sent {$actualCount} %s.", - Str::plural('time', $expectedCount), - Str::plural('time', $actualCount) - ) - ); - } - - /** - * Assert the total count of notification that were sent. - * - * @param int $expectedCount - * @return void - */ - public function assertCount($expectedCount) - { - $actualCount = (new Collection($this->notifications))->flatten(3)->count(); - - PHPUnit::assertSame( - $expectedCount, $actualCount, - "Expected {$expectedCount} notifications to be sent, but {$actualCount} were sent." - ); - } - - /** - * Get all of the notifications matching a truth-test callback. - * - * @param mixed $notifiable - * @param string $notification - * @param callable|null $callback - * @return \Illuminate\Support\Collection - */ - public function sent($notifiable, $notification, $callback = null) - { - if (! $this->hasSent($notifiable, $notification)) { - return new Collection; - } - - $callback = $callback ?: fn () => true; - - $notifications = new Collection($this->notificationsFor($notifiable, $notification)); - - return $notifications->filter( - fn ($arguments) => $callback(...array_values($arguments)) - )->pluck('notification'); - } - - /** - * Determine if there are more notifications left to inspect. - * - * @param mixed $notifiable - * @param string $notification - * @return bool - */ - public function hasSent($notifiable, $notification) - { - return ! empty($this->notificationsFor($notifiable, $notification)); - } - - /** - * Get all of the notifications for a notifiable entity by type. - * - * @param mixed $notifiable - * @param string $notification - * @return array - */ - protected function notificationsFor($notifiable, $notification) - { - return $this->notifications[get_class($notifiable)][(string) $notifiable->getKey()][$notification] ?? []; - } - - /** - * Send the given notification to the given notifiable entities. - * - * @param \Illuminate\Support\Collection|mixed $notifiables - * @param mixed $notification - * @return void - */ - public function send($notifiables, $notification) - { - $this->sendNow($notifiables, $notification); - } - - /** - * Send the given notification immediately. - * - * @param \Illuminate\Support\Collection|mixed $notifiables - * @param mixed $notification - * @param array|null $channels - * @return void - */ - public function sendNow($notifiables, $notification, ?array $channels = null) - { - if (! $notifiables instanceof Collection && ! is_array($notifiables)) { - $notifiables = [$notifiables]; - } - - foreach ($notifiables as $notifiable) { - if (! $notification->id) { - $notification->id = (string) Str::uuid(); - } - - $notifiableChannels = $channels ?: $notification->via($notifiable); - - if (method_exists($notification, 'shouldSend')) { - $notifiableChannels = array_filter( - $notifiableChannels, - fn ($channel) => $notification->shouldSend($notifiable, $channel) !== false - ); - } - - if (empty($notifiableChannels)) { - continue; - } - - $this->notifications[get_class($notifiable)][(string) $notifiable->getKey()][get_class($notification)][] = [ - 'notification' => $this->serializeAndRestore && $notification instanceof ShouldQueue - ? $this->serializeAndRestoreNotification($notification) - : $notification, - 'channels' => $notifiableChannels, - 'notifiable' => $notifiable, - 'locale' => $notification->locale ?? $this->locale ?? value(function () use ($notifiable) { - if ($notifiable instanceof HasLocalePreference) { - return $notifiable->preferredLocale(); - } - }), - ]; - } - } - - /** - * Get a channel instance by name. - * - * @param string|null $name - * @return mixed - */ - public function channel($name = null) - { - // - } - - /** - * Set the locale of notifications. - * - * @param string $locale - * @return $this - */ - public function locale($locale) - { - $this->locale = $locale; - - return $this; - } - - /** - * Specify if notification should be serialized and restored when being "pushed" to the queue. - * - * @param bool $serializeAndRestore - * @return $this - */ - public function serializeAndRestore(bool $serializeAndRestore = true) - { - $this->serializeAndRestore = $serializeAndRestore; - - return $this; - } - - /** - * Serialize and unserialize the notification to simulate the queueing process. - * - * @param mixed $notification - * @return mixed - */ - protected function serializeAndRestoreNotification($notification) - { - return unserialize(serialize($notification)); - } - - /** - * Get the notifications that have been sent. - * - * @return array - */ - public function sentNotifications() - { - return $this->notifications; - } -} diff --git a/plugins/vendor/illuminate/support/Testing/Fakes/PendingBatchFake.php b/plugins/vendor/illuminate/support/Testing/Fakes/PendingBatchFake.php deleted file mode 100644 index 8c234e94..00000000 --- a/plugins/vendor/illuminate/support/Testing/Fakes/PendingBatchFake.php +++ /dev/null @@ -1,87 +0,0 @@ -bus = $bus; - $this->jobs = $jobs->filter()->values(); - } - - /** - * Dispatch the batch. - * - * @return \Illuminate\Bus\Batch - */ - public function dispatch() - { - return $this->bus->recordPendingBatch($this); - } - - /** - * Dispatch the batch after the response is sent to the browser. - * - * @return \Illuminate\Bus\Batch - */ - public function dispatchAfterResponse() - { - return $this->bus->recordPendingBatch($this); - } - - /** - * Determine if the jobs in the batch match the given jobs. - * - * @param array $expectedJobs - * @return bool - */ - public function hasJobs(array $expectedJobs) - { - if (count($this->jobs) !== count($expectedJobs)) { - return false; - } - - foreach ($expectedJobs as $index => $expectedJob) { - if ($expectedJob instanceof Closure) { - $expectedType = $this->firstClosureParameterType($expectedJob); - - if (! $this->jobs[$index] instanceof $expectedType) { - return false; - } - - if (! $expectedJob($this->jobs[$index])) { - return false; - } - } elseif (is_string($expectedJob)) { - if ($expectedJob != get_class($this->jobs[$index])) { - return false; - } - } elseif (serialize($expectedJob) != serialize($this->jobs[$index])) { - return false; - } - } - - return true; - } -} diff --git a/plugins/vendor/illuminate/support/Testing/Fakes/PendingChainFake.php b/plugins/vendor/illuminate/support/Testing/Fakes/PendingChainFake.php deleted file mode 100644 index 42d98c17..00000000 --- a/plugins/vendor/illuminate/support/Testing/Fakes/PendingChainFake.php +++ /dev/null @@ -1,55 +0,0 @@ -bus = $bus; - $this->job = $job; - $this->chain = $chain; - } - - /** - * Dispatch the job with the given arguments. - * - * @return \Illuminate\Foundation\Bus\PendingDispatch - */ - public function dispatch() - { - if (is_string($this->job)) { - $firstJob = new $this->job(...func_get_args()); - } elseif ($this->job instanceof Closure) { - $firstJob = CallQueuedClosure::create($this->job); - } else { - $firstJob = $this->job; - } - - $firstJob->allOnConnection($this->connection); - $firstJob->allOnQueue($this->queue); - $firstJob->chain($this->chain); - $firstJob->delay($this->delay); - $firstJob->chainCatchCallbacks = $this->catchCallbacks(); - - return $this->bus->dispatch($firstJob); - } -} diff --git a/plugins/vendor/illuminate/support/Testing/Fakes/PendingMailFake.php b/plugins/vendor/illuminate/support/Testing/Fakes/PendingMailFake.php deleted file mode 100644 index a3d64e73..00000000 --- a/plugins/vendor/illuminate/support/Testing/Fakes/PendingMailFake.php +++ /dev/null @@ -1,52 +0,0 @@ -mailer = $mailer; - } - - /** - * Send a new mailable message instance. - * - * @param \Illuminate\Contracts\Mail\Mailable $mailable - * @return void - */ - public function send(Mailable $mailable) - { - $this->mailer->send($this->fill($mailable)); - } - - /** - * Send a new mailable message instance synchronously. - * - * @param \Illuminate\Contracts\Mail\Mailable $mailable - * @return void - */ - public function sendNow(Mailable $mailable) - { - $this->mailer->sendNow($this->fill($mailable)); - } - - /** - * Push the given mailable onto the queue. - * - * @param \Illuminate\Contracts\Mail\Mailable $mailable - * @return mixed - */ - public function queue(Mailable $mailable) - { - return $this->mailer->queue($this->fill($mailable)); - } -} diff --git a/plugins/vendor/illuminate/support/Testing/Fakes/QueueFake.php b/plugins/vendor/illuminate/support/Testing/Fakes/QueueFake.php deleted file mode 100644 index 16d99166..00000000 --- a/plugins/vendor/illuminate/support/Testing/Fakes/QueueFake.php +++ /dev/null @@ -1,719 +0,0 @@ -} - */ -class QueueFake extends QueueManager implements Fake, Queue -{ - use ReflectsClosures; - - /** - * The original queue manager. - * - * @var \Illuminate\Contracts\Queue\Queue - */ - public $queue; - - /** - * The job types that should be intercepted instead of pushed to the queue. - * - * @var \Illuminate\Support\Collection - */ - protected $jobsToFake; - - /** - * The job types that should be pushed to the queue and not intercepted. - * - * @var \Illuminate\Support\Collection - */ - protected $jobsToBeQueued; - - /** - * All of the jobs that have been pushed. - * - * @var array - */ - protected $jobs = []; - - /** - * All of the payloads that have been raw pushed. - * - * @var list - */ - protected $rawPushes = []; - - /** - * All of the unique jobs that were pushed. - * - * @var array - */ - private $uniqueJobs = []; - - /** - * Indicates if items should be serialized and restored when pushed to the queue. - * - * @var bool - */ - protected bool $serializeAndRestore = false; - - /** - * Create a new fake queue instance. - * - * @param \Illuminate\Contracts\Foundation\Application $app - * @param array $jobsToFake - * @param \Illuminate\Queue\QueueManager|null $queue - */ - public function __construct($app, $jobsToFake = [], $queue = null) - { - parent::__construct($app); - - $this->jobsToFake = Collection::wrap($jobsToFake); - $this->jobsToBeQueued = new Collection; - $this->queue = $queue; - } - - /** - * Specify the jobs that should be queued instead of faked. - * - * @param array|string $jobsToBeQueued - * @return $this - */ - public function except($jobsToBeQueued) - { - $this->jobsToBeQueued = Collection::wrap($jobsToBeQueued)->merge($this->jobsToBeQueued); - - return $this; - } - - /** - * Assert if a job was pushed based on a truth-test callback. - * - * @param string|\Closure $job - * @param callable|int|null $callback - * @return void - */ - public function assertPushed($job, $callback = null) - { - if ($job instanceof Closure) { - [$job, $callback] = [$this->firstClosureParameterType($job), $job]; - } - - if (is_numeric($callback)) { - return $this->assertPushedTimes($job, $callback); - } - - PHPUnit::assertTrue( - $this->pushed($job, $callback)->count() > 0, - "The expected [{$job}] job was not pushed." - ); - } - - /** - * Assert if a job was pushed a number of times. - * - * @param string $job - * @param int $times - * @return void - */ - public function assertPushedTimes($job, $times = 1) - { - $count = $this->pushed($job)->count(); - - PHPUnit::assertSame( - $times, $count, - sprintf( - "The expected [{$job}] job was pushed {$count} %s instead of {$times} %s.", - Str::plural('time', $count), - Str::plural('time', $times) - ) - ); - } - - /** - * Assert if a job was pushed based on a truth-test callback. - * - * @param string $queue - * @param string|\Closure $job - * @param callable|null $callback - * @return void - */ - public function assertPushedOn($queue, $job, $callback = null) - { - if ($job instanceof Closure) { - [$job, $callback] = [$this->firstClosureParameterType($job), $job]; - } - - $this->assertPushed($job, function ($job, $pushedQueue) use ($callback, $queue) { - if ($pushedQueue !== $queue) { - return false; - } - - return $callback ? $callback(...func_get_args()) : true; - }); - } - - /** - * Assert if a job was pushed with chained jobs based on a truth-test callback. - * - * @param string $job - * @param array $expectedChain - * @param callable|null $callback - * @return void - */ - public function assertPushedWithChain($job, $expectedChain = [], $callback = null) - { - PHPUnit::assertTrue( - $this->pushed($job, $callback)->isNotEmpty(), - "The expected [{$job}] job was not pushed." - ); - - PHPUnit::assertTrue( - (new Collection($expectedChain))->isNotEmpty(), - 'The expected chain can not be empty.' - ); - - $this->isChainOfObjects($expectedChain) - ? $this->assertPushedWithChainOfObjects($job, $expectedChain, $callback) - : $this->assertPushedWithChainOfClasses($job, $expectedChain, $callback); - } - - /** - * Assert if a job was pushed with an empty chain based on a truth-test callback. - * - * @param string $job - * @param callable|null $callback - * @return void - */ - public function assertPushedWithoutChain($job, $callback = null) - { - PHPUnit::assertTrue( - $this->pushed($job, $callback)->isNotEmpty(), - "The expected [{$job}] job was not pushed." - ); - - $this->assertPushedWithChainOfClasses($job, [], $callback); - } - - /** - * Assert if a job was pushed with chained jobs based on a truth-test callback. - * - * @param string $job - * @param array $expectedChain - * @param callable|null $callback - * @return void - */ - protected function assertPushedWithChainOfObjects($job, $expectedChain, $callback) - { - $chain = (new Collection($expectedChain))->map(fn ($job) => serialize($job))->all(); - - PHPUnit::assertTrue( - $this->pushed($job, $callback)->filter(fn ($job) => $job->chained == $chain)->isNotEmpty(), - 'The expected chain was not pushed.' - ); - } - - /** - * Assert if a job was pushed with chained jobs based on a truth-test callback. - * - * @param string $job - * @param array $expectedChain - * @param callable|null $callback - * @return void - */ - protected function assertPushedWithChainOfClasses($job, $expectedChain, $callback) - { - $matching = $this->pushed($job, $callback)->map->chained->map(function ($chain) { - return (new Collection($chain))->map(function ($job) { - return get_class(unserialize($job)); - }); - })->filter(function ($chain) use ($expectedChain) { - return $chain->all() === $expectedChain; - }); - - PHPUnit::assertTrue( - $matching->isNotEmpty(), 'The expected chain was not pushed.' - ); - } - - /** - * Assert if a closure was pushed based on a truth-test callback. - * - * @param callable|int|null $callback - * @return void - */ - public function assertClosurePushed($callback = null) - { - $this->assertPushed(CallQueuedClosure::class, $callback); - } - - /** - * Assert that a closure was not pushed based on a truth-test callback. - * - * @param callable|null $callback - * @return void - */ - public function assertClosureNotPushed($callback = null) - { - $this->assertNotPushed(CallQueuedClosure::class, $callback); - } - - /** - * Determine if the given chain is entirely composed of objects. - * - * @param array $chain - * @return bool - */ - protected function isChainOfObjects($chain) - { - return ! (new Collection($chain))->contains(fn ($job) => ! is_object($job)); - } - - /** - * Determine if a job was pushed based on a truth-test callback. - * - * @param string|\Closure $job - * @param callable|null $callback - * @return void - */ - public function assertNotPushed($job, $callback = null) - { - if ($job instanceof Closure) { - [$job, $callback] = [$this->firstClosureParameterType($job), $job]; - } - - PHPUnit::assertCount( - 0, $this->pushed($job, $callback), - "The unexpected [{$job}] job was pushed." - ); - } - - /** - * Assert the total count of jobs that were pushed. - * - * @param int $expectedCount - * @return void - */ - public function assertCount($expectedCount) - { - $actualCount = (new Collection($this->jobs))->flatten(1)->count(); - - PHPUnit::assertSame( - $expectedCount, $actualCount, - "Expected {$expectedCount} jobs to be pushed, but found {$actualCount} instead." - ); - } - - /** - * Assert that no jobs were pushed. - * - * @return void - */ - public function assertNothingPushed() - { - $pushedJobs = implode("\n- ", array_keys($this->jobs)); - - PHPUnit::assertEmpty($this->jobs, "The following jobs were pushed unexpectedly:\n\n- $pushedJobs\n"); - } - - /** - * Get all of the jobs matching a truth-test callback. - * - * @param string $job - * @param callable|null $callback - * @return \Illuminate\Support\Collection - */ - public function pushed($job, $callback = null) - { - if (! $this->hasPushed($job)) { - return new Collection; - } - - $callback = $callback ?: fn () => true; - - return (new Collection($this->jobs[$job]))->filter( - fn ($data) => $callback($data['job'], $data['queue'], $data['data']) - )->pluck('job'); - } - - /** - * Get all of the raw pushes matching a truth-test callback. - * - * @param null|\Closure(string, ?string, array): bool $callback - * @return \Illuminate\Support\Collection - */ - public function pushedRaw($callback = null) - { - $callback ??= static fn () => true; - - return (new Collection($this->rawPushes))->filter(fn ($data) => $callback($data['payload'], $data['queue'], $data['options'])); - } - - /** - * Get all of the jobs by listener class, passing an optional truth-test callback. - * - * @param class-string $listenerClass - * @param (\Closure(mixed, \Illuminate\Events\CallQueuedListener, string|null, mixed): bool)|null $callback - * @return \Illuminate\Support\Collection - */ - public function listenersPushed($listenerClass, $callback = null) - { - if (! $this->hasPushed(CallQueuedListener::class)) { - return new Collection; - } - - $collection = (new Collection($this->jobs[CallQueuedListener::class])) - ->filter(fn ($data) => $data['job']->class === $listenerClass); - - if ($callback) { - $collection = $collection->filter(fn ($data) => $callback($data['job']->data[0] ?? null, $data['job'], $data['queue'], $data['data'])); - } - - return $collection->pluck('job'); - } - - /** - * Determine if there are any stored jobs for a given class. - * - * @param string $job - * @return bool - */ - public function hasPushed($job) - { - return isset($this->jobs[$job]) && ! empty($this->jobs[$job]); - } - - /** - * Resolve a queue connection instance. - * - * @param mixed $value - * @return \Illuminate\Contracts\Queue\Queue - */ - public function connection($value = null) - { - return $this; - } - - /** - * Get the size of the queue. - * - * @param string|null $queue - * @return int - */ - public function size($queue = null) - { - return (new Collection($this->jobs)) - ->flatten(1) - ->filter(fn ($job) => $job['queue'] === $queue) - ->count(); - } - - /** - * Get the number of pending jobs. - * - * @param string|null $queue - * @return int - */ - public function pendingSize($queue = null) - { - return $this->size($queue); - } - - /** - * Get the number of delayed jobs. - * - * @param string|null $queue - * @return int - */ - public function delayedSize($queue = null) - { - return 0; - } - - /** - * Get the number of reserved jobs. - * - * @param string|null $queue - * @return int - */ - public function reservedSize($queue = null) - { - return 0; - } - - /** - * Get the creation timestamp of the oldest pending job, excluding delayed jobs. - * - * @param string|null $queue - * @return int|null - */ - public function creationTimeOfOldestPendingJob($queue = null) - { - return null; - } - - /** - * Push a new job onto the queue. - * - * @param string|object $job - * @param mixed $data - * @param string|null $queue - * @return mixed - */ - public function push($job, $data = '', $queue = null) - { - if ($this->shouldFakeJob($job)) { - if ($job instanceof Closure) { - $job = CallQueuedClosure::create($job); - } - - $this->jobs[is_object($job) ? get_class($job) : $job][] = [ - 'job' => $this->serializeAndRestore ? $this->serializeAndRestoreJob($job) : $job, - 'queue' => $queue, - 'data' => $data, - ]; - - if ($job instanceof ShouldBeUnique) { - $this->uniqueJobs[] = $job; - } - } else { - is_object($job) && isset($job->connection) - ? $this->queue->connection($job->connection)->push($job, $data, $queue) - : $this->queue->push($job, $data, $queue); - } - } - - /** - * Determine if a job should be faked or actually dispatched. - * - * @param object $job - * @return bool - */ - public function shouldFakeJob($job) - { - if ($this->shouldDispatchJob($job)) { - return false; - } - - if ($this->jobsToFake->isEmpty()) { - return true; - } - - return $this->jobsToFake->contains( - fn ($jobToFake) => $job instanceof ((string) $jobToFake) || $job === (string) $jobToFake - ); - } - - /** - * Determine if a job should be pushed to the queue instead of faked. - * - * @param object $job - * @return bool - */ - protected function shouldDispatchJob($job) - { - if ($this->jobsToBeQueued->isEmpty()) { - return false; - } - - return $this->jobsToBeQueued->contains( - fn ($jobToQueue) => $job instanceof ((string) $jobToQueue) - ); - } - - /** - * Push a raw payload onto the queue. - * - * @param string $payload - * @param string|null $queue - * @param array $options - * @return mixed - */ - public function pushRaw($payload, $queue = null, array $options = []) - { - $this->rawPushes[] = [ - 'payload' => $payload, - 'queue' => $queue, - 'options' => $options, - ]; - } - - /** - * Push a new job onto the queue after (n) seconds. - * - * @param \DateTimeInterface|\DateInterval|int $delay - * @param string|object $job - * @param mixed $data - * @param string|null $queue - * @return mixed - */ - public function later($delay, $job, $data = '', $queue = null) - { - return $this->push($job, $data, $queue); - } - - /** - * Push a new job onto the queue. - * - * @param string $queue - * @param string|object $job - * @param mixed $data - * @return mixed - */ - public function pushOn($queue, $job, $data = '') - { - return $this->push($job, $data, $queue); - } - - /** - * Push a new job onto a specific queue after (n) seconds. - * - * @param string $queue - * @param \DateTimeInterface|\DateInterval|int $delay - * @param string|object $job - * @param mixed $data - * @return mixed - */ - public function laterOn($queue, $delay, $job, $data = '') - { - return $this->push($job, $data, $queue); - } - - /** - * Pop the next job off of the queue. - * - * @param string|null $queue - * @return \Illuminate\Contracts\Queue\Job|null - */ - public function pop($queue = null) - { - // - } - - /** - * Push an array of jobs onto the queue. - * - * @param array $jobs - * @param mixed $data - * @param string|null $queue - * @return mixed - */ - public function bulk($jobs, $data = '', $queue = null) - { - foreach ($jobs as $job) { - $this->push($job, $data, $queue); - } - } - - /** - * Get the jobs that have been pushed. - * - * @return array - */ - public function pushedJobs() - { - return $this->jobs; - } - - /** - * Get the payloads that were pushed raw. - * - * @return list - */ - public function rawPushes() - { - return $this->rawPushes; - } - - /** - * Specify if jobs should be serialized and restored when being "pushed" to the queue. - * - * @param bool $serializeAndRestore - * @return $this - */ - public function serializeAndRestore(bool $serializeAndRestore = true) - { - $this->serializeAndRestore = $serializeAndRestore; - - return $this; - } - - /** - * Serialize and unserialize the job to simulate the queueing process. - * - * @param mixed $job - * @return mixed - */ - protected function serializeAndRestoreJob($job) - { - return unserialize(serialize($job)); - } - - /** - * Release the locks for all unique jobs that were pushed. - * - * @return void - */ - public function releaseUniqueJobLocks() - { - $lock = new UniqueLock($this->app->make(Cache::class)); - - foreach ($this->uniqueJobs as $job) { - $lock->release($job); - } - - $this->uniqueJobs = []; - } - - /** - * Get the connection name for the queue. - * - * @return string - */ - public function getConnectionName() - { - // - } - - /** - * Set the connection name for the queue. - * - * @param string $name - * @return $this - */ - public function setConnectionName($name) - { - return $this; - } - - /** - * Override the QueueManager to prevent circular dependency. - * - * @param string $method - * @param array $parameters - * @return mixed - * - * @throws \BadMethodCallException - */ - public function __call($method, $parameters) - { - throw new BadMethodCallException(sprintf( - 'Call to undefined method %s::%s()', static::class, $method - )); - } -} diff --git a/plugins/vendor/illuminate/support/Timebox.php b/plugins/vendor/illuminate/support/Timebox.php deleted file mode 100644 index 85df90c6..00000000 --- a/plugins/vendor/illuminate/support/Timebox.php +++ /dev/null @@ -1,86 +0,0 @@ -earlyReturn && $remainder > 0) { - $this->usleep($remainder); - } - - if ($exception) { - throw $exception; - } - - return $result; - } - - /** - * Indicate that the timebox can return early. - * - * @return $this - */ - public function returnEarly() - { - $this->earlyReturn = true; - - return $this; - } - - /** - * Indicate that the timebox cannot return early. - * - * @return $this - */ - public function dontReturnEarly() - { - $this->earlyReturn = false; - - return $this; - } - - /** - * Sleep for the specified number of microseconds. - * - * @param int $microseconds - * @return void - */ - protected function usleep(int $microseconds) - { - Sleep::usleep($microseconds); - } -} diff --git a/plugins/vendor/illuminate/support/Traits/CapsuleManagerTrait.php b/plugins/vendor/illuminate/support/Traits/CapsuleManagerTrait.php deleted file mode 100644 index 05327552..00000000 --- a/plugins/vendor/illuminate/support/Traits/CapsuleManagerTrait.php +++ /dev/null @@ -1,69 +0,0 @@ -container = $container; - - if (! $this->container->bound('config')) { - $this->container->instance('config', new Fluent); - } - } - - /** - * Make this capsule instance available globally. - * - * @return void - */ - public function setAsGlobal() - { - static::$instance = $this; - } - - /** - * Get the IoC container instance. - * - * @return \Illuminate\Contracts\Container\Container - */ - public function getContainer() - { - return $this->container; - } - - /** - * Set the IoC container instance. - * - * @param \Illuminate\Contracts\Container\Container $container - * @return void - */ - public function setContainer(Container $container) - { - $this->container = $container; - } -} diff --git a/plugins/vendor/illuminate/support/Traits/Dumpable.php b/plugins/vendor/illuminate/support/Traits/Dumpable.php deleted file mode 100644 index 44ad14df..00000000 --- a/plugins/vendor/illuminate/support/Traits/Dumpable.php +++ /dev/null @@ -1,30 +0,0 @@ -{$method}(...$parameters); - } catch (Error|BadMethodCallException $e) { - $pattern = '~^Call to undefined method (?P[^:]+)::(?P[^\(]+)\(\)$~'; - - if (! preg_match($pattern, $e->getMessage(), $matches)) { - throw $e; - } - - if ($matches['class'] != get_class($object) || - $matches['method'] != $method) { - throw $e; - } - - static::throwBadMethodCallException($method); - } - } - - /** - * Forward a method call to the given object, returning $this if the forwarded call returned itself. - * - * @param mixed $object - * @param string $method - * @param array $parameters - * @return mixed - * - * @throws \BadMethodCallException - */ - protected function forwardDecoratedCallTo($object, $method, $parameters) - { - $result = $this->forwardCallTo($object, $method, $parameters); - - return $result === $object ? $this : $result; - } - - /** - * Throw a bad method call exception for the given method. - * - * @param string $method - * @return never - * - * @throws \BadMethodCallException - */ - protected static function throwBadMethodCallException($method) - { - throw new BadMethodCallException(sprintf( - 'Call to undefined method %s::%s()', static::class, $method - )); - } -} diff --git a/plugins/vendor/illuminate/support/Traits/InteractsWithData.php b/plugins/vendor/illuminate/support/Traits/InteractsWithData.php deleted file mode 100644 index b31e0050..00000000 --- a/plugins/vendor/illuminate/support/Traits/InteractsWithData.php +++ /dev/null @@ -1,468 +0,0 @@ -has($key); - } - - /** - * Determine if the data contains a given key. - * - * @param string|array $key - * @return bool - */ - public function has($key) - { - $keys = is_array($key) ? $key : func_get_args(); - - $data = $this->all(); - - foreach ($keys as $value) { - if (! Arr::has($data, $value)) { - return false; - } - } - - return true; - } - - /** - * Determine if the instance contains any of the given keys. - * - * @param string|array $keys - * @return bool - */ - public function hasAny($keys) - { - $keys = is_array($keys) ? $keys : func_get_args(); - - $data = $this->all(); - - return Arr::hasAny($data, $keys); - } - - /** - * Apply the callback if the instance contains the given key. - * - * @param string $key - * @param callable $callback - * @param callable|null $default - * @return $this|mixed - */ - public function whenHas($key, callable $callback, ?callable $default = null) - { - if ($this->has($key)) { - return $callback(data_get($this->all(), $key)) ?: $this; - } - - if ($default) { - return $default(); - } - - return $this; - } - - /** - * Determine if the instance contains a non-empty value for the given key. - * - * @param string|array $key - * @return bool - */ - public function filled($key) - { - $keys = is_array($key) ? $key : func_get_args(); - - foreach ($keys as $value) { - if ($this->isEmptyString($value)) { - return false; - } - } - - return true; - } - - /** - * Determine if the instance contains an empty value for the given key. - * - * @param string|array $key - * @return bool - */ - public function isNotFilled($key) - { - $keys = is_array($key) ? $key : func_get_args(); - - foreach ($keys as $value) { - if (! $this->isEmptyString($value)) { - return false; - } - } - - return true; - } - - /** - * Determine if the instance contains a non-empty value for any of the given keys. - * - * @param string|array $keys - * @return bool - */ - public function anyFilled($keys) - { - $keys = is_array($keys) ? $keys : func_get_args(); - - foreach ($keys as $key) { - if ($this->filled($key)) { - return true; - } - } - - return false; - } - - /** - * Apply the callback if the instance contains a non-empty value for the given key. - * - * @param string $key - * @param callable $callback - * @param callable|null $default - * @return $this|mixed - */ - public function whenFilled($key, callable $callback, ?callable $default = null) - { - if ($this->filled($key)) { - return $callback(data_get($this->all(), $key)) ?: $this; - } - - if ($default) { - return $default(); - } - - return $this; - } - - /** - * Determine if the instance is missing a given key. - * - * @param string|array $key - * @return bool - */ - public function missing($key) - { - $keys = is_array($key) ? $key : func_get_args(); - - return ! $this->has($keys); - } - - /** - * Apply the callback if the instance is missing the given key. - * - * @param string $key - * @param callable $callback - * @param callable|null $default - * @return $this|mixed - */ - public function whenMissing($key, callable $callback, ?callable $default = null) - { - if ($this->missing($key)) { - return $callback(data_get($this->all(), $key)) ?: $this; - } - - if ($default) { - return $default(); - } - - return $this; - } - - /** - * Determine if the given key is an empty string for "filled". - * - * @param string $key - * @return bool - */ - protected function isEmptyString($key) - { - $value = $this->data($key); - - return ! is_bool($value) && ! is_array($value) && trim((string) $value) === ''; - } - - /** - * Retrieve data from the instance as a Stringable instance. - * - * @param string $key - * @param mixed $default - * @return \Illuminate\Support\Stringable - */ - public function str($key, $default = null) - { - return $this->string($key, $default); - } - - /** - * Retrieve data from the instance as a Stringable instance. - * - * @param string $key - * @param mixed $default - * @return \Illuminate\Support\Stringable - */ - public function string($key, $default = null) - { - return Str::of($this->data($key, $default)); - } - - /** - * Retrieve data as a boolean value. - * - * Returns true when value is "1", "true", "on", and "yes". Otherwise, returns false. - * - * @param string|null $key - * @param bool $default - * @return bool - */ - public function boolean($key = null, $default = false) - { - return filter_var($this->data($key, $default), FILTER_VALIDATE_BOOLEAN); - } - - /** - * Retrieve data as an integer value. - * - * @param string $key - * @param int $default - * @return int - */ - public function integer($key, $default = 0) - { - return (int) $this->data($key, $default); - } - - /** - * Retrieve data as a float value. - * - * @param string $key - * @param float $default - * @return float - */ - public function float($key, $default = 0.0) - { - return (float) $this->data($key, $default); - } - - /** - * Retrieve data clamped between min and max values. - * - * @param string $key - * @param int|float $min - * @param int|float $max - * @param int|float $default - * @return float|int - */ - public function clamp($key, $min, $max, $default = 0) - { - return Number::clamp($this->data($key, $default), $min, $max); - } - - /** - * Retrieve data from the instance as a Carbon instance. - * - * @param string $key - * @param string|null $format - * @param \UnitEnum|string|null $tz - * @return \Illuminate\Support\Carbon|null - * - * @throws \Carbon\Exceptions\InvalidFormatException - */ - public function date($key, $format = null, $tz = null) - { - $tz = enum_value($tz); - - if ($this->isNotFilled($key)) { - return null; - } - - if (is_null($format)) { - return Date::parse($this->data($key), $tz); - } - - return Date::createFromFormat($format, $this->data($key), $tz); - } - - /** - * Retrieve data from the instance as a CarbonInterval instance. - * - * @param string $key - * @param \Carbon\Unit|string|null $unit - * @return \Carbon\CarbonInterval|null - */ - public function interval($key, $unit = null) - { - if ($this->isNotFilled($key)) { - return null; - } - - $value = $this->data($key); - - if (is_null($unit)) { - return CarbonInterval::make($value); - } - - $unit = $unit instanceof Unit ? $unit : Unit::fromName($unit); - - return $unit->interval((float) $value); - } - - /** - * Retrieve data from the instance as an enum. - * - * @template TEnum of \BackedEnum - * @template TDefault of TEnum|null - * - * @param string $key - * @param class-string $enumClass - * @param TDefault $default - * @return TEnum|TDefault - */ - public function enum($key, $enumClass, $default = null) - { - if ($this->isNotFilled($key) || ! $this->isBackedEnum($enumClass)) { - return value($default); - } - - return $enumClass::tryFrom($this->data($key)) ?: value($default); - } - - /** - * Retrieve data from the instance as an array of enums. - * - * @template TEnum of \BackedEnum - * - * @param string $key - * @param class-string $enumClass - * @return TEnum[] - */ - public function enums($key, $enumClass) - { - if ($this->isNotFilled($key) || ! $this->isBackedEnum($enumClass)) { - return []; - } - - return $this->collect($key) - ->map(fn ($value) => $enumClass::tryFrom($value)) - ->filter() - ->all(); - } - - /** - * Determine if the given enum class is backed. - * - * @param class-string $enumClass - * @return bool - */ - protected function isBackedEnum($enumClass) - { - return is_a($enumClass, \BackedEnum::class, true); - } - - /** - * Retrieve data from the instance as an array. - * - * @param array|string|null $key - * @return array - */ - public function array($key = null) - { - return (array) (is_array($key) ? $this->only($key) : $this->data($key)); - } - - /** - * Retrieve data from the instance as a collection. - * - * @param array|string|null $key - * @return \Illuminate\Support\Collection - */ - public function collect($key = null) - { - return new Collection(is_array($key) ? $this->only($key) : $this->data($key)); - } - - /** - * Get a subset containing the provided keys with values from the instance data. - * - * @param mixed $keys - * @return array - */ - public function only($keys) - { - $results = []; - - $data = $this->all(); - - $placeholder = new stdClass; - - foreach (is_array($keys) ? $keys : func_get_args() as $key) { - $value = data_get($data, $key, $placeholder); - - if ($value !== $placeholder) { - Arr::set($results, $key, $value); - } - } - - return $results; - } - - /** - * Get all of the data except for a specified array of items. - * - * @param mixed $keys - * @return array - */ - public function except($keys) - { - $keys = is_array($keys) ? $keys : func_get_args(); - - $results = $this->all(); - - Arr::forget($results, $keys); - - return $results; - } -} diff --git a/plugins/vendor/illuminate/support/Traits/Localizable.php b/plugins/vendor/illuminate/support/Traits/Localizable.php deleted file mode 100644 index 1e9fa58c..00000000 --- a/plugins/vendor/illuminate/support/Traits/Localizable.php +++ /dev/null @@ -1,34 +0,0 @@ -getLocale(); - - try { - $app->setLocale($locale); - - return $callback(); - } finally { - $app->setLocale($original); - } - } -} diff --git a/plugins/vendor/illuminate/support/Traits/Tappable.php b/plugins/vendor/illuminate/support/Traits/Tappable.php deleted file mode 100644 index 9369e9ac..00000000 --- a/plugins/vendor/illuminate/support/Traits/Tappable.php +++ /dev/null @@ -1,17 +0,0 @@ -uri = $uri instanceof UriInterface ? $uri : LeagueUri::new((string) $uri); - } - - /** - * Create a new URI instance. - */ - public static function of(UriInterface|Stringable|string $uri = ''): static - { - return new static($uri); - } - - /** - * Get a URI instance of an absolute URL for the given path. - */ - public static function to(string $path): static - { - return new static(call_user_func(static::$urlGeneratorResolver)->to($path)); - } - - /** - * Get a URI instance for a named route. - * - * @param \BackedEnum|string $name - * @param mixed $parameters - * @param bool $absolute - * @return static - * - * @throws \Symfony\Component\Routing\Exception\RouteNotFoundException|\InvalidArgumentException - */ - public static function route($name, $parameters = [], $absolute = true): static - { - return new static(call_user_func(static::$urlGeneratorResolver)->route($name, $parameters, $absolute)); - } - - /** - * Create a signed route URI instance for a named route. - * - * @param \BackedEnum|string $name - * @param mixed $parameters - * @param \DateTimeInterface|\DateInterval|int|null $expiration - * @param bool $absolute - * @return static - * - * @throws \InvalidArgumentException - */ - public static function signedRoute($name, $parameters = [], $expiration = null, $absolute = true): static - { - return new static(call_user_func(static::$urlGeneratorResolver)->signedRoute($name, $parameters, $expiration, $absolute)); - } - - /** - * Create a temporary signed route URI instance for a named route. - * - * @param \BackedEnum|string $name - * @param \DateTimeInterface|\DateInterval|int $expiration - * @param array $parameters - * @param bool $absolute - * @return static - */ - public static function temporarySignedRoute($name, $expiration, $parameters = [], $absolute = true): static - { - return static::signedRoute($name, $parameters, $expiration, $absolute); - } - - /** - * Get a URI instance for a controller action. - * - * @param string|array $action - * @param mixed $parameters - * @param bool $absolute - * @return static - * - * @throws \InvalidArgumentException - */ - public static function action($action, $parameters = [], $absolute = true): static - { - return new static(call_user_func(static::$urlGeneratorResolver)->action($action, $parameters, $absolute)); - } - - /** - * Get the URI's authority. - */ - public function authority(): ?string - { - return $this->uri->getAuthority(); - } - - /** - * Get the URI's scheme. - */ - public function scheme(): ?string - { - return $this->uri->getScheme(); - } - - /** - * Get the user from the URI. - */ - public function user(bool $withPassword = false): ?string - { - return $withPassword - ? $this->uri->getUserInfo() - : $this->uri->getUsername(); - } - - /** - * Get the password from the URI. - */ - public function password(): ?string - { - return $this->uri->getPassword(); - } - - /** - * Get the URI's host. - */ - public function host(): ?string - { - return $this->uri->getHost(); - } - - /** - * Get the URI's port. - */ - public function port(): ?int - { - return $this->uri->getPort(); - } - - /** - * Get the URI's path. - * - * Empty or missing paths are returned as a single "/". - * - * @return non-empty-string - */ - public function path(): string - { - $path = trim((string) $this->uri->getPath(), '/'); - - return $path === '' ? '/' : $path; - } - - /** - * Get the URI's path segments. - * - * Empty or missing paths are returned as an empty collection. - */ - public function pathSegments(): Collection - { - $path = $this->path(); - - return $path === '/' ? new Collection : new Collection(explode('/', $path)); - } - - /** - * Get the URI's query string. - */ - public function query(): UriQueryString - { - return new UriQueryString($this); - } - - /** - * Get the URI's fragment. - */ - public function fragment(): ?string - { - return $this->uri->getFragment(); - } - - /** - * Specify the scheme of the URI. - */ - public function withScheme(Stringable|string $scheme): static - { - return new static($this->uri->withScheme($scheme)); - } - - /** - * Specify the user and password for the URI. - */ - public function withUser(Stringable|string|null $user, #[SensitiveParameter] Stringable|string|null $password = null): static - { - return new static($this->uri->withUserInfo($user, $password)); - } - - /** - * Specify the host of the URI. - */ - public function withHost(Stringable|string $host): static - { - return new static($this->uri->withHost($host)); - } - - /** - * Specify the port of the URI. - */ - public function withPort(?int $port): static - { - return new static($this->uri->withPort($port)); - } - - /** - * Specify the path of the URI. - */ - public function withPath(Stringable|string $path): static - { - return new static($this->uri->withPath(Str::start((string) $path, '/'))); - } - - /** - * Merge new query parameters into the URI. - */ - public function withQuery(array $query, bool $merge = true): static - { - foreach ($query as $key => $value) { - if ($value instanceof UrlRoutable) { - $query[$key] = $value->getRouteKey(); - } - } - - if ($merge) { - $mergedQuery = $this->query()->all(); - - foreach ($query as $key => $value) { - data_set($mergedQuery, $key, $value); - } - - $newQuery = $mergedQuery; - } else { - $newQuery = []; - - foreach ($query as $key => $value) { - data_set($newQuery, $key, $value); - } - } - - return new static($this->uri->withQuery(Arr::query($newQuery) ?: null)); - } - - /** - * Merge new query parameters into the URI if they are not already in the query string. - */ - public function withQueryIfMissing(array $query): static - { - $currentQuery = $this->query(); - - foreach ($query as $key => $value) { - if (! $currentQuery->missing($key)) { - Arr::forget($query, $key); - } - } - - return $this->withQuery($query); - } - - /** - * Push a value onto the end of a query string parameter that is a list. - */ - public function pushOntoQuery(string $key, mixed $value): static - { - $currentValue = data_get($this->query()->all(), $key); - - $values = Arr::wrap($value); - - return $this->withQuery([$key => match (true) { - is_array($currentValue) && array_is_list($currentValue) => array_values(array_unique([...$currentValue, ...$values])), - is_array($currentValue) => [...$currentValue, ...$values], - ! is_null($currentValue) => [$currentValue, ...$values], - default => $values, - }]); - } - - /** - * Remove the given query parameters from the URI. - */ - public function withoutQuery(array|string $keys): static - { - return $this->replaceQuery(Arr::except($this->query()->all(), $keys)); - } - - /** - * Specify new query parameters for the URI. - */ - public function replaceQuery(array $query): static - { - return $this->withQuery($query, merge: false); - } - - /** - * Specify the fragment of the URI. - */ - public function withFragment(string $fragment): static - { - return new static($this->uri->withFragment($fragment)); - } - - /** - * Create a redirect HTTP response for the given URI. - */ - public function redirect(int $status = 302, array $headers = []): RedirectResponse - { - return new RedirectResponse($this->value(), $status, $headers); - } - - /** - * Get the URI as a Stringable instance. - * - * @return \Illuminate\Support\Stringable - */ - public function toStringable() - { - return Str::of($this->value()); - } - - /** - * Create an HTTP response that represents the URI object. - * - * @param \Illuminate\Http\Request $request - * @return \Symfony\Component\HttpFoundation\Response - */ - public function toResponse($request) - { - return new RedirectResponse($this->value()); - } - - /** - * Get the URI as a string of HTML. - * - * @return string - */ - public function toHtml() - { - return $this->value(); - } - - /** - * Get the decoded string representation of the URI. - */ - public function decode(): string - { - if (empty($this->query()->toArray())) { - return $this->value(); - } - - return Str::replace(Str::after($this->value(), '?'), $this->query()->decode(), $this->value()); - } - - /** - * Get the string representation of the URI. - */ - public function value(): string - { - return (string) $this; - } - - /** - * Determine if the URI is currently an empty string. - */ - public function isEmpty(): bool - { - return trim($this->value()) === ''; - } - - /** - * Dump the string representation of the URI. - * - * @param mixed ...$args - * @return $this - */ - public function dump(...$args) - { - dump($this->value(), ...$args); - - return $this; - } - - /** - * Set the URL generator resolver. - */ - public static function setUrlGeneratorResolver(Closure $urlGeneratorResolver): void - { - static::$urlGeneratorResolver = $urlGeneratorResolver; - } - - /** - * Get the underlying URI instance. - */ - public function getUri(): UriInterface - { - return $this->uri; - } - - /** - * Convert the object into a value that is JSON serializable. - * - * @return string - */ - public function jsonSerialize(): string - { - return $this->value(); - } - - /** - * Get the string representation of the URI. - */ - public function __toString(): string - { - return $this->uri->toString(); - } -} diff --git a/plugins/vendor/illuminate/support/UriQueryString.php b/plugins/vendor/illuminate/support/UriQueryString.php deleted file mode 100644 index ccfb66fe..00000000 --- a/plugins/vendor/illuminate/support/UriQueryString.php +++ /dev/null @@ -1,96 +0,0 @@ -toArray(); - - if (! $keys) { - return $query; - } - - $results = []; - - foreach (is_array($keys) ? $keys : func_get_args() as $key) { - Arr::set($results, $key, Arr::get($query, $key)); - } - - return $results; - } - - /** - * Retrieve data from the instance. - * - * @param string|null $key - * @param mixed $default - * @return mixed - */ - protected function data($key = null, $default = null) - { - return $this->get($key, $default); - } - - /** - * Get a query string parameter. - */ - public function get(?string $key = null, mixed $default = null): mixed - { - return data_get($this->toArray(), $key, $default); - } - - /** - * Get the URL decoded version of the query string. - */ - public function decode(): string - { - return rawurldecode((string) $this); - } - - /** - * Get the string representation of the query string. - */ - public function value(): string - { - return (string) $this; - } - - /** - * Convert the query string into an array. - */ - public function toArray() - { - return QueryString::extract($this->value()); - } - - /** - * Get the string representation of the query string. - */ - public function __toString(): string - { - return (string) $this->uri->getUri()->getQuery(); - } -} diff --git a/plugins/vendor/illuminate/support/ValidatedInput.php b/plugins/vendor/illuminate/support/ValidatedInput.php deleted file mode 100644 index 4c863f0d..00000000 --- a/plugins/vendor/illuminate/support/ValidatedInput.php +++ /dev/null @@ -1,226 +0,0 @@ -input = $input; - } - - /** - * Merge the validated input with the given array of additional data. - * - * @param array $items - * @return static - */ - public function merge(array $items) - { - return new static(array_merge($this->all(), $items)); - } - - /** - * Get the raw, underlying input array. - * - * @param mixed $keys - * @return array - */ - public function all($keys = null) - { - if (! $keys) { - return $this->input; - } - - $input = []; - - foreach (is_array($keys) ? $keys : func_get_args() as $key) { - Arr::set($input, $key, Arr::get($this->input, $key)); - } - - return $input; - } - - /** - * Retrieve data from the instance. - * - * @param string|null $key - * @param mixed $default - * @return mixed - */ - protected function data($key = null, $default = null) - { - return $this->input($key, $default); - } - - /** - * Get the keys for all of the input. - * - * @return array - */ - public function keys() - { - return array_keys($this->input()); - } - - /** - * Retrieve an input item from the validated inputs. - * - * @param string|null $key - * @param mixed $default - * @return mixed - */ - public function input($key = null, $default = null) - { - return data_get( - $this->all(), $key, $default - ); - } - - /** - * Dump the items. - * - * @param mixed ...$keys - * @return $this - */ - public function dump(...$keys) - { - dump(count($keys) > 0 ? $this->only($keys) : $this->all()); - - return $this; - } - - /** - * Get the instance as an array. - * - * @return array - */ - public function toArray() - { - return $this->all(); - } - - /** - * Dynamically access input data. - * - * @param string $name - * @return mixed - */ - public function __get($name) - { - return $this->input($name); - } - - /** - * Dynamically set input data. - * - * @param string $name - * @param mixed $value - * @return mixed - */ - public function __set($name, $value) - { - $this->input[$name] = $value; - } - - /** - * Determine if an input item is set. - * - * @param string $name - * @return bool - */ - public function __isset($name) - { - return $this->exists($name); - } - - /** - * Remove an input item. - * - * @param string $name - * @return void - */ - public function __unset($name) - { - unset($this->input[$name]); - } - - /** - * Determine if an item exists at an offset. - * - * @param mixed $key - * @return bool - */ - public function offsetExists($key): bool - { - return $this->exists($key); - } - - /** - * Get an item at a given offset. - * - * @param mixed $key - * @return mixed - */ - public function offsetGet($key): mixed - { - return $this->input($key); - } - - /** - * Set the item at a given offset. - * - * @param mixed $key - * @param mixed $value - * @return void - */ - public function offsetSet($key, $value): void - { - if (is_null($key)) { - $this->input[] = $value; - } else { - $this->input[$key] = $value; - } - } - - /** - * Unset the item at a given offset. - * - * @param string $key - * @return void - */ - public function offsetUnset($key): void - { - unset($this->input[$key]); - } - - /** - * Get an iterator for the input. - * - * @return \ArrayIterator - */ - public function getIterator(): Traversable - { - return new ArrayIterator($this->input); - } -} diff --git a/plugins/vendor/illuminate/support/ViewErrorBag.php b/plugins/vendor/illuminate/support/ViewErrorBag.php deleted file mode 100644 index 3d95bded..00000000 --- a/plugins/vendor/illuminate/support/ViewErrorBag.php +++ /dev/null @@ -1,131 +0,0 @@ - - */ - protected $bags = []; - - /** - * Checks if a named MessageBag exists in the bags. - * - * @param string $key - * @return bool - */ - public function hasBag($key = 'default') - { - return isset($this->bags[$key]); - } - - /** - * Get a MessageBag instance from the bags. - * - * @param string $key - * @return \Illuminate\Contracts\Support\MessageBag - */ - public function getBag($key) - { - return Arr::get($this->bags, $key) ?: new MessageBag; - } - - /** - * Get all the bags. - * - * @return array - */ - public function getBags() - { - return $this->bags; - } - - /** - * Add a new MessageBag instance to the bags. - * - * @param string $key - * @param \Illuminate\Contracts\Support\MessageBag $bag - * @return $this - */ - public function put($key, MessageBagContract $bag) - { - $this->bags[$key] = $bag; - - return $this; - } - - /** - * Determine if the default message bag has any messages. - * - * @return bool - */ - public function any() - { - return $this->count() > 0; - } - - /** - * Get the number of messages in the default bag. - * - * @return int - */ - public function count(): int - { - return $this->getBag('default')->count(); - } - - /** - * Dynamically call methods on the default bag. - * - * @param string $method - * @param array $parameters - * @return mixed - */ - public function __call($method, $parameters) - { - return $this->getBag('default')->$method(...$parameters); - } - - /** - * Dynamically access a view error bag. - * - * @param string $key - * @return \Illuminate\Contracts\Support\MessageBag - */ - public function __get($key) - { - return $this->getBag($key); - } - - /** - * Dynamically set a view error bag. - * - * @param string $key - * @param \Illuminate\Contracts\Support\MessageBag $value - * @return void - */ - public function __set($key, $value) - { - $this->put($key, $value); - } - - /** - * Convert the default bag to its string representation. - * - * @return string - */ - public function __toString() - { - return (string) $this->getBag('default'); - } -} diff --git a/plugins/vendor/illuminate/support/composer.json b/plugins/vendor/illuminate/support/composer.json deleted file mode 100644 index d81bd960..00000000 --- a/plugins/vendor/illuminate/support/composer.json +++ /dev/null @@ -1,67 +0,0 @@ -{ - "name": "illuminate/support", - "description": "The Illuminate Support package.", - "license": "MIT", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "require": { - "php": "^8.2", - "ext-ctype": "*", - "ext-filter": "*", - "ext-mbstring": "*", - "doctrine/inflector": "^2.0", - "illuminate/collections": "^12.0", - "illuminate/conditionable": "^12.0", - "illuminate/contracts": "^12.0", - "illuminate/macroable": "^12.0", - "illuminate/reflection": "^12.0", - "nesbot/carbon": "^3.8.4", - "symfony/polyfill-php83": "^1.33", - "symfony/polyfill-php85": "^1.33", - "voku/portable-ascii": "^2.0.2" - }, - "conflict": { - "tightenco/collect": "<5.5.33" - }, - "replace": { - "spatie/once": "*" - }, - "autoload": { - "psr-4": { - "Illuminate\\Support\\": "" - }, - "files": [ - "functions.php", - "helpers.php" - ] - }, - "extra": { - "branch-alias": { - "dev-master": "12.x-dev" - } - }, - "suggest": { - "illuminate/filesystem": "Required to use the Composer class (^12.0).", - "laravel/serializable-closure": "Required to use the once function (^1.3|^2.0).", - "league/commonmark": "Required to use Str::markdown() and Stringable::markdown() (^2.7).", - "league/uri": "Required to use the Uri class (^7.5.1).", - "ramsey/uuid": "Required to use Str::uuid() (^4.7).", - "symfony/process": "Required to use the Composer class (^7.2).", - "symfony/uid": "Required to use Str::ulid() (^7.2).", - "symfony/var-dumper": "Required to use the dd function (^7.2).", - "vlucas/phpdotenv": "Required to use the Env class and env helper (^5.6.1)." - }, - "config": { - "sort-packages": true - }, - "minimum-stability": "dev" -} diff --git a/plugins/vendor/illuminate/support/functions.php b/plugins/vendor/illuminate/support/functions.php deleted file mode 100644 index e6dd8911..00000000 --- a/plugins/vendor/illuminate/support/functions.php +++ /dev/null @@ -1,157 +0,0 @@ - app(DeferredCallbackCollection::class)[] = $deferred - ); - } -} - -if (! function_exists('Illuminate\Support\php_binary')) { - /** - * Determine the PHP Binary. - */ - function php_binary(): string - { - return (new PhpExecutableFinder)->find(false) ?: 'php'; - } -} - -if (! function_exists('Illuminate\Support\artisan_binary')) { - /** - * Determine the proper Artisan executable. - */ - function artisan_binary(): string - { - return defined('ARTISAN_BINARY') ? ARTISAN_BINARY : 'artisan'; - } -} - -// Time functions... - -if (! function_exists('Illuminate\Support\now')) { - /** - * Create a new Carbon instance for the current time. - * - * @param \DateTimeZone|\UnitEnum|string|null $tz - * @return \Illuminate\Support\Carbon - */ - function now($tz = null): CarbonInterface - { - return Date::now(enum_value($tz)); - } -} - -if (! function_exists('Illuminate\Support\microseconds')) { - /** - * Get the current date / time plus the given number of microseconds. - */ - function microseconds(int|float $microseconds): CarbonInterval - { - return CarbonInterval::microseconds($microseconds); - } -} - -if (! function_exists('Illuminate\Support\milliseconds')) { - /** - * Get the current date / time plus the given number of milliseconds. - */ - function milliseconds(int|float $milliseconds): CarbonInterval - { - return CarbonInterval::milliseconds($milliseconds); - } -} - -if (! function_exists('Illuminate\Support\seconds')) { - /** - * Get the current date / time plus the given number of seconds. - */ - function seconds(int|float $seconds): CarbonInterval - { - return CarbonInterval::seconds($seconds); - } -} - -if (! function_exists('Illuminate\Support\minutes')) { - /** - * Get the current date / time plus the given number of minutes. - */ - function minutes(int|float $minutes): CarbonInterval - { - return CarbonInterval::minutes($minutes); - } -} - -if (! function_exists('Illuminate\Support\hours')) { - /** - * Get the current date / time plus the given number of hours. - */ - function hours(int|float $hours): CarbonInterval - { - return CarbonInterval::hours($hours); - } -} - -if (! function_exists('Illuminate\Support\days')) { - /** - * Get the current date / time plus the given number of days. - */ - function days(int|float $days): CarbonInterval - { - return CarbonInterval::days($days); - } -} - -if (! function_exists('Illuminate\Support\weeks')) { - /** - * Get the current date / time plus the given number of weeks. - */ - function weeks(int $weeks): CarbonInterval - { - return CarbonInterval::weeks($weeks); - } -} - -if (! function_exists('Illuminate\Support\months')) { - /** - * Get the current date / time plus the given number of months. - */ - function months(int $months): CarbonInterval - { - return CarbonInterval::months($months); - } -} - -if (! function_exists('Illuminate\Support\years')) { - /** - * Get the current date / time plus the given number of years. - */ - function years(int $years): CarbonInterval - { - return CarbonInterval::years($years); - } -} diff --git a/plugins/vendor/illuminate/support/helpers.php b/plugins/vendor/illuminate/support/helpers.php deleted file mode 100644 index 22f48b02..00000000 --- a/plugins/vendor/illuminate/support/helpers.php +++ /dev/null @@ -1,528 +0,0 @@ - $value) { - if (is_numeric($key)) { - $start++; - - $array[$start] = Arr::pull($array, $key); - } - } - - return $array; - } -} - -if (! function_exists('blank')) { - /** - * Determine if the given value is "blank". - * - * @phpstan-assert-if-false !=null|'' $value - * - * @phpstan-assert-if-true !=numeric|bool $value - * - * @param mixed $value - */ - function blank($value): bool - { - if (is_null($value)) { - return true; - } - - if (is_string($value)) { - return trim($value) === ''; - } - - if (is_numeric($value) || is_bool($value)) { - return false; - } - - if ($value instanceof Model) { - return false; - } - - if ($value instanceof Countable) { - return count($value) === 0; - } - - if ($value instanceof Stringable) { - return trim((string) $value) === ''; - } - - return empty($value); - } -} - -if (! function_exists('class_basename')) { - /** - * Get the class "basename" of the given object / class. - * - * @param string|object $class - */ - function class_basename($class): string - { - $class = is_object($class) ? get_class($class) : $class; - - return basename(str_replace('\\', '/', $class)); - } -} - -if (! function_exists('class_uses_recursive')) { - /** - * Returns all traits used by a class, its parent classes and trait of their traits. - * - * @param object|string $class - * @return array - */ - function class_uses_recursive($class): array - { - if (is_object($class)) { - $class = get_class($class); - } - - $results = []; - - foreach (array_reverse(class_parents($class) ?: []) + [$class => $class] as $class) { - $results += trait_uses_recursive($class); - } - - return array_unique($results); - } -} - -if (! function_exists('e')) { - /** - * Encode HTML special characters in a string. - * - * @param \Illuminate\Contracts\Support\DeferringDisplayableValue|\Illuminate\Contracts\Support\Htmlable|\BackedEnum|string|int|float|null $value - * @param bool $doubleEncode - */ - function e($value, $doubleEncode = true): string - { - if ($value instanceof DeferringDisplayableValue) { - $value = $value->resolveDisplayableValue(); - } - - if ($value instanceof Htmlable) { - return $value->toHtml() ?? ''; - } - - if ($value instanceof BackedEnum) { - $value = $value->value; - } - - return htmlspecialchars($value ?? '', ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8', $doubleEncode); - } -} - -if (! function_exists('env')) { - /** - * Gets the value of an environment variable. - * - * @param string $key - * @param mixed $default - * @return mixed - */ - function env($key, $default = null) - { - return Env::get($key, $default); - } -} - -if (! function_exists('filled')) { - /** - * Determine if a value is "filled". - * - * @phpstan-assert-if-true !=null|'' $value - * - * @phpstan-assert-if-false !=numeric|bool $value - * - * @param mixed $value - */ - function filled($value): bool - { - return ! blank($value); - } -} - -if (! function_exists('fluent')) { - /** - * Create a Fluent object from the given value. - * - * @param iterable|object|null $value - */ - function fluent($value = null): Fluent - { - return new Fluent($value ?? []); - } -} - -if (! function_exists('literal')) { - /** - * Return a new literal or anonymous object using named arguments. - * - * @return mixed - */ - function literal(...$arguments) - { - if (count($arguments) === 1 && array_is_list($arguments)) { - return $arguments[0]; - } - - return (object) $arguments; - } -} - -if (! function_exists('object_get')) { - /** - * Get an item from an object using "dot" notation. - * - * @template TValue of object - * - * @param TValue $object - * @param string|null $key - * @param mixed $default - * @return ($key is empty ? TValue : mixed) - */ - function object_get($object, $key, $default = null) - { - if (is_null($key) || trim($key) === '') { - return $object; - } - - foreach (explode('.', $key) as $segment) { - if (! is_object($object) || ! isset($object->{$segment})) { - return value($default); - } - - $object = $object->{$segment}; - } - - return $object; - } -} - -if (! function_exists('laravel_cloud')) { - /** - * Determine if the application is running on Laravel Cloud. - */ - function laravel_cloud(): bool - { - return ($_ENV['LARAVEL_CLOUD'] ?? false) === '1' || - ($_SERVER['LARAVEL_CLOUD'] ?? false) === '1'; - } -} - -if (! function_exists('once')) { - /** - * Ensures a callable is only called once, and returns the result on subsequent calls. - * - * @template TReturnType - * - * @param callable(): TReturnType $callback - * @return TReturnType - */ - function once(callable $callback) - { - $onceable = Onceable::tryFromTrace( - debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT, 2), - $callback, - ); - - return $onceable ? Once::instance()->value($onceable) : call_user_func($callback); - } -} - -if (! function_exists('optional')) { - /** - * Provide access to optional objects. - * - * @template TValue - * @template TReturn - * - * @param TValue $value - * @param (callable(TValue): TReturn)|null $callback - * @return ($callback is null ? \Illuminate\Support\Optional : ($value is null ? null : TReturn)) - */ - function optional($value = null, ?callable $callback = null) - { - if (is_null($callback)) { - return new Optional($value); - } elseif (! is_null($value)) { - return $callback($value); - } - } -} - -if (! function_exists('preg_replace_array')) { - /** - * Replace a given pattern with each value in the array in sequentially. - * - * @param string $pattern - * @param array $replacements - * @param string $subject - */ - function preg_replace_array($pattern, array $replacements, $subject): string - { - return preg_replace_callback($pattern, function () use (&$replacements) { - return array_shift($replacements); - }, $subject); - } -} - -if (! function_exists('retry')) { - /** - * Retry an operation a given number of times. - * - * @template TValue - * - * @param int|array $times - * @param callable(int): TValue $callback - * @param CarbonInterval|int|\Closure(int, \Throwable): CarbonInterval|int $sleepMilliseconds - * @param (callable(\Throwable): bool)|null $when - * @return TValue - * - * @throws \Throwable - */ - function retry($times, callable $callback, $sleepMilliseconds = 0, $when = null) - { - $attempts = 0; - - $backoff = []; - - if (is_array($times)) { - $backoff = $times; - - $times = count($times) + 1; - } - - beginning: - $attempts++; - $times--; - - try { - return $callback($attempts); - } catch (Throwable $e) { - if ($times < 1 || ($when && ! $when($e))) { - throw $e; - } - - $sleepMilliseconds = $backoff[$attempts - 1] ?? $sleepMilliseconds; - - if ($sleepMilliseconds) { - $duration = value($sleepMilliseconds, $attempts, $e); - - $duration instanceof CarbonInterval - ? Sleep::usleep($duration->totalMicroseconds) - : Sleep::usleep($duration * 1000); - } - - goto beginning; - } - } -} - -if (! function_exists('str')) { - /** - * Get a new stringable object from the given string. - * - * @param string|null $string - * @return ($string is null ? object : \Illuminate\Support\Stringable) - */ - function str($string = null) - { - if (func_num_args() === 0) { - return new class - { - public function __call($method, $parameters) - { - return Str::$method(...$parameters); - } - - public function __toString() - { - return ''; - } - }; - } - - return new SupportStringable($string); - } -} - -if (! function_exists('tap')) { - /** - * Call the given Closure with the given value then return the value. - * - * @template TValue - * - * @param TValue $value - * @param (callable(TValue): mixed)|null $callback - * @return ($callback is null ? \Illuminate\Support\HigherOrderTapProxy : TValue) - */ - function tap($value, $callback = null) - { - if (is_null($callback)) { - return new HigherOrderTapProxy($value); - } - - $callback($value); - - return $value; - } -} - -if (! function_exists('throw_if')) { - /** - * Throw the given exception if the given condition is true. - * - * @template TValue - * @template TParams of mixed - * @template TException of \Throwable - * @template TExceptionValue of TException|class-string|string - * - * @param TValue $condition - * @param Closure(TParams): TExceptionValue|TExceptionValue $exception - * @param TParams ...$parameters - * @return ($condition is true ? never : ($condition is non-empty-mixed ? never : TValue)) - * - * @throws TException - */ - function throw_if($condition, $exception = 'RuntimeException', ...$parameters) - { - if ($condition) { - if ($exception instanceof Closure) { - $exception = $exception(...$parameters); - } - - if (is_string($exception) && class_exists($exception)) { - $exception = new $exception(...$parameters); - } - - throw is_string($exception) ? new RuntimeException($exception) : $exception; - } - - return $condition; - } -} - -if (! function_exists('throw_unless')) { - /** - * Throw the given exception unless the given condition is true. - * - * @template TValue - * @template TParams of mixed - * @template TException of \Throwable - * @template TExceptionValue of TException|class-string|string - * - * @param TValue $condition - * @param Closure(TParams): TExceptionValue|TExceptionValue $exception - * @param TParams ...$parameters - * @return ($condition is false ? never : ($condition is non-empty-mixed ? TValue : never)) - * - * @throws TException - */ - function throw_unless($condition, $exception = 'RuntimeException', ...$parameters) - { - throw_if(! $condition, $exception, ...$parameters); - - return $condition; - } -} - -if (! function_exists('trait_uses_recursive')) { - /** - * Returns all traits used by a trait and its traits. - * - * @param object|string $trait - * @return array - */ - function trait_uses_recursive($trait): array - { - $traits = class_uses($trait) ?: []; - - foreach ($traits as $trait) { - $traits += trait_uses_recursive($trait); - } - - return $traits; - } -} - -if (! function_exists('transform')) { - /** - * Transform the given value if it is present. - * - * @template TValue - * @template TReturn - * @template TDefault - * - * @param TValue $value - * @param callable(TValue): TReturn $callback - * @param TDefault|callable(TValue): TDefault $default - * @return ($value is empty ? TDefault : TReturn) - */ - function transform($value, callable $callback, $default = null) - { - if (filled($value)) { - return $callback($value); - } - - if (is_callable($default)) { - return $default($value); - } - - return $default; - } -} - -if (! function_exists('windows_os')) { - /** - * Determine whether the current environment is Windows based. - */ - function windows_os(): bool - { - return PHP_OS_FAMILY === 'Windows'; - } -} - -if (! function_exists('with')) { - /** - * Return the given value, optionally passed through the given callback. - * - * @template TValue - * @template TReturn - * - * @param TValue $value - * @param (callable(TValue): (TReturn))|null $callback - * @return ($callback is null ? TValue : TReturn) - */ - function with($value, ?callable $callback = null) - { - return is_null($callback) ? $value : $callback($value); - } -} diff --git a/plugins/vendor/nesbot/carbon/SECURITY.md b/plugins/vendor/nesbot/carbon/SECURITY.md new file mode 100644 index 00000000..5d161f2e --- /dev/null +++ b/plugins/vendor/nesbot/carbon/SECURITY.md @@ -0,0 +1,7 @@ +# Security Policy + +## Reporting a Vulnerability + +To report a security vulnerability, please use the +[Tidelift security contact](https://tidelift.com/security). +Tidelift will coordinate the fix and disclosure. diff --git a/plugins/vendor/nesbot/carbon/composer.json b/plugins/vendor/nesbot/carbon/composer.json index 245eee51..95b2abf2 100644 --- a/plugins/vendor/nesbot/carbon/composer.json +++ b/plugins/vendor/nesbot/carbon/composer.json @@ -109,8 +109,8 @@ "phpdoc": "php phpdoc.php", "phpmd": "phpmd src text /phpmd.xml", "phpmd-test": "phpmd tests text /tests/phpmd-test.xml", - "phpstan": "phpstan analyse --configuration phpstan.neon", - "phpunit": "phpunit --verbose", + "phpstan": "phpstan analyse --configuration phpstan.neon --memory-limit 1024M", + "phpunit": "phpunit", "style-check": [ "@phpcs", "@phpstan", diff --git a/plugins/vendor/nesbot/carbon/readme.md b/plugins/vendor/nesbot/carbon/readme.md index d043079c..bd0f4210 100644 --- a/plugins/vendor/nesbot/carbon/readme.md +++ b/plugins/vendor/nesbot/carbon/readme.md @@ -127,63 +127,102 @@ This project exists thanks to all the people who contribute. Support this project by becoming a sponsor. Your logo will show up here with a link to your website. -Ставки на спорт -Онлайн казино 777 -Non GamStop Bookies UK -Route4Me Route Planner -Releaf – Medizinischer Cannabis Shop -Buitenlandse Online Casino -Online Casino Zonder Registratie -Transparencia en Casinos Online -Wildflower -Best non Gamstop sites in the UK -gaia-wines.gr -CasinoHex Canada -PayID Pokies -Top Rating casino -iDealeCasinos -Interac-casino.com - Canada -Online Kasyno Polis
See more -OnlineCasinosSpelen -Guidebook.BetWinner -Top 10 Casino Australia -PayID Pokies Sites -Online Pokies in Australia -Plinko Game -Онлайн казино casino.ua -Real Money Pokies -parhaatuudetkasinot.com -matej_j -New Casino Bonuses -Fun88 -East Villa FC -Instant withdrawal casino -Fun88 -Fun88 -Casino ohne oasis -Najlepsi Bukmacherzy -Paysafecard Casino -Sportsbook Reviews Online -Tidelift -Ставки на спорт Favbet -Casino-portugal.pt -best non Gamstop casinos -https://play-fortune.pl/kasyno/z-minimalnym-depozytem/ -Playfortune.net.br -Probukmacher -betking онлайн казино -Fastest Payout Online Casino -inkedin -AusGambler -Онлайн казино України -freispace -bestecasinozondercruks -Run Weekly -New Casino Sites UK (2025) Help Direct -UnAIMyText -Online Casino utan Svensk licens -Slots City -ssddanbrown
+ + + + + + + + + + + + + + + + + + + + + +
Онлайн казино 777Ставки на спортNon GamStop Bookies UKRoute4Me Route PlannerReleaf – Medizinischer Cannabis ShopBest non Gamstop sites in the UKCasinoHex CanadaPayID Pokies
Transparencia en Casinos Online
+
See more + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
gaia-wines.grOnlineCasinosSpelenPayID Pokies SitesOnline Pokies in AustraliaPlinko GameCasinomithandyrechnunglolajackPaysafecard CasinoAustralian Online PokiesBuitenlandse Online CasinoGuidebook.BetWinnerOnline Kasyno Polis
Online Casino Zonder RegistratieTop Rating casinoiDealeCasinosparhaatuudetkasinot.comNew Casino BonusesFun88East Villa FCFun88Fun88Casino ohne oasisNajlepsi BukmacherzyPaysafecard Casino
WNB Casino BewertungCasino mit Schneller AuszahlungCasinos ohne OASISWettanbieter ohne OASISCasino ohne LizenzCasino ohne LimitCasino ohne VerifizierungCasino ohne AnmeldungCrypto CasinoPaypal CasinoОнлайн казино casino.uaReal Money Pokies
TideliftInterac-casino.com - CanadaTop 10 Casino AustraliaSportsbook Reviews OnlineWildflowerCasino-portugal.ptСтавки на спорт FavbetProbukmacherInstant withdrawal casinobest non Gamstop casinosinkedinbetking онлайн казино
freispacebestecasinozondercruksRun WeeklyNew Casino Sites UK (2025) Help DirectUnAIMyTextTopKasynoOnline PLssddanbrown
+
[[See all](https://carbonphp.github.io/carbon/#sponsors)] diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/AbstractTranslator.php b/plugins/vendor/nesbot/carbon/src/Carbon/AbstractTranslator.php index 1b6bdcbe..a372a1ab 100644 --- a/plugins/vendor/nesbot/carbon/src/Carbon/AbstractTranslator.php +++ b/plugins/vendor/nesbot/carbon/src/Carbon/AbstractTranslator.php @@ -48,6 +48,13 @@ abstract class AbstractTranslator extends SymfonyTranslator */ protected array $directories = []; + /** + * Cache for language files. + * + * @var array + */ + protected array $fileCache = []; + /** * Set to true while constructing. */ @@ -171,7 +178,7 @@ abstract class AbstractTranslator extends SymfonyTranslator foreach ($this->getDirectories() as $directory) { $file = \sprintf('%s/%s.php', rtrim($directory, '\\/'), $locale); - $data = @include $file; + $data = ($this->fileCache[$file] ??= self::loadFile($file)); if ($data !== false) { $this->messages[$locale] = $data; @@ -305,7 +312,7 @@ abstract class AbstractTranslator extends SymfonyTranslator */ public function getMessages(?string $locale = null): array { - return $locale === null ? $this->messages : $this->messages[$locale]; + return $locale === null ? $this->messages : ($this->messages[$locale] ?? []); } /** @@ -315,6 +322,12 @@ abstract class AbstractTranslator extends SymfonyTranslator */ public function setLocale($locale): void { + $previousLocale = $this->getLocale(); + + if ($previousLocale === $locale && isset($this->messages[$locale])) { + return; + } + $locale = preg_replace_callback('/[-_]([a-z]{2,}|\d{2,})/', function ($matches) { // _2-letters or YUE is a region, _3+-letters is a variant $upper = strtoupper($matches[1]); @@ -326,8 +339,6 @@ abstract class AbstractTranslator extends SymfonyTranslator return '_'.ucfirst($matches[1]); }, strtolower($locale)); - $previousLocale = $this->getLocale(); - if ($previousLocale === $locale && isset($this->messages[$locale])) { return; } @@ -407,7 +418,12 @@ abstract class AbstractTranslator extends SymfonyTranslator $this->initializing = false; } - private static function compareChunkLists($referenceChunks, $chunks) + private function loadFile(string $file): array|false + { + return file_exists($file) ? (include $file) : false; + } + + private static function compareChunkLists(array $referenceChunks, array $chunks): int { $score = 0; diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Carbon.php b/plugins/vendor/nesbot/carbon/src/Carbon/Carbon.php index 20f1d8ef..d8b2bef7 100644 --- a/plugins/vendor/nesbot/carbon/src/Carbon/Carbon.php +++ b/plugins/vendor/nesbot/carbon/src/Carbon/Carbon.php @@ -22,10 +22,10 @@ use DateTimeInterface; * * * - * @property string $localeDayOfWeek the day of week in current locale - * @property string $shortLocaleDayOfWeek the abbreviated day of week in current locale - * @property string $localeMonth the month in current locale - * @property string $shortLocaleMonth the abbreviated month in current locale + * @property string $localeDayOfWeek the day of week in current locale + * @property string $shortLocaleDayOfWeek the abbreviated day of week in current locale + * @property string $localeMonth the month in current locale + * @property string $shortLocaleMonth the abbreviated month in current locale * @property int $year * @property int $yearIso * @property int $month @@ -35,801 +35,803 @@ use DateTimeInterface; * @property int $second * @property int $micro * @property int $microsecond - * @property int $dayOfWeekIso 1 (for Monday) through 7 (for Sunday) - * @property int|float|string $timestamp seconds since the Unix Epoch - * @property string $englishDayOfWeek the day of week in English - * @property string $shortEnglishDayOfWeek the abbreviated day of week in English - * @property string $englishMonth the month in English - * @property string $shortEnglishMonth the abbreviated month in English + * @property int $dayOfWeekIso 1 (for Monday) through 7 (for Sunday) + * @property int|float|string $timestamp seconds since the Unix Epoch + * @property string $englishDayOfWeek the day of week in English + * @property string $shortEnglishDayOfWeek the abbreviated day of week in English + * @property string $englishMonth the month in English + * @property string $shortEnglishMonth the abbreviated month in English * @property int $milliseconds * @property int $millisecond * @property int $milli - * @property int $week 1 through 53 - * @property int $isoWeek 1 through 53 - * @property int $weekYear year according to week format - * @property int $isoWeekYear year according to ISO week format - * @property int $age does a diffInYears() with default parameters - * @property int $offset the timezone offset in seconds from UTC - * @property int $offsetMinutes the timezone offset in minutes from UTC - * @property int $offsetHours the timezone offset in hours from UTC - * @property CarbonTimeZone $timezone the current timezone - * @property CarbonTimeZone $tz alias of $timezone - * @property int $centuryOfMillennium The value of the century starting from the beginning of the current millennium - * @property int $dayOfCentury The value of the day starting from the beginning of the current century - * @property int $dayOfDecade The value of the day starting from the beginning of the current decade - * @property int $dayOfMillennium The value of the day starting from the beginning of the current millennium - * @property int $dayOfMonth The value of the day starting from the beginning of the current month - * @property int $dayOfQuarter The value of the day starting from the beginning of the current quarter - * @property int $dayOfWeek 0 (for Sunday) through 6 (for Saturday) - * @property int $dayOfYear 1 through 366 - * @property int $decadeOfCentury The value of the decade starting from the beginning of the current century - * @property int $decadeOfMillennium The value of the decade starting from the beginning of the current millennium - * @property int $hourOfCentury The value of the hour starting from the beginning of the current century - * @property int $hourOfDay The value of the hour starting from the beginning of the current day - * @property int $hourOfDecade The value of the hour starting from the beginning of the current decade - * @property int $hourOfMillennium The value of the hour starting from the beginning of the current millennium - * @property int $hourOfMonth The value of the hour starting from the beginning of the current month - * @property int $hourOfQuarter The value of the hour starting from the beginning of the current quarter - * @property int $hourOfWeek The value of the hour starting from the beginning of the current week - * @property int $hourOfYear The value of the hour starting from the beginning of the current year - * @property int $microsecondOfCentury The value of the microsecond starting from the beginning of the current century - * @property int $microsecondOfDay The value of the microsecond starting from the beginning of the current day - * @property int $microsecondOfDecade The value of the microsecond starting from the beginning of the current decade - * @property int $microsecondOfHour The value of the microsecond starting from the beginning of the current hour - * @property int $microsecondOfMillennium The value of the microsecond starting from the beginning of the current millennium - * @property int $microsecondOfMillisecond The value of the microsecond starting from the beginning of the current millisecond - * @property int $microsecondOfMinute The value of the microsecond starting from the beginning of the current minute - * @property int $microsecondOfMonth The value of the microsecond starting from the beginning of the current month - * @property int $microsecondOfQuarter The value of the microsecond starting from the beginning of the current quarter - * @property int $microsecondOfSecond The value of the microsecond starting from the beginning of the current second - * @property int $microsecondOfWeek The value of the microsecond starting from the beginning of the current week - * @property int $microsecondOfYear The value of the microsecond starting from the beginning of the current year - * @property int $millisecondOfCentury The value of the millisecond starting from the beginning of the current century - * @property int $millisecondOfDay The value of the millisecond starting from the beginning of the current day - * @property int $millisecondOfDecade The value of the millisecond starting from the beginning of the current decade - * @property int $millisecondOfHour The value of the millisecond starting from the beginning of the current hour - * @property int $millisecondOfMillennium The value of the millisecond starting from the beginning of the current millennium - * @property int $millisecondOfMinute The value of the millisecond starting from the beginning of the current minute - * @property int $millisecondOfMonth The value of the millisecond starting from the beginning of the current month - * @property int $millisecondOfQuarter The value of the millisecond starting from the beginning of the current quarter - * @property int $millisecondOfSecond The value of the millisecond starting from the beginning of the current second - * @property int $millisecondOfWeek The value of the millisecond starting from the beginning of the current week - * @property int $millisecondOfYear The value of the millisecond starting from the beginning of the current year - * @property int $minuteOfCentury The value of the minute starting from the beginning of the current century - * @property int $minuteOfDay The value of the minute starting from the beginning of the current day - * @property int $minuteOfDecade The value of the minute starting from the beginning of the current decade - * @property int $minuteOfHour The value of the minute starting from the beginning of the current hour - * @property int $minuteOfMillennium The value of the minute starting from the beginning of the current millennium - * @property int $minuteOfMonth The value of the minute starting from the beginning of the current month - * @property int $minuteOfQuarter The value of the minute starting from the beginning of the current quarter - * @property int $minuteOfWeek The value of the minute starting from the beginning of the current week - * @property int $minuteOfYear The value of the minute starting from the beginning of the current year - * @property int $monthOfCentury The value of the month starting from the beginning of the current century - * @property int $monthOfDecade The value of the month starting from the beginning of the current decade - * @property int $monthOfMillennium The value of the month starting from the beginning of the current millennium - * @property int $monthOfQuarter The value of the month starting from the beginning of the current quarter - * @property int $monthOfYear The value of the month starting from the beginning of the current year - * @property int $quarterOfCentury The value of the quarter starting from the beginning of the current century - * @property int $quarterOfDecade The value of the quarter starting from the beginning of the current decade - * @property int $quarterOfMillennium The value of the quarter starting from the beginning of the current millennium - * @property int $quarterOfYear The value of the quarter starting from the beginning of the current year - * @property int $secondOfCentury The value of the second starting from the beginning of the current century - * @property int $secondOfDay The value of the second starting from the beginning of the current day - * @property int $secondOfDecade The value of the second starting from the beginning of the current decade - * @property int $secondOfHour The value of the second starting from the beginning of the current hour - * @property int $secondOfMillennium The value of the second starting from the beginning of the current millennium - * @property int $secondOfMinute The value of the second starting from the beginning of the current minute - * @property int $secondOfMonth The value of the second starting from the beginning of the current month - * @property int $secondOfQuarter The value of the second starting from the beginning of the current quarter - * @property int $secondOfWeek The value of the second starting from the beginning of the current week - * @property int $secondOfYear The value of the second starting from the beginning of the current year - * @property int $weekOfCentury The value of the week starting from the beginning of the current century - * @property int $weekOfDecade The value of the week starting from the beginning of the current decade - * @property int $weekOfMillennium The value of the week starting from the beginning of the current millennium - * @property int $weekOfMonth 1 through 5 - * @property int $weekOfQuarter The value of the week starting from the beginning of the current quarter - * @property int $weekOfYear ISO-8601 week number of year, weeks starting on Monday - * @property int $yearOfCentury The value of the year starting from the beginning of the current century - * @property int $yearOfDecade The value of the year starting from the beginning of the current decade - * @property int $yearOfMillennium The value of the year starting from the beginning of the current millennium - * @property-read string $latinMeridiem "am"/"pm" (Ante meridiem or Post meridiem latin lowercase mark) - * @property-read string $latinUpperMeridiem "AM"/"PM" (Ante meridiem or Post meridiem latin uppercase mark) - * @property-read string $timezoneAbbreviatedName the current timezone abbreviated name - * @property-read string $tzAbbrName alias of $timezoneAbbreviatedName - * @property-read string $dayName long name of weekday translated according to Carbon locale, in english if no translation available for current language - * @property-read string $shortDayName short name of weekday translated according to Carbon locale, in english if no translation available for current language - * @property-read string $minDayName very short name of weekday translated according to Carbon locale, in english if no translation available for current language - * @property-read string $monthName long name of month translated according to Carbon locale, in english if no translation available for current language - * @property-read string $shortMonthName short name of month translated according to Carbon locale, in english if no translation available for current language - * @property-read string $meridiem lowercase meridiem mark translated according to Carbon locale, in latin if no translation available for current language - * @property-read string $upperMeridiem uppercase meridiem mark translated according to Carbon locale, in latin if no translation available for current language - * @property-read int $noZeroHour current hour from 1 to 24 - * @property-read int $isoWeeksInYear 51 through 53 - * @property-read int $weekNumberInMonth 1 through 5 - * @property-read int $firstWeekDay 0 through 6 - * @property-read int $lastWeekDay 0 through 6 - * @property-read int $quarter the quarter of this instance, 1 - 4 - * @property-read int $decade the decade of this instance - * @property-read int $century the century of this instance - * @property-read int $millennium the millennium of this instance - * @property-read bool $dst daylight savings time indicator, true if DST, false otherwise - * @property-read bool $local checks if the timezone is local, true if local, false otherwise - * @property-read bool $utc checks if the timezone is UTC, true if UTC, false otherwise - * @property-read string $timezoneName the current timezone name - * @property-read string $tzName alias of $timezoneName - * @property-read string $locale locale of the current instance - * @property-read int $centuriesInMillennium The number of centuries contained in the current millennium - * @property-read int $daysInCentury The number of days contained in the current century - * @property-read int $daysInDecade The number of days contained in the current decade - * @property-read int $daysInMillennium The number of days contained in the current millennium - * @property-read int $daysInMonth number of days in the given month - * @property-read int $daysInQuarter The number of days contained in the current quarter - * @property-read int $daysInWeek The number of days contained in the current week - * @property-read int $daysInYear 365 or 366 - * @property-read int $decadesInCentury The number of decades contained in the current century - * @property-read int $decadesInMillennium The number of decades contained in the current millennium - * @property-read int $hoursInCentury The number of hours contained in the current century - * @property-read int $hoursInDay The number of hours contained in the current day - * @property-read int $hoursInDecade The number of hours contained in the current decade - * @property-read int $hoursInMillennium The number of hours contained in the current millennium - * @property-read int $hoursInMonth The number of hours contained in the current month - * @property-read int $hoursInQuarter The number of hours contained in the current quarter - * @property-read int $hoursInWeek The number of hours contained in the current week - * @property-read int $hoursInYear The number of hours contained in the current year - * @property-read int $microsecondsInCentury The number of microseconds contained in the current century - * @property-read int $microsecondsInDay The number of microseconds contained in the current day - * @property-read int $microsecondsInDecade The number of microseconds contained in the current decade - * @property-read int $microsecondsInHour The number of microseconds contained in the current hour - * @property-read int $microsecondsInMillennium The number of microseconds contained in the current millennium - * @property-read int $microsecondsInMillisecond The number of microseconds contained in the current millisecond - * @property-read int $microsecondsInMinute The number of microseconds contained in the current minute - * @property-read int $microsecondsInMonth The number of microseconds contained in the current month - * @property-read int $microsecondsInQuarter The number of microseconds contained in the current quarter - * @property-read int $microsecondsInSecond The number of microseconds contained in the current second - * @property-read int $microsecondsInWeek The number of microseconds contained in the current week - * @property-read int $microsecondsInYear The number of microseconds contained in the current year - * @property-read int $millisecondsInCentury The number of milliseconds contained in the current century - * @property-read int $millisecondsInDay The number of milliseconds contained in the current day - * @property-read int $millisecondsInDecade The number of milliseconds contained in the current decade - * @property-read int $millisecondsInHour The number of milliseconds contained in the current hour - * @property-read int $millisecondsInMillennium The number of milliseconds contained in the current millennium - * @property-read int $millisecondsInMinute The number of milliseconds contained in the current minute - * @property-read int $millisecondsInMonth The number of milliseconds contained in the current month - * @property-read int $millisecondsInQuarter The number of milliseconds contained in the current quarter - * @property-read int $millisecondsInSecond The number of milliseconds contained in the current second - * @property-read int $millisecondsInWeek The number of milliseconds contained in the current week - * @property-read int $millisecondsInYear The number of milliseconds contained in the current year - * @property-read int $minutesInCentury The number of minutes contained in the current century - * @property-read int $minutesInDay The number of minutes contained in the current day - * @property-read int $minutesInDecade The number of minutes contained in the current decade - * @property-read int $minutesInHour The number of minutes contained in the current hour - * @property-read int $minutesInMillennium The number of minutes contained in the current millennium - * @property-read int $minutesInMonth The number of minutes contained in the current month - * @property-read int $minutesInQuarter The number of minutes contained in the current quarter - * @property-read int $minutesInWeek The number of minutes contained in the current week - * @property-read int $minutesInYear The number of minutes contained in the current year - * @property-read int $monthsInCentury The number of months contained in the current century - * @property-read int $monthsInDecade The number of months contained in the current decade - * @property-read int $monthsInMillennium The number of months contained in the current millennium - * @property-read int $monthsInQuarter The number of months contained in the current quarter - * @property-read int $monthsInYear The number of months contained in the current year - * @property-read int $quartersInCentury The number of quarters contained in the current century - * @property-read int $quartersInDecade The number of quarters contained in the current decade - * @property-read int $quartersInMillennium The number of quarters contained in the current millennium - * @property-read int $quartersInYear The number of quarters contained in the current year - * @property-read int $secondsInCentury The number of seconds contained in the current century - * @property-read int $secondsInDay The number of seconds contained in the current day - * @property-read int $secondsInDecade The number of seconds contained in the current decade - * @property-read int $secondsInHour The number of seconds contained in the current hour - * @property-read int $secondsInMillennium The number of seconds contained in the current millennium - * @property-read int $secondsInMinute The number of seconds contained in the current minute - * @property-read int $secondsInMonth The number of seconds contained in the current month - * @property-read int $secondsInQuarter The number of seconds contained in the current quarter - * @property-read int $secondsInWeek The number of seconds contained in the current week - * @property-read int $secondsInYear The number of seconds contained in the current year - * @property-read int $weeksInCentury The number of weeks contained in the current century - * @property-read int $weeksInDecade The number of weeks contained in the current decade - * @property-read int $weeksInMillennium The number of weeks contained in the current millennium - * @property-read int $weeksInMonth The number of weeks contained in the current month - * @property-read int $weeksInQuarter The number of weeks contained in the current quarter - * @property-read int $weeksInYear 51 through 53 - * @property-read int $yearsInCentury The number of years contained in the current century - * @property-read int $yearsInDecade The number of years contained in the current decade - * @property-read int $yearsInMillennium The number of years contained in the current millennium + * @property int $week 1 through 53 + * @property int $isoWeek 1 through 53 + * @property int $weekYear year according to week format + * @property int $isoWeekYear year according to ISO week format + * @property int $age does a diffInYears() with default parameters + * @property int $offset the timezone offset in seconds from UTC + * @property int $offsetMinutes the timezone offset in minutes from UTC + * @property int $offsetHours the timezone offset in hours from UTC + * @property CarbonTimeZone $timezone the current timezone + * @property CarbonTimeZone $tz alias of $timezone + * @property int $centuryOfMillennium The value of the century starting from the beginning of the current millennium + * @property int $dayOfCentury The value of the day starting from the beginning of the current century + * @property int $dayOfDecade The value of the day starting from the beginning of the current decade + * @property int $dayOfMillennium The value of the day starting from the beginning of the current millennium + * @property int $dayOfMonth The value of the day starting from the beginning of the current month + * @property int $dayOfQuarter The value of the day starting from the beginning of the current quarter + * @property int $dayOfWeek 0 (for Sunday) through 6 (for Saturday) + * @property int $dayOfYear 1 through 366 + * @property int $decadeOfCentury The value of the decade starting from the beginning of the current century + * @property int $decadeOfMillennium The value of the decade starting from the beginning of the current millennium + * @property int $hourOfCentury The value of the hour starting from the beginning of the current century + * @property int $hourOfDay The value of the hour starting from the beginning of the current day + * @property int $hourOfDecade The value of the hour starting from the beginning of the current decade + * @property int $hourOfMillennium The value of the hour starting from the beginning of the current millennium + * @property int $hourOfMonth The value of the hour starting from the beginning of the current month + * @property int $hourOfQuarter The value of the hour starting from the beginning of the current quarter + * @property int $hourOfWeek The value of the hour starting from the beginning of the current week + * @property int $hourOfYear The value of the hour starting from the beginning of the current year + * @property int $microsecondOfCentury The value of the microsecond starting from the beginning of the current century + * @property int $microsecondOfDay The value of the microsecond starting from the beginning of the current day + * @property int $microsecondOfDecade The value of the microsecond starting from the beginning of the current decade + * @property int $microsecondOfHour The value of the microsecond starting from the beginning of the current hour + * @property int $microsecondOfMillennium The value of the microsecond starting from the beginning of the current millennium + * @property int $microsecondOfMillisecond The value of the microsecond starting from the beginning of the current millisecond + * @property int $microsecondOfMinute The value of the microsecond starting from the beginning of the current minute + * @property int $microsecondOfMonth The value of the microsecond starting from the beginning of the current month + * @property int $microsecondOfQuarter The value of the microsecond starting from the beginning of the current quarter + * @property int $microsecondOfSecond The value of the microsecond starting from the beginning of the current second + * @property int $microsecondOfWeek The value of the microsecond starting from the beginning of the current week + * @property int $microsecondOfYear The value of the microsecond starting from the beginning of the current year + * @property int $millisecondOfCentury The value of the millisecond starting from the beginning of the current century + * @property int $millisecondOfDay The value of the millisecond starting from the beginning of the current day + * @property int $millisecondOfDecade The value of the millisecond starting from the beginning of the current decade + * @property int $millisecondOfHour The value of the millisecond starting from the beginning of the current hour + * @property int $millisecondOfMillennium The value of the millisecond starting from the beginning of the current millennium + * @property int $millisecondOfMinute The value of the millisecond starting from the beginning of the current minute + * @property int $millisecondOfMonth The value of the millisecond starting from the beginning of the current month + * @property int $millisecondOfQuarter The value of the millisecond starting from the beginning of the current quarter + * @property int $millisecondOfSecond The value of the millisecond starting from the beginning of the current second + * @property int $millisecondOfWeek The value of the millisecond starting from the beginning of the current week + * @property int $millisecondOfYear The value of the millisecond starting from the beginning of the current year + * @property int $minuteOfCentury The value of the minute starting from the beginning of the current century + * @property int $minuteOfDay The value of the minute starting from the beginning of the current day + * @property int $minuteOfDecade The value of the minute starting from the beginning of the current decade + * @property int $minuteOfHour The value of the minute starting from the beginning of the current hour + * @property int $minuteOfMillennium The value of the minute starting from the beginning of the current millennium + * @property int $minuteOfMonth The value of the minute starting from the beginning of the current month + * @property int $minuteOfQuarter The value of the minute starting from the beginning of the current quarter + * @property int $minuteOfWeek The value of the minute starting from the beginning of the current week + * @property int $minuteOfYear The value of the minute starting from the beginning of the current year + * @property int $monthOfCentury The value of the month starting from the beginning of the current century + * @property int $monthOfDecade The value of the month starting from the beginning of the current decade + * @property int $monthOfMillennium The value of the month starting from the beginning of the current millennium + * @property int $monthOfQuarter The value of the month starting from the beginning of the current quarter + * @property int $monthOfYear The value of the month starting from the beginning of the current year + * @property int $quarterOfCentury The value of the quarter starting from the beginning of the current century + * @property int $quarterOfDecade The value of the quarter starting from the beginning of the current decade + * @property int $quarterOfMillennium The value of the quarter starting from the beginning of the current millennium + * @property int $quarterOfYear The value of the quarter starting from the beginning of the current year + * @property int $secondOfCentury The value of the second starting from the beginning of the current century + * @property int $secondOfDay The value of the second starting from the beginning of the current day + * @property int $secondOfDecade The value of the second starting from the beginning of the current decade + * @property int $secondOfHour The value of the second starting from the beginning of the current hour + * @property int $secondOfMillennium The value of the second starting from the beginning of the current millennium + * @property int $secondOfMinute The value of the second starting from the beginning of the current minute + * @property int $secondOfMonth The value of the second starting from the beginning of the current month + * @property int $secondOfQuarter The value of the second starting from the beginning of the current quarter + * @property int $secondOfWeek The value of the second starting from the beginning of the current week + * @property int $secondOfYear The value of the second starting from the beginning of the current year + * @property int $weekOfCentury The value of the week starting from the beginning of the current century + * @property int $weekOfDecade The value of the week starting from the beginning of the current decade + * @property int $weekOfMillennium The value of the week starting from the beginning of the current millennium + * @property int $weekOfMonth 1 through 5 + * @property int $weekOfQuarter The value of the week starting from the beginning of the current quarter + * @property int $weekOfYear ISO-8601 week number of year, weeks starting on Monday + * @property int $yearOfCentury The value of the year starting from the beginning of the current century + * @property int $yearOfDecade The value of the year starting from the beginning of the current decade + * @property int $yearOfMillennium The value of the year starting from the beginning of the current millennium + * @property-read string $latinMeridiem "am"/"pm" (Ante meridiem or Post meridiem latin lowercase mark) + * @property-read string $latinUpperMeridiem "AM"/"PM" (Ante meridiem or Post meridiem latin uppercase mark) + * @property-read string $timezoneAbbreviatedName the current timezone abbreviated name + * @property-read string $tzAbbrName alias of $timezoneAbbreviatedName + * @property-read string $dayName long name of weekday translated according to Carbon locale, in english if no translation available for current language + * @property-read string $shortDayName short name of weekday translated according to Carbon locale, in english if no translation available for current language + * @property-read string $minDayName very short name of weekday translated according to Carbon locale, in english if no translation available for current language + * @property-read string $monthName long name of month translated according to Carbon locale, in english if no translation available for current language + * @property-read string $shortMonthName short name of month translated according to Carbon locale, in english if no translation available for current language + * @property-read string $meridiem lowercase meridiem mark translated according to Carbon locale, in latin if no translation available for current language + * @property-read string $upperMeridiem uppercase meridiem mark translated according to Carbon locale, in latin if no translation available for current language + * @property-read int $noZeroHour current hour from 1 to 24 + * @property-read int $isoWeeksInYear 51 through 53 + * @property-read int $weekNumberInMonth 1 through 5 + * @property-read int $firstWeekDay 0 through 6 + * @property-read int $lastWeekDay 0 through 6 + * @property-read int $quarter the quarter of this instance, 1 - 4 + * @property-read int $decade the decade of this instance + * @property-read int $century the century of this instance + * @property-read int $millennium the millennium of this instance + * @property-read bool $dst daylight savings time indicator, true if DST, false otherwise + * @property-read bool $local checks if the timezone is local, true if local, false otherwise + * @property-read bool $utc checks if the timezone is UTC, true if UTC, false otherwise + * @property-read string $timezoneName the current timezone name + * @property-read string $tzName alias of $timezoneName + * @property-read string $locale locale of the current instance + * @property-read int $centuriesInMillennium The number of centuries contained in the current millennium + * @property-read int $daysInCentury The number of days contained in the current century + * @property-read int $daysInDecade The number of days contained in the current decade + * @property-read int $daysInMillennium The number of days contained in the current millennium + * @property-read int $daysInMonth number of days in the given month + * @property-read int $daysInQuarter The number of days contained in the current quarter + * @property-read int $daysInWeek The number of days contained in the current week + * @property-read int $daysInYear 365 or 366 + * @property-read int $decadesInCentury The number of decades contained in the current century + * @property-read int $decadesInMillennium The number of decades contained in the current millennium + * @property-read int $hoursInCentury The number of hours contained in the current century + * @property-read int $hoursInDay The number of hours contained in the current day + * @property-read int $hoursInDecade The number of hours contained in the current decade + * @property-read int $hoursInMillennium The number of hours contained in the current millennium + * @property-read int $hoursInMonth The number of hours contained in the current month + * @property-read int $hoursInQuarter The number of hours contained in the current quarter + * @property-read int $hoursInWeek The number of hours contained in the current week + * @property-read int $hoursInYear The number of hours contained in the current year + * @property-read int $microsecondsInCentury The number of microseconds contained in the current century + * @property-read int $microsecondsInDay The number of microseconds contained in the current day + * @property-read int $microsecondsInDecade The number of microseconds contained in the current decade + * @property-read int $microsecondsInHour The number of microseconds contained in the current hour + * @property-read int $microsecondsInMillennium The number of microseconds contained in the current millennium + * @property-read int $microsecondsInMillisecond The number of microseconds contained in the current millisecond + * @property-read int $microsecondsInMinute The number of microseconds contained in the current minute + * @property-read int $microsecondsInMonth The number of microseconds contained in the current month + * @property-read int $microsecondsInQuarter The number of microseconds contained in the current quarter + * @property-read int $microsecondsInSecond The number of microseconds contained in the current second + * @property-read int $microsecondsInWeek The number of microseconds contained in the current week + * @property-read int $microsecondsInYear The number of microseconds contained in the current year + * @property-read int $millisecondsInCentury The number of milliseconds contained in the current century + * @property-read int $millisecondsInDay The number of milliseconds contained in the current day + * @property-read int $millisecondsInDecade The number of milliseconds contained in the current decade + * @property-read int $millisecondsInHour The number of milliseconds contained in the current hour + * @property-read int $millisecondsInMillennium The number of milliseconds contained in the current millennium + * @property-read int $millisecondsInMinute The number of milliseconds contained in the current minute + * @property-read int $millisecondsInMonth The number of milliseconds contained in the current month + * @property-read int $millisecondsInQuarter The number of milliseconds contained in the current quarter + * @property-read int $millisecondsInSecond The number of milliseconds contained in the current second + * @property-read int $millisecondsInWeek The number of milliseconds contained in the current week + * @property-read int $millisecondsInYear The number of milliseconds contained in the current year + * @property-read int $minutesInCentury The number of minutes contained in the current century + * @property-read int $minutesInDay The number of minutes contained in the current day + * @property-read int $minutesInDecade The number of minutes contained in the current decade + * @property-read int $minutesInHour The number of minutes contained in the current hour + * @property-read int $minutesInMillennium The number of minutes contained in the current millennium + * @property-read int $minutesInMonth The number of minutes contained in the current month + * @property-read int $minutesInQuarter The number of minutes contained in the current quarter + * @property-read int $minutesInWeek The number of minutes contained in the current week + * @property-read int $minutesInYear The number of minutes contained in the current year + * @property-read int $monthsInCentury The number of months contained in the current century + * @property-read int $monthsInDecade The number of months contained in the current decade + * @property-read int $monthsInMillennium The number of months contained in the current millennium + * @property-read int $monthsInQuarter The number of months contained in the current quarter + * @property-read int $monthsInYear The number of months contained in the current year + * @property-read int $quartersInCentury The number of quarters contained in the current century + * @property-read int $quartersInDecade The number of quarters contained in the current decade + * @property-read int $quartersInMillennium The number of quarters contained in the current millennium + * @property-read int $quartersInYear The number of quarters contained in the current year + * @property-read int $secondsInCentury The number of seconds contained in the current century + * @property-read int $secondsInDay The number of seconds contained in the current day + * @property-read int $secondsInDecade The number of seconds contained in the current decade + * @property-read int $secondsInHour The number of seconds contained in the current hour + * @property-read int $secondsInMillennium The number of seconds contained in the current millennium + * @property-read int $secondsInMinute The number of seconds contained in the current minute + * @property-read int $secondsInMonth The number of seconds contained in the current month + * @property-read int $secondsInQuarter The number of seconds contained in the current quarter + * @property-read int $secondsInWeek The number of seconds contained in the current week + * @property-read int $secondsInYear The number of seconds contained in the current year + * @property-read int $weeksInCentury The number of weeks contained in the current century + * @property-read int $weeksInDecade The number of weeks contained in the current decade + * @property-read int $weeksInMillennium The number of weeks contained in the current millennium + * @property-read int $weeksInMonth The number of weeks contained in the current month + * @property-read int $weeksInQuarter The number of weeks contained in the current quarter + * @property-read int $weeksInYear 51 through 53 + * @property-read int $yearsInCentury The number of years contained in the current century + * @property-read int $yearsInDecade The number of years contained in the current decade + * @property-read int $yearsInMillennium The number of years contained in the current millennium * - * @method bool isUtc() Check if the current instance has UTC timezone. (Both isUtc and isUTC cases are valid.) - * @method bool isLocal() Check if the current instance has non-UTC timezone. - * @method bool isValid() Check if the current instance is a valid date. - * @method bool isDST() Check if the current instance is in a daylight saving time. - * @method bool isSunday() Checks if the instance day is sunday. - * @method bool isMonday() Checks if the instance day is monday. - * @method bool isTuesday() Checks if the instance day is tuesday. - * @method bool isWednesday() Checks if the instance day is wednesday. - * @method bool isThursday() Checks if the instance day is thursday. - * @method bool isFriday() Checks if the instance day is friday. - * @method bool isSaturday() Checks if the instance day is saturday. - * @method bool isSameYear(DateTimeInterface|string $date) Checks if the given date is in the same year as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentYear() Checks if the instance is in the same year as the current moment. - * @method bool isNextYear() Checks if the instance is in the same year as the current moment next year. - * @method bool isLastYear() Checks if the instance is in the same year as the current moment last year. - * @method bool isCurrentMonth() Checks if the instance is in the same month as the current moment. - * @method bool isNextMonth() Checks if the instance is in the same month as the current moment next month. - * @method bool isLastMonth() Checks if the instance is in the same month as the current moment last month. - * @method bool isSameWeek(DateTimeInterface|string $date) Checks if the given date is in the same week as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentWeek() Checks if the instance is in the same week as the current moment. - * @method bool isNextWeek() Checks if the instance is in the same week as the current moment next week. - * @method bool isLastWeek() Checks if the instance is in the same week as the current moment last week. - * @method bool isSameDay(DateTimeInterface|string $date) Checks if the given date is in the same day as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentDay() Checks if the instance is in the same day as the current moment. - * @method bool isNextDay() Checks if the instance is in the same day as the current moment next day. - * @method bool isLastDay() Checks if the instance is in the same day as the current moment last day. - * @method bool isSameHour(DateTimeInterface|string $date) Checks if the given date is in the same hour as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentHour() Checks if the instance is in the same hour as the current moment. - * @method bool isNextHour() Checks if the instance is in the same hour as the current moment next hour. - * @method bool isLastHour() Checks if the instance is in the same hour as the current moment last hour. - * @method bool isSameMinute(DateTimeInterface|string $date) Checks if the given date is in the same minute as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMinute() Checks if the instance is in the same minute as the current moment. - * @method bool isNextMinute() Checks if the instance is in the same minute as the current moment next minute. - * @method bool isLastMinute() Checks if the instance is in the same minute as the current moment last minute. - * @method bool isSameSecond(DateTimeInterface|string $date) Checks if the given date is in the same second as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentSecond() Checks if the instance is in the same second as the current moment. - * @method bool isNextSecond() Checks if the instance is in the same second as the current moment next second. - * @method bool isLastSecond() Checks if the instance is in the same second as the current moment last second. - * @method bool isSameMilli(DateTimeInterface|string $date) Checks if the given date is in the same millisecond as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMilli() Checks if the instance is in the same millisecond as the current moment. - * @method bool isNextMilli() Checks if the instance is in the same millisecond as the current moment next millisecond. - * @method bool isLastMilli() Checks if the instance is in the same millisecond as the current moment last millisecond. - * @method bool isSameMillisecond(DateTimeInterface|string $date) Checks if the given date is in the same millisecond as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMillisecond() Checks if the instance is in the same millisecond as the current moment. - * @method bool isNextMillisecond() Checks if the instance is in the same millisecond as the current moment next millisecond. - * @method bool isLastMillisecond() Checks if the instance is in the same millisecond as the current moment last millisecond. - * @method bool isSameMicro(DateTimeInterface|string $date) Checks if the given date is in the same microsecond as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMicro() Checks if the instance is in the same microsecond as the current moment. - * @method bool isNextMicro() Checks if the instance is in the same microsecond as the current moment next microsecond. - * @method bool isLastMicro() Checks if the instance is in the same microsecond as the current moment last microsecond. - * @method bool isSameMicrosecond(DateTimeInterface|string $date) Checks if the given date is in the same microsecond as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMicrosecond() Checks if the instance is in the same microsecond as the current moment. - * @method bool isNextMicrosecond() Checks if the instance is in the same microsecond as the current moment next microsecond. - * @method bool isLastMicrosecond() Checks if the instance is in the same microsecond as the current moment last microsecond. - * @method bool isSameDecade(DateTimeInterface|string $date) Checks if the given date is in the same decade as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentDecade() Checks if the instance is in the same decade as the current moment. - * @method bool isNextDecade() Checks if the instance is in the same decade as the current moment next decade. - * @method bool isLastDecade() Checks if the instance is in the same decade as the current moment last decade. - * @method bool isSameCentury(DateTimeInterface|string $date) Checks if the given date is in the same century as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentCentury() Checks if the instance is in the same century as the current moment. - * @method bool isNextCentury() Checks if the instance is in the same century as the current moment next century. - * @method bool isLastCentury() Checks if the instance is in the same century as the current moment last century. - * @method bool isSameMillennium(DateTimeInterface|string $date) Checks if the given date is in the same millennium as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMillennium() Checks if the instance is in the same millennium as the current moment. - * @method bool isNextMillennium() Checks if the instance is in the same millennium as the current moment next millennium. - * @method bool isLastMillennium() Checks if the instance is in the same millennium as the current moment last millennium. - * @method bool isCurrentQuarter() Checks if the instance is in the same quarter as the current moment. - * @method bool isNextQuarter() Checks if the instance is in the same quarter as the current moment next quarter. - * @method bool isLastQuarter() Checks if the instance is in the same quarter as the current moment last quarter. - * @method $this years(int $value) Set current instance year to the given value. - * @method $this year(int $value) Set current instance year to the given value. - * @method $this setYears(int $value) Set current instance year to the given value. - * @method $this setYear(int $value) Set current instance year to the given value. - * @method $this months(Month|int $value) Set current instance month to the given value. - * @method $this month(Month|int $value) Set current instance month to the given value. - * @method $this setMonths(Month|int $value) Set current instance month to the given value. - * @method $this setMonth(Month|int $value) Set current instance month to the given value. - * @method $this days(int $value) Set current instance day to the given value. - * @method $this day(int $value) Set current instance day to the given value. - * @method $this setDays(int $value) Set current instance day to the given value. - * @method $this setDay(int $value) Set current instance day to the given value. - * @method $this hours(int $value) Set current instance hour to the given value. - * @method $this hour(int $value) Set current instance hour to the given value. - * @method $this setHours(int $value) Set current instance hour to the given value. - * @method $this setHour(int $value) Set current instance hour to the given value. - * @method $this minutes(int $value) Set current instance minute to the given value. - * @method $this minute(int $value) Set current instance minute to the given value. - * @method $this setMinutes(int $value) Set current instance minute to the given value. - * @method $this setMinute(int $value) Set current instance minute to the given value. - * @method $this seconds(int $value) Set current instance second to the given value. - * @method $this second(int $value) Set current instance second to the given value. - * @method $this setSeconds(int $value) Set current instance second to the given value. - * @method $this setSecond(int $value) Set current instance second to the given value. - * @method $this millis(int $value) Set current instance millisecond to the given value. - * @method $this milli(int $value) Set current instance millisecond to the given value. - * @method $this setMillis(int $value) Set current instance millisecond to the given value. - * @method $this setMilli(int $value) Set current instance millisecond to the given value. - * @method $this milliseconds(int $value) Set current instance millisecond to the given value. - * @method $this millisecond(int $value) Set current instance millisecond to the given value. - * @method $this setMilliseconds(int $value) Set current instance millisecond to the given value. - * @method $this setMillisecond(int $value) Set current instance millisecond to the given value. - * @method $this micros(int $value) Set current instance microsecond to the given value. - * @method $this micro(int $value) Set current instance microsecond to the given value. - * @method $this setMicros(int $value) Set current instance microsecond to the given value. - * @method $this setMicro(int $value) Set current instance microsecond to the given value. - * @method $this microseconds(int $value) Set current instance microsecond to the given value. - * @method $this microsecond(int $value) Set current instance microsecond to the given value. - * @method $this setMicroseconds(int $value) Set current instance microsecond to the given value. - * @method self setMicrosecond(int $value) Set current instance microsecond to the given value. - * @method $this addYears(int|float $value = 1) Add years (the $value count passed in) to the instance (using date interval). - * @method $this addYear() Add one year to the instance (using date interval). - * @method $this subYears(int|float $value = 1) Sub years (the $value count passed in) to the instance (using date interval). - * @method $this subYear() Sub one year to the instance (using date interval). - * @method $this addYearsWithOverflow(int|float $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method $this addYearWithOverflow() Add one year to the instance (using date interval) with overflow explicitly allowed. - * @method $this subYearsWithOverflow(int|float $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method $this subYearWithOverflow() Sub one year to the instance (using date interval) with overflow explicitly allowed. - * @method $this addYearsWithoutOverflow(int|float $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addYearWithoutOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subYearsWithoutOverflow(int|float $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subYearWithoutOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addYearsWithNoOverflow(int|float $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addYearWithNoOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subYearsWithNoOverflow(int|float $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subYearWithNoOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addYearsNoOverflow(int|float $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addYearNoOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subYearsNoOverflow(int|float $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subYearNoOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addMonths(int|float $value = 1) Add months (the $value count passed in) to the instance (using date interval). - * @method $this addMonth() Add one month to the instance (using date interval). - * @method $this subMonths(int|float $value = 1) Sub months (the $value count passed in) to the instance (using date interval). - * @method $this subMonth() Sub one month to the instance (using date interval). - * @method $this addMonthsWithOverflow(int|float $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method $this addMonthWithOverflow() Add one month to the instance (using date interval) with overflow explicitly allowed. - * @method $this subMonthsWithOverflow(int|float $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method $this subMonthWithOverflow() Sub one month to the instance (using date interval) with overflow explicitly allowed. - * @method $this addMonthsWithoutOverflow(int|float $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addMonthWithoutOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subMonthsWithoutOverflow(int|float $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subMonthWithoutOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addMonthsWithNoOverflow(int|float $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addMonthWithNoOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subMonthsWithNoOverflow(int|float $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subMonthWithNoOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addMonthsNoOverflow(int|float $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addMonthNoOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subMonthsNoOverflow(int|float $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subMonthNoOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addDays(int|float $value = 1) Add days (the $value count passed in) to the instance (using date interval). - * @method $this addDay() Add one day to the instance (using date interval). - * @method $this subDays(int|float $value = 1) Sub days (the $value count passed in) to the instance (using date interval). - * @method $this subDay() Sub one day to the instance (using date interval). - * @method $this addHours(int|float $value = 1) Add hours (the $value count passed in) to the instance (using date interval). - * @method $this addHour() Add one hour to the instance (using date interval). - * @method $this subHours(int|float $value = 1) Sub hours (the $value count passed in) to the instance (using date interval). - * @method $this subHour() Sub one hour to the instance (using date interval). - * @method $this addMinutes(int|float $value = 1) Add minutes (the $value count passed in) to the instance (using date interval). - * @method $this addMinute() Add one minute to the instance (using date interval). - * @method $this subMinutes(int|float $value = 1) Sub minutes (the $value count passed in) to the instance (using date interval). - * @method $this subMinute() Sub one minute to the instance (using date interval). - * @method $this addSeconds(int|float $value = 1) Add seconds (the $value count passed in) to the instance (using date interval). - * @method $this addSecond() Add one second to the instance (using date interval). - * @method $this subSeconds(int|float $value = 1) Sub seconds (the $value count passed in) to the instance (using date interval). - * @method $this subSecond() Sub one second to the instance (using date interval). - * @method $this addMillis(int|float $value = 1) Add milliseconds (the $value count passed in) to the instance (using date interval). - * @method $this addMilli() Add one millisecond to the instance (using date interval). - * @method $this subMillis(int|float $value = 1) Sub milliseconds (the $value count passed in) to the instance (using date interval). - * @method $this subMilli() Sub one millisecond to the instance (using date interval). - * @method $this addMilliseconds(int|float $value = 1) Add milliseconds (the $value count passed in) to the instance (using date interval). - * @method $this addMillisecond() Add one millisecond to the instance (using date interval). - * @method $this subMilliseconds(int|float $value = 1) Sub milliseconds (the $value count passed in) to the instance (using date interval). - * @method $this subMillisecond() Sub one millisecond to the instance (using date interval). - * @method $this addMicros(int|float $value = 1) Add microseconds (the $value count passed in) to the instance (using date interval). - * @method $this addMicro() Add one microsecond to the instance (using date interval). - * @method $this subMicros(int|float $value = 1) Sub microseconds (the $value count passed in) to the instance (using date interval). - * @method $this subMicro() Sub one microsecond to the instance (using date interval). - * @method $this addMicroseconds(int|float $value = 1) Add microseconds (the $value count passed in) to the instance (using date interval). - * @method $this addMicrosecond() Add one microsecond to the instance (using date interval). - * @method $this subMicroseconds(int|float $value = 1) Sub microseconds (the $value count passed in) to the instance (using date interval). - * @method $this subMicrosecond() Sub one microsecond to the instance (using date interval). - * @method $this addMillennia(int|float $value = 1) Add millennia (the $value count passed in) to the instance (using date interval). - * @method $this addMillennium() Add one millennium to the instance (using date interval). - * @method $this subMillennia(int|float $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval). - * @method $this subMillennium() Sub one millennium to the instance (using date interval). - * @method $this addMillenniaWithOverflow(int|float $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method $this addMillenniumWithOverflow() Add one millennium to the instance (using date interval) with overflow explicitly allowed. - * @method $this subMillenniaWithOverflow(int|float $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method $this subMillenniumWithOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly allowed. - * @method $this addMillenniaWithoutOverflow(int|float $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addMillenniumWithoutOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subMillenniaWithoutOverflow(int|float $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subMillenniumWithoutOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addMillenniaWithNoOverflow(int|float $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addMillenniumWithNoOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subMillenniaWithNoOverflow(int|float $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subMillenniumWithNoOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addMillenniaNoOverflow(int|float $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addMillenniumNoOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subMillenniaNoOverflow(int|float $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subMillenniumNoOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addCenturies(int|float $value = 1) Add centuries (the $value count passed in) to the instance (using date interval). - * @method $this addCentury() Add one century to the instance (using date interval). - * @method $this subCenturies(int|float $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval). - * @method $this subCentury() Sub one century to the instance (using date interval). - * @method $this addCenturiesWithOverflow(int|float $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method $this addCenturyWithOverflow() Add one century to the instance (using date interval) with overflow explicitly allowed. - * @method $this subCenturiesWithOverflow(int|float $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method $this subCenturyWithOverflow() Sub one century to the instance (using date interval) with overflow explicitly allowed. - * @method $this addCenturiesWithoutOverflow(int|float $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addCenturyWithoutOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subCenturiesWithoutOverflow(int|float $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subCenturyWithoutOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addCenturiesWithNoOverflow(int|float $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addCenturyWithNoOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subCenturiesWithNoOverflow(int|float $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subCenturyWithNoOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addCenturiesNoOverflow(int|float $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addCenturyNoOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subCenturiesNoOverflow(int|float $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subCenturyNoOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addDecades(int|float $value = 1) Add decades (the $value count passed in) to the instance (using date interval). - * @method $this addDecade() Add one decade to the instance (using date interval). - * @method $this subDecades(int|float $value = 1) Sub decades (the $value count passed in) to the instance (using date interval). - * @method $this subDecade() Sub one decade to the instance (using date interval). - * @method $this addDecadesWithOverflow(int|float $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method $this addDecadeWithOverflow() Add one decade to the instance (using date interval) with overflow explicitly allowed. - * @method $this subDecadesWithOverflow(int|float $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method $this subDecadeWithOverflow() Sub one decade to the instance (using date interval) with overflow explicitly allowed. - * @method $this addDecadesWithoutOverflow(int|float $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addDecadeWithoutOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subDecadesWithoutOverflow(int|float $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subDecadeWithoutOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addDecadesWithNoOverflow(int|float $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addDecadeWithNoOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subDecadesWithNoOverflow(int|float $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subDecadeWithNoOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addDecadesNoOverflow(int|float $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addDecadeNoOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subDecadesNoOverflow(int|float $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subDecadeNoOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addQuarters(int|float $value = 1) Add quarters (the $value count passed in) to the instance (using date interval). - * @method $this addQuarter() Add one quarter to the instance (using date interval). - * @method $this subQuarters(int|float $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval). - * @method $this subQuarter() Sub one quarter to the instance (using date interval). - * @method $this addQuartersWithOverflow(int|float $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method $this addQuarterWithOverflow() Add one quarter to the instance (using date interval) with overflow explicitly allowed. - * @method $this subQuartersWithOverflow(int|float $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method $this subQuarterWithOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly allowed. - * @method $this addQuartersWithoutOverflow(int|float $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addQuarterWithoutOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subQuartersWithoutOverflow(int|float $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subQuarterWithoutOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addQuartersWithNoOverflow(int|float $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addQuarterWithNoOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subQuartersWithNoOverflow(int|float $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subQuarterWithNoOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addQuartersNoOverflow(int|float $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addQuarterNoOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subQuartersNoOverflow(int|float $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method $this subQuarterNoOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method $this addWeeks(int|float $value = 1) Add weeks (the $value count passed in) to the instance (using date interval). - * @method $this addWeek() Add one week to the instance (using date interval). - * @method $this subWeeks(int|float $value = 1) Sub weeks (the $value count passed in) to the instance (using date interval). - * @method $this subWeek() Sub one week to the instance (using date interval). - * @method $this addWeekdays(int|float $value = 1) Add weekdays (the $value count passed in) to the instance (using date interval). - * @method $this addWeekday() Add one weekday to the instance (using date interval). - * @method $this subWeekdays(int|float $value = 1) Sub weekdays (the $value count passed in) to the instance (using date interval). - * @method $this subWeekday() Sub one weekday to the instance (using date interval). - * @method $this addUTCMicros(int|float $value = 1) Add microseconds (the $value count passed in) to the instance (using timestamp). - * @method $this addUTCMicro() Add one microsecond to the instance (using timestamp). - * @method $this subUTCMicros(int|float $value = 1) Sub microseconds (the $value count passed in) to the instance (using timestamp). - * @method $this subUTCMicro() Sub one microsecond to the instance (using timestamp). - * @method CarbonPeriod microsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each microsecond or every X microseconds if a factor is given. - * @method float diffInUTCMicros(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of microseconds. - * @method $this addUTCMicroseconds(int|float $value = 1) Add microseconds (the $value count passed in) to the instance (using timestamp). - * @method $this addUTCMicrosecond() Add one microsecond to the instance (using timestamp). - * @method $this subUTCMicroseconds(int|float $value = 1) Sub microseconds (the $value count passed in) to the instance (using timestamp). - * @method $this subUTCMicrosecond() Sub one microsecond to the instance (using timestamp). - * @method CarbonPeriod microsecondsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each microsecond or every X microseconds if a factor is given. - * @method float diffInUTCMicroseconds(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of microseconds. - * @method $this addUTCMillis(int|float $value = 1) Add milliseconds (the $value count passed in) to the instance (using timestamp). - * @method $this addUTCMilli() Add one millisecond to the instance (using timestamp). - * @method $this subUTCMillis(int|float $value = 1) Sub milliseconds (the $value count passed in) to the instance (using timestamp). - * @method $this subUTCMilli() Sub one millisecond to the instance (using timestamp). - * @method CarbonPeriod millisUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millisecond or every X milliseconds if a factor is given. - * @method float diffInUTCMillis(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of milliseconds. - * @method $this addUTCMilliseconds(int|float $value = 1) Add milliseconds (the $value count passed in) to the instance (using timestamp). - * @method $this addUTCMillisecond() Add one millisecond to the instance (using timestamp). - * @method $this subUTCMilliseconds(int|float $value = 1) Sub milliseconds (the $value count passed in) to the instance (using timestamp). - * @method $this subUTCMillisecond() Sub one millisecond to the instance (using timestamp). - * @method CarbonPeriod millisecondsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millisecond or every X milliseconds if a factor is given. - * @method float diffInUTCMilliseconds(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of milliseconds. - * @method $this addUTCSeconds(int|float $value = 1) Add seconds (the $value count passed in) to the instance (using timestamp). - * @method $this addUTCSecond() Add one second to the instance (using timestamp). - * @method $this subUTCSeconds(int|float $value = 1) Sub seconds (the $value count passed in) to the instance (using timestamp). - * @method $this subUTCSecond() Sub one second to the instance (using timestamp). - * @method CarbonPeriod secondsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each second or every X seconds if a factor is given. - * @method float diffInUTCSeconds(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of seconds. - * @method $this addUTCMinutes(int|float $value = 1) Add minutes (the $value count passed in) to the instance (using timestamp). - * @method $this addUTCMinute() Add one minute to the instance (using timestamp). - * @method $this subUTCMinutes(int|float $value = 1) Sub minutes (the $value count passed in) to the instance (using timestamp). - * @method $this subUTCMinute() Sub one minute to the instance (using timestamp). - * @method CarbonPeriod minutesUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each minute or every X minutes if a factor is given. - * @method float diffInUTCMinutes(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of minutes. - * @method $this addUTCHours(int|float $value = 1) Add hours (the $value count passed in) to the instance (using timestamp). - * @method $this addUTCHour() Add one hour to the instance (using timestamp). - * @method $this subUTCHours(int|float $value = 1) Sub hours (the $value count passed in) to the instance (using timestamp). - * @method $this subUTCHour() Sub one hour to the instance (using timestamp). - * @method CarbonPeriod hoursUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each hour or every X hours if a factor is given. - * @method float diffInUTCHours(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of hours. - * @method $this addUTCDays(int|float $value = 1) Add days (the $value count passed in) to the instance (using timestamp). - * @method $this addUTCDay() Add one day to the instance (using timestamp). - * @method $this subUTCDays(int|float $value = 1) Sub days (the $value count passed in) to the instance (using timestamp). - * @method $this subUTCDay() Sub one day to the instance (using timestamp). - * @method CarbonPeriod daysUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each day or every X days if a factor is given. - * @method float diffInUTCDays(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of days. - * @method $this addUTCWeeks(int|float $value = 1) Add weeks (the $value count passed in) to the instance (using timestamp). - * @method $this addUTCWeek() Add one week to the instance (using timestamp). - * @method $this subUTCWeeks(int|float $value = 1) Sub weeks (the $value count passed in) to the instance (using timestamp). - * @method $this subUTCWeek() Sub one week to the instance (using timestamp). - * @method CarbonPeriod weeksUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each week or every X weeks if a factor is given. - * @method float diffInUTCWeeks(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of weeks. - * @method $this addUTCMonths(int|float $value = 1) Add months (the $value count passed in) to the instance (using timestamp). - * @method $this addUTCMonth() Add one month to the instance (using timestamp). - * @method $this subUTCMonths(int|float $value = 1) Sub months (the $value count passed in) to the instance (using timestamp). - * @method $this subUTCMonth() Sub one month to the instance (using timestamp). - * @method CarbonPeriod monthsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each month or every X months if a factor is given. - * @method float diffInUTCMonths(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of months. - * @method $this addUTCQuarters(int|float $value = 1) Add quarters (the $value count passed in) to the instance (using timestamp). - * @method $this addUTCQuarter() Add one quarter to the instance (using timestamp). - * @method $this subUTCQuarters(int|float $value = 1) Sub quarters (the $value count passed in) to the instance (using timestamp). - * @method $this subUTCQuarter() Sub one quarter to the instance (using timestamp). - * @method CarbonPeriod quartersUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each quarter or every X quarters if a factor is given. - * @method float diffInUTCQuarters(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of quarters. - * @method $this addUTCYears(int|float $value = 1) Add years (the $value count passed in) to the instance (using timestamp). - * @method $this addUTCYear() Add one year to the instance (using timestamp). - * @method $this subUTCYears(int|float $value = 1) Sub years (the $value count passed in) to the instance (using timestamp). - * @method $this subUTCYear() Sub one year to the instance (using timestamp). - * @method CarbonPeriod yearsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each year or every X years if a factor is given. - * @method float diffInUTCYears(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of years. - * @method $this addUTCDecades(int|float $value = 1) Add decades (the $value count passed in) to the instance (using timestamp). - * @method $this addUTCDecade() Add one decade to the instance (using timestamp). - * @method $this subUTCDecades(int|float $value = 1) Sub decades (the $value count passed in) to the instance (using timestamp). - * @method $this subUTCDecade() Sub one decade to the instance (using timestamp). - * @method CarbonPeriod decadesUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each decade or every X decades if a factor is given. - * @method float diffInUTCDecades(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of decades. - * @method $this addUTCCenturies(int|float $value = 1) Add centuries (the $value count passed in) to the instance (using timestamp). - * @method $this addUTCCentury() Add one century to the instance (using timestamp). - * @method $this subUTCCenturies(int|float $value = 1) Sub centuries (the $value count passed in) to the instance (using timestamp). - * @method $this subUTCCentury() Sub one century to the instance (using timestamp). - * @method CarbonPeriod centuriesUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each century or every X centuries if a factor is given. - * @method float diffInUTCCenturies(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of centuries. - * @method $this addUTCMillennia(int|float $value = 1) Add millennia (the $value count passed in) to the instance (using timestamp). - * @method $this addUTCMillennium() Add one millennium to the instance (using timestamp). - * @method $this subUTCMillennia(int|float $value = 1) Sub millennia (the $value count passed in) to the instance (using timestamp). - * @method $this subUTCMillennium() Sub one millennium to the instance (using timestamp). - * @method CarbonPeriod millenniaUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millennium or every X millennia if a factor is given. - * @method float diffInUTCMillennia(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of millennia. - * @method $this roundYear(float $precision = 1, string $function = "round") Round the current instance year with given precision using the given function. - * @method $this roundYears(float $precision = 1, string $function = "round") Round the current instance year with given precision using the given function. - * @method $this floorYear(float $precision = 1) Truncate the current instance year with given precision. - * @method $this floorYears(float $precision = 1) Truncate the current instance year with given precision. - * @method $this ceilYear(float $precision = 1) Ceil the current instance year with given precision. - * @method $this ceilYears(float $precision = 1) Ceil the current instance year with given precision. - * @method $this roundMonth(float $precision = 1, string $function = "round") Round the current instance month with given precision using the given function. - * @method $this roundMonths(float $precision = 1, string $function = "round") Round the current instance month with given precision using the given function. - * @method $this floorMonth(float $precision = 1) Truncate the current instance month with given precision. - * @method $this floorMonths(float $precision = 1) Truncate the current instance month with given precision. - * @method $this ceilMonth(float $precision = 1) Ceil the current instance month with given precision. - * @method $this ceilMonths(float $precision = 1) Ceil the current instance month with given precision. - * @method $this roundDay(float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. - * @method $this roundDays(float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. - * @method $this floorDay(float $precision = 1) Truncate the current instance day with given precision. - * @method $this floorDays(float $precision = 1) Truncate the current instance day with given precision. - * @method $this ceilDay(float $precision = 1) Ceil the current instance day with given precision. - * @method $this ceilDays(float $precision = 1) Ceil the current instance day with given precision. - * @method $this roundHour(float $precision = 1, string $function = "round") Round the current instance hour with given precision using the given function. - * @method $this roundHours(float $precision = 1, string $function = "round") Round the current instance hour with given precision using the given function. - * @method $this floorHour(float $precision = 1) Truncate the current instance hour with given precision. - * @method $this floorHours(float $precision = 1) Truncate the current instance hour with given precision. - * @method $this ceilHour(float $precision = 1) Ceil the current instance hour with given precision. - * @method $this ceilHours(float $precision = 1) Ceil the current instance hour with given precision. - * @method $this roundMinute(float $precision = 1, string $function = "round") Round the current instance minute with given precision using the given function. - * @method $this roundMinutes(float $precision = 1, string $function = "round") Round the current instance minute with given precision using the given function. - * @method $this floorMinute(float $precision = 1) Truncate the current instance minute with given precision. - * @method $this floorMinutes(float $precision = 1) Truncate the current instance minute with given precision. - * @method $this ceilMinute(float $precision = 1) Ceil the current instance minute with given precision. - * @method $this ceilMinutes(float $precision = 1) Ceil the current instance minute with given precision. - * @method $this roundSecond(float $precision = 1, string $function = "round") Round the current instance second with given precision using the given function. - * @method $this roundSeconds(float $precision = 1, string $function = "round") Round the current instance second with given precision using the given function. - * @method $this floorSecond(float $precision = 1) Truncate the current instance second with given precision. - * @method $this floorSeconds(float $precision = 1) Truncate the current instance second with given precision. - * @method $this ceilSecond(float $precision = 1) Ceil the current instance second with given precision. - * @method $this ceilSeconds(float $precision = 1) Ceil the current instance second with given precision. - * @method $this roundMillennium(float $precision = 1, string $function = "round") Round the current instance millennium with given precision using the given function. - * @method $this roundMillennia(float $precision = 1, string $function = "round") Round the current instance millennium with given precision using the given function. - * @method $this floorMillennium(float $precision = 1) Truncate the current instance millennium with given precision. - * @method $this floorMillennia(float $precision = 1) Truncate the current instance millennium with given precision. - * @method $this ceilMillennium(float $precision = 1) Ceil the current instance millennium with given precision. - * @method $this ceilMillennia(float $precision = 1) Ceil the current instance millennium with given precision. - * @method $this roundCentury(float $precision = 1, string $function = "round") Round the current instance century with given precision using the given function. - * @method $this roundCenturies(float $precision = 1, string $function = "round") Round the current instance century with given precision using the given function. - * @method $this floorCentury(float $precision = 1) Truncate the current instance century with given precision. - * @method $this floorCenturies(float $precision = 1) Truncate the current instance century with given precision. - * @method $this ceilCentury(float $precision = 1) Ceil the current instance century with given precision. - * @method $this ceilCenturies(float $precision = 1) Ceil the current instance century with given precision. - * @method $this roundDecade(float $precision = 1, string $function = "round") Round the current instance decade with given precision using the given function. - * @method $this roundDecades(float $precision = 1, string $function = "round") Round the current instance decade with given precision using the given function. - * @method $this floorDecade(float $precision = 1) Truncate the current instance decade with given precision. - * @method $this floorDecades(float $precision = 1) Truncate the current instance decade with given precision. - * @method $this ceilDecade(float $precision = 1) Ceil the current instance decade with given precision. - * @method $this ceilDecades(float $precision = 1) Ceil the current instance decade with given precision. - * @method $this roundQuarter(float $precision = 1, string $function = "round") Round the current instance quarter with given precision using the given function. - * @method $this roundQuarters(float $precision = 1, string $function = "round") Round the current instance quarter with given precision using the given function. - * @method $this floorQuarter(float $precision = 1) Truncate the current instance quarter with given precision. - * @method $this floorQuarters(float $precision = 1) Truncate the current instance quarter with given precision. - * @method $this ceilQuarter(float $precision = 1) Ceil the current instance quarter with given precision. - * @method $this ceilQuarters(float $precision = 1) Ceil the current instance quarter with given precision. - * @method $this roundMillisecond(float $precision = 1, string $function = "round") Round the current instance millisecond with given precision using the given function. - * @method $this roundMilliseconds(float $precision = 1, string $function = "round") Round the current instance millisecond with given precision using the given function. - * @method $this floorMillisecond(float $precision = 1) Truncate the current instance millisecond with given precision. - * @method $this floorMilliseconds(float $precision = 1) Truncate the current instance millisecond with given precision. - * @method $this ceilMillisecond(float $precision = 1) Ceil the current instance millisecond with given precision. - * @method $this ceilMilliseconds(float $precision = 1) Ceil the current instance millisecond with given precision. - * @method $this roundMicrosecond(float $precision = 1, string $function = "round") Round the current instance microsecond with given precision using the given function. - * @method $this roundMicroseconds(float $precision = 1, string $function = "round") Round the current instance microsecond with given precision using the given function. - * @method $this floorMicrosecond(float $precision = 1) Truncate the current instance microsecond with given precision. - * @method $this floorMicroseconds(float $precision = 1) Truncate the current instance microsecond with given precision. - * @method $this ceilMicrosecond(float $precision = 1) Ceil the current instance microsecond with given precision. - * @method $this ceilMicroseconds(float $precision = 1) Ceil the current instance microsecond with given precision. - * @method string shortAbsoluteDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'Absolute' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string longAbsoluteDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'Absolute' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string shortRelativeDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'Relative' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string longRelativeDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'Relative' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string shortRelativeToNowDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'RelativeToNow' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string longRelativeToNowDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'RelativeToNow' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string shortRelativeToOtherDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'RelativeToOther' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string longRelativeToOtherDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'RelativeToOther' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method int centuriesInMillennium() Return the number of centuries contained in the current millennium - * @method int|static centuryOfMillennium(?int $century = null) Return the value of the century starting from the beginning of the current millennium when called with no parameters, change the current century when called with an integer value - * @method int|static dayOfCentury(?int $day = null) Return the value of the day starting from the beginning of the current century when called with no parameters, change the current day when called with an integer value - * @method int|static dayOfDecade(?int $day = null) Return the value of the day starting from the beginning of the current decade when called with no parameters, change the current day when called with an integer value - * @method int|static dayOfMillennium(?int $day = null) Return the value of the day starting from the beginning of the current millennium when called with no parameters, change the current day when called with an integer value - * @method int|static dayOfMonth(?int $day = null) Return the value of the day starting from the beginning of the current month when called with no parameters, change the current day when called with an integer value - * @method int|static dayOfQuarter(?int $day = null) Return the value of the day starting from the beginning of the current quarter when called with no parameters, change the current day when called with an integer value - * @method int|static dayOfWeek(?int $day = null) Return the value of the day starting from the beginning of the current week when called with no parameters, change the current day when called with an integer value - * @method int daysInCentury() Return the number of days contained in the current century - * @method int daysInDecade() Return the number of days contained in the current decade - * @method int daysInMillennium() Return the number of days contained in the current millennium - * @method int daysInMonth() Return the number of days contained in the current month - * @method int daysInQuarter() Return the number of days contained in the current quarter - * @method int daysInWeek() Return the number of days contained in the current week - * @method int daysInYear() Return the number of days contained in the current year - * @method int|static decadeOfCentury(?int $decade = null) Return the value of the decade starting from the beginning of the current century when called with no parameters, change the current decade when called with an integer value - * @method int|static decadeOfMillennium(?int $decade = null) Return the value of the decade starting from the beginning of the current millennium when called with no parameters, change the current decade when called with an integer value - * @method int decadesInCentury() Return the number of decades contained in the current century - * @method int decadesInMillennium() Return the number of decades contained in the current millennium - * @method int|static hourOfCentury(?int $hour = null) Return the value of the hour starting from the beginning of the current century when called with no parameters, change the current hour when called with an integer value - * @method int|static hourOfDay(?int $hour = null) Return the value of the hour starting from the beginning of the current day when called with no parameters, change the current hour when called with an integer value - * @method int|static hourOfDecade(?int $hour = null) Return the value of the hour starting from the beginning of the current decade when called with no parameters, change the current hour when called with an integer value - * @method int|static hourOfMillennium(?int $hour = null) Return the value of the hour starting from the beginning of the current millennium when called with no parameters, change the current hour when called with an integer value - * @method int|static hourOfMonth(?int $hour = null) Return the value of the hour starting from the beginning of the current month when called with no parameters, change the current hour when called with an integer value - * @method int|static hourOfQuarter(?int $hour = null) Return the value of the hour starting from the beginning of the current quarter when called with no parameters, change the current hour when called with an integer value - * @method int|static hourOfWeek(?int $hour = null) Return the value of the hour starting from the beginning of the current week when called with no parameters, change the current hour when called with an integer value - * @method int|static hourOfYear(?int $hour = null) Return the value of the hour starting from the beginning of the current year when called with no parameters, change the current hour when called with an integer value - * @method int hoursInCentury() Return the number of hours contained in the current century - * @method int hoursInDay() Return the number of hours contained in the current day - * @method int hoursInDecade() Return the number of hours contained in the current decade - * @method int hoursInMillennium() Return the number of hours contained in the current millennium - * @method int hoursInMonth() Return the number of hours contained in the current month - * @method int hoursInQuarter() Return the number of hours contained in the current quarter - * @method int hoursInWeek() Return the number of hours contained in the current week - * @method int hoursInYear() Return the number of hours contained in the current year - * @method int|static microsecondOfCentury(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current century when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfDay(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current day when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfDecade(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current decade when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfHour(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current hour when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfMillennium(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current millennium when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfMillisecond(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current millisecond when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfMinute(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current minute when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfMonth(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current month when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfQuarter(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current quarter when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfSecond(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current second when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfWeek(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current week when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfYear(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current year when called with no parameters, change the current microsecond when called with an integer value - * @method int microsecondsInCentury() Return the number of microseconds contained in the current century - * @method int microsecondsInDay() Return the number of microseconds contained in the current day - * @method int microsecondsInDecade() Return the number of microseconds contained in the current decade - * @method int microsecondsInHour() Return the number of microseconds contained in the current hour - * @method int microsecondsInMillennium() Return the number of microseconds contained in the current millennium - * @method int microsecondsInMillisecond() Return the number of microseconds contained in the current millisecond - * @method int microsecondsInMinute() Return the number of microseconds contained in the current minute - * @method int microsecondsInMonth() Return the number of microseconds contained in the current month - * @method int microsecondsInQuarter() Return the number of microseconds contained in the current quarter - * @method int microsecondsInSecond() Return the number of microseconds contained in the current second - * @method int microsecondsInWeek() Return the number of microseconds contained in the current week - * @method int microsecondsInYear() Return the number of microseconds contained in the current year - * @method int|static millisecondOfCentury(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current century when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfDay(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current day when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfDecade(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current decade when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfHour(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current hour when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfMillennium(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current millennium when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfMinute(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current minute when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfMonth(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current month when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfQuarter(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current quarter when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfSecond(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current second when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfWeek(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current week when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfYear(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current year when called with no parameters, change the current millisecond when called with an integer value - * @method int millisecondsInCentury() Return the number of milliseconds contained in the current century - * @method int millisecondsInDay() Return the number of milliseconds contained in the current day - * @method int millisecondsInDecade() Return the number of milliseconds contained in the current decade - * @method int millisecondsInHour() Return the number of milliseconds contained in the current hour - * @method int millisecondsInMillennium() Return the number of milliseconds contained in the current millennium - * @method int millisecondsInMinute() Return the number of milliseconds contained in the current minute - * @method int millisecondsInMonth() Return the number of milliseconds contained in the current month - * @method int millisecondsInQuarter() Return the number of milliseconds contained in the current quarter - * @method int millisecondsInSecond() Return the number of milliseconds contained in the current second - * @method int millisecondsInWeek() Return the number of milliseconds contained in the current week - * @method int millisecondsInYear() Return the number of milliseconds contained in the current year - * @method int|static minuteOfCentury(?int $minute = null) Return the value of the minute starting from the beginning of the current century when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfDay(?int $minute = null) Return the value of the minute starting from the beginning of the current day when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfDecade(?int $minute = null) Return the value of the minute starting from the beginning of the current decade when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfHour(?int $minute = null) Return the value of the minute starting from the beginning of the current hour when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfMillennium(?int $minute = null) Return the value of the minute starting from the beginning of the current millennium when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfMonth(?int $minute = null) Return the value of the minute starting from the beginning of the current month when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfQuarter(?int $minute = null) Return the value of the minute starting from the beginning of the current quarter when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfWeek(?int $minute = null) Return the value of the minute starting from the beginning of the current week when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfYear(?int $minute = null) Return the value of the minute starting from the beginning of the current year when called with no parameters, change the current minute when called with an integer value - * @method int minutesInCentury() Return the number of minutes contained in the current century - * @method int minutesInDay() Return the number of minutes contained in the current day - * @method int minutesInDecade() Return the number of minutes contained in the current decade - * @method int minutesInHour() Return the number of minutes contained in the current hour - * @method int minutesInMillennium() Return the number of minutes contained in the current millennium - * @method int minutesInMonth() Return the number of minutes contained in the current month - * @method int minutesInQuarter() Return the number of minutes contained in the current quarter - * @method int minutesInWeek() Return the number of minutes contained in the current week - * @method int minutesInYear() Return the number of minutes contained in the current year - * @method int|static monthOfCentury(?int $month = null) Return the value of the month starting from the beginning of the current century when called with no parameters, change the current month when called with an integer value - * @method int|static monthOfDecade(?int $month = null) Return the value of the month starting from the beginning of the current decade when called with no parameters, change the current month when called with an integer value - * @method int|static monthOfMillennium(?int $month = null) Return the value of the month starting from the beginning of the current millennium when called with no parameters, change the current month when called with an integer value - * @method int|static monthOfQuarter(?int $month = null) Return the value of the month starting from the beginning of the current quarter when called with no parameters, change the current month when called with an integer value - * @method int|static monthOfYear(?int $month = null) Return the value of the month starting from the beginning of the current year when called with no parameters, change the current month when called with an integer value - * @method int monthsInCentury() Return the number of months contained in the current century - * @method int monthsInDecade() Return the number of months contained in the current decade - * @method int monthsInMillennium() Return the number of months contained in the current millennium - * @method int monthsInQuarter() Return the number of months contained in the current quarter - * @method int monthsInYear() Return the number of months contained in the current year - * @method int|static quarterOfCentury(?int $quarter = null) Return the value of the quarter starting from the beginning of the current century when called with no parameters, change the current quarter when called with an integer value - * @method int|static quarterOfDecade(?int $quarter = null) Return the value of the quarter starting from the beginning of the current decade when called with no parameters, change the current quarter when called with an integer value - * @method int|static quarterOfMillennium(?int $quarter = null) Return the value of the quarter starting from the beginning of the current millennium when called with no parameters, change the current quarter when called with an integer value - * @method int|static quarterOfYear(?int $quarter = null) Return the value of the quarter starting from the beginning of the current year when called with no parameters, change the current quarter when called with an integer value - * @method int quartersInCentury() Return the number of quarters contained in the current century - * @method int quartersInDecade() Return the number of quarters contained in the current decade - * @method int quartersInMillennium() Return the number of quarters contained in the current millennium - * @method int quartersInYear() Return the number of quarters contained in the current year - * @method int|static secondOfCentury(?int $second = null) Return the value of the second starting from the beginning of the current century when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfDay(?int $second = null) Return the value of the second starting from the beginning of the current day when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfDecade(?int $second = null) Return the value of the second starting from the beginning of the current decade when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfHour(?int $second = null) Return the value of the second starting from the beginning of the current hour when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfMillennium(?int $second = null) Return the value of the second starting from the beginning of the current millennium when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfMinute(?int $second = null) Return the value of the second starting from the beginning of the current minute when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfMonth(?int $second = null) Return the value of the second starting from the beginning of the current month when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfQuarter(?int $second = null) Return the value of the second starting from the beginning of the current quarter when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfWeek(?int $second = null) Return the value of the second starting from the beginning of the current week when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfYear(?int $second = null) Return the value of the second starting from the beginning of the current year when called with no parameters, change the current second when called with an integer value - * @method int secondsInCentury() Return the number of seconds contained in the current century - * @method int secondsInDay() Return the number of seconds contained in the current day - * @method int secondsInDecade() Return the number of seconds contained in the current decade - * @method int secondsInHour() Return the number of seconds contained in the current hour - * @method int secondsInMillennium() Return the number of seconds contained in the current millennium - * @method int secondsInMinute() Return the number of seconds contained in the current minute - * @method int secondsInMonth() Return the number of seconds contained in the current month - * @method int secondsInQuarter() Return the number of seconds contained in the current quarter - * @method int secondsInWeek() Return the number of seconds contained in the current week - * @method int secondsInYear() Return the number of seconds contained in the current year - * @method int|static weekOfCentury(?int $week = null) Return the value of the week starting from the beginning of the current century when called with no parameters, change the current week when called with an integer value - * @method int|static weekOfDecade(?int $week = null) Return the value of the week starting from the beginning of the current decade when called with no parameters, change the current week when called with an integer value - * @method int|static weekOfMillennium(?int $week = null) Return the value of the week starting from the beginning of the current millennium when called with no parameters, change the current week when called with an integer value - * @method int|static weekOfMonth(?int $week = null) Return the value of the week starting from the beginning of the current month when called with no parameters, change the current week when called with an integer value - * @method int|static weekOfQuarter(?int $week = null) Return the value of the week starting from the beginning of the current quarter when called with no parameters, change the current week when called with an integer value - * @method int|static weekOfYear(?int $week = null) Return the value of the week starting from the beginning of the current year when called with no parameters, change the current week when called with an integer value - * @method int weeksInCentury() Return the number of weeks contained in the current century - * @method int weeksInDecade() Return the number of weeks contained in the current decade - * @method int weeksInMillennium() Return the number of weeks contained in the current millennium - * @method int weeksInMonth() Return the number of weeks contained in the current month - * @method int weeksInQuarter() Return the number of weeks contained in the current quarter - * @method int|static yearOfCentury(?int $year = null) Return the value of the year starting from the beginning of the current century when called with no parameters, change the current year when called with an integer value - * @method int|static yearOfDecade(?int $year = null) Return the value of the year starting from the beginning of the current decade when called with no parameters, change the current year when called with an integer value - * @method int|static yearOfMillennium(?int $year = null) Return the value of the year starting from the beginning of the current millennium when called with no parameters, change the current year when called with an integer value - * @method int yearsInCentury() Return the number of years contained in the current century - * @method int yearsInDecade() Return the number of years contained in the current decade - * @method int yearsInMillennium() Return the number of years contained in the current millennium + * @method bool isUtc() Check if the current instance has UTC timezone. (Both isUtc and isUTC cases are valid.) + * @method bool isLocal() Check if the current instance has non-UTC timezone. + * @method bool isValid() Check if the current instance is a valid date. + * @method bool isDST() Check if the current instance is in a daylight saving time. + * @method bool isSunday() Checks if the instance day is sunday. + * @method bool isMonday() Checks if the instance day is monday. + * @method bool isTuesday() Checks if the instance day is tuesday. + * @method bool isWednesday() Checks if the instance day is wednesday. + * @method bool isThursday() Checks if the instance day is thursday. + * @method bool isFriday() Checks if the instance day is friday. + * @method bool isSaturday() Checks if the instance day is saturday. + * @method bool isSameYear(DateTimeInterface|string $date) Checks if the given date is in the same year as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentYear() Checks if the instance is in the same year as the current moment. + * @method bool isNextYear() Checks if the instance is in the same year as the current moment next year. + * @method bool isLastYear() Checks if the instance is in the same year as the current moment last year. + * @method bool isCurrentMonth() Checks if the instance is in the same month as the current moment. + * @method bool isNextMonth() Checks if the instance is in the same month as the current moment next month. + * @method bool isLastMonth() Checks if the instance is in the same month as the current moment last month. + * @method bool isSameWeek(DateTimeInterface|string $date) Checks if the given date is in the same week as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentWeek() Checks if the instance is in the same week as the current moment. + * @method bool isNextWeek() Checks if the instance is in the same week as the current moment next week. + * @method bool isLastWeek() Checks if the instance is in the same week as the current moment last week. + * @method bool isSameDay(DateTimeInterface|string $date) Checks if the given date is in the same day as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentDay() Checks if the instance is in the same day as the current moment. + * @method bool isNextDay() Checks if the instance is in the same day as the current moment next day. + * @method bool isLastDay() Checks if the instance is in the same day as the current moment last day. + * @method bool isSameHour(DateTimeInterface|string $date) Checks if the given date is in the same hour as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentHour() Checks if the instance is in the same hour as the current moment. + * @method bool isNextHour() Checks if the instance is in the same hour as the current moment next hour. + * @method bool isLastHour() Checks if the instance is in the same hour as the current moment last hour. + * @method bool isSameMinute(DateTimeInterface|string $date) Checks if the given date is in the same minute as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentMinute() Checks if the instance is in the same minute as the current moment. + * @method bool isNextMinute() Checks if the instance is in the same minute as the current moment next minute. + * @method bool isLastMinute() Checks if the instance is in the same minute as the current moment last minute. + * @method bool isSameSecond(DateTimeInterface|string $date) Checks if the given date is in the same second as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentSecond() Checks if the instance is in the same second as the current moment. + * @method bool isNextSecond() Checks if the instance is in the same second as the current moment next second. + * @method bool isLastSecond() Checks if the instance is in the same second as the current moment last second. + * @method bool isSameMilli(DateTimeInterface|string $date) Checks if the given date is in the same millisecond as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentMilli() Checks if the instance is in the same millisecond as the current moment. + * @method bool isNextMilli() Checks if the instance is in the same millisecond as the current moment next millisecond. + * @method bool isLastMilli() Checks if the instance is in the same millisecond as the current moment last millisecond. + * @method bool isSameMillisecond(DateTimeInterface|string $date) Checks if the given date is in the same millisecond as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentMillisecond() Checks if the instance is in the same millisecond as the current moment. + * @method bool isNextMillisecond() Checks if the instance is in the same millisecond as the current moment next millisecond. + * @method bool isLastMillisecond() Checks if the instance is in the same millisecond as the current moment last millisecond. + * @method bool isSameMicro(DateTimeInterface|string $date) Checks if the given date is in the same microsecond as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentMicro() Checks if the instance is in the same microsecond as the current moment. + * @method bool isNextMicro() Checks if the instance is in the same microsecond as the current moment next microsecond. + * @method bool isLastMicro() Checks if the instance is in the same microsecond as the current moment last microsecond. + * @method bool isSameMicrosecond(DateTimeInterface|string $date) Checks if the given date is in the same microsecond as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentMicrosecond() Checks if the instance is in the same microsecond as the current moment. + * @method bool isNextMicrosecond() Checks if the instance is in the same microsecond as the current moment next microsecond. + * @method bool isLastMicrosecond() Checks if the instance is in the same microsecond as the current moment last microsecond. + * @method bool isSameDecade(DateTimeInterface|string $date) Checks if the given date is in the same decade as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentDecade() Checks if the instance is in the same decade as the current moment. + * @method bool isNextDecade() Checks if the instance is in the same decade as the current moment next decade. + * @method bool isLastDecade() Checks if the instance is in the same decade as the current moment last decade. + * @method bool isSameCentury(DateTimeInterface|string $date) Checks if the given date is in the same century as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentCentury() Checks if the instance is in the same century as the current moment. + * @method bool isNextCentury() Checks if the instance is in the same century as the current moment next century. + * @method bool isLastCentury() Checks if the instance is in the same century as the current moment last century. + * @method bool isSameMillennium(DateTimeInterface|string $date) Checks if the given date is in the same millennium as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentMillennium() Checks if the instance is in the same millennium as the current moment. + * @method bool isNextMillennium() Checks if the instance is in the same millennium as the current moment next millennium. + * @method bool isLastMillennium() Checks if the instance is in the same millennium as the current moment last millennium. + * @method bool isCurrentQuarter() Checks if the instance is in the same quarter as the current moment. + * @method bool isNextQuarter() Checks if the instance is in the same quarter as the current moment next quarter. + * @method bool isLastQuarter() Checks if the instance is in the same quarter as the current moment last quarter. + * @method $this years(int $value, OverflowMode|bool|null $overflow = null, ?int $anchorDay = null) Set current instance year to the given value. + * @method $this year(int $value, OverflowMode|bool|null $overflow = null, ?int $anchorDay = null) Set current instance year to the given value. + * @method $this setYears(int $value, OverflowMode|bool|null $overflow = null, ?int $anchorDay = null) Set current instance year to the given value. + * @method $this setYear(int $value, OverflowMode|bool|null $overflow = null, ?int $anchorDay = null) Set current instance year to the given value. + * @method $this months(Month|int $value, OverflowMode|bool|null $overflow = null, ?int $anchorDay = null) Set current instance month to the given value. + * @method $this month(Month|int $value, OverflowMode|bool|null $overflow = null, ?int $anchorDay = null) Set current instance month to the given value. + * @method $this setMonths(Month|int $value, OverflowMode|bool|null $overflow = null, ?int $anchorDay = null) Set current instance month to the given value. + * @method $this setMonth(Month|int $value, OverflowMode|bool|null $overflow = null, ?int $anchorDay = null) Set current instance month to the given value. + * @method $this days(int $value) Set current instance day to the given value. + * @method $this day(int $value) Set current instance day to the given value. + * @method $this setDays(int $value) Set current instance day to the given value. + * @method $this setDay(int $value) Set current instance day to the given value. + * @method $this hours(int $value) Set current instance hour to the given value. + * @method $this hour(int $value) Set current instance hour to the given value. + * @method $this setHours(int $value) Set current instance hour to the given value. + * @method $this setHour(int $value) Set current instance hour to the given value. + * @method $this minutes(int $value) Set current instance minute to the given value. + * @method $this minute(int $value) Set current instance minute to the given value. + * @method $this setMinutes(int $value) Set current instance minute to the given value. + * @method $this setMinute(int $value) Set current instance minute to the given value. + * @method $this seconds(int $value) Set current instance second to the given value. + * @method $this second(int $value) Set current instance second to the given value. + * @method $this setSeconds(int $value) Set current instance second to the given value. + * @method $this setSecond(int $value) Set current instance second to the given value. + * @method $this millis(int $value) Set current instance millisecond to the given value. + * @method $this milli(int $value) Set current instance millisecond to the given value. + * @method $this setMillis(int $value) Set current instance millisecond to the given value. + * @method $this setMilli(int $value) Set current instance millisecond to the given value. + * @method $this milliseconds(int $value) Set current instance millisecond to the given value. + * @method $this millisecond(int $value) Set current instance millisecond to the given value. + * @method $this setMilliseconds(int $value) Set current instance millisecond to the given value. + * @method $this setMillisecond(int $value) Set current instance millisecond to the given value. + * @method $this micros(int $value) Set current instance microsecond to the given value. + * @method $this micro(int $value) Set current instance microsecond to the given value. + * @method $this setMicros(int $value) Set current instance microsecond to the given value. + * @method $this setMicro(int $value) Set current instance microsecond to the given value. + * @method $this microseconds(int $value) Set current instance microsecond to the given value. + * @method $this microsecond(int $value) Set current instance microsecond to the given value. + * @method $this setMicroseconds(int $value) Set current instance microsecond to the given value. + * @method self setMicrosecond(int $value) Set current instance microsecond to the given value. + * @method $this addYears(int|float $value = 1, ?int $anchorDay = null) Add years (the $value count passed in) to the instance (using date interval). + * @method $this addYear() Add one year to the instance (using date interval). + * @method $this subYears(int|float $value = 1, ?int $anchorDay = null) Sub years (the $value count passed in) to the instance (using date interval). + * @method $this subYear() Sub one year to the instance (using date interval). + * @method $this addYearsWithOverflow(int|float $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method $this addYearWithOverflow() Add one year to the instance (using date interval) with overflow explicitly allowed. + * @method $this subYearsWithOverflow(int|float $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method $this subYearWithOverflow() Sub one year to the instance (using date interval) with overflow explicitly allowed. + * @method $this addYearsWithoutOverflow(int|float $value = 1, ?int $anchorDay = null) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addYearWithoutOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subYearsWithoutOverflow(int|float $value = 1, ?int $anchorDay = null) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subYearWithoutOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addYearsWithNoOverflow(int|float $value = 1, ?int $anchorDay = null) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addYearWithNoOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subYearsWithNoOverflow(int|float $value = 1, ?int $anchorDay = null) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subYearWithNoOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addYearsNoOverflow(int|float $value = 1, ?int $anchorDay = null) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addYearNoOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subYearsNoOverflow(int|float $value = 1, ?int $anchorDay = null) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subYearNoOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addMonths(int|float $value = 1, ?int $anchorDay = null) Add months (the $value count passed in) to the instance (using date interval). + * @method $this addMonth() Add one month to the instance (using date interval). + * @method $this subMonths(int|float $value = 1, ?int $anchorDay = null) Sub months (the $value count passed in) to the instance (using date interval). + * @method $this subMonth() Sub one month to the instance (using date interval). + * @method $this addMonthsWithOverflow(int|float $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method $this addMonthWithOverflow() Add one month to the instance (using date interval) with overflow explicitly allowed. + * @method $this subMonthsWithOverflow(int|float $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method $this subMonthWithOverflow() Sub one month to the instance (using date interval) with overflow explicitly allowed. + * @method $this addMonthsWithoutOverflow(int|float $value = 1, ?int $anchorDay = null) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addMonthWithoutOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subMonthsWithoutOverflow(int|float $value = 1, ?int $anchorDay = null) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subMonthWithoutOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addMonthsWithNoOverflow(int|float $value = 1, ?int $anchorDay = null) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addMonthWithNoOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subMonthsWithNoOverflow(int|float $value = 1, ?int $anchorDay = null) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subMonthWithNoOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addMonthsNoOverflow(int|float $value = 1, ?int $anchorDay = null) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addMonthNoOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subMonthsNoOverflow(int|float $value = 1, ?int $anchorDay = null) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subMonthNoOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addDays(int|float $value = 1) Add days (the $value count passed in) to the instance (using date interval). + * @method $this addDay() Add one day to the instance (using date interval). + * @method $this subDays(int|float $value = 1) Sub days (the $value count passed in) to the instance (using date interval). + * @method $this subDay() Sub one day to the instance (using date interval). + * @method $this addHours(int|float $value = 1) Add hours (the $value count passed in) to the instance (using date interval). + * @method $this addHour() Add one hour to the instance (using date interval). + * @method $this subHours(int|float $value = 1) Sub hours (the $value count passed in) to the instance (using date interval). + * @method $this subHour() Sub one hour to the instance (using date interval). + * @method $this addMinutes(int|float $value = 1) Add minutes (the $value count passed in) to the instance (using date interval). + * @method $this addMinute() Add one minute to the instance (using date interval). + * @method $this subMinutes(int|float $value = 1) Sub minutes (the $value count passed in) to the instance (using date interval). + * @method $this subMinute() Sub one minute to the instance (using date interval). + * @method $this addSeconds(int|float $value = 1) Add seconds (the $value count passed in) to the instance (using date interval). + * @method $this addSecond() Add one second to the instance (using date interval). + * @method $this subSeconds(int|float $value = 1) Sub seconds (the $value count passed in) to the instance (using date interval). + * @method $this subSecond() Sub one second to the instance (using date interval). + * @method $this addMillis(int|float $value = 1) Add milliseconds (the $value count passed in) to the instance (using date interval). + * @method $this addMilli() Add one millisecond to the instance (using date interval). + * @method $this subMillis(int|float $value = 1) Sub milliseconds (the $value count passed in) to the instance (using date interval). + * @method $this subMilli() Sub one millisecond to the instance (using date interval). + * @method $this addMilliseconds(int|float $value = 1) Add milliseconds (the $value count passed in) to the instance (using date interval). + * @method $this addMillisecond() Add one millisecond to the instance (using date interval). + * @method $this subMilliseconds(int|float $value = 1) Sub milliseconds (the $value count passed in) to the instance (using date interval). + * @method $this subMillisecond() Sub one millisecond to the instance (using date interval). + * @method $this addMicros(int|float $value = 1) Add microseconds (the $value count passed in) to the instance (using date interval). + * @method $this addMicro() Add one microsecond to the instance (using date interval). + * @method $this subMicros(int|float $value = 1) Sub microseconds (the $value count passed in) to the instance (using date interval). + * @method $this subMicro() Sub one microsecond to the instance (using date interval). + * @method $this addMicroseconds(int|float $value = 1) Add microseconds (the $value count passed in) to the instance (using date interval). + * @method $this addMicrosecond() Add one microsecond to the instance (using date interval). + * @method $this subMicroseconds(int|float $value = 1) Sub microseconds (the $value count passed in) to the instance (using date interval). + * @method $this subMicrosecond() Sub one microsecond to the instance (using date interval). + * @method $this addMillennia(int|float $value = 1, ?int $anchorDay = null) Add millennia (the $value count passed in) to the instance (using date interval). + * @method $this addMillennium() Add one millennium to the instance (using date interval). + * @method $this subMillennia(int|float $value = 1, ?int $anchorDay = null) Sub millennia (the $value count passed in) to the instance (using date interval). + * @method $this subMillennium() Sub one millennium to the instance (using date interval). + * @method $this addMillenniaWithOverflow(int|float $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method $this addMillenniumWithOverflow() Add one millennium to the instance (using date interval) with overflow explicitly allowed. + * @method $this subMillenniaWithOverflow(int|float $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method $this subMillenniumWithOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly allowed. + * @method $this addMillenniaWithoutOverflow(int|float $value = 1, ?int $anchorDay = null) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addMillenniumWithoutOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subMillenniaWithoutOverflow(int|float $value = 1, ?int $anchorDay = null) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subMillenniumWithoutOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addMillenniaWithNoOverflow(int|float $value = 1, ?int $anchorDay = null) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addMillenniumWithNoOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subMillenniaWithNoOverflow(int|float $value = 1, ?int $anchorDay = null) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subMillenniumWithNoOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addMillenniaNoOverflow(int|float $value = 1, ?int $anchorDay = null) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addMillenniumNoOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subMillenniaNoOverflow(int|float $value = 1, ?int $anchorDay = null) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subMillenniumNoOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addCenturies(int|float $value = 1, ?int $anchorDay = null) Add centuries (the $value count passed in) to the instance (using date interval). + * @method $this addCentury() Add one century to the instance (using date interval). + * @method $this subCenturies(int|float $value = 1, ?int $anchorDay = null) Sub centuries (the $value count passed in) to the instance (using date interval). + * @method $this subCentury() Sub one century to the instance (using date interval). + * @method $this addCenturiesWithOverflow(int|float $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method $this addCenturyWithOverflow() Add one century to the instance (using date interval) with overflow explicitly allowed. + * @method $this subCenturiesWithOverflow(int|float $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method $this subCenturyWithOverflow() Sub one century to the instance (using date interval) with overflow explicitly allowed. + * @method $this addCenturiesWithoutOverflow(int|float $value = 1, ?int $anchorDay = null) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addCenturyWithoutOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subCenturiesWithoutOverflow(int|float $value = 1, ?int $anchorDay = null) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subCenturyWithoutOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addCenturiesWithNoOverflow(int|float $value = 1, ?int $anchorDay = null) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addCenturyWithNoOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subCenturiesWithNoOverflow(int|float $value = 1, ?int $anchorDay = null) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subCenturyWithNoOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addCenturiesNoOverflow(int|float $value = 1, ?int $anchorDay = null) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addCenturyNoOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subCenturiesNoOverflow(int|float $value = 1, ?int $anchorDay = null) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subCenturyNoOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addDecades(int|float $value = 1, ?int $anchorDay = null) Add decades (the $value count passed in) to the instance (using date interval). + * @method $this addDecade() Add one decade to the instance (using date interval). + * @method $this subDecades(int|float $value = 1, ?int $anchorDay = null) Sub decades (the $value count passed in) to the instance (using date interval). + * @method $this subDecade() Sub one decade to the instance (using date interval). + * @method $this addDecadesWithOverflow(int|float $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method $this addDecadeWithOverflow() Add one decade to the instance (using date interval) with overflow explicitly allowed. + * @method $this subDecadesWithOverflow(int|float $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method $this subDecadeWithOverflow() Sub one decade to the instance (using date interval) with overflow explicitly allowed. + * @method $this addDecadesWithoutOverflow(int|float $value = 1, ?int $anchorDay = null) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addDecadeWithoutOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subDecadesWithoutOverflow(int|float $value = 1, ?int $anchorDay = null) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subDecadeWithoutOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addDecadesWithNoOverflow(int|float $value = 1, ?int $anchorDay = null) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addDecadeWithNoOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subDecadesWithNoOverflow(int|float $value = 1, ?int $anchorDay = null) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subDecadeWithNoOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addDecadesNoOverflow(int|float $value = 1, ?int $anchorDay = null) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addDecadeNoOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subDecadesNoOverflow(int|float $value = 1, ?int $anchorDay = null) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subDecadeNoOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addQuarters(int|float $value = 1, ?int $anchorDay = null) Add quarters (the $value count passed in) to the instance (using date interval). + * @method $this addQuarter() Add one quarter to the instance (using date interval). + * @method $this subQuarters(int|float $value = 1, ?int $anchorDay = null) Sub quarters (the $value count passed in) to the instance (using date interval). + * @method $this subQuarter() Sub one quarter to the instance (using date interval). + * @method $this addQuartersWithOverflow(int|float $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method $this addQuarterWithOverflow() Add one quarter to the instance (using date interval) with overflow explicitly allowed. + * @method $this subQuartersWithOverflow(int|float $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method $this subQuarterWithOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly allowed. + * @method $this addQuartersWithoutOverflow(int|float $value = 1, ?int $anchorDay = null) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addQuarterWithoutOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subQuartersWithoutOverflow(int|float $value = 1, ?int $anchorDay = null) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subQuarterWithoutOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addQuartersWithNoOverflow(int|float $value = 1, ?int $anchorDay = null) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addQuarterWithNoOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subQuartersWithNoOverflow(int|float $value = 1, ?int $anchorDay = null) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subQuarterWithNoOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addQuartersNoOverflow(int|float $value = 1, ?int $anchorDay = null) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addQuarterNoOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subQuartersNoOverflow(int|float $value = 1, ?int $anchorDay = null) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subQuarterNoOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addWeeks(int|float $value = 1) Add weeks (the $value count passed in) to the instance (using date interval). + * @method $this addWeek() Add one week to the instance (using date interval). + * @method $this subWeeks(int|float $value = 1) Sub weeks (the $value count passed in) to the instance (using date interval). + * @method $this subWeek() Sub one week to the instance (using date interval). + * @method $this addWeekdays(int|float $value = 1) Add weekdays (the $value count passed in) to the instance (using date interval). + * @method $this addWeekday() Add one weekday to the instance (using date interval). + * @method $this subWeekdays(int|float $value = 1) Sub weekdays (the $value count passed in) to the instance (using date interval). + * @method $this subWeekday() Sub one weekday to the instance (using date interval). + * @method $this addUTCMicros(int|float $value = 1) Add microseconds (the $value count passed in) to the instance (using timestamp). + * @method $this addUTCMicro() Add one microsecond to the instance (using timestamp). + * @method $this subUTCMicros(int|float $value = 1) Sub microseconds (the $value count passed in) to the instance (using timestamp). + * @method $this subUTCMicro() Sub one microsecond to the instance (using timestamp). + * @method CarbonPeriod microsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each microsecond or every X microseconds if a factor is given. + * @method float diffInUTCMicros(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of microseconds. + * @method $this addUTCMicroseconds(int|float $value = 1) Add microseconds (the $value count passed in) to the instance (using timestamp). + * @method $this addUTCMicrosecond() Add one microsecond to the instance (using timestamp). + * @method $this subUTCMicroseconds(int|float $value = 1) Sub microseconds (the $value count passed in) to the instance (using timestamp). + * @method $this subUTCMicrosecond() Sub one microsecond to the instance (using timestamp). + * @method CarbonPeriod microsecondsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each microsecond or every X microseconds if a factor is given. + * @method float diffInUTCMicroseconds(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of microseconds. + * @method $this addUTCMillis(int|float $value = 1) Add milliseconds (the $value count passed in) to the instance (using timestamp). + * @method $this addUTCMilli() Add one millisecond to the instance (using timestamp). + * @method $this subUTCMillis(int|float $value = 1) Sub milliseconds (the $value count passed in) to the instance (using timestamp). + * @method $this subUTCMilli() Sub one millisecond to the instance (using timestamp). + * @method CarbonPeriod millisUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millisecond or every X milliseconds if a factor is given. + * @method float diffInUTCMillis(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of milliseconds. + * @method $this addUTCMilliseconds(int|float $value = 1) Add milliseconds (the $value count passed in) to the instance (using timestamp). + * @method $this addUTCMillisecond() Add one millisecond to the instance (using timestamp). + * @method $this subUTCMilliseconds(int|float $value = 1) Sub milliseconds (the $value count passed in) to the instance (using timestamp). + * @method $this subUTCMillisecond() Sub one millisecond to the instance (using timestamp). + * @method CarbonPeriod millisecondsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millisecond or every X milliseconds if a factor is given. + * @method float diffInUTCMilliseconds(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of milliseconds. + * @method $this addUTCSeconds(int|float $value = 1) Add seconds (the $value count passed in) to the instance (using timestamp). + * @method $this addUTCSecond() Add one second to the instance (using timestamp). + * @method $this subUTCSeconds(int|float $value = 1) Sub seconds (the $value count passed in) to the instance (using timestamp). + * @method $this subUTCSecond() Sub one second to the instance (using timestamp). + * @method CarbonPeriod secondsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each second or every X seconds if a factor is given. + * @method float diffInUTCSeconds(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of seconds. + * @method $this addUTCMinutes(int|float $value = 1) Add minutes (the $value count passed in) to the instance (using timestamp). + * @method $this addUTCMinute() Add one minute to the instance (using timestamp). + * @method $this subUTCMinutes(int|float $value = 1) Sub minutes (the $value count passed in) to the instance (using timestamp). + * @method $this subUTCMinute() Sub one minute to the instance (using timestamp). + * @method CarbonPeriod minutesUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each minute or every X minutes if a factor is given. + * @method float diffInUTCMinutes(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of minutes. + * @method $this addUTCHours(int|float $value = 1) Add hours (the $value count passed in) to the instance (using timestamp). + * @method $this addUTCHour() Add one hour to the instance (using timestamp). + * @method $this subUTCHours(int|float $value = 1) Sub hours (the $value count passed in) to the instance (using timestamp). + * @method $this subUTCHour() Sub one hour to the instance (using timestamp). + * @method CarbonPeriod hoursUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each hour or every X hours if a factor is given. + * @method float diffInUTCHours(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of hours. + * @method $this addUTCDays(int|float $value = 1) Add days (the $value count passed in) to the instance (using timestamp). + * @method $this addUTCDay() Add one day to the instance (using timestamp). + * @method $this subUTCDays(int|float $value = 1) Sub days (the $value count passed in) to the instance (using timestamp). + * @method $this subUTCDay() Sub one day to the instance (using timestamp). + * @method CarbonPeriod daysUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each day or every X days if a factor is given. + * @method float diffInUTCDays(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of days. + * @method $this addUTCWeeks(int|float $value = 1) Add weeks (the $value count passed in) to the instance (using timestamp). + * @method $this addUTCWeek() Add one week to the instance (using timestamp). + * @method $this subUTCWeeks(int|float $value = 1) Sub weeks (the $value count passed in) to the instance (using timestamp). + * @method $this subUTCWeek() Sub one week to the instance (using timestamp). + * @method CarbonPeriod weeksUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each week or every X weeks if a factor is given. + * @method float diffInUTCWeeks(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of weeks. + * @method $this addUTCMonths(int|float $value = 1) Add months (the $value count passed in) to the instance (using timestamp). + * @method $this addUTCMonth() Add one month to the instance (using timestamp). + * @method $this subUTCMonths(int|float $value = 1) Sub months (the $value count passed in) to the instance (using timestamp). + * @method $this subUTCMonth() Sub one month to the instance (using timestamp). + * @method CarbonPeriod monthsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each month or every X months if a factor is given. + * @method float diffInUTCMonths(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of months. + * @method $this addUTCQuarters(int|float $value = 1) Add quarters (the $value count passed in) to the instance (using timestamp). + * @method $this addUTCQuarter() Add one quarter to the instance (using timestamp). + * @method $this subUTCQuarters(int|float $value = 1) Sub quarters (the $value count passed in) to the instance (using timestamp). + * @method $this subUTCQuarter() Sub one quarter to the instance (using timestamp). + * @method CarbonPeriod quartersUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each quarter or every X quarters if a factor is given. + * @method float diffInUTCQuarters(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of quarters. + * @method $this addUTCYears(int|float $value = 1) Add years (the $value count passed in) to the instance (using timestamp). + * @method $this addUTCYear() Add one year to the instance (using timestamp). + * @method $this subUTCYears(int|float $value = 1) Sub years (the $value count passed in) to the instance (using timestamp). + * @method $this subUTCYear() Sub one year to the instance (using timestamp). + * @method CarbonPeriod yearsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each year or every X years if a factor is given. + * @method float diffInUTCYears(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of years. + * @method $this addUTCDecades(int|float $value = 1) Add decades (the $value count passed in) to the instance (using timestamp). + * @method $this addUTCDecade() Add one decade to the instance (using timestamp). + * @method $this subUTCDecades(int|float $value = 1) Sub decades (the $value count passed in) to the instance (using timestamp). + * @method $this subUTCDecade() Sub one decade to the instance (using timestamp). + * @method CarbonPeriod decadesUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each decade or every X decades if a factor is given. + * @method float diffInUTCDecades(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of decades. + * @method $this addUTCCenturies(int|float $value = 1) Add centuries (the $value count passed in) to the instance (using timestamp). + * @method $this addUTCCentury() Add one century to the instance (using timestamp). + * @method $this subUTCCenturies(int|float $value = 1) Sub centuries (the $value count passed in) to the instance (using timestamp). + * @method $this subUTCCentury() Sub one century to the instance (using timestamp). + * @method CarbonPeriod centuriesUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each century or every X centuries if a factor is given. + * @method float diffInUTCCenturies(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of centuries. + * @method $this addUTCMillennia(int|float $value = 1) Add millennia (the $value count passed in) to the instance (using timestamp). + * @method $this addUTCMillennium() Add one millennium to the instance (using timestamp). + * @method $this subUTCMillennia(int|float $value = 1) Sub millennia (the $value count passed in) to the instance (using timestamp). + * @method $this subUTCMillennium() Sub one millennium to the instance (using timestamp). + * @method CarbonPeriod millenniaUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millennium or every X millennia if a factor is given. + * @method float diffInUTCMillennia(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of millennia. + * @method $this roundYear(float $precision = 1, string $function = "round") Round the current instance year with given precision using the given function. + * @method $this roundYears(float $precision = 1, string $function = "round") Round the current instance year with given precision using the given function. + * @method $this floorYear(float $precision = 1) Truncate the current instance year with given precision. + * @method $this floorYears(float $precision = 1) Truncate the current instance year with given precision. + * @method $this ceilYear(float $precision = 1) Ceil the current instance year with given precision. + * @method $this ceilYears(float $precision = 1) Ceil the current instance year with given precision. + * @method $this roundMonth(float $precision = 1, string $function = "round") Round the current instance month with given precision using the given function. + * @method $this roundMonths(float $precision = 1, string $function = "round") Round the current instance month with given precision using the given function. + * @method $this floorMonth(float $precision = 1) Truncate the current instance month with given precision. + * @method $this floorMonths(float $precision = 1) Truncate the current instance month with given precision. + * @method $this ceilMonth(float $precision = 1) Ceil the current instance month with given precision. + * @method $this ceilMonths(float $precision = 1) Ceil the current instance month with given precision. + * @method $this roundDay(float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. + * @method $this roundDays(float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. + * @method $this floorDay(float $precision = 1) Truncate the current instance day with given precision. + * @method $this floorDays(float $precision = 1) Truncate the current instance day with given precision. + * @method $this ceilDay(float $precision = 1) Ceil the current instance day with given precision. + * @method $this ceilDays(float $precision = 1) Ceil the current instance day with given precision. + * @method $this roundHour(float $precision = 1, string $function = "round") Round the current instance hour with given precision using the given function. + * @method $this roundHours(float $precision = 1, string $function = "round") Round the current instance hour with given precision using the given function. + * @method $this floorHour(float $precision = 1) Truncate the current instance hour with given precision. + * @method $this floorHours(float $precision = 1) Truncate the current instance hour with given precision. + * @method $this ceilHour(float $precision = 1) Ceil the current instance hour with given precision. + * @method $this ceilHours(float $precision = 1) Ceil the current instance hour with given precision. + * @method $this roundMinute(float $precision = 1, string $function = "round") Round the current instance minute with given precision using the given function. + * @method $this roundMinutes(float $precision = 1, string $function = "round") Round the current instance minute with given precision using the given function. + * @method $this floorMinute(float $precision = 1) Truncate the current instance minute with given precision. + * @method $this floorMinutes(float $precision = 1) Truncate the current instance minute with given precision. + * @method $this ceilMinute(float $precision = 1) Ceil the current instance minute with given precision. + * @method $this ceilMinutes(float $precision = 1) Ceil the current instance minute with given precision. + * @method $this roundSecond(float $precision = 1, string $function = "round") Round the current instance second with given precision using the given function. + * @method $this roundSeconds(float $precision = 1, string $function = "round") Round the current instance second with given precision using the given function. + * @method $this floorSecond(float $precision = 1) Truncate the current instance second with given precision. + * @method $this floorSeconds(float $precision = 1) Truncate the current instance second with given precision. + * @method $this ceilSecond(float $precision = 1) Ceil the current instance second with given precision. + * @method $this ceilSeconds(float $precision = 1) Ceil the current instance second with given precision. + * @method $this roundMillennium(float $precision = 1, string $function = "round") Round the current instance millennium with given precision using the given function. + * @method $this roundMillennia(float $precision = 1, string $function = "round") Round the current instance millennium with given precision using the given function. + * @method $this floorMillennium(float $precision = 1) Truncate the current instance millennium with given precision. + * @method $this floorMillennia(float $precision = 1) Truncate the current instance millennium with given precision. + * @method $this ceilMillennium(float $precision = 1) Ceil the current instance millennium with given precision. + * @method $this ceilMillennia(float $precision = 1) Ceil the current instance millennium with given precision. + * @method $this roundCentury(float $precision = 1, string $function = "round") Round the current instance century with given precision using the given function. + * @method $this roundCenturies(float $precision = 1, string $function = "round") Round the current instance century with given precision using the given function. + * @method $this floorCentury(float $precision = 1) Truncate the current instance century with given precision. + * @method $this floorCenturies(float $precision = 1) Truncate the current instance century with given precision. + * @method $this ceilCentury(float $precision = 1) Ceil the current instance century with given precision. + * @method $this ceilCenturies(float $precision = 1) Ceil the current instance century with given precision. + * @method $this roundDecade(float $precision = 1, string $function = "round") Round the current instance decade with given precision using the given function. + * @method $this roundDecades(float $precision = 1, string $function = "round") Round the current instance decade with given precision using the given function. + * @method $this floorDecade(float $precision = 1) Truncate the current instance decade with given precision. + * @method $this floorDecades(float $precision = 1) Truncate the current instance decade with given precision. + * @method $this ceilDecade(float $precision = 1) Ceil the current instance decade with given precision. + * @method $this ceilDecades(float $precision = 1) Ceil the current instance decade with given precision. + * @method $this roundQuarter(float $precision = 1, string $function = "round") Round the current instance quarter with given precision using the given function. + * @method $this roundQuarters(float $precision = 1, string $function = "round") Round the current instance quarter with given precision using the given function. + * @method $this floorQuarter(float $precision = 1) Truncate the current instance quarter with given precision. + * @method $this floorQuarters(float $precision = 1) Truncate the current instance quarter with given precision. + * @method $this ceilQuarter(float $precision = 1) Ceil the current instance quarter with given precision. + * @method $this ceilQuarters(float $precision = 1) Ceil the current instance quarter with given precision. + * @method $this roundMillisecond(float $precision = 1, string $function = "round") Round the current instance millisecond with given precision using the given function. + * @method $this roundMilliseconds(float $precision = 1, string $function = "round") Round the current instance millisecond with given precision using the given function. + * @method $this floorMillisecond(float $precision = 1) Truncate the current instance millisecond with given precision. + * @method $this floorMilliseconds(float $precision = 1) Truncate the current instance millisecond with given precision. + * @method $this ceilMillisecond(float $precision = 1) Ceil the current instance millisecond with given precision. + * @method $this ceilMilliseconds(float $precision = 1) Ceil the current instance millisecond with given precision. + * @method $this roundMicrosecond(float $precision = 1, string $function = "round") Round the current instance microsecond with given precision using the given function. + * @method $this roundMicroseconds(float $precision = 1, string $function = "round") Round the current instance microsecond with given precision using the given function. + * @method $this floorMicrosecond(float $precision = 1) Truncate the current instance microsecond with given precision. + * @method $this floorMicroseconds(float $precision = 1) Truncate the current instance microsecond with given precision. + * @method $this ceilMicrosecond(float $precision = 1) Ceil the current instance microsecond with given precision. + * @method $this ceilMicroseconds(float $precision = 1) Ceil the current instance microsecond with given precision. + * @method string shortAbsoluteDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'Absolute' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string longAbsoluteDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'Absolute' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string shortRelativeDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'Relative' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string longRelativeDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'Relative' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string shortRelativeToNowDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'RelativeToNow' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string longRelativeToNowDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'RelativeToNow' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string shortRelativeToOtherDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'RelativeToOther' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string longRelativeToOtherDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'RelativeToOther' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method int centuriesInMillennium() Return the number of centuries contained in the current millennium + * @method int|static centuryOfMillennium(?int $century = null) Return the value of the century starting from the beginning of the current millennium when called with no parameters, change the current century when called with an integer value + * @method int|static dayOfCentury(?int $day = null) Return the value of the day starting from the beginning of the current century when called with no parameters, change the current day when called with an integer value + * @method int|static dayOfDecade(?int $day = null) Return the value of the day starting from the beginning of the current decade when called with no parameters, change the current day when called with an integer value + * @method int|static dayOfMillennium(?int $day = null) Return the value of the day starting from the beginning of the current millennium when called with no parameters, change the current day when called with an integer value + * @method int|static dayOfMonth(?int $day = null) Return the value of the day starting from the beginning of the current month when called with no parameters, change the current day when called with an integer value + * @method int|static dayOfQuarter(?int $day = null) Return the value of the day starting from the beginning of the current quarter when called with no parameters, change the current day when called with an integer value + * @method int|static dayOfWeek(?int $day = null) Return the value of the day starting from the beginning of the current week when called with no parameters, change the current day when called with an integer value + * @method int daysInCentury() Return the number of days contained in the current century + * @method int daysInDecade() Return the number of days contained in the current decade + * @method int daysInMillennium() Return the number of days contained in the current millennium + * @method int daysInMonth() Return the number of days contained in the current month + * @method int daysInQuarter() Return the number of days contained in the current quarter + * @method int daysInWeek() Return the number of days contained in the current week + * @method int daysInYear() Return the number of days contained in the current year + * @method int|static decadeOfCentury(?int $decade = null) Return the value of the decade starting from the beginning of the current century when called with no parameters, change the current decade when called with an integer value + * @method int|static decadeOfMillennium(?int $decade = null) Return the value of the decade starting from the beginning of the current millennium when called with no parameters, change the current decade when called with an integer value + * @method int decadesInCentury() Return the number of decades contained in the current century + * @method int decadesInMillennium() Return the number of decades contained in the current millennium + * @method int|static hourOfCentury(?int $hour = null) Return the value of the hour starting from the beginning of the current century when called with no parameters, change the current hour when called with an integer value + * @method int|static hourOfDay(?int $hour = null) Return the value of the hour starting from the beginning of the current day when called with no parameters, change the current hour when called with an integer value + * @method int|static hourOfDecade(?int $hour = null) Return the value of the hour starting from the beginning of the current decade when called with no parameters, change the current hour when called with an integer value + * @method int|static hourOfMillennium(?int $hour = null) Return the value of the hour starting from the beginning of the current millennium when called with no parameters, change the current hour when called with an integer value + * @method int|static hourOfMonth(?int $hour = null) Return the value of the hour starting from the beginning of the current month when called with no parameters, change the current hour when called with an integer value + * @method int|static hourOfQuarter(?int $hour = null) Return the value of the hour starting from the beginning of the current quarter when called with no parameters, change the current hour when called with an integer value + * @method int|static hourOfWeek(?int $hour = null) Return the value of the hour starting from the beginning of the current week when called with no parameters, change the current hour when called with an integer value + * @method int|static hourOfYear(?int $hour = null) Return the value of the hour starting from the beginning of the current year when called with no parameters, change the current hour when called with an integer value + * @method int hoursInCentury() Return the number of hours contained in the current century + * @method int hoursInDay() Return the number of hours contained in the current day + * @method int hoursInDecade() Return the number of hours contained in the current decade + * @method int hoursInMillennium() Return the number of hours contained in the current millennium + * @method int hoursInMonth() Return the number of hours contained in the current month + * @method int hoursInQuarter() Return the number of hours contained in the current quarter + * @method int hoursInWeek() Return the number of hours contained in the current week + * @method int hoursInYear() Return the number of hours contained in the current year + * @method int|static microsecondOfCentury(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current century when called with no parameters, change the current microsecond when called with an integer value + * @method int|static microsecondOfDay(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current day when called with no parameters, change the current microsecond when called with an integer value + * @method int|static microsecondOfDecade(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current decade when called with no parameters, change the current microsecond when called with an integer value + * @method int|static microsecondOfHour(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current hour when called with no parameters, change the current microsecond when called with an integer value + * @method int|static microsecondOfMillennium(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current millennium when called with no parameters, change the current microsecond when called with an integer value + * @method int|static microsecondOfMillisecond(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current millisecond when called with no parameters, change the current microsecond when called with an integer value + * @method int|static microsecondOfMinute(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current minute when called with no parameters, change the current microsecond when called with an integer value + * @method int|static microsecondOfMonth(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current month when called with no parameters, change the current microsecond when called with an integer value + * @method int|static microsecondOfQuarter(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current quarter when called with no parameters, change the current microsecond when called with an integer value + * @method int|static microsecondOfSecond(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current second when called with no parameters, change the current microsecond when called with an integer value + * @method int|static microsecondOfWeek(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current week when called with no parameters, change the current microsecond when called with an integer value + * @method int|static microsecondOfYear(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current year when called with no parameters, change the current microsecond when called with an integer value + * @method int microsecondsInCentury() Return the number of microseconds contained in the current century + * @method int microsecondsInDay() Return the number of microseconds contained in the current day + * @method int microsecondsInDecade() Return the number of microseconds contained in the current decade + * @method int microsecondsInHour() Return the number of microseconds contained in the current hour + * @method int microsecondsInMillennium() Return the number of microseconds contained in the current millennium + * @method int microsecondsInMillisecond() Return the number of microseconds contained in the current millisecond + * @method int microsecondsInMinute() Return the number of microseconds contained in the current minute + * @method int microsecondsInMonth() Return the number of microseconds contained in the current month + * @method int microsecondsInQuarter() Return the number of microseconds contained in the current quarter + * @method int microsecondsInSecond() Return the number of microseconds contained in the current second + * @method int microsecondsInWeek() Return the number of microseconds contained in the current week + * @method int microsecondsInYear() Return the number of microseconds contained in the current year + * @method int|static millisecondOfCentury(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current century when called with no parameters, change the current millisecond when called with an integer value + * @method int|static millisecondOfDay(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current day when called with no parameters, change the current millisecond when called with an integer value + * @method int|static millisecondOfDecade(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current decade when called with no parameters, change the current millisecond when called with an integer value + * @method int|static millisecondOfHour(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current hour when called with no parameters, change the current millisecond when called with an integer value + * @method int|static millisecondOfMillennium(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current millennium when called with no parameters, change the current millisecond when called with an integer value + * @method int|static millisecondOfMinute(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current minute when called with no parameters, change the current millisecond when called with an integer value + * @method int|static millisecondOfMonth(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current month when called with no parameters, change the current millisecond when called with an integer value + * @method int|static millisecondOfQuarter(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current quarter when called with no parameters, change the current millisecond when called with an integer value + * @method int|static millisecondOfSecond(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current second when called with no parameters, change the current millisecond when called with an integer value + * @method int|static millisecondOfWeek(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current week when called with no parameters, change the current millisecond when called with an integer value + * @method int|static millisecondOfYear(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current year when called with no parameters, change the current millisecond when called with an integer value + * @method int millisecondsInCentury() Return the number of milliseconds contained in the current century + * @method int millisecondsInDay() Return the number of milliseconds contained in the current day + * @method int millisecondsInDecade() Return the number of milliseconds contained in the current decade + * @method int millisecondsInHour() Return the number of milliseconds contained in the current hour + * @method int millisecondsInMillennium() Return the number of milliseconds contained in the current millennium + * @method int millisecondsInMinute() Return the number of milliseconds contained in the current minute + * @method int millisecondsInMonth() Return the number of milliseconds contained in the current month + * @method int millisecondsInQuarter() Return the number of milliseconds contained in the current quarter + * @method int millisecondsInSecond() Return the number of milliseconds contained in the current second + * @method int millisecondsInWeek() Return the number of milliseconds contained in the current week + * @method int millisecondsInYear() Return the number of milliseconds contained in the current year + * @method int|static minuteOfCentury(?int $minute = null) Return the value of the minute starting from the beginning of the current century when called with no parameters, change the current minute when called with an integer value + * @method int|static minuteOfDay(?int $minute = null) Return the value of the minute starting from the beginning of the current day when called with no parameters, change the current minute when called with an integer value + * @method int|static minuteOfDecade(?int $minute = null) Return the value of the minute starting from the beginning of the current decade when called with no parameters, change the current minute when called with an integer value + * @method int|static minuteOfHour(?int $minute = null) Return the value of the minute starting from the beginning of the current hour when called with no parameters, change the current minute when called with an integer value + * @method int|static minuteOfMillennium(?int $minute = null) Return the value of the minute starting from the beginning of the current millennium when called with no parameters, change the current minute when called with an integer value + * @method int|static minuteOfMonth(?int $minute = null) Return the value of the minute starting from the beginning of the current month when called with no parameters, change the current minute when called with an integer value + * @method int|static minuteOfQuarter(?int $minute = null) Return the value of the minute starting from the beginning of the current quarter when called with no parameters, change the current minute when called with an integer value + * @method int|static minuteOfWeek(?int $minute = null) Return the value of the minute starting from the beginning of the current week when called with no parameters, change the current minute when called with an integer value + * @method int|static minuteOfYear(?int $minute = null) Return the value of the minute starting from the beginning of the current year when called with no parameters, change the current minute when called with an integer value + * @method int minutesInCentury() Return the number of minutes contained in the current century + * @method int minutesInDay() Return the number of minutes contained in the current day + * @method int minutesInDecade() Return the number of minutes contained in the current decade + * @method int minutesInHour() Return the number of minutes contained in the current hour + * @method int minutesInMillennium() Return the number of minutes contained in the current millennium + * @method int minutesInMonth() Return the number of minutes contained in the current month + * @method int minutesInQuarter() Return the number of minutes contained in the current quarter + * @method int minutesInWeek() Return the number of minutes contained in the current week + * @method int minutesInYear() Return the number of minutes contained in the current year + * @method int|static monthOfCentury(?int $month = null) Return the value of the month starting from the beginning of the current century when called with no parameters, change the current month when called with an integer value + * @method int|static monthOfDecade(?int $month = null) Return the value of the month starting from the beginning of the current decade when called with no parameters, change the current month when called with an integer value + * @method int|static monthOfMillennium(?int $month = null) Return the value of the month starting from the beginning of the current millennium when called with no parameters, change the current month when called with an integer value + * @method int|static monthOfQuarter(?int $month = null) Return the value of the month starting from the beginning of the current quarter when called with no parameters, change the current month when called with an integer value + * @method int|static monthOfYear(?int $month = null) Return the value of the month starting from the beginning of the current year when called with no parameters, change the current month when called with an integer value + * @method int monthsInCentury() Return the number of months contained in the current century + * @method int monthsInDecade() Return the number of months contained in the current decade + * @method int monthsInMillennium() Return the number of months contained in the current millennium + * @method int monthsInQuarter() Return the number of months contained in the current quarter + * @method int monthsInYear() Return the number of months contained in the current year + * @method int|static quarterOfCentury(?int $quarter = null) Return the value of the quarter starting from the beginning of the current century when called with no parameters, change the current quarter when called with an integer value + * @method int|static quarterOfDecade(?int $quarter = null) Return the value of the quarter starting from the beginning of the current decade when called with no parameters, change the current quarter when called with an integer value + * @method int|static quarterOfMillennium(?int $quarter = null) Return the value of the quarter starting from the beginning of the current millennium when called with no parameters, change the current quarter when called with an integer value + * @method int|static quarterOfYear(?int $quarter = null) Return the value of the quarter starting from the beginning of the current year when called with no parameters, change the current quarter when called with an integer value + * @method int quartersInCentury() Return the number of quarters contained in the current century + * @method int quartersInDecade() Return the number of quarters contained in the current decade + * @method int quartersInMillennium() Return the number of quarters contained in the current millennium + * @method int quartersInYear() Return the number of quarters contained in the current year + * @method int|static secondOfCentury(?int $second = null) Return the value of the second starting from the beginning of the current century when called with no parameters, change the current second when called with an integer value + * @method int|static secondOfDay(?int $second = null) Return the value of the second starting from the beginning of the current day when called with no parameters, change the current second when called with an integer value + * @method int|static secondOfDecade(?int $second = null) Return the value of the second starting from the beginning of the current decade when called with no parameters, change the current second when called with an integer value + * @method int|static secondOfHour(?int $second = null) Return the value of the second starting from the beginning of the current hour when called with no parameters, change the current second when called with an integer value + * @method int|static secondOfMillennium(?int $second = null) Return the value of the second starting from the beginning of the current millennium when called with no parameters, change the current second when called with an integer value + * @method int|static secondOfMinute(?int $second = null) Return the value of the second starting from the beginning of the current minute when called with no parameters, change the current second when called with an integer value + * @method int|static secondOfMonth(?int $second = null) Return the value of the second starting from the beginning of the current month when called with no parameters, change the current second when called with an integer value + * @method int|static secondOfQuarter(?int $second = null) Return the value of the second starting from the beginning of the current quarter when called with no parameters, change the current second when called with an integer value + * @method int|static secondOfWeek(?int $second = null) Return the value of the second starting from the beginning of the current week when called with no parameters, change the current second when called with an integer value + * @method int|static secondOfYear(?int $second = null) Return the value of the second starting from the beginning of the current year when called with no parameters, change the current second when called with an integer value + * @method int secondsInCentury() Return the number of seconds contained in the current century + * @method int secondsInDay() Return the number of seconds contained in the current day + * @method int secondsInDecade() Return the number of seconds contained in the current decade + * @method int secondsInHour() Return the number of seconds contained in the current hour + * @method int secondsInMillennium() Return the number of seconds contained in the current millennium + * @method int secondsInMinute() Return the number of seconds contained in the current minute + * @method int secondsInMonth() Return the number of seconds contained in the current month + * @method int secondsInQuarter() Return the number of seconds contained in the current quarter + * @method int secondsInWeek() Return the number of seconds contained in the current week + * @method int secondsInYear() Return the number of seconds contained in the current year + * @method int|static weekOfCentury(?int $week = null) Return the value of the week starting from the beginning of the current century when called with no parameters, change the current week when called with an integer value + * @method int|static weekOfDecade(?int $week = null) Return the value of the week starting from the beginning of the current decade when called with no parameters, change the current week when called with an integer value + * @method int|static weekOfMillennium(?int $week = null) Return the value of the week starting from the beginning of the current millennium when called with no parameters, change the current week when called with an integer value + * @method int|static weekOfMonth(?int $week = null) Return the value of the week starting from the beginning of the current month when called with no parameters, change the current week when called with an integer value + * @method int|static weekOfQuarter(?int $week = null) Return the value of the week starting from the beginning of the current quarter when called with no parameters, change the current week when called with an integer value + * @method int|static weekOfYear(?int $week = null) Return the value of the week starting from the beginning of the current year when called with no parameters, change the current week when called with an integer value + * @method int weeksInCentury() Return the number of weeks contained in the current century + * @method int weeksInDecade() Return the number of weeks contained in the current decade + * @method int weeksInMillennium() Return the number of weeks contained in the current millennium + * @method int weeksInMonth() Return the number of weeks contained in the current month + * @method int weeksInQuarter() Return the number of weeks contained in the current quarter + * @method int|static yearOfCentury(?int $year = null) Return the value of the year starting from the beginning of the current century when called with no parameters, change the current year when called with an integer value + * @method int|static yearOfDecade(?int $year = null) Return the value of the year starting from the beginning of the current decade when called with no parameters, change the current year when called with an integer value + * @method int|static yearOfMillennium(?int $year = null) Return the value of the year starting from the beginning of the current millennium when called with no parameters, change the current year when called with an integer value + * @method int yearsInCentury() Return the number of years contained in the current century + * @method int yearsInDecade() Return the number of years contained in the current decade + * @method int yearsInMillennium() Return the number of years contained in the current millennium + * @method static plus(int $years = 0, int $months = 0, int|float $weeks = 0, int|float $days = 0, int|float $hours = 0, int|float $minutes = 0, int|float $seconds = 0, int|float $microseconds = 0, OverflowMode|bool|null $overflow = null, ?int $anchorDay = null) Add given amount of time to the current date. + * @method static minus(int $years = 0, int $months = 0, int|float $weeks = 0, int|float $days = 0, int|float $hours = 0, int|float $minutes = 0, int|float $seconds = 0, int|float $microseconds = 0, OverflowMode|bool|null $overflow = null, ?int $anchorDay = null) Subtract given amount of time to the current date. * * */ diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/CarbonImmutable.php b/plugins/vendor/nesbot/carbon/src/Carbon/CarbonImmutable.php index 79f475cc..29edbb80 100644 --- a/plugins/vendor/nesbot/carbon/src/Carbon/CarbonImmutable.php +++ b/plugins/vendor/nesbot/carbon/src/Carbon/CarbonImmutable.php @@ -22,10 +22,10 @@ use DateTimeInterface; * * * - * @property string $localeDayOfWeek the day of week in current locale - * @property string $shortLocaleDayOfWeek the abbreviated day of week in current locale - * @property string $localeMonth the month in current locale - * @property string $shortLocaleMonth the abbreviated month in current locale + * @property string $localeDayOfWeek the day of week in current locale + * @property string $shortLocaleDayOfWeek the abbreviated day of week in current locale + * @property string $localeMonth the month in current locale + * @property string $shortLocaleMonth the abbreviated month in current locale * @property int $year * @property int $yearIso * @property int $month @@ -35,801 +35,803 @@ use DateTimeInterface; * @property int $second * @property int $micro * @property int $microsecond - * @property int $dayOfWeekIso 1 (for Monday) through 7 (for Sunday) - * @property int|float|string $timestamp seconds since the Unix Epoch - * @property string $englishDayOfWeek the day of week in English - * @property string $shortEnglishDayOfWeek the abbreviated day of week in English - * @property string $englishMonth the month in English - * @property string $shortEnglishMonth the abbreviated month in English + * @property int $dayOfWeekIso 1 (for Monday) through 7 (for Sunday) + * @property int|float|string $timestamp seconds since the Unix Epoch + * @property string $englishDayOfWeek the day of week in English + * @property string $shortEnglishDayOfWeek the abbreviated day of week in English + * @property string $englishMonth the month in English + * @property string $shortEnglishMonth the abbreviated month in English * @property int $milliseconds * @property int $millisecond * @property int $milli - * @property int $week 1 through 53 - * @property int $isoWeek 1 through 53 - * @property int $weekYear year according to week format - * @property int $isoWeekYear year according to ISO week format - * @property int $age does a diffInYears() with default parameters - * @property int $offset the timezone offset in seconds from UTC - * @property int $offsetMinutes the timezone offset in minutes from UTC - * @property int $offsetHours the timezone offset in hours from UTC - * @property CarbonTimeZone $timezone the current timezone - * @property CarbonTimeZone $tz alias of $timezone - * @property int $centuryOfMillennium The value of the century starting from the beginning of the current millennium - * @property int $dayOfCentury The value of the day starting from the beginning of the current century - * @property int $dayOfDecade The value of the day starting from the beginning of the current decade - * @property int $dayOfMillennium The value of the day starting from the beginning of the current millennium - * @property int $dayOfMonth The value of the day starting from the beginning of the current month - * @property int $dayOfQuarter The value of the day starting from the beginning of the current quarter - * @property int $dayOfWeek 0 (for Sunday) through 6 (for Saturday) - * @property int $dayOfYear 1 through 366 - * @property int $decadeOfCentury The value of the decade starting from the beginning of the current century - * @property int $decadeOfMillennium The value of the decade starting from the beginning of the current millennium - * @property int $hourOfCentury The value of the hour starting from the beginning of the current century - * @property int $hourOfDay The value of the hour starting from the beginning of the current day - * @property int $hourOfDecade The value of the hour starting from the beginning of the current decade - * @property int $hourOfMillennium The value of the hour starting from the beginning of the current millennium - * @property int $hourOfMonth The value of the hour starting from the beginning of the current month - * @property int $hourOfQuarter The value of the hour starting from the beginning of the current quarter - * @property int $hourOfWeek The value of the hour starting from the beginning of the current week - * @property int $hourOfYear The value of the hour starting from the beginning of the current year - * @property int $microsecondOfCentury The value of the microsecond starting from the beginning of the current century - * @property int $microsecondOfDay The value of the microsecond starting from the beginning of the current day - * @property int $microsecondOfDecade The value of the microsecond starting from the beginning of the current decade - * @property int $microsecondOfHour The value of the microsecond starting from the beginning of the current hour - * @property int $microsecondOfMillennium The value of the microsecond starting from the beginning of the current millennium - * @property int $microsecondOfMillisecond The value of the microsecond starting from the beginning of the current millisecond - * @property int $microsecondOfMinute The value of the microsecond starting from the beginning of the current minute - * @property int $microsecondOfMonth The value of the microsecond starting from the beginning of the current month - * @property int $microsecondOfQuarter The value of the microsecond starting from the beginning of the current quarter - * @property int $microsecondOfSecond The value of the microsecond starting from the beginning of the current second - * @property int $microsecondOfWeek The value of the microsecond starting from the beginning of the current week - * @property int $microsecondOfYear The value of the microsecond starting from the beginning of the current year - * @property int $millisecondOfCentury The value of the millisecond starting from the beginning of the current century - * @property int $millisecondOfDay The value of the millisecond starting from the beginning of the current day - * @property int $millisecondOfDecade The value of the millisecond starting from the beginning of the current decade - * @property int $millisecondOfHour The value of the millisecond starting from the beginning of the current hour - * @property int $millisecondOfMillennium The value of the millisecond starting from the beginning of the current millennium - * @property int $millisecondOfMinute The value of the millisecond starting from the beginning of the current minute - * @property int $millisecondOfMonth The value of the millisecond starting from the beginning of the current month - * @property int $millisecondOfQuarter The value of the millisecond starting from the beginning of the current quarter - * @property int $millisecondOfSecond The value of the millisecond starting from the beginning of the current second - * @property int $millisecondOfWeek The value of the millisecond starting from the beginning of the current week - * @property int $millisecondOfYear The value of the millisecond starting from the beginning of the current year - * @property int $minuteOfCentury The value of the minute starting from the beginning of the current century - * @property int $minuteOfDay The value of the minute starting from the beginning of the current day - * @property int $minuteOfDecade The value of the minute starting from the beginning of the current decade - * @property int $minuteOfHour The value of the minute starting from the beginning of the current hour - * @property int $minuteOfMillennium The value of the minute starting from the beginning of the current millennium - * @property int $minuteOfMonth The value of the minute starting from the beginning of the current month - * @property int $minuteOfQuarter The value of the minute starting from the beginning of the current quarter - * @property int $minuteOfWeek The value of the minute starting from the beginning of the current week - * @property int $minuteOfYear The value of the minute starting from the beginning of the current year - * @property int $monthOfCentury The value of the month starting from the beginning of the current century - * @property int $monthOfDecade The value of the month starting from the beginning of the current decade - * @property int $monthOfMillennium The value of the month starting from the beginning of the current millennium - * @property int $monthOfQuarter The value of the month starting from the beginning of the current quarter - * @property int $monthOfYear The value of the month starting from the beginning of the current year - * @property int $quarterOfCentury The value of the quarter starting from the beginning of the current century - * @property int $quarterOfDecade The value of the quarter starting from the beginning of the current decade - * @property int $quarterOfMillennium The value of the quarter starting from the beginning of the current millennium - * @property int $quarterOfYear The value of the quarter starting from the beginning of the current year - * @property int $secondOfCentury The value of the second starting from the beginning of the current century - * @property int $secondOfDay The value of the second starting from the beginning of the current day - * @property int $secondOfDecade The value of the second starting from the beginning of the current decade - * @property int $secondOfHour The value of the second starting from the beginning of the current hour - * @property int $secondOfMillennium The value of the second starting from the beginning of the current millennium - * @property int $secondOfMinute The value of the second starting from the beginning of the current minute - * @property int $secondOfMonth The value of the second starting from the beginning of the current month - * @property int $secondOfQuarter The value of the second starting from the beginning of the current quarter - * @property int $secondOfWeek The value of the second starting from the beginning of the current week - * @property int $secondOfYear The value of the second starting from the beginning of the current year - * @property int $weekOfCentury The value of the week starting from the beginning of the current century - * @property int $weekOfDecade The value of the week starting from the beginning of the current decade - * @property int $weekOfMillennium The value of the week starting from the beginning of the current millennium - * @property int $weekOfMonth 1 through 5 - * @property int $weekOfQuarter The value of the week starting from the beginning of the current quarter - * @property int $weekOfYear ISO-8601 week number of year, weeks starting on Monday - * @property int $yearOfCentury The value of the year starting from the beginning of the current century - * @property int $yearOfDecade The value of the year starting from the beginning of the current decade - * @property int $yearOfMillennium The value of the year starting from the beginning of the current millennium - * @property-read string $latinMeridiem "am"/"pm" (Ante meridiem or Post meridiem latin lowercase mark) - * @property-read string $latinUpperMeridiem "AM"/"PM" (Ante meridiem or Post meridiem latin uppercase mark) - * @property-read string $timezoneAbbreviatedName the current timezone abbreviated name - * @property-read string $tzAbbrName alias of $timezoneAbbreviatedName - * @property-read string $dayName long name of weekday translated according to Carbon locale, in english if no translation available for current language - * @property-read string $shortDayName short name of weekday translated according to Carbon locale, in english if no translation available for current language - * @property-read string $minDayName very short name of weekday translated according to Carbon locale, in english if no translation available for current language - * @property-read string $monthName long name of month translated according to Carbon locale, in english if no translation available for current language - * @property-read string $shortMonthName short name of month translated according to Carbon locale, in english if no translation available for current language - * @property-read string $meridiem lowercase meridiem mark translated according to Carbon locale, in latin if no translation available for current language - * @property-read string $upperMeridiem uppercase meridiem mark translated according to Carbon locale, in latin if no translation available for current language - * @property-read int $noZeroHour current hour from 1 to 24 - * @property-read int $isoWeeksInYear 51 through 53 - * @property-read int $weekNumberInMonth 1 through 5 - * @property-read int $firstWeekDay 0 through 6 - * @property-read int $lastWeekDay 0 through 6 - * @property-read int $quarter the quarter of this instance, 1 - 4 - * @property-read int $decade the decade of this instance - * @property-read int $century the century of this instance - * @property-read int $millennium the millennium of this instance - * @property-read bool $dst daylight savings time indicator, true if DST, false otherwise - * @property-read bool $local checks if the timezone is local, true if local, false otherwise - * @property-read bool $utc checks if the timezone is UTC, true if UTC, false otherwise - * @property-read string $timezoneName the current timezone name - * @property-read string $tzName alias of $timezoneName - * @property-read string $locale locale of the current instance - * @property-read int $centuriesInMillennium The number of centuries contained in the current millennium - * @property-read int $daysInCentury The number of days contained in the current century - * @property-read int $daysInDecade The number of days contained in the current decade - * @property-read int $daysInMillennium The number of days contained in the current millennium - * @property-read int $daysInMonth number of days in the given month - * @property-read int $daysInQuarter The number of days contained in the current quarter - * @property-read int $daysInWeek The number of days contained in the current week - * @property-read int $daysInYear 365 or 366 - * @property-read int $decadesInCentury The number of decades contained in the current century - * @property-read int $decadesInMillennium The number of decades contained in the current millennium - * @property-read int $hoursInCentury The number of hours contained in the current century - * @property-read int $hoursInDay The number of hours contained in the current day - * @property-read int $hoursInDecade The number of hours contained in the current decade - * @property-read int $hoursInMillennium The number of hours contained in the current millennium - * @property-read int $hoursInMonth The number of hours contained in the current month - * @property-read int $hoursInQuarter The number of hours contained in the current quarter - * @property-read int $hoursInWeek The number of hours contained in the current week - * @property-read int $hoursInYear The number of hours contained in the current year - * @property-read int $microsecondsInCentury The number of microseconds contained in the current century - * @property-read int $microsecondsInDay The number of microseconds contained in the current day - * @property-read int $microsecondsInDecade The number of microseconds contained in the current decade - * @property-read int $microsecondsInHour The number of microseconds contained in the current hour - * @property-read int $microsecondsInMillennium The number of microseconds contained in the current millennium - * @property-read int $microsecondsInMillisecond The number of microseconds contained in the current millisecond - * @property-read int $microsecondsInMinute The number of microseconds contained in the current minute - * @property-read int $microsecondsInMonth The number of microseconds contained in the current month - * @property-read int $microsecondsInQuarter The number of microseconds contained in the current quarter - * @property-read int $microsecondsInSecond The number of microseconds contained in the current second - * @property-read int $microsecondsInWeek The number of microseconds contained in the current week - * @property-read int $microsecondsInYear The number of microseconds contained in the current year - * @property-read int $millisecondsInCentury The number of milliseconds contained in the current century - * @property-read int $millisecondsInDay The number of milliseconds contained in the current day - * @property-read int $millisecondsInDecade The number of milliseconds contained in the current decade - * @property-read int $millisecondsInHour The number of milliseconds contained in the current hour - * @property-read int $millisecondsInMillennium The number of milliseconds contained in the current millennium - * @property-read int $millisecondsInMinute The number of milliseconds contained in the current minute - * @property-read int $millisecondsInMonth The number of milliseconds contained in the current month - * @property-read int $millisecondsInQuarter The number of milliseconds contained in the current quarter - * @property-read int $millisecondsInSecond The number of milliseconds contained in the current second - * @property-read int $millisecondsInWeek The number of milliseconds contained in the current week - * @property-read int $millisecondsInYear The number of milliseconds contained in the current year - * @property-read int $minutesInCentury The number of minutes contained in the current century - * @property-read int $minutesInDay The number of minutes contained in the current day - * @property-read int $minutesInDecade The number of minutes contained in the current decade - * @property-read int $minutesInHour The number of minutes contained in the current hour - * @property-read int $minutesInMillennium The number of minutes contained in the current millennium - * @property-read int $minutesInMonth The number of minutes contained in the current month - * @property-read int $minutesInQuarter The number of minutes contained in the current quarter - * @property-read int $minutesInWeek The number of minutes contained in the current week - * @property-read int $minutesInYear The number of minutes contained in the current year - * @property-read int $monthsInCentury The number of months contained in the current century - * @property-read int $monthsInDecade The number of months contained in the current decade - * @property-read int $monthsInMillennium The number of months contained in the current millennium - * @property-read int $monthsInQuarter The number of months contained in the current quarter - * @property-read int $monthsInYear The number of months contained in the current year - * @property-read int $quartersInCentury The number of quarters contained in the current century - * @property-read int $quartersInDecade The number of quarters contained in the current decade - * @property-read int $quartersInMillennium The number of quarters contained in the current millennium - * @property-read int $quartersInYear The number of quarters contained in the current year - * @property-read int $secondsInCentury The number of seconds contained in the current century - * @property-read int $secondsInDay The number of seconds contained in the current day - * @property-read int $secondsInDecade The number of seconds contained in the current decade - * @property-read int $secondsInHour The number of seconds contained in the current hour - * @property-read int $secondsInMillennium The number of seconds contained in the current millennium - * @property-read int $secondsInMinute The number of seconds contained in the current minute - * @property-read int $secondsInMonth The number of seconds contained in the current month - * @property-read int $secondsInQuarter The number of seconds contained in the current quarter - * @property-read int $secondsInWeek The number of seconds contained in the current week - * @property-read int $secondsInYear The number of seconds contained in the current year - * @property-read int $weeksInCentury The number of weeks contained in the current century - * @property-read int $weeksInDecade The number of weeks contained in the current decade - * @property-read int $weeksInMillennium The number of weeks contained in the current millennium - * @property-read int $weeksInMonth The number of weeks contained in the current month - * @property-read int $weeksInQuarter The number of weeks contained in the current quarter - * @property-read int $weeksInYear 51 through 53 - * @property-read int $yearsInCentury The number of years contained in the current century - * @property-read int $yearsInDecade The number of years contained in the current decade - * @property-read int $yearsInMillennium The number of years contained in the current millennium + * @property int $week 1 through 53 + * @property int $isoWeek 1 through 53 + * @property int $weekYear year according to week format + * @property int $isoWeekYear year according to ISO week format + * @property int $age does a diffInYears() with default parameters + * @property int $offset the timezone offset in seconds from UTC + * @property int $offsetMinutes the timezone offset in minutes from UTC + * @property int $offsetHours the timezone offset in hours from UTC + * @property CarbonTimeZone $timezone the current timezone + * @property CarbonTimeZone $tz alias of $timezone + * @property int $centuryOfMillennium The value of the century starting from the beginning of the current millennium + * @property int $dayOfCentury The value of the day starting from the beginning of the current century + * @property int $dayOfDecade The value of the day starting from the beginning of the current decade + * @property int $dayOfMillennium The value of the day starting from the beginning of the current millennium + * @property int $dayOfMonth The value of the day starting from the beginning of the current month + * @property int $dayOfQuarter The value of the day starting from the beginning of the current quarter + * @property int $dayOfWeek 0 (for Sunday) through 6 (for Saturday) + * @property int $dayOfYear 1 through 366 + * @property int $decadeOfCentury The value of the decade starting from the beginning of the current century + * @property int $decadeOfMillennium The value of the decade starting from the beginning of the current millennium + * @property int $hourOfCentury The value of the hour starting from the beginning of the current century + * @property int $hourOfDay The value of the hour starting from the beginning of the current day + * @property int $hourOfDecade The value of the hour starting from the beginning of the current decade + * @property int $hourOfMillennium The value of the hour starting from the beginning of the current millennium + * @property int $hourOfMonth The value of the hour starting from the beginning of the current month + * @property int $hourOfQuarter The value of the hour starting from the beginning of the current quarter + * @property int $hourOfWeek The value of the hour starting from the beginning of the current week + * @property int $hourOfYear The value of the hour starting from the beginning of the current year + * @property int $microsecondOfCentury The value of the microsecond starting from the beginning of the current century + * @property int $microsecondOfDay The value of the microsecond starting from the beginning of the current day + * @property int $microsecondOfDecade The value of the microsecond starting from the beginning of the current decade + * @property int $microsecondOfHour The value of the microsecond starting from the beginning of the current hour + * @property int $microsecondOfMillennium The value of the microsecond starting from the beginning of the current millennium + * @property int $microsecondOfMillisecond The value of the microsecond starting from the beginning of the current millisecond + * @property int $microsecondOfMinute The value of the microsecond starting from the beginning of the current minute + * @property int $microsecondOfMonth The value of the microsecond starting from the beginning of the current month + * @property int $microsecondOfQuarter The value of the microsecond starting from the beginning of the current quarter + * @property int $microsecondOfSecond The value of the microsecond starting from the beginning of the current second + * @property int $microsecondOfWeek The value of the microsecond starting from the beginning of the current week + * @property int $microsecondOfYear The value of the microsecond starting from the beginning of the current year + * @property int $millisecondOfCentury The value of the millisecond starting from the beginning of the current century + * @property int $millisecondOfDay The value of the millisecond starting from the beginning of the current day + * @property int $millisecondOfDecade The value of the millisecond starting from the beginning of the current decade + * @property int $millisecondOfHour The value of the millisecond starting from the beginning of the current hour + * @property int $millisecondOfMillennium The value of the millisecond starting from the beginning of the current millennium + * @property int $millisecondOfMinute The value of the millisecond starting from the beginning of the current minute + * @property int $millisecondOfMonth The value of the millisecond starting from the beginning of the current month + * @property int $millisecondOfQuarter The value of the millisecond starting from the beginning of the current quarter + * @property int $millisecondOfSecond The value of the millisecond starting from the beginning of the current second + * @property int $millisecondOfWeek The value of the millisecond starting from the beginning of the current week + * @property int $millisecondOfYear The value of the millisecond starting from the beginning of the current year + * @property int $minuteOfCentury The value of the minute starting from the beginning of the current century + * @property int $minuteOfDay The value of the minute starting from the beginning of the current day + * @property int $minuteOfDecade The value of the minute starting from the beginning of the current decade + * @property int $minuteOfHour The value of the minute starting from the beginning of the current hour + * @property int $minuteOfMillennium The value of the minute starting from the beginning of the current millennium + * @property int $minuteOfMonth The value of the minute starting from the beginning of the current month + * @property int $minuteOfQuarter The value of the minute starting from the beginning of the current quarter + * @property int $minuteOfWeek The value of the minute starting from the beginning of the current week + * @property int $minuteOfYear The value of the minute starting from the beginning of the current year + * @property int $monthOfCentury The value of the month starting from the beginning of the current century + * @property int $monthOfDecade The value of the month starting from the beginning of the current decade + * @property int $monthOfMillennium The value of the month starting from the beginning of the current millennium + * @property int $monthOfQuarter The value of the month starting from the beginning of the current quarter + * @property int $monthOfYear The value of the month starting from the beginning of the current year + * @property int $quarterOfCentury The value of the quarter starting from the beginning of the current century + * @property int $quarterOfDecade The value of the quarter starting from the beginning of the current decade + * @property int $quarterOfMillennium The value of the quarter starting from the beginning of the current millennium + * @property int $quarterOfYear The value of the quarter starting from the beginning of the current year + * @property int $secondOfCentury The value of the second starting from the beginning of the current century + * @property int $secondOfDay The value of the second starting from the beginning of the current day + * @property int $secondOfDecade The value of the second starting from the beginning of the current decade + * @property int $secondOfHour The value of the second starting from the beginning of the current hour + * @property int $secondOfMillennium The value of the second starting from the beginning of the current millennium + * @property int $secondOfMinute The value of the second starting from the beginning of the current minute + * @property int $secondOfMonth The value of the second starting from the beginning of the current month + * @property int $secondOfQuarter The value of the second starting from the beginning of the current quarter + * @property int $secondOfWeek The value of the second starting from the beginning of the current week + * @property int $secondOfYear The value of the second starting from the beginning of the current year + * @property int $weekOfCentury The value of the week starting from the beginning of the current century + * @property int $weekOfDecade The value of the week starting from the beginning of the current decade + * @property int $weekOfMillennium The value of the week starting from the beginning of the current millennium + * @property int $weekOfMonth 1 through 5 + * @property int $weekOfQuarter The value of the week starting from the beginning of the current quarter + * @property int $weekOfYear ISO-8601 week number of year, weeks starting on Monday + * @property int $yearOfCentury The value of the year starting from the beginning of the current century + * @property int $yearOfDecade The value of the year starting from the beginning of the current decade + * @property int $yearOfMillennium The value of the year starting from the beginning of the current millennium + * @property-read string $latinMeridiem "am"/"pm" (Ante meridiem or Post meridiem latin lowercase mark) + * @property-read string $latinUpperMeridiem "AM"/"PM" (Ante meridiem or Post meridiem latin uppercase mark) + * @property-read string $timezoneAbbreviatedName the current timezone abbreviated name + * @property-read string $tzAbbrName alias of $timezoneAbbreviatedName + * @property-read string $dayName long name of weekday translated according to Carbon locale, in english if no translation available for current language + * @property-read string $shortDayName short name of weekday translated according to Carbon locale, in english if no translation available for current language + * @property-read string $minDayName very short name of weekday translated according to Carbon locale, in english if no translation available for current language + * @property-read string $monthName long name of month translated according to Carbon locale, in english if no translation available for current language + * @property-read string $shortMonthName short name of month translated according to Carbon locale, in english if no translation available for current language + * @property-read string $meridiem lowercase meridiem mark translated according to Carbon locale, in latin if no translation available for current language + * @property-read string $upperMeridiem uppercase meridiem mark translated according to Carbon locale, in latin if no translation available for current language + * @property-read int $noZeroHour current hour from 1 to 24 + * @property-read int $isoWeeksInYear 51 through 53 + * @property-read int $weekNumberInMonth 1 through 5 + * @property-read int $firstWeekDay 0 through 6 + * @property-read int $lastWeekDay 0 through 6 + * @property-read int $quarter the quarter of this instance, 1 - 4 + * @property-read int $decade the decade of this instance + * @property-read int $century the century of this instance + * @property-read int $millennium the millennium of this instance + * @property-read bool $dst daylight savings time indicator, true if DST, false otherwise + * @property-read bool $local checks if the timezone is local, true if local, false otherwise + * @property-read bool $utc checks if the timezone is UTC, true if UTC, false otherwise + * @property-read string $timezoneName the current timezone name + * @property-read string $tzName alias of $timezoneName + * @property-read string $locale locale of the current instance + * @property-read int $centuriesInMillennium The number of centuries contained in the current millennium + * @property-read int $daysInCentury The number of days contained in the current century + * @property-read int $daysInDecade The number of days contained in the current decade + * @property-read int $daysInMillennium The number of days contained in the current millennium + * @property-read int $daysInMonth number of days in the given month + * @property-read int $daysInQuarter The number of days contained in the current quarter + * @property-read int $daysInWeek The number of days contained in the current week + * @property-read int $daysInYear 365 or 366 + * @property-read int $decadesInCentury The number of decades contained in the current century + * @property-read int $decadesInMillennium The number of decades contained in the current millennium + * @property-read int $hoursInCentury The number of hours contained in the current century + * @property-read int $hoursInDay The number of hours contained in the current day + * @property-read int $hoursInDecade The number of hours contained in the current decade + * @property-read int $hoursInMillennium The number of hours contained in the current millennium + * @property-read int $hoursInMonth The number of hours contained in the current month + * @property-read int $hoursInQuarter The number of hours contained in the current quarter + * @property-read int $hoursInWeek The number of hours contained in the current week + * @property-read int $hoursInYear The number of hours contained in the current year + * @property-read int $microsecondsInCentury The number of microseconds contained in the current century + * @property-read int $microsecondsInDay The number of microseconds contained in the current day + * @property-read int $microsecondsInDecade The number of microseconds contained in the current decade + * @property-read int $microsecondsInHour The number of microseconds contained in the current hour + * @property-read int $microsecondsInMillennium The number of microseconds contained in the current millennium + * @property-read int $microsecondsInMillisecond The number of microseconds contained in the current millisecond + * @property-read int $microsecondsInMinute The number of microseconds contained in the current minute + * @property-read int $microsecondsInMonth The number of microseconds contained in the current month + * @property-read int $microsecondsInQuarter The number of microseconds contained in the current quarter + * @property-read int $microsecondsInSecond The number of microseconds contained in the current second + * @property-read int $microsecondsInWeek The number of microseconds contained in the current week + * @property-read int $microsecondsInYear The number of microseconds contained in the current year + * @property-read int $millisecondsInCentury The number of milliseconds contained in the current century + * @property-read int $millisecondsInDay The number of milliseconds contained in the current day + * @property-read int $millisecondsInDecade The number of milliseconds contained in the current decade + * @property-read int $millisecondsInHour The number of milliseconds contained in the current hour + * @property-read int $millisecondsInMillennium The number of milliseconds contained in the current millennium + * @property-read int $millisecondsInMinute The number of milliseconds contained in the current minute + * @property-read int $millisecondsInMonth The number of milliseconds contained in the current month + * @property-read int $millisecondsInQuarter The number of milliseconds contained in the current quarter + * @property-read int $millisecondsInSecond The number of milliseconds contained in the current second + * @property-read int $millisecondsInWeek The number of milliseconds contained in the current week + * @property-read int $millisecondsInYear The number of milliseconds contained in the current year + * @property-read int $minutesInCentury The number of minutes contained in the current century + * @property-read int $minutesInDay The number of minutes contained in the current day + * @property-read int $minutesInDecade The number of minutes contained in the current decade + * @property-read int $minutesInHour The number of minutes contained in the current hour + * @property-read int $minutesInMillennium The number of minutes contained in the current millennium + * @property-read int $minutesInMonth The number of minutes contained in the current month + * @property-read int $minutesInQuarter The number of minutes contained in the current quarter + * @property-read int $minutesInWeek The number of minutes contained in the current week + * @property-read int $minutesInYear The number of minutes contained in the current year + * @property-read int $monthsInCentury The number of months contained in the current century + * @property-read int $monthsInDecade The number of months contained in the current decade + * @property-read int $monthsInMillennium The number of months contained in the current millennium + * @property-read int $monthsInQuarter The number of months contained in the current quarter + * @property-read int $monthsInYear The number of months contained in the current year + * @property-read int $quartersInCentury The number of quarters contained in the current century + * @property-read int $quartersInDecade The number of quarters contained in the current decade + * @property-read int $quartersInMillennium The number of quarters contained in the current millennium + * @property-read int $quartersInYear The number of quarters contained in the current year + * @property-read int $secondsInCentury The number of seconds contained in the current century + * @property-read int $secondsInDay The number of seconds contained in the current day + * @property-read int $secondsInDecade The number of seconds contained in the current decade + * @property-read int $secondsInHour The number of seconds contained in the current hour + * @property-read int $secondsInMillennium The number of seconds contained in the current millennium + * @property-read int $secondsInMinute The number of seconds contained in the current minute + * @property-read int $secondsInMonth The number of seconds contained in the current month + * @property-read int $secondsInQuarter The number of seconds contained in the current quarter + * @property-read int $secondsInWeek The number of seconds contained in the current week + * @property-read int $secondsInYear The number of seconds contained in the current year + * @property-read int $weeksInCentury The number of weeks contained in the current century + * @property-read int $weeksInDecade The number of weeks contained in the current decade + * @property-read int $weeksInMillennium The number of weeks contained in the current millennium + * @property-read int $weeksInMonth The number of weeks contained in the current month + * @property-read int $weeksInQuarter The number of weeks contained in the current quarter + * @property-read int $weeksInYear 51 through 53 + * @property-read int $yearsInCentury The number of years contained in the current century + * @property-read int $yearsInDecade The number of years contained in the current decade + * @property-read int $yearsInMillennium The number of years contained in the current millennium * - * @method bool isUtc() Check if the current instance has UTC timezone. (Both isUtc and isUTC cases are valid.) - * @method bool isLocal() Check if the current instance has non-UTC timezone. - * @method bool isValid() Check if the current instance is a valid date. - * @method bool isDST() Check if the current instance is in a daylight saving time. - * @method bool isSunday() Checks if the instance day is sunday. - * @method bool isMonday() Checks if the instance day is monday. - * @method bool isTuesday() Checks if the instance day is tuesday. - * @method bool isWednesday() Checks if the instance day is wednesday. - * @method bool isThursday() Checks if the instance day is thursday. - * @method bool isFriday() Checks if the instance day is friday. - * @method bool isSaturday() Checks if the instance day is saturday. - * @method bool isSameYear(DateTimeInterface|string $date) Checks if the given date is in the same year as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentYear() Checks if the instance is in the same year as the current moment. - * @method bool isNextYear() Checks if the instance is in the same year as the current moment next year. - * @method bool isLastYear() Checks if the instance is in the same year as the current moment last year. - * @method bool isCurrentMonth() Checks if the instance is in the same month as the current moment. - * @method bool isNextMonth() Checks if the instance is in the same month as the current moment next month. - * @method bool isLastMonth() Checks if the instance is in the same month as the current moment last month. - * @method bool isSameWeek(DateTimeInterface|string $date) Checks if the given date is in the same week as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentWeek() Checks if the instance is in the same week as the current moment. - * @method bool isNextWeek() Checks if the instance is in the same week as the current moment next week. - * @method bool isLastWeek() Checks if the instance is in the same week as the current moment last week. - * @method bool isSameDay(DateTimeInterface|string $date) Checks if the given date is in the same day as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentDay() Checks if the instance is in the same day as the current moment. - * @method bool isNextDay() Checks if the instance is in the same day as the current moment next day. - * @method bool isLastDay() Checks if the instance is in the same day as the current moment last day. - * @method bool isSameHour(DateTimeInterface|string $date) Checks if the given date is in the same hour as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentHour() Checks if the instance is in the same hour as the current moment. - * @method bool isNextHour() Checks if the instance is in the same hour as the current moment next hour. - * @method bool isLastHour() Checks if the instance is in the same hour as the current moment last hour. - * @method bool isSameMinute(DateTimeInterface|string $date) Checks if the given date is in the same minute as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMinute() Checks if the instance is in the same minute as the current moment. - * @method bool isNextMinute() Checks if the instance is in the same minute as the current moment next minute. - * @method bool isLastMinute() Checks if the instance is in the same minute as the current moment last minute. - * @method bool isSameSecond(DateTimeInterface|string $date) Checks if the given date is in the same second as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentSecond() Checks if the instance is in the same second as the current moment. - * @method bool isNextSecond() Checks if the instance is in the same second as the current moment next second. - * @method bool isLastSecond() Checks if the instance is in the same second as the current moment last second. - * @method bool isSameMilli(DateTimeInterface|string $date) Checks if the given date is in the same millisecond as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMilli() Checks if the instance is in the same millisecond as the current moment. - * @method bool isNextMilli() Checks if the instance is in the same millisecond as the current moment next millisecond. - * @method bool isLastMilli() Checks if the instance is in the same millisecond as the current moment last millisecond. - * @method bool isSameMillisecond(DateTimeInterface|string $date) Checks if the given date is in the same millisecond as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMillisecond() Checks if the instance is in the same millisecond as the current moment. - * @method bool isNextMillisecond() Checks if the instance is in the same millisecond as the current moment next millisecond. - * @method bool isLastMillisecond() Checks if the instance is in the same millisecond as the current moment last millisecond. - * @method bool isSameMicro(DateTimeInterface|string $date) Checks if the given date is in the same microsecond as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMicro() Checks if the instance is in the same microsecond as the current moment. - * @method bool isNextMicro() Checks if the instance is in the same microsecond as the current moment next microsecond. - * @method bool isLastMicro() Checks if the instance is in the same microsecond as the current moment last microsecond. - * @method bool isSameMicrosecond(DateTimeInterface|string $date) Checks if the given date is in the same microsecond as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMicrosecond() Checks if the instance is in the same microsecond as the current moment. - * @method bool isNextMicrosecond() Checks if the instance is in the same microsecond as the current moment next microsecond. - * @method bool isLastMicrosecond() Checks if the instance is in the same microsecond as the current moment last microsecond. - * @method bool isSameDecade(DateTimeInterface|string $date) Checks if the given date is in the same decade as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentDecade() Checks if the instance is in the same decade as the current moment. - * @method bool isNextDecade() Checks if the instance is in the same decade as the current moment next decade. - * @method bool isLastDecade() Checks if the instance is in the same decade as the current moment last decade. - * @method bool isSameCentury(DateTimeInterface|string $date) Checks if the given date is in the same century as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentCentury() Checks if the instance is in the same century as the current moment. - * @method bool isNextCentury() Checks if the instance is in the same century as the current moment next century. - * @method bool isLastCentury() Checks if the instance is in the same century as the current moment last century. - * @method bool isSameMillennium(DateTimeInterface|string $date) Checks if the given date is in the same millennium as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMillennium() Checks if the instance is in the same millennium as the current moment. - * @method bool isNextMillennium() Checks if the instance is in the same millennium as the current moment next millennium. - * @method bool isLastMillennium() Checks if the instance is in the same millennium as the current moment last millennium. - * @method bool isCurrentQuarter() Checks if the instance is in the same quarter as the current moment. - * @method bool isNextQuarter() Checks if the instance is in the same quarter as the current moment next quarter. - * @method bool isLastQuarter() Checks if the instance is in the same quarter as the current moment last quarter. - * @method CarbonImmutable years(int $value) Set current instance year to the given value. - * @method CarbonImmutable year(int $value) Set current instance year to the given value. - * @method CarbonImmutable setYears(int $value) Set current instance year to the given value. - * @method CarbonImmutable setYear(int $value) Set current instance year to the given value. - * @method CarbonImmutable months(Month|int $value) Set current instance month to the given value. - * @method CarbonImmutable month(Month|int $value) Set current instance month to the given value. - * @method CarbonImmutable setMonths(Month|int $value) Set current instance month to the given value. - * @method CarbonImmutable setMonth(Month|int $value) Set current instance month to the given value. - * @method CarbonImmutable days(int $value) Set current instance day to the given value. - * @method CarbonImmutable day(int $value) Set current instance day to the given value. - * @method CarbonImmutable setDays(int $value) Set current instance day to the given value. - * @method CarbonImmutable setDay(int $value) Set current instance day to the given value. - * @method CarbonImmutable hours(int $value) Set current instance hour to the given value. - * @method CarbonImmutable hour(int $value) Set current instance hour to the given value. - * @method CarbonImmutable setHours(int $value) Set current instance hour to the given value. - * @method CarbonImmutable setHour(int $value) Set current instance hour to the given value. - * @method CarbonImmutable minutes(int $value) Set current instance minute to the given value. - * @method CarbonImmutable minute(int $value) Set current instance minute to the given value. - * @method CarbonImmutable setMinutes(int $value) Set current instance minute to the given value. - * @method CarbonImmutable setMinute(int $value) Set current instance minute to the given value. - * @method CarbonImmutable seconds(int $value) Set current instance second to the given value. - * @method CarbonImmutable second(int $value) Set current instance second to the given value. - * @method CarbonImmutable setSeconds(int $value) Set current instance second to the given value. - * @method CarbonImmutable setSecond(int $value) Set current instance second to the given value. - * @method CarbonImmutable millis(int $value) Set current instance millisecond to the given value. - * @method CarbonImmutable milli(int $value) Set current instance millisecond to the given value. - * @method CarbonImmutable setMillis(int $value) Set current instance millisecond to the given value. - * @method CarbonImmutable setMilli(int $value) Set current instance millisecond to the given value. - * @method CarbonImmutable milliseconds(int $value) Set current instance millisecond to the given value. - * @method CarbonImmutable millisecond(int $value) Set current instance millisecond to the given value. - * @method CarbonImmutable setMilliseconds(int $value) Set current instance millisecond to the given value. - * @method CarbonImmutable setMillisecond(int $value) Set current instance millisecond to the given value. - * @method CarbonImmutable micros(int $value) Set current instance microsecond to the given value. - * @method CarbonImmutable micro(int $value) Set current instance microsecond to the given value. - * @method CarbonImmutable setMicros(int $value) Set current instance microsecond to the given value. - * @method CarbonImmutable setMicro(int $value) Set current instance microsecond to the given value. - * @method CarbonImmutable microseconds(int $value) Set current instance microsecond to the given value. - * @method CarbonImmutable microsecond(int $value) Set current instance microsecond to the given value. - * @method CarbonImmutable setMicroseconds(int $value) Set current instance microsecond to the given value. - * @method self setMicrosecond(int $value) Set current instance microsecond to the given value. - * @method CarbonImmutable addYears(int|float $value = 1) Add years (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable addYear() Add one year to the instance (using date interval). - * @method CarbonImmutable subYears(int|float $value = 1) Sub years (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable subYear() Sub one year to the instance (using date interval). - * @method CarbonImmutable addYearsWithOverflow(int|float $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable addYearWithOverflow() Add one year to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable subYearsWithOverflow(int|float $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable subYearWithOverflow() Sub one year to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable addYearsWithoutOverflow(int|float $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addYearWithoutOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subYearsWithoutOverflow(int|float $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subYearWithoutOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addYearsWithNoOverflow(int|float $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addYearWithNoOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subYearsWithNoOverflow(int|float $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subYearWithNoOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addYearsNoOverflow(int|float $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addYearNoOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subYearsNoOverflow(int|float $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subYearNoOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addMonths(int|float $value = 1) Add months (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable addMonth() Add one month to the instance (using date interval). - * @method CarbonImmutable subMonths(int|float $value = 1) Sub months (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable subMonth() Sub one month to the instance (using date interval). - * @method CarbonImmutable addMonthsWithOverflow(int|float $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable addMonthWithOverflow() Add one month to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable subMonthsWithOverflow(int|float $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable subMonthWithOverflow() Sub one month to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable addMonthsWithoutOverflow(int|float $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addMonthWithoutOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subMonthsWithoutOverflow(int|float $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subMonthWithoutOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addMonthsWithNoOverflow(int|float $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addMonthWithNoOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subMonthsWithNoOverflow(int|float $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subMonthWithNoOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addMonthsNoOverflow(int|float $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addMonthNoOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subMonthsNoOverflow(int|float $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subMonthNoOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addDays(int|float $value = 1) Add days (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable addDay() Add one day to the instance (using date interval). - * @method CarbonImmutable subDays(int|float $value = 1) Sub days (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable subDay() Sub one day to the instance (using date interval). - * @method CarbonImmutable addHours(int|float $value = 1) Add hours (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable addHour() Add one hour to the instance (using date interval). - * @method CarbonImmutable subHours(int|float $value = 1) Sub hours (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable subHour() Sub one hour to the instance (using date interval). - * @method CarbonImmutable addMinutes(int|float $value = 1) Add minutes (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable addMinute() Add one minute to the instance (using date interval). - * @method CarbonImmutable subMinutes(int|float $value = 1) Sub minutes (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable subMinute() Sub one minute to the instance (using date interval). - * @method CarbonImmutable addSeconds(int|float $value = 1) Add seconds (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable addSecond() Add one second to the instance (using date interval). - * @method CarbonImmutable subSeconds(int|float $value = 1) Sub seconds (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable subSecond() Sub one second to the instance (using date interval). - * @method CarbonImmutable addMillis(int|float $value = 1) Add milliseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable addMilli() Add one millisecond to the instance (using date interval). - * @method CarbonImmutable subMillis(int|float $value = 1) Sub milliseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable subMilli() Sub one millisecond to the instance (using date interval). - * @method CarbonImmutable addMilliseconds(int|float $value = 1) Add milliseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable addMillisecond() Add one millisecond to the instance (using date interval). - * @method CarbonImmutable subMilliseconds(int|float $value = 1) Sub milliseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable subMillisecond() Sub one millisecond to the instance (using date interval). - * @method CarbonImmutable addMicros(int|float $value = 1) Add microseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable addMicro() Add one microsecond to the instance (using date interval). - * @method CarbonImmutable subMicros(int|float $value = 1) Sub microseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable subMicro() Sub one microsecond to the instance (using date interval). - * @method CarbonImmutable addMicroseconds(int|float $value = 1) Add microseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable addMicrosecond() Add one microsecond to the instance (using date interval). - * @method CarbonImmutable subMicroseconds(int|float $value = 1) Sub microseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable subMicrosecond() Sub one microsecond to the instance (using date interval). - * @method CarbonImmutable addMillennia(int|float $value = 1) Add millennia (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable addMillennium() Add one millennium to the instance (using date interval). - * @method CarbonImmutable subMillennia(int|float $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable subMillennium() Sub one millennium to the instance (using date interval). - * @method CarbonImmutable addMillenniaWithOverflow(int|float $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable addMillenniumWithOverflow() Add one millennium to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable subMillenniaWithOverflow(int|float $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable subMillenniumWithOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable addMillenniaWithoutOverflow(int|float $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addMillenniumWithoutOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subMillenniaWithoutOverflow(int|float $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subMillenniumWithoutOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addMillenniaWithNoOverflow(int|float $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addMillenniumWithNoOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subMillenniaWithNoOverflow(int|float $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subMillenniumWithNoOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addMillenniaNoOverflow(int|float $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addMillenniumNoOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subMillenniaNoOverflow(int|float $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subMillenniumNoOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addCenturies(int|float $value = 1) Add centuries (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable addCentury() Add one century to the instance (using date interval). - * @method CarbonImmutable subCenturies(int|float $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable subCentury() Sub one century to the instance (using date interval). - * @method CarbonImmutable addCenturiesWithOverflow(int|float $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable addCenturyWithOverflow() Add one century to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable subCenturiesWithOverflow(int|float $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable subCenturyWithOverflow() Sub one century to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable addCenturiesWithoutOverflow(int|float $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addCenturyWithoutOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subCenturiesWithoutOverflow(int|float $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subCenturyWithoutOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addCenturiesWithNoOverflow(int|float $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addCenturyWithNoOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subCenturiesWithNoOverflow(int|float $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subCenturyWithNoOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addCenturiesNoOverflow(int|float $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addCenturyNoOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subCenturiesNoOverflow(int|float $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subCenturyNoOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addDecades(int|float $value = 1) Add decades (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable addDecade() Add one decade to the instance (using date interval). - * @method CarbonImmutable subDecades(int|float $value = 1) Sub decades (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable subDecade() Sub one decade to the instance (using date interval). - * @method CarbonImmutable addDecadesWithOverflow(int|float $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable addDecadeWithOverflow() Add one decade to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable subDecadesWithOverflow(int|float $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable subDecadeWithOverflow() Sub one decade to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable addDecadesWithoutOverflow(int|float $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addDecadeWithoutOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subDecadesWithoutOverflow(int|float $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subDecadeWithoutOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addDecadesWithNoOverflow(int|float $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addDecadeWithNoOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subDecadesWithNoOverflow(int|float $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subDecadeWithNoOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addDecadesNoOverflow(int|float $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addDecadeNoOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subDecadesNoOverflow(int|float $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subDecadeNoOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addQuarters(int|float $value = 1) Add quarters (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable addQuarter() Add one quarter to the instance (using date interval). - * @method CarbonImmutable subQuarters(int|float $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable subQuarter() Sub one quarter to the instance (using date interval). - * @method CarbonImmutable addQuartersWithOverflow(int|float $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable addQuarterWithOverflow() Add one quarter to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable subQuartersWithOverflow(int|float $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable subQuarterWithOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonImmutable addQuartersWithoutOverflow(int|float $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addQuarterWithoutOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subQuartersWithoutOverflow(int|float $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subQuarterWithoutOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addQuartersWithNoOverflow(int|float $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addQuarterWithNoOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subQuartersWithNoOverflow(int|float $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subQuarterWithNoOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addQuartersNoOverflow(int|float $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addQuarterNoOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subQuartersNoOverflow(int|float $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable subQuarterNoOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonImmutable addWeeks(int|float $value = 1) Add weeks (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable addWeek() Add one week to the instance (using date interval). - * @method CarbonImmutable subWeeks(int|float $value = 1) Sub weeks (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable subWeek() Sub one week to the instance (using date interval). - * @method CarbonImmutable addWeekdays(int|float $value = 1) Add weekdays (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable addWeekday() Add one weekday to the instance (using date interval). - * @method CarbonImmutable subWeekdays(int|float $value = 1) Sub weekdays (the $value count passed in) to the instance (using date interval). - * @method CarbonImmutable subWeekday() Sub one weekday to the instance (using date interval). - * @method CarbonImmutable addUTCMicros(int|float $value = 1) Add microseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable addUTCMicro() Add one microsecond to the instance (using timestamp). - * @method CarbonImmutable subUTCMicros(int|float $value = 1) Sub microseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable subUTCMicro() Sub one microsecond to the instance (using timestamp). - * @method CarbonPeriod microsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each microsecond or every X microseconds if a factor is given. - * @method float diffInUTCMicros(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of microseconds. - * @method CarbonImmutable addUTCMicroseconds(int|float $value = 1) Add microseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable addUTCMicrosecond() Add one microsecond to the instance (using timestamp). - * @method CarbonImmutable subUTCMicroseconds(int|float $value = 1) Sub microseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable subUTCMicrosecond() Sub one microsecond to the instance (using timestamp). - * @method CarbonPeriod microsecondsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each microsecond or every X microseconds if a factor is given. - * @method float diffInUTCMicroseconds(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of microseconds. - * @method CarbonImmutable addUTCMillis(int|float $value = 1) Add milliseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable addUTCMilli() Add one millisecond to the instance (using timestamp). - * @method CarbonImmutable subUTCMillis(int|float $value = 1) Sub milliseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable subUTCMilli() Sub one millisecond to the instance (using timestamp). - * @method CarbonPeriod millisUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millisecond or every X milliseconds if a factor is given. - * @method float diffInUTCMillis(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of milliseconds. - * @method CarbonImmutable addUTCMilliseconds(int|float $value = 1) Add milliseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable addUTCMillisecond() Add one millisecond to the instance (using timestamp). - * @method CarbonImmutable subUTCMilliseconds(int|float $value = 1) Sub milliseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable subUTCMillisecond() Sub one millisecond to the instance (using timestamp). - * @method CarbonPeriod millisecondsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millisecond or every X milliseconds if a factor is given. - * @method float diffInUTCMilliseconds(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of milliseconds. - * @method CarbonImmutable addUTCSeconds(int|float $value = 1) Add seconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable addUTCSecond() Add one second to the instance (using timestamp). - * @method CarbonImmutable subUTCSeconds(int|float $value = 1) Sub seconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable subUTCSecond() Sub one second to the instance (using timestamp). - * @method CarbonPeriod secondsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each second or every X seconds if a factor is given. - * @method float diffInUTCSeconds(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of seconds. - * @method CarbonImmutable addUTCMinutes(int|float $value = 1) Add minutes (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable addUTCMinute() Add one minute to the instance (using timestamp). - * @method CarbonImmutable subUTCMinutes(int|float $value = 1) Sub minutes (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable subUTCMinute() Sub one minute to the instance (using timestamp). - * @method CarbonPeriod minutesUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each minute or every X minutes if a factor is given. - * @method float diffInUTCMinutes(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of minutes. - * @method CarbonImmutable addUTCHours(int|float $value = 1) Add hours (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable addUTCHour() Add one hour to the instance (using timestamp). - * @method CarbonImmutable subUTCHours(int|float $value = 1) Sub hours (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable subUTCHour() Sub one hour to the instance (using timestamp). - * @method CarbonPeriod hoursUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each hour or every X hours if a factor is given. - * @method float diffInUTCHours(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of hours. - * @method CarbonImmutable addUTCDays(int|float $value = 1) Add days (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable addUTCDay() Add one day to the instance (using timestamp). - * @method CarbonImmutable subUTCDays(int|float $value = 1) Sub days (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable subUTCDay() Sub one day to the instance (using timestamp). - * @method CarbonPeriod daysUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each day or every X days if a factor is given. - * @method float diffInUTCDays(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of days. - * @method CarbonImmutable addUTCWeeks(int|float $value = 1) Add weeks (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable addUTCWeek() Add one week to the instance (using timestamp). - * @method CarbonImmutable subUTCWeeks(int|float $value = 1) Sub weeks (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable subUTCWeek() Sub one week to the instance (using timestamp). - * @method CarbonPeriod weeksUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each week or every X weeks if a factor is given. - * @method float diffInUTCWeeks(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of weeks. - * @method CarbonImmutable addUTCMonths(int|float $value = 1) Add months (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable addUTCMonth() Add one month to the instance (using timestamp). - * @method CarbonImmutable subUTCMonths(int|float $value = 1) Sub months (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable subUTCMonth() Sub one month to the instance (using timestamp). - * @method CarbonPeriod monthsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each month or every X months if a factor is given. - * @method float diffInUTCMonths(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of months. - * @method CarbonImmutable addUTCQuarters(int|float $value = 1) Add quarters (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable addUTCQuarter() Add one quarter to the instance (using timestamp). - * @method CarbonImmutable subUTCQuarters(int|float $value = 1) Sub quarters (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable subUTCQuarter() Sub one quarter to the instance (using timestamp). - * @method CarbonPeriod quartersUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each quarter or every X quarters if a factor is given. - * @method float diffInUTCQuarters(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of quarters. - * @method CarbonImmutable addUTCYears(int|float $value = 1) Add years (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable addUTCYear() Add one year to the instance (using timestamp). - * @method CarbonImmutable subUTCYears(int|float $value = 1) Sub years (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable subUTCYear() Sub one year to the instance (using timestamp). - * @method CarbonPeriod yearsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each year or every X years if a factor is given. - * @method float diffInUTCYears(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of years. - * @method CarbonImmutable addUTCDecades(int|float $value = 1) Add decades (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable addUTCDecade() Add one decade to the instance (using timestamp). - * @method CarbonImmutable subUTCDecades(int|float $value = 1) Sub decades (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable subUTCDecade() Sub one decade to the instance (using timestamp). - * @method CarbonPeriod decadesUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each decade or every X decades if a factor is given. - * @method float diffInUTCDecades(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of decades. - * @method CarbonImmutable addUTCCenturies(int|float $value = 1) Add centuries (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable addUTCCentury() Add one century to the instance (using timestamp). - * @method CarbonImmutable subUTCCenturies(int|float $value = 1) Sub centuries (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable subUTCCentury() Sub one century to the instance (using timestamp). - * @method CarbonPeriod centuriesUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each century or every X centuries if a factor is given. - * @method float diffInUTCCenturies(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of centuries. - * @method CarbonImmutable addUTCMillennia(int|float $value = 1) Add millennia (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable addUTCMillennium() Add one millennium to the instance (using timestamp). - * @method CarbonImmutable subUTCMillennia(int|float $value = 1) Sub millennia (the $value count passed in) to the instance (using timestamp). - * @method CarbonImmutable subUTCMillennium() Sub one millennium to the instance (using timestamp). - * @method CarbonPeriod millenniaUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millennium or every X millennia if a factor is given. - * @method float diffInUTCMillennia(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of millennia. - * @method CarbonImmutable roundYear(float $precision = 1, string $function = "round") Round the current instance year with given precision using the given function. - * @method CarbonImmutable roundYears(float $precision = 1, string $function = "round") Round the current instance year with given precision using the given function. - * @method CarbonImmutable floorYear(float $precision = 1) Truncate the current instance year with given precision. - * @method CarbonImmutable floorYears(float $precision = 1) Truncate the current instance year with given precision. - * @method CarbonImmutable ceilYear(float $precision = 1) Ceil the current instance year with given precision. - * @method CarbonImmutable ceilYears(float $precision = 1) Ceil the current instance year with given precision. - * @method CarbonImmutable roundMonth(float $precision = 1, string $function = "round") Round the current instance month with given precision using the given function. - * @method CarbonImmutable roundMonths(float $precision = 1, string $function = "round") Round the current instance month with given precision using the given function. - * @method CarbonImmutable floorMonth(float $precision = 1) Truncate the current instance month with given precision. - * @method CarbonImmutable floorMonths(float $precision = 1) Truncate the current instance month with given precision. - * @method CarbonImmutable ceilMonth(float $precision = 1) Ceil the current instance month with given precision. - * @method CarbonImmutable ceilMonths(float $precision = 1) Ceil the current instance month with given precision. - * @method CarbonImmutable roundDay(float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. - * @method CarbonImmutable roundDays(float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. - * @method CarbonImmutable floorDay(float $precision = 1) Truncate the current instance day with given precision. - * @method CarbonImmutable floorDays(float $precision = 1) Truncate the current instance day with given precision. - * @method CarbonImmutable ceilDay(float $precision = 1) Ceil the current instance day with given precision. - * @method CarbonImmutable ceilDays(float $precision = 1) Ceil the current instance day with given precision. - * @method CarbonImmutable roundHour(float $precision = 1, string $function = "round") Round the current instance hour with given precision using the given function. - * @method CarbonImmutable roundHours(float $precision = 1, string $function = "round") Round the current instance hour with given precision using the given function. - * @method CarbonImmutable floorHour(float $precision = 1) Truncate the current instance hour with given precision. - * @method CarbonImmutable floorHours(float $precision = 1) Truncate the current instance hour with given precision. - * @method CarbonImmutable ceilHour(float $precision = 1) Ceil the current instance hour with given precision. - * @method CarbonImmutable ceilHours(float $precision = 1) Ceil the current instance hour with given precision. - * @method CarbonImmutable roundMinute(float $precision = 1, string $function = "round") Round the current instance minute with given precision using the given function. - * @method CarbonImmutable roundMinutes(float $precision = 1, string $function = "round") Round the current instance minute with given precision using the given function. - * @method CarbonImmutable floorMinute(float $precision = 1) Truncate the current instance minute with given precision. - * @method CarbonImmutable floorMinutes(float $precision = 1) Truncate the current instance minute with given precision. - * @method CarbonImmutable ceilMinute(float $precision = 1) Ceil the current instance minute with given precision. - * @method CarbonImmutable ceilMinutes(float $precision = 1) Ceil the current instance minute with given precision. - * @method CarbonImmutable roundSecond(float $precision = 1, string $function = "round") Round the current instance second with given precision using the given function. - * @method CarbonImmutable roundSeconds(float $precision = 1, string $function = "round") Round the current instance second with given precision using the given function. - * @method CarbonImmutable floorSecond(float $precision = 1) Truncate the current instance second with given precision. - * @method CarbonImmutable floorSeconds(float $precision = 1) Truncate the current instance second with given precision. - * @method CarbonImmutable ceilSecond(float $precision = 1) Ceil the current instance second with given precision. - * @method CarbonImmutable ceilSeconds(float $precision = 1) Ceil the current instance second with given precision. - * @method CarbonImmutable roundMillennium(float $precision = 1, string $function = "round") Round the current instance millennium with given precision using the given function. - * @method CarbonImmutable roundMillennia(float $precision = 1, string $function = "round") Round the current instance millennium with given precision using the given function. - * @method CarbonImmutable floorMillennium(float $precision = 1) Truncate the current instance millennium with given precision. - * @method CarbonImmutable floorMillennia(float $precision = 1) Truncate the current instance millennium with given precision. - * @method CarbonImmutable ceilMillennium(float $precision = 1) Ceil the current instance millennium with given precision. - * @method CarbonImmutable ceilMillennia(float $precision = 1) Ceil the current instance millennium with given precision. - * @method CarbonImmutable roundCentury(float $precision = 1, string $function = "round") Round the current instance century with given precision using the given function. - * @method CarbonImmutable roundCenturies(float $precision = 1, string $function = "round") Round the current instance century with given precision using the given function. - * @method CarbonImmutable floorCentury(float $precision = 1) Truncate the current instance century with given precision. - * @method CarbonImmutable floorCenturies(float $precision = 1) Truncate the current instance century with given precision. - * @method CarbonImmutable ceilCentury(float $precision = 1) Ceil the current instance century with given precision. - * @method CarbonImmutable ceilCenturies(float $precision = 1) Ceil the current instance century with given precision. - * @method CarbonImmutable roundDecade(float $precision = 1, string $function = "round") Round the current instance decade with given precision using the given function. - * @method CarbonImmutable roundDecades(float $precision = 1, string $function = "round") Round the current instance decade with given precision using the given function. - * @method CarbonImmutable floorDecade(float $precision = 1) Truncate the current instance decade with given precision. - * @method CarbonImmutable floorDecades(float $precision = 1) Truncate the current instance decade with given precision. - * @method CarbonImmutable ceilDecade(float $precision = 1) Ceil the current instance decade with given precision. - * @method CarbonImmutable ceilDecades(float $precision = 1) Ceil the current instance decade with given precision. - * @method CarbonImmutable roundQuarter(float $precision = 1, string $function = "round") Round the current instance quarter with given precision using the given function. - * @method CarbonImmutable roundQuarters(float $precision = 1, string $function = "round") Round the current instance quarter with given precision using the given function. - * @method CarbonImmutable floorQuarter(float $precision = 1) Truncate the current instance quarter with given precision. - * @method CarbonImmutable floorQuarters(float $precision = 1) Truncate the current instance quarter with given precision. - * @method CarbonImmutable ceilQuarter(float $precision = 1) Ceil the current instance quarter with given precision. - * @method CarbonImmutable ceilQuarters(float $precision = 1) Ceil the current instance quarter with given precision. - * @method CarbonImmutable roundMillisecond(float $precision = 1, string $function = "round") Round the current instance millisecond with given precision using the given function. - * @method CarbonImmutable roundMilliseconds(float $precision = 1, string $function = "round") Round the current instance millisecond with given precision using the given function. - * @method CarbonImmutable floorMillisecond(float $precision = 1) Truncate the current instance millisecond with given precision. - * @method CarbonImmutable floorMilliseconds(float $precision = 1) Truncate the current instance millisecond with given precision. - * @method CarbonImmutable ceilMillisecond(float $precision = 1) Ceil the current instance millisecond with given precision. - * @method CarbonImmutable ceilMilliseconds(float $precision = 1) Ceil the current instance millisecond with given precision. - * @method CarbonImmutable roundMicrosecond(float $precision = 1, string $function = "round") Round the current instance microsecond with given precision using the given function. - * @method CarbonImmutable roundMicroseconds(float $precision = 1, string $function = "round") Round the current instance microsecond with given precision using the given function. - * @method CarbonImmutable floorMicrosecond(float $precision = 1) Truncate the current instance microsecond with given precision. - * @method CarbonImmutable floorMicroseconds(float $precision = 1) Truncate the current instance microsecond with given precision. - * @method CarbonImmutable ceilMicrosecond(float $precision = 1) Ceil the current instance microsecond with given precision. - * @method CarbonImmutable ceilMicroseconds(float $precision = 1) Ceil the current instance microsecond with given precision. - * @method string shortAbsoluteDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'Absolute' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string longAbsoluteDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'Absolute' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string shortRelativeDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'Relative' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string longRelativeDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'Relative' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string shortRelativeToNowDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'RelativeToNow' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string longRelativeToNowDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'RelativeToNow' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string shortRelativeToOtherDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'RelativeToOther' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string longRelativeToOtherDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'RelativeToOther' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method int centuriesInMillennium() Return the number of centuries contained in the current millennium - * @method int|static centuryOfMillennium(?int $century = null) Return the value of the century starting from the beginning of the current millennium when called with no parameters, change the current century when called with an integer value - * @method int|static dayOfCentury(?int $day = null) Return the value of the day starting from the beginning of the current century when called with no parameters, change the current day when called with an integer value - * @method int|static dayOfDecade(?int $day = null) Return the value of the day starting from the beginning of the current decade when called with no parameters, change the current day when called with an integer value - * @method int|static dayOfMillennium(?int $day = null) Return the value of the day starting from the beginning of the current millennium when called with no parameters, change the current day when called with an integer value - * @method int|static dayOfMonth(?int $day = null) Return the value of the day starting from the beginning of the current month when called with no parameters, change the current day when called with an integer value - * @method int|static dayOfQuarter(?int $day = null) Return the value of the day starting from the beginning of the current quarter when called with no parameters, change the current day when called with an integer value - * @method int|static dayOfWeek(?int $day = null) Return the value of the day starting from the beginning of the current week when called with no parameters, change the current day when called with an integer value - * @method int daysInCentury() Return the number of days contained in the current century - * @method int daysInDecade() Return the number of days contained in the current decade - * @method int daysInMillennium() Return the number of days contained in the current millennium - * @method int daysInMonth() Return the number of days contained in the current month - * @method int daysInQuarter() Return the number of days contained in the current quarter - * @method int daysInWeek() Return the number of days contained in the current week - * @method int daysInYear() Return the number of days contained in the current year - * @method int|static decadeOfCentury(?int $decade = null) Return the value of the decade starting from the beginning of the current century when called with no parameters, change the current decade when called with an integer value - * @method int|static decadeOfMillennium(?int $decade = null) Return the value of the decade starting from the beginning of the current millennium when called with no parameters, change the current decade when called with an integer value - * @method int decadesInCentury() Return the number of decades contained in the current century - * @method int decadesInMillennium() Return the number of decades contained in the current millennium - * @method int|static hourOfCentury(?int $hour = null) Return the value of the hour starting from the beginning of the current century when called with no parameters, change the current hour when called with an integer value - * @method int|static hourOfDay(?int $hour = null) Return the value of the hour starting from the beginning of the current day when called with no parameters, change the current hour when called with an integer value - * @method int|static hourOfDecade(?int $hour = null) Return the value of the hour starting from the beginning of the current decade when called with no parameters, change the current hour when called with an integer value - * @method int|static hourOfMillennium(?int $hour = null) Return the value of the hour starting from the beginning of the current millennium when called with no parameters, change the current hour when called with an integer value - * @method int|static hourOfMonth(?int $hour = null) Return the value of the hour starting from the beginning of the current month when called with no parameters, change the current hour when called with an integer value - * @method int|static hourOfQuarter(?int $hour = null) Return the value of the hour starting from the beginning of the current quarter when called with no parameters, change the current hour when called with an integer value - * @method int|static hourOfWeek(?int $hour = null) Return the value of the hour starting from the beginning of the current week when called with no parameters, change the current hour when called with an integer value - * @method int|static hourOfYear(?int $hour = null) Return the value of the hour starting from the beginning of the current year when called with no parameters, change the current hour when called with an integer value - * @method int hoursInCentury() Return the number of hours contained in the current century - * @method int hoursInDay() Return the number of hours contained in the current day - * @method int hoursInDecade() Return the number of hours contained in the current decade - * @method int hoursInMillennium() Return the number of hours contained in the current millennium - * @method int hoursInMonth() Return the number of hours contained in the current month - * @method int hoursInQuarter() Return the number of hours contained in the current quarter - * @method int hoursInWeek() Return the number of hours contained in the current week - * @method int hoursInYear() Return the number of hours contained in the current year - * @method int|static microsecondOfCentury(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current century when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfDay(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current day when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfDecade(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current decade when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfHour(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current hour when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfMillennium(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current millennium when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfMillisecond(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current millisecond when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfMinute(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current minute when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfMonth(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current month when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfQuarter(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current quarter when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfSecond(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current second when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfWeek(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current week when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfYear(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current year when called with no parameters, change the current microsecond when called with an integer value - * @method int microsecondsInCentury() Return the number of microseconds contained in the current century - * @method int microsecondsInDay() Return the number of microseconds contained in the current day - * @method int microsecondsInDecade() Return the number of microseconds contained in the current decade - * @method int microsecondsInHour() Return the number of microseconds contained in the current hour - * @method int microsecondsInMillennium() Return the number of microseconds contained in the current millennium - * @method int microsecondsInMillisecond() Return the number of microseconds contained in the current millisecond - * @method int microsecondsInMinute() Return the number of microseconds contained in the current minute - * @method int microsecondsInMonth() Return the number of microseconds contained in the current month - * @method int microsecondsInQuarter() Return the number of microseconds contained in the current quarter - * @method int microsecondsInSecond() Return the number of microseconds contained in the current second - * @method int microsecondsInWeek() Return the number of microseconds contained in the current week - * @method int microsecondsInYear() Return the number of microseconds contained in the current year - * @method int|static millisecondOfCentury(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current century when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfDay(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current day when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfDecade(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current decade when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfHour(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current hour when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfMillennium(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current millennium when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfMinute(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current minute when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfMonth(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current month when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfQuarter(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current quarter when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfSecond(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current second when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfWeek(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current week when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfYear(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current year when called with no parameters, change the current millisecond when called with an integer value - * @method int millisecondsInCentury() Return the number of milliseconds contained in the current century - * @method int millisecondsInDay() Return the number of milliseconds contained in the current day - * @method int millisecondsInDecade() Return the number of milliseconds contained in the current decade - * @method int millisecondsInHour() Return the number of milliseconds contained in the current hour - * @method int millisecondsInMillennium() Return the number of milliseconds contained in the current millennium - * @method int millisecondsInMinute() Return the number of milliseconds contained in the current minute - * @method int millisecondsInMonth() Return the number of milliseconds contained in the current month - * @method int millisecondsInQuarter() Return the number of milliseconds contained in the current quarter - * @method int millisecondsInSecond() Return the number of milliseconds contained in the current second - * @method int millisecondsInWeek() Return the number of milliseconds contained in the current week - * @method int millisecondsInYear() Return the number of milliseconds contained in the current year - * @method int|static minuteOfCentury(?int $minute = null) Return the value of the minute starting from the beginning of the current century when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfDay(?int $minute = null) Return the value of the minute starting from the beginning of the current day when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfDecade(?int $minute = null) Return the value of the minute starting from the beginning of the current decade when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfHour(?int $minute = null) Return the value of the minute starting from the beginning of the current hour when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfMillennium(?int $minute = null) Return the value of the minute starting from the beginning of the current millennium when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfMonth(?int $minute = null) Return the value of the minute starting from the beginning of the current month when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfQuarter(?int $minute = null) Return the value of the minute starting from the beginning of the current quarter when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfWeek(?int $minute = null) Return the value of the minute starting from the beginning of the current week when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfYear(?int $minute = null) Return the value of the minute starting from the beginning of the current year when called with no parameters, change the current minute when called with an integer value - * @method int minutesInCentury() Return the number of minutes contained in the current century - * @method int minutesInDay() Return the number of minutes contained in the current day - * @method int minutesInDecade() Return the number of minutes contained in the current decade - * @method int minutesInHour() Return the number of minutes contained in the current hour - * @method int minutesInMillennium() Return the number of minutes contained in the current millennium - * @method int minutesInMonth() Return the number of minutes contained in the current month - * @method int minutesInQuarter() Return the number of minutes contained in the current quarter - * @method int minutesInWeek() Return the number of minutes contained in the current week - * @method int minutesInYear() Return the number of minutes contained in the current year - * @method int|static monthOfCentury(?int $month = null) Return the value of the month starting from the beginning of the current century when called with no parameters, change the current month when called with an integer value - * @method int|static monthOfDecade(?int $month = null) Return the value of the month starting from the beginning of the current decade when called with no parameters, change the current month when called with an integer value - * @method int|static monthOfMillennium(?int $month = null) Return the value of the month starting from the beginning of the current millennium when called with no parameters, change the current month when called with an integer value - * @method int|static monthOfQuarter(?int $month = null) Return the value of the month starting from the beginning of the current quarter when called with no parameters, change the current month when called with an integer value - * @method int|static monthOfYear(?int $month = null) Return the value of the month starting from the beginning of the current year when called with no parameters, change the current month when called with an integer value - * @method int monthsInCentury() Return the number of months contained in the current century - * @method int monthsInDecade() Return the number of months contained in the current decade - * @method int monthsInMillennium() Return the number of months contained in the current millennium - * @method int monthsInQuarter() Return the number of months contained in the current quarter - * @method int monthsInYear() Return the number of months contained in the current year - * @method int|static quarterOfCentury(?int $quarter = null) Return the value of the quarter starting from the beginning of the current century when called with no parameters, change the current quarter when called with an integer value - * @method int|static quarterOfDecade(?int $quarter = null) Return the value of the quarter starting from the beginning of the current decade when called with no parameters, change the current quarter when called with an integer value - * @method int|static quarterOfMillennium(?int $quarter = null) Return the value of the quarter starting from the beginning of the current millennium when called with no parameters, change the current quarter when called with an integer value - * @method int|static quarterOfYear(?int $quarter = null) Return the value of the quarter starting from the beginning of the current year when called with no parameters, change the current quarter when called with an integer value - * @method int quartersInCentury() Return the number of quarters contained in the current century - * @method int quartersInDecade() Return the number of quarters contained in the current decade - * @method int quartersInMillennium() Return the number of quarters contained in the current millennium - * @method int quartersInYear() Return the number of quarters contained in the current year - * @method int|static secondOfCentury(?int $second = null) Return the value of the second starting from the beginning of the current century when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfDay(?int $second = null) Return the value of the second starting from the beginning of the current day when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfDecade(?int $second = null) Return the value of the second starting from the beginning of the current decade when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfHour(?int $second = null) Return the value of the second starting from the beginning of the current hour when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfMillennium(?int $second = null) Return the value of the second starting from the beginning of the current millennium when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfMinute(?int $second = null) Return the value of the second starting from the beginning of the current minute when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfMonth(?int $second = null) Return the value of the second starting from the beginning of the current month when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfQuarter(?int $second = null) Return the value of the second starting from the beginning of the current quarter when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfWeek(?int $second = null) Return the value of the second starting from the beginning of the current week when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfYear(?int $second = null) Return the value of the second starting from the beginning of the current year when called with no parameters, change the current second when called with an integer value - * @method int secondsInCentury() Return the number of seconds contained in the current century - * @method int secondsInDay() Return the number of seconds contained in the current day - * @method int secondsInDecade() Return the number of seconds contained in the current decade - * @method int secondsInHour() Return the number of seconds contained in the current hour - * @method int secondsInMillennium() Return the number of seconds contained in the current millennium - * @method int secondsInMinute() Return the number of seconds contained in the current minute - * @method int secondsInMonth() Return the number of seconds contained in the current month - * @method int secondsInQuarter() Return the number of seconds contained in the current quarter - * @method int secondsInWeek() Return the number of seconds contained in the current week - * @method int secondsInYear() Return the number of seconds contained in the current year - * @method int|static weekOfCentury(?int $week = null) Return the value of the week starting from the beginning of the current century when called with no parameters, change the current week when called with an integer value - * @method int|static weekOfDecade(?int $week = null) Return the value of the week starting from the beginning of the current decade when called with no parameters, change the current week when called with an integer value - * @method int|static weekOfMillennium(?int $week = null) Return the value of the week starting from the beginning of the current millennium when called with no parameters, change the current week when called with an integer value - * @method int|static weekOfMonth(?int $week = null) Return the value of the week starting from the beginning of the current month when called with no parameters, change the current week when called with an integer value - * @method int|static weekOfQuarter(?int $week = null) Return the value of the week starting from the beginning of the current quarter when called with no parameters, change the current week when called with an integer value - * @method int|static weekOfYear(?int $week = null) Return the value of the week starting from the beginning of the current year when called with no parameters, change the current week when called with an integer value - * @method int weeksInCentury() Return the number of weeks contained in the current century - * @method int weeksInDecade() Return the number of weeks contained in the current decade - * @method int weeksInMillennium() Return the number of weeks contained in the current millennium - * @method int weeksInMonth() Return the number of weeks contained in the current month - * @method int weeksInQuarter() Return the number of weeks contained in the current quarter - * @method int|static yearOfCentury(?int $year = null) Return the value of the year starting from the beginning of the current century when called with no parameters, change the current year when called with an integer value - * @method int|static yearOfDecade(?int $year = null) Return the value of the year starting from the beginning of the current decade when called with no parameters, change the current year when called with an integer value - * @method int|static yearOfMillennium(?int $year = null) Return the value of the year starting from the beginning of the current millennium when called with no parameters, change the current year when called with an integer value - * @method int yearsInCentury() Return the number of years contained in the current century - * @method int yearsInDecade() Return the number of years contained in the current decade - * @method int yearsInMillennium() Return the number of years contained in the current millennium + * @method bool isUtc() Check if the current instance has UTC timezone. (Both isUtc and isUTC cases are valid.) + * @method bool isLocal() Check if the current instance has non-UTC timezone. + * @method bool isValid() Check if the current instance is a valid date. + * @method bool isDST() Check if the current instance is in a daylight saving time. + * @method bool isSunday() Checks if the instance day is sunday. + * @method bool isMonday() Checks if the instance day is monday. + * @method bool isTuesday() Checks if the instance day is tuesday. + * @method bool isWednesday() Checks if the instance day is wednesday. + * @method bool isThursday() Checks if the instance day is thursday. + * @method bool isFriday() Checks if the instance day is friday. + * @method bool isSaturday() Checks if the instance day is saturday. + * @method bool isSameYear(DateTimeInterface|string $date) Checks if the given date is in the same year as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentYear() Checks if the instance is in the same year as the current moment. + * @method bool isNextYear() Checks if the instance is in the same year as the current moment next year. + * @method bool isLastYear() Checks if the instance is in the same year as the current moment last year. + * @method bool isCurrentMonth() Checks if the instance is in the same month as the current moment. + * @method bool isNextMonth() Checks if the instance is in the same month as the current moment next month. + * @method bool isLastMonth() Checks if the instance is in the same month as the current moment last month. + * @method bool isSameWeek(DateTimeInterface|string $date) Checks if the given date is in the same week as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentWeek() Checks if the instance is in the same week as the current moment. + * @method bool isNextWeek() Checks if the instance is in the same week as the current moment next week. + * @method bool isLastWeek() Checks if the instance is in the same week as the current moment last week. + * @method bool isSameDay(DateTimeInterface|string $date) Checks if the given date is in the same day as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentDay() Checks if the instance is in the same day as the current moment. + * @method bool isNextDay() Checks if the instance is in the same day as the current moment next day. + * @method bool isLastDay() Checks if the instance is in the same day as the current moment last day. + * @method bool isSameHour(DateTimeInterface|string $date) Checks if the given date is in the same hour as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentHour() Checks if the instance is in the same hour as the current moment. + * @method bool isNextHour() Checks if the instance is in the same hour as the current moment next hour. + * @method bool isLastHour() Checks if the instance is in the same hour as the current moment last hour. + * @method bool isSameMinute(DateTimeInterface|string $date) Checks if the given date is in the same minute as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentMinute() Checks if the instance is in the same minute as the current moment. + * @method bool isNextMinute() Checks if the instance is in the same minute as the current moment next minute. + * @method bool isLastMinute() Checks if the instance is in the same minute as the current moment last minute. + * @method bool isSameSecond(DateTimeInterface|string $date) Checks if the given date is in the same second as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentSecond() Checks if the instance is in the same second as the current moment. + * @method bool isNextSecond() Checks if the instance is in the same second as the current moment next second. + * @method bool isLastSecond() Checks if the instance is in the same second as the current moment last second. + * @method bool isSameMilli(DateTimeInterface|string $date) Checks if the given date is in the same millisecond as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentMilli() Checks if the instance is in the same millisecond as the current moment. + * @method bool isNextMilli() Checks if the instance is in the same millisecond as the current moment next millisecond. + * @method bool isLastMilli() Checks if the instance is in the same millisecond as the current moment last millisecond. + * @method bool isSameMillisecond(DateTimeInterface|string $date) Checks if the given date is in the same millisecond as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentMillisecond() Checks if the instance is in the same millisecond as the current moment. + * @method bool isNextMillisecond() Checks if the instance is in the same millisecond as the current moment next millisecond. + * @method bool isLastMillisecond() Checks if the instance is in the same millisecond as the current moment last millisecond. + * @method bool isSameMicro(DateTimeInterface|string $date) Checks if the given date is in the same microsecond as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentMicro() Checks if the instance is in the same microsecond as the current moment. + * @method bool isNextMicro() Checks if the instance is in the same microsecond as the current moment next microsecond. + * @method bool isLastMicro() Checks if the instance is in the same microsecond as the current moment last microsecond. + * @method bool isSameMicrosecond(DateTimeInterface|string $date) Checks if the given date is in the same microsecond as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentMicrosecond() Checks if the instance is in the same microsecond as the current moment. + * @method bool isNextMicrosecond() Checks if the instance is in the same microsecond as the current moment next microsecond. + * @method bool isLastMicrosecond() Checks if the instance is in the same microsecond as the current moment last microsecond. + * @method bool isSameDecade(DateTimeInterface|string $date) Checks if the given date is in the same decade as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentDecade() Checks if the instance is in the same decade as the current moment. + * @method bool isNextDecade() Checks if the instance is in the same decade as the current moment next decade. + * @method bool isLastDecade() Checks if the instance is in the same decade as the current moment last decade. + * @method bool isSameCentury(DateTimeInterface|string $date) Checks if the given date is in the same century as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentCentury() Checks if the instance is in the same century as the current moment. + * @method bool isNextCentury() Checks if the instance is in the same century as the current moment next century. + * @method bool isLastCentury() Checks if the instance is in the same century as the current moment last century. + * @method bool isSameMillennium(DateTimeInterface|string $date) Checks if the given date is in the same millennium as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentMillennium() Checks if the instance is in the same millennium as the current moment. + * @method bool isNextMillennium() Checks if the instance is in the same millennium as the current moment next millennium. + * @method bool isLastMillennium() Checks if the instance is in the same millennium as the current moment last millennium. + * @method bool isCurrentQuarter() Checks if the instance is in the same quarter as the current moment. + * @method bool isNextQuarter() Checks if the instance is in the same quarter as the current moment next quarter. + * @method bool isLastQuarter() Checks if the instance is in the same quarter as the current moment last quarter. + * @method CarbonImmutable years(int $value, OverflowMode|bool|null $overflow = null, ?int $anchorDay = null) Set current instance year to the given value. + * @method CarbonImmutable year(int $value, OverflowMode|bool|null $overflow = null, ?int $anchorDay = null) Set current instance year to the given value. + * @method CarbonImmutable setYears(int $value, OverflowMode|bool|null $overflow = null, ?int $anchorDay = null) Set current instance year to the given value. + * @method CarbonImmutable setYear(int $value, OverflowMode|bool|null $overflow = null, ?int $anchorDay = null) Set current instance year to the given value. + * @method CarbonImmutable months(Month|int $value, OverflowMode|bool|null $overflow = null, ?int $anchorDay = null) Set current instance month to the given value. + * @method CarbonImmutable month(Month|int $value, OverflowMode|bool|null $overflow = null, ?int $anchorDay = null) Set current instance month to the given value. + * @method CarbonImmutable setMonths(Month|int $value, OverflowMode|bool|null $overflow = null, ?int $anchorDay = null) Set current instance month to the given value. + * @method CarbonImmutable setMonth(Month|int $value, OverflowMode|bool|null $overflow = null, ?int $anchorDay = null) Set current instance month to the given value. + * @method CarbonImmutable days(int $value) Set current instance day to the given value. + * @method CarbonImmutable day(int $value) Set current instance day to the given value. + * @method CarbonImmutable setDays(int $value) Set current instance day to the given value. + * @method CarbonImmutable setDay(int $value) Set current instance day to the given value. + * @method CarbonImmutable hours(int $value) Set current instance hour to the given value. + * @method CarbonImmutable hour(int $value) Set current instance hour to the given value. + * @method CarbonImmutable setHours(int $value) Set current instance hour to the given value. + * @method CarbonImmutable setHour(int $value) Set current instance hour to the given value. + * @method CarbonImmutable minutes(int $value) Set current instance minute to the given value. + * @method CarbonImmutable minute(int $value) Set current instance minute to the given value. + * @method CarbonImmutable setMinutes(int $value) Set current instance minute to the given value. + * @method CarbonImmutable setMinute(int $value) Set current instance minute to the given value. + * @method CarbonImmutable seconds(int $value) Set current instance second to the given value. + * @method CarbonImmutable second(int $value) Set current instance second to the given value. + * @method CarbonImmutable setSeconds(int $value) Set current instance second to the given value. + * @method CarbonImmutable setSecond(int $value) Set current instance second to the given value. + * @method CarbonImmutable millis(int $value) Set current instance millisecond to the given value. + * @method CarbonImmutable milli(int $value) Set current instance millisecond to the given value. + * @method CarbonImmutable setMillis(int $value) Set current instance millisecond to the given value. + * @method CarbonImmutable setMilli(int $value) Set current instance millisecond to the given value. + * @method CarbonImmutable milliseconds(int $value) Set current instance millisecond to the given value. + * @method CarbonImmutable millisecond(int $value) Set current instance millisecond to the given value. + * @method CarbonImmutable setMilliseconds(int $value) Set current instance millisecond to the given value. + * @method CarbonImmutable setMillisecond(int $value) Set current instance millisecond to the given value. + * @method CarbonImmutable micros(int $value) Set current instance microsecond to the given value. + * @method CarbonImmutable micro(int $value) Set current instance microsecond to the given value. + * @method CarbonImmutable setMicros(int $value) Set current instance microsecond to the given value. + * @method CarbonImmutable setMicro(int $value) Set current instance microsecond to the given value. + * @method CarbonImmutable microseconds(int $value) Set current instance microsecond to the given value. + * @method CarbonImmutable microsecond(int $value) Set current instance microsecond to the given value. + * @method CarbonImmutable setMicroseconds(int $value) Set current instance microsecond to the given value. + * @method self setMicrosecond(int $value) Set current instance microsecond to the given value. + * @method CarbonImmutable addYears(int|float $value = 1, ?int $anchorDay = null) Add years (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable addYear() Add one year to the instance (using date interval). + * @method CarbonImmutable subYears(int|float $value = 1, ?int $anchorDay = null) Sub years (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable subYear() Sub one year to the instance (using date interval). + * @method CarbonImmutable addYearsWithOverflow(int|float $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonImmutable addYearWithOverflow() Add one year to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonImmutable subYearsWithOverflow(int|float $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonImmutable subYearWithOverflow() Sub one year to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonImmutable addYearsWithoutOverflow(int|float $value = 1, ?int $anchorDay = null) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addYearWithoutOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subYearsWithoutOverflow(int|float $value = 1, ?int $anchorDay = null) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subYearWithoutOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addYearsWithNoOverflow(int|float $value = 1, ?int $anchorDay = null) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addYearWithNoOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subYearsWithNoOverflow(int|float $value = 1, ?int $anchorDay = null) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subYearWithNoOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addYearsNoOverflow(int|float $value = 1, ?int $anchorDay = null) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addYearNoOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subYearsNoOverflow(int|float $value = 1, ?int $anchorDay = null) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subYearNoOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addMonths(int|float $value = 1, ?int $anchorDay = null) Add months (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable addMonth() Add one month to the instance (using date interval). + * @method CarbonImmutable subMonths(int|float $value = 1, ?int $anchorDay = null) Sub months (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable subMonth() Sub one month to the instance (using date interval). + * @method CarbonImmutable addMonthsWithOverflow(int|float $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonImmutable addMonthWithOverflow() Add one month to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonImmutable subMonthsWithOverflow(int|float $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonImmutable subMonthWithOverflow() Sub one month to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonImmutable addMonthsWithoutOverflow(int|float $value = 1, ?int $anchorDay = null) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addMonthWithoutOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subMonthsWithoutOverflow(int|float $value = 1, ?int $anchorDay = null) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subMonthWithoutOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addMonthsWithNoOverflow(int|float $value = 1, ?int $anchorDay = null) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addMonthWithNoOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subMonthsWithNoOverflow(int|float $value = 1, ?int $anchorDay = null) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subMonthWithNoOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addMonthsNoOverflow(int|float $value = 1, ?int $anchorDay = null) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addMonthNoOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subMonthsNoOverflow(int|float $value = 1, ?int $anchorDay = null) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subMonthNoOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addDays(int|float $value = 1) Add days (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable addDay() Add one day to the instance (using date interval). + * @method CarbonImmutable subDays(int|float $value = 1) Sub days (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable subDay() Sub one day to the instance (using date interval). + * @method CarbonImmutable addHours(int|float $value = 1) Add hours (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable addHour() Add one hour to the instance (using date interval). + * @method CarbonImmutable subHours(int|float $value = 1) Sub hours (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable subHour() Sub one hour to the instance (using date interval). + * @method CarbonImmutable addMinutes(int|float $value = 1) Add minutes (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable addMinute() Add one minute to the instance (using date interval). + * @method CarbonImmutable subMinutes(int|float $value = 1) Sub minutes (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable subMinute() Sub one minute to the instance (using date interval). + * @method CarbonImmutable addSeconds(int|float $value = 1) Add seconds (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable addSecond() Add one second to the instance (using date interval). + * @method CarbonImmutable subSeconds(int|float $value = 1) Sub seconds (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable subSecond() Sub one second to the instance (using date interval). + * @method CarbonImmutable addMillis(int|float $value = 1) Add milliseconds (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable addMilli() Add one millisecond to the instance (using date interval). + * @method CarbonImmutable subMillis(int|float $value = 1) Sub milliseconds (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable subMilli() Sub one millisecond to the instance (using date interval). + * @method CarbonImmutable addMilliseconds(int|float $value = 1) Add milliseconds (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable addMillisecond() Add one millisecond to the instance (using date interval). + * @method CarbonImmutable subMilliseconds(int|float $value = 1) Sub milliseconds (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable subMillisecond() Sub one millisecond to the instance (using date interval). + * @method CarbonImmutable addMicros(int|float $value = 1) Add microseconds (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable addMicro() Add one microsecond to the instance (using date interval). + * @method CarbonImmutable subMicros(int|float $value = 1) Sub microseconds (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable subMicro() Sub one microsecond to the instance (using date interval). + * @method CarbonImmutable addMicroseconds(int|float $value = 1) Add microseconds (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable addMicrosecond() Add one microsecond to the instance (using date interval). + * @method CarbonImmutable subMicroseconds(int|float $value = 1) Sub microseconds (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable subMicrosecond() Sub one microsecond to the instance (using date interval). + * @method CarbonImmutable addMillennia(int|float $value = 1, ?int $anchorDay = null) Add millennia (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable addMillennium() Add one millennium to the instance (using date interval). + * @method CarbonImmutable subMillennia(int|float $value = 1, ?int $anchorDay = null) Sub millennia (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable subMillennium() Sub one millennium to the instance (using date interval). + * @method CarbonImmutable addMillenniaWithOverflow(int|float $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonImmutable addMillenniumWithOverflow() Add one millennium to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonImmutable subMillenniaWithOverflow(int|float $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonImmutable subMillenniumWithOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonImmutable addMillenniaWithoutOverflow(int|float $value = 1, ?int $anchorDay = null) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addMillenniumWithoutOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subMillenniaWithoutOverflow(int|float $value = 1, ?int $anchorDay = null) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subMillenniumWithoutOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addMillenniaWithNoOverflow(int|float $value = 1, ?int $anchorDay = null) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addMillenniumWithNoOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subMillenniaWithNoOverflow(int|float $value = 1, ?int $anchorDay = null) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subMillenniumWithNoOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addMillenniaNoOverflow(int|float $value = 1, ?int $anchorDay = null) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addMillenniumNoOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subMillenniaNoOverflow(int|float $value = 1, ?int $anchorDay = null) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subMillenniumNoOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addCenturies(int|float $value = 1, ?int $anchorDay = null) Add centuries (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable addCentury() Add one century to the instance (using date interval). + * @method CarbonImmutable subCenturies(int|float $value = 1, ?int $anchorDay = null) Sub centuries (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable subCentury() Sub one century to the instance (using date interval). + * @method CarbonImmutable addCenturiesWithOverflow(int|float $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonImmutable addCenturyWithOverflow() Add one century to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonImmutable subCenturiesWithOverflow(int|float $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonImmutable subCenturyWithOverflow() Sub one century to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonImmutable addCenturiesWithoutOverflow(int|float $value = 1, ?int $anchorDay = null) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addCenturyWithoutOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subCenturiesWithoutOverflow(int|float $value = 1, ?int $anchorDay = null) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subCenturyWithoutOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addCenturiesWithNoOverflow(int|float $value = 1, ?int $anchorDay = null) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addCenturyWithNoOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subCenturiesWithNoOverflow(int|float $value = 1, ?int $anchorDay = null) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subCenturyWithNoOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addCenturiesNoOverflow(int|float $value = 1, ?int $anchorDay = null) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addCenturyNoOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subCenturiesNoOverflow(int|float $value = 1, ?int $anchorDay = null) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subCenturyNoOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addDecades(int|float $value = 1, ?int $anchorDay = null) Add decades (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable addDecade() Add one decade to the instance (using date interval). + * @method CarbonImmutable subDecades(int|float $value = 1, ?int $anchorDay = null) Sub decades (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable subDecade() Sub one decade to the instance (using date interval). + * @method CarbonImmutable addDecadesWithOverflow(int|float $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonImmutable addDecadeWithOverflow() Add one decade to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonImmutable subDecadesWithOverflow(int|float $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonImmutable subDecadeWithOverflow() Sub one decade to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonImmutable addDecadesWithoutOverflow(int|float $value = 1, ?int $anchorDay = null) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addDecadeWithoutOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subDecadesWithoutOverflow(int|float $value = 1, ?int $anchorDay = null) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subDecadeWithoutOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addDecadesWithNoOverflow(int|float $value = 1, ?int $anchorDay = null) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addDecadeWithNoOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subDecadesWithNoOverflow(int|float $value = 1, ?int $anchorDay = null) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subDecadeWithNoOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addDecadesNoOverflow(int|float $value = 1, ?int $anchorDay = null) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addDecadeNoOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subDecadesNoOverflow(int|float $value = 1, ?int $anchorDay = null) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subDecadeNoOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addQuarters(int|float $value = 1, ?int $anchorDay = null) Add quarters (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable addQuarter() Add one quarter to the instance (using date interval). + * @method CarbonImmutable subQuarters(int|float $value = 1, ?int $anchorDay = null) Sub quarters (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable subQuarter() Sub one quarter to the instance (using date interval). + * @method CarbonImmutable addQuartersWithOverflow(int|float $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonImmutable addQuarterWithOverflow() Add one quarter to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonImmutable subQuartersWithOverflow(int|float $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonImmutable subQuarterWithOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonImmutable addQuartersWithoutOverflow(int|float $value = 1, ?int $anchorDay = null) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addQuarterWithoutOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subQuartersWithoutOverflow(int|float $value = 1, ?int $anchorDay = null) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subQuarterWithoutOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addQuartersWithNoOverflow(int|float $value = 1, ?int $anchorDay = null) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addQuarterWithNoOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subQuartersWithNoOverflow(int|float $value = 1, ?int $anchorDay = null) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subQuarterWithNoOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addQuartersNoOverflow(int|float $value = 1, ?int $anchorDay = null) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addQuarterNoOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subQuartersNoOverflow(int|float $value = 1, ?int $anchorDay = null) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subQuarterNoOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addWeeks(int|float $value = 1) Add weeks (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable addWeek() Add one week to the instance (using date interval). + * @method CarbonImmutable subWeeks(int|float $value = 1) Sub weeks (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable subWeek() Sub one week to the instance (using date interval). + * @method CarbonImmutable addWeekdays(int|float $value = 1) Add weekdays (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable addWeekday() Add one weekday to the instance (using date interval). + * @method CarbonImmutable subWeekdays(int|float $value = 1) Sub weekdays (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable subWeekday() Sub one weekday to the instance (using date interval). + * @method CarbonImmutable addUTCMicros(int|float $value = 1) Add microseconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable addUTCMicro() Add one microsecond to the instance (using timestamp). + * @method CarbonImmutable subUTCMicros(int|float $value = 1) Sub microseconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable subUTCMicro() Sub one microsecond to the instance (using timestamp). + * @method CarbonPeriod microsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each microsecond or every X microseconds if a factor is given. + * @method float diffInUTCMicros(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of microseconds. + * @method CarbonImmutable addUTCMicroseconds(int|float $value = 1) Add microseconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable addUTCMicrosecond() Add one microsecond to the instance (using timestamp). + * @method CarbonImmutable subUTCMicroseconds(int|float $value = 1) Sub microseconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable subUTCMicrosecond() Sub one microsecond to the instance (using timestamp). + * @method CarbonPeriod microsecondsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each microsecond or every X microseconds if a factor is given. + * @method float diffInUTCMicroseconds(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of microseconds. + * @method CarbonImmutable addUTCMillis(int|float $value = 1) Add milliseconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable addUTCMilli() Add one millisecond to the instance (using timestamp). + * @method CarbonImmutable subUTCMillis(int|float $value = 1) Sub milliseconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable subUTCMilli() Sub one millisecond to the instance (using timestamp). + * @method CarbonPeriod millisUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millisecond or every X milliseconds if a factor is given. + * @method float diffInUTCMillis(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of milliseconds. + * @method CarbonImmutable addUTCMilliseconds(int|float $value = 1) Add milliseconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable addUTCMillisecond() Add one millisecond to the instance (using timestamp). + * @method CarbonImmutable subUTCMilliseconds(int|float $value = 1) Sub milliseconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable subUTCMillisecond() Sub one millisecond to the instance (using timestamp). + * @method CarbonPeriod millisecondsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millisecond or every X milliseconds if a factor is given. + * @method float diffInUTCMilliseconds(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of milliseconds. + * @method CarbonImmutable addUTCSeconds(int|float $value = 1) Add seconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable addUTCSecond() Add one second to the instance (using timestamp). + * @method CarbonImmutable subUTCSeconds(int|float $value = 1) Sub seconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable subUTCSecond() Sub one second to the instance (using timestamp). + * @method CarbonPeriod secondsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each second or every X seconds if a factor is given. + * @method float diffInUTCSeconds(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of seconds. + * @method CarbonImmutable addUTCMinutes(int|float $value = 1) Add minutes (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable addUTCMinute() Add one minute to the instance (using timestamp). + * @method CarbonImmutable subUTCMinutes(int|float $value = 1) Sub minutes (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable subUTCMinute() Sub one minute to the instance (using timestamp). + * @method CarbonPeriod minutesUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each minute or every X minutes if a factor is given. + * @method float diffInUTCMinutes(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of minutes. + * @method CarbonImmutable addUTCHours(int|float $value = 1) Add hours (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable addUTCHour() Add one hour to the instance (using timestamp). + * @method CarbonImmutable subUTCHours(int|float $value = 1) Sub hours (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable subUTCHour() Sub one hour to the instance (using timestamp). + * @method CarbonPeriod hoursUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each hour or every X hours if a factor is given. + * @method float diffInUTCHours(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of hours. + * @method CarbonImmutable addUTCDays(int|float $value = 1) Add days (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable addUTCDay() Add one day to the instance (using timestamp). + * @method CarbonImmutable subUTCDays(int|float $value = 1) Sub days (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable subUTCDay() Sub one day to the instance (using timestamp). + * @method CarbonPeriod daysUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each day or every X days if a factor is given. + * @method float diffInUTCDays(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of days. + * @method CarbonImmutable addUTCWeeks(int|float $value = 1) Add weeks (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable addUTCWeek() Add one week to the instance (using timestamp). + * @method CarbonImmutable subUTCWeeks(int|float $value = 1) Sub weeks (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable subUTCWeek() Sub one week to the instance (using timestamp). + * @method CarbonPeriod weeksUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each week or every X weeks if a factor is given. + * @method float diffInUTCWeeks(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of weeks. + * @method CarbonImmutable addUTCMonths(int|float $value = 1) Add months (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable addUTCMonth() Add one month to the instance (using timestamp). + * @method CarbonImmutable subUTCMonths(int|float $value = 1) Sub months (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable subUTCMonth() Sub one month to the instance (using timestamp). + * @method CarbonPeriod monthsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each month or every X months if a factor is given. + * @method float diffInUTCMonths(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of months. + * @method CarbonImmutable addUTCQuarters(int|float $value = 1) Add quarters (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable addUTCQuarter() Add one quarter to the instance (using timestamp). + * @method CarbonImmutable subUTCQuarters(int|float $value = 1) Sub quarters (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable subUTCQuarter() Sub one quarter to the instance (using timestamp). + * @method CarbonPeriod quartersUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each quarter or every X quarters if a factor is given. + * @method float diffInUTCQuarters(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of quarters. + * @method CarbonImmutable addUTCYears(int|float $value = 1) Add years (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable addUTCYear() Add one year to the instance (using timestamp). + * @method CarbonImmutable subUTCYears(int|float $value = 1) Sub years (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable subUTCYear() Sub one year to the instance (using timestamp). + * @method CarbonPeriod yearsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each year or every X years if a factor is given. + * @method float diffInUTCYears(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of years. + * @method CarbonImmutable addUTCDecades(int|float $value = 1) Add decades (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable addUTCDecade() Add one decade to the instance (using timestamp). + * @method CarbonImmutable subUTCDecades(int|float $value = 1) Sub decades (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable subUTCDecade() Sub one decade to the instance (using timestamp). + * @method CarbonPeriod decadesUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each decade or every X decades if a factor is given. + * @method float diffInUTCDecades(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of decades. + * @method CarbonImmutable addUTCCenturies(int|float $value = 1) Add centuries (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable addUTCCentury() Add one century to the instance (using timestamp). + * @method CarbonImmutable subUTCCenturies(int|float $value = 1) Sub centuries (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable subUTCCentury() Sub one century to the instance (using timestamp). + * @method CarbonPeriod centuriesUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each century or every X centuries if a factor is given. + * @method float diffInUTCCenturies(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of centuries. + * @method CarbonImmutable addUTCMillennia(int|float $value = 1) Add millennia (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable addUTCMillennium() Add one millennium to the instance (using timestamp). + * @method CarbonImmutable subUTCMillennia(int|float $value = 1) Sub millennia (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable subUTCMillennium() Sub one millennium to the instance (using timestamp). + * @method CarbonPeriod millenniaUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millennium or every X millennia if a factor is given. + * @method float diffInUTCMillennia(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of millennia. + * @method CarbonImmutable roundYear(float $precision = 1, string $function = "round") Round the current instance year with given precision using the given function. + * @method CarbonImmutable roundYears(float $precision = 1, string $function = "round") Round the current instance year with given precision using the given function. + * @method CarbonImmutable floorYear(float $precision = 1) Truncate the current instance year with given precision. + * @method CarbonImmutable floorYears(float $precision = 1) Truncate the current instance year with given precision. + * @method CarbonImmutable ceilYear(float $precision = 1) Ceil the current instance year with given precision. + * @method CarbonImmutable ceilYears(float $precision = 1) Ceil the current instance year with given precision. + * @method CarbonImmutable roundMonth(float $precision = 1, string $function = "round") Round the current instance month with given precision using the given function. + * @method CarbonImmutable roundMonths(float $precision = 1, string $function = "round") Round the current instance month with given precision using the given function. + * @method CarbonImmutable floorMonth(float $precision = 1) Truncate the current instance month with given precision. + * @method CarbonImmutable floorMonths(float $precision = 1) Truncate the current instance month with given precision. + * @method CarbonImmutable ceilMonth(float $precision = 1) Ceil the current instance month with given precision. + * @method CarbonImmutable ceilMonths(float $precision = 1) Ceil the current instance month with given precision. + * @method CarbonImmutable roundDay(float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. + * @method CarbonImmutable roundDays(float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. + * @method CarbonImmutable floorDay(float $precision = 1) Truncate the current instance day with given precision. + * @method CarbonImmutable floorDays(float $precision = 1) Truncate the current instance day with given precision. + * @method CarbonImmutable ceilDay(float $precision = 1) Ceil the current instance day with given precision. + * @method CarbonImmutable ceilDays(float $precision = 1) Ceil the current instance day with given precision. + * @method CarbonImmutable roundHour(float $precision = 1, string $function = "round") Round the current instance hour with given precision using the given function. + * @method CarbonImmutable roundHours(float $precision = 1, string $function = "round") Round the current instance hour with given precision using the given function. + * @method CarbonImmutable floorHour(float $precision = 1) Truncate the current instance hour with given precision. + * @method CarbonImmutable floorHours(float $precision = 1) Truncate the current instance hour with given precision. + * @method CarbonImmutable ceilHour(float $precision = 1) Ceil the current instance hour with given precision. + * @method CarbonImmutable ceilHours(float $precision = 1) Ceil the current instance hour with given precision. + * @method CarbonImmutable roundMinute(float $precision = 1, string $function = "round") Round the current instance minute with given precision using the given function. + * @method CarbonImmutable roundMinutes(float $precision = 1, string $function = "round") Round the current instance minute with given precision using the given function. + * @method CarbonImmutable floorMinute(float $precision = 1) Truncate the current instance minute with given precision. + * @method CarbonImmutable floorMinutes(float $precision = 1) Truncate the current instance minute with given precision. + * @method CarbonImmutable ceilMinute(float $precision = 1) Ceil the current instance minute with given precision. + * @method CarbonImmutable ceilMinutes(float $precision = 1) Ceil the current instance minute with given precision. + * @method CarbonImmutable roundSecond(float $precision = 1, string $function = "round") Round the current instance second with given precision using the given function. + * @method CarbonImmutable roundSeconds(float $precision = 1, string $function = "round") Round the current instance second with given precision using the given function. + * @method CarbonImmutable floorSecond(float $precision = 1) Truncate the current instance second with given precision. + * @method CarbonImmutable floorSeconds(float $precision = 1) Truncate the current instance second with given precision. + * @method CarbonImmutable ceilSecond(float $precision = 1) Ceil the current instance second with given precision. + * @method CarbonImmutable ceilSeconds(float $precision = 1) Ceil the current instance second with given precision. + * @method CarbonImmutable roundMillennium(float $precision = 1, string $function = "round") Round the current instance millennium with given precision using the given function. + * @method CarbonImmutable roundMillennia(float $precision = 1, string $function = "round") Round the current instance millennium with given precision using the given function. + * @method CarbonImmutable floorMillennium(float $precision = 1) Truncate the current instance millennium with given precision. + * @method CarbonImmutable floorMillennia(float $precision = 1) Truncate the current instance millennium with given precision. + * @method CarbonImmutable ceilMillennium(float $precision = 1) Ceil the current instance millennium with given precision. + * @method CarbonImmutable ceilMillennia(float $precision = 1) Ceil the current instance millennium with given precision. + * @method CarbonImmutable roundCentury(float $precision = 1, string $function = "round") Round the current instance century with given precision using the given function. + * @method CarbonImmutable roundCenturies(float $precision = 1, string $function = "round") Round the current instance century with given precision using the given function. + * @method CarbonImmutable floorCentury(float $precision = 1) Truncate the current instance century with given precision. + * @method CarbonImmutable floorCenturies(float $precision = 1) Truncate the current instance century with given precision. + * @method CarbonImmutable ceilCentury(float $precision = 1) Ceil the current instance century with given precision. + * @method CarbonImmutable ceilCenturies(float $precision = 1) Ceil the current instance century with given precision. + * @method CarbonImmutable roundDecade(float $precision = 1, string $function = "round") Round the current instance decade with given precision using the given function. + * @method CarbonImmutable roundDecades(float $precision = 1, string $function = "round") Round the current instance decade with given precision using the given function. + * @method CarbonImmutable floorDecade(float $precision = 1) Truncate the current instance decade with given precision. + * @method CarbonImmutable floorDecades(float $precision = 1) Truncate the current instance decade with given precision. + * @method CarbonImmutable ceilDecade(float $precision = 1) Ceil the current instance decade with given precision. + * @method CarbonImmutable ceilDecades(float $precision = 1) Ceil the current instance decade with given precision. + * @method CarbonImmutable roundQuarter(float $precision = 1, string $function = "round") Round the current instance quarter with given precision using the given function. + * @method CarbonImmutable roundQuarters(float $precision = 1, string $function = "round") Round the current instance quarter with given precision using the given function. + * @method CarbonImmutable floorQuarter(float $precision = 1) Truncate the current instance quarter with given precision. + * @method CarbonImmutable floorQuarters(float $precision = 1) Truncate the current instance quarter with given precision. + * @method CarbonImmutable ceilQuarter(float $precision = 1) Ceil the current instance quarter with given precision. + * @method CarbonImmutable ceilQuarters(float $precision = 1) Ceil the current instance quarter with given precision. + * @method CarbonImmutable roundMillisecond(float $precision = 1, string $function = "round") Round the current instance millisecond with given precision using the given function. + * @method CarbonImmutable roundMilliseconds(float $precision = 1, string $function = "round") Round the current instance millisecond with given precision using the given function. + * @method CarbonImmutable floorMillisecond(float $precision = 1) Truncate the current instance millisecond with given precision. + * @method CarbonImmutable floorMilliseconds(float $precision = 1) Truncate the current instance millisecond with given precision. + * @method CarbonImmutable ceilMillisecond(float $precision = 1) Ceil the current instance millisecond with given precision. + * @method CarbonImmutable ceilMilliseconds(float $precision = 1) Ceil the current instance millisecond with given precision. + * @method CarbonImmutable roundMicrosecond(float $precision = 1, string $function = "round") Round the current instance microsecond with given precision using the given function. + * @method CarbonImmutable roundMicroseconds(float $precision = 1, string $function = "round") Round the current instance microsecond with given precision using the given function. + * @method CarbonImmutable floorMicrosecond(float $precision = 1) Truncate the current instance microsecond with given precision. + * @method CarbonImmutable floorMicroseconds(float $precision = 1) Truncate the current instance microsecond with given precision. + * @method CarbonImmutable ceilMicrosecond(float $precision = 1) Ceil the current instance microsecond with given precision. + * @method CarbonImmutable ceilMicroseconds(float $precision = 1) Ceil the current instance microsecond with given precision. + * @method string shortAbsoluteDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'Absolute' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string longAbsoluteDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'Absolute' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string shortRelativeDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'Relative' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string longRelativeDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'Relative' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string shortRelativeToNowDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'RelativeToNow' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string longRelativeToNowDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'RelativeToNow' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string shortRelativeToOtherDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'RelativeToOther' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string longRelativeToOtherDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'RelativeToOther' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method int centuriesInMillennium() Return the number of centuries contained in the current millennium + * @method int|static centuryOfMillennium(?int $century = null) Return the value of the century starting from the beginning of the current millennium when called with no parameters, change the current century when called with an integer value + * @method int|static dayOfCentury(?int $day = null) Return the value of the day starting from the beginning of the current century when called with no parameters, change the current day when called with an integer value + * @method int|static dayOfDecade(?int $day = null) Return the value of the day starting from the beginning of the current decade when called with no parameters, change the current day when called with an integer value + * @method int|static dayOfMillennium(?int $day = null) Return the value of the day starting from the beginning of the current millennium when called with no parameters, change the current day when called with an integer value + * @method int|static dayOfMonth(?int $day = null) Return the value of the day starting from the beginning of the current month when called with no parameters, change the current day when called with an integer value + * @method int|static dayOfQuarter(?int $day = null) Return the value of the day starting from the beginning of the current quarter when called with no parameters, change the current day when called with an integer value + * @method int|static dayOfWeek(?int $day = null) Return the value of the day starting from the beginning of the current week when called with no parameters, change the current day when called with an integer value + * @method int daysInCentury() Return the number of days contained in the current century + * @method int daysInDecade() Return the number of days contained in the current decade + * @method int daysInMillennium() Return the number of days contained in the current millennium + * @method int daysInMonth() Return the number of days contained in the current month + * @method int daysInQuarter() Return the number of days contained in the current quarter + * @method int daysInWeek() Return the number of days contained in the current week + * @method int daysInYear() Return the number of days contained in the current year + * @method int|static decadeOfCentury(?int $decade = null) Return the value of the decade starting from the beginning of the current century when called with no parameters, change the current decade when called with an integer value + * @method int|static decadeOfMillennium(?int $decade = null) Return the value of the decade starting from the beginning of the current millennium when called with no parameters, change the current decade when called with an integer value + * @method int decadesInCentury() Return the number of decades contained in the current century + * @method int decadesInMillennium() Return the number of decades contained in the current millennium + * @method int|static hourOfCentury(?int $hour = null) Return the value of the hour starting from the beginning of the current century when called with no parameters, change the current hour when called with an integer value + * @method int|static hourOfDay(?int $hour = null) Return the value of the hour starting from the beginning of the current day when called with no parameters, change the current hour when called with an integer value + * @method int|static hourOfDecade(?int $hour = null) Return the value of the hour starting from the beginning of the current decade when called with no parameters, change the current hour when called with an integer value + * @method int|static hourOfMillennium(?int $hour = null) Return the value of the hour starting from the beginning of the current millennium when called with no parameters, change the current hour when called with an integer value + * @method int|static hourOfMonth(?int $hour = null) Return the value of the hour starting from the beginning of the current month when called with no parameters, change the current hour when called with an integer value + * @method int|static hourOfQuarter(?int $hour = null) Return the value of the hour starting from the beginning of the current quarter when called with no parameters, change the current hour when called with an integer value + * @method int|static hourOfWeek(?int $hour = null) Return the value of the hour starting from the beginning of the current week when called with no parameters, change the current hour when called with an integer value + * @method int|static hourOfYear(?int $hour = null) Return the value of the hour starting from the beginning of the current year when called with no parameters, change the current hour when called with an integer value + * @method int hoursInCentury() Return the number of hours contained in the current century + * @method int hoursInDay() Return the number of hours contained in the current day + * @method int hoursInDecade() Return the number of hours contained in the current decade + * @method int hoursInMillennium() Return the number of hours contained in the current millennium + * @method int hoursInMonth() Return the number of hours contained in the current month + * @method int hoursInQuarter() Return the number of hours contained in the current quarter + * @method int hoursInWeek() Return the number of hours contained in the current week + * @method int hoursInYear() Return the number of hours contained in the current year + * @method int|static microsecondOfCentury(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current century when called with no parameters, change the current microsecond when called with an integer value + * @method int|static microsecondOfDay(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current day when called with no parameters, change the current microsecond when called with an integer value + * @method int|static microsecondOfDecade(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current decade when called with no parameters, change the current microsecond when called with an integer value + * @method int|static microsecondOfHour(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current hour when called with no parameters, change the current microsecond when called with an integer value + * @method int|static microsecondOfMillennium(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current millennium when called with no parameters, change the current microsecond when called with an integer value + * @method int|static microsecondOfMillisecond(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current millisecond when called with no parameters, change the current microsecond when called with an integer value + * @method int|static microsecondOfMinute(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current minute when called with no parameters, change the current microsecond when called with an integer value + * @method int|static microsecondOfMonth(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current month when called with no parameters, change the current microsecond when called with an integer value + * @method int|static microsecondOfQuarter(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current quarter when called with no parameters, change the current microsecond when called with an integer value + * @method int|static microsecondOfSecond(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current second when called with no parameters, change the current microsecond when called with an integer value + * @method int|static microsecondOfWeek(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current week when called with no parameters, change the current microsecond when called with an integer value + * @method int|static microsecondOfYear(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current year when called with no parameters, change the current microsecond when called with an integer value + * @method int microsecondsInCentury() Return the number of microseconds contained in the current century + * @method int microsecondsInDay() Return the number of microseconds contained in the current day + * @method int microsecondsInDecade() Return the number of microseconds contained in the current decade + * @method int microsecondsInHour() Return the number of microseconds contained in the current hour + * @method int microsecondsInMillennium() Return the number of microseconds contained in the current millennium + * @method int microsecondsInMillisecond() Return the number of microseconds contained in the current millisecond + * @method int microsecondsInMinute() Return the number of microseconds contained in the current minute + * @method int microsecondsInMonth() Return the number of microseconds contained in the current month + * @method int microsecondsInQuarter() Return the number of microseconds contained in the current quarter + * @method int microsecondsInSecond() Return the number of microseconds contained in the current second + * @method int microsecondsInWeek() Return the number of microseconds contained in the current week + * @method int microsecondsInYear() Return the number of microseconds contained in the current year + * @method int|static millisecondOfCentury(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current century when called with no parameters, change the current millisecond when called with an integer value + * @method int|static millisecondOfDay(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current day when called with no parameters, change the current millisecond when called with an integer value + * @method int|static millisecondOfDecade(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current decade when called with no parameters, change the current millisecond when called with an integer value + * @method int|static millisecondOfHour(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current hour when called with no parameters, change the current millisecond when called with an integer value + * @method int|static millisecondOfMillennium(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current millennium when called with no parameters, change the current millisecond when called with an integer value + * @method int|static millisecondOfMinute(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current minute when called with no parameters, change the current millisecond when called with an integer value + * @method int|static millisecondOfMonth(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current month when called with no parameters, change the current millisecond when called with an integer value + * @method int|static millisecondOfQuarter(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current quarter when called with no parameters, change the current millisecond when called with an integer value + * @method int|static millisecondOfSecond(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current second when called with no parameters, change the current millisecond when called with an integer value + * @method int|static millisecondOfWeek(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current week when called with no parameters, change the current millisecond when called with an integer value + * @method int|static millisecondOfYear(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current year when called with no parameters, change the current millisecond when called with an integer value + * @method int millisecondsInCentury() Return the number of milliseconds contained in the current century + * @method int millisecondsInDay() Return the number of milliseconds contained in the current day + * @method int millisecondsInDecade() Return the number of milliseconds contained in the current decade + * @method int millisecondsInHour() Return the number of milliseconds contained in the current hour + * @method int millisecondsInMillennium() Return the number of milliseconds contained in the current millennium + * @method int millisecondsInMinute() Return the number of milliseconds contained in the current minute + * @method int millisecondsInMonth() Return the number of milliseconds contained in the current month + * @method int millisecondsInQuarter() Return the number of milliseconds contained in the current quarter + * @method int millisecondsInSecond() Return the number of milliseconds contained in the current second + * @method int millisecondsInWeek() Return the number of milliseconds contained in the current week + * @method int millisecondsInYear() Return the number of milliseconds contained in the current year + * @method int|static minuteOfCentury(?int $minute = null) Return the value of the minute starting from the beginning of the current century when called with no parameters, change the current minute when called with an integer value + * @method int|static minuteOfDay(?int $minute = null) Return the value of the minute starting from the beginning of the current day when called with no parameters, change the current minute when called with an integer value + * @method int|static minuteOfDecade(?int $minute = null) Return the value of the minute starting from the beginning of the current decade when called with no parameters, change the current minute when called with an integer value + * @method int|static minuteOfHour(?int $minute = null) Return the value of the minute starting from the beginning of the current hour when called with no parameters, change the current minute when called with an integer value + * @method int|static minuteOfMillennium(?int $minute = null) Return the value of the minute starting from the beginning of the current millennium when called with no parameters, change the current minute when called with an integer value + * @method int|static minuteOfMonth(?int $minute = null) Return the value of the minute starting from the beginning of the current month when called with no parameters, change the current minute when called with an integer value + * @method int|static minuteOfQuarter(?int $minute = null) Return the value of the minute starting from the beginning of the current quarter when called with no parameters, change the current minute when called with an integer value + * @method int|static minuteOfWeek(?int $minute = null) Return the value of the minute starting from the beginning of the current week when called with no parameters, change the current minute when called with an integer value + * @method int|static minuteOfYear(?int $minute = null) Return the value of the minute starting from the beginning of the current year when called with no parameters, change the current minute when called with an integer value + * @method int minutesInCentury() Return the number of minutes contained in the current century + * @method int minutesInDay() Return the number of minutes contained in the current day + * @method int minutesInDecade() Return the number of minutes contained in the current decade + * @method int minutesInHour() Return the number of minutes contained in the current hour + * @method int minutesInMillennium() Return the number of minutes contained in the current millennium + * @method int minutesInMonth() Return the number of minutes contained in the current month + * @method int minutesInQuarter() Return the number of minutes contained in the current quarter + * @method int minutesInWeek() Return the number of minutes contained in the current week + * @method int minutesInYear() Return the number of minutes contained in the current year + * @method int|static monthOfCentury(?int $month = null) Return the value of the month starting from the beginning of the current century when called with no parameters, change the current month when called with an integer value + * @method int|static monthOfDecade(?int $month = null) Return the value of the month starting from the beginning of the current decade when called with no parameters, change the current month when called with an integer value + * @method int|static monthOfMillennium(?int $month = null) Return the value of the month starting from the beginning of the current millennium when called with no parameters, change the current month when called with an integer value + * @method int|static monthOfQuarter(?int $month = null) Return the value of the month starting from the beginning of the current quarter when called with no parameters, change the current month when called with an integer value + * @method int|static monthOfYear(?int $month = null) Return the value of the month starting from the beginning of the current year when called with no parameters, change the current month when called with an integer value + * @method int monthsInCentury() Return the number of months contained in the current century + * @method int monthsInDecade() Return the number of months contained in the current decade + * @method int monthsInMillennium() Return the number of months contained in the current millennium + * @method int monthsInQuarter() Return the number of months contained in the current quarter + * @method int monthsInYear() Return the number of months contained in the current year + * @method int|static quarterOfCentury(?int $quarter = null) Return the value of the quarter starting from the beginning of the current century when called with no parameters, change the current quarter when called with an integer value + * @method int|static quarterOfDecade(?int $quarter = null) Return the value of the quarter starting from the beginning of the current decade when called with no parameters, change the current quarter when called with an integer value + * @method int|static quarterOfMillennium(?int $quarter = null) Return the value of the quarter starting from the beginning of the current millennium when called with no parameters, change the current quarter when called with an integer value + * @method int|static quarterOfYear(?int $quarter = null) Return the value of the quarter starting from the beginning of the current year when called with no parameters, change the current quarter when called with an integer value + * @method int quartersInCentury() Return the number of quarters contained in the current century + * @method int quartersInDecade() Return the number of quarters contained in the current decade + * @method int quartersInMillennium() Return the number of quarters contained in the current millennium + * @method int quartersInYear() Return the number of quarters contained in the current year + * @method int|static secondOfCentury(?int $second = null) Return the value of the second starting from the beginning of the current century when called with no parameters, change the current second when called with an integer value + * @method int|static secondOfDay(?int $second = null) Return the value of the second starting from the beginning of the current day when called with no parameters, change the current second when called with an integer value + * @method int|static secondOfDecade(?int $second = null) Return the value of the second starting from the beginning of the current decade when called with no parameters, change the current second when called with an integer value + * @method int|static secondOfHour(?int $second = null) Return the value of the second starting from the beginning of the current hour when called with no parameters, change the current second when called with an integer value + * @method int|static secondOfMillennium(?int $second = null) Return the value of the second starting from the beginning of the current millennium when called with no parameters, change the current second when called with an integer value + * @method int|static secondOfMinute(?int $second = null) Return the value of the second starting from the beginning of the current minute when called with no parameters, change the current second when called with an integer value + * @method int|static secondOfMonth(?int $second = null) Return the value of the second starting from the beginning of the current month when called with no parameters, change the current second when called with an integer value + * @method int|static secondOfQuarter(?int $second = null) Return the value of the second starting from the beginning of the current quarter when called with no parameters, change the current second when called with an integer value + * @method int|static secondOfWeek(?int $second = null) Return the value of the second starting from the beginning of the current week when called with no parameters, change the current second when called with an integer value + * @method int|static secondOfYear(?int $second = null) Return the value of the second starting from the beginning of the current year when called with no parameters, change the current second when called with an integer value + * @method int secondsInCentury() Return the number of seconds contained in the current century + * @method int secondsInDay() Return the number of seconds contained in the current day + * @method int secondsInDecade() Return the number of seconds contained in the current decade + * @method int secondsInHour() Return the number of seconds contained in the current hour + * @method int secondsInMillennium() Return the number of seconds contained in the current millennium + * @method int secondsInMinute() Return the number of seconds contained in the current minute + * @method int secondsInMonth() Return the number of seconds contained in the current month + * @method int secondsInQuarter() Return the number of seconds contained in the current quarter + * @method int secondsInWeek() Return the number of seconds contained in the current week + * @method int secondsInYear() Return the number of seconds contained in the current year + * @method int|static weekOfCentury(?int $week = null) Return the value of the week starting from the beginning of the current century when called with no parameters, change the current week when called with an integer value + * @method int|static weekOfDecade(?int $week = null) Return the value of the week starting from the beginning of the current decade when called with no parameters, change the current week when called with an integer value + * @method int|static weekOfMillennium(?int $week = null) Return the value of the week starting from the beginning of the current millennium when called with no parameters, change the current week when called with an integer value + * @method int|static weekOfMonth(?int $week = null) Return the value of the week starting from the beginning of the current month when called with no parameters, change the current week when called with an integer value + * @method int|static weekOfQuarter(?int $week = null) Return the value of the week starting from the beginning of the current quarter when called with no parameters, change the current week when called with an integer value + * @method int|static weekOfYear(?int $week = null) Return the value of the week starting from the beginning of the current year when called with no parameters, change the current week when called with an integer value + * @method int weeksInCentury() Return the number of weeks contained in the current century + * @method int weeksInDecade() Return the number of weeks contained in the current decade + * @method int weeksInMillennium() Return the number of weeks contained in the current millennium + * @method int weeksInMonth() Return the number of weeks contained in the current month + * @method int weeksInQuarter() Return the number of weeks contained in the current quarter + * @method int|static yearOfCentury(?int $year = null) Return the value of the year starting from the beginning of the current century when called with no parameters, change the current year when called with an integer value + * @method int|static yearOfDecade(?int $year = null) Return the value of the year starting from the beginning of the current decade when called with no parameters, change the current year when called with an integer value + * @method int|static yearOfMillennium(?int $year = null) Return the value of the year starting from the beginning of the current millennium when called with no parameters, change the current year when called with an integer value + * @method int yearsInCentury() Return the number of years contained in the current century + * @method int yearsInDecade() Return the number of years contained in the current decade + * @method int yearsInMillennium() Return the number of years contained in the current millennium + * @method static plus(int $years = 0, int $months = 0, int|float $weeks = 0, int|float $days = 0, int|float $hours = 0, int|float $minutes = 0, int|float $seconds = 0, int|float $microseconds = 0, OverflowMode|bool|null $overflow = null, ?int $anchorDay = null) Add given amount of time to the current date. + * @method static minus(int $years = 0, int $months = 0, int|float $weeks = 0, int|float $days = 0, int|float $hours = 0, int|float $minutes = 0, int|float $seconds = 0, int|float $microseconds = 0, OverflowMode|bool|null $overflow = null, ?int $anchorDay = null) Subtract given amount of time to the current date. * * */ diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/CarbonInterface.php b/plugins/vendor/nesbot/carbon/src/Carbon/CarbonInterface.php index 25e05dad..a625c092 100644 --- a/plugins/vendor/nesbot/carbon/src/Carbon/CarbonInterface.php +++ b/plugins/vendor/nesbot/carbon/src/Carbon/CarbonInterface.php @@ -42,10 +42,10 @@ use Throwable; * * * - * @property string $localeDayOfWeek the day of week in current locale - * @property string $shortLocaleDayOfWeek the abbreviated day of week in current locale - * @property string $localeMonth the month in current locale - * @property string $shortLocaleMonth the abbreviated month in current locale + * @property string $localeDayOfWeek the day of week in current locale + * @property string $shortLocaleDayOfWeek the abbreviated day of week in current locale + * @property string $localeMonth the month in current locale + * @property string $shortLocaleMonth the abbreviated month in current locale * @property int $year * @property int $yearIso * @property int $month @@ -55,801 +55,803 @@ use Throwable; * @property int $second * @property int $micro * @property int $microsecond - * @property int $dayOfWeekIso 1 (for Monday) through 7 (for Sunday) - * @property int|float|string $timestamp seconds since the Unix Epoch - * @property string $englishDayOfWeek the day of week in English - * @property string $shortEnglishDayOfWeek the abbreviated day of week in English - * @property string $englishMonth the month in English - * @property string $shortEnglishMonth the abbreviated month in English + * @property int $dayOfWeekIso 1 (for Monday) through 7 (for Sunday) + * @property int|float|string $timestamp seconds since the Unix Epoch + * @property string $englishDayOfWeek the day of week in English + * @property string $shortEnglishDayOfWeek the abbreviated day of week in English + * @property string $englishMonth the month in English + * @property string $shortEnglishMonth the abbreviated month in English * @property int $milliseconds * @property int $millisecond * @property int $milli - * @property int $week 1 through 53 - * @property int $isoWeek 1 through 53 - * @property int $weekYear year according to week format - * @property int $isoWeekYear year according to ISO week format - * @property int $age does a diffInYears() with default parameters - * @property int $offset the timezone offset in seconds from UTC - * @property int $offsetMinutes the timezone offset in minutes from UTC - * @property int $offsetHours the timezone offset in hours from UTC - * @property CarbonTimeZone $timezone the current timezone - * @property CarbonTimeZone $tz alias of $timezone - * @property int $centuryOfMillennium The value of the century starting from the beginning of the current millennium - * @property int $dayOfCentury The value of the day starting from the beginning of the current century - * @property int $dayOfDecade The value of the day starting from the beginning of the current decade - * @property int $dayOfMillennium The value of the day starting from the beginning of the current millennium - * @property int $dayOfMonth The value of the day starting from the beginning of the current month - * @property int $dayOfQuarter The value of the day starting from the beginning of the current quarter - * @property int $dayOfWeek 0 (for Sunday) through 6 (for Saturday) - * @property int $dayOfYear 1 through 366 - * @property int $decadeOfCentury The value of the decade starting from the beginning of the current century - * @property int $decadeOfMillennium The value of the decade starting from the beginning of the current millennium - * @property int $hourOfCentury The value of the hour starting from the beginning of the current century - * @property int $hourOfDay The value of the hour starting from the beginning of the current day - * @property int $hourOfDecade The value of the hour starting from the beginning of the current decade - * @property int $hourOfMillennium The value of the hour starting from the beginning of the current millennium - * @property int $hourOfMonth The value of the hour starting from the beginning of the current month - * @property int $hourOfQuarter The value of the hour starting from the beginning of the current quarter - * @property int $hourOfWeek The value of the hour starting from the beginning of the current week - * @property int $hourOfYear The value of the hour starting from the beginning of the current year - * @property int $microsecondOfCentury The value of the microsecond starting from the beginning of the current century - * @property int $microsecondOfDay The value of the microsecond starting from the beginning of the current day - * @property int $microsecondOfDecade The value of the microsecond starting from the beginning of the current decade - * @property int $microsecondOfHour The value of the microsecond starting from the beginning of the current hour - * @property int $microsecondOfMillennium The value of the microsecond starting from the beginning of the current millennium - * @property int $microsecondOfMillisecond The value of the microsecond starting from the beginning of the current millisecond - * @property int $microsecondOfMinute The value of the microsecond starting from the beginning of the current minute - * @property int $microsecondOfMonth The value of the microsecond starting from the beginning of the current month - * @property int $microsecondOfQuarter The value of the microsecond starting from the beginning of the current quarter - * @property int $microsecondOfSecond The value of the microsecond starting from the beginning of the current second - * @property int $microsecondOfWeek The value of the microsecond starting from the beginning of the current week - * @property int $microsecondOfYear The value of the microsecond starting from the beginning of the current year - * @property int $millisecondOfCentury The value of the millisecond starting from the beginning of the current century - * @property int $millisecondOfDay The value of the millisecond starting from the beginning of the current day - * @property int $millisecondOfDecade The value of the millisecond starting from the beginning of the current decade - * @property int $millisecondOfHour The value of the millisecond starting from the beginning of the current hour - * @property int $millisecondOfMillennium The value of the millisecond starting from the beginning of the current millennium - * @property int $millisecondOfMinute The value of the millisecond starting from the beginning of the current minute - * @property int $millisecondOfMonth The value of the millisecond starting from the beginning of the current month - * @property int $millisecondOfQuarter The value of the millisecond starting from the beginning of the current quarter - * @property int $millisecondOfSecond The value of the millisecond starting from the beginning of the current second - * @property int $millisecondOfWeek The value of the millisecond starting from the beginning of the current week - * @property int $millisecondOfYear The value of the millisecond starting from the beginning of the current year - * @property int $minuteOfCentury The value of the minute starting from the beginning of the current century - * @property int $minuteOfDay The value of the minute starting from the beginning of the current day - * @property int $minuteOfDecade The value of the minute starting from the beginning of the current decade - * @property int $minuteOfHour The value of the minute starting from the beginning of the current hour - * @property int $minuteOfMillennium The value of the minute starting from the beginning of the current millennium - * @property int $minuteOfMonth The value of the minute starting from the beginning of the current month - * @property int $minuteOfQuarter The value of the minute starting from the beginning of the current quarter - * @property int $minuteOfWeek The value of the minute starting from the beginning of the current week - * @property int $minuteOfYear The value of the minute starting from the beginning of the current year - * @property int $monthOfCentury The value of the month starting from the beginning of the current century - * @property int $monthOfDecade The value of the month starting from the beginning of the current decade - * @property int $monthOfMillennium The value of the month starting from the beginning of the current millennium - * @property int $monthOfQuarter The value of the month starting from the beginning of the current quarter - * @property int $monthOfYear The value of the month starting from the beginning of the current year - * @property int $quarterOfCentury The value of the quarter starting from the beginning of the current century - * @property int $quarterOfDecade The value of the quarter starting from the beginning of the current decade - * @property int $quarterOfMillennium The value of the quarter starting from the beginning of the current millennium - * @property int $quarterOfYear The value of the quarter starting from the beginning of the current year - * @property int $secondOfCentury The value of the second starting from the beginning of the current century - * @property int $secondOfDay The value of the second starting from the beginning of the current day - * @property int $secondOfDecade The value of the second starting from the beginning of the current decade - * @property int $secondOfHour The value of the second starting from the beginning of the current hour - * @property int $secondOfMillennium The value of the second starting from the beginning of the current millennium - * @property int $secondOfMinute The value of the second starting from the beginning of the current minute - * @property int $secondOfMonth The value of the second starting from the beginning of the current month - * @property int $secondOfQuarter The value of the second starting from the beginning of the current quarter - * @property int $secondOfWeek The value of the second starting from the beginning of the current week - * @property int $secondOfYear The value of the second starting from the beginning of the current year - * @property int $weekOfCentury The value of the week starting from the beginning of the current century - * @property int $weekOfDecade The value of the week starting from the beginning of the current decade - * @property int $weekOfMillennium The value of the week starting from the beginning of the current millennium - * @property int $weekOfMonth 1 through 5 - * @property int $weekOfQuarter The value of the week starting from the beginning of the current quarter - * @property int $weekOfYear ISO-8601 week number of year, weeks starting on Monday - * @property int $yearOfCentury The value of the year starting from the beginning of the current century - * @property int $yearOfDecade The value of the year starting from the beginning of the current decade - * @property int $yearOfMillennium The value of the year starting from the beginning of the current millennium - * @property-read string $latinMeridiem "am"/"pm" (Ante meridiem or Post meridiem latin lowercase mark) - * @property-read string $latinUpperMeridiem "AM"/"PM" (Ante meridiem or Post meridiem latin uppercase mark) - * @property-read string $timezoneAbbreviatedName the current timezone abbreviated name - * @property-read string $tzAbbrName alias of $timezoneAbbreviatedName - * @property-read string $dayName long name of weekday translated according to Carbon locale, in english if no translation available for current language - * @property-read string $shortDayName short name of weekday translated according to Carbon locale, in english if no translation available for current language - * @property-read string $minDayName very short name of weekday translated according to Carbon locale, in english if no translation available for current language - * @property-read string $monthName long name of month translated according to Carbon locale, in english if no translation available for current language - * @property-read string $shortMonthName short name of month translated according to Carbon locale, in english if no translation available for current language - * @property-read string $meridiem lowercase meridiem mark translated according to Carbon locale, in latin if no translation available for current language - * @property-read string $upperMeridiem uppercase meridiem mark translated according to Carbon locale, in latin if no translation available for current language - * @property-read int $noZeroHour current hour from 1 to 24 - * @property-read int $isoWeeksInYear 51 through 53 - * @property-read int $weekNumberInMonth 1 through 5 - * @property-read int $firstWeekDay 0 through 6 - * @property-read int $lastWeekDay 0 through 6 - * @property-read int $quarter the quarter of this instance, 1 - 4 - * @property-read int $decade the decade of this instance - * @property-read int $century the century of this instance - * @property-read int $millennium the millennium of this instance - * @property-read bool $dst daylight savings time indicator, true if DST, false otherwise - * @property-read bool $local checks if the timezone is local, true if local, false otherwise - * @property-read bool $utc checks if the timezone is UTC, true if UTC, false otherwise - * @property-read string $timezoneName the current timezone name - * @property-read string $tzName alias of $timezoneName - * @property-read string $locale locale of the current instance - * @property-read int $centuriesInMillennium The number of centuries contained in the current millennium - * @property-read int $daysInCentury The number of days contained in the current century - * @property-read int $daysInDecade The number of days contained in the current decade - * @property-read int $daysInMillennium The number of days contained in the current millennium - * @property-read int $daysInMonth number of days in the given month - * @property-read int $daysInQuarter The number of days contained in the current quarter - * @property-read int $daysInWeek The number of days contained in the current week - * @property-read int $daysInYear 365 or 366 - * @property-read int $decadesInCentury The number of decades contained in the current century - * @property-read int $decadesInMillennium The number of decades contained in the current millennium - * @property-read int $hoursInCentury The number of hours contained in the current century - * @property-read int $hoursInDay The number of hours contained in the current day - * @property-read int $hoursInDecade The number of hours contained in the current decade - * @property-read int $hoursInMillennium The number of hours contained in the current millennium - * @property-read int $hoursInMonth The number of hours contained in the current month - * @property-read int $hoursInQuarter The number of hours contained in the current quarter - * @property-read int $hoursInWeek The number of hours contained in the current week - * @property-read int $hoursInYear The number of hours contained in the current year - * @property-read int $microsecondsInCentury The number of microseconds contained in the current century - * @property-read int $microsecondsInDay The number of microseconds contained in the current day - * @property-read int $microsecondsInDecade The number of microseconds contained in the current decade - * @property-read int $microsecondsInHour The number of microseconds contained in the current hour - * @property-read int $microsecondsInMillennium The number of microseconds contained in the current millennium - * @property-read int $microsecondsInMillisecond The number of microseconds contained in the current millisecond - * @property-read int $microsecondsInMinute The number of microseconds contained in the current minute - * @property-read int $microsecondsInMonth The number of microseconds contained in the current month - * @property-read int $microsecondsInQuarter The number of microseconds contained in the current quarter - * @property-read int $microsecondsInSecond The number of microseconds contained in the current second - * @property-read int $microsecondsInWeek The number of microseconds contained in the current week - * @property-read int $microsecondsInYear The number of microseconds contained in the current year - * @property-read int $millisecondsInCentury The number of milliseconds contained in the current century - * @property-read int $millisecondsInDay The number of milliseconds contained in the current day - * @property-read int $millisecondsInDecade The number of milliseconds contained in the current decade - * @property-read int $millisecondsInHour The number of milliseconds contained in the current hour - * @property-read int $millisecondsInMillennium The number of milliseconds contained in the current millennium - * @property-read int $millisecondsInMinute The number of milliseconds contained in the current minute - * @property-read int $millisecondsInMonth The number of milliseconds contained in the current month - * @property-read int $millisecondsInQuarter The number of milliseconds contained in the current quarter - * @property-read int $millisecondsInSecond The number of milliseconds contained in the current second - * @property-read int $millisecondsInWeek The number of milliseconds contained in the current week - * @property-read int $millisecondsInYear The number of milliseconds contained in the current year - * @property-read int $minutesInCentury The number of minutes contained in the current century - * @property-read int $minutesInDay The number of minutes contained in the current day - * @property-read int $minutesInDecade The number of minutes contained in the current decade - * @property-read int $minutesInHour The number of minutes contained in the current hour - * @property-read int $minutesInMillennium The number of minutes contained in the current millennium - * @property-read int $minutesInMonth The number of minutes contained in the current month - * @property-read int $minutesInQuarter The number of minutes contained in the current quarter - * @property-read int $minutesInWeek The number of minutes contained in the current week - * @property-read int $minutesInYear The number of minutes contained in the current year - * @property-read int $monthsInCentury The number of months contained in the current century - * @property-read int $monthsInDecade The number of months contained in the current decade - * @property-read int $monthsInMillennium The number of months contained in the current millennium - * @property-read int $monthsInQuarter The number of months contained in the current quarter - * @property-read int $monthsInYear The number of months contained in the current year - * @property-read int $quartersInCentury The number of quarters contained in the current century - * @property-read int $quartersInDecade The number of quarters contained in the current decade - * @property-read int $quartersInMillennium The number of quarters contained in the current millennium - * @property-read int $quartersInYear The number of quarters contained in the current year - * @property-read int $secondsInCentury The number of seconds contained in the current century - * @property-read int $secondsInDay The number of seconds contained in the current day - * @property-read int $secondsInDecade The number of seconds contained in the current decade - * @property-read int $secondsInHour The number of seconds contained in the current hour - * @property-read int $secondsInMillennium The number of seconds contained in the current millennium - * @property-read int $secondsInMinute The number of seconds contained in the current minute - * @property-read int $secondsInMonth The number of seconds contained in the current month - * @property-read int $secondsInQuarter The number of seconds contained in the current quarter - * @property-read int $secondsInWeek The number of seconds contained in the current week - * @property-read int $secondsInYear The number of seconds contained in the current year - * @property-read int $weeksInCentury The number of weeks contained in the current century - * @property-read int $weeksInDecade The number of weeks contained in the current decade - * @property-read int $weeksInMillennium The number of weeks contained in the current millennium - * @property-read int $weeksInMonth The number of weeks contained in the current month - * @property-read int $weeksInQuarter The number of weeks contained in the current quarter - * @property-read int $weeksInYear 51 through 53 - * @property-read int $yearsInCentury The number of years contained in the current century - * @property-read int $yearsInDecade The number of years contained in the current decade - * @property-read int $yearsInMillennium The number of years contained in the current millennium + * @property int $week 1 through 53 + * @property int $isoWeek 1 through 53 + * @property int $weekYear year according to week format + * @property int $isoWeekYear year according to ISO week format + * @property int $age does a diffInYears() with default parameters + * @property int $offset the timezone offset in seconds from UTC + * @property int $offsetMinutes the timezone offset in minutes from UTC + * @property int $offsetHours the timezone offset in hours from UTC + * @property CarbonTimeZone $timezone the current timezone + * @property CarbonTimeZone $tz alias of $timezone + * @property int $centuryOfMillennium The value of the century starting from the beginning of the current millennium + * @property int $dayOfCentury The value of the day starting from the beginning of the current century + * @property int $dayOfDecade The value of the day starting from the beginning of the current decade + * @property int $dayOfMillennium The value of the day starting from the beginning of the current millennium + * @property int $dayOfMonth The value of the day starting from the beginning of the current month + * @property int $dayOfQuarter The value of the day starting from the beginning of the current quarter + * @property int $dayOfWeek 0 (for Sunday) through 6 (for Saturday) + * @property int $dayOfYear 1 through 366 + * @property int $decadeOfCentury The value of the decade starting from the beginning of the current century + * @property int $decadeOfMillennium The value of the decade starting from the beginning of the current millennium + * @property int $hourOfCentury The value of the hour starting from the beginning of the current century + * @property int $hourOfDay The value of the hour starting from the beginning of the current day + * @property int $hourOfDecade The value of the hour starting from the beginning of the current decade + * @property int $hourOfMillennium The value of the hour starting from the beginning of the current millennium + * @property int $hourOfMonth The value of the hour starting from the beginning of the current month + * @property int $hourOfQuarter The value of the hour starting from the beginning of the current quarter + * @property int $hourOfWeek The value of the hour starting from the beginning of the current week + * @property int $hourOfYear The value of the hour starting from the beginning of the current year + * @property int $microsecondOfCentury The value of the microsecond starting from the beginning of the current century + * @property int $microsecondOfDay The value of the microsecond starting from the beginning of the current day + * @property int $microsecondOfDecade The value of the microsecond starting from the beginning of the current decade + * @property int $microsecondOfHour The value of the microsecond starting from the beginning of the current hour + * @property int $microsecondOfMillennium The value of the microsecond starting from the beginning of the current millennium + * @property int $microsecondOfMillisecond The value of the microsecond starting from the beginning of the current millisecond + * @property int $microsecondOfMinute The value of the microsecond starting from the beginning of the current minute + * @property int $microsecondOfMonth The value of the microsecond starting from the beginning of the current month + * @property int $microsecondOfQuarter The value of the microsecond starting from the beginning of the current quarter + * @property int $microsecondOfSecond The value of the microsecond starting from the beginning of the current second + * @property int $microsecondOfWeek The value of the microsecond starting from the beginning of the current week + * @property int $microsecondOfYear The value of the microsecond starting from the beginning of the current year + * @property int $millisecondOfCentury The value of the millisecond starting from the beginning of the current century + * @property int $millisecondOfDay The value of the millisecond starting from the beginning of the current day + * @property int $millisecondOfDecade The value of the millisecond starting from the beginning of the current decade + * @property int $millisecondOfHour The value of the millisecond starting from the beginning of the current hour + * @property int $millisecondOfMillennium The value of the millisecond starting from the beginning of the current millennium + * @property int $millisecondOfMinute The value of the millisecond starting from the beginning of the current minute + * @property int $millisecondOfMonth The value of the millisecond starting from the beginning of the current month + * @property int $millisecondOfQuarter The value of the millisecond starting from the beginning of the current quarter + * @property int $millisecondOfSecond The value of the millisecond starting from the beginning of the current second + * @property int $millisecondOfWeek The value of the millisecond starting from the beginning of the current week + * @property int $millisecondOfYear The value of the millisecond starting from the beginning of the current year + * @property int $minuteOfCentury The value of the minute starting from the beginning of the current century + * @property int $minuteOfDay The value of the minute starting from the beginning of the current day + * @property int $minuteOfDecade The value of the minute starting from the beginning of the current decade + * @property int $minuteOfHour The value of the minute starting from the beginning of the current hour + * @property int $minuteOfMillennium The value of the minute starting from the beginning of the current millennium + * @property int $minuteOfMonth The value of the minute starting from the beginning of the current month + * @property int $minuteOfQuarter The value of the minute starting from the beginning of the current quarter + * @property int $minuteOfWeek The value of the minute starting from the beginning of the current week + * @property int $minuteOfYear The value of the minute starting from the beginning of the current year + * @property int $monthOfCentury The value of the month starting from the beginning of the current century + * @property int $monthOfDecade The value of the month starting from the beginning of the current decade + * @property int $monthOfMillennium The value of the month starting from the beginning of the current millennium + * @property int $monthOfQuarter The value of the month starting from the beginning of the current quarter + * @property int $monthOfYear The value of the month starting from the beginning of the current year + * @property int $quarterOfCentury The value of the quarter starting from the beginning of the current century + * @property int $quarterOfDecade The value of the quarter starting from the beginning of the current decade + * @property int $quarterOfMillennium The value of the quarter starting from the beginning of the current millennium + * @property int $quarterOfYear The value of the quarter starting from the beginning of the current year + * @property int $secondOfCentury The value of the second starting from the beginning of the current century + * @property int $secondOfDay The value of the second starting from the beginning of the current day + * @property int $secondOfDecade The value of the second starting from the beginning of the current decade + * @property int $secondOfHour The value of the second starting from the beginning of the current hour + * @property int $secondOfMillennium The value of the second starting from the beginning of the current millennium + * @property int $secondOfMinute The value of the second starting from the beginning of the current minute + * @property int $secondOfMonth The value of the second starting from the beginning of the current month + * @property int $secondOfQuarter The value of the second starting from the beginning of the current quarter + * @property int $secondOfWeek The value of the second starting from the beginning of the current week + * @property int $secondOfYear The value of the second starting from the beginning of the current year + * @property int $weekOfCentury The value of the week starting from the beginning of the current century + * @property int $weekOfDecade The value of the week starting from the beginning of the current decade + * @property int $weekOfMillennium The value of the week starting from the beginning of the current millennium + * @property int $weekOfMonth 1 through 5 + * @property int $weekOfQuarter The value of the week starting from the beginning of the current quarter + * @property int $weekOfYear ISO-8601 week number of year, weeks starting on Monday + * @property int $yearOfCentury The value of the year starting from the beginning of the current century + * @property int $yearOfDecade The value of the year starting from the beginning of the current decade + * @property int $yearOfMillennium The value of the year starting from the beginning of the current millennium + * @property-read string $latinMeridiem "am"/"pm" (Ante meridiem or Post meridiem latin lowercase mark) + * @property-read string $latinUpperMeridiem "AM"/"PM" (Ante meridiem or Post meridiem latin uppercase mark) + * @property-read string $timezoneAbbreviatedName the current timezone abbreviated name + * @property-read string $tzAbbrName alias of $timezoneAbbreviatedName + * @property-read string $dayName long name of weekday translated according to Carbon locale, in english if no translation available for current language + * @property-read string $shortDayName short name of weekday translated according to Carbon locale, in english if no translation available for current language + * @property-read string $minDayName very short name of weekday translated according to Carbon locale, in english if no translation available for current language + * @property-read string $monthName long name of month translated according to Carbon locale, in english if no translation available for current language + * @property-read string $shortMonthName short name of month translated according to Carbon locale, in english if no translation available for current language + * @property-read string $meridiem lowercase meridiem mark translated according to Carbon locale, in latin if no translation available for current language + * @property-read string $upperMeridiem uppercase meridiem mark translated according to Carbon locale, in latin if no translation available for current language + * @property-read int $noZeroHour current hour from 1 to 24 + * @property-read int $isoWeeksInYear 51 through 53 + * @property-read int $weekNumberInMonth 1 through 5 + * @property-read int $firstWeekDay 0 through 6 + * @property-read int $lastWeekDay 0 through 6 + * @property-read int $quarter the quarter of this instance, 1 - 4 + * @property-read int $decade the decade of this instance + * @property-read int $century the century of this instance + * @property-read int $millennium the millennium of this instance + * @property-read bool $dst daylight savings time indicator, true if DST, false otherwise + * @property-read bool $local checks if the timezone is local, true if local, false otherwise + * @property-read bool $utc checks if the timezone is UTC, true if UTC, false otherwise + * @property-read string $timezoneName the current timezone name + * @property-read string $tzName alias of $timezoneName + * @property-read string $locale locale of the current instance + * @property-read int $centuriesInMillennium The number of centuries contained in the current millennium + * @property-read int $daysInCentury The number of days contained in the current century + * @property-read int $daysInDecade The number of days contained in the current decade + * @property-read int $daysInMillennium The number of days contained in the current millennium + * @property-read int $daysInMonth number of days in the given month + * @property-read int $daysInQuarter The number of days contained in the current quarter + * @property-read int $daysInWeek The number of days contained in the current week + * @property-read int $daysInYear 365 or 366 + * @property-read int $decadesInCentury The number of decades contained in the current century + * @property-read int $decadesInMillennium The number of decades contained in the current millennium + * @property-read int $hoursInCentury The number of hours contained in the current century + * @property-read int $hoursInDay The number of hours contained in the current day + * @property-read int $hoursInDecade The number of hours contained in the current decade + * @property-read int $hoursInMillennium The number of hours contained in the current millennium + * @property-read int $hoursInMonth The number of hours contained in the current month + * @property-read int $hoursInQuarter The number of hours contained in the current quarter + * @property-read int $hoursInWeek The number of hours contained in the current week + * @property-read int $hoursInYear The number of hours contained in the current year + * @property-read int $microsecondsInCentury The number of microseconds contained in the current century + * @property-read int $microsecondsInDay The number of microseconds contained in the current day + * @property-read int $microsecondsInDecade The number of microseconds contained in the current decade + * @property-read int $microsecondsInHour The number of microseconds contained in the current hour + * @property-read int $microsecondsInMillennium The number of microseconds contained in the current millennium + * @property-read int $microsecondsInMillisecond The number of microseconds contained in the current millisecond + * @property-read int $microsecondsInMinute The number of microseconds contained in the current minute + * @property-read int $microsecondsInMonth The number of microseconds contained in the current month + * @property-read int $microsecondsInQuarter The number of microseconds contained in the current quarter + * @property-read int $microsecondsInSecond The number of microseconds contained in the current second + * @property-read int $microsecondsInWeek The number of microseconds contained in the current week + * @property-read int $microsecondsInYear The number of microseconds contained in the current year + * @property-read int $millisecondsInCentury The number of milliseconds contained in the current century + * @property-read int $millisecondsInDay The number of milliseconds contained in the current day + * @property-read int $millisecondsInDecade The number of milliseconds contained in the current decade + * @property-read int $millisecondsInHour The number of milliseconds contained in the current hour + * @property-read int $millisecondsInMillennium The number of milliseconds contained in the current millennium + * @property-read int $millisecondsInMinute The number of milliseconds contained in the current minute + * @property-read int $millisecondsInMonth The number of milliseconds contained in the current month + * @property-read int $millisecondsInQuarter The number of milliseconds contained in the current quarter + * @property-read int $millisecondsInSecond The number of milliseconds contained in the current second + * @property-read int $millisecondsInWeek The number of milliseconds contained in the current week + * @property-read int $millisecondsInYear The number of milliseconds contained in the current year + * @property-read int $minutesInCentury The number of minutes contained in the current century + * @property-read int $minutesInDay The number of minutes contained in the current day + * @property-read int $minutesInDecade The number of minutes contained in the current decade + * @property-read int $minutesInHour The number of minutes contained in the current hour + * @property-read int $minutesInMillennium The number of minutes contained in the current millennium + * @property-read int $minutesInMonth The number of minutes contained in the current month + * @property-read int $minutesInQuarter The number of minutes contained in the current quarter + * @property-read int $minutesInWeek The number of minutes contained in the current week + * @property-read int $minutesInYear The number of minutes contained in the current year + * @property-read int $monthsInCentury The number of months contained in the current century + * @property-read int $monthsInDecade The number of months contained in the current decade + * @property-read int $monthsInMillennium The number of months contained in the current millennium + * @property-read int $monthsInQuarter The number of months contained in the current quarter + * @property-read int $monthsInYear The number of months contained in the current year + * @property-read int $quartersInCentury The number of quarters contained in the current century + * @property-read int $quartersInDecade The number of quarters contained in the current decade + * @property-read int $quartersInMillennium The number of quarters contained in the current millennium + * @property-read int $quartersInYear The number of quarters contained in the current year + * @property-read int $secondsInCentury The number of seconds contained in the current century + * @property-read int $secondsInDay The number of seconds contained in the current day + * @property-read int $secondsInDecade The number of seconds contained in the current decade + * @property-read int $secondsInHour The number of seconds contained in the current hour + * @property-read int $secondsInMillennium The number of seconds contained in the current millennium + * @property-read int $secondsInMinute The number of seconds contained in the current minute + * @property-read int $secondsInMonth The number of seconds contained in the current month + * @property-read int $secondsInQuarter The number of seconds contained in the current quarter + * @property-read int $secondsInWeek The number of seconds contained in the current week + * @property-read int $secondsInYear The number of seconds contained in the current year + * @property-read int $weeksInCentury The number of weeks contained in the current century + * @property-read int $weeksInDecade The number of weeks contained in the current decade + * @property-read int $weeksInMillennium The number of weeks contained in the current millennium + * @property-read int $weeksInMonth The number of weeks contained in the current month + * @property-read int $weeksInQuarter The number of weeks contained in the current quarter + * @property-read int $weeksInYear 51 through 53 + * @property-read int $yearsInCentury The number of years contained in the current century + * @property-read int $yearsInDecade The number of years contained in the current decade + * @property-read int $yearsInMillennium The number of years contained in the current millennium * - * @method bool isUtc() Check if the current instance has UTC timezone. (Both isUtc and isUTC cases are valid.) - * @method bool isLocal() Check if the current instance has non-UTC timezone. - * @method bool isValid() Check if the current instance is a valid date. - * @method bool isDST() Check if the current instance is in a daylight saving time. - * @method bool isSunday() Checks if the instance day is sunday. - * @method bool isMonday() Checks if the instance day is monday. - * @method bool isTuesday() Checks if the instance day is tuesday. - * @method bool isWednesday() Checks if the instance day is wednesday. - * @method bool isThursday() Checks if the instance day is thursday. - * @method bool isFriday() Checks if the instance day is friday. - * @method bool isSaturday() Checks if the instance day is saturday. - * @method bool isSameYear(DateTimeInterface|string $date) Checks if the given date is in the same year as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentYear() Checks if the instance is in the same year as the current moment. - * @method bool isNextYear() Checks if the instance is in the same year as the current moment next year. - * @method bool isLastYear() Checks if the instance is in the same year as the current moment last year. - * @method bool isCurrentMonth() Checks if the instance is in the same month as the current moment. - * @method bool isNextMonth() Checks if the instance is in the same month as the current moment next month. - * @method bool isLastMonth() Checks if the instance is in the same month as the current moment last month. - * @method bool isSameWeek(DateTimeInterface|string $date) Checks if the given date is in the same week as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentWeek() Checks if the instance is in the same week as the current moment. - * @method bool isNextWeek() Checks if the instance is in the same week as the current moment next week. - * @method bool isLastWeek() Checks if the instance is in the same week as the current moment last week. - * @method bool isSameDay(DateTimeInterface|string $date) Checks if the given date is in the same day as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentDay() Checks if the instance is in the same day as the current moment. - * @method bool isNextDay() Checks if the instance is in the same day as the current moment next day. - * @method bool isLastDay() Checks if the instance is in the same day as the current moment last day. - * @method bool isSameHour(DateTimeInterface|string $date) Checks if the given date is in the same hour as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentHour() Checks if the instance is in the same hour as the current moment. - * @method bool isNextHour() Checks if the instance is in the same hour as the current moment next hour. - * @method bool isLastHour() Checks if the instance is in the same hour as the current moment last hour. - * @method bool isSameMinute(DateTimeInterface|string $date) Checks if the given date is in the same minute as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMinute() Checks if the instance is in the same minute as the current moment. - * @method bool isNextMinute() Checks if the instance is in the same minute as the current moment next minute. - * @method bool isLastMinute() Checks if the instance is in the same minute as the current moment last minute. - * @method bool isSameSecond(DateTimeInterface|string $date) Checks if the given date is in the same second as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentSecond() Checks if the instance is in the same second as the current moment. - * @method bool isNextSecond() Checks if the instance is in the same second as the current moment next second. - * @method bool isLastSecond() Checks if the instance is in the same second as the current moment last second. - * @method bool isSameMilli(DateTimeInterface|string $date) Checks if the given date is in the same millisecond as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMilli() Checks if the instance is in the same millisecond as the current moment. - * @method bool isNextMilli() Checks if the instance is in the same millisecond as the current moment next millisecond. - * @method bool isLastMilli() Checks if the instance is in the same millisecond as the current moment last millisecond. - * @method bool isSameMillisecond(DateTimeInterface|string $date) Checks if the given date is in the same millisecond as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMillisecond() Checks if the instance is in the same millisecond as the current moment. - * @method bool isNextMillisecond() Checks if the instance is in the same millisecond as the current moment next millisecond. - * @method bool isLastMillisecond() Checks if the instance is in the same millisecond as the current moment last millisecond. - * @method bool isSameMicro(DateTimeInterface|string $date) Checks if the given date is in the same microsecond as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMicro() Checks if the instance is in the same microsecond as the current moment. - * @method bool isNextMicro() Checks if the instance is in the same microsecond as the current moment next microsecond. - * @method bool isLastMicro() Checks if the instance is in the same microsecond as the current moment last microsecond. - * @method bool isSameMicrosecond(DateTimeInterface|string $date) Checks if the given date is in the same microsecond as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMicrosecond() Checks if the instance is in the same microsecond as the current moment. - * @method bool isNextMicrosecond() Checks if the instance is in the same microsecond as the current moment next microsecond. - * @method bool isLastMicrosecond() Checks if the instance is in the same microsecond as the current moment last microsecond. - * @method bool isSameDecade(DateTimeInterface|string $date) Checks if the given date is in the same decade as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentDecade() Checks if the instance is in the same decade as the current moment. - * @method bool isNextDecade() Checks if the instance is in the same decade as the current moment next decade. - * @method bool isLastDecade() Checks if the instance is in the same decade as the current moment last decade. - * @method bool isSameCentury(DateTimeInterface|string $date) Checks if the given date is in the same century as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentCentury() Checks if the instance is in the same century as the current moment. - * @method bool isNextCentury() Checks if the instance is in the same century as the current moment next century. - * @method bool isLastCentury() Checks if the instance is in the same century as the current moment last century. - * @method bool isSameMillennium(DateTimeInterface|string $date) Checks if the given date is in the same millennium as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMillennium() Checks if the instance is in the same millennium as the current moment. - * @method bool isNextMillennium() Checks if the instance is in the same millennium as the current moment next millennium. - * @method bool isLastMillennium() Checks if the instance is in the same millennium as the current moment last millennium. - * @method bool isCurrentQuarter() Checks if the instance is in the same quarter as the current moment. - * @method bool isNextQuarter() Checks if the instance is in the same quarter as the current moment next quarter. - * @method bool isLastQuarter() Checks if the instance is in the same quarter as the current moment last quarter. - * @method CarbonInterface years(int $value) Set current instance year to the given value. - * @method CarbonInterface year(int $value) Set current instance year to the given value. - * @method CarbonInterface setYears(int $value) Set current instance year to the given value. - * @method CarbonInterface setYear(int $value) Set current instance year to the given value. - * @method CarbonInterface months(Month|int $value) Set current instance month to the given value. - * @method CarbonInterface month(Month|int $value) Set current instance month to the given value. - * @method CarbonInterface setMonths(Month|int $value) Set current instance month to the given value. - * @method CarbonInterface setMonth(Month|int $value) Set current instance month to the given value. - * @method CarbonInterface days(int $value) Set current instance day to the given value. - * @method CarbonInterface day(int $value) Set current instance day to the given value. - * @method CarbonInterface setDays(int $value) Set current instance day to the given value. - * @method CarbonInterface setDay(int $value) Set current instance day to the given value. - * @method CarbonInterface hours(int $value) Set current instance hour to the given value. - * @method CarbonInterface hour(int $value) Set current instance hour to the given value. - * @method CarbonInterface setHours(int $value) Set current instance hour to the given value. - * @method CarbonInterface setHour(int $value) Set current instance hour to the given value. - * @method CarbonInterface minutes(int $value) Set current instance minute to the given value. - * @method CarbonInterface minute(int $value) Set current instance minute to the given value. - * @method CarbonInterface setMinutes(int $value) Set current instance minute to the given value. - * @method CarbonInterface setMinute(int $value) Set current instance minute to the given value. - * @method CarbonInterface seconds(int $value) Set current instance second to the given value. - * @method CarbonInterface second(int $value) Set current instance second to the given value. - * @method CarbonInterface setSeconds(int $value) Set current instance second to the given value. - * @method CarbonInterface setSecond(int $value) Set current instance second to the given value. - * @method CarbonInterface millis(int $value) Set current instance millisecond to the given value. - * @method CarbonInterface milli(int $value) Set current instance millisecond to the given value. - * @method CarbonInterface setMillis(int $value) Set current instance millisecond to the given value. - * @method CarbonInterface setMilli(int $value) Set current instance millisecond to the given value. - * @method CarbonInterface milliseconds(int $value) Set current instance millisecond to the given value. - * @method CarbonInterface millisecond(int $value) Set current instance millisecond to the given value. - * @method CarbonInterface setMilliseconds(int $value) Set current instance millisecond to the given value. - * @method CarbonInterface setMillisecond(int $value) Set current instance millisecond to the given value. - * @method CarbonInterface micros(int $value) Set current instance microsecond to the given value. - * @method CarbonInterface micro(int $value) Set current instance microsecond to the given value. - * @method CarbonInterface setMicros(int $value) Set current instance microsecond to the given value. - * @method CarbonInterface setMicro(int $value) Set current instance microsecond to the given value. - * @method CarbonInterface microseconds(int $value) Set current instance microsecond to the given value. - * @method CarbonInterface microsecond(int $value) Set current instance microsecond to the given value. - * @method CarbonInterface setMicroseconds(int $value) Set current instance microsecond to the given value. - * @method self setMicrosecond(int $value) Set current instance microsecond to the given value. - * @method CarbonInterface addYears(int|float $value = 1) Add years (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addYear() Add one year to the instance (using date interval). - * @method CarbonInterface subYears(int|float $value = 1) Sub years (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subYear() Sub one year to the instance (using date interval). - * @method CarbonInterface addYearsWithOverflow(int|float $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addYearWithOverflow() Add one year to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subYearsWithOverflow(int|float $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subYearWithOverflow() Sub one year to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addYearsWithoutOverflow(int|float $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addYearWithoutOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subYearsWithoutOverflow(int|float $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subYearWithoutOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addYearsWithNoOverflow(int|float $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addYearWithNoOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subYearsWithNoOverflow(int|float $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subYearWithNoOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addYearsNoOverflow(int|float $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addYearNoOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subYearsNoOverflow(int|float $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subYearNoOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMonths(int|float $value = 1) Add months (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addMonth() Add one month to the instance (using date interval). - * @method CarbonInterface subMonths(int|float $value = 1) Sub months (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subMonth() Sub one month to the instance (using date interval). - * @method CarbonInterface addMonthsWithOverflow(int|float $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addMonthWithOverflow() Add one month to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subMonthsWithOverflow(int|float $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subMonthWithOverflow() Sub one month to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addMonthsWithoutOverflow(int|float $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMonthWithoutOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMonthsWithoutOverflow(int|float $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMonthWithoutOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMonthsWithNoOverflow(int|float $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMonthWithNoOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMonthsWithNoOverflow(int|float $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMonthWithNoOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMonthsNoOverflow(int|float $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMonthNoOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMonthsNoOverflow(int|float $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMonthNoOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addDays(int|float $value = 1) Add days (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addDay() Add one day to the instance (using date interval). - * @method CarbonInterface subDays(int|float $value = 1) Sub days (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subDay() Sub one day to the instance (using date interval). - * @method CarbonInterface addHours(int|float $value = 1) Add hours (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addHour() Add one hour to the instance (using date interval). - * @method CarbonInterface subHours(int|float $value = 1) Sub hours (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subHour() Sub one hour to the instance (using date interval). - * @method CarbonInterface addMinutes(int|float $value = 1) Add minutes (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addMinute() Add one minute to the instance (using date interval). - * @method CarbonInterface subMinutes(int|float $value = 1) Sub minutes (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subMinute() Sub one minute to the instance (using date interval). - * @method CarbonInterface addSeconds(int|float $value = 1) Add seconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addSecond() Add one second to the instance (using date interval). - * @method CarbonInterface subSeconds(int|float $value = 1) Sub seconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subSecond() Sub one second to the instance (using date interval). - * @method CarbonInterface addMillis(int|float $value = 1) Add milliseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addMilli() Add one millisecond to the instance (using date interval). - * @method CarbonInterface subMillis(int|float $value = 1) Sub milliseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subMilli() Sub one millisecond to the instance (using date interval). - * @method CarbonInterface addMilliseconds(int|float $value = 1) Add milliseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addMillisecond() Add one millisecond to the instance (using date interval). - * @method CarbonInterface subMilliseconds(int|float $value = 1) Sub milliseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subMillisecond() Sub one millisecond to the instance (using date interval). - * @method CarbonInterface addMicros(int|float $value = 1) Add microseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addMicro() Add one microsecond to the instance (using date interval). - * @method CarbonInterface subMicros(int|float $value = 1) Sub microseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subMicro() Sub one microsecond to the instance (using date interval). - * @method CarbonInterface addMicroseconds(int|float $value = 1) Add microseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addMicrosecond() Add one microsecond to the instance (using date interval). - * @method CarbonInterface subMicroseconds(int|float $value = 1) Sub microseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subMicrosecond() Sub one microsecond to the instance (using date interval). - * @method CarbonInterface addMillennia(int|float $value = 1) Add millennia (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addMillennium() Add one millennium to the instance (using date interval). - * @method CarbonInterface subMillennia(int|float $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subMillennium() Sub one millennium to the instance (using date interval). - * @method CarbonInterface addMillenniaWithOverflow(int|float $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addMillenniumWithOverflow() Add one millennium to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subMillenniaWithOverflow(int|float $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subMillenniumWithOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addMillenniaWithoutOverflow(int|float $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMillenniumWithoutOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMillenniaWithoutOverflow(int|float $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMillenniumWithoutOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMillenniaWithNoOverflow(int|float $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMillenniumWithNoOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMillenniaWithNoOverflow(int|float $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMillenniumWithNoOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMillenniaNoOverflow(int|float $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMillenniumNoOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMillenniaNoOverflow(int|float $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMillenniumNoOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addCenturies(int|float $value = 1) Add centuries (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addCentury() Add one century to the instance (using date interval). - * @method CarbonInterface subCenturies(int|float $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subCentury() Sub one century to the instance (using date interval). - * @method CarbonInterface addCenturiesWithOverflow(int|float $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addCenturyWithOverflow() Add one century to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subCenturiesWithOverflow(int|float $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subCenturyWithOverflow() Sub one century to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addCenturiesWithoutOverflow(int|float $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addCenturyWithoutOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subCenturiesWithoutOverflow(int|float $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subCenturyWithoutOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addCenturiesWithNoOverflow(int|float $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addCenturyWithNoOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subCenturiesWithNoOverflow(int|float $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subCenturyWithNoOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addCenturiesNoOverflow(int|float $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addCenturyNoOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subCenturiesNoOverflow(int|float $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subCenturyNoOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addDecades(int|float $value = 1) Add decades (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addDecade() Add one decade to the instance (using date interval). - * @method CarbonInterface subDecades(int|float $value = 1) Sub decades (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subDecade() Sub one decade to the instance (using date interval). - * @method CarbonInterface addDecadesWithOverflow(int|float $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addDecadeWithOverflow() Add one decade to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subDecadesWithOverflow(int|float $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subDecadeWithOverflow() Sub one decade to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addDecadesWithoutOverflow(int|float $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addDecadeWithoutOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subDecadesWithoutOverflow(int|float $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subDecadeWithoutOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addDecadesWithNoOverflow(int|float $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addDecadeWithNoOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subDecadesWithNoOverflow(int|float $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subDecadeWithNoOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addDecadesNoOverflow(int|float $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addDecadeNoOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subDecadesNoOverflow(int|float $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subDecadeNoOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addQuarters(int|float $value = 1) Add quarters (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addQuarter() Add one quarter to the instance (using date interval). - * @method CarbonInterface subQuarters(int|float $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subQuarter() Sub one quarter to the instance (using date interval). - * @method CarbonInterface addQuartersWithOverflow(int|float $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addQuarterWithOverflow() Add one quarter to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subQuartersWithOverflow(int|float $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subQuarterWithOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addQuartersWithoutOverflow(int|float $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addQuarterWithoutOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subQuartersWithoutOverflow(int|float $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subQuarterWithoutOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addQuartersWithNoOverflow(int|float $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addQuarterWithNoOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subQuartersWithNoOverflow(int|float $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subQuarterWithNoOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addQuartersNoOverflow(int|float $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addQuarterNoOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subQuartersNoOverflow(int|float $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subQuarterNoOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addWeeks(int|float $value = 1) Add weeks (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addWeek() Add one week to the instance (using date interval). - * @method CarbonInterface subWeeks(int|float $value = 1) Sub weeks (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subWeek() Sub one week to the instance (using date interval). - * @method CarbonInterface addWeekdays(int|float $value = 1) Add weekdays (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addWeekday() Add one weekday to the instance (using date interval). - * @method CarbonInterface subWeekdays(int|float $value = 1) Sub weekdays (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subWeekday() Sub one weekday to the instance (using date interval). - * @method CarbonInterface addUTCMicros(int|float $value = 1) Add microseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCMicro() Add one microsecond to the instance (using timestamp). - * @method CarbonInterface subUTCMicros(int|float $value = 1) Sub microseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCMicro() Sub one microsecond to the instance (using timestamp). - * @method CarbonPeriod microsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each microsecond or every X microseconds if a factor is given. - * @method float diffInUTCMicros(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of microseconds. - * @method CarbonInterface addUTCMicroseconds(int|float $value = 1) Add microseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCMicrosecond() Add one microsecond to the instance (using timestamp). - * @method CarbonInterface subUTCMicroseconds(int|float $value = 1) Sub microseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCMicrosecond() Sub one microsecond to the instance (using timestamp). - * @method CarbonPeriod microsecondsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each microsecond or every X microseconds if a factor is given. - * @method float diffInUTCMicroseconds(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of microseconds. - * @method CarbonInterface addUTCMillis(int|float $value = 1) Add milliseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCMilli() Add one millisecond to the instance (using timestamp). - * @method CarbonInterface subUTCMillis(int|float $value = 1) Sub milliseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCMilli() Sub one millisecond to the instance (using timestamp). - * @method CarbonPeriod millisUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millisecond or every X milliseconds if a factor is given. - * @method float diffInUTCMillis(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of milliseconds. - * @method CarbonInterface addUTCMilliseconds(int|float $value = 1) Add milliseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCMillisecond() Add one millisecond to the instance (using timestamp). - * @method CarbonInterface subUTCMilliseconds(int|float $value = 1) Sub milliseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCMillisecond() Sub one millisecond to the instance (using timestamp). - * @method CarbonPeriod millisecondsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millisecond or every X milliseconds if a factor is given. - * @method float diffInUTCMilliseconds(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of milliseconds. - * @method CarbonInterface addUTCSeconds(int|float $value = 1) Add seconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCSecond() Add one second to the instance (using timestamp). - * @method CarbonInterface subUTCSeconds(int|float $value = 1) Sub seconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCSecond() Sub one second to the instance (using timestamp). - * @method CarbonPeriod secondsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each second or every X seconds if a factor is given. - * @method float diffInUTCSeconds(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of seconds. - * @method CarbonInterface addUTCMinutes(int|float $value = 1) Add minutes (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCMinute() Add one minute to the instance (using timestamp). - * @method CarbonInterface subUTCMinutes(int|float $value = 1) Sub minutes (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCMinute() Sub one minute to the instance (using timestamp). - * @method CarbonPeriod minutesUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each minute or every X minutes if a factor is given. - * @method float diffInUTCMinutes(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of minutes. - * @method CarbonInterface addUTCHours(int|float $value = 1) Add hours (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCHour() Add one hour to the instance (using timestamp). - * @method CarbonInterface subUTCHours(int|float $value = 1) Sub hours (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCHour() Sub one hour to the instance (using timestamp). - * @method CarbonPeriod hoursUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each hour or every X hours if a factor is given. - * @method float diffInUTCHours(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of hours. - * @method CarbonInterface addUTCDays(int|float $value = 1) Add days (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCDay() Add one day to the instance (using timestamp). - * @method CarbonInterface subUTCDays(int|float $value = 1) Sub days (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCDay() Sub one day to the instance (using timestamp). - * @method CarbonPeriod daysUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each day or every X days if a factor is given. - * @method float diffInUTCDays(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of days. - * @method CarbonInterface addUTCWeeks(int|float $value = 1) Add weeks (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCWeek() Add one week to the instance (using timestamp). - * @method CarbonInterface subUTCWeeks(int|float $value = 1) Sub weeks (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCWeek() Sub one week to the instance (using timestamp). - * @method CarbonPeriod weeksUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each week or every X weeks if a factor is given. - * @method float diffInUTCWeeks(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of weeks. - * @method CarbonInterface addUTCMonths(int|float $value = 1) Add months (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCMonth() Add one month to the instance (using timestamp). - * @method CarbonInterface subUTCMonths(int|float $value = 1) Sub months (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCMonth() Sub one month to the instance (using timestamp). - * @method CarbonPeriod monthsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each month or every X months if a factor is given. - * @method float diffInUTCMonths(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of months. - * @method CarbonInterface addUTCQuarters(int|float $value = 1) Add quarters (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCQuarter() Add one quarter to the instance (using timestamp). - * @method CarbonInterface subUTCQuarters(int|float $value = 1) Sub quarters (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCQuarter() Sub one quarter to the instance (using timestamp). - * @method CarbonPeriod quartersUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each quarter or every X quarters if a factor is given. - * @method float diffInUTCQuarters(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of quarters. - * @method CarbonInterface addUTCYears(int|float $value = 1) Add years (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCYear() Add one year to the instance (using timestamp). - * @method CarbonInterface subUTCYears(int|float $value = 1) Sub years (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCYear() Sub one year to the instance (using timestamp). - * @method CarbonPeriod yearsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each year or every X years if a factor is given. - * @method float diffInUTCYears(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of years. - * @method CarbonInterface addUTCDecades(int|float $value = 1) Add decades (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCDecade() Add one decade to the instance (using timestamp). - * @method CarbonInterface subUTCDecades(int|float $value = 1) Sub decades (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCDecade() Sub one decade to the instance (using timestamp). - * @method CarbonPeriod decadesUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each decade or every X decades if a factor is given. - * @method float diffInUTCDecades(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of decades. - * @method CarbonInterface addUTCCenturies(int|float $value = 1) Add centuries (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCCentury() Add one century to the instance (using timestamp). - * @method CarbonInterface subUTCCenturies(int|float $value = 1) Sub centuries (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCCentury() Sub one century to the instance (using timestamp). - * @method CarbonPeriod centuriesUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each century or every X centuries if a factor is given. - * @method float diffInUTCCenturies(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of centuries. - * @method CarbonInterface addUTCMillennia(int|float $value = 1) Add millennia (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCMillennium() Add one millennium to the instance (using timestamp). - * @method CarbonInterface subUTCMillennia(int|float $value = 1) Sub millennia (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCMillennium() Sub one millennium to the instance (using timestamp). - * @method CarbonPeriod millenniaUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millennium or every X millennia if a factor is given. - * @method float diffInUTCMillennia(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of millennia. - * @method CarbonInterface roundYear(float $precision = 1, string $function = "round") Round the current instance year with given precision using the given function. - * @method CarbonInterface roundYears(float $precision = 1, string $function = "round") Round the current instance year with given precision using the given function. - * @method CarbonInterface floorYear(float $precision = 1) Truncate the current instance year with given precision. - * @method CarbonInterface floorYears(float $precision = 1) Truncate the current instance year with given precision. - * @method CarbonInterface ceilYear(float $precision = 1) Ceil the current instance year with given precision. - * @method CarbonInterface ceilYears(float $precision = 1) Ceil the current instance year with given precision. - * @method CarbonInterface roundMonth(float $precision = 1, string $function = "round") Round the current instance month with given precision using the given function. - * @method CarbonInterface roundMonths(float $precision = 1, string $function = "round") Round the current instance month with given precision using the given function. - * @method CarbonInterface floorMonth(float $precision = 1) Truncate the current instance month with given precision. - * @method CarbonInterface floorMonths(float $precision = 1) Truncate the current instance month with given precision. - * @method CarbonInterface ceilMonth(float $precision = 1) Ceil the current instance month with given precision. - * @method CarbonInterface ceilMonths(float $precision = 1) Ceil the current instance month with given precision. - * @method CarbonInterface roundDay(float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. - * @method CarbonInterface roundDays(float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. - * @method CarbonInterface floorDay(float $precision = 1) Truncate the current instance day with given precision. - * @method CarbonInterface floorDays(float $precision = 1) Truncate the current instance day with given precision. - * @method CarbonInterface ceilDay(float $precision = 1) Ceil the current instance day with given precision. - * @method CarbonInterface ceilDays(float $precision = 1) Ceil the current instance day with given precision. - * @method CarbonInterface roundHour(float $precision = 1, string $function = "round") Round the current instance hour with given precision using the given function. - * @method CarbonInterface roundHours(float $precision = 1, string $function = "round") Round the current instance hour with given precision using the given function. - * @method CarbonInterface floorHour(float $precision = 1) Truncate the current instance hour with given precision. - * @method CarbonInterface floorHours(float $precision = 1) Truncate the current instance hour with given precision. - * @method CarbonInterface ceilHour(float $precision = 1) Ceil the current instance hour with given precision. - * @method CarbonInterface ceilHours(float $precision = 1) Ceil the current instance hour with given precision. - * @method CarbonInterface roundMinute(float $precision = 1, string $function = "round") Round the current instance minute with given precision using the given function. - * @method CarbonInterface roundMinutes(float $precision = 1, string $function = "round") Round the current instance minute with given precision using the given function. - * @method CarbonInterface floorMinute(float $precision = 1) Truncate the current instance minute with given precision. - * @method CarbonInterface floorMinutes(float $precision = 1) Truncate the current instance minute with given precision. - * @method CarbonInterface ceilMinute(float $precision = 1) Ceil the current instance minute with given precision. - * @method CarbonInterface ceilMinutes(float $precision = 1) Ceil the current instance minute with given precision. - * @method CarbonInterface roundSecond(float $precision = 1, string $function = "round") Round the current instance second with given precision using the given function. - * @method CarbonInterface roundSeconds(float $precision = 1, string $function = "round") Round the current instance second with given precision using the given function. - * @method CarbonInterface floorSecond(float $precision = 1) Truncate the current instance second with given precision. - * @method CarbonInterface floorSeconds(float $precision = 1) Truncate the current instance second with given precision. - * @method CarbonInterface ceilSecond(float $precision = 1) Ceil the current instance second with given precision. - * @method CarbonInterface ceilSeconds(float $precision = 1) Ceil the current instance second with given precision. - * @method CarbonInterface roundMillennium(float $precision = 1, string $function = "round") Round the current instance millennium with given precision using the given function. - * @method CarbonInterface roundMillennia(float $precision = 1, string $function = "round") Round the current instance millennium with given precision using the given function. - * @method CarbonInterface floorMillennium(float $precision = 1) Truncate the current instance millennium with given precision. - * @method CarbonInterface floorMillennia(float $precision = 1) Truncate the current instance millennium with given precision. - * @method CarbonInterface ceilMillennium(float $precision = 1) Ceil the current instance millennium with given precision. - * @method CarbonInterface ceilMillennia(float $precision = 1) Ceil the current instance millennium with given precision. - * @method CarbonInterface roundCentury(float $precision = 1, string $function = "round") Round the current instance century with given precision using the given function. - * @method CarbonInterface roundCenturies(float $precision = 1, string $function = "round") Round the current instance century with given precision using the given function. - * @method CarbonInterface floorCentury(float $precision = 1) Truncate the current instance century with given precision. - * @method CarbonInterface floorCenturies(float $precision = 1) Truncate the current instance century with given precision. - * @method CarbonInterface ceilCentury(float $precision = 1) Ceil the current instance century with given precision. - * @method CarbonInterface ceilCenturies(float $precision = 1) Ceil the current instance century with given precision. - * @method CarbonInterface roundDecade(float $precision = 1, string $function = "round") Round the current instance decade with given precision using the given function. - * @method CarbonInterface roundDecades(float $precision = 1, string $function = "round") Round the current instance decade with given precision using the given function. - * @method CarbonInterface floorDecade(float $precision = 1) Truncate the current instance decade with given precision. - * @method CarbonInterface floorDecades(float $precision = 1) Truncate the current instance decade with given precision. - * @method CarbonInterface ceilDecade(float $precision = 1) Ceil the current instance decade with given precision. - * @method CarbonInterface ceilDecades(float $precision = 1) Ceil the current instance decade with given precision. - * @method CarbonInterface roundQuarter(float $precision = 1, string $function = "round") Round the current instance quarter with given precision using the given function. - * @method CarbonInterface roundQuarters(float $precision = 1, string $function = "round") Round the current instance quarter with given precision using the given function. - * @method CarbonInterface floorQuarter(float $precision = 1) Truncate the current instance quarter with given precision. - * @method CarbonInterface floorQuarters(float $precision = 1) Truncate the current instance quarter with given precision. - * @method CarbonInterface ceilQuarter(float $precision = 1) Ceil the current instance quarter with given precision. - * @method CarbonInterface ceilQuarters(float $precision = 1) Ceil the current instance quarter with given precision. - * @method CarbonInterface roundMillisecond(float $precision = 1, string $function = "round") Round the current instance millisecond with given precision using the given function. - * @method CarbonInterface roundMilliseconds(float $precision = 1, string $function = "round") Round the current instance millisecond with given precision using the given function. - * @method CarbonInterface floorMillisecond(float $precision = 1) Truncate the current instance millisecond with given precision. - * @method CarbonInterface floorMilliseconds(float $precision = 1) Truncate the current instance millisecond with given precision. - * @method CarbonInterface ceilMillisecond(float $precision = 1) Ceil the current instance millisecond with given precision. - * @method CarbonInterface ceilMilliseconds(float $precision = 1) Ceil the current instance millisecond with given precision. - * @method CarbonInterface roundMicrosecond(float $precision = 1, string $function = "round") Round the current instance microsecond with given precision using the given function. - * @method CarbonInterface roundMicroseconds(float $precision = 1, string $function = "round") Round the current instance microsecond with given precision using the given function. - * @method CarbonInterface floorMicrosecond(float $precision = 1) Truncate the current instance microsecond with given precision. - * @method CarbonInterface floorMicroseconds(float $precision = 1) Truncate the current instance microsecond with given precision. - * @method CarbonInterface ceilMicrosecond(float $precision = 1) Ceil the current instance microsecond with given precision. - * @method CarbonInterface ceilMicroseconds(float $precision = 1) Ceil the current instance microsecond with given precision. - * @method string shortAbsoluteDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'Absolute' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string longAbsoluteDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'Absolute' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string shortRelativeDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'Relative' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string longRelativeDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'Relative' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string shortRelativeToNowDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'RelativeToNow' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string longRelativeToNowDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'RelativeToNow' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string shortRelativeToOtherDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'RelativeToOther' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string longRelativeToOtherDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'RelativeToOther' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method int centuriesInMillennium() Return the number of centuries contained in the current millennium - * @method int|static centuryOfMillennium(?int $century = null) Return the value of the century starting from the beginning of the current millennium when called with no parameters, change the current century when called with an integer value - * @method int|static dayOfCentury(?int $day = null) Return the value of the day starting from the beginning of the current century when called with no parameters, change the current day when called with an integer value - * @method int|static dayOfDecade(?int $day = null) Return the value of the day starting from the beginning of the current decade when called with no parameters, change the current day when called with an integer value - * @method int|static dayOfMillennium(?int $day = null) Return the value of the day starting from the beginning of the current millennium when called with no parameters, change the current day when called with an integer value - * @method int|static dayOfMonth(?int $day = null) Return the value of the day starting from the beginning of the current month when called with no parameters, change the current day when called with an integer value - * @method int|static dayOfQuarter(?int $day = null) Return the value of the day starting from the beginning of the current quarter when called with no parameters, change the current day when called with an integer value - * @method int|static dayOfWeek(?int $day = null) Return the value of the day starting from the beginning of the current week when called with no parameters, change the current day when called with an integer value - * @method int daysInCentury() Return the number of days contained in the current century - * @method int daysInDecade() Return the number of days contained in the current decade - * @method int daysInMillennium() Return the number of days contained in the current millennium - * @method int daysInMonth() Return the number of days contained in the current month - * @method int daysInQuarter() Return the number of days contained in the current quarter - * @method int daysInWeek() Return the number of days contained in the current week - * @method int daysInYear() Return the number of days contained in the current year - * @method int|static decadeOfCentury(?int $decade = null) Return the value of the decade starting from the beginning of the current century when called with no parameters, change the current decade when called with an integer value - * @method int|static decadeOfMillennium(?int $decade = null) Return the value of the decade starting from the beginning of the current millennium when called with no parameters, change the current decade when called with an integer value - * @method int decadesInCentury() Return the number of decades contained in the current century - * @method int decadesInMillennium() Return the number of decades contained in the current millennium - * @method int|static hourOfCentury(?int $hour = null) Return the value of the hour starting from the beginning of the current century when called with no parameters, change the current hour when called with an integer value - * @method int|static hourOfDay(?int $hour = null) Return the value of the hour starting from the beginning of the current day when called with no parameters, change the current hour when called with an integer value - * @method int|static hourOfDecade(?int $hour = null) Return the value of the hour starting from the beginning of the current decade when called with no parameters, change the current hour when called with an integer value - * @method int|static hourOfMillennium(?int $hour = null) Return the value of the hour starting from the beginning of the current millennium when called with no parameters, change the current hour when called with an integer value - * @method int|static hourOfMonth(?int $hour = null) Return the value of the hour starting from the beginning of the current month when called with no parameters, change the current hour when called with an integer value - * @method int|static hourOfQuarter(?int $hour = null) Return the value of the hour starting from the beginning of the current quarter when called with no parameters, change the current hour when called with an integer value - * @method int|static hourOfWeek(?int $hour = null) Return the value of the hour starting from the beginning of the current week when called with no parameters, change the current hour when called with an integer value - * @method int|static hourOfYear(?int $hour = null) Return the value of the hour starting from the beginning of the current year when called with no parameters, change the current hour when called with an integer value - * @method int hoursInCentury() Return the number of hours contained in the current century - * @method int hoursInDay() Return the number of hours contained in the current day - * @method int hoursInDecade() Return the number of hours contained in the current decade - * @method int hoursInMillennium() Return the number of hours contained in the current millennium - * @method int hoursInMonth() Return the number of hours contained in the current month - * @method int hoursInQuarter() Return the number of hours contained in the current quarter - * @method int hoursInWeek() Return the number of hours contained in the current week - * @method int hoursInYear() Return the number of hours contained in the current year - * @method int|static microsecondOfCentury(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current century when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfDay(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current day when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfDecade(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current decade when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfHour(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current hour when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfMillennium(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current millennium when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfMillisecond(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current millisecond when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfMinute(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current minute when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfMonth(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current month when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfQuarter(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current quarter when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfSecond(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current second when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfWeek(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current week when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfYear(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current year when called with no parameters, change the current microsecond when called with an integer value - * @method int microsecondsInCentury() Return the number of microseconds contained in the current century - * @method int microsecondsInDay() Return the number of microseconds contained in the current day - * @method int microsecondsInDecade() Return the number of microseconds contained in the current decade - * @method int microsecondsInHour() Return the number of microseconds contained in the current hour - * @method int microsecondsInMillennium() Return the number of microseconds contained in the current millennium - * @method int microsecondsInMillisecond() Return the number of microseconds contained in the current millisecond - * @method int microsecondsInMinute() Return the number of microseconds contained in the current minute - * @method int microsecondsInMonth() Return the number of microseconds contained in the current month - * @method int microsecondsInQuarter() Return the number of microseconds contained in the current quarter - * @method int microsecondsInSecond() Return the number of microseconds contained in the current second - * @method int microsecondsInWeek() Return the number of microseconds contained in the current week - * @method int microsecondsInYear() Return the number of microseconds contained in the current year - * @method int|static millisecondOfCentury(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current century when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfDay(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current day when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfDecade(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current decade when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfHour(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current hour when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfMillennium(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current millennium when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfMinute(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current minute when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfMonth(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current month when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfQuarter(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current quarter when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfSecond(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current second when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfWeek(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current week when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfYear(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current year when called with no parameters, change the current millisecond when called with an integer value - * @method int millisecondsInCentury() Return the number of milliseconds contained in the current century - * @method int millisecondsInDay() Return the number of milliseconds contained in the current day - * @method int millisecondsInDecade() Return the number of milliseconds contained in the current decade - * @method int millisecondsInHour() Return the number of milliseconds contained in the current hour - * @method int millisecondsInMillennium() Return the number of milliseconds contained in the current millennium - * @method int millisecondsInMinute() Return the number of milliseconds contained in the current minute - * @method int millisecondsInMonth() Return the number of milliseconds contained in the current month - * @method int millisecondsInQuarter() Return the number of milliseconds contained in the current quarter - * @method int millisecondsInSecond() Return the number of milliseconds contained in the current second - * @method int millisecondsInWeek() Return the number of milliseconds contained in the current week - * @method int millisecondsInYear() Return the number of milliseconds contained in the current year - * @method int|static minuteOfCentury(?int $minute = null) Return the value of the minute starting from the beginning of the current century when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfDay(?int $minute = null) Return the value of the minute starting from the beginning of the current day when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfDecade(?int $minute = null) Return the value of the minute starting from the beginning of the current decade when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfHour(?int $minute = null) Return the value of the minute starting from the beginning of the current hour when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfMillennium(?int $minute = null) Return the value of the minute starting from the beginning of the current millennium when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfMonth(?int $minute = null) Return the value of the minute starting from the beginning of the current month when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfQuarter(?int $minute = null) Return the value of the minute starting from the beginning of the current quarter when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfWeek(?int $minute = null) Return the value of the minute starting from the beginning of the current week when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfYear(?int $minute = null) Return the value of the minute starting from the beginning of the current year when called with no parameters, change the current minute when called with an integer value - * @method int minutesInCentury() Return the number of minutes contained in the current century - * @method int minutesInDay() Return the number of minutes contained in the current day - * @method int minutesInDecade() Return the number of minutes contained in the current decade - * @method int minutesInHour() Return the number of minutes contained in the current hour - * @method int minutesInMillennium() Return the number of minutes contained in the current millennium - * @method int minutesInMonth() Return the number of minutes contained in the current month - * @method int minutesInQuarter() Return the number of minutes contained in the current quarter - * @method int minutesInWeek() Return the number of minutes contained in the current week - * @method int minutesInYear() Return the number of minutes contained in the current year - * @method int|static monthOfCentury(?int $month = null) Return the value of the month starting from the beginning of the current century when called with no parameters, change the current month when called with an integer value - * @method int|static monthOfDecade(?int $month = null) Return the value of the month starting from the beginning of the current decade when called with no parameters, change the current month when called with an integer value - * @method int|static monthOfMillennium(?int $month = null) Return the value of the month starting from the beginning of the current millennium when called with no parameters, change the current month when called with an integer value - * @method int|static monthOfQuarter(?int $month = null) Return the value of the month starting from the beginning of the current quarter when called with no parameters, change the current month when called with an integer value - * @method int|static monthOfYear(?int $month = null) Return the value of the month starting from the beginning of the current year when called with no parameters, change the current month when called with an integer value - * @method int monthsInCentury() Return the number of months contained in the current century - * @method int monthsInDecade() Return the number of months contained in the current decade - * @method int monthsInMillennium() Return the number of months contained in the current millennium - * @method int monthsInQuarter() Return the number of months contained in the current quarter - * @method int monthsInYear() Return the number of months contained in the current year - * @method int|static quarterOfCentury(?int $quarter = null) Return the value of the quarter starting from the beginning of the current century when called with no parameters, change the current quarter when called with an integer value - * @method int|static quarterOfDecade(?int $quarter = null) Return the value of the quarter starting from the beginning of the current decade when called with no parameters, change the current quarter when called with an integer value - * @method int|static quarterOfMillennium(?int $quarter = null) Return the value of the quarter starting from the beginning of the current millennium when called with no parameters, change the current quarter when called with an integer value - * @method int|static quarterOfYear(?int $quarter = null) Return the value of the quarter starting from the beginning of the current year when called with no parameters, change the current quarter when called with an integer value - * @method int quartersInCentury() Return the number of quarters contained in the current century - * @method int quartersInDecade() Return the number of quarters contained in the current decade - * @method int quartersInMillennium() Return the number of quarters contained in the current millennium - * @method int quartersInYear() Return the number of quarters contained in the current year - * @method int|static secondOfCentury(?int $second = null) Return the value of the second starting from the beginning of the current century when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfDay(?int $second = null) Return the value of the second starting from the beginning of the current day when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfDecade(?int $second = null) Return the value of the second starting from the beginning of the current decade when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfHour(?int $second = null) Return the value of the second starting from the beginning of the current hour when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfMillennium(?int $second = null) Return the value of the second starting from the beginning of the current millennium when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfMinute(?int $second = null) Return the value of the second starting from the beginning of the current minute when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfMonth(?int $second = null) Return the value of the second starting from the beginning of the current month when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfQuarter(?int $second = null) Return the value of the second starting from the beginning of the current quarter when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfWeek(?int $second = null) Return the value of the second starting from the beginning of the current week when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfYear(?int $second = null) Return the value of the second starting from the beginning of the current year when called with no parameters, change the current second when called with an integer value - * @method int secondsInCentury() Return the number of seconds contained in the current century - * @method int secondsInDay() Return the number of seconds contained in the current day - * @method int secondsInDecade() Return the number of seconds contained in the current decade - * @method int secondsInHour() Return the number of seconds contained in the current hour - * @method int secondsInMillennium() Return the number of seconds contained in the current millennium - * @method int secondsInMinute() Return the number of seconds contained in the current minute - * @method int secondsInMonth() Return the number of seconds contained in the current month - * @method int secondsInQuarter() Return the number of seconds contained in the current quarter - * @method int secondsInWeek() Return the number of seconds contained in the current week - * @method int secondsInYear() Return the number of seconds contained in the current year - * @method int|static weekOfCentury(?int $week = null) Return the value of the week starting from the beginning of the current century when called with no parameters, change the current week when called with an integer value - * @method int|static weekOfDecade(?int $week = null) Return the value of the week starting from the beginning of the current decade when called with no parameters, change the current week when called with an integer value - * @method int|static weekOfMillennium(?int $week = null) Return the value of the week starting from the beginning of the current millennium when called with no parameters, change the current week when called with an integer value - * @method int|static weekOfMonth(?int $week = null) Return the value of the week starting from the beginning of the current month when called with no parameters, change the current week when called with an integer value - * @method int|static weekOfQuarter(?int $week = null) Return the value of the week starting from the beginning of the current quarter when called with no parameters, change the current week when called with an integer value - * @method int|static weekOfYear(?int $week = null) Return the value of the week starting from the beginning of the current year when called with no parameters, change the current week when called with an integer value - * @method int weeksInCentury() Return the number of weeks contained in the current century - * @method int weeksInDecade() Return the number of weeks contained in the current decade - * @method int weeksInMillennium() Return the number of weeks contained in the current millennium - * @method int weeksInMonth() Return the number of weeks contained in the current month - * @method int weeksInQuarter() Return the number of weeks contained in the current quarter - * @method int|static yearOfCentury(?int $year = null) Return the value of the year starting from the beginning of the current century when called with no parameters, change the current year when called with an integer value - * @method int|static yearOfDecade(?int $year = null) Return the value of the year starting from the beginning of the current decade when called with no parameters, change the current year when called with an integer value - * @method int|static yearOfMillennium(?int $year = null) Return the value of the year starting from the beginning of the current millennium when called with no parameters, change the current year when called with an integer value - * @method int yearsInCentury() Return the number of years contained in the current century - * @method int yearsInDecade() Return the number of years contained in the current decade - * @method int yearsInMillennium() Return the number of years contained in the current millennium + * @method bool isUtc() Check if the current instance has UTC timezone. (Both isUtc and isUTC cases are valid.) + * @method bool isLocal() Check if the current instance has non-UTC timezone. + * @method bool isValid() Check if the current instance is a valid date. + * @method bool isDST() Check if the current instance is in a daylight saving time. + * @method bool isSunday() Checks if the instance day is sunday. + * @method bool isMonday() Checks if the instance day is monday. + * @method bool isTuesday() Checks if the instance day is tuesday. + * @method bool isWednesday() Checks if the instance day is wednesday. + * @method bool isThursday() Checks if the instance day is thursday. + * @method bool isFriday() Checks if the instance day is friday. + * @method bool isSaturday() Checks if the instance day is saturday. + * @method bool isSameYear(DateTimeInterface|string $date) Checks if the given date is in the same year as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentYear() Checks if the instance is in the same year as the current moment. + * @method bool isNextYear() Checks if the instance is in the same year as the current moment next year. + * @method bool isLastYear() Checks if the instance is in the same year as the current moment last year. + * @method bool isCurrentMonth() Checks if the instance is in the same month as the current moment. + * @method bool isNextMonth() Checks if the instance is in the same month as the current moment next month. + * @method bool isLastMonth() Checks if the instance is in the same month as the current moment last month. + * @method bool isSameWeek(DateTimeInterface|string $date) Checks if the given date is in the same week as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentWeek() Checks if the instance is in the same week as the current moment. + * @method bool isNextWeek() Checks if the instance is in the same week as the current moment next week. + * @method bool isLastWeek() Checks if the instance is in the same week as the current moment last week. + * @method bool isSameDay(DateTimeInterface|string $date) Checks if the given date is in the same day as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentDay() Checks if the instance is in the same day as the current moment. + * @method bool isNextDay() Checks if the instance is in the same day as the current moment next day. + * @method bool isLastDay() Checks if the instance is in the same day as the current moment last day. + * @method bool isSameHour(DateTimeInterface|string $date) Checks if the given date is in the same hour as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentHour() Checks if the instance is in the same hour as the current moment. + * @method bool isNextHour() Checks if the instance is in the same hour as the current moment next hour. + * @method bool isLastHour() Checks if the instance is in the same hour as the current moment last hour. + * @method bool isSameMinute(DateTimeInterface|string $date) Checks if the given date is in the same minute as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentMinute() Checks if the instance is in the same minute as the current moment. + * @method bool isNextMinute() Checks if the instance is in the same minute as the current moment next minute. + * @method bool isLastMinute() Checks if the instance is in the same minute as the current moment last minute. + * @method bool isSameSecond(DateTimeInterface|string $date) Checks if the given date is in the same second as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentSecond() Checks if the instance is in the same second as the current moment. + * @method bool isNextSecond() Checks if the instance is in the same second as the current moment next second. + * @method bool isLastSecond() Checks if the instance is in the same second as the current moment last second. + * @method bool isSameMilli(DateTimeInterface|string $date) Checks if the given date is in the same millisecond as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentMilli() Checks if the instance is in the same millisecond as the current moment. + * @method bool isNextMilli() Checks if the instance is in the same millisecond as the current moment next millisecond. + * @method bool isLastMilli() Checks if the instance is in the same millisecond as the current moment last millisecond. + * @method bool isSameMillisecond(DateTimeInterface|string $date) Checks if the given date is in the same millisecond as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentMillisecond() Checks if the instance is in the same millisecond as the current moment. + * @method bool isNextMillisecond() Checks if the instance is in the same millisecond as the current moment next millisecond. + * @method bool isLastMillisecond() Checks if the instance is in the same millisecond as the current moment last millisecond. + * @method bool isSameMicro(DateTimeInterface|string $date) Checks if the given date is in the same microsecond as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentMicro() Checks if the instance is in the same microsecond as the current moment. + * @method bool isNextMicro() Checks if the instance is in the same microsecond as the current moment next microsecond. + * @method bool isLastMicro() Checks if the instance is in the same microsecond as the current moment last microsecond. + * @method bool isSameMicrosecond(DateTimeInterface|string $date) Checks if the given date is in the same microsecond as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentMicrosecond() Checks if the instance is in the same microsecond as the current moment. + * @method bool isNextMicrosecond() Checks if the instance is in the same microsecond as the current moment next microsecond. + * @method bool isLastMicrosecond() Checks if the instance is in the same microsecond as the current moment last microsecond. + * @method bool isSameDecade(DateTimeInterface|string $date) Checks if the given date is in the same decade as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentDecade() Checks if the instance is in the same decade as the current moment. + * @method bool isNextDecade() Checks if the instance is in the same decade as the current moment next decade. + * @method bool isLastDecade() Checks if the instance is in the same decade as the current moment last decade. + * @method bool isSameCentury(DateTimeInterface|string $date) Checks if the given date is in the same century as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentCentury() Checks if the instance is in the same century as the current moment. + * @method bool isNextCentury() Checks if the instance is in the same century as the current moment next century. + * @method bool isLastCentury() Checks if the instance is in the same century as the current moment last century. + * @method bool isSameMillennium(DateTimeInterface|string $date) Checks if the given date is in the same millennium as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentMillennium() Checks if the instance is in the same millennium as the current moment. + * @method bool isNextMillennium() Checks if the instance is in the same millennium as the current moment next millennium. + * @method bool isLastMillennium() Checks if the instance is in the same millennium as the current moment last millennium. + * @method bool isCurrentQuarter() Checks if the instance is in the same quarter as the current moment. + * @method bool isNextQuarter() Checks if the instance is in the same quarter as the current moment next quarter. + * @method bool isLastQuarter() Checks if the instance is in the same quarter as the current moment last quarter. + * @method CarbonInterface years(int $value, OverflowMode|bool|null $overflow = null, ?int $anchorDay = null) Set current instance year to the given value. + * @method CarbonInterface year(int $value, OverflowMode|bool|null $overflow = null, ?int $anchorDay = null) Set current instance year to the given value. + * @method CarbonInterface setYears(int $value, OverflowMode|bool|null $overflow = null, ?int $anchorDay = null) Set current instance year to the given value. + * @method CarbonInterface setYear(int $value, OverflowMode|bool|null $overflow = null, ?int $anchorDay = null) Set current instance year to the given value. + * @method CarbonInterface months(Month|int $value, OverflowMode|bool|null $overflow = null, ?int $anchorDay = null) Set current instance month to the given value. + * @method CarbonInterface month(Month|int $value, OverflowMode|bool|null $overflow = null, ?int $anchorDay = null) Set current instance month to the given value. + * @method CarbonInterface setMonths(Month|int $value, OverflowMode|bool|null $overflow = null, ?int $anchorDay = null) Set current instance month to the given value. + * @method CarbonInterface setMonth(Month|int $value, OverflowMode|bool|null $overflow = null, ?int $anchorDay = null) Set current instance month to the given value. + * @method CarbonInterface days(int $value) Set current instance day to the given value. + * @method CarbonInterface day(int $value) Set current instance day to the given value. + * @method CarbonInterface setDays(int $value) Set current instance day to the given value. + * @method CarbonInterface setDay(int $value) Set current instance day to the given value. + * @method CarbonInterface hours(int $value) Set current instance hour to the given value. + * @method CarbonInterface hour(int $value) Set current instance hour to the given value. + * @method CarbonInterface setHours(int $value) Set current instance hour to the given value. + * @method CarbonInterface setHour(int $value) Set current instance hour to the given value. + * @method CarbonInterface minutes(int $value) Set current instance minute to the given value. + * @method CarbonInterface minute(int $value) Set current instance minute to the given value. + * @method CarbonInterface setMinutes(int $value) Set current instance minute to the given value. + * @method CarbonInterface setMinute(int $value) Set current instance minute to the given value. + * @method CarbonInterface seconds(int $value) Set current instance second to the given value. + * @method CarbonInterface second(int $value) Set current instance second to the given value. + * @method CarbonInterface setSeconds(int $value) Set current instance second to the given value. + * @method CarbonInterface setSecond(int $value) Set current instance second to the given value. + * @method CarbonInterface millis(int $value) Set current instance millisecond to the given value. + * @method CarbonInterface milli(int $value) Set current instance millisecond to the given value. + * @method CarbonInterface setMillis(int $value) Set current instance millisecond to the given value. + * @method CarbonInterface setMilli(int $value) Set current instance millisecond to the given value. + * @method CarbonInterface milliseconds(int $value) Set current instance millisecond to the given value. + * @method CarbonInterface millisecond(int $value) Set current instance millisecond to the given value. + * @method CarbonInterface setMilliseconds(int $value) Set current instance millisecond to the given value. + * @method CarbonInterface setMillisecond(int $value) Set current instance millisecond to the given value. + * @method CarbonInterface micros(int $value) Set current instance microsecond to the given value. + * @method CarbonInterface micro(int $value) Set current instance microsecond to the given value. + * @method CarbonInterface setMicros(int $value) Set current instance microsecond to the given value. + * @method CarbonInterface setMicro(int $value) Set current instance microsecond to the given value. + * @method CarbonInterface microseconds(int $value) Set current instance microsecond to the given value. + * @method CarbonInterface microsecond(int $value) Set current instance microsecond to the given value. + * @method CarbonInterface setMicroseconds(int $value) Set current instance microsecond to the given value. + * @method self setMicrosecond(int $value) Set current instance microsecond to the given value. + * @method CarbonInterface addYears(int|float $value = 1, ?int $anchorDay = null) Add years (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addYear() Add one year to the instance (using date interval). + * @method CarbonInterface subYears(int|float $value = 1, ?int $anchorDay = null) Sub years (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subYear() Sub one year to the instance (using date interval). + * @method CarbonInterface addYearsWithOverflow(int|float $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface addYearWithOverflow() Add one year to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface subYearsWithOverflow(int|float $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface subYearWithOverflow() Sub one year to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface addYearsWithoutOverflow(int|float $value = 1, ?int $anchorDay = null) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addYearWithoutOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subYearsWithoutOverflow(int|float $value = 1, ?int $anchorDay = null) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subYearWithoutOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addYearsWithNoOverflow(int|float $value = 1, ?int $anchorDay = null) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addYearWithNoOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subYearsWithNoOverflow(int|float $value = 1, ?int $anchorDay = null) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subYearWithNoOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addYearsNoOverflow(int|float $value = 1, ?int $anchorDay = null) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addYearNoOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subYearsNoOverflow(int|float $value = 1, ?int $anchorDay = null) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subYearNoOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addMonths(int|float $value = 1, ?int $anchorDay = null) Add months (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addMonth() Add one month to the instance (using date interval). + * @method CarbonInterface subMonths(int|float $value = 1, ?int $anchorDay = null) Sub months (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subMonth() Sub one month to the instance (using date interval). + * @method CarbonInterface addMonthsWithOverflow(int|float $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface addMonthWithOverflow() Add one month to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface subMonthsWithOverflow(int|float $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface subMonthWithOverflow() Sub one month to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface addMonthsWithoutOverflow(int|float $value = 1, ?int $anchorDay = null) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addMonthWithoutOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subMonthsWithoutOverflow(int|float $value = 1, ?int $anchorDay = null) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subMonthWithoutOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addMonthsWithNoOverflow(int|float $value = 1, ?int $anchorDay = null) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addMonthWithNoOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subMonthsWithNoOverflow(int|float $value = 1, ?int $anchorDay = null) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subMonthWithNoOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addMonthsNoOverflow(int|float $value = 1, ?int $anchorDay = null) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addMonthNoOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subMonthsNoOverflow(int|float $value = 1, ?int $anchorDay = null) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subMonthNoOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addDays(int|float $value = 1) Add days (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addDay() Add one day to the instance (using date interval). + * @method CarbonInterface subDays(int|float $value = 1) Sub days (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subDay() Sub one day to the instance (using date interval). + * @method CarbonInterface addHours(int|float $value = 1) Add hours (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addHour() Add one hour to the instance (using date interval). + * @method CarbonInterface subHours(int|float $value = 1) Sub hours (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subHour() Sub one hour to the instance (using date interval). + * @method CarbonInterface addMinutes(int|float $value = 1) Add minutes (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addMinute() Add one minute to the instance (using date interval). + * @method CarbonInterface subMinutes(int|float $value = 1) Sub minutes (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subMinute() Sub one minute to the instance (using date interval). + * @method CarbonInterface addSeconds(int|float $value = 1) Add seconds (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addSecond() Add one second to the instance (using date interval). + * @method CarbonInterface subSeconds(int|float $value = 1) Sub seconds (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subSecond() Sub one second to the instance (using date interval). + * @method CarbonInterface addMillis(int|float $value = 1) Add milliseconds (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addMilli() Add one millisecond to the instance (using date interval). + * @method CarbonInterface subMillis(int|float $value = 1) Sub milliseconds (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subMilli() Sub one millisecond to the instance (using date interval). + * @method CarbonInterface addMilliseconds(int|float $value = 1) Add milliseconds (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addMillisecond() Add one millisecond to the instance (using date interval). + * @method CarbonInterface subMilliseconds(int|float $value = 1) Sub milliseconds (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subMillisecond() Sub one millisecond to the instance (using date interval). + * @method CarbonInterface addMicros(int|float $value = 1) Add microseconds (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addMicro() Add one microsecond to the instance (using date interval). + * @method CarbonInterface subMicros(int|float $value = 1) Sub microseconds (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subMicro() Sub one microsecond to the instance (using date interval). + * @method CarbonInterface addMicroseconds(int|float $value = 1) Add microseconds (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addMicrosecond() Add one microsecond to the instance (using date interval). + * @method CarbonInterface subMicroseconds(int|float $value = 1) Sub microseconds (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subMicrosecond() Sub one microsecond to the instance (using date interval). + * @method CarbonInterface addMillennia(int|float $value = 1, ?int $anchorDay = null) Add millennia (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addMillennium() Add one millennium to the instance (using date interval). + * @method CarbonInterface subMillennia(int|float $value = 1, ?int $anchorDay = null) Sub millennia (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subMillennium() Sub one millennium to the instance (using date interval). + * @method CarbonInterface addMillenniaWithOverflow(int|float $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface addMillenniumWithOverflow() Add one millennium to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface subMillenniaWithOverflow(int|float $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface subMillenniumWithOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface addMillenniaWithoutOverflow(int|float $value = 1, ?int $anchorDay = null) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addMillenniumWithoutOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subMillenniaWithoutOverflow(int|float $value = 1, ?int $anchorDay = null) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subMillenniumWithoutOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addMillenniaWithNoOverflow(int|float $value = 1, ?int $anchorDay = null) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addMillenniumWithNoOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subMillenniaWithNoOverflow(int|float $value = 1, ?int $anchorDay = null) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subMillenniumWithNoOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addMillenniaNoOverflow(int|float $value = 1, ?int $anchorDay = null) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addMillenniumNoOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subMillenniaNoOverflow(int|float $value = 1, ?int $anchorDay = null) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subMillenniumNoOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addCenturies(int|float $value = 1, ?int $anchorDay = null) Add centuries (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addCentury() Add one century to the instance (using date interval). + * @method CarbonInterface subCenturies(int|float $value = 1, ?int $anchorDay = null) Sub centuries (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subCentury() Sub one century to the instance (using date interval). + * @method CarbonInterface addCenturiesWithOverflow(int|float $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface addCenturyWithOverflow() Add one century to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface subCenturiesWithOverflow(int|float $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface subCenturyWithOverflow() Sub one century to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface addCenturiesWithoutOverflow(int|float $value = 1, ?int $anchorDay = null) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addCenturyWithoutOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subCenturiesWithoutOverflow(int|float $value = 1, ?int $anchorDay = null) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subCenturyWithoutOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addCenturiesWithNoOverflow(int|float $value = 1, ?int $anchorDay = null) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addCenturyWithNoOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subCenturiesWithNoOverflow(int|float $value = 1, ?int $anchorDay = null) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subCenturyWithNoOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addCenturiesNoOverflow(int|float $value = 1, ?int $anchorDay = null) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addCenturyNoOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subCenturiesNoOverflow(int|float $value = 1, ?int $anchorDay = null) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subCenturyNoOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addDecades(int|float $value = 1, ?int $anchorDay = null) Add decades (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addDecade() Add one decade to the instance (using date interval). + * @method CarbonInterface subDecades(int|float $value = 1, ?int $anchorDay = null) Sub decades (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subDecade() Sub one decade to the instance (using date interval). + * @method CarbonInterface addDecadesWithOverflow(int|float $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface addDecadeWithOverflow() Add one decade to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface subDecadesWithOverflow(int|float $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface subDecadeWithOverflow() Sub one decade to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface addDecadesWithoutOverflow(int|float $value = 1, ?int $anchorDay = null) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addDecadeWithoutOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subDecadesWithoutOverflow(int|float $value = 1, ?int $anchorDay = null) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subDecadeWithoutOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addDecadesWithNoOverflow(int|float $value = 1, ?int $anchorDay = null) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addDecadeWithNoOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subDecadesWithNoOverflow(int|float $value = 1, ?int $anchorDay = null) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subDecadeWithNoOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addDecadesNoOverflow(int|float $value = 1, ?int $anchorDay = null) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addDecadeNoOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subDecadesNoOverflow(int|float $value = 1, ?int $anchorDay = null) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subDecadeNoOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addQuarters(int|float $value = 1, ?int $anchorDay = null) Add quarters (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addQuarter() Add one quarter to the instance (using date interval). + * @method CarbonInterface subQuarters(int|float $value = 1, ?int $anchorDay = null) Sub quarters (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subQuarter() Sub one quarter to the instance (using date interval). + * @method CarbonInterface addQuartersWithOverflow(int|float $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface addQuarterWithOverflow() Add one quarter to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface subQuartersWithOverflow(int|float $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface subQuarterWithOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface addQuartersWithoutOverflow(int|float $value = 1, ?int $anchorDay = null) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addQuarterWithoutOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subQuartersWithoutOverflow(int|float $value = 1, ?int $anchorDay = null) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subQuarterWithoutOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addQuartersWithNoOverflow(int|float $value = 1, ?int $anchorDay = null) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addQuarterWithNoOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subQuartersWithNoOverflow(int|float $value = 1, ?int $anchorDay = null) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subQuarterWithNoOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addQuartersNoOverflow(int|float $value = 1, ?int $anchorDay = null) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addQuarterNoOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subQuartersNoOverflow(int|float $value = 1, ?int $anchorDay = null) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subQuarterNoOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addWeeks(int|float $value = 1) Add weeks (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addWeek() Add one week to the instance (using date interval). + * @method CarbonInterface subWeeks(int|float $value = 1) Sub weeks (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subWeek() Sub one week to the instance (using date interval). + * @method CarbonInterface addWeekdays(int|float $value = 1) Add weekdays (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addWeekday() Add one weekday to the instance (using date interval). + * @method CarbonInterface subWeekdays(int|float $value = 1) Sub weekdays (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subWeekday() Sub one weekday to the instance (using date interval). + * @method CarbonInterface addUTCMicros(int|float $value = 1) Add microseconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addUTCMicro() Add one microsecond to the instance (using timestamp). + * @method CarbonInterface subUTCMicros(int|float $value = 1) Sub microseconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subUTCMicro() Sub one microsecond to the instance (using timestamp). + * @method CarbonPeriod microsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each microsecond or every X microseconds if a factor is given. + * @method float diffInUTCMicros(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of microseconds. + * @method CarbonInterface addUTCMicroseconds(int|float $value = 1) Add microseconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addUTCMicrosecond() Add one microsecond to the instance (using timestamp). + * @method CarbonInterface subUTCMicroseconds(int|float $value = 1) Sub microseconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subUTCMicrosecond() Sub one microsecond to the instance (using timestamp). + * @method CarbonPeriod microsecondsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each microsecond or every X microseconds if a factor is given. + * @method float diffInUTCMicroseconds(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of microseconds. + * @method CarbonInterface addUTCMillis(int|float $value = 1) Add milliseconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addUTCMilli() Add one millisecond to the instance (using timestamp). + * @method CarbonInterface subUTCMillis(int|float $value = 1) Sub milliseconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subUTCMilli() Sub one millisecond to the instance (using timestamp). + * @method CarbonPeriod millisUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millisecond or every X milliseconds if a factor is given. + * @method float diffInUTCMillis(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of milliseconds. + * @method CarbonInterface addUTCMilliseconds(int|float $value = 1) Add milliseconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addUTCMillisecond() Add one millisecond to the instance (using timestamp). + * @method CarbonInterface subUTCMilliseconds(int|float $value = 1) Sub milliseconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subUTCMillisecond() Sub one millisecond to the instance (using timestamp). + * @method CarbonPeriod millisecondsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millisecond or every X milliseconds if a factor is given. + * @method float diffInUTCMilliseconds(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of milliseconds. + * @method CarbonInterface addUTCSeconds(int|float $value = 1) Add seconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addUTCSecond() Add one second to the instance (using timestamp). + * @method CarbonInterface subUTCSeconds(int|float $value = 1) Sub seconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subUTCSecond() Sub one second to the instance (using timestamp). + * @method CarbonPeriod secondsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each second or every X seconds if a factor is given. + * @method float diffInUTCSeconds(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of seconds. + * @method CarbonInterface addUTCMinutes(int|float $value = 1) Add minutes (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addUTCMinute() Add one minute to the instance (using timestamp). + * @method CarbonInterface subUTCMinutes(int|float $value = 1) Sub minutes (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subUTCMinute() Sub one minute to the instance (using timestamp). + * @method CarbonPeriod minutesUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each minute or every X minutes if a factor is given. + * @method float diffInUTCMinutes(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of minutes. + * @method CarbonInterface addUTCHours(int|float $value = 1) Add hours (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addUTCHour() Add one hour to the instance (using timestamp). + * @method CarbonInterface subUTCHours(int|float $value = 1) Sub hours (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subUTCHour() Sub one hour to the instance (using timestamp). + * @method CarbonPeriod hoursUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each hour or every X hours if a factor is given. + * @method float diffInUTCHours(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of hours. + * @method CarbonInterface addUTCDays(int|float $value = 1) Add days (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addUTCDay() Add one day to the instance (using timestamp). + * @method CarbonInterface subUTCDays(int|float $value = 1) Sub days (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subUTCDay() Sub one day to the instance (using timestamp). + * @method CarbonPeriod daysUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each day or every X days if a factor is given. + * @method float diffInUTCDays(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of days. + * @method CarbonInterface addUTCWeeks(int|float $value = 1) Add weeks (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addUTCWeek() Add one week to the instance (using timestamp). + * @method CarbonInterface subUTCWeeks(int|float $value = 1) Sub weeks (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subUTCWeek() Sub one week to the instance (using timestamp). + * @method CarbonPeriod weeksUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each week or every X weeks if a factor is given. + * @method float diffInUTCWeeks(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of weeks. + * @method CarbonInterface addUTCMonths(int|float $value = 1) Add months (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addUTCMonth() Add one month to the instance (using timestamp). + * @method CarbonInterface subUTCMonths(int|float $value = 1) Sub months (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subUTCMonth() Sub one month to the instance (using timestamp). + * @method CarbonPeriod monthsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each month or every X months if a factor is given. + * @method float diffInUTCMonths(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of months. + * @method CarbonInterface addUTCQuarters(int|float $value = 1) Add quarters (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addUTCQuarter() Add one quarter to the instance (using timestamp). + * @method CarbonInterface subUTCQuarters(int|float $value = 1) Sub quarters (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subUTCQuarter() Sub one quarter to the instance (using timestamp). + * @method CarbonPeriod quartersUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each quarter or every X quarters if a factor is given. + * @method float diffInUTCQuarters(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of quarters. + * @method CarbonInterface addUTCYears(int|float $value = 1) Add years (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addUTCYear() Add one year to the instance (using timestamp). + * @method CarbonInterface subUTCYears(int|float $value = 1) Sub years (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subUTCYear() Sub one year to the instance (using timestamp). + * @method CarbonPeriod yearsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each year or every X years if a factor is given. + * @method float diffInUTCYears(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of years. + * @method CarbonInterface addUTCDecades(int|float $value = 1) Add decades (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addUTCDecade() Add one decade to the instance (using timestamp). + * @method CarbonInterface subUTCDecades(int|float $value = 1) Sub decades (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subUTCDecade() Sub one decade to the instance (using timestamp). + * @method CarbonPeriod decadesUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each decade or every X decades if a factor is given. + * @method float diffInUTCDecades(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of decades. + * @method CarbonInterface addUTCCenturies(int|float $value = 1) Add centuries (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addUTCCentury() Add one century to the instance (using timestamp). + * @method CarbonInterface subUTCCenturies(int|float $value = 1) Sub centuries (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subUTCCentury() Sub one century to the instance (using timestamp). + * @method CarbonPeriod centuriesUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each century or every X centuries if a factor is given. + * @method float diffInUTCCenturies(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of centuries. + * @method CarbonInterface addUTCMillennia(int|float $value = 1) Add millennia (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addUTCMillennium() Add one millennium to the instance (using timestamp). + * @method CarbonInterface subUTCMillennia(int|float $value = 1) Sub millennia (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subUTCMillennium() Sub one millennium to the instance (using timestamp). + * @method CarbonPeriod millenniaUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millennium or every X millennia if a factor is given. + * @method float diffInUTCMillennia(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of millennia. + * @method CarbonInterface roundYear(float $precision = 1, string $function = "round") Round the current instance year with given precision using the given function. + * @method CarbonInterface roundYears(float $precision = 1, string $function = "round") Round the current instance year with given precision using the given function. + * @method CarbonInterface floorYear(float $precision = 1) Truncate the current instance year with given precision. + * @method CarbonInterface floorYears(float $precision = 1) Truncate the current instance year with given precision. + * @method CarbonInterface ceilYear(float $precision = 1) Ceil the current instance year with given precision. + * @method CarbonInterface ceilYears(float $precision = 1) Ceil the current instance year with given precision. + * @method CarbonInterface roundMonth(float $precision = 1, string $function = "round") Round the current instance month with given precision using the given function. + * @method CarbonInterface roundMonths(float $precision = 1, string $function = "round") Round the current instance month with given precision using the given function. + * @method CarbonInterface floorMonth(float $precision = 1) Truncate the current instance month with given precision. + * @method CarbonInterface floorMonths(float $precision = 1) Truncate the current instance month with given precision. + * @method CarbonInterface ceilMonth(float $precision = 1) Ceil the current instance month with given precision. + * @method CarbonInterface ceilMonths(float $precision = 1) Ceil the current instance month with given precision. + * @method CarbonInterface roundDay(float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. + * @method CarbonInterface roundDays(float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. + * @method CarbonInterface floorDay(float $precision = 1) Truncate the current instance day with given precision. + * @method CarbonInterface floorDays(float $precision = 1) Truncate the current instance day with given precision. + * @method CarbonInterface ceilDay(float $precision = 1) Ceil the current instance day with given precision. + * @method CarbonInterface ceilDays(float $precision = 1) Ceil the current instance day with given precision. + * @method CarbonInterface roundHour(float $precision = 1, string $function = "round") Round the current instance hour with given precision using the given function. + * @method CarbonInterface roundHours(float $precision = 1, string $function = "round") Round the current instance hour with given precision using the given function. + * @method CarbonInterface floorHour(float $precision = 1) Truncate the current instance hour with given precision. + * @method CarbonInterface floorHours(float $precision = 1) Truncate the current instance hour with given precision. + * @method CarbonInterface ceilHour(float $precision = 1) Ceil the current instance hour with given precision. + * @method CarbonInterface ceilHours(float $precision = 1) Ceil the current instance hour with given precision. + * @method CarbonInterface roundMinute(float $precision = 1, string $function = "round") Round the current instance minute with given precision using the given function. + * @method CarbonInterface roundMinutes(float $precision = 1, string $function = "round") Round the current instance minute with given precision using the given function. + * @method CarbonInterface floorMinute(float $precision = 1) Truncate the current instance minute with given precision. + * @method CarbonInterface floorMinutes(float $precision = 1) Truncate the current instance minute with given precision. + * @method CarbonInterface ceilMinute(float $precision = 1) Ceil the current instance minute with given precision. + * @method CarbonInterface ceilMinutes(float $precision = 1) Ceil the current instance minute with given precision. + * @method CarbonInterface roundSecond(float $precision = 1, string $function = "round") Round the current instance second with given precision using the given function. + * @method CarbonInterface roundSeconds(float $precision = 1, string $function = "round") Round the current instance second with given precision using the given function. + * @method CarbonInterface floorSecond(float $precision = 1) Truncate the current instance second with given precision. + * @method CarbonInterface floorSeconds(float $precision = 1) Truncate the current instance second with given precision. + * @method CarbonInterface ceilSecond(float $precision = 1) Ceil the current instance second with given precision. + * @method CarbonInterface ceilSeconds(float $precision = 1) Ceil the current instance second with given precision. + * @method CarbonInterface roundMillennium(float $precision = 1, string $function = "round") Round the current instance millennium with given precision using the given function. + * @method CarbonInterface roundMillennia(float $precision = 1, string $function = "round") Round the current instance millennium with given precision using the given function. + * @method CarbonInterface floorMillennium(float $precision = 1) Truncate the current instance millennium with given precision. + * @method CarbonInterface floorMillennia(float $precision = 1) Truncate the current instance millennium with given precision. + * @method CarbonInterface ceilMillennium(float $precision = 1) Ceil the current instance millennium with given precision. + * @method CarbonInterface ceilMillennia(float $precision = 1) Ceil the current instance millennium with given precision. + * @method CarbonInterface roundCentury(float $precision = 1, string $function = "round") Round the current instance century with given precision using the given function. + * @method CarbonInterface roundCenturies(float $precision = 1, string $function = "round") Round the current instance century with given precision using the given function. + * @method CarbonInterface floorCentury(float $precision = 1) Truncate the current instance century with given precision. + * @method CarbonInterface floorCenturies(float $precision = 1) Truncate the current instance century with given precision. + * @method CarbonInterface ceilCentury(float $precision = 1) Ceil the current instance century with given precision. + * @method CarbonInterface ceilCenturies(float $precision = 1) Ceil the current instance century with given precision. + * @method CarbonInterface roundDecade(float $precision = 1, string $function = "round") Round the current instance decade with given precision using the given function. + * @method CarbonInterface roundDecades(float $precision = 1, string $function = "round") Round the current instance decade with given precision using the given function. + * @method CarbonInterface floorDecade(float $precision = 1) Truncate the current instance decade with given precision. + * @method CarbonInterface floorDecades(float $precision = 1) Truncate the current instance decade with given precision. + * @method CarbonInterface ceilDecade(float $precision = 1) Ceil the current instance decade with given precision. + * @method CarbonInterface ceilDecades(float $precision = 1) Ceil the current instance decade with given precision. + * @method CarbonInterface roundQuarter(float $precision = 1, string $function = "round") Round the current instance quarter with given precision using the given function. + * @method CarbonInterface roundQuarters(float $precision = 1, string $function = "round") Round the current instance quarter with given precision using the given function. + * @method CarbonInterface floorQuarter(float $precision = 1) Truncate the current instance quarter with given precision. + * @method CarbonInterface floorQuarters(float $precision = 1) Truncate the current instance quarter with given precision. + * @method CarbonInterface ceilQuarter(float $precision = 1) Ceil the current instance quarter with given precision. + * @method CarbonInterface ceilQuarters(float $precision = 1) Ceil the current instance quarter with given precision. + * @method CarbonInterface roundMillisecond(float $precision = 1, string $function = "round") Round the current instance millisecond with given precision using the given function. + * @method CarbonInterface roundMilliseconds(float $precision = 1, string $function = "round") Round the current instance millisecond with given precision using the given function. + * @method CarbonInterface floorMillisecond(float $precision = 1) Truncate the current instance millisecond with given precision. + * @method CarbonInterface floorMilliseconds(float $precision = 1) Truncate the current instance millisecond with given precision. + * @method CarbonInterface ceilMillisecond(float $precision = 1) Ceil the current instance millisecond with given precision. + * @method CarbonInterface ceilMilliseconds(float $precision = 1) Ceil the current instance millisecond with given precision. + * @method CarbonInterface roundMicrosecond(float $precision = 1, string $function = "round") Round the current instance microsecond with given precision using the given function. + * @method CarbonInterface roundMicroseconds(float $precision = 1, string $function = "round") Round the current instance microsecond with given precision using the given function. + * @method CarbonInterface floorMicrosecond(float $precision = 1) Truncate the current instance microsecond with given precision. + * @method CarbonInterface floorMicroseconds(float $precision = 1) Truncate the current instance microsecond with given precision. + * @method CarbonInterface ceilMicrosecond(float $precision = 1) Ceil the current instance microsecond with given precision. + * @method CarbonInterface ceilMicroseconds(float $precision = 1) Ceil the current instance microsecond with given precision. + * @method string shortAbsoluteDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'Absolute' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string longAbsoluteDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'Absolute' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string shortRelativeDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'Relative' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string longRelativeDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'Relative' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string shortRelativeToNowDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'RelativeToNow' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string longRelativeToNowDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'RelativeToNow' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string shortRelativeToOtherDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'RelativeToOther' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string longRelativeToOtherDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'RelativeToOther' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method int centuriesInMillennium() Return the number of centuries contained in the current millennium + * @method int|static centuryOfMillennium(?int $century = null) Return the value of the century starting from the beginning of the current millennium when called with no parameters, change the current century when called with an integer value + * @method int|static dayOfCentury(?int $day = null) Return the value of the day starting from the beginning of the current century when called with no parameters, change the current day when called with an integer value + * @method int|static dayOfDecade(?int $day = null) Return the value of the day starting from the beginning of the current decade when called with no parameters, change the current day when called with an integer value + * @method int|static dayOfMillennium(?int $day = null) Return the value of the day starting from the beginning of the current millennium when called with no parameters, change the current day when called with an integer value + * @method int|static dayOfMonth(?int $day = null) Return the value of the day starting from the beginning of the current month when called with no parameters, change the current day when called with an integer value + * @method int|static dayOfQuarter(?int $day = null) Return the value of the day starting from the beginning of the current quarter when called with no parameters, change the current day when called with an integer value + * @method int|static dayOfWeek(?int $day = null) Return the value of the day starting from the beginning of the current week when called with no parameters, change the current day when called with an integer value + * @method int daysInCentury() Return the number of days contained in the current century + * @method int daysInDecade() Return the number of days contained in the current decade + * @method int daysInMillennium() Return the number of days contained in the current millennium + * @method int daysInMonth() Return the number of days contained in the current month + * @method int daysInQuarter() Return the number of days contained in the current quarter + * @method int daysInWeek() Return the number of days contained in the current week + * @method int daysInYear() Return the number of days contained in the current year + * @method int|static decadeOfCentury(?int $decade = null) Return the value of the decade starting from the beginning of the current century when called with no parameters, change the current decade when called with an integer value + * @method int|static decadeOfMillennium(?int $decade = null) Return the value of the decade starting from the beginning of the current millennium when called with no parameters, change the current decade when called with an integer value + * @method int decadesInCentury() Return the number of decades contained in the current century + * @method int decadesInMillennium() Return the number of decades contained in the current millennium + * @method int|static hourOfCentury(?int $hour = null) Return the value of the hour starting from the beginning of the current century when called with no parameters, change the current hour when called with an integer value + * @method int|static hourOfDay(?int $hour = null) Return the value of the hour starting from the beginning of the current day when called with no parameters, change the current hour when called with an integer value + * @method int|static hourOfDecade(?int $hour = null) Return the value of the hour starting from the beginning of the current decade when called with no parameters, change the current hour when called with an integer value + * @method int|static hourOfMillennium(?int $hour = null) Return the value of the hour starting from the beginning of the current millennium when called with no parameters, change the current hour when called with an integer value + * @method int|static hourOfMonth(?int $hour = null) Return the value of the hour starting from the beginning of the current month when called with no parameters, change the current hour when called with an integer value + * @method int|static hourOfQuarter(?int $hour = null) Return the value of the hour starting from the beginning of the current quarter when called with no parameters, change the current hour when called with an integer value + * @method int|static hourOfWeek(?int $hour = null) Return the value of the hour starting from the beginning of the current week when called with no parameters, change the current hour when called with an integer value + * @method int|static hourOfYear(?int $hour = null) Return the value of the hour starting from the beginning of the current year when called with no parameters, change the current hour when called with an integer value + * @method int hoursInCentury() Return the number of hours contained in the current century + * @method int hoursInDay() Return the number of hours contained in the current day + * @method int hoursInDecade() Return the number of hours contained in the current decade + * @method int hoursInMillennium() Return the number of hours contained in the current millennium + * @method int hoursInMonth() Return the number of hours contained in the current month + * @method int hoursInQuarter() Return the number of hours contained in the current quarter + * @method int hoursInWeek() Return the number of hours contained in the current week + * @method int hoursInYear() Return the number of hours contained in the current year + * @method int|static microsecondOfCentury(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current century when called with no parameters, change the current microsecond when called with an integer value + * @method int|static microsecondOfDay(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current day when called with no parameters, change the current microsecond when called with an integer value + * @method int|static microsecondOfDecade(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current decade when called with no parameters, change the current microsecond when called with an integer value + * @method int|static microsecondOfHour(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current hour when called with no parameters, change the current microsecond when called with an integer value + * @method int|static microsecondOfMillennium(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current millennium when called with no parameters, change the current microsecond when called with an integer value + * @method int|static microsecondOfMillisecond(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current millisecond when called with no parameters, change the current microsecond when called with an integer value + * @method int|static microsecondOfMinute(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current minute when called with no parameters, change the current microsecond when called with an integer value + * @method int|static microsecondOfMonth(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current month when called with no parameters, change the current microsecond when called with an integer value + * @method int|static microsecondOfQuarter(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current quarter when called with no parameters, change the current microsecond when called with an integer value + * @method int|static microsecondOfSecond(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current second when called with no parameters, change the current microsecond when called with an integer value + * @method int|static microsecondOfWeek(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current week when called with no parameters, change the current microsecond when called with an integer value + * @method int|static microsecondOfYear(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current year when called with no parameters, change the current microsecond when called with an integer value + * @method int microsecondsInCentury() Return the number of microseconds contained in the current century + * @method int microsecondsInDay() Return the number of microseconds contained in the current day + * @method int microsecondsInDecade() Return the number of microseconds contained in the current decade + * @method int microsecondsInHour() Return the number of microseconds contained in the current hour + * @method int microsecondsInMillennium() Return the number of microseconds contained in the current millennium + * @method int microsecondsInMillisecond() Return the number of microseconds contained in the current millisecond + * @method int microsecondsInMinute() Return the number of microseconds contained in the current minute + * @method int microsecondsInMonth() Return the number of microseconds contained in the current month + * @method int microsecondsInQuarter() Return the number of microseconds contained in the current quarter + * @method int microsecondsInSecond() Return the number of microseconds contained in the current second + * @method int microsecondsInWeek() Return the number of microseconds contained in the current week + * @method int microsecondsInYear() Return the number of microseconds contained in the current year + * @method int|static millisecondOfCentury(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current century when called with no parameters, change the current millisecond when called with an integer value + * @method int|static millisecondOfDay(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current day when called with no parameters, change the current millisecond when called with an integer value + * @method int|static millisecondOfDecade(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current decade when called with no parameters, change the current millisecond when called with an integer value + * @method int|static millisecondOfHour(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current hour when called with no parameters, change the current millisecond when called with an integer value + * @method int|static millisecondOfMillennium(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current millennium when called with no parameters, change the current millisecond when called with an integer value + * @method int|static millisecondOfMinute(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current minute when called with no parameters, change the current millisecond when called with an integer value + * @method int|static millisecondOfMonth(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current month when called with no parameters, change the current millisecond when called with an integer value + * @method int|static millisecondOfQuarter(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current quarter when called with no parameters, change the current millisecond when called with an integer value + * @method int|static millisecondOfSecond(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current second when called with no parameters, change the current millisecond when called with an integer value + * @method int|static millisecondOfWeek(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current week when called with no parameters, change the current millisecond when called with an integer value + * @method int|static millisecondOfYear(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current year when called with no parameters, change the current millisecond when called with an integer value + * @method int millisecondsInCentury() Return the number of milliseconds contained in the current century + * @method int millisecondsInDay() Return the number of milliseconds contained in the current day + * @method int millisecondsInDecade() Return the number of milliseconds contained in the current decade + * @method int millisecondsInHour() Return the number of milliseconds contained in the current hour + * @method int millisecondsInMillennium() Return the number of milliseconds contained in the current millennium + * @method int millisecondsInMinute() Return the number of milliseconds contained in the current minute + * @method int millisecondsInMonth() Return the number of milliseconds contained in the current month + * @method int millisecondsInQuarter() Return the number of milliseconds contained in the current quarter + * @method int millisecondsInSecond() Return the number of milliseconds contained in the current second + * @method int millisecondsInWeek() Return the number of milliseconds contained in the current week + * @method int millisecondsInYear() Return the number of milliseconds contained in the current year + * @method int|static minuteOfCentury(?int $minute = null) Return the value of the minute starting from the beginning of the current century when called with no parameters, change the current minute when called with an integer value + * @method int|static minuteOfDay(?int $minute = null) Return the value of the minute starting from the beginning of the current day when called with no parameters, change the current minute when called with an integer value + * @method int|static minuteOfDecade(?int $minute = null) Return the value of the minute starting from the beginning of the current decade when called with no parameters, change the current minute when called with an integer value + * @method int|static minuteOfHour(?int $minute = null) Return the value of the minute starting from the beginning of the current hour when called with no parameters, change the current minute when called with an integer value + * @method int|static minuteOfMillennium(?int $minute = null) Return the value of the minute starting from the beginning of the current millennium when called with no parameters, change the current minute when called with an integer value + * @method int|static minuteOfMonth(?int $minute = null) Return the value of the minute starting from the beginning of the current month when called with no parameters, change the current minute when called with an integer value + * @method int|static minuteOfQuarter(?int $minute = null) Return the value of the minute starting from the beginning of the current quarter when called with no parameters, change the current minute when called with an integer value + * @method int|static minuteOfWeek(?int $minute = null) Return the value of the minute starting from the beginning of the current week when called with no parameters, change the current minute when called with an integer value + * @method int|static minuteOfYear(?int $minute = null) Return the value of the minute starting from the beginning of the current year when called with no parameters, change the current minute when called with an integer value + * @method int minutesInCentury() Return the number of minutes contained in the current century + * @method int minutesInDay() Return the number of minutes contained in the current day + * @method int minutesInDecade() Return the number of minutes contained in the current decade + * @method int minutesInHour() Return the number of minutes contained in the current hour + * @method int minutesInMillennium() Return the number of minutes contained in the current millennium + * @method int minutesInMonth() Return the number of minutes contained in the current month + * @method int minutesInQuarter() Return the number of minutes contained in the current quarter + * @method int minutesInWeek() Return the number of minutes contained in the current week + * @method int minutesInYear() Return the number of minutes contained in the current year + * @method int|static monthOfCentury(?int $month = null) Return the value of the month starting from the beginning of the current century when called with no parameters, change the current month when called with an integer value + * @method int|static monthOfDecade(?int $month = null) Return the value of the month starting from the beginning of the current decade when called with no parameters, change the current month when called with an integer value + * @method int|static monthOfMillennium(?int $month = null) Return the value of the month starting from the beginning of the current millennium when called with no parameters, change the current month when called with an integer value + * @method int|static monthOfQuarter(?int $month = null) Return the value of the month starting from the beginning of the current quarter when called with no parameters, change the current month when called with an integer value + * @method int|static monthOfYear(?int $month = null) Return the value of the month starting from the beginning of the current year when called with no parameters, change the current month when called with an integer value + * @method int monthsInCentury() Return the number of months contained in the current century + * @method int monthsInDecade() Return the number of months contained in the current decade + * @method int monthsInMillennium() Return the number of months contained in the current millennium + * @method int monthsInQuarter() Return the number of months contained in the current quarter + * @method int monthsInYear() Return the number of months contained in the current year + * @method int|static quarterOfCentury(?int $quarter = null) Return the value of the quarter starting from the beginning of the current century when called with no parameters, change the current quarter when called with an integer value + * @method int|static quarterOfDecade(?int $quarter = null) Return the value of the quarter starting from the beginning of the current decade when called with no parameters, change the current quarter when called with an integer value + * @method int|static quarterOfMillennium(?int $quarter = null) Return the value of the quarter starting from the beginning of the current millennium when called with no parameters, change the current quarter when called with an integer value + * @method int|static quarterOfYear(?int $quarter = null) Return the value of the quarter starting from the beginning of the current year when called with no parameters, change the current quarter when called with an integer value + * @method int quartersInCentury() Return the number of quarters contained in the current century + * @method int quartersInDecade() Return the number of quarters contained in the current decade + * @method int quartersInMillennium() Return the number of quarters contained in the current millennium + * @method int quartersInYear() Return the number of quarters contained in the current year + * @method int|static secondOfCentury(?int $second = null) Return the value of the second starting from the beginning of the current century when called with no parameters, change the current second when called with an integer value + * @method int|static secondOfDay(?int $second = null) Return the value of the second starting from the beginning of the current day when called with no parameters, change the current second when called with an integer value + * @method int|static secondOfDecade(?int $second = null) Return the value of the second starting from the beginning of the current decade when called with no parameters, change the current second when called with an integer value + * @method int|static secondOfHour(?int $second = null) Return the value of the second starting from the beginning of the current hour when called with no parameters, change the current second when called with an integer value + * @method int|static secondOfMillennium(?int $second = null) Return the value of the second starting from the beginning of the current millennium when called with no parameters, change the current second when called with an integer value + * @method int|static secondOfMinute(?int $second = null) Return the value of the second starting from the beginning of the current minute when called with no parameters, change the current second when called with an integer value + * @method int|static secondOfMonth(?int $second = null) Return the value of the second starting from the beginning of the current month when called with no parameters, change the current second when called with an integer value + * @method int|static secondOfQuarter(?int $second = null) Return the value of the second starting from the beginning of the current quarter when called with no parameters, change the current second when called with an integer value + * @method int|static secondOfWeek(?int $second = null) Return the value of the second starting from the beginning of the current week when called with no parameters, change the current second when called with an integer value + * @method int|static secondOfYear(?int $second = null) Return the value of the second starting from the beginning of the current year when called with no parameters, change the current second when called with an integer value + * @method int secondsInCentury() Return the number of seconds contained in the current century + * @method int secondsInDay() Return the number of seconds contained in the current day + * @method int secondsInDecade() Return the number of seconds contained in the current decade + * @method int secondsInHour() Return the number of seconds contained in the current hour + * @method int secondsInMillennium() Return the number of seconds contained in the current millennium + * @method int secondsInMinute() Return the number of seconds contained in the current minute + * @method int secondsInMonth() Return the number of seconds contained in the current month + * @method int secondsInQuarter() Return the number of seconds contained in the current quarter + * @method int secondsInWeek() Return the number of seconds contained in the current week + * @method int secondsInYear() Return the number of seconds contained in the current year + * @method int|static weekOfCentury(?int $week = null) Return the value of the week starting from the beginning of the current century when called with no parameters, change the current week when called with an integer value + * @method int|static weekOfDecade(?int $week = null) Return the value of the week starting from the beginning of the current decade when called with no parameters, change the current week when called with an integer value + * @method int|static weekOfMillennium(?int $week = null) Return the value of the week starting from the beginning of the current millennium when called with no parameters, change the current week when called with an integer value + * @method int|static weekOfMonth(?int $week = null) Return the value of the week starting from the beginning of the current month when called with no parameters, change the current week when called with an integer value + * @method int|static weekOfQuarter(?int $week = null) Return the value of the week starting from the beginning of the current quarter when called with no parameters, change the current week when called with an integer value + * @method int|static weekOfYear(?int $week = null) Return the value of the week starting from the beginning of the current year when called with no parameters, change the current week when called with an integer value + * @method int weeksInCentury() Return the number of weeks contained in the current century + * @method int weeksInDecade() Return the number of weeks contained in the current decade + * @method int weeksInMillennium() Return the number of weeks contained in the current millennium + * @method int weeksInMonth() Return the number of weeks contained in the current month + * @method int weeksInQuarter() Return the number of weeks contained in the current quarter + * @method int|static yearOfCentury(?int $year = null) Return the value of the year starting from the beginning of the current century when called with no parameters, change the current year when called with an integer value + * @method int|static yearOfDecade(?int $year = null) Return the value of the year starting from the beginning of the current decade when called with no parameters, change the current year when called with an integer value + * @method int|static yearOfMillennium(?int $year = null) Return the value of the year starting from the beginning of the current millennium when called with no parameters, change the current year when called with an integer value + * @method int yearsInCentury() Return the number of years contained in the current century + * @method int yearsInDecade() Return the number of years contained in the current decade + * @method int yearsInMillennium() Return the number of years contained in the current millennium + * @method static plus(int $years = 0, int $months = 0, int|float $weeks = 0, int|float $days = 0, int|float $hours = 0, int|float $minutes = 0, int|float $seconds = 0, int|float $microseconds = 0, OverflowMode|bool|null $overflow = null, ?int $anchorDay = null) Add given amount of time to the current date. + * @method static minus(int $years = 0, int $months = 0, int|float $weeks = 0, int|float $days = 0, int|float $hours = 0, int|float $minutes = 0, int|float $seconds = 0, int|float $microseconds = 0, OverflowMode|bool|null $overflow = null, ?int $anchorDay = null) Subtract given amount of time to the current date. * * * @@ -958,12 +960,13 @@ interface CarbonInterface extends DateTimeInterface, JsonSerializable, DiffOptio * * @param Unit|int|string|DateInterval|Closure|CarbonConverterInterface $unit * @param Unit|int|float|string $value - * @param bool|null $overflow + * @param OverflowMode|bool|null $overflow + * @param int|null $anchorDay * * @return static */ #[ReturnTypeWillChange] - public function add($unit, $value = 1, ?bool $overflow = null): static; + public function add($unit, $value = 1, OverflowMode|bool|null $overflow = null, ?int $anchorDay = null): static; /** * @deprecated Prefer to use add addUTCUnit() which more accurately defines what it's doing. @@ -992,16 +995,17 @@ interface CarbonInterface extends DateTimeInterface, JsonSerializable, DiffOptio /** * Add given units to the current instance. */ - public function addUnit(Unit|string $unit, $value = 1, ?bool $overflow = null): static; + public function addUnit(Unit|string $unit, $value = 1, OverflowMode|bool|null $overflow = null, ?int $anchorDay = null): static; /** * Add any unit to a new value without overflowing current other unit given. * - * @param string $valueUnit unit name to modify - * @param int $value amount to add to the input unit - * @param string $overflowUnit unit name to not overflow + * @param Unit|string $valueUnit unit name to modify + * @param int $value amount to add to the input unit + * @param Unit|string $overflowUnit unit name to not overflow + * @param ?int $anchorDay set day to this value after modification */ - public function addUnitNoOverflow(string $valueUnit, int $value, string $overflowUnit): static; + public function addUnitNoOverflow(Unit|string $valueUnit, int $value, Unit|string $overflowUnit, ?int $anchorDay = null): static; /** * Get the difference in a human readable format in the current locale from an other @@ -1426,15 +1430,9 @@ interface CarbonInterface extends DateTimeInterface, JsonSerializable, DiffOptio /** * Get/set the day of year. * - * @template T of int|null - * * @param int|null $value new value for day of year if using as setter. * - * @psalm-param T $value - * - * @return static|int - * - * @psalm-return (T is int ? static : int) + * @return ($value is null ? int : static) */ public function dayOfYear(?int $value = null): static|int; @@ -2073,7 +2071,7 @@ interface CarbonInterface extends DateTimeInterface, JsonSerializable, DiffOptio * * @return array */ - public static function getAvailableLocales(); + public static function getAvailableLocales(): array; /** * Returns list of Language object for each available locale. This object allow you to get the ISO name, native @@ -2081,7 +2079,7 @@ interface CarbonInterface extends DateTimeInterface, JsonSerializable, DiffOptio * * @return Language[] */ - public static function getAvailableLocalesInfo(); + public static function getAvailableLocalesInfo(): array; /** * Returns list of calendar formats for ISO formatting. @@ -3077,6 +3075,8 @@ interface CarbonInterface extends DateTimeInterface, JsonSerializable, DiffOptio * Get/set the ISO weekday from 1 (Monday) to 7 (Sunday). * * @param WeekDay|int|null $value new value for weekday if using as setter. + * + * @return ($value is null ? int : static) */ public function isoWeekday(WeekDay|int|null $value = null): static|int; @@ -3163,7 +3163,7 @@ interface CarbonInterface extends DateTimeInterface, JsonSerializable, DiffOptio * @param string|null $locale * @param string ...$fallbackLocales * - * @return $this|string + * @return ($locale is null ? string : static) */ public function locale(?string $locale = null, string ...$fallbackLocales): static|string; @@ -3670,14 +3670,20 @@ interface CarbonInterface extends DateTimeInterface, JsonSerializable, DiffOptio public static function serializeUsing(callable|string|null $format): void; /** - * Set a part of the Carbon object. + * Set one or multiple components of the Carbon object. * * @throws ImmutableException|UnknownSetterException * - * @return $this + * @return static */ public function set(Unit|array|string $name, DateTimeZone|Month|string|int|float|null $value = null): static; + /** + * Set current day of the instance to the passed value if it exits in the + * current month, else set current day to the last day of the month. + */ + public function setAnchorDay(int $anchorDay): static; + /** * Set the date with gregorian year, month and day numbers. * @@ -3765,16 +3771,13 @@ interface CarbonInterface extends DateTimeInterface, JsonSerializable, DiffOptio /** * Set a Carbon instance (real or mock) to be returned when a "now" - * instance is created. The provided instance will be returned + * instance is created. The provided instance will be returned * specifically under the following conditions: * - A call to the static now() method, ex. Carbon::now() * - When a null (or blank string) is passed to the constructor or parse(), ex. new Carbon(null) * - When the string "now" is passed to the constructor or parse(), ex. new Carbon('now') * - When a string containing the desired time is passed to Carbon::parse(). * - * Note the timezone parameter was left out of the examples above and - * has no affect as the mock value will be returned regardless of its value. - * * Only the moment is mocked with setTestNow(), the timezone will still be the one passed * as parameter of date_default_timezone_get() as a fallback (see setTestNowAndTimezone()). * @@ -3789,7 +3792,7 @@ interface CarbonInterface extends DateTimeInterface, JsonSerializable, DiffOptio /** * Set a Carbon instance (real or mock) to be returned when a "now" - * instance is created. The provided instance will be returned + * instance is created. The provided instance will be returned * specifically under the following conditions: * - A call to the static now() method, ex. Carbon::now() * - When a null (or blank string) is passed to the constructor or parse(), ex. new Carbon(null) @@ -3863,19 +3866,25 @@ interface CarbonInterface extends DateTimeInterface, JsonSerializable, DiffOptio /** * Set specified unit to new given value. * - * @param string $unit year, month, day, hour, minute, second or microsecond - * @param Month|int $value new value for given unit + * @param string $unit year, month, day, hour, minute, second or microsecond + * @param Month|int|float|null $value new value for given unit + * @param OverflowMode|bool|null $overflow either overflow (when the day does not exist in current month) + * is allowed or not, or should use an anchor day + * @param ?int $anchorDay the day to which to go after setting year/quarter/month, + * if given but it does not exist in current month, it will + * go to the last day of the month */ - public function setUnit(string $unit, Month|int|float|null $value = null): static; + public function setUnit(string $unit, Month|int|float|null $value = null, OverflowMode|bool|null $overflow = null, ?int $anchorDay = null): static; /** * Set any unit to a new value without overflowing current other unit given. * - * @param string $valueUnit unit name to modify - * @param int $value new value for the input unit - * @param string $overflowUnit unit name to not overflow + * @param Unit|string $valueUnit unit name to modify + * @param int $value new value for the input unit + * @param Unit|string $overflowUnit unit name to not overflow + * @param ?int $anchorDay set day to this value after modification */ - public function setUnitNoOverflow(string $valueUnit, int $value, string $overflowUnit): static; + public function setUnitNoOverflow(Unit|string $valueUnit, int $value, Unit|string $overflowUnit, ?int $anchorDay = null): static; /** * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. @@ -4120,12 +4129,13 @@ interface CarbonInterface extends DateTimeInterface, JsonSerializable, DiffOptio * * @param Unit|int|string|DateInterval|Closure|CarbonConverterInterface $unit * @param Unit|int|float|string $value - * @param bool|null $overflow + * @param OverflowMode|bool|null $overflow + * @param int|null $anchorDay * * @return static */ #[ReturnTypeWillChange] - public function sub($unit, $value = 1, ?bool $overflow = null): static; + public function sub($unit, $value = 1, OverflowMode|bool|null $overflow = null, ?int $anchorDay = null): static; /** * @deprecated Prefer to use add subUTCUnit() which more accurately defines what it's doing. @@ -4154,16 +4164,17 @@ interface CarbonInterface extends DateTimeInterface, JsonSerializable, DiffOptio /** * Subtract given units to the current instance. */ - public function subUnit(Unit|string $unit, $value = 1, ?bool $overflow = null): static; + public function subUnit(Unit|string $unit, $value = 1, OverflowMode|bool|null $overflow = null, ?int $anchorDay = null): static; /** * Subtract any unit to a new value without overflowing current other unit given. * - * @param string $valueUnit unit name to modify - * @param int $value amount to subtract to the input unit - * @param string $overflowUnit unit name to not overflow + * @param Unit|string $valueUnit unit name to modify + * @param int $value amount to subtract to the input unit + * @param Unit|string $overflowUnit unit name to not overflow + * @param ?int $anchorDay set day to this value after modification */ - public function subUnitNoOverflow(string $valueUnit, int $value, string $overflowUnit): static; + public function subUnitNoOverflow(Unit|string $valueUnit, int $value, Unit|string $overflowUnit, ?int $anchorDay = null): static; /** * Subtract given units or interval to the current instance. @@ -4172,11 +4183,12 @@ interface CarbonInterface extends DateTimeInterface, JsonSerializable, DiffOptio * * @param Unit|int|string|DateInterval $unit * @param Unit|int|float|string $value - * @param bool|null $overflow + * @param OverflowMode|bool|null $overflow + * @param int|null $anchorDay * * @return static */ - public function subtract($unit, $value = 1, ?bool $overflow = null): static; + public function subtract($unit, $value = 1, OverflowMode|bool|null $overflow = null, ?int $anchorDay = null): static; /** * Get the difference in a human-readable format in the current locale from current instance to another @@ -4387,11 +4399,9 @@ interface CarbonInterface extends DateTimeInterface, JsonSerializable, DiffOptio public function toISOString(bool $keepOffset = false): ?string; /** - * Return a immutable copy of the instance. - * - * @return CarbonImmutable + * Return an immutable copy of the instance. */ - public function toImmutable(); + public function toImmutable(): CarbonImmutable; /** * Format the instance as ISO8601 @@ -4425,10 +4435,8 @@ interface CarbonInterface extends DateTimeInterface, JsonSerializable, DiffOptio /** * Return a mutable copy of the instance. - * - * @return Carbon */ - public function toMutable(); + public function toMutable(): Carbon; /** * Get the difference in a human readable format in the current locale from an other @@ -4768,6 +4776,8 @@ interface CarbonInterface extends DateTimeInterface, JsonSerializable, DiffOptio /** * Returns the minutes offset to UTC if no arguments passed, else set the timezone with given minutes shift passed. + * + * @return ($minuteOffset is null ? int : static) */ public function utcOffset(?int $minuteOffset = null): static|int; @@ -4808,6 +4818,8 @@ interface CarbonInterface extends DateTimeInterface, JsonSerializable, DiffOptio * Get/set the weekday from 0 (Sunday) to 6 (Saturday). * * @param WeekDay|int|null $value new value for weekday if using as setter. + * + * @return ($value is null ? int : static) */ public function weekday(WeekDay|int|null $value = null): static|int; diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/CarbonInterval.php b/plugins/vendor/nesbot/carbon/src/Carbon/CarbonInterval.php index de11832d..7a43fdbf 100644 --- a/plugins/vendor/nesbot/carbon/src/Carbon/CarbonInterval.php +++ b/plugins/vendor/nesbot/carbon/src/Carbon/CarbonInterval.php @@ -437,6 +437,7 @@ class CarbonInterval extends DateInterval implements CarbonConverterInterface, U $spec = $years; $isStringSpec = (\is_string($spec) && !preg_match('/^[\d.]/', $spec)); + $inverted = false; if (!$isStringSpec || (float) $years) { $spec = static::PERIOD_PREFIX; @@ -463,8 +464,17 @@ class CarbonInterval extends DateInterval implements CarbonConverterInterface, U } } + if ($isStringSpec && str_starts_with($spec, '-')) { + $inverted = true; + $spec = substr($spec, 1); + } + try { parent::__construct($spec); + + if ($inverted) { + $this->invert = 1; + } } catch (Throwable $exception) { try { parent::__construct('PT0S'); @@ -548,8 +558,17 @@ class CarbonInterval extends DateInterval implements CarbonConverterInterface, U } foreach (['years', 'months', 'weeks', 'days', 'hours', 'minutes', 'seconds'] as $unit) { - if ($$unit < 0) { - $this->set($unit, $$unit); + $value = $$unit; + + if ( + ( + \is_int($value) + || \is_float($value) + || (\is_string($value) && preg_match('/^[\d.-]+$/', $value)) + ) + && $value < 0 + ) { + $this->set($unit, $value); } } } @@ -763,6 +782,42 @@ class CarbonInterval extends DateInterval implements CarbonConverterInterface, U return $instance; } + public static function monthWithAnchorDay(int $day): static + { + return new static(function (CarbonInterface $date, bool $negated) use ($day) { + $next = $date->day(1)->addMonths($negated ? -1 : 1); + + return $next->day(min($day, $next->daysInMonth)); + }); + } + + public static function monthNoOverflow(): static + { + return new static(static function (CarbonInterface $date, bool $negated) { + return $negated + ? $date->subMonthNoOverflow() + : $date->addMonthNoOverflow(); + }); + } + + public static function yearWithAnchorDay(int $day): static + { + return new static(function (CarbonInterface $date, bool $negated) use ($day) { + $next = $date->day(1)->addYears($negated ? -1 : 1); + + return $next->day(min($day, $next->daysInMonth)); + }); + } + + public static function yearNoOverflow(): static + { + return new static(static function (CarbonInterface $date, bool $negated) { + return $negated + ? $date->subYearNoOverflow() + : $date->addYearNoOverflow(); + }); + } + /** * Return the original source used to create the current interval. * @@ -1117,8 +1172,8 @@ class CarbonInterval extends DateInterval implements CarbonConverterInterface, U */ public static function diff($start, $end = null, bool $absolute = false, array $skip = []): static { - $start = $start instanceof CarbonInterface ? $start : Carbon::make($start); - $end = $end instanceof CarbonInterface ? $end : Carbon::make($end); + $start = self::carbonOrMake($start); + $end = self::carbonOrMake($end); $rawInterval = $start->diffAsDateInterval($end, $absolute); $interval = static::instance($rawInterval, $skip); @@ -2159,6 +2214,14 @@ class CarbonInterval extends DateInterval implements CarbonConverterInterface, U $class = ($params[0] ?? null) instanceof DateTime ? CarbonPeriod::class : CarbonPeriodImmutable::class; + if ($this->step) { + $dates = array_filter($params, static fn (mixed $param) => $param instanceof DateTimeInterface); + + if (\count($dates) >= 2 && $dates[0] > $dates[1]) { + $this->invert(); + } + } + return $class::create($this, ...$params); } @@ -2225,13 +2288,15 @@ class CarbonInterval extends DateInterval implements CarbonConverterInterface, U /** * Add the passed interval to the current instance. * - * @param string|DateInterval $unit - * @param int|float $value + * @param Unit|string|DateInterval $unit + * @param int|float $value * * @return $this */ public function add($unit, $value = 1): static { + $this->checkNoStepIsDefined(__METHOD__); + if (is_numeric($unit)) { [$value, $unit] = [$unit, $value]; } @@ -2268,13 +2333,15 @@ class CarbonInterval extends DateInterval implements CarbonConverterInterface, U /** * Subtract the passed interval to the current instance. * - * @param string|DateInterval $unit - * @param int|float $value + * @param Unit|string|DateInterval $unit + * @param int|float $value * * @return $this */ public function sub($unit, $value = 1): static { + $this->checkNoStepIsDefined(__METHOD__); + if (is_numeric($unit)) { [$value, $unit] = [$unit, $value]; } @@ -2326,7 +2393,7 @@ class CarbonInterval extends DateInterval implements CarbonConverterInterface, U } /** - * Add given parameters to the current interval. + * Subtract given parameters to the current interval. * * @param int $years * @param int $months @@ -2372,6 +2439,8 @@ class CarbonInterval extends DateInterval implements CarbonConverterInterface, U */ public function times($factor): static { + $this->checkNoStepIsDefined(__METHOD__); + if ($factor < 0) { $this->invert = $this->invert ? 0 : 1; $factor = -$factor; @@ -2434,6 +2503,8 @@ class CarbonInterval extends DateInterval implements CarbonConverterInterface, U */ public function multiply($factor): static { + $this->checkNoStepIsDefined(__METHOD__); + if ($factor < 0) { $this->invert = $this->invert ? 0 : 1; $factor = -$factor; @@ -2472,38 +2543,46 @@ class CarbonInterval extends DateInterval implements CarbonConverterInterface, U * * @return string */ - public static function getDateIntervalSpec(DateInterval $interval, bool $microseconds = false, array $skip = []): string - { + public static function getDateIntervalSpec( + DateInterval $interval, + bool $microseconds = false, + array $skip = [], + bool $withNegatives = false, + ): string { $date = array_filter([ - static::PERIOD_YEARS => abs($interval->y), - static::PERIOD_MONTHS => abs($interval->m), - static::PERIOD_DAYS => abs($interval->d), + static::PERIOD_YEARS => $withNegatives ? $interval->y : abs($interval->y), + static::PERIOD_MONTHS => $withNegatives ? $interval->m : abs($interval->m), + static::PERIOD_DAYS => $withNegatives ? $interval->d : abs($interval->d), ]); $skip = array_map([Unit::class, 'toNameIfUnit'], $skip); + $days = abs((int) $interval->days); if ( - $interval->days >= CarbonInterface::DAYS_PER_WEEK * CarbonInterface::WEEKS_PER_MONTH && + $days >= CarbonInterface::DAYS_PER_WEEK * CarbonInterface::WEEKS_PER_MONTH && (!isset($date[static::PERIOD_YEARS]) || \count(array_intersect(['y', 'year', 'years'], $skip))) && (!isset($date[static::PERIOD_MONTHS]) || \count(array_intersect(['m', 'month', 'months'], $skip))) ) { $date = [ - static::PERIOD_DAYS => abs($interval->days), + static::PERIOD_DAYS => $withNegatives ? $interval->days : $days, ]; } - $seconds = abs($interval->s); - if ($microseconds && $interval->f > 0) { - $seconds = \sprintf('%d.%06d', $seconds, abs($interval->f) * 1000000); + $seconds = $withNegatives ? $interval->s : abs($interval->s); + + if ($microseconds && $interval->f !== 0.0) { + $seconds = $withNegatives + ? number_format($seconds + $interval->f, 6, '.', '') + : \sprintf('%d.%06d', $seconds, abs($interval->f) * 1000000); } $time = array_filter([ - static::PERIOD_HOURS => abs($interval->h), - static::PERIOD_MINUTES => abs($interval->i), + static::PERIOD_HOURS => $withNegatives ? $interval->h : abs($interval->h), + static::PERIOD_MINUTES => $withNegatives ? $interval->i : abs($interval->i), static::PERIOD_SECONDS => $seconds, ]); - $specString = static::PERIOD_PREFIX; + $specString = ($withNegatives && $interval->invert ? '-' : '').static::PERIOD_PREFIX; foreach ($date as $key => $value) { $specString .= $value.$key; @@ -2511,6 +2590,7 @@ class CarbonInterval extends DateInterval implements CarbonConverterInterface, U if (\count($time) > 0) { $specString .= static::PERIOD_TIME_PREFIX; + foreach ($time as $key => $value) { $specString .= $value.$key; } @@ -2524,9 +2604,9 @@ class CarbonInterval extends DateInterval implements CarbonConverterInterface, U * * @return string */ - public function spec(bool $microseconds = false): string + public function spec(bool $microseconds = false, bool $withNegatives = false): string { - return static::getDateIntervalSpec($this, $microseconds); + return static::getDateIntervalSpec($this, $microseconds, [], $withNegatives); } /** @@ -2981,6 +3061,12 @@ class CarbonInterval extends DateInterval implements CarbonConverterInterface, U )->invert($inverted)->cascade()); } + $initiallyInverted = (bool) $this->invert; + + if ($initiallyInverted) { + $this->invert(); + } + $base = CarbonImmutable::parse('2000-01-01 00:00:00', 'UTC') ->roundUnit($unit, $precision, $function); $next = $base->add($this); @@ -2996,7 +3082,7 @@ class CarbonInterval extends DateInterval implements CarbonConverterInterface, U ->diff($base), ); - return $this->invert($inverted); + return $this->invert($initiallyInverted xor $inverted); } /** @@ -3514,6 +3600,13 @@ class CarbonInterval extends DateInterval implements CarbonConverterInterface, U } } + private static function carbonOrMake(mixed $dateTime): CarbonInterface + { + return $dateTime instanceof CarbonInterface + ? $dateTime + : Carbon::make($dateTime); + } + private static function incrementUnit(DateInterval $instance, string $unit, int $value): void { if ($value === 0) { diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/CarbonPeriod.php b/plugins/vendor/nesbot/carbon/src/Carbon/CarbonPeriod.php index 932d8274..52e24d96 100644 --- a/plugins/vendor/nesbot/carbon/src/Carbon/CarbonPeriod.php +++ b/plugins/vendor/nesbot/carbon/src/Carbon/CarbonPeriod.php @@ -426,6 +426,96 @@ class CarbonPeriod extends DatePeriodBase implements Countable, JsonSerializable return self::createFromIso($iso, $options); } + public static function monthly( + DateTimeInterface|string|int|null $start = null, + DateTimeInterface|string|int|null $end = null, + ?int $recurrences = null, + ?int $anchorDay = null, + OverflowMode $mode = OverflowMode::AnchorDay, + ?int $options = null, + ): static { + if ($anchorDay !== null && $mode !== OverflowMode::AnchorDay) { + throw new InvalidArgumentException( + '$anchorDay parameter must not be set for $mode OverflowMode::'.$mode->name, + ); + } + + if ($end !== null && $recurrences !== null) { + throw new InvalidArgumentException( + 'You must specify $end or $recurrences but not both', + ); + } + + if (\is_int($start)) { + $start = CarbonImmutable::createFromTimestamp($start); + } elseif (\is_string($start)) { + $start = CarbonImmutable::parse($start); + } + + $start ??= CarbonImmutable::now(); + + if (\is_int($end)) { + $end = CarbonImmutable::createFromTimestamp($end); + } + + return (new static( + $start, + match ($mode) { + OverflowMode::AnchorDay => CarbonInterval::monthWithAnchorDay( + $anchorDay ?? $start->day, + ), + OverflowMode::NoOverflow => CarbonInterval::monthNoOverflow(), + OverflowMode::Overflow => CarbonInterval::month(), + }, + $end ?? $recurrences, + ))->setOptions($options ?? self::IMMUTABLE); + } + + public static function yearly( + DateTimeInterface|string|int|null $start = null, + DateTimeInterface|string|int|null $end = null, + ?int $recurrences = null, + ?int $anchorDay = null, + OverflowMode $mode = OverflowMode::AnchorDay, + ?int $options = null, + ): static { + if ($anchorDay !== null && $mode !== OverflowMode::AnchorDay) { + throw new InvalidArgumentException( + '$anchorDay parameter must not be set for $mode OverflowMode::'.$mode->name, + ); + } + + if ($end !== null && $recurrences !== null) { + throw new InvalidArgumentException( + 'You must specify $end or $recurrences but not both', + ); + } + + if (\is_int($start)) { + $start = CarbonImmutable::createFromTimestamp($start); + } elseif (\is_string($start)) { + $start = CarbonImmutable::parse($start); + } + + $start ??= CarbonImmutable::now(); + + if (\is_int($end)) { + $end = CarbonImmutable::createFromTimestamp($end); + } + + return (new static( + $start, + match ($mode) { + OverflowMode::AnchorDay => CarbonInterval::yearWithAnchorDay( + $anchorDay ?? $start->day, + ), + OverflowMode::NoOverflow => CarbonInterval::yearNoOverflow(), + OverflowMode::Overflow => CarbonInterval::month(), + }, + $end ?? $recurrences, + ))->setOptions($options ?? self::IMMUTABLE); + } + /** * Return whether the given interval contains non-zero value of any time unit. */ @@ -695,20 +785,6 @@ class CarbonPeriod extends DatePeriodBase implements Countable, JsonSerializable } } - if ($raw === null && isset($sortedArguments['start'])) { - $end = $sortedArguments['end'] ?? max(1, $sortedArguments['recurrences'] ?? 1); - - if (\is_float($end)) { - $end = $end === INF ? PHP_INT_MAX : (int) round($end); - } - - $raw = [ - $sortedArguments['start'], - $sortedArguments['interval'] ?? CarbonInterval::day(), - $end, - ]; - } - $this->setFromAssociativeArray($sortedArguments); if ($this->startDate === null) { @@ -1250,13 +1326,7 @@ class CarbonPeriod extends DatePeriodBase implements Countable, JsonSerializable $self = $this->copyIfImmutable(); $self->carbonRecurrences = $recurrences === INF ? INF : (int) $recurrences; - if (!$self->hasFilter(static::RECURRENCES_FILTER)) { - return $self->addFilter(static::RECURRENCES_FILTER); - } - - $self->handleChangedParameters(); - - return $self; + return self::addFilterOrHandleChangedParameters($self, static::RECURRENCES_FILTER); } /** @@ -1282,6 +1352,8 @@ class CarbonPeriod extends DatePeriodBase implements Countable, JsonSerializable $self = $self->toggleOptions(static::EXCLUDE_START_DATE, !$inclusive); } + $self->syncNativePeriod(); + return $self; } @@ -1301,22 +1373,38 @@ class CarbonPeriod extends DatePeriodBase implements Countable, JsonSerializable throw new InvalidPeriodDateException('Invalid end date.'); } - if (!$date) { - return $this->removeFilter(static::END_DATE_FILTER); - } + // ::make() is responsible for converting strings to DateTimeInterface objects + \assert(!\is_string($date)); $self = $this->copyIfImmutable(); + + if (!$date) { + $self = $self->removeFilter(static::END_DATE_FILTER); + $self->syncNativePeriod(); + + return $self; + } + + \assert($date instanceof DateTimeInterface); + $self->endDate = $date; + if ( + $self->startDate !== null + && $self->dateInterval !== null + && !$self->dateInterval->invert + && $self->startDate > $self->endDate + ) { + $self->dateInterval->invert = 1; + } + if ($inclusive !== null) { $self = $self->toggleOptions(static::EXCLUDE_END_DATE, !$inclusive); } - if (!$self->hasFilter(static::END_DATE_FILTER)) { - return $self->addFilter(static::END_DATE_FILTER); - } + $self = self::addFilterOrHandleChangedParameters($self, static::END_DATE_FILTER); - $self->handleChangedParameters(); + $self->syncNativePeriod(); return $self; } @@ -2286,11 +2374,7 @@ class CarbonPeriod extends DatePeriodBase implements Countable, JsonSerializable 'options' => $this->setOptions(...), 'recurrences' => $this->setRecurrences(...), 'current' => function (mixed $current): void { - if (!($current instanceof CarbonInterface)) { - $current = $this->resolveCarbon($current); - } - - $this->carbonCurrent = $current; + $this->carbonCurrent = $this->carbonOrResolve($current); }, 'start' => 'startDate', 'interval' => $this->setDateInterval(...), @@ -2409,7 +2493,7 @@ class CarbonPeriod extends DatePeriodBase implements Countable, JsonSerializable return true; } - if ($this->dateInterval->invert ? $current > $this->endDate : $current < $this->endDate) { + if ($this->dateInterval->invert ? ($current > $this->endDate) : ($current < $this->endDate)) { return true; } @@ -2440,6 +2524,28 @@ class CarbonPeriod extends DatePeriodBase implements Countable, JsonSerializable $this->validationResult = null; } + /** + * Synchronize the native DatePeriod properties with the current state. + */ + protected function syncNativePeriod(): void + { + if (\PHP_VERSION_ID < 80200) { + return; // @codeCoverageIgnore + } + + // Default interval if not set (matches __construct logic) + $interval = $this->dateInterval ?? \Carbon\CarbonInterval::day(); + + // Reinitialize the parent DatePeriod to update $start, $end, etc. + // This mirrors the logic in __construct and initializeSerialization. + parent::__construct( + $this->startDate, + $interval, + $this->endDate ?? max(1, min(2147483639, $this->recurrences ?? 1)), + $this->options ?? 0, + ); + } + /** * Validate current date and stop iteration when necessary. * @@ -2510,7 +2616,10 @@ class CarbonPeriod extends DatePeriodBase implements Countable, JsonSerializable $attempts = 0; do { - $this->carbonCurrent = $this->carbonCurrent->add($this->dateInterval); + $this->carbonCurrent = $this->carbonCurrent->add( + $this->dateInterval, + $this->dateInterval->getStep() && $this->dateInterval->invert ? -1 : 1, + ); $this->validationResult = null; @@ -2563,6 +2672,13 @@ class CarbonPeriod extends DatePeriodBase implements Countable, JsonSerializable : static::create($period, ...$arguments); } + private function carbonOrResolve(mixed $dateTime): CarbonInterface + { + return $dateTime instanceof CarbonInterface + ? $dateTime + : $this->resolveCarbon($dateTime); + } + private function orderCouple($first, $second): array { return $first > $second ? [$second, $first] : [$first, $second]; @@ -2715,4 +2831,17 @@ class CarbonPeriod extends DatePeriodBase implements Countable, JsonSerializable ); // @codeCoverageIgnoreEnd } + + private static function addFilterOrHandleChangedParameters( + self $period, + array|callable|string $filter, + ): self { + if (!$period->hasFilter($filter)) { + return $period->addFilter($filter); + } + + $period->handleChangedParameters(); + + return $period; + } } diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/ImmutableException.php b/plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/ImmutableException.php index e8550a52..cc9c79cd 100644 --- a/plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/ImmutableException.php +++ b/plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/ImmutableException.php @@ -16,33 +16,40 @@ namespace Carbon\Exceptions; use RuntimeException as BaseRuntimeException; use Throwable; +/** + * @final + */ class ImmutableException extends BaseRuntimeException implements RuntimeException { - /** - * The value. - * - * @var string - */ - protected $value; + protected string $value; /** * Constructor. * - * @param string $value the immutable type/value + * @param string $value the immutable message * @param int $code * @param Throwable|null $previous + * + * @deprecated Use ImmutableException::fromClass() or ImmutableException::fromMethod() to construct an + * ImmutableException instance. */ - public function __construct($value, $code = 0, ?Throwable $previous = null) + public function __construct($message, int $code = 0, ?Throwable $previous = null, ?string $value = null) { - $this->value = $value; - parent::__construct("$value is immutable.", $code, $previous); + $this->value ??= $value ?? $message; + + parent::__construct($message, $code, $previous); + } + + public static function fromClass(string $class, int $code = 0, ?Throwable $previous = null): self + { + return new self("$class class is immutable.", $code, $previous, "$class class"); + } + + public static function fromMethod(string $class, string $method, int $code = 0, ?Throwable $previous = null): self + { + return new self("$method not allowed on $class.", $code, $previous, "$class::$method method"); } - /** - * Get the value. - * - * @return string - */ public function getValue(): string { return $this->value; diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Factory.php b/plugins/vendor/nesbot/carbon/src/Carbon/Factory.php index 5d516c74..b6058ee6 100644 --- a/plugins/vendor/nesbot/carbon/src/Carbon/Factory.php +++ b/plugins/vendor/nesbot/carbon/src/Carbon/Factory.php @@ -14,6 +14,7 @@ declare(strict_types=1); namespace Carbon; use Closure; +use DateTime; use DateTimeImmutable; use DateTimeInterface; use DateTimeZone; @@ -70,7 +71,7 @@ use Throwable; * the types of objects that can be built, for instance: * @method array getAvailableLocales() Returns the list of internally available locales and already loaded custom locales. * (It will ignore custom translator dynamic loading.) - * @method Language[] getAvailableLocalesInfo() Returns list of Language object for each available locale. This object allow you to get the ISO name, native + * @method array getAvailableLocalesInfo() Returns list of Language object for each available locale. This object allow you to get the ISO name, native * name, region and variant of the locale. * @method array getDays() Get the days of the week. * @method ?string getFallbackLocale() Get the fallback locale. @@ -553,16 +554,13 @@ class Factory /** * Set a Carbon instance (real or mock) to be returned when a "now" - * instance is created. The provided instance will be returned + * instance is created. The provided instance will be returned * specifically under the following conditions: * - A call to the static now() method, ex. Carbon::now() * - When a null (or blank string) is passed to the constructor or parse(), ex. new Carbon(null) * - When the string "now" is passed to the constructor or parse(), ex. new Carbon('now') * - When a string containing the desired time is passed to Carbon::parse(). * - * Note the timezone parameter was left out of the examples above and - * has no affect as the mock value will be returned regardless of its value. - * * Only the moment is mocked with setTestNow(), the timezone will still be the one passed * as parameter of date_default_timezone_get() as a fallback (see setTestNowAndTimezone()). * @@ -576,14 +574,14 @@ class Factory public function setTestNow(mixed $testNow = null): void { $this->useTimezoneFromTestNow = false; - $this->testNow = $testNow instanceof self || $testNow instanceof Closure + $this->testNow = $testNow instanceof Closure ? $testNow : $this->make($testNow); } /** * Set a Carbon instance (real or mock) to be returned when a "now" - * instance is created. The provided instance will be returned + * instance is created. The provided instance will be returned * specifically under the following conditions: * - A call to the static now() method, ex. Carbon::now() * - When a null (or blank string) is passed to the constructor or parse(), ex. new Carbon(null) @@ -696,11 +694,21 @@ class Factory } if (!($testNow instanceof CarbonInterface)) { - $timezone ??= $this->useTimezoneFromTestNow ? $testNow->getTimezone() : null; + $timezone ??= $this->useTimezoneFromTestNow + ? $testNow->getTimezone() + : new CarbonTimeZone(date_default_timezone_get()); $testNow = $this->__call('instance', [$testNow, $timezone]); } } + if ($testNow !== null && $timezone === null) { + if ($testNow instanceof DateTime) { + $testNow = clone $testNow; + } + + $testNow = $testNow->setTimezone(date_default_timezone_get()); + } + return $testNow; } diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/FactoryImmutable.php b/plugins/vendor/nesbot/carbon/src/Carbon/FactoryImmutable.php index f2a354f7..5ce833cd 100644 --- a/plugins/vendor/nesbot/carbon/src/Carbon/FactoryImmutable.php +++ b/plugins/vendor/nesbot/carbon/src/Carbon/FactoryImmutable.php @@ -67,7 +67,7 @@ use Symfony\Contracts\Translation\TranslatorInterface; * the types of objects that can be built, for instance: * @method array getAvailableLocales() Returns the list of internally available locales and already loaded custom locales. * (It will ignore custom translator dynamic loading.) - * @method Language[] getAvailableLocalesInfo() Returns list of Language object for each available locale. This object allow you to get the ISO name, native + * @method array getAvailableLocalesInfo() Returns list of Language object for each available locale. This object allow you to get the ISO name, native * name, region and variant of the locale. * @method array getDays() Get the days of the week. * @method ?string getFallbackLocale() Get the fallback locale. diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/OverflowMode.php b/plugins/vendor/nesbot/carbon/src/Carbon/OverflowMode.php new file mode 100644 index 00000000..5157d77c --- /dev/null +++ b/plugins/vendor/nesbot/carbon/src/Carbon/OverflowMode.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon; + +enum OverflowMode +{ + case AnchorDay; + case NoOverflow; + case Overflow; +} diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Traits/Date.php b/plugins/vendor/nesbot/carbon/src/Carbon/Traits/Date.php index 817ca5ef..13d2925f 100644 --- a/plugins/vendor/nesbot/carbon/src/Carbon/Traits/Date.php +++ b/plugins/vendor/nesbot/carbon/src/Carbon/Traits/Date.php @@ -28,6 +28,7 @@ use Carbon\Exceptions\UnknownSetterException; use Carbon\Exceptions\UnknownUnitException; use Carbon\FactoryImmutable; use Carbon\Month; +use Carbon\OverflowMode; use Carbon\Translator; use Carbon\Unit; use Carbon\WeekDay; @@ -49,10 +50,10 @@ use Throwable; * * * - * @property string $localeDayOfWeek the day of week in current locale - * @property string $shortLocaleDayOfWeek the abbreviated day of week in current locale - * @property string $localeMonth the month in current locale - * @property string $shortLocaleMonth the abbreviated month in current locale + * @property string $localeDayOfWeek the day of week in current locale + * @property string $shortLocaleDayOfWeek the abbreviated day of week in current locale + * @property string $localeMonth the month in current locale + * @property string $shortLocaleMonth the abbreviated month in current locale * @property int $year * @property int $yearIso * @property int $month @@ -62,801 +63,803 @@ use Throwable; * @property int $second * @property int $micro * @property int $microsecond - * @property int $dayOfWeekIso 1 (for Monday) through 7 (for Sunday) - * @property int|float|string $timestamp seconds since the Unix Epoch - * @property string $englishDayOfWeek the day of week in English - * @property string $shortEnglishDayOfWeek the abbreviated day of week in English - * @property string $englishMonth the month in English - * @property string $shortEnglishMonth the abbreviated month in English + * @property int $dayOfWeekIso 1 (for Monday) through 7 (for Sunday) + * @property int|float|string $timestamp seconds since the Unix Epoch + * @property string $englishDayOfWeek the day of week in English + * @property string $shortEnglishDayOfWeek the abbreviated day of week in English + * @property string $englishMonth the month in English + * @property string $shortEnglishMonth the abbreviated month in English * @property int $milliseconds * @property int $millisecond * @property int $milli - * @property int $week 1 through 53 - * @property int $isoWeek 1 through 53 - * @property int $weekYear year according to week format - * @property int $isoWeekYear year according to ISO week format - * @property int $age does a diffInYears() with default parameters - * @property int $offset the timezone offset in seconds from UTC - * @property int $offsetMinutes the timezone offset in minutes from UTC - * @property int $offsetHours the timezone offset in hours from UTC - * @property CarbonTimeZone $timezone the current timezone - * @property CarbonTimeZone $tz alias of $timezone - * @property int $centuryOfMillennium The value of the century starting from the beginning of the current millennium - * @property int $dayOfCentury The value of the day starting from the beginning of the current century - * @property int $dayOfDecade The value of the day starting from the beginning of the current decade - * @property int $dayOfMillennium The value of the day starting from the beginning of the current millennium - * @property int $dayOfMonth The value of the day starting from the beginning of the current month - * @property int $dayOfQuarter The value of the day starting from the beginning of the current quarter - * @property int $dayOfWeek 0 (for Sunday) through 6 (for Saturday) - * @property int $dayOfYear 1 through 366 - * @property int $decadeOfCentury The value of the decade starting from the beginning of the current century - * @property int $decadeOfMillennium The value of the decade starting from the beginning of the current millennium - * @property int $hourOfCentury The value of the hour starting from the beginning of the current century - * @property int $hourOfDay The value of the hour starting from the beginning of the current day - * @property int $hourOfDecade The value of the hour starting from the beginning of the current decade - * @property int $hourOfMillennium The value of the hour starting from the beginning of the current millennium - * @property int $hourOfMonth The value of the hour starting from the beginning of the current month - * @property int $hourOfQuarter The value of the hour starting from the beginning of the current quarter - * @property int $hourOfWeek The value of the hour starting from the beginning of the current week - * @property int $hourOfYear The value of the hour starting from the beginning of the current year - * @property int $microsecondOfCentury The value of the microsecond starting from the beginning of the current century - * @property int $microsecondOfDay The value of the microsecond starting from the beginning of the current day - * @property int $microsecondOfDecade The value of the microsecond starting from the beginning of the current decade - * @property int $microsecondOfHour The value of the microsecond starting from the beginning of the current hour - * @property int $microsecondOfMillennium The value of the microsecond starting from the beginning of the current millennium - * @property int $microsecondOfMillisecond The value of the microsecond starting from the beginning of the current millisecond - * @property int $microsecondOfMinute The value of the microsecond starting from the beginning of the current minute - * @property int $microsecondOfMonth The value of the microsecond starting from the beginning of the current month - * @property int $microsecondOfQuarter The value of the microsecond starting from the beginning of the current quarter - * @property int $microsecondOfSecond The value of the microsecond starting from the beginning of the current second - * @property int $microsecondOfWeek The value of the microsecond starting from the beginning of the current week - * @property int $microsecondOfYear The value of the microsecond starting from the beginning of the current year - * @property int $millisecondOfCentury The value of the millisecond starting from the beginning of the current century - * @property int $millisecondOfDay The value of the millisecond starting from the beginning of the current day - * @property int $millisecondOfDecade The value of the millisecond starting from the beginning of the current decade - * @property int $millisecondOfHour The value of the millisecond starting from the beginning of the current hour - * @property int $millisecondOfMillennium The value of the millisecond starting from the beginning of the current millennium - * @property int $millisecondOfMinute The value of the millisecond starting from the beginning of the current minute - * @property int $millisecondOfMonth The value of the millisecond starting from the beginning of the current month - * @property int $millisecondOfQuarter The value of the millisecond starting from the beginning of the current quarter - * @property int $millisecondOfSecond The value of the millisecond starting from the beginning of the current second - * @property int $millisecondOfWeek The value of the millisecond starting from the beginning of the current week - * @property int $millisecondOfYear The value of the millisecond starting from the beginning of the current year - * @property int $minuteOfCentury The value of the minute starting from the beginning of the current century - * @property int $minuteOfDay The value of the minute starting from the beginning of the current day - * @property int $minuteOfDecade The value of the minute starting from the beginning of the current decade - * @property int $minuteOfHour The value of the minute starting from the beginning of the current hour - * @property int $minuteOfMillennium The value of the minute starting from the beginning of the current millennium - * @property int $minuteOfMonth The value of the minute starting from the beginning of the current month - * @property int $minuteOfQuarter The value of the minute starting from the beginning of the current quarter - * @property int $minuteOfWeek The value of the minute starting from the beginning of the current week - * @property int $minuteOfYear The value of the minute starting from the beginning of the current year - * @property int $monthOfCentury The value of the month starting from the beginning of the current century - * @property int $monthOfDecade The value of the month starting from the beginning of the current decade - * @property int $monthOfMillennium The value of the month starting from the beginning of the current millennium - * @property int $monthOfQuarter The value of the month starting from the beginning of the current quarter - * @property int $monthOfYear The value of the month starting from the beginning of the current year - * @property int $quarterOfCentury The value of the quarter starting from the beginning of the current century - * @property int $quarterOfDecade The value of the quarter starting from the beginning of the current decade - * @property int $quarterOfMillennium The value of the quarter starting from the beginning of the current millennium - * @property int $quarterOfYear The value of the quarter starting from the beginning of the current year - * @property int $secondOfCentury The value of the second starting from the beginning of the current century - * @property int $secondOfDay The value of the second starting from the beginning of the current day - * @property int $secondOfDecade The value of the second starting from the beginning of the current decade - * @property int $secondOfHour The value of the second starting from the beginning of the current hour - * @property int $secondOfMillennium The value of the second starting from the beginning of the current millennium - * @property int $secondOfMinute The value of the second starting from the beginning of the current minute - * @property int $secondOfMonth The value of the second starting from the beginning of the current month - * @property int $secondOfQuarter The value of the second starting from the beginning of the current quarter - * @property int $secondOfWeek The value of the second starting from the beginning of the current week - * @property int $secondOfYear The value of the second starting from the beginning of the current year - * @property int $weekOfCentury The value of the week starting from the beginning of the current century - * @property int $weekOfDecade The value of the week starting from the beginning of the current decade - * @property int $weekOfMillennium The value of the week starting from the beginning of the current millennium - * @property int $weekOfMonth 1 through 5 - * @property int $weekOfQuarter The value of the week starting from the beginning of the current quarter - * @property int $weekOfYear ISO-8601 week number of year, weeks starting on Monday - * @property int $yearOfCentury The value of the year starting from the beginning of the current century - * @property int $yearOfDecade The value of the year starting from the beginning of the current decade - * @property int $yearOfMillennium The value of the year starting from the beginning of the current millennium - * @property-read string $latinMeridiem "am"/"pm" (Ante meridiem or Post meridiem latin lowercase mark) - * @property-read string $latinUpperMeridiem "AM"/"PM" (Ante meridiem or Post meridiem latin uppercase mark) - * @property-read string $timezoneAbbreviatedName the current timezone abbreviated name - * @property-read string $tzAbbrName alias of $timezoneAbbreviatedName - * @property-read string $dayName long name of weekday translated according to Carbon locale, in english if no translation available for current language - * @property-read string $shortDayName short name of weekday translated according to Carbon locale, in english if no translation available for current language - * @property-read string $minDayName very short name of weekday translated according to Carbon locale, in english if no translation available for current language - * @property-read string $monthName long name of month translated according to Carbon locale, in english if no translation available for current language - * @property-read string $shortMonthName short name of month translated according to Carbon locale, in english if no translation available for current language - * @property-read string $meridiem lowercase meridiem mark translated according to Carbon locale, in latin if no translation available for current language - * @property-read string $upperMeridiem uppercase meridiem mark translated according to Carbon locale, in latin if no translation available for current language - * @property-read int $noZeroHour current hour from 1 to 24 - * @property-read int $isoWeeksInYear 51 through 53 - * @property-read int $weekNumberInMonth 1 through 5 - * @property-read int $firstWeekDay 0 through 6 - * @property-read int $lastWeekDay 0 through 6 - * @property-read int $quarter the quarter of this instance, 1 - 4 - * @property-read int $decade the decade of this instance - * @property-read int $century the century of this instance - * @property-read int $millennium the millennium of this instance - * @property-read bool $dst daylight savings time indicator, true if DST, false otherwise - * @property-read bool $local checks if the timezone is local, true if local, false otherwise - * @property-read bool $utc checks if the timezone is UTC, true if UTC, false otherwise - * @property-read string $timezoneName the current timezone name - * @property-read string $tzName alias of $timezoneName - * @property-read string $locale locale of the current instance - * @property-read int $centuriesInMillennium The number of centuries contained in the current millennium - * @property-read int $daysInCentury The number of days contained in the current century - * @property-read int $daysInDecade The number of days contained in the current decade - * @property-read int $daysInMillennium The number of days contained in the current millennium - * @property-read int $daysInMonth number of days in the given month - * @property-read int $daysInQuarter The number of days contained in the current quarter - * @property-read int $daysInWeek The number of days contained in the current week - * @property-read int $daysInYear 365 or 366 - * @property-read int $decadesInCentury The number of decades contained in the current century - * @property-read int $decadesInMillennium The number of decades contained in the current millennium - * @property-read int $hoursInCentury The number of hours contained in the current century - * @property-read int $hoursInDay The number of hours contained in the current day - * @property-read int $hoursInDecade The number of hours contained in the current decade - * @property-read int $hoursInMillennium The number of hours contained in the current millennium - * @property-read int $hoursInMonth The number of hours contained in the current month - * @property-read int $hoursInQuarter The number of hours contained in the current quarter - * @property-read int $hoursInWeek The number of hours contained in the current week - * @property-read int $hoursInYear The number of hours contained in the current year - * @property-read int $microsecondsInCentury The number of microseconds contained in the current century - * @property-read int $microsecondsInDay The number of microseconds contained in the current day - * @property-read int $microsecondsInDecade The number of microseconds contained in the current decade - * @property-read int $microsecondsInHour The number of microseconds contained in the current hour - * @property-read int $microsecondsInMillennium The number of microseconds contained in the current millennium - * @property-read int $microsecondsInMillisecond The number of microseconds contained in the current millisecond - * @property-read int $microsecondsInMinute The number of microseconds contained in the current minute - * @property-read int $microsecondsInMonth The number of microseconds contained in the current month - * @property-read int $microsecondsInQuarter The number of microseconds contained in the current quarter - * @property-read int $microsecondsInSecond The number of microseconds contained in the current second - * @property-read int $microsecondsInWeek The number of microseconds contained in the current week - * @property-read int $microsecondsInYear The number of microseconds contained in the current year - * @property-read int $millisecondsInCentury The number of milliseconds contained in the current century - * @property-read int $millisecondsInDay The number of milliseconds contained in the current day - * @property-read int $millisecondsInDecade The number of milliseconds contained in the current decade - * @property-read int $millisecondsInHour The number of milliseconds contained in the current hour - * @property-read int $millisecondsInMillennium The number of milliseconds contained in the current millennium - * @property-read int $millisecondsInMinute The number of milliseconds contained in the current minute - * @property-read int $millisecondsInMonth The number of milliseconds contained in the current month - * @property-read int $millisecondsInQuarter The number of milliseconds contained in the current quarter - * @property-read int $millisecondsInSecond The number of milliseconds contained in the current second - * @property-read int $millisecondsInWeek The number of milliseconds contained in the current week - * @property-read int $millisecondsInYear The number of milliseconds contained in the current year - * @property-read int $minutesInCentury The number of minutes contained in the current century - * @property-read int $minutesInDay The number of minutes contained in the current day - * @property-read int $minutesInDecade The number of minutes contained in the current decade - * @property-read int $minutesInHour The number of minutes contained in the current hour - * @property-read int $minutesInMillennium The number of minutes contained in the current millennium - * @property-read int $minutesInMonth The number of minutes contained in the current month - * @property-read int $minutesInQuarter The number of minutes contained in the current quarter - * @property-read int $minutesInWeek The number of minutes contained in the current week - * @property-read int $minutesInYear The number of minutes contained in the current year - * @property-read int $monthsInCentury The number of months contained in the current century - * @property-read int $monthsInDecade The number of months contained in the current decade - * @property-read int $monthsInMillennium The number of months contained in the current millennium - * @property-read int $monthsInQuarter The number of months contained in the current quarter - * @property-read int $monthsInYear The number of months contained in the current year - * @property-read int $quartersInCentury The number of quarters contained in the current century - * @property-read int $quartersInDecade The number of quarters contained in the current decade - * @property-read int $quartersInMillennium The number of quarters contained in the current millennium - * @property-read int $quartersInYear The number of quarters contained in the current year - * @property-read int $secondsInCentury The number of seconds contained in the current century - * @property-read int $secondsInDay The number of seconds contained in the current day - * @property-read int $secondsInDecade The number of seconds contained in the current decade - * @property-read int $secondsInHour The number of seconds contained in the current hour - * @property-read int $secondsInMillennium The number of seconds contained in the current millennium - * @property-read int $secondsInMinute The number of seconds contained in the current minute - * @property-read int $secondsInMonth The number of seconds contained in the current month - * @property-read int $secondsInQuarter The number of seconds contained in the current quarter - * @property-read int $secondsInWeek The number of seconds contained in the current week - * @property-read int $secondsInYear The number of seconds contained in the current year - * @property-read int $weeksInCentury The number of weeks contained in the current century - * @property-read int $weeksInDecade The number of weeks contained in the current decade - * @property-read int $weeksInMillennium The number of weeks contained in the current millennium - * @property-read int $weeksInMonth The number of weeks contained in the current month - * @property-read int $weeksInQuarter The number of weeks contained in the current quarter - * @property-read int $weeksInYear 51 through 53 - * @property-read int $yearsInCentury The number of years contained in the current century - * @property-read int $yearsInDecade The number of years contained in the current decade - * @property-read int $yearsInMillennium The number of years contained in the current millennium + * @property int $week 1 through 53 + * @property int $isoWeek 1 through 53 + * @property int $weekYear year according to week format + * @property int $isoWeekYear year according to ISO week format + * @property int $age does a diffInYears() with default parameters + * @property int $offset the timezone offset in seconds from UTC + * @property int $offsetMinutes the timezone offset in minutes from UTC + * @property int $offsetHours the timezone offset in hours from UTC + * @property CarbonTimeZone $timezone the current timezone + * @property CarbonTimeZone $tz alias of $timezone + * @property int $centuryOfMillennium The value of the century starting from the beginning of the current millennium + * @property int $dayOfCentury The value of the day starting from the beginning of the current century + * @property int $dayOfDecade The value of the day starting from the beginning of the current decade + * @property int $dayOfMillennium The value of the day starting from the beginning of the current millennium + * @property int $dayOfMonth The value of the day starting from the beginning of the current month + * @property int $dayOfQuarter The value of the day starting from the beginning of the current quarter + * @property int $dayOfWeek 0 (for Sunday) through 6 (for Saturday) + * @property int $dayOfYear 1 through 366 + * @property int $decadeOfCentury The value of the decade starting from the beginning of the current century + * @property int $decadeOfMillennium The value of the decade starting from the beginning of the current millennium + * @property int $hourOfCentury The value of the hour starting from the beginning of the current century + * @property int $hourOfDay The value of the hour starting from the beginning of the current day + * @property int $hourOfDecade The value of the hour starting from the beginning of the current decade + * @property int $hourOfMillennium The value of the hour starting from the beginning of the current millennium + * @property int $hourOfMonth The value of the hour starting from the beginning of the current month + * @property int $hourOfQuarter The value of the hour starting from the beginning of the current quarter + * @property int $hourOfWeek The value of the hour starting from the beginning of the current week + * @property int $hourOfYear The value of the hour starting from the beginning of the current year + * @property int $microsecondOfCentury The value of the microsecond starting from the beginning of the current century + * @property int $microsecondOfDay The value of the microsecond starting from the beginning of the current day + * @property int $microsecondOfDecade The value of the microsecond starting from the beginning of the current decade + * @property int $microsecondOfHour The value of the microsecond starting from the beginning of the current hour + * @property int $microsecondOfMillennium The value of the microsecond starting from the beginning of the current millennium + * @property int $microsecondOfMillisecond The value of the microsecond starting from the beginning of the current millisecond + * @property int $microsecondOfMinute The value of the microsecond starting from the beginning of the current minute + * @property int $microsecondOfMonth The value of the microsecond starting from the beginning of the current month + * @property int $microsecondOfQuarter The value of the microsecond starting from the beginning of the current quarter + * @property int $microsecondOfSecond The value of the microsecond starting from the beginning of the current second + * @property int $microsecondOfWeek The value of the microsecond starting from the beginning of the current week + * @property int $microsecondOfYear The value of the microsecond starting from the beginning of the current year + * @property int $millisecondOfCentury The value of the millisecond starting from the beginning of the current century + * @property int $millisecondOfDay The value of the millisecond starting from the beginning of the current day + * @property int $millisecondOfDecade The value of the millisecond starting from the beginning of the current decade + * @property int $millisecondOfHour The value of the millisecond starting from the beginning of the current hour + * @property int $millisecondOfMillennium The value of the millisecond starting from the beginning of the current millennium + * @property int $millisecondOfMinute The value of the millisecond starting from the beginning of the current minute + * @property int $millisecondOfMonth The value of the millisecond starting from the beginning of the current month + * @property int $millisecondOfQuarter The value of the millisecond starting from the beginning of the current quarter + * @property int $millisecondOfSecond The value of the millisecond starting from the beginning of the current second + * @property int $millisecondOfWeek The value of the millisecond starting from the beginning of the current week + * @property int $millisecondOfYear The value of the millisecond starting from the beginning of the current year + * @property int $minuteOfCentury The value of the minute starting from the beginning of the current century + * @property int $minuteOfDay The value of the minute starting from the beginning of the current day + * @property int $minuteOfDecade The value of the minute starting from the beginning of the current decade + * @property int $minuteOfHour The value of the minute starting from the beginning of the current hour + * @property int $minuteOfMillennium The value of the minute starting from the beginning of the current millennium + * @property int $minuteOfMonth The value of the minute starting from the beginning of the current month + * @property int $minuteOfQuarter The value of the minute starting from the beginning of the current quarter + * @property int $minuteOfWeek The value of the minute starting from the beginning of the current week + * @property int $minuteOfYear The value of the minute starting from the beginning of the current year + * @property int $monthOfCentury The value of the month starting from the beginning of the current century + * @property int $monthOfDecade The value of the month starting from the beginning of the current decade + * @property int $monthOfMillennium The value of the month starting from the beginning of the current millennium + * @property int $monthOfQuarter The value of the month starting from the beginning of the current quarter + * @property int $monthOfYear The value of the month starting from the beginning of the current year + * @property int $quarterOfCentury The value of the quarter starting from the beginning of the current century + * @property int $quarterOfDecade The value of the quarter starting from the beginning of the current decade + * @property int $quarterOfMillennium The value of the quarter starting from the beginning of the current millennium + * @property int $quarterOfYear The value of the quarter starting from the beginning of the current year + * @property int $secondOfCentury The value of the second starting from the beginning of the current century + * @property int $secondOfDay The value of the second starting from the beginning of the current day + * @property int $secondOfDecade The value of the second starting from the beginning of the current decade + * @property int $secondOfHour The value of the second starting from the beginning of the current hour + * @property int $secondOfMillennium The value of the second starting from the beginning of the current millennium + * @property int $secondOfMinute The value of the second starting from the beginning of the current minute + * @property int $secondOfMonth The value of the second starting from the beginning of the current month + * @property int $secondOfQuarter The value of the second starting from the beginning of the current quarter + * @property int $secondOfWeek The value of the second starting from the beginning of the current week + * @property int $secondOfYear The value of the second starting from the beginning of the current year + * @property int $weekOfCentury The value of the week starting from the beginning of the current century + * @property int $weekOfDecade The value of the week starting from the beginning of the current decade + * @property int $weekOfMillennium The value of the week starting from the beginning of the current millennium + * @property int $weekOfMonth 1 through 5 + * @property int $weekOfQuarter The value of the week starting from the beginning of the current quarter + * @property int $weekOfYear ISO-8601 week number of year, weeks starting on Monday + * @property int $yearOfCentury The value of the year starting from the beginning of the current century + * @property int $yearOfDecade The value of the year starting from the beginning of the current decade + * @property int $yearOfMillennium The value of the year starting from the beginning of the current millennium + * @property-read string $latinMeridiem "am"/"pm" (Ante meridiem or Post meridiem latin lowercase mark) + * @property-read string $latinUpperMeridiem "AM"/"PM" (Ante meridiem or Post meridiem latin uppercase mark) + * @property-read string $timezoneAbbreviatedName the current timezone abbreviated name + * @property-read string $tzAbbrName alias of $timezoneAbbreviatedName + * @property-read string $dayName long name of weekday translated according to Carbon locale, in english if no translation available for current language + * @property-read string $shortDayName short name of weekday translated according to Carbon locale, in english if no translation available for current language + * @property-read string $minDayName very short name of weekday translated according to Carbon locale, in english if no translation available for current language + * @property-read string $monthName long name of month translated according to Carbon locale, in english if no translation available for current language + * @property-read string $shortMonthName short name of month translated according to Carbon locale, in english if no translation available for current language + * @property-read string $meridiem lowercase meridiem mark translated according to Carbon locale, in latin if no translation available for current language + * @property-read string $upperMeridiem uppercase meridiem mark translated according to Carbon locale, in latin if no translation available for current language + * @property-read int $noZeroHour current hour from 1 to 24 + * @property-read int $isoWeeksInYear 51 through 53 + * @property-read int $weekNumberInMonth 1 through 5 + * @property-read int $firstWeekDay 0 through 6 + * @property-read int $lastWeekDay 0 through 6 + * @property-read int $quarter the quarter of this instance, 1 - 4 + * @property-read int $decade the decade of this instance + * @property-read int $century the century of this instance + * @property-read int $millennium the millennium of this instance + * @property-read bool $dst daylight savings time indicator, true if DST, false otherwise + * @property-read bool $local checks if the timezone is local, true if local, false otherwise + * @property-read bool $utc checks if the timezone is UTC, true if UTC, false otherwise + * @property-read string $timezoneName the current timezone name + * @property-read string $tzName alias of $timezoneName + * @property-read string $locale locale of the current instance + * @property-read int $centuriesInMillennium The number of centuries contained in the current millennium + * @property-read int $daysInCentury The number of days contained in the current century + * @property-read int $daysInDecade The number of days contained in the current decade + * @property-read int $daysInMillennium The number of days contained in the current millennium + * @property-read int $daysInMonth number of days in the given month + * @property-read int $daysInQuarter The number of days contained in the current quarter + * @property-read int $daysInWeek The number of days contained in the current week + * @property-read int $daysInYear 365 or 366 + * @property-read int $decadesInCentury The number of decades contained in the current century + * @property-read int $decadesInMillennium The number of decades contained in the current millennium + * @property-read int $hoursInCentury The number of hours contained in the current century + * @property-read int $hoursInDay The number of hours contained in the current day + * @property-read int $hoursInDecade The number of hours contained in the current decade + * @property-read int $hoursInMillennium The number of hours contained in the current millennium + * @property-read int $hoursInMonth The number of hours contained in the current month + * @property-read int $hoursInQuarter The number of hours contained in the current quarter + * @property-read int $hoursInWeek The number of hours contained in the current week + * @property-read int $hoursInYear The number of hours contained in the current year + * @property-read int $microsecondsInCentury The number of microseconds contained in the current century + * @property-read int $microsecondsInDay The number of microseconds contained in the current day + * @property-read int $microsecondsInDecade The number of microseconds contained in the current decade + * @property-read int $microsecondsInHour The number of microseconds contained in the current hour + * @property-read int $microsecondsInMillennium The number of microseconds contained in the current millennium + * @property-read int $microsecondsInMillisecond The number of microseconds contained in the current millisecond + * @property-read int $microsecondsInMinute The number of microseconds contained in the current minute + * @property-read int $microsecondsInMonth The number of microseconds contained in the current month + * @property-read int $microsecondsInQuarter The number of microseconds contained in the current quarter + * @property-read int $microsecondsInSecond The number of microseconds contained in the current second + * @property-read int $microsecondsInWeek The number of microseconds contained in the current week + * @property-read int $microsecondsInYear The number of microseconds contained in the current year + * @property-read int $millisecondsInCentury The number of milliseconds contained in the current century + * @property-read int $millisecondsInDay The number of milliseconds contained in the current day + * @property-read int $millisecondsInDecade The number of milliseconds contained in the current decade + * @property-read int $millisecondsInHour The number of milliseconds contained in the current hour + * @property-read int $millisecondsInMillennium The number of milliseconds contained in the current millennium + * @property-read int $millisecondsInMinute The number of milliseconds contained in the current minute + * @property-read int $millisecondsInMonth The number of milliseconds contained in the current month + * @property-read int $millisecondsInQuarter The number of milliseconds contained in the current quarter + * @property-read int $millisecondsInSecond The number of milliseconds contained in the current second + * @property-read int $millisecondsInWeek The number of milliseconds contained in the current week + * @property-read int $millisecondsInYear The number of milliseconds contained in the current year + * @property-read int $minutesInCentury The number of minutes contained in the current century + * @property-read int $minutesInDay The number of minutes contained in the current day + * @property-read int $minutesInDecade The number of minutes contained in the current decade + * @property-read int $minutesInHour The number of minutes contained in the current hour + * @property-read int $minutesInMillennium The number of minutes contained in the current millennium + * @property-read int $minutesInMonth The number of minutes contained in the current month + * @property-read int $minutesInQuarter The number of minutes contained in the current quarter + * @property-read int $minutesInWeek The number of minutes contained in the current week + * @property-read int $minutesInYear The number of minutes contained in the current year + * @property-read int $monthsInCentury The number of months contained in the current century + * @property-read int $monthsInDecade The number of months contained in the current decade + * @property-read int $monthsInMillennium The number of months contained in the current millennium + * @property-read int $monthsInQuarter The number of months contained in the current quarter + * @property-read int $monthsInYear The number of months contained in the current year + * @property-read int $quartersInCentury The number of quarters contained in the current century + * @property-read int $quartersInDecade The number of quarters contained in the current decade + * @property-read int $quartersInMillennium The number of quarters contained in the current millennium + * @property-read int $quartersInYear The number of quarters contained in the current year + * @property-read int $secondsInCentury The number of seconds contained in the current century + * @property-read int $secondsInDay The number of seconds contained in the current day + * @property-read int $secondsInDecade The number of seconds contained in the current decade + * @property-read int $secondsInHour The number of seconds contained in the current hour + * @property-read int $secondsInMillennium The number of seconds contained in the current millennium + * @property-read int $secondsInMinute The number of seconds contained in the current minute + * @property-read int $secondsInMonth The number of seconds contained in the current month + * @property-read int $secondsInQuarter The number of seconds contained in the current quarter + * @property-read int $secondsInWeek The number of seconds contained in the current week + * @property-read int $secondsInYear The number of seconds contained in the current year + * @property-read int $weeksInCentury The number of weeks contained in the current century + * @property-read int $weeksInDecade The number of weeks contained in the current decade + * @property-read int $weeksInMillennium The number of weeks contained in the current millennium + * @property-read int $weeksInMonth The number of weeks contained in the current month + * @property-read int $weeksInQuarter The number of weeks contained in the current quarter + * @property-read int $weeksInYear 51 through 53 + * @property-read int $yearsInCentury The number of years contained in the current century + * @property-read int $yearsInDecade The number of years contained in the current decade + * @property-read int $yearsInMillennium The number of years contained in the current millennium * - * @method bool isUtc() Check if the current instance has UTC timezone. (Both isUtc and isUTC cases are valid.) - * @method bool isLocal() Check if the current instance has non-UTC timezone. - * @method bool isValid() Check if the current instance is a valid date. - * @method bool isDST() Check if the current instance is in a daylight saving time. - * @method bool isSunday() Checks if the instance day is sunday. - * @method bool isMonday() Checks if the instance day is monday. - * @method bool isTuesday() Checks if the instance day is tuesday. - * @method bool isWednesday() Checks if the instance day is wednesday. - * @method bool isThursday() Checks if the instance day is thursday. - * @method bool isFriday() Checks if the instance day is friday. - * @method bool isSaturday() Checks if the instance day is saturday. - * @method bool isSameYear(DateTimeInterface|string $date) Checks if the given date is in the same year as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentYear() Checks if the instance is in the same year as the current moment. - * @method bool isNextYear() Checks if the instance is in the same year as the current moment next year. - * @method bool isLastYear() Checks if the instance is in the same year as the current moment last year. - * @method bool isCurrentMonth() Checks if the instance is in the same month as the current moment. - * @method bool isNextMonth() Checks if the instance is in the same month as the current moment next month. - * @method bool isLastMonth() Checks if the instance is in the same month as the current moment last month. - * @method bool isSameWeek(DateTimeInterface|string $date) Checks if the given date is in the same week as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentWeek() Checks if the instance is in the same week as the current moment. - * @method bool isNextWeek() Checks if the instance is in the same week as the current moment next week. - * @method bool isLastWeek() Checks if the instance is in the same week as the current moment last week. - * @method bool isSameDay(DateTimeInterface|string $date) Checks if the given date is in the same day as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentDay() Checks if the instance is in the same day as the current moment. - * @method bool isNextDay() Checks if the instance is in the same day as the current moment next day. - * @method bool isLastDay() Checks if the instance is in the same day as the current moment last day. - * @method bool isSameHour(DateTimeInterface|string $date) Checks if the given date is in the same hour as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentHour() Checks if the instance is in the same hour as the current moment. - * @method bool isNextHour() Checks if the instance is in the same hour as the current moment next hour. - * @method bool isLastHour() Checks if the instance is in the same hour as the current moment last hour. - * @method bool isSameMinute(DateTimeInterface|string $date) Checks if the given date is in the same minute as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMinute() Checks if the instance is in the same minute as the current moment. - * @method bool isNextMinute() Checks if the instance is in the same minute as the current moment next minute. - * @method bool isLastMinute() Checks if the instance is in the same minute as the current moment last minute. - * @method bool isSameSecond(DateTimeInterface|string $date) Checks if the given date is in the same second as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentSecond() Checks if the instance is in the same second as the current moment. - * @method bool isNextSecond() Checks if the instance is in the same second as the current moment next second. - * @method bool isLastSecond() Checks if the instance is in the same second as the current moment last second. - * @method bool isSameMilli(DateTimeInterface|string $date) Checks if the given date is in the same millisecond as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMilli() Checks if the instance is in the same millisecond as the current moment. - * @method bool isNextMilli() Checks if the instance is in the same millisecond as the current moment next millisecond. - * @method bool isLastMilli() Checks if the instance is in the same millisecond as the current moment last millisecond. - * @method bool isSameMillisecond(DateTimeInterface|string $date) Checks if the given date is in the same millisecond as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMillisecond() Checks if the instance is in the same millisecond as the current moment. - * @method bool isNextMillisecond() Checks if the instance is in the same millisecond as the current moment next millisecond. - * @method bool isLastMillisecond() Checks if the instance is in the same millisecond as the current moment last millisecond. - * @method bool isSameMicro(DateTimeInterface|string $date) Checks if the given date is in the same microsecond as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMicro() Checks if the instance is in the same microsecond as the current moment. - * @method bool isNextMicro() Checks if the instance is in the same microsecond as the current moment next microsecond. - * @method bool isLastMicro() Checks if the instance is in the same microsecond as the current moment last microsecond. - * @method bool isSameMicrosecond(DateTimeInterface|string $date) Checks if the given date is in the same microsecond as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMicrosecond() Checks if the instance is in the same microsecond as the current moment. - * @method bool isNextMicrosecond() Checks if the instance is in the same microsecond as the current moment next microsecond. - * @method bool isLastMicrosecond() Checks if the instance is in the same microsecond as the current moment last microsecond. - * @method bool isSameDecade(DateTimeInterface|string $date) Checks if the given date is in the same decade as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentDecade() Checks if the instance is in the same decade as the current moment. - * @method bool isNextDecade() Checks if the instance is in the same decade as the current moment next decade. - * @method bool isLastDecade() Checks if the instance is in the same decade as the current moment last decade. - * @method bool isSameCentury(DateTimeInterface|string $date) Checks if the given date is in the same century as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentCentury() Checks if the instance is in the same century as the current moment. - * @method bool isNextCentury() Checks if the instance is in the same century as the current moment next century. - * @method bool isLastCentury() Checks if the instance is in the same century as the current moment last century. - * @method bool isSameMillennium(DateTimeInterface|string $date) Checks if the given date is in the same millennium as the instance. If null passed, compare to now (with the same timezone). - * @method bool isCurrentMillennium() Checks if the instance is in the same millennium as the current moment. - * @method bool isNextMillennium() Checks if the instance is in the same millennium as the current moment next millennium. - * @method bool isLastMillennium() Checks if the instance is in the same millennium as the current moment last millennium. - * @method bool isCurrentQuarter() Checks if the instance is in the same quarter as the current moment. - * @method bool isNextQuarter() Checks if the instance is in the same quarter as the current moment next quarter. - * @method bool isLastQuarter() Checks if the instance is in the same quarter as the current moment last quarter. - * @method CarbonInterface years(int $value) Set current instance year to the given value. - * @method CarbonInterface year(int $value) Set current instance year to the given value. - * @method CarbonInterface setYears(int $value) Set current instance year to the given value. - * @method CarbonInterface setYear(int $value) Set current instance year to the given value. - * @method CarbonInterface months(Month|int $value) Set current instance month to the given value. - * @method CarbonInterface month(Month|int $value) Set current instance month to the given value. - * @method CarbonInterface setMonths(Month|int $value) Set current instance month to the given value. - * @method CarbonInterface setMonth(Month|int $value) Set current instance month to the given value. - * @method CarbonInterface days(int $value) Set current instance day to the given value. - * @method CarbonInterface day(int $value) Set current instance day to the given value. - * @method CarbonInterface setDays(int $value) Set current instance day to the given value. - * @method CarbonInterface setDay(int $value) Set current instance day to the given value. - * @method CarbonInterface hours(int $value) Set current instance hour to the given value. - * @method CarbonInterface hour(int $value) Set current instance hour to the given value. - * @method CarbonInterface setHours(int $value) Set current instance hour to the given value. - * @method CarbonInterface setHour(int $value) Set current instance hour to the given value. - * @method CarbonInterface minutes(int $value) Set current instance minute to the given value. - * @method CarbonInterface minute(int $value) Set current instance minute to the given value. - * @method CarbonInterface setMinutes(int $value) Set current instance minute to the given value. - * @method CarbonInterface setMinute(int $value) Set current instance minute to the given value. - * @method CarbonInterface seconds(int $value) Set current instance second to the given value. - * @method CarbonInterface second(int $value) Set current instance second to the given value. - * @method CarbonInterface setSeconds(int $value) Set current instance second to the given value. - * @method CarbonInterface setSecond(int $value) Set current instance second to the given value. - * @method CarbonInterface millis(int $value) Set current instance millisecond to the given value. - * @method CarbonInterface milli(int $value) Set current instance millisecond to the given value. - * @method CarbonInterface setMillis(int $value) Set current instance millisecond to the given value. - * @method CarbonInterface setMilli(int $value) Set current instance millisecond to the given value. - * @method CarbonInterface milliseconds(int $value) Set current instance millisecond to the given value. - * @method CarbonInterface millisecond(int $value) Set current instance millisecond to the given value. - * @method CarbonInterface setMilliseconds(int $value) Set current instance millisecond to the given value. - * @method CarbonInterface setMillisecond(int $value) Set current instance millisecond to the given value. - * @method CarbonInterface micros(int $value) Set current instance microsecond to the given value. - * @method CarbonInterface micro(int $value) Set current instance microsecond to the given value. - * @method CarbonInterface setMicros(int $value) Set current instance microsecond to the given value. - * @method CarbonInterface setMicro(int $value) Set current instance microsecond to the given value. - * @method CarbonInterface microseconds(int $value) Set current instance microsecond to the given value. - * @method CarbonInterface microsecond(int $value) Set current instance microsecond to the given value. - * @method CarbonInterface setMicroseconds(int $value) Set current instance microsecond to the given value. - * @method self setMicrosecond(int $value) Set current instance microsecond to the given value. - * @method CarbonInterface addYears(int|float $value = 1) Add years (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addYear() Add one year to the instance (using date interval). - * @method CarbonInterface subYears(int|float $value = 1) Sub years (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subYear() Sub one year to the instance (using date interval). - * @method CarbonInterface addYearsWithOverflow(int|float $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addYearWithOverflow() Add one year to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subYearsWithOverflow(int|float $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subYearWithOverflow() Sub one year to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addYearsWithoutOverflow(int|float $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addYearWithoutOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subYearsWithoutOverflow(int|float $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subYearWithoutOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addYearsWithNoOverflow(int|float $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addYearWithNoOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subYearsWithNoOverflow(int|float $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subYearWithNoOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addYearsNoOverflow(int|float $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addYearNoOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subYearsNoOverflow(int|float $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subYearNoOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMonths(int|float $value = 1) Add months (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addMonth() Add one month to the instance (using date interval). - * @method CarbonInterface subMonths(int|float $value = 1) Sub months (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subMonth() Sub one month to the instance (using date interval). - * @method CarbonInterface addMonthsWithOverflow(int|float $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addMonthWithOverflow() Add one month to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subMonthsWithOverflow(int|float $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subMonthWithOverflow() Sub one month to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addMonthsWithoutOverflow(int|float $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMonthWithoutOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMonthsWithoutOverflow(int|float $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMonthWithoutOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMonthsWithNoOverflow(int|float $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMonthWithNoOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMonthsWithNoOverflow(int|float $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMonthWithNoOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMonthsNoOverflow(int|float $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMonthNoOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMonthsNoOverflow(int|float $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMonthNoOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addDays(int|float $value = 1) Add days (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addDay() Add one day to the instance (using date interval). - * @method CarbonInterface subDays(int|float $value = 1) Sub days (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subDay() Sub one day to the instance (using date interval). - * @method CarbonInterface addHours(int|float $value = 1) Add hours (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addHour() Add one hour to the instance (using date interval). - * @method CarbonInterface subHours(int|float $value = 1) Sub hours (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subHour() Sub one hour to the instance (using date interval). - * @method CarbonInterface addMinutes(int|float $value = 1) Add minutes (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addMinute() Add one minute to the instance (using date interval). - * @method CarbonInterface subMinutes(int|float $value = 1) Sub minutes (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subMinute() Sub one minute to the instance (using date interval). - * @method CarbonInterface addSeconds(int|float $value = 1) Add seconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addSecond() Add one second to the instance (using date interval). - * @method CarbonInterface subSeconds(int|float $value = 1) Sub seconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subSecond() Sub one second to the instance (using date interval). - * @method CarbonInterface addMillis(int|float $value = 1) Add milliseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addMilli() Add one millisecond to the instance (using date interval). - * @method CarbonInterface subMillis(int|float $value = 1) Sub milliseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subMilli() Sub one millisecond to the instance (using date interval). - * @method CarbonInterface addMilliseconds(int|float $value = 1) Add milliseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addMillisecond() Add one millisecond to the instance (using date interval). - * @method CarbonInterface subMilliseconds(int|float $value = 1) Sub milliseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subMillisecond() Sub one millisecond to the instance (using date interval). - * @method CarbonInterface addMicros(int|float $value = 1) Add microseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addMicro() Add one microsecond to the instance (using date interval). - * @method CarbonInterface subMicros(int|float $value = 1) Sub microseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subMicro() Sub one microsecond to the instance (using date interval). - * @method CarbonInterface addMicroseconds(int|float $value = 1) Add microseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addMicrosecond() Add one microsecond to the instance (using date interval). - * @method CarbonInterface subMicroseconds(int|float $value = 1) Sub microseconds (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subMicrosecond() Sub one microsecond to the instance (using date interval). - * @method CarbonInterface addMillennia(int|float $value = 1) Add millennia (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addMillennium() Add one millennium to the instance (using date interval). - * @method CarbonInterface subMillennia(int|float $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subMillennium() Sub one millennium to the instance (using date interval). - * @method CarbonInterface addMillenniaWithOverflow(int|float $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addMillenniumWithOverflow() Add one millennium to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subMillenniaWithOverflow(int|float $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subMillenniumWithOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addMillenniaWithoutOverflow(int|float $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMillenniumWithoutOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMillenniaWithoutOverflow(int|float $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMillenniumWithoutOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMillenniaWithNoOverflow(int|float $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMillenniumWithNoOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMillenniaWithNoOverflow(int|float $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMillenniumWithNoOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMillenniaNoOverflow(int|float $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addMillenniumNoOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMillenniaNoOverflow(int|float $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subMillenniumNoOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addCenturies(int|float $value = 1) Add centuries (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addCentury() Add one century to the instance (using date interval). - * @method CarbonInterface subCenturies(int|float $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subCentury() Sub one century to the instance (using date interval). - * @method CarbonInterface addCenturiesWithOverflow(int|float $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addCenturyWithOverflow() Add one century to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subCenturiesWithOverflow(int|float $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subCenturyWithOverflow() Sub one century to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addCenturiesWithoutOverflow(int|float $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addCenturyWithoutOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subCenturiesWithoutOverflow(int|float $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subCenturyWithoutOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addCenturiesWithNoOverflow(int|float $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addCenturyWithNoOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subCenturiesWithNoOverflow(int|float $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subCenturyWithNoOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addCenturiesNoOverflow(int|float $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addCenturyNoOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subCenturiesNoOverflow(int|float $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subCenturyNoOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addDecades(int|float $value = 1) Add decades (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addDecade() Add one decade to the instance (using date interval). - * @method CarbonInterface subDecades(int|float $value = 1) Sub decades (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subDecade() Sub one decade to the instance (using date interval). - * @method CarbonInterface addDecadesWithOverflow(int|float $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addDecadeWithOverflow() Add one decade to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subDecadesWithOverflow(int|float $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subDecadeWithOverflow() Sub one decade to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addDecadesWithoutOverflow(int|float $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addDecadeWithoutOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subDecadesWithoutOverflow(int|float $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subDecadeWithoutOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addDecadesWithNoOverflow(int|float $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addDecadeWithNoOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subDecadesWithNoOverflow(int|float $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subDecadeWithNoOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addDecadesNoOverflow(int|float $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addDecadeNoOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subDecadesNoOverflow(int|float $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subDecadeNoOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addQuarters(int|float $value = 1) Add quarters (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addQuarter() Add one quarter to the instance (using date interval). - * @method CarbonInterface subQuarters(int|float $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subQuarter() Sub one quarter to the instance (using date interval). - * @method CarbonInterface addQuartersWithOverflow(int|float $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addQuarterWithOverflow() Add one quarter to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subQuartersWithOverflow(int|float $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface subQuarterWithOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly allowed. - * @method CarbonInterface addQuartersWithoutOverflow(int|float $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addQuarterWithoutOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subQuartersWithoutOverflow(int|float $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subQuarterWithoutOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addQuartersWithNoOverflow(int|float $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addQuarterWithNoOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subQuartersWithNoOverflow(int|float $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subQuarterWithNoOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addQuartersNoOverflow(int|float $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addQuarterNoOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subQuartersNoOverflow(int|float $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface subQuarterNoOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. - * @method CarbonInterface addWeeks(int|float $value = 1) Add weeks (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addWeek() Add one week to the instance (using date interval). - * @method CarbonInterface subWeeks(int|float $value = 1) Sub weeks (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subWeek() Sub one week to the instance (using date interval). - * @method CarbonInterface addWeekdays(int|float $value = 1) Add weekdays (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface addWeekday() Add one weekday to the instance (using date interval). - * @method CarbonInterface subWeekdays(int|float $value = 1) Sub weekdays (the $value count passed in) to the instance (using date interval). - * @method CarbonInterface subWeekday() Sub one weekday to the instance (using date interval). - * @method CarbonInterface addUTCMicros(int|float $value = 1) Add microseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCMicro() Add one microsecond to the instance (using timestamp). - * @method CarbonInterface subUTCMicros(int|float $value = 1) Sub microseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCMicro() Sub one microsecond to the instance (using timestamp). - * @method CarbonPeriod microsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each microsecond or every X microseconds if a factor is given. - * @method float diffInUTCMicros(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of microseconds. - * @method CarbonInterface addUTCMicroseconds(int|float $value = 1) Add microseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCMicrosecond() Add one microsecond to the instance (using timestamp). - * @method CarbonInterface subUTCMicroseconds(int|float $value = 1) Sub microseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCMicrosecond() Sub one microsecond to the instance (using timestamp). - * @method CarbonPeriod microsecondsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each microsecond or every X microseconds if a factor is given. - * @method float diffInUTCMicroseconds(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of microseconds. - * @method CarbonInterface addUTCMillis(int|float $value = 1) Add milliseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCMilli() Add one millisecond to the instance (using timestamp). - * @method CarbonInterface subUTCMillis(int|float $value = 1) Sub milliseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCMilli() Sub one millisecond to the instance (using timestamp). - * @method CarbonPeriod millisUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millisecond or every X milliseconds if a factor is given. - * @method float diffInUTCMillis(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of milliseconds. - * @method CarbonInterface addUTCMilliseconds(int|float $value = 1) Add milliseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCMillisecond() Add one millisecond to the instance (using timestamp). - * @method CarbonInterface subUTCMilliseconds(int|float $value = 1) Sub milliseconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCMillisecond() Sub one millisecond to the instance (using timestamp). - * @method CarbonPeriod millisecondsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millisecond or every X milliseconds if a factor is given. - * @method float diffInUTCMilliseconds(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of milliseconds. - * @method CarbonInterface addUTCSeconds(int|float $value = 1) Add seconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCSecond() Add one second to the instance (using timestamp). - * @method CarbonInterface subUTCSeconds(int|float $value = 1) Sub seconds (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCSecond() Sub one second to the instance (using timestamp). - * @method CarbonPeriod secondsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each second or every X seconds if a factor is given. - * @method float diffInUTCSeconds(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of seconds. - * @method CarbonInterface addUTCMinutes(int|float $value = 1) Add minutes (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCMinute() Add one minute to the instance (using timestamp). - * @method CarbonInterface subUTCMinutes(int|float $value = 1) Sub minutes (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCMinute() Sub one minute to the instance (using timestamp). - * @method CarbonPeriod minutesUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each minute or every X minutes if a factor is given. - * @method float diffInUTCMinutes(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of minutes. - * @method CarbonInterface addUTCHours(int|float $value = 1) Add hours (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCHour() Add one hour to the instance (using timestamp). - * @method CarbonInterface subUTCHours(int|float $value = 1) Sub hours (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCHour() Sub one hour to the instance (using timestamp). - * @method CarbonPeriod hoursUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each hour or every X hours if a factor is given. - * @method float diffInUTCHours(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of hours. - * @method CarbonInterface addUTCDays(int|float $value = 1) Add days (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCDay() Add one day to the instance (using timestamp). - * @method CarbonInterface subUTCDays(int|float $value = 1) Sub days (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCDay() Sub one day to the instance (using timestamp). - * @method CarbonPeriod daysUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each day or every X days if a factor is given. - * @method float diffInUTCDays(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of days. - * @method CarbonInterface addUTCWeeks(int|float $value = 1) Add weeks (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCWeek() Add one week to the instance (using timestamp). - * @method CarbonInterface subUTCWeeks(int|float $value = 1) Sub weeks (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCWeek() Sub one week to the instance (using timestamp). - * @method CarbonPeriod weeksUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each week or every X weeks if a factor is given. - * @method float diffInUTCWeeks(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of weeks. - * @method CarbonInterface addUTCMonths(int|float $value = 1) Add months (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCMonth() Add one month to the instance (using timestamp). - * @method CarbonInterface subUTCMonths(int|float $value = 1) Sub months (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCMonth() Sub one month to the instance (using timestamp). - * @method CarbonPeriod monthsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each month or every X months if a factor is given. - * @method float diffInUTCMonths(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of months. - * @method CarbonInterface addUTCQuarters(int|float $value = 1) Add quarters (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCQuarter() Add one quarter to the instance (using timestamp). - * @method CarbonInterface subUTCQuarters(int|float $value = 1) Sub quarters (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCQuarter() Sub one quarter to the instance (using timestamp). - * @method CarbonPeriod quartersUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each quarter or every X quarters if a factor is given. - * @method float diffInUTCQuarters(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of quarters. - * @method CarbonInterface addUTCYears(int|float $value = 1) Add years (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCYear() Add one year to the instance (using timestamp). - * @method CarbonInterface subUTCYears(int|float $value = 1) Sub years (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCYear() Sub one year to the instance (using timestamp). - * @method CarbonPeriod yearsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each year or every X years if a factor is given. - * @method float diffInUTCYears(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of years. - * @method CarbonInterface addUTCDecades(int|float $value = 1) Add decades (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCDecade() Add one decade to the instance (using timestamp). - * @method CarbonInterface subUTCDecades(int|float $value = 1) Sub decades (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCDecade() Sub one decade to the instance (using timestamp). - * @method CarbonPeriod decadesUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each decade or every X decades if a factor is given. - * @method float diffInUTCDecades(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of decades. - * @method CarbonInterface addUTCCenturies(int|float $value = 1) Add centuries (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCCentury() Add one century to the instance (using timestamp). - * @method CarbonInterface subUTCCenturies(int|float $value = 1) Sub centuries (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCCentury() Sub one century to the instance (using timestamp). - * @method CarbonPeriod centuriesUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each century or every X centuries if a factor is given. - * @method float diffInUTCCenturies(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of centuries. - * @method CarbonInterface addUTCMillennia(int|float $value = 1) Add millennia (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface addUTCMillennium() Add one millennium to the instance (using timestamp). - * @method CarbonInterface subUTCMillennia(int|float $value = 1) Sub millennia (the $value count passed in) to the instance (using timestamp). - * @method CarbonInterface subUTCMillennium() Sub one millennium to the instance (using timestamp). - * @method CarbonPeriod millenniaUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millennium or every X millennia if a factor is given. - * @method float diffInUTCMillennia(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of millennia. - * @method CarbonInterface roundYear(float $precision = 1, string $function = "round") Round the current instance year with given precision using the given function. - * @method CarbonInterface roundYears(float $precision = 1, string $function = "round") Round the current instance year with given precision using the given function. - * @method CarbonInterface floorYear(float $precision = 1) Truncate the current instance year with given precision. - * @method CarbonInterface floorYears(float $precision = 1) Truncate the current instance year with given precision. - * @method CarbonInterface ceilYear(float $precision = 1) Ceil the current instance year with given precision. - * @method CarbonInterface ceilYears(float $precision = 1) Ceil the current instance year with given precision. - * @method CarbonInterface roundMonth(float $precision = 1, string $function = "round") Round the current instance month with given precision using the given function. - * @method CarbonInterface roundMonths(float $precision = 1, string $function = "round") Round the current instance month with given precision using the given function. - * @method CarbonInterface floorMonth(float $precision = 1) Truncate the current instance month with given precision. - * @method CarbonInterface floorMonths(float $precision = 1) Truncate the current instance month with given precision. - * @method CarbonInterface ceilMonth(float $precision = 1) Ceil the current instance month with given precision. - * @method CarbonInterface ceilMonths(float $precision = 1) Ceil the current instance month with given precision. - * @method CarbonInterface roundDay(float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. - * @method CarbonInterface roundDays(float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. - * @method CarbonInterface floorDay(float $precision = 1) Truncate the current instance day with given precision. - * @method CarbonInterface floorDays(float $precision = 1) Truncate the current instance day with given precision. - * @method CarbonInterface ceilDay(float $precision = 1) Ceil the current instance day with given precision. - * @method CarbonInterface ceilDays(float $precision = 1) Ceil the current instance day with given precision. - * @method CarbonInterface roundHour(float $precision = 1, string $function = "round") Round the current instance hour with given precision using the given function. - * @method CarbonInterface roundHours(float $precision = 1, string $function = "round") Round the current instance hour with given precision using the given function. - * @method CarbonInterface floorHour(float $precision = 1) Truncate the current instance hour with given precision. - * @method CarbonInterface floorHours(float $precision = 1) Truncate the current instance hour with given precision. - * @method CarbonInterface ceilHour(float $precision = 1) Ceil the current instance hour with given precision. - * @method CarbonInterface ceilHours(float $precision = 1) Ceil the current instance hour with given precision. - * @method CarbonInterface roundMinute(float $precision = 1, string $function = "round") Round the current instance minute with given precision using the given function. - * @method CarbonInterface roundMinutes(float $precision = 1, string $function = "round") Round the current instance minute with given precision using the given function. - * @method CarbonInterface floorMinute(float $precision = 1) Truncate the current instance minute with given precision. - * @method CarbonInterface floorMinutes(float $precision = 1) Truncate the current instance minute with given precision. - * @method CarbonInterface ceilMinute(float $precision = 1) Ceil the current instance minute with given precision. - * @method CarbonInterface ceilMinutes(float $precision = 1) Ceil the current instance minute with given precision. - * @method CarbonInterface roundSecond(float $precision = 1, string $function = "round") Round the current instance second with given precision using the given function. - * @method CarbonInterface roundSeconds(float $precision = 1, string $function = "round") Round the current instance second with given precision using the given function. - * @method CarbonInterface floorSecond(float $precision = 1) Truncate the current instance second with given precision. - * @method CarbonInterface floorSeconds(float $precision = 1) Truncate the current instance second with given precision. - * @method CarbonInterface ceilSecond(float $precision = 1) Ceil the current instance second with given precision. - * @method CarbonInterface ceilSeconds(float $precision = 1) Ceil the current instance second with given precision. - * @method CarbonInterface roundMillennium(float $precision = 1, string $function = "round") Round the current instance millennium with given precision using the given function. - * @method CarbonInterface roundMillennia(float $precision = 1, string $function = "round") Round the current instance millennium with given precision using the given function. - * @method CarbonInterface floorMillennium(float $precision = 1) Truncate the current instance millennium with given precision. - * @method CarbonInterface floorMillennia(float $precision = 1) Truncate the current instance millennium with given precision. - * @method CarbonInterface ceilMillennium(float $precision = 1) Ceil the current instance millennium with given precision. - * @method CarbonInterface ceilMillennia(float $precision = 1) Ceil the current instance millennium with given precision. - * @method CarbonInterface roundCentury(float $precision = 1, string $function = "round") Round the current instance century with given precision using the given function. - * @method CarbonInterface roundCenturies(float $precision = 1, string $function = "round") Round the current instance century with given precision using the given function. - * @method CarbonInterface floorCentury(float $precision = 1) Truncate the current instance century with given precision. - * @method CarbonInterface floorCenturies(float $precision = 1) Truncate the current instance century with given precision. - * @method CarbonInterface ceilCentury(float $precision = 1) Ceil the current instance century with given precision. - * @method CarbonInterface ceilCenturies(float $precision = 1) Ceil the current instance century with given precision. - * @method CarbonInterface roundDecade(float $precision = 1, string $function = "round") Round the current instance decade with given precision using the given function. - * @method CarbonInterface roundDecades(float $precision = 1, string $function = "round") Round the current instance decade with given precision using the given function. - * @method CarbonInterface floorDecade(float $precision = 1) Truncate the current instance decade with given precision. - * @method CarbonInterface floorDecades(float $precision = 1) Truncate the current instance decade with given precision. - * @method CarbonInterface ceilDecade(float $precision = 1) Ceil the current instance decade with given precision. - * @method CarbonInterface ceilDecades(float $precision = 1) Ceil the current instance decade with given precision. - * @method CarbonInterface roundQuarter(float $precision = 1, string $function = "round") Round the current instance quarter with given precision using the given function. - * @method CarbonInterface roundQuarters(float $precision = 1, string $function = "round") Round the current instance quarter with given precision using the given function. - * @method CarbonInterface floorQuarter(float $precision = 1) Truncate the current instance quarter with given precision. - * @method CarbonInterface floorQuarters(float $precision = 1) Truncate the current instance quarter with given precision. - * @method CarbonInterface ceilQuarter(float $precision = 1) Ceil the current instance quarter with given precision. - * @method CarbonInterface ceilQuarters(float $precision = 1) Ceil the current instance quarter with given precision. - * @method CarbonInterface roundMillisecond(float $precision = 1, string $function = "round") Round the current instance millisecond with given precision using the given function. - * @method CarbonInterface roundMilliseconds(float $precision = 1, string $function = "round") Round the current instance millisecond with given precision using the given function. - * @method CarbonInterface floorMillisecond(float $precision = 1) Truncate the current instance millisecond with given precision. - * @method CarbonInterface floorMilliseconds(float $precision = 1) Truncate the current instance millisecond with given precision. - * @method CarbonInterface ceilMillisecond(float $precision = 1) Ceil the current instance millisecond with given precision. - * @method CarbonInterface ceilMilliseconds(float $precision = 1) Ceil the current instance millisecond with given precision. - * @method CarbonInterface roundMicrosecond(float $precision = 1, string $function = "round") Round the current instance microsecond with given precision using the given function. - * @method CarbonInterface roundMicroseconds(float $precision = 1, string $function = "round") Round the current instance microsecond with given precision using the given function. - * @method CarbonInterface floorMicrosecond(float $precision = 1) Truncate the current instance microsecond with given precision. - * @method CarbonInterface floorMicroseconds(float $precision = 1) Truncate the current instance microsecond with given precision. - * @method CarbonInterface ceilMicrosecond(float $precision = 1) Ceil the current instance microsecond with given precision. - * @method CarbonInterface ceilMicroseconds(float $precision = 1) Ceil the current instance microsecond with given precision. - * @method string shortAbsoluteDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'Absolute' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string longAbsoluteDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'Absolute' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string shortRelativeDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'Relative' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string longRelativeDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'Relative' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string shortRelativeToNowDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'RelativeToNow' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string longRelativeToNowDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'RelativeToNow' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string shortRelativeToOtherDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'RelativeToOther' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method string longRelativeToOtherDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'RelativeToOther' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) - * @method int centuriesInMillennium() Return the number of centuries contained in the current millennium - * @method int|static centuryOfMillennium(?int $century = null) Return the value of the century starting from the beginning of the current millennium when called with no parameters, change the current century when called with an integer value - * @method int|static dayOfCentury(?int $day = null) Return the value of the day starting from the beginning of the current century when called with no parameters, change the current day when called with an integer value - * @method int|static dayOfDecade(?int $day = null) Return the value of the day starting from the beginning of the current decade when called with no parameters, change the current day when called with an integer value - * @method int|static dayOfMillennium(?int $day = null) Return the value of the day starting from the beginning of the current millennium when called with no parameters, change the current day when called with an integer value - * @method int|static dayOfMonth(?int $day = null) Return the value of the day starting from the beginning of the current month when called with no parameters, change the current day when called with an integer value - * @method int|static dayOfQuarter(?int $day = null) Return the value of the day starting from the beginning of the current quarter when called with no parameters, change the current day when called with an integer value - * @method int|static dayOfWeek(?int $day = null) Return the value of the day starting from the beginning of the current week when called with no parameters, change the current day when called with an integer value - * @method int daysInCentury() Return the number of days contained in the current century - * @method int daysInDecade() Return the number of days contained in the current decade - * @method int daysInMillennium() Return the number of days contained in the current millennium - * @method int daysInMonth() Return the number of days contained in the current month - * @method int daysInQuarter() Return the number of days contained in the current quarter - * @method int daysInWeek() Return the number of days contained in the current week - * @method int daysInYear() Return the number of days contained in the current year - * @method int|static decadeOfCentury(?int $decade = null) Return the value of the decade starting from the beginning of the current century when called with no parameters, change the current decade when called with an integer value - * @method int|static decadeOfMillennium(?int $decade = null) Return the value of the decade starting from the beginning of the current millennium when called with no parameters, change the current decade when called with an integer value - * @method int decadesInCentury() Return the number of decades contained in the current century - * @method int decadesInMillennium() Return the number of decades contained in the current millennium - * @method int|static hourOfCentury(?int $hour = null) Return the value of the hour starting from the beginning of the current century when called with no parameters, change the current hour when called with an integer value - * @method int|static hourOfDay(?int $hour = null) Return the value of the hour starting from the beginning of the current day when called with no parameters, change the current hour when called with an integer value - * @method int|static hourOfDecade(?int $hour = null) Return the value of the hour starting from the beginning of the current decade when called with no parameters, change the current hour when called with an integer value - * @method int|static hourOfMillennium(?int $hour = null) Return the value of the hour starting from the beginning of the current millennium when called with no parameters, change the current hour when called with an integer value - * @method int|static hourOfMonth(?int $hour = null) Return the value of the hour starting from the beginning of the current month when called with no parameters, change the current hour when called with an integer value - * @method int|static hourOfQuarter(?int $hour = null) Return the value of the hour starting from the beginning of the current quarter when called with no parameters, change the current hour when called with an integer value - * @method int|static hourOfWeek(?int $hour = null) Return the value of the hour starting from the beginning of the current week when called with no parameters, change the current hour when called with an integer value - * @method int|static hourOfYear(?int $hour = null) Return the value of the hour starting from the beginning of the current year when called with no parameters, change the current hour when called with an integer value - * @method int hoursInCentury() Return the number of hours contained in the current century - * @method int hoursInDay() Return the number of hours contained in the current day - * @method int hoursInDecade() Return the number of hours contained in the current decade - * @method int hoursInMillennium() Return the number of hours contained in the current millennium - * @method int hoursInMonth() Return the number of hours contained in the current month - * @method int hoursInQuarter() Return the number of hours contained in the current quarter - * @method int hoursInWeek() Return the number of hours contained in the current week - * @method int hoursInYear() Return the number of hours contained in the current year - * @method int|static microsecondOfCentury(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current century when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfDay(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current day when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfDecade(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current decade when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfHour(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current hour when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfMillennium(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current millennium when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfMillisecond(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current millisecond when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfMinute(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current minute when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfMonth(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current month when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfQuarter(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current quarter when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfSecond(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current second when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfWeek(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current week when called with no parameters, change the current microsecond when called with an integer value - * @method int|static microsecondOfYear(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current year when called with no parameters, change the current microsecond when called with an integer value - * @method int microsecondsInCentury() Return the number of microseconds contained in the current century - * @method int microsecondsInDay() Return the number of microseconds contained in the current day - * @method int microsecondsInDecade() Return the number of microseconds contained in the current decade - * @method int microsecondsInHour() Return the number of microseconds contained in the current hour - * @method int microsecondsInMillennium() Return the number of microseconds contained in the current millennium - * @method int microsecondsInMillisecond() Return the number of microseconds contained in the current millisecond - * @method int microsecondsInMinute() Return the number of microseconds contained in the current minute - * @method int microsecondsInMonth() Return the number of microseconds contained in the current month - * @method int microsecondsInQuarter() Return the number of microseconds contained in the current quarter - * @method int microsecondsInSecond() Return the number of microseconds contained in the current second - * @method int microsecondsInWeek() Return the number of microseconds contained in the current week - * @method int microsecondsInYear() Return the number of microseconds contained in the current year - * @method int|static millisecondOfCentury(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current century when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfDay(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current day when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfDecade(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current decade when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfHour(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current hour when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfMillennium(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current millennium when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfMinute(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current minute when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfMonth(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current month when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfQuarter(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current quarter when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfSecond(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current second when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfWeek(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current week when called with no parameters, change the current millisecond when called with an integer value - * @method int|static millisecondOfYear(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current year when called with no parameters, change the current millisecond when called with an integer value - * @method int millisecondsInCentury() Return the number of milliseconds contained in the current century - * @method int millisecondsInDay() Return the number of milliseconds contained in the current day - * @method int millisecondsInDecade() Return the number of milliseconds contained in the current decade - * @method int millisecondsInHour() Return the number of milliseconds contained in the current hour - * @method int millisecondsInMillennium() Return the number of milliseconds contained in the current millennium - * @method int millisecondsInMinute() Return the number of milliseconds contained in the current minute - * @method int millisecondsInMonth() Return the number of milliseconds contained in the current month - * @method int millisecondsInQuarter() Return the number of milliseconds contained in the current quarter - * @method int millisecondsInSecond() Return the number of milliseconds contained in the current second - * @method int millisecondsInWeek() Return the number of milliseconds contained in the current week - * @method int millisecondsInYear() Return the number of milliseconds contained in the current year - * @method int|static minuteOfCentury(?int $minute = null) Return the value of the minute starting from the beginning of the current century when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfDay(?int $minute = null) Return the value of the minute starting from the beginning of the current day when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfDecade(?int $minute = null) Return the value of the minute starting from the beginning of the current decade when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfHour(?int $minute = null) Return the value of the minute starting from the beginning of the current hour when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfMillennium(?int $minute = null) Return the value of the minute starting from the beginning of the current millennium when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfMonth(?int $minute = null) Return the value of the minute starting from the beginning of the current month when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfQuarter(?int $minute = null) Return the value of the minute starting from the beginning of the current quarter when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfWeek(?int $minute = null) Return the value of the minute starting from the beginning of the current week when called with no parameters, change the current minute when called with an integer value - * @method int|static minuteOfYear(?int $minute = null) Return the value of the minute starting from the beginning of the current year when called with no parameters, change the current minute when called with an integer value - * @method int minutesInCentury() Return the number of minutes contained in the current century - * @method int minutesInDay() Return the number of minutes contained in the current day - * @method int minutesInDecade() Return the number of minutes contained in the current decade - * @method int minutesInHour() Return the number of minutes contained in the current hour - * @method int minutesInMillennium() Return the number of minutes contained in the current millennium - * @method int minutesInMonth() Return the number of minutes contained in the current month - * @method int minutesInQuarter() Return the number of minutes contained in the current quarter - * @method int minutesInWeek() Return the number of minutes contained in the current week - * @method int minutesInYear() Return the number of minutes contained in the current year - * @method int|static monthOfCentury(?int $month = null) Return the value of the month starting from the beginning of the current century when called with no parameters, change the current month when called with an integer value - * @method int|static monthOfDecade(?int $month = null) Return the value of the month starting from the beginning of the current decade when called with no parameters, change the current month when called with an integer value - * @method int|static monthOfMillennium(?int $month = null) Return the value of the month starting from the beginning of the current millennium when called with no parameters, change the current month when called with an integer value - * @method int|static monthOfQuarter(?int $month = null) Return the value of the month starting from the beginning of the current quarter when called with no parameters, change the current month when called with an integer value - * @method int|static monthOfYear(?int $month = null) Return the value of the month starting from the beginning of the current year when called with no parameters, change the current month when called with an integer value - * @method int monthsInCentury() Return the number of months contained in the current century - * @method int monthsInDecade() Return the number of months contained in the current decade - * @method int monthsInMillennium() Return the number of months contained in the current millennium - * @method int monthsInQuarter() Return the number of months contained in the current quarter - * @method int monthsInYear() Return the number of months contained in the current year - * @method int|static quarterOfCentury(?int $quarter = null) Return the value of the quarter starting from the beginning of the current century when called with no parameters, change the current quarter when called with an integer value - * @method int|static quarterOfDecade(?int $quarter = null) Return the value of the quarter starting from the beginning of the current decade when called with no parameters, change the current quarter when called with an integer value - * @method int|static quarterOfMillennium(?int $quarter = null) Return the value of the quarter starting from the beginning of the current millennium when called with no parameters, change the current quarter when called with an integer value - * @method int|static quarterOfYear(?int $quarter = null) Return the value of the quarter starting from the beginning of the current year when called with no parameters, change the current quarter when called with an integer value - * @method int quartersInCentury() Return the number of quarters contained in the current century - * @method int quartersInDecade() Return the number of quarters contained in the current decade - * @method int quartersInMillennium() Return the number of quarters contained in the current millennium - * @method int quartersInYear() Return the number of quarters contained in the current year - * @method int|static secondOfCentury(?int $second = null) Return the value of the second starting from the beginning of the current century when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfDay(?int $second = null) Return the value of the second starting from the beginning of the current day when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfDecade(?int $second = null) Return the value of the second starting from the beginning of the current decade when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfHour(?int $second = null) Return the value of the second starting from the beginning of the current hour when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfMillennium(?int $second = null) Return the value of the second starting from the beginning of the current millennium when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfMinute(?int $second = null) Return the value of the second starting from the beginning of the current minute when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfMonth(?int $second = null) Return the value of the second starting from the beginning of the current month when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfQuarter(?int $second = null) Return the value of the second starting from the beginning of the current quarter when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfWeek(?int $second = null) Return the value of the second starting from the beginning of the current week when called with no parameters, change the current second when called with an integer value - * @method int|static secondOfYear(?int $second = null) Return the value of the second starting from the beginning of the current year when called with no parameters, change the current second when called with an integer value - * @method int secondsInCentury() Return the number of seconds contained in the current century - * @method int secondsInDay() Return the number of seconds contained in the current day - * @method int secondsInDecade() Return the number of seconds contained in the current decade - * @method int secondsInHour() Return the number of seconds contained in the current hour - * @method int secondsInMillennium() Return the number of seconds contained in the current millennium - * @method int secondsInMinute() Return the number of seconds contained in the current minute - * @method int secondsInMonth() Return the number of seconds contained in the current month - * @method int secondsInQuarter() Return the number of seconds contained in the current quarter - * @method int secondsInWeek() Return the number of seconds contained in the current week - * @method int secondsInYear() Return the number of seconds contained in the current year - * @method int|static weekOfCentury(?int $week = null) Return the value of the week starting from the beginning of the current century when called with no parameters, change the current week when called with an integer value - * @method int|static weekOfDecade(?int $week = null) Return the value of the week starting from the beginning of the current decade when called with no parameters, change the current week when called with an integer value - * @method int|static weekOfMillennium(?int $week = null) Return the value of the week starting from the beginning of the current millennium when called with no parameters, change the current week when called with an integer value - * @method int|static weekOfMonth(?int $week = null) Return the value of the week starting from the beginning of the current month when called with no parameters, change the current week when called with an integer value - * @method int|static weekOfQuarter(?int $week = null) Return the value of the week starting from the beginning of the current quarter when called with no parameters, change the current week when called with an integer value - * @method int|static weekOfYear(?int $week = null) Return the value of the week starting from the beginning of the current year when called with no parameters, change the current week when called with an integer value - * @method int weeksInCentury() Return the number of weeks contained in the current century - * @method int weeksInDecade() Return the number of weeks contained in the current decade - * @method int weeksInMillennium() Return the number of weeks contained in the current millennium - * @method int weeksInMonth() Return the number of weeks contained in the current month - * @method int weeksInQuarter() Return the number of weeks contained in the current quarter - * @method int|static yearOfCentury(?int $year = null) Return the value of the year starting from the beginning of the current century when called with no parameters, change the current year when called with an integer value - * @method int|static yearOfDecade(?int $year = null) Return the value of the year starting from the beginning of the current decade when called with no parameters, change the current year when called with an integer value - * @method int|static yearOfMillennium(?int $year = null) Return the value of the year starting from the beginning of the current millennium when called with no parameters, change the current year when called with an integer value - * @method int yearsInCentury() Return the number of years contained in the current century - * @method int yearsInDecade() Return the number of years contained in the current decade - * @method int yearsInMillennium() Return the number of years contained in the current millennium + * @method bool isUtc() Check if the current instance has UTC timezone. (Both isUtc and isUTC cases are valid.) + * @method bool isLocal() Check if the current instance has non-UTC timezone. + * @method bool isValid() Check if the current instance is a valid date. + * @method bool isDST() Check if the current instance is in a daylight saving time. + * @method bool isSunday() Checks if the instance day is sunday. + * @method bool isMonday() Checks if the instance day is monday. + * @method bool isTuesday() Checks if the instance day is tuesday. + * @method bool isWednesday() Checks if the instance day is wednesday. + * @method bool isThursday() Checks if the instance day is thursday. + * @method bool isFriday() Checks if the instance day is friday. + * @method bool isSaturday() Checks if the instance day is saturday. + * @method bool isSameYear(DateTimeInterface|string $date) Checks if the given date is in the same year as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentYear() Checks if the instance is in the same year as the current moment. + * @method bool isNextYear() Checks if the instance is in the same year as the current moment next year. + * @method bool isLastYear() Checks if the instance is in the same year as the current moment last year. + * @method bool isCurrentMonth() Checks if the instance is in the same month as the current moment. + * @method bool isNextMonth() Checks if the instance is in the same month as the current moment next month. + * @method bool isLastMonth() Checks if the instance is in the same month as the current moment last month. + * @method bool isSameWeek(DateTimeInterface|string $date) Checks if the given date is in the same week as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentWeek() Checks if the instance is in the same week as the current moment. + * @method bool isNextWeek() Checks if the instance is in the same week as the current moment next week. + * @method bool isLastWeek() Checks if the instance is in the same week as the current moment last week. + * @method bool isSameDay(DateTimeInterface|string $date) Checks if the given date is in the same day as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentDay() Checks if the instance is in the same day as the current moment. + * @method bool isNextDay() Checks if the instance is in the same day as the current moment next day. + * @method bool isLastDay() Checks if the instance is in the same day as the current moment last day. + * @method bool isSameHour(DateTimeInterface|string $date) Checks if the given date is in the same hour as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentHour() Checks if the instance is in the same hour as the current moment. + * @method bool isNextHour() Checks if the instance is in the same hour as the current moment next hour. + * @method bool isLastHour() Checks if the instance is in the same hour as the current moment last hour. + * @method bool isSameMinute(DateTimeInterface|string $date) Checks if the given date is in the same minute as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentMinute() Checks if the instance is in the same minute as the current moment. + * @method bool isNextMinute() Checks if the instance is in the same minute as the current moment next minute. + * @method bool isLastMinute() Checks if the instance is in the same minute as the current moment last minute. + * @method bool isSameSecond(DateTimeInterface|string $date) Checks if the given date is in the same second as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentSecond() Checks if the instance is in the same second as the current moment. + * @method bool isNextSecond() Checks if the instance is in the same second as the current moment next second. + * @method bool isLastSecond() Checks if the instance is in the same second as the current moment last second. + * @method bool isSameMilli(DateTimeInterface|string $date) Checks if the given date is in the same millisecond as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentMilli() Checks if the instance is in the same millisecond as the current moment. + * @method bool isNextMilli() Checks if the instance is in the same millisecond as the current moment next millisecond. + * @method bool isLastMilli() Checks if the instance is in the same millisecond as the current moment last millisecond. + * @method bool isSameMillisecond(DateTimeInterface|string $date) Checks if the given date is in the same millisecond as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentMillisecond() Checks if the instance is in the same millisecond as the current moment. + * @method bool isNextMillisecond() Checks if the instance is in the same millisecond as the current moment next millisecond. + * @method bool isLastMillisecond() Checks if the instance is in the same millisecond as the current moment last millisecond. + * @method bool isSameMicro(DateTimeInterface|string $date) Checks if the given date is in the same microsecond as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentMicro() Checks if the instance is in the same microsecond as the current moment. + * @method bool isNextMicro() Checks if the instance is in the same microsecond as the current moment next microsecond. + * @method bool isLastMicro() Checks if the instance is in the same microsecond as the current moment last microsecond. + * @method bool isSameMicrosecond(DateTimeInterface|string $date) Checks if the given date is in the same microsecond as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentMicrosecond() Checks if the instance is in the same microsecond as the current moment. + * @method bool isNextMicrosecond() Checks if the instance is in the same microsecond as the current moment next microsecond. + * @method bool isLastMicrosecond() Checks if the instance is in the same microsecond as the current moment last microsecond. + * @method bool isSameDecade(DateTimeInterface|string $date) Checks if the given date is in the same decade as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentDecade() Checks if the instance is in the same decade as the current moment. + * @method bool isNextDecade() Checks if the instance is in the same decade as the current moment next decade. + * @method bool isLastDecade() Checks if the instance is in the same decade as the current moment last decade. + * @method bool isSameCentury(DateTimeInterface|string $date) Checks if the given date is in the same century as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentCentury() Checks if the instance is in the same century as the current moment. + * @method bool isNextCentury() Checks if the instance is in the same century as the current moment next century. + * @method bool isLastCentury() Checks if the instance is in the same century as the current moment last century. + * @method bool isSameMillennium(DateTimeInterface|string $date) Checks if the given date is in the same millennium as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentMillennium() Checks if the instance is in the same millennium as the current moment. + * @method bool isNextMillennium() Checks if the instance is in the same millennium as the current moment next millennium. + * @method bool isLastMillennium() Checks if the instance is in the same millennium as the current moment last millennium. + * @method bool isCurrentQuarter() Checks if the instance is in the same quarter as the current moment. + * @method bool isNextQuarter() Checks if the instance is in the same quarter as the current moment next quarter. + * @method bool isLastQuarter() Checks if the instance is in the same quarter as the current moment last quarter. + * @method CarbonInterface years(int $value, OverflowMode|bool|null $overflow = null, ?int $anchorDay = null) Set current instance year to the given value. + * @method CarbonInterface year(int $value, OverflowMode|bool|null $overflow = null, ?int $anchorDay = null) Set current instance year to the given value. + * @method CarbonInterface setYears(int $value, OverflowMode|bool|null $overflow = null, ?int $anchorDay = null) Set current instance year to the given value. + * @method CarbonInterface setYear(int $value, OverflowMode|bool|null $overflow = null, ?int $anchorDay = null) Set current instance year to the given value. + * @method CarbonInterface months(Month|int $value, OverflowMode|bool|null $overflow = null, ?int $anchorDay = null) Set current instance month to the given value. + * @method CarbonInterface month(Month|int $value, OverflowMode|bool|null $overflow = null, ?int $anchorDay = null) Set current instance month to the given value. + * @method CarbonInterface setMonths(Month|int $value, OverflowMode|bool|null $overflow = null, ?int $anchorDay = null) Set current instance month to the given value. + * @method CarbonInterface setMonth(Month|int $value, OverflowMode|bool|null $overflow = null, ?int $anchorDay = null) Set current instance month to the given value. + * @method CarbonInterface days(int $value) Set current instance day to the given value. + * @method CarbonInterface day(int $value) Set current instance day to the given value. + * @method CarbonInterface setDays(int $value) Set current instance day to the given value. + * @method CarbonInterface setDay(int $value) Set current instance day to the given value. + * @method CarbonInterface hours(int $value) Set current instance hour to the given value. + * @method CarbonInterface hour(int $value) Set current instance hour to the given value. + * @method CarbonInterface setHours(int $value) Set current instance hour to the given value. + * @method CarbonInterface setHour(int $value) Set current instance hour to the given value. + * @method CarbonInterface minutes(int $value) Set current instance minute to the given value. + * @method CarbonInterface minute(int $value) Set current instance minute to the given value. + * @method CarbonInterface setMinutes(int $value) Set current instance minute to the given value. + * @method CarbonInterface setMinute(int $value) Set current instance minute to the given value. + * @method CarbonInterface seconds(int $value) Set current instance second to the given value. + * @method CarbonInterface second(int $value) Set current instance second to the given value. + * @method CarbonInterface setSeconds(int $value) Set current instance second to the given value. + * @method CarbonInterface setSecond(int $value) Set current instance second to the given value. + * @method CarbonInterface millis(int $value) Set current instance millisecond to the given value. + * @method CarbonInterface milli(int $value) Set current instance millisecond to the given value. + * @method CarbonInterface setMillis(int $value) Set current instance millisecond to the given value. + * @method CarbonInterface setMilli(int $value) Set current instance millisecond to the given value. + * @method CarbonInterface milliseconds(int $value) Set current instance millisecond to the given value. + * @method CarbonInterface millisecond(int $value) Set current instance millisecond to the given value. + * @method CarbonInterface setMilliseconds(int $value) Set current instance millisecond to the given value. + * @method CarbonInterface setMillisecond(int $value) Set current instance millisecond to the given value. + * @method CarbonInterface micros(int $value) Set current instance microsecond to the given value. + * @method CarbonInterface micro(int $value) Set current instance microsecond to the given value. + * @method CarbonInterface setMicros(int $value) Set current instance microsecond to the given value. + * @method CarbonInterface setMicro(int $value) Set current instance microsecond to the given value. + * @method CarbonInterface microseconds(int $value) Set current instance microsecond to the given value. + * @method CarbonInterface microsecond(int $value) Set current instance microsecond to the given value. + * @method CarbonInterface setMicroseconds(int $value) Set current instance microsecond to the given value. + * @method self setMicrosecond(int $value) Set current instance microsecond to the given value. + * @method CarbonInterface addYears(int|float $value = 1, ?int $anchorDay = null) Add years (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addYear() Add one year to the instance (using date interval). + * @method CarbonInterface subYears(int|float $value = 1, ?int $anchorDay = null) Sub years (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subYear() Sub one year to the instance (using date interval). + * @method CarbonInterface addYearsWithOverflow(int|float $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface addYearWithOverflow() Add one year to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface subYearsWithOverflow(int|float $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface subYearWithOverflow() Sub one year to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface addYearsWithoutOverflow(int|float $value = 1, ?int $anchorDay = null) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addYearWithoutOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subYearsWithoutOverflow(int|float $value = 1, ?int $anchorDay = null) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subYearWithoutOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addYearsWithNoOverflow(int|float $value = 1, ?int $anchorDay = null) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addYearWithNoOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subYearsWithNoOverflow(int|float $value = 1, ?int $anchorDay = null) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subYearWithNoOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addYearsNoOverflow(int|float $value = 1, ?int $anchorDay = null) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addYearNoOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subYearsNoOverflow(int|float $value = 1, ?int $anchorDay = null) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subYearNoOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addMonths(int|float $value = 1, ?int $anchorDay = null) Add months (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addMonth() Add one month to the instance (using date interval). + * @method CarbonInterface subMonths(int|float $value = 1, ?int $anchorDay = null) Sub months (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subMonth() Sub one month to the instance (using date interval). + * @method CarbonInterface addMonthsWithOverflow(int|float $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface addMonthWithOverflow() Add one month to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface subMonthsWithOverflow(int|float $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface subMonthWithOverflow() Sub one month to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface addMonthsWithoutOverflow(int|float $value = 1, ?int $anchorDay = null) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addMonthWithoutOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subMonthsWithoutOverflow(int|float $value = 1, ?int $anchorDay = null) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subMonthWithoutOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addMonthsWithNoOverflow(int|float $value = 1, ?int $anchorDay = null) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addMonthWithNoOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subMonthsWithNoOverflow(int|float $value = 1, ?int $anchorDay = null) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subMonthWithNoOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addMonthsNoOverflow(int|float $value = 1, ?int $anchorDay = null) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addMonthNoOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subMonthsNoOverflow(int|float $value = 1, ?int $anchorDay = null) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subMonthNoOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addDays(int|float $value = 1) Add days (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addDay() Add one day to the instance (using date interval). + * @method CarbonInterface subDays(int|float $value = 1) Sub days (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subDay() Sub one day to the instance (using date interval). + * @method CarbonInterface addHours(int|float $value = 1) Add hours (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addHour() Add one hour to the instance (using date interval). + * @method CarbonInterface subHours(int|float $value = 1) Sub hours (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subHour() Sub one hour to the instance (using date interval). + * @method CarbonInterface addMinutes(int|float $value = 1) Add minutes (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addMinute() Add one minute to the instance (using date interval). + * @method CarbonInterface subMinutes(int|float $value = 1) Sub minutes (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subMinute() Sub one minute to the instance (using date interval). + * @method CarbonInterface addSeconds(int|float $value = 1) Add seconds (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addSecond() Add one second to the instance (using date interval). + * @method CarbonInterface subSeconds(int|float $value = 1) Sub seconds (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subSecond() Sub one second to the instance (using date interval). + * @method CarbonInterface addMillis(int|float $value = 1) Add milliseconds (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addMilli() Add one millisecond to the instance (using date interval). + * @method CarbonInterface subMillis(int|float $value = 1) Sub milliseconds (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subMilli() Sub one millisecond to the instance (using date interval). + * @method CarbonInterface addMilliseconds(int|float $value = 1) Add milliseconds (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addMillisecond() Add one millisecond to the instance (using date interval). + * @method CarbonInterface subMilliseconds(int|float $value = 1) Sub milliseconds (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subMillisecond() Sub one millisecond to the instance (using date interval). + * @method CarbonInterface addMicros(int|float $value = 1) Add microseconds (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addMicro() Add one microsecond to the instance (using date interval). + * @method CarbonInterface subMicros(int|float $value = 1) Sub microseconds (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subMicro() Sub one microsecond to the instance (using date interval). + * @method CarbonInterface addMicroseconds(int|float $value = 1) Add microseconds (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addMicrosecond() Add one microsecond to the instance (using date interval). + * @method CarbonInterface subMicroseconds(int|float $value = 1) Sub microseconds (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subMicrosecond() Sub one microsecond to the instance (using date interval). + * @method CarbonInterface addMillennia(int|float $value = 1, ?int $anchorDay = null) Add millennia (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addMillennium() Add one millennium to the instance (using date interval). + * @method CarbonInterface subMillennia(int|float $value = 1, ?int $anchorDay = null) Sub millennia (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subMillennium() Sub one millennium to the instance (using date interval). + * @method CarbonInterface addMillenniaWithOverflow(int|float $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface addMillenniumWithOverflow() Add one millennium to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface subMillenniaWithOverflow(int|float $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface subMillenniumWithOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface addMillenniaWithoutOverflow(int|float $value = 1, ?int $anchorDay = null) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addMillenniumWithoutOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subMillenniaWithoutOverflow(int|float $value = 1, ?int $anchorDay = null) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subMillenniumWithoutOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addMillenniaWithNoOverflow(int|float $value = 1, ?int $anchorDay = null) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addMillenniumWithNoOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subMillenniaWithNoOverflow(int|float $value = 1, ?int $anchorDay = null) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subMillenniumWithNoOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addMillenniaNoOverflow(int|float $value = 1, ?int $anchorDay = null) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addMillenniumNoOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subMillenniaNoOverflow(int|float $value = 1, ?int $anchorDay = null) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subMillenniumNoOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addCenturies(int|float $value = 1, ?int $anchorDay = null) Add centuries (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addCentury() Add one century to the instance (using date interval). + * @method CarbonInterface subCenturies(int|float $value = 1, ?int $anchorDay = null) Sub centuries (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subCentury() Sub one century to the instance (using date interval). + * @method CarbonInterface addCenturiesWithOverflow(int|float $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface addCenturyWithOverflow() Add one century to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface subCenturiesWithOverflow(int|float $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface subCenturyWithOverflow() Sub one century to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface addCenturiesWithoutOverflow(int|float $value = 1, ?int $anchorDay = null) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addCenturyWithoutOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subCenturiesWithoutOverflow(int|float $value = 1, ?int $anchorDay = null) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subCenturyWithoutOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addCenturiesWithNoOverflow(int|float $value = 1, ?int $anchorDay = null) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addCenturyWithNoOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subCenturiesWithNoOverflow(int|float $value = 1, ?int $anchorDay = null) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subCenturyWithNoOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addCenturiesNoOverflow(int|float $value = 1, ?int $anchorDay = null) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addCenturyNoOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subCenturiesNoOverflow(int|float $value = 1, ?int $anchorDay = null) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subCenturyNoOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addDecades(int|float $value = 1, ?int $anchorDay = null) Add decades (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addDecade() Add one decade to the instance (using date interval). + * @method CarbonInterface subDecades(int|float $value = 1, ?int $anchorDay = null) Sub decades (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subDecade() Sub one decade to the instance (using date interval). + * @method CarbonInterface addDecadesWithOverflow(int|float $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface addDecadeWithOverflow() Add one decade to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface subDecadesWithOverflow(int|float $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface subDecadeWithOverflow() Sub one decade to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface addDecadesWithoutOverflow(int|float $value = 1, ?int $anchorDay = null) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addDecadeWithoutOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subDecadesWithoutOverflow(int|float $value = 1, ?int $anchorDay = null) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subDecadeWithoutOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addDecadesWithNoOverflow(int|float $value = 1, ?int $anchorDay = null) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addDecadeWithNoOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subDecadesWithNoOverflow(int|float $value = 1, ?int $anchorDay = null) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subDecadeWithNoOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addDecadesNoOverflow(int|float $value = 1, ?int $anchorDay = null) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addDecadeNoOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subDecadesNoOverflow(int|float $value = 1, ?int $anchorDay = null) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subDecadeNoOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addQuarters(int|float $value = 1, ?int $anchorDay = null) Add quarters (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addQuarter() Add one quarter to the instance (using date interval). + * @method CarbonInterface subQuarters(int|float $value = 1, ?int $anchorDay = null) Sub quarters (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subQuarter() Sub one quarter to the instance (using date interval). + * @method CarbonInterface addQuartersWithOverflow(int|float $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface addQuarterWithOverflow() Add one quarter to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface subQuartersWithOverflow(int|float $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface subQuarterWithOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface addQuartersWithoutOverflow(int|float $value = 1, ?int $anchorDay = null) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addQuarterWithoutOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subQuartersWithoutOverflow(int|float $value = 1, ?int $anchorDay = null) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subQuarterWithoutOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addQuartersWithNoOverflow(int|float $value = 1, ?int $anchorDay = null) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addQuarterWithNoOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subQuartersWithNoOverflow(int|float $value = 1, ?int $anchorDay = null) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subQuarterWithNoOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addQuartersNoOverflow(int|float $value = 1, ?int $anchorDay = null) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addQuarterNoOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subQuartersNoOverflow(int|float $value = 1, ?int $anchorDay = null) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subQuarterNoOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addWeeks(int|float $value = 1) Add weeks (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addWeek() Add one week to the instance (using date interval). + * @method CarbonInterface subWeeks(int|float $value = 1) Sub weeks (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subWeek() Sub one week to the instance (using date interval). + * @method CarbonInterface addWeekdays(int|float $value = 1) Add weekdays (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addWeekday() Add one weekday to the instance (using date interval). + * @method CarbonInterface subWeekdays(int|float $value = 1) Sub weekdays (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subWeekday() Sub one weekday to the instance (using date interval). + * @method CarbonInterface addUTCMicros(int|float $value = 1) Add microseconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addUTCMicro() Add one microsecond to the instance (using timestamp). + * @method CarbonInterface subUTCMicros(int|float $value = 1) Sub microseconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subUTCMicro() Sub one microsecond to the instance (using timestamp). + * @method CarbonPeriod microsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each microsecond or every X microseconds if a factor is given. + * @method float diffInUTCMicros(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of microseconds. + * @method CarbonInterface addUTCMicroseconds(int|float $value = 1) Add microseconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addUTCMicrosecond() Add one microsecond to the instance (using timestamp). + * @method CarbonInterface subUTCMicroseconds(int|float $value = 1) Sub microseconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subUTCMicrosecond() Sub one microsecond to the instance (using timestamp). + * @method CarbonPeriod microsecondsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each microsecond or every X microseconds if a factor is given. + * @method float diffInUTCMicroseconds(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of microseconds. + * @method CarbonInterface addUTCMillis(int|float $value = 1) Add milliseconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addUTCMilli() Add one millisecond to the instance (using timestamp). + * @method CarbonInterface subUTCMillis(int|float $value = 1) Sub milliseconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subUTCMilli() Sub one millisecond to the instance (using timestamp). + * @method CarbonPeriod millisUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millisecond or every X milliseconds if a factor is given. + * @method float diffInUTCMillis(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of milliseconds. + * @method CarbonInterface addUTCMilliseconds(int|float $value = 1) Add milliseconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addUTCMillisecond() Add one millisecond to the instance (using timestamp). + * @method CarbonInterface subUTCMilliseconds(int|float $value = 1) Sub milliseconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subUTCMillisecond() Sub one millisecond to the instance (using timestamp). + * @method CarbonPeriod millisecondsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millisecond or every X milliseconds if a factor is given. + * @method float diffInUTCMilliseconds(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of milliseconds. + * @method CarbonInterface addUTCSeconds(int|float $value = 1) Add seconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addUTCSecond() Add one second to the instance (using timestamp). + * @method CarbonInterface subUTCSeconds(int|float $value = 1) Sub seconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subUTCSecond() Sub one second to the instance (using timestamp). + * @method CarbonPeriod secondsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each second or every X seconds if a factor is given. + * @method float diffInUTCSeconds(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of seconds. + * @method CarbonInterface addUTCMinutes(int|float $value = 1) Add minutes (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addUTCMinute() Add one minute to the instance (using timestamp). + * @method CarbonInterface subUTCMinutes(int|float $value = 1) Sub minutes (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subUTCMinute() Sub one minute to the instance (using timestamp). + * @method CarbonPeriod minutesUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each minute or every X minutes if a factor is given. + * @method float diffInUTCMinutes(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of minutes. + * @method CarbonInterface addUTCHours(int|float $value = 1) Add hours (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addUTCHour() Add one hour to the instance (using timestamp). + * @method CarbonInterface subUTCHours(int|float $value = 1) Sub hours (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subUTCHour() Sub one hour to the instance (using timestamp). + * @method CarbonPeriod hoursUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each hour or every X hours if a factor is given. + * @method float diffInUTCHours(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of hours. + * @method CarbonInterface addUTCDays(int|float $value = 1) Add days (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addUTCDay() Add one day to the instance (using timestamp). + * @method CarbonInterface subUTCDays(int|float $value = 1) Sub days (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subUTCDay() Sub one day to the instance (using timestamp). + * @method CarbonPeriod daysUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each day or every X days if a factor is given. + * @method float diffInUTCDays(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of days. + * @method CarbonInterface addUTCWeeks(int|float $value = 1) Add weeks (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addUTCWeek() Add one week to the instance (using timestamp). + * @method CarbonInterface subUTCWeeks(int|float $value = 1) Sub weeks (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subUTCWeek() Sub one week to the instance (using timestamp). + * @method CarbonPeriod weeksUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each week or every X weeks if a factor is given. + * @method float diffInUTCWeeks(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of weeks. + * @method CarbonInterface addUTCMonths(int|float $value = 1) Add months (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addUTCMonth() Add one month to the instance (using timestamp). + * @method CarbonInterface subUTCMonths(int|float $value = 1) Sub months (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subUTCMonth() Sub one month to the instance (using timestamp). + * @method CarbonPeriod monthsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each month or every X months if a factor is given. + * @method float diffInUTCMonths(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of months. + * @method CarbonInterface addUTCQuarters(int|float $value = 1) Add quarters (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addUTCQuarter() Add one quarter to the instance (using timestamp). + * @method CarbonInterface subUTCQuarters(int|float $value = 1) Sub quarters (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subUTCQuarter() Sub one quarter to the instance (using timestamp). + * @method CarbonPeriod quartersUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each quarter or every X quarters if a factor is given. + * @method float diffInUTCQuarters(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of quarters. + * @method CarbonInterface addUTCYears(int|float $value = 1) Add years (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addUTCYear() Add one year to the instance (using timestamp). + * @method CarbonInterface subUTCYears(int|float $value = 1) Sub years (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subUTCYear() Sub one year to the instance (using timestamp). + * @method CarbonPeriod yearsUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each year or every X years if a factor is given. + * @method float diffInUTCYears(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of years. + * @method CarbonInterface addUTCDecades(int|float $value = 1) Add decades (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addUTCDecade() Add one decade to the instance (using timestamp). + * @method CarbonInterface subUTCDecades(int|float $value = 1) Sub decades (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subUTCDecade() Sub one decade to the instance (using timestamp). + * @method CarbonPeriod decadesUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each decade or every X decades if a factor is given. + * @method float diffInUTCDecades(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of decades. + * @method CarbonInterface addUTCCenturies(int|float $value = 1) Add centuries (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addUTCCentury() Add one century to the instance (using timestamp). + * @method CarbonInterface subUTCCenturies(int|float $value = 1) Sub centuries (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subUTCCentury() Sub one century to the instance (using timestamp). + * @method CarbonPeriod centuriesUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each century or every X centuries if a factor is given. + * @method float diffInUTCCenturies(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of centuries. + * @method CarbonInterface addUTCMillennia(int|float $value = 1) Add millennia (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addUTCMillennium() Add one millennium to the instance (using timestamp). + * @method CarbonInterface subUTCMillennia(int|float $value = 1) Sub millennia (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subUTCMillennium() Sub one millennium to the instance (using timestamp). + * @method CarbonPeriod millenniaUntil($endDate = null, int|float $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millennium or every X millennia if a factor is given. + * @method float diffInUTCMillennia(DateTimeInterface|string|null $date, bool $absolute = false) Convert current and given date in UTC timezone and return a floating number of millennia. + * @method CarbonInterface roundYear(float $precision = 1, string $function = "round") Round the current instance year with given precision using the given function. + * @method CarbonInterface roundYears(float $precision = 1, string $function = "round") Round the current instance year with given precision using the given function. + * @method CarbonInterface floorYear(float $precision = 1) Truncate the current instance year with given precision. + * @method CarbonInterface floorYears(float $precision = 1) Truncate the current instance year with given precision. + * @method CarbonInterface ceilYear(float $precision = 1) Ceil the current instance year with given precision. + * @method CarbonInterface ceilYears(float $precision = 1) Ceil the current instance year with given precision. + * @method CarbonInterface roundMonth(float $precision = 1, string $function = "round") Round the current instance month with given precision using the given function. + * @method CarbonInterface roundMonths(float $precision = 1, string $function = "round") Round the current instance month with given precision using the given function. + * @method CarbonInterface floorMonth(float $precision = 1) Truncate the current instance month with given precision. + * @method CarbonInterface floorMonths(float $precision = 1) Truncate the current instance month with given precision. + * @method CarbonInterface ceilMonth(float $precision = 1) Ceil the current instance month with given precision. + * @method CarbonInterface ceilMonths(float $precision = 1) Ceil the current instance month with given precision. + * @method CarbonInterface roundDay(float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. + * @method CarbonInterface roundDays(float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. + * @method CarbonInterface floorDay(float $precision = 1) Truncate the current instance day with given precision. + * @method CarbonInterface floorDays(float $precision = 1) Truncate the current instance day with given precision. + * @method CarbonInterface ceilDay(float $precision = 1) Ceil the current instance day with given precision. + * @method CarbonInterface ceilDays(float $precision = 1) Ceil the current instance day with given precision. + * @method CarbonInterface roundHour(float $precision = 1, string $function = "round") Round the current instance hour with given precision using the given function. + * @method CarbonInterface roundHours(float $precision = 1, string $function = "round") Round the current instance hour with given precision using the given function. + * @method CarbonInterface floorHour(float $precision = 1) Truncate the current instance hour with given precision. + * @method CarbonInterface floorHours(float $precision = 1) Truncate the current instance hour with given precision. + * @method CarbonInterface ceilHour(float $precision = 1) Ceil the current instance hour with given precision. + * @method CarbonInterface ceilHours(float $precision = 1) Ceil the current instance hour with given precision. + * @method CarbonInterface roundMinute(float $precision = 1, string $function = "round") Round the current instance minute with given precision using the given function. + * @method CarbonInterface roundMinutes(float $precision = 1, string $function = "round") Round the current instance minute with given precision using the given function. + * @method CarbonInterface floorMinute(float $precision = 1) Truncate the current instance minute with given precision. + * @method CarbonInterface floorMinutes(float $precision = 1) Truncate the current instance minute with given precision. + * @method CarbonInterface ceilMinute(float $precision = 1) Ceil the current instance minute with given precision. + * @method CarbonInterface ceilMinutes(float $precision = 1) Ceil the current instance minute with given precision. + * @method CarbonInterface roundSecond(float $precision = 1, string $function = "round") Round the current instance second with given precision using the given function. + * @method CarbonInterface roundSeconds(float $precision = 1, string $function = "round") Round the current instance second with given precision using the given function. + * @method CarbonInterface floorSecond(float $precision = 1) Truncate the current instance second with given precision. + * @method CarbonInterface floorSeconds(float $precision = 1) Truncate the current instance second with given precision. + * @method CarbonInterface ceilSecond(float $precision = 1) Ceil the current instance second with given precision. + * @method CarbonInterface ceilSeconds(float $precision = 1) Ceil the current instance second with given precision. + * @method CarbonInterface roundMillennium(float $precision = 1, string $function = "round") Round the current instance millennium with given precision using the given function. + * @method CarbonInterface roundMillennia(float $precision = 1, string $function = "round") Round the current instance millennium with given precision using the given function. + * @method CarbonInterface floorMillennium(float $precision = 1) Truncate the current instance millennium with given precision. + * @method CarbonInterface floorMillennia(float $precision = 1) Truncate the current instance millennium with given precision. + * @method CarbonInterface ceilMillennium(float $precision = 1) Ceil the current instance millennium with given precision. + * @method CarbonInterface ceilMillennia(float $precision = 1) Ceil the current instance millennium with given precision. + * @method CarbonInterface roundCentury(float $precision = 1, string $function = "round") Round the current instance century with given precision using the given function. + * @method CarbonInterface roundCenturies(float $precision = 1, string $function = "round") Round the current instance century with given precision using the given function. + * @method CarbonInterface floorCentury(float $precision = 1) Truncate the current instance century with given precision. + * @method CarbonInterface floorCenturies(float $precision = 1) Truncate the current instance century with given precision. + * @method CarbonInterface ceilCentury(float $precision = 1) Ceil the current instance century with given precision. + * @method CarbonInterface ceilCenturies(float $precision = 1) Ceil the current instance century with given precision. + * @method CarbonInterface roundDecade(float $precision = 1, string $function = "round") Round the current instance decade with given precision using the given function. + * @method CarbonInterface roundDecades(float $precision = 1, string $function = "round") Round the current instance decade with given precision using the given function. + * @method CarbonInterface floorDecade(float $precision = 1) Truncate the current instance decade with given precision. + * @method CarbonInterface floorDecades(float $precision = 1) Truncate the current instance decade with given precision. + * @method CarbonInterface ceilDecade(float $precision = 1) Ceil the current instance decade with given precision. + * @method CarbonInterface ceilDecades(float $precision = 1) Ceil the current instance decade with given precision. + * @method CarbonInterface roundQuarter(float $precision = 1, string $function = "round") Round the current instance quarter with given precision using the given function. + * @method CarbonInterface roundQuarters(float $precision = 1, string $function = "round") Round the current instance quarter with given precision using the given function. + * @method CarbonInterface floorQuarter(float $precision = 1) Truncate the current instance quarter with given precision. + * @method CarbonInterface floorQuarters(float $precision = 1) Truncate the current instance quarter with given precision. + * @method CarbonInterface ceilQuarter(float $precision = 1) Ceil the current instance quarter with given precision. + * @method CarbonInterface ceilQuarters(float $precision = 1) Ceil the current instance quarter with given precision. + * @method CarbonInterface roundMillisecond(float $precision = 1, string $function = "round") Round the current instance millisecond with given precision using the given function. + * @method CarbonInterface roundMilliseconds(float $precision = 1, string $function = "round") Round the current instance millisecond with given precision using the given function. + * @method CarbonInterface floorMillisecond(float $precision = 1) Truncate the current instance millisecond with given precision. + * @method CarbonInterface floorMilliseconds(float $precision = 1) Truncate the current instance millisecond with given precision. + * @method CarbonInterface ceilMillisecond(float $precision = 1) Ceil the current instance millisecond with given precision. + * @method CarbonInterface ceilMilliseconds(float $precision = 1) Ceil the current instance millisecond with given precision. + * @method CarbonInterface roundMicrosecond(float $precision = 1, string $function = "round") Round the current instance microsecond with given precision using the given function. + * @method CarbonInterface roundMicroseconds(float $precision = 1, string $function = "round") Round the current instance microsecond with given precision using the given function. + * @method CarbonInterface floorMicrosecond(float $precision = 1) Truncate the current instance microsecond with given precision. + * @method CarbonInterface floorMicroseconds(float $precision = 1) Truncate the current instance microsecond with given precision. + * @method CarbonInterface ceilMicrosecond(float $precision = 1) Ceil the current instance microsecond with given precision. + * @method CarbonInterface ceilMicroseconds(float $precision = 1) Ceil the current instance microsecond with given precision. + * @method string shortAbsoluteDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'Absolute' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string longAbsoluteDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'Absolute' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string shortRelativeDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'Relative' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string longRelativeDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'Relative' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string shortRelativeToNowDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'RelativeToNow' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string longRelativeToNowDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'RelativeToNow' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string shortRelativeToOtherDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'RelativeToOther' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string longRelativeToOtherDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'RelativeToOther' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method int centuriesInMillennium() Return the number of centuries contained in the current millennium + * @method int|static centuryOfMillennium(?int $century = null) Return the value of the century starting from the beginning of the current millennium when called with no parameters, change the current century when called with an integer value + * @method int|static dayOfCentury(?int $day = null) Return the value of the day starting from the beginning of the current century when called with no parameters, change the current day when called with an integer value + * @method int|static dayOfDecade(?int $day = null) Return the value of the day starting from the beginning of the current decade when called with no parameters, change the current day when called with an integer value + * @method int|static dayOfMillennium(?int $day = null) Return the value of the day starting from the beginning of the current millennium when called with no parameters, change the current day when called with an integer value + * @method int|static dayOfMonth(?int $day = null) Return the value of the day starting from the beginning of the current month when called with no parameters, change the current day when called with an integer value + * @method int|static dayOfQuarter(?int $day = null) Return the value of the day starting from the beginning of the current quarter when called with no parameters, change the current day when called with an integer value + * @method int|static dayOfWeek(?int $day = null) Return the value of the day starting from the beginning of the current week when called with no parameters, change the current day when called with an integer value + * @method int daysInCentury() Return the number of days contained in the current century + * @method int daysInDecade() Return the number of days contained in the current decade + * @method int daysInMillennium() Return the number of days contained in the current millennium + * @method int daysInMonth() Return the number of days contained in the current month + * @method int daysInQuarter() Return the number of days contained in the current quarter + * @method int daysInWeek() Return the number of days contained in the current week + * @method int daysInYear() Return the number of days contained in the current year + * @method int|static decadeOfCentury(?int $decade = null) Return the value of the decade starting from the beginning of the current century when called with no parameters, change the current decade when called with an integer value + * @method int|static decadeOfMillennium(?int $decade = null) Return the value of the decade starting from the beginning of the current millennium when called with no parameters, change the current decade when called with an integer value + * @method int decadesInCentury() Return the number of decades contained in the current century + * @method int decadesInMillennium() Return the number of decades contained in the current millennium + * @method int|static hourOfCentury(?int $hour = null) Return the value of the hour starting from the beginning of the current century when called with no parameters, change the current hour when called with an integer value + * @method int|static hourOfDay(?int $hour = null) Return the value of the hour starting from the beginning of the current day when called with no parameters, change the current hour when called with an integer value + * @method int|static hourOfDecade(?int $hour = null) Return the value of the hour starting from the beginning of the current decade when called with no parameters, change the current hour when called with an integer value + * @method int|static hourOfMillennium(?int $hour = null) Return the value of the hour starting from the beginning of the current millennium when called with no parameters, change the current hour when called with an integer value + * @method int|static hourOfMonth(?int $hour = null) Return the value of the hour starting from the beginning of the current month when called with no parameters, change the current hour when called with an integer value + * @method int|static hourOfQuarter(?int $hour = null) Return the value of the hour starting from the beginning of the current quarter when called with no parameters, change the current hour when called with an integer value + * @method int|static hourOfWeek(?int $hour = null) Return the value of the hour starting from the beginning of the current week when called with no parameters, change the current hour when called with an integer value + * @method int|static hourOfYear(?int $hour = null) Return the value of the hour starting from the beginning of the current year when called with no parameters, change the current hour when called with an integer value + * @method int hoursInCentury() Return the number of hours contained in the current century + * @method int hoursInDay() Return the number of hours contained in the current day + * @method int hoursInDecade() Return the number of hours contained in the current decade + * @method int hoursInMillennium() Return the number of hours contained in the current millennium + * @method int hoursInMonth() Return the number of hours contained in the current month + * @method int hoursInQuarter() Return the number of hours contained in the current quarter + * @method int hoursInWeek() Return the number of hours contained in the current week + * @method int hoursInYear() Return the number of hours contained in the current year + * @method int|static microsecondOfCentury(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current century when called with no parameters, change the current microsecond when called with an integer value + * @method int|static microsecondOfDay(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current day when called with no parameters, change the current microsecond when called with an integer value + * @method int|static microsecondOfDecade(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current decade when called with no parameters, change the current microsecond when called with an integer value + * @method int|static microsecondOfHour(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current hour when called with no parameters, change the current microsecond when called with an integer value + * @method int|static microsecondOfMillennium(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current millennium when called with no parameters, change the current microsecond when called with an integer value + * @method int|static microsecondOfMillisecond(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current millisecond when called with no parameters, change the current microsecond when called with an integer value + * @method int|static microsecondOfMinute(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current minute when called with no parameters, change the current microsecond when called with an integer value + * @method int|static microsecondOfMonth(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current month when called with no parameters, change the current microsecond when called with an integer value + * @method int|static microsecondOfQuarter(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current quarter when called with no parameters, change the current microsecond when called with an integer value + * @method int|static microsecondOfSecond(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current second when called with no parameters, change the current microsecond when called with an integer value + * @method int|static microsecondOfWeek(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current week when called with no parameters, change the current microsecond when called with an integer value + * @method int|static microsecondOfYear(?int $microsecond = null) Return the value of the microsecond starting from the beginning of the current year when called with no parameters, change the current microsecond when called with an integer value + * @method int microsecondsInCentury() Return the number of microseconds contained in the current century + * @method int microsecondsInDay() Return the number of microseconds contained in the current day + * @method int microsecondsInDecade() Return the number of microseconds contained in the current decade + * @method int microsecondsInHour() Return the number of microseconds contained in the current hour + * @method int microsecondsInMillennium() Return the number of microseconds contained in the current millennium + * @method int microsecondsInMillisecond() Return the number of microseconds contained in the current millisecond + * @method int microsecondsInMinute() Return the number of microseconds contained in the current minute + * @method int microsecondsInMonth() Return the number of microseconds contained in the current month + * @method int microsecondsInQuarter() Return the number of microseconds contained in the current quarter + * @method int microsecondsInSecond() Return the number of microseconds contained in the current second + * @method int microsecondsInWeek() Return the number of microseconds contained in the current week + * @method int microsecondsInYear() Return the number of microseconds contained in the current year + * @method int|static millisecondOfCentury(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current century when called with no parameters, change the current millisecond when called with an integer value + * @method int|static millisecondOfDay(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current day when called with no parameters, change the current millisecond when called with an integer value + * @method int|static millisecondOfDecade(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current decade when called with no parameters, change the current millisecond when called with an integer value + * @method int|static millisecondOfHour(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current hour when called with no parameters, change the current millisecond when called with an integer value + * @method int|static millisecondOfMillennium(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current millennium when called with no parameters, change the current millisecond when called with an integer value + * @method int|static millisecondOfMinute(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current minute when called with no parameters, change the current millisecond when called with an integer value + * @method int|static millisecondOfMonth(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current month when called with no parameters, change the current millisecond when called with an integer value + * @method int|static millisecondOfQuarter(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current quarter when called with no parameters, change the current millisecond when called with an integer value + * @method int|static millisecondOfSecond(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current second when called with no parameters, change the current millisecond when called with an integer value + * @method int|static millisecondOfWeek(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current week when called with no parameters, change the current millisecond when called with an integer value + * @method int|static millisecondOfYear(?int $millisecond = null) Return the value of the millisecond starting from the beginning of the current year when called with no parameters, change the current millisecond when called with an integer value + * @method int millisecondsInCentury() Return the number of milliseconds contained in the current century + * @method int millisecondsInDay() Return the number of milliseconds contained in the current day + * @method int millisecondsInDecade() Return the number of milliseconds contained in the current decade + * @method int millisecondsInHour() Return the number of milliseconds contained in the current hour + * @method int millisecondsInMillennium() Return the number of milliseconds contained in the current millennium + * @method int millisecondsInMinute() Return the number of milliseconds contained in the current minute + * @method int millisecondsInMonth() Return the number of milliseconds contained in the current month + * @method int millisecondsInQuarter() Return the number of milliseconds contained in the current quarter + * @method int millisecondsInSecond() Return the number of milliseconds contained in the current second + * @method int millisecondsInWeek() Return the number of milliseconds contained in the current week + * @method int millisecondsInYear() Return the number of milliseconds contained in the current year + * @method int|static minuteOfCentury(?int $minute = null) Return the value of the minute starting from the beginning of the current century when called with no parameters, change the current minute when called with an integer value + * @method int|static minuteOfDay(?int $minute = null) Return the value of the minute starting from the beginning of the current day when called with no parameters, change the current minute when called with an integer value + * @method int|static minuteOfDecade(?int $minute = null) Return the value of the minute starting from the beginning of the current decade when called with no parameters, change the current minute when called with an integer value + * @method int|static minuteOfHour(?int $minute = null) Return the value of the minute starting from the beginning of the current hour when called with no parameters, change the current minute when called with an integer value + * @method int|static minuteOfMillennium(?int $minute = null) Return the value of the minute starting from the beginning of the current millennium when called with no parameters, change the current minute when called with an integer value + * @method int|static minuteOfMonth(?int $minute = null) Return the value of the minute starting from the beginning of the current month when called with no parameters, change the current minute when called with an integer value + * @method int|static minuteOfQuarter(?int $minute = null) Return the value of the minute starting from the beginning of the current quarter when called with no parameters, change the current minute when called with an integer value + * @method int|static minuteOfWeek(?int $minute = null) Return the value of the minute starting from the beginning of the current week when called with no parameters, change the current minute when called with an integer value + * @method int|static minuteOfYear(?int $minute = null) Return the value of the minute starting from the beginning of the current year when called with no parameters, change the current minute when called with an integer value + * @method int minutesInCentury() Return the number of minutes contained in the current century + * @method int minutesInDay() Return the number of minutes contained in the current day + * @method int minutesInDecade() Return the number of minutes contained in the current decade + * @method int minutesInHour() Return the number of minutes contained in the current hour + * @method int minutesInMillennium() Return the number of minutes contained in the current millennium + * @method int minutesInMonth() Return the number of minutes contained in the current month + * @method int minutesInQuarter() Return the number of minutes contained in the current quarter + * @method int minutesInWeek() Return the number of minutes contained in the current week + * @method int minutesInYear() Return the number of minutes contained in the current year + * @method int|static monthOfCentury(?int $month = null) Return the value of the month starting from the beginning of the current century when called with no parameters, change the current month when called with an integer value + * @method int|static monthOfDecade(?int $month = null) Return the value of the month starting from the beginning of the current decade when called with no parameters, change the current month when called with an integer value + * @method int|static monthOfMillennium(?int $month = null) Return the value of the month starting from the beginning of the current millennium when called with no parameters, change the current month when called with an integer value + * @method int|static monthOfQuarter(?int $month = null) Return the value of the month starting from the beginning of the current quarter when called with no parameters, change the current month when called with an integer value + * @method int|static monthOfYear(?int $month = null) Return the value of the month starting from the beginning of the current year when called with no parameters, change the current month when called with an integer value + * @method int monthsInCentury() Return the number of months contained in the current century + * @method int monthsInDecade() Return the number of months contained in the current decade + * @method int monthsInMillennium() Return the number of months contained in the current millennium + * @method int monthsInQuarter() Return the number of months contained in the current quarter + * @method int monthsInYear() Return the number of months contained in the current year + * @method int|static quarterOfCentury(?int $quarter = null) Return the value of the quarter starting from the beginning of the current century when called with no parameters, change the current quarter when called with an integer value + * @method int|static quarterOfDecade(?int $quarter = null) Return the value of the quarter starting from the beginning of the current decade when called with no parameters, change the current quarter when called with an integer value + * @method int|static quarterOfMillennium(?int $quarter = null) Return the value of the quarter starting from the beginning of the current millennium when called with no parameters, change the current quarter when called with an integer value + * @method int|static quarterOfYear(?int $quarter = null) Return the value of the quarter starting from the beginning of the current year when called with no parameters, change the current quarter when called with an integer value + * @method int quartersInCentury() Return the number of quarters contained in the current century + * @method int quartersInDecade() Return the number of quarters contained in the current decade + * @method int quartersInMillennium() Return the number of quarters contained in the current millennium + * @method int quartersInYear() Return the number of quarters contained in the current year + * @method int|static secondOfCentury(?int $second = null) Return the value of the second starting from the beginning of the current century when called with no parameters, change the current second when called with an integer value + * @method int|static secondOfDay(?int $second = null) Return the value of the second starting from the beginning of the current day when called with no parameters, change the current second when called with an integer value + * @method int|static secondOfDecade(?int $second = null) Return the value of the second starting from the beginning of the current decade when called with no parameters, change the current second when called with an integer value + * @method int|static secondOfHour(?int $second = null) Return the value of the second starting from the beginning of the current hour when called with no parameters, change the current second when called with an integer value + * @method int|static secondOfMillennium(?int $second = null) Return the value of the second starting from the beginning of the current millennium when called with no parameters, change the current second when called with an integer value + * @method int|static secondOfMinute(?int $second = null) Return the value of the second starting from the beginning of the current minute when called with no parameters, change the current second when called with an integer value + * @method int|static secondOfMonth(?int $second = null) Return the value of the second starting from the beginning of the current month when called with no parameters, change the current second when called with an integer value + * @method int|static secondOfQuarter(?int $second = null) Return the value of the second starting from the beginning of the current quarter when called with no parameters, change the current second when called with an integer value + * @method int|static secondOfWeek(?int $second = null) Return the value of the second starting from the beginning of the current week when called with no parameters, change the current second when called with an integer value + * @method int|static secondOfYear(?int $second = null) Return the value of the second starting from the beginning of the current year when called with no parameters, change the current second when called with an integer value + * @method int secondsInCentury() Return the number of seconds contained in the current century + * @method int secondsInDay() Return the number of seconds contained in the current day + * @method int secondsInDecade() Return the number of seconds contained in the current decade + * @method int secondsInHour() Return the number of seconds contained in the current hour + * @method int secondsInMillennium() Return the number of seconds contained in the current millennium + * @method int secondsInMinute() Return the number of seconds contained in the current minute + * @method int secondsInMonth() Return the number of seconds contained in the current month + * @method int secondsInQuarter() Return the number of seconds contained in the current quarter + * @method int secondsInWeek() Return the number of seconds contained in the current week + * @method int secondsInYear() Return the number of seconds contained in the current year + * @method int|static weekOfCentury(?int $week = null) Return the value of the week starting from the beginning of the current century when called with no parameters, change the current week when called with an integer value + * @method int|static weekOfDecade(?int $week = null) Return the value of the week starting from the beginning of the current decade when called with no parameters, change the current week when called with an integer value + * @method int|static weekOfMillennium(?int $week = null) Return the value of the week starting from the beginning of the current millennium when called with no parameters, change the current week when called with an integer value + * @method int|static weekOfMonth(?int $week = null) Return the value of the week starting from the beginning of the current month when called with no parameters, change the current week when called with an integer value + * @method int|static weekOfQuarter(?int $week = null) Return the value of the week starting from the beginning of the current quarter when called with no parameters, change the current week when called with an integer value + * @method int|static weekOfYear(?int $week = null) Return the value of the week starting from the beginning of the current year when called with no parameters, change the current week when called with an integer value + * @method int weeksInCentury() Return the number of weeks contained in the current century + * @method int weeksInDecade() Return the number of weeks contained in the current decade + * @method int weeksInMillennium() Return the number of weeks contained in the current millennium + * @method int weeksInMonth() Return the number of weeks contained in the current month + * @method int weeksInQuarter() Return the number of weeks contained in the current quarter + * @method int|static yearOfCentury(?int $year = null) Return the value of the year starting from the beginning of the current century when called with no parameters, change the current year when called with an integer value + * @method int|static yearOfDecade(?int $year = null) Return the value of the year starting from the beginning of the current decade when called with no parameters, change the current year when called with an integer value + * @method int|static yearOfMillennium(?int $year = null) Return the value of the year starting from the beginning of the current millennium when called with no parameters, change the current year when called with an integer value + * @method int yearsInCentury() Return the number of years contained in the current century + * @method int yearsInDecade() Return the number of years contained in the current decade + * @method int yearsInMillennium() Return the number of years contained in the current millennium + * @method static plus(int $years = 0, int $months = 0, int|float $weeks = 0, int|float $days = 0, int|float $hours = 0, int|float $minutes = 0, int|float $seconds = 0, int|float $microseconds = 0, OverflowMode|bool|null $overflow = null, ?int $anchorDay = null) Add given amount of time to the current date. + * @method static minus(int $years = 0, int $months = 0, int|float $weeks = 0, int|float $days = 0, int|float $hours = 0, int|float $minutes = 0, int|float $seconds = 0, int|float $microseconds = 0, OverflowMode|bool|null $overflow = null, ?int $anchorDay = null) Subtract given amount of time to the current date. * * */ @@ -1380,6 +1383,10 @@ trait Date public function __set($name, $value) { if ($this->constructedObjectId === spl_object_hash($this)) { + if ($this->isImmutable()) { + throw ImmutableException::fromClass(static::class); + } + $this->set($name, $value); return; @@ -1389,24 +1396,22 @@ trait Date } /** - * Set a part of the Carbon object. + * Set one or multiple components of the Carbon object. * * @throws ImmutableException|UnknownSetterException * - * @return $this + * @return static */ public function set(Unit|array|string $name, DateTimeZone|Month|string|int|float|null $value = null): static { - if ($this->isImmutable()) { - throw new ImmutableException(\sprintf('%s class', static::class)); - } + $result = $this; if (\is_array($name)) { foreach ($name as $key => $value) { - $this->set($key, $value); + $result = $result->set($key, $value); } - return $this; + return $result; } $name = Unit::toName($name); @@ -1423,16 +1428,16 @@ trait Date } while ($value < 0) { - $this->subSecond(); + $result = $result->subSecond(); $value += static::MICROSECONDS_PER_SECOND; } while ($value >= static::MICROSECONDS_PER_SECOND) { - $this->addSecond(); + $result = $result->addSecond(); $value -= static::MICROSECONDS_PER_SECOND; } - $this->modify($this->rawFormat('H:i:s.').str_pad((string) round($value), 6, '0', STR_PAD_LEFT)); + $result = $result->modify($this->rawFormat('H:i:s.').str_pad((string) round($value), 6, '0', STR_PAD_LEFT)); break; @@ -1444,68 +1449,68 @@ trait Date case 'second': [$year, $month, $day, $hour, $minute, $second] = array_map('intval', explode('-', $this->rawFormat('Y-n-j-G-i-s'))); $$name = self::monthToInt($value, $name); - $this->setDateTime($year, $month, $day, $hour, $minute, $second); + $result = $result->setDateTime($year, $month, $day, $hour, $minute, $second); break; case 'week': - $this->week($value); + $result = $result->week($value); break; case 'isoWeek': - $this->isoWeek($value); + $result = $result->isoWeek($value); break; case 'weekYear': - $this->weekYear($value); + $result = $result->weekYear($value); break; case 'isoWeekYear': - $this->isoWeekYear($value); + $result = $result->isoWeekYear($value); break; case 'dayOfYear': - $this->addDays($value - $this->dayOfYear); + $result = $result->addDays($value - $this->dayOfYear); break; case 'dayOfWeek': - $this->addDays($value - $this->dayOfWeek); + $result = $result->addDays($value - $this->dayOfWeek); break; case 'dayOfWeekIso': - $this->addDays($value - $this->dayOfWeekIso); + $result = $result->addDays($value - $this->dayOfWeekIso); break; case 'timestamp': - $this->setTimestamp($value); + $result = $result->setTimestamp($value); break; case 'offset': - $this->setTimezone(static::safeCreateDateTimeZone($value / static::SECONDS_PER_MINUTE / static::MINUTES_PER_HOUR)); + $result = $result->setTimezone(static::safeCreateDateTimeZone($value / static::SECONDS_PER_MINUTE / static::MINUTES_PER_HOUR)); break; case 'offsetMinutes': - $this->setTimezone(static::safeCreateDateTimeZone($value / static::MINUTES_PER_HOUR)); + $result = $result->setTimezone(static::safeCreateDateTimeZone($value / static::MINUTES_PER_HOUR)); break; case 'offsetHours': - $this->setTimezone(static::safeCreateDateTimeZone($value)); + $result = $result->setTimezone(static::safeCreateDateTimeZone($value)); break; case 'timezone': case 'tz': - $this->setTimezone($value); + $result = $result->setTimezone($value); break; @@ -1521,14 +1526,14 @@ trait Date 'week', 'month', 'quarter', - ], true) ? 1 : 0) + (int) floor($start->diffInUnit($firstUnit, $this)); + ], true) ? 1 : 0) + (int) floor($start->diffInUnit($firstUnit, $result)); // We check $value a posteriori to give precedence to UnknownUnitException if (!\is_int($value)) { throw new UnitException("->$name expects integer value"); } - $this->addUnit($firstUnit, $value - $currentValue); + $result = $result->addUnit($firstUnit, $value - $currentValue); break; } catch (UnknownUnitException) { @@ -1539,7 +1544,7 @@ trait Date $macro = $this->getLocalMacro('set'.ucfirst($name)); if ($macro) { - $this->executeCallableWithContext($macro, $value); + $result = $result->executeCallableWithContext($macro, $value) ?? $this; break; } @@ -1548,10 +1553,10 @@ trait Date throw new UnknownSetterException($name); } - $this->$name = $value; + $result->$name = $value; } - return $this; + return $result; } /** @@ -1617,15 +1622,9 @@ trait Date /** * Get/set the day of year. * - * @template T of int|null - * * @param int|null $value new value for day of year if using as setter. * - * @psalm-param T $value - * - * @return static|int - * - * @psalm-return (T is int ? static : int) + * @return ($value is null ? int : static) */ public function dayOfYear(?int $value = null): static|int { @@ -1638,6 +1637,8 @@ trait Date * Get/set the weekday from 0 (Sunday) to 6 (Saturday). * * @param WeekDay|int|null $value new value for weekday if using as setter. + * + * @return ($value is null ? int : static) */ public function weekday(WeekDay|int|null $value = null): static|int { @@ -1655,6 +1656,8 @@ trait Date * Get/set the ISO weekday from 1 (Monday) to 7 (Sunday). * * @param WeekDay|int|null $value new value for weekday if using as setter. + * + * @return ($value is null ? int : static) */ public function isoWeekday(WeekDay|int|null $value = null): static|int { @@ -1695,12 +1698,20 @@ trait Date /** * Set any unit to a new value without overflowing current other unit given. * - * @param string $valueUnit unit name to modify - * @param int $value new value for the input unit - * @param string $overflowUnit unit name to not overflow + * @param Unit|string $valueUnit unit name to modify + * @param int $value new value for the input unit + * @param Unit|string $overflowUnit unit name to not overflow + * @param ?int $anchorDay set day to this value after modification */ - public function setUnitNoOverflow(string $valueUnit, int $value, string $overflowUnit): static - { + public function setUnitNoOverflow( + Unit|string $valueUnit, + int $value, + Unit|string $overflowUnit, + ?int $anchorDay = null, + ): static { + $valueUnit = Unit::toName($valueUnit); + $overflowUnit = Unit::toName($overflowUnit); + try { $start = $this->avoidMutation()->startOf($overflowUnit); $end = $this->avoidMutation()->endOf($overflowUnit); @@ -1708,14 +1719,14 @@ trait Date $date = $this->$valueUnit($value); if ($date < $start) { - return $date->mutateIfMutable($start); + return $date->mutateIfMutable($start)->setAnchorDayIfNotNull($anchorDay); } if ($date > $end) { - return $date->mutateIfMutable($end); + return $date->mutateIfMutable($end)->setAnchorDayIfNotNull($anchorDay); } - return $date; + return $date->setAnchorDayIfNotNull($anchorDay); } catch (BadMethodCallException | ReflectionException $exception) { throw new UnknownUnitException($valueUnit, 0, $exception); } @@ -1724,29 +1735,45 @@ trait Date /** * Add any unit to a new value without overflowing current other unit given. * - * @param string $valueUnit unit name to modify - * @param int $value amount to add to the input unit - * @param string $overflowUnit unit name to not overflow + * @param Unit|string $valueUnit unit name to modify + * @param int $value amount to add to the input unit + * @param Unit|string $overflowUnit unit name to not overflow + * @param ?int $anchorDay set day to this value after modification */ - public function addUnitNoOverflow(string $valueUnit, int $value, string $overflowUnit): static - { - return $this->setUnitNoOverflow($valueUnit, $this->$valueUnit + $value, $overflowUnit); + public function addUnitNoOverflow( + Unit|string $valueUnit, + int $value, + Unit|string $overflowUnit, + ?int $anchorDay = null, + ): static { + $valueUnit = Unit::toName($valueUnit); + + return $this->setUnitNoOverflow($valueUnit, $this->$valueUnit + $value, $overflowUnit, $anchorDay); } /** * Subtract any unit to a new value without overflowing current other unit given. * - * @param string $valueUnit unit name to modify - * @param int $value amount to subtract to the input unit - * @param string $overflowUnit unit name to not overflow + * @param Unit|string $valueUnit unit name to modify + * @param int $value amount to subtract to the input unit + * @param Unit|string $overflowUnit unit name to not overflow + * @param ?int $anchorDay set day to this value after modification */ - public function subUnitNoOverflow(string $valueUnit, int $value, string $overflowUnit): static - { - return $this->setUnitNoOverflow($valueUnit, $this->$valueUnit - $value, $overflowUnit); + public function subUnitNoOverflow( + Unit|string $valueUnit, + int $value, + Unit|string $overflowUnit, + ?int $anchorDay = null, + ): static { + $valueUnit = Unit::toName($valueUnit); + + return $this->setUnitNoOverflow($valueUnit, $this->$valueUnit - $value, $overflowUnit, $anchorDay); } /** * Returns the minutes offset to UTC if no arguments passed, else set the timezone with given minutes shift passed. + * + * @return ($minuteOffset is null ? int : static) */ public function utcOffset(?int $minuteOffset = null): static|int { @@ -2495,11 +2522,20 @@ trait Date /** * Set specified unit to new given value. * - * @param string $unit year, month, day, hour, minute, second or microsecond - * @param Month|int $value new value for given unit + * @param string $unit year, month, day, hour, minute, second or microsecond + * @param Month|int|float|null $value new value for given unit + * @param OverflowMode|bool|null $overflow either overflow (when the day does not exist in current month) + * is allowed or not, or should use an anchor day + * @param ?int $anchorDay the day to which to go after setting year/quarter/month, + * if given but it does not exist in current month, it will + * go to the last day of the month */ - public function setUnit(string $unit, Month|int|float|null $value = null): static - { + public function setUnit( + string $unit, + Month|int|float|null $value = null, + OverflowMode|bool|null $overflow = null, + ?int $anchorDay = null, + ): static { if (\is_float($value)) { $int = (int) $value; @@ -2512,11 +2548,36 @@ trait Date $value = $int; } + $overflow = $this->getOverflowMode($overflow, $anchorDay); $unit = static::singularUnit($unit); $value = self::monthToInt($value, $unit); $dateUnits = ['year', 'month', 'day']; if (\in_array($unit, $dateUnits)) { + if ($unit !== 'day') { + $overflow ??= $this->shouldUnitOverflow($unit) + ? OverflowMode::Overflow + : OverflowMode::NoOverflow; + $anchorDay = match ($overflow) { + OverflowMode::AnchorDay => $anchorDay ?? $this->day, + OverflowMode::NoOverflow => $this->day, + default => null, + }; + + if ($anchorDay !== null) { + $date = $this->setDate(...array_map( + fn ($name) => (int) (match ($name) { + $unit => $value, + 'day' => 1, + default => $this->$name, + }), + $dateUnits, + )); + + return $date->day(min($anchorDay, $date->daysInMonth)); + } + } + return $this->setDate(...array_map( fn ($name) => (int) ($name === $unit ? $value : $this->$name), $dateUnits, @@ -2589,7 +2650,8 @@ trait Date { $unit = rtrim($method, 's'); - return $this->callDiffAlias($unit, $parameters) + return $this->callPlusOrMinus($method, $parameters) + ?? $this->callDiffAlias($unit, $parameters) ?? $this->callHumanDiffAlias($unit, $parameters) ?? $this->callRoundMethod($unit, $parameters) ?? $this->callIsMethod($unit, $parameters) @@ -2902,7 +2964,20 @@ trait Date } if (static::isModifiableUnit($unit)) { - return $this->{"{$action}Unit"}($unit, $this->getMagicParameter($parameters, 0, 'value', 1), $overflow); + $anchorDay = $this->getMagicParameter($parameters, 1, 'anchorDay', null); + + if ($anchorDay !== null && $overflow) { + throw new InvalidArgumentException( + '$anchorDay is not compatible with overflow', + ); + } + + return $this->{"{$action}Unit"}( + $unit, + $this->getMagicParameter($parameters, 0, 'value', 1), + $anchorDay === null ? $overflow : OverflowMode::AnchorDay, + $anchorDay, + ); } return null; @@ -2970,4 +3045,9 @@ trait Date ? $date : $this->modify('@'.$date->rawFormat('U.u'))->setTimezone($date->getTimezone()); } + + private function setAnchorDayIfNotNull(?int $anchorDay): static + { + return $anchorDay === null ? $this : $this->setAnchorDay($anchorDay); + } } diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Traits/IntervalStep.php b/plugins/vendor/nesbot/carbon/src/Carbon/Traits/IntervalStep.php index 2eaf9845..9e617708 100644 --- a/plugins/vendor/nesbot/carbon/src/Carbon/Traits/IntervalStep.php +++ b/plugins/vendor/nesbot/carbon/src/Carbon/Traits/IntervalStep.php @@ -13,6 +13,7 @@ declare(strict_types=1); namespace Carbon\Traits; +use BadMethodCallException; use Carbon\Callback; use Carbon\Carbon; use Carbon\CarbonImmutable; @@ -28,12 +29,12 @@ trait IntervalStep * * @var Closure|null */ - protected $step; + protected ?Closure $step = null; /** * Get the dynamic step in use. * - * @return Closure + * @return Closure|null */ public function getStep(): ?Closure { @@ -64,8 +65,7 @@ trait IntervalStep */ public function convertDate(DateTimeInterface $dateTime, bool $negated = false): CarbonInterface { - /** @var CarbonInterface $carbonDate */ - $carbonDate = $dateTime instanceof CarbonInterface ? $dateTime : $this->resolveCarbon($dateTime); + $carbonDate = $this->carbonOrResolve($dateTime); if ($this->step) { $carbonDate = Callback::parameter($this->step, $carbonDate->avoidMutation()); @@ -91,4 +91,23 @@ trait IntervalStep return Carbon::instance($dateTime); } + + private function carbonOrResolve(mixed $dateTime): CarbonInterface + { + return $dateTime instanceof CarbonInterface + ? $dateTime + : $this->resolveCarbon($dateTime); + } + + private function checkNoStepIsDefined(string $method): void + { + if ($this->step !== null) { + $chunks = explode('::', $method, 2); + $method = $chunks[1] ?? $method; + + throw new BadMethodCallException( + "->$method() cannot be called on an interval with a step", + ); + } + } } diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Traits/Localization.php b/plugins/vendor/nesbot/carbon/src/Carbon/Traits/Localization.php index 80aaa9a3..c503180b 100644 --- a/plugins/vendor/nesbot/carbon/src/Carbon/Traits/Localization.php +++ b/plugins/vendor/nesbot/carbon/src/Carbon/Traits/Localization.php @@ -345,7 +345,7 @@ trait Localization * @param string|null $locale * @param string ...$fallbackLocales * - * @return $this|string + * @return ($locale is null ? string : static) */ public function locale(?string $locale = null, string ...$fallbackLocales): static|string { @@ -407,7 +407,16 @@ trait Localization $translator = static::getTranslator(); if (method_exists($translator, 'setFallbackLocales')) { - $translator->setFallbackLocales([$locale]); + $fallbackLocales = [$locale]; + + if ( + method_exists($translator, 'getFallbackLocales') + && $fallbackLocales === $translator->getFallbackLocales() + ) { + return; + } + + $translator->setFallbackLocales($fallbackLocales); if ($translator instanceof Translator) { $preferredLocale = $translator->getLocale(); diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Traits/Test.php b/plugins/vendor/nesbot/carbon/src/Carbon/Traits/Test.php index a2b9f0a5..ecf76649 100644 --- a/plugins/vendor/nesbot/carbon/src/Carbon/Traits/Test.php +++ b/plugins/vendor/nesbot/carbon/src/Carbon/Traits/Test.php @@ -30,16 +30,13 @@ trait Test /** * Set a Carbon instance (real or mock) to be returned when a "now" - * instance is created. The provided instance will be returned + * instance is created. The provided instance will be returned * specifically under the following conditions: * - A call to the static now() method, ex. Carbon::now() * - When a null (or blank string) is passed to the constructor or parse(), ex. new Carbon(null) * - When the string "now" is passed to the constructor or parse(), ex. new Carbon('now') * - When a string containing the desired time is passed to Carbon::parse(). * - * Note the timezone parameter was left out of the examples above and - * has no affect as the mock value will be returned regardless of its value. - * * Only the moment is mocked with setTestNow(), the timezone will still be the one passed * as parameter of date_default_timezone_get() as a fallback (see setTestNowAndTimezone()). * @@ -57,7 +54,7 @@ trait Test /** * Set a Carbon instance (real or mock) to be returned when a "now" - * instance is created. The provided instance will be returned + * instance is created. The provided instance will be returned * specifically under the following conditions: * - A call to the static now() method, ex. Carbon::now() * - When a null (or blank string) is passed to the constructor or parse(), ex. new Carbon(null) diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Traits/Units.php b/plugins/vendor/nesbot/carbon/src/Carbon/Traits/Units.php index 07eccd69..9ce35338 100644 --- a/plugins/vendor/nesbot/carbon/src/Carbon/Traits/Units.php +++ b/plugins/vendor/nesbot/carbon/src/Carbon/Traits/Units.php @@ -20,10 +20,12 @@ use Carbon\Exceptions\InvalidFormatException; use Carbon\Exceptions\InvalidIntervalException; use Carbon\Exceptions\UnitException; use Carbon\Exceptions\UnsupportedUnitException; +use Carbon\OverflowMode; use Carbon\Unit; use Closure; use DateInterval; use DateMalformedStringException; +use InvalidArgumentException; use ReturnTypeWillChange; /** @@ -244,12 +246,13 @@ trait Units * * @param Unit|int|string|DateInterval|Closure|CarbonConverterInterface $unit * @param Unit|int|float|string $value - * @param bool|null $overflow + * @param OverflowMode|bool|null $overflow + * @param int|null $anchorDay * * @return static */ #[ReturnTypeWillChange] - public function add($unit, $value = 1, ?bool $overflow = null): static + public function add($unit, $value = 1, OverflowMode|bool|null $overflow = null, ?int $anchorDay = null): static { $unit = Unit::toNameIfUnit($unit); $value = Unit::toNameIfUnit($value); @@ -263,7 +266,14 @@ trait Units } if ($unit instanceof Closure) { - $result = $this->resolveCarbon($unit($this, false)); + $inverted = ($value < 0); + $result = $this; + + self::disallowDecimalPart($value); + + for ($i = abs($value); $i > 0; $i--) { + $result = $result->resolveCarbon($unit($result, $inverted)); + } if ($this !== $result && $this->isMutable()) { return $this->modify($result->rawFormat('Y-m-d H:i:s.u e O')); @@ -280,16 +290,22 @@ trait Units [$value, $unit] = [$unit, $value]; } - return $this->addUnit((string) $unit, $value, $overflow); + return $this->addUnit((string) $unit, $value, $overflow, $anchorDay); } /** * Add given units to the current instance. */ - public function addUnit(Unit|string $unit, $value = 1, ?bool $overflow = null): static - { + public function addUnit( + Unit|string $unit, + $value = 1, + OverflowMode|bool|null $overflow = null, + ?int $anchorDay = null, + ): static { $unit = Unit::toName($unit); + $overflow = $this->getOverflowMode($overflow, $anchorDay); + $originalArgs = \func_get_args(); $date = $this; @@ -311,8 +327,13 @@ trait Units $value *= $factor; } + if ($overflow === OverflowMode::AnchorDay) { + $anchorDay ??= $date->day; + $overflow = OverflowMode::NoOverflow; + } + if ($unit === 'weekday') { - $weekendDays = $this->transmitFactory(static fn () => static::getWeekendDays()); + $weekendDays = $this->transmitFactory(static::getWeekendDays(...)); if ($weekendDays !== [static::SATURDAY, static::SUNDAY]) { $absoluteValue = abs($value); @@ -337,10 +358,9 @@ trait Units } elseif ($canOverflow = (\in_array($unit, [ 'month', 'year', - ]) && ($overflow === false || ( + ]) && ($overflow === OverflowMode::NoOverflow || ( $overflow === null && - ($ucUnit = ucfirst($unit).'s') && - !($this->{'local'.$ucUnit.'Overflow'} ?? static::{'shouldOverflow'.$ucUnit}()) + !$this->shouldUnitOverflow($unit) )))) { $day = $date->day; } @@ -355,10 +375,16 @@ trait Units try { $date = self::rawAddUnit($date, $unit, $value); - if (isset($timeString)) { - $date = $date?->setTimeFromTimeString($timeString); - } elseif (isset($canOverflow, $day) && $canOverflow && $day !== $date?->day) { - $date = $date?->modify('last day of previous month'); + if ($date !== null) { + if (isset($timeString)) { + $date = $date->setTimeFromTimeString($timeString); + } elseif (isset($canOverflow, $day) && $canOverflow && $day !== $date->day) { + $date = $date->modify('last day of previous month'); + } + + if ($anchorDay !== null) { + $date = $date->setAnchorDay($anchorDay); + } } } catch (DateMalformedStringException|InvalidFormatException|UnsupportedUnitException $exception) { $date = null; @@ -374,9 +400,13 @@ trait Units /** * Subtract given units to the current instance. */ - public function subUnit(Unit|string $unit, $value = 1, ?bool $overflow = null): static - { - return $this->addUnit($unit, -$value, $overflow); + public function subUnit( + Unit|string $unit, + $value = 1, + OverflowMode|bool|null $overflow = null, + ?int $anchorDay = null, + ): static { + return $this->addUnit($unit, -$value, $overflow, $anchorDay); } /** @@ -396,12 +426,13 @@ trait Units * * @param Unit|int|string|DateInterval|Closure|CarbonConverterInterface $unit * @param Unit|int|float|string $value - * @param bool|null $overflow + * @param OverflowMode|bool|null $overflow + * @param int|null $anchorDay * * @return static */ #[ReturnTypeWillChange] - public function sub($unit, $value = 1, ?bool $overflow = null): static + public function sub($unit, $value = 1, OverflowMode|bool|null $overflow = null, ?int $anchorDay = null): static { $unit = Unit::toNameIfUnit($unit); $value = Unit::toNameIfUnit($value); @@ -415,7 +446,14 @@ trait Units } if ($unit instanceof Closure) { - $result = $this->resolveCarbon($unit($this, true)); + $inverted = ($value < 0); + $result = $this; + + self::disallowDecimalPart($value); + + for ($i = abs($value); $i > 0; $i--) { + $result = $result->resolveCarbon($unit($result, !$inverted)); + } if ($this !== $result && $this->isMutable()) { return $this->modify($result->rawFormat('Y-m-d H:i:s.u e O')); @@ -432,7 +470,7 @@ trait Units [$value, $unit] = [$unit, $value]; } - return $this->addUnit((string) $unit, -(float) $value, $overflow); + return $this->addUnit((string) $unit, -(float) $value, $overflow, $anchorDay); } /** @@ -442,31 +480,163 @@ trait Units * * @param Unit|int|string|DateInterval $unit * @param Unit|int|float|string $value - * @param bool|null $overflow + * @param OverflowMode|bool|null $overflow + * @param int|null $anchorDay * * @return static */ - public function subtract($unit, $value = 1, ?bool $overflow = null): static + public function subtract($unit, $value = 1, OverflowMode|bool|null $overflow = null, ?int $anchorDay = null): static { if (\is_string($unit) && \func_num_args() === 1) { $unit = CarbonInterval::make($unit, [], true); } - return $this->sub($unit, $value, $overflow); + return $this->sub($unit, $value, $overflow, $anchorDay); + } + + /** + * Add given amount of time to the current date. + * + * @SuppressWarnings(ExcessiveParameterList) + */ + private function doPlus( + int $years = 0, + int $months = 0, + int|float $weeks = 0, + int|float $days = 0, + int|float $hours = 0, + int|float $minutes = 0, + int|float $seconds = 0, + int|float $microseconds = 0, + OverflowMode|bool|null $overflow = null, + ?int $anchorDay = null, + ): static { + return $this->addUnit(Unit::Year, $years, $overflow, $anchorDay) + ->addUnit(Unit::Month, $months, $overflow, $anchorDay) + ->add(" + $weeks weeks $days days + $hours hours $minutes minutes $seconds seconds $microseconds microseconds + "); + } + + /** + * Subtract given amount of time to the current date. + * + * @SuppressWarnings(ExcessiveParameterList) + */ + private function doMinus( + int $years = 0, + int $months = 0, + int|float $weeks = 0, + int|float $days = 0, + int|float $hours = 0, + int|float $minutes = 0, + int|float $seconds = 0, + int|float $microseconds = 0, + OverflowMode|bool|null $overflow = null, + ?int $anchorDay = null, + ): static { + return $this->subUnit(Unit::Year, $years, $overflow, $anchorDay) + ->subUnit(Unit::Month, $months, $overflow, $anchorDay) + ->sub(" + $weeks weeks $days days + $hours hours $minutes minutes $seconds seconds $microseconds microseconds + "); + } + + private function callPlusOrMinus(string $method, array $parameters): ?static + { + return match ($method) { + 'plus' => $this->doPlus(...$parameters), + 'minus' => $this->doMinus(...$parameters), + default => null, + }; } private static function rawAddUnit(self $date, string $unit, int|float $value): ?static { try { + $absoluteValue = abs($value); + return $date->rawAdd( - CarbonInterval::fromString(abs($value)." $unit")->invert($value < 0), + CarbonInterval::fromString(self::getNumberAsString($absoluteValue)." $unit") + ->invert($value < 0), ); } catch (InvalidIntervalException $exception) { try { - return $date->modify("$value $unit"); + return $date->modify(self::getNumberAsString($value)." $unit"); } catch (InvalidFormatException) { throw new UnsupportedUnitException($unit, previous: $exception); } } } + + private static function getNumberAsString(int|float $value): string + { + $stringValue = (string) $value; + + if ($value < -1 || $value > 1) { + if (str_contains($stringValue, 'E')) { + return number_format($value, 0, '.', ''); + } + + return $stringValue; + } + + if (str_contains($stringValue, 'E')) { + return number_format($value, 14, '.', ''); + } + + return $stringValue; + } + + /** + * Set current day of the instance to the passed value if it exits in the + * current month, else set current day to the last day of the month. + */ + public function setAnchorDay(int $anchorDay): static + { + if ($anchorDay < 1) { + throw new InvalidArgumentException('$anchorDay must be greater than 0'); + } + + return $this->day(min($anchorDay, $this->daysInMonth)); + } + + private static function disallowDecimalPart(mixed $value): void + { + if (((float) $value) !== ((float) (int) $value)) { + throw new InvalidArgumentException( + 'Interval objects cannot be multiplied by a non-integer value.', + ); + } + } + + private function getOverflowMode( + OverflowMode|bool|null $overflow = null, + ?int $anchorDay = null, + ): ?OverflowMode { + if ($anchorDay !== null) { + $overflow ??= OverflowMode::AnchorDay; + + if ($overflow !== OverflowMode::AnchorDay) { + throw new InvalidArgumentException( + '$anchorDay can be set only $overflow = OverflowMode::AnchorDay', + ); + } + } + + return match ($overflow) { + true => OverflowMode::Overflow, + false => OverflowMode::NoOverflow, + default => $overflow, + }; + } + + private function shouldUnitOverflow(string $unit): bool + { + $ucUnit = ucfirst($unit).'s'; + + return $this->{'local'.$ucUnit.'Overflow'} ?? static::{'shouldOverflow'.$ucUnit}(); + } } diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/TranslatorImmutable.php b/plugins/vendor/nesbot/carbon/src/Carbon/TranslatorImmutable.php index ab9933e5..2d7ecf23 100644 --- a/plugins/vendor/nesbot/carbon/src/Carbon/TranslatorImmutable.php +++ b/plugins/vendor/nesbot/carbon/src/Carbon/TranslatorImmutable.php @@ -94,7 +94,7 @@ class TranslatorImmutable extends Translator private function disallowMutation($method) { if ($this->constructed) { - throw new ImmutableException($method.' not allowed on '.static::class); + throw ImmutableException::fromMethod(static::class, $method); } } } diff --git a/plugins/vendor/symfony/http-foundation/AcceptHeader.php b/plugins/vendor/symfony/http-foundation/AcceptHeader.php deleted file mode 100644 index e735c756..00000000 --- a/plugins/vendor/symfony/http-foundation/AcceptHeader.php +++ /dev/null @@ -1,304 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation; - -// Help opcache.preload discover always-needed symbols -class_exists(AcceptHeaderItem::class); - -/** - * Represents an Accept-* header. - * - * An accept header is compound with a list of items, - * sorted by descending quality. - * - * @author Jean-François Simon - */ -class AcceptHeader -{ - /** - * @var array - */ - private array $items = []; - - private bool $sorted = true; - - /** - * @param AcceptHeaderItem[] $items - */ - public function __construct(array $items) - { - foreach ($items as $item) { - $this->add($item); - } - } - - /** - * Builds an AcceptHeader instance from a string. - */ - public static function fromString(?string $headerValue): self - { - $items = []; - foreach (HeaderUtils::split($headerValue ?? '', ',;=') as $i => $parts) { - $part = array_shift($parts); - $item = new AcceptHeaderItem($part[0], HeaderUtils::combine($parts)); - - $items[] = $item->setIndex($i); - } - - return new self($items); - } - - /** - * Returns header value's string representation. - */ - public function __toString(): string - { - return implode(',', $this->items); - } - - /** - * Tests if header has given value. - */ - public function has(string $value): bool - { - $canonicalKey = $this->getCanonicalKey(AcceptHeaderItem::fromString($value)); - - return isset($this->items[$canonicalKey]); - } - - /** - * Returns given value's item, if exists. - */ - public function get(string $value): ?AcceptHeaderItem - { - $queryItem = AcceptHeaderItem::fromString($value.';q=1'); - $canonicalKey = $this->getCanonicalKey($queryItem); - - if (isset($this->items[$canonicalKey])) { - return $this->items[$canonicalKey]; - } - - // Collect and filter matching candidates - if (!$candidates = array_filter($this->items, fn (AcceptHeaderItem $item) => $this->matches($item, $queryItem))) { - return null; - } - - usort( - $candidates, - fn ($a, $b) => $this->getSpecificity($b, $queryItem) <=> $this->getSpecificity($a, $queryItem) // Descending specificity - ?: $b->getQuality() <=> $a->getQuality() // Descending quality - ?: $a->getIndex() <=> $b->getIndex() // Ascending index (stability) - ); - - return reset($candidates); - } - - /** - * Adds an item. - * - * @return $this - */ - public function add(AcceptHeaderItem $item): static - { - $this->items[$this->getCanonicalKey($item)] = $item; - $this->sorted = false; - - return $this; - } - - /** - * Returns all items. - * - * @return AcceptHeaderItem[] - */ - public function all(): array - { - $this->sort(); - - return $this->items; - } - - /** - * Filters items on their value using given regex. - */ - public function filter(string $pattern): self - { - return new self(array_filter($this->items, static fn ($item) => preg_match($pattern, $item->getValue()))); - } - - /** - * Returns first item. - */ - public function first(): ?AcceptHeaderItem - { - $this->sort(); - - return $this->items ? reset($this->items) : null; - } - - /** - * Sorts items by descending quality. - */ - private function sort(): void - { - if (!$this->sorted) { - uasort($this->items, static fn ($a, $b) => $b->getQuality() <=> $a->getQuality() ?: $a->getIndex() <=> $b->getIndex()); - - $this->sorted = true; - } - } - - /** - * Generates the canonical key for storing/retrieving an item. - */ - private function getCanonicalKey(AcceptHeaderItem $item): string - { - $parts = []; - - // Normalize and sort attributes for consistent key generation - $attributes = $this->getMediaParams($item); - ksort($attributes); - - foreach ($attributes as $name => $value) { - if (null === $value) { - $parts[] = $name; // Flag parameter (e.g., "flowed") - continue; - } - - // Quote values containing spaces, commas, semicolons, or equals per RFC 9110 - // This handles cases like 'format="value with space"' or similar. - $quotedValue = \is_string($value) && preg_match('/[\s;,=]/', $value) ? '"'.addcslashes($value, '"\\').'"' : $value; - - $parts[] = $name.'='.$quotedValue; - } - - return $item->getValue().($parts ? ';'.implode(';', $parts) : ''); - } - - /** - * Checks if a given header item (range) matches a queried item (value). - * - * @param AcceptHeaderItem $rangeItem The item from the Accept header (e.g., text/*;format=flowed) - * @param AcceptHeaderItem $queryItem The item being queried (e.g., text/plain;format=flowed;charset=utf-8) - */ - private function matches(AcceptHeaderItem $rangeItem, AcceptHeaderItem $queryItem): bool - { - $rangeValue = strtolower($rangeItem->getValue()); - $queryValue = strtolower($queryItem->getValue()); - - // Handle universal wildcard ranges - if ('*' === $rangeValue || '*/*' === $rangeValue) { - return $this->rangeParametersMatch($rangeItem, $queryItem); - } - - // Queries for '*' only match wildcard ranges (handled above) - if ('*' === $queryValue) { - return false; - } - - // Ensure media vs. non-media consistency - $isQueryMedia = str_contains($queryValue, '/'); - $isRangeMedia = str_contains($rangeValue, '/'); - - if ($isQueryMedia !== $isRangeMedia) { - return false; - } - - // Non-media: exact match only (wildcards handled above) - if (!$isQueryMedia) { - return $rangeValue === $queryValue && $this->rangeParametersMatch($rangeItem, $queryItem); - } - - // Media type: type/subtype with wildcards - [$queryType, $querySubtype] = explode('/', $queryValue, 2); - [$rangeType, $rangeSubtype] = explode('/', $rangeValue, 2) + [1 => '*']; - - if ('*' !== $rangeType && $rangeType !== $queryType) { - return false; - } - - if ('*' !== $rangeSubtype && $rangeSubtype !== $querySubtype) { - return false; - } - - // Parameters must match - return $this->rangeParametersMatch($rangeItem, $queryItem); - } - - /** - * Checks if the parameters of a range item are satisfied by the query item. - * - * Parameters are case-insensitive; range params must be a subset of query params. - */ - private function rangeParametersMatch(AcceptHeaderItem $rangeItem, AcceptHeaderItem $queryItem): bool - { - $queryAttributes = $this->getMediaParams($queryItem); - $rangeAttributes = $this->getMediaParams($rangeItem); - - foreach ($rangeAttributes as $name => $rangeValue) { - if (!\array_key_exists($name, $queryAttributes)) { - return false; // Missing required param - } - - $queryValue = $queryAttributes[$name]; - - if (null === $rangeValue) { - return null === $queryValue; // Both flags or neither - } - - if (null === $queryValue || strtolower($queryValue) !== strtolower($rangeValue)) { - return false; - } - } - - return true; - } - - /** - * Calculates a specificity score for sorting: media precision + param count. - */ - private function getSpecificity(AcceptHeaderItem $item, AcceptHeaderItem $queryItem): int - { - $rangeValue = strtolower($item->getValue()); - $queryValue = strtolower($queryItem->getValue()); - - $paramCount = \count($this->getMediaParams($item)); - - $isQueryMedia = str_contains($queryValue, '/'); - $isRangeMedia = str_contains($rangeValue, '/'); - - if (!$isQueryMedia && !$isRangeMedia) { - return ('*' !== $rangeValue ? 2000 : 1000) + $paramCount; - } - - [$rangeType, $rangeSubtype] = explode('/', $rangeValue, 2) + [1 => '*']; - - $specificity = match (true) { - '*' !== $rangeSubtype => 3000, // Exact subtype (text/plain) - '*' !== $rangeType => 2000, // Type wildcard (text/*) - default => 1000, // Full wildcard (*/* or *) - }; - - return $specificity + $paramCount; - } - - /** - * Returns normalized attributes: keys lowercased, excluding 'q'. - */ - private function getMediaParams(AcceptHeaderItem $item): array - { - $attributes = array_change_key_case($item->getAttributes(), \CASE_LOWER); - unset($attributes['q']); - - return $attributes; - } -} diff --git a/plugins/vendor/symfony/http-foundation/AcceptHeaderItem.php b/plugins/vendor/symfony/http-foundation/AcceptHeaderItem.php deleted file mode 100644 index b8b2b8ad..00000000 --- a/plugins/vendor/symfony/http-foundation/AcceptHeaderItem.php +++ /dev/null @@ -1,159 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation; - -/** - * Represents an Accept-* header item. - * - * @author Jean-François Simon - */ -class AcceptHeaderItem -{ - private float $quality = 1.0; - private int $index = 0; - private array $attributes = []; - - public function __construct( - private string $value, - array $attributes = [], - ) { - foreach ($attributes as $name => $value) { - $this->setAttribute($name, $value); - } - } - - /** - * Builds an AcceptHeaderInstance instance from a string. - */ - public static function fromString(?string $itemValue): self - { - $parts = HeaderUtils::split($itemValue ?? '', ';='); - - $part = array_shift($parts); - $attributes = HeaderUtils::combine($parts); - - return new self($part[0], $attributes); - } - - /** - * Returns header value's string representation. - */ - public function __toString(): string - { - $string = $this->value.($this->quality < 1 ? ';q='.$this->quality : ''); - if (\count($this->attributes) > 0) { - $string .= '; '.HeaderUtils::toString($this->attributes, ';'); - } - - return $string; - } - - /** - * Set the item value. - * - * @return $this - */ - public function setValue(string $value): static - { - $this->value = $value; - - return $this; - } - - /** - * Returns the item value. - */ - public function getValue(): string - { - return $this->value; - } - - /** - * Set the item quality. - * - * @return $this - */ - public function setQuality(float $quality): static - { - $this->quality = $quality; - - return $this; - } - - /** - * Returns the item quality. - */ - public function getQuality(): float - { - return $this->quality; - } - - /** - * Set the item index. - * - * @return $this - */ - public function setIndex(int $index): static - { - $this->index = $index; - - return $this; - } - - /** - * Returns the item index. - */ - public function getIndex(): int - { - return $this->index; - } - - /** - * Tests if an attribute exists. - */ - public function hasAttribute(string $name): bool - { - return isset($this->attributes[$name]); - } - - /** - * Returns an attribute by its name. - */ - public function getAttribute(string $name, mixed $default = null): mixed - { - return $this->attributes[$name] ?? $default; - } - - /** - * Returns all attributes. - */ - public function getAttributes(): array - { - return $this->attributes; - } - - /** - * Set an attribute. - * - * @return $this - */ - public function setAttribute(string $name, string $value): static - { - if ('q' === $name) { - $this->quality = (float) $value; - } else { - $this->attributes[$name] = $value; - } - - return $this; - } -} diff --git a/plugins/vendor/symfony/http-foundation/BinaryFileResponse.php b/plugins/vendor/symfony/http-foundation/BinaryFileResponse.php deleted file mode 100644 index e139912d..00000000 --- a/plugins/vendor/symfony/http-foundation/BinaryFileResponse.php +++ /dev/null @@ -1,396 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation; - -use Symfony\Component\HttpFoundation\File\Exception\FileException; -use Symfony\Component\HttpFoundation\File\File; - -/** - * BinaryFileResponse represents an HTTP response delivering a file. - * - * @author Niklas Fiekas - * @author stealth35 - * @author Igor Wiedler - * @author Jordan Alliot - * @author Sergey Linnik - */ -class BinaryFileResponse extends Response -{ - protected static bool $trustXSendfileTypeHeader = false; - - protected File $file; - protected ?\SplTempFileObject $tempFileObject = null; - protected int $offset = 0; - protected int $maxlen = -1; - protected bool $deleteFileAfterSend = false; - protected int $chunkSize = 16 * 1024; - - /** - * @param \SplFileInfo|string $file The file to stream - * @param int $status The response status code (200 "OK" by default) - * @param array $headers An array of response headers - * @param bool $public Files are public by default - * @param string|null $contentDisposition The type of Content-Disposition to set automatically with the filename - * @param bool $autoEtag Whether the ETag header should be automatically set - * @param bool $autoLastModified Whether the Last-Modified header should be automatically set - */ - public function __construct(\SplFileInfo|string $file, int $status = 200, array $headers = [], bool $public = true, ?string $contentDisposition = null, bool $autoEtag = false, bool $autoLastModified = true) - { - parent::__construct(null, $status, $headers); - - $this->setFile($file, $contentDisposition, $autoEtag, $autoLastModified); - - if ($public) { - $this->setPublic(); - } - } - - /** - * Sets the file to stream. - * - * @return $this - * - * @throws FileException - */ - public function setFile(\SplFileInfo|string $file, ?string $contentDisposition = null, bool $autoEtag = false, bool $autoLastModified = true): static - { - $isTemporaryFile = $file instanceof \SplTempFileObject; - $this->tempFileObject = $isTemporaryFile ? $file : null; - - if (!$file instanceof File) { - if ($file instanceof \SplFileInfo) { - $file = new File($file->getPathname(), !$isTemporaryFile); - } else { - $file = new File($file); - } - } - - if (!$file->isReadable() && !$isTemporaryFile) { - throw new FileException('File must be readable.'); - } - - $this->file = $file; - - if ($autoEtag) { - $this->setAutoEtag(); - } - - if ($autoLastModified && !$isTemporaryFile) { - $this->setAutoLastModified(); - } - - if ($contentDisposition) { - $this->setContentDisposition($contentDisposition); - } - - return $this; - } - - /** - * Gets the file. - */ - public function getFile(): File - { - return $this->file; - } - - /** - * Sets the response stream chunk size. - * - * @return $this - */ - public function setChunkSize(int $chunkSize): static - { - if ($chunkSize < 1) { - throw new \InvalidArgumentException('The chunk size of a BinaryFileResponse cannot be less than 1.'); - } - - $this->chunkSize = $chunkSize; - - return $this; - } - - /** - * Automatically sets the Last-Modified header according the file modification date. - * - * @return $this - */ - public function setAutoLastModified(): static - { - $this->setLastModified(\DateTimeImmutable::createFromFormat('U', $this->tempFileObject ? time() : $this->file->getMTime())); - - return $this; - } - - /** - * Automatically sets the ETag header according to the checksum of the file. - * - * @return $this - */ - public function setAutoEtag(): static - { - $this->setEtag(base64_encode(hash_file('xxh128', $this->file->getPathname(), true))); - - return $this; - } - - /** - * Sets the Content-Disposition header with the given filename. - * - * @param string $disposition ResponseHeaderBag::DISPOSITION_INLINE or ResponseHeaderBag::DISPOSITION_ATTACHMENT - * @param string $filename Optionally use this UTF-8 encoded filename instead of the real name of the file - * @param string $filenameFallback A fallback filename, containing only ASCII characters. Defaults to an automatically encoded filename - * - * @return $this - */ - public function setContentDisposition(string $disposition, string $filename = '', string $filenameFallback = ''): static - { - if ('' === $filename) { - $filename = $this->file->getFilename(); - } - - if ('' === $filenameFallback && (!preg_match('/^[\x20-\x7e]*$/', $filename) || str_contains($filename, '%'))) { - $encoding = mb_detect_encoding($filename, null, true) ?: '8bit'; - - for ($i = 0, $filenameLength = mb_strlen($filename, $encoding); $i < $filenameLength; ++$i) { - $char = mb_substr($filename, $i, 1, $encoding); - - if ('%' === $char || \ord($char[0]) < 32 || \ord($char[0]) > 126) { - $filenameFallback .= '_'; - } else { - $filenameFallback .= $char; - } - } - } - - $dispositionHeader = $this->headers->makeDisposition($disposition, $filename, $filenameFallback); - $this->headers->set('Content-Disposition', $dispositionHeader); - - return $this; - } - - public function prepare(Request $request): static - { - if ($this->isInformational() || $this->isEmpty()) { - parent::prepare($request); - - $this->maxlen = 0; - - return $this; - } - - if (!$this->headers->has('Content-Type')) { - $mimeType = null; - if (!$this->tempFileObject) { - $mimeType = $this->file->getMimeType(); - } - - $this->headers->set('Content-Type', $mimeType ?: 'application/octet-stream'); - } - - parent::prepare($request); - - $this->offset = 0; - $this->maxlen = -1; - - if ($this->tempFileObject) { - $fileSize = $this->tempFileObject->fstat()['size']; - } elseif (false === $fileSize = $this->file->getSize()) { - return $this; - } - $this->headers->remove('Transfer-Encoding'); - $this->headers->set('Content-Length', $fileSize); - - if (!$this->headers->has('Accept-Ranges')) { - // Only accept ranges on safe HTTP methods - $this->headers->set('Accept-Ranges', $request->isMethodSafe() ? 'bytes' : 'none'); - } - - if (self::$trustXSendfileTypeHeader && $request->headers->has('X-Sendfile-Type')) { - // Use X-Sendfile, do not send any content. - $type = $request->headers->get('X-Sendfile-Type'); - $path = $this->file->getRealPath(); - // Fall back to scheme://path for stream wrapped locations. - if (false === $path) { - $path = $this->file->getPathname(); - } - if ('x-accel-redirect' === strtolower($type)) { - // Do X-Accel-Mapping substitutions. - // @link https://github.com/rack/rack/blob/main/lib/rack/sendfile.rb - // @link https://mattbrictson.com/blog/accelerated-rails-downloads - if (!$request->headers->has('X-Accel-Mapping')) { - throw new \LogicException('The "X-Accel-Mapping" header must be set when "X-Sendfile-Type" is set to "X-Accel-Redirect".'); - } - $parts = HeaderUtils::split($request->headers->get('X-Accel-Mapping'), ',='); - foreach ($parts as $part) { - [$pathPrefix, $location] = $part; - if (str_starts_with($path, $pathPrefix)) { - $path = $location.substr($path, \strlen($pathPrefix)); - // Only set X-Accel-Redirect header if a valid URI can be produced - // as nginx does not serve arbitrary file paths. - $this->headers->set($type, rawurlencode($path)); - $this->maxlen = 0; - break; - } - } - } else { - $this->headers->set($type, $path); - $this->maxlen = 0; - } - } elseif ($request->headers->has('Range') && $request->isMethod('GET')) { - // Process the range headers. - if (!$request->headers->has('If-Range') || $this->hasValidIfRangeHeader($request->headers->get('If-Range'))) { - $range = $request->headers->get('Range'); - - if (str_starts_with($range, 'bytes=')) { - [$start, $end] = explode('-', substr($range, 6), 2) + [1 => 0]; - - $end = ('' === $end) ? $fileSize - 1 : (int) $end; - - if ('' === $start) { - $start = $fileSize - $end; - $end = $fileSize - 1; - } else { - $start = (int) $start; - } - - if ($start <= $end) { - $end = min($end, $fileSize - 1); - if ($start < 0 || $start > $end) { - $this->setStatusCode(416); - $this->headers->set('Content-Range', \sprintf('bytes */%s', $fileSize)); - } else { - $this->maxlen = $end < $fileSize ? $end - $start + 1 : -1; - $this->offset = $start; - - $this->setStatusCode(206); - $this->headers->set('Content-Range', \sprintf('bytes %s-%s/%s', $start, $end, $fileSize)); - $this->headers->set('Content-Length', $end - $start + 1); - } - } - } - } - } - - if ($request->isMethod('HEAD')) { - $this->maxlen = 0; - } - - return $this; - } - - private function hasValidIfRangeHeader(?string $header): bool - { - if ($this->getEtag() === $header) { - return true; - } - - if (null === $lastModified = $this->getLastModified()) { - return false; - } - - return $lastModified->format('D, d M Y H:i:s').' GMT' === $header; - } - - public function sendContent(): static - { - try { - if (!$this->isSuccessful()) { - return $this; - } - - if (0 === $this->maxlen) { - return $this; - } - - $out = fopen('php://output', 'w'); - - if ($this->tempFileObject) { - $file = $this->tempFileObject; - $file->rewind(); - } else { - $file = new \SplFileObject($this->file->getPathname(), 'r'); - } - - ignore_user_abort(true); - - if (0 !== $this->offset) { - $file->fseek($this->offset); - } - - $length = $this->maxlen; - while ($length && !$file->eof()) { - $read = $length > $this->chunkSize || 0 > $length ? $this->chunkSize : $length; - - if (false === $data = $file->fread($read)) { - break; - } - while ('' !== $data) { - $read = fwrite($out, $data); - if (false === $read || connection_aborted()) { - break 2; - } - if (0 < $length) { - $length -= $read; - } - $data = substr($data, $read); - } - } - - fclose($out); - } finally { - if (null === $this->tempFileObject && $this->deleteFileAfterSend && is_file($this->file->getPathname())) { - unlink($this->file->getPathname()); - } - } - - return $this; - } - - /** - * @throws \LogicException when the content is not null - */ - public function setContent(?string $content): static - { - if (null !== $content) { - throw new \LogicException('The content cannot be set on a BinaryFileResponse instance.'); - } - - return $this; - } - - public function getContent(): string|false - { - return false; - } - - /** - * Trust X-Sendfile-Type header. - */ - public static function trustXSendfileTypeHeader(): void - { - self::$trustXSendfileTypeHeader = true; - } - - /** - * If this is set to true, the file will be unlinked after the request is sent - * Note: If the X-Sendfile header is used, the deleteFileAfterSend setting will not be used. - * - * @return $this - */ - public function deleteFileAfterSend(bool $shouldDelete = true): static - { - $this->deleteFileAfterSend = $shouldDelete; - - return $this; - } -} diff --git a/plugins/vendor/symfony/http-foundation/CHANGELOG.md b/plugins/vendor/symfony/http-foundation/CHANGELOG.md deleted file mode 100644 index 321d58e7..00000000 --- a/plugins/vendor/symfony/http-foundation/CHANGELOG.md +++ /dev/null @@ -1,409 +0,0 @@ -CHANGELOG -========= - -7.4 ---- - - * Add `#[WithHttpStatus]` to define status codes: 404 for `SignedUriException` and 403 for `ExpiredSignedUriException` - * Add support for the `QUERY` HTTP method - * Add support for structured MIME suffix - * Add `Request::set/getAllowedHttpMethodOverride()` to list which HTTP methods can be overridden - * Deprecate using `Request::sendHeaders()` after headers have already been sent; use a `StreamedResponse` instead - * Deprecate method `Request::get()`, use properties `->attributes`, `query` or `request` directly instead - * Make `Request::createFromGlobals()` parse the body of PUT, DELETE, PATCH and QUERY requests - * Deprecate HTTP method override for methods GET, HEAD, CONNECT and TRACE; it will be ignored in Symfony 8.0 - * Deprecate accepting null `$format` argument to `Request::setFormat()` - -7.3 ---- - - * Add support for iterable of string in `StreamedResponse` - * Add `EventStreamResponse` and `ServerEvent` classes to streamline server event streaming - * Add support for `valkey:` / `valkeys:` schemes for sessions - * `Request::getPreferredLanguage()` now favors a more preferred language above exactly matching a locale - * Allow `UriSigner` to use a `ClockInterface` - * Add `UriSigner::verify()` - -7.2 ---- - - * Add optional `$requests` parameter to `RequestStack::__construct()` - * Add optional `$v4Bytes` and `$v6Bytes` parameters to `IpUtils::anonymize()` - * Add `PRIVATE_SUBNETS` as a shortcut for private IP address ranges to `Request::setTrustedProxies()` - * Deprecate passing `referer_check`, `use_only_cookies`, `use_trans_sid`, `trans_sid_hosts`, `trans_sid_tags`, `sid_bits_per_character` and `sid_length` options to `NativeSessionStorage` - -7.1 ---- - - * Add optional `$expirationParameter` argument to `UriSigner::__construct()` - * Add optional `$expiration` argument to `UriSigner::sign()` - * Rename `$parameter` argument of `UriSigner::__construct()` to `$hashParameter` - * Add `UploadedFile::getClientOriginalPath()` - * Add `QueryParameterRequestMatcher` - * Add `HeaderRequestMatcher` - * Add support for `\SplTempFileObject` in `BinaryFileResponse` - * Add `verbose` argument to response test constraints - -7.0 ---- - - * Calling `ParameterBag::filter()` throws an `UnexpectedValueException` on invalid value, unless flag `FILTER_NULL_ON_FAILURE` is set - * Calling `ParameterBag::getInt()` and `ParameterBag::getBool()` throws an `UnexpectedValueException` on invalid value - * Remove classes `RequestMatcher` and `ExpressionRequestMatcher` - * Remove `Request::getContentType()`, use `Request::getContentTypeFormat()` instead - * Throw an `InvalidArgumentException` when calling `Request::create()` with a malformed URI - * Require explicit argument when calling `JsonResponse::setCallback()`, `Response::setExpires/setLastModified/setEtag()`, `MockArraySessionStorage/NativeSessionStorage::setMetadataBag()`, `NativeSessionStorage::setSaveHandler()` - * Add argument `$statusCode` to `Response::sendHeaders()` and `StreamedResponse::sendHeaders()` - -6.4 ---- - - * Make `HeaderBag::getDate()`, `Response::getDate()`, `getExpires()` and `getLastModified()` return a `DateTimeImmutable` - * Support root-level `Generator` in `StreamedJsonResponse` - * Add `UriSigner` from the HttpKernel component - * Add `partitioned` flag to `Cookie` (CHIPS Cookie) - * Add argument `bool $flush = true` to `Response::send()` - * Make `MongoDbSessionHandler` instantiable with the mongodb extension directly - -6.3 ---- - - * Calling `ParameterBag::getDigit()`, `getAlnum()`, `getAlpha()` on an `array` throws a `UnexpectedValueException` instead of a `TypeError` - * Add `ParameterBag::getString()` to convert a parameter into string and throw an exception if the value is invalid - * Add `ParameterBag::getEnum()` - * Create migration for session table when pdo handler is used - * Add support for Relay PHP extension for Redis - * The `Response::sendHeaders()` method now takes an optional HTTP status code as parameter, allowing to send informational responses such as Early Hints responses (103 status code) - * Add `IpUtils::isPrivateIp()` - * Add `Request::getPayload(): InputBag` - * Deprecate conversion of invalid values in `ParameterBag::getInt()` and `ParameterBag::getBoolean()`, - * Deprecate ignoring invalid values when using `ParameterBag::filter()`, unless flag `FILTER_NULL_ON_FAILURE` is set - -6.2 ---- - - * Add `StreamedJsonResponse` class for efficient JSON streaming - * The HTTP cache store uses the `xxh128` algorithm - * Deprecate calling `JsonResponse::setCallback()`, `Response::setExpires/setLastModified/setEtag()`, `MockArraySessionStorage/NativeSessionStorage::setMetadataBag()`, `NativeSessionStorage::setSaveHandler()` without arguments - * Add request matchers under the `Symfony\Component\HttpFoundation\RequestMatcher` namespace - * Deprecate `RequestMatcher` in favor of `ChainRequestMatcher` - * Deprecate `Symfony\Component\HttpFoundation\ExpressionRequestMatcher` in favor of `Symfony\Component\HttpFoundation\RequestMatcher\ExpressionRequestMatcher` - -6.1 ---- - - * Add stale while revalidate and stale if error cache header - * Allow dynamic session "ttl" when using a remote storage - * Deprecate `Request::getContentType()`, use `Request::getContentTypeFormat()` instead - -6.0 ---- - - * Remove the `NamespacedAttributeBag` class - * Removed `Response::create()`, `JsonResponse::create()`, - `RedirectResponse::create()`, `StreamedResponse::create()` and - `BinaryFileResponse::create()` methods (use `__construct()` instead) - * Not passing a `Closure` together with `FILTER_CALLBACK` to `ParameterBag::filter()` throws an `\InvalidArgumentException`; wrap your filter in a closure instead - * Not passing a `Closure` together with `FILTER_CALLBACK` to `InputBag::filter()` throws an `\InvalidArgumentException`; wrap your filter in a closure instead - * Removed the `Request::HEADER_X_FORWARDED_ALL` constant, use either `Request::HEADER_X_FORWARDED_FOR | Request::HEADER_X_FORWARDED_HOST | Request::HEADER_X_FORWARDED_PORT | Request::HEADER_X_FORWARDED_PROTO` or `Request::HEADER_X_FORWARDED_AWS_ELB` or `Request::HEADER_X_FORWARDED_TRAEFIK`constants instead - * Rename `RequestStack::getMasterRequest()` to `getMainRequest()` - * Not passing `FILTER_REQUIRE_ARRAY` or `FILTER_FORCE_ARRAY` flags to `InputBag::filter()` when filtering an array will throw `BadRequestException` - * Removed the `Request::HEADER_X_FORWARDED_ALL` constant - * Retrieving non-scalar values using `InputBag::get()` will throw `BadRequestException` (use `InputBad::all()` instead to retrieve an array) - * Passing non-scalar default value as the second argument `InputBag::get()` will throw `\InvalidArgumentException` - * Passing non-scalar, non-array value as the second argument `InputBag::set()` will throw `\InvalidArgumentException` - * Passing `null` as `$requestIp` to `IpUtils::__checkIp()`, `IpUtils::__checkIp4()` or `IpUtils::__checkIp6()` is not supported anymore. - -5.4 ---- - - * Deprecate passing `null` as `$requestIp` to `IpUtils::__checkIp()`, `IpUtils::__checkIp4()` or `IpUtils::__checkIp6()`, pass an empty string instead. - * Add the `litespeed_finish_request` method to work with Litespeed - * Deprecate `upload_progress.*` and `url_rewriter.tags` session options - * Allow setting session options via DSN - -5.3 ---- - - * Add the `SessionFactory`, `NativeSessionStorageFactory`, `PhpBridgeSessionStorageFactory` and `MockFileSessionStorageFactory` classes - * Calling `Request::getSession()` when there is no available session throws a `SessionNotFoundException` - * Add the `RequestStack::getSession` method - * Deprecate the `NamespacedAttributeBag` class - * Add `ResponseFormatSame` PHPUnit constraint - * Deprecate the `RequestStack::getMasterRequest()` method and add `getMainRequest()` as replacement - -5.2.0 ------ - - * added support for `X-Forwarded-Prefix` header - * added `HeaderUtils::parseQuery()`: it does the same as `parse_str()` but preserves dots in variable names - * added `File::getContent()` - * added ability to use comma separated ip addresses for `RequestMatcher::matchIps()` - * added `Request::toArray()` to parse a JSON request body to an array - * added `RateLimiter\RequestRateLimiterInterface` and `RateLimiter\AbstractRequestRateLimiter` - * deprecated not passing a `Closure` together with `FILTER_CALLBACK` to `ParameterBag::filter()`; wrap your filter in a closure instead. - * Deprecated the `Request::HEADER_X_FORWARDED_ALL` constant, use either `HEADER_X_FORWARDED_FOR | HEADER_X_FORWARDED_HOST | HEADER_X_FORWARDED_PORT | HEADER_X_FORWARDED_PROTO` or `HEADER_X_FORWARDED_AWS_ELB` or `HEADER_X_FORWARDED_TRAEFIK` constants instead. - * Deprecated `BinaryFileResponse::create()`, use `__construct()` instead - -5.1.0 ------ - - * added `Cookie::withValue`, `Cookie::withDomain`, `Cookie::withExpires`, - `Cookie::withPath`, `Cookie::withSecure`, `Cookie::withHttpOnly`, - `Cookie::withRaw`, `Cookie::withSameSite` - * Deprecate `Response::create()`, `JsonResponse::create()`, - `RedirectResponse::create()`, and `StreamedResponse::create()` methods (use - `__construct()` instead) - * added `Request::preferSafeContent()` and `Response::setContentSafe()` to handle "safe" HTTP preference - according to [RFC 8674](https://tools.ietf.org/html/rfc8674) - * made the Mime component an optional dependency - * added `MarshallingSessionHandler`, `IdentityMarshaller` - * made `Session` accept a callback to report when the session is being used - * Add support for all core cache control directives - * Added `Symfony\Component\HttpFoundation\InputBag` - * Deprecated retrieving non-string values using `InputBag::get()`, use `InputBag::all()` if you need access to the collection of values - -5.0.0 ------ - - * made `Cookie` auto-secure and lax by default - * removed classes in the `MimeType` namespace, use the Symfony Mime component instead - * removed method `UploadedFile::getClientSize()` and the related constructor argument - * made `Request::getSession()` throw if the session has not been set before - * removed `Response::HTTP_RESERVED_FOR_WEBDAV_ADVANCED_COLLECTIONS_EXPIRED_PROPOSAL` - * passing a null url when instantiating a `RedirectResponse` is not allowed - -4.4.0 ------ - - * passing arguments to `Request::isMethodSafe()` is deprecated. - * `ApacheRequest` is deprecated, use the `Request` class instead. - * passing a third argument to `HeaderBag::get()` is deprecated, use method `all()` instead - * [BC BREAK] `PdoSessionHandler` with MySQL changed the type of the lifetime column, - make sure to run `ALTER TABLE sessions MODIFY sess_lifetime INTEGER UNSIGNED NOT NULL` to - update your database. - * `PdoSessionHandler` now precalculates the expiry timestamp in the lifetime column, - make sure to run `CREATE INDEX expiry ON sessions (sess_lifetime)` to update your database - to speed up garbage collection of expired sessions. - * added `SessionHandlerFactory` to create session handlers with a DSN - * added `IpUtils::anonymize()` to help with GDPR compliance. - -4.3.0 ------ - - * added PHPUnit constraints: `RequestAttributeValueSame`, `ResponseCookieValueSame`, `ResponseHasCookie`, - `ResponseHasHeader`, `ResponseHeaderSame`, `ResponseIsRedirected`, `ResponseIsSuccessful`, and `ResponseStatusCodeSame` - * deprecated `MimeTypeGuesserInterface` and `ExtensionGuesserInterface` in favor of `Symfony\Component\Mime\MimeTypesInterface`. - * deprecated `MimeType` and `MimeTypeExtensionGuesser` in favor of `Symfony\Component\Mime\MimeTypes`. - * deprecated `FileBinaryMimeTypeGuesser` in favor of `Symfony\Component\Mime\FileBinaryMimeTypeGuesser`. - * deprecated `FileinfoMimeTypeGuesser` in favor of `Symfony\Component\Mime\FileinfoMimeTypeGuesser`. - * added `UrlHelper` that allows to get an absolute URL and a relative path for a given path - -4.2.0 ------ - - * the default value of the "$secure" and "$samesite" arguments of Cookie's constructor - will respectively change from "false" to "null" and from "null" to "lax" in Symfony - 5.0, you should define their values explicitly or use "Cookie::create()" instead. - * added `matchPort()` in RequestMatcher - -4.1.3 ------ - - * [BC BREAK] Support for the IIS-only `X_ORIGINAL_URL` and `X_REWRITE_URL` - HTTP headers has been dropped for security reasons. - -4.1.0 ------ - - * Query string normalization uses `parse_str()` instead of custom parsing logic. - * Passing the file size to the constructor of the `UploadedFile` class is deprecated. - * The `getClientSize()` method of the `UploadedFile` class is deprecated. Use `getSize()` instead. - * added `RedisSessionHandler` to use Redis as a session storage - * The `get()` method of the `AcceptHeader` class now takes into account the - `*` and `*/*` default values (if they are present in the Accept HTTP header) - when looking for items. - * deprecated `Request::getSession()` when no session has been set. Use `Request::hasSession()` instead. - * added `CannotWriteFileException`, `ExtensionFileException`, `FormSizeFileException`, - `IniSizeFileException`, `NoFileException`, `NoTmpDirFileException`, `PartialFileException` to - handle failed `UploadedFile`. - * added `MigratingSessionHandler` for migrating between two session handlers without losing sessions - * added `HeaderUtils`. - -4.0.0 ------ - - * the `Request::setTrustedHeaderName()` and `Request::getTrustedHeaderName()` - methods have been removed - * the `Request::HEADER_CLIENT_IP` constant has been removed, use - `Request::HEADER_X_FORWARDED_FOR` instead - * the `Request::HEADER_CLIENT_HOST` constant has been removed, use - `Request::HEADER_X_FORWARDED_HOST` instead - * the `Request::HEADER_CLIENT_PROTO` constant has been removed, use - `Request::HEADER_X_FORWARDED_PROTO` instead - * the `Request::HEADER_CLIENT_PORT` constant has been removed, use - `Request::HEADER_X_FORWARDED_PORT` instead - * checking for cacheable HTTP methods using the `Request::isMethodSafe()` - method (by not passing `false` as its argument) is not supported anymore and - throws a `\BadMethodCallException` - * the `WriteCheckSessionHandler`, `NativeSessionHandler` and `NativeProxy` classes have been removed - * setting session save handlers that do not implement `\SessionHandlerInterface` in - `NativeSessionStorage::setSaveHandler()` is not supported anymore and throws a - `\TypeError` - -3.4.0 ------ - - * implemented PHP 7.0's `SessionUpdateTimestampHandlerInterface` with a new - `AbstractSessionHandler` base class and a new `StrictSessionHandler` wrapper - * deprecated the `WriteCheckSessionHandler`, `NativeSessionHandler` and `NativeProxy` classes - * deprecated setting session save handlers that do not implement `\SessionHandlerInterface` in `NativeSessionStorage::setSaveHandler()` - * deprecated using `MongoDbSessionHandler` with the legacy mongo extension; use it with the mongodb/mongodb package and ext-mongodb instead - * deprecated `MemcacheSessionHandler`; use `MemcachedSessionHandler` instead - -3.3.0 ------ - - * the `Request::setTrustedProxies()` method takes a new `$trustedHeaderSet` argument, - see https://symfony.com/doc/current/deployment/proxies.html for more info, - * deprecated the `Request::setTrustedHeaderName()` and `Request::getTrustedHeaderName()` methods, - * added `File\Stream`, to be passed to `BinaryFileResponse` when the size of the served file is unknown, - disabling `Range` and `Content-Length` handling, switching to chunked encoding instead - * added the `Cookie::fromString()` method that allows to create a cookie from a - raw header string - -3.1.0 ------ - - * Added support for creating `JsonResponse` with a string of JSON data - -3.0.0 ------ - - * The precedence of parameters returned from `Request::get()` changed from "GET, PATH, BODY" to "PATH, GET, BODY" - -2.8.0 ------ - - * Finding deep items in `ParameterBag::get()` is deprecated since version 2.8 and - will be removed in 3.0. - -2.6.0 ------ - - * PdoSessionHandler changes - - implemented different session locking strategies to prevent loss of data by concurrent access to the same session - - [BC BREAK] save session data in a binary column without base64_encode - - [BC BREAK] added lifetime column to the session table which allows to have different lifetimes for each session - - implemented lazy connections that are only opened when a session is used by either passing a dsn string - explicitly or falling back to session.save_path ini setting - - added a createTable method that initializes a correctly defined table depending on the database vendor - -2.5.0 ------ - - * added `JsonResponse::setEncodingOptions()` & `JsonResponse::getEncodingOptions()` for easier manipulation - of the options used while encoding data to JSON format. - -2.4.0 ------ - - * added RequestStack - * added Request::getEncodings() - * added accessors methods to session handlers - -2.3.0 ------ - - * added support for ranges of IPs in trusted proxies - * `UploadedFile::isValid` now returns false if the file was not uploaded via HTTP (in a non-test mode) - * Improved error-handling of `\Symfony\Component\HttpFoundation\Session\Storage\Handler\PdoSessionHandler` - to ensure the supplied PDO handler throws Exceptions on error (as the class expects). Added related test cases - to verify that Exceptions are properly thrown when the PDO queries fail. - -2.2.0 ------ - - * fixed the Request::create() precedence (URI information always take precedence now) - * added Request::getTrustedProxies() - * deprecated Request::isProxyTrusted() - * [BC BREAK] JsonResponse does not turn a top level empty array to an object anymore, use an ArrayObject to enforce objects - * added a IpUtils class to check if an IP belongs to a CIDR - * added Request::getRealMethod() to get the "real" HTTP method (getMethod() returns the "intended" HTTP method) - * disabled _method request parameter support by default (call Request::enableHttpMethodParameterOverride() to - enable it, and Request::getHttpMethodParameterOverride() to check if it is supported) - * Request::splitHttpAcceptHeader() method is deprecated and will be removed in 2.3 - * Deprecated Flashbag::count() and \Countable interface, will be removed in 2.3 - -2.1.0 ------ - - * added Request::getSchemeAndHttpHost() and Request::getUserInfo() - * added a fluent interface to the Response class - * added Request::isProxyTrusted() - * added JsonResponse - * added a getTargetUrl method to RedirectResponse - * added support for streamed responses - * made Response::prepare() method the place to enforce HTTP specification - * [BC BREAK] moved management of the locale from the Session class to the Request class - * added a generic access to the PHP built-in filter mechanism: ParameterBag::filter() - * made FileBinaryMimeTypeGuesser command configurable - * added Request::getUser() and Request::getPassword() - * added support for the PATCH method in Request - * removed the ContentTypeMimeTypeGuesser class as it is deprecated and never used on PHP 5.3 - * added ResponseHeaderBag::makeDisposition() (implements RFC 6266) - * made mimetype to extension conversion configurable - * [BC BREAK] Moved all session related classes and interfaces into own namespace, as - `Symfony\Component\HttpFoundation\Session` and renamed classes accordingly. - Session handlers are located in the subnamespace `Symfony\Component\HttpFoundation\Session\Handler`. - * SessionHandlers must implement `\SessionHandlerInterface` or extend from the - `Symfony\Component\HttpFoundation\Storage\Handler\NativeSessionHandler` base class. - * Added internal storage driver proxy mechanism for forward compatibility with - PHP 5.4 `\SessionHandler` class. - * Added session handlers for custom Memcache, Memcached and Null session save handlers. - * [BC BREAK] Removed `NativeSessionStorage` and replaced with `NativeFileSessionHandler`. - * [BC BREAK] `SessionStorageInterface` methods removed: `write()`, `read()` and - `remove()`. Added `getBag()`, `registerBag()`. The `NativeSessionStorage` class - is a mediator for the session storage internals including the session handlers - which do the real work of participating in the internal PHP session workflow. - * [BC BREAK] Introduced mock implementations of `SessionStorage` to enable unit - and functional testing without starting real PHP sessions. Removed - `ArraySessionStorage`, and replaced with `MockArraySessionStorage` for unit - tests; removed `FilesystemSessionStorage`, and replaced with`MockFileSessionStorage` - for functional tests. These do not interact with global session ini - configuration values, session functions or `$_SESSION` superglobal. This means - they can be configured directly allowing multiple instances to work without - conflicting in the same PHP process. - * [BC BREAK] Removed the `close()` method from the `Session` class, as this is - now redundant. - * Deprecated the following methods from the Session class: `setFlash()`, `setFlashes()` - `getFlash()`, `hasFlash()`, and `removeFlash()`. Use `getFlashBag()` instead - which returns a `FlashBagInterface`. - * `Session->clear()` now only clears session attributes as before it cleared - flash messages and attributes. `Session->getFlashBag()->all()` clears flashes now. - * Session data is now managed by `SessionBagInterface` to better encapsulate - session data. - * Refactored session attribute and flash messages system to their own - `SessionBagInterface` implementations. - * Added `FlashBag`. Flashes expire when retrieved by `get()` or `all()`. This - implementation is ESI compatible. - * Added `AutoExpireFlashBag` (default) to replicate Symfony 2.0.x auto expire - behavior of messages auto expiring after one page page load. Messages must - be retrieved by `get()` or `all()`. - * Added `Symfony\Component\HttpFoundation\Attribute\AttributeBag` to replicate - attributes storage behavior from 2.0.x (default). - * Added `Symfony\Component\HttpFoundation\Attribute\NamespacedAttributeBag` for - namespace session attributes. - * Flash API can stores messages in an array so there may be multiple messages - per flash type. The old `Session` class API remains without BC break as it - will allow single messages as before. - * Added basic session meta-data to the session to record session create time, - last updated time, and the lifetime of the session cookie that was provided - to the client. - * Request::getClientIp() method doesn't take a parameter anymore but bases - itself on the trustProxy parameter. - * Added isMethod() to Request object. - * [BC BREAK] The methods `getPathInfo()`, `getBaseUrl()` and `getBasePath()` of - a `Request` now all return a raw value (vs a urldecoded value before). Any call - to one of these methods must be checked and wrapped in a `rawurldecode()` if - needed. diff --git a/plugins/vendor/symfony/http-foundation/ChainRequestMatcher.php b/plugins/vendor/symfony/http-foundation/ChainRequestMatcher.php deleted file mode 100644 index 29486fc8..00000000 --- a/plugins/vendor/symfony/http-foundation/ChainRequestMatcher.php +++ /dev/null @@ -1,38 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation; - -/** - * ChainRequestMatcher verifies that all checks match against a Request instance. - * - * @author Fabien Potencier - */ -class ChainRequestMatcher implements RequestMatcherInterface -{ - /** - * @param iterable $matchers - */ - public function __construct(private iterable $matchers) - { - } - - public function matches(Request $request): bool - { - foreach ($this->matchers as $matcher) { - if (!$matcher->matches($request)) { - return false; - } - } - - return true; - } -} diff --git a/plugins/vendor/symfony/http-foundation/Cookie.php b/plugins/vendor/symfony/http-foundation/Cookie.php deleted file mode 100644 index 19928705..00000000 --- a/plugins/vendor/symfony/http-foundation/Cookie.php +++ /dev/null @@ -1,405 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation; - -/** - * Represents a cookie. - * - * @author Johannes M. Schmitt - */ -class Cookie -{ - public const SAMESITE_NONE = 'none'; - public const SAMESITE_LAX = 'lax'; - public const SAMESITE_STRICT = 'strict'; - - protected int $expire; - protected string $path; - - private ?string $sameSite = null; - private bool $secureDefault = false; - - private const RESERVED_CHARS_LIST = "=,; \t\r\n\v\f"; - private const RESERVED_CHARS_FROM = ['=', ',', ';', ' ', "\t", "\r", "\n", "\v", "\f"]; - private const RESERVED_CHARS_TO = ['%3D', '%2C', '%3B', '%20', '%09', '%0D', '%0A', '%0B', '%0C']; - - /** - * Creates cookie from raw header string. - */ - public static function fromString(string $cookie, bool $decode = false): static - { - $data = [ - 'expires' => 0, - 'path' => '/', - 'domain' => null, - 'secure' => false, - 'httponly' => false, - 'raw' => !$decode, - 'samesite' => null, - 'partitioned' => false, - ]; - - $parts = HeaderUtils::split($cookie, ';='); - $part = array_shift($parts); - - $name = $decode ? urldecode($part[0]) : $part[0]; - $value = isset($part[1]) ? ($decode ? urldecode($part[1]) : $part[1]) : null; - - $data = HeaderUtils::combine($parts) + $data; - $data['expires'] = self::expiresTimestamp($data['expires']); - - if (isset($data['max-age']) && ($data['max-age'] > 0 || $data['expires'] > time())) { - $data['expires'] = time() + (int) $data['max-age']; - } - - return new static($name, $value, $data['expires'], $data['path'], $data['domain'], $data['secure'], $data['httponly'], $data['raw'], $data['samesite'], $data['partitioned']); - } - - /** - * @see self::__construct - * - * @param self::SAMESITE_*|''|null $sameSite - */ - public static function create(string $name, ?string $value = null, int|string|\DateTimeInterface $expire = 0, ?string $path = '/', ?string $domain = null, ?bool $secure = null, bool $httpOnly = true, bool $raw = false, ?string $sameSite = self::SAMESITE_LAX, bool $partitioned = false): self - { - return new self($name, $value, $expire, $path, $domain, $secure, $httpOnly, $raw, $sameSite, $partitioned); - } - - /** - * @param string $name The name of the cookie - * @param string|null $value The value of the cookie - * @param int|string|\DateTimeInterface $expire The time the cookie expires - * @param string|null $path The path on the server in which the cookie will be available on - * @param string|null $domain The domain that the cookie is available to - * @param bool|null $secure Whether the client should send back the cookie only over HTTPS or null to auto-enable this when the request is already using HTTPS - * @param bool $httpOnly Whether the cookie will be made accessible only through the HTTP protocol - * @param bool $raw Whether the cookie value should be sent with no url encoding - * @param self::SAMESITE_*|''|null $sameSite Whether the cookie will be available for cross-site requests - * - * @throws \InvalidArgumentException - */ - public function __construct( - protected string $name, - protected ?string $value = null, - int|string|\DateTimeInterface $expire = 0, - ?string $path = '/', - protected ?string $domain = null, - protected ?bool $secure = null, - protected bool $httpOnly = true, - private bool $raw = false, - ?string $sameSite = self::SAMESITE_LAX, - private bool $partitioned = false, - ) { - // from PHP source code - if ($raw && false !== strpbrk($name, self::RESERVED_CHARS_LIST)) { - throw new \InvalidArgumentException(\sprintf('The cookie name "%s" contains invalid characters.', $name)); - } - - if (!$name) { - throw new \InvalidArgumentException('The cookie name cannot be empty.'); - } - - $this->expire = self::expiresTimestamp($expire); - $this->path = $path ?: '/'; - $this->sameSite = $this->withSameSite($sameSite)->sameSite; - } - - /** - * Creates a cookie copy with a new value. - */ - public function withValue(?string $value): static - { - $cookie = clone $this; - $cookie->value = $value; - - return $cookie; - } - - /** - * Creates a cookie copy with a new domain that the cookie is available to. - */ - public function withDomain(?string $domain): static - { - $cookie = clone $this; - $cookie->domain = $domain; - - return $cookie; - } - - /** - * Creates a cookie copy with a new time the cookie expires. - */ - public function withExpires(int|string|\DateTimeInterface $expire = 0): static - { - $cookie = clone $this; - $cookie->expire = self::expiresTimestamp($expire); - - return $cookie; - } - - /** - * Converts expires formats to a unix timestamp. - */ - private static function expiresTimestamp(int|string|\DateTimeInterface $expire = 0): int - { - // convert expiration time to a Unix timestamp - if ($expire instanceof \DateTimeInterface) { - $expire = $expire->format('U'); - } elseif (!is_numeric($expire)) { - $expire = strtotime($expire); - - if (false === $expire) { - throw new \InvalidArgumentException('The cookie expiration time is not valid.'); - } - } - - return 0 < $expire ? (int) $expire : 0; - } - - /** - * Creates a cookie copy with a new path on the server in which the cookie will be available on. - */ - public function withPath(string $path): static - { - $cookie = clone $this; - $cookie->path = '' === $path ? '/' : $path; - - return $cookie; - } - - /** - * Creates a cookie copy that only be transmitted over a secure HTTPS connection from the client. - */ - public function withSecure(bool $secure = true): static - { - $cookie = clone $this; - $cookie->secure = $secure; - - return $cookie; - } - - /** - * Creates a cookie copy that be accessible only through the HTTP protocol. - */ - public function withHttpOnly(bool $httpOnly = true): static - { - $cookie = clone $this; - $cookie->httpOnly = $httpOnly; - - return $cookie; - } - - /** - * Creates a cookie copy that uses no url encoding. - */ - public function withRaw(bool $raw = true): static - { - if ($raw && false !== strpbrk($this->name, self::RESERVED_CHARS_LIST)) { - throw new \InvalidArgumentException(\sprintf('The cookie name "%s" contains invalid characters.', $this->name)); - } - - $cookie = clone $this; - $cookie->raw = $raw; - - return $cookie; - } - - /** - * Creates a cookie copy with SameSite attribute. - * - * @param self::SAMESITE_*|''|null $sameSite - */ - public function withSameSite(?string $sameSite): static - { - if ('' === $sameSite) { - $sameSite = null; - } elseif (null !== $sameSite) { - $sameSite = strtolower($sameSite); - } - - if (!\in_array($sameSite, [self::SAMESITE_LAX, self::SAMESITE_STRICT, self::SAMESITE_NONE, null], true)) { - throw new \InvalidArgumentException('The "sameSite" parameter value is not valid.'); - } - - $cookie = clone $this; - $cookie->sameSite = $sameSite; - - return $cookie; - } - - /** - * Creates a cookie copy that is tied to the top-level site in cross-site context. - */ - public function withPartitioned(bool $partitioned = true): static - { - $cookie = clone $this; - $cookie->partitioned = $partitioned; - - return $cookie; - } - - /** - * Returns the cookie as a string. - */ - public function __toString(): string - { - if ($this->isRaw()) { - $str = $this->getName(); - } else { - $str = str_replace(self::RESERVED_CHARS_FROM, self::RESERVED_CHARS_TO, $this->getName()); - } - - $str .= '='; - - if ('' === (string) $this->getValue()) { - $str .= 'deleted; expires='.gmdate('D, d M Y H:i:s T', time() - 31536001).'; Max-Age=0'; - } else { - $str .= $this->isRaw() ? $this->getValue() : rawurlencode($this->getValue()); - - if (0 !== $this->getExpiresTime()) { - $str .= '; expires='.gmdate('D, d M Y H:i:s T', $this->getExpiresTime()).'; Max-Age='.$this->getMaxAge(); - } - } - - if ($this->getPath()) { - $str .= '; path='.$this->getPath(); - } - - if ($this->getDomain()) { - $str .= '; domain='.$this->getDomain(); - } - - if ($this->isSecure()) { - $str .= '; secure'; - } - - if ($this->isHttpOnly()) { - $str .= '; httponly'; - } - - if (null !== $this->getSameSite()) { - $str .= '; samesite='.$this->getSameSite(); - } - - if ($this->isPartitioned()) { - $str .= '; partitioned'; - } - - return $str; - } - - /** - * Gets the name of the cookie. - */ - public function getName(): string - { - return $this->name; - } - - /** - * Gets the value of the cookie. - */ - public function getValue(): ?string - { - return $this->value; - } - - /** - * Gets the domain that the cookie is available to. - */ - public function getDomain(): ?string - { - return $this->domain; - } - - /** - * Gets the time the cookie expires. - */ - public function getExpiresTime(): int - { - return $this->expire; - } - - /** - * Gets the max-age attribute. - */ - public function getMaxAge(): int - { - $maxAge = $this->expire - time(); - - return max(0, $maxAge); - } - - /** - * Gets the path on the server in which the cookie will be available on. - */ - public function getPath(): string - { - return $this->path; - } - - /** - * Checks whether the cookie should only be transmitted over a secure HTTPS connection from the client. - */ - public function isSecure(): bool - { - return $this->secure ?? $this->secureDefault; - } - - /** - * Checks whether the cookie will be made accessible only through the HTTP protocol. - */ - public function isHttpOnly(): bool - { - return $this->httpOnly; - } - - /** - * Whether this cookie is about to be cleared. - */ - public function isCleared(): bool - { - return 0 !== $this->expire && $this->expire < time(); - } - - /** - * Checks if the cookie value should be sent with no url encoding. - */ - public function isRaw(): bool - { - return $this->raw; - } - - /** - * Checks whether the cookie should be tied to the top-level site in cross-site context. - */ - public function isPartitioned(): bool - { - return $this->partitioned; - } - - /** - * @return self::SAMESITE_*|null - */ - public function getSameSite(): ?string - { - return $this->sameSite; - } - - /** - * @param bool $default The default value of the "secure" flag when it is set to null - */ - public function setSecureDefault(bool $default): void - { - $this->secureDefault = $default; - } -} diff --git a/plugins/vendor/symfony/http-foundation/EventStreamResponse.php b/plugins/vendor/symfony/http-foundation/EventStreamResponse.php deleted file mode 100644 index e739c309..00000000 --- a/plugins/vendor/symfony/http-foundation/EventStreamResponse.php +++ /dev/null @@ -1,110 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation; - -/** - * Represents a streaming HTTP response for sending server events - * as part of the Server-Sent Events (SSE) streaming technique. - * - * To broadcast events to multiple users at once, for long-running - * connections and for high-traffic websites, prefer using the Mercure - * Symfony Component, which relies on Software designed for these use - * cases: https://symfony.com/doc/current/mercure.html - * - * @see ServerEvent - * - * @author Yonel Ceruto - * - * Example usage: - * - * return new EventStreamResponse(function () { - * yield new ServerEvent(time()); - * - * sleep(1); - * - * yield new ServerEvent(time()); - * }); - */ -class EventStreamResponse extends StreamedResponse -{ - /** - * @param int|null $retry The number of milliseconds the client should wait - * before reconnecting in case of network failure - */ - public function __construct(?callable $callback = null, int $status = 200, array $headers = [], private ?int $retry = null) - { - $headers += [ - 'Connection' => 'keep-alive', - 'Content-Type' => 'text/event-stream', - 'Cache-Control' => 'private, no-cache, no-store, must-revalidate, max-age=0', - 'X-Accel-Buffering' => 'no', - 'Pragma' => 'no-cache', - 'Expires' => '0', - ]; - - parent::__construct($callback, $status, $headers); - } - - public function setCallback(callable $callback): static - { - if ($this->callback) { - return parent::setCallback($callback); - } - - $this->callback = function () use ($callback) { - if (is_iterable($events = $callback($this))) { - foreach ($events as $event) { - $this->sendEvent($event); - - if (connection_aborted()) { - break; - } - } - } - }; - - return $this; - } - - /** - * Sends a server event to the client. - * - * @return $this - */ - public function sendEvent(ServerEvent $event): static - { - if ($this->retry > 0 && !$event->getRetry()) { - $event->setRetry($this->retry); - } - - foreach ($event as $part) { - echo $part; - - if (!\in_array(\PHP_SAPI, ['cli', 'phpdbg', 'embed'], true)) { - static::closeOutputBuffers(0, true); - flush(); - } - } - - return $this; - } - - public function getRetry(): ?int - { - return $this->retry; - } - - public function setRetry(int $retry): void - { - $this->retry = $retry; - } -} diff --git a/plugins/vendor/symfony/http-foundation/Exception/BadRequestException.php b/plugins/vendor/symfony/http-foundation/Exception/BadRequestException.php deleted file mode 100644 index 505e1cfd..00000000 --- a/plugins/vendor/symfony/http-foundation/Exception/BadRequestException.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Exception; - -/** - * Raised when a user sends a malformed request. - */ -class BadRequestException extends UnexpectedValueException implements RequestExceptionInterface -{ -} diff --git a/plugins/vendor/symfony/http-foundation/Exception/ConflictingHeadersException.php b/plugins/vendor/symfony/http-foundation/Exception/ConflictingHeadersException.php deleted file mode 100644 index 77aa0e1e..00000000 --- a/plugins/vendor/symfony/http-foundation/Exception/ConflictingHeadersException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Exception; - -/** - * The HTTP request contains headers with conflicting information. - * - * @author Magnus Nordlander - */ -class ConflictingHeadersException extends UnexpectedValueException implements RequestExceptionInterface -{ -} diff --git a/plugins/vendor/symfony/http-foundation/Exception/ExceptionInterface.php b/plugins/vendor/symfony/http-foundation/Exception/ExceptionInterface.php deleted file mode 100644 index e77c94ff..00000000 --- a/plugins/vendor/symfony/http-foundation/Exception/ExceptionInterface.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Exception; - -interface ExceptionInterface extends \Throwable -{ -} diff --git a/plugins/vendor/symfony/http-foundation/Exception/ExpiredSignedUriException.php b/plugins/vendor/symfony/http-foundation/Exception/ExpiredSignedUriException.php deleted file mode 100644 index 46907a3a..00000000 --- a/plugins/vendor/symfony/http-foundation/Exception/ExpiredSignedUriException.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Exception; - -use Symfony\Component\HttpKernel\Attribute\WithHttpStatus; - -/** - * @author Kevin Bond - */ -#[WithHttpStatus(403)] -final class ExpiredSignedUriException extends SignedUriException -{ - /** - * @internal - */ - public function __construct() - { - parent::__construct('The URI has expired.'); - } -} diff --git a/plugins/vendor/symfony/http-foundation/Exception/JsonException.php b/plugins/vendor/symfony/http-foundation/Exception/JsonException.php deleted file mode 100644 index 6d1e0aec..00000000 --- a/plugins/vendor/symfony/http-foundation/Exception/JsonException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Exception; - -/** - * Thrown by Request::toArray() when the content cannot be JSON-decoded. - * - * @author Tobias Nyholm - */ -final class JsonException extends UnexpectedValueException implements RequestExceptionInterface -{ -} diff --git a/plugins/vendor/symfony/http-foundation/Exception/LogicException.php b/plugins/vendor/symfony/http-foundation/Exception/LogicException.php deleted file mode 100644 index 2d3021f0..00000000 --- a/plugins/vendor/symfony/http-foundation/Exception/LogicException.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Exception; - -/** - * Base LogicException for Http Foundation component. - */ -class LogicException extends \LogicException implements ExceptionInterface -{ -} diff --git a/plugins/vendor/symfony/http-foundation/Exception/RequestExceptionInterface.php b/plugins/vendor/symfony/http-foundation/Exception/RequestExceptionInterface.php deleted file mode 100644 index 478d0dc7..00000000 --- a/plugins/vendor/symfony/http-foundation/Exception/RequestExceptionInterface.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Exception; - -/** - * Interface for Request exceptions. - * - * Exceptions implementing this interface should trigger an HTTP 400 response in the application code. - */ -interface RequestExceptionInterface -{ -} diff --git a/plugins/vendor/symfony/http-foundation/Exception/SessionNotFoundException.php b/plugins/vendor/symfony/http-foundation/Exception/SessionNotFoundException.php deleted file mode 100644 index 80a21bf1..00000000 --- a/plugins/vendor/symfony/http-foundation/Exception/SessionNotFoundException.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Exception; - -/** - * Raised when a session does not exist. This happens in the following cases: - * - the session is not enabled - * - attempt to read a session outside a request context (ie. cli script). - * - * @author Jérémy Derussé - */ -class SessionNotFoundException extends \LogicException implements RequestExceptionInterface -{ - public function __construct(string $message = 'There is currently no session available.', int $code = 0, ?\Throwable $previous = null) - { - parent::__construct($message, $code, $previous); - } -} diff --git a/plugins/vendor/symfony/http-foundation/Exception/SignedUriException.php b/plugins/vendor/symfony/http-foundation/Exception/SignedUriException.php deleted file mode 100644 index 09c80657..00000000 --- a/plugins/vendor/symfony/http-foundation/Exception/SignedUriException.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Exception; - -use Symfony\Component\HttpKernel\Attribute\WithHttpStatus; - -/** - * @author Kevin Bond - */ -#[WithHttpStatus(404)] -abstract class SignedUriException extends \RuntimeException implements ExceptionInterface -{ -} diff --git a/plugins/vendor/symfony/http-foundation/Exception/SuspiciousOperationException.php b/plugins/vendor/symfony/http-foundation/Exception/SuspiciousOperationException.php deleted file mode 100644 index 4818ef2c..00000000 --- a/plugins/vendor/symfony/http-foundation/Exception/SuspiciousOperationException.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Exception; - -/** - * Raised when a user has performed an operation that should be considered - * suspicious from a security perspective. - */ -class SuspiciousOperationException extends UnexpectedValueException implements RequestExceptionInterface -{ -} diff --git a/plugins/vendor/symfony/http-foundation/Exception/UnexpectedValueException.php b/plugins/vendor/symfony/http-foundation/Exception/UnexpectedValueException.php deleted file mode 100644 index c3e6c9d6..00000000 --- a/plugins/vendor/symfony/http-foundation/Exception/UnexpectedValueException.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Exception; - -class UnexpectedValueException extends \UnexpectedValueException -{ -} diff --git a/plugins/vendor/symfony/http-foundation/Exception/UnsignedUriException.php b/plugins/vendor/symfony/http-foundation/Exception/UnsignedUriException.php deleted file mode 100644 index 5eabb806..00000000 --- a/plugins/vendor/symfony/http-foundation/Exception/UnsignedUriException.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Exception; - -/** - * @author Kevin Bond - */ -final class UnsignedUriException extends SignedUriException -{ - /** - * @internal - */ - public function __construct() - { - parent::__construct('The URI is not signed.'); - } -} diff --git a/plugins/vendor/symfony/http-foundation/Exception/UnverifiedSignedUriException.php b/plugins/vendor/symfony/http-foundation/Exception/UnverifiedSignedUriException.php deleted file mode 100644 index cc7e98bf..00000000 --- a/plugins/vendor/symfony/http-foundation/Exception/UnverifiedSignedUriException.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Exception; - -/** - * @author Kevin Bond - */ -final class UnverifiedSignedUriException extends SignedUriException -{ - /** - * @internal - */ - public function __construct() - { - parent::__construct('The URI signature is invalid.'); - } -} diff --git a/plugins/vendor/symfony/http-foundation/File/Exception/AccessDeniedException.php b/plugins/vendor/symfony/http-foundation/File/Exception/AccessDeniedException.php deleted file mode 100644 index 79ab0fce..00000000 --- a/plugins/vendor/symfony/http-foundation/File/Exception/AccessDeniedException.php +++ /dev/null @@ -1,25 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\File\Exception; - -/** - * Thrown when the access on a file was denied. - * - * @author Bernhard Schussek - */ -class AccessDeniedException extends FileException -{ - public function __construct(string $path) - { - parent::__construct(\sprintf('The file %s could not be accessed', $path)); - } -} diff --git a/plugins/vendor/symfony/http-foundation/File/Exception/CannotWriteFileException.php b/plugins/vendor/symfony/http-foundation/File/Exception/CannotWriteFileException.php deleted file mode 100644 index c49f53a6..00000000 --- a/plugins/vendor/symfony/http-foundation/File/Exception/CannotWriteFileException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\File\Exception; - -/** - * Thrown when an UPLOAD_ERR_CANT_WRITE error occurred with UploadedFile. - * - * @author Florent Mata - */ -class CannotWriteFileException extends FileException -{ -} diff --git a/plugins/vendor/symfony/http-foundation/File/Exception/ExtensionFileException.php b/plugins/vendor/symfony/http-foundation/File/Exception/ExtensionFileException.php deleted file mode 100644 index ed83499c..00000000 --- a/plugins/vendor/symfony/http-foundation/File/Exception/ExtensionFileException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\File\Exception; - -/** - * Thrown when an UPLOAD_ERR_EXTENSION error occurred with UploadedFile. - * - * @author Florent Mata - */ -class ExtensionFileException extends FileException -{ -} diff --git a/plugins/vendor/symfony/http-foundation/File/Exception/FileException.php b/plugins/vendor/symfony/http-foundation/File/Exception/FileException.php deleted file mode 100644 index fad5133e..00000000 --- a/plugins/vendor/symfony/http-foundation/File/Exception/FileException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\File\Exception; - -/** - * Thrown when an error occurred in the component File. - * - * @author Bernhard Schussek - */ -class FileException extends \RuntimeException -{ -} diff --git a/plugins/vendor/symfony/http-foundation/File/Exception/FileNotFoundException.php b/plugins/vendor/symfony/http-foundation/File/Exception/FileNotFoundException.php deleted file mode 100644 index 3a5eb039..00000000 --- a/plugins/vendor/symfony/http-foundation/File/Exception/FileNotFoundException.php +++ /dev/null @@ -1,25 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\File\Exception; - -/** - * Thrown when a file was not found. - * - * @author Bernhard Schussek - */ -class FileNotFoundException extends FileException -{ - public function __construct(string $path) - { - parent::__construct(\sprintf('The file "%s" does not exist', $path)); - } -} diff --git a/plugins/vendor/symfony/http-foundation/File/Exception/FormSizeFileException.php b/plugins/vendor/symfony/http-foundation/File/Exception/FormSizeFileException.php deleted file mode 100644 index 8741be08..00000000 --- a/plugins/vendor/symfony/http-foundation/File/Exception/FormSizeFileException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\File\Exception; - -/** - * Thrown when an UPLOAD_ERR_FORM_SIZE error occurred with UploadedFile. - * - * @author Florent Mata - */ -class FormSizeFileException extends FileException -{ -} diff --git a/plugins/vendor/symfony/http-foundation/File/Exception/IniSizeFileException.php b/plugins/vendor/symfony/http-foundation/File/Exception/IniSizeFileException.php deleted file mode 100644 index c8fde610..00000000 --- a/plugins/vendor/symfony/http-foundation/File/Exception/IniSizeFileException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\File\Exception; - -/** - * Thrown when an UPLOAD_ERR_INI_SIZE error occurred with UploadedFile. - * - * @author Florent Mata - */ -class IniSizeFileException extends FileException -{ -} diff --git a/plugins/vendor/symfony/http-foundation/File/Exception/NoFileException.php b/plugins/vendor/symfony/http-foundation/File/Exception/NoFileException.php deleted file mode 100644 index 4b48cc77..00000000 --- a/plugins/vendor/symfony/http-foundation/File/Exception/NoFileException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\File\Exception; - -/** - * Thrown when an UPLOAD_ERR_NO_FILE error occurred with UploadedFile. - * - * @author Florent Mata - */ -class NoFileException extends FileException -{ -} diff --git a/plugins/vendor/symfony/http-foundation/File/Exception/NoTmpDirFileException.php b/plugins/vendor/symfony/http-foundation/File/Exception/NoTmpDirFileException.php deleted file mode 100644 index bdead2d9..00000000 --- a/plugins/vendor/symfony/http-foundation/File/Exception/NoTmpDirFileException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\File\Exception; - -/** - * Thrown when an UPLOAD_ERR_NO_TMP_DIR error occurred with UploadedFile. - * - * @author Florent Mata - */ -class NoTmpDirFileException extends FileException -{ -} diff --git a/plugins/vendor/symfony/http-foundation/File/Exception/PartialFileException.php b/plugins/vendor/symfony/http-foundation/File/Exception/PartialFileException.php deleted file mode 100644 index 4641efb5..00000000 --- a/plugins/vendor/symfony/http-foundation/File/Exception/PartialFileException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\File\Exception; - -/** - * Thrown when an UPLOAD_ERR_PARTIAL error occurred with UploadedFile. - * - * @author Florent Mata - */ -class PartialFileException extends FileException -{ -} diff --git a/plugins/vendor/symfony/http-foundation/File/Exception/UnexpectedTypeException.php b/plugins/vendor/symfony/http-foundation/File/Exception/UnexpectedTypeException.php deleted file mode 100644 index 09b1c7e1..00000000 --- a/plugins/vendor/symfony/http-foundation/File/Exception/UnexpectedTypeException.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\File\Exception; - -class UnexpectedTypeException extends FileException -{ - public function __construct(mixed $value, string $expectedType) - { - parent::__construct(\sprintf('Expected argument of type %s, %s given', $expectedType, get_debug_type($value))); - } -} diff --git a/plugins/vendor/symfony/http-foundation/File/Exception/UploadException.php b/plugins/vendor/symfony/http-foundation/File/Exception/UploadException.php deleted file mode 100644 index 7074e765..00000000 --- a/plugins/vendor/symfony/http-foundation/File/Exception/UploadException.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\File\Exception; - -/** - * Thrown when an error occurred during file upload. - * - * @author Bernhard Schussek - */ -class UploadException extends FileException -{ -} diff --git a/plugins/vendor/symfony/http-foundation/File/File.php b/plugins/vendor/symfony/http-foundation/File/File.php deleted file mode 100644 index 4e1f7585..00000000 --- a/plugins/vendor/symfony/http-foundation/File/File.php +++ /dev/null @@ -1,141 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\File; - -use Symfony\Component\HttpFoundation\File\Exception\FileException; -use Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException; -use Symfony\Component\Mime\MimeTypes; - -/** - * A file in the file system. - * - * @author Bernhard Schussek - */ -class File extends \SplFileInfo -{ - /** - * Constructs a new file from the given path. - * - * @param string $path The path to the file - * @param bool $checkPath Whether to check the path or not - * - * @throws FileNotFoundException If the given path is not a file - */ - public function __construct(string $path, bool $checkPath = true) - { - if ($checkPath && !is_file($path)) { - throw new FileNotFoundException($path); - } - - parent::__construct($path); - } - - /** - * Returns the extension based on the mime type. - * - * If the mime type is unknown, returns null. - * - * This method uses the mime type as guessed by getMimeType() - * to guess the file extension. - * - * @see MimeTypes - * @see getMimeType() - */ - public function guessExtension(): ?string - { - if (!class_exists(MimeTypes::class)) { - throw new \LogicException('You cannot guess the extension as the Mime component is not installed. Try running "composer require symfony/mime".'); - } - - return MimeTypes::getDefault()->getExtensions($this->getMimeType())[0] ?? null; - } - - /** - * Returns the mime type of the file. - * - * The mime type is guessed using a MimeTypeGuesserInterface instance, - * which uses finfo_file() then the "file" system binary, - * depending on which of those are available. - * - * @see MimeTypes - */ - public function getMimeType(): ?string - { - if (!class_exists(MimeTypes::class)) { - throw new \LogicException('You cannot guess the mime type as the Mime component is not installed. Try running "composer require symfony/mime".'); - } - - return MimeTypes::getDefault()->guessMimeType($this->getPathname()); - } - - /** - * Moves the file to a new location. - * - * @throws FileException if the target file could not be created - */ - public function move(string $directory, ?string $name = null): self - { - $target = $this->getTargetFile($directory, $name); - - set_error_handler(static function ($type, $msg) use (&$error) { $error = $msg; }); - try { - $renamed = rename($this->getPathname(), $target); - } finally { - restore_error_handler(); - } - if (!$renamed) { - throw new FileException(\sprintf('Could not move the file "%s" to "%s" (%s).', $this->getPathname(), $target, strip_tags($error))); - } - - @chmod($target, 0o666 & ~umask()); - - return $target; - } - - public function getContent(): string - { - $content = file_get_contents($this->getPathname()); - - if (false === $content) { - throw new FileException(\sprintf('Could not get the content of the file "%s".', $this->getPathname())); - } - - return $content; - } - - protected function getTargetFile(string $directory, ?string $name = null): self - { - if (!is_dir($directory) && !@mkdir($directory, 0o777, true) && !is_dir($directory)) { - if (is_file($directory)) { - throw new FileException(\sprintf('Unable to create the "%s" directory: a similarly-named file exists.', $directory)); - } - throw new FileException(\sprintf('Unable to create the "%s" directory.', $directory)); - } elseif (!is_writable($directory)) { - throw new FileException(\sprintf('Unable to write in the "%s" directory.', $directory)); - } - - $target = rtrim($directory, '/\\').\DIRECTORY_SEPARATOR.(null === $name ? $this->getBasename() : $this->getName($name)); - - return new self($target, false); - } - - /** - * Returns locale independent base name of the given path. - */ - protected function getName(string $name): string - { - $originalName = str_replace('\\', '/', $name); - $pos = strrpos($originalName, '/'); - - return false === $pos ? $originalName : substr($originalName, $pos + 1); - } -} diff --git a/plugins/vendor/symfony/http-foundation/File/Stream.php b/plugins/vendor/symfony/http-foundation/File/Stream.php deleted file mode 100644 index 2c156b2e..00000000 --- a/plugins/vendor/symfony/http-foundation/File/Stream.php +++ /dev/null @@ -1,25 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\File; - -/** - * A PHP stream of unknown size. - * - * @author Nicolas Grekas - */ -class Stream extends File -{ - public function getSize(): int|false - { - return false; - } -} diff --git a/plugins/vendor/symfony/http-foundation/File/UploadedFile.php b/plugins/vendor/symfony/http-foundation/File/UploadedFile.php deleted file mode 100644 index 09e623c4..00000000 --- a/plugins/vendor/symfony/http-foundation/File/UploadedFile.php +++ /dev/null @@ -1,297 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\File; - -use Symfony\Component\HttpFoundation\File\Exception\CannotWriteFileException; -use Symfony\Component\HttpFoundation\File\Exception\ExtensionFileException; -use Symfony\Component\HttpFoundation\File\Exception\FileException; -use Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException; -use Symfony\Component\HttpFoundation\File\Exception\FormSizeFileException; -use Symfony\Component\HttpFoundation\File\Exception\IniSizeFileException; -use Symfony\Component\HttpFoundation\File\Exception\NoFileException; -use Symfony\Component\HttpFoundation\File\Exception\NoTmpDirFileException; -use Symfony\Component\HttpFoundation\File\Exception\PartialFileException; -use Symfony\Component\Mime\MimeTypes; - -/** - * A file uploaded through a form. - * - * @author Bernhard Schussek - * @author Florian Eckerstorfer - * @author Fabien Potencier - */ -class UploadedFile extends File -{ - private string $originalName; - private string $mimeType; - private int $error; - private string $originalPath; - - /** - * Accepts the information of the uploaded file as provided by the PHP global $_FILES. - * - * The file object is only created when the uploaded file is valid (i.e. when the - * isValid() method returns true). Otherwise the only methods that could be called - * on an UploadedFile instance are: - * - * * getClientOriginalName, - * * getClientMimeType, - * * isValid, - * * getError. - * - * Calling any other method on an non-valid instance will cause an unpredictable result. - * - * @param string $path The full temporary path to the file - * @param string $originalName The original file name of the uploaded file - * @param string|null $mimeType The type of the file as provided by PHP; null defaults to application/octet-stream - * @param int|null $error The error constant of the upload (one of PHP's UPLOAD_ERR_XXX constants); null defaults to UPLOAD_ERR_OK - * @param bool $test Whether the test mode is active - * Local files are used in test mode hence the code should not enforce HTTP uploads - * - * @throws FileException If file_uploads is disabled - * @throws FileNotFoundException If the file does not exist - */ - public function __construct( - string $path, - string $originalName, - ?string $mimeType = null, - ?int $error = null, - private bool $test = false, - ) { - $this->originalName = $this->getName($originalName); - $this->originalPath = strtr($originalName, '\\', '/'); - $this->mimeType = $mimeType ?: 'application/octet-stream'; - $this->error = $error ?: \UPLOAD_ERR_OK; - - parent::__construct($path, \UPLOAD_ERR_OK === $this->error); - } - - /** - * Returns the original file name. - * - * It is extracted from the request from which the file has been uploaded. - * This should not be considered as a safe value to use for a file name on your servers. - */ - public function getClientOriginalName(): string - { - return $this->originalName; - } - - /** - * Returns the original file extension. - * - * It is extracted from the original file name that was uploaded. - * This should not be considered as a safe value to use for a file name on your servers. - */ - public function getClientOriginalExtension(): string - { - return pathinfo($this->originalName, \PATHINFO_EXTENSION); - } - - /** - * Returns the original file full path. - * - * It is extracted from the request from which the file has been uploaded. - * This should not be considered as a safe value to use for a file name/path on your servers. - * - * If this file was uploaded with the "webkitdirectory" upload directive, this will contain - * the path of the file relative to the uploaded root directory. Otherwise this will be identical - * to getClientOriginalName(). - */ - public function getClientOriginalPath(): string - { - return $this->originalPath; - } - - /** - * Returns the file mime type. - * - * The client mime type is extracted from the request from which the file - * was uploaded, so it should not be considered as a safe value. - * - * For a trusted mime type, use getMimeType() instead (which guesses the mime - * type based on the file content). - * - * @see getMimeType() - */ - public function getClientMimeType(): string - { - return $this->mimeType; - } - - /** - * Returns the extension based on the client mime type. - * - * If the mime type is unknown, returns null. - * - * This method uses the mime type as guessed by getClientMimeType() - * to guess the file extension. As such, the extension returned - * by this method cannot be trusted. - * - * For a trusted extension, use guessExtension() instead (which guesses - * the extension based on the guessed mime type for the file). - * - * @see guessExtension() - * @see getClientMimeType() - */ - public function guessClientExtension(): ?string - { - if (!class_exists(MimeTypes::class)) { - throw new \LogicException('You cannot guess the extension as the Mime component is not installed. Try running "composer require symfony/mime".'); - } - - return MimeTypes::getDefault()->getExtensions($this->getClientMimeType())[0] ?? null; - } - - /** - * Returns the upload error. - * - * If the upload was successful, the constant UPLOAD_ERR_OK is returned. - * Otherwise one of the other UPLOAD_ERR_XXX constants is returned. - */ - public function getError(): int - { - return $this->error; - } - - /** - * Returns whether the file has been uploaded with HTTP and no error occurred. - */ - public function isValid(): bool - { - $isOk = \UPLOAD_ERR_OK === $this->error; - - return $this->test ? $isOk : $isOk && is_uploaded_file($this->getPathname()); - } - - /** - * Moves the file to a new location. - * - * @throws FileException if, for any reason, the file could not have been moved - */ - public function move(string $directory, ?string $name = null): File - { - if ($this->isValid()) { - if ($this->test) { - return parent::move($directory, $name); - } - - $target = $this->getTargetFile($directory, $name); - - set_error_handler(static function ($type, $msg) use (&$error) { $error = $msg; }); - try { - $moved = move_uploaded_file($this->getPathname(), $target); - } finally { - restore_error_handler(); - } - if (!$moved) { - throw new FileException(\sprintf('Could not move the file "%s" to "%s" (%s).', $this->getPathname(), $target, strip_tags($error))); - } - - @chmod($target, 0o666 & ~umask()); - - return $target; - } - - switch ($this->error) { - case \UPLOAD_ERR_INI_SIZE: - throw new IniSizeFileException($this->getExceptionMessage()); - case \UPLOAD_ERR_FORM_SIZE: - throw new FormSizeFileException($this->getExceptionMessage()); - case \UPLOAD_ERR_PARTIAL: - throw new PartialFileException($this->getExceptionMessage()); - case \UPLOAD_ERR_NO_FILE: - throw new NoFileException($this->getExceptionMessage()); - case \UPLOAD_ERR_CANT_WRITE: - throw new CannotWriteFileException($this->getExceptionMessage()); - case \UPLOAD_ERR_NO_TMP_DIR: - throw new NoTmpDirFileException($this->getExceptionMessage()); - case \UPLOAD_ERR_EXTENSION: - throw new ExtensionFileException($this->getExceptionMessage()); - } - - throw new FileException($this->getExceptionMessage()); - } - - /** - * Retrieves a user-friendly error message for file upload issues, if any. - */ - public function getErrorMessage(): string - { - return \UPLOAD_ERR_OK !== $this->error ? $this->getExceptionMessage() : ''; - } - - /** - * Returns the maximum size of an uploaded file as configured in php.ini. - * - * @return int|float The maximum size of an uploaded file in bytes (returns float if size > PHP_INT_MAX) - */ - public static function getMaxFilesize(): int|float - { - $sizePostMax = self::parseFilesize(\ini_get('post_max_size')); - $sizeUploadMax = self::parseFilesize(\ini_get('upload_max_filesize')); - - return min($sizePostMax ?: \PHP_INT_MAX, $sizeUploadMax ?: \PHP_INT_MAX); - } - - private static function parseFilesize(string $size): int|float - { - if ('' === $size) { - return 0; - } - - $size = strtolower($size); - - $max = ltrim($size, '+'); - if (str_starts_with($max, '0x')) { - $max = \intval($max, 16); - } elseif (str_starts_with($max, '0')) { - $max = \intval($max, 8); - } else { - $max = (int) $max; - } - - switch (substr($size, -1)) { - case 't': $max *= 1024; - // no break - case 'g': $max *= 1024; - // no break - case 'm': $max *= 1024; - // no break - case 'k': $max *= 1024; - } - - return $max; - } - - /** - * Returns an informative upload error message. - */ - private function getExceptionMessage(): string - { - static $errors = [ - \UPLOAD_ERR_INI_SIZE => 'The file "%s" exceeds your upload_max_filesize ini directive (limit is %d KiB).', - \UPLOAD_ERR_FORM_SIZE => 'The file "%s" exceeds the upload limit defined in your form.', - \UPLOAD_ERR_PARTIAL => 'The file "%s" was only partially uploaded.', - \UPLOAD_ERR_NO_FILE => 'No file was uploaded.', - \UPLOAD_ERR_CANT_WRITE => 'The file "%s" could not be written on disk.', - \UPLOAD_ERR_NO_TMP_DIR => 'File could not be uploaded: missing temporary directory.', - \UPLOAD_ERR_EXTENSION => 'File upload was stopped by a PHP extension.', - ]; - - $errorCode = $this->error; - $maxFilesize = \UPLOAD_ERR_INI_SIZE === $errorCode ? self::getMaxFilesize() / 1024 : 0; - $message = $errors[$errorCode] ?? 'The file "%s" was not uploaded due to an unknown error.'; - - return \sprintf($message, $this->getClientOriginalName(), $maxFilesize); - } -} diff --git a/plugins/vendor/symfony/http-foundation/FileBag.php b/plugins/vendor/symfony/http-foundation/FileBag.php deleted file mode 100644 index 561e7cde..00000000 --- a/plugins/vendor/symfony/http-foundation/FileBag.php +++ /dev/null @@ -1,127 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation; - -use Symfony\Component\HttpFoundation\File\UploadedFile; - -/** - * FileBag is a container for uploaded files. - * - * @author Fabien Potencier - * @author Bulat Shakirzyanov - */ -class FileBag extends ParameterBag -{ - private const FILE_KEYS = ['error', 'full_path', 'name', 'size', 'tmp_name', 'type']; - - /** - * @param array|UploadedFile[] $parameters An array of HTTP files - */ - public function __construct(array $parameters = []) - { - $this->replace($parameters); - } - - public function replace(array $files = []): void - { - $this->parameters = []; - $this->add($files); - } - - public function set(string $key, mixed $value): void - { - if (!\is_array($value) && !$value instanceof UploadedFile) { - throw new \InvalidArgumentException('An uploaded file must be an array or an instance of UploadedFile.'); - } - - parent::set($key, $this->convertFileInformation($value)); - } - - public function add(array $files = []): void - { - foreach ($files as $key => $file) { - $this->set($key, $file); - } - } - - /** - * Converts uploaded files to UploadedFile instances. - * - * @return UploadedFile[]|UploadedFile|null - */ - protected function convertFileInformation(array|UploadedFile $file): array|UploadedFile|null - { - if ($file instanceof UploadedFile) { - return $file; - } - - $file = $this->fixPhpFilesArray($file); - $keys = array_keys($file + ['full_path' => null]); - sort($keys); - - if (self::FILE_KEYS === $keys) { - if (\UPLOAD_ERR_NO_FILE === $file['error']) { - $file = null; - } else { - $file = new UploadedFile($file['tmp_name'], $file['full_path'] ?? $file['name'], $file['type'], $file['error'], false); - } - } else { - $file = array_map(fn ($v) => $v instanceof UploadedFile || \is_array($v) ? $this->convertFileInformation($v) : $v, $file); - if (array_is_list($file)) { - $file = array_filter($file); - } - } - - return $file; - } - - /** - * Fixes a malformed PHP $_FILES array. - * - * PHP has a bug that the format of the $_FILES array differs, depending on - * whether the uploaded file fields had normal field names or array-like - * field names ("normal" vs. "parent[child]"). - * - * This method fixes the array to look like the "normal" $_FILES array. - * - * It's safe to pass an already converted array, in which case this method - * just returns the original array unmodified. - */ - protected function fixPhpFilesArray(array $data): array - { - $keys = array_keys($data + ['full_path' => null]); - sort($keys); - - if (self::FILE_KEYS !== $keys || !isset($data['name']) || !\is_array($data['name'])) { - return $data; - } - - $files = $data; - foreach (self::FILE_KEYS as $k) { - unset($files[$k]); - } - - foreach ($data['name'] as $key => $name) { - $files[$key] = $this->fixPhpFilesArray([ - 'error' => $data['error'][$key], - 'name' => $name, - 'type' => $data['type'][$key], - 'tmp_name' => $data['tmp_name'][$key], - 'size' => $data['size'][$key], - ] + (isset($data['full_path'][$key]) ? [ - 'full_path' => $data['full_path'][$key], - ] : [])); - } - - return $files; - } -} diff --git a/plugins/vendor/symfony/http-foundation/HeaderBag.php b/plugins/vendor/symfony/http-foundation/HeaderBag.php deleted file mode 100644 index c2ede560..00000000 --- a/plugins/vendor/symfony/http-foundation/HeaderBag.php +++ /dev/null @@ -1,273 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation; - -/** - * HeaderBag is a container for HTTP headers. - * - * @author Fabien Potencier - * - * @implements \IteratorAggregate> - */ -class HeaderBag implements \IteratorAggregate, \Countable, \Stringable -{ - protected const UPPER = '_ABCDEFGHIJKLMNOPQRSTUVWXYZ'; - protected const LOWER = '-abcdefghijklmnopqrstuvwxyz'; - - /** - * @var array> - */ - protected array $headers = []; - protected array $cacheControl = []; - - public function __construct(array $headers = []) - { - foreach ($headers as $key => $values) { - $this->set($key, $values); - } - } - - /** - * Returns the headers as a string. - */ - public function __toString(): string - { - if (!$headers = $this->all()) { - return ''; - } - - ksort($headers); - $max = max(array_map('strlen', array_keys($headers))) + 1; - $content = ''; - foreach ($headers as $name => $values) { - $name = ucwords($name, '-'); - foreach ($values as $value) { - $content .= \sprintf("%-{$max}s %s\r\n", $name.':', $value); - } - } - - return $content; - } - - /** - * Returns the headers. - * - * @param string|null $key The name of the headers to return or null to get them all - * - * @return ($key is null ? array> : list) - */ - public function all(?string $key = null): array - { - if (null !== $key) { - return $this->headers[strtr($key, self::UPPER, self::LOWER)] ?? []; - } - - return $this->headers; - } - - /** - * Returns the parameter keys. - * - * @return string[] - */ - public function keys(): array - { - return array_keys($this->all()); - } - - /** - * Replaces the current HTTP headers by a new set. - */ - public function replace(array $headers = []): void - { - $this->headers = []; - $this->add($headers); - } - - /** - * Adds new headers the current HTTP headers set. - */ - public function add(array $headers): void - { - foreach ($headers as $key => $values) { - $this->set($key, $values); - } - } - - /** - * Returns the first header by name or the default one. - */ - public function get(string $key, ?string $default = null): ?string - { - $headers = $this->all($key); - - if (!$headers) { - return $default; - } - - if (null === $headers[0]) { - return null; - } - - return $headers[0]; - } - - /** - * Sets a header by name. - * - * @param string|string[]|null $values The value or an array of values - * @param bool $replace Whether to replace the actual value or not (true by default) - */ - public function set(string $key, string|array|null $values, bool $replace = true): void - { - $key = strtr($key, self::UPPER, self::LOWER); - - if (\is_array($values)) { - $values = array_values($values); - - if (true === $replace || !isset($this->headers[$key])) { - $this->headers[$key] = $values; - } else { - $this->headers[$key] = array_merge($this->headers[$key], $values); - } - } else { - if (true === $replace || !isset($this->headers[$key])) { - $this->headers[$key] = [$values]; - } else { - $this->headers[$key][] = $values; - } - } - - if ('cache-control' === $key) { - $this->cacheControl = $this->parseCacheControl(implode(', ', $this->headers[$key])); - } - } - - /** - * Returns true if the HTTP header is defined. - */ - public function has(string $key): bool - { - return \array_key_exists(strtr($key, self::UPPER, self::LOWER), $this->all()); - } - - /** - * Returns true if the given HTTP header contains the given value. - */ - public function contains(string $key, string $value): bool - { - return \in_array($value, $this->all($key), true); - } - - /** - * Removes a header. - */ - public function remove(string $key): void - { - $key = strtr($key, self::UPPER, self::LOWER); - - unset($this->headers[$key]); - - if ('cache-control' === $key) { - $this->cacheControl = []; - } - } - - /** - * Returns the HTTP header value converted to a date. - * - * @throws \RuntimeException When the HTTP header is not parseable - */ - public function getDate(string $key, ?\DateTimeInterface $default = null): ?\DateTimeImmutable - { - if (null === $value = $this->get($key)) { - return null !== $default ? \DateTimeImmutable::createFromInterface($default) : null; - } - - if (false === $date = \DateTimeImmutable::createFromFormat(\DATE_RFC2822, $value)) { - throw new \RuntimeException(\sprintf('The "%s" HTTP header is not parseable (%s).', $key, $value)); - } - - return $date; - } - - /** - * Adds a custom Cache-Control directive. - */ - public function addCacheControlDirective(string $key, bool|string $value = true): void - { - $this->cacheControl[$key] = $value; - - $this->set('Cache-Control', $this->getCacheControlHeader()); - } - - /** - * Returns true if the Cache-Control directive is defined. - */ - public function hasCacheControlDirective(string $key): bool - { - return \array_key_exists($key, $this->cacheControl); - } - - /** - * Returns a Cache-Control directive value by name. - */ - public function getCacheControlDirective(string $key): bool|string|null - { - return $this->cacheControl[$key] ?? null; - } - - /** - * Removes a Cache-Control directive. - */ - public function removeCacheControlDirective(string $key): void - { - unset($this->cacheControl[$key]); - - $this->set('Cache-Control', $this->getCacheControlHeader()); - } - - /** - * Returns an iterator for headers. - * - * @return \ArrayIterator> - */ - public function getIterator(): \ArrayIterator - { - return new \ArrayIterator($this->headers); - } - - /** - * Returns the number of headers. - */ - public function count(): int - { - return \count($this->headers); - } - - protected function getCacheControlHeader(): string - { - ksort($this->cacheControl); - - return HeaderUtils::toString($this->cacheControl, ','); - } - - /** - * Parses a Cache-Control HTTP header. - */ - protected function parseCacheControl(string $header): array - { - $parts = HeaderUtils::split($header, ',='); - - return HeaderUtils::combine($parts); - } -} diff --git a/plugins/vendor/symfony/http-foundation/HeaderUtils.php b/plugins/vendor/symfony/http-foundation/HeaderUtils.php deleted file mode 100644 index 37953af4..00000000 --- a/plugins/vendor/symfony/http-foundation/HeaderUtils.php +++ /dev/null @@ -1,298 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation; - -/** - * HTTP header utility functions. - * - * @author Christian Schmidt - */ -class HeaderUtils -{ - public const DISPOSITION_ATTACHMENT = 'attachment'; - public const DISPOSITION_INLINE = 'inline'; - - /** - * This class should not be instantiated. - */ - private function __construct() - { - } - - /** - * Splits an HTTP header by one or more separators. - * - * Example: - * - * HeaderUtils::split('da, en-gb;q=0.8', ',;') - * # returns [['da'], ['en-gb', 'q=0.8']] - * - * @param string $separators List of characters to split on, ordered by - * precedence, e.g. ',', ';=', or ',;=' - * - * @return array Nested array with as many levels as there are characters in - * $separators - */ - public static function split(string $header, string $separators): array - { - if ('' === $separators) { - throw new \InvalidArgumentException('At least one separator must be specified.'); - } - - $quotedSeparators = preg_quote($separators, '/'); - - preg_match_all(' - / - (?!\s) - (?: - # quoted-string - "(?:[^"\\\\]|\\\\.)*(?:"|\\\\|$) - | - # token - [^"'.$quotedSeparators.']+ - )+ - (?['.$quotedSeparators.']) - \s* - /x', trim($header), $matches, \PREG_SET_ORDER); - - return self::groupParts($matches, $separators); - } - - /** - * Combines an array of arrays into one associative array. - * - * Each of the nested arrays should have one or two elements. The first - * value will be used as the keys in the associative array, and the second - * will be used as the values, or true if the nested array only contains one - * element. Array keys are lowercased. - * - * Example: - * - * HeaderUtils::combine([['foo', 'abc'], ['bar']]) - * // => ['foo' => 'abc', 'bar' => true] - */ - public static function combine(array $parts): array - { - $assoc = []; - foreach ($parts as $part) { - $name = strtolower($part[0]); - $value = $part[1] ?? true; - $assoc[$name] = $value; - } - - return $assoc; - } - - /** - * Joins an associative array into a string for use in an HTTP header. - * - * The key and value of each entry are joined with '=', and all entries - * are joined with the specified separator and an additional space (for - * readability). Values are quoted if necessary. - * - * Example: - * - * HeaderUtils::toString(['foo' => 'abc', 'bar' => true, 'baz' => 'a b c'], ',') - * // => 'foo=abc, bar, baz="a b c"' - */ - public static function toString(array $assoc, string $separator): string - { - $parts = []; - foreach ($assoc as $name => $value) { - if (true === $value) { - $parts[] = $name; - } else { - $parts[] = $name.'='.self::quote($value); - } - } - - return implode($separator.' ', $parts); - } - - /** - * Encodes a string as a quoted string, if necessary. - * - * If a string contains characters not allowed by the "token" construct in - * the HTTP specification, it is backslash-escaped and enclosed in quotes - * to match the "quoted-string" construct. - */ - public static function quote(string $s): string - { - if (preg_match('/^[a-z0-9!#$%&\'*.^_`|~-]+$/i', $s)) { - return $s; - } - - return '"'.addcslashes($s, '"\\"').'"'; - } - - /** - * Decodes a quoted string. - * - * If passed an unquoted string that matches the "token" construct (as - * defined in the HTTP specification), it is passed through verbatim. - */ - public static function unquote(string $s): string - { - return preg_replace('/\\\\(.)|"/', '$1', $s); - } - - /** - * Generates an HTTP Content-Disposition field-value. - * - * @param string $disposition One of "inline" or "attachment" - * @param string $filename A unicode string - * @param string $filenameFallback A string containing only ASCII characters that - * is semantically equivalent to $filename. If the filename is already ASCII, - * it can be omitted, or just copied from $filename - * - * @throws \InvalidArgumentException - * - * @see RFC 6266 - */ - public static function makeDisposition(string $disposition, string $filename, string $filenameFallback = ''): string - { - if (!\in_array($disposition, [self::DISPOSITION_ATTACHMENT, self::DISPOSITION_INLINE], true)) { - throw new \InvalidArgumentException(\sprintf('The disposition must be either "%s" or "%s".', self::DISPOSITION_ATTACHMENT, self::DISPOSITION_INLINE)); - } - - if ('' === $filenameFallback) { - $filenameFallback = $filename; - } - - // filenameFallback is not ASCII. - if (!preg_match('/^[\x20-\x7e]*$/', $filenameFallback)) { - throw new \InvalidArgumentException('The filename fallback must only contain ASCII characters.'); - } - - // percent characters aren't safe in fallback. - if (str_contains($filenameFallback, '%')) { - throw new \InvalidArgumentException('The filename fallback cannot contain the "%" character.'); - } - - // path separators aren't allowed in either. - if (str_contains($filename, '/') || str_contains($filename, '\\') || str_contains($filenameFallback, '/') || str_contains($filenameFallback, '\\')) { - throw new \InvalidArgumentException('The filename and the fallback cannot contain the "/" and "\\" characters.'); - } - - $params = ['filename' => $filenameFallback]; - if ($filename !== $filenameFallback) { - $params['filename*'] = "utf-8''".rawurlencode($filename); - } - - return $disposition.'; '.self::toString($params, ';'); - } - - /** - * Like parse_str(), but preserves dots in variable names. - */ - public static function parseQuery(string $query, bool $ignoreBrackets = false, string $separator = '&'): array - { - $q = []; - - foreach (explode($separator, $query) as $v) { - if (false !== $i = strpos($v, "\0")) { - $v = substr($v, 0, $i); - } - - if (false === $i = strpos($v, '=')) { - $k = urldecode($v); - $v = ''; - } else { - $k = urldecode(substr($v, 0, $i)); - $v = substr($v, $i); - } - - if (false !== $i = strpos($k, "\0")) { - $k = substr($k, 0, $i); - } - - $k = ltrim($k, ' '); - - if ($ignoreBrackets) { - $q[$k][] = urldecode(substr($v, 1)); - - continue; - } - - if (false === $i = strpos($k, '[')) { - $q[] = bin2hex($k).$v; - } else { - $q[] = bin2hex(substr($k, 0, $i)).rawurlencode(substr($k, $i)).$v; - } - } - - if ($ignoreBrackets) { - return $q; - } - - parse_str(implode('&', $q), $q); - - $query = []; - - foreach ($q as $k => $v) { - if (false !== $i = strpos($k, '_')) { - $query[substr_replace($k, hex2bin(substr($k, 0, $i)).'[', 0, 1 + $i)] = $v; - } else { - $query[hex2bin($k)] = $v; - } - } - - return $query; - } - - private static function groupParts(array $matches, string $separators, bool $first = true): array - { - $separator = $separators[0]; - $separators = substr($separators, 1) ?: ''; - $i = 0; - - if ('' === $separators && !$first) { - $parts = ['']; - - foreach ($matches as $match) { - if (!$i && isset($match['separator'])) { - $i = 1; - $parts[1] = ''; - } else { - $parts[$i] .= self::unquote($match[0]); - } - } - - return $parts; - } - - $parts = []; - $partMatches = []; - - foreach ($matches as $match) { - if (($match['separator'] ?? null) === $separator) { - ++$i; - } else { - $partMatches[$i][] = $match; - } - } - - foreach ($partMatches as $matches) { - if ('' === $separators && '' !== $unquoted = self::unquote($matches[0][0])) { - $parts[] = $unquoted; - } elseif ($groupedParts = self::groupParts($matches, $separators, false)) { - $parts[] = $groupedParts; - } - } - - return $parts; - } -} diff --git a/plugins/vendor/symfony/http-foundation/InputBag.php b/plugins/vendor/symfony/http-foundation/InputBag.php deleted file mode 100644 index 8c153dc3..00000000 --- a/plugins/vendor/symfony/http-foundation/InputBag.php +++ /dev/null @@ -1,152 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation; - -use Symfony\Component\HttpFoundation\Exception\BadRequestException; -use Symfony\Component\HttpFoundation\Exception\UnexpectedValueException; - -/** - * InputBag is a container for user input values such as $_GET, $_POST, $_REQUEST, and $_COOKIE. - * - * @template TInput of string|int|float|bool|null - * - * @author Saif Eddin Gmati - */ -final class InputBag extends ParameterBag -{ - /** - * Returns a scalar input value by name. - * - * @template TDefault of string|int|float|bool|null - * - * @param TDefault $default The default value if the input key does not exist - * - * @return TDefault|TInput - * - * @throws BadRequestException if the input contains a non-scalar value - */ - public function get(string $key, mixed $default = null): string|int|float|bool|null - { - if (null !== $default && !\is_scalar($default) && !$default instanceof \Stringable) { - throw new \InvalidArgumentException(\sprintf('Expected a scalar value as a 2nd argument to "%s()", "%s" given.', __METHOD__, get_debug_type($default))); - } - - $value = parent::get($key, $this); - - if (null !== $value && $this !== $value && !\is_scalar($value) && !$value instanceof \Stringable) { - throw new BadRequestException(\sprintf('Input value "%s" contains a non-scalar value.', $key)); - } - - return $this === $value ? $default : $value; - } - - /** - * Replaces the current input values by a new set. - */ - public function replace(array $inputs = []): void - { - $this->parameters = []; - $this->add($inputs); - } - - /** - * Adds input values. - */ - public function add(array $inputs = []): void - { - foreach ($inputs as $input => $value) { - $this->set($input, $value); - } - } - - /** - * Sets an input by name. - * - * @param string|int|float|bool|array|null $value - */ - public function set(string $key, mixed $value): void - { - if (null !== $value && !\is_scalar($value) && !\is_array($value) && !$value instanceof \Stringable) { - throw new \InvalidArgumentException(\sprintf('Expected a scalar, or an array as a 2nd argument to "%s()", "%s" given.', __METHOD__, get_debug_type($value))); - } - - $this->parameters[$key] = $value; - } - - /** - * Returns the parameter value converted to an enum. - * - * @template T of \BackedEnum - * - * @param class-string $class - * @param ?T $default - * - * @return ?T - * - * @psalm-return ($default is null ? T|null : T) - * - * @throws BadRequestException if the input cannot be converted to an enum - */ - public function getEnum(string $key, string $class, ?\BackedEnum $default = null): ?\BackedEnum - { - try { - return parent::getEnum($key, $class, $default); - } catch (UnexpectedValueException $e) { - throw new BadRequestException($e->getMessage(), $e->getCode(), $e); - } - } - - /** - * Returns the parameter value converted to string. - * - * @throws BadRequestException if the input contains a non-scalar value - */ - public function getString(string $key, string $default = ''): string - { - // Shortcuts the parent method because the validation on scalar is already done in get(). - return (string) $this->get($key, $default); - } - - /** - * @throws BadRequestException if the input value is an array and \FILTER_REQUIRE_ARRAY or \FILTER_FORCE_ARRAY is not set - * @throws BadRequestException if the input value is invalid and \FILTER_NULL_ON_FAILURE is not set - */ - public function filter(string $key, mixed $default = null, int $filter = \FILTER_DEFAULT, mixed $options = []): mixed - { - $value = $this->has($key) ? $this->all()[$key] : $default; - - // Always turn $options into an array - this allows filter_var option shortcuts. - if (!\is_array($options) && $options) { - $options = ['flags' => $options]; - } - - if (\is_array($value) && !(($options['flags'] ?? 0) & (\FILTER_REQUIRE_ARRAY | \FILTER_FORCE_ARRAY))) { - throw new BadRequestException(\sprintf('Input value "%s" contains an array, but "FILTER_REQUIRE_ARRAY" or "FILTER_FORCE_ARRAY" flags were not set.', $key)); - } - - if ((\FILTER_CALLBACK & $filter) && !(($options['options'] ?? null) instanceof \Closure)) { - throw new \InvalidArgumentException(\sprintf('A Closure must be passed to "%s()" when FILTER_CALLBACK is used, "%s" given.', __METHOD__, get_debug_type($options['options'] ?? null))); - } - - $options['flags'] ??= 0; - $nullOnFailure = $options['flags'] & \FILTER_NULL_ON_FAILURE; - $options['flags'] |= \FILTER_NULL_ON_FAILURE; - - $value = filter_var($value, $filter, $options); - - if (null !== $value || $nullOnFailure) { - return $value; - } - - throw new BadRequestException(\sprintf('Input value "%s" is invalid and flag "FILTER_NULL_ON_FAILURE" was not set.', $key)); - } -} diff --git a/plugins/vendor/symfony/http-foundation/IpUtils.php b/plugins/vendor/symfony/http-foundation/IpUtils.php deleted file mode 100644 index fa5e634d..00000000 --- a/plugins/vendor/symfony/http-foundation/IpUtils.php +++ /dev/null @@ -1,278 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation; - -/** - * Http utility functions. - * - * @author Fabien Potencier - */ -class IpUtils -{ - public const PRIVATE_SUBNETS = [ - '127.0.0.0/8', // RFC1700 (Loopback) - '10.0.0.0/8', // RFC1918 - '192.168.0.0/16', // RFC1918 - '172.16.0.0/12', // RFC1918 - '169.254.0.0/16', // RFC3927 - '0.0.0.0/8', // RFC5735 - '240.0.0.0/4', // RFC1112 - '::1/128', // Loopback - 'fc00::/7', // Unique Local Address - 'fe80::/10', // Link Local Address - '::ffff:0:0/96', // IPv4-mapped IPv6 addresses (RFC 4291 section 2.5.5.2) - '::/128', // Unspecified address - '::/96', // IPv4-compatible IPv6 addresses (RFC 4291 section 2.5.5.1) - '2002::/16', // 6to4 (RFC 3056) - '2001::/32', // Teredo tunneling (RFC 4380) - '64:ff9b::/96', // NAT64 well-known prefix (RFC 6052) - '64:ff9b:1::/48', // NAT64 local-use prefix (RFC 8215) - ]; - - private static array $checkedIps = []; - - /** - * This class should not be instantiated. - */ - private function __construct() - { - } - - /** - * Checks if an IPv4 or IPv6 address is contained in the list of given IPs or subnets. - * - * @param string|array $ips List of IPs or subnets (can be a string if only a single one) - */ - public static function checkIp(string $requestIp, string|array $ips): bool - { - if (!\is_array($ips)) { - $ips = [$ips]; - } - - $method = substr_count($requestIp, ':') > 1 ? 'checkIp6' : 'checkIp4'; - - foreach ($ips as $ip) { - if (self::$method($requestIp, $ip)) { - return true; - } - } - - return false; - } - - /** - * Compares two IPv4 addresses. - * In case a subnet is given, it checks if it contains the request IP. - * - * @param string $ip IPv4 address or subnet in CIDR notation - * - * @return bool Whether the request IP matches the IP, or whether the request IP is within the CIDR subnet - */ - public static function checkIp4(string $requestIp, string $ip): bool - { - $cacheKey = $requestIp.'-'.$ip.'-v4'; - if (null !== $cacheValue = self::getCacheResult($cacheKey)) { - return $cacheValue; - } - - if (!filter_var($requestIp, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV4)) { - return self::setCacheResult($cacheKey, false); - } - - if (str_contains($ip, '/')) { - [$address, $netmask] = explode('/', $ip, 2); - - if ('0' === $netmask) { - return self::setCacheResult($cacheKey, false !== filter_var($address, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV4)); - } - - if ($netmask < 0 || $netmask > 32) { - return self::setCacheResult($cacheKey, false); - } - } else { - $address = $ip; - $netmask = 32; - } - - if (false === ip2long($address)) { - return self::setCacheResult($cacheKey, false); - } - - return self::setCacheResult($cacheKey, 0 === substr_compare(\sprintf('%032b', ip2long($requestIp)), \sprintf('%032b', ip2long($address)), 0, $netmask)); - } - - /** - * Compares two IPv6 addresses. - * In case a subnet is given, it checks if it contains the request IP. - * - * @author David Soria Parra - * - * @see https://github.com/dsp/v6tools - * - * @param string $ip IPv6 address or subnet in CIDR notation - * - * @throws \RuntimeException When IPV6 support is not enabled - */ - public static function checkIp6(string $requestIp, string $ip): bool - { - $cacheKey = $requestIp.'-'.$ip.'-v6'; - if (null !== $cacheValue = self::getCacheResult($cacheKey)) { - return $cacheValue; - } - - if (!((\extension_loaded('sockets') && \defined('AF_INET6')) || @inet_pton('::1'))) { - throw new \RuntimeException('Unable to check Ipv6. Check that PHP was not compiled with option "disable-ipv6".'); - } - - // Check to see if we were given a IP4 $requestIp or $ip by mistake - if (!filter_var($requestIp, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV6)) { - return self::setCacheResult($cacheKey, false); - } - - if (str_contains($ip, '/')) { - [$address, $netmask] = explode('/', $ip, 2); - - if (!filter_var($address, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV6)) { - return self::setCacheResult($cacheKey, false); - } - - if ('0' === $netmask) { - return (bool) unpack('n*', @inet_pton($address)); - } - - if ($netmask < 1 || $netmask > 128) { - return self::setCacheResult($cacheKey, false); - } - } else { - if (!filter_var($ip, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV6)) { - return self::setCacheResult($cacheKey, false); - } - - $address = $ip; - $netmask = 128; - } - - $bytesAddr = unpack('n*', @inet_pton($address)); - $bytesTest = unpack('n*', @inet_pton($requestIp)); - - if (!$bytesAddr || !$bytesTest) { - return self::setCacheResult($cacheKey, false); - } - - for ($i = 1, $ceil = ceil($netmask / 16); $i <= $ceil; ++$i) { - $left = $netmask - 16 * ($i - 1); - $left = ($left <= 16) ? $left : 16; - $mask = ~(0xFFFF >> $left) & 0xFFFF; - if (($bytesAddr[$i] & $mask) != ($bytesTest[$i] & $mask)) { - return self::setCacheResult($cacheKey, false); - } - } - - return self::setCacheResult($cacheKey, true); - } - - /** - * Anonymizes an IP/IPv6. - * - * Removes the last bytes of IPv4 and IPv6 addresses (1 byte for IPv4 and 8 bytes for IPv6 by default). - * - * @param int<0, 4> $v4Bytes - * @param int<0, 16> $v6Bytes - */ - public static function anonymize(string $ip/* , int $v4Bytes = 1, int $v6Bytes = 8 */): string - { - $v4Bytes = 1 < \func_num_args() ? func_get_arg(1) : 1; - $v6Bytes = 2 < \func_num_args() ? func_get_arg(2) : 8; - - if ($v4Bytes < 0 || $v6Bytes < 0) { - throw new \InvalidArgumentException('Cannot anonymize less than 0 bytes.'); - } - - if ($v4Bytes > 4 || $v6Bytes > 16) { - throw new \InvalidArgumentException('Cannot anonymize more than 4 bytes for IPv4 and 16 bytes for IPv6.'); - } - - /* - * If the IP contains a % symbol, then it is a local-link address with scoping according to RFC 4007 - * In that case, we only care about the part before the % symbol, as the following functions, can only work with - * the IP address itself. As the scope can leak information (containing interface name), we do not want to - * include it in our anonymized IP data. - */ - if (str_contains($ip, '%')) { - $ip = substr($ip, 0, strpos($ip, '%')); - } - - $wrappedIPv6 = false; - if (str_starts_with($ip, '[') && str_ends_with($ip, ']')) { - $wrappedIPv6 = true; - $ip = substr($ip, 1, -1); - } - - $mappedIpV4MaskGenerator = static function (string $mask, int $bytesToAnonymize) { - $mask .= str_repeat('ff', 4 - $bytesToAnonymize); - $mask .= str_repeat('00', $bytesToAnonymize); - - return '::'.implode(':', str_split($mask, 4)); - }; - - $packedAddress = inet_pton($ip); - if (4 === \strlen($packedAddress)) { - $mask = rtrim(str_repeat('255.', 4 - $v4Bytes).str_repeat('0.', $v4Bytes), '.'); - } elseif ($ip === inet_ntop($packedAddress & inet_pton('::ffff:ffff:ffff'))) { - $mask = $mappedIpV4MaskGenerator('ffff', $v4Bytes); - } elseif ($ip === inet_ntop($packedAddress & inet_pton('::ffff:ffff'))) { - $mask = $mappedIpV4MaskGenerator('', $v4Bytes); - } else { - $mask = str_repeat('ff', 16 - $v6Bytes).str_repeat('00', $v6Bytes); - $mask = implode(':', str_split($mask, 4)); - } - $ip = inet_ntop($packedAddress & inet_pton($mask)); - - if ($wrappedIPv6) { - $ip = '['.$ip.']'; - } - - return $ip; - } - - /** - * Checks if an IPv4 or IPv6 address is contained in the list of private IP subnets. - */ - public static function isPrivateIp(string $requestIp): bool - { - return self::checkIp($requestIp, self::PRIVATE_SUBNETS); - } - - private static function getCacheResult(string $cacheKey): ?bool - { - if (isset(self::$checkedIps[$cacheKey])) { - // Move the item last in cache (LRU) - $value = self::$checkedIps[$cacheKey]; - unset(self::$checkedIps[$cacheKey]); - self::$checkedIps[$cacheKey] = $value; - - return self::$checkedIps[$cacheKey]; - } - - return null; - } - - private static function setCacheResult(string $cacheKey, bool $result): bool - { - if (1000 < \count(self::$checkedIps)) { - // stop memory leak if there are many keys - self::$checkedIps = \array_slice(self::$checkedIps, 500, null, true); - } - - return self::$checkedIps[$cacheKey] = $result; - } -} diff --git a/plugins/vendor/symfony/http-foundation/JsonResponse.php b/plugins/vendor/symfony/http-foundation/JsonResponse.php deleted file mode 100644 index 187173b6..00000000 --- a/plugins/vendor/symfony/http-foundation/JsonResponse.php +++ /dev/null @@ -1,187 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation; - -/** - * Response represents an HTTP response in JSON format. - * - * Note that this class does not force the returned JSON content to be an - * object. It is however recommended that you do return an object as it - * protects yourself against XSSI and JSON-JavaScript Hijacking. - * - * @see https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/AJAX_Security_Cheat_Sheet.md#always-return-json-with-an-object-on-the-outside - * - * @author Igor Wiedler - */ -class JsonResponse extends Response -{ - protected mixed $data; - protected ?string $callback = null; - - // Encode <, >, ', &, and " characters in the JSON, making it also safe to be embedded into HTML. - // 15 === JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT - public const DEFAULT_ENCODING_OPTIONS = 15; - - protected int $encodingOptions = self::DEFAULT_ENCODING_OPTIONS; - - /** - * @param bool $json If the data is already a JSON string - */ - public function __construct(mixed $data = null, int $status = 200, array $headers = [], bool $json = false) - { - parent::__construct('', $status, $headers); - - if ($json && !\is_string($data) && !is_numeric($data) && !$data instanceof \Stringable) { - throw new \TypeError(\sprintf('"%s": If $json is set to true, argument $data must be a string or object implementing __toString(), "%s" given.', __METHOD__, get_debug_type($data))); - } - - $data ??= new \ArrayObject(); - - $json ? $this->setJson($data) : $this->setData($data); - } - - /** - * Factory method for chainability. - * - * Example: - * - * return JsonResponse::fromJsonString('{"key": "value"}') - * ->setSharedMaxAge(300); - * - * @param string $data The JSON response string - * @param int $status The response status code (200 "OK" by default) - * @param array $headers An array of response headers - */ - public static function fromJsonString(string $data, int $status = 200, array $headers = []): static - { - return new static($data, $status, $headers, true); - } - - /** - * Sets the JSONP callback. - * - * @param string|null $callback The JSONP callback or null to use none - * - * @return $this - * - * @throws \InvalidArgumentException When the callback name is not valid - */ - public function setCallback(?string $callback): static - { - if (null !== $callback) { - // partially taken from https://geekality.net/2011/08/03/valid-javascript-identifier/ - // partially taken from https://github.com/willdurand/JsonpCallbackValidator - // JsonpCallbackValidator is released under the MIT License. See https://github.com/willdurand/JsonpCallbackValidator/blob/v1.1.0/LICENSE for details. - // (c) William Durand - $pattern = '/^[$_\p{L}][$_\p{L}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\x{200C}\x{200D}]*(?:\[(?:"(?:\\\.|[^"\\\])*"|\'(?:\\\.|[^\'\\\])*\'|\d+)\])*?$/u'; - $reserved = [ - 'break', 'do', 'instanceof', 'typeof', 'case', 'else', 'new', 'var', 'catch', 'finally', 'return', 'void', 'continue', 'for', 'switch', 'while', - 'debugger', 'function', 'this', 'with', 'default', 'if', 'throw', 'delete', 'in', 'try', 'class', 'enum', 'extends', 'super', 'const', 'export', - 'import', 'implements', 'let', 'private', 'public', 'yield', 'interface', 'package', 'protected', 'static', 'null', 'true', 'false', - ]; - $parts = explode('.', $callback); - foreach ($parts as $part) { - if (!preg_match($pattern, $part) || \in_array($part, $reserved, true)) { - throw new \InvalidArgumentException('The callback name is not valid.'); - } - } - } - - $this->callback = $callback; - - return $this->update(); - } - - /** - * Sets a raw string containing a JSON document to be sent. - * - * @return $this - */ - public function setJson(string $json): static - { - $this->data = $json; - - return $this->update(); - } - - /** - * Sets the data to be sent as JSON. - * - * @return $this - * - * @throws \InvalidArgumentException - */ - public function setData(mixed $data = []): static - { - try { - $data = json_encode($data, $this->encodingOptions); - } catch (\Exception $e) { - if ('Exception' === $e::class && str_starts_with($e->getMessage(), 'Failed calling ')) { - throw $e->getPrevious() ?: $e; - } - throw $e; - } - - if (\JSON_THROW_ON_ERROR & $this->encodingOptions) { - return $this->setJson($data); - } - - if (\JSON_ERROR_NONE !== json_last_error()) { - throw new \InvalidArgumentException(json_last_error_msg()); - } - - return $this->setJson($data); - } - - /** - * Returns options used while encoding data to JSON. - */ - public function getEncodingOptions(): int - { - return $this->encodingOptions; - } - - /** - * Sets options used while encoding data to JSON. - * - * @return $this - */ - public function setEncodingOptions(int $encodingOptions): static - { - $this->encodingOptions = $encodingOptions; - - return $this->setData(json_decode($this->data)); - } - - /** - * Updates the content and headers according to the JSON data and callback. - * - * @return $this - */ - protected function update(): static - { - if (null !== $this->callback) { - // Not using application/javascript for compatibility reasons with older browsers. - $this->headers->set('Content-Type', 'text/javascript'); - - return $this->setContent(\sprintf('/**/%s(%s);', $this->callback, $this->data)); - } - - // Only set the header when there is none or when it equals 'text/javascript' (from a previous update with callback) - // in order to not overwrite a custom definition. - if (!$this->headers->has('Content-Type') || 'text/javascript' === $this->headers->get('Content-Type')) { - $this->headers->set('Content-Type', 'application/json'); - } - - return $this->setContent($this->data); - } -} diff --git a/plugins/vendor/symfony/http-foundation/LICENSE b/plugins/vendor/symfony/http-foundation/LICENSE deleted file mode 100644 index 0138f8f0..00000000 --- a/plugins/vendor/symfony/http-foundation/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2004-present Fabien Potencier - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/plugins/vendor/symfony/http-foundation/ParameterBag.php b/plugins/vendor/symfony/http-foundation/ParameterBag.php deleted file mode 100644 index 5e36cf2f..00000000 --- a/plugins/vendor/symfony/http-foundation/ParameterBag.php +++ /dev/null @@ -1,271 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation; - -use Symfony\Component\HttpFoundation\Exception\BadRequestException; -use Symfony\Component\HttpFoundation\Exception\UnexpectedValueException; - -/** - * ParameterBag is a container for key/value pairs. - * - * @author Fabien Potencier - * - * @implements \IteratorAggregate - */ -class ParameterBag implements \IteratorAggregate, \Countable -{ - /** - * @param array $parameters - */ - public function __construct( - protected array $parameters = [], - ) { - } - - /** - * Returns the parameters. - * - * @template TKey of string|null - * - * @param TKey $key The name of the parameter to return or null to get them all - * - * @return (TKey is null ? array : array) - * - * @throws BadRequestException if the value is not an array - */ - public function all(?string $key = null): array - { - if (null === $key) { - return $this->parameters; - } - - if (!\is_array($value = $this->parameters[$key] ?? [])) { - throw new BadRequestException(\sprintf('Unexpected value for parameter "%s": expecting "array", got "%s".', $key, get_debug_type($value))); - } - - return $value; - } - - /** - * Returns the parameter keys. - * - * @return list - */ - public function keys(): array - { - return array_keys($this->parameters); - } - - /** - * Replaces the current parameters by a new set. - * - * @param array $parameters - */ - public function replace(array $parameters = []): void - { - $this->parameters = $parameters; - } - - /** - * Adds parameters. - * - * @param array $parameters - */ - public function add(array $parameters = []): void - { - $this->parameters = array_replace($this->parameters, $parameters); - } - - public function get(string $key, mixed $default = null): mixed - { - return \array_key_exists($key, $this->parameters) ? $this->parameters[$key] : $default; - } - - public function set(string $key, mixed $value): void - { - $this->parameters[$key] = $value; - } - - /** - * Returns true if the parameter is defined. - */ - public function has(string $key): bool - { - return \array_key_exists($key, $this->parameters); - } - - /** - * Removes a parameter. - */ - public function remove(string $key): void - { - unset($this->parameters[$key]); - } - - /** - * Returns the alphabetic characters of the parameter value. - * - * @throws UnexpectedValueException if the value cannot be converted to string - */ - public function getAlpha(string $key, string $default = ''): string - { - return preg_replace('/[^[:alpha:]]/', '', $this->getString($key, $default)); - } - - /** - * Returns the alphabetic characters and digits of the parameter value. - * - * @throws UnexpectedValueException if the value cannot be converted to string - */ - public function getAlnum(string $key, string $default = ''): string - { - return preg_replace('/[^[:alnum:]]/', '', $this->getString($key, $default)); - } - - /** - * Returns the digits of the parameter value. - * - * @throws UnexpectedValueException if the value cannot be converted to string - */ - public function getDigits(string $key, string $default = ''): string - { - return preg_replace('/[^[:digit:]]/', '', $this->getString($key, $default)); - } - - /** - * Returns the parameter as string. - * - * @throws UnexpectedValueException if the value cannot be converted to string - */ - public function getString(string $key, string $default = ''): string - { - $value = $this->get($key, $default); - if (!\is_scalar($value) && !$value instanceof \Stringable) { - throw new UnexpectedValueException(\sprintf('Parameter value "%s" cannot be converted to "string".', $key)); - } - - return (string) $value; - } - - /** - * Returns the parameter value converted to integer. - * - * @throws UnexpectedValueException if the value cannot be converted to integer - */ - public function getInt(string $key, int $default = 0): int - { - return $this->filter($key, $default, \FILTER_VALIDATE_INT, ['flags' => \FILTER_REQUIRE_SCALAR]); - } - - /** - * Returns the parameter value converted to boolean. - * - * @throws UnexpectedValueException if the value cannot be converted to a boolean - */ - public function getBoolean(string $key, bool $default = false): bool - { - return $this->filter($key, $default, \FILTER_VALIDATE_BOOL, ['flags' => \FILTER_REQUIRE_SCALAR]); - } - - /** - * Returns the parameter value converted to an enum. - * - * @template T of \BackedEnum - * - * @param class-string $class - * @param ?T $default - * - * @return ?T - * - * @psalm-return ($default is null ? T|null : T) - * - * @throws UnexpectedValueException if the parameter value cannot be converted to an enum - */ - public function getEnum(string $key, string $class, ?\BackedEnum $default = null): ?\BackedEnum - { - $value = $this->get($key); - - if (null === $value) { - return $default; - } - - try { - return $class::from($value); - } catch (\ValueError|\TypeError $e) { - throw new UnexpectedValueException(\sprintf('Parameter "%s" cannot be converted to enum: ', $key).$e->getMessage().'.', $e->getCode(), $e); - } - } - - /** - * Filter key. - * - * @param int $filter FILTER_* constant - * @param int|array{flags?: int, options?: array} $options Flags from FILTER_* constants - * - * @see https://php.net/filter-var - * - * @throws UnexpectedValueException if the parameter value is a non-stringable object - * @throws UnexpectedValueException if the parameter value is invalid and \FILTER_NULL_ON_FAILURE is not set - */ - public function filter(string $key, mixed $default = null, int $filter = \FILTER_DEFAULT, mixed $options = []): mixed - { - $value = $this->get($key, $default); - - // Always turn $options into an array - this allows filter_var option shortcuts. - if (!\is_array($options) && $options) { - $options = ['flags' => $options]; - } - - // Add a convenience check for arrays. - if (\is_array($value) && !isset($options['flags'])) { - $options['flags'] = \FILTER_REQUIRE_ARRAY; - } - - if (\is_object($value) && !$value instanceof \Stringable) { - throw new UnexpectedValueException(\sprintf('Parameter value "%s" cannot be filtered.', $key)); - } - - if ((\FILTER_CALLBACK & $filter) && !(($options['options'] ?? null) instanceof \Closure)) { - throw new \InvalidArgumentException(\sprintf('A Closure must be passed to "%s()" when FILTER_CALLBACK is used, "%s" given.', __METHOD__, get_debug_type($options['options'] ?? null))); - } - - $options['flags'] ??= 0; - $nullOnFailure = $options['flags'] & \FILTER_NULL_ON_FAILURE; - $options['flags'] |= \FILTER_NULL_ON_FAILURE; - - $value = filter_var($value, $filter, $options); - - if (null !== $value || $nullOnFailure) { - return $value; - } - - throw new \UnexpectedValueException(\sprintf('Parameter value "%s" is invalid and flag "FILTER_NULL_ON_FAILURE" was not set.', $key)); - } - - /** - * Returns an iterator for parameters. - * - * @return \ArrayIterator - */ - public function getIterator(): \ArrayIterator - { - return new \ArrayIterator($this->parameters); - } - - /** - * Returns the number of parameters. - */ - public function count(): int - { - return \count($this->parameters); - } -} diff --git a/plugins/vendor/symfony/http-foundation/README.md b/plugins/vendor/symfony/http-foundation/README.md deleted file mode 100644 index 5cf90074..00000000 --- a/plugins/vendor/symfony/http-foundation/README.md +++ /dev/null @@ -1,14 +0,0 @@ -HttpFoundation Component -======================== - -The HttpFoundation component defines an object-oriented layer for the HTTP -specification. - -Resources ---------- - - * [Documentation](https://symfony.com/doc/current/components/http_foundation.html) - * [Contributing](https://symfony.com/doc/current/contributing/index.html) - * [Report issues](https://github.com/symfony/symfony/issues) and - [send Pull Requests](https://github.com/symfony/symfony/pulls) - in the [main Symfony repository](https://github.com/symfony/symfony) diff --git a/plugins/vendor/symfony/http-foundation/RateLimiter/AbstractRequestRateLimiter.php b/plugins/vendor/symfony/http-foundation/RateLimiter/AbstractRequestRateLimiter.php deleted file mode 100644 index 550090f9..00000000 --- a/plugins/vendor/symfony/http-foundation/RateLimiter/AbstractRequestRateLimiter.php +++ /dev/null @@ -1,81 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\RateLimiter; - -use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\RateLimiter\LimiterInterface; -use Symfony\Component\RateLimiter\Policy\NoLimiter; -use Symfony\Component\RateLimiter\RateLimit; - -/** - * An implementation of PeekableRequestRateLimiterInterface that - * fits most use-cases. - * - * @author Wouter de Jong - */ -abstract class AbstractRequestRateLimiter implements PeekableRequestRateLimiterInterface -{ - public function consume(Request $request): RateLimit - { - return $this->doConsume($request, 1); - } - - public function peek(Request $request): RateLimit - { - return $this->doConsume($request, 0); - } - - private function doConsume(Request $request, int $tokens): RateLimit - { - $limiters = $this->getLimiters($request); - if (0 === \count($limiters)) { - $limiters = [new NoLimiter()]; - } - - $minimalRateLimit = null; - foreach ($limiters as $limiter) { - $rateLimit = $limiter->consume($tokens); - - $minimalRateLimit = $minimalRateLimit ? self::getMinimalRateLimit($minimalRateLimit, $rateLimit) : $rateLimit; - } - - return $minimalRateLimit; - } - - public function reset(Request $request): void - { - foreach ($this->getLimiters($request) as $limiter) { - $limiter->reset(); - } - } - - /** - * @return LimiterInterface[] a set of limiters using keys extracted from the request - */ - abstract protected function getLimiters(Request $request): array; - - private static function getMinimalRateLimit(RateLimit $first, RateLimit $second): RateLimit - { - if ($first->isAccepted() !== $second->isAccepted()) { - return $first->isAccepted() ? $second : $first; - } - - $firstRemainingTokens = $first->getRemainingTokens(); - $secondRemainingTokens = $second->getRemainingTokens(); - - if ($firstRemainingTokens === $secondRemainingTokens) { - return $first->getRetryAfter() < $second->getRetryAfter() ? $second : $first; - } - - return $firstRemainingTokens > $secondRemainingTokens ? $second : $first; - } -} diff --git a/plugins/vendor/symfony/http-foundation/RateLimiter/PeekableRequestRateLimiterInterface.php b/plugins/vendor/symfony/http-foundation/RateLimiter/PeekableRequestRateLimiterInterface.php deleted file mode 100644 index 63471af2..00000000 --- a/plugins/vendor/symfony/http-foundation/RateLimiter/PeekableRequestRateLimiterInterface.php +++ /dev/null @@ -1,35 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\RateLimiter; - -use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\RateLimiter\RateLimit; - -/** - * A request limiter which allows peeking ahead. - * - * This is valuable to reduce the cache backend load in scenarios - * like a login when we only want to consume a token on login failure, - * and where the majority of requests will be successful and thus not - * need to consume a token. - * - * This way we can peek ahead before allowing the request through, and - * only consume if the request failed (1 backend op). This is compared - * to always consuming and then resetting the limit if the request - * is successful (2 backend ops). - * - * @author Jordi Boggiano - */ -interface PeekableRequestRateLimiterInterface extends RequestRateLimiterInterface -{ - public function peek(Request $request): RateLimit; -} diff --git a/plugins/vendor/symfony/http-foundation/RateLimiter/RequestRateLimiterInterface.php b/plugins/vendor/symfony/http-foundation/RateLimiter/RequestRateLimiterInterface.php deleted file mode 100644 index 4c87a40a..00000000 --- a/plugins/vendor/symfony/http-foundation/RateLimiter/RequestRateLimiterInterface.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\RateLimiter; - -use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\RateLimiter\RateLimit; - -/** - * A special type of limiter that deals with requests. - * - * This allows to limit on different types of information - * from the requests. - * - * @author Wouter de Jong - */ -interface RequestRateLimiterInterface -{ - public function consume(Request $request): RateLimit; - - public function reset(Request $request): void; -} diff --git a/plugins/vendor/symfony/http-foundation/RedirectResponse.php b/plugins/vendor/symfony/http-foundation/RedirectResponse.php deleted file mode 100644 index b1b1cf3c..00000000 --- a/plugins/vendor/symfony/http-foundation/RedirectResponse.php +++ /dev/null @@ -1,92 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation; - -/** - * RedirectResponse represents an HTTP response doing a redirect. - * - * @author Fabien Potencier - */ -class RedirectResponse extends Response -{ - protected string $targetUrl; - - /** - * Creates a redirect response so that it conforms to the rules defined for a redirect status code. - * - * @param string $url The URL to redirect to. The URL should be a full URL, with schema etc., - * but practically every browser redirects on paths only as well - * @param int $status The HTTP status code (302 "Found" by default) - * @param array $headers The headers (Location is always set to the given URL) - * - * @throws \InvalidArgumentException - * - * @see https://tools.ietf.org/html/rfc2616#section-10.3 - */ - public function __construct(string $url, int $status = 302, array $headers = []) - { - parent::__construct('', $status, $headers); - - $this->setTargetUrl($url); - - if (!$this->isRedirect()) { - throw new \InvalidArgumentException(\sprintf('The HTTP status code is not a redirect ("%s" given).', $status)); - } - - if (301 == $status && !\array_key_exists('cache-control', array_change_key_case($headers, \CASE_LOWER))) { - $this->headers->remove('cache-control'); - } - } - - /** - * Returns the target URL. - */ - public function getTargetUrl(): string - { - return $this->targetUrl; - } - - /** - * Sets the redirect target of this response. - * - * @return $this - * - * @throws \InvalidArgumentException - */ - public function setTargetUrl(string $url): static - { - if ('' === $url) { - throw new \InvalidArgumentException('Cannot redirect to an empty URL.'); - } - - $this->targetUrl = $url; - - $this->setContent( - \sprintf(' - - - - - - Redirecting to %1$s - - - Redirecting to %1$s. - -', htmlspecialchars($url, \ENT_QUOTES, 'UTF-8'))); - - $this->headers->set('Location', $url); - $this->headers->set('Content-Type', 'text/html; charset=utf-8'); - - return $this; - } -} diff --git a/plugins/vendor/symfony/http-foundation/Request.php b/plugins/vendor/symfony/http-foundation/Request.php deleted file mode 100644 index 479c4a43..00000000 --- a/plugins/vendor/symfony/http-foundation/Request.php +++ /dev/null @@ -1,2267 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation; - -use Symfony\Component\HttpFoundation\Exception\BadRequestException; -use Symfony\Component\HttpFoundation\Exception\ConflictingHeadersException; -use Symfony\Component\HttpFoundation\Exception\JsonException; -use Symfony\Component\HttpFoundation\Exception\SessionNotFoundException; -use Symfony\Component\HttpFoundation\Exception\SuspiciousOperationException; -use Symfony\Component\HttpFoundation\Session\SessionInterface; - -// Help opcache.preload discover always-needed symbols -class_exists(AcceptHeader::class); -class_exists(FileBag::class); -class_exists(HeaderBag::class); -class_exists(HeaderUtils::class); -class_exists(InputBag::class); -class_exists(ParameterBag::class); -class_exists(ServerBag::class); - -/** - * Request represents an HTTP request. - * - * The methods dealing with URL accept / return a raw path (% encoded): - * * getBasePath - * * getBaseUrl - * * getPathInfo - * * getRequestUri - * * getUri - * * getUriForPath - * - * @author Fabien Potencier - */ -class Request -{ - public const HEADER_FORWARDED = 0b000001; // When using RFC 7239 - public const HEADER_X_FORWARDED_FOR = 0b000010; - public const HEADER_X_FORWARDED_HOST = 0b000100; - public const HEADER_X_FORWARDED_PROTO = 0b001000; - public const HEADER_X_FORWARDED_PORT = 0b010000; - public const HEADER_X_FORWARDED_PREFIX = 0b100000; - - public const HEADER_X_FORWARDED_AWS_ELB = 0b0011010; // AWS ELB doesn't send X-Forwarded-Host - public const HEADER_X_FORWARDED_TRAEFIK = 0b0111110; // All "X-Forwarded-*" headers sent by Traefik reverse proxy - - public const METHOD_HEAD = 'HEAD'; - public const METHOD_GET = 'GET'; - public const METHOD_POST = 'POST'; - public const METHOD_PUT = 'PUT'; - public const METHOD_PATCH = 'PATCH'; - public const METHOD_DELETE = 'DELETE'; - public const METHOD_PURGE = 'PURGE'; - public const METHOD_OPTIONS = 'OPTIONS'; - public const METHOD_TRACE = 'TRACE'; - public const METHOD_CONNECT = 'CONNECT'; - public const METHOD_QUERY = 'QUERY'; - - /** - * @var string[] - */ - protected static array $trustedProxies = []; - - /** - * @var string[] - */ - protected static array $trustedHostPatterns = []; - - /** - * @var string[] - */ - protected static array $trustedHosts = []; - - protected static bool $httpMethodParameterOverride = false; - - /** - * The HTTP methods that can be overridden. - * - * @var uppercase-string[]|null - */ - protected static ?array $allowedHttpMethodOverride = null; - - /** - * Custom parameters. - */ - public ParameterBag $attributes; - - /** - * Request body parameters ($_POST). - * - * @see getPayload() for portability between content types - */ - public InputBag $request; - - /** - * Query string parameters ($_GET). - * - * @var InputBag - */ - public InputBag $query; - - /** - * Server and execution environment parameters ($_SERVER). - */ - public ServerBag $server; - - /** - * Uploaded files ($_FILES). - */ - public FileBag $files; - - /** - * Cookies ($_COOKIE). - * - * @var InputBag - */ - public InputBag $cookies; - - /** - * Headers (taken from the $_SERVER). - */ - public HeaderBag $headers; - - /** - * @var string|resource|false|null - */ - protected $content; - - /** - * @var string[]|null - */ - protected ?array $languages = null; - - /** - * @var string[]|null - */ - protected ?array $charsets = null; - - /** - * @var string[]|null - */ - protected ?array $encodings = null; - - /** - * @var string[]|null - */ - protected ?array $acceptableContentTypes = null; - - protected ?string $pathInfo = null; - protected ?string $requestUri = null; - protected ?string $baseUrl = null; - protected ?string $basePath = null; - protected ?string $method = null; - protected ?string $format = null; - protected SessionInterface|\Closure|null $session = null; - protected ?string $locale = null; - protected string $defaultLocale = 'en'; - - /** - * @var array|null - */ - protected static ?array $formats = null; - - protected static ?\Closure $requestFactory = null; - - private ?string $preferredFormat = null; - - private bool $isHostValid = true; - private bool $isForwardedValid = true; - private bool $isSafeContentPreferred; - - private array $trustedValuesCache = []; - - private static int $trustedHeaderSet = -1; - - private const FORWARDED_PARAMS = [ - self::HEADER_X_FORWARDED_FOR => 'for', - self::HEADER_X_FORWARDED_HOST => 'host', - self::HEADER_X_FORWARDED_PROTO => 'proto', - self::HEADER_X_FORWARDED_PORT => 'host', - ]; - - /** - * Names for headers that can be trusted when - * using trusted proxies. - * - * The FORWARDED header is the standard as of rfc7239. - * - * The other headers are non-standard, but widely used - * by popular reverse proxies (like Apache mod_proxy or Amazon EC2). - */ - private const TRUSTED_HEADERS = [ - self::HEADER_FORWARDED => 'FORWARDED', - self::HEADER_X_FORWARDED_FOR => 'X_FORWARDED_FOR', - self::HEADER_X_FORWARDED_HOST => 'X_FORWARDED_HOST', - self::HEADER_X_FORWARDED_PROTO => 'X_FORWARDED_PROTO', - self::HEADER_X_FORWARDED_PORT => 'X_FORWARDED_PORT', - self::HEADER_X_FORWARDED_PREFIX => 'X_FORWARDED_PREFIX', - ]; - - /** - * This mapping is used when no exact MIME match is found in $formats. - * - * It enables mappings like application/soap+xml -> xml. - * - * @see https://datatracker.ietf.org/doc/html/rfc6839 - * @see https://datatracker.ietf.org/doc/html/rfc7303 - * @see https://www.iana.org/assignments/media-types/media-types.xhtml - */ - private const STRUCTURED_SUFFIX_FORMATS = [ - 'json' => 'json', - 'xml' => 'xml', - 'xhtml' => 'html', - 'cbor' => 'cbor', - 'zip' => 'zip', - 'ber' => 'asn1', - 'der' => 'asn1', - 'tlv' => 'tlv', - 'wbxml' => 'xml', - 'yaml' => 'yaml', - ]; - - private bool $isIisRewrite = false; - - /** - * @param array $query The GET parameters - * @param array $request The POST parameters - * @param array $attributes The request attributes (parameters parsed from the PATH_INFO, ...) - * @param array $cookies The COOKIE parameters - * @param array $files The FILES parameters - * @param array $server The SERVER parameters - * @param string|resource|null $content The raw body data - */ - public function __construct(array $query = [], array $request = [], array $attributes = [], array $cookies = [], array $files = [], array $server = [], $content = null) - { - $this->initialize($query, $request, $attributes, $cookies, $files, $server, $content); - } - - /** - * Sets the parameters for this request. - * - * This method also re-initializes all properties. - * - * @param array $query The GET parameters - * @param array $request The POST parameters - * @param array $attributes The request attributes (parameters parsed from the PATH_INFO, ...) - * @param array $cookies The COOKIE parameters - * @param array $files The FILES parameters - * @param array $server The SERVER parameters - * @param string|resource|null $content The raw body data - */ - public function initialize(array $query = [], array $request = [], array $attributes = [], array $cookies = [], array $files = [], array $server = [], $content = null): void - { - $this->request = new InputBag($request); - $this->query = new InputBag($query); - $this->attributes = new ParameterBag($attributes); - $this->cookies = new InputBag($cookies); - $this->files = new FileBag($files); - $this->server = new ServerBag($server); - $this->headers = new HeaderBag($this->server->getHeaders()); - - $this->content = $content; - $this->languages = null; - $this->charsets = null; - $this->encodings = null; - $this->acceptableContentTypes = null; - $this->pathInfo = null; - $this->requestUri = null; - $this->baseUrl = null; - $this->basePath = null; - $this->method = null; - $this->format = null; - } - - /** - * Creates a new request with values from PHP's super globals. - */ - public static function createFromGlobals(): static - { - if (!\in_array($_SERVER['REQUEST_METHOD'] ?? null, ['PUT', 'DELETE', 'PATCH', 'QUERY'], true)) { - return self::createRequestFromFactory($_GET, $_POST, [], $_COOKIE, $_FILES, $_SERVER); - } - - if (\PHP_VERSION_ID < 80400) { - if (!isset($_SERVER['CONTENT_TYPE']) || str_starts_with($_SERVER['CONTENT_TYPE'], 'application/x-www-form-urlencoded')) { - $content = file_get_contents('php://input'); - parse_str($content, $post); - } else { - $content = null; - $post = $_POST; - } - - return self::createRequestFromFactory($_GET, $post, [], $_COOKIE, $_FILES, $_SERVER, $content); - } - - try { - [$post, $files] = request_parse_body(); - } catch (\RequestParseBodyException) { - $post = $_POST; - $files = $_FILES; - } - - return self::createRequestFromFactory($_GET, $post, [], $_COOKIE, $files, $_SERVER); - } - - /** - * Creates a Request based on a given URI and configuration. - * - * The information contained in the URI always take precedence - * over the other information (server and parameters). - * - * @param string $uri The URI - * @param string $method The HTTP method - * @param array $parameters The query (GET) or request (POST) parameters - * @param array $cookies The request cookies ($_COOKIE) - * @param array $files The request files ($_FILES) - * @param array $server The server parameters ($_SERVER) - * @param string|resource|null $content The raw body data - * - * @throws BadRequestException When the URI is invalid - */ - public static function create(string $uri, string $method = 'GET', array $parameters = [], array $cookies = [], array $files = [], array $server = [], $content = null): static - { - $server = array_replace([ - 'SERVER_NAME' => 'localhost', - 'SERVER_PORT' => 80, - 'HTTP_HOST' => 'localhost', - 'HTTP_USER_AGENT' => 'Symfony', - 'HTTP_ACCEPT' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', - 'HTTP_ACCEPT_LANGUAGE' => 'en-us,en;q=0.5', - 'HTTP_ACCEPT_CHARSET' => 'ISO-8859-1,utf-8;q=0.7,*;q=0.7', - 'REMOTE_ADDR' => '127.0.0.1', - 'SCRIPT_NAME' => '', - 'SCRIPT_FILENAME' => '', - 'SERVER_PROTOCOL' => 'HTTP/1.1', - 'REQUEST_TIME' => time(), - 'REQUEST_TIME_FLOAT' => microtime(true), - ], $server); - - $server['PATH_INFO'] = ''; - $server['REQUEST_METHOD'] = strtoupper($method); - - if (($i = strcspn($uri, ':/?#')) && ':' === ($uri[$i] ?? null) && (strspn($uri, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+-.') !== $i || strcspn($uri, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'))) { - throw new BadRequestException('Invalid URI: Scheme is malformed.'); - } - if (false === $components = parse_url(\strlen($uri) !== strcspn($uri, '?#') ? $uri : $uri.'#')) { - throw new BadRequestException('Invalid URI.'); - } - - $part = ($components['user'] ?? '').':'.($components['pass'] ?? ''); - - if (':' !== $part && \strlen($part) !== strcspn($part, '[]')) { - throw new BadRequestException('Invalid URI: Userinfo is malformed.'); - } - if (($part = $components['host'] ?? '') && !self::isHostValid($part)) { - throw new BadRequestException('Invalid URI: Host is malformed.'); - } - if (false !== ($i = strpos($uri, '\\')) && $i < strcspn($uri, '?#')) { - throw new BadRequestException('Invalid URI: A URI cannot contain a backslash.'); - } - if (\strlen($uri) !== strcspn($uri, "\r\n\t")) { - throw new BadRequestException('Invalid URI: A URI cannot contain CR/LF/TAB characters.'); - } - if ('' !== $uri && (\ord($uri[0]) <= 32 || \ord($uri[-1]) <= 32)) { - throw new BadRequestException('Invalid URI: A URI must not start nor end with ASCII control characters or spaces.'); - } - - if (isset($components['host'])) { - $server['SERVER_NAME'] = $components['host']; - $server['HTTP_HOST'] = $components['host']; - } - - if (isset($components['scheme'])) { - if ('https' === $components['scheme']) { - $server['HTTPS'] = 'on'; - $server['SERVER_PORT'] = 443; - } else { - unset($server['HTTPS']); - $server['SERVER_PORT'] = 80; - } - } - - if (isset($components['port'])) { - $server['SERVER_PORT'] = $components['port']; - $server['HTTP_HOST'] .= ':'.$components['port']; - } - - if (isset($components['user'])) { - $server['PHP_AUTH_USER'] = $components['user']; - } - - if (isset($components['pass'])) { - $server['PHP_AUTH_PW'] = $components['pass']; - } - - if ('' === $path = $components['path'] ?? '') { - $components['path'] = '/'; - } elseif (!isset($components['scheme']) && !isset($components['host']) && '/' !== $path[0]) { - if (false !== $pos = strpos($path, '/')) { - $path = substr($path, 0, $pos); - } - - if (str_contains($path, ':')) { - throw new BadRequestException('Invalid URI: Path is malformed.'); - } - } - - switch (strtoupper($method)) { - case 'POST': - case 'PUT': - case 'DELETE': - case 'QUERY': - if (!isset($server['CONTENT_TYPE'])) { - $server['CONTENT_TYPE'] = 'application/x-www-form-urlencoded'; - } - // no break - case 'PATCH': - $request = $parameters; - $query = []; - break; - default: - $request = []; - $query = $parameters; - break; - } - - $queryString = ''; - if (isset($components['query'])) { - parse_str(html_entity_decode($components['query']), $qs); - - if ($query) { - $query = array_replace($qs, $query); - $queryString = http_build_query($query, '', '&'); - } else { - $query = $qs; - $queryString = $components['query']; - } - } elseif ($query) { - $queryString = http_build_query($query, '', '&'); - } - - $server['REQUEST_URI'] = $components['path'].('' !== $queryString ? '?'.$queryString : ''); - $server['QUERY_STRING'] = $queryString; - - return self::createRequestFromFactory($query, $request, [], $cookies, $files, $server, $content); - } - - /** - * Sets a callable able to create a Request instance. - * - * This is mainly useful when you need to override the Request class - * to keep BC with an existing system. It should not be used for any - * other purpose. - */ - public static function setFactory(?callable $callable): void - { - self::$requestFactory = null === $callable ? null : $callable(...); - } - - /** - * Clones a request and overrides some of its parameters. - * - * @param array|null $query The GET parameters - * @param array|null $request The POST parameters - * @param array|null $attributes The request attributes (parameters parsed from the PATH_INFO, ...) - * @param array|null $cookies The COOKIE parameters - * @param array|null $files The FILES parameters - * @param array|null $server The SERVER parameters - */ - public function duplicate(?array $query = null, ?array $request = null, ?array $attributes = null, ?array $cookies = null, ?array $files = null, ?array $server = null): static - { - $dup = clone $this; - if (null !== $query) { - $dup->query = new InputBag($query); - } - if (null !== $request) { - $dup->request = new InputBag($request); - } - if (null !== $attributes) { - $dup->attributes = new ParameterBag($attributes); - } - if (null !== $cookies) { - $dup->cookies = new InputBag($cookies); - } - if (null !== $files) { - $dup->files = new FileBag($files); - } - if (null !== $server) { - $dup->server = new ServerBag($server); - $dup->headers = new HeaderBag($dup->server->getHeaders()); - } - $dup->languages = null; - $dup->charsets = null; - $dup->encodings = null; - $dup->acceptableContentTypes = null; - $dup->pathInfo = null; - $dup->requestUri = null; - $dup->baseUrl = null; - $dup->basePath = null; - $dup->method = null; - $dup->format = null; - - if (!$dup->attributes->has('_format') && $this->attributes->has('_format')) { - $dup->attributes->set('_format', $this->attributes->get('_format')); - } - - if (!$dup->getRequestFormat(null)) { - $dup->setRequestFormat($this->getRequestFormat(null)); - } - - return $dup; - } - - /** - * Clones the current request. - * - * Note that the session is not cloned as duplicated requests - * are most of the time sub-requests of the main one. - */ - public function __clone() - { - $this->query = clone $this->query; - $this->request = clone $this->request; - $this->attributes = clone $this->attributes; - $this->cookies = clone $this->cookies; - $this->files = clone $this->files; - $this->server = clone $this->server; - $this->headers = clone $this->headers; - } - - public function __toString(): string - { - $content = $this->getContent(); - - $cookieHeader = ''; - $cookies = []; - - foreach ($this->cookies as $k => $v) { - $cookies[] = \is_array($v) ? http_build_query([$k => $v], '', '; ', \PHP_QUERY_RFC3986) : "$k=$v"; - } - - if ($cookies) { - $cookieHeader = 'Cookie: '.implode('; ', $cookies)."\r\n"; - } - - return - \sprintf('%s %s %s', $this->getMethod(), $this->getRequestUri(), $this->server->get('SERVER_PROTOCOL'))."\r\n". - $this->headers. - $cookieHeader."\r\n". - $content; - } - - /** - * Overrides the PHP global variables according to this request instance. - * - * It overrides $_GET, $_POST, $_REQUEST, $_SERVER, $_COOKIE. - * $_FILES is never overridden, see rfc1867 - */ - public function overrideGlobals(): void - { - $this->server->set('QUERY_STRING', static::normalizeQueryString(http_build_query($this->query->all(), '', '&'))); - - $_GET = $this->query->all(); - $_POST = $this->request->all(); - $_SERVER = $this->server->all(); - $_COOKIE = $this->cookies->all(); - - foreach ($this->headers->all() as $key => $value) { - $key = strtoupper(str_replace('-', '_', $key)); - if (\in_array($key, ['CONTENT_TYPE', 'CONTENT_LENGTH', 'CONTENT_MD5'], true)) { - $_SERVER[$key] = implode(', ', $value); - } else { - $_SERVER['HTTP_'.$key] = implode(', ', $value); - } - } - - $request = ['g' => $_GET, 'p' => $_POST, 'c' => $_COOKIE]; - - $requestOrder = \ini_get('request_order') ?: \ini_get('variables_order'); - $requestOrder = preg_replace('#[^cgp]#', '', strtolower($requestOrder)) ?: 'gp'; - - $_REQUEST = [[]]; - - foreach (str_split($requestOrder) as $order) { - $_REQUEST[] = $request[$order]; - } - - $_REQUEST = array_merge(...$_REQUEST); - } - - /** - * Sets a list of trusted proxies. - * - * You should only list the reverse proxies that you manage directly. - * - * @param array $proxies A list of trusted proxies, the string 'REMOTE_ADDR' will be replaced with $_SERVER['REMOTE_ADDR'] and 'PRIVATE_SUBNETS' by IpUtils::PRIVATE_SUBNETS - * @param int-mask-of $trustedHeaderSet A bit field to set which headers to trust from your proxies - */ - public static function setTrustedProxies(array $proxies, int $trustedHeaderSet): void - { - if (false !== $i = array_search('REMOTE_ADDR', $proxies, true)) { - if (isset($_SERVER['REMOTE_ADDR'])) { - $proxies[$i] = $_SERVER['REMOTE_ADDR']; - } else { - unset($proxies[$i]); - $proxies = array_values($proxies); - } - } - - if (false !== ($i = array_search('PRIVATE_SUBNETS', $proxies, true)) || false !== ($i = array_search('private_ranges', $proxies, true))) { - unset($proxies[$i]); - $proxies = array_merge($proxies, IpUtils::PRIVATE_SUBNETS); - } - - self::$trustedProxies = $proxies; - self::$trustedHeaderSet = $trustedHeaderSet; - } - - /** - * Gets the list of trusted proxies. - * - * @return string[] - */ - public static function getTrustedProxies(): array - { - return self::$trustedProxies; - } - - /** - * Gets the set of trusted headers from trusted proxies. - * - * @return int A bit field of Request::HEADER_* that defines which headers are trusted from your proxies - */ - public static function getTrustedHeaderSet(): int - { - return self::$trustedHeaderSet; - } - - /** - * Sets a list of trusted host patterns. - * - * You should only list the hosts you manage using regexs. - * - * @param array $hostPatterns A list of trusted host patterns - */ - public static function setTrustedHosts(array $hostPatterns): void - { - self::$trustedHostPatterns = array_map(static fn ($hostPattern) => \sprintf('{%s}i', $hostPattern), $hostPatterns); - // we need to reset trusted hosts on trusted host patterns change - self::$trustedHosts = []; - } - - /** - * Gets the list of trusted host patterns. - * - * @return string[] - */ - public static function getTrustedHosts(): array - { - return self::$trustedHostPatterns; - } - - /** - * Normalizes a query string. - * - * It builds a normalized query string, where keys/value pairs are alphabetized, - * have consistent escaping and unneeded delimiters are removed. - */ - public static function normalizeQueryString(?string $qs): string - { - if ('' === ($qs ?? '')) { - return ''; - } - - $qs = HeaderUtils::parseQuery($qs); - ksort($qs); - - return http_build_query($qs, '', '&', \PHP_QUERY_RFC3986); - } - - /** - * Enables support for the _method request parameter to determine the intended HTTP method. - * - * Be warned that enabling this feature might lead to CSRF issues in your code. - * Check that you are using CSRF tokens when required. - * If the HTTP method parameter override is enabled, an html-form with method "POST" can be altered - * and used to send a "PUT" or "DELETE" request via the _method request parameter. - * If these methods are not protected against CSRF, this presents a possible vulnerability. - * - * The HTTP method can only be overridden when the real HTTP method is POST. - */ - public static function enableHttpMethodParameterOverride(): void - { - self::$httpMethodParameterOverride = true; - } - - /** - * Checks whether support for the _method request parameter is enabled. - */ - public static function getHttpMethodParameterOverride(): bool - { - return self::$httpMethodParameterOverride; - } - - /** - * Sets the list of HTTP methods that can be overridden. - * - * Set to null to allow all methods to be overridden (default). Set to an - * empty array to disallow overrides entirely. Otherwise, provide the list - * of uppercased method names that are allowed. - * - * @param uppercase-string[]|null $methods - */ - public static function setAllowedHttpMethodOverride(?array $methods): void - { - if (array_intersect($methods ?? [], ['GET', 'HEAD', 'CONNECT', 'TRACE'])) { - throw new \InvalidArgumentException('The HTTP methods "GET", "HEAD", "CONNECT", and "TRACE" cannot be overridden.'); - } - - self::$allowedHttpMethodOverride = $methods; - } - - /** - * Gets the list of HTTP methods that can be overridden. - * - * @return uppercase-string[]|null - */ - public static function getAllowedHttpMethodOverride(): ?array - { - return self::$allowedHttpMethodOverride; - } - - /** - * Gets a "parameter" value from any bag. - * - * This method is mainly useful for libraries that want to provide some flexibility. If you don't need the - * flexibility in controllers, it is better to explicitly get request parameters from the appropriate - * public property instead (attributes, query, request). - * - * Order of precedence: PATH (routing placeholders or custom attributes), GET, POST - * - * @deprecated since Symfony 7.4, use properties `->attributes`, `query` or `request` directly instead - */ - public function get(string $key, mixed $default = null): mixed - { - trigger_deprecation('symfony/http-foundation', '7.4', 'Request::get() is deprecated, use properties ->attributes, query or request directly instead.'); - - if ($this !== $result = $this->attributes->get($key, $this)) { - return $result; - } - - if ($this->query->has($key)) { - return $this->query->all()[$key]; - } - - if ($this->request->has($key)) { - return $this->request->all()[$key]; - } - - return $default; - } - - /** - * Gets the Session. - * - * @throws SessionNotFoundException When session is not set properly - */ - public function getSession(): SessionInterface - { - $session = $this->session; - if (!$session instanceof SessionInterface && null !== $session) { - $this->setSession($session = $session()); - } - - if (null === $session) { - throw new SessionNotFoundException('Session has not been set.'); - } - - return $session; - } - - /** - * Whether the request contains a Session which was started in one of the - * previous requests. - */ - public function hasPreviousSession(): bool - { - // the check for $this->session avoids malicious users trying to fake a session cookie with proper name - return $this->hasSession() && $this->cookies->has($this->getSession()->getName()); - } - - /** - * Whether the request contains a Session object. - * - * This method does not give any information about the state of the session object, - * like whether the session is started or not. It is just a way to check if this Request - * is associated with a Session instance. - * - * @param bool $skipIfUninitialized When true, ignores factories injected by `setSessionFactory` - */ - public function hasSession(bool $skipIfUninitialized = false): bool - { - return null !== $this->session && (!$skipIfUninitialized || $this->session instanceof SessionInterface); - } - - public function setSession(SessionInterface $session): void - { - $this->session = $session; - } - - /** - * @internal - * - * @param callable(): SessionInterface $factory - */ - public function setSessionFactory(callable $factory): void - { - $this->session = $factory(...); - } - - /** - * Returns the client IP addresses. - * - * In the returned array the most trusted IP address is first, and the - * least trusted one last. The "real" client IP address is the last one, - * but this is also the least trusted one. Trusted proxies are stripped. - * - * Use this method carefully; you should use getClientIp() instead. - * - * @see getClientIp() - */ - public function getClientIps(): array - { - $ip = $this->server->get('REMOTE_ADDR'); - - if (!$this->isFromTrustedProxy()) { - return [$ip]; - } - - return $this->getTrustedValues(self::HEADER_X_FORWARDED_FOR, $ip) ?: [$ip]; - } - - /** - * Returns the client IP address. - * - * This method can read the client IP address from the "X-Forwarded-For" header - * when trusted proxies were set via "setTrustedProxies()". The "X-Forwarded-For" - * header value is a comma+space separated list of IP addresses, the left-most - * being the original client, and each successive proxy that passed the request - * adding the IP address where it received the request from. - * - * @see getClientIps() - * @see https://wikipedia.org/wiki/X-Forwarded-For - */ - public function getClientIp(): ?string - { - return $this->getClientIps()[0]; - } - - /** - * Returns current script name. - */ - public function getScriptName(): string - { - return $this->server->get('SCRIPT_NAME', $this->server->get('ORIG_SCRIPT_NAME', '')); - } - - /** - * Returns the path being requested relative to the executed script. - * - * The path info always starts with a /. - * - * Suppose this request is instantiated from /mysite on localhost: - * - * * http://localhost/mysite returns '/' - * * http://localhost/mysite/about returns '/about' - * * http://localhost/mysite/enco%20ded returns '/enco%20ded' - * * http://localhost/mysite/about?var=1 returns '/about' - * - * @return string The raw path (i.e. not urldecoded) - */ - public function getPathInfo(): string - { - return $this->pathInfo ??= $this->preparePathInfo(); - } - - /** - * Returns the root path from which this request is executed. - * - * Suppose that an index.php file instantiates this request object: - * - * * http://localhost/index.php returns an empty string - * * http://localhost/index.php/page returns an empty string - * * http://localhost/web/index.php returns '/web' - * * http://localhost/we%20b/index.php returns '/we%20b' - * - * @return string The raw path (i.e. not urldecoded) - */ - public function getBasePath(): string - { - return $this->basePath ??= $this->prepareBasePath(); - } - - /** - * Returns the root URL from which this request is executed. - * - * The base URL never ends with a /. - * - * This is similar to getBasePath(), except that it also includes the - * script filename (e.g. index.php) if one exists. - * - * @return string The raw URL (i.e. not urldecoded) - */ - public function getBaseUrl(): string - { - $trustedPrefix = ''; - - // the proxy prefix must be prepended to any prefix being needed at the webserver level - if ($this->isFromTrustedProxy() && $trustedPrefixValues = $this->getTrustedValues(self::HEADER_X_FORWARDED_PREFIX)) { - $trustedPrefix = rtrim($trustedPrefixValues[0], '/'); - } - - return $trustedPrefix.$this->getBaseUrlReal(); - } - - /** - * Returns the real base URL received by the webserver from which this request is executed. - * The URL does not include trusted reverse proxy prefix. - * - * @return string The raw URL (i.e. not urldecoded) - */ - private function getBaseUrlReal(): string - { - return $this->baseUrl ??= $this->prepareBaseUrl(); - } - - /** - * Gets the request's scheme. - */ - public function getScheme(): string - { - return $this->isSecure() ? 'https' : 'http'; - } - - /** - * Returns the port on which the request is made. - * - * This method can read the client port from the "X-Forwarded-Port" header - * when trusted proxies were set via "setTrustedProxies()". - * - * The "X-Forwarded-Port" header must contain the client port. - * - * @return int|string|null Can be a string if fetched from the server bag - */ - public function getPort(): int|string|null - { - if ($this->isFromTrustedProxy() && $host = $this->getTrustedValues(self::HEADER_X_FORWARDED_PORT)) { - $host = $host[0]; - } elseif ($this->isFromTrustedProxy() && $host = $this->getTrustedValues(self::HEADER_X_FORWARDED_HOST)) { - $host = $host[0]; - } elseif (!$host = $this->headers->get('HOST')) { - return $this->server->get('SERVER_PORT'); - } - - if ('[' === $host[0]) { - $pos = strpos($host, ':', strrpos($host, ']')); - } else { - $pos = strrpos($host, ':'); - } - - if (false !== $pos && $port = substr($host, $pos + 1)) { - return (int) $port; - } - - return 'https' === $this->getScheme() ? 443 : 80; - } - - /** - * Returns the user. - */ - public function getUser(): ?string - { - return $this->headers->get('PHP_AUTH_USER'); - } - - /** - * Returns the password. - */ - public function getPassword(): ?string - { - return $this->headers->get('PHP_AUTH_PW'); - } - - /** - * Gets the user info. - * - * @return string|null A user name if any and, optionally, scheme-specific information about how to gain authorization to access the server - */ - public function getUserInfo(): ?string - { - $userinfo = $this->getUser(); - - $pass = $this->getPassword(); - if ('' != $pass) { - $userinfo .= ":$pass"; - } - - return $userinfo; - } - - /** - * Returns the HTTP host being requested. - * - * The port name will be appended to the host if it's non-standard. - */ - public function getHttpHost(): string - { - $scheme = $this->getScheme(); - $port = $this->getPort(); - - if (('http' === $scheme && 80 == $port) || ('https' === $scheme && 443 == $port)) { - return $this->getHost(); - } - - return $this->getHost().':'.$port; - } - - /** - * Returns the requested URI (path and query string). - * - * @return string The raw URI (i.e. not URI decoded) - */ - public function getRequestUri(): string - { - return $this->requestUri ??= $this->prepareRequestUri(); - } - - /** - * Gets the scheme and HTTP host. - * - * If the URL was called with basic authentication, the user - * and the password are not added to the generated string. - */ - public function getSchemeAndHttpHost(): string - { - return $this->getScheme().'://'.$this->getHttpHost(); - } - - /** - * Generates a normalized URI (URL) for the Request. - * - * @see getQueryString() - */ - public function getUri(): string - { - if (null !== $qs = $this->getQueryString()) { - $qs = '?'.$qs; - } - - return $this->getSchemeAndHttpHost().$this->getBaseUrl().$this->getPathInfo().$qs; - } - - /** - * Generates a normalized URI for the given path. - * - * @param string $path A path to use instead of the current one - */ - public function getUriForPath(string $path): string - { - return $this->getSchemeAndHttpHost().$this->getBaseUrl().$path; - } - - /** - * Returns the path as relative reference from the current Request path. - * - * Only the URIs path component (no schema, host etc.) is relevant and must be given. - * Both paths must be absolute and not contain relative parts. - * Relative URLs from one resource to another are useful when generating self-contained downloadable document archives. - * Furthermore, they can be used to reduce the link size in documents. - * - * Example target paths, given a base path of "/a/b/c/d": - * - "/a/b/c/d" -> "" - * - "/a/b/c/" -> "./" - * - "/a/b/" -> "../" - * - "/a/b/c/other" -> "other" - * - "/a/x/y" -> "../../x/y" - */ - public function getRelativeUriForPath(string $path): string - { - // be sure that we are dealing with an absolute path - if (!isset($path[0]) || '/' !== $path[0]) { - return $path; - } - - if ($path === $basePath = $this->getPathInfo()) { - return ''; - } - - $sourceDirs = explode('/', isset($basePath[0]) && '/' === $basePath[0] ? substr($basePath, 1) : $basePath); - $targetDirs = explode('/', substr($path, 1)); - array_pop($sourceDirs); - $targetFile = array_pop($targetDirs); - - foreach ($sourceDirs as $i => $dir) { - if (isset($targetDirs[$i]) && $dir === $targetDirs[$i]) { - unset($sourceDirs[$i], $targetDirs[$i]); - } else { - break; - } - } - - $targetDirs[] = $targetFile; - $path = str_repeat('../', \count($sourceDirs)).implode('/', $targetDirs); - - // A reference to the same base directory or an empty subdirectory must be prefixed with "./". - // This also applies to a segment with a colon character (e.g., "file:colon") that cannot be used - // as the first segment of a relative-path reference, as it would be mistaken for a scheme name - // (see https://tools.ietf.org/html/rfc3986#section-4.2). - return !isset($path[0]) || '/' === $path[0] - || false !== ($colonPos = strpos($path, ':')) && ($colonPos < ($slashPos = strpos($path, '/')) || false === $slashPos) - ? "./$path" : $path; - } - - /** - * Generates the normalized query string for the Request. - * - * It builds a normalized query string, where keys/value pairs are alphabetized - * and have consistent escaping. - */ - public function getQueryString(): ?string - { - $qs = static::normalizeQueryString($this->server->get('QUERY_STRING')); - - return '' === $qs ? null : $qs; - } - - /** - * Checks whether the request is secure or not. - * - * This method can read the client protocol from the "X-Forwarded-Proto" header - * when trusted proxies were set via "setTrustedProxies()". - * - * The "X-Forwarded-Proto" header must contain the protocol: "https" or "http". - */ - public function isSecure(): bool - { - if ($this->isFromTrustedProxy() && $proto = $this->getTrustedValues(self::HEADER_X_FORWARDED_PROTO)) { - return \in_array(strtolower($proto[0]), ['https', 'on', 'ssl', '1'], true); - } - - $https = $this->server->get('HTTPS'); - - return $https && (!\is_string($https) || 'off' !== strtolower($https)); - } - - /** - * Returns the host name. - * - * This method can read the client host name from the "X-Forwarded-Host" header - * when trusted proxies were set via "setTrustedProxies()". - * - * The "X-Forwarded-Host" header must contain the client host name. - * - * @throws SuspiciousOperationException when the host name is invalid or not trusted - */ - public function getHost(): string - { - if ($this->isFromTrustedProxy() && $host = $this->getTrustedValues(self::HEADER_X_FORWARDED_HOST)) { - $host = $host[0]; - } else { - $host = $this->headers->get('HOST') ?: $this->server->get('SERVER_NAME') ?: $this->server->get('SERVER_ADDR', ''); - } - - // trim and remove port number from host - // host is lowercase as per RFC 952/2181 - $host = strtolower(preg_replace('/:\d+$/', '', trim($host))); - - // the host can come from the user (HTTP_HOST and depending on the configuration, SERVER_NAME too can come from the user) - if ($host && !self::isHostValid($host)) { - if (!$this->isHostValid) { - return ''; - } - $this->isHostValid = false; - - throw new SuspiciousOperationException(\sprintf('Invalid Host "%s".', $host)); - } - - if (\count(self::$trustedHostPatterns) > 0) { - // to avoid host header injection attacks, you should provide a list of trusted host patterns - - if (\in_array($host, self::$trustedHosts, true)) { - return $host; - } - - foreach (self::$trustedHostPatterns as $pattern) { - if (preg_match($pattern, $host)) { - self::$trustedHosts[] = $host; - - return $host; - } - } - - if (!$this->isHostValid) { - return ''; - } - $this->isHostValid = false; - - throw new SuspiciousOperationException(\sprintf('Untrusted Host "%s".', $host)); - } - - return $host; - } - - /** - * Sets the request method. - */ - public function setMethod(string $method): void - { - $this->method = null; - $this->server->set('REQUEST_METHOD', $method); - } - - /** - * Gets the request "intended" method. - * - * If the X-HTTP-Method-Override header is set, and if the method is a POST, - * then it is used to determine the "real" intended HTTP method. - * - * The _method request parameter can also be used to determine the HTTP method, - * but only if enableHttpMethodParameterOverride() has been called. - * - * The method is always an uppercased string. - * - * @see getRealMethod() - */ - public function getMethod(): string - { - if (null !== $this->method) { - return $this->method; - } - - $this->method = strtoupper($this->server->get('REQUEST_METHOD', 'GET')); - - if ('POST' !== $this->method || !(self::$allowedHttpMethodOverride ?? true)) { - return $this->method; - } - - $method = $this->headers->get('X-HTTP-METHOD-OVERRIDE'); - - if (!$method && self::$httpMethodParameterOverride) { - $method = $this->request->get('_method', $this->query->get('_method', 'POST')); - } - - if (!\is_string($method)) { - return $this->method; - } - - $method = strtoupper($method); - - if (\in_array($method, ['GET', 'HEAD', 'CONNECT', 'TRACE'], true)) { - trigger_deprecation('symfony/http-foundation', '7.4', 'HTTP method override is deprecated for methods GET, HEAD, CONNECT and TRACE; it will be ignored in Symfony 8.0.', $method); - } - - if (self::$allowedHttpMethodOverride && !\in_array($method, self::$allowedHttpMethodOverride, true)) { - return $this->method; - } - - if (\strlen($method) !== strspn($method, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')) { - throw new SuspiciousOperationException('Invalid HTTP method override.'); - } - - return $this->method = $method; - } - - /** - * Gets the "real" request method. - * - * @see getMethod() - */ - public function getRealMethod(): string - { - return strtoupper($this->server->get('REQUEST_METHOD', 'GET')); - } - - /** - * Gets the mime type associated with the format. - */ - public function getMimeType(string $format): ?string - { - if (null === static::$formats) { - static::initializeFormats(); - } - - return isset(static::$formats[$format]) ? static::$formats[$format][0] : null; - } - - /** - * Gets the mime types associated with the format. - * - * @return string[] - */ - public static function getMimeTypes(string $format): array - { - if (null === static::$formats) { - static::initializeFormats(); - } - - return static::$formats[$format] ?? []; - } - - /** - * Gets the format associated with the mime type. - * - * Resolution order: - * 1) Exact match on the full MIME type (e.g. "application/json"). - * 2) Match on the canonical MIME type (i.e. before the first ";" parameter). - * 3) If the type is "application/*+suffix", use the structured syntax suffix - * mapping (e.g. "application/foo+json" → "json"), when available. - * 4) If $subtypeFallback is true and no match was found: - * - return the MIME subtype (without "x-" prefix), provided it does not - * contain a "+" (e.g. "application/x-yaml" → "yaml", "text/csv" → "csv"). - * - * @param string|null $mimeType The mime type to check - * @param bool $subtypeFallback Whether to fall back to the subtype if no exact match is found - */ - public function getFormat(?string $mimeType/* , bool $subtypeFallback = false */): ?string - { - $subtypeFallback = 2 <= \func_num_args() ? func_get_arg(1) : false; - $canonicalMimeType = null; - if ($mimeType && false !== $pos = strpos($mimeType, ';')) { - $canonicalMimeType = trim(substr($mimeType, 0, $pos)); - } - - if (null === static::$formats) { - static::initializeFormats(); - } - - $exactFormat = null; - $canonicalFormat = null; - - foreach (static::$formats as $format => $mimeTypes) { - if (\in_array($mimeType, $mimeTypes, true)) { - $exactFormat = $format; - } - if (null !== $canonicalMimeType && \in_array($canonicalMimeType, $mimeTypes, true)) { - $canonicalFormat = $format; - } - } - - if ($format = $exactFormat ?? $canonicalFormat) { - return $format; - } - - if (!$canonicalMimeType ??= $mimeType) { - return null; - } - - if (str_starts_with($canonicalMimeType, 'application/') && str_contains($canonicalMimeType, '+')) { - $suffix = substr(strrchr($canonicalMimeType, '+'), 1); - if (isset(self::STRUCTURED_SUFFIX_FORMATS[$suffix])) { - return self::STRUCTURED_SUFFIX_FORMATS[$suffix]; - } - } - - if ($subtypeFallback && str_contains($canonicalMimeType, '/')) { - [, $subtype] = explode('/', $canonicalMimeType, 2); - if (str_starts_with($subtype, 'x-')) { - $subtype = substr($subtype, 2); - } - if (!str_contains($subtype, '+')) { - return $subtype; - } - } - - return null; - } - - /** - * Associates a format with mime types. - * - * @param string $format The format to set - * @param string|string[] $mimeTypes The associated mime types (the preferred one must be the first as it will be used as the content type) - */ - public function setFormat(?string $format, string|array $mimeTypes): void - { - if (null === $format) { - trigger_deprecation('symfony/http-foundation', '7.4', 'Passing "null" as the first argument of "%s()" is deprecated. The argument will be non-nullable in Symfony 8.0.', __METHOD__); - $format = ''; - } - - if (null === static::$formats) { - static::initializeFormats(); - } - - static::$formats[$format] = (array) $mimeTypes; - } - - /** - * Gets the request format. - * - * Here is the process to determine the format: - * - * * format defined by the user (with setRequestFormat()) - * * _format request attribute - * * $default - * - * @see getPreferredFormat - */ - public function getRequestFormat(?string $default = 'html'): ?string - { - $this->format ??= $this->attributes->get('_format'); - - return $this->format ?? $default; - } - - /** - * Sets the request format. - */ - public function setRequestFormat(?string $format): void - { - $this->format = $format; - } - - /** - * Gets the usual name of the format associated with the request's media type (provided in the Content-Type header). - * - * @see Request::$formats - */ - public function getContentTypeFormat(): ?string - { - return $this->getFormat($this->headers->get('CONTENT_TYPE', '')); - } - - /** - * Sets the default locale. - */ - public function setDefaultLocale(string $locale): void - { - $this->defaultLocale = $locale; - - if (null === $this->locale) { - $this->setPhpDefaultLocale($locale); - } - } - - /** - * Get the default locale. - */ - public function getDefaultLocale(): string - { - return $this->defaultLocale; - } - - /** - * Sets the locale. - */ - public function setLocale(string $locale): void - { - $this->setPhpDefaultLocale($this->locale = $locale); - } - - /** - * Get the locale. - */ - public function getLocale(): string - { - return $this->locale ?? $this->defaultLocale; - } - - /** - * Checks if the request method is of specified type. - * - * @param string $method Uppercase request method (GET, POST etc) - */ - public function isMethod(string $method): bool - { - return $this->getMethod() === strtoupper($method); - } - - /** - * Checks whether or not the method is safe. - * - * @see https://tools.ietf.org/html/rfc7231#section-4.2.1 - */ - public function isMethodSafe(): bool - { - return \in_array($this->getMethod(), ['GET', 'HEAD', 'OPTIONS', 'TRACE', 'QUERY'], true); - } - - /** - * Checks whether or not the method is idempotent. - */ - public function isMethodIdempotent(): bool - { - return \in_array($this->getMethod(), ['HEAD', 'GET', 'PUT', 'DELETE', 'TRACE', 'OPTIONS', 'PURGE', 'QUERY'], true); - } - - /** - * Checks whether the method is cacheable or not. - * - * @see https://tools.ietf.org/html/rfc7231#section-4.2.3 - */ - public function isMethodCacheable(): bool - { - return \in_array($this->getMethod(), ['GET', 'HEAD', 'QUERY'], true); - } - - /** - * Returns the protocol version. - * - * If the application is behind a proxy, the protocol version used in the - * requests between the client and the proxy and between the proxy and the - * server might be different. This returns the former (from the "Via" header) - * if the proxy is trusted (see "setTrustedProxies()"), otherwise it returns - * the latter (from the "SERVER_PROTOCOL" server parameter). - */ - public function getProtocolVersion(): ?string - { - if ($this->isFromTrustedProxy()) { - preg_match('~^(HTTP/)?([1-9]\.[0-9])\b~', $this->headers->get('Via') ?? '', $matches); - - if ($matches) { - return 'HTTP/'.$matches[2]; - } - } - - return $this->server->get('SERVER_PROTOCOL'); - } - - /** - * Returns the request body content. - * - * @param bool $asResource If true, a resource will be returned - * - * @return string|resource - * - * @psalm-return ($asResource is true ? resource : string) - */ - public function getContent(bool $asResource = false) - { - if ($asResource) { - if (\is_resource($this->content)) { - rewind($this->content); - - return $this->content; - } - - // Content passed in parameter (test) - if (\is_string($this->content)) { - $resource = fopen('php://temp', 'r+'); - fwrite($resource, $this->content); - rewind($resource); - - return $resource; - } - - $this->content = false; - - return fopen('php://input', 'r'); - } - - if (\is_resource($this->content)) { - rewind($this->content); - - return stream_get_contents($this->content); - } - - if (null === $this->content || false === $this->content) { - $this->content = file_get_contents('php://input'); - } - - return $this->content; - } - - /** - * Gets the decoded form or json request body. - * - * @throws JsonException When the body cannot be decoded to an array - */ - public function getPayload(): InputBag - { - if ($this->request->count()) { - return clone $this->request; - } - - if ('' === $content = $this->getContent()) { - return new InputBag([]); - } - - try { - $content = json_decode($content, true, 512, \JSON_BIGINT_AS_STRING | \JSON_THROW_ON_ERROR); - } catch (\JsonException $e) { - throw new JsonException('Could not decode request body.', $e->getCode(), $e); - } - - if (!\is_array($content)) { - throw new JsonException(\sprintf('JSON content was expected to decode to an array, "%s" returned.', get_debug_type($content))); - } - - return new InputBag($content); - } - - /** - * Gets the request body decoded as array, typically from a JSON payload. - * - * @see getPayload() for portability between content types - * - * @throws JsonException When the body cannot be decoded to an array - */ - public function toArray(): array - { - if ('' === $content = $this->getContent()) { - throw new JsonException('Request body is empty.'); - } - - try { - $content = json_decode($content, true, 512, \JSON_BIGINT_AS_STRING | \JSON_THROW_ON_ERROR); - } catch (\JsonException $e) { - throw new JsonException('Could not decode request body.', $e->getCode(), $e); - } - - if (!\is_array($content)) { - throw new JsonException(\sprintf('JSON content was expected to decode to an array, "%s" returned.', get_debug_type($content))); - } - - return $content; - } - - /** - * Gets the Etags. - */ - public function getETags(): array - { - return preg_split('/\s*,\s*/', $this->headers->get('If-None-Match', ''), -1, \PREG_SPLIT_NO_EMPTY); - } - - public function isNoCache(): bool - { - return $this->headers->hasCacheControlDirective('no-cache') || 'no-cache' == $this->headers->get('Pragma'); - } - - /** - * Gets the preferred format for the response by inspecting, in the following order: - * * the request format set using setRequestFormat; - * * the values of the Accept HTTP header. - * - * Note that if you use this method, you should send the "Vary: Accept" header - * in the response to prevent any issues with intermediary HTTP caches. - */ - public function getPreferredFormat(?string $default = 'html'): ?string - { - if (!isset($this->preferredFormat) && null !== $preferredFormat = $this->getRequestFormat(null)) { - $this->preferredFormat = $preferredFormat; - } - - if ($this->preferredFormat ?? null) { - return $this->preferredFormat; - } - - foreach ($this->getAcceptableContentTypes() as $mimeType) { - if ($this->preferredFormat = $this->getFormat($mimeType)) { - return $this->preferredFormat; - } - } - - return $default; - } - - /** - * Returns the preferred language. - * - * @param string[] $locales An array of ordered available locales - */ - public function getPreferredLanguage(?array $locales = null): ?string - { - $preferredLanguages = $this->getLanguages(); - - if (!$locales) { - return $preferredLanguages[0] ?? null; - } - - $locales = array_map($this->formatLocale(...), $locales); - if (!$preferredLanguages) { - return $locales[0]; - } - - $combinations = array_merge(...array_map($this->getLanguageCombinations(...), $preferredLanguages)); - foreach ($combinations as $combination) { - foreach ($locales as $locale) { - if (str_starts_with($locale, $combination)) { - return $locale; - } - } - } - - return $locales[0]; - } - - /** - * Gets a list of languages acceptable by the client browser ordered in the user browser preferences. - * - * @return string[] - */ - public function getLanguages(): array - { - if (null !== $this->languages) { - return $this->languages; - } - - $languages = AcceptHeader::fromString($this->headers->get('Accept-Language'))->all(); - $this->languages = []; - foreach ($languages as $acceptHeaderItem) { - $lang = $acceptHeaderItem->getValue(); - $this->languages[] = self::formatLocale($lang); - } - $this->languages = array_unique($this->languages); - - return $this->languages; - } - - /** - * Strips the locale to only keep the canonicalized language value. - * - * Depending on the $locale value, this method can return values like : - * - language_Script_REGION: "fr_Latn_FR", "zh_Hans_TW" - * - language_Script: "fr_Latn", "zh_Hans" - * - language_REGION: "fr_FR", "zh_TW" - * - language: "fr", "zh" - * - * Invalid locale values are returned as is. - * - * @see https://wikipedia.org/wiki/IETF_language_tag - * @see https://datatracker.ietf.org/doc/html/rfc5646 - */ - private static function formatLocale(string $locale): string - { - [$language, $script, $region] = self::getLanguageComponents($locale); - - return implode('_', array_filter([$language, $script, $region])); - } - - /** - * Returns an array of all possible combinations of the language components. - * - * For instance, if the locale is "fr_Latn_FR", this method will return: - * - "fr_Latn_FR" - * - "fr_Latn" - * - "fr_FR" - * - "fr" - * - * @return string[] - */ - private static function getLanguageCombinations(string $locale): array - { - [$language, $script, $region] = self::getLanguageComponents($locale); - - return array_unique([ - implode('_', array_filter([$language, $script, $region])), - implode('_', array_filter([$language, $script])), - implode('_', array_filter([$language, $region])), - $language, - ]); - } - - /** - * Returns an array with the language components of the locale. - * - * For example: - * - If the locale is "fr_Latn_FR", this method will return "fr", "Latn", "FR" - * - If the locale is "fr_FR", this method will return "fr", null, "FR" - * - If the locale is "zh_Hans", this method will return "zh", "Hans", null - * - * @see https://wikipedia.org/wiki/IETF_language_tag - * @see https://datatracker.ietf.org/doc/html/rfc5646 - * - * @return array{string, string|null, string|null} - */ - private static function getLanguageComponents(string $locale): array - { - $locale = str_replace('_', '-', strtolower($locale)); - $pattern = '/^([a-zA-Z]{2,3}|i-[a-zA-Z]{5,})(?:-([a-zA-Z]{4}))?(?:-([a-zA-Z]{2}))?(?:-(.+))?$/'; - if (!preg_match($pattern, $locale, $matches)) { - return [$locale, null, null]; - } - if (str_starts_with($matches[1], 'i-')) { - // Language not listed in ISO 639 that are not variants - // of any listed language, which can be registered with the - // i-prefix, such as i-cherokee - $matches[1] = substr($matches[1], 2); - } - - return [ - $matches[1], - isset($matches[2]) ? ucfirst(strtolower($matches[2])) : null, - isset($matches[3]) ? strtoupper($matches[3]) : null, - ]; - } - - /** - * Gets a list of charsets acceptable by the client browser in preferable order. - * - * @return string[] - */ - public function getCharsets(): array - { - return $this->charsets ??= array_map('strval', array_keys(AcceptHeader::fromString($this->headers->get('Accept-Charset'))->all())); - } - - /** - * Gets a list of encodings acceptable by the client browser in preferable order. - * - * @return string[] - */ - public function getEncodings(): array - { - return $this->encodings ??= array_map('strval', array_keys(AcceptHeader::fromString($this->headers->get('Accept-Encoding'))->all())); - } - - /** - * Gets a list of content types acceptable by the client browser in preferable order. - * - * @return string[] - */ - public function getAcceptableContentTypes(): array - { - return $this->acceptableContentTypes ??= array_map('strval', array_keys(AcceptHeader::fromString($this->headers->get('Accept'))->all())); - } - - /** - * Returns true if the request is an XMLHttpRequest. - * - * It works if your JavaScript library sets an X-Requested-With HTTP header. - * It is known to work with common JavaScript frameworks: - * - * @see https://wikipedia.org/wiki/List_of_Ajax_frameworks#JavaScript - */ - public function isXmlHttpRequest(): bool - { - return 'XMLHttpRequest' == $this->headers->get('X-Requested-With'); - } - - /** - * Checks whether the client browser prefers safe content or not according to RFC8674. - * - * @see https://tools.ietf.org/html/rfc8674 - */ - public function preferSafeContent(): bool - { - if (isset($this->isSafeContentPreferred)) { - return $this->isSafeContentPreferred; - } - - if (!$this->isSecure()) { - // see https://tools.ietf.org/html/rfc8674#section-3 - return $this->isSafeContentPreferred = false; - } - - return $this->isSafeContentPreferred = AcceptHeader::fromString($this->headers->get('Prefer'))->has('safe'); - } - - /* - * The following methods are derived from code of the Zend Framework (1.10dev - 2010-01-24) - * - * Code subject to the new BSD license (https://framework.zend.com/license). - * - * Copyright (c) 2005-2010 Zend Technologies USA Inc. (https://www.zend.com/) - */ - - protected function prepareRequestUri(): string - { - $requestUri = ''; - - if ($this->isIisRewrite() && '' != $this->server->get('UNENCODED_URL')) { - // IIS7 with URL Rewrite: make sure we get the unencoded URL (double slash problem) - $requestUri = $this->server->get('UNENCODED_URL'); - $this->server->remove('UNENCODED_URL'); - } elseif ($this->server->has('REQUEST_URI')) { - $requestUri = $this->server->get('REQUEST_URI'); - - if ('' !== $requestUri && '/' === $requestUri[0]) { - // To only use path and query remove the fragment. - if (false !== $pos = strpos($requestUri, '#')) { - $requestUri = substr($requestUri, 0, $pos); - } - } else { - // HTTP proxy reqs setup request URI with scheme and host [and port] + the URL path, - // only use URL path. - $uriComponents = parse_url($requestUri); - - if (isset($uriComponents['path'])) { - $requestUri = $uriComponents['path']; - } - - if (isset($uriComponents['query'])) { - $requestUri .= '?'.$uriComponents['query']; - } - } - } elseif ($this->server->has('ORIG_PATH_INFO')) { - // IIS 5.0, PHP as CGI - $requestUri = $this->server->get('ORIG_PATH_INFO'); - if ('' != $this->server->get('QUERY_STRING')) { - $requestUri .= '?'.$this->server->get('QUERY_STRING'); - } - $this->server->remove('ORIG_PATH_INFO'); - } - - // normalize the request URI to ease creating sub-requests from this request - $this->server->set('REQUEST_URI', $requestUri); - - return $requestUri; - } - - /** - * Prepares the base URL. - */ - protected function prepareBaseUrl(): string - { - $filename = basename($this->server->get('SCRIPT_FILENAME', '')); - - if (basename($this->server->get('SCRIPT_NAME', '')) === $filename) { - $baseUrl = $this->server->get('SCRIPT_NAME'); - } elseif (basename($this->server->get('PHP_SELF', '')) === $filename) { - $baseUrl = $this->server->get('PHP_SELF'); - } elseif (basename($this->server->get('ORIG_SCRIPT_NAME', '')) === $filename) { - $baseUrl = $this->server->get('ORIG_SCRIPT_NAME'); // 1and1 shared hosting compatibility - } else { - // Backtrack up the script_filename to find the portion matching - // php_self - $path = $this->server->get('PHP_SELF', ''); - $file = $this->server->get('SCRIPT_FILENAME', ''); - $segs = explode('/', trim($file, '/')); - $segs = array_reverse($segs); - $index = 0; - $last = \count($segs); - $baseUrl = ''; - do { - $seg = $segs[$index]; - $baseUrl = '/'.$seg.$baseUrl; - ++$index; - } while ($last > $index && (false !== $pos = strpos($path, $baseUrl)) && 0 != $pos); - } - - // Does the baseUrl have anything in common with the request_uri? - $requestUri = $this->getRequestUri(); - if ('' !== $requestUri && '/' !== $requestUri[0]) { - $requestUri = '/'.$requestUri; - } - - if ($baseUrl && null !== $prefix = $this->getUrlencodedPrefix($requestUri, $baseUrl)) { - // full $baseUrl matches - return $prefix; - } - - if ($baseUrl && null !== $prefix = $this->getUrlencodedPrefix($requestUri, rtrim(\dirname($baseUrl), '/'.\DIRECTORY_SEPARATOR).'/')) { - // directory portion of $baseUrl matches - return rtrim($prefix, '/'.\DIRECTORY_SEPARATOR); - } - - $truncatedRequestUri = $requestUri; - if (false !== $pos = strpos($requestUri, '?')) { - $truncatedRequestUri = substr($requestUri, 0, $pos); - } - - $basename = basename($baseUrl ?? ''); - if (!$basename || !strpos(rawurldecode($truncatedRequestUri), $basename)) { - // no match whatsoever; set it blank - return ''; - } - - // If using mod_rewrite or ISAPI_Rewrite strip the script filename - // out of baseUrl. $pos !== 0 makes sure it is not matching a value - // from PATH_INFO or QUERY_STRING - if (\strlen($requestUri) >= \strlen($baseUrl) && (false !== $pos = strpos($requestUri, $baseUrl)) && 0 !== $pos) { - $baseUrl = substr($requestUri, 0, $pos + \strlen($baseUrl)); - } - - return rtrim($baseUrl, '/'.\DIRECTORY_SEPARATOR); - } - - /** - * Prepares the base path. - */ - protected function prepareBasePath(): string - { - $baseUrl = $this->getBaseUrl(); - if (!$baseUrl) { - return ''; - } - - $filename = basename($this->server->get('SCRIPT_FILENAME')); - if (basename($baseUrl) === $filename) { - $basePath = \dirname($baseUrl); - } else { - $basePath = $baseUrl; - } - - if ('\\' === \DIRECTORY_SEPARATOR) { - $basePath = str_replace('\\', '/', $basePath); - } - - return rtrim($basePath, '/'); - } - - /** - * Prepares the path info. - */ - protected function preparePathInfo(): string - { - if (null === ($requestUri = $this->getRequestUri())) { - return '/'; - } - - // Remove the query string from REQUEST_URI - if (false !== $pos = strpos($requestUri, '?')) { - $requestUri = substr($requestUri, 0, $pos); - } - if ('' !== $requestUri && '/' !== $requestUri[0]) { - $requestUri = '/'.$requestUri; - } - - if (null === ($baseUrl = $this->getBaseUrlReal())) { - return $requestUri; - } - - $pathInfo = substr($requestUri, \strlen($baseUrl)); - if ('' === $pathInfo || '/' !== $pathInfo[0]) { - return '/'.$pathInfo; - } - - return $pathInfo; - } - - /** - * Initializes HTTP request formats. - */ - protected static function initializeFormats(): void - { - static::$formats = [ - 'html' => ['text/html', 'application/xhtml+xml'], - 'txt' => ['text/plain'], - 'js' => ['application/javascript', 'application/x-javascript', 'text/javascript'], - 'css' => ['text/css'], - 'json' => ['application/json', 'application/x-json'], - 'jsonld' => ['application/ld+json'], - 'xml' => ['text/xml', 'application/xml', 'application/x-xml'], - 'rdf' => ['application/rdf+xml'], - 'atom' => ['application/atom+xml'], - 'rss' => ['application/rss+xml'], - 'form' => ['application/x-www-form-urlencoded', 'multipart/form-data'], - 'soap' => ['application/soap+xml'], - 'problem' => ['application/problem+json'], - 'hal' => ['application/hal+json', 'application/hal+xml'], - 'jsonapi' => ['application/vnd.api+json'], - 'yaml' => ['text/yaml', 'application/x-yaml'], - 'wbxml' => ['application/vnd.wap.wbxml'], - 'pdf' => ['application/pdf'], - 'csv' => ['text/csv'], - ]; - } - - private function setPhpDefaultLocale(string $locale): void - { - // if either the class Locale doesn't exist, or an exception is thrown when - // setting the default locale, the intl module is not installed, and - // the call can be ignored: - try { - if (class_exists(\Locale::class, false)) { - \Locale::setDefault($locale); - } - } catch (\Exception) { - } - } - - /** - * Returns the prefix as encoded in the string when the string starts with - * the given prefix, null otherwise. - */ - private function getUrlencodedPrefix(string $string, string $prefix): ?string - { - if ($this->isIisRewrite()) { - // ISS with UrlRewriteModule might report SCRIPT_NAME/PHP_SELF with wrong case - // see https://github.com/php/php-src/issues/11981 - if (0 !== stripos(rawurldecode($string), $prefix)) { - return null; - } - } elseif (!str_starts_with(rawurldecode($string), $prefix)) { - return null; - } - - $len = \strlen($prefix); - - if (preg_match(\sprintf('#^(%%[[:xdigit:]]{2}|.){%d}#', $len), $string, $match)) { - return $match[0]; - } - - return null; - } - - private static function createRequestFromFactory(array $query = [], array $request = [], array $attributes = [], array $cookies = [], array $files = [], array $server = [], $content = null): static - { - if (self::$requestFactory) { - $request = (self::$requestFactory)($query, $request, $attributes, $cookies, $files, $server, $content); - - if (!$request instanceof self) { - throw new \LogicException('The Request factory must return an instance of Symfony\Component\HttpFoundation\Request.'); - } - - return $request; - } - - return new static($query, $request, $attributes, $cookies, $files, $server, $content); - } - - /** - * Indicates whether this request originated from a trusted proxy. - * - * This can be useful to determine whether or not to trust the - * contents of a proxy-specific header. - */ - public function isFromTrustedProxy(): bool - { - return self::$trustedProxies && IpUtils::checkIp($this->server->get('REMOTE_ADDR', ''), self::$trustedProxies); - } - - /** - * This method is rather heavy because it splits and merges headers, and it's called by many other methods such as - * getPort(), isSecure(), getHost(), getClientIps(), getBaseUrl() etc. Thus, we try to cache the results for - * best performance. - */ - private function getTrustedValues(int $type, ?string $ip = null): array - { - $cacheKey = $type."\0".((self::$trustedHeaderSet & $type) ? $this->headers->get(self::TRUSTED_HEADERS[$type]) : ''); - $cacheKey .= "\0".$ip."\0".$this->headers->get(self::TRUSTED_HEADERS[self::HEADER_FORWARDED]); - - if (isset($this->trustedValuesCache[$cacheKey])) { - return $this->trustedValuesCache[$cacheKey]; - } - - $clientValues = []; - $forwardedValues = []; - - if ((self::$trustedHeaderSet & $type) && $this->headers->has(self::TRUSTED_HEADERS[$type])) { - foreach (explode(',', $this->headers->get(self::TRUSTED_HEADERS[$type])) as $v) { - $clientValues[] = (self::HEADER_X_FORWARDED_PORT === $type ? '0.0.0.0:' : '').trim($v); - } - } - - if ((self::$trustedHeaderSet & self::HEADER_FORWARDED) && (isset(self::FORWARDED_PARAMS[$type])) && $this->headers->has(self::TRUSTED_HEADERS[self::HEADER_FORWARDED])) { - $forwarded = $this->headers->get(self::TRUSTED_HEADERS[self::HEADER_FORWARDED]); - $parts = HeaderUtils::split($forwarded, ',;='); - $param = self::FORWARDED_PARAMS[$type]; - foreach ($parts as $subParts) { - if (null === $v = HeaderUtils::combine($subParts)[$param] ?? null) { - continue; - } - if (self::HEADER_X_FORWARDED_PORT === $type) { - if (str_ends_with($v, ']') || false === $v = strrchr($v, ':')) { - $v = $this->isSecure() ? ':443' : ':80'; - } - $v = '0.0.0.0'.$v; - } - $forwardedValues[] = $v; - } - } - - if (null !== $ip) { - $clientValues = $this->normalizeAndFilterClientIps($clientValues, $ip); - $forwardedValues = $this->normalizeAndFilterClientIps($forwardedValues, $ip); - } - - if ($forwardedValues === $clientValues || !$clientValues) { - return $this->trustedValuesCache[$cacheKey] = $forwardedValues; - } - - if (!$forwardedValues) { - return $this->trustedValuesCache[$cacheKey] = $clientValues; - } - - if (!$this->isForwardedValid) { - return $this->trustedValuesCache[$cacheKey] = null !== $ip ? ['0.0.0.0', $ip] : []; - } - $this->isForwardedValid = false; - - throw new ConflictingHeadersException(\sprintf('The request has both a trusted "%s" header and a trusted "%s" header, conflicting with each other. You should either configure your proxy to remove one of them, or configure your project to distrust the offending one.', self::TRUSTED_HEADERS[self::HEADER_FORWARDED], self::TRUSTED_HEADERS[$type])); - } - - private function normalizeAndFilterClientIps(array $clientIps, string $ip): array - { - if (!$clientIps) { - return []; - } - $clientIps[] = $ip; // Complete the IP chain with the IP the request actually came from - $firstTrustedIp = null; - - foreach ($clientIps as $key => $clientIp) { - if (strpos($clientIp, '.')) { - // Strip :port from IPv4 addresses. This is allowed in Forwarded - // and may occur in X-Forwarded-For. - $i = strpos($clientIp, ':'); - if ($i) { - $clientIps[$key] = $clientIp = substr($clientIp, 0, $i); - } - } elseif (str_starts_with($clientIp, '[')) { - // Strip brackets and :port from IPv6 addresses. - $i = strpos($clientIp, ']', 1); - $clientIps[$key] = $clientIp = substr($clientIp, 1, $i - 1); - } - - if (!filter_var($clientIp, \FILTER_VALIDATE_IP)) { - unset($clientIps[$key]); - - continue; - } - - if (IpUtils::checkIp($clientIp, self::$trustedProxies)) { - unset($clientIps[$key]); - - // Fallback to this when the client IP falls into the range of trusted proxies - $firstTrustedIp ??= $clientIp; - } - } - - // Now the IP chain contains only untrusted proxies and the client IP - return $clientIps ? array_reverse($clientIps) : [$firstTrustedIp]; - } - - /** - * Is this IIS with UrlRewriteModule? - * - * This method consumes, caches and removed the IIS_WasUrlRewritten env var, - * so we don't inherit it to sub-requests. - */ - private function isIisRewrite(): bool - { - if (1 === $this->server->getInt('IIS_WasUrlRewritten')) { - $this->isIisRewrite = true; - $this->server->remove('IIS_WasUrlRewritten'); - } - - return $this->isIisRewrite; - } - - /** - * See https://url.spec.whatwg.org/. - */ - private static function isHostValid(string $host): bool - { - if ('[' === $host[0]) { - return ']' === $host[-1] && filter_var(substr($host, 1, -1), \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV6); - } - - if (preg_match('/\.[0-9]++\.?$/D', $host)) { - return null !== filter_var($host, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV4 | \FILTER_NULL_ON_FAILURE); - } - - // use preg_replace() instead of preg_match() to prevent DoS attacks with long host names - return '' === preg_replace('/[-a-zA-Z0-9_]++\.?/', '', $host); - } -} diff --git a/plugins/vendor/symfony/http-foundation/RequestMatcher/AttributesRequestMatcher.php b/plugins/vendor/symfony/http-foundation/RequestMatcher/AttributesRequestMatcher.php deleted file mode 100644 index 09d6f49d..00000000 --- a/plugins/vendor/symfony/http-foundation/RequestMatcher/AttributesRequestMatcher.php +++ /dev/null @@ -1,45 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\RequestMatcher; - -use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\HttpFoundation\RequestMatcherInterface; - -/** - * Checks the Request attributes matches all regular expressions. - * - * @author Fabien Potencier - */ -class AttributesRequestMatcher implements RequestMatcherInterface -{ - /** - * @param array $regexps - */ - public function __construct(private array $regexps) - { - } - - public function matches(Request $request): bool - { - foreach ($this->regexps as $key => $regexp) { - $attribute = $request->attributes->get($key); - if (!\is_string($attribute)) { - return false; - } - if (!preg_match('{'.$regexp.'}', $attribute)) { - return false; - } - } - - return true; - } -} diff --git a/plugins/vendor/symfony/http-foundation/RequestMatcher/ExpressionRequestMatcher.php b/plugins/vendor/symfony/http-foundation/RequestMatcher/ExpressionRequestMatcher.php deleted file mode 100644 index 935853f1..00000000 --- a/plugins/vendor/symfony/http-foundation/RequestMatcher/ExpressionRequestMatcher.php +++ /dev/null @@ -1,43 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\RequestMatcher; - -use Symfony\Component\ExpressionLanguage\Expression; -use Symfony\Component\ExpressionLanguage\ExpressionLanguage; -use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\HttpFoundation\RequestMatcherInterface; - -/** - * ExpressionRequestMatcher uses an expression to match a Request. - * - * @author Fabien Potencier - */ -class ExpressionRequestMatcher implements RequestMatcherInterface -{ - public function __construct( - private ExpressionLanguage $language, - private Expression|string $expression, - ) { - } - - public function matches(Request $request): bool - { - return $this->language->evaluate($this->expression, [ - 'request' => $request, - 'method' => $request->getMethod(), - 'path' => rawurldecode($request->getPathInfo()), - 'host' => $request->getHost(), - 'ip' => $request->getClientIp(), - 'attributes' => $request->attributes->all(), - ]); - } -} diff --git a/plugins/vendor/symfony/http-foundation/RequestMatcher/HeaderRequestMatcher.php b/plugins/vendor/symfony/http-foundation/RequestMatcher/HeaderRequestMatcher.php deleted file mode 100644 index 8617a8ac..00000000 --- a/plugins/vendor/symfony/http-foundation/RequestMatcher/HeaderRequestMatcher.php +++ /dev/null @@ -1,52 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\RequestMatcher; - -use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\HttpFoundation\RequestMatcherInterface; - -/** - * Checks the presence of HTTP headers in a Request. - * - * @author Alexandre Daubois - */ -class HeaderRequestMatcher implements RequestMatcherInterface -{ - /** - * @var string[] - */ - private array $headers; - - /** - * @param string[]|string $headers A header or a list of headers - * Strings can contain a comma-delimited list of headers - */ - public function __construct(array|string $headers) - { - $this->headers = array_reduce((array) $headers, static fn (array $headers, string $header) => array_merge($headers, preg_split('/\s*,\s*/', $header)), []); - } - - public function matches(Request $request): bool - { - if (!$this->headers) { - return true; - } - - foreach ($this->headers as $header) { - if (!$request->headers->has($header)) { - return false; - } - } - - return true; - } -} diff --git a/plugins/vendor/symfony/http-foundation/RequestMatcher/HostRequestMatcher.php b/plugins/vendor/symfony/http-foundation/RequestMatcher/HostRequestMatcher.php deleted file mode 100644 index 2836759c..00000000 --- a/plugins/vendor/symfony/http-foundation/RequestMatcher/HostRequestMatcher.php +++ /dev/null @@ -1,32 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\RequestMatcher; - -use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\HttpFoundation\RequestMatcherInterface; - -/** - * Checks the Request URL host name matches a regular expression. - * - * @author Fabien Potencier - */ -class HostRequestMatcher implements RequestMatcherInterface -{ - public function __construct(private string $regexp) - { - } - - public function matches(Request $request): bool - { - return preg_match('{'.$this->regexp.'}i', $request->getHost()); - } -} diff --git a/plugins/vendor/symfony/http-foundation/RequestMatcher/IpsRequestMatcher.php b/plugins/vendor/symfony/http-foundation/RequestMatcher/IpsRequestMatcher.php deleted file mode 100644 index 333612e2..00000000 --- a/plugins/vendor/symfony/http-foundation/RequestMatcher/IpsRequestMatcher.php +++ /dev/null @@ -1,44 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\RequestMatcher; - -use Symfony\Component\HttpFoundation\IpUtils; -use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\HttpFoundation\RequestMatcherInterface; - -/** - * Checks the client IP of a Request. - * - * @author Fabien Potencier - */ -class IpsRequestMatcher implements RequestMatcherInterface -{ - private array $ips; - - /** - * @param string[]|string $ips A specific IP address or a range specified using IP/netmask like 192.168.1.0/24 - * Strings can contain a comma-delimited list of IPs/ranges - */ - public function __construct(array|string $ips) - { - $this->ips = array_reduce((array) $ips, static fn (array $ips, string $ip) => array_merge($ips, preg_split('/\s*,\s*/', $ip)), []); - } - - public function matches(Request $request): bool - { - if (!$this->ips) { - return true; - } - - return IpUtils::checkIp($request->getClientIp() ?? '', $this->ips); - } -} diff --git a/plugins/vendor/symfony/http-foundation/RequestMatcher/IsJsonRequestMatcher.php b/plugins/vendor/symfony/http-foundation/RequestMatcher/IsJsonRequestMatcher.php deleted file mode 100644 index 875f992b..00000000 --- a/plugins/vendor/symfony/http-foundation/RequestMatcher/IsJsonRequestMatcher.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\RequestMatcher; - -use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\HttpFoundation\RequestMatcherInterface; - -/** - * Checks the Request content is valid JSON. - * - * @author Fabien Potencier - */ -class IsJsonRequestMatcher implements RequestMatcherInterface -{ - public function matches(Request $request): bool - { - return json_validate($request->getContent()); - } -} diff --git a/plugins/vendor/symfony/http-foundation/RequestMatcher/MethodRequestMatcher.php b/plugins/vendor/symfony/http-foundation/RequestMatcher/MethodRequestMatcher.php deleted file mode 100644 index b37f6e3c..00000000 --- a/plugins/vendor/symfony/http-foundation/RequestMatcher/MethodRequestMatcher.php +++ /dev/null @@ -1,46 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\RequestMatcher; - -use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\HttpFoundation\RequestMatcherInterface; - -/** - * Checks the HTTP method of a Request. - * - * @author Fabien Potencier - */ -class MethodRequestMatcher implements RequestMatcherInterface -{ - /** - * @var string[] - */ - private array $methods = []; - - /** - * @param string[]|string $methods An HTTP method or an array of HTTP methods - * Strings can contain a comma-delimited list of methods - */ - public function __construct(array|string $methods) - { - $this->methods = array_reduce(array_map('strtoupper', (array) $methods), static fn (array $methods, string $method) => array_merge($methods, preg_split('/\s*,\s*/', $method)), []); - } - - public function matches(Request $request): bool - { - if (!$this->methods) { - return true; - } - - return \in_array($request->getMethod(), $this->methods, true); - } -} diff --git a/plugins/vendor/symfony/http-foundation/RequestMatcher/PathRequestMatcher.php b/plugins/vendor/symfony/http-foundation/RequestMatcher/PathRequestMatcher.php deleted file mode 100644 index c7c7a02c..00000000 --- a/plugins/vendor/symfony/http-foundation/RequestMatcher/PathRequestMatcher.php +++ /dev/null @@ -1,32 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\RequestMatcher; - -use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\HttpFoundation\RequestMatcherInterface; - -/** - * Checks the Request URL path info matches a regular expression. - * - * @author Fabien Potencier - */ -class PathRequestMatcher implements RequestMatcherInterface -{ - public function __construct(private string $regexp) - { - } - - public function matches(Request $request): bool - { - return preg_match('{'.$this->regexp.'}', rawurldecode($request->getPathInfo())); - } -} diff --git a/plugins/vendor/symfony/http-foundation/RequestMatcher/PortRequestMatcher.php b/plugins/vendor/symfony/http-foundation/RequestMatcher/PortRequestMatcher.php deleted file mode 100644 index 5a01ce95..00000000 --- a/plugins/vendor/symfony/http-foundation/RequestMatcher/PortRequestMatcher.php +++ /dev/null @@ -1,32 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\RequestMatcher; - -use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\HttpFoundation\RequestMatcherInterface; - -/** - * Checks the HTTP port of a Request. - * - * @author Fabien Potencier - */ -class PortRequestMatcher implements RequestMatcherInterface -{ - public function __construct(private int $port) - { - } - - public function matches(Request $request): bool - { - return $request->getPort() === $this->port; - } -} diff --git a/plugins/vendor/symfony/http-foundation/RequestMatcher/QueryParameterRequestMatcher.php b/plugins/vendor/symfony/http-foundation/RequestMatcher/QueryParameterRequestMatcher.php deleted file mode 100644 index 86161e7c..00000000 --- a/plugins/vendor/symfony/http-foundation/RequestMatcher/QueryParameterRequestMatcher.php +++ /dev/null @@ -1,46 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\RequestMatcher; - -use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\HttpFoundation\RequestMatcherInterface; - -/** - * Checks the presence of HTTP query parameters of a Request. - * - * @author Alexandre Daubois - */ -class QueryParameterRequestMatcher implements RequestMatcherInterface -{ - /** - * @var string[] - */ - private array $parameters; - - /** - * @param string[]|string $parameters A parameter or a list of parameters - * Strings can contain a comma-delimited list of query parameters - */ - public function __construct(array|string $parameters) - { - $this->parameters = array_reduce(array_map(strtolower(...), (array) $parameters), static fn (array $parameters, string $parameter) => array_merge($parameters, preg_split('/\s*,\s*/', $parameter)), []); - } - - public function matches(Request $request): bool - { - if (!$this->parameters) { - return true; - } - - return 0 === \count(array_diff_assoc($this->parameters, $request->query->keys())); - } -} diff --git a/plugins/vendor/symfony/http-foundation/RequestMatcher/SchemeRequestMatcher.php b/plugins/vendor/symfony/http-foundation/RequestMatcher/SchemeRequestMatcher.php deleted file mode 100644 index 9c9cd58b..00000000 --- a/plugins/vendor/symfony/http-foundation/RequestMatcher/SchemeRequestMatcher.php +++ /dev/null @@ -1,46 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\RequestMatcher; - -use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\HttpFoundation\RequestMatcherInterface; - -/** - * Checks the HTTP scheme of a Request. - * - * @author Fabien Potencier - */ -class SchemeRequestMatcher implements RequestMatcherInterface -{ - /** - * @var string[] - */ - private array $schemes; - - /** - * @param string[]|string $schemes A scheme or a list of schemes - * Strings can contain a comma-delimited list of schemes - */ - public function __construct(array|string $schemes) - { - $this->schemes = array_reduce(array_map('strtolower', (array) $schemes), static fn (array $schemes, string $scheme) => array_merge($schemes, preg_split('/\s*,\s*/', $scheme)), []); - } - - public function matches(Request $request): bool - { - if (!$this->schemes) { - return true; - } - - return \in_array($request->getScheme(), $this->schemes, true); - } -} diff --git a/plugins/vendor/symfony/http-foundation/RequestMatcherInterface.php b/plugins/vendor/symfony/http-foundation/RequestMatcherInterface.php deleted file mode 100644 index 6dcc3e0f..00000000 --- a/plugins/vendor/symfony/http-foundation/RequestMatcherInterface.php +++ /dev/null @@ -1,25 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation; - -/** - * RequestMatcherInterface is an interface for strategies to match a Request. - * - * @author Fabien Potencier - */ -interface RequestMatcherInterface -{ - /** - * Decides whether the rule(s) implemented by the strategy matches the supplied request. - */ - public function matches(Request $request): bool; -} diff --git a/plugins/vendor/symfony/http-foundation/RequestStack.php b/plugins/vendor/symfony/http-foundation/RequestStack.php deleted file mode 100644 index 153bd9ad..00000000 --- a/plugins/vendor/symfony/http-foundation/RequestStack.php +++ /dev/null @@ -1,124 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation; - -use Symfony\Component\HttpFoundation\Exception\SessionNotFoundException; -use Symfony\Component\HttpFoundation\Session\SessionInterface; - -/** - * Request stack that controls the lifecycle of requests. - * - * @author Benjamin Eberlei - */ -class RequestStack -{ - /** - * @var Request[] - */ - private array $requests = []; - - /** - * @param Request[] $requests - */ - public function __construct(array $requests = []) - { - foreach ($requests as $request) { - $this->push($request); - } - } - - /** - * Pushes a Request on the stack. - * - * This method should generally not be called directly as the stack - * management should be taken care of by the application itself. - */ - public function push(Request $request): void - { - $this->requests[] = $request; - } - - /** - * Pops the current request from the stack. - * - * This operation lets the current request go out of scope. - * - * This method should generally not be called directly as the stack - * management should be taken care of by the application itself. - */ - public function pop(): ?Request - { - if (!$this->requests) { - return null; - } - - return array_pop($this->requests); - } - - public function getCurrentRequest(): ?Request - { - return end($this->requests) ?: null; - } - - /** - * Gets the main request. - * - * Be warned that making your code aware of the main request - * might make it un-compatible with other features of your framework - * like ESI support. - */ - public function getMainRequest(): ?Request - { - if (!$this->requests) { - return null; - } - - return $this->requests[0]; - } - - /** - * Returns the parent request of the current. - * - * Be warned that making your code aware of the parent request - * might make it un-compatible with other features of your framework - * like ESI support. - * - * If current Request is the main request, it returns null. - */ - public function getParentRequest(): ?Request - { - $pos = \count($this->requests) - 2; - - return $this->requests[$pos] ?? null; - } - - /** - * Gets the current session. - * - * @throws SessionNotFoundException - */ - public function getSession(): SessionInterface - { - if ((null !== $request = end($this->requests) ?: null) && $request->hasSession()) { - return $request->getSession(); - } - - throw new SessionNotFoundException(); - } - - public function resetRequestFormats(): void - { - static $resetRequestFormats; - $resetRequestFormats ??= \Closure::bind(static fn () => self::$formats = null, null, Request::class); - $resetRequestFormats(); - } -} diff --git a/plugins/vendor/symfony/http-foundation/Response.php b/plugins/vendor/symfony/http-foundation/Response.php deleted file mode 100644 index a2022976..00000000 --- a/plugins/vendor/symfony/http-foundation/Response.php +++ /dev/null @@ -1,1323 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation; - -// Help opcache.preload discover always-needed symbols -class_exists(ResponseHeaderBag::class); - -/** - * Response represents an HTTP response. - * - * @author Fabien Potencier - */ -class Response -{ - public const HTTP_CONTINUE = 100; - public const HTTP_SWITCHING_PROTOCOLS = 101; - public const HTTP_PROCESSING = 102; // RFC2518 - public const HTTP_EARLY_HINTS = 103; // RFC8297 - public const HTTP_OK = 200; - public const HTTP_CREATED = 201; - public const HTTP_ACCEPTED = 202; - public const HTTP_NON_AUTHORITATIVE_INFORMATION = 203; - public const HTTP_NO_CONTENT = 204; - public const HTTP_RESET_CONTENT = 205; - public const HTTP_PARTIAL_CONTENT = 206; - public const HTTP_MULTI_STATUS = 207; // RFC4918 - public const HTTP_ALREADY_REPORTED = 208; // RFC5842 - public const HTTP_IM_USED = 226; // RFC3229 - public const HTTP_MULTIPLE_CHOICES = 300; - public const HTTP_MOVED_PERMANENTLY = 301; - public const HTTP_FOUND = 302; - public const HTTP_SEE_OTHER = 303; - public const HTTP_NOT_MODIFIED = 304; - public const HTTP_USE_PROXY = 305; - public const HTTP_RESERVED = 306; - public const HTTP_TEMPORARY_REDIRECT = 307; - public const HTTP_PERMANENTLY_REDIRECT = 308; // RFC7238 - public const HTTP_BAD_REQUEST = 400; - public const HTTP_UNAUTHORIZED = 401; - public const HTTP_PAYMENT_REQUIRED = 402; - public const HTTP_FORBIDDEN = 403; - public const HTTP_NOT_FOUND = 404; - public const HTTP_METHOD_NOT_ALLOWED = 405; - public const HTTP_NOT_ACCEPTABLE = 406; - public const HTTP_PROXY_AUTHENTICATION_REQUIRED = 407; - public const HTTP_REQUEST_TIMEOUT = 408; - public const HTTP_CONFLICT = 409; - public const HTTP_GONE = 410; - public const HTTP_LENGTH_REQUIRED = 411; - public const HTTP_PRECONDITION_FAILED = 412; - public const HTTP_REQUEST_ENTITY_TOO_LARGE = 413; - public const HTTP_REQUEST_URI_TOO_LONG = 414; - public const HTTP_UNSUPPORTED_MEDIA_TYPE = 415; - public const HTTP_REQUESTED_RANGE_NOT_SATISFIABLE = 416; - public const HTTP_EXPECTATION_FAILED = 417; - public const HTTP_I_AM_A_TEAPOT = 418; // RFC2324 - public const HTTP_MISDIRECTED_REQUEST = 421; // RFC7540 - public const HTTP_UNPROCESSABLE_ENTITY = 422; // RFC4918 - public const HTTP_LOCKED = 423; // RFC4918 - public const HTTP_FAILED_DEPENDENCY = 424; // RFC4918 - public const HTTP_TOO_EARLY = 425; // RFC-ietf-httpbis-replay-04 - public const HTTP_UPGRADE_REQUIRED = 426; // RFC2817 - public const HTTP_PRECONDITION_REQUIRED = 428; // RFC6585 - public const HTTP_TOO_MANY_REQUESTS = 429; // RFC6585 - public const HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE = 431; // RFC6585 - public const HTTP_UNAVAILABLE_FOR_LEGAL_REASONS = 451; // RFC7725 - public const HTTP_INTERNAL_SERVER_ERROR = 500; - public const HTTP_NOT_IMPLEMENTED = 501; - public const HTTP_BAD_GATEWAY = 502; - public const HTTP_SERVICE_UNAVAILABLE = 503; - public const HTTP_GATEWAY_TIMEOUT = 504; - public const HTTP_VERSION_NOT_SUPPORTED = 505; - public const HTTP_VARIANT_ALSO_NEGOTIATES_EXPERIMENTAL = 506; // RFC2295 - public const HTTP_INSUFFICIENT_STORAGE = 507; // RFC4918 - public const HTTP_LOOP_DETECTED = 508; // RFC5842 - public const HTTP_NOT_EXTENDED = 510; // RFC2774 - public const HTTP_NETWORK_AUTHENTICATION_REQUIRED = 511; // RFC6585 - - /** - * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control - */ - private const HTTP_RESPONSE_CACHE_CONTROL_DIRECTIVES = [ - 'must_revalidate' => false, - 'no_cache' => false, - 'no_store' => false, - 'no_transform' => false, - 'public' => false, - 'private' => false, - 'proxy_revalidate' => false, - 'max_age' => true, - 's_maxage' => true, - 'stale_if_error' => true, // RFC5861 - 'stale_while_revalidate' => true, // RFC5861 - 'immutable' => false, - 'last_modified' => true, - 'etag' => true, - ]; - - public ResponseHeaderBag $headers; - - protected string $content; - protected string $version; - protected int $statusCode; - protected string $statusText; - protected ?string $charset = null; - - /** - * Status codes translation table. - * - * The list of codes is complete according to the - * {@link https://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml Hypertext Transfer Protocol (HTTP) Status Code Registry} - * (last updated 2021-10-01). - * - * Unless otherwise noted, the status code is defined in RFC2616. - * - * @var array - */ - public static array $statusTexts = [ - 100 => 'Continue', - 101 => 'Switching Protocols', - 102 => 'Processing', // RFC2518 - 103 => 'Early Hints', - 200 => 'OK', - 201 => 'Created', - 202 => 'Accepted', - 203 => 'Non-Authoritative Information', - 204 => 'No Content', - 205 => 'Reset Content', - 206 => 'Partial Content', - 207 => 'Multi-Status', // RFC4918 - 208 => 'Already Reported', // RFC5842 - 226 => 'IM Used', // RFC3229 - 300 => 'Multiple Choices', - 301 => 'Moved Permanently', - 302 => 'Found', - 303 => 'See Other', - 304 => 'Not Modified', - 305 => 'Use Proxy', - 307 => 'Temporary Redirect', - 308 => 'Permanent Redirect', // RFC7238 - 400 => 'Bad Request', - 401 => 'Unauthorized', - 402 => 'Payment Required', - 403 => 'Forbidden', - 404 => 'Not Found', - 405 => 'Method Not Allowed', - 406 => 'Not Acceptable', - 407 => 'Proxy Authentication Required', - 408 => 'Request Timeout', - 409 => 'Conflict', - 410 => 'Gone', - 411 => 'Length Required', - 412 => 'Precondition Failed', - 413 => 'Content Too Large', // RFC-ietf-httpbis-semantics - 414 => 'URI Too Long', - 415 => 'Unsupported Media Type', - 416 => 'Range Not Satisfiable', - 417 => 'Expectation Failed', - 418 => 'I\'m a teapot', // RFC2324 - 421 => 'Misdirected Request', // RFC7540 - 422 => 'Unprocessable Content', // RFC-ietf-httpbis-semantics - 423 => 'Locked', // RFC4918 - 424 => 'Failed Dependency', // RFC4918 - 425 => 'Too Early', // RFC-ietf-httpbis-replay-04 - 426 => 'Upgrade Required', // RFC2817 - 428 => 'Precondition Required', // RFC6585 - 429 => 'Too Many Requests', // RFC6585 - 431 => 'Request Header Fields Too Large', // RFC6585 - 451 => 'Unavailable For Legal Reasons', // RFC7725 - 500 => 'Internal Server Error', - 501 => 'Not Implemented', - 502 => 'Bad Gateway', - 503 => 'Service Unavailable', - 504 => 'Gateway Timeout', - 505 => 'HTTP Version Not Supported', - 506 => 'Variant Also Negotiates', // RFC2295 - 507 => 'Insufficient Storage', // RFC4918 - 508 => 'Loop Detected', // RFC5842 - 510 => 'Not Extended', // RFC2774 - 511 => 'Network Authentication Required', // RFC6585 - ]; - - /** - * Tracks headers already sent in informational responses. - */ - private array $sentHeaders; - - /** - * @param int $status The HTTP status code (200 "OK" by default) - * - * @throws \InvalidArgumentException When the HTTP status code is not valid - */ - public function __construct(?string $content = '', int $status = 200, array $headers = []) - { - $this->headers = new ResponseHeaderBag($headers); - $this->setContent($content); - $this->setStatusCode($status); - $this->setProtocolVersion('1.0'); - } - - /** - * Returns the Response as an HTTP string. - * - * The string representation of the Response is the same as the - * one that will be sent to the client only if the prepare() method - * has been called before. - * - * @see prepare() - */ - public function __toString(): string - { - return - \sprintf('HTTP/%s %s %s', $this->version, $this->statusCode, $this->statusText)."\r\n". - $this->headers."\r\n". - $this->getContent(); - } - - /** - * Clones the current Response instance. - */ - public function __clone() - { - $this->headers = clone $this->headers; - } - - /** - * Prepares the Response before it is sent to the client. - * - * This method tweaks the Response to ensure that it is - * compliant with RFC 2616. Most of the changes are based on - * the Request that is "associated" with this Response. - * - * @return $this - */ - public function prepare(Request $request): static - { - $headers = $this->headers; - - if ($this->isInformational() || $this->isEmpty()) { - $this->setContent(null); - $headers->remove('Content-Type'); - $headers->remove('Content-Length'); - // prevent PHP from sending the Content-Type header based on default_mimetype - ini_set('default_mimetype', ''); - } else { - // Content-type based on the Request - if (!$headers->has('Content-Type')) { - $format = $request->getRequestFormat(null); - if (null !== $format && $mimeType = $request->getMimeType($format)) { - $headers->set('Content-Type', $mimeType); - } - } - - // Fix Content-Type - $charset = $this->charset ?: 'utf-8'; - if (!$headers->has('Content-Type')) { - $headers->set('Content-Type', 'text/html; charset='.$charset); - } elseif (0 === stripos($headers->get('Content-Type') ?? '', 'text/') && false === stripos($headers->get('Content-Type') ?? '', 'charset')) { - // add the charset - $headers->set('Content-Type', $headers->get('Content-Type').'; charset='.$charset); - } - - // Fix Content-Length - if ($headers->has('Transfer-Encoding')) { - $headers->remove('Content-Length'); - } - - if ($request->isMethod('HEAD')) { - // cf. RFC2616 14.13 - $length = $headers->get('Content-Length'); - $this->setContent(null); - if ($length) { - $headers->set('Content-Length', $length); - } - } - } - - // Fix protocol - if ('HTTP/1.0' != $request->server->get('SERVER_PROTOCOL')) { - $this->setProtocolVersion('1.1'); - } - - // Check if we need to send extra expire info headers - if ('1.0' == $this->getProtocolVersion() && str_contains($headers->get('Cache-Control', ''), 'no-cache')) { - $headers->set('pragma', 'no-cache'); - $headers->set('expires', -1); - } - - $this->ensureIEOverSSLCompatibility($request); - - if ($request->isSecure()) { - foreach ($headers->getCookies() as $cookie) { - $cookie->setSecureDefault(true); - } - } - - return $this; - } - - /** - * Sends HTTP headers. - * - * @param positive-int|null $statusCode The status code to use, override the statusCode property if set and not null - * - * @return $this - */ - public function sendHeaders(?int $statusCode = null): static - { - // headers have already been sent by the developer - if (headers_sent()) { - if (!\in_array(\PHP_SAPI, ['cli', 'phpdbg', 'embed'], true)) { - $statusCode ??= $this->statusCode; - trigger_deprecation('symfony/http-foundation', '7.4', 'Trying to use "%s::sendHeaders()" after headers have already been sent is deprecated and will throw a PHP warning in 8.0. Use a "StreamedResponse" instead.', static::class); - // header(\sprintf('HTTP/%s %s %s', $this->version, $statusCode, $this->statusText), true, $statusCode); - } - - return $this; - } - - $informationalResponse = $statusCode >= 100 && $statusCode < 200; - if ($informationalResponse && !\function_exists('headers_send')) { - // skip informational responses if not supported by the SAPI - return $this; - } - - // headers - foreach ($this->headers->allPreserveCaseWithoutCookies() as $name => $values) { - // As recommended by RFC 8297, PHP automatically copies headers from previous 103 responses, we need to deal with that if headers changed - $previousValues = $this->sentHeaders[$name] ?? null; - if ($previousValues === $values) { - // Header already sent in a previous response, it will be automatically copied in this response by PHP - continue; - } - - $replace = 0 === strcasecmp($name, 'Content-Type'); - - if (null !== $previousValues && array_diff($previousValues, $values)) { - header_remove($name); - $previousValues = null; - } - - $newValues = null === $previousValues ? $values : array_diff($values, $previousValues); - - foreach ($newValues as $value) { - header($name.': '.$value, $replace, $this->statusCode); - } - - if ($informationalResponse) { - $this->sentHeaders[$name] = $values; - } - } - - // cookies - foreach ($this->headers->getCookies() as $cookie) { - header('Set-Cookie: '.$cookie, false, $this->statusCode); - } - - if ($informationalResponse) { - headers_send($statusCode); - - return $this; - } - - $statusCode ??= $this->statusCode; - - // status - header(\sprintf('HTTP/%s %s %s', $this->version, $statusCode, $this->statusText), true, $statusCode); - - return $this; - } - - /** - * Sends content for the current web response. - * - * @return $this - */ - public function sendContent(): static - { - echo $this->content; - - return $this; - } - - /** - * Sends HTTP headers and content. - * - * @param bool $flush Whether output buffers should be flushed - * - * @return $this - */ - public function send(bool $flush = true): static - { - $this->sendHeaders(); - $this->sendContent(); - - if (!$flush) { - return $this; - } - - if (\function_exists('fastcgi_finish_request')) { - fastcgi_finish_request(); - } elseif (\function_exists('litespeed_finish_request')) { - litespeed_finish_request(); - } elseif (!\in_array(\PHP_SAPI, ['cli', 'phpdbg', 'embed'], true)) { - static::closeOutputBuffers(0, true); - flush(); - } - - return $this; - } - - /** - * Sets the response content. - * - * @return $this - */ - public function setContent(?string $content): static - { - $this->content = $content ?? ''; - - return $this; - } - - /** - * Gets the current response content. - */ - public function getContent(): string|false - { - return $this->content; - } - - /** - * Sets the HTTP protocol version (1.0 or 1.1). - * - * @return $this - * - * @final - */ - public function setProtocolVersion(string $version): static - { - $this->version = $version; - - return $this; - } - - /** - * Gets the HTTP protocol version. - * - * @final - */ - public function getProtocolVersion(): string - { - return $this->version; - } - - /** - * Sets the response status code. - * - * If the status text is null it will be automatically populated for the known - * status codes and left empty otherwise. - * - * @return $this - * - * @throws \InvalidArgumentException When the HTTP status code is not valid - * - * @final - */ - public function setStatusCode(int $code, ?string $text = null): static - { - $this->statusCode = $code; - if ($this->isInvalid()) { - throw new \InvalidArgumentException(\sprintf('The HTTP status code "%s" is not valid.', $code)); - } - - if (null === $text) { - $this->statusText = self::$statusTexts[$code] ?? 'unknown status'; - - return $this; - } - - $this->statusText = $text; - - return $this; - } - - /** - * Retrieves the status code for the current web response. - * - * @final - */ - public function getStatusCode(): int - { - return $this->statusCode; - } - - /** - * Sets the response charset. - * - * @return $this - * - * @final - */ - public function setCharset(string $charset): static - { - $this->charset = $charset; - - return $this; - } - - /** - * Retrieves the response charset. - * - * @final - */ - public function getCharset(): ?string - { - return $this->charset; - } - - /** - * Returns true if the response may safely be kept in a shared (surrogate) cache. - * - * Responses marked "private" with an explicit Cache-Control directive are - * considered uncacheable. - * - * Responses with neither a freshness lifetime (Expires, max-age) nor cache - * validator (Last-Modified, ETag) are considered uncacheable because there is - * no way to tell when or how to remove them from the cache. - * - * Note that RFC 7231 and RFC 7234 possibly allow for a more permissive implementation, - * for example "status codes that are defined as cacheable by default [...] - * can be reused by a cache with heuristic expiration unless otherwise indicated" - * (https://tools.ietf.org/html/rfc7231#section-6.1) - * - * @final - */ - public function isCacheable(): bool - { - if (!\in_array($this->statusCode, [200, 203, 300, 301, 302, 404, 410], true)) { - return false; - } - - if ($this->headers->hasCacheControlDirective('no-store') || $this->headers->getCacheControlDirective('private')) { - return false; - } - - return $this->isValidateable() || $this->isFresh(); - } - - /** - * Returns true if the response is "fresh". - * - * Fresh responses may be served from cache without any interaction with the - * origin. A response is considered fresh when it includes a Cache-Control/max-age - * indicator or Expires header and the calculated age is less than the freshness lifetime. - * - * @final - */ - public function isFresh(): bool - { - return $this->getTtl() > 0; - } - - /** - * Returns true if the response includes headers that can be used to validate - * the response with the origin server using a conditional GET request. - * - * @final - */ - public function isValidateable(): bool - { - return $this->headers->has('Last-Modified') || $this->headers->has('ETag'); - } - - /** - * Marks the response as "private". - * - * It makes the response ineligible for serving other clients. - * - * @return $this - * - * @final - */ - public function setPrivate(): static - { - $this->headers->removeCacheControlDirective('public'); - $this->headers->addCacheControlDirective('private'); - - return $this; - } - - /** - * Marks the response as "public". - * - * It makes the response eligible for serving other clients. - * - * @return $this - * - * @final - */ - public function setPublic(): static - { - $this->headers->addCacheControlDirective('public'); - $this->headers->removeCacheControlDirective('private'); - - return $this; - } - - /** - * Marks the response as "immutable". - * - * @return $this - * - * @final - */ - public function setImmutable(bool $immutable = true): static - { - if ($immutable) { - $this->headers->addCacheControlDirective('immutable'); - } else { - $this->headers->removeCacheControlDirective('immutable'); - } - - return $this; - } - - /** - * Returns true if the response is marked as "immutable". - * - * @final - */ - public function isImmutable(): bool - { - return $this->headers->hasCacheControlDirective('immutable'); - } - - /** - * Returns true if the response must be revalidated by shared caches once it has become stale. - * - * This method indicates that the response must not be served stale by a - * cache in any circumstance without first revalidating with the origin. - * When present, the TTL of the response should not be overridden to be - * greater than the value provided by the origin. - * - * @final - */ - public function mustRevalidate(): bool - { - return $this->headers->hasCacheControlDirective('must-revalidate') || $this->headers->hasCacheControlDirective('proxy-revalidate'); - } - - /** - * Returns the Date header as a DateTime instance. - * - * @throws \RuntimeException When the header is not parseable - * - * @final - */ - public function getDate(): ?\DateTimeImmutable - { - return $this->headers->getDate('Date'); - } - - /** - * Sets the Date header. - * - * @return $this - * - * @final - */ - public function setDate(\DateTimeInterface $date): static - { - $date = \DateTimeImmutable::createFromInterface($date); - $date = $date->setTimezone(new \DateTimeZone('UTC')); - $this->headers->set('Date', $date->format('D, d M Y H:i:s').' GMT'); - - return $this; - } - - /** - * Returns the age of the response in seconds. - * - * @final - */ - public function getAge(): int - { - if (null !== $age = $this->headers->get('Age')) { - return (int) $age; - } - - return max(time() - (int) $this->getDate()->format('U'), 0); - } - - /** - * Marks the response stale by setting the Age header to be equal to the maximum age of the response. - * - * @return $this - */ - public function expire(): static - { - if ($this->isFresh()) { - $this->headers->set('Age', $this->getMaxAge()); - $this->headers->remove('Expires'); - } - - return $this; - } - - /** - * Returns the value of the Expires header as a DateTime instance. - * - * @final - */ - public function getExpires(): ?\DateTimeImmutable - { - try { - return $this->headers->getDate('Expires'); - } catch (\RuntimeException) { - // according to RFC 2616 invalid date formats (e.g. "0" and "-1") must be treated as in the past - return \DateTimeImmutable::createFromFormat('U', time() - 172800); - } - } - - /** - * Sets the Expires HTTP header with a DateTime instance. - * - * Passing null as value will remove the header. - * - * @return $this - * - * @final - */ - public function setExpires(?\DateTimeInterface $date): static - { - if (null === $date) { - $this->headers->remove('Expires'); - - return $this; - } - - $date = \DateTimeImmutable::createFromInterface($date); - $date = $date->setTimezone(new \DateTimeZone('UTC')); - $this->headers->set('Expires', $date->format('D, d M Y H:i:s').' GMT'); - - return $this; - } - - /** - * Returns the number of seconds after the time specified in the response's Date - * header when the response should no longer be considered fresh. - * - * First, it checks for a s-maxage directive, then a max-age directive, and then it falls - * back on an expires header. It returns null when no maximum age can be established. - * - * @final - */ - public function getMaxAge(): ?int - { - if ($this->headers->hasCacheControlDirective('s-maxage')) { - return (int) $this->headers->getCacheControlDirective('s-maxage'); - } - - if ($this->headers->hasCacheControlDirective('max-age')) { - return (int) $this->headers->getCacheControlDirective('max-age'); - } - - if (null !== $expires = $this->getExpires()) { - $maxAge = (int) $expires->format('U') - (int) $this->getDate()->format('U'); - - return max($maxAge, 0); - } - - return null; - } - - /** - * Sets the number of seconds after which the response should no longer be considered fresh. - * - * This method sets the Cache-Control max-age directive. - * - * @return $this - * - * @final - */ - public function setMaxAge(int $value): static - { - $this->headers->addCacheControlDirective('max-age', $value); - - return $this; - } - - /** - * Sets the number of seconds after which the response should no longer be returned by shared caches when backend is down. - * - * This method sets the Cache-Control stale-if-error directive. - * - * @return $this - * - * @final - */ - public function setStaleIfError(int $value): static - { - $this->headers->addCacheControlDirective('stale-if-error', $value); - - return $this; - } - - /** - * Sets the number of seconds after which the response should no longer return stale content by shared caches. - * - * This method sets the Cache-Control stale-while-revalidate directive. - * - * @return $this - * - * @final - */ - public function setStaleWhileRevalidate(int $value): static - { - $this->headers->addCacheControlDirective('stale-while-revalidate', $value); - - return $this; - } - - /** - * Sets the number of seconds after which the response should no longer be considered fresh by shared caches. - * - * This method sets the Cache-Control s-maxage directive. - * - * @return $this - * - * @final - */ - public function setSharedMaxAge(int $value): static - { - $this->setPublic(); - $this->headers->addCacheControlDirective('s-maxage', $value); - - return $this; - } - - /** - * Returns the response's time-to-live in seconds. - * - * It returns null when no freshness information is present in the response. - * - * When the response's TTL is 0, the response may not be served from cache without first - * revalidating with the origin. - * - * @final - */ - public function getTtl(): ?int - { - $maxAge = $this->getMaxAge(); - - return null !== $maxAge ? max($maxAge - $this->getAge(), 0) : null; - } - - /** - * Sets the response's time-to-live for shared caches in seconds. - * - * This method adjusts the Cache-Control/s-maxage directive. - * - * @return $this - * - * @final - */ - public function setTtl(int $seconds): static - { - $this->setSharedMaxAge($this->getAge() + $seconds); - - return $this; - } - - /** - * Sets the response's time-to-live for private/client caches in seconds. - * - * This method adjusts the Cache-Control/max-age directive. - * - * @return $this - * - * @final - */ - public function setClientTtl(int $seconds): static - { - $this->setMaxAge($this->getAge() + $seconds); - - return $this; - } - - /** - * Returns the Last-Modified HTTP header as a DateTime instance. - * - * @throws \RuntimeException When the HTTP header is not parseable - * - * @final - */ - public function getLastModified(): ?\DateTimeImmutable - { - return $this->headers->getDate('Last-Modified'); - } - - /** - * Sets the Last-Modified HTTP header with a DateTime instance. - * - * Passing null as value will remove the header. - * - * @return $this - * - * @final - */ - public function setLastModified(?\DateTimeInterface $date): static - { - if (null === $date) { - $this->headers->remove('Last-Modified'); - - return $this; - } - - $date = \DateTimeImmutable::createFromInterface($date); - $date = $date->setTimezone(new \DateTimeZone('UTC')); - $this->headers->set('Last-Modified', $date->format('D, d M Y H:i:s').' GMT'); - - return $this; - } - - /** - * Returns the literal value of the ETag HTTP header. - * - * @final - */ - public function getEtag(): ?string - { - return $this->headers->get('ETag'); - } - - /** - * Sets the ETag value. - * - * @param string|null $etag The ETag unique identifier or null to remove the header - * @param bool $weak Whether you want a weak ETag or not - * - * @return $this - * - * @final - */ - public function setEtag(?string $etag, bool $weak = false): static - { - if (null === $etag) { - $this->headers->remove('Etag'); - } else { - if (!str_starts_with($etag, '"')) { - $etag = '"'.$etag.'"'; - } - - $this->headers->set('ETag', (true === $weak ? 'W/' : '').$etag); - } - - return $this; - } - - /** - * Sets the response's cache headers (validation and/or expiration). - * - * Available options are: must_revalidate, no_cache, no_store, no_transform, public, private, proxy_revalidate, max_age, s_maxage, immutable, last_modified and etag. - * - * @return $this - * - * @throws \InvalidArgumentException - * - * @final - */ - public function setCache(array $options): static - { - if ($diff = array_diff(array_keys($options), array_keys(self::HTTP_RESPONSE_CACHE_CONTROL_DIRECTIVES))) { - throw new \InvalidArgumentException(\sprintf('Response does not support the following options: "%s".', implode('", "', $diff))); - } - - if (isset($options['etag'])) { - $this->setEtag($options['etag']); - } - - if (isset($options['last_modified'])) { - $this->setLastModified($options['last_modified']); - } - - if (isset($options['max_age'])) { - $this->setMaxAge($options['max_age']); - } - - if (isset($options['s_maxage'])) { - $this->setSharedMaxAge($options['s_maxage']); - } - - if (isset($options['stale_while_revalidate'])) { - $this->setStaleWhileRevalidate($options['stale_while_revalidate']); - } - - if (isset($options['stale_if_error'])) { - $this->setStaleIfError($options['stale_if_error']); - } - - foreach (self::HTTP_RESPONSE_CACHE_CONTROL_DIRECTIVES as $directive => $hasValue) { - if (!$hasValue && isset($options[$directive])) { - if ($options[$directive]) { - $this->headers->addCacheControlDirective(str_replace('_', '-', $directive)); - } else { - $this->headers->removeCacheControlDirective(str_replace('_', '-', $directive)); - } - } - } - - if (isset($options['public'])) { - if ($options['public']) { - $this->setPublic(); - } else { - $this->setPrivate(); - } - } - - if (isset($options['private'])) { - if ($options['private']) { - $this->setPrivate(); - } else { - $this->setPublic(); - } - } - - return $this; - } - - /** - * Modifies the response so that it conforms to the rules defined for a 304 status code. - * - * This sets the status, removes the body, and discards any headers - * that MUST NOT be included in 304 responses. - * - * @return $this - * - * @see https://tools.ietf.org/html/rfc2616#section-10.3.5 - * - * @final - */ - public function setNotModified(): static - { - $this->setStatusCode(304); - $this->setContent(null); - - // remove headers that MUST NOT be included with 304 Not Modified responses - foreach (['Allow', 'Content-Encoding', 'Content-Language', 'Content-Length', 'Content-MD5', 'Content-Type', 'Last-Modified'] as $header) { - $this->headers->remove($header); - } - - return $this; - } - - /** - * Returns true if the response includes a Vary header. - * - * @final - */ - public function hasVary(): bool - { - return null !== $this->headers->get('Vary'); - } - - /** - * Returns an array of header names given in the Vary header. - * - * @final - */ - public function getVary(): array - { - if (!$vary = $this->headers->all('Vary')) { - return []; - } - - $ret = []; - foreach ($vary as $item) { - $ret[] = preg_split('/[\s,]+/', $item); - } - - return array_merge([], ...$ret); - } - - /** - * Sets the Vary header. - * - * @param bool $replace Whether to replace the actual value or not (true by default) - * - * @return $this - * - * @final - */ - public function setVary(string|array $headers, bool $replace = true): static - { - $this->headers->set('Vary', $headers, $replace); - - return $this; - } - - /** - * Determines if the Response validators (ETag, Last-Modified) match - * a conditional value specified in the Request. - * - * If the Response is not modified, it sets the status code to 304 and - * removes the actual content by calling the setNotModified() method. - * - * @final - */ - public function isNotModified(Request $request): bool - { - if (!$request->isMethodCacheable()) { - return false; - } - - $notModified = false; - $lastModified = $this->headers->get('Last-Modified'); - $modifiedSince = $request->headers->get('If-Modified-Since'); - - if (($ifNoneMatchEtags = $request->getETags()) && (null !== $etag = $this->getEtag())) { - if (0 == strncmp($etag, 'W/', 2)) { - $etag = substr($etag, 2); - } - - // Use weak comparison as per https://tools.ietf.org/html/rfc7232#section-3.2. - foreach ($ifNoneMatchEtags as $ifNoneMatchEtag) { - if (0 == strncmp($ifNoneMatchEtag, 'W/', 2)) { - $ifNoneMatchEtag = substr($ifNoneMatchEtag, 2); - } - - if ($ifNoneMatchEtag === $etag || '*' === $ifNoneMatchEtag) { - $notModified = true; - break; - } - } - } - // Only do If-Modified-Since date comparison when If-None-Match is not present as per https://tools.ietf.org/html/rfc7232#section-3.3. - elseif ($modifiedSince && $lastModified) { - $notModified = strtotime($modifiedSince) >= strtotime($lastModified); - } - - if ($notModified) { - $this->setNotModified(); - } - - return $notModified; - } - - /** - * Is response invalid? - * - * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html - * - * @final - */ - public function isInvalid(): bool - { - return $this->statusCode < 100 || $this->statusCode >= 600; - } - - /** - * Is response informative? - * - * @final - */ - public function isInformational(): bool - { - return $this->statusCode >= 100 && $this->statusCode < 200; - } - - /** - * Is response successful? - * - * @final - */ - public function isSuccessful(): bool - { - return $this->statusCode >= 200 && $this->statusCode < 300; - } - - /** - * Is the response a redirect? - * - * @final - */ - public function isRedirection(): bool - { - return $this->statusCode >= 300 && $this->statusCode < 400; - } - - /** - * Is there a client error? - * - * @final - */ - public function isClientError(): bool - { - return $this->statusCode >= 400 && $this->statusCode < 500; - } - - /** - * Was there a server side error? - * - * @final - */ - public function isServerError(): bool - { - return $this->statusCode >= 500 && $this->statusCode < 600; - } - - /** - * Is the response OK? - * - * @final - */ - public function isOk(): bool - { - return 200 === $this->statusCode; - } - - /** - * Is the response forbidden? - * - * @final - */ - public function isForbidden(): bool - { - return 403 === $this->statusCode; - } - - /** - * Is the response a not found error? - * - * @final - */ - public function isNotFound(): bool - { - return 404 === $this->statusCode; - } - - /** - * Is the response a redirect of some form? - * - * @final - */ - public function isRedirect(?string $location = null): bool - { - return \in_array($this->statusCode, [201, 301, 302, 303, 307, 308], true) && (null === $location ?: $location == $this->headers->get('Location')); - } - - /** - * Is the response empty? - * - * @final - */ - public function isEmpty(): bool - { - return \in_array($this->statusCode, [204, 304], true); - } - - /** - * Cleans or flushes output buffers up to target level. - * - * Resulting level can be greater than target level if a non-removable buffer has been encountered. - * - * @final - */ - public static function closeOutputBuffers(int $targetLevel, bool $flush): void - { - $status = ob_get_status(true); - $level = \count($status); - $flags = \PHP_OUTPUT_HANDLER_REMOVABLE | ($flush ? \PHP_OUTPUT_HANDLER_FLUSHABLE : \PHP_OUTPUT_HANDLER_CLEANABLE); - - while ($level-- > $targetLevel && ($s = $status[$level]) && (!isset($s['del']) ? !isset($s['flags']) || ($s['flags'] & $flags) === $flags : $s['del'])) { - if ($flush) { - ob_end_flush(); - } else { - ob_end_clean(); - } - } - } - - /** - * Marks a response as safe according to RFC8674. - * - * @see https://tools.ietf.org/html/rfc8674 - */ - public function setContentSafe(bool $safe = true): void - { - if ($safe) { - $this->headers->set('Preference-Applied', 'safe'); - } elseif ('safe' === $this->headers->get('Preference-Applied')) { - $this->headers->remove('Preference-Applied'); - } - - $this->setVary('Prefer', false); - } - - /** - * Checks if we need to remove Cache-Control for SSL encrypted downloads when using IE < 9. - * - * @see http://support.microsoft.com/kb/323308 - * - * @final - */ - protected function ensureIEOverSSLCompatibility(Request $request): void - { - if (false !== stripos($this->headers->get('Content-Disposition') ?? '', 'attachment') && 1 == preg_match('/MSIE (.*?);/i', $request->server->get('HTTP_USER_AGENT') ?? '', $match) && true === $request->isSecure()) { - if ((int) preg_replace('/(MSIE )(.*?);/', '$2', $match[0]) < 9) { - $this->headers->remove('Cache-Control'); - } - } - } -} diff --git a/plugins/vendor/symfony/http-foundation/ResponseHeaderBag.php b/plugins/vendor/symfony/http-foundation/ResponseHeaderBag.php deleted file mode 100644 index ff6ae1ef..00000000 --- a/plugins/vendor/symfony/http-foundation/ResponseHeaderBag.php +++ /dev/null @@ -1,271 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation; - -/** - * ResponseHeaderBag is a container for Response HTTP headers. - * - * @author Fabien Potencier - */ -class ResponseHeaderBag extends HeaderBag -{ - public const COOKIES_FLAT = 'flat'; - public const COOKIES_ARRAY = 'array'; - - public const DISPOSITION_ATTACHMENT = 'attachment'; - public const DISPOSITION_INLINE = 'inline'; - - protected array $computedCacheControl = []; - protected array $cookies = []; - protected array $headerNames = []; - - public function __construct(array $headers = []) - { - parent::__construct($headers); - - if (!isset($this->headers['cache-control'])) { - $this->set('Cache-Control', ''); - } - - /* RFC2616 - 14.18 says all Responses need to have a Date */ - if (!isset($this->headers['date'])) { - $this->initDate(); - } - } - - /** - * Returns the headers, with original capitalizations. - */ - public function allPreserveCase(): array - { - $headers = []; - foreach ($this->all() as $name => $value) { - $headers[$this->headerNames[$name] ?? $name] = $value; - } - - return $headers; - } - - public function allPreserveCaseWithoutCookies(): array - { - $headers = $this->allPreserveCase(); - if (isset($this->headerNames['set-cookie'])) { - unset($headers[$this->headerNames['set-cookie']]); - } - - return $headers; - } - - public function replace(array $headers = []): void - { - $this->headerNames = []; - - parent::replace($headers); - - if (!isset($this->headers['cache-control'])) { - $this->set('Cache-Control', ''); - } - - if (!isset($this->headers['date'])) { - $this->initDate(); - } - } - - public function all(?string $key = null): array - { - $headers = parent::all(); - - if (null !== $key) { - $key = strtr($key, self::UPPER, self::LOWER); - - return 'set-cookie' !== $key ? $headers[$key] ?? [] : array_map('strval', $this->getCookies()); - } - - foreach ($this->getCookies() as $cookie) { - $headers['set-cookie'][] = (string) $cookie; - } - - return $headers; - } - - public function set(string $key, string|array|null $values, bool $replace = true): void - { - $uniqueKey = strtr($key, self::UPPER, self::LOWER); - - if ('set-cookie' === $uniqueKey) { - if ($replace) { - $this->cookies = []; - } - foreach ((array) $values as $cookie) { - $this->setCookie(Cookie::fromString($cookie)); - } - $this->headerNames[$uniqueKey] = $key; - - return; - } - - $this->headerNames[$uniqueKey] = $key; - - parent::set($key, $values, $replace); - - // ensure the cache-control header has sensible defaults - if (\in_array($uniqueKey, ['cache-control', 'etag', 'last-modified', 'expires'], true) && '' !== $computed = $this->computeCacheControlValue()) { - $this->headers['cache-control'] = [$computed]; - $this->headerNames['cache-control'] = 'Cache-Control'; - $this->computedCacheControl = $this->parseCacheControl($computed); - } - } - - public function remove(string $key): void - { - $uniqueKey = strtr($key, self::UPPER, self::LOWER); - unset($this->headerNames[$uniqueKey]); - - if ('set-cookie' === $uniqueKey) { - $this->cookies = []; - - return; - } - - parent::remove($key); - - if ('cache-control' === $uniqueKey) { - $this->computedCacheControl = []; - } - - if ('date' === $uniqueKey) { - $this->initDate(); - } - } - - public function hasCacheControlDirective(string $key): bool - { - return \array_key_exists($key, $this->computedCacheControl); - } - - public function getCacheControlDirective(string $key): bool|string|null - { - return $this->computedCacheControl[$key] ?? null; - } - - public function setCookie(Cookie $cookie): void - { - $this->cookies[$cookie->getDomain() ?? ''][$cookie->getPath()][$cookie->getName()] = $cookie; - $this->headerNames['set-cookie'] = 'Set-Cookie'; - } - - /** - * Removes a cookie from the array, but does not unset it in the browser. - */ - public function removeCookie(string $name, ?string $path = '/', ?string $domain = null): void - { - $path ??= '/'; - - unset($this->cookies[$domain ?? ''][$path][$name]); - - if (empty($this->cookies[$domain ?? ''][$path])) { - unset($this->cookies[$domain ?? ''][$path]); - - if (empty($this->cookies[$domain ?? ''])) { - unset($this->cookies[$domain ?? '']); - } - } - - if (!$this->cookies) { - unset($this->headerNames['set-cookie']); - } - } - - /** - * Returns an array with all cookies. - * - * @return Cookie[] - * - * @throws \InvalidArgumentException When the $format is invalid - */ - public function getCookies(string $format = self::COOKIES_FLAT): array - { - if (!\in_array($format, [self::COOKIES_FLAT, self::COOKIES_ARRAY], true)) { - throw new \InvalidArgumentException(\sprintf('Format "%s" invalid (%s).', $format, implode(', ', [self::COOKIES_FLAT, self::COOKIES_ARRAY]))); - } - - if (self::COOKIES_ARRAY === $format) { - return $this->cookies; - } - - $flattenedCookies = []; - foreach ($this->cookies as $path) { - foreach ($path as $cookies) { - foreach ($cookies as $cookie) { - $flattenedCookies[] = $cookie; - } - } - } - - return $flattenedCookies; - } - - /** - * Clears a cookie in the browser. - * - * @param bool $partitioned - */ - public function clearCookie(string $name, ?string $path = '/', ?string $domain = null, bool $secure = false, bool $httpOnly = true, ?string $sameSite = null /* , bool $partitioned = false */): void - { - $partitioned = 6 < \func_num_args() ? func_get_arg(6) : false; - - $this->setCookie(new Cookie($name, null, 1, $path, $domain, $secure, $httpOnly, false, $sameSite, $partitioned)); - } - - /** - * @see HeaderUtils::makeDisposition() - */ - public function makeDisposition(string $disposition, string $filename, string $filenameFallback = ''): string - { - return HeaderUtils::makeDisposition($disposition, $filename, $filenameFallback); - } - - /** - * Returns the calculated value of the cache-control header. - * - * This considers several other headers and calculates or modifies the - * cache-control header to a sensible, conservative value. - */ - protected function computeCacheControlValue(): string - { - if (!$this->cacheControl) { - if ($this->has('Last-Modified') || $this->has('Expires')) { - return 'private, must-revalidate'; // allows for heuristic expiration (RFC 7234 Section 4.2.2) in the case of "Last-Modified" - } - - // conservative by default - return 'no-cache, private'; - } - - $header = $this->getCacheControlHeader(); - if (isset($this->cacheControl['public']) || isset($this->cacheControl['private'])) { - return $header; - } - - // public if s-maxage is defined, private otherwise - if (!isset($this->cacheControl['s-maxage'])) { - return $header.', private'; - } - - return $header; - } - - private function initDate(): void - { - $this->set('Date', gmdate('D, d M Y H:i:s').' GMT'); - } -} diff --git a/plugins/vendor/symfony/http-foundation/ServerBag.php b/plugins/vendor/symfony/http-foundation/ServerBag.php deleted file mode 100644 index 09fc3866..00000000 --- a/plugins/vendor/symfony/http-foundation/ServerBag.php +++ /dev/null @@ -1,97 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation; - -/** - * ServerBag is a container for HTTP headers from the $_SERVER variable. - * - * @author Fabien Potencier - * @author Bulat Shakirzyanov - * @author Robert Kiss - */ -class ServerBag extends ParameterBag -{ - /** - * Gets the HTTP headers. - */ - public function getHeaders(): array - { - $headers = []; - foreach ($this->parameters as $key => $value) { - if (str_starts_with($key, 'HTTP_')) { - $headers[substr($key, 5)] = $value; - } elseif (\in_array($key, ['CONTENT_TYPE', 'CONTENT_LENGTH', 'CONTENT_MD5'], true) && '' !== $value) { - $headers[$key] = $value; - } - } - - if (isset($this->parameters['PHP_AUTH_USER'])) { - $headers['PHP_AUTH_USER'] = $this->parameters['PHP_AUTH_USER']; - $headers['PHP_AUTH_PW'] = $this->parameters['PHP_AUTH_PW'] ?? ''; - } else { - /* - * php-cgi under Apache does not pass HTTP Basic user/pass to PHP by default - * For this workaround to work, add these lines to your .htaccess file: - * RewriteCond %{HTTP:Authorization} .+ - * RewriteRule ^ - [E=HTTP_AUTHORIZATION:%0] - * - * A sample .htaccess file: - * RewriteEngine On - * RewriteCond %{HTTP:Authorization} .+ - * RewriteRule ^ - [E=HTTP_AUTHORIZATION:%0] - * RewriteCond %{REQUEST_FILENAME} !-f - * RewriteRule ^(.*)$ index.php [QSA,L] - */ - - $authorizationHeader = null; - if (isset($this->parameters['HTTP_AUTHORIZATION'])) { - $authorizationHeader = $this->parameters['HTTP_AUTHORIZATION']; - } elseif (isset($this->parameters['REDIRECT_HTTP_AUTHORIZATION'])) { - $authorizationHeader = $this->parameters['REDIRECT_HTTP_AUTHORIZATION']; - } - - if (null !== $authorizationHeader) { - if (0 === stripos($authorizationHeader, 'basic ')) { - // Decode AUTHORIZATION header into PHP_AUTH_USER and PHP_AUTH_PW when authorization header is basic - $exploded = explode(':', base64_decode(substr($authorizationHeader, 6)), 2); - if (2 == \count($exploded)) { - [$headers['PHP_AUTH_USER'], $headers['PHP_AUTH_PW']] = $exploded; - } - } elseif (empty($this->parameters['PHP_AUTH_DIGEST']) && (0 === stripos($authorizationHeader, 'digest '))) { - // In some circumstances PHP_AUTH_DIGEST needs to be set - $headers['PHP_AUTH_DIGEST'] = $authorizationHeader; - $this->parameters['PHP_AUTH_DIGEST'] = $authorizationHeader; - } elseif (0 === stripos($authorizationHeader, 'bearer ')) { - /* - * XXX: Since there is no PHP_AUTH_BEARER in PHP predefined variables, - * I'll just set $headers['AUTHORIZATION'] here. - * https://php.net/reserved.variables.server - */ - $headers['AUTHORIZATION'] = $authorizationHeader; - } - } - } - - if (isset($headers['AUTHORIZATION'])) { - return $headers; - } - - // PHP_AUTH_USER/PHP_AUTH_PW - if (isset($headers['PHP_AUTH_USER'])) { - $headers['AUTHORIZATION'] = 'Basic '.base64_encode($headers['PHP_AUTH_USER'].':'.($headers['PHP_AUTH_PW'] ?? '')); - } elseif (isset($headers['PHP_AUTH_DIGEST'])) { - $headers['AUTHORIZATION'] = $headers['PHP_AUTH_DIGEST']; - } - - return $headers; - } -} diff --git a/plugins/vendor/symfony/http-foundation/ServerEvent.php b/plugins/vendor/symfony/http-foundation/ServerEvent.php deleted file mode 100644 index 7597058b..00000000 --- a/plugins/vendor/symfony/http-foundation/ServerEvent.php +++ /dev/null @@ -1,145 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation; - -/** - * An event generated on the server intended for streaming to the client - * as part of the SSE streaming technique. - * - * @implements \IteratorAggregate - * - * @author Yonel Ceruto - */ -class ServerEvent implements \IteratorAggregate -{ - /** - * @param string|iterable $data The event data field for the message - * @param string|null $type The event type - * @param int|null $retry The number of milliseconds the client should wait - * before reconnecting in case of network failure - * @param string|null $id The event ID to set the EventSource object's last event ID value - * @param string|null $comment The event comment - */ - public function __construct( - private string|iterable $data, - private ?string $type = null, - private ?int $retry = null, - private ?string $id = null, - private ?string $comment = null, - ) { - } - - public function getData(): iterable|string - { - return $this->data; - } - - /** - * @return $this - */ - public function setData(iterable|string $data): static - { - $this->data = $data; - - return $this; - } - - public function getType(): ?string - { - return $this->type; - } - - /** - * @return $this - */ - public function setType(string $type): static - { - $this->type = $type; - - return $this; - } - - public function getRetry(): ?int - { - return $this->retry; - } - - /** - * @return $this - */ - public function setRetry(?int $retry): static - { - $this->retry = $retry; - - return $this; - } - - public function getId(): ?string - { - return $this->id; - } - - /** - * @return $this - */ - public function setId(string $id): static - { - $this->id = $id; - - return $this; - } - - public function getComment(): ?string - { - return $this->comment; - } - - public function setComment(string $comment): static - { - $this->comment = $comment; - - return $this; - } - - /** - * @return \Traversable - */ - public function getIterator(): \Traversable - { - static $lastRetry = null; - - $head = ''; - if ($this->comment) { - $head .= \sprintf(': %s', $this->comment)."\n"; - } - if ($this->id) { - $head .= \sprintf('id: %s', $this->id)."\n"; - } - if ($this->retry > 0 && $this->retry !== $lastRetry) { - $head .= \sprintf('retry: %s', $lastRetry = $this->retry)."\n"; - } - if ($this->type) { - $head .= \sprintf('event: %s', $this->type)."\n"; - } - yield $head; - - if (is_iterable($this->data)) { - foreach ($this->data as $data) { - yield \sprintf('data: %s', $data)."\n"; - } - } elseif ('' !== $this->data) { - yield \sprintf('data: %s', $this->data)."\n"; - } - - yield "\n"; - } -} diff --git a/plugins/vendor/symfony/http-foundation/Session/Attribute/AttributeBag.php b/plugins/vendor/symfony/http-foundation/Session/Attribute/AttributeBag.php deleted file mode 100644 index e34a497c..00000000 --- a/plugins/vendor/symfony/http-foundation/Session/Attribute/AttributeBag.php +++ /dev/null @@ -1,117 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Attribute; - -/** - * This class relates to session attribute storage. - * - * @implements \IteratorAggregate - */ -class AttributeBag implements AttributeBagInterface, \IteratorAggregate, \Countable -{ - protected array $attributes = []; - - private string $name = 'attributes'; - - /** - * @param string $storageKey The key used to store attributes in the session - */ - public function __construct( - private string $storageKey = '_sf2_attributes', - ) { - } - - public function getName(): string - { - return $this->name; - } - - public function setName(string $name): void - { - $this->name = $name; - } - - public function initialize(array &$attributes): void - { - $this->attributes = &$attributes; - } - - public function getStorageKey(): string - { - return $this->storageKey; - } - - public function has(string $name): bool - { - return \array_key_exists($name, $this->attributes); - } - - public function get(string $name, mixed $default = null): mixed - { - return \array_key_exists($name, $this->attributes) ? $this->attributes[$name] : $default; - } - - public function set(string $name, mixed $value): void - { - $this->attributes[$name] = $value; - } - - public function all(): array - { - return $this->attributes; - } - - public function replace(array $attributes): void - { - $this->attributes = []; - foreach ($attributes as $key => $value) { - $this->set($key, $value); - } - } - - public function remove(string $name): mixed - { - $retval = null; - if (\array_key_exists($name, $this->attributes)) { - $retval = $this->attributes[$name]; - unset($this->attributes[$name]); - } - - return $retval; - } - - public function clear(): mixed - { - $return = $this->attributes; - $this->attributes = []; - - return $return; - } - - /** - * Returns an iterator for attributes. - * - * @return \ArrayIterator - */ - public function getIterator(): \ArrayIterator - { - return new \ArrayIterator($this->attributes); - } - - /** - * Returns the number of attributes. - */ - public function count(): int - { - return \count($this->attributes); - } -} diff --git a/plugins/vendor/symfony/http-foundation/Session/Attribute/AttributeBagInterface.php b/plugins/vendor/symfony/http-foundation/Session/Attribute/AttributeBagInterface.php deleted file mode 100644 index 39ec9d75..00000000 --- a/plugins/vendor/symfony/http-foundation/Session/Attribute/AttributeBagInterface.php +++ /dev/null @@ -1,53 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Attribute; - -use Symfony\Component\HttpFoundation\Session\SessionBagInterface; - -/** - * Attributes store. - * - * @author Drak - */ -interface AttributeBagInterface extends SessionBagInterface -{ - /** - * Checks if an attribute is defined. - */ - public function has(string $name): bool; - - /** - * Returns an attribute. - */ - public function get(string $name, mixed $default = null): mixed; - - /** - * Sets an attribute. - */ - public function set(string $name, mixed $value): void; - - /** - * Returns attributes. - * - * @return array - */ - public function all(): array; - - public function replace(array $attributes): void; - - /** - * Removes an attribute. - * - * @return mixed The removed value or null when it does not exist - */ - public function remove(string $name): mixed; -} diff --git a/plugins/vendor/symfony/http-foundation/Session/Flash/AutoExpireFlashBag.php b/plugins/vendor/symfony/http-foundation/Session/Flash/AutoExpireFlashBag.php deleted file mode 100644 index bfb856d5..00000000 --- a/plugins/vendor/symfony/http-foundation/Session/Flash/AutoExpireFlashBag.php +++ /dev/null @@ -1,121 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Flash; - -/** - * AutoExpireFlashBag flash message container. - * - * @author Drak - */ -class AutoExpireFlashBag implements FlashBagInterface -{ - private string $name = 'flashes'; - private array $flashes = ['display' => [], 'new' => []]; - - /** - * @param string $storageKey The key used to store flashes in the session - */ - public function __construct( - private string $storageKey = '_symfony_flashes', - ) { - } - - public function getName(): string - { - return $this->name; - } - - public function setName(string $name): void - { - $this->name = $name; - } - - public function initialize(array &$flashes): void - { - $this->flashes = &$flashes; - - // The logic: messages from the last request will be stored in new, so we move them to previous - // This request we will show what is in 'display'. What is placed into 'new' this time round will - // be moved to display next time round. - $this->flashes['display'] = \array_key_exists('new', $this->flashes) ? $this->flashes['new'] : []; - $this->flashes['new'] = []; - } - - public function add(string $type, mixed $message): void - { - $this->flashes['new'][$type][] = $message; - } - - public function peek(string $type, array $default = []): array - { - return $this->has($type) ? $this->flashes['display'][$type] : $default; - } - - public function peekAll(): array - { - return \array_key_exists('display', $this->flashes) ? $this->flashes['display'] : []; - } - - public function get(string $type, array $default = []): array - { - $return = $default; - - if (!$this->has($type)) { - return $return; - } - - if (isset($this->flashes['display'][$type])) { - $return = $this->flashes['display'][$type]; - unset($this->flashes['display'][$type]); - } - - return $return; - } - - public function all(): array - { - $return = $this->flashes['display']; - $this->flashes['display'] = []; - - return $return; - } - - public function setAll(array $messages): void - { - $this->flashes['new'] = $messages; - } - - public function set(string $type, string|array $messages): void - { - $this->flashes['new'][$type] = (array) $messages; - } - - public function has(string $type): bool - { - return \array_key_exists($type, $this->flashes['display']) && $this->flashes['display'][$type]; - } - - public function keys(): array - { - return array_keys($this->flashes['display']); - } - - public function getStorageKey(): string - { - return $this->storageKey; - } - - public function clear(): mixed - { - return $this->all(); - } -} diff --git a/plugins/vendor/symfony/http-foundation/Session/Flash/FlashBag.php b/plugins/vendor/symfony/http-foundation/Session/Flash/FlashBag.php deleted file mode 100644 index 72753a66..00000000 --- a/plugins/vendor/symfony/http-foundation/Session/Flash/FlashBag.php +++ /dev/null @@ -1,112 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Flash; - -/** - * FlashBag flash message container. - * - * @author Drak - */ -class FlashBag implements FlashBagInterface -{ - private string $name = 'flashes'; - private array $flashes = []; - - /** - * @param string $storageKey The key used to store flashes in the session - */ - public function __construct( - private string $storageKey = '_symfony_flashes', - ) { - } - - public function getName(): string - { - return $this->name; - } - - public function setName(string $name): void - { - $this->name = $name; - } - - public function initialize(array &$flashes): void - { - $this->flashes = &$flashes; - } - - public function add(string $type, mixed $message): void - { - $this->flashes[$type][] = $message; - } - - public function peek(string $type, array $default = []): array - { - return $this->has($type) ? $this->flashes[$type] : $default; - } - - public function peekAll(): array - { - return $this->flashes; - } - - public function get(string $type, array $default = []): array - { - if (!$this->has($type)) { - return $default; - } - - $return = $this->flashes[$type]; - - unset($this->flashes[$type]); - - return $return; - } - - public function all(): array - { - $return = $this->peekAll(); - $this->flashes = []; - - return $return; - } - - public function set(string $type, string|array $messages): void - { - $this->flashes[$type] = (array) $messages; - } - - public function setAll(array $messages): void - { - $this->flashes = $messages; - } - - public function has(string $type): bool - { - return \array_key_exists($type, $this->flashes) && $this->flashes[$type]; - } - - public function keys(): array - { - return array_keys($this->flashes); - } - - public function getStorageKey(): string - { - return $this->storageKey; - } - - public function clear(): mixed - { - return $this->all(); - } -} diff --git a/plugins/vendor/symfony/http-foundation/Session/Flash/FlashBagInterface.php b/plugins/vendor/symfony/http-foundation/Session/Flash/FlashBagInterface.php deleted file mode 100644 index 79e98f54..00000000 --- a/plugins/vendor/symfony/http-foundation/Session/Flash/FlashBagInterface.php +++ /dev/null @@ -1,72 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Flash; - -use Symfony\Component\HttpFoundation\Session\SessionBagInterface; - -/** - * FlashBagInterface. - * - * @author Drak - */ -interface FlashBagInterface extends SessionBagInterface -{ - /** - * Adds a flash message for the given type. - */ - public function add(string $type, mixed $message): void; - - /** - * Registers one or more messages for a given type. - */ - public function set(string $type, string|array $messages): void; - - /** - * Gets flash messages for a given type. - * - * @param string $type Message category type - * @param array $default Default value if $type does not exist - */ - public function peek(string $type, array $default = []): array; - - /** - * Gets all flash messages. - */ - public function peekAll(): array; - - /** - * Gets and clears flash from the stack. - * - * @param array $default Default value if $type does not exist - */ - public function get(string $type, array $default = []): array; - - /** - * Gets and clears flashes from the stack. - */ - public function all(): array; - - /** - * Sets all flash messages. - */ - public function setAll(array $messages): void; - - /** - * Has flash messages for a given type? - */ - public function has(string $type): bool; - - /** - * Returns a list of all defined types. - */ - public function keys(): array; -} diff --git a/plugins/vendor/symfony/http-foundation/Session/FlashBagAwareSessionInterface.php b/plugins/vendor/symfony/http-foundation/Session/FlashBagAwareSessionInterface.php deleted file mode 100644 index 90151d38..00000000 --- a/plugins/vendor/symfony/http-foundation/Session/FlashBagAwareSessionInterface.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session; - -use Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface; - -/** - * Interface for session with a flashbag. - */ -interface FlashBagAwareSessionInterface extends SessionInterface -{ - public function getFlashBag(): FlashBagInterface; -} diff --git a/plugins/vendor/symfony/http-foundation/Session/Session.php b/plugins/vendor/symfony/http-foundation/Session/Session.php deleted file mode 100644 index 972021fd..00000000 --- a/plugins/vendor/symfony/http-foundation/Session/Session.php +++ /dev/null @@ -1,223 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session; - -use Symfony\Component\HttpFoundation\Session\Attribute\AttributeBag; -use Symfony\Component\HttpFoundation\Session\Attribute\AttributeBagInterface; -use Symfony\Component\HttpFoundation\Session\Flash\FlashBag; -use Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface; -use Symfony\Component\HttpFoundation\Session\Storage\MetadataBag; -use Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage; -use Symfony\Component\HttpFoundation\Session\Storage\SessionStorageInterface; - -// Help opcache.preload discover always-needed symbols -class_exists(AttributeBag::class); -class_exists(FlashBag::class); -class_exists(SessionBagProxy::class); - -/** - * @author Fabien Potencier - * @author Drak - * - * @implements \IteratorAggregate - */ -class Session implements FlashBagAwareSessionInterface, \IteratorAggregate, \Countable -{ - protected SessionStorageInterface $storage; - - private string $flashName; - private string $attributeName; - private array $data = []; - private int $usageIndex = 0; - private ?\Closure $usageReporter; - - public function __construct(?SessionStorageInterface $storage = null, ?AttributeBagInterface $attributes = null, ?FlashBagInterface $flashes = null, ?callable $usageReporter = null) - { - $this->storage = $storage ?? new NativeSessionStorage(); - $this->usageReporter = null === $usageReporter ? null : $usageReporter(...); - - $attributes ??= new AttributeBag(); - $this->attributeName = $attributes->getName(); - $this->registerBag($attributes); - - $flashes ??= new FlashBag(); - $this->flashName = $flashes->getName(); - $this->registerBag($flashes); - } - - public function start(): bool - { - return $this->storage->start(); - } - - public function has(string $name): bool - { - return $this->getAttributeBag()->has($name); - } - - public function get(string $name, mixed $default = null): mixed - { - return $this->getAttributeBag()->get($name, $default); - } - - public function set(string $name, mixed $value): void - { - $this->getAttributeBag()->set($name, $value); - } - - public function all(): array - { - return $this->getAttributeBag()->all(); - } - - public function replace(array $attributes): void - { - $this->getAttributeBag()->replace($attributes); - } - - public function remove(string $name): mixed - { - return $this->getAttributeBag()->remove($name); - } - - public function clear(): void - { - $this->getAttributeBag()->clear(); - } - - public function isStarted(): bool - { - return $this->storage->isStarted(); - } - - /** - * Returns an iterator for attributes. - * - * @return \ArrayIterator - */ - public function getIterator(): \ArrayIterator - { - return new \ArrayIterator($this->getAttributeBag()->all()); - } - - /** - * Returns the number of attributes. - */ - public function count(): int - { - return \count($this->getAttributeBag()->all()); - } - - public function &getUsageIndex(): int - { - return $this->usageIndex; - } - - /** - * @internal - */ - public function isEmpty(): bool - { - if ($this->isStarted()) { - ++$this->usageIndex; - if ($this->usageReporter && 0 <= $this->usageIndex) { - ($this->usageReporter)(); - } - } - foreach ($this->data as &$data) { - if ($data) { - return false; - } - } - - return true; - } - - public function invalidate(?int $lifetime = null): bool - { - $this->storage->clear(); - - return $this->migrate(true, $lifetime); - } - - public function migrate(bool $destroy = false, ?int $lifetime = null): bool - { - return $this->storage->regenerate($destroy, $lifetime); - } - - public function save(): void - { - $this->storage->save(); - } - - public function getId(): string - { - return $this->storage->getId(); - } - - public function setId(string $id): void - { - if ($this->storage->getId() !== $id) { - $this->storage->setId($id); - } - } - - public function getName(): string - { - return $this->storage->getName(); - } - - public function setName(string $name): void - { - $this->storage->setName($name); - } - - public function getMetadataBag(): MetadataBag - { - ++$this->usageIndex; - if ($this->usageReporter && 0 <= $this->usageIndex) { - ($this->usageReporter)(); - } - - return $this->storage->getMetadataBag(); - } - - public function registerBag(SessionBagInterface $bag): void - { - $this->storage->registerBag(new SessionBagProxy($bag, $this->data, $this->usageIndex, $this->usageReporter)); - } - - public function getBag(string $name): SessionBagInterface - { - $bag = $this->storage->getBag($name); - - return method_exists($bag, 'getBag') ? $bag->getBag() : $bag; - } - - /** - * Gets the flashbag interface. - */ - public function getFlashBag(): FlashBagInterface - { - return $this->getBag($this->flashName); - } - - /** - * Gets the attributebag interface. - * - * Note that this method was added to help with IDE autocompletion. - */ - private function getAttributeBag(): AttributeBagInterface - { - return $this->getBag($this->attributeName); - } -} diff --git a/plugins/vendor/symfony/http-foundation/Session/SessionBagInterface.php b/plugins/vendor/symfony/http-foundation/Session/SessionBagInterface.php deleted file mode 100644 index 6a224cf1..00000000 --- a/plugins/vendor/symfony/http-foundation/Session/SessionBagInterface.php +++ /dev/null @@ -1,42 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session; - -/** - * Session Bag store. - * - * @author Drak - */ -interface SessionBagInterface -{ - /** - * Gets this bag's name. - */ - public function getName(): string; - - /** - * Initializes the Bag. - */ - public function initialize(array &$array): void; - - /** - * Gets the storage key for this bag. - */ - public function getStorageKey(): string; - - /** - * Clears out data from bag. - * - * @return mixed Whatever data was contained - */ - public function clear(): mixed; -} diff --git a/plugins/vendor/symfony/http-foundation/Session/SessionBagProxy.php b/plugins/vendor/symfony/http-foundation/Session/SessionBagProxy.php deleted file mode 100644 index a389bd8b..00000000 --- a/plugins/vendor/symfony/http-foundation/Session/SessionBagProxy.php +++ /dev/null @@ -1,86 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session; - -/** - * @author Nicolas Grekas - * - * @internal - */ -final class SessionBagProxy implements SessionBagInterface -{ - private array $data; - private ?int $usageIndex; - private ?\Closure $usageReporter; - - public function __construct( - private SessionBagInterface $bag, - array &$data, - ?int &$usageIndex, - ?callable $usageReporter, - ) { - $this->bag = $bag; - $this->data = &$data; - $this->usageIndex = &$usageIndex; - $this->usageReporter = null === $usageReporter ? null : $usageReporter(...); - } - - public function getBag(): SessionBagInterface - { - ++$this->usageIndex; - if ($this->usageReporter && 0 <= $this->usageIndex) { - ($this->usageReporter)(); - } - - return $this->bag; - } - - public function isEmpty(): bool - { - if (!isset($this->data[$this->bag->getStorageKey()])) { - return true; - } - ++$this->usageIndex; - if ($this->usageReporter && 0 <= $this->usageIndex) { - ($this->usageReporter)(); - } - - return empty($this->data[$this->bag->getStorageKey()]); - } - - public function getName(): string - { - return $this->bag->getName(); - } - - public function initialize(array &$array): void - { - ++$this->usageIndex; - if ($this->usageReporter && 0 <= $this->usageIndex) { - ($this->usageReporter)(); - } - - $this->data[$this->bag->getStorageKey()] = &$array; - - $this->bag->initialize($array); - } - - public function getStorageKey(): string - { - return $this->bag->getStorageKey(); - } - - public function clear(): mixed - { - return $this->bag->clear(); - } -} diff --git a/plugins/vendor/symfony/http-foundation/Session/SessionFactory.php b/plugins/vendor/symfony/http-foundation/Session/SessionFactory.php deleted file mode 100644 index b875a23c..00000000 --- a/plugins/vendor/symfony/http-foundation/Session/SessionFactory.php +++ /dev/null @@ -1,39 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session; - -use Symfony\Component\HttpFoundation\RequestStack; -use Symfony\Component\HttpFoundation\Session\Storage\SessionStorageFactoryInterface; - -// Help opcache.preload discover always-needed symbols -class_exists(Session::class); - -/** - * @author Jérémy Derussé - */ -class SessionFactory implements SessionFactoryInterface -{ - private ?\Closure $usageReporter; - - public function __construct( - private RequestStack $requestStack, - private SessionStorageFactoryInterface $storageFactory, - ?callable $usageReporter = null, - ) { - $this->usageReporter = null === $usageReporter ? null : $usageReporter(...); - } - - public function createSession(): SessionInterface - { - return new Session($this->storageFactory->createStorage($this->requestStack->getMainRequest()), null, null, $this->usageReporter); - } -} diff --git a/plugins/vendor/symfony/http-foundation/Session/SessionFactoryInterface.php b/plugins/vendor/symfony/http-foundation/Session/SessionFactoryInterface.php deleted file mode 100644 index b24fdc49..00000000 --- a/plugins/vendor/symfony/http-foundation/Session/SessionFactoryInterface.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session; - -/** - * @author Kevin Bond - */ -interface SessionFactoryInterface -{ - public function createSession(): SessionInterface; -} diff --git a/plugins/vendor/symfony/http-foundation/Session/SessionInterface.php b/plugins/vendor/symfony/http-foundation/Session/SessionInterface.php deleted file mode 100644 index 3e29ba42..00000000 --- a/plugins/vendor/symfony/http-foundation/Session/SessionInterface.php +++ /dev/null @@ -1,140 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session; - -use Symfony\Component\HttpFoundation\Session\Storage\MetadataBag; - -/** - * Interface for the session. - * - * @author Drak - */ -interface SessionInterface -{ - /** - * Starts the session storage. - * - * @throws \RuntimeException if session fails to start - */ - public function start(): bool; - - /** - * Returns the session ID. - */ - public function getId(): string; - - /** - * Sets the session ID. - */ - public function setId(string $id): void; - - /** - * Returns the session name. - */ - public function getName(): string; - - /** - * Sets the session name. - */ - public function setName(string $name): void; - - /** - * Invalidates the current session. - * - * Clears all session attributes and flashes and regenerates the - * session and deletes the old session from persistence. - * - * @param int|null $lifetime Sets the cookie lifetime for the session cookie. A null value - * will leave the system settings unchanged, 0 sets the cookie - * to expire with browser session. Time is in seconds, and is - * not a Unix timestamp. - */ - public function invalidate(?int $lifetime = null): bool; - - /** - * Migrates the current session to a new session id while maintaining all - * session attributes. - * - * @param bool $destroy Whether to delete the old session or leave it to garbage collection - * @param int|null $lifetime Sets the cookie lifetime for the session cookie. A null value - * will leave the system settings unchanged, 0 sets the cookie - * to expire with browser session. Time is in seconds, and is - * not a Unix timestamp. - */ - public function migrate(bool $destroy = false, ?int $lifetime = null): bool; - - /** - * Force the session to be saved and closed. - * - * This method is generally not required for real sessions as - * the session will be automatically saved at the end of - * code execution. - */ - public function save(): void; - - /** - * Checks if an attribute is defined. - */ - public function has(string $name): bool; - - /** - * Returns an attribute. - */ - public function get(string $name, mixed $default = null): mixed; - - /** - * Sets an attribute. - */ - public function set(string $name, mixed $value): void; - - /** - * Returns attributes. - */ - public function all(): array; - - /** - * Sets attributes. - */ - public function replace(array $attributes): void; - - /** - * Removes an attribute. - * - * @return mixed The removed value or null when it does not exist - */ - public function remove(string $name): mixed; - - /** - * Clears all attributes. - */ - public function clear(): void; - - /** - * Checks if the session was started. - */ - public function isStarted(): bool; - - /** - * Registers a SessionBagInterface with the session. - */ - public function registerBag(SessionBagInterface $bag): void; - - /** - * Gets a bag instance by name. - */ - public function getBag(string $name): SessionBagInterface; - - /** - * Gets session meta. - */ - public function getMetadataBag(): MetadataBag; -} diff --git a/plugins/vendor/symfony/http-foundation/Session/SessionUtils.php b/plugins/vendor/symfony/http-foundation/Session/SessionUtils.php deleted file mode 100644 index 57aa565f..00000000 --- a/plugins/vendor/symfony/http-foundation/Session/SessionUtils.php +++ /dev/null @@ -1,59 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session; - -/** - * Session utility functions. - * - * @author Nicolas Grekas - * @author Rémon van de Kamp - * - * @internal - */ -final class SessionUtils -{ - /** - * Finds the session header amongst the headers that are to be sent, removes it, and returns - * it so the caller can process it further. - */ - public static function popSessionCookie(string $sessionName, #[\SensitiveParameter] string $sessionId): ?string - { - $sessionCookie = null; - $sessionCookiePrefix = \sprintf(' %s=', urlencode($sessionName)); - $sessionCookieWithId = \sprintf('%s%s;', $sessionCookiePrefix, urlencode($sessionId)); - $otherCookies = []; - foreach (headers_list() as $h) { - if (0 !== stripos($h, 'Set-Cookie:')) { - continue; - } - if (11 === strpos($h, $sessionCookiePrefix, 11)) { - $sessionCookie = $h; - - if (11 !== strpos($h, $sessionCookieWithId, 11)) { - $otherCookies[] = $h; - } - } else { - $otherCookies[] = $h; - } - } - if (null === $sessionCookie) { - return null; - } - - header_remove('Set-Cookie'); - foreach ($otherCookies as $h) { - header($h, false); - } - - return $sessionCookie; - } -} diff --git a/plugins/vendor/symfony/http-foundation/Session/Storage/Handler/AbstractSessionHandler.php b/plugins/vendor/symfony/http-foundation/Session/Storage/Handler/AbstractSessionHandler.php deleted file mode 100644 index ccdabbfa..00000000 --- a/plugins/vendor/symfony/http-foundation/Session/Storage/Handler/AbstractSessionHandler.php +++ /dev/null @@ -1,121 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Storage\Handler; - -use Symfony\Component\HttpFoundation\Session\SessionUtils; - -/** - * This abstract session handler provides a generic implementation - * of the PHP 7.0 SessionUpdateTimestampHandlerInterface, - * enabling strict and lazy session handling. - * - * @author Nicolas Grekas - */ -abstract class AbstractSessionHandler implements \SessionHandlerInterface, \SessionUpdateTimestampHandlerInterface -{ - private string $sessionName; - private string $prefetchId; - private string $prefetchData; - private ?string $newSessionId = null; - private string $igbinaryEmptyData; - - public function open(string $savePath, string $sessionName): bool - { - $this->sessionName = $sessionName; - if (!headers_sent() && !\ini_get('session.cache_limiter') && '0' !== \ini_get('session.cache_limiter')) { - header(\sprintf('Cache-Control: max-age=%d, private, must-revalidate', 60 * (int) \ini_get('session.cache_expire'))); - } - - return true; - } - - abstract protected function doRead(#[\SensitiveParameter] string $sessionId): string; - - abstract protected function doWrite(#[\SensitiveParameter] string $sessionId, string $data): bool; - - abstract protected function doDestroy(#[\SensitiveParameter] string $sessionId): bool; - - public function validateId(#[\SensitiveParameter] string $sessionId): bool - { - $this->prefetchData = $this->read($sessionId); - $this->prefetchId = $sessionId; - - return '' !== $this->prefetchData; - } - - public function read(#[\SensitiveParameter] string $sessionId): string - { - if (isset($this->prefetchId)) { - $prefetchId = $this->prefetchId; - $prefetchData = $this->prefetchData; - unset($this->prefetchId, $this->prefetchData); - - if ($prefetchId === $sessionId || '' === $prefetchData) { - $this->newSessionId = '' === $prefetchData ? $sessionId : null; - - return $prefetchData; - } - } - - $data = $this->doRead($sessionId); - $this->newSessionId = '' === $data ? $sessionId : null; - - return $data; - } - - public function updateTimestamp(#[\SensitiveParameter] string $sessionId, string $data): bool - { - $this->igbinaryEmptyData ??= \function_exists('igbinary_serialize') ? igbinary_serialize([]) : ''; - if ('' === $data || $this->igbinaryEmptyData === $data) { - return $this->destroy($sessionId); - } - - return true; - } - - public function write(#[\SensitiveParameter] string $sessionId, string $data): bool - { - // see https://github.com/igbinary/igbinary/issues/146 - $this->igbinaryEmptyData ??= \function_exists('igbinary_serialize') ? igbinary_serialize([]) : ''; - if ('' === $data || $this->igbinaryEmptyData === $data) { - return $this->destroy($sessionId); - } - $this->newSessionId = null; - - return $this->doWrite($sessionId, $data); - } - - public function destroy(#[\SensitiveParameter] string $sessionId): bool - { - if (!headers_sent() && filter_var(\ini_get('session.use_cookies'), \FILTER_VALIDATE_BOOL)) { - if (!isset($this->sessionName)) { - throw new \LogicException(\sprintf('Session name cannot be empty, did you forget to call "parent::open()" in "%s"?.', static::class)); - } - $cookie = SessionUtils::popSessionCookie($this->sessionName, $sessionId); - - /* - * We send an invalidation Set-Cookie header (zero lifetime) - * when either the session was started or a cookie with - * the session name was sent by the client (in which case - * we know it's invalid as a valid session cookie would've - * started the session). - */ - if (null === $cookie || isset($_COOKIE[$this->sessionName])) { - $params = session_get_cookie_params(); - unset($params['lifetime']); - setcookie($this->sessionName, '', $params); - } - } - - return $this->newSessionId === $sessionId || $this->doDestroy($sessionId); - } -} diff --git a/plugins/vendor/symfony/http-foundation/Session/Storage/Handler/IdentityMarshaller.php b/plugins/vendor/symfony/http-foundation/Session/Storage/Handler/IdentityMarshaller.php deleted file mode 100644 index 70ac7624..00000000 --- a/plugins/vendor/symfony/http-foundation/Session/Storage/Handler/IdentityMarshaller.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Storage\Handler; - -use Symfony\Component\Cache\Marshaller\MarshallerInterface; - -/** - * @author Ahmed TAILOULOUTE - */ -class IdentityMarshaller implements MarshallerInterface -{ - public function marshall(array $values, ?array &$failed): array - { - foreach ($values as $key => $value) { - if (!\is_string($value)) { - throw new \LogicException(\sprintf('%s accepts only string as data.', __METHOD__)); - } - } - - return $values; - } - - public function unmarshall(string $value): string - { - return $value; - } -} diff --git a/plugins/vendor/symfony/http-foundation/Session/Storage/Handler/MarshallingSessionHandler.php b/plugins/vendor/symfony/http-foundation/Session/Storage/Handler/MarshallingSessionHandler.php deleted file mode 100644 index 8e82f184..00000000 --- a/plugins/vendor/symfony/http-foundation/Session/Storage/Handler/MarshallingSessionHandler.php +++ /dev/null @@ -1,73 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Storage\Handler; - -use Symfony\Component\Cache\Marshaller\MarshallerInterface; - -/** - * @author Ahmed TAILOULOUTE - */ -class MarshallingSessionHandler implements \SessionHandlerInterface, \SessionUpdateTimestampHandlerInterface -{ - public function __construct( - private AbstractSessionHandler $handler, - private MarshallerInterface $marshaller, - ) { - } - - public function open(string $savePath, string $name): bool - { - return $this->handler->open($savePath, $name); - } - - public function close(): bool - { - return $this->handler->close(); - } - - public function destroy(#[\SensitiveParameter] string $sessionId): bool - { - return $this->handler->destroy($sessionId); - } - - public function gc(int $maxlifetime): int|false - { - return $this->handler->gc($maxlifetime); - } - - public function read(#[\SensitiveParameter] string $sessionId): string - { - return $this->marshaller->unmarshall($this->handler->read($sessionId)); - } - - public function write(#[\SensitiveParameter] string $sessionId, string $data): bool - { - $failed = []; - $marshalledData = $this->marshaller->marshall(['data' => $data], $failed); - - if (isset($failed['data'])) { - return false; - } - - return $this->handler->write($sessionId, $marshalledData['data']); - } - - public function validateId(#[\SensitiveParameter] string $sessionId): bool - { - return $this->handler->validateId($sessionId); - } - - public function updateTimestamp(#[\SensitiveParameter] string $sessionId, string $data): bool - { - return $this->handler->updateTimestamp($sessionId, $data); - } -} diff --git a/plugins/vendor/symfony/http-foundation/Session/Storage/Handler/MemcachedSessionHandler.php b/plugins/vendor/symfony/http-foundation/Session/Storage/Handler/MemcachedSessionHandler.php deleted file mode 100644 index 4b95d887..00000000 --- a/plugins/vendor/symfony/http-foundation/Session/Storage/Handler/MemcachedSessionHandler.php +++ /dev/null @@ -1,110 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Storage\Handler; - -/** - * Memcached based session storage handler based on the Memcached class - * provided by the PHP memcached extension. - * - * @see https://php.net/memcached - * - * @author Drak - */ -class MemcachedSessionHandler extends AbstractSessionHandler -{ - /** - * Time to live in seconds. - */ - private int|\Closure|null $ttl; - - /** - * Key prefix for shared environments. - */ - private string $prefix; - - /** - * Constructor. - * - * List of available options: - * * prefix: The prefix to use for the memcached keys in order to avoid collision - * * ttl: The time to live in seconds. - * - * @throws \InvalidArgumentException When unsupported options are passed - */ - public function __construct( - private \Memcached $memcached, - array $options = [], - ) { - if ($diff = array_diff(array_keys($options), ['prefix', 'expiretime', 'ttl'])) { - throw new \InvalidArgumentException(\sprintf('The following options are not supported "%s".', implode(', ', $diff))); - } - - $this->ttl = $options['expiretime'] ?? $options['ttl'] ?? null; - $this->prefix = $options['prefix'] ?? 'sf2s'; - } - - public function close(): bool - { - return $this->memcached->quit(); - } - - protected function doRead(#[\SensitiveParameter] string $sessionId): string - { - return $this->memcached->get($this->prefix.$sessionId) ?: ''; - } - - public function updateTimestamp(#[\SensitiveParameter] string $sessionId, string $data): bool - { - $this->memcached->touch($this->prefix.$sessionId, $this->getCompatibleTtl()); - - return true; - } - - protected function doWrite(#[\SensitiveParameter] string $sessionId, string $data): bool - { - return $this->memcached->set($this->prefix.$sessionId, $data, $this->getCompatibleTtl()); - } - - private function getCompatibleTtl(): int - { - $ttl = ($this->ttl instanceof \Closure ? ($this->ttl)() : $this->ttl) ?? \ini_get('session.gc_maxlifetime'); - - // If the relative TTL that is used exceeds 30 days, memcached will treat the value as Unix time. - // We have to convert it to an absolute Unix time at this point, to make sure the TTL is correct. - if ($ttl > 60 * 60 * 24 * 30) { - $ttl += time(); - } - - return $ttl; - } - - protected function doDestroy(#[\SensitiveParameter] string $sessionId): bool - { - $result = $this->memcached->delete($this->prefix.$sessionId); - - return $result || \Memcached::RES_NOTFOUND == $this->memcached->getResultCode(); - } - - public function gc(int $maxlifetime): int|false - { - // not required here because memcached will auto expire the records anyhow. - return 0; - } - - /** - * Return a Memcached instance. - */ - protected function getMemcached(): \Memcached - { - return $this->memcached; - } -} diff --git a/plugins/vendor/symfony/http-foundation/Session/Storage/Handler/MigratingSessionHandler.php b/plugins/vendor/symfony/http-foundation/Session/Storage/Handler/MigratingSessionHandler.php deleted file mode 100644 index 8ed6a7b3..00000000 --- a/plugins/vendor/symfony/http-foundation/Session/Storage/Handler/MigratingSessionHandler.php +++ /dev/null @@ -1,100 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Storage\Handler; - -/** - * Migrating session handler for migrating from one handler to another. It reads - * from the current handler and writes both the current and new ones. - * - * It ignores errors from the new handler. - * - * @author Ross Motley - * @author Oliver Radwell - */ -class MigratingSessionHandler implements \SessionHandlerInterface, \SessionUpdateTimestampHandlerInterface -{ - private \SessionHandlerInterface&\SessionUpdateTimestampHandlerInterface $currentHandler; - private \SessionHandlerInterface&\SessionUpdateTimestampHandlerInterface $writeOnlyHandler; - - public function __construct(\SessionHandlerInterface $currentHandler, \SessionHandlerInterface $writeOnlyHandler) - { - if (!$currentHandler instanceof \SessionUpdateTimestampHandlerInterface) { - $currentHandler = new StrictSessionHandler($currentHandler); - } - if (!$writeOnlyHandler instanceof \SessionUpdateTimestampHandlerInterface) { - $writeOnlyHandler = new StrictSessionHandler($writeOnlyHandler); - } - - $this->currentHandler = $currentHandler; - $this->writeOnlyHandler = $writeOnlyHandler; - } - - public function close(): bool - { - $result = $this->currentHandler->close(); - $this->writeOnlyHandler->close(); - - return $result; - } - - public function destroy(#[\SensitiveParameter] string $sessionId): bool - { - $result = $this->currentHandler->destroy($sessionId); - $this->writeOnlyHandler->destroy($sessionId); - - return $result; - } - - public function gc(int $maxlifetime): int|false - { - $result = $this->currentHandler->gc($maxlifetime); - $this->writeOnlyHandler->gc($maxlifetime); - - return $result; - } - - public function open(string $savePath, string $sessionName): bool - { - $result = $this->currentHandler->open($savePath, $sessionName); - $this->writeOnlyHandler->open($savePath, $sessionName); - - return $result; - } - - public function read(#[\SensitiveParameter] string $sessionId): string - { - // No reading from new handler until switch-over - return $this->currentHandler->read($sessionId); - } - - public function write(#[\SensitiveParameter] string $sessionId, string $sessionData): bool - { - $result = $this->currentHandler->write($sessionId, $sessionData); - $this->writeOnlyHandler->write($sessionId, $sessionData); - - return $result; - } - - public function validateId(#[\SensitiveParameter] string $sessionId): bool - { - // No reading from new handler until switch-over - return $this->currentHandler->validateId($sessionId); - } - - public function updateTimestamp(#[\SensitiveParameter] string $sessionId, string $sessionData): bool - { - $result = $this->currentHandler->updateTimestamp($sessionId, $sessionData); - $this->writeOnlyHandler->updateTimestamp($sessionId, $sessionData); - - return $result; - } -} diff --git a/plugins/vendor/symfony/http-foundation/Session/Storage/Handler/MongoDbSessionHandler.php b/plugins/vendor/symfony/http-foundation/Session/Storage/Handler/MongoDbSessionHandler.php deleted file mode 100644 index d5586030..00000000 --- a/plugins/vendor/symfony/http-foundation/Session/Storage/Handler/MongoDbSessionHandler.php +++ /dev/null @@ -1,186 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Storage\Handler; - -use MongoDB\BSON\Binary; -use MongoDB\BSON\UTCDateTime; -use MongoDB\Client; -use MongoDB\Driver\BulkWrite; -use MongoDB\Driver\Manager; -use MongoDB\Driver\Query; - -/** - * Session handler using the MongoDB driver extension. - * - * @author Markus Bachmann - * @author Jérôme Tamarelle - * - * @see https://php.net/mongodb - */ -class MongoDbSessionHandler extends AbstractSessionHandler -{ - private Manager $manager; - private string $namespace; - private array $options; - private int|\Closure|null $ttl; - - /** - * Constructor. - * - * List of available options: - * * database: The name of the database [required] - * * collection: The name of the collection [required] - * * id_field: The field name for storing the session id [default: _id] - * * data_field: The field name for storing the session data [default: data] - * * time_field: The field name for storing the timestamp [default: time] - * * expiry_field: The field name for storing the expiry-timestamp [default: expires_at] - * * ttl: The time to live in seconds. - * - * It is strongly recommended to put an index on the `expiry_field` for - * garbage-collection. Alternatively it's possible to automatically expire - * the sessions in the database as described below: - * - * A TTL collections can be used on MongoDB 2.2+ to cleanup expired sessions - * automatically. Such an index can for example look like this: - * - * db..createIndex( - * { "": 1 }, - * { "expireAfterSeconds": 0 } - * ) - * - * More details on: https://docs.mongodb.org/manual/tutorial/expire-data/ - * - * If you use such an index, you can drop `gc_probability` to 0 since - * no garbage-collection is required. - * - * @throws \InvalidArgumentException When "database" or "collection" not provided - */ - public function __construct(Client|Manager $mongo, array $options) - { - if (!isset($options['database']) || !isset($options['collection'])) { - throw new \InvalidArgumentException('You must provide the "database" and "collection" option for MongoDBSessionHandler.'); - } - - if ($mongo instanceof Client) { - $mongo = $mongo->getManager(); - } - - $this->manager = $mongo; - $this->namespace = $options['database'].'.'.$options['collection']; - - $this->options = array_merge([ - 'id_field' => '_id', - 'data_field' => 'data', - 'time_field' => 'time', - 'expiry_field' => 'expires_at', - ], $options); - $this->ttl = $this->options['ttl'] ?? null; - } - - public function close(): bool - { - return true; - } - - protected function doDestroy(#[\SensitiveParameter] string $sessionId): bool - { - $write = new BulkWrite(); - $write->delete( - [$this->options['id_field'] => $sessionId], - ['limit' => 1] - ); - - $this->manager->executeBulkWrite($this->namespace, $write); - - return true; - } - - public function gc(int $maxlifetime): int|false - { - $write = new BulkWrite(); - $write->delete( - [$this->options['expiry_field'] => ['$lt' => $this->getUTCDateTime()]], - ); - $result = $this->manager->executeBulkWrite($this->namespace, $write); - - return $result->getDeletedCount() ?? false; - } - - protected function doWrite(#[\SensitiveParameter] string $sessionId, string $data): bool - { - $ttl = ($this->ttl instanceof \Closure ? ($this->ttl)() : $this->ttl) ?? \ini_get('session.gc_maxlifetime'); - $expiry = $this->getUTCDateTime($ttl); - - $fields = [ - $this->options['time_field'] => $this->getUTCDateTime(), - $this->options['expiry_field'] => $expiry, - $this->options['data_field'] => new Binary($data, Binary::TYPE_GENERIC), - ]; - - $write = new BulkWrite(); - $write->update( - [$this->options['id_field'] => $sessionId], - ['$set' => $fields], - ['upsert' => true] - ); - - $this->manager->executeBulkWrite($this->namespace, $write); - - return true; - } - - public function updateTimestamp(#[\SensitiveParameter] string $sessionId, string $data): bool - { - $ttl = ($this->ttl instanceof \Closure ? ($this->ttl)() : $this->ttl) ?? \ini_get('session.gc_maxlifetime'); - $expiry = $this->getUTCDateTime($ttl); - - $write = new BulkWrite(); - $write->update( - [$this->options['id_field'] => $sessionId], - ['$set' => [ - $this->options['time_field'] => $this->getUTCDateTime(), - $this->options['expiry_field'] => $expiry, - ]], - ['multi' => false], - ); - - $this->manager->executeBulkWrite($this->namespace, $write); - - return true; - } - - protected function doRead(#[\SensitiveParameter] string $sessionId): string - { - $cursor = $this->manager->executeQuery($this->namespace, new Query([ - $this->options['id_field'] => $sessionId, - $this->options['expiry_field'] => ['$gte' => $this->getUTCDateTime()], - ], [ - 'projection' => [ - '_id' => false, - $this->options['data_field'] => true, - ], - 'limit' => 1, - ])); - - foreach ($cursor as $document) { - return (string) $document->{$this->options['data_field']} ?? ''; - } - - // Not found - return ''; - } - - private function getUTCDateTime(int $additionalSeconds = 0): UTCDateTime - { - return new UTCDateTime((time() + $additionalSeconds) * 1000); - } -} diff --git a/plugins/vendor/symfony/http-foundation/Session/Storage/Handler/NativeFileSessionHandler.php b/plugins/vendor/symfony/http-foundation/Session/Storage/Handler/NativeFileSessionHandler.php deleted file mode 100644 index 81e97be9..00000000 --- a/plugins/vendor/symfony/http-foundation/Session/Storage/Handler/NativeFileSessionHandler.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Storage\Handler; - -/** - * Native session handler using PHP's built in file storage. - * - * @author Drak - */ -class NativeFileSessionHandler extends \SessionHandler -{ - /** - * @param string|null $savePath Path of directory to save session files - * Default null will leave setting as defined by PHP. - * '/path', 'N;/path', or 'N;octal-mode;/path - * - * @see https://php.net/session.configuration#ini.session.save-path for further details. - * - * @throws \InvalidArgumentException On invalid $savePath - * @throws \RuntimeException When failing to create the save directory - */ - public function __construct(?string $savePath = null) - { - $baseDir = $savePath ??= \ini_get('session.save_path'); - - if ($count = substr_count($savePath, ';')) { - if ($count > 2) { - throw new \InvalidArgumentException(\sprintf('Invalid argument $savePath \'%s\'.', $savePath)); - } - - // characters after last ';' are the path - $baseDir = ltrim(strrchr($savePath, ';'), ';'); - } - - if ($baseDir && !is_dir($baseDir) && !@mkdir($baseDir, 0o777, true) && !is_dir($baseDir)) { - throw new \RuntimeException(\sprintf('Session Storage was not able to create directory "%s".', $baseDir)); - } - - if ($savePath !== \ini_get('session.save_path')) { - ini_set('session.save_path', $savePath); - } - if ('files' !== \ini_get('session.save_handler')) { - ini_set('session.save_handler', 'files'); - } - } -} diff --git a/plugins/vendor/symfony/http-foundation/Session/Storage/Handler/NullSessionHandler.php b/plugins/vendor/symfony/http-foundation/Session/Storage/Handler/NullSessionHandler.php deleted file mode 100644 index a77185e2..00000000 --- a/plugins/vendor/symfony/http-foundation/Session/Storage/Handler/NullSessionHandler.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Storage\Handler; - -/** - * Can be used in unit testing or in a situations where persisted sessions are not desired. - * - * @author Drak - */ -class NullSessionHandler extends AbstractSessionHandler -{ - public function close(): bool - { - return true; - } - - public function validateId(#[\SensitiveParameter] string $sessionId): bool - { - return true; - } - - protected function doRead(#[\SensitiveParameter] string $sessionId): string - { - return ''; - } - - public function updateTimestamp(#[\SensitiveParameter] string $sessionId, string $data): bool - { - return true; - } - - protected function doWrite(#[\SensitiveParameter] string $sessionId, string $data): bool - { - return true; - } - - protected function doDestroy(#[\SensitiveParameter] string $sessionId): bool - { - return true; - } - - public function gc(int $maxlifetime): int|false - { - return 0; - } -} diff --git a/plugins/vendor/symfony/http-foundation/Session/Storage/Handler/PdoSessionHandler.php b/plugins/vendor/symfony/http-foundation/Session/Storage/Handler/PdoSessionHandler.php deleted file mode 100644 index 3250ccbb..00000000 --- a/plugins/vendor/symfony/http-foundation/Session/Storage/Handler/PdoSessionHandler.php +++ /dev/null @@ -1,923 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Storage\Handler; - -use Doctrine\DBAL\Schema\Name\Identifier; -use Doctrine\DBAL\Schema\Name\UnqualifiedName; -use Doctrine\DBAL\Schema\PrimaryKeyConstraint; -use Doctrine\DBAL\Schema\Schema; -use Doctrine\DBAL\Types\Types; - -/** - * Session handler using a PDO connection to read and write data. - * - * It works with MySQL, PostgreSQL, Oracle, SQL Server and SQLite and implements - * different locking strategies to handle concurrent access to the same session. - * Locking is necessary to prevent loss of data due to race conditions and to keep - * the session data consistent between read() and write(). With locking, requests - * for the same session will wait until the other one finished writing. For this - * reason it's best practice to close a session as early as possible to improve - * concurrency. PHPs internal files session handler also implements locking. - * - * Attention: Since SQLite does not support row level locks but locks the whole database, - * it means only one session can be accessed at a time. Even different sessions would wait - * for another to finish. So saving session in SQLite should only be considered for - * development or prototypes. - * - * Session data is a binary string that can contain non-printable characters like the null byte. - * For this reason it must be saved in a binary column in the database like BLOB in MySQL. - * Saving it in a character column could corrupt the data. You can use createTable() - * to initialize a correctly defined table. - * - * @see https://php.net/sessionhandlerinterface - * - * @author Fabien Potencier - * @author Michael Williams - * @author Tobias Schultze - */ -class PdoSessionHandler extends AbstractSessionHandler -{ - /** - * No locking is done. This means sessions are prone to loss of data due to - * race conditions of concurrent requests to the same session. The last session - * write will win in this case. It might be useful when you implement your own - * logic to deal with this like an optimistic approach. - */ - public const LOCK_NONE = 0; - - /** - * Creates an application-level lock on a session. The disadvantage is that the - * lock is not enforced by the database and thus other, unaware parts of the - * application could still concurrently modify the session. The advantage is it - * does not require a transaction. - * This mode is not available for SQLite and not yet implemented for oci and sqlsrv. - */ - public const LOCK_ADVISORY = 1; - - /** - * Issues a real row lock. Since it uses a transaction between opening and - * closing a session, you have to be careful when you use same database connection - * that you also use for your application logic. This mode is the default because - * it's the only reliable solution across DBMSs. - */ - public const LOCK_TRANSACTIONAL = 2; - - private \PDO $pdo; - - /** - * DSN string or null for session.save_path or false when lazy connection disabled. - */ - private string|false|null $dsn = false; - - private string $driver; - private string $table = 'sessions'; - private string $idCol = 'sess_id'; - private string $dataCol = 'sess_data'; - private string $lifetimeCol = 'sess_lifetime'; - private string $timeCol = 'sess_time'; - - /** - * Time to live in seconds. - */ - private int|\Closure|null $ttl; - - /** - * Username when lazy-connect. - */ - private ?string $username = null; - - /** - * Password when lazy-connect. - */ - private ?string $password = null; - - /** - * Connection options when lazy-connect. - */ - private array $connectionOptions = []; - - /** - * The strategy for locking, see constants. - */ - private int $lockMode = self::LOCK_TRANSACTIONAL; - - /** - * It's an array to support multiple reads before closing which is manual, non-standard usage. - * - * @var \PDOStatement[] An array of statements to release advisory locks - */ - private array $unlockStatements = []; - - /** - * True when the current session exists but expired according to session.gc_maxlifetime. - */ - private bool $sessionExpired = false; - - /** - * Whether a transaction is active. - */ - private bool $inTransaction = false; - - /** - * Whether gc() has been called. - */ - private bool $gcCalled = false; - - /** - * You can either pass an existing database connection as PDO instance or - * pass a DSN string that will be used to lazy-connect to the database - * when the session is actually used. Furthermore it's possible to pass null - * which will then use the session.save_path ini setting as PDO DSN parameter. - * - * List of available options: - * * db_table: The name of the table [default: sessions] - * * db_id_col: The column where to store the session id [default: sess_id] - * * db_data_col: The column where to store the session data [default: sess_data] - * * db_lifetime_col: The column where to store the lifetime [default: sess_lifetime] - * * db_time_col: The column where to store the timestamp [default: sess_time] - * * db_username: The username when lazy-connect [default: ''] - * * db_password: The password when lazy-connect [default: ''] - * * db_connection_options: An array of driver-specific connection options [default: []] - * * lock_mode: The strategy for locking, see constants [default: LOCK_TRANSACTIONAL] - * * ttl: The time to live in seconds. - * - * @param \PDO|string|null $pdoOrDsn A \PDO instance or DSN string or URL string or null - * - * @throws \InvalidArgumentException When PDO error mode is not PDO::ERRMODE_EXCEPTION - */ - public function __construct(#[\SensitiveParameter] \PDO|string|null $pdoOrDsn = null, #[\SensitiveParameter] array $options = []) - { - if ($pdoOrDsn instanceof \PDO) { - if (\PDO::ERRMODE_EXCEPTION !== $pdoOrDsn->getAttribute(\PDO::ATTR_ERRMODE)) { - throw new \InvalidArgumentException(\sprintf('"%s" requires PDO error mode attribute be set to throw Exceptions (i.e. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION)).', __CLASS__)); - } - - $this->pdo = $pdoOrDsn; - $this->driver = $this->pdo->getAttribute(\PDO::ATTR_DRIVER_NAME); - } elseif (\is_string($pdoOrDsn) && str_contains($pdoOrDsn, '://')) { - $this->dsn = $this->buildDsnFromUrl($pdoOrDsn); - } else { - $this->dsn = $pdoOrDsn; - } - - $this->table = $options['db_table'] ?? $this->table; - $this->idCol = $options['db_id_col'] ?? $this->idCol; - $this->dataCol = $options['db_data_col'] ?? $this->dataCol; - $this->lifetimeCol = $options['db_lifetime_col'] ?? $this->lifetimeCol; - $this->timeCol = $options['db_time_col'] ?? $this->timeCol; - $this->username = $options['db_username'] ?? $this->username; - $this->password = $options['db_password'] ?? $this->password; - $this->connectionOptions = $options['db_connection_options'] ?? $this->connectionOptions; - $this->lockMode = $options['lock_mode'] ?? $this->lockMode; - $this->ttl = $options['ttl'] ?? null; - } - - /** - * Adds the Table to the Schema if it doesn't exist. - */ - public function configureSchema(Schema $schema, ?\Closure $isSameDatabase = null): void - { - if ($schema->hasTable($this->table) || ($isSameDatabase && !$isSameDatabase($this->getConnection()->exec(...)))) { - return; - } - - $table = $schema->createTable($this->table); - switch ($this->driver) { - case 'mysql': - $table->addColumn($this->idCol, Types::BINARY)->setLength(128)->setNotnull(true); - $table->addColumn($this->dataCol, Types::BLOB)->setNotnull(true); - $table->addColumn($this->lifetimeCol, Types::INTEGER)->setUnsigned(true)->setNotnull(true); - $table->addColumn($this->timeCol, Types::INTEGER)->setUnsigned(true)->setNotnull(true); - $table->addOption('engine', 'InnoDB'); - break; - case 'sqlite': - $table->addColumn($this->idCol, Types::TEXT)->setNotnull(true); - $table->addColumn($this->dataCol, Types::BLOB)->setNotnull(true); - $table->addColumn($this->lifetimeCol, Types::INTEGER)->setNotnull(true); - $table->addColumn($this->timeCol, Types::INTEGER)->setNotnull(true); - break; - case 'pgsql': - $table->addColumn($this->idCol, Types::STRING)->setLength(128)->setNotnull(true); - $table->addColumn($this->dataCol, Types::BINARY)->setNotnull(true); - $table->addColumn($this->lifetimeCol, Types::INTEGER)->setNotnull(true); - $table->addColumn($this->timeCol, Types::INTEGER)->setNotnull(true); - break; - case 'oci': - $table->addColumn($this->idCol, Types::STRING)->setLength(128)->setNotnull(true); - $table->addColumn($this->dataCol, Types::BLOB)->setNotnull(true); - $table->addColumn($this->lifetimeCol, Types::INTEGER)->setNotnull(true); - $table->addColumn($this->timeCol, Types::INTEGER)->setNotnull(true); - break; - case 'sqlsrv': - $table->addColumn($this->idCol, Types::STRING)->setLength(128)->setNotnull(true); - $table->addColumn($this->dataCol, Types::BLOB)->setNotnull(true); - $table->addColumn($this->lifetimeCol, Types::INTEGER)->setUnsigned(true)->setNotnull(true); - $table->addColumn($this->timeCol, Types::INTEGER)->setUnsigned(true)->setNotnull(true); - break; - default: - throw new \DomainException(\sprintf('Creating the session table is currently not implemented for PDO driver "%s".', $this->driver)); - } - - if (class_exists(PrimaryKeyConstraint::class)) { - $table->addPrimaryKeyConstraint(new PrimaryKeyConstraint(null, [new UnqualifiedName(Identifier::unquoted($this->idCol))], true)); - } else { - $table->setPrimaryKey([$this->idCol]); - } - - $table->addIndex([$this->lifetimeCol], $this->lifetimeCol.'_idx'); - } - - /** - * Creates the table to store sessions which can be called once for setup. - * - * Session ID is saved in a column of maximum length 128 because that is enough even - * for a 512 bit configured session.hash_function like Whirlpool. Session data is - * saved in a BLOB. One could also use a shorter inlined varbinary column - * if one was sure the data fits into it. - * - * @throws \PDOException When the table already exists - * @throws \DomainException When an unsupported PDO driver is used - */ - public function createTable(): void - { - // connect if we are not yet - $this->getConnection(); - - $sql = match ($this->driver) { - // We use varbinary for the ID column because it prevents unwanted conversions: - // - character set conversions between server and client - // - trailing space removal - // - case-insensitivity - // - language processing like é == e - 'mysql' => "CREATE TABLE $this->table ($this->idCol VARBINARY(128) NOT NULL PRIMARY KEY, $this->dataCol BLOB NOT NULL, $this->lifetimeCol INTEGER UNSIGNED NOT NULL, $this->timeCol INTEGER UNSIGNED NOT NULL) ENGINE = InnoDB", - 'sqlite' => "CREATE TABLE $this->table ($this->idCol TEXT NOT NULL PRIMARY KEY, $this->dataCol BLOB NOT NULL, $this->lifetimeCol INTEGER NOT NULL, $this->timeCol INTEGER NOT NULL)", - 'pgsql' => "CREATE TABLE $this->table ($this->idCol VARCHAR(128) NOT NULL PRIMARY KEY, $this->dataCol BYTEA NOT NULL, $this->lifetimeCol INTEGER NOT NULL, $this->timeCol INTEGER NOT NULL)", - 'oci' => "CREATE TABLE $this->table ($this->idCol VARCHAR2(128) NOT NULL PRIMARY KEY, $this->dataCol BLOB NOT NULL, $this->lifetimeCol INTEGER NOT NULL, $this->timeCol INTEGER NOT NULL)", - 'sqlsrv' => "CREATE TABLE $this->table ($this->idCol VARCHAR(128) NOT NULL PRIMARY KEY, $this->dataCol VARBINARY(MAX) NOT NULL, $this->lifetimeCol INTEGER NOT NULL, $this->timeCol INTEGER NOT NULL)", - default => throw new \DomainException(\sprintf('Creating the session table is currently not implemented for PDO driver "%s".', $this->driver)), - }; - - try { - $this->pdo->exec($sql); - $this->pdo->exec("CREATE INDEX {$this->lifetimeCol}_idx ON $this->table ($this->lifetimeCol)"); - } catch (\PDOException $e) { - $this->rollback(); - - throw $e; - } - } - - /** - * Returns true when the current session exists but expired according to session.gc_maxlifetime. - * - * Can be used to distinguish between a new session and one that expired due to inactivity. - */ - public function isSessionExpired(): bool - { - return $this->sessionExpired; - } - - public function open(string $savePath, string $sessionName): bool - { - $this->sessionExpired = false; - - if (!isset($this->pdo)) { - $this->connect($this->dsn ?: $savePath); - } - - return parent::open($savePath, $sessionName); - } - - public function read(#[\SensitiveParameter] string $sessionId): string - { - try { - return parent::read($sessionId); - } catch (\PDOException $e) { - $this->rollback(); - - throw $e; - } - } - - public function gc(int $maxlifetime): int|false - { - // We delay gc() to close() so that it is executed outside the transactional and blocking read-write process. - // This way, pruning expired sessions does not block them from being started while the current session is used. - $this->gcCalled = true; - - return 0; - } - - protected function doDestroy(#[\SensitiveParameter] string $sessionId): bool - { - // delete the record associated with this id - $sql = "DELETE FROM $this->table WHERE $this->idCol = :id"; - - try { - $stmt = $this->pdo->prepare($sql); - $stmt->bindParam(':id', $sessionId, \PDO::PARAM_STR); - $stmt->execute(); - } catch (\PDOException $e) { - $this->rollback(); - - throw $e; - } - - return true; - } - - protected function doWrite(#[\SensitiveParameter] string $sessionId, string $data): bool - { - $maxlifetime = (int) (($this->ttl instanceof \Closure ? ($this->ttl)() : $this->ttl) ?? \ini_get('session.gc_maxlifetime')); - - try { - // We use a single MERGE SQL query when supported by the database. - $mergeStmt = $this->getMergeStatement($sessionId, $data, $maxlifetime); - if (null !== $mergeStmt) { - $mergeStmt->execute(); - - return true; - } - - $updateStmt = $this->getUpdateStatement($sessionId, $data, $maxlifetime); - $updateStmt->execute(); - - // When MERGE is not supported, like in Postgres < 9.5, we have to use this approach that can result in - // duplicate key errors when the same session is written simultaneously (given the LOCK_NONE behavior). - // We can just catch such an error and re-execute the update. This is similar to a serializable - // transaction with retry logic on serialization failures but without the overhead and without possible - // false positives due to longer gap locking. - if (!$updateStmt->rowCount()) { - try { - $insertStmt = $this->getInsertStatement($sessionId, $data, $maxlifetime); - $insertStmt->execute(); - } catch (\PDOException $e) { - // Handle integrity violation SQLSTATE 23000 (or a subclass like 23505 in Postgres) for duplicate keys - if (str_starts_with($e->getCode(), '23')) { - $updateStmt->execute(); - } else { - throw $e; - } - } - } - } catch (\PDOException $e) { - $this->rollback(); - - throw $e; - } - - return true; - } - - public function updateTimestamp(#[\SensitiveParameter] string $sessionId, string $data): bool - { - $expiry = time() + (int) (($this->ttl instanceof \Closure ? ($this->ttl)() : $this->ttl) ?? \ini_get('session.gc_maxlifetime')); - - try { - $updateStmt = $this->pdo->prepare( - "UPDATE $this->table SET $this->lifetimeCol = :expiry, $this->timeCol = :time WHERE $this->idCol = :id" - ); - $updateStmt->bindValue(':id', $sessionId, \PDO::PARAM_STR); - $updateStmt->bindValue(':expiry', $expiry, \PDO::PARAM_INT); - $updateStmt->bindValue(':time', time(), \PDO::PARAM_INT); - $updateStmt->execute(); - } catch (\PDOException $e) { - $this->rollback(); - - throw $e; - } - - return true; - } - - public function close(): bool - { - $this->commit(); - - while ($unlockStmt = array_shift($this->unlockStatements)) { - $unlockStmt->execute(); - } - - if ($this->gcCalled) { - $this->gcCalled = false; - - // delete the session records that have expired - $sql = "DELETE FROM $this->table WHERE $this->lifetimeCol < :time"; - $stmt = $this->pdo->prepare($sql); - $stmt->bindValue(':time', time(), \PDO::PARAM_INT); - $stmt->execute(); - } - - if (false !== $this->dsn) { - unset($this->pdo, $this->driver); // only close lazy-connection - } - - return true; - } - - /** - * Lazy-connects to the database. - */ - private function connect(#[\SensitiveParameter] string $dsn): void - { - $this->pdo = new \PDO($dsn, $this->username, $this->password, $this->connectionOptions); - $this->pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); - $this->driver = $this->pdo->getAttribute(\PDO::ATTR_DRIVER_NAME); - } - - /** - * Builds a PDO DSN from a URL-like connection string. - * - * @todo implement missing support for oci DSN (which look totally different from other PDO ones) - */ - private function buildDsnFromUrl(#[\SensitiveParameter] string $dsnOrUrl): string - { - // (pdo_)?sqlite3?:///... => (pdo_)?sqlite3?://localhost/... or else the URL will be invalid - $url = preg_replace('#^((?:pdo_)?sqlite3?):///#', '$1://localhost/', $dsnOrUrl); - - $params = parse_url($url); - - if (false === $params) { - return $dsnOrUrl; // If the URL is not valid, let's assume it might be a DSN already. - } - - $params = array_map('rawurldecode', $params); - - // Override the default username and password. Values passed through options will still win over these in the constructor. - if (isset($params['user'])) { - $this->username = $params['user']; - } - - if (isset($params['pass'])) { - $this->password = $params['pass']; - } - - if (!isset($params['scheme'])) { - throw new \InvalidArgumentException('URLs without scheme are not supported to configure the PdoSessionHandler.'); - } - - $driverAliasMap = [ - 'mssql' => 'sqlsrv', - 'mysql2' => 'mysql', // Amazon RDS, for some weird reason - 'postgres' => 'pgsql', - 'postgresql' => 'pgsql', - 'sqlite3' => 'sqlite', - ]; - - $driver = $driverAliasMap[$params['scheme']] ?? $params['scheme']; - - // Doctrine DBAL supports passing its internal pdo_* driver names directly too (allowing both dashes and underscores). This allows supporting the same here. - if (str_starts_with($driver, 'pdo_') || str_starts_with($driver, 'pdo-')) { - $driver = substr($driver, 4); - } - - $dsn = null; - switch ($driver) { - case 'mysql': - $dsn = 'mysql:'; - if ('' !== ($params['query'] ?? '')) { - $queryParams = []; - parse_str($params['query'], $queryParams); - if ('' !== ($queryParams['charset'] ?? '')) { - $dsn .= 'charset='.$queryParams['charset'].';'; - } - - if ('' !== ($queryParams['unix_socket'] ?? '')) { - $dsn .= 'unix_socket='.$queryParams['unix_socket'].';'; - - if (isset($params['path'])) { - $dbName = substr($params['path'], 1); // Remove the leading slash - $dsn .= 'dbname='.$dbName.';'; - } - - return $dsn; - } - } - // If "unix_socket" is not in the query, we continue with the same process as pgsql - // no break - case 'pgsql': - $dsn ??= 'pgsql:'; - - if (isset($params['host']) && '' !== $params['host']) { - $dsn .= 'host='.$params['host'].';'; - } - - if (isset($params['port']) && '' !== $params['port']) { - $dsn .= 'port='.$params['port'].';'; - } - - if (isset($params['path'])) { - $dbName = substr($params['path'], 1); // Remove the leading slash - $dsn .= 'dbname='.$dbName.';'; - } - - return $dsn; - - case 'sqlite': - return 'sqlite:'.substr($params['path'], 1); - - case 'sqlsrv': - $dsn = 'sqlsrv:server='; - - if (isset($params['host'])) { - $dsn .= $params['host']; - } - - if (isset($params['port']) && '' !== $params['port']) { - $dsn .= ','.$params['port']; - } - - if (isset($params['path'])) { - $dbName = substr($params['path'], 1); // Remove the leading slash - $dsn .= ';Database='.$dbName; - } - - return $dsn; - - default: - throw new \InvalidArgumentException(\sprintf('The scheme "%s" is not supported by the PdoSessionHandler URL configuration. Pass a PDO DSN directly.', $params['scheme'])); - } - } - - /** - * Helper method to begin a transaction. - * - * Since SQLite does not support row level locks, we have to acquire a reserved lock - * on the database immediately. Because of https://bugs.php.net/42766 we have to create - * such a transaction manually which also means we cannot use PDO::commit or - * PDO::rollback or PDO::inTransaction for SQLite. - * - * Also MySQLs default isolation, REPEATABLE READ, causes deadlock for different sessions - * due to https://percona.com/blog/2013/12/12/one-more-innodb-gap-lock-to-avoid/ . - * So we change it to READ COMMITTED. - */ - private function beginTransaction(): void - { - if (!$this->inTransaction) { - if ('sqlite' === $this->driver) { - $this->pdo->exec('BEGIN IMMEDIATE TRANSACTION'); - } else { - if ('mysql' === $this->driver) { - $this->pdo->exec('SET TRANSACTION ISOLATION LEVEL READ COMMITTED'); - } - $this->pdo->beginTransaction(); - } - $this->inTransaction = true; - } - } - - /** - * Helper method to commit a transaction. - */ - private function commit(): void - { - if ($this->inTransaction) { - try { - // commit read-write transaction which also releases the lock - if ('sqlite' === $this->driver) { - $this->pdo->exec('COMMIT'); - } else { - $this->pdo->commit(); - } - $this->inTransaction = false; - } catch (\PDOException $e) { - $this->rollback(); - - throw $e; - } - } - } - - /** - * Helper method to rollback a transaction. - */ - private function rollback(): void - { - // We only need to rollback if we are in a transaction. Otherwise the resulting - // error would hide the real problem why rollback was called. We might not be - // in a transaction when not using the transactional locking behavior or when - // two callbacks (e.g. destroy and write) are invoked that both fail. - if ($this->inTransaction) { - if ('sqlite' === $this->driver) { - $this->pdo->exec('ROLLBACK'); - } else { - $this->pdo->rollBack(); - } - $this->inTransaction = false; - } - } - - /** - * Reads the session data in respect to the different locking strategies. - * - * We need to make sure we do not return session data that is already considered garbage according - * to the session.gc_maxlifetime setting because gc() is called after read() and only sometimes. - */ - protected function doRead(#[\SensitiveParameter] string $sessionId): string - { - if (self::LOCK_ADVISORY === $this->lockMode) { - $this->unlockStatements[] = $this->doAdvisoryLock($sessionId); - } - - $selectSql = $this->getSelectSql(); - $selectStmt = $this->pdo->prepare($selectSql); - $selectStmt->bindParam(':id', $sessionId, \PDO::PARAM_STR); - $insertStmt = null; - - while (true) { - $selectStmt->execute(); - $sessionRows = $selectStmt->fetchAll(\PDO::FETCH_NUM); - - if ($sessionRows) { - $expiry = (int) $sessionRows[0][1]; - - if ($expiry < time()) { - $this->sessionExpired = true; - - return ''; - } - - return \is_resource($sessionRows[0][0]) ? stream_get_contents($sessionRows[0][0]) : $sessionRows[0][0]; - } - - if (null !== $insertStmt) { - $this->rollback(); - throw new \RuntimeException('Failed to read session: INSERT reported a duplicate id but next SELECT did not return any data.'); - } - - if (!filter_var(\ini_get('session.use_strict_mode'), \FILTER_VALIDATE_BOOL) && self::LOCK_TRANSACTIONAL === $this->lockMode && 'sqlite' !== $this->driver) { - // In strict mode, session fixation is not possible: new sessions always start with a unique - // random id, so that concurrency is not possible and this code path can be skipped. - // Exclusive-reading of non-existent rows does not block, so we need to do an insert to block - // until other connections to the session are committed. - try { - $insertStmt = $this->getInsertStatement($sessionId, '', 0); - $insertStmt->execute(); - } catch (\PDOException $e) { - // Catch duplicate key error because other connection created the session already. - // It would only not be the case when the other connection destroyed the session. - if (str_starts_with($e->getCode(), '23')) { - // Retrieve finished session data written by concurrent connection by restarting the loop. - // We have to start a new transaction as a failed query will mark the current transaction as - // aborted in PostgreSQL and disallow further queries within it. - $this->rollback(); - $this->beginTransaction(); - continue; - } - - throw $e; - } - } - - return ''; - } - } - - /** - * Executes an application-level lock on the database. - * - * @return \PDOStatement The statement that needs to be executed later to release the lock - * - * @throws \DomainException When an unsupported PDO driver is used - * - * @todo implement missing advisory locks - * - for oci using DBMS_LOCK.REQUEST - * - for sqlsrv using sp_getapplock with LockOwner = Session - */ - private function doAdvisoryLock(#[\SensitiveParameter] string $sessionId): \PDOStatement - { - switch ($this->driver) { - case 'mysql': - // MySQL 5.7.5 and later enforces a maximum length on lock names of 64 characters. Previously, no limit was enforced. - $lockId = substr($sessionId, 0, 64); - // should we handle the return value? 0 on timeout, null on error - // we use a timeout of 50 seconds which is also the default for innodb_lock_wait_timeout - $stmt = $this->pdo->prepare('SELECT GET_LOCK(:key, 50)'); - $stmt->bindValue(':key', $lockId, \PDO::PARAM_STR); - $stmt->execute(); - - $releaseStmt = $this->pdo->prepare('DO RELEASE_LOCK(:key)'); - $releaseStmt->bindValue(':key', $lockId, \PDO::PARAM_STR); - - return $releaseStmt; - case 'pgsql': - // Obtaining an exclusive session level advisory lock requires an integer key. - // When session.sid_bits_per_character > 4, the session id can contain non-hex-characters. - // So we cannot just use hexdec(). - if (4 === \PHP_INT_SIZE) { - $sessionInt1 = $this->convertStringToInt($sessionId); - $sessionInt2 = $this->convertStringToInt(substr($sessionId, 4, 4)); - - $stmt = $this->pdo->prepare('SELECT pg_advisory_lock(:key1, :key2)'); - $stmt->bindValue(':key1', $sessionInt1, \PDO::PARAM_INT); - $stmt->bindValue(':key2', $sessionInt2, \PDO::PARAM_INT); - $stmt->execute(); - - $releaseStmt = $this->pdo->prepare('SELECT pg_advisory_unlock(:key1, :key2)'); - $releaseStmt->bindValue(':key1', $sessionInt1, \PDO::PARAM_INT); - $releaseStmt->bindValue(':key2', $sessionInt2, \PDO::PARAM_INT); - } else { - $sessionBigInt = $this->convertStringToInt($sessionId); - - $stmt = $this->pdo->prepare('SELECT pg_advisory_lock(:key)'); - $stmt->bindValue(':key', $sessionBigInt, \PDO::PARAM_INT); - $stmt->execute(); - - $releaseStmt = $this->pdo->prepare('SELECT pg_advisory_unlock(:key)'); - $releaseStmt->bindValue(':key', $sessionBigInt, \PDO::PARAM_INT); - } - - return $releaseStmt; - case 'sqlite': - throw new \DomainException('SQLite does not support advisory locks.'); - default: - throw new \DomainException(\sprintf('Advisory locks are currently not implemented for PDO driver "%s".', $this->driver)); - } - } - - /** - * Encodes the first 4 (when PHP_INT_SIZE == 4) or 8 characters of the string as an integer. - * - * Keep in mind, PHP integers are signed. - */ - private function convertStringToInt(string $string): int - { - if (4 === \PHP_INT_SIZE) { - return (\ord($string[3]) << 24) + (\ord($string[2]) << 16) + (\ord($string[1]) << 8) + \ord($string[0]); - } - - $int1 = (\ord($string[7]) << 24) + (\ord($string[6]) << 16) + (\ord($string[5]) << 8) + \ord($string[4]); - $int2 = (\ord($string[3]) << 24) + (\ord($string[2]) << 16) + (\ord($string[1]) << 8) + \ord($string[0]); - - return $int2 + ($int1 << 32); - } - - /** - * Return a locking or nonlocking SQL query to read session information. - * - * @throws \DomainException When an unsupported PDO driver is used - */ - private function getSelectSql(): string - { - if (self::LOCK_TRANSACTIONAL === $this->lockMode) { - $this->beginTransaction(); - - switch ($this->driver) { - case 'mysql': - case 'oci': - case 'pgsql': - return "SELECT $this->dataCol, $this->lifetimeCol FROM $this->table WHERE $this->idCol = :id FOR UPDATE"; - case 'sqlsrv': - return "SELECT $this->dataCol, $this->lifetimeCol FROM $this->table WITH (UPDLOCK, ROWLOCK) WHERE $this->idCol = :id"; - case 'sqlite': - // we already locked when starting transaction - break; - default: - throw new \DomainException(\sprintf('Transactional locks are currently not implemented for PDO driver "%s".', $this->driver)); - } - } - - return "SELECT $this->dataCol, $this->lifetimeCol FROM $this->table WHERE $this->idCol = :id"; - } - - /** - * Returns an insert statement supported by the database for writing session data. - */ - private function getInsertStatement(#[\SensitiveParameter] string $sessionId, string $sessionData, int $maxlifetime): \PDOStatement - { - switch ($this->driver) { - case 'oci': - $data = fopen('php://memory', 'r+'); - fwrite($data, $sessionData); - rewind($data); - $sql = "INSERT INTO $this->table ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (:id, EMPTY_BLOB(), :expiry, :time) RETURNING $this->dataCol into :data"; - break; - case 'sqlsrv': - $data = fopen('php://memory', 'r+'); - fwrite($data, $sessionData); - rewind($data); - $sql = "INSERT INTO $this->table ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (:id, :data, :expiry, :time)"; - break; - default: - $data = $sessionData; - $sql = "INSERT INTO $this->table ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (:id, :data, :expiry, :time)"; - break; - } - - $stmt = $this->pdo->prepare($sql); - $stmt->bindParam(':id', $sessionId, \PDO::PARAM_STR); - $stmt->bindParam(':data', $data, \PDO::PARAM_LOB); - $stmt->bindValue(':expiry', time() + $maxlifetime, \PDO::PARAM_INT); - $stmt->bindValue(':time', time(), \PDO::PARAM_INT); - - return $stmt; - } - - /** - * Returns an update statement supported by the database for writing session data. - */ - private function getUpdateStatement(#[\SensitiveParameter] string $sessionId, string $sessionData, int $maxlifetime): \PDOStatement - { - switch ($this->driver) { - case 'oci': - $data = fopen('php://memory', 'r+'); - fwrite($data, $sessionData); - rewind($data); - $sql = "UPDATE $this->table SET $this->dataCol = EMPTY_BLOB(), $this->lifetimeCol = :expiry, $this->timeCol = :time WHERE $this->idCol = :id RETURNING $this->dataCol into :data"; - break; - case 'sqlsrv': - $data = fopen('php://memory', 'r+'); - fwrite($data, $sessionData); - rewind($data); - $sql = "UPDATE $this->table SET $this->dataCol = :data, $this->lifetimeCol = :expiry, $this->timeCol = :time WHERE $this->idCol = :id"; - break; - default: - $data = $sessionData; - $sql = "UPDATE $this->table SET $this->dataCol = :data, $this->lifetimeCol = :expiry, $this->timeCol = :time WHERE $this->idCol = :id"; - break; - } - - $stmt = $this->pdo->prepare($sql); - $stmt->bindParam(':id', $sessionId, \PDO::PARAM_STR); - $stmt->bindParam(':data', $data, \PDO::PARAM_LOB); - $stmt->bindValue(':expiry', time() + $maxlifetime, \PDO::PARAM_INT); - $stmt->bindValue(':time', time(), \PDO::PARAM_INT); - - return $stmt; - } - - /** - * Returns a merge/upsert (i.e. insert or update) statement when supported by the database for writing session data. - */ - private function getMergeStatement(#[\SensitiveParameter] string $sessionId, string $data, int $maxlifetime): ?\PDOStatement - { - switch (true) { - case 'mysql' === $this->driver: - $mergeSql = "INSERT INTO $this->table ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (:id, :data, :expiry, :time) ". - "ON DUPLICATE KEY UPDATE $this->dataCol = VALUES($this->dataCol), $this->lifetimeCol = VALUES($this->lifetimeCol), $this->timeCol = VALUES($this->timeCol)"; - break; - case 'sqlsrv' === $this->driver && version_compare($this->pdo->getAttribute(\PDO::ATTR_SERVER_VERSION), '10', '>='): - // MERGE is only available since SQL Server 2008 and must be terminated by semicolon - // It also requires HOLDLOCK according to https://weblogs.sqlteam.com/dang/2009/01/31/upsert-race-condition-with-merge/ - $mergeSql = "MERGE INTO $this->table WITH (HOLDLOCK) USING (SELECT 1 AS dummy) AS src ON ($this->idCol = ?) ". - "WHEN NOT MATCHED THEN INSERT ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (?, ?, ?, ?) ". - "WHEN MATCHED THEN UPDATE SET $this->dataCol = ?, $this->lifetimeCol = ?, $this->timeCol = ?;"; - break; - case 'sqlite' === $this->driver: - $mergeSql = "INSERT OR REPLACE INTO $this->table ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (:id, :data, :expiry, :time)"; - break; - case 'pgsql' === $this->driver && version_compare($this->pdo->getAttribute(\PDO::ATTR_SERVER_VERSION), '9.5', '>='): - $mergeSql = "INSERT INTO $this->table ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (:id, :data, :expiry, :time) ". - "ON CONFLICT ($this->idCol) DO UPDATE SET ($this->dataCol, $this->lifetimeCol, $this->timeCol) = (EXCLUDED.$this->dataCol, EXCLUDED.$this->lifetimeCol, EXCLUDED.$this->timeCol)"; - break; - default: - // MERGE is not supported with LOBs: https://oracle.com/technetwork/articles/fuecks-lobs-095315.html - return null; - } - - $mergeStmt = $this->pdo->prepare($mergeSql); - - if ('sqlsrv' === $this->driver) { - $dataStream = fopen('php://memory', 'r+'); - fwrite($dataStream, $data); - rewind($dataStream); - - $mergeStmt->bindParam(1, $sessionId, \PDO::PARAM_STR); - $mergeStmt->bindParam(2, $sessionId, \PDO::PARAM_STR); - $mergeStmt->bindParam(3, $dataStream, \PDO::PARAM_LOB); - $mergeStmt->bindValue(4, time() + $maxlifetime, \PDO::PARAM_INT); - $mergeStmt->bindValue(5, time(), \PDO::PARAM_INT); - $mergeStmt->bindParam(6, $dataStream, \PDO::PARAM_LOB); - $mergeStmt->bindValue(7, time() + $maxlifetime, \PDO::PARAM_INT); - $mergeStmt->bindValue(8, time(), \PDO::PARAM_INT); - } else { - $mergeStmt->bindParam(':id', $sessionId, \PDO::PARAM_STR); - $mergeStmt->bindParam(':data', $data, \PDO::PARAM_LOB); - $mergeStmt->bindValue(':expiry', time() + $maxlifetime, \PDO::PARAM_INT); - $mergeStmt->bindValue(':time', time(), \PDO::PARAM_INT); - } - - return $mergeStmt; - } - - /** - * Return a PDO instance. - */ - protected function getConnection(): \PDO - { - if (!isset($this->pdo)) { - $this->connect($this->dsn ?: \ini_get('session.save_path')); - } - - return $this->pdo; - } -} diff --git a/plugins/vendor/symfony/http-foundation/Session/Storage/Handler/RedisSessionHandler.php b/plugins/vendor/symfony/http-foundation/Session/Storage/Handler/RedisSessionHandler.php deleted file mode 100644 index 78cd4e7c..00000000 --- a/plugins/vendor/symfony/http-foundation/Session/Storage/Handler/RedisSessionHandler.php +++ /dev/null @@ -1,103 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Storage\Handler; - -use Predis\Response\ErrorInterface; -use Relay\Relay; - -/** - * Redis based session storage handler based on the Redis class - * provided by the PHP redis extension. - * - * @author Dalibor Karlović - */ -class RedisSessionHandler extends AbstractSessionHandler -{ - /** - * Key prefix for shared environments. - */ - private string $prefix; - - /** - * Time to live in seconds. - */ - private int|\Closure|null $ttl; - - /** - * List of available options: - * * prefix: The prefix to use for the keys in order to avoid collision on the Redis server - * * ttl: The time to live in seconds. - * - * @throws \InvalidArgumentException When unsupported client or options are passed - */ - public function __construct( - private \Redis|Relay|\RedisArray|\RedisCluster|\Predis\ClientInterface $redis, - array $options = [], - ) { - if ($diff = array_diff(array_keys($options), ['prefix', 'ttl'])) { - throw new \InvalidArgumentException(\sprintf('The following options are not supported "%s".', implode(', ', $diff))); - } - - $this->prefix = $options['prefix'] ?? 'sf_s'; - $this->ttl = $options['ttl'] ?? null; - } - - protected function doRead(#[\SensitiveParameter] string $sessionId): string - { - return $this->redis->get($this->prefix.$sessionId) ?: ''; - } - - protected function doWrite(#[\SensitiveParameter] string $sessionId, string $data): bool - { - $ttl = ($this->ttl instanceof \Closure ? ($this->ttl)() : $this->ttl) ?? \ini_get('session.gc_maxlifetime'); - $result = $this->redis->setEx($this->prefix.$sessionId, (int) $ttl, $data); - - return $result && !$result instanceof ErrorInterface; - } - - protected function doDestroy(#[\SensitiveParameter] string $sessionId): bool - { - static $unlink = true; - - if ($unlink) { - try { - $unlink = false !== $this->redis->unlink($this->prefix.$sessionId); - } catch (\Throwable) { - $unlink = false; - } - } - - if (!$unlink) { - $this->redis->del($this->prefix.$sessionId); - } - - return true; - } - - #[\ReturnTypeWillChange] - public function close(): bool - { - return true; - } - - public function gc(int $maxlifetime): int|false - { - return 0; - } - - public function updateTimestamp(#[\SensitiveParameter] string $sessionId, string $data): bool - { - $ttl = ($this->ttl instanceof \Closure ? ($this->ttl)() : $this->ttl) ?? \ini_get('session.gc_maxlifetime'); - - return $this->redis->expire($this->prefix.$sessionId, (int) $ttl); - } -} diff --git a/plugins/vendor/symfony/http-foundation/Session/Storage/Handler/SessionHandlerFactory.php b/plugins/vendor/symfony/http-foundation/Session/Storage/Handler/SessionHandlerFactory.php deleted file mode 100644 index 25b1eb5e..00000000 --- a/plugins/vendor/symfony/http-foundation/Session/Storage/Handler/SessionHandlerFactory.php +++ /dev/null @@ -1,98 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Storage\Handler; - -use Doctrine\DBAL\Configuration; -use Doctrine\DBAL\DriverManager; -use Doctrine\DBAL\Schema\DefaultSchemaManagerFactory; -use Doctrine\DBAL\Tools\DsnParser; -use Relay\Relay; -use Symfony\Component\Cache\Adapter\AbstractAdapter; - -/** - * @author Nicolas Grekas - */ -class SessionHandlerFactory -{ - public static function createHandler(object|string $connection, array $options = []): AbstractSessionHandler - { - if ($query = \is_string($connection) ? parse_url($connection) : false) { - parse_str($query['query'] ?? '', $query); - - if (($options['ttl'] ?? null) instanceof \Closure) { - $query['ttl'] = $options['ttl']; - } - } - $options = ($query ?: []) + $options; - - switch (true) { - case $connection instanceof \Redis: - case $connection instanceof Relay: - case $connection instanceof \RedisArray: - case $connection instanceof \RedisCluster: - case $connection instanceof \Predis\ClientInterface: - return new RedisSessionHandler($connection); - - case $connection instanceof \Memcached: - return new MemcachedSessionHandler($connection); - - case $connection instanceof \PDO: - return new PdoSessionHandler($connection); - - case !\is_string($connection): - throw new \InvalidArgumentException(\sprintf('Unsupported Connection: "%s".', get_debug_type($connection))); - case str_starts_with($connection, 'file://'): - $savePath = substr($connection, 7); - - return new StrictSessionHandler(new NativeFileSessionHandler('' === $savePath ? null : $savePath)); - - case str_starts_with($connection, 'redis:'): - case str_starts_with($connection, 'rediss:'): - case str_starts_with($connection, 'valkey:'): - case str_starts_with($connection, 'valkeys:'): - case str_starts_with($connection, 'memcached:'): - if (!class_exists(AbstractAdapter::class)) { - throw new \InvalidArgumentException('Unsupported Redis or Memcached DSN. Try running "composer require symfony/cache".'); - } - $handlerClass = str_starts_with($connection, 'memcached:') ? MemcachedSessionHandler::class : RedisSessionHandler::class; - $connection = preg_replace('/([?&])prefix=[^&]*+&?/', '\1', $connection); - $connection = AbstractAdapter::createConnection($connection, ['lazy' => true]); - - return new $handlerClass($connection, array_intersect_key($options, ['prefix' => 1, 'ttl' => 1])); - - case str_starts_with($connection, 'pdo_oci://'): - if (!class_exists(DriverManager::class)) { - throw new \InvalidArgumentException('Unsupported PDO OCI DSN. Try running "composer require doctrine/dbal".'); - } - $connection[3] = '-'; - $params = (new DsnParser())->parse($connection); - $config = new Configuration(); - $config->setSchemaManagerFactory(new DefaultSchemaManagerFactory()); - - $connection = DriverManager::getConnection($params, $config)->getNativeConnection(); - // no break; - - case str_starts_with($connection, 'mssql://'): - case str_starts_with($connection, 'mysql://'): - case str_starts_with($connection, 'mysql2://'): - case str_starts_with($connection, 'pgsql://'): - case str_starts_with($connection, 'postgres://'): - case str_starts_with($connection, 'postgresql://'): - case str_starts_with($connection, 'sqlsrv://'): - case str_starts_with($connection, 'sqlite://'): - case str_starts_with($connection, 'sqlite3://'): - return new PdoSessionHandler($connection, $options); - } - - throw new \InvalidArgumentException(\sprintf('Unsupported Connection: "%s".', $connection)); - } -} diff --git a/plugins/vendor/symfony/http-foundation/Session/Storage/Handler/StrictSessionHandler.php b/plugins/vendor/symfony/http-foundation/Session/Storage/Handler/StrictSessionHandler.php deleted file mode 100644 index 0d84eac3..00000000 --- a/plugins/vendor/symfony/http-foundation/Session/Storage/Handler/StrictSessionHandler.php +++ /dev/null @@ -1,87 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Storage\Handler; - -/** - * Adds basic `SessionUpdateTimestampHandlerInterface` behaviors to another `SessionHandlerInterface`. - * - * @author Nicolas Grekas - */ -class StrictSessionHandler extends AbstractSessionHandler -{ - private bool $doDestroy; - - public function __construct( - private \SessionHandlerInterface $handler, - ) { - if ($handler instanceof \SessionUpdateTimestampHandlerInterface) { - throw new \LogicException(\sprintf('"%s" is already an instance of "SessionUpdateTimestampHandlerInterface", you cannot wrap it with "%s".', get_debug_type($handler), self::class)); - } - } - - /** - * Returns true if this handler wraps an internal PHP session save handler using \SessionHandler. - * - * @internal - */ - public function isWrapper(): bool - { - return $this->handler instanceof \SessionHandler; - } - - public function open(string $savePath, string $sessionName): bool - { - parent::open($savePath, $sessionName); - - return $this->handler->open($savePath, $sessionName); - } - - protected function doRead(#[\SensitiveParameter] string $sessionId): string - { - return $this->handler->read($sessionId); - } - - public function updateTimestamp(#[\SensitiveParameter] string $sessionId, string $data): bool - { - return $this->write($sessionId, $data); - } - - protected function doWrite(#[\SensitiveParameter] string $sessionId, string $data): bool - { - return $this->handler->write($sessionId, $data); - } - - public function destroy(#[\SensitiveParameter] string $sessionId): bool - { - $this->doDestroy = true; - $destroyed = parent::destroy($sessionId); - - return $this->doDestroy ? $this->doDestroy($sessionId) : $destroyed; - } - - protected function doDestroy(#[\SensitiveParameter] string $sessionId): bool - { - $this->doDestroy = false; - - return $this->handler->destroy($sessionId); - } - - public function close(): bool - { - return $this->handler->close(); - } - - public function gc(int $maxlifetime): int|false - { - return $this->handler->gc($maxlifetime); - } -} diff --git a/plugins/vendor/symfony/http-foundation/Session/Storage/MetadataBag.php b/plugins/vendor/symfony/http-foundation/Session/Storage/MetadataBag.php deleted file mode 100644 index 6e2ddaeb..00000000 --- a/plugins/vendor/symfony/http-foundation/Session/Storage/MetadataBag.php +++ /dev/null @@ -1,133 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Storage; - -use Symfony\Component\HttpFoundation\Session\SessionBagInterface; - -/** - * Metadata container. - * - * Adds metadata to the session. - * - * @author Drak - */ -class MetadataBag implements SessionBagInterface -{ - public const CREATED = 'c'; - public const UPDATED = 'u'; - public const LIFETIME = 'l'; - - protected array $meta = [self::CREATED => 0, self::UPDATED => 0, self::LIFETIME => 0]; - - private string $name = '__metadata'; - private int $lastUsed; - - /** - * @param string $storageKey The key used to store bag in the session - * @param int $updateThreshold The time to wait between two UPDATED updates - * @param int|null $cookieLifetime The configured cookie lifetime; null to read from php.ini - */ - public function __construct( - private string $storageKey = '_sf2_meta', - private int $updateThreshold = 0, - private ?int $cookieLifetime = null, - ) { - } - - public function initialize(array &$array): void - { - $this->meta = &$array; - - if (isset($array[self::CREATED])) { - $this->lastUsed = $this->meta[self::UPDATED]; - - $timeStamp = time(); - if ($timeStamp - $array[self::UPDATED] >= $this->updateThreshold) { - $this->meta[self::UPDATED] = $timeStamp; - } - } else { - $this->stampCreated(); - } - } - - /** - * Gets the lifetime that the session cookie was set with. - */ - public function getLifetime(): int - { - return $this->meta[self::LIFETIME]; - } - - /** - * Stamps a new session's metadata. - * - * @param int|null $lifetime Sets the cookie lifetime for the session cookie. A null value - * will leave the system settings unchanged, 0 sets the cookie - * to expire with browser session. Time is in seconds, and is - * not a Unix timestamp. - */ - public function stampNew(?int $lifetime = null): void - { - $this->stampCreated($lifetime); - } - - public function getStorageKey(): string - { - return $this->storageKey; - } - - /** - * Gets the created timestamp metadata. - * - * @return int Unix timestamp - */ - public function getCreated(): int - { - return $this->meta[self::CREATED]; - } - - /** - * Gets the last used metadata. - * - * @return int Unix timestamp - */ - public function getLastUsed(): int - { - return $this->lastUsed; - } - - public function clear(): mixed - { - // nothing to do - return null; - } - - public function getName(): string - { - return $this->name; - } - - /** - * Sets name. - */ - public function setName(string $name): void - { - $this->name = $name; - } - - private function stampCreated(?int $lifetime = null): void - { - $timeStamp = time(); - $this->meta[self::CREATED] = $this->meta[self::UPDATED] = $this->lastUsed = $timeStamp; - $this->meta[self::LIFETIME] = $lifetime ?? $this->cookieLifetime ?? (int) \ini_get('session.cookie_lifetime'); - } -} diff --git a/plugins/vendor/symfony/http-foundation/Session/Storage/MockArraySessionStorage.php b/plugins/vendor/symfony/http-foundation/Session/Storage/MockArraySessionStorage.php deleted file mode 100644 index a32a43d4..00000000 --- a/plugins/vendor/symfony/http-foundation/Session/Storage/MockArraySessionStorage.php +++ /dev/null @@ -1,188 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Storage; - -use Symfony\Component\HttpFoundation\Session\SessionBagInterface; - -/** - * MockArraySessionStorage mocks the session for unit tests. - * - * No PHP session is actually started since a session can be initialized - * and shutdown only once per PHP execution cycle. - * - * When doing functional testing, you should use MockFileSessionStorage instead. - * - * @author Fabien Potencier - * @author Bulat Shakirzyanov - * @author Drak - */ -class MockArraySessionStorage implements SessionStorageInterface -{ - protected string $id = ''; - protected bool $started = false; - protected bool $closed = false; - protected array $data = []; - protected MetadataBag $metadataBag; - - /** - * @var SessionBagInterface[] - */ - protected array $bags = []; - - public function __construct( - protected string $name = 'MOCKSESSID', - ?MetadataBag $metaBag = null, - ) { - $this->setMetadataBag($metaBag); - } - - public function setSessionData(array $array): void - { - $this->data = $array; - } - - public function start(): bool - { - if ($this->started) { - return true; - } - - if (!$this->id) { - $this->id = $this->generateId(); - } - - $this->loadSession(); - - return true; - } - - public function regenerate(bool $destroy = false, ?int $lifetime = null): bool - { - if (!$this->started) { - $this->start(); - } - - $this->metadataBag->stampNew($lifetime); - $this->id = $this->generateId(); - - return true; - } - - public function getId(): string - { - return $this->id; - } - - public function setId(string $id): void - { - if ($this->started) { - throw new \LogicException('Cannot set session ID after the session has started.'); - } - - $this->id = $id; - } - - public function getName(): string - { - return $this->name; - } - - public function setName(string $name): void - { - $this->name = $name; - } - - public function save(): void - { - if (!$this->started || $this->closed) { - throw new \RuntimeException('Trying to save a session that was not started yet or was already closed.'); - } - // nothing to do since we don't persist the session data - $this->closed = false; - $this->started = false; - } - - public function clear(): void - { - // clear out the bags - foreach ($this->bags as $bag) { - $bag->clear(); - } - - // clear out the session - $this->data = []; - - // reconnect the bags to the session - $this->loadSession(); - } - - public function registerBag(SessionBagInterface $bag): void - { - $this->bags[$bag->getName()] = $bag; - } - - public function getBag(string $name): SessionBagInterface - { - if (!isset($this->bags[$name])) { - throw new \InvalidArgumentException(\sprintf('The SessionBagInterface "%s" is not registered.', $name)); - } - - if (!$this->started) { - $this->start(); - } - - return $this->bags[$name]; - } - - public function isStarted(): bool - { - return $this->started; - } - - public function setMetadataBag(?MetadataBag $bag): void - { - $this->metadataBag = $bag ?? new MetadataBag(); - } - - /** - * Gets the MetadataBag. - */ - public function getMetadataBag(): MetadataBag - { - return $this->metadataBag; - } - - /** - * Generates a session ID. - * - * This doesn't need to be particularly cryptographically secure since this is just - * a mock. - */ - protected function generateId(): string - { - return bin2hex(random_bytes(16)); - } - - protected function loadSession(): void - { - $bags = array_merge($this->bags, [$this->metadataBag]); - - foreach ($bags as $bag) { - $key = $bag->getStorageKey(); - $this->data[$key] ??= []; - $bag->initialize($this->data[$key]); - } - - $this->started = true; - $this->closed = false; - } -} diff --git a/plugins/vendor/symfony/http-foundation/Session/Storage/MockFileSessionStorage.php b/plugins/vendor/symfony/http-foundation/Session/Storage/MockFileSessionStorage.php deleted file mode 100644 index d7a97939..00000000 --- a/plugins/vendor/symfony/http-foundation/Session/Storage/MockFileSessionStorage.php +++ /dev/null @@ -1,149 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Storage; - -/** - * MockFileSessionStorage is used to mock sessions for - * functional testing where you may need to persist session data - * across separate PHP processes. - * - * No PHP session is actually started since a session can be initialized - * and shutdown only once per PHP execution cycle and this class does - * not pollute any session related globals, including session_*() functions - * or session.* PHP ini directives. - * - * @author Drak - */ -class MockFileSessionStorage extends MockArraySessionStorage -{ - private string $savePath; - - /** - * @param string|null $savePath Path of directory to save session files - */ - public function __construct(?string $savePath = null, string $name = 'MOCKSESSID', ?MetadataBag $metaBag = null) - { - $savePath ??= sys_get_temp_dir(); - - if (!is_dir($savePath) && !@mkdir($savePath, 0o777, true) && !is_dir($savePath)) { - throw new \RuntimeException(\sprintf('Session Storage was not able to create directory "%s".', $savePath)); - } - - $this->savePath = $savePath; - - parent::__construct($name, $metaBag); - } - - public function start(): bool - { - if ($this->started) { - return true; - } - - if (!$this->id) { - $this->id = $this->generateId(); - } - - $this->read(); - - $this->started = true; - - return true; - } - - public function regenerate(bool $destroy = false, ?int $lifetime = null): bool - { - if (!$this->started) { - $this->start(); - } - - if ($destroy) { - $this->destroy(); - } - - return parent::regenerate($destroy, $lifetime); - } - - public function save(): void - { - if (!$this->started) { - throw new \RuntimeException('Trying to save a session that was not started yet or was already closed.'); - } - - $data = $this->data; - - foreach ($this->bags as $bag) { - if (empty($data[$key = $bag->getStorageKey()])) { - unset($data[$key]); - } - } - if ([$key = $this->metadataBag->getStorageKey()] === array_keys($data)) { - unset($data[$key]); - } - - try { - if ($data) { - $path = $this->getFilePath(); - $tmp = $path.bin2hex(random_bytes(6)); - file_put_contents($tmp, serialize($data)); - rename($tmp, $path); - } else { - $this->destroy(); - } - } finally { - $this->data = $data; - } - - // this is needed when the session object is reused across multiple requests - // in functional tests. - $this->started = false; - } - - /** - * Deletes a session from persistent storage. - * Deliberately leaves session data in memory intact. - */ - private function destroy(): void - { - set_error_handler(static function () {}); - try { - unlink($this->getFilePath()); - } finally { - restore_error_handler(); - } - } - - /** - * Calculate path to file. - */ - private function getFilePath(): string - { - return $this->savePath.'/'.$this->id.'.mocksess'; - } - - /** - * Reads session from storage and loads session. - */ - private function read(): void - { - set_error_handler(static function () {}); - try { - $data = file_get_contents($this->getFilePath()); - } finally { - restore_error_handler(); - } - - $this->data = $data ? unserialize($data) : []; - - $this->loadSession(); - } -} diff --git a/plugins/vendor/symfony/http-foundation/Session/Storage/MockFileSessionStorageFactory.php b/plugins/vendor/symfony/http-foundation/Session/Storage/MockFileSessionStorageFactory.php deleted file mode 100644 index 77ee7b65..00000000 --- a/plugins/vendor/symfony/http-foundation/Session/Storage/MockFileSessionStorageFactory.php +++ /dev/null @@ -1,38 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Storage; - -use Symfony\Component\HttpFoundation\Request; - -// Help opcache.preload discover always-needed symbols -class_exists(MockFileSessionStorage::class); - -/** - * @author Jérémy Derussé - */ -class MockFileSessionStorageFactory implements SessionStorageFactoryInterface -{ - /** - * @see MockFileSessionStorage constructor. - */ - public function __construct( - private ?string $savePath = null, - private string $name = 'MOCKSESSID', - private ?MetadataBag $metaBag = null, - ) { - } - - public function createStorage(?Request $request): SessionStorageInterface - { - return new MockFileSessionStorage($this->savePath, $this->name, $this->metaBag); - } -} diff --git a/plugins/vendor/symfony/http-foundation/Session/Storage/NativeSessionStorage.php b/plugins/vendor/symfony/http-foundation/Session/Storage/NativeSessionStorage.php deleted file mode 100644 index 5c085134..00000000 --- a/plugins/vendor/symfony/http-foundation/Session/Storage/NativeSessionStorage.php +++ /dev/null @@ -1,408 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Storage; - -use Symfony\Component\HttpFoundation\Session\SessionBagInterface; -use Symfony\Component\HttpFoundation\Session\Storage\Handler\StrictSessionHandler; -use Symfony\Component\HttpFoundation\Session\Storage\Proxy\AbstractProxy; -use Symfony\Component\HttpFoundation\Session\Storage\Proxy\SessionHandlerProxy; - -// Help opcache.preload discover always-needed symbols -class_exists(MetadataBag::class); -class_exists(StrictSessionHandler::class); -class_exists(SessionHandlerProxy::class); - -/** - * This provides a base class for session attribute storage. - * - * @author Drak - */ -class NativeSessionStorage implements SessionStorageInterface -{ - /** - * @var SessionBagInterface[] - */ - protected array $bags = []; - protected bool $started = false; - protected bool $closed = false; - protected AbstractProxy|\SessionHandlerInterface $saveHandler; - protected MetadataBag $metadataBag; - - /** - * Depending on how you want the storage driver to behave you probably - * want to override this constructor entirely. - * - * List of options for $options array with their defaults. - * - * @see https://php.net/session.configuration for options - * but we omit 'session.' from the beginning of the keys for convenience. - * - * ("auto_start", is not supported as it tells PHP to start a session before - * PHP starts to execute user-land code. Setting during runtime has no effect). - * - * cache_limiter, "" (use "0" to prevent headers from being sent entirely). - * cache_expire, "0" - * cookie_domain, "" - * cookie_httponly, "" - * cookie_lifetime, "0" - * cookie_path, "/" - * cookie_secure, "" - * cookie_samesite, null - * gc_divisor, "100" - * gc_maxlifetime, "1440" - * gc_probability, "1" - * lazy_write, "1" - * name, "PHPSESSID" - * referer_check, "" (deprecated since Symfony 7.2, to be removed in Symfony 8.0) - * serialize_handler, "php" - * use_strict_mode, "1" - * use_cookies, "1" - * use_only_cookies, "1" (deprecated since Symfony 7.2, to be removed in Symfony 8.0) - * use_trans_sid, "0" (deprecated since Symfony 7.2, to be removed in Symfony 8.0) - * sid_length, "32" (@deprecated since Symfony 7.2, to be removed in 8.0) - * sid_bits_per_character, "5" (@deprecated since Symfony 7.2, to be removed in 8.0) - * trans_sid_hosts, $_SERVER['HTTP_HOST'] (deprecated since Symfony 7.2, to be removed in Symfony 8.0) - * trans_sid_tags, "a=href,area=href,frame=src,form=" (deprecated since Symfony 7.2, to be removed in Symfony 8.0) - */ - public function __construct(array $options = [], AbstractProxy|\SessionHandlerInterface|null $handler = null, ?MetadataBag $metaBag = null) - { - if (!\extension_loaded('session')) { - throw new \LogicException('PHP extension "session" is required.'); - } - - $options += [ - 'cache_limiter' => '', - 'cache_expire' => 0, - 'use_cookies' => 1, - 'lazy_write' => 1, - 'use_strict_mode' => 1, - ]; - - session_register_shutdown(); - - $this->setMetadataBag($metaBag); - $this->setOptions($options); - $this->setSaveHandler($handler); - } - - /** - * Gets the save handler instance. - */ - public function getSaveHandler(): AbstractProxy|\SessionHandlerInterface - { - return $this->saveHandler; - } - - public function start(): bool - { - if ($this->started) { - return true; - } - - if (\PHP_SESSION_ACTIVE === session_status()) { - throw new \RuntimeException('Failed to start the session: already started by PHP.'); - } - - if (filter_var(\ini_get('session.use_cookies'), \FILTER_VALIDATE_BOOL) && headers_sent($file, $line)) { - throw new \RuntimeException(\sprintf('Failed to start the session because headers have already been sent by "%s" at line %d.', $file, $line)); - } - - $sessionId = $_COOKIE[session_name()] ?? null; - /* - * Explanation of the session ID regular expression: `/^[a-zA-Z0-9,-]{22,250}$/`. - * - * ---------- Part 1 - * - * The part `[a-zA-Z0-9,-]` is related to the PHP ini directive `session.sid_bits_per_character` defined as 6. - * See https://php.net/session.configuration#ini.session.sid-bits-per-character - * Allowed values are integers such as: - * - 4 for range `a-f0-9` - * - 5 for range `a-v0-9` (@deprecated since Symfony 7.2, it will default to 4 and the option will be ignored in Symfony 8.0) - * - 6 for range `a-zA-Z0-9,-` (@deprecated since Symfony 7.2, it will default to 4 and the option will be ignored in Symfony 8.0) - * - * ---------- Part 2 - * - * The part `{22,250}` is related to the PHP ini directive `session.sid_length`. - * See https://php.net/session.configuration#ini.session.sid-length - * Allowed values are integers between 22 and 256, but we use 250 for the max. - * - * Where does the 250 come from? - * - The length of Windows and Linux filenames is limited to 255 bytes. Then the max must not exceed 255. - * - The session filename prefix is `sess_`, a 5 bytes string. Then the max must not exceed 255 - 5 = 250. - * - * This is @deprecated since Symfony 7.2, the sid length will default to 32 and the option will be ignored in Symfony 8.0. - * - * ---------- Conclusion - * - * The parts 1 and 2 prevent the warning below: - * `PHP Warning: SessionHandler::read(): Session ID is too long or contains illegal characters. Only the A-Z, a-z, 0-9, "-", and "," characters are allowed.` - * - * The part 2 prevents the warning below: - * `PHP Warning: SessionHandler::read(): open(filepath, O_RDWR) failed: No such file or directory (2).` - */ - if ($sessionId && $this->saveHandler instanceof AbstractProxy && 'files' === $this->saveHandler->getSaveHandlerName() && !preg_match('/^[a-zA-Z0-9,-]{22,250}$/', $sessionId)) { - // the session ID in the header is invalid, create a new one - session_id(session_create_id()); - } - - // ok to try and start the session - if (!session_start()) { - throw new \RuntimeException('Failed to start the session.'); - } - - $this->loadSession(); - - return true; - } - - public function getId(): string - { - return $this->saveHandler->getId(); - } - - public function setId(string $id): void - { - $this->saveHandler->setId($id); - } - - public function getName(): string - { - return $this->saveHandler->getName(); - } - - public function setName(string $name): void - { - $this->saveHandler->setName($name); - } - - public function regenerate(bool $destroy = false, ?int $lifetime = null): bool - { - // Cannot regenerate the session ID for non-active sessions. - if (\PHP_SESSION_ACTIVE !== session_status()) { - return false; - } - - if (headers_sent()) { - return false; - } - - if (null !== $lifetime && $lifetime != \ini_get('session.cookie_lifetime')) { - $this->save(); - ini_set('session.cookie_lifetime', $lifetime); - $this->start(); - } - - if ($destroy) { - $this->metadataBag->stampNew(); - } - - return session_regenerate_id($destroy); - } - - public function save(): void - { - // Store a copy so we can restore the bags in case the session was not left empty - $session = $_SESSION; - - foreach ($this->bags as $bag) { - if (empty($_SESSION[$key = $bag->getStorageKey()])) { - unset($_SESSION[$key]); - } - } - if ($_SESSION && [$key = $this->metadataBag->getStorageKey()] === array_keys($_SESSION)) { - unset($_SESSION[$key]); - } - - // Register error handler to add information about the current save handler - $previousHandler = set_error_handler(function ($type, $msg, $file, $line) use (&$previousHandler) { - if (\E_WARNING === $type && str_starts_with($msg, 'session_write_close():')) { - $handler = $this->saveHandler instanceof SessionHandlerProxy ? $this->saveHandler->getHandler() : $this->saveHandler; - $msg = \sprintf('session_write_close(): Failed to write session data with "%s" handler', $handler::class); - } - - return $previousHandler ? $previousHandler($type, $msg, $file, $line) : false; - }); - - try { - session_write_close(); - } finally { - restore_error_handler(); - - // Restore only if not empty - if ($_SESSION) { - $_SESSION = $session; - } - } - - $this->closed = true; - $this->started = false; - } - - public function clear(): void - { - // clear out the bags - foreach ($this->bags as $bag) { - $bag->clear(); - } - - // clear out the session - $_SESSION = []; - - // reconnect the bags to the session - $this->loadSession(); - } - - public function registerBag(SessionBagInterface $bag): void - { - if ($this->started) { - throw new \LogicException('Cannot register a bag when the session is already started.'); - } - - $this->bags[$bag->getName()] = $bag; - } - - public function getBag(string $name): SessionBagInterface - { - if (!isset($this->bags[$name])) { - throw new \InvalidArgumentException(\sprintf('The SessionBagInterface "%s" is not registered.', $name)); - } - - if (!$this->started && $this->saveHandler->isActive()) { - $this->loadSession(); - } elseif (!$this->started) { - $this->start(); - } - - return $this->bags[$name]; - } - - public function setMetadataBag(?MetadataBag $metaBag): void - { - $this->metadataBag = $metaBag ?? new MetadataBag(); - } - - /** - * Gets the MetadataBag. - */ - public function getMetadataBag(): MetadataBag - { - return $this->metadataBag; - } - - public function isStarted(): bool - { - return $this->started; - } - - /** - * Sets session.* ini variables. - * - * For convenience we omit 'session.' from the beginning of the keys. - * Explicitly ignores other ini keys. - * - * @param array $options Session ini directives [key => value] - * - * @see https://php.net/session.configuration - */ - public function setOptions(array $options): void - { - if (headers_sent() || \PHP_SESSION_ACTIVE === session_status()) { - return; - } - - $validOptions = array_flip([ - 'cache_expire', 'cache_limiter', 'cookie_domain', 'cookie_httponly', - 'cookie_lifetime', 'cookie_path', 'cookie_secure', 'cookie_samesite', - 'gc_divisor', 'gc_maxlifetime', 'gc_probability', - 'lazy_write', 'name', 'referer_check', - 'serialize_handler', 'use_strict_mode', 'use_cookies', - 'use_only_cookies', 'use_trans_sid', - 'sid_length', 'sid_bits_per_character', 'trans_sid_hosts', 'trans_sid_tags', - ]); - - foreach ($options as $key => $value) { - if (\in_array($key, ['referer_check', 'use_only_cookies', 'use_trans_sid', 'trans_sid_hosts', 'trans_sid_tags', 'sid_length', 'sid_bits_per_character'], true)) { - trigger_deprecation('symfony/http-foundation', '7.2', 'NativeSessionStorage\'s "%s" option is deprecated and will be ignored in Symfony 8.0.', $key); - } - - if (isset($validOptions[$key])) { - if ('cookie_secure' === $key && 'auto' === $value) { - continue; - } - ini_set('session.'.$key, $value); - } - } - } - - /** - * Registers session save handler as a PHP session handler. - * - * To use internal PHP session save handlers, override this method using ini_set with - * session.save_handler and session.save_path e.g. - * - * ini_set('session.save_handler', 'files'); - * ini_set('session.save_path', '/tmp'); - * - * or pass in a \SessionHandler instance which configures session.save_handler in the - * constructor, for a template see NativeFileSessionHandler. - * - * @see https://php.net/session-set-save-handler - * @see https://php.net/sessionhandlerinterface - * @see https://php.net/sessionhandler - * - * @throws \InvalidArgumentException - */ - public function setSaveHandler(AbstractProxy|\SessionHandlerInterface|null $saveHandler): void - { - // Wrap $saveHandler in proxy and prevent double wrapping of proxy - if (!$saveHandler instanceof AbstractProxy && $saveHandler instanceof \SessionHandlerInterface) { - $saveHandler = new SessionHandlerProxy($saveHandler); - } elseif (!$saveHandler instanceof AbstractProxy) { - $saveHandler = new SessionHandlerProxy(new StrictSessionHandler(new \SessionHandler())); - } - $this->saveHandler = $saveHandler; - - if (headers_sent() || \PHP_SESSION_ACTIVE === session_status()) { - return; - } - - if ($this->saveHandler instanceof SessionHandlerProxy) { - session_set_save_handler($this->saveHandler, false); - } - } - - /** - * Load the session with attributes. - * - * After starting the session, PHP retrieves the session from whatever handlers - * are set to (either PHP's internal, or a custom save handler set with session_set_save_handler()). - * PHP takes the return value from the read() handler, unserializes it - * and populates $_SESSION with the result automatically. - */ - protected function loadSession(?array &$session = null): void - { - if (null === $session) { - $session = &$_SESSION; - } - - $bags = array_merge($this->bags, [$this->metadataBag]); - - foreach ($bags as $bag) { - $key = $bag->getStorageKey(); - $session[$key] = isset($session[$key]) && \is_array($session[$key]) ? $session[$key] : []; - $bag->initialize($session[$key]); - } - - $this->started = true; - $this->closed = false; - } -} diff --git a/plugins/vendor/symfony/http-foundation/Session/Storage/NativeSessionStorageFactory.php b/plugins/vendor/symfony/http-foundation/Session/Storage/NativeSessionStorageFactory.php deleted file mode 100644 index cb8c5353..00000000 --- a/plugins/vendor/symfony/http-foundation/Session/Storage/NativeSessionStorageFactory.php +++ /dev/null @@ -1,45 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Storage; - -use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\HttpFoundation\Session\Storage\Proxy\AbstractProxy; - -// Help opcache.preload discover always-needed symbols -class_exists(NativeSessionStorage::class); - -/** - * @author Jérémy Derussé - */ -class NativeSessionStorageFactory implements SessionStorageFactoryInterface -{ - /** - * @see NativeSessionStorage constructor. - */ - public function __construct( - private array $options = [], - private AbstractProxy|\SessionHandlerInterface|null $handler = null, - private ?MetadataBag $metaBag = null, - private bool $secure = false, - ) { - } - - public function createStorage(?Request $request): SessionStorageInterface - { - $storage = new NativeSessionStorage($this->options, $this->handler, $this->metaBag); - if ($this->secure && $request?->isSecure()) { - $storage->setOptions(['cookie_secure' => true]); - } - - return $storage; - } -} diff --git a/plugins/vendor/symfony/http-foundation/Session/Storage/PhpBridgeSessionStorage.php b/plugins/vendor/symfony/http-foundation/Session/Storage/PhpBridgeSessionStorage.php deleted file mode 100644 index 8a8c50c9..00000000 --- a/plugins/vendor/symfony/http-foundation/Session/Storage/PhpBridgeSessionStorage.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Storage; - -use Symfony\Component\HttpFoundation\Session\Storage\Proxy\AbstractProxy; - -/** - * Allows session to be started by PHP and managed by Symfony. - * - * @author Drak - */ -class PhpBridgeSessionStorage extends NativeSessionStorage -{ - public function __construct(AbstractProxy|\SessionHandlerInterface|null $handler = null, ?MetadataBag $metaBag = null) - { - if (!\extension_loaded('session')) { - throw new \LogicException('PHP extension "session" is required.'); - } - - $this->setMetadataBag($metaBag); - $this->setSaveHandler($handler); - } - - public function start(): bool - { - if ($this->started) { - return true; - } - - $this->loadSession(); - - return true; - } - - public function clear(): void - { - // clear out the bags and nothing else that may be set - // since the purpose of this driver is to share a handler - foreach ($this->bags as $bag) { - $bag->clear(); - } - - // reconnect the bags to the session - $this->loadSession(); - } -} diff --git a/plugins/vendor/symfony/http-foundation/Session/Storage/PhpBridgeSessionStorageFactory.php b/plugins/vendor/symfony/http-foundation/Session/Storage/PhpBridgeSessionStorageFactory.php deleted file mode 100644 index 357e5c71..00000000 --- a/plugins/vendor/symfony/http-foundation/Session/Storage/PhpBridgeSessionStorageFactory.php +++ /dev/null @@ -1,41 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Storage; - -use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\HttpFoundation\Session\Storage\Proxy\AbstractProxy; - -// Help opcache.preload discover always-needed symbols -class_exists(PhpBridgeSessionStorage::class); - -/** - * @author Jérémy Derussé - */ -class PhpBridgeSessionStorageFactory implements SessionStorageFactoryInterface -{ - public function __construct( - private AbstractProxy|\SessionHandlerInterface|null $handler = null, - private ?MetadataBag $metaBag = null, - private bool $secure = false, - ) { - } - - public function createStorage(?Request $request): SessionStorageInterface - { - $storage = new PhpBridgeSessionStorage($this->handler, $this->metaBag); - if ($this->secure && $request?->isSecure()) { - $storage->setOptions(['cookie_secure' => true]); - } - - return $storage; - } -} diff --git a/plugins/vendor/symfony/http-foundation/Session/Storage/Proxy/AbstractProxy.php b/plugins/vendor/symfony/http-foundation/Session/Storage/Proxy/AbstractProxy.php deleted file mode 100644 index c3a0278f..00000000 --- a/plugins/vendor/symfony/http-foundation/Session/Storage/Proxy/AbstractProxy.php +++ /dev/null @@ -1,98 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Storage\Proxy; - -/** - * @author Drak - */ -abstract class AbstractProxy -{ - protected bool $wrapper = false; - - protected ?string $saveHandlerName = null; - - /** - * Gets the session.save_handler name. - */ - public function getSaveHandlerName(): ?string - { - return $this->saveHandlerName; - } - - /** - * Is this proxy handler and instance of \SessionHandlerInterface. - */ - public function isSessionHandlerInterface(): bool - { - return $this instanceof \SessionHandlerInterface; - } - - /** - * Returns true if this handler wraps an internal PHP session save handler using \SessionHandler. - */ - public function isWrapper(): bool - { - return $this->wrapper; - } - - /** - * Has a session started? - */ - public function isActive(): bool - { - return \PHP_SESSION_ACTIVE === session_status(); - } - - /** - * Gets the session ID. - */ - public function getId(): string - { - return session_id(); - } - - /** - * Sets the session ID. - * - * @throws \LogicException - */ - public function setId(string $id): void - { - if ($this->isActive()) { - throw new \LogicException('Cannot change the ID of an active session.'); - } - - session_id($id); - } - - /** - * Gets the session name. - */ - public function getName(): string - { - return session_name(); - } - - /** - * Sets the session name. - * - * @throws \LogicException - */ - public function setName(string $name): void - { - if ($this->isActive()) { - throw new \LogicException('Cannot change the name of an active session.'); - } - - session_name($name); - } -} diff --git a/plugins/vendor/symfony/http-foundation/Session/Storage/Proxy/SessionHandlerProxy.php b/plugins/vendor/symfony/http-foundation/Session/Storage/Proxy/SessionHandlerProxy.php deleted file mode 100644 index 0316362f..00000000 --- a/plugins/vendor/symfony/http-foundation/Session/Storage/Proxy/SessionHandlerProxy.php +++ /dev/null @@ -1,74 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Storage\Proxy; - -use Symfony\Component\HttpFoundation\Session\Storage\Handler\StrictSessionHandler; - -/** - * @author Drak - */ -class SessionHandlerProxy extends AbstractProxy implements \SessionHandlerInterface, \SessionUpdateTimestampHandlerInterface -{ - public function __construct( - protected \SessionHandlerInterface $handler, - ) { - $this->wrapper = $handler instanceof \SessionHandler; - $this->saveHandlerName = $this->wrapper || ($handler instanceof StrictSessionHandler && $handler->isWrapper()) ? \ini_get('session.save_handler') : 'user'; - } - - public function getHandler(): \SessionHandlerInterface - { - return $this->handler; - } - - // \SessionHandlerInterface - - public function open(string $savePath, string $sessionName): bool - { - return $this->handler->open($savePath, $sessionName); - } - - public function close(): bool - { - return $this->handler->close(); - } - - public function read(#[\SensitiveParameter] string $sessionId): string|false - { - return $this->handler->read($sessionId); - } - - public function write(#[\SensitiveParameter] string $sessionId, string $data): bool - { - return $this->handler->write($sessionId, $data); - } - - public function destroy(#[\SensitiveParameter] string $sessionId): bool - { - return $this->handler->destroy($sessionId); - } - - public function gc(int $maxlifetime): int|false - { - return $this->handler->gc($maxlifetime); - } - - public function validateId(#[\SensitiveParameter] string $sessionId): bool - { - return !$this->handler instanceof \SessionUpdateTimestampHandlerInterface || $this->handler->validateId($sessionId); - } - - public function updateTimestamp(#[\SensitiveParameter] string $sessionId, string $data): bool - { - return $this->handler instanceof \SessionUpdateTimestampHandlerInterface ? $this->handler->updateTimestamp($sessionId, $data) : $this->write($sessionId, $data); - } -} diff --git a/plugins/vendor/symfony/http-foundation/Session/Storage/SessionStorageFactoryInterface.php b/plugins/vendor/symfony/http-foundation/Session/Storage/SessionStorageFactoryInterface.php deleted file mode 100644 index d03f0da4..00000000 --- a/plugins/vendor/symfony/http-foundation/Session/Storage/SessionStorageFactoryInterface.php +++ /dev/null @@ -1,25 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Storage; - -use Symfony\Component\HttpFoundation\Request; - -/** - * @author Jérémy Derussé - */ -interface SessionStorageFactoryInterface -{ - /** - * Creates a new instance of SessionStorageInterface. - */ - public function createStorage(?Request $request): SessionStorageInterface; -} diff --git a/plugins/vendor/symfony/http-foundation/Session/Storage/SessionStorageInterface.php b/plugins/vendor/symfony/http-foundation/Session/Storage/SessionStorageInterface.php deleted file mode 100644 index c51850de..00000000 --- a/plugins/vendor/symfony/http-foundation/Session/Storage/SessionStorageInterface.php +++ /dev/null @@ -1,116 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Storage; - -use Symfony\Component\HttpFoundation\Session\SessionBagInterface; - -/** - * StorageInterface. - * - * @author Fabien Potencier - * @author Drak - */ -interface SessionStorageInterface -{ - /** - * Starts the session. - * - * @throws \RuntimeException if something goes wrong starting the session - */ - public function start(): bool; - - /** - * Checks if the session is started. - */ - public function isStarted(): bool; - - /** - * Returns the session ID. - */ - public function getId(): string; - - /** - * Sets the session ID. - */ - public function setId(string $id): void; - - /** - * Returns the session name. - */ - public function getName(): string; - - /** - * Sets the session name. - */ - public function setName(string $name): void; - - /** - * Regenerates id that represents this storage. - * - * This method must invoke session_regenerate_id($destroy) unless - * this interface is used for a storage object designed for unit - * or functional testing where a real PHP session would interfere - * with testing. - * - * Note regenerate+destroy should not clear the session data in memory - * only delete the session data from persistent storage. - * - * Care: When regenerating the session ID no locking is involved in PHP's - * session design. See https://bugs.php.net/61470 for a discussion. - * So you must make sure the regenerated session is saved BEFORE sending the - * headers with the new ID. Symfony's HttpKernel offers a listener for this. - * See Symfony\Component\HttpKernel\EventListener\SaveSessionListener. - * Otherwise session data could get lost again for concurrent requests with the - * new ID. One result could be that you get logged out after just logging in. - * - * @param bool $destroy Destroy session when regenerating? - * @param int|null $lifetime Sets the cookie lifetime for the session cookie. A null value - * will leave the system settings unchanged, 0 sets the cookie - * to expire with browser session. Time is in seconds, and is - * not a Unix timestamp. - * - * @throws \RuntimeException If an error occurs while regenerating this storage - */ - public function regenerate(bool $destroy = false, ?int $lifetime = null): bool; - - /** - * Force the session to be saved and closed. - * - * This method must invoke session_write_close() unless this interface is - * used for a storage object design for unit or functional testing where - * a real PHP session would interfere with testing, in which case - * it should actually persist the session data if required. - * - * @throws \RuntimeException if the session is saved without being started, or if the session - * is already closed - */ - public function save(): void; - - /** - * Clear all session data in memory. - */ - public function clear(): void; - - /** - * Gets a SessionBagInterface by name. - * - * @throws \InvalidArgumentException If the bag does not exist - */ - public function getBag(string $name): SessionBagInterface; - - /** - * Registers a SessionBagInterface for use. - */ - public function registerBag(SessionBagInterface $bag): void; - - public function getMetadataBag(): MetadataBag; -} diff --git a/plugins/vendor/symfony/http-foundation/StreamedJsonResponse.php b/plugins/vendor/symfony/http-foundation/StreamedJsonResponse.php deleted file mode 100644 index bb8c0099..00000000 --- a/plugins/vendor/symfony/http-foundation/StreamedJsonResponse.php +++ /dev/null @@ -1,162 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation; - -/** - * StreamedJsonResponse represents a streamed HTTP response for JSON. - * - * A StreamedJsonResponse uses a structure and generics to create an - * efficient resource-saving JSON response. - * - * It is recommended to use flush() function after a specific number of items to directly stream the data. - * - * @see flush() - * - * @author Alexander Schranz - * - * Example usage: - * - * function loadArticles(): \Generator - * // some streamed loading - * yield ['title' => 'Article 1']; - * yield ['title' => 'Article 2']; - * yield ['title' => 'Article 3']; - * // recommended to use flush() after every specific number of items - * }), - * - * $response = new StreamedJsonResponse( - * // json structure with generators in which will be streamed - * [ - * '_embedded' => [ - * 'articles' => loadArticles(), // any generator which you want to stream as list of data - * ], - * ], - * ); - */ -class StreamedJsonResponse extends StreamedResponse -{ - private const PLACEHOLDER = '__symfony_json__'; - - /** - * @param mixed[] $data JSON Data containing PHP generators which will be streamed as list of data or a Generator - * @param int $status The HTTP status code (200 "OK" by default) - * @param array $headers An array of HTTP headers - * @param int $encodingOptions Flags for the json_encode() function - */ - public function __construct( - private readonly iterable $data, - int $status = 200, - array $headers = [], - private int $encodingOptions = JsonResponse::DEFAULT_ENCODING_OPTIONS, - ) { - parent::__construct($this->stream(...), $status, $headers); - - if (!$this->headers->get('Content-Type')) { - $this->headers->set('Content-Type', 'application/json'); - } - } - - private function stream(): void - { - $jsonEncodingOptions = \JSON_THROW_ON_ERROR | $this->encodingOptions; - $keyEncodingOptions = $jsonEncodingOptions & ~\JSON_NUMERIC_CHECK; - - $this->streamData($this->data, $jsonEncodingOptions, $keyEncodingOptions); - } - - private function streamData(mixed $data, int $jsonEncodingOptions, int $keyEncodingOptions): void - { - if (\is_array($data)) { - $this->streamArray($data, $jsonEncodingOptions, $keyEncodingOptions); - - return; - } - - if (is_iterable($data) && !$data instanceof \JsonSerializable) { - $this->streamIterable($data, $jsonEncodingOptions, $keyEncodingOptions); - - return; - } - - echo json_encode($data, $jsonEncodingOptions); - } - - private function streamArray(array $data, int $jsonEncodingOptions, int $keyEncodingOptions): void - { - $generators = []; - - array_walk_recursive($data, static function (&$item, $key) use (&$generators) { - if (self::PLACEHOLDER === $key) { - // if the placeholder is already in the structure it should be replaced with a new one that explode - // works like expected for the structure - $generators[] = $key; - } - - // generators should be used but for better DX all kind of Traversable and objects are supported - if (\is_object($item)) { - $generators[] = $item; - $item = self::PLACEHOLDER; - } elseif (self::PLACEHOLDER === $item) { - // if the placeholder is already in the structure it should be replaced with a new one that explode - // works like expected for the structure - $generators[] = $item; - } - }); - - $jsonParts = explode('"'.self::PLACEHOLDER.'"', json_encode($data, $jsonEncodingOptions)); - - foreach ($generators as $index => $generator) { - // send first and between parts of the structure - echo $jsonParts[$index]; - - $this->streamData($generator, $jsonEncodingOptions, $keyEncodingOptions); - } - - // send last part of the structure - echo $jsonParts[array_key_last($jsonParts)]; - } - - private function streamIterable(iterable $iterable, int $jsonEncodingOptions, int $keyEncodingOptions): void - { - $isFirstItem = true; - $startTag = '['; - - foreach ($iterable as $key => $item) { - if ($isFirstItem) { - $isFirstItem = false; - // depending on the first elements key the generator is detected as a list or map - // we can not check for a whole list or map because that would hurt the performance - // of the streamed response which is the main goal of this response class - if (0 !== $key) { - $startTag = '{'; - } - - echo $startTag; - } else { - // if not first element of the generic, a separator is required between the elements - echo ','; - } - - if ('{' === $startTag) { - echo json_encode((string) $key, $keyEncodingOptions).':'; - } - - $this->streamData($item, $jsonEncodingOptions, $keyEncodingOptions); - } - - if ($isFirstItem) { // indicates that the generator was empty - echo '['; - } - - echo '[' === $startTag ? ']' : '}'; - } -} diff --git a/plugins/vendor/symfony/http-foundation/StreamedResponse.php b/plugins/vendor/symfony/http-foundation/StreamedResponse.php deleted file mode 100644 index 4e755a7c..00000000 --- a/plugins/vendor/symfony/http-foundation/StreamedResponse.php +++ /dev/null @@ -1,150 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation; - -/** - * StreamedResponse represents a streamed HTTP response. - * - * A StreamedResponse uses a callback or an iterable of strings for its content. - * - * The callback should use the standard PHP functions like echo - * to stream the response back to the client. The flush() function - * can also be used if needed. - * - * @see flush() - * - * @author Fabien Potencier - */ -class StreamedResponse extends Response -{ - protected ?\Closure $callback = null; - protected bool $streamed = false; - - private bool $headersSent = false; - - /** - * @param callable|iterable|null $callbackOrChunks - * @param int $status The HTTP status code (200 "OK" by default) - */ - public function __construct(callable|iterable|null $callbackOrChunks = null, int $status = 200, array $headers = []) - { - parent::__construct(null, $status, $headers); - - if (\is_callable($callbackOrChunks)) { - $this->setCallback($callbackOrChunks); - } elseif ($callbackOrChunks) { - $this->setChunks($callbackOrChunks); - } - $this->streamed = false; - $this->headersSent = false; - } - - /** - * @param iterable $chunks - */ - public function setChunks(iterable $chunks): static - { - $this->callback = static function () use ($chunks): void { - foreach ($chunks as $chunk) { - echo $chunk; - @ob_flush(); - flush(); - } - }; - - return $this; - } - - /** - * Sets the PHP callback associated with this Response. - * - * @return $this - */ - public function setCallback(callable $callback): static - { - $this->callback = $callback(...); - - return $this; - } - - public function getCallback(): ?\Closure - { - if (!isset($this->callback)) { - return null; - } - - return ($this->callback)(...); - } - - /** - * This method only sends the headers once. - * - * @param positive-int|null $statusCode The status code to use, override the statusCode property if set and not null - * - * @return $this - */ - public function sendHeaders(?int $statusCode = null): static - { - if ($this->headersSent) { - return $this; - } - - if ($statusCode < 100 || $statusCode >= 200) { - $this->headersSent = true; - } - - return parent::sendHeaders($statusCode); - } - - /** - * This method only sends the content once. - * - * @return $this - */ - public function sendContent(): static - { - if ($this->streamed) { - return $this; - } - - $this->streamed = true; - - if (!isset($this->callback)) { - throw new \LogicException('The Response callback must be set.'); - } - - ($this->callback)(); - - return $this; - } - - /** - * @return $this - * - * @throws \LogicException when the content is not null - */ - public function setContent(?string $content): static - { - if (null !== $content) { - throw new \LogicException('The content cannot be set on a StreamedResponse instance.'); - } - - $this->streamed = true; - - return $this; - } - - public function getContent(): string|false - { - return false; - } -} diff --git a/plugins/vendor/symfony/http-foundation/Test/Constraint/RequestAttributeValueSame.php b/plugins/vendor/symfony/http-foundation/Test/Constraint/RequestAttributeValueSame.php deleted file mode 100644 index c570848f..00000000 --- a/plugins/vendor/symfony/http-foundation/Test/Constraint/RequestAttributeValueSame.php +++ /dev/null @@ -1,45 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Test\Constraint; - -use PHPUnit\Framework\Constraint\Constraint; -use Symfony\Component\HttpFoundation\Request; - -final class RequestAttributeValueSame extends Constraint -{ - public function __construct( - private string $name, - private string $value, - ) { - } - - public function toString(): string - { - return \sprintf('has attribute "%s" with value "%s"', $this->name, $this->value); - } - - /** - * @param Request $request - */ - protected function matches($request): bool - { - return $this->value === $request->attributes->get($this->name); - } - - /** - * @param Request $request - */ - protected function failureDescription($request): string - { - return 'the Request '.$this->toString(); - } -} diff --git a/plugins/vendor/symfony/http-foundation/Test/Constraint/ResponseCookieValueSame.php b/plugins/vendor/symfony/http-foundation/Test/Constraint/ResponseCookieValueSame.php deleted file mode 100644 index dbf9add6..00000000 --- a/plugins/vendor/symfony/http-foundation/Test/Constraint/ResponseCookieValueSame.php +++ /dev/null @@ -1,70 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Test\Constraint; - -use PHPUnit\Framework\Constraint\Constraint; -use Symfony\Component\HttpFoundation\Cookie; -use Symfony\Component\HttpFoundation\Response; - -final class ResponseCookieValueSame extends Constraint -{ - public function __construct( - private string $name, - private string $value, - private string $path = '/', - private ?string $domain = null, - ) { - } - - public function toString(): string - { - $str = \sprintf('has cookie "%s"', $this->name); - if ('/' !== $this->path) { - $str .= \sprintf(' with path "%s"', $this->path); - } - if ($this->domain) { - $str .= \sprintf(' for domain "%s"', $this->domain); - } - - return $str.\sprintf(' with value "%s"', $this->value); - } - - /** - * @param Response $response - */ - protected function matches($response): bool - { - $cookie = $this->getCookie($response); - if (!$cookie) { - return false; - } - - return $this->value === (string) $cookie->getValue(); - } - - /** - * @param Response $response - */ - protected function failureDescription($response): string - { - return 'the Response '.$this->toString(); - } - - protected function getCookie(Response $response): ?Cookie - { - $cookies = $response->headers->getCookies(); - - $filteredCookies = array_filter($cookies, fn (Cookie $cookie) => $cookie->getName() === $this->name && $cookie->getPath() === $this->path && $cookie->getDomain() === $this->domain); - - return reset($filteredCookies) ?: null; - } -} diff --git a/plugins/vendor/symfony/http-foundation/Test/Constraint/ResponseFormatSame.php b/plugins/vendor/symfony/http-foundation/Test/Constraint/ResponseFormatSame.php deleted file mode 100644 index cc3655ae..00000000 --- a/plugins/vendor/symfony/http-foundation/Test/Constraint/ResponseFormatSame.php +++ /dev/null @@ -1,60 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Test\Constraint; - -use PHPUnit\Framework\Constraint\Constraint; -use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\HttpFoundation\Response; - -/** - * Asserts that the response is in the given format. - * - * @author Kévin Dunglas - */ -final class ResponseFormatSame extends Constraint -{ - public function __construct( - private Request $request, - private ?string $format, - private readonly bool $verbose = true, - ) { - } - - public function toString(): string - { - return 'format is '.($this->format ?? 'null'); - } - - /** - * @param Response $response - */ - protected function matches($response): bool - { - return $this->format === $this->request->getFormat($response->headers->get('Content-Type')); - } - - /** - * @param Response $response - */ - protected function failureDescription($response): string - { - return 'the Response '.$this->toString(); - } - - /** - * @param Response $response - */ - protected function additionalFailureDescription($response): string - { - return $this->verbose ? (string) $response : explode("\r\n\r\n", (string) $response)[0]; - } -} diff --git a/plugins/vendor/symfony/http-foundation/Test/Constraint/ResponseHasCookie.php b/plugins/vendor/symfony/http-foundation/Test/Constraint/ResponseHasCookie.php deleted file mode 100644 index 0bc58036..00000000 --- a/plugins/vendor/symfony/http-foundation/Test/Constraint/ResponseHasCookie.php +++ /dev/null @@ -1,64 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Test\Constraint; - -use PHPUnit\Framework\Constraint\Constraint; -use Symfony\Component\HttpFoundation\Cookie; -use Symfony\Component\HttpFoundation\Response; - -final class ResponseHasCookie extends Constraint -{ - public function __construct( - private string $name, - private string $path = '/', - private ?string $domain = null, - ) { - } - - public function toString(): string - { - $str = \sprintf('has cookie "%s"', $this->name); - if ('/' !== $this->path) { - $str .= \sprintf(' with path "%s"', $this->path); - } - if ($this->domain) { - $str .= \sprintf(' for domain "%s"', $this->domain); - } - - return $str; - } - - /** - * @param Response $response - */ - protected function matches($response): bool - { - return null !== $this->getCookie($response); - } - - /** - * @param Response $response - */ - protected function failureDescription($response): string - { - return 'the Response '.$this->toString(); - } - - private function getCookie(Response $response): ?Cookie - { - $cookies = $response->headers->getCookies(); - - $filteredCookies = array_filter($cookies, fn (Cookie $cookie) => $cookie->getName() === $this->name && $cookie->getPath() === $this->path && $cookie->getDomain() === $this->domain); - - return reset($filteredCookies) ?: null; - } -} diff --git a/plugins/vendor/symfony/http-foundation/Test/Constraint/ResponseHasHeader.php b/plugins/vendor/symfony/http-foundation/Test/Constraint/ResponseHasHeader.php deleted file mode 100644 index 52fd3c18..00000000 --- a/plugins/vendor/symfony/http-foundation/Test/Constraint/ResponseHasHeader.php +++ /dev/null @@ -1,44 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Test\Constraint; - -use PHPUnit\Framework\Constraint\Constraint; -use Symfony\Component\HttpFoundation\Response; - -final class ResponseHasHeader extends Constraint -{ - public function __construct( - private string $headerName, - ) { - } - - public function toString(): string - { - return \sprintf('has header "%s"', $this->headerName); - } - - /** - * @param Response $response - */ - protected function matches($response): bool - { - return $response->headers->has($this->headerName); - } - - /** - * @param Response $response - */ - protected function failureDescription($response): string - { - return 'the Response '.$this->toString(); - } -} diff --git a/plugins/vendor/symfony/http-foundation/Test/Constraint/ResponseHeaderLocationSame.php b/plugins/vendor/symfony/http-foundation/Test/Constraint/ResponseHeaderLocationSame.php deleted file mode 100644 index 833ffd9f..00000000 --- a/plugins/vendor/symfony/http-foundation/Test/Constraint/ResponseHeaderLocationSame.php +++ /dev/null @@ -1,65 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Test\Constraint; - -use PHPUnit\Framework\Constraint\Constraint; -use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\HttpFoundation\Response; - -final class ResponseHeaderLocationSame extends Constraint -{ - public function __construct(private Request $request, private string $expectedValue) - { - } - - public function toString(): string - { - return \sprintf('has header "Location" matching "%s"', $this->expectedValue); - } - - protected function matches($other): bool - { - if (!$other instanceof Response) { - return false; - } - - $location = $other->headers->get('Location'); - - if (null === $location) { - return false; - } - - return $this->toFullUrl($this->expectedValue) === $this->toFullUrl($location); - } - - protected function failureDescription($other): string - { - return 'the Response '.$this->toString(); - } - - private function toFullUrl(string $url): string - { - if (null === parse_url($url, \PHP_URL_PATH)) { - $url .= '/'; - } - - if (str_starts_with($url, '//')) { - return \sprintf('%s:%s', $this->request->getScheme(), $url); - } - - if (str_starts_with($url, '/')) { - return $this->request->getSchemeAndHttpHost().$url; - } - - return $url; - } -} diff --git a/plugins/vendor/symfony/http-foundation/Test/Constraint/ResponseHeaderSame.php b/plugins/vendor/symfony/http-foundation/Test/Constraint/ResponseHeaderSame.php deleted file mode 100644 index f2ae27f5..00000000 --- a/plugins/vendor/symfony/http-foundation/Test/Constraint/ResponseHeaderSame.php +++ /dev/null @@ -1,45 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Test\Constraint; - -use PHPUnit\Framework\Constraint\Constraint; -use Symfony\Component\HttpFoundation\Response; - -final class ResponseHeaderSame extends Constraint -{ - public function __construct( - private string $headerName, - private string $expectedValue, - ) { - } - - public function toString(): string - { - return \sprintf('has header "%s" with value "%s"', $this->headerName, $this->expectedValue); - } - - /** - * @param Response $response - */ - protected function matches($response): bool - { - return $this->expectedValue === $response->headers->get($this->headerName, null); - } - - /** - * @param Response $response - */ - protected function failureDescription($response): string - { - return 'the Response '.$this->toString(); - } -} diff --git a/plugins/vendor/symfony/http-foundation/Test/Constraint/ResponseIsRedirected.php b/plugins/vendor/symfony/http-foundation/Test/Constraint/ResponseIsRedirected.php deleted file mode 100644 index b7ae15e7..00000000 --- a/plugins/vendor/symfony/http-foundation/Test/Constraint/ResponseIsRedirected.php +++ /dev/null @@ -1,54 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Test\Constraint; - -use PHPUnit\Framework\Constraint\Constraint; -use Symfony\Component\HttpFoundation\Response; - -final class ResponseIsRedirected extends Constraint -{ - /** - * @param bool $verbose If true, the entire response is printed on failure. If false, the response body is omitted. - */ - public function __construct(private readonly bool $verbose = true) - { - } - - public function toString(): string - { - return 'is redirected'; - } - - /** - * @param Response $response - */ - protected function matches($response): bool - { - return $response->isRedirect(); - } - - /** - * @param Response $response - */ - protected function failureDescription($response): string - { - return 'the Response '.$this->toString(); - } - - /** - * @param Response $response - */ - protected function additionalFailureDescription($response): string - { - return $this->verbose ? (string) $response : explode("\r\n\r\n", (string) $response)[0]; - } -} diff --git a/plugins/vendor/symfony/http-foundation/Test/Constraint/ResponseIsSuccessful.php b/plugins/vendor/symfony/http-foundation/Test/Constraint/ResponseIsSuccessful.php deleted file mode 100644 index 94a65eda..00000000 --- a/plugins/vendor/symfony/http-foundation/Test/Constraint/ResponseIsSuccessful.php +++ /dev/null @@ -1,54 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Test\Constraint; - -use PHPUnit\Framework\Constraint\Constraint; -use Symfony\Component\HttpFoundation\Response; - -final class ResponseIsSuccessful extends Constraint -{ - /** - * @param bool $verbose If true, the entire response is printed on failure. If false, the response body is omitted. - */ - public function __construct(private readonly bool $verbose = true) - { - } - - public function toString(): string - { - return 'is successful'; - } - - /** - * @param Response $response - */ - protected function matches($response): bool - { - return $response->isSuccessful(); - } - - /** - * @param Response $response - */ - protected function failureDescription($response): string - { - return 'the Response '.$this->toString(); - } - - /** - * @param Response $response - */ - protected function additionalFailureDescription($response): string - { - return $this->verbose ? (string) $response : explode("\r\n\r\n", (string) $response)[0]; - } -} diff --git a/plugins/vendor/symfony/http-foundation/Test/Constraint/ResponseIsUnprocessable.php b/plugins/vendor/symfony/http-foundation/Test/Constraint/ResponseIsUnprocessable.php deleted file mode 100644 index 799d5583..00000000 --- a/plugins/vendor/symfony/http-foundation/Test/Constraint/ResponseIsUnprocessable.php +++ /dev/null @@ -1,54 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Test\Constraint; - -use PHPUnit\Framework\Constraint\Constraint; -use Symfony\Component\HttpFoundation\Response; - -final class ResponseIsUnprocessable extends Constraint -{ - /** - * @param bool $verbose If true, the entire response is printed on failure. If false, the response body is omitted. - */ - public function __construct(private readonly bool $verbose = true) - { - } - - public function toString(): string - { - return 'is unprocessable'; - } - - /** - * @param Response $other - */ - protected function matches($other): bool - { - return Response::HTTP_UNPROCESSABLE_ENTITY === $other->getStatusCode(); - } - - /** - * @param Response $other - */ - protected function failureDescription($other): string - { - return 'the Response '.$this->toString(); - } - - /** - * @param Response $response - */ - protected function additionalFailureDescription($response): string - { - return $this->verbose ? (string) $response : explode("\r\n\r\n", (string) $response)[0]; - } -} diff --git a/plugins/vendor/symfony/http-foundation/Test/Constraint/ResponseStatusCodeSame.php b/plugins/vendor/symfony/http-foundation/Test/Constraint/ResponseStatusCodeSame.php deleted file mode 100644 index 1223608b..00000000 --- a/plugins/vendor/symfony/http-foundation/Test/Constraint/ResponseStatusCodeSame.php +++ /dev/null @@ -1,53 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Test\Constraint; - -use PHPUnit\Framework\Constraint\Constraint; -use Symfony\Component\HttpFoundation\Response; - -final class ResponseStatusCodeSame extends Constraint -{ - public function __construct( - private int $statusCode, - private readonly bool $verbose = true, - ) { - } - - public function toString(): string - { - return 'status code is '.$this->statusCode; - } - - /** - * @param Response $response - */ - protected function matches($response): bool - { - return $this->statusCode === $response->getStatusCode(); - } - - /** - * @param Response $response - */ - protected function failureDescription($response): string - { - return 'the Response '.$this->toString(); - } - - /** - * @param Response $response - */ - protected function additionalFailureDescription($response): string - { - return $this->verbose ? (string) $response : explode("\r\n\r\n", (string) $response)[0]; - } -} diff --git a/plugins/vendor/symfony/http-foundation/UriSigner.php b/plugins/vendor/symfony/http-foundation/UriSigner.php deleted file mode 100644 index 690021b5..00000000 --- a/plugins/vendor/symfony/http-foundation/UriSigner.php +++ /dev/null @@ -1,216 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation; - -use Psr\Clock\ClockInterface; -use Symfony\Component\HttpFoundation\Exception\ExpiredSignedUriException; -use Symfony\Component\HttpFoundation\Exception\LogicException; -use Symfony\Component\HttpFoundation\Exception\SignedUriException; -use Symfony\Component\HttpFoundation\Exception\UnsignedUriException; -use Symfony\Component\HttpFoundation\Exception\UnverifiedSignedUriException; - -/** - * @author Fabien Potencier - */ -class UriSigner -{ - private const STATUS_VALID = 1; - private const STATUS_INVALID = 2; - private const STATUS_MISSING = 3; - private const STATUS_EXPIRED = 4; - - /** - * @param string $hashParameter Query string parameter to use - * @param string $expirationParameter Query string parameter to use for expiration - */ - public function __construct( - #[\SensitiveParameter] private string $secret, - private string $hashParameter = '_hash', - private string $expirationParameter = '_expiration', - private ?ClockInterface $clock = null, - ) { - if (!$secret) { - throw new \InvalidArgumentException('A non-empty secret is required.'); - } - } - - /** - * Signs a URI. - * - * The given URI is signed by adding the query string parameter - * which value depends on the URI and the secret. - * - * @param \DateTimeInterface|\DateInterval|int|null $expiration The expiration for the given URI. - * If $expiration is a \DateTimeInterface, it's expected to be the exact date + time. - * If $expiration is a \DateInterval, the interval is added to "now" to get the date + time. - * If $expiration is an int, it's expected to be a timestamp in seconds of the exact date + time. - * If $expiration is null, no expiration. - * - * The expiration is added as a query string parameter. - */ - public function sign(string $uri/* , \DateTimeInterface|\DateInterval|int|null $expiration = null */): string - { - $expiration = null; - - if (1 < \func_num_args()) { - $expiration = func_get_arg(1); - } - - if (null !== $expiration && !$expiration instanceof \DateTimeInterface && !$expiration instanceof \DateInterval && !\is_int($expiration)) { - throw new \TypeError(\sprintf('The second argument of "%s()" must be an instance of "%s" or "%s", an integer or null (%s given).', __METHOD__, \DateTimeInterface::class, \DateInterval::class, get_debug_type($expiration))); - } - - $url = parse_url($uri); - $params = []; - - if (isset($url['query'])) { - parse_str($url['query'], $params); - } - - if (isset($params[$this->hashParameter])) { - throw new LogicException(\sprintf('URI query parameter conflict: parameter name "%s" is reserved.', $this->hashParameter)); - } - - if (isset($params[$this->expirationParameter])) { - throw new LogicException(\sprintf('URI query parameter conflict: parameter name "%s" is reserved.', $this->expirationParameter)); - } - - if (null !== $expiration) { - $params[$this->expirationParameter] = $this->getExpirationTime($expiration); - } - - $uri = $this->buildUrl($url, $params); - $params[$this->hashParameter] = $this->computeHash($uri); - - return $this->buildUrl($url, $params); - } - - /** - * Checks that a URI contains the correct hash. - * Also checks if the URI has not expired (If you used expiration during signing). - */ - public function check(string $uri): bool - { - return self::STATUS_VALID === $this->doVerify($uri); - } - - public function checkRequest(Request $request): bool - { - return self::STATUS_VALID === $this->doVerify(self::normalize($request)); - } - - /** - * Verify a Request or string URI. - * - * @throws UnsignedUriException If the URI is not signed - * @throws UnverifiedSignedUriException If the signature is invalid - * @throws ExpiredSignedUriException If the URI has expired - * @throws SignedUriException - */ - public function verify(Request|string $uri): void - { - $uri = self::normalize($uri); - $status = $this->doVerify($uri); - - match ($status) { - self::STATUS_VALID => null, - self::STATUS_INVALID => throw new UnverifiedSignedUriException(), - self::STATUS_EXPIRED => throw new ExpiredSignedUriException(), - default => throw new UnsignedUriException(), - }; - } - - private function computeHash(string $uri): string - { - return strtr(rtrim(base64_encode(hash_hmac('sha256', $uri, $this->secret, true)), '='), ['/' => '_', '+' => '-']); - } - - private function buildUrl(array $url, array $params = []): string - { - ksort($params, \SORT_STRING); - $url['query'] = http_build_query($params, '', '&'); - - $scheme = isset($url['scheme']) ? $url['scheme'].'://' : ''; - $host = $url['host'] ?? ''; - $port = isset($url['port']) ? ':'.$url['port'] : ''; - $user = $url['user'] ?? ''; - $pass = isset($url['pass']) ? ':'.$url['pass'] : ''; - $pass = ($user || $pass) ? "$pass@" : ''; - $path = $url['path'] ?? ''; - $query = $url['query'] ? '?'.$url['query'] : ''; - $fragment = isset($url['fragment']) ? '#'.$url['fragment'] : ''; - - return $scheme.$user.$pass.$host.$port.$path.$query.$fragment; - } - - private function getExpirationTime(\DateTimeInterface|\DateInterval|int $expiration): string - { - if ($expiration instanceof \DateTimeInterface) { - return $expiration->format('U'); - } - - if ($expiration instanceof \DateInterval) { - return $this->now()->add($expiration)->format('U'); - } - - return (string) $expiration; - } - - private function now(): \DateTimeImmutable - { - return $this->clock?->now() ?? \DateTimeImmutable::createFromFormat('U', time()); - } - - /** - * @return self::STATUS_* - */ - private function doVerify(string $uri): int - { - $url = parse_url($uri); - $params = []; - - if (isset($url['query'])) { - parse_str($url['query'], $params); - } - - if (empty($params[$this->hashParameter])) { - return self::STATUS_MISSING; - } - - $hash = $params[$this->hashParameter]; - unset($params[$this->hashParameter]); - - if (!hash_equals($this->computeHash($this->buildUrl($url, $params)), strtr(rtrim($hash, '='), ['/' => '_', '+' => '-']))) { - return self::STATUS_INVALID; - } - - if (!$expiration = $params[$this->expirationParameter] ?? false) { - return self::STATUS_VALID; - } - - if ($this->now()->getTimestamp() < $expiration) { - return self::STATUS_VALID; - } - - return self::STATUS_EXPIRED; - } - - private static function normalize(Request|string $uri): string - { - if ($uri instanceof Request) { - $qs = ($qs = $uri->server->get('QUERY_STRING')) ? '?'.$qs : ''; - $uri = $uri->getSchemeAndHttpHost().$uri->getBaseUrl().$uri->getPathInfo().$qs; - } - - return $uri; - } -} diff --git a/plugins/vendor/symfony/http-foundation/UrlHelper.php b/plugins/vendor/symfony/http-foundation/UrlHelper.php deleted file mode 100644 index f971cf66..00000000 --- a/plugins/vendor/symfony/http-foundation/UrlHelper.php +++ /dev/null @@ -1,108 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation; - -use Symfony\Component\Routing\RequestContext; -use Symfony\Component\Routing\RequestContextAwareInterface; - -/** - * A helper service for manipulating URLs within and outside the request scope. - * - * @author Valentin Udaltsov - */ -final class UrlHelper -{ - public function __construct( - private RequestStack $requestStack, - private RequestContextAwareInterface|RequestContext|null $requestContext = null, - ) { - } - - public function getAbsoluteUrl(string $path): string - { - if (str_contains($path, '://') || str_starts_with($path, '//')) { - return $path; - } - - if (null === $request = $this->requestStack->getMainRequest()) { - return $this->getAbsoluteUrlFromContext($path); - } - - if ('#' === $path[0]) { - $path = $request->getRequestUri().$path; - } elseif ('?' === $path[0]) { - $path = $request->getPathInfo().$path; - } - - if (!$path || '/' !== $path[0]) { - $prefix = $request->getPathInfo(); - $last = \strlen($prefix) - 1; - if ($last !== $pos = strrpos($prefix, '/')) { - $prefix = substr($prefix, 0, $pos).'/'; - } - - return $request->getUriForPath($prefix.$path); - } - - return $request->getSchemeAndHttpHost().$path; - } - - public function getRelativePath(string $path): string - { - if (str_contains($path, '://') || str_starts_with($path, '//')) { - return $path; - } - - if (null === $request = $this->requestStack->getMainRequest()) { - return $path; - } - - return $request->getRelativeUriForPath($path); - } - - private function getAbsoluteUrlFromContext(string $path): string - { - if (null === $context = $this->requestContext) { - return $path; - } - - if ($context instanceof RequestContextAwareInterface) { - $context = $context->getContext(); - } - - if ('' === $host = $context->getHost()) { - return $path; - } - - $scheme = $context->getScheme(); - $port = ''; - - if ('http' === $scheme && 80 !== $context->getHttpPort()) { - $port = ':'.$context->getHttpPort(); - } elseif ('https' === $scheme && 443 !== $context->getHttpsPort()) { - $port = ':'.$context->getHttpsPort(); - } - - if ('#' === $path[0]) { - $queryString = $context->getQueryString(); - $path = $context->getPathInfo().($queryString ? '?'.$queryString : '').$path; - } elseif ('?' === $path[0]) { - $path = $context->getPathInfo().$path; - } - - if ('/' !== $path[0]) { - $path = rtrim($context->getBaseUrl(), '/').'/'.$path; - } - - return $scheme.'://'.$host.$port.$path; - } -} diff --git a/plugins/vendor/symfony/http-foundation/composer.json b/plugins/vendor/symfony/http-foundation/composer.json deleted file mode 100644 index dba18355..00000000 --- a/plugins/vendor/symfony/http-foundation/composer.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "name": "symfony/http-foundation", - "type": "library", - "description": "Defines an object-oriented layer for the HTTP specification", - "keywords": [], - "homepage": "https://symfony.com", - "license": "MIT", - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-mbstring": "^1.1" - }, - "require-dev": { - "doctrine/dbal": "^3.6|^4", - "predis/predis": "^1.1|^2.0", - "symfony/cache": "^6.4.12|^7.1.5|^8.0", - "symfony/clock": "^6.4|^7.0|^8.0", - "symfony/dependency-injection": "^6.4|^7.0|^8.0", - "symfony/http-kernel": "^6.4|^7.0|^8.0", - "symfony/mime": "^6.4|^7.0|^8.0", - "symfony/expression-language": "^6.4|^7.0|^8.0", - "symfony/rate-limiter": "^6.4|^7.0|^8.0" - }, - "conflict": { - "doctrine/dbal": "<3.6", - "symfony/cache": "<6.4.12|>=7.0,<7.1.5" - }, - "autoload": { - "psr-4": { "Symfony\\Component\\HttpFoundation\\": "" }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "minimum-stability": "dev" -} diff --git a/plugins/vendor/voku/portable-ascii/.deepsource.toml b/plugins/vendor/voku/portable-ascii/.deepsource.toml deleted file mode 100644 index 3f8f43ce..00000000 --- a/plugins/vendor/voku/portable-ascii/.deepsource.toml +++ /dev/null @@ -1,4 +0,0 @@ -version = 1 - -[[analyzers]] -name = "php" \ No newline at end of file diff --git a/plugins/vendor/voku/portable-ascii/CHANGELOG.md b/plugins/vendor/voku/portable-ascii/CHANGELOG.md deleted file mode 100644 index 7fe9c801..00000000 --- a/plugins/vendor/voku/portable-ascii/CHANGELOG.md +++ /dev/null @@ -1,224 +0,0 @@ -# Changelog - -### 2.1.1 (2026-04-24) - -- fix long-string `ASCII::to_ascii()` regression coverage to match current degree-sign handling and lock in cache-order behavior across cleanup, transliteration, and retention modes - -### 2.1.0 (2026-04-16) - -- run all checks and tests up to PHP 8.5 -- raise the minimum PHP version from 7.0 to 7.1 -- update PHPUnit dev-dependency to support ~8.5 || ~9.6 || ~10.5 || ~11.5 -- modernize CI: add a required PHPStan job, update the GitHub Actions matrix, and refresh the AppVeyor config -- optimize `ASCII::to_ascii()` / `ASCII::to_transliterate()` hot paths, add benchmark coverage, and document current benchmark results -- harden invalid UTF-8 handling in `clean()`, `to_ascii()`, and `to_transliterate()` for malformed, overlong, surrogate, and out-of-range sequences -- expand regression coverage for malformed UTF-8, transliteration boundaries, slug loops, and other edge cases - -### 2.0.3 (2024-11-21) - -- use modern phpdocs e.g. list or conditional-return annotations - -### 2.0.2 (2024-11-21) - -- small fix for PHP 8.4 (thanks to @gilbertoalbino) - -### 2.0.1 (2022-03-08) - -- "To people of Russia": There is a war in Ukraine right now. The forces of the Russian Federation are attacking civilians. -- optimize some phpdocs - -### 2.0.0 (2022-01-24) - -- prefer "Russian - Passport (2013), ICAO" instead of "Russian - GOST 7.79-2000(B)" -- fix "Ukrainian" char-mapping (thanks to @Andr1yk0) -- fix "Persian" char-mapping (thanks to @frost-cyber) - -### 1.6.1 (2022-01-24) - -- revert: prefer "Russian - Passport (2013), ICAO" instead of "Russian - GOST 7.79-2000(B)" -- revert: fix "Ukrainian" char-mapping (thanks to @Andr1yk0) -- revert: fix "Persian" char-mapping (thanks to @frost-cyber) - -### 1.6.0 (2022-01-24) - -- prefer "Russian - Passport (2013), ICAO" instead of "Russian - GOST 7.79-2000(B)" -- fix "Ukrainian" char-mapping (thanks to @Andr1yk0) -- fix "Persian" char-mapping (thanks to @frost-cyber) -- fix "ASCII::normalize_whitespace()" -> "CARRIAGE RETURN" is more like "
" and no "\n" -- add "ASCII::to_ascii_remap()" -> this method will return broken characters and is only for special cases - -### 1.5.6 (2020-11-12) - -- "ASCII::normalize_whitespace()" -> can now also remove "control characters" if needed v2 - -### 1.5.5 (2020-11-12) - -- fix "Greeklish" char-mapping (thanks @sebdesign) -- "ASCII::normalize_whitespace()" -> can now also remove "control characters" if needed - -### 1.5.4 (2020-11-08) - -- add some missing replacements in U+23xx page (thanks @marcoffee) -- fix "Russian" char-mapping (thanks @ilyahoilik) -- running test with PHP 8.0 rc3 - -### 1.5.3 (2020-07-23) - -- fix "Georgian" char-mapping (thanks @waska14) - -### 1.5.2 (2020-06-16) - -- add "Bengali" (bn) language support (thanks @eliyas5044) -- fix "Portuguese" char-mapping -- reduce the file size (removed extra comments from "avian2/unidecode") - -### 1.5.1 (2020-05-26) - -- fix merge ASCII transliterations from "avian2/unidecode" (python) - -> https://github.com/avian2/unidecode/ - -### 1.5.0 (2020-05-24) - -- merge ASCII transliterations from "avian2/unidecode" (python) - -> https://github.com/avian2/unidecode/ - -### 1.4.11 (2020-05-23) - -- "composer.json" -> remove "autoload-dev" stuff from "autoload" -- "voku/php-readme-helper" -> auto-generate the API documentation in the README - -### 1.4.10 (2020-03-13) - -- ASCII::to_ascii() -> fix extra symbol handling in the regex -- ASCII::to_ascii() -> fix for languages with multi-length-special-char (e.g. Greek -> 'ει' => 'i') - -### 1.4.9 (2020-03-06) - -- ASCII::to_slugify() -> fix php warning from empty "separator" - -### 1.4.8 (2020-02-06) - -- small optimization for "ASCII::to_ascii()" performance - -### 1.4.7 (2020-01-27) - -- fix possible wrong type from "getDataIfExists()" -> e.g. a bug reported where "/data/" was modified -- inline variables -- do not use "=== true" for "bool"-types - -### 1.4.6 (2019-12-23) - -- optimize "ASCII::to_ascii()" performance -- add "armenian" chars -- add "ASCII:getAllLanguages()" - -### 1.4.5 (2019-12-19) - -- use "@psalm-pure" v2 - -### 1.4.4 (2019-12-19) - -- use "@psalm-pure" - -### 1.4.3 (2019-12-19) - -- use "@psalm-immutable" - -### 1.4.2 (2019-12-13) - -- optimize the performance v2 -- more fixes for non-ascii regex - -### 1.4.1 (2019-12-13) - -- fix regex for non-ascii - -### 1.4.0 (2019-12-13) - -- optimize the performance, via single char replacements - -### 1.3.6 (2019-12-13) - -- "ascii_extras" -> convert the static content into ascii - -> e.g.: instead of replacing "+" with "più" we use "piu" (Italian), because we want to use ascii anyway - -### 1.3.5 (2019-11-11) - -- fix "ASCII::remove_invisible_characters()" -> do not remove invisible encoded url strings by default - -### 1.3.4 (2019-10-14) - -- fix static cache for "ASCII::charsArrayWithOneLanguage" - -### 1.3.3 (2019-10-14) - -- fix "Turkish" mapping -> 'ä' -> 'a' - -### 1.3.2 (2019-10-14) - -- fix language parameter usage with e.g. "de_DE" -- re-add missing "extra"-mapping chars - -### 1.3.1 (2019-10-13) - -- fix "ASCII::to_slugify" -> remove unicode chars -- add more test for ascii chars in the mapping -- fix non ascii chars in the mapping - -### 1.3.0 (2019-10-12) - -- add transliteration "fr" (was supported before, but with chars from other languages) -- add transliteration "ru" - Passport (2013), ICAO -- add transliteration "ru" - GOST 7.79-2000(B) -- add transliteration "el" - greeklish -- add transliteration "zh" -- add transliteration "nl" -- add transliteration "it" -- add transliteration "mk" -- add transliteration "pt" -- add constants -> ASCII::*LANGUAGE_CODES -- add more special latin chars / (currency) symbols -- add simple tests for all supported languages -- optimize "Russian" to ASCII (via "translit.ru") -- optimize performance of string replacement -- optimize performance of array merging -- optimize phpdoc comments -- "ASCII::to_transliterate" -> use "transliterator_create" + static cache -- "ASCII::to_ascii" -> fix "remove unsupported chars" -- "ASCII::to_ascii" -> add some more special chars -- run/fix static analyse via "pslam" + "phpstan" -- auto fix code style via "php-cs-fixer" -- fix transliteration for "german" -- fix transliteration for "persian" (thanks @mardep) -- fix transliteration for "polish" (thanks @dariusz.drobisz) -- fix transliteration for "bulgarian" (thanks @mkosturkov) -- fix transliteration for "croatian" (thanks @ludifonovac) -- fix transliteration for "serbian" (thanks @ludifonovac) -- fix transliteration for "swedish" (thanks @nicholasruunu) -- fix transliteration for "france" (thanks @sharptsa) -- fix transliteration for "serbian" (thanks @nikolaposa) -- fix transliteration for "czech" (thanks @slepic) - -### 1.2.3 (2019-09-10) - -- fix language depending ASCII chars (the order matters) - -### 1.2.2 (2019-09-10) - -- fix bulgarian ASCII chars | thanks @bgphp - -### 1.2.1 (2019-09-07) - -- "charsArray()" -> add access to "ASCII::$ASCII_MAPS*"" - -### 1.2.0 (2019-09-07) - -- "to_slugify()" -> use the extra ascii array - -### 1.1.0 (2019-09-07) - -- add + split extra ascii replacements - -### 1.0.0 (2019-09-05) - -- initial commit diff --git a/plugins/vendor/voku/portable-ascii/LICENSE.txt b/plugins/vendor/voku/portable-ascii/LICENSE.txt deleted file mode 100644 index b6ba47ea..00000000 --- a/plugins/vendor/voku/portable-ascii/LICENSE.txt +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (C) 2019 Lars Moelleken - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/plugins/vendor/voku/portable-ascii/README.md b/plugins/vendor/voku/portable-ascii/README.md deleted file mode 100644 index b1aaf74f..00000000 --- a/plugins/vendor/voku/portable-ascii/README.md +++ /dev/null @@ -1,451 +0,0 @@ -[//]: # (AUTO-GENERATED BY "PHP README Helper": base file -> docs/base.md) -[![SWUbanner](https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/banner2-direct.svg)](https://github.com/vshymanskyy/StandWithUkraine/blob/main/docs/README.md) - -[![Build Status](https://github.com/voku/portable-ascii/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/voku/portable-ascii/actions) -[![Build status](https://ci.appveyor.com/api/projects/status/gnejjnk7qplr7f5t/branch/master?svg=true)](https://ci.appveyor.com/project/voku/portable-ascii/branch/master) -[![codecov.io](https://codecov.io/github/voku/portable-ascii/coverage.svg?branch=master)](https://codecov.io/github/voku/portable-ascii?branch=master) -[![Codacy Badge](https://api.codacy.com/project/badge/Grade/997c9bb10d1c4791967bdf2e42013e8e)](https://www.codacy.com/app/voku/portable-ascii) -[![Latest Stable Version](https://poser.pugx.org/voku/portable-ascii/v/stable)](https://packagist.org/packages/voku/portable-ascii) -[![Total Downloads](https://poser.pugx.org/voku/portable-ascii/downloads)](https://packagist.org/packages/voku/portable-ascii) -[![License](https://poser.pugx.org/voku/portable-ascii/license)](https://packagist.org/packages/voku/portable-ascii) -[![Donate to this project using Paypal](https://img.shields.io/badge/paypal-donate-yellow.svg)](https://www.paypal.me/moelleken) -[![Donate to this project using Patreon](https://img.shields.io/badge/patreon-donate-yellow.svg)](https://www.patreon.com/voku) - -# 🔡 Portable ASCII - -## Description - -It is written in PHP (PHP 7+) and can work without "mbstring", "iconv" or any other extra encoding php-extension on your server. - -The benefit of Portable ASCII is that it is easy to use, easy to bundle. - -The project based on ... -+ Sean M. Burke's work (https://metacpan.org/pod/Text::Unidecode) -+ Tomaz Solc's work (https://pypi.org/project/Unidecode/) -+ Portable UTF-8 work (https://github.com/voku/portable-utf8) -+ Daniel St. Jules's work (https://github.com/danielstjules/Stringy) -+ Johnny Broadway's work (https://github.com/jbroadway/urlify) -+ and many cherry-picks from "github"-gists and "Stack Overflow"-snippets ... - -## Index - -* [Alternative](#alternative) -* [Install](#install-portable-ascii-via-composer-require) -* [Why Portable ASCII?](#why-portable-ascii) -* [Requirements and Recommendations](#requirements-and-recommendations) -* [Usage](#usage) -* [Class methods](#class-methods) -* [Unit Test](#unit-test) -* [License and Copyright](#license-and-copyright) - -## Alternative - -If you like a more Object Oriented Way to edit strings, then you can take a look at [voku/Stringy](https://github.com/voku/Stringy), it's a fork of "danielstjules/Stringy" but it used the "Portable ASCII"-Class and some extra methods. - -```php -// Portable ASCII -use voku\helper\ASCII; -ASCII::to_transliterate('déjà σσς iıii'); // 'deja sss iiii' - -// voku/Stringy -use Stringy\Stringy as S; -$stringy = S::create('déjà σσς iıii'); -$stringy->toTransliterate(); // 'deja sss iiii' -``` - -## Install "Portable ASCII" via "composer require" -```shell -composer require voku/portable-ascii -``` - -## Why Portable ASCII?[]() -I need ASCII char handling in different classes and before I added this functions into "Portable UTF-8", -but this repo is more modular and portable, because it has no dependencies. - -## Requirements and Recommendations - -* No extensions are required to run this library. Portable ASCII only needs PCRE library that is available by default since PHP 4.2.0 and cannot be disabled since PHP 5.3.0. "\u" modifier support in PCRE for ASCII handling is not a must. -* PHP 7.1 is the minimum requirement -* up to PHP 8.5 is also supported - -## Usage - -Example: ASCII::to_ascii() -```php - echo ASCII::to_ascii('�Düsseldorf�', 'de'); - - // will output - // Duesseldorf - - echo ASCII::to_ascii('�Düsseldorf�', 'en'); - - // will output - // Dusseldorf -``` - -# Portable ASCII | API - -The API from the "ASCII"-Class is written as small static methods. - - -## Class methods - -

charsArray -charsArrayWithMultiLanguageValues -charsArrayWithOneLanguage -charsArrayWithSingleLanguageValues -
clean -getAllLanguages -is_ascii -normalize_msword -
normalize_whitespace -remove_invisible_characters -to_ascii -to_ascii_remap -
to_filename -to_slugify -to_transliterate -
- -#### charsArray(bool $replace_extra_symbols): array - -Returns an replacement array for ASCII methods. - -EXAMPLE: -$array = ASCII::charsArray(); -var_dump($array['ru']['б']); // 'b' - - -**Parameters:** -- `bool $replace_extra_symbols [optional]

Add some more replacements e.g. "£" with " pound ".

` - -**Return:** -- `array` - --------- - -#### charsArrayWithMultiLanguageValues(bool $replace_extra_symbols): array - -Returns an replacement array for ASCII methods with a mix of multiple languages. - -EXAMPLE: -$array = ASCII::charsArrayWithMultiLanguageValues(); -var_dump($array['b']); // ['β', 'б', 'ဗ', 'ბ', 'ب'] - - -**Parameters:** -- `bool $replace_extra_symbols [optional]

Add some more replacements e.g. "£" with " pound ".

` - -**Return:** -- `array

An array of replacements.

` - --------- - -#### charsArrayWithOneLanguage(string $language, bool $replace_extra_symbols, bool $asOrigReplaceArray): array - -Returns an replacement array for ASCII methods with one language. - -For example, German will map 'ä' to 'ae', while other languages -will simply return e.g. 'a'. - -EXAMPLE: -$array = ASCII::charsArrayWithOneLanguage('ru'); -$tmpKey = \array_search('yo', $array['replace']); -echo $array['orig'][$tmpKey]; // 'ё' - - -**Parameters:** -- `ASCII::* $language [optional]

Language of the source string e.g.: en, de_at, or de-ch. -(default is 'en') | ASCII::*_LANGUAGE_CODE

` -- `bool $replace_extra_symbols [optional]

Add some more replacements e.g. "£" with " pound ".

` -- `bool $asOrigReplaceArray [optional]

TRUE === return {orig: string[], replace: string[]} -array

` - -**Return:** -- `array

An array of replacements.

` - --------- - -#### charsArrayWithSingleLanguageValues(bool $replace_extra_symbols, bool $asOrigReplaceArray): array - -Returns an replacement array for ASCII methods with multiple languages. - -EXAMPLE: -$array = ASCII::charsArrayWithSingleLanguageValues(); -$tmpKey = \array_search('hnaik', $array['replace']); -echo $array['orig'][$tmpKey]; // '၌' - - -**Parameters:** -- `bool $replace_extra_symbols [optional]

Add some more replacements e.g. "£" with " pound ".

` -- `bool $asOrigReplaceArray [optional]

TRUE === return {orig: string[], replace: string[]} -array

` - -**Return:** -- `array

An array of replacements.

` - --------- - -#### clean(string $str, bool $normalize_whitespace, bool $keep_non_breaking_space, bool $normalize_msword, bool $remove_invisible_characters): string - -Accepts a string and removes malformed UTF-8 from it + extras if needed. - -**Parameters:** -- `string $str

The string to be sanitized.

` -- `bool $normalize_whitespace [optional]

Set to true, if you need to normalize the -whitespace.

` -- `bool $keep_non_breaking_space [optional]

Set to true, to keep non-breaking-spaces, in -combination with -$normalize_whitespace

` -- `bool $normalize_msword [optional]

Set to true, if you need to normalize MS Word chars -e.g.: "…" -=> "..."

` -- `bool $remove_invisible_characters [optional]

Set to false, if you not want to remove invisible -characters e.g.: "\0"

` - -**Return:** -- `string

A clean UTF-8 string with malformed byte sequences removed.

` - --------- - -#### getAllLanguages(): string[] - -Get all languages from the constants "ASCII::.*LANGUAGE_CODE". - -**Parameters:** -__nothing__ - -**Return:** -- `string[]` - --------- - -#### is_ascii(string $str): bool - -Checks if a string is 7 bit ASCII. - -EXAMPLE: -ASCII::is_ascii('白'); // false - - -**Parameters:** -- `string $str

The string to check.

` - -**Return:** -- `bool

-true if it is ASCII
-false otherwise -

` - --------- - -#### normalize_msword(string $str): string - -Returns a string with smart quotes, ellipsis characters, and dashes from -Windows-1252 (commonly used in Word documents) replaced by their ASCII -equivalents. - -EXAMPLE: -ASCII::normalize_msword('„Abcdef…”'); // '"Abcdef..."' - - -**Parameters:** -- `string $str

The string to be normalized.

` - -**Return:** -- `string

A string with normalized characters for commonly used chars in Word documents.

` - --------- - -#### normalize_whitespace(string $str, bool $keepNonBreakingSpace, bool $keepBidiUnicodeControls, bool $normalize_control_characters): string - -Normalize the whitespace. - -EXAMPLE: -ASCII::normalize_whitespace("abc-\xc2\xa0-öäü-\xe2\x80\xaf-\xE2\x80\xAC", true); // "abc-\xc2\xa0-öäü- -" - - -**Parameters:** -- `string $str

The string to be normalized.

` -- `bool $keepNonBreakingSpace [optional]

Set to true, to keep non-breaking-spaces.

` -- `bool $keepBidiUnicodeControls [optional]

Set to true, to keep non-printable (for the web) -bidirectional text chars.

` -- `bool $normalize_control_characters [optional]

Set to true, to convert e.g. LINE-, PARAGRAPH-SEPARATOR with "\n" and LINE TABULATION with "\t".

` - -**Return:** -- `string

A string with normalized whitespace.

` - --------- - -#### remove_invisible_characters(string $str, bool $url_encoded, string $replacement, bool $keep_basic_control_characters): string - -Remove invisible characters from a string. - -e.g.: This prevents sandwiching null characters between ascii characters, like Java\0script. - -copy&past from https://github.com/bcit-ci/CodeIgniter/blob/develop/system/core/Common.php - -**Parameters:** -- `string $str` -- `bool $url_encoded` -- `string $replacement` -- `bool $keep_basic_control_characters` - -**Return:** -- `string` - --------- - -#### to_ascii(string $str, string $language, bool $remove_unsupported_chars, bool $replace_extra_symbols, bool $use_transliterate, bool|null $replace_single_chars_only): string - -Returns an ASCII version of the string. A set of non-ASCII characters are -replaced with their closest ASCII counterparts, and the rest are removed -by default. The language or locale of the source string can be supplied -for language-specific transliteration in any of the following formats: -en, en_GB, or en-GB. For example, passing "de" results in "äöü" mapping -to "aeoeue" rather than "aou" as in other languages. - -EXAMPLE: -ASCII::to_ascii('�Düsseldorf�', 'en'); // Dusseldorf - - -**Parameters:** -- `string $str

The input string.

` -- `ASCII::* $language [optional]

Language of the source string. -(default is 'en') | ASCII::*_LANGUAGE_CODE

` -- `bool $remove_unsupported_chars [optional]

Whether or not to remove the -unsupported characters.

` -- `bool $replace_extra_symbols [optional]

Add some more replacements e.g. "£" with " pound -".

` -- `bool $use_transliterate [optional]

Use ASCII::to_transliterate() for unknown chars.

` -- `bool|null $replace_single_chars_only [optional]

Single char replacement is better for the -performance, but some languages need to replace more then one char -at the same time. | NULL === auto-setting, depended on the -language

` - -**Return:** -- `string

A string that contains only ASCII characters.

` - --------- - -#### to_ascii_remap(string $str1, string $str2): string[] - -WARNING: This method will return broken characters and is only for special cases. - -Convert two UTF-8 encoded string to a single-byte strings suitable for -functions that need the same string length after the conversion. - -The function simply uses (and updates) a tailored dynamic encoding -(in/out map parameter) where non-ascii characters are remapped to -the range [128-255] in order of appearance. - -**Parameters:** -- `string $str1` -- `string $str2` - -**Return:** -- `string[]` - --------- - -#### to_filename(string $str, bool $use_transliterate, string $fallback_char): string - -Convert given string to safe filename (and keep string case). - -EXAMPLE: -ASCII::to_filename('שדגשדג.png', true)); // 'shdgshdg.png' - - -**Parameters:** -- `string $str` -- `bool $use_transliterate

ASCII::to_transliterate() is used by default - unsafe characters are -simply replaced with hyphen otherwise.

` -- `string $fallback_char` - -**Return:** -- `string

A string that contains only safe characters for a filename.

` - --------- - -#### to_slugify(string $str, string $separator, string $language, string[] $replacements, bool $replace_extra_symbols, bool $use_str_to_lower, bool $use_transliterate): string - -Converts the string into an URL slug. This includes replacing non-ASCII -characters with their closest ASCII equivalents, removing remaining -non-ASCII and non-alphanumeric characters, and replacing whitespace with -$separator. The separator defaults to a single dash, and the string -is also converted to lowercase. The language of the source string can -also be supplied for language-specific transliteration. - -**Parameters:** -- `string $str` -- `string $separator [optional]

The string used to replace whitespace.

` -- `ASCII::* $language [optional]

Language of the source string. -(default is 'en') | ASCII::*_LANGUAGE_CODE

` -- `array $replacements [optional]

A map of replaceable strings.

` -- `bool $replace_extra_symbols [optional]

Add some more replacements e.g. "£" with " -pound ".

` -- `bool $use_str_to_lower [optional]

Use "string to lower" for the input.

` -- `bool $use_transliterate [optional]

Use ASCII::to_transliterate() for unknown -chars.

` - -**Return:** -- `string

A string that has been converted to an URL slug.

` - --------- - -#### to_transliterate(string $str, string|null $unknown, bool $strict): string - -Returns an ASCII version of the string. A set of non-ASCII characters are -replaced with their closest ASCII counterparts, and the rest are removed -unless instructed otherwise. - -EXAMPLE: -ASCII::to_transliterate('déjà σσς iıii'); // 'deja sss iiii' - - -**Parameters:** -- `string $str

The input string.

` -- `string|null $unknown [optional]

Character used for valid characters without a transliteration mapping. (default is '?') -But you can also use NULL to keep those unknown chars. Malformed UTF-8 is discarded during cleaning.

` -- `bool $strict [optional]

Use "transliterator_transliterate()" from PHP-Intl` - -**Return:** -- `string

A String that contains only ASCII characters.

` - --------- - - - -## Unit Test - -1) [Composer](https://getcomposer.org) is a prerequisite for running the tests. - -``` -composer install -``` - -2) The tests can be executed by running this command from the root directory: - -```bash -./vendor/bin/phpunit -``` - -### Support - -For support and donations please visit [Github](https://github.com/voku/portable-ascii/) | [Issues](https://github.com/voku/portable-ascii/issues) | [PayPal](https://paypal.me/moelleken) | [Patreon](https://www.patreon.com/voku). - -For status updates and release announcements please visit [Releases](https://github.com/voku/portable-ascii/releases) | [Twitter](https://twitter.com/suckup_de) | [Patreon](https://www.patreon.com/voku/posts). - -For professional support please contact [me](https://about.me/voku). - -### Thanks - -- Thanks to [GitHub](https://github.com) (Microsoft) for hosting the code and a good infrastructure including Issues-Managment, etc. -- Thanks to [IntelliJ](https://www.jetbrains.com) as they make the best IDEs for PHP and they gave me an open source license for PhpStorm! -- Thanks to [Travis CI](https://travis-ci.com/) for being the most awesome, easiest continous integration tool out there! -- Thanks to [StyleCI](https://styleci.io/) for the simple but powerful code style check. -- Thanks to [PHPStan](https://github.com/phpstan/phpstan) && [Psalm](https://github.com/vimeo/psalm) for really great Static analysis tools and for discover bugs in the code! - -### License and Copyright - -Released under the MIT License - see `LICENSE.txt` for details. diff --git a/plugins/vendor/voku/portable-ascii/composer.json b/plugins/vendor/voku/portable-ascii/composer.json deleted file mode 100644 index 69520de6..00000000 --- a/plugins/vendor/voku/portable-ascii/composer.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "name": "voku/portable-ascii", - "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", - "type": "library", - "keywords": [ - "clean", - "php", - "ascii" - ], - "homepage": "https://github.com/voku/portable-ascii", - "license": "MIT", - "authors": [ - { - "name": "Lars Moelleken", - "homepage": "https://www.moelleken.org/" - } - ], - "require": { - "php": ">=7.1.0" - }, - "require-dev": { - "phpunit/phpunit": "~8.5 || ~9.6 || ~10.5 || ~11.5" - }, - "suggest": { - "ext-intl": "Use Intl for transliterator_transliterate() support" - }, - "autoload": { - "psr-4": { - "voku\\": "src/voku/" - } - }, - "autoload-dev": { - "psr-4": { - "voku\\tests\\": "tests/" - } - } -} diff --git a/plugins/vendor/voku/portable-ascii/src/voku/helper/ASCII.php b/plugins/vendor/voku/portable-ascii/src/voku/helper/ASCII.php deleted file mode 100644 index 625a518e..00000000 --- a/plugins/vendor/voku/portable-ascii/src/voku/helper/ASCII.php +++ /dev/null @@ -1,1679 +0,0 @@ ->|null - */ - private static $ASCII_MAPS; - - /** - * @var array>|null - */ - private static $ASCII_MAPS_AND_EXTRAS; - - /** - * @var array>|null - */ - private static $ASCII_EXTRAS; - - /** - * @var array|null - */ - private static $ORD; - - /** - * url: https://en.wikipedia.org/wiki/Wikipedia:ASCII#ASCII_printable_characters - * - * @var string - */ - private static $REGEX_ASCII = "[^\x09\x10\x13\x0A\x0D\x20-\x7E]"; - - private const REGEX_PRINTABLE_ASCII = '[^\x20-\x7E]'; - - /** - * bidirectional text chars - * - * url: https://www.w3.org/International/questions/qa-bidi-unicode-controls - * - * @var array - */ - private static $BIDI_UNI_CODE_CONTROLS_TABLE = [ - // LEFT-TO-RIGHT EMBEDDING (use -> dir = "ltr") - 8234 => "\xE2\x80\xAA", - // RIGHT-TO-LEFT EMBEDDING (use -> dir = "rtl") - 8235 => "\xE2\x80\xAB", - // POP DIRECTIONAL FORMATTING // (use -> ) - 8236 => "\xE2\x80\xAC", - // LEFT-TO-RIGHT OVERRIDE // (use -> ) - 8237 => "\xE2\x80\xAD", - // RIGHT-TO-LEFT OVERRIDE // (use -> ) - 8238 => "\xE2\x80\xAE", - // LEFT-TO-RIGHT ISOLATE // (use -> dir = "ltr") - 8294 => "\xE2\x81\xA6", - // RIGHT-TO-LEFT ISOLATE // (use -> dir = "rtl") - 8295 => "\xE2\x81\xA7", - // FIRST STRONG ISOLATE // (use -> dir = "auto") - 8296 => "\xE2\x81\xA8", - // POP DIRECTIONAL ISOLATE - 8297 => "\xE2\x81\xA9", - ]; - - /** - * Transliteration placeholders used by the generated data tables. - * - * @var array - */ - private const UNKNOWN_TRANSLITERATION_MARKERS = [ - '[?]' => true, - '[?] ' => true, - ]; - - /** - * Match exactly the structurally valid multibyte UTF-8 sequences defined by RFC 3629. - * - * The ranges mirror those used in clean() and deliberately exclude: - * - 0xC0/0xC1 lead bytes (overlong 2-byte sequences such as "\xC0\xAF" for "/") - * - \xE0 followed by \x80–\x9F (overlong 3-byte sequences) - * - \xED followed by \xA0–\xBF (UTF-16 surrogate halves U+D800–U+DFFF) - * - \xF0 followed by \x80–\x8F (overlong 4-byte sequences) - * - \xF4 followed by \x90–\xBF, and \xF5–\xFF (code points above U+10FFFF) - * - * Without this strictness the later ordinal arithmetic (ord – 192/224/240) would - * silently decode overlong sequences into their ASCII equivalents (e.g. "\xC0\xAF" → "/"), - * introducing an input-sanitization bypass even though clean() already strips them. - * - * @var string - */ - private const UTF8_MULTIBYTE_SEQUENCE_RX = '/[\xC2-\xDF][\x80-\xBF]|\xE0[\xA0-\xBF][\x80-\xBF]|[\xE1-\xEC\xEE-\xEF][\x80-\xBF]{2}|\xED[\x80-\x9F][\x80-\xBF]|\xF0[\x90-\xBF][\x80-\xBF]{2}|[\xF1-\xF3][\x80-\xBF]{3}|\xF4[\x80-\x8F][\x80-\xBF]{2}/'; - - - /** - * Get all languages from the constants "ASCII::.*LANGUAGE_CODE". - * - * @return array - *

An associative array where the key is the language code in lowercase - * and the value is the corresponding language string.

- */ - public static function getAllLanguages(): array - { - // init - static $LANGUAGES = []; - - if ($LANGUAGES !== []) { - return $LANGUAGES; - } - - foreach ((new \ReflectionClass(__CLASS__))->getConstants() as $constant => $lang) { - if (\strpos($constant, 'EXTRA') !== false) { - $LANGUAGES[\strtolower($constant)] = $lang; - } else { - $LANGUAGES[\strtolower(\str_replace('_LANGUAGE_CODE', '', $constant))] = $lang; - } - } - - return $LANGUAGES; - } - - /** - * Returns an replacement array for ASCII methods. - * - * EXAMPLE: - * $array = ASCII::charsArray(); - * var_dump($array['ru']['б']); // 'b' - * - * - * @param bool $replace_extra_symbols [optional]

Add some more replacements e.g. "£" with " pound ".

- * - * @psalm-pure - * - * @return array> - *

An array where the key is the language code, and the value is - * an associative array mapping original characters to their replacements.

- */ - public static function charsArray(bool $replace_extra_symbols = false): array - { - if ($replace_extra_symbols) { - self::prepareAsciiAndExtrasMaps(); - - return self::$ASCII_MAPS_AND_EXTRAS ?? []; - } - - self::prepareAsciiMaps(); - - return self::$ASCII_MAPS ?? []; - } - - /** - * Returns an replacement array for ASCII methods with a mix of multiple languages. - * - * EXAMPLE: - * $array = ASCII::charsArrayWithMultiLanguageValues(); - * var_dump($array['b']); // ['β', 'б', 'ဗ', 'ბ', 'ب'] - * - * - * @param bool $replace_extra_symbols [optional]

Add some more replacements e.g. "£" with " pound ".

- * - * @psalm-pure - * - * @return array> - *

An array of replacements.

- */ - public static function charsArrayWithMultiLanguageValues(bool $replace_extra_symbols = false): array - { - static $CHARS_ARRAY = []; - $cacheKey = '' . $replace_extra_symbols; - - if (isset($CHARS_ARRAY[$cacheKey])) { - return $CHARS_ARRAY[$cacheKey]; - } - - // init - $return = []; - $language_all_chars = self::charsArrayWithSingleLanguageValues( - $replace_extra_symbols, - false - ); - - /* @noinspection AlterInForeachInspection | ok here */ - foreach ($language_all_chars as $key => &$value) { - $return[$value][] = $key; - } - - $CHARS_ARRAY[$cacheKey] = $return; - - return $return; - } - - /** - * Returns an replacement array for ASCII methods with one language. - * - * For example, German will map 'ä' to 'ae', while other languages - * will simply return e.g. 'a'. - * - * EXAMPLE: - * $array = ASCII::charsArrayWithOneLanguage('ru'); - * $tmpKey = \array_search('yo', $array['replace']); - * echo $array['orig'][$tmpKey]; // 'ё' - * - * - * @param string $language [optional]

Language of the source string e.g.: en, de_at, or de-ch. - * (default is 'en') | ASCII::*_LANGUAGE_CODE

- * @param bool $replace_extra_symbols [optional]

Add some more replacements e.g. "£" with " pound ".

- * @param bool $asOrigReplaceArray [optional]

TRUE === return {orig: list, replace: list} - * array

- * - * @psalm-pure - * - * @return ($asOrigReplaceArray is true ? array{orig: list, replace: list} : array) - * - * @phpstan-param ASCII::*_LANGUAGE_CODE $language - */ - public static function charsArrayWithOneLanguage( - string $language = self::ENGLISH_LANGUAGE_CODE, - bool $replace_extra_symbols = false, - bool $asOrigReplaceArray = true - ): array { - $language = self::get_language($language); - - // init - static $CHARS_ARRAY = []; - $cacheKey = '' . $replace_extra_symbols . '-' . $asOrigReplaceArray; - - // check static cache - if (isset($CHARS_ARRAY[$cacheKey][$language])) { - return $CHARS_ARRAY[$cacheKey][$language]; - } - - if ($replace_extra_symbols) { - self::prepareAsciiAndExtrasMaps(); - - if (isset(self::$ASCII_MAPS_AND_EXTRAS[$language])) { - $tmpArray = self::$ASCII_MAPS_AND_EXTRAS[$language]; - - if ($asOrigReplaceArray) { - $CHARS_ARRAY[$cacheKey][$language] = [ - 'orig' => \array_keys($tmpArray), - 'replace' => \array_values($tmpArray), - ]; - } else { - $CHARS_ARRAY[$cacheKey][$language] = $tmpArray; - } - } else { - if ($asOrigReplaceArray) { - $CHARS_ARRAY[$cacheKey][$language] = [ - 'orig' => [], - 'replace' => [], - ]; - } else { - $CHARS_ARRAY[$cacheKey][$language] = []; - } - } - } else { - self::prepareAsciiMaps(); - - if (isset(self::$ASCII_MAPS[$language])) { - $tmpArray = self::$ASCII_MAPS[$language]; - - if ($asOrigReplaceArray) { - $CHARS_ARRAY[$cacheKey][$language] = [ - 'orig' => \array_keys($tmpArray), - 'replace' => \array_values($tmpArray), - ]; - } else { - $CHARS_ARRAY[$cacheKey][$language] = $tmpArray; - } - } else { - if ($asOrigReplaceArray) { - $CHARS_ARRAY[$cacheKey][$language] = [ - 'orig' => [], - 'replace' => [], - ]; - } else { - $CHARS_ARRAY[$cacheKey][$language] = []; - } - } - } - - return $CHARS_ARRAY[$cacheKey][$language] ?? ['orig' => [], 'replace' => []]; - } - - /** - * Returns an replacement array for ASCII methods with multiple languages. - * - * EXAMPLE: - * $array = ASCII::charsArrayWithSingleLanguageValues(); - * $tmpKey = \array_search('hnaik', $array['replace']); - * echo $array['orig'][$tmpKey]; // '၌' - * - * - * @param bool $replace_extra_symbols [optional]

Add some more replacements e.g. "£" with " pound ".

- * @param bool $asOrigReplaceArray [optional]

TRUE === return {orig: list, replace: list} - * array

- * - * @psalm-pure - * - * @return ($asOrigReplaceArray is true ? array{orig: list, replace: list} : array) - */ - public static function charsArrayWithSingleLanguageValues( - bool $replace_extra_symbols = false, - bool $asOrigReplaceArray = true - ): array { - // init - static $CHARS_ARRAY = []; - $cacheKey = '' . $replace_extra_symbols . '-' . $asOrigReplaceArray; - - if (isset($CHARS_ARRAY[$cacheKey])) { - return $CHARS_ARRAY[$cacheKey]; - } - - if ($replace_extra_symbols) { - self::prepareAsciiAndExtrasMaps(); - - /* @noinspection AlterInForeachInspection | ok here */ - foreach (self::$ASCII_MAPS_AND_EXTRAS ?? [] as &$map) { - $CHARS_ARRAY[$cacheKey][] = $map; - } - } else { - self::prepareAsciiMaps(); - - /* @noinspection AlterInForeachInspection | ok here */ - foreach (self::$ASCII_MAPS ?? [] as &$map) { - $CHARS_ARRAY[$cacheKey][] = $map; - } - } - - $CHARS_ARRAY[$cacheKey] = \array_merge([], ...$CHARS_ARRAY[$cacheKey]); - - if ($asOrigReplaceArray) { - $CHARS_ARRAY[$cacheKey] = [ - 'orig' => \array_keys($CHARS_ARRAY[$cacheKey]), - 'replace' => \array_values($CHARS_ARRAY[$cacheKey]), - ]; - } - - return $CHARS_ARRAY[$cacheKey]; - } - - /** - * Accepts a string and removes all non-UTF-8 characters from it + extras if needed. - * - * @param string $str

The string to be sanitized.

- * @param bool $normalize_whitespace [optional]

Set to true, if you need to normalize the - * whitespace.

- * @param bool $normalize_msword [optional]

Set to true, if you need to normalize MS Word chars - * e.g.: "…" - * => "..."

- * @param bool $keep_non_breaking_space [optional]

Set to true, to keep non-breaking-spaces, in - * combination with - * $normalize_whitespace

- * @param bool $remove_invisible_characters [optional]

Set to false, if you not want to remove invisible - * characters e.g.: "\0"

- * @param bool $remove_invalid_utf8 [optional]

Set to true to discard malformed UTF-8 byte - * sequences before other normalization steps.

- * - * @psalm-pure - * - * @return string - *

A clean UTF-8 string.

- */ - public static function clean( - string $str, - bool $normalize_whitespace = true, - bool $keep_non_breaking_space = false, - bool $normalize_msword = true, - bool $remove_invisible_characters = true, - bool $remove_invalid_utf8 = true - ): string { - // http://stackoverflow.com/questions/1401317/remove-non-utf8-characters-from-string - // caused connection reset problem on larger strings - - if ($remove_invalid_utf8) { - $regex = '/ - ( - (?: [\x00-\x7F] # single-byte sequences 0xxxxxxx - | [\xC2-\xDF][\x80-\xBF] # double-byte sequences 110xxxxx 10xxxxxx - | \xE0[\xA0-\xBF][\x80-\xBF] # triple-byte sequences excluding overlongs - | [\xE1-\xEC\xEE-\xEF][\x80-\xBF]{2} # triple-byte sequences excluding surrogates - | \xED[\x80-\x9F][\x80-\xBF] # triple-byte sequences excluding surrogates - | \xF0[\x90-\xBF][\x80-\xBF]{2} # quadruple-byte sequences excluding overlongs - | [\xF1-\xF3][\x80-\xBF]{3} # quadruple-byte sequences - | \xF4[\x80-\x8F][\x80-\xBF]{2} # quadruple-byte sequences up to U+10FFFF - ){1,100} # ...one or more times - ) - | ( [\x80-\xBF] ) # invalid byte in range 10000000 - 10111111 - | ( [\xC0-\xFF] ) # invalid byte in range 11000000 - 11111111 - /x'; - $str = (string) \preg_replace($regex, '$1', $str); - } - - if ($normalize_whitespace) { - $str = self::normalize_whitespace($str, $keep_non_breaking_space); - } - - if ($normalize_msword) { - $str = self::normalize_msword($str); - } - - if ($remove_invisible_characters) { - $str = self::remove_invisible_characters($str); - } - - return $str; - } - - /** - * Checks if a string is 7-bit ASCII. - * - * EXAMPLE: - * ASCII::is_ascii('白'); // false - * - * - * @param string $str

The string to check.

- * - * @psalm-pure - * - * @return bool - *

- * true if it is ASCII
- * false otherwise - *

- */ - public static function is_ascii(string $str): bool - { - if ($str === '') { - return true; - } - - return !\preg_match('/' . self::$REGEX_ASCII . '/', $str); - } - - /** - * Returns a string with smart quotes, ellipsis characters, and dashes from - * Windows-1252 (commonly used in Word documents) replaced by their ASCII - * equivalents. - * - * EXAMPLE: - * ASCII::normalize_msword('„Abcdef…”'); // '"Abcdef..."' - * - * - * @param string $str

The string to be normalized.

- * - * @psalm-pure - * - * @return string - *

A string with normalized characters for commonly used chars in Word documents.

- */ - public static function normalize_msword(string $str): string - { - if ($str === '') { - return ''; - } - - static $MSWORD_CACHE = ['orig' => [], 'replace' => []]; - - if (empty($MSWORD_CACHE['orig'])) { - self::prepareAsciiMaps(); - - $map = self::$ASCII_MAPS[self::EXTRA_MSWORD_CHARS_LANGUAGE_CODE] ?? []; - - $MSWORD_CACHE = [ - 'orig' => \array_keys($map), - 'replace' => \array_values($map), - ]; - } - - return \str_replace($MSWORD_CACHE['orig'], $MSWORD_CACHE['replace'], $str); - } - - /** - * Normalize the whitespace. - * - * EXAMPLE: - * ASCII::normalize_whitespace("abc-\xc2\xa0-öäü-\xe2\x80\xaf-\xE2\x80\xAC", true); // "abc-\xc2\xa0-öäü- -" - * - * - * @param string $str

The string to be normalized.

- * @param bool $keepNonBreakingSpace [optional]

Set to true, to keep non-breaking-spaces.

- * @param bool $keepBidiUnicodeControls [optional]

Set to true, to keep non-printable (for the web) - * bidirectional text chars.

- * @param bool $normalize_control_characters [optional]

Set to true, to convert e.g. LINE-, PARAGRAPH-SEPARATOR with "\n" and LINE TABULATION with "\t".

- * - * @psalm-pure - * - * @return string - *

A string with normalized whitespace.

- */ - public static function normalize_whitespace( - string $str, - bool $keepNonBreakingSpace = false, - bool $keepBidiUnicodeControls = false, - bool $normalize_control_characters = false - ): string { - if ($str === '') { - return ''; - } - - static $WHITESPACE_CACHE = []; - $cacheKey = (int) $keepNonBreakingSpace; - - if ($normalize_control_characters) { - $str = \str_replace( - [ - "\x0d\x0c", // 'END OF LINE' - "\xe2\x80\xa8", // 'LINE SEPARATOR' - "\xe2\x80\xa9", // 'PARAGRAPH SEPARATOR' - "\x0c", // 'FORM FEED' // "\f" - "\x0b", // 'VERTICAL TAB' // "\v" - ], - [ - "\n", - "\n", - "\n", - "\n", - "\t", - ], - $str - ); - } - - if (!isset($WHITESPACE_CACHE[$cacheKey])) { - self::prepareAsciiMaps(); - - $WHITESPACE_CACHE[$cacheKey] = self::$ASCII_MAPS[self::EXTRA_WHITESPACE_CHARS_LANGUAGE_CODE] ?? []; - - if ($keepNonBreakingSpace) { - unset($WHITESPACE_CACHE[$cacheKey]["\xc2\xa0"]); - } - - $WHITESPACE_CACHE[$cacheKey] = array_keys($WHITESPACE_CACHE[$cacheKey]); - } - - if (!$keepBidiUnicodeControls) { - static $BIDI_UNICODE_CONTROLS_CACHE = null; - - if ($BIDI_UNICODE_CONTROLS_CACHE === null) { - $BIDI_UNICODE_CONTROLS_CACHE = self::$BIDI_UNI_CODE_CONTROLS_TABLE; - } - - $str = \str_replace($BIDI_UNICODE_CONTROLS_CACHE, '', $str); - } - - return \str_replace($WHITESPACE_CACHE[$cacheKey], ' ', $str); - } - - /** - * Remove invisible characters from a string. - * - * This prevents malicious code injection through null bytes or other control characters. - * - * copy&past from https://github.com/bcit-ci/CodeIgniter/blob/develop/system/core/Common.php - * - * @param string $str - * @param bool $url_encoded - * @param string $replacement - * @param bool $keep_basic_control_characters - * - * @psalm-pure - * - * @return string - */ - public static function remove_invisible_characters( - string $str, - bool $url_encoded = false, - string $replacement = '', - bool $keep_basic_control_characters = true - ): string { - // init - $non_displayables = []; - - // every control character except: - // - newline (dec 10), - // - carriage return (dec 13), - // - horizontal tab (dec 09) - if ($url_encoded) { - $non_displayables[] = '/%0[0-8bcefBCEF]/'; // url encoded 00-08, 11, 12, 14, 15 - $non_displayables[] = '/%1[0-9a-fA-F]/'; // url encoded 16-31 - } - - if ($keep_basic_control_characters) { - $non_displayables[] = '/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+/S'; // 00-08, 11, 12, 14-31, 127 - } else { - $str = self::normalize_whitespace($str, false, false, true); - $non_displayables[] = '/[^\P{C}\s]/u'; - } - - do { - $str = (string) \preg_replace($non_displayables, $replacement, $str, -1, $count); - } while ($count !== 0); - - return $str; - } - - /** - * WARNING: This method will return broken characters and is only for special cases. - * - * Convert two UTF-8 encoded strings to a single-byte strings suitable for - * functions that need the same string length after the conversion. - * - * The function simply uses (and updates) a tailored dynamic encoding - * (in/out map parameter) where non-ascii characters are remapped to - * the range [128-255] in order of appearance. - * - * @return array{0: string, 1: string} - */ - public static function to_ascii_remap(string $str1, string $str2): array - { - $charMap = []; - $str1 = self::to_ascii_remap_intern($str1, $charMap); - $str2 = self::to_ascii_remap_intern($str2, $charMap); - - return [$str1, $str2]; - } - - /** - * Returns an ASCII version of the string. A set of non-ASCII characters are - * replaced with their closest ASCII counterparts, and the rest are removed - * by default. The language or locale of the source string can be supplied - * for language-specific transliteration in any of the following formats: - * en, en_GB, or en-GB. For example, passing "de" results in "äöü" mapping - * to "aeoeue" rather than "aou" as in other languages. - * - * EXAMPLE: - * ASCII::to_ascii('�Düsseldorf�', 'en'); // Dusseldorf - * - * - * @param string $str

The input string.

- * @param string $language [optional]

Language of the source string. - * (default is 'en') | ASCII::*_LANGUAGE_CODE

- * @param bool $remove_unsupported_chars [optional]

Whether to remove the - * unsupported characters.

- * @param bool $replace_extra_symbols [optional]

Add some more replacements e.g. "£" with " pound - * ".

- * @param bool $use_transliterate [optional]

Use ASCII::to_transliterate() for unknown chars.

- * @param bool $replace_single_chars_only [optional]

Single char replacement is better for the - * performance, but some languages need to replace more than one char - * at the same time. If FALSE === auto-setting, depended on the - * language

- * - * @psalm-pure - * - * @return string - *

A string that contains only ASCII characters.

- * - * @phpstan-param ASCII::*_LANGUAGE_CODE $language - */ - public static function to_ascii( - string $str, - string $language = self::ENGLISH_LANGUAGE_CODE, - bool $remove_unsupported_chars = true, - bool $replace_extra_symbols = false, - bool $use_transliterate = false, - bool $replace_single_chars_only = false - ): string { - if ($str === '') { - return ''; - } - - // fast path: pure printable ASCII — single regex covers is_ascii + no-control-chars - if ( - !$replace_extra_symbols - && - !\preg_match('/' . self::REGEX_PRINTABLE_ASCII . '/', $str) - ) { - return $str; - } - - $language = self::get_language($language); - /** @phpstan-var ASCII::*_LANGUAGE_CODE $language - hack for phpstan */ - - if ( - !$replace_extra_symbols - && - \strlen($str) <= 64 - ) { - $isValidUtf8 = true; - $str = self::to_ascii_replace($str, $language, $replace_extra_symbols, $replace_single_chars_only, $isValidUtf8); - - if ($isValidUtf8) { - self::prepareAsciiMaps(); - if (!isset(self::$ASCII_MAPS[$language])) { - $use_transliterate = true; - } - - if ($use_transliterate) { - $str = self::to_transliterate($str, null, false); - } - - if ($remove_unsupported_chars) { - if (!\preg_match('/' . self::REGEX_PRINTABLE_ASCII . '/', $str)) { - return $str; - } - - $str = (string) \str_replace(["\r\n", "\n", "\r", "\t"], ' ', $str); - $str = (string) \preg_replace('/' . self::$REGEX_ASCII . '/', '', $str); - } - - return $str; - } - } - - // secondary fast path: only 7-bit bytes (no multibyte UTF-8). - // Strings with control chars (\x00-\x1F, \x7F) but no high bytes - // still need $remove_unsupported_chars cleanup, but never need the - // strtr replacement map because all replaceable characters are ≥ 0x80. - if ( - !$replace_extra_symbols - && - !\preg_match('/[\x80-\xFF]/', $str) - ) { - if ($remove_unsupported_chars) { - $str = (string) \str_replace(["\r\n", "\n", "\r", "\t"], ' ', $str); - $str = (string) \preg_replace('/' . self::$REGEX_ASCII . '/', '', $str); - } - - return $str; - } - - // invalid UTF-8: apply replacement map first, then clean up. - // strtr() can match partial byte sequences from malformed UTF-8 against - // valid lookup keys, producing incorrect output, so we must fall back to - // the clean-then-transliterate path for invalid input. - if (\preg_match('//u', $str) !== 1) { - self::prepareAsciiMaps(); - - if (!isset(self::$ASCII_MAPS[$language])) { - $use_transliterate = true; - } - - if ($use_transliterate) { - $str = self::to_transliterate($str, null, false); - } - - if ($remove_unsupported_chars) { - if (!\preg_match('/' . self::REGEX_PRINTABLE_ASCII . '/', $str)) { - return $str; - } - - $str = (string) \str_replace(["\r\n", "\n", "\r", "\t"], ' ', $str); - $str = (string) \preg_replace('/' . self::$REGEX_ASCII . '/', '', $str); - } - - return $str; - } - - self::prepareAsciiMaps(); - if (!isset(self::$ASCII_MAPS[$language])) { - $use_transliterate = true; - } - - // For English transliteration mode, going directly through - // to_transliterate() avoids an expensive replacement-map pass that - // rarely contributes useful substitutions for non-Latin long strings. - if ( - $use_transliterate - && - !$replace_extra_symbols - && - !$replace_single_chars_only - && - $language === self::ENGLISH_LANGUAGE_CODE - ) { - $str = self::to_transliterate($str, null, false); - } else { - // Apply the ASCII replacement map via strtr(). - $str = self::to_ascii_replace($str, $language, $replace_extra_symbols, $replace_single_chars_only); - - if ($use_transliterate) { - $str = self::to_transliterate($str, null, false); - } - } - - if ($remove_unsupported_chars) { - if (!\preg_match('/' . self::REGEX_PRINTABLE_ASCII . '/', $str)) { - return $str; - } - - $str = (string) \str_replace(["\r\n", "\n", "\r", "\t"], ' ', $str); - $str = (string) \preg_replace('/' . self::$REGEX_ASCII . '/', '', $str); - } - - return $str; - } - - /** - * Convert given string to safe filename (and keep string case). - * - * EXAMPLE: - * ASCII::to_filename('שדגשדג.png', true)); // 'shdgshdg.png' - * - * - * @param string $str

The string input.

- * @param bool $use_transliterate

ASCII::to_transliterate() is used by default - unsafe characters are - * simply replaced with hyphen otherwise.

- * @param string $fallback_char

The fallback character. - "-" is the default

- * - * @psalm-pure - * - * @return string - *

A string that contains only safe characters for a filename.

- */ - public static function to_filename( - string $str, - bool $use_transliterate = true, - string $fallback_char = '-' - ): string { - if ($use_transliterate) { - $str = self::to_transliterate($str, $fallback_char); - } - - $fallback_char_escaped = \preg_quote($fallback_char, '/'); - - $str = (string) \preg_replace( - [ - '/[^' . $fallback_char_escaped . '.\\-a-zA-Z\d\\s]/', // 1) remove un-needed chars - '/\s+/u', // 2) convert spaces to $fallback_char - '/[' . $fallback_char_escaped . ']+/u', // 3) remove double $fallback_char's - ], - [ - '', - $fallback_char, - $fallback_char, - ], - $str - ); - - return \trim($str, $fallback_char); - } - - /** - * Converts a string into a URL-friendly slug. - * - * - This includes replacing non-ASCII characters with their closest ASCII equivalents, removing remaining - * non-ASCII and non-alphanumeric characters, and replacing whitespace with $separator. - * - The separator defaults to a single dash, and the string is also converted to lowercase. - * - The language of the source string can also be supplied for language-specific transliteration. - * - * @param string $str

The string input.

- * @param string $separator [optional]

The string used to replace whitespace.

- * @param string $language [optional]

Language of the source string. - * (default is 'en') | ASCII::*_LANGUAGE_CODE

- * @param array $replacements [optional]

A map of replaceable strings.

- * @param bool $replace_extra_symbols [optional]

Add some more replacements e.g. "£" with " - * pound ".

- * @param bool $use_str_to_lower [optional]

Use "string to lower" for the input.

- * @param bool $use_transliterate [optional]

Use ASCII::to_transliterate() for unknown - * chars.

- * @psalm-pure - * - * @return string - *

The URL-friendly slug.

- * - * @phpstan-param ASCII::*_LANGUAGE_CODE $language - */ - public static function to_slugify( - string $str, - string $separator = '-', - string $language = self::ENGLISH_LANGUAGE_CODE, - array $replacements = [], - bool $replace_extra_symbols = false, - bool $use_str_to_lower = true, - bool $use_transliterate = false - ): string { - if ($str === '') { - return ''; - } - - foreach ($replacements as $from => $to) { - $str = \str_replace($from, $to, $str); - } - - if ( - !$replace_extra_symbols - && - !$use_transliterate - && - self::get_language($language) === self::ENGLISH_LANGUAGE_CODE - && - !\preg_match('/' . self::REGEX_PRINTABLE_ASCII . '/', $str) - ) { - // Pure printable ASCII does not need transliteration or remapping. - } else { - $str = self::to_ascii( - $str, - $language, - false, - $replace_extra_symbols, - $use_transliterate - ); - } - - $str = \str_replace('@', $separator, $str); - - if ($use_str_to_lower) { - $str = \strtolower($str); - $str = (string) \preg_replace( - '/[^a-z\\d\\s\\-_' . \preg_quote($separator, '/') . ']/', - '', - $str - ); - } else { - $str = (string) \preg_replace( - '/[^a-zA-Z\\d\\s\\-_' . \preg_quote($separator, '/') . ']/', - '', - $str - ); - $str = (string) \preg_replace('/\\B([A-Z])/', '-\1', $str); - } - - $str = (string) \preg_replace('/^[\'\\s]+|[\'\\s]+$/', '', $str); - $str = (string) \preg_replace('/[\\-_\\s]+/', $separator, $str); - - $l = \strlen($separator); - if ($l && \strpos($str, $separator) === 0) { - $str = (string) \substr($str, $l); - } - - if (\substr($str, -$l) === $separator) { - $str = (string) \substr($str, 0, \strlen($str) - $l); - } - - return $str; - } - - /** - * Returns an ASCII version of the string. A set of non-ASCII characters are - * replaced with their closest ASCII counterparts, and the rest are removed - * unless instructed otherwise. - * - * EXAMPLE: - * ASCII::to_transliterate('déjà σσς iıii'); // 'deja sss iiii' - * - * - * @param string $str

The input string.

- * @param string|null $unknown [optional]

Character use if character unknown. (default is '?') - * But you can also use NULL to keep the unknown chars.

- * @param bool $strict [optional]

Use "transliterator_transliterate()" from PHP-Intl - * - * @psalm-pure - * - * @return string - *

A String that contains only ASCII characters.

- */ - public static function to_transliterate( - string $str, - $unknown = '?', - bool $strict = false - ): string { - static $UTF8_TO_TRANSLIT = null; - - static $TRANSLITERATOR = null; - - static $SUPPORT_INTL = null; - - /** @var array */ - static $TRANSLIT_CHAR_CACHE = []; - /** @var array> */ - static $WARM_MAPS = []; - - if ($str === '') { - return ''; - } - - // Long pure printable ASCII strings are common in benchmarks and can - // skip the broader ASCII/control-character validator entirely. - if ( - isset($str[63]) - && - !\preg_match('/' . self::REGEX_PRINTABLE_ASCII . '/', $str) - ) { - return $str; - } - - // check if we only have ASCII, first (better performance) - if (\preg_match('/' . self::$REGEX_ASCII . '/', $str) === 0) { - return $str; - } - - // Prefix the cache key so unknown=null does not collide with an - // explicit fallback string such as "\x00". - $unknownCacheKey = $unknown === null - ? "\x00null" - : "\x01" . $unknown; - - if ($SUPPORT_INTL === null) { - $SUPPORT_INTL = \extension_loaded('intl'); - } - - $warmPathAlreadyApplied = false; - if ( - $unknown !== '?' - && - isset($WARM_MAPS[$unknownCacheKey]) - && - \preg_match('//u', $str) === 1 - ) { - $warmStr = \strtr($str, $WARM_MAPS[$unknownCacheKey]); - if (!\preg_match('/[\x80-\xFF\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/', $warmStr)) { - return $warmStr; - } - - $str = $warmStr; - $warmPathAlreadyApplied = true; - } - - // only run the heavy clean() regex when the string has invalid UTF-8 - if (\preg_match('//u', $str) === 1) { - if ( - $unknown === '?' - || - \strpos($str, "\xC2") !== false - || - \strpos($str, "\xE2") !== false - || - \preg_match('/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/', $str) === 1 - ) { - $str_before_clean = $str; - $str = self::normalize_whitespace($str); - $str = self::normalize_msword($str); - $str = self::remove_invisible_characters($str); - $str = self::clean( - $str, - true, - false, - true, - false - ); - if ( - $str !== $str_before_clean - && - \preg_match('/' . self::$REGEX_ASCII . '/', $str) === 0 - ) { - return $str; - } - } - } else { - $str_before_clean = $str; - $str = self::clean($str); - if ( - $str !== $str_before_clean - && - \preg_match('/' . self::$REGEX_ASCII . '/', $str) === 0 - ) { - return $str; - } - } - - if ( - $strict - && - $SUPPORT_INTL === true - ) { - if (!isset($TRANSLITERATOR)) { - // INFO: see "*-Latin" rules via "transliterator_list_ids()" - $TRANSLITERATOR = \transliterator_create('NFKC; [:Nonspacing Mark:] Remove; NFKC; Any-Latin; Latin-ASCII;'); - } - - // INFO: https://unicode.org/cldr/utility/character.jsp - $str_tmp = \transliterator_transliterate($TRANSLITERATOR, $str); - - if ($str_tmp !== false) { - if ( - $str_tmp !== $str - && - \preg_match('/' . self::$REGEX_ASCII . '/', $str_tmp) === 0 - ) { - return $str_tmp; - } - - $str = $str_tmp; - } - } - - if (self::$ORD === null) { - self::$ORD = self::getData('ascii_ord'); - } - - // Copy the memoized ORD table into a local non-null alias so the hot - // callback can read it without repeated nullable static-property checks. - /** @var array $ordMap */ - $ordMap = self::$ORD; - - // warm path: if we already built a map for this $unknown value, try it first - if ( - !$warmPathAlreadyApplied - && - isset($WARM_MAPS[$unknownCacheKey]) - ) { - $str = \strtr($str, $WARM_MAPS[$unknownCacheKey]); - - if (!\preg_match('/[\x80-\xFF]/', $str)) { - return $str; - } - } - - // collect unique non-ASCII characters and build a strtr map - if (\preg_match_all(self::UTF8_MULTIBYTE_SEQUENCE_RX, $str, $nonAsciiMatches)) { - $charMap = []; - $seen = []; - - foreach ($nonAsciiMatches[0] as $c) { - if (isset($seen[$c])) { - continue; - } - $seen[$c] = true; - - if (!\array_key_exists($c, $TRANSLIT_CHAR_CACHE)) { - $ordC0 = $ordMap[$c[0]]; - $ordC1 = $ordMap[$c[1]]; - - if ($ordC0 <= 223) { - $ord = ($ordC0 - 192) * 64 + ($ordC1 - 128); - } elseif ($ordC0 <= 239) { - $ord = ($ordC0 - 224) * 4096 + ($ordC1 - 128) * 64 + ($ordMap[$c[2]] - 128); - } else { - $ord = ($ordC0 - 240) * 262144 + ($ordC1 - 128) * 4096 + ($ordMap[$c[2]] - 128) * 64 + ($ordMap[$c[3]] - 128); - } - - $bank = $ord >> 8; - if (!isset($UTF8_TO_TRANSLIT[$bank])) { - $UTF8_TO_TRANSLIT[$bank] = self::getDataIfExists(\sprintf('x%03x', $bank)); - } - - $bankPos = $ord & 255; - - if ( - isset($UTF8_TO_TRANSLIT[$bank][$bankPos]) - && - !isset(self::UNKNOWN_TRANSLITERATION_MARKERS[$UTF8_TO_TRANSLIT[$bank][$bankPos]]) - ) { - $TRANSLIT_CHAR_CACHE[$c] = $UTF8_TO_TRANSLIT[$bank][$bankPos]; - } else { - $TRANSLIT_CHAR_CACHE[$c] = false; - } - } - - $cached = $TRANSLIT_CHAR_CACHE[$c]; - - if ($cached === false) { - if ($unknown !== null) { - $charMap[$c] = $unknown; - } - } elseif ($cached === '' && $unknown === null) { - // keep original char - } else { - $charMap[$c] = $cached; - } - } - - // merge new entries into the warm map for future calls - if ($charMap !== []) { - if (isset($WARM_MAPS[$unknownCacheKey])) { - foreach ($charMap as $k => $v) { - $WARM_MAPS[$unknownCacheKey][$k] = $v; - } - } else { - $WARM_MAPS[$unknownCacheKey] = $charMap; - } - - return \strtr($str, $WARM_MAPS[$unknownCacheKey]); - } - } - - return $str; - } - - /** - * WARNING: This method will return broken characters and is only for special cases. - * - * Convert a UTF-8 encoded string to a single-byte string suitable for - * functions that need the same string length after the conversion. - * - * The function simply uses (and updates) a tailored dynamic encoding - * (in/out map parameter) where non-ascii characters are remapped to - * the range [128-255] in order of appearance. - * - * Thus, it supports up to 128 different multibyte code points max over - * the whole set of strings sharing this encoding. - * - * Source: https://github.com/KEINOS/mb_levenshtein - * - * @param string $str

UTF-8 string to be converted to extended ASCII.

- * @param array $map

Internal-Map of code points to ASCII characters.

- * - * @return string - *

Mapped broken string.

- * - * @phpstan-param array $map - */ - private static function to_ascii_remap_intern(string $str, array &$map): string - { - // find all utf-8 characters - $matches = []; - if (!\preg_match_all('/[\xC0-\xF7][\x80-\xBF]+/', $str, $matches)) { - return $str; // plain ascii string - } - - // update the encoding map with the characters not already met - $mapCount = \count($map); - foreach ($matches[0] as $mbc) { - if (!isset($map[$mbc])) { - $map[$mbc] = \chr(128 + $mapCount); - ++$mapCount; - } - } - - // finally, remap non-ascii characters - return \strtr($str, $map); - } - - - /** - * Apply the cached ASCII replacement map to a string via strtr(). - * - * For medium and long UTF-8 inputs, filtering the replacement table by bytes - * present in the input avoids feeding the full replacement table to strtr() - * without introducing per-input cache growth. - * - * @phpstan-param ASCII::*_LANGUAGE_CODE $language - * @param-out bool $isValidUtf8 - */ - private static function to_ascii_replace( - string $str, - string $language, - bool $replace_extra_symbols, - bool $replace_single_chars_only, - ?bool &$isValidUtf8 = null - ): string { - static $REPLACE_HELPER_CACHE = []; - static $MAP_BY_FIRST_BYTE = []; - static $SHORT_FILTERED_MAP_CACHE = []; - static $SHORT_FILTERED_MAP_CACHE_QUEUE = []; - $cacheKey = $language . '-' . (int) $replace_extra_symbols . '-' . (int) $replace_single_chars_only; - - if (!isset($REPLACE_HELPER_CACHE[$cacheKey])) { - $langAll = self::getAsciiAllReplacementMap($replace_extra_symbols, $replace_single_chars_only); - - $langSpecific = self::getAsciiLanguageReplacementMap($language, $replace_extra_symbols, $replace_single_chars_only); - - if ($langSpecific === []) { - $REPLACE_HELPER_CACHE[$cacheKey] = $langAll; - } else { - $REPLACE_HELPER_CACHE[$cacheKey] = \array_merge([], $langAll, $langSpecific); - } - - // Pre-index by first byte so long-string calls can cheaply skip most of - // the replacement table instead of feeding the full language map to strtr(). - $MAP_BY_FIRST_BYTE[$cacheKey] = []; - foreach ($REPLACE_HELPER_CACHE[$cacheKey] as $key => $val) { - $MAP_BY_FIRST_BYTE[$cacheKey][$key[0]][$key] = $val; - } - } - - if ( - !$replace_extra_symbols - && - \strlen($str) <= 64 - ) { - $matchResult = \preg_match_all('/' . self::REGEX_PRINTABLE_ASCII . '/u', $str, $matches); - if ($matchResult === false) { - $isValidUtf8 = false; - - return $str; - } - - $isValidUtf8 = true; - - if (!$matchResult) { - return $str; - } - - $cache = $REPLACE_HELPER_CACHE[$cacheKey]; - $chars = $matches[0]; - $charCount = \count($chars); - - if ($charCount === 1 && isset($cache[$chars[0]])) { - return \str_replace($chars[0], $cache[$chars[0]], $str); - } - - $shortCacheKey = $cacheKey . ':' . \implode('|', $chars); - - if (isset($SHORT_FILTERED_MAP_CACHE[$shortCacheKey])) { - return \strtr($str, $SHORT_FILTERED_MAP_CACHE[$shortCacheKey]); - } - - $filteredMap = []; - - if ( - !$replace_single_chars_only - && - $charCount >= 2 - ) { - // Mixed keys like "A̧" (ASCII + combining mark) are rare; let - // strtr handle those with the full map to preserve correctness. - if (\preg_match('/[A-Za-z][\x{0300}-\x{036F}]/u', $str) === 1) { - return \strtr($str, $cache); - } - - for ($span = 5; $span >= 2; --$span) { - if ($charCount < $span) { - continue; - } - - $lastIndex = $charCount - $span; - for ($idx = 0; $idx <= $lastIndex; ++$idx) { - $candidate = ''; - for ($offset = 0; $offset < $span; ++$offset) { - $candidate .= $chars[$idx + $offset]; - } - - if (isset($cache[$candidate])) { - $filteredMap[$candidate] = $cache[$candidate]; - } - } - } - } - - foreach ($chars as $char) { - if (isset($cache[$char])) { - $filteredMap[$char] = $cache[$char]; - } - } - - if ($filteredMap !== []) { - $SHORT_FILTERED_MAP_CACHE[$shortCacheKey] = $filteredMap; - $SHORT_FILTERED_MAP_CACHE_QUEUE[] = $shortCacheKey; - if (\count($SHORT_FILTERED_MAP_CACHE_QUEUE) > 256) { - $oldestKey = \array_shift($SHORT_FILTERED_MAP_CACHE_QUEUE); - if ($oldestKey !== null) { - unset($SHORT_FILTERED_MAP_CACHE[$oldestKey]); - } - } - - return \strtr($str, $filteredMap); - } - - return $str; - } - - $isValidUtf8 = true; - - // Build a filtered map containing only entries whose - // leading byte is present in this specific input string. - $indexedMap = &$MAP_BY_FIRST_BYTE[$cacheKey]; - $filteredMap = []; - foreach (\count_chars($str, 1) as $byte => $count) { - $fb = \chr($byte); - if (isset($indexedMap[$fb])) { - foreach ($indexedMap[$fb] as $k => $v) { - $filteredMap[$k] = $v; - } - } - } - - if ($filteredMap !== []) { - $str = \strtr($str, $filteredMap); - } - - return $str; - } - - /** - * Get the language from a string. - * - * e.g.: de_at -> de_at - * de_DE -> de - * DE_DE -> de - * de-de -> de - * - * @return string - */ - private static function get_language(string $language) - { - if ($language === '') { - return ''; - } - - static $LANGUAGE_CACHE = []; - if (isset($LANGUAGE_CACHE[$language])) { - return $LANGUAGE_CACHE[$language]; - } - - if ( - \strpos($language, '_') === false - && - \strpos($language, '-') === false - ) { - return $LANGUAGE_CACHE[$language] = \strtolower($language); - } - - $language_tmp = \str_replace('-', '_', \strtolower($language)); - - $regex = '/(?[a-z]+)_\g{first}/'; - - return $LANGUAGE_CACHE[$language] = (string) \preg_replace($regex, '$1', $language_tmp); - } - - /** - * @return array - */ - private static function getAsciiAllReplacementMap( - bool $replace_extra_symbols, - bool $replace_single_chars_only - ): array { - static $CACHE = []; - $cacheKey = (int) $replace_extra_symbols . '-' . (int) $replace_single_chars_only; - - if (isset($CACHE[$cacheKey])) { - return $CACHE[$cacheKey]; - } - - $CACHE[$cacheKey] = self::filterAsciiReplacementMap( - self::charsArrayWithSingleLanguageValues($replace_extra_symbols, false), - $replace_single_chars_only - ); - - return $CACHE[$cacheKey]; - } - - /** - * @phpstan-param ASCII::*_LANGUAGE_CODE $language - * - * @return array - */ - private static function getAsciiLanguageReplacementMap( - string $language, - bool $replace_extra_symbols, - bool $replace_single_chars_only - ): array { - static $CACHE = []; - $cacheKey = $language . '-' . (int) $replace_extra_symbols . '-' . (int) $replace_single_chars_only; - - if (isset($CACHE[$cacheKey])) { - return $CACHE[$cacheKey]; - } - - $CACHE[$cacheKey] = self::filterAsciiReplacementMap( - self::charsArrayWithOneLanguage($language, $replace_extra_symbols, false), - $replace_single_chars_only - ); - - return $CACHE[$cacheKey]; - } - - /** - * Get data from "/data/*.php". - * - * @return array - */ - private static function getData(string $file) - { - return include __DIR__ . '/data/' . $file . '.php'; - } - - /** - * Get data from "/data/*.php". - * - * @return array - */ - private static function getDataIfExists(string $file): array - { - $file = __DIR__ . '/data/' . $file . '.php'; - if (\is_file($file)) { - return include $file; - } - - return []; - } - - /** - * @param array $map - * - * @return array - */ - private static function filterAsciiReplacementMap(array $map, bool $replace_single_chars_only): array - { - if ($replace_single_chars_only === false) { - return $map; - } - - foreach ($map as $char => $replacement) { - // Single UTF-8 code points are at most 4 bytes, so 5+ bytes - // can be rejected without the regex check. - if ( - isset($char[4]) - || - \preg_match('/^.$/us', $char) !== 1 - ) { - unset($map[$char]); - } - } - - return $map; - } - - /** - * @return void - */ - private static function prepareAsciiAndExtrasMaps() - { - if (self::$ASCII_MAPS_AND_EXTRAS === null) { - self::prepareAsciiMaps(); - self::prepareAsciiExtras(); - - self::$ASCII_MAPS_AND_EXTRAS = \array_merge_recursive( - self::$ASCII_MAPS ?? [], - self::$ASCII_EXTRAS ?? [] - ); - } - } - - /** - * @return void - */ - private static function prepareAsciiMaps() - { - if (self::$ASCII_MAPS === null) { - self::$ASCII_MAPS = self::getData('ascii_by_languages'); - } - } - - /** - * @return void - */ - private static function prepareAsciiExtras() - { - if (self::$ASCII_EXTRAS === null) { - self::$ASCII_EXTRAS = self::getData('ascii_extras_by_languages'); - } - } -} diff --git a/plugins/vendor/voku/portable-ascii/src/voku/helper/data/ascii_by_languages.php b/plugins/vendor/voku/portable-ascii/src/voku/helper/data/ascii_by_languages.php deleted file mode 100644 index 68c3f9d2..00000000 --- a/plugins/vendor/voku/portable-ascii/src/voku/helper/data/ascii_by_languages.php +++ /dev/null @@ -1,2950 +0,0 @@ - [ - 'Á' => 'A', - 'á' => 'a', - 'Ä' => 'A', - 'ä' => 'a', - 'À' => 'A', - 'à' => 'a', - 'Â' => 'A', - 'â' => 'a', - 'É' => 'E', - 'é' => 'e', - 'Ë' => 'E', - 'ë' => 'e', - 'È' => 'E', - 'è' => 'e', - 'Ê' => 'E', - 'ê' => 'e', - 'Í' => 'I', - 'í' => 'i', - 'Ï' => 'I', - 'ï' => 'i', - 'Ì' => 'I', - 'ì' => 'i', - 'Î' => 'I', - 'î' => 'i', - 'Ó' => 'O', - 'ó' => 'o', - 'Ö' => 'O', - 'ö' => 'o', - 'Ò' => 'O', - 'ò' => 'o', - 'Ô' => 'O', - 'ô' => 'o', - 'Ú' => 'U', - 'ú' => 'u', - 'Ü' => 'U', - 'ü' => 'u', - 'Ù' => 'U', - 'ù' => 'u', - 'Û' => 'U', - 'û' => 'u', - 'Ý' => 'Y', - 'ý' => 'y', - 'Ÿ' => 'Y', - ], - // Italian - 'it' => [ - 'à' => 'a', - 'À' => 'A', - 'é' => 'e', - 'É' => 'E', - 'è' => 'e', - 'È' => 'E', - 'ì' => 'i', - 'Ì' => 'I', - 'Ò' => 'O', - 'ò' => 'o', - 'ù' => 'u', - 'Ù' => 'U', - ], - // Macedonian - 'mk' => [ - 'А' => 'A', - 'Б' => 'B', - 'В' => 'V', - 'Г' => 'G', - 'Д' => 'D', - 'Ѓ' => 'Gj', - 'Е' => 'E', - 'Ж' => 'Zh', - 'З' => 'Z', - 'Ѕ' => 'Dz', - 'И' => 'I', - 'Ј' => 'J', - 'К' => 'K', - 'Л' => 'L', - 'Љ' => 'Lj', - 'М' => 'M', - 'Н' => 'N', - 'Њ' => 'Nj', - 'О' => 'O', - 'П' => 'P', - 'Р' => 'R', - 'С' => 'S', - 'Т' => 'T', - 'Ќ' => 'Kj', - 'У' => 'U', - 'Ф' => 'F', - 'Х' => 'H', - 'Ц' => 'C', - 'Ч' => 'Ch', - 'Џ' => 'Dj', - 'Ш' => 'Sh', - 'а' => 'a', - 'б' => 'b', - 'в' => 'v', - 'г' => 'g', - 'д' => 'd', - 'ѓ' => 'gj', - 'е' => 'e', - 'ж' => 'zh', - 'з' => 'z', - 'ѕ' => 'dz', - 'и' => 'i', - 'ј' => 'j', - 'к' => 'k', - 'л' => 'l', - 'љ' => 'lj', - 'м' => 'm', - 'н' => 'n', - 'њ' => 'nj', - 'о' => 'o', - 'п' => 'p', - 'р' => 'r', - 'с' => 's', - 'т' => 't', - 'ќ' => 'kj', - 'у' => 'u', - 'ф' => 'f', - 'х' => 'h', - 'ц' => 'c', - 'ч' => 'ch', - 'џ' => 'dj', - 'ш' => 'sh', - ], - // Portuguese (Brazil) - 'pt' => [ - 'æ' => 'ae', - 'ǽ' => 'ae', - 'À' => 'A', - 'Á' => 'A', - 'Â' => 'A', - 'Ã' => 'A', - 'Å' => 'AA', - 'Ǻ' => 'A', - 'Ă' => 'A', - 'Ǎ' => 'A', - 'Æ' => 'AE', - 'Ǽ' => 'AE', - 'à' => 'a', - 'á' => 'a', - 'â' => 'a', - 'ã' => 'a', - 'å' => 'aa', - 'ǻ' => 'a', - 'ă' => 'a', - 'ǎ' => 'a', - 'ª' => 'a', - 'Ĉ' => 'C', - 'Ċ' => 'C', - 'Ç' => 'C', - 'ç' => 'c', - 'ĉ' => 'c', - 'ċ' => 'c', - 'Ð' => 'Dj', - 'Đ' => 'D', - 'ð' => 'dj', - 'đ' => 'd', - 'È' => 'E', - 'É' => 'E', - 'Ê' => 'E', - 'Ë' => 'E', - 'Ĕ' => 'E', - 'Ė' => 'E', - 'è' => 'e', - 'é' => 'e', - 'ê' => 'e', - 'ë' => 'e', - 'ĕ' => 'e', - 'ė' => 'e', - 'ƒ' => 'f', - 'Ĝ' => 'G', - 'Ġ' => 'G', - 'ĝ' => 'g', - 'ġ' => 'g', - 'Ĥ' => 'H', - 'Ħ' => 'H', - 'ĥ' => 'h', - 'ħ' => 'h', - 'Ì' => 'I', - 'Í' => 'I', - 'Î' => 'I', - 'Ï' => 'I', - 'Ĩ' => 'I', - 'Ĭ' => 'I', - 'Ǐ' => 'I', - 'Į' => 'I', - 'IJ' => 'IJ', - 'ì' => 'i', - 'í' => 'i', - 'î' => 'i', - 'ï' => 'i', - 'ĩ' => 'i', - 'ĭ' => 'i', - 'ǐ' => 'i', - 'į' => 'i', - 'ij' => 'ij', - 'Ĵ' => 'J', - 'ĵ' => 'j', - 'Ĺ' => 'L', - 'Ľ' => 'L', - 'Ŀ' => 'L', - 'ĺ' => 'l', - 'ľ' => 'l', - 'ŀ' => 'l', - 'Ñ' => 'N', - 'ñ' => 'n', - 'ʼn' => 'n', - 'Ò' => 'O', - 'Ó' => 'O', - 'Ô' => 'O', - 'Õ' => 'O', - 'Ō' => 'O', - 'Ŏ' => 'O', - 'Ǒ' => 'O', - 'Ő' => 'O', - 'Ơ' => 'O', - 'Ø' => 'OE', - 'Ǿ' => 'O', - 'Œ' => 'OE', - 'ò' => 'o', - 'ó' => 'o', - 'ô' => 'o', - 'õ' => 'o', - 'ō' => 'o', - 'ŏ' => 'o', - 'ǒ' => 'o', - 'ő' => 'o', - 'ơ' => 'o', - 'ø' => 'oe', - 'ǿ' => 'o', - 'º' => 'o', - 'œ' => 'oe', - 'Ŕ' => 'R', - 'Ŗ' => 'R', - 'ŕ' => 'r', - 'ŗ' => 'r', - 'Ŝ' => 'S', - 'Ș' => 'S', - 'ŝ' => 's', - 'ș' => 's', - 'ſ' => 's', - 'Ţ' => 'T', - 'Ț' => 'T', - 'Ŧ' => 'T', - 'Þ' => 'TH', - 'ţ' => 't', - 'ț' => 't', - 'ŧ' => 't', - 'þ' => 'th', - 'Ù' => 'U', - 'Ú' => 'U', - 'Û' => 'U', - 'Ü' => 'U', - 'Ũ' => 'U', - 'Ŭ' => 'U', - 'Ű' => 'U', - 'Ų' => 'U', - 'Ư' => 'U', - 'Ǔ' => 'U', - 'Ǖ' => 'U', - 'Ǘ' => 'U', - 'Ǚ' => 'U', - 'Ǜ' => 'U', - 'ù' => 'u', - 'ú' => 'u', - 'û' => 'u', - 'ü' => 'u', - 'ũ' => 'u', - 'ŭ' => 'u', - 'ű' => 'u', - 'ų' => 'u', - 'ư' => 'u', - 'ǔ' => 'u', - 'ǖ' => 'u', - 'ǘ' => 'u', - 'ǚ' => 'u', - 'ǜ' => 'u', - 'Ŵ' => 'W', - 'ŵ' => 'w', - 'Ý' => 'Y', - 'Ÿ' => 'Y', - 'Ŷ' => 'Y', - 'ý' => 'y', - 'ÿ' => 'y', - 'ŷ' => 'y', - ], - // Greek(lish) (Elláda) - 'el__greeklish' => [ - 'ΑΥ' => 'AU', - 'ΑΎ' => 'AU', - 'Αυ' => 'Au', - 'Αύ' => 'Au', - 'ΕΊ' => 'EI', - 'ΕΙ' => 'EI', - 'Ει' => 'EI', - 'ΕΥ' => 'EU', - 'ΕΎ' => 'EU', - 'Εί' => 'Ei', - 'Ευ' => 'Eu', - 'Εύ' => 'Eu', - 'ΟΙ' => 'OI', - 'ΟΊ' => 'OI', - 'ΟΥ' => 'OU', - 'ΟΎ' => 'OU', - 'Οι' => 'Oi', - 'Οί' => 'Oi', - 'Ου' => 'Ou', - 'Ού' => 'Ou', - 'ΥΙ' => 'YI', - 'ΎΙ' => 'YI', - 'Υι' => 'Yi', - 'Ύι' => 'Yi', - 'ΥΊ' => 'Yi', - 'Υί' => 'Yi', - 'αυ' => 'au', - 'αύ' => 'au', - 'εί' => 'ei', - 'ει' => 'ei', - 'ευ' => 'eu', - 'εύ' => 'eu', - 'οι' => 'oi', - 'οί' => 'oi', - 'ου' => 'ou', - 'ού' => 'ou', - 'υι' => 'yi', - 'ύι' => 'yi', - 'υί' => 'yi', - 'Α' => 'A', - 'Ά' => 'A', - 'Β' => 'B', - 'Δ' => 'D', - 'Ε' => 'E', - 'Έ' => 'E', - 'Φ' => 'F', - 'Γ' => 'G', - 'Η' => 'H', - 'Ή' => 'H', - 'Ι' => 'I', - 'Ί' => 'I', - 'Ϊ' => 'I', - 'Κ' => 'K', - 'Ξ' => 'Ks', - 'Λ' => 'L', - 'Μ' => 'M', - 'Ν' => 'N', - 'Π' => 'N', - 'Ο' => 'O', - 'Ό' => 'O', - 'Ψ' => 'Ps', - 'Ρ' => 'R', - 'Σ' => 'S', - 'Τ' => 'T', - 'Θ' => 'Th', - 'Ω' => 'W', - 'Ώ' => 'W', - 'Χ' => 'X', - 'ϒ' => 'Y', - 'Υ' => 'Y', - 'Ύ' => 'Y', - 'Ϋ' => 'Y', - 'Ζ' => 'Z', - 'α' => 'a', - 'ά' => 'a', - 'β' => 'b', - 'δ' => 'd', - 'ε' => 'e', - 'έ' => 'e', - 'φ' => 'f', - 'γ' => 'g', - 'η' => 'h', - 'ή' => 'h', - 'ι' => 'i', - 'ί' => 'i', - 'ϊ' => 'i', - 'ΐ' => 'i', - 'κ' => 'k', - 'ξ' => 'ks', - 'λ' => 'l', - 'μ' => 'm', - 'ν' => 'n', - 'ο' => 'o', - 'ό' => 'o', - 'π' => 'p', - 'ψ' => 'ps', - 'ρ' => 'r', - 'σ' => 's', - 'ς' => 's', - 'τ' => 't', - 'ϑ' => 'th', - 'θ' => 'th', - 'ϐ' => 'v', - 'ω' => 'w', - 'ώ' => 'w', - 'χ' => 'x', - 'υ' => 'y', - 'ύ' => 'y', - 'ΰ' => 'y', - 'ϋ' => 'y', - 'ζ' => 'z', - ], - // Greek (Elláda) - 'el' => [ - 'ΑΥ' => 'AU', - 'Αυ' => 'Au', - 'ΟΥ' => 'U', - 'Ου' => 'u', - 'ΕΥ' => 'EF', - 'Ευ' => 'Ef', - 'ΕΙ' => 'I', - 'Ει' => 'I', - 'ΟΙ' => 'I', - 'Οι' => 'I', - 'ΥΙ' => 'I', - 'Υι' => 'I', - 'ΑΎ' => 'AU', - 'Αύ' => 'Au', - 'ΟΎ' => 'OU', - 'Ού' => 'Ou', - 'ΕΎ' => 'EU', - 'Εύ' => 'Eu', - 'ΕΊ' => 'I', - 'Εί' => 'I', - 'ΟΊ' => 'I', - 'Οί' => 'I', - 'ΎΙ' => 'I', - 'Ύι' => 'I', - 'ΥΊ' => 'I', - 'Υί' => 'I', - 'αυ' => 'au', - 'ου' => 'u', - 'ευ' => 'ef', - 'ει' => 'i', - 'οι' => 'i', - 'υι' => 'i', - 'αύ' => 'au', - 'ού' => 'ou', - 'εύ' => 'eu', - 'εί' => 'i', - 'οί' => 'i', - 'ύι' => 'i', - 'υί' => 'i', - 'α' => 'a', - 'β' => 'v', - 'γ' => 'gh', - 'δ' => 'd', - 'ε' => 'e', - 'ζ' => 'z', - 'η' => 'i', - 'θ' => 'th', - 'ι' => 'i', - 'κ' => 'k', - 'λ' => 'l', - 'μ' => 'm', - 'ν' => 'n', - 'ξ' => 'ks', - 'ο' => 'o', - 'π' => 'p', - 'ρ' => 'r', - 'σ' => 's', - 'τ' => 't', - 'υ' => 'i', - 'φ' => 'f', - 'χ' => 'kh', - 'ψ' => 'ps', - 'ω' => 'o', - 'ά' => 'a', - 'έ' => 'e', - 'ί' => 'i', - 'ό' => 'o', - 'ϒ' => 'Y', - 'ύ' => 'y', - 'ή' => 'i', - 'ώ' => 'w', - 'ς' => 's', - 'ϊ' => 'i', - 'ΰ' => 'y', - 'ϋ' => 'y', - 'ΐ' => 'i', - 'Α' => 'A', - 'Β' => 'B', - 'Γ' => 'G', - 'Δ' => 'D', - 'Ε' => 'E', - 'Ζ' => 'Z', - 'Η' => 'H', - 'Θ' => 'Th', - 'Ι' => 'I', - 'Κ' => 'K', - 'Λ' => 'L', - 'Μ' => 'M', - 'Ν' => 'N', - 'Ξ' => 'Ks', - 'Ο' => 'O', - 'Π' => 'P', - 'Ρ' => 'R', - 'Σ' => 'S', - 'Τ' => 'T', - 'Υ' => 'Y', - 'Φ' => 'F', - 'Χ' => 'X', - 'Ψ' => 'Ps', - 'Ω' => 'O', - 'Ά' => 'A', - 'Έ' => 'E', - 'Ί' => 'I', - 'Ό' => 'O', - 'Ύ' => 'Y', - 'Ή' => 'I', - 'Ώ' => 'W', - 'Ϊ' => 'I', - 'Ϋ' => 'Y', - 'ϐ' => 'v', - 'ϑ' => 'th', - ], - // Hindi - 'hi' => [ - 'अ' => 'a', - 'आ' => 'aa', - 'ए' => 'e', - 'ई' => 'ii', - 'ऍ' => 'ei', - 'ऎ' => 'ae', - 'ऐ' => 'ai', - 'इ' => 'i', - 'ओ' => 'o', - 'ऑ' => 'oi', - 'ऒ' => 'oii', - 'ऊ' => 'uu', - 'औ' => 'ou', - 'उ' => 'u', - 'ब' => 'B', - 'भ' => 'Bha', - 'च' => 'Ca', - 'छ' => 'Chha', - 'ड' => 'Da', - 'ढ' => 'Dha', - 'फ' => 'Fa', - 'फ़' => 'Fi', - 'ग' => 'Ga', - 'घ' => 'Gha', - 'ग़' => 'Ghi', - 'ह' => 'Ha', - 'ज' => 'Ja', - 'झ' => 'Jha', - 'क' => 'Ka', - 'ख' => 'Kha', - 'ख़' => 'Khi', - 'ल' => 'L', - 'ळ' => 'Li', - 'ऌ' => 'Li', - 'ऴ' => 'Lii', - 'ॡ' => 'Lii', - 'म' => 'Ma', - 'न' => 'Na', - 'ङ' => 'Na', - 'ञ' => 'Nia', - 'ण' => 'Nae', - 'ऩ' => 'Ni', - 'ॐ' => 'oms', - 'प' => 'Pa', - 'क़' => 'Qi', - 'र' => 'Ra', - 'ऋ' => 'Ri', - 'ॠ' => 'Ri', - 'ऱ' => 'Ri', - 'स' => 'Sa', - 'श' => 'Sha', - 'ष' => 'Shha', - 'ट' => 'Ta', - 'त' => 'Ta', - 'ठ' => 'Tha', - 'द' => 'Tha', - 'थ' => 'Tha', - 'ध' => 'Thha', - 'ड़' => 'ugDha', - 'ढ़' => 'ugDhha', - 'व' => 'Va', - 'य' => 'Ya', - 'य़' => 'Yi', - 'ज़' => 'Za', - ], - // Armenian - 'hy' => [ - 'Ա' => 'A', - 'Բ' => 'B', - 'Գ' => 'G', - 'Դ' => 'D', - 'Ե' => 'E', - 'Զ' => 'Z', - 'Է' => 'E', - 'Ը' => 'Y', - 'Թ' => 'Th', - 'Ժ' => 'Zh', - 'Ի' => 'I', - 'Լ' => 'L', - 'Խ' => 'Kh', - 'Ծ' => 'Ts', - 'Կ' => 'K', - 'Հ' => 'H', - 'Ձ' => 'Dz', - 'Ղ' => 'Gh', - 'Ճ' => 'Tch', - 'Մ' => 'M', - 'Յ' => 'Y', - 'Ն' => 'N', - 'Շ' => 'Sh', - 'Ո' => 'Vo', - 'Չ' => 'Ch', - 'Պ' => 'P', - 'Ջ' => 'J', - 'Ռ' => 'R', - 'Ս' => 'S', - 'Վ' => 'V', - 'Տ' => 'T', - 'Ր' => 'R', - 'Ց' => 'C', - 'Ւ' => 'u', - 'Փ' => 'Ph', - 'Ք' => 'Q', - 'և' => 'ev', - 'Օ' => 'O', - 'Ֆ' => 'F', - 'ա' => 'a', - 'բ' => 'b', - 'գ' => 'g', - 'դ' => 'd', - 'ե' => 'e', - 'զ' => 'z', - 'է' => 'e', - 'ը' => 'y', - 'թ' => 'th', - 'ժ' => 'zh', - 'ի' => 'i', - 'լ' => 'l', - 'խ' => 'kh', - 'ծ' => 'ts', - 'կ' => 'k', - 'հ' => 'h', - 'ձ' => 'dz', - 'ղ' => 'gh', - 'ճ' => 'tch', - 'մ' => 'm', - 'յ' => 'y', - 'ն' => 'n', - 'շ' => 'sh', - 'ո' => 'vo', - 'չ' => 'ch', - 'պ' => 'p', - 'ջ' => 'j', - 'ռ' => 'r', - 'ս' => 's', - 'վ' => 'v', - 'տ' => 't', - 'ր' => 'r', - 'ց' => 'c', - 'ւ' => 'u', - 'փ' => 'ph', - 'ք' => 'q', - 'օ' => 'o', - 'ֆ' => 'f', - ], - // Swedish - 'sv' => [ - 'Ä' => 'A', - 'ä' => 'a', - 'Å' => 'A', - 'å' => 'a', - 'Ö' => 'O', - 'ö' => 'o', - ], - // Turkmen - 'tk' => [ - 'Ç' => 'C', - 'Ä' => 'A', - 'Ž' => 'Z', - 'Ň' => 'N', - 'Ö' => 'O', - 'Ş' => 'S', - 'Ü' => 'U', - 'Ý' => 'Y', - 'ç' => 'c', - 'ä' => 'a', - 'ž' => 'z', - 'ň' => 'n', - 'ö' => 'o', - 'ş' => 's', - 'ü' => 'u', - 'ý' => 'y', - ], - // Turkish - 'tr' => [ - 'ň' => 'n', - 'Ň' => 'N', - 'ş' => 's', - 'Ş' => 'S', - 'ı' => 'i', - 'İ' => 'I', - 'ç' => 'c', - 'Ç' => 'C', - 'ä' => 'a', - 'Ä' => 'A', - 'ü' => 'u', - 'Ü' => 'U', - 'ö' => 'o', - 'Ö' => 'O', - 'ğ' => 'g', - 'Ğ' => 'G', - 'ý' => 'y', - 'Ý' => 'Y', - 'ž' => 'z', - 'Ž' => 'Z', - ], - // Bulgarian - 'bg' => [ - 'ьо' => 'yo', - 'А' => 'A', - 'Б' => 'B', - 'В' => 'V', - 'Г' => 'G', - 'Д' => 'D', - 'Е' => 'E', - 'Ж' => 'Zh', - 'З' => 'Z', - 'И' => 'I', - 'Й' => 'Y', - 'К' => 'K', - 'Л' => 'L', - 'М' => 'M', - 'Н' => 'N', - 'О' => 'O', - 'П' => 'P', - 'Р' => 'R', - 'С' => 'S', - 'Т' => 'T', - 'У' => 'U', - 'Ф' => 'F', - 'Х' => 'H', - 'Ц' => 'C', - 'Ч' => 'Ch', - 'Ш' => 'Sh', - 'Щ' => 'Sht', - 'Ъ' => 'A', - 'Ь' => '', - 'Ю' => 'Yu', - 'Я' => 'Ya', - 'а' => 'a', - 'б' => 'b', - 'в' => 'v', - 'г' => 'g', - 'д' => 'd', - 'е' => 'e', - 'ж' => 'zh', - 'з' => 'z', - 'и' => 'i', - 'й' => 'y', - 'к' => 'k', - 'л' => 'l', - 'м' => 'm', - 'н' => 'n', - 'о' => 'o', - 'п' => 'p', - 'р' => 'r', - 'с' => 's', - 'т' => 't', - 'у' => 'u', - 'ф' => 'f', - 'х' => 'h', - 'ц' => 'c', - 'ч' => 'ch', - 'ш' => 'sh', - 'щ' => 'sht', - 'ъ' => 'a', - 'ь' => '', - 'ю' => 'yu', - 'я' => 'ya', - ], - // Hungarian - 'hu' => [ - 'Á' => 'A', - 'Ē' => 'E', - 'É' => 'E', - 'Í' => 'I', - 'Ó' => 'O', - 'Ö' => 'O', - 'Ő' => 'O', - 'Ú' => 'U', - 'Ü' => 'U', - 'Ű' => 'U', - 'á' => 'a', - 'ē' => 'e', - 'é' => 'e', - 'í' => 'i', - 'ó' => 'o', - 'ö' => 'o', - 'ő' => 'o', - 'ú' => 'u', - 'ü' => 'u', - 'ű' => 'u', - ], - // Myanmar (Burmese) - 'my' => [ - 'န်ုပ်' => 'nub', - 'ောင်' => 'aung', - 'ိုက်' => 'aik', - 'ိုဒ်' => 'ok', - 'ိုင်' => 'aing', - 'ိုလ်' => 'ol', - 'ေါင်' => 'aung', - 'သြော' => 'aw', - 'ောက်' => 'auk', - 'ိတ်' => 'eik', - 'ုတ်' => 'ok', - 'ုန်' => 'on', - 'ေတ်' => 'it', - 'ုဒ်' => 'ait', - 'ာန်' => 'an', - 'ိန်' => 'ein', - 'ွတ်' => 'ut', - 'ေါ်' => 'aw', - 'ွန်' => 'un', - 'ိပ်' => 'eik', - 'ုပ်' => 'ok', - 'ွပ်' => 'ut', - 'ိမ်' => 'ein', - 'ုမ်' => 'on', - 'ော်' => 'aw', - 'ွမ်' => 'un', - 'က်' => 'et', - 'ေါ' => 'aw', - 'ော' => 'aw', - 'ျွ' => 'ywa', - 'ြွ' => 'yw', - 'ို' => 'o', - 'ုံ' => 'on', - 'တ်' => 'at', - 'င်' => 'in', - 'ည်' => 'i', - 'ဒ်' => 'd', - 'န်' => 'an', - 'ပ်' => 'at', - 'မ်' => 'an', - 'စျ' => 'za', - 'ယ်' => 'e', - 'ဉ်' => 'in', - 'စ်' => 'it', - 'ိံ' => 'ein', - 'ဲ' => 'e', - 'း' => '', - 'ာ' => 'a', - 'ါ' => 'a', - 'ေ' => 'e', - 'ံ' => 'an', - 'ိ' => 'i', - 'ီ' => 'i', - 'ု' => 'u', - 'ူ' => 'u', - '်' => 'at', - '္' => '', - '့' => '', - 'က' => 'k', - '၉' => '9', - 'တ' => 't', - 'ရ' => 'ya', - 'ယ' => 'y', - 'မ' => 'm', - 'ဘ' => 'ba', - 'ဗ' => 'b', - 'ဖ' => 'pa', - 'ပ' => 'p', - 'န' => 'n', - 'ဓ' => 'da', - 'ဒ' => 'd', - 'ထ' => 'ta', - 'ဏ' => 'na', - 'ဝ' => 'w', - 'ဎ' => 'da', - 'ဍ' => 'd', - 'ဌ' => 'ta', - 'ဋ' => 't', - 'ည' => 'ny', - 'ဇ' => 'z', - 'ဆ' => 'sa', - 'စ' => 's', - 'င' => 'ng', - 'ဃ' => 'ga', - 'ဂ' => 'g', - 'လ' => 'l', - 'သ' => 'th', - '၈' => '8', - 'ဩ' => 'aw', - 'ခ' => 'kh', - '၆' => '6', - '၅' => '5', - '၄' => '4', - '၃' => '3', - '၂' => '2', - '၁' => '1', - '၀' => '0', - '၌' => 'hnaik', - '၍' => 'ywae', - 'ဪ' => 'aw', - 'ဦ' => '-u', - 'ဟ' => 'h', - 'ဉ' => 'u', - 'ဤ' => '-i', - 'ဣ' => 'i', - '၏' => '-e', - 'ဧ' => 'e', - 'ှ' => 'h', - 'ွ' => 'w', - 'ျ' => 'ya', - 'ြ' => 'y', - 'အ' => 'a', - 'ဠ' => 'la', - '၇' => '7', - ], - // Croatian (Hrvatska) - 'hr' => [ - 'DŽ' => 'DZ', - 'Dž' => 'Dz', - 'dž' => 'dz', - 'DZ' => 'DZ', - 'Dz' => 'Dz', - 'dz' => 'dz', - 'IJ' => 'IJ', - 'ij' => 'ij', - 'LJ' => 'LJ', - 'Lj' => 'Lj', - 'lj' => 'lj', - 'NJ' => 'NJ', - 'Nj' => 'Nj', - 'nj' => 'nj', - 'ž' => 'z', - 'Ž' => 'Z', - 'đ' => 'dj', - 'Đ' => 'Dj', - 'č' => 'c', - 'Č' => 'C', - 'ć' => 'c', - 'Ć' => 'C', - 'š' => 's', - 'Š' => 'S', - ], - // Finnish - 'fi' => [ - 'Ä' => 'A', - 'Ö' => 'O', - 'ä' => 'a', - 'ö' => 'o', - ], - // Georgian (Kartvelian) - 'ka' => [ - 'ა' => 'a', - 'ბ' => 'b', - 'გ' => 'g', - 'დ' => 'd', - 'ე' => 'e', - 'ვ' => 'v', - 'ზ' => 'z', - 'თ' => 't', - 'ი' => 'i', - 'კ' => 'k', - 'ლ' => 'l', - 'მ' => 'm', - 'ნ' => 'n', - 'ო' => 'o', - 'პ' => 'p', - 'ჟ' => 'zh', - 'რ' => 'r', - 'ს' => 's', - 'ტ' => 't', - 'უ' => 'u', - 'ფ' => 'f', - 'ქ' => 'q', - 'ღ' => 'gh', - 'ყ' => 'y', - 'შ' => 'sh', - 'ჩ' => 'ch', - 'ც' => 'ts', - 'ძ' => 'dz', - 'წ' => 'ts', - 'ჭ' => 'ch', - 'ხ' => 'kh', - 'ჯ' => 'j', - 'ჰ' => 'h', - ], - // Russian - 'ru' => [ - 'А' => 'A', - 'а' => 'a', - 'Б' => 'B', - 'б' => 'b', - 'В' => 'V', - 'в' => 'v', - 'Г' => 'G', - 'г' => 'g', - 'Д' => 'D', - 'д' => 'd', - 'Е' => 'E', - 'е' => 'e', - 'Ё' => 'Yo', - 'ё' => 'yo', - 'Ж' => 'Zh', - 'ж' => 'zh', - 'З' => 'Z', - 'з' => 'z', - 'И' => 'I', - 'и' => 'i', - 'Й' => 'Y', - 'й' => 'y', - 'К' => 'K', - 'к' => 'k', - 'Л' => 'L', - 'л' => 'l', - 'М' => 'M', - 'м' => 'm', - 'Н' => 'N', - 'н' => 'n', - 'О' => 'O', - 'о' => 'o', - 'П' => 'P', - 'п' => 'p', - 'Р' => 'R', - 'р' => 'r', - 'С' => 'S', - 'с' => 's', - 'Т' => 'T', - 'т' => 't', - 'У' => 'U', - 'у' => 'u', - 'Ф' => 'F', - 'ф' => 'f', - 'Х' => 'H', - 'х' => 'h', - 'Ц' => 'Ts', - 'ц' => 'ts', - 'Ч' => 'Ch', - 'ч' => 'ch', - 'ш' => 'sh', - 'Ш' => 'Sh', - 'Щ' => 'Sch', - 'щ' => 'sch', - 'Ъ' => '', - 'ъ' => '', - 'Ы' => 'Y', - 'ы' => 'y', - 'Ь' => '', - 'ь' => '', - 'Э' => 'E', - 'э' => 'e', - 'Ю' => 'Yu', - 'ю' => 'yu', - 'Я' => 'Ya', - 'я' => 'ya', - ], - // Russian - GOST 7.79-2000(B) - // -> https://en.m.wikipedia.org/wiki/Romanization_of_Russian#content-collapsible-block-1 - 'ru__gost_2000_b' => [ - 'А' => 'A', - 'а' => 'a', - 'Б' => 'B', - 'б' => 'b', - 'В' => 'V', - 'в' => 'v', - 'Г' => 'G', - 'г' => 'g', - 'Д' => 'D', - 'д' => 'd', - 'Е' => 'E', - 'е' => 'e', - 'Ё' => 'Yo', - 'ё' => 'yo', - 'Ж' => 'Zh', - 'ж' => 'zh', - 'З' => 'Z', - 'з' => 'z', - 'И' => 'i', - 'и' => 'i', - 'Й' => 'i', - 'й' => 'i', - 'К' => 'K', - 'к' => 'k', - 'Л' => 'L', - 'л' => 'l', - 'М' => 'M', - 'м' => 'm', - 'Н' => 'N', - 'н' => 'n', - 'О' => 'O', - 'о' => 'o', - 'П' => 'P', - 'п' => 'p', - 'Р' => 'R', - 'р' => 'r', - 'С' => 'S', - 'с' => 's', - 'Т' => 'T', - 'т' => 't', - 'У' => 'U', - 'у' => 'u', - 'Ф' => 'F', - 'ф' => 'f', - 'Х' => 'X', - 'х' => 'x', - 'Ц' => 'Cz', - 'ц' => 'cz', - 'Ч' => 'Ch', - 'ч' => 'ch', - 'ш' => 'sh', - 'Ш' => 'Sh', - 'Щ' => 'Shh', - 'щ' => 'shh', - 'Ъ' => '', - 'ъ' => '', - 'Ы' => 'Y\'', - 'ы' => 'y\'', - 'Ь' => '', - 'ь' => '', - 'Э' => 'E\'', - 'э' => 'e\'', - 'Ю' => 'Yu', - 'ю' => 'yu', - 'Я' => 'Ya', - 'я' => 'ya', - 'І' => 'I', - 'і' => 'i', - 'Ѳ' => 'Fh', - 'ѳ' => 'fh', - 'Ѣ' => 'Ye', - 'ѣ' => 'ye', - 'Ѵ' => 'Yh', - 'ѵ' => 'yh', - 'Є' => '', - 'є' => '', - 'Ѥ' => '', - 'ѥ' => '', - 'Ѕ' => 'Js', - 'ѕ' => 'js', - 'Ꙋ' => '', - 'ꙋ' => '', - 'Ѡ' => '', - 'ѡ' => '', - 'Ѿ' => '', - 'ѿ' => '', - 'Ѫ' => '', - 'ѫ' => '', - 'Ѧ' => '', - 'ѧ' => '', - 'Ѭ' => '', - 'ѭ' => '', - 'Ѩ' => '', - 'ѩ' => '', - 'Ѯ' => '', - 'ѯ' => '', - 'Ѱ' => '', - 'ѱ' => '', - ], - // Russian - Passport (2013), ICAO - // -> https://en.m.wikipedia.org/wiki/Romanization_of_Russian#content-collapsible-block-1 - 'ru__passport_2013' => [ - 'А' => 'A', - 'а' => 'a', - 'Б' => 'B', - 'б' => 'b', - 'В' => 'V', - 'в' => 'v', - 'Г' => 'G', - 'г' => 'g', - 'Д' => 'D', - 'д' => 'd', - 'Е' => 'E', - 'е' => 'e', - 'Ё' => 'E', - 'ё' => 'e', - 'Ж' => 'Zh', - 'ж' => 'zh', - 'З' => 'Z', - 'з' => 'z', - 'И' => 'i', - 'и' => 'i', - 'Й' => 'i', - 'й' => 'i', - 'К' => 'K', - 'к' => 'k', - 'Л' => 'L', - 'л' => 'l', - 'М' => 'M', - 'м' => 'm', - 'Н' => 'N', - 'н' => 'n', - 'О' => 'O', - 'о' => 'o', - 'П' => 'P', - 'п' => 'p', - 'Р' => 'R', - 'р' => 'r', - 'С' => 'S', - 'с' => 's', - 'Т' => 'T', - 'т' => 't', - 'У' => 'U', - 'у' => 'u', - 'Ф' => 'F', - 'ф' => 'f', - 'Х' => 'Kh', - 'х' => 'kh', - 'Ц' => 'Ts', - 'ц' => 'ts', - 'Ч' => 'Ch', - 'ч' => 'ch', - 'ш' => 'sh', - 'Ш' => 'Sh', - 'Щ' => 'Shch', - 'щ' => 'shch', - 'Ъ' => 'Ie', - 'ъ' => 'ie', - 'Ы' => 'Y', - 'ы' => 'y', - 'Ь' => '', - 'ь' => '', - 'Э' => 'E', - 'э' => 'e', - 'Ю' => 'Iu', - 'ю' => 'iu', - 'Я' => 'Ia', - 'я' => 'ia', - 'І' => '', - 'і' => '', - 'Ѳ' => '', - 'ѳ' => '', - 'Ѣ' => '', - 'ѣ' => '', - 'Ѵ' => '', - 'ѵ' => '', - 'Є' => '', - 'є' => '', - 'Ѥ' => '', - 'ѥ' => '', - 'Ѕ' => '', - 'ѕ' => '', - 'Ꙋ' => '', - 'ꙋ' => '', - 'Ѡ' => '', - 'ѡ' => '', - 'Ѿ' => '', - 'ѿ' => '', - 'Ѫ' => '', - 'ѫ' => '', - 'Ѧ' => '', - 'ѧ' => '', - 'Ѭ' => '', - 'ѭ' => '', - 'Ѩ' => '', - 'ѩ' => '', - 'Ѯ' => '', - 'ѯ' => '', - 'Ѱ' => '', - 'ѱ' => '', - ], - // Ukrainian - // -> https://zakon.rada.gov.ua/laws/show/55-2010-%D0%BF?lang=en - 'uk' => [ - 'Г' => 'H', - 'г' => 'h', - 'Ґ' => 'G', - 'ґ' => 'g', - 'Є' => 'Ye', - 'є' => 'ye', - 'И' => 'Y', - 'и' => 'y', - 'І' => 'I', - 'і' => 'i', - 'Ї' => 'Yi', - 'ї' => 'yi', - 'Й' => 'Y', - 'й' => 'y', - 'Х' => 'Kh', - 'х' => 'kh', - 'Ц' => 'Ts', - 'ц' => 'ts', - 'Ч' => 'Ch', - 'ч' => 'ch', - 'Ш' => 'Sh', - 'ш' => 'sh', - 'Щ' => 'Shch', - 'щ' => 'shch', - ], - // Kazakh - 'kk' => [ - 'Ә' => 'A', - 'Ғ' => 'G', - 'Қ' => 'Q', - 'Ң' => 'N', - 'Ө' => 'O', - 'Ұ' => 'U', - 'Ү' => 'U', - 'Һ' => 'H', - 'ә' => 'a', - 'ғ' => 'g', - 'қ' => 'q', - 'ң' => 'n', - 'ө' => 'o', - 'ұ' => 'u', - 'ү' => 'u', - 'һ' => 'h', - ], - // Czech - 'cs' => [ - 'á' => 'a', - 'Á' => 'A', - 'č' => 'c', - 'Č' => 'C', - 'ď' => 'd', - 'Ď' => 'D', - 'é' => 'e', - 'É' => 'E', - 'ě' => 'e', - 'Ě' => 'E', - 'í' => 'i', - 'Í' => 'I', - 'ň' => 'n', - 'Ň' => 'N', - 'ó' => 'o', - 'Ó' => 'O', - 'ř' => 'r', - 'Ř' => 'R', - 'š' => 's', - 'Š' => 'S', - 'ť' => 't', - 'Ť' => 'T', - 'ú' => 'u', - 'Ú' => 'U', - 'ů' => 'u', - 'Ů' => 'U', - 'ý' => 'y', - 'Ý' => 'Y', - 'ž' => 'z', - 'Ž' => 'Z', - ], - // Danish - 'da' => [ - 'Æ' => 'Ae', - 'æ' => 'ae', - 'Ø' => 'Oe', - 'ø' => 'oe', - 'Å' => 'Aa', - 'å' => 'aa', - 'É' => 'E', - 'é' => 'e', - ], - // Polish - 'pl' => [ - 'ą' => 'a', - 'ć' => 'c', - 'ę' => 'e', - 'ł' => 'l', - 'ń' => 'n', - 'ó' => 'o', - 'ś' => 's', - 'ź' => 'z', - 'ż' => 'z', - 'Ą' => 'A', - 'Ć' => 'C', - 'Ę' => 'E', - 'Ł' => 'L', - 'Ń' => 'N', - 'Ó' => 'O', - 'Ś' => 'S', - 'Ź' => 'Z', - 'Ż' => 'Z', - ], - // Romanian - 'ro' => [ - 'ă' => 'a', - 'â' => 'a', - 'Ă' => 'A', - 'Â' => 'A', - 'î' => 'i', - 'Î' => 'I', - 'ș' => 's', - 'ş' => 's', - 'Ş' => 'S', - 'Ș' => 'S', - 'ț' => 't', - 'ţ' => 't', - 'Ţ' => 'T', - 'Ț' => 'T', - ], - // Esperanto - 'eo' => [ - 'ĉ' => 'cx', - 'ĝ' => 'gx', - 'ĥ' => 'hx', - 'ĵ' => 'jx', - 'ŝ' => 'sx', - 'ŭ' => 'ux', - 'Ĉ' => 'CX', - 'Ĝ' => 'GX', - 'Ĥ' => 'HX', - 'Ĵ' => 'JX', - 'Ŝ' => 'SX', - 'Ŭ' => 'UX', - ], - // Estonian - 'et' => [ - 'Š' => 'S', - 'Ž' => 'Z', - 'Õ' => 'O', - 'Ä' => 'A', - 'Ö' => 'O', - 'Ü' => 'U', - 'š' => 's', - 'ž' => 'z', - 'õ' => 'o', - 'ä' => 'a', - 'ö' => 'o', - 'ü' => 'u', - ], - // Latvian - 'lv' => [ - 'ā' => 'a', - 'č' => 'c', - 'ē' => 'e', - 'ģ' => 'g', - 'ī' => 'i', - 'ķ' => 'k', - 'ļ' => 'l', - 'ņ' => 'n', - 'š' => 's', - 'ū' => 'u', - 'ž' => 'z', - 'Ā' => 'A', - 'Č' => 'C', - 'Ē' => 'E', - 'Ģ' => 'G', - 'Ī' => 'i', - 'Ķ' => 'k', - 'Ļ' => 'L', - 'Ņ' => 'N', - 'Š' => 'S', - 'Ū' => 'u', - 'Ž' => 'Z', - ], - // Lithuanian - 'lt' => [ - 'ą' => 'a', - 'č' => 'c', - 'ę' => 'e', - 'ė' => 'e', - 'į' => 'i', - 'š' => 's', - 'ų' => 'u', - 'ū' => 'u', - 'ž' => 'z', - 'Ą' => 'A', - 'Č' => 'C', - 'Ę' => 'E', - 'Ė' => 'E', - 'Į' => 'I', - 'Š' => 'S', - 'Ų' => 'U', - 'Ū' => 'U', - 'Ž' => 'Z', - ], - // Norwegian - 'no' => [ - 'Æ' => 'AE', - 'æ' => 'ae', - 'Ø' => 'OE', - 'ø' => 'oe', - 'Å' => 'AA', - 'å' => 'aa', - ], - // Vietnamese - 'vi' => [ - 'Á' => 'A', - 'À' => 'A', - 'Ả' => 'A', - 'Ã' => 'A', - 'Ạ' => 'A', - 'Ă' => 'A', - 'Ắ' => 'A', - 'Ằ' => 'A', - 'Ẳ' => 'A', - 'Ẵ' => 'A', - 'Ặ' => 'A', - 'Â' => 'A', - 'Ấ' => 'A', - 'Ầ' => 'A', - 'Ẩ' => 'A', - 'Ẫ' => 'A', - 'Ậ' => 'A', - 'á' => 'a', - 'à' => 'a', - 'ả' => 'a', - 'ã' => 'a', - 'ạ' => 'a', - 'ă' => 'a', - 'ắ' => 'a', - 'ằ' => 'a', - 'ẳ' => 'a', - 'ẵ' => 'a', - 'ặ' => 'a', - 'â' => 'a', - 'ấ' => 'a', - 'ầ' => 'a', - 'ẩ' => 'a', - 'ẫ' => 'a', - 'ậ' => 'a', - 'É' => 'E', - 'È' => 'E', - 'Ẻ' => 'E', - 'Ẽ' => 'E', - 'Ẹ' => 'E', - 'Ê' => 'E', - 'Ế' => 'E', - 'Ề' => 'E', - 'Ể' => 'E', - 'Ễ' => 'E', - 'Ệ' => 'E', - 'é' => 'e', - 'è' => 'e', - 'ẻ' => 'e', - 'ẽ' => 'e', - 'ẹ' => 'e', - 'ê' => 'e', - 'ế' => 'e', - 'ề' => 'e', - 'ể' => 'e', - 'ễ' => 'e', - 'ệ' => 'e', - 'Í' => 'I', - 'Ì' => 'I', - 'Ỉ' => 'I', - 'Ĩ' => 'I', - 'Ị' => 'I', - 'í' => 'i', - 'ì' => 'i', - 'ỉ' => 'i', - 'ĩ' => 'i', - 'ị' => 'i', - 'Ó' => 'O', - 'Ò' => 'O', - 'Ỏ' => 'O', - 'Õ' => 'O', - 'Ọ' => 'O', - 'Ô' => 'O', - 'Ố' => 'O', - 'Ồ' => 'O', - 'Ổ' => 'O', - 'Ỗ' => 'O', - 'Ộ' => 'O', - 'Ơ' => 'O', - 'Ớ' => 'O', - 'Ờ' => 'O', - 'Ở' => 'O', - 'Ỡ' => 'O', - 'Ợ' => 'O', - 'ó' => 'o', - 'ò' => 'o', - 'ỏ' => 'o', - 'õ' => 'o', - 'ọ' => 'o', - 'ô' => 'o', - 'ố' => 'o', - 'ồ' => 'o', - 'ổ' => 'o', - 'ỗ' => 'o', - 'ộ' => 'o', - 'ơ' => 'o', - 'ớ' => 'o', - 'ờ' => 'o', - 'ở' => 'o', - 'ỡ' => 'o', - 'ợ' => 'o', - 'Ú' => 'U', - 'Ù' => 'U', - 'Ủ' => 'U', - 'Ũ' => 'U', - 'Ụ' => 'U', - 'Ư' => 'U', - 'Ứ' => 'U', - 'Ừ' => 'U', - 'Ử' => 'U', - 'Ữ' => 'U', - 'Ự' => 'U', - 'ú' => 'u', - 'ù' => 'u', - 'ủ' => 'u', - 'ũ' => 'u', - 'ụ' => 'u', - 'ư' => 'u', - 'ứ' => 'u', - 'ừ' => 'u', - 'ử' => 'u', - 'ữ' => 'u', - 'ự' => 'u', - 'Ý' => 'Y', - 'Ỳ' => 'Y', - 'Ỷ' => 'Y', - 'Ỹ' => 'Y', - 'Ỵ' => 'Y', - 'ý' => 'y', - 'ỳ' => 'y', - 'ỷ' => 'y', - 'ỹ' => 'y', - 'ỵ' => 'y', - 'Đ' => 'D', - 'đ' => 'd', - ], - // Persian (Farsi) - 'fa' => [ - 'ا' => 'a', - 'ب' => 'b', - 'پ' => 'p', - 'ت' => 't', - 'ث' => 's', - 'ج' => 'j', - 'چ' => 'ch', - 'ح' => 'h', - 'خ' => 'kh', - 'د' => 'd', - 'ذ' => 'z', - 'ر' => 'r', - 'ز' => 'z', - 'س' => 's', - 'ش' => 'sh', - 'ص' => 's', - 'ض' => 'z', - 'ط' => 't', - 'ظ' => 'z', - 'ع' => 'a', - 'غ' => 'gh', - 'ف' => 'f', - 'ق' => 'gh', - 'ک' => 'k', - 'گ' => 'g', - 'ل' => 'l', - 'ژ' => 'zh', - 'ك' => 'k', - 'م' => 'm', - 'ن' => 'n', - 'ه' => 'h', - 'و' => 'o', - 'ی' => 'y', - 'آ' => 'a', - '٠' => '0', - '١' => '1', - '٢' => '2', - '٣' => '3', - '٤' => '4', - '٥' => '5', - '٦' => '6', - '٧' => '7', - '٨' => '8', - '٩' => '9', - ], - // Arabic - 'ar' => [ - 'أ' => 'a', - 'ب' => 'b', - 'ت' => 't', - 'ث' => 'th', - 'ج' => 'g', - 'ح' => 'h', - 'خ' => 'kh', - 'د' => 'd', - 'ذ' => 'th', - 'ر' => 'r', - 'ز' => 'z', - 'س' => 's', - 'ش' => 'sh', - 'ص' => 's', - 'ض' => 'd', - 'ط' => 't', - 'ظ' => 'th', - 'ع' => 'aa', - 'غ' => 'gh', - 'ف' => 'f', - 'ق' => 'k', - 'ك' => 'k', - 'ل' => 'l', - 'م' => 'm', - 'ن' => 'n', - 'ه' => 'h', - 'و' => 'o', - 'ي' => 'y', - 'ا' => 'a', - 'إ' => 'a', - 'آ' => 'a', - 'ؤ' => 'o', - 'ئ' => 'y', - 'ء' => 'aa', - '٠' => '0', - '١' => '1', - '٢' => '2', - '٣' => '3', - '٤' => '4', - '٥' => '5', - '٦' => '6', - '٧' => '7', - '٨' => '8', - '٩' => '9', - ], - // Serbian - 'sr' => [ - 'đ' => 'dj', - 'ž' => 'z', - 'ć' => 'c', - 'č' => 'c', - 'š' => 's', - 'Đ' => 'Dj', - 'Ž' => 'Z', - 'Ć' => 'C', - 'Č' => 'C', - 'Š' => 'S', - 'а' => 'a', - 'б' => 'b', - 'в' => 'v', - 'г' => 'g', - 'д' => 'd', - 'ђ' => 'dj', - 'е' => 'e', - 'ж' => 'z', - 'з' => 'z', - 'и' => 'i', - 'ј' => 'j', - 'к' => 'k', - 'л' => 'l', - 'љ' => 'lj', - 'м' => 'm', - 'н' => 'n', - 'њ' => 'nj', - 'о' => 'o', - 'п' => 'p', - 'р' => 'r', - 'с' => 's', - 'т' => 't', - 'ћ' => 'c', - 'у' => 'u', - 'ф' => 'f', - 'х' => 'h', - 'ц' => 'c', - 'ч' => 'c', - 'џ' => 'dz', - 'ш' => 's', - 'А' => 'A', - 'Б' => 'B', - 'В' => 'V', - 'Г' => 'G', - 'Д' => 'D', - 'Ђ' => 'Dj', - 'Е' => 'E', - 'Ж' => 'Z', - 'З' => 'Z', - 'И' => 'I', - 'Ј' => 'j', - 'К' => 'K', - 'Л' => 'L', - 'Љ' => 'Lj', - 'М' => 'M', - 'Н' => 'N', - 'Њ' => 'Nj', - 'О' => 'O', - 'П' => 'P', - 'Р' => 'R', - 'С' => 'S', - 'Т' => 'T', - 'Ћ' => 'C', - 'У' => 'U', - 'Ф' => 'F', - 'Х' => 'H', - 'Ц' => 'C', - 'Ч' => 'C', - 'Џ' => 'Dz', - 'Ш' => 'S', - ], - // Serbian - Cyrillic - 'sr__cyr' => [ - 'а' => 'a', - 'б' => 'b', - 'в' => 'v', - 'г' => 'g', - 'д' => 'd', - 'ђ' => 'dj', - 'е' => 'e', - 'ж' => 'z', - 'з' => 'z', - 'и' => 'i', - 'ј' => 'j', - 'к' => 'k', - 'л' => 'l', - 'љ' => 'lj', - 'м' => 'm', - 'н' => 'n', - 'њ' => 'nj', - 'о' => 'o', - 'п' => 'p', - 'р' => 'r', - 'с' => 's', - 'т' => 't', - 'ћ' => 'c', - 'у' => 'u', - 'ф' => 'f', - 'х' => 'h', - 'ц' => 'c', - 'ч' => 'c', - 'џ' => 'dz', - 'ш' => 's', - 'А' => 'A', - 'Б' => 'B', - 'В' => 'V', - 'Г' => 'G', - 'Д' => 'D', - 'Ђ' => 'Dj', - 'Е' => 'E', - 'Ж' => 'Z', - 'З' => 'Z', - 'И' => 'I', - 'Ј' => 'j', - 'К' => 'K', - 'Л' => 'L', - 'Љ' => 'Lj', - 'М' => 'M', - 'Н' => 'N', - 'Њ' => 'Nj', - 'О' => 'O', - 'П' => 'P', - 'Р' => 'R', - 'С' => 'S', - 'Т' => 'T', - 'Ћ' => 'C', - 'У' => 'U', - 'Ф' => 'F', - 'Х' => 'H', - 'Ц' => 'C', - 'Ч' => 'C', - 'Џ' => 'Dz', - 'Ш' => 'S', - ], - // Serbian - Latin - 'sr__lat' => [ - 'đ' => 'dj', - 'ž' => 'z', - 'ć' => 'c', - 'č' => 'c', - 'š' => 's', - 'Đ' => 'Dj', - 'Ž' => 'Z', - 'Ć' => 'C', - 'Č' => 'C', - 'Š' => 'S', - ], - // Azerbaijani - 'az' => [ - 'ç' => 'c', - 'ə' => 'e', - 'ğ' => 'g', - 'ı' => 'i', - 'ö' => 'o', - 'ş' => 's', - 'ü' => 'u', - 'Ç' => 'C', - 'Ə' => 'E', - 'Ğ' => 'G', - 'İ' => 'I', - 'Ö' => 'O', - 'Ş' => 'S', - 'Ü' => 'U', - ], - // Slovak - 'sk' => [ - 'á' => 'a', - 'ä' => 'a', - 'č' => 'c', - 'ď' => 'd', - 'é' => 'e', - 'í' => 'i', - 'ľ' => 'l', - 'ĺ' => 'l', - 'ň' => 'n', - 'ó' => 'o', - 'ô' => 'o', - 'ŕ' => 'r', - 'š' => 's', - 'ť' => 't', - 'ú' => 'u', - 'ý' => 'y', - 'ž' => 'z', - 'Á' => 'A', - 'Ä' => 'A', - 'Č' => 'C', - 'Ď' => 'D', - 'É' => 'E', - 'Í' => 'I', - 'Ľ' => 'L', - 'Ĺ' => 'L', - 'Ň' => 'N', - 'Ó' => 'O', - 'Ô' => 'O', - 'Ŕ' => 'R', - 'Š' => 'S', - 'Ť' => 'T', - 'Ú' => 'U', - 'Ý' => 'Y', - 'Ž' => 'Z', - ], - // French - 'fr' => [ - 'Æ' => 'AE', - 'æ' => 'ae', - 'Œ' => 'OE', - 'œ' => 'oe', - 'â' => 'a', - 'Â' => 'A', - 'à' => 'a', - 'À' => 'A', - 'ä' => 'a', - 'Ä' => 'A', - 'ç' => 'c', - 'Ç' => 'C', - 'é' => 'e', - 'É' => 'E', - 'ê' => 'e', - 'Ê' => 'E', - 'ë' => 'e', - 'Ë' => 'E', - 'è' => 'e', - 'È' => 'E', - 'ï' => 'i', - 'î' => 'i', - 'Ï' => 'I', - 'Î' => 'I', - 'ÿ' => 'y', - 'Ÿ' => 'Y', - 'ô' => 'o', - 'Ô' => 'O', - 'ö' => 'o', - 'Ö' => 'O', - 'û' => 'u', - 'Û' => 'U', - 'ù' => 'u', - 'Ù' => 'U', - 'ü' => 'u', - 'Ü' => 'U', - ], - // Austrian (French) - 'fr_at' => [ - 'ß' => 'sz', - 'ẞ' => 'SZ', - 'Æ' => 'AE', - 'æ' => 'ae', - 'Œ' => 'OE', - 'œ' => 'oe', - 'â' => 'a', - 'Â' => 'A', - 'à' => 'a', - 'À' => 'A', - 'ä' => 'a', - 'Ä' => 'A', - 'ç' => 'c', - 'Ç' => 'C', - 'é' => 'e', - 'É' => 'E', - 'ê' => 'e', - 'Ê' => 'E', - 'ë' => 'e', - 'Ë' => 'E', - 'è' => 'e', - 'È' => 'E', - 'ï' => 'i', - 'î' => 'i', - 'Ï' => 'I', - 'Î' => 'I', - 'ÿ' => 'y', - 'Ÿ' => 'Y', - 'ô' => 'o', - 'Ô' => 'O', - 'ö' => 'o', - 'Ö' => 'O', - 'û' => 'u', - 'Û' => 'U', - 'ù' => 'u', - 'Ù' => 'U', - 'ü' => 'u', - 'Ü' => 'U', - ], - // Switzerland (French) - 'fr_ch' => [ - 'ß' => 'ss', - 'ẞ' => 'SS', - 'Æ' => 'AE', - 'æ' => 'ae', - 'Œ' => 'OE', - 'œ' => 'oe', - 'â' => 'a', - 'Â' => 'A', - 'à' => 'a', - 'À' => 'A', - 'ä' => 'a', - 'Ä' => 'A', - 'ç' => 'c', - 'Ç' => 'C', - 'é' => 'e', - 'É' => 'E', - 'ê' => 'e', - 'Ê' => 'E', - 'ë' => 'e', - 'Ë' => 'E', - 'è' => 'e', - 'È' => 'E', - 'ï' => 'i', - 'î' => 'i', - 'Ï' => 'I', - 'Î' => 'I', - 'ÿ' => 'y', - 'Ÿ' => 'Y', - 'ô' => 'o', - 'Ô' => 'O', - 'ö' => 'o', - 'Ö' => 'O', - 'û' => 'u', - 'Û' => 'U', - 'ù' => 'u', - 'Ù' => 'U', - 'ü' => 'u', - 'Ü' => 'U', - ], - // German - 'de' => [ - 'Ä' => 'Ae', - 'Ö' => 'Oe', - 'Ü' => 'Ue', - 'ä' => 'ae', - 'ö' => 'oe', - 'ü' => 'ue', - 'ß' => 'ss', - 'ẞ' => 'SS', - ], - // Austrian (German) - 'de_at' => [ - 'Ä' => 'Ae', - 'Ö' => 'Oe', - 'Ü' => 'Ue', - 'ä' => 'ae', - 'ö' => 'oe', - 'ü' => 'ue', - 'ß' => 'sz', - 'ẞ' => 'SZ', - ], - // Switzerland (German) - 'de_ch' => [ - 'Ä' => 'Ae', - 'Ö' => 'Oe', - 'Ü' => 'Ue', - 'ä' => 'ae', - 'ö' => 'oe', - 'ü' => 'ue', - 'ß' => 'ss', - 'ẞ' => 'SS', - ], - // Bengali (Bangla) - 'bn' => [ - 'ভ্ল' => 'vl', - 'পশ' => 'psh', - 'ব্ধ' => 'bdh', - 'ব্জ' => 'bj', - 'ব্দ' => 'bd', - 'ব্ব' => 'bb', - 'ব্ল' => 'bl', - 'ভ' => 'v', - 'ব' => 'b', - 'চ্ঞ' => 'cNG', - 'চ্ছ' => 'cch', - 'চ্চ' => 'cc', - 'ছ' => 'ch', - 'চ' => 'c', - 'ধ্ন' => 'dhn', - 'ধ্ম' => 'dhm', - 'দ্ঘ' => 'dgh', - 'দ্ধ' => 'ddh', - 'দ্ভ' => 'dv', - 'দ্ম' => 'dm', - 'ড্ড' => 'DD', - 'ঢ' => 'Dh', - 'ধ' => 'dh', - 'দ্গ' => 'dg', - 'দ্দ' => 'dd', - 'ড' => 'D', - 'দ' => 'd', - '।' => '.', - 'ঘ্ন' => 'Ghn', - 'গ্ধ' => 'Gdh', - 'গ্ণ' => 'GN', - 'গ্ন' => 'Gn', - 'গ্ম' => 'Gm', - 'গ্ল' => 'Gl', - 'জ্ঞ' => 'jNG', - 'ঘ' => 'Gh', - 'গ' => 'g', - 'হ্ণ' => 'hN', - 'হ্ন' => 'hn', - 'হ্ম' => 'hm', - 'হ্ল' => 'hl', - 'হ' => 'h', - 'জ্ঝ' => 'jjh', - 'ঝ' => 'jh', - 'জ্জ' => 'jj', - 'জ' => 'j', - 'ক্ষ্ণ' => 'kxN', - 'ক্ষ্ম' => 'kxm', - 'ক্ষ' => 'ksh', - 'কশ' => 'ksh', - 'ক্ক' => 'kk', - 'ক্ট' => 'kT', - 'ক্ত' => 'kt', - 'ক্ল' => 'kl', - 'ক্স' => 'ks', - 'খ' => 'kh', - 'ক' => 'k', - 'ল্ভ' => 'lv', - 'ল্ধ' => 'ldh', - 'লখ' => 'lkh', - 'লঘ' => 'lgh', - 'লফ' => 'lph', - 'ল্ক' => 'lk', - 'ল্গ' => 'lg', - 'ল্ট' => 'lT', - 'ল্ড' => 'lD', - 'ল্প' => 'lp', - 'ল্ম' => 'lm', - 'ল্ল' => 'll', - 'ল্ব' => 'lb', - 'ল' => 'l', - 'ম্থ' => 'mth', - 'ম্ফ' => 'mf', - 'ম্ভ' => 'mv', - 'মপ্ল' => 'mpl', - 'ম্ন' => 'mn', - 'ম্প' => 'mp', - 'ম্ম' => 'mm', - 'ম্ল' => 'ml', - 'ম্ব' => 'mb', - 'ম' => 'm', - '০' => '0', - '১' => '1', - '২' => '2', - '৩' => '3', - '৪' => '4', - '৫' => '5', - '৬' => '6', - '৭' => '7', - '৮' => '8', - '৯' => '9', - 'ঙ্ক্ষ' => 'Ngkx', - 'ঞ্ছ' => 'nch', - 'ঙ্ঘ' => 'ngh', - 'ঙ্খ' => 'nkh', - 'ঞ্ঝ' => 'njh', - 'ঙ্গৌ' => 'ngOU', - 'ঙ্গৈ' => 'ngOI', - 'ঞ্চ' => 'nc', - 'ঙ্ক' => 'nk', - 'ঙ্ষ' => 'Ngx', - 'ঙ্গ' => 'ngo', - 'ঙ্ম' => 'Ngm', - 'ঞ্জ' => 'nj', - 'ন্ধ' => 'ndh', - 'ন্ঠ' => 'nTh', - 'ণ্ঠ' => 'NTh', - 'ন্থ' => 'nth', - 'ঙ্গা' => 'nga', - 'ঙ্গি' => 'ngi', - 'ঙ্গী' => 'ngI', - 'ঙ্গু' => 'ngu', - 'ঙ্গূ' => 'ngU', - 'ঙ্গে' => 'nge', - 'ঙ্গো' => 'ngO', - 'ণ্ঢ' => 'NDh', - 'নশ' => 'nsh', - 'ঙর' => 'Ngr', - 'ঞর' => 'NGr', - 'ংর' => 'ngr', - 'ঙ' => 'Ng', - 'ঞ' => 'NG', - 'ং' => 'ng', - 'ন্ন' => 'nn', - 'ণ্ণ' => 'NN', - 'ণ্ন' => 'Nn', - 'ন্ম' => 'nm', - 'ণ্ম' => 'Nm', - 'ন্দ' => 'nd', - 'ন্ট' => 'nT', - 'ণ্ট' => 'NT', - 'ন্ড' => 'nD', - 'ণ্ড' => 'ND', - 'ন্ত' => 'nt', - 'ন্স' => 'ns', - 'ন' => 'n', - 'ণ' => 'N', - 'ৈ' => 'OI', - 'ৌ' => 'OU', - 'ো' => 'O', - 'ঐ' => 'OI', - 'ঔ' => 'OU', - 'অ' => 'o', - 'ও' => 'oo', - 'ফ্ল' => 'fl', - 'প্ট' => 'pT', - 'প্ত' => 'pt', - 'প্ন' => 'pn', - 'প্প' => 'pp', - 'প্ল' => 'pl', - 'প্স' => 'ps', - 'ফ' => 'f', - 'প' => 'p', - 'ৃ' => 'rri', - 'ঋ' => 'rri', - 'রর‍্য' => 'rry', - '্র্য' => 'ry', - '্রর' => 'rr', - 'ড়্গ' => 'Rg', - 'ঢ়' => 'Rh', - 'ড়' => 'R', - 'র' => 'r', - '্র' => 'r', - 'শ্ছ' => 'Sch', - 'ষ্ঠ' => 'ShTh', - 'ষ্ফ' => 'Shf', - 'স্ক্ল' => 'skl', - 'স্খ' => 'skh', - 'স্থ' => 'sth', - 'স্ফ' => 'sf', - 'শ্চ' => 'Sc', - 'শ্ত' => 'St', - 'শ্ন' => 'Sn', - 'শ্ম' => 'Sm', - 'শ্ল' => 'Sl', - 'ষ্ক' => 'Shk', - 'ষ্ট' => 'ShT', - 'ষ্ণ' => 'ShN', - 'ষ্প' => 'Shp', - 'ষ্ম' => 'Shm', - 'স্প্ল' => 'spl', - 'স্ক' => 'sk', - 'স্ট' => 'sT', - 'স্ত' => 'st', - 'স্ন' => 'sn', - 'স্প' => 'sp', - 'স্ম' => 'sm', - 'স্ল' => 'sl', - 'শ' => 'S', - 'ষ' => 'Sh', - 'স' => 's', - 'ু' => 'u', - 'উ' => 'u', - 'অ্য' => 'oZ', - 'ত্থ' => 'tth', - 'ৎ' => 'tt', - 'ট্ট' => 'TT', - 'ট্ম' => 'Tm', - 'ঠ' => 'Th', - 'ত্ন' => 'tn', - 'ত্ম' => 'tm', - 'থ' => 'th', - 'ত্ত' => 'tt', - 'ট' => 'T', - 'ত' => 't', - 'অ্যা' => 'AZ', - 'া' => 'a', - 'আ' => 'a', - 'য়া' => 'ya', - 'য়' => 'y', - 'ি' => 'i', - 'ই' => 'i', - 'ী' => 'ee', - 'ঈ' => 'ee', - 'ূ' => 'uu', - 'ঊ' => 'uu', - 'ে' => 'e', - 'এ' => 'e', - 'য' => 'z', - '্য' => 'Z', - 'ইয়' => 'y', - 'ওয়' => 'w', - '্ব' => 'w', - 'এক্স' => 'x', - 'ঃ' => ':', - 'ঁ' => 'nn', - '্‌' => '', - ], - // English - 'en' => [ - ], - // Latin (+ Cyrillic ?) chars - // - // -> Mix of languages, but we need to keep this here, so that different languages can handle there own behavior. - 'latin' => [ - '˚' => '0', - '¹' => '1', - '²' => '2', - '³' => '3', - '⁴' => '4', - '⁵' => '5', - '⁶' => '6', - '⁷' => '7', - '⁸' => '8', - '⁹' => '9', - '₀' => '0', - '₁' => '1', - '₂' => '2', - '₃' => '3', - '₄' => '4', - '₅' => '5', - '₆' => '6', - '₇' => '7', - '₈' => '8', - '₉' => '9', - '௦' => '0', - '௧' => '1', - '௨' => '2', - '௩' => '3', - '௪' => '4', - '௫' => '5', - '௬' => '6', - '௭' => '7', - '௮' => '8', - '௯' => '9', - '௰' => '10', - '௱' => '100', - '௲' => '1000', - 'Ꜳ' => 'AA', - 'ꜳ' => 'aa', - 'Æ' => 'AE', - 'æ' => 'ae', - 'Ǽ' => 'AE', - 'ǽ' => 'ae', - 'Ꜵ' => 'AO', - 'ꜵ' => 'ao', - 'Ꜷ' => 'AU', - 'ꜷ' => 'au', - 'Ꜹ' => 'AV', - 'ꜹ' => 'av', - 'Ꜻ' => 'av', - 'ꜻ' => 'av', - 'Ꜽ' => 'AY', - 'ꜽ' => 'ay', - 'ȸ' => 'db', - 'ʣ' => 'dz', - 'ʥ' => 'dz', - 'ʤ' => 'dezh', - '🙰' => 'et', - 'ff' => 'ff', - 'ffi' => 'ffi', - 'ffl' => 'ffl', - 'fi' => 'fi', - 'fl' => 'fl', - 'ʩ' => 'feng', - 'IJ' => 'IJ', - 'ij' => 'ij', - 'ʪ' => 'ls', - 'ʫ' => 'lz', - 'ɮ' => 'lezh', - 'ȹ' => 'qp', - 'ʨ' => 'tc', - 'ʦ' => 'ts', - 'ʧ' => 'tesh', - 'Œ' => 'OE', - 'œ' => 'oe', - 'Ꝏ' => 'OO', - 'ꝏ' => 'oo', - 'ẞ' => 'SS', - 'ß' => 'ss', - 'st' => 'st', - 'ſt' => 'st', - 'Ꜩ' => 'TZ', - 'ꜩ' => 'tz', - 'ᵫ' => 'ue', - 'Aι' => 'Ai', - 'αι' => 'ai', - 'Ει' => 'Ei', - 'ει' => 'ei', - 'Οι' => 'Oi', - 'οι' => 'oi', - 'Ου' => 'Oy', - 'ου' => 'oy', - 'Υι' => 'Yi', - 'υι' => 'yi', - 'ἀ' => 'a', - 'ἁ' => 'a', - 'ἂ' => 'a', - 'ἃ' => 'a', - 'ἄ' => 'a', - 'ἅ' => 'a', - 'ἆ' => 'a', - 'ἇ' => 'a', - 'Ἀ' => 'A', - 'Ἁ' => 'A', - 'Ἂ' => 'A', - 'Ἃ' => 'A', - 'Ἄ' => 'A', - 'Ἅ' => 'A', - 'Ἆ' => 'A', - 'Ἇ' => 'A', - 'ᾰ' => 'a', - 'ᾱ' => 'a', - 'ᾲ' => 'a', - 'ᾳ' => 'a', - 'ᾴ' => 'a', - 'ᾶ' => 'a', - 'ᾷ' => 'a', - 'Ᾰ' => 'A', - 'Ᾱ' => 'A', - 'Ὰ' => 'A', - 'Ά' => 'A', - 'ᾼ' => 'A', - 'Ä' => 'A', - 'ä' => 'a', - 'À' => 'A', - 'à' => 'a', - 'Á' => 'A', - 'á' => 'a', - 'Â' => 'A', - 'â' => 'a', - 'Ã' => 'A', - 'ã' => 'a', - 'A̧' => 'A', - 'a̧' => 'a', - 'Ą' => 'A', - 'ą' => 'a', - 'Ⱥ' => 'A', - 'ⱥ' => 'a', - 'Å' => 'A', - 'å' => 'a', - 'Ǻ' => 'A', - 'ǻ' => 'a', - 'Ă' => 'A', - 'ă' => 'a', - 'Ǎ' => 'A', - 'ǎ' => 'a', - 'Ȧ' => 'A', - 'ȧ' => 'a', - 'Ạ' => 'A', - 'ạ' => 'a', - 'Ā' => 'A', - 'ā' => 'a', - 'ª' => 'a', - 'Ɓ' => 'B', - 'Ѣ' => 'E', - 'ѣ' => 'e', - 'Ç' => 'C', - 'ç' => 'c', - 'Ĉ' => 'C', - 'ĉ' => 'c', - 'C̈' => 'C', - 'c̈' => 'c', - 'C̨' => 'C', - 'c̨' => 'c', - 'Ȼ' => 'C', - 'ȼ' => 'c', - 'Č' => 'C', - 'č' => 'c', - 'Ć' => 'C', - 'ć' => 'c', - 'C̀' => 'C', - 'c̀' => 'c', - 'Ċ' => 'C', - 'ċ' => 'c', - 'C̣' => 'C', - 'c̣' => 'c', - 'C̄' => 'C', - 'c̄' => 'c', - 'C̃' => 'C', - 'c̃' => 'c', - 'Ð' => 'D', - 'Đ' => 'D', - 'ð' => 'd', - 'đ' => 'd', - 'È' => 'E', - 'É' => 'E', - 'Ê' => 'E', - 'Ë' => 'E', - 'Ĕ' => 'E', - 'Ė' => 'E', - 'Ȩ' => 'E', - 'ȩ' => 'e', - 'Ę' => 'E', - 'ę' => 'e', - 'Ɇ' => 'E', - 'ɇ' => 'e', - 'Ě' => 'E', - 'ě' => 'e', - 'Ẹ' => 'E', - 'ẹ' => 'e', - 'Ē' => 'E', - 'ē' => 'e', - 'Ẽ' => 'E', - 'ẽ' => 'e', - 'è' => 'e', - 'é' => 'e', - 'ê' => 'e', - 'ë' => 'e', - 'ĕ' => 'e', - 'ė' => 'e', - 'ƒ' => 'f', - 'Ѳ' => 'F', - 'ѳ' => 'f', - 'Ĝ' => 'G', - 'Ġ' => 'G', - 'ĝ' => 'g', - 'ġ' => 'g', - 'Ĥ' => 'H', - 'Ħ' => 'H', - 'ĥ' => 'h', - 'ħ' => 'h', - 'Ì' => 'I', - 'Í' => 'I', - 'Î' => 'I', - 'Ï' => 'I', - 'Ĩ' => 'I', - 'Ĭ' => 'I', - 'Ǐ' => 'I', - 'Į' => 'I', - 'ì' => 'i', - 'í' => 'i', - 'î' => 'i', - 'ï' => 'i', - 'ĩ' => 'i', - 'ĭ' => 'i', - 'ǐ' => 'i', - 'į' => 'i', - 'І' => 'I', - 'і' => 'i', - 'I̧' => 'I', - 'i̧' => 'i', - 'Ɨ' => 'I', - 'ɨ' => 'i', - 'İ' => 'I', - 'i' => 'i', - 'Ị' => 'I', - 'ị' => 'i', - 'Ī' => 'I', - 'ī' => 'i', - 'Ĵ' => 'J', - 'ĵ' => 'j', - 'J́́' => 'J', - 'j́' => 'j', - 'J̀̀' => 'J', - 'j̀' => 'j', - 'J̈' => 'J', - 'j̈' => 'j', - 'J̧' => 'J', - 'j̧' => 'j', - 'J̨' => 'J', - 'j̨' => 'j', - 'Ɉ' => 'J', - 'ɉ' => 'j', - 'J̌' => 'J', - 'ǰ' => 'j', - 'J̇' => 'J', - 'j' => 'j', - 'J̣' => 'J', - 'j̣' => 'j', - 'J̄' => 'J', - 'j̄' => 'j', - 'J̃' => 'J', - 'j̃' => 'j', - 'Й' => 'i', - 'й' => 'i', - 'ĸ' => 'k', - 'Ĺ' => 'L', - 'Ľ' => 'L', - 'Ŀ' => 'L', - 'ĺ' => 'l', - 'ľ' => 'l', - 'ŀ' => 'l', - 'L̀' => 'L', - 'l̀' => 'l', - 'L̂' => 'L', - 'l̂' => 'l', - 'L̈' => 'L', - 'l̈' => 'l', - 'Ļ' => 'L', - 'ļ' => 'l', - 'L̨' => 'L', - 'l̨' => 'l', - 'Ł' => 'L', - 'ł' => 'l', - 'Ƚ' => 'L', - 'ƚ' => 'l', - 'L̇' => 'L', - 'l̇' => 'l', - 'Ḷ' => 'L', - 'ḷ' => 'l', - 'L̄' => 'L', - 'l̄' => 'l', - 'L̃' => 'L', - 'l̃' => 'l', - 'Ñ' => 'N', - 'ñ' => 'n', - 'Ŋ' => 'N', - 'ŋ' => 'n', - 'ʼn' => 'n', - 'Ń' => 'N', - 'ń' => 'n', - 'Ǹ' => 'N', - 'ǹ' => 'n', - 'N̂' => 'N', - 'n̂' => 'n', - 'N̈' => 'N', - 'n̈' => 'n', - 'Ņ' => 'N', - 'ņ' => 'n', - 'N̨' => 'N', - 'n̨' => 'n', - 'Ꞥ' => 'N', - 'ꞥ' => 'n', - 'Ň' => 'N', - 'ň' => 'n', - 'Ṅ' => 'N', - 'ṅ' => 'n', - 'Ṇ' => 'N', - 'ṇ' => 'n', - 'N̄' => 'N', - 'n̄' => 'n', - 'Ö' => 'O', - 'Ò' => 'O', - 'Ó' => 'O', - 'Ô' => 'O', - 'Õ' => 'O', - 'Ō' => 'O', - 'Ŏ' => 'O', - 'Ǒ' => 'O', - 'Ő' => 'O', - 'Ơ' => 'O', - 'Ø' => 'O', - 'Ǿ' => 'O', - 'ö' => 'o', - 'ò' => 'o', - 'ó' => 'o', - 'ô' => 'o', - 'õ' => 'o', - 'ō' => 'o', - 'ŏ' => 'o', - 'ǒ' => 'o', - 'ő' => 'o', - 'ơ' => 'o', - 'ø' => 'o', - 'ǿ' => 'o', - 'º' => 'o', - 'O̧' => 'O', - 'o̧' => 'o', - 'Ǫ' => 'O', - 'ǫ' => 'o', - 'Ɵ' => 'O', - 'ɵ' => 'o', - 'Ȯ' => 'O', - 'ȯ' => 'o', - 'Ọ' => 'O', - 'ọ' => 'o', - 'Ŕ' => 'R', - 'Ŗ' => 'R', - 'ŕ' => 'r', - 'ŗ' => 'r', - 'Ŝ' => 'S', - 'Ș' => 'S', - 'ș' => 's', - 'Ś' => 'S', - 'ś' => 's', - 'S̀' => 'S', - 's̀' => 's', - 'Ŝ̀' => 'S', - 'ŝ' => 's', - 'S̈' => 'S', - 's̈' => 's', - 'Ş' => 'S', - 'ş' => 's', - 'S̨' => 'S', - 's̨' => 's', - 'Ꞩ' => 'S', - 'ꞩ' => 's', - 'Š' => 'S', - 'š' => 's', - 'Ṡ' => 'S', - 'ṡ' => 's', - 'Ṣ' => 'S', - 'ṣ' => 's', - 'S̄' => 'S', - 's̄' => 's', - 'S̃' => 'S', - 's̃' => 's', - 'ſ' => 's', - 'Ţ' => 'T', - 'Ț' => 'T', - 'Ŧ' => 'T', - 'Þ' => 'TH', - 'ţ' => 't', - 'ț' => 't', - 'ŧ' => 't', - 'þ' => 'th', - 'T́' => 'T', - 't́' => 't', - 'T̀' => 'T', - 't̀' => 't', - 'T̂' => 'T', - 't̂' => 't', - 'T̈' => 'T', - 'ẗ' => 't', - 'T̨' => 'T', - 't̨' => 't', - 'Ⱦ' => 'T', - 'ⱦ' => 't', - 'Ť' => 'T', - 'ť' => 't', - 'Ṫ' => 'T', - 'ṫ' => 't', - 'Ṭ' => 'T', - 'ṭ' => 't', - 'T̄' => 'T', - 't̄' => 't', - 'T̃' => 'T', - 't̃' => 't', - 'Ü' => 'U', - 'Ù' => 'U', - 'Ú' => 'U', - 'Û' => 'U', - 'Ũ' => 'U', - 'Ŭ' => 'U', - 'Ű' => 'U', - 'Ų' => 'U', - 'Ư' => 'U', - 'Ǔ' => 'U', - 'Ǖ' => 'U', - 'Ǘ' => 'U', - 'Ǚ' => 'U', - 'Ǜ' => 'U', - 'ü' => 'u', - 'ù' => 'u', - 'ú' => 'u', - 'û' => 'u', - 'ũ' => 'u', - 'ŭ' => 'u', - 'ű' => 'u', - 'ų' => 'u', - 'ư' => 'u', - 'ǔ' => 'u', - 'ǖ' => 'u', - 'ǘ' => 'u', - 'ǚ' => 'u', - 'ǜ' => 'u', - 'U̧' => 'U', - 'u̧' => 'u', - 'Ʉ' => 'U', - 'ʉ' => 'u', - 'U̇' => 'U', - 'u̇' => 'u', - 'Ụ' => 'U', - 'ụ' => 'u', - 'Ū' => 'U', - 'ū' => 'u', - 'Ʊ' => 'U', - 'ʊ' => 'u', - 'Ŵ' => 'W', - 'ŵ' => 'w', - 'Ẁ' => 'W', - 'ẁ' => 'w', - 'Ẃ' => 'W', - 'ẃ' => 'w', - 'Ẅ' => 'W', - 'ẅ' => 'w', - 'Ѵ' => 'I', - 'ѵ' => 'i', - 'Ꙗ' => 'Ja', - 'ꙗ' => 'ja', - 'Є' => 'Je', - 'є' => 'je', - 'Ѥ' => 'Je', - 'ѥ' => 'je', - 'Ѕ' => 'Dz', - 'ѕ' => 'dz', - 'Ꙋ' => 'U', - 'ꙋ' => 'u', - 'Ѡ' => 'O', - 'ѡ' => 'o', - 'Ѿ' => 'Ot', - 'ѿ' => 'ot', - 'Ѫ' => 'U', - 'ѫ' => 'u', - 'Ѧ' => 'Ja', - 'ѧ' => 'ja', - 'Ѭ' => 'Ju', - 'ѭ' => 'ju', - 'Ѩ' => 'Ja', - 'ѩ' => 'Ja', - 'Ѯ' => 'Ks', - 'ѯ' => 'ks', - 'Ѱ' => 'Ps', - 'ѱ' => 'ps', - 'Х' => 'X', - 'х' => 'x', - 'Ý' => 'Y', - 'Ÿ' => 'Y', - 'Ŷ' => 'Y', - 'ý' => 'y', - 'ÿ' => 'y', - 'ŷ' => 'y', - 'Ỳ' => 'Y', - 'ỳ' => 'y', - 'Y̧' => 'Y', - 'y̧' => 'y', - 'Y̨' => 'Y', - 'y̨' => 'y', - 'Ɏ' => 'Y', - 'ɏ' => 'y', - 'Y̌' => 'Y', - 'y̌' => 'y', - 'Ẏ' => 'Y', - 'ẏ' => 'y', - 'Ỵ' => 'Y', - 'ỵ' => 'y', - 'Ȳ' => 'Y', - 'ȳ' => 'y', - 'Ỹ' => 'Y', - 'ỹ' => 'y', - 'Щ' => 'Shh', - 'щ' => 'shh', - 'Ź' => 'Z', - 'ź' => 'z', - 'Z̀' => 'Z', - 'z̀' => 'z', - 'Ẑ' => 'Z', - 'ẑ' => 'z', - 'Z̈' => 'Z', - 'z̈' => 'z', - 'Z̧' => 'Z', - 'z̧' => 'z', - 'Z̨' => 'Z', - 'z̨' => 'z', - 'Ƶ' => 'Z', - 'ƶ' => 'z', - 'Ž' => 'Z', - 'ž' => 'z', - 'Ż' => 'Z', - 'ż' => 'z', - 'Ẓ' => 'Z', - 'ẓ' => 'z', - 'Z̄' => 'Z', - 'z̄' => 'z', - 'Z̃' => 'Z', - 'z̃' => 'z', - ], - // whitespace chars - ' ' => [ - "\xc2\xa0" => ' ', // 'NO-BREAK SPACE' - "\xe1\x9a\x80" => ' ', // 'OGHAM SPACE MARK' - "\xe2\x80\x80" => ' ', // 'EN QUAD' - "\xe2\x80\x81" => ' ', // 'EM QUAD' - "\xe2\x80\x82" => ' ', // 'EN SPACE' - "\xe2\x80\x83" => ' ', // 'EM SPACE' - "\xe2\x80\x84" => ' ', // 'THREE-PER-EM SPACE' - "\xe2\x80\x85" => ' ', // 'FOUR-PER-EM SPACE' - "\xe2\x80\x86" => ' ', // 'SIX-PER-EM SPACE' - "\xe2\x80\x87" => ' ', // 'FIGURE SPACE' - "\xe2\x80\x88" => ' ', // 'PUNCTUATION SPACE' - "\xe2\x80\x89" => ' ', // 'THIN SPACE' - "\xe2\x80\x8a" => ' ', // 'HAIR SPACE' - "\xe2\x80\xa8" => ' ', // 'LINE SEPARATOR' - "\xe2\x80\xa9" => ' ', // 'PARAGRAPH SEPARATOR' - "\xe2\x80\x8b" => ' ', // 'ZERO WIDTH SPACE' - "\xe2\x80\xaf" => ' ', // 'NARROW NO-BREAK SPACE' - "\xe2\x81\x9f" => ' ', // 'MEDIUM MATHEMATICAL SPACE' - "\xe3\x80\x80" => ' ', // 'IDEOGRAPHIC SPACE' - "\xef\xbe\xa0" => ' ', // 'HALFWIDTH HANGUL FILLER' - ], - // commonly used in Word documents - 'msword' => [ - "\xc2\xab" => '<<', // « (U+00AB) in UTF-8 - "\xc2\xbb" => '>>', // » (U+00BB) in UTF-8 - "\xe2\x80\x98" => "'", // ‘ (U+2018) in UTF-8 - "\xe2\x80\x99" => "'", // ’ (U+2019) in UTF-8 - "\xe2\x80\x9a" => "'", // ‚ (U+201A) in UTF-8 - "\xe2\x80\x9b" => "'", // ‛ (U+201B) in UTF-8 - "\xe2\x80\x9c" => '"', // “ (U+201C) in UTF-8 - "\xe2\x80\x9d" => '"', // ” (U+201D) in UTF-8 - "\xe2\x80\x9e" => '"', // „ (U+201E) in UTF-8 - "\xe2\x80\x9f" => '"', // ‟ (U+201F) in UTF-8 - "\xe2\x80\xb9" => "'", // ‹ (U+2039) in UTF-8 - "\xe2\x80\xba" => "'", // › (U+203A) in UTF-8 - "\xe2\x80\x93" => '-', // – (U+2013) in UTF-8 - "\xe2\x80\x94" => '-', // — (U+2014) in UTF-8 - "\xe2\x80\xa6" => '...', // … (U+2026) in UTF-8 - ], - // Currency - // - // url => https://en.wikipedia.org/wiki/Currency_symbol - 'currency_short' => [ - '€' => 'EUR', - '$' => '$', - '₢' => 'Cr', - '₣' => 'Fr.', - '£' => 'PS', - '₤' => 'L.', - 'ℳ' => 'M', - '₥' => 'mil', - '₦' => 'N', - '₧' => 'Pts', - '₨' => 'Rs', - 'රු' => 'LKR', - 'ரூ' => 'LKR', - '௹' => 'Rs', - 'रू' => 'NPR', - '₹' => 'Rs', - '૱' => 'Rs', - '₩' => 'W', - '₪' => 'NS', - '₸' => 'KZT', - '₫' => 'D', - '֏' => 'AMD', - '₭' => 'K', - '₺' => 'TL', - '₼' => 'AZN', - '₮' => 'T', - '₯' => 'Dr', - '₲' => 'PYG', - '₾' => 'GEL', - '₳' => 'ARA', - '₴' => 'UAH', - '₽' => 'RUB', - '₵' => 'GHS', - '₡' => 'CL', - '¢' => 'c', - '¥' => 'YEN', - '円' => 'JPY', - '৳' => 'BDT', - '元' => 'CNY', - '﷼' => 'SAR', - '៛' => 'KR', - '₠' => 'ECU', - '¤' => '$?', - '฿' => 'THB', - '؋' => 'AFN', - ], -]; diff --git a/plugins/vendor/voku/portable-ascii/src/voku/helper/data/ascii_extras_by_languages.php b/plugins/vendor/voku/portable-ascii/src/voku/helper/data/ascii_extras_by_languages.php deleted file mode 100644 index afe31ae2..00000000 --- a/plugins/vendor/voku/portable-ascii/src/voku/helper/data/ascii_extras_by_languages.php +++ /dev/null @@ -1,759 +0,0 @@ - [ - '=' => ' gelijk ', - '%' => ' procent ', - '∑' => ' som ', - '∆' => ' delta ', - '∞' => ' oneindig ', - '♥' => ' love ', - '&' => ' en ', - '+' => ' plus ', - ], - // Italian - 'it' => [ - '=' => ' uguale ', - '%' => ' percent ', - '∑' => ' somma ', - '∆' => ' delta ', - '∞' => ' infinito ', - '♥' => ' amore ', - '&' => ' e ', - '+' => ' piu ', - ], - // Macedonian - 'mk' => [ - '=' => ' ednakva ', - '%' => ' procenti ', - '∑' => ' zbir ', - '∆' => ' delta ', - '∞' => ' beskonecnost ', - '♥' => ' loveubov ', - '&' => ' i ', - '+' => ' plus ', - ], - // Portuguese (Brazil) - 'pt' => [ - '=' => ' igual ', - '%' => ' por cento ', - '∑' => ' soma ', - '∆' => ' delta ', - '∞' => ' infinito ', - '♥' => ' amor ', - '&' => ' e ', - '+' => ' mais ', - ], - // Greek(lish) (Elláda) - 'el__greeklish' => [ - '=' => ' isos ', - '%' => ' tois ekato ', - '∑' => ' athroisma ', - '∆' => ' delta ', - '∞' => ' apeiro ', - '♥' => ' agape ', - '&' => ' kai ', - '+' => ' syn ', - ], - // Greek (Elláda) - 'el' => [ - '=' => ' isos ', - '%' => ' tois ekato ', - '∑' => ' athroisma ', - '∆' => ' delta ', - '∞' => ' apeiro ', - '♥' => ' agape ', - '&' => ' kai ', - '+' => ' syn ', - ], - // Hindi - 'hi' => [ - '=' => ' samana ', - '%' => ' paratisata ', - '∑' => ' yoga ', - '∆' => ' dalata ', - '∞' => ' anata ', - '♥' => ' payara ', - '&' => ' aura ', - '+' => ' palasa ', - ], - // Armenian - 'hy' => [ - '=' => ' havasar ', - '%' => ' tvokvos ', - '∑' => ' gvoumar ', - '∆' => ' delta ', - '∞' => ' ansahmanvouthyvoun ', - '♥' => ' ser ', - '&' => ' ev ', - '+' => ' gvoumarats ', - ], - // Swedish - 'sv' => [ - '=' => ' lika ', - '%' => ' procent ', - '∑' => ' summa ', - '∆' => ' delta ', - '∞' => ' oandlighet ', - '♥' => ' alskar ', - '&' => ' och ', - '+' => ' plus ', - ], - // Turkmen - 'tk' => [ - '=' => ' den ', - '%' => ' yuzde ', - '∑' => ' jem ', - '∆' => ' delta ', - '∞' => ' mudimilik ', - '♥' => ' soygi ', - '&' => ' we ', - '+' => ' yzy ', - ], - // Turkish - 'tr' => [ - '=' => ' esit ', - '%' => ' yuzde ', - '∑' => ' Toplam ', - '∆' => ' delta ', - '∞' => ' sonsuzluk ', - '♥' => ' ask ', - '&' => ' ve ', - '+' => ' arti ', - ], - // Bulgarian - 'bg' => [ - '=' => ' raven ', - '%' => ' na sto ', - '∑' => ' suma ', - '∆' => ' delta ', - '∞' => ' bezkrajnost ', - '♥' => ' obicam ', - '&' => ' i ', - '+' => ' plus ', - ], - // Hungarian - 'hu' => [ - '=' => ' Egyenlo ', - '%' => ' Szazalek ', - '∑' => ' osszeg ', - '∆' => ' delta ', - '∞' => ' vegtelenitett ', - '♥' => ' love ', - '&' => ' Es ', - '+' => ' Plusz ', - ], - // Myanmar (Burmese) - 'my' => [ - '=' => ' ttn:ttnnym? ', - '%' => ' raakhngnn:k ', - '∑' => ' ld ', - '∆' => ' m?cwk?n:pe? ', - '∞' => ' ach:m ', - '♥' => ' mettttaa ', - '&' => ' n ', - '+' => ' ape?ng: ', - ], - // Croatian (Hrvatska) - 'hr' => [ - '=' => ' Jednaki ', - '%' => ' Posto ', - '∑' => ' zbroj ', - '∆' => ' Delta ', - '∞' => ' beskonacno ', - '♥' => ' ljubav ', - '&' => ' I ', - '+' => ' Plus ', - ], - // Finnish - 'fi' => [ - '=' => ' Sama ', - '%' => ' Prosenttia ', - '∑' => ' sum ', - '∆' => ' delta ', - '∞' => ' aareton ', - '♥' => ' rakkautta ', - '&' => ' Ja ', - '+' => ' Plus ', - ], - // Georgian (Kartvelian) - 'ka' => [ - '=' => ' tanasts\'ori ', - '%' => ' p\'rotsent\'i ', - '∑' => ' tankha ', - '∆' => ' delt\'a ', - '∞' => ' usasrulo ', - '♥' => ' siq\'varuli ', - '&' => ' da ', - '+' => ' p\'lus ', - ], - // Russian - 'ru' => [ - '=' => ' ravnyj ', - '%' => ' procent ', - '∑' => ' summa ', - '∆' => ' del\'ta ', - '∞' => ' beskonecnost\' ', - '♥' => ' lublu ', - '&' => ' i ', - '+' => ' plus ', - ], - // Russian - GOST 7.79-2000(B) - 'ru__gost_2000_b' => [ - '=' => ' ravnyj ', - '%' => ' procent ', - '∑' => ' summa ', - '∆' => ' del\'ta ', - '∞' => ' beskonecnost\' ', - '♥' => ' lublu ', - '&' => ' i ', - '+' => ' plus ', - ], - // Russian - Passport (2013), ICAO - 'ru__passport_2013' => [ - '=' => ' ravnyj ', - '%' => ' procent ', - '∑' => ' summa ', - '∆' => ' del\'ta ', - '∞' => ' beskonecnost\' ', - '♥' => ' lublu ', - '&' => ' i ', - '+' => ' plus ', - ], - // Ukrainian - 'uk' => [ - '=' => ' rivnij ', - '%' => ' vidsotkiv ', - '∑' => ' suma ', - '∆' => ' del\'ta ', - '∞' => ' neskincennist\' ', - '♥' => ' lubov ', - '&' => ' i ', - '+' => ' plus ', - ], - // Kazakh - 'kk' => [ - '=' => ' ten\' ', - '%' => ' Pajyzdar ', - '∑' => ' zalpy ', - '∆' => ' ajyrmasylyk, ', - '∞' => ' seksiz ', - '♥' => ' mahabbat ', - '&' => ' z@ne ', - '+' => ' plus ', - ], - // Czech - 'cs' => [ - '=' => ' rovnat se ', - '%' => ' procento ', - '∑' => ' soucet ', - '∆' => ' delta ', - '∞' => ' nekonecno ', - '♥' => ' laska ', - '&' => ' a ', - '+' => ' plus ', - ], - // Danish - 'da' => [ - '=' => ' Lige ', - '%' => ' Prozent ', - '∑' => ' sum ', - '∆' => ' delta ', - '∞' => ' uendelig ', - '♥' => ' kaerlighed ', - '&' => ' Og ', - '+' => ' Plus ', - ], - // Polish - 'pl' => [ - '=' => ' rowny ', - '%' => ' procent ', - '∑' => ' suma ', - '∆' => ' delta ', - '∞' => ' nieskonczonosc ', - '♥' => ' milosc ', - '&' => ' i ', - '+' => ' plus ', - ], - // Romanian - 'ro' => [ - '=' => ' egal ', - '%' => ' la suta ', - '∑' => ' suma ', - '∆' => ' delta ', - '∞' => ' infinit ', - '♥' => ' dragoste ', - '&' => ' si ', - '+' => ' la care se adauga ', - ], - // Esperanto - 'eo' => [ - '=' => ' Egalaj ', - '%' => ' Procento ', - '∑' => ' sumo ', - '∆' => ' delto ', - '∞' => ' senfina ', - '♥' => ' amo ', - '&' => ' Kaj ', - '+' => ' Pli ', - ], - // Estonian - 'et' => [ - '=' => ' Vordsed ', - '%' => ' Protsenti ', - '∑' => ' summa ', - '∆' => ' o ', - '∞' => ' loputut ', - '♥' => ' armastus ', - '&' => ' Ja ', - '+' => ' Pluss ', - ], - // Latvian - 'lv' => [ - '=' => ' vienads ', - '%' => ' procents ', - '∑' => ' summa ', - '∆' => ' delta ', - '∞' => ' bezgaliba ', - '♥' => ' milestiba ', - '&' => ' un ', - '+' => ' pluss ', - ], - // Lithuanian - 'lt' => [ - '=' => ' lygus ', - '%' => ' procentu ', - '∑' => ' suma ', - '∆' => ' delta ', - '∞' => ' begalybe ', - '♥' => ' meile ', - '&' => ' ir ', - '+' => ' plius ', - ], - // Norwegian - 'no' => [ - '=' => ' Lik ', - '%' => ' Prosent ', - '∑' => ' sum ', - '∆' => ' delta ', - '∞' => ' uendelig ', - '♥' => ' kjaerlighet ', - '&' => ' Og ', - '+' => ' Pluss ', - ], - // Vietnamese - 'vi' => [ - '=' => ' cong bang ', - '%' => ' phan tram ', - '∑' => ' tong so ', - '∆' => ' dong bang ', - '∞' => ' vo cuc ', - '♥' => ' Yeu ', - '&' => ' va ', - '+' => ' them ', - ], - // Arabic - 'ar' => [ - '=' => ' mtsawy ', - '%' => ' nsbh mywyh ', - '∑' => ' mjmw\' ', - '∆' => ' dlta ', - '∞' => ' ma la nhayt ', - '♥' => ' hb ', - '&' => ' w ', - '+' => ' zayd ', - ], - // Persian (Farsi) - 'fa' => [ - '=' => ' brabr ', - '%' => ' dr sd ', - '∑' => ' mjmw\' ', - '∆' => ' dlta ', - '∞' => ' by nhayt ', - '♥' => ' \'shq ', - '&' => ' w ', - '+' => ' bh \'lawh ', - ], - // Serbian - 'sr' => [ - '=' => ' jednak ', - '%' => ' procenat ', - '∑' => ' zbir ', - '∆' => ' delta ', - '∞' => ' beskraj ', - '♥' => ' lubav ', - '&' => ' i ', - '+' => ' vise ', - ], - // Serbian - Cyrillic - 'sr__cyr' => [ - '=' => ' jednak ', - '%' => ' procenat ', - '∑' => ' zbir ', - '∆' => ' delta ', - '∞' => ' beskraj ', - '♥' => ' lubav ', - '&' => ' i ', - '+' => ' vise ', - ], - // Serbian - Latin - 'sr__lat' => [ - '=' => ' jednak ', - '%' => ' procenat ', - '∑' => ' zbir ', - '∆' => ' delta ', - '∞' => ' beskraj ', - '♥' => ' lubav ', - '&' => ' i ', - '+' => ' vise ', - ], - // Azerbaijani - 'az' => [ - '=' => ' b@rab@r ', - '%' => ' faiz ', - '∑' => ' m@bl@g ', - '∆' => ' delta ', - '∞' => ' sonsuzluq ', - '♥' => ' sevgi ', - '&' => ' v@ ', - '+' => ' plus ', - ], - // Slovak - 'sk' => [ - '=' => ' rovny ', - '%' => ' percento ', - '∑' => ' sucet ', - '∆' => ' delta ', - '∞' => ' infinity ', - '♥' => ' milovat ', - '&' => ' a ', - '+' => ' viac ', - ], - // French - 'fr' => [ - '=' => ' Egal ', - '%' => ' Pourcentage ', - '∑' => ' somme ', - '∆' => ' delta ', - '∞' => ' infini ', - '♥' => ' amour ', - '&' => ' Et ', - '+' => ' Plus ', - ], - // Austrian (French) - 'fr_at' => [ - '=' => ' Egal ', - '%' => ' Pourcentage ', - '∑' => ' somme ', - '∆' => ' delta ', - '∞' => ' infini ', - '♥' => ' amour ', - '&' => ' Et ', - '+' => ' Plus ', - ], - // Switzerland (French) - 'fr_ch' => [ - '=' => ' Egal ', - '%' => ' Pourcentage ', - '∑' => ' somme ', - '∆' => ' delta ', - '∞' => ' infini ', - '♥' => ' amour ', - '&' => ' Et ', - '+' => ' Plus ', - ], - // German - 'de' => [ - '=' => ' gleich ', - '%' => ' Prozent ', - '∑' => ' gesamt ', - '∆' => ' Unterschied ', - '∞' => ' undendlich ', - '♥' => ' liebe ', - '&' => ' und ', - '+' => ' plus ', - ], - // Austrian (German) - 'de_at' => [ - '=' => ' gleich ', - '%' => ' Prozent ', - '∑' => ' gesamt ', - '∆' => ' Unterschied ', - '∞' => ' undendlich ', - '♥' => ' liebe ', - '&' => ' und ', - '+' => ' plus ', - ], - // Switzerland (German) - 'de_ch' => [ - '=' => ' gleich ', - '%' => ' Prozent ', - '∑' => ' gesamt ', - '∆' => ' Unterschied ', - '∞' => ' undendlich ', - '♥' => ' liebe ', - '&' => ' und ', - '+' => ' plus ', - ], - // Bengali (Bangla) - 'bn' => [ - '=' => ' Saman ', - '%' => ' Satakora ', - '∑' => ' Samasti ', - '∆' => ' Badhip ', - '∞' => ' Ananta ', - '♥' => ' Valobasa ', - '&' => ' Abong ', - '+' => ' Songzojon ', - ], - // English - 'en' => [ - '=' => ' equal ', - '%' => ' percent ', - '∑' => ' sum ', - '∆' => ' delta ', - '∞' => ' infinity ', - '♥' => ' love ', - '&' => ' and ', - '+' => ' plus ', - ], - // Currency - // - // url: https://en.wikipedia.org/wiki/Currency_symbol - 'currency' => [ - '€' => ' Euro ', - '$' => ' Dollar ', - '₢' => ' cruzeiro ', - '₣' => ' French franc ', - '£' => ' pound ', - '₤' => ' lira ', // Italian - '₶' => ' livre tournois ', - 'ℳ' => ' mark ', - '₥' => ' mill ', - '₦' => ' naira ', - '₧' => ' peseta ', - '₨' => ' rupee ', - 'රු' => ' rupee ', // Sri Lankan - 'ரூ' => ' rupee ', // Sri Lankan - '௹' => ' rupee ', // Tamil - 'रू' => ' rupee ', // Nepalese - '₹' => ' rupee ', // Indian - '૱' => ' rupee ', // Gujarat - '₩' => ' won ', - '₪' => ' new shequel ', - '₸' => ' tenge ', - '₫' => ' dong ', - '֏' => ' dram ', - '₭' => ' kip ', - '₺' => ' lira ', // Turkish - '₼' => ' manat ', - '₮' => ' tugrik ', - '₯' => ' drachma ', - '₰' => ' pfennig ', - '₷' => ' spesmilo ', - '₱' => ' peso ', // Philippine - '﷼‎' => ' riyal ', - '₲' => ' guarani ', - '₾' => ' lari ', - '₳' => ' austral ', - '₴' => ' hryvnia ', - '₽' => ' ruble ', - '₵' => ' cedi ', - '₡' => ' colon ', - '¢' => ' cent ', - '¥' => ' yen ', - '円' => ' yen ', - '৳' => ' taka ', - '元' => ' yuan ', - '﷼' => ' riyal ', - '៛' => ' riel ', - '₠' => ' European Currency ', - '¤' => ' currency ', - '฿' => ' baht ', - '؋' => ' afghani ', - ], - // Temperature - // - // url: https://en.wikipedia.org/wiki/Conversion_of_units_of_temperature - 'temperature' => [ - '°De' => ' Delisle ', - '°Re' => ' Reaumur ', // Réaumur - '°Ro' => ' Romer ', // Rømer - '°R' => ' Rankine ', - '°C' => ' Celsius ', - '°F' => ' Fahrenheit ', - '°N' => ' Newton ', - ], - 'latin_symbols' => [ - '=' => '=', - '%' => '%', - '∑' => '∑', - '∆' => '∆', - '∞' => '∞', - '♥' => '♥', - '&' => '&', - '+' => '+', - // --- - '©' => ' (c) ', - '®' => ' (r) ', - '@' => ' (at) ', - '№' => ' No. ', - '℞' => ' Rx ', - '[' => '[', - '\' => '\\', - ']' => ']', - '^' => '^', - '_' => '_', - '`' => '`', - '‐' => '-', - '‑' => '-', - '‒' => '-', - '–' => '-', - '−' => '-', - '—' => '-', - '―' => '-', - '﹘' => '-', - '│' => '|', - '∖' => '\\', - '∕' => '/', - '⁄' => '/', - '←' => '<-', - '→' => '->', - '↑' => '|', - '↓' => '|', - '⁅' => '[', - '⁆' => ']', - '⁎' => '*', - '、' => ',', - '。' => '.', - '〈' => '<', - '〉' => '>', - '《' => '<<', - '》' => '>>', - '〔' => '[', - '〕' => ']', - '〘' => '[', - '〙' => ']', - '〚' => '[', - '〛' => ']', - '﹝' => '[', - '﹞' => ']', - '︹' => '[', - '︺' => ']', - '﹇' => '[', - '﹈' => ']', - '︐' => ',', - '︑' => ',', - '︒' => '.', - '︓' => ':', - '︔' => ';', - '︕' => '!', - '︖' => '?', - '︙' => '...', - '︰' => '..', - '︵' => '(', - '︶' => ')', - '﹙' => '(', - '﹚' => ')', - '︷' => '{', - '︸' => '}', - '﹛' => '{', - '﹜' => '}', - '︽' => '<<', - '︾' => '>>', - '︿' => '<', - '﹀' => '>', - '×' => '*', - '÷' => '/', - '≪' => '<<', - '≫' => '>>', - '⦅' => '((', - '⦆' => '))', - '〇' => '0', - '′' => '\'', - '〝' => '"', - '〞' => '"', - '«' => '<<', - '»' => '>>', - '‘' => "'", - '’' => "'", - '‚' => ',', - '‛' => "'", - '“' => '"', - '”' => '"', - '„' => '"', - '‟' => '"', - '‹' => '<', - '›' => '>', - '․' => '.', - '‥' => '..', - '…' => '...', - '″' => '"', - '‴' => '\'\'\'', - '‶' => '``', - '‷' => '```', - '‼' => '!!', - '⁇' => '??', - '⁈' => '?!', - '⁉' => '!?', - '⁗' => '````', - '⩴' => '::=', - '⩵' => '==', - '⩶' => '===', - '﹔' => ';', - '﹕' => ':', - '﹖' => '?', - '﹗' => '!', - '﹍' => '_', - '﹎' => '_', - '﹏' => '_', - '﹐' => ',', - '﹑' => ',', - '﹒' => '.', - '﹟' => '#', - '﹠' => '&', - '﹡' => '*', - '﹢' => '+', - '﹣' => '-', - '﹤' => '<', - '﹥' => '>', - '﹦' => '=', - '﹨' => '\\', - '﹩' => '$', - '﹪' => '%', - '﹫' => '@', - '!' => '!', - '"' => '"', - '#' => '#', - '$' => '$', - '%' => '%', - '&' => '&', - ''' => '\'', - '(' => '(', - ')' => ')', - '*' => '*', - '+' => '+', - ',' => ',', - '-' => '-', - '.' => '.', - '/' => '/', - ':' => ':', - ';' => ';', - '<' => '<', - '=' => '=', - '>' => '>', - '?' => '?', - '@' => '@', - '{' => '{', - '|' => '|', - '}' => '}', - '~' => '~', - '⦅' => '((', - '⦆' => '))', - '¬' => '!', - ' ̄' => '-', - '¦' => '|', - '■' => '#', - ], -]; diff --git a/plugins/vendor/voku/portable-ascii/src/voku/helper/data/ascii_language_max_key.php b/plugins/vendor/voku/portable-ascii/src/voku/helper/data/ascii_language_max_key.php deleted file mode 100644 index da81ae23..00000000 --- a/plugins/vendor/voku/portable-ascii/src/voku/helper/data/ascii_language_max_key.php +++ /dev/null @@ -1,65 +0,0 @@ - 0, - 'tk' => 1, - 'th' => 0, - 'ps' => 0, - 'or' => 0, - 'mn' => 0, - 'ko' => 0, - 'ky' => 0, - 'hy' => 1, - 'bn' => 5, - 'be' => 0, - 'am' => 0, - 'ja' => 0, - 'zh' => 0, - 'nl' => 1, - 'it' => 1, - 'mk' => 1, - 'pt' => 1, - 'el__greeklish' => 2, - 'el' => 2, - 'hi' => 2, - 'sv' => 1, - 'tr' => 1, - 'bg' => 2, - 'hu' => 1, - 'my' => 5, - 'hr' => 2, - 'fi' => 1, - 'ka' => 1, - 'ru' => 1, - 'ru__gost_2000_b' => 1, - 'ru__passport_2013' => 1, - 'uk' => 1, - 'kk' => 1, - 'cs' => 1, - 'da' => 1, - 'pl' => 1, - 'ro' => 1, - 'eo' => 1, - 'et' => 1, - 'lv' => 1, - 'lt' => 1, - 'no' => 1, - 'vi' => 1, - 'ar' => 1, - 'fa' => 1, - 'sr' => 1, - 'sr__cyr' => 1, - 'sr__lat' => 1, - 'az' => 1, - 'sk' => 1, - 'fr' => 1, - 'fr_at' => 1, - 'fr_ch' => 1, - 'de' => 1, - 'de_at' => 1, - 'de_ch' => 1, - 'en' => 0, - 'latin' => 3, - ' ' => 1, - 'msword' => 1, -]; diff --git a/plugins/vendor/voku/portable-ascii/src/voku/helper/data/ascii_ord.php b/plugins/vendor/voku/portable-ascii/src/voku/helper/data/ascii_ord.php deleted file mode 100644 index 142318c3..00000000 --- a/plugins/vendor/voku/portable-ascii/src/voku/helper/data/ascii_ord.php +++ /dev/null @@ -1 +0,0 @@ - 0, "\x00" => 0, "\x01" => 1, "\x02" => 2, "\x03" => 3, "\x04" => 4, "\x05" => 5, "\x06" => 6, "\x07" => 7, "\x08" => 8, "\x09" => 9, "\x0A" => 10, "\x0B" => 11, "\x0C" => 12, "\x0D" => 13, "\x0E" => 14, "\x0F" => 15, "\x10" => 16, "\x11" => 17, "\x12" => 18, "\x13" => 19, "\x14" => 20, "\x15" => 21, "\x16" => 22, "\x17" => 23, "\x18" => 24, "\x19" => 25, "\x1A" => 26, "\x1B" => 27, "\x1C" => 28, "\x1D" => 29, "\x1E" => 30, "\x1F" => 31, "\x20" => 32, "\x21" => 33, "\x22" => 34, "\x23" => 35, "\x24" => 36, "\x25" => 37, "\x26" => 38, "\x27" => 39, "\x28" => 40, "\x29" => 41, "\x2A" => 42, "\x2B" => 43, "\x2C" => 44, "\x2D" => 45, "\x2E" => 46, "\x2F" => 47, "\x30" => 48, "\x31" => 49, "\x32" => 50, "\x33" => 51, "\x34" => 52, "\x35" => 53, "\x36" => 54, "\x37" => 55, "\x38" => 56, "\x39" => 57, "\x3A" => 58, "\x3B" => 59, "\x3C" => 60, "\x3D" => 61, "\x3E" => 62, "\x3F" => 63, "\x40" => 64, "\x41" => 65, "\x42" => 66, "\x43" => 67, "\x44" => 68, "\x45" => 69, "\x46" => 70, "\x47" => 71, "\x48" => 72, "\x49" => 73, "\x4A" => 74, "\x4B" => 75, "\x4C" => 76, "\x4D" => 77, "\x4E" => 78, "\x4F" => 79, "\x50" => 80, "\x51" => 81, "\x52" => 82, "\x53" => 83, "\x54" => 84, "\x55" => 85, "\x56" => 86, "\x57" => 87, "\x58" => 88, "\x59" => 89, "\x5A" => 90, "\x5B" => 91, "\x5C" => 92, "\x5D" => 93, "\x5E" => 94, "\x5F" => 95, "\x60" => 96, "\x61" => 97, "\x62" => 98, "\x63" => 99, "\x64" => 100, "\x65" => 101, "\x66" => 102, "\x67" => 103, "\x68" => 104, "\x69" => 105, "\x6A" => 106, "\x6B" => 107, "\x6C" => 108, "\x6D" => 109, "\x6E" => 110, "\x6F" => 111, "\x70" => 112, "\x71" => 113, "\x72" => 114, "\x73" => 115, "\x74" => 116, "\x75" => 117, "\x76" => 118, "\x77" => 119, "\x78" => 120, "\x79" => 121, "\x7A" => 122, "\x7B" => 123, "\x7C" => 124, "\x7D" => 125, "\x7E" => 126, "\x7F" => 127, "\x80" => 128, "\x81" => 129, "\x82" => 130, "\x83" => 131, "\x84" => 132, "\x85" => 133, "\x86" => 134, "\x87" => 135, "\x88" => 136, "\x89" => 137, "\x8A" => 138, "\x8B" => 139, "\x8C" => 140, "\x8D" => 141, "\x8E" => 142, "\x8F" => 143, "\x90" => 144, "\x91" => 145, "\x92" => 146, "\x93" => 147, "\x94" => 148, "\x95" => 149, "\x96" => 150, "\x97" => 151, "\x98" => 152, "\x99" => 153, "\x9A" => 154, "\x9B" => 155, "\x9C" => 156, "\x9D" => 157, "\x9E" => 158, "\x9F" => 159, "\xA0" => 160, "\xA1" => 161, "\xA2" => 162, "\xA3" => 163, "\xA4" => 164, "\xA5" => 165, "\xA6" => 166, "\xA7" => 167, "\xA8" => 168, "\xA9" => 169, "\xAA" => 170, "\xAB" => 171, "\xAC" => 172, "\xAD" => 173, "\xAE" => 174, "\xAF" => 175, "\xB0" => 176, "\xB1" => 177, "\xB2" => 178, "\xB3" => 179, "\xB4" => 180, "\xB5" => 181, "\xB6" => 182, "\xB7" => 183, "\xB8" => 184, "\xB9" => 185, "\xBA" => 186, "\xBB" => 187, "\xBC" => 188, "\xBD" => 189, "\xBE" => 190, "\xBF" => 191, "\xC0" => 192, "\xC1" => 193, "\xC2" => 194, "\xC3" => 195, "\xC4" => 196, "\xC5" => 197, "\xC6" => 198, "\xC7" => 199, "\xC8" => 200, "\xC9" => 201, "\xCA" => 202, "\xCB" => 203, "\xCC" => 204, "\xCD" => 205, "\xCE" => 206, "\xCF" => 207, "\xD0" => 208, "\xD1" => 209, "\xD2" => 210, "\xD3" => 211, "\xD4" => 212, "\xD5" => 213, "\xD6" => 214, "\xD7" => 215, "\xD8" => 216, "\xD9" => 217, "\xDA" => 218, "\xDB" => 219, "\xDC" => 220, "\xDD" => 221, "\xDE" => 222, "\xDF" => 223, "\xE0" => 224, "\xE1" => 225, "\xE2" => 226, "\xE3" => 227, "\xE4" => 228, "\xE5" => 229, "\xE6" => 230, "\xE7" => 231, "\xE8" => 232, "\xE9" => 233, "\xEA" => 234, "\xEB" => 235, "\xEC" => 236, "\xED" => 237, "\xEE" => 238, "\xEF" => 239, "\xF0" => 240, "\xF1" => 241, "\xF2" => 242, "\xF3" => 243, "\xF4" => 244, "\xF5" => 245, "\xF6" => 246, "\xF7" => 247, "\xF8" => 248, "\xF9" => 249, "\xFA" => 250, "\xFB" => 251, "\xFC" => 252, "\xFD" => 253, "\xFE" => 254, "\xFF" => 255]; diff --git a/plugins/vendor/voku/portable-ascii/src/voku/helper/data/x000.php b/plugins/vendor/voku/portable-ascii/src/voku/helper/data/x000.php deleted file mode 100644 index 6c9d81f9..00000000 --- a/plugins/vendor/voku/portable-ascii/src/voku/helper/data/x000.php +++ /dev/null @@ -1,16 +0,0 @@ -', '?', '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[', '\\', ']', '^', '_', '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~', '', 'EUR', // "\xc2\x80" => "\xe2\x82\xac" => EURO SIGN - '', ',', 'f', ',,', // "\xc2\x84" => "\xe2\x80\x9e" => DOUBLE LOW-9 QUOTATION MARK - '...', // "\xc2\x85" => "\xe2\x80\xa6" => HORIZONTAL ELLIPSIS - '+', '++', // "\xc2\x87" => "\xe2\x80\xa1" => DOUBLE DAGGER - '^', '%0', // "\xc2\x89" => "\xe2\x80\xb0" => PER MILLE SIGN - 'S', '<', 'OE', // "\xc2\x8c" => "\xc5\x92" => LATIN CAPITAL LIGATURE OE - '', 'Z', '', '', '\'', // "\xc2\x91" => "\xe2\x80\x98" => LEFT SINGLE QUOTATION MARK - '\'', // "\xc2\x92" => "\xe2\x80\x99" => RIGHT SINGLE QUOTATION MARK - '"', '"', '*', '-', '--', // "\xc2\x97" => "\xe2\x80\x94" => EM DASH - '~', 'tm', 's', '>', 'oe', '', 'z', 'Y', ' ', '!', 'C/', 'PS', '$?', 'Y=', '|', 'SS', '"', '(c)', 'a', '<<', '!', '', '(r)', '-', 'deg', '+-', '2', '3', '\'', 'u', 'P', '*', ',', '1', 'o', '>>', '1/4', '1/2', '3/4', '?', 'A', 'A', 'A', 'A', // Not "AE" - used in languages other than German - 'A', 'A', 'AE', 'C', 'E', 'E', 'E', 'E', 'I', 'I', 'I', 'I', 'D', 'N', 'O', 'O', 'O', 'O', // Not "OE" - used in languages other than German - 'O', 'x', 'O', 'U', 'U', 'U', // Not "UE" - used in languages other than German - 'U', 'Y', 'Th', 'ss', 'a', 'a', 'a', 'a', // Not "ae" - used in languages other than German - 'a', 'a', 'ae', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i', 'd', 'n', 'o', 'o', 'o', 'o', // Not "oe" - used in languages other than German - 'o', '/', 'o', 'u', 'u', 'u', // Not "ue" - used in languages other than German - 'u', 'y', 'th', 'y', ]; diff --git a/plugins/vendor/voku/portable-ascii/src/voku/helper/data/x001.php b/plugins/vendor/voku/portable-ascii/src/voku/helper/data/x001.php deleted file mode 100644 index 87fb12fb..00000000 --- a/plugins/vendor/voku/portable-ascii/src/voku/helper/data/x001.php +++ /dev/null @@ -1 +0,0 @@ -', '^', 'V', '^', 'V', '\'', '-', '/', '\\', ',', '_', '\\', '/', ':', '.', '`', '\'', '^', 'V', '+', '-', 'V', '.', '@', ',', '~', '"', 'R', 'X', 'G', 'l', 's', 'x', '?', '', '', '', '', '', '', '', 'V', '=', '"', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]']; diff --git a/plugins/vendor/voku/portable-ascii/src/voku/helper/data/x003.php b/plugins/vendor/voku/portable-ascii/src/voku/helper/data/x003.php deleted file mode 100644 index 3d02b86e..00000000 --- a/plugins/vendor/voku/portable-ascii/src/voku/helper/data/x003.php +++ /dev/null @@ -1 +0,0 @@ -', '[?]', '[?]', '[?]', 'f', 'v', 'u', 'yr', 'y', 'w', 'th', 'th', 'a', 'o', 'ac', 'ae', 'o', 'o', 'o', 'oe', 'on', 'r', 'k', 'c', 'k', 'g', 'ng', 'g', 'g', 'w', 'h', 'h', 'h', 'h', 'n', 'n', 'n', 'i', 'e', 'j', 'g', 'ae', 'a', 'eo', 'p', 'z', 's', 's', 's', 'c', 'z', 't', 't', 'd', 'b', 'b', 'p', 'p', 'e', 'm', 'm', 'm', 'l', 'l', 'ng', 'ng', 'd', 'o', 'ear', 'ior', 'qu', 'qu', 'qu', 's', 'yr', 'yr', 'yr', 'q', 'x', '.', ':', '+', '17', '18', '19', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]']; diff --git a/plugins/vendor/voku/portable-ascii/src/voku/helper/data/x017.php b/plugins/vendor/voku/portable-ascii/src/voku/helper/data/x017.php deleted file mode 100644 index 8f2a7cac..00000000 --- a/plugins/vendor/voku/portable-ascii/src/voku/helper/data/x017.php +++ /dev/null @@ -1 +0,0 @@ -', '.', '..', '...', '.', "\n", - "\n\n", - '', '', '', '', '', ' ', '%0', '%00', '\'', '\'\'', '\'\'\'', '`', '``', '```', '^', '<', '>', '*', '!!', '!?', '-', '_', '-', '^', '***', '--', '/', '-[', ']-', '??', '?!', '!?', '7', 'PP', '(]', '[)', '*', '[?]', '[?]', '[?]', '%', '~', '[?]', '[?]', '[?]', "''''", // 0x57 - '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', ' ', '', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '', '', '', '', '', '', '0', 'i', '', '', '4', '5', '6', '7', '8', '9', '+', '-', '=', '(', ')', 'n', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '-', '=', '(', ')', '[?]', 'a', 'e', 'o', 'x', '[?]', 'h', 'k', 'l', 'm', 'n', 'p', 's', 't', '[?]', '[?]', '[?]', 'ECU', 'CL', 'Cr', 'Fr.', 'L.', 'mil', 'N', 'Pts', 'Rs', 'W', 'NS', 'D', 'EUR', 'K', 'T', 'Dr', 'Pf', 'P', 'G', 'A', 'UAH', 'C|', 'L', 'Sm', 'T', 'Rs', 'L', 'M', 'm', 'R', 'l', 'BTC', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '[?]', '', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', ]; diff --git a/plugins/vendor/voku/portable-ascii/src/voku/helper/data/x021.php b/plugins/vendor/voku/portable-ascii/src/voku/helper/data/x021.php deleted file mode 100644 index 1643d67d..00000000 --- a/plugins/vendor/voku/portable-ascii/src/voku/helper/data/x021.php +++ /dev/null @@ -1 +0,0 @@ -=', '<=', '>=', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]']; diff --git a/plugins/vendor/voku/portable-ascii/src/voku/helper/data/x023.php b/plugins/vendor/voku/portable-ascii/src/voku/helper/data/x023.php deleted file mode 100644 index b8f4ca0d..00000000 --- a/plugins/vendor/voku/portable-ascii/src/voku/helper/data/x023.php +++ /dev/null @@ -1 +0,0 @@ - ', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]']; diff --git a/plugins/vendor/voku/portable-ascii/src/voku/helper/data/x024.php b/plugins/vendor/voku/portable-ascii/src/voku/helper/data/x024.php deleted file mode 100644 index 26abcc69..00000000 --- a/plugins/vendor/voku/portable-ascii/src/voku/helper/data/x024.php +++ /dev/null @@ -1 +0,0 @@ -', '>', '>', '>', '>', '>', 'V', 'V', 'V', 'V', '<', '<', '<', '<', '<', '<', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '#', '#', '#', '#', '#', '^', '^', '^', 'O', '#', '#', '#', '#', 'O', 'O', 'O', 'O', '/', '\\\\', '\\\\', '#', '#', '#', '#', '/']; diff --git a/plugins/vendor/voku/portable-ascii/src/voku/helper/data/x026.php b/plugins/vendor/voku/portable-ascii/src/voku/helper/data/x026.php deleted file mode 100644 index 0c97de3f..00000000 --- a/plugins/vendor/voku/portable-ascii/src/voku/helper/data/x026.php +++ /dev/null @@ -1 +0,0 @@ - ', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]']; diff --git a/plugins/vendor/voku/portable-ascii/src/voku/helper/data/x028.php b/plugins/vendor/voku/portable-ascii/src/voku/helper/data/x028.php deleted file mode 100644 index 9585d914..00000000 --- a/plugins/vendor/voku/portable-ascii/src/voku/helper/data/x028.php +++ /dev/null @@ -1 +0,0 @@ -', 'n', 't', 'q', ',', '*', '5', '<', '-', 'u', '8', 'v', '.', '%', '[', '$', '+', 'x', '!', '&', ';', ':', '4', '\\', '0', 'z', '7', '(', '_', '?', 'w', ']', '#', 'y', ')', '=', '[d7]', '[d17]', '[d27]', '[d127]', '[d37]', '[d137]', '[d237]', '[d1237]', '[d47]', '[d147]', '[d247]', '[d1247]', '[d347]', '[d1347]', '[d2347]', '[d12347]', '[d57]', '[d157]', '[d257]', '[d1257]', '[d357]', '[d1357]', '[d2357]', '[d12357]', '[d457]', '[d1457]', '[d2457]', '[d12457]', '[d3457]', '[d13457]', '[d23457]', '[d123457]', '[d67]', '[d167]', '[d267]', '[d1267]', '[d367]', '[d1367]', '[d2367]', '[d12367]', '[d467]', '[d1467]', '[d2467]', '[d12467]', '[d3467]', '[d13467]', '[d23467]', '[d123467]', '[d567]', '[d1567]', '[d2567]', '[d12567]', '[d3567]', '[d13567]', '[d23567]', '[d123567]', '[d4567]', '[d14567]', '[d24567]', '[d124567]', '[d34567]', '[d134567]', '[d234567]', '[d1234567]', '[d8]', '[d18]', '[d28]', '[d128]', '[d38]', '[d138]', '[d238]', '[d1238]', '[d48]', '[d148]', '[d248]', '[d1248]', '[d348]', '[d1348]', '[d2348]', '[d12348]', '[d58]', '[d158]', '[d258]', '[d1258]', '[d358]', '[d1358]', '[d2358]', '[d12358]', '[d458]', '[d1458]', '[d2458]', '[d12458]', '[d3458]', '[d13458]', '[d23458]', '[d123458]', '[d68]', '[d168]', '[d268]', '[d1268]', '[d368]', '[d1368]', '[d2368]', '[d12368]', '[d468]', '[d1468]', '[d2468]', '[d12468]', '[d3468]', '[d13468]', '[d23468]', '[d123468]', '[d568]', '[d1568]', '[d2568]', '[d12568]', '[d3568]', '[d13568]', '[d23568]', '[d123568]', '[d4568]', '[d14568]', '[d24568]', '[d124568]', '[d34568]', '[d134568]', '[d234568]', '[d1234568]', '[d78]', '[d178]', '[d278]', '[d1278]', '[d378]', '[d1378]', '[d2378]', '[d12378]', '[d478]', '[d1478]', '[d2478]', '[d12478]', '[d3478]', '[d13478]', '[d23478]', '[d123478]', '[d578]', '[d1578]', '[d2578]', '[d12578]', '[d3578]', '[d13578]', '[d23578]', '[d123578]', '[d4578]', '[d14578]', '[d24578]', '[d124578]', '[d34578]', '[d134578]', '[d234578]', '[d1234578]', '[d678]', '[d1678]', '[d2678]', '[d12678]', '[d3678]', '[d13678]', '[d23678]', '[d123678]', '[d4678]', '[d14678]', '[d24678]', '[d124678]', '[d34678]', '[d134678]', '[d234678]', '[d1234678]', '[d5678]', '[d15678]', '[d25678]', '[d125678]', '[d35678]', '[d135678]', '[d235678]', '[d1235678]', '[d45678]', '[d145678]', '[d245678]', '[d1245678]', '[d345678]', '[d1345678]', '[d2345678]', '[d12345678]']; diff --git a/plugins/vendor/voku/portable-ascii/src/voku/helper/data/x029.php b/plugins/vendor/voku/portable-ascii/src/voku/helper/data/x029.php deleted file mode 100644 index 5162de38..00000000 --- a/plugins/vendor/voku/portable-ascii/src/voku/helper/data/x029.php +++ /dev/null @@ -1 +0,0 @@ -', '%', '[?]', '[?]', '>', '=', '[?]', '/', '-', '~', '\\', '/', '~', '~', '|-', '-|', '[?]', '[?]', '[?]', '[?]', '<=', '=>', '((', '))', '[?]', '[?]', '::', '[?]', '?', '\'', 'o', '.', ',', '.', ',', ';', '[?]', '[?]', '[?]', '[?]', '----', '------', 'x', '|', '[?]', '[?]', '=', ',', '"', '`--', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?]', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]']; diff --git a/plugins/vendor/voku/portable-ascii/src/voku/helper/data/x02f.php b/plugins/vendor/voku/portable-ascii/src/voku/helper/data/x02f.php deleted file mode 100644 index 5147b574..00000000 --- a/plugins/vendor/voku/portable-ascii/src/voku/helper/data/x02f.php +++ /dev/null @@ -1 +0,0 @@ - ', '<<', '>> ', '[', '] ', '{', '} ', '[(', ')] ', '@', 'X ', '[', '] ', '[[', ']] ', '((', ')) ', '[[', ']] ', '~ ', '``', '\'\'', ',,', '@', '1', '2', '3', '4', '5', '6', '7', '8', '9', '', '', '', '', '', '', '~', '+', '+', '+', '+', '', '@', ' // ', '+10+', '+20+', '+30+', '[?]', '[?]', '[?]', '', '', '[?]', 'a', 'a', 'i', 'i', 'u', 'u', 'e', 'e', 'o', 'o', 'ka', 'ga', 'ki', 'gi', 'ku', 'gu', 'ke', 'ge', 'ko', 'go', 'sa', 'za', 'shi', // 0x57 - 'zi', 'su', 'zu', 'se', 'ze', 'so', 'zo', 'ta', 'da', 'chi', // 0x61 - 'di', 'tsu', // 0x63 - 'tsu', // 0x64 - 'du', 'te', 'de', 'to', 'do', 'na', 'ni', 'nu', 'ne', 'no', 'ha', 'ba', 'pa', 'hi', 'bi', 'pi', 'hu', 'bu', 'pu', 'he', 'be', 'pe', 'ho', 'bo', 'po', 'ma', 'mi', 'mu', 'me', 'mo', 'ya', 'ya', 'yu', 'yu', 'yo', 'yo', 'ra', 'ri', 'ru', 're', 'ro', 'wa', 'wa', 'wi', 'we', 'wo', 'n', 'vu', '[?]', '[?]', '[?]', '[?]', '', '', '', '', '"', '"', '[?]', '[?]', 'a', 'a', 'i', 'i', 'u', 'u', 'e', 'e', 'o', 'o', 'ka', 'ga', 'ki', 'gi', 'ku', 'gu', 'ke', 'ge', 'ko', 'go', 'sa', 'za', 'shi', // 0xb7 - 'zi', 'su', 'zu', 'se', 'ze', 'so', 'zo', 'ta', 'da', 'chi', // 0xc1 - 'di', 'tsu', // 0xc3 - 'tsu', // 0xc4 - 'du', 'te', 'de', 'to', 'do', 'na', 'ni', 'nu', 'ne', 'no', 'ha', 'ba', 'pa', 'hi', 'bi', 'pi', 'hu', 'bu', 'pu', 'he', 'be', 'pe', 'ho', 'bo', 'po', 'ma', 'mi', 'mu', 'me', 'mo', 'ya', 'ya', 'yu', 'yu', 'yo', 'yo', 'ra', 'ri', 'ru', 're', 'ro', 'wa', 'wa', 'wi', 'we', 'wo', 'n', 'vu', 'ka', 'ke', 'va', 'vi', 've', 'vo', '', '', '"', '"', ]; diff --git a/plugins/vendor/voku/portable-ascii/src/voku/helper/data/x031.php b/plugins/vendor/voku/portable-ascii/src/voku/helper/data/x031.php deleted file mode 100644 index 72c0260c..00000000 --- a/plugins/vendor/voku/portable-ascii/src/voku/helper/data/x031.php +++ /dev/null @@ -1 +0,0 @@ ->', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '33', '34', '35', '(g)', '(n)', '(d)', '(r)', '(m)', '(b)', '(s)', '()', '(j)', '(c)', '(k)', '(t)', '(p)', '(h)', '(ga)', '(na)', '(da)', '(ra)', '(ma)', '(ba)', '(sa)', '(a)', '(ja)', '(ca)', '(ka)', '(ta)', '(pa)', '(ha)', '[?]', '[?]', '[?]', 'KIS ', '(1) ', '(2) ', '(3) ', '(4) ', '(5) ', '(6) ', '(7) ', '(8) ', '(9) ', '(10) ', '(Yue) ', '(Huo) ', '(Shui) ', '(Mu) ', '(Jin) ', '(Tu) ', '(Ri) ', '(Zhu) ', '(You) ', '(She) ', '(Ming) ', '(Te) ', '(Cai) ', '(Zhu) ', '(Lao) ', '(Mi) ', '(Nan) ', '(Nu) ', '(Shi) ', '(You) ', '(Yin) ', '(Zhu) ', '(Xiang) ', '(Xiu) ', '(Xie) ', '(Zheng) ', '(Shang) ', '(Zhong) ', '(Xia) ', '(Zuo) ', '(You) ', '(Yi) ', '(Zong) ', '(Xue) ', '(Jian) ', '(Qi) ', '(Zi) ', '(Xie) ', '(Ye) ', '36', '37', '38', '39', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '50', '1M', '2M', '3M', '4M', '5M', '6M', '7M', '8M', '9M', '10M', '11M', '12M', 'Hg', 'erg', 'eV', 'LTD', 'a', 'i', 'u', 'u', 'o', 'ka', 'ki', 'ku', 'ke', 'ko', 'sa', 'si', 'su', 'se', 'so', 'ta', 'ti', 'tu', 'te', 'to', 'na', 'ni', 'nu', 'ne', 'no', 'ha', 'hi', 'hu', 'he', 'ho', 'ma', 'mi', 'mu', 'me', 'mo', 'ya', 'yu', 'yo', 'ra', 'ri', 'ru', 're', 'ro', 'wa', 'wi', 'we', 'wo']; diff --git a/plugins/vendor/voku/portable-ascii/src/voku/helper/data/x033.php b/plugins/vendor/voku/portable-ascii/src/voku/helper/data/x033.php deleted file mode 100644 index 8505337e..00000000 --- a/plugins/vendor/voku/portable-ascii/src/voku/helper/data/x033.php +++ /dev/null @@ -1 +0,0 @@ -> ', '<', '> ', '[', '] ', '{', '}', '[?]', '[?]', '[?]', '[?]', '', '', '', '', '', '', '', ',', ',', '.', '', ';', ':', '?', '!', '-', '(', ')', '{', '}', '{', '}', '#', '&', '*', '+', '-', '<', '>', '=', '', '\\', '$', '%', '@', '[?]', '[?]', '[?]', '[?]', '', '', '', '[?]', '', '[?]', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '[?]', '[?]', '']; diff --git a/plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0ff.php b/plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0ff.php deleted file mode 100644 index b3a15398..00000000 --- a/plugins/vendor/voku/portable-ascii/src/voku/helper/data/x0ff.php +++ /dev/null @@ -1 +0,0 @@ -', '?', '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[', '\\', ']', '^', '_', '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~', '[?]', '[?]', '.', '[', ']', ',', '*', 'wo', 'a', 'i', 'u', 'e', 'o', 'ya', 'yu', 'yo', 'tu', '+', 'a', 'i', 'u', 'e', 'o', 'ka', 'ki', 'ku', 'ke', 'ko', 'sa', 'si', 'su', 'se', 'so', 'ta', 'ti', 'tu', 'te', 'to', 'na', 'ni', 'nu', 'ne', 'no', 'ha', 'hi', 'hu', 'he', 'ho', 'ma', 'mi', 'mu', 'me', 'mo', 'ya', 'yu', 'yo', 'ra', 'ri', 'ru', 're', 'ro', 'wa', 'n', ':', ';', '', 'g', 'gg', 'gs', 'n', 'nj', 'nh', 'd', 'dd', 'r', 'lg', 'lm', 'lb', 'ls', 'lt', 'lp', 'rh', 'm', 'b', 'bb', 'bs', 's', 'ss', '', 'j', 'jj', 'c', 'k', 't', 'p', 'h', '[?]', '[?]', '[?]', 'a', 'ae', 'ya', 'yae', 'eo', 'e', '[?]', '[?]', 'yeo', 'ye', 'o', 'wa', 'wae', 'oe', '[?]', '[?]', 'yo', 'u', 'weo', 'we', 'wi', 'yu', '[?]', '[?]', 'eu', 'yi', 'i', '[?]', '[?]', '[?]', '/C', 'PS', '!', '-', '|', 'Y=', 'W=', '[?]', '|', '-', '|', '-', '|', '#', 'O', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '{', '|', '}', '', '', '', '']; diff --git a/plugins/vendor/voku/portable-ascii/src/voku/helper/data/x1d4.php b/plugins/vendor/voku/portable-ascii/src/voku/helper/data/x1d4.php deleted file mode 100644 index ad8d3b25..00000000 --- a/plugins/vendor/voku/portable-ascii/src/voku/helper/data/x1d4.php +++ /dev/null @@ -1 +0,0 @@ - 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 52 => 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 78 => 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 104 => 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 130 => 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 156 => 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 181 => 'Z', 182 => 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 208 => 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 234 => 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']; diff --git a/plugins/vendor/voku/portable-ascii/src/voku/helper/data/x1d5.php b/plugins/vendor/voku/portable-ascii/src/voku/helper/data/x1d5.php deleted file mode 100644 index a2a9b908..00000000 --- a/plugins/vendor/voku/portable-ascii/src/voku/helper/data/x1d5.php +++ /dev/null @@ -1,4 +0,0 @@ - 'w', 'x', 'y', 'z', 4 => 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 30 => 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 56 => 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 82 => 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 108 => 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 134 => 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 160 => 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 186 => 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 212 => 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 238 => 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', ]; diff --git a/plugins/vendor/voku/portable-ascii/src/voku/helper/data/x1d6.php b/plugins/vendor/voku/portable-ascii/src/voku/helper/data/x1d6.php deleted file mode 100644 index 315ef5e4..00000000 --- a/plugins/vendor/voku/portable-ascii/src/voku/helper/data/x1d6.php +++ /dev/null @@ -1 +0,0 @@ - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 80 => 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 112 => 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 230 => 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', ]; diff --git a/plugins/vendor/webklex/php-imap/.github/FUNDING.yml b/plugins/vendor/webklex/php-imap/.github/FUNDING.yml deleted file mode 100644 index c49bc6e3..00000000 --- a/plugins/vendor/webklex/php-imap/.github/FUNDING.yml +++ /dev/null @@ -1,2 +0,0 @@ -ko_fi: webklex -custom: ['https://www.buymeacoffee.com/webklex'] diff --git a/plugins/vendor/webklex/php-imap/.github/ISSUE_TEMPLATE/bug_report.md b/plugins/vendor/webklex/php-imap/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index a0571c33..00000000 --- a/plugins/vendor/webklex/php-imap/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -name: Bug report -about: Create a report to help us improve - ---- - -**Describe the bug** -A clear and concise description of what the bug is. - -**Used config** -Please provide the used config, if you are not using the package default config. - -**Code to Reproduce** -The troubling code section which produces the reported bug. -```php -echo "Bug"; -``` - -**Expected behavior** -A clear and concise description of what you expected to happen. - -**Screenshots** -If applicable, add screenshots to help explain your problem. - -**Desktop / Server (please complete the following information):** -- OS: [e.g. Debian 10] -- PHP: [e.g. 5.5.9] -- Version [e.g. v2.3.1] -- Provider [e.g. Gmail, Outlook, Dovecot] - -**Additional context** -Add any other context about the problem here. diff --git a/plugins/vendor/webklex/php-imap/.github/ISSUE_TEMPLATE/feature_request.md b/plugins/vendor/webklex/php-imap/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index 066b2d92..00000000 --- a/plugins/vendor/webklex/php-imap/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for this project - ---- - -**Is your feature request related to a problem? Please describe.** -A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] - -**Describe the solution you'd like** -A clear and concise description of what you want to happen. - -**Describe alternatives you've considered** -A clear and concise description of any alternative solutions or features you've considered. - -**Additional context** -Add any other context or screenshots about the feature request here. diff --git a/plugins/vendor/webklex/php-imap/.github/ISSUE_TEMPLATE/general-help-request.md b/plugins/vendor/webklex/php-imap/.github/ISSUE_TEMPLATE/general-help-request.md deleted file mode 100644 index 49809d14..00000000 --- a/plugins/vendor/webklex/php-imap/.github/ISSUE_TEMPLATE/general-help-request.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -name: General help request -about: Feel free to ask about any project related stuff - ---- - -Please be aware that these issues will be closed if inactive for more then 14 days. - -Also make sure to use https://github.com/Webklex/php-imap/issues/new?template=bug_report.md if you want to report a bug -or https://github.com/Webklex/php-imap/issues/new?template=feature_request.md if you want to suggest a feature. - -Still here? Well clean this out and go ahead :) diff --git a/plugins/vendor/webklex/php-imap/.github/docker/Dockerfile b/plugins/vendor/webklex/php-imap/.github/docker/Dockerfile deleted file mode 100644 index ff0f11e6..00000000 --- a/plugins/vendor/webklex/php-imap/.github/docker/Dockerfile +++ /dev/null @@ -1,23 +0,0 @@ -FROM ubuntu:latest -LABEL maintainer="Webklex " - -RUN apt-get update -RUN apt-get upgrade -y -RUN apt-get install -y sudo dovecot-imapd - -ENV LIVE_MAILBOX=true -ENV LIVE_MAILBOX_HOST=mail.example.local -ENV LIVE_MAILBOX_PORT=993 -ENV LIVE_MAILBOX_ENCRYPTION=ssl -ENV LIVE_MAILBOX_VALIDATE_CERT=true -ENV LIVE_MAILBOX_USERNAME=root@example.local -ENV LIVE_MAILBOX_PASSWORD=foobar -ENV LIVE_MAILBOX_QUOTA_SUPPORT=true - -EXPOSE 993 - -ADD dovecot_setup.sh /root/dovecot_setup.sh -RUN chmod +x /root/dovecot_setup.sh - -CMD ["/bin/bash", "-c", "/root/dovecot_setup.sh && tail -f /dev/null"] - diff --git a/plugins/vendor/webklex/php-imap/.github/docker/dovecot_setup.sh b/plugins/vendor/webklex/php-imap/.github/docker/dovecot_setup.sh deleted file mode 100644 index 25a51928..00000000 --- a/plugins/vendor/webklex/php-imap/.github/docker/dovecot_setup.sh +++ /dev/null @@ -1,63 +0,0 @@ -#!/bin/sh - -set -ex - -sudo apt-get -q update -sudo apt-get -q -y install dovecot-imapd - -{ - echo "127.0.0.1 $LIVE_MAILBOX_HOST" -} | sudo tee -a /etc/hosts - -SSL_CERT="/etc/ssl/certs/dovecot.crt" -SSL_KEY="/etc/ssl/private/dovecot.key" - -sudo openssl req -new -x509 -days 3 -nodes \ - -out "$SSL_CERT" \ - -keyout "$SSL_KEY" \ - -subj "/C=EU/ST=Europe/L=Home/O=Webklex/OU=Webklex DEV/CN=""$LIVE_MAILBOX_HOST" - -sudo chown root:dovecot "$SSL_CERT" "$SSL_KEY" -sudo chmod 0440 "$SSL_CERT" -sudo chmod 0400 "$SSL_KEY" - -DOVECOT_CONF="/etc/dovecot/local.conf" -MAIL_CONF="/etc/dovecot/conf.d/10-mail.conf" -IMAP_CONF="/etc/dovecot/conf.d/20-imap.conf" -QUOTA_CONF="/etc/dovecot/conf.d/90-quota.conf" -sudo touch "$DOVECOT_CONF" "$MAIL_CONF" "$IMAP_CONF" "$QUOTA_CONF" -sudo chown root:dovecot "$DOVECOT_CONF" "$MAIL_CONF" "$IMAP_CONF" "$QUOTA_CONF" -sudo chmod 0640 "$DOVECOT_CONF" "$MAIL_CONF" "$IMAP_CONF" "$QUOTA_CONF" - -{ - echo "ssl = required" - echo "disable_plaintext_auth = yes" - echo "ssl_cert = <""$SSL_CERT" - echo "ssl_key = <""$SSL_KEY" - echo "ssl_protocols = !SSLv2 !SSLv3" - echo "ssl_cipher_list = AES128+EECDH:AES128+EDH" -} | sudo tee -a "$DOVECOT_CONF" - -{ - echo "mail_plugins = \$mail_plugins quota" -} | sudo tee -a "$MAIL_CONF" - -{ - echo "protocol imap {" - echo " mail_plugins = \$mail_plugins imap_quota" - echo "}" -} | sudo tee -a "$IMAP_CONF" - -{ - echo "plugin {" - echo " quota = maildir:User quota" - echo " quota_rule = *:storage=1G" - echo "}" -} | sudo tee -a "$QUOTA_CONF" - -sudo useradd --create-home --shell /bin/false "$LIVE_MAILBOX_USERNAME" -echo "$LIVE_MAILBOX_USERNAME"":""$LIVE_MAILBOX_PASSWORD" | sudo chpasswd - -sudo service dovecot restart - -sudo doveadm auth test -x service=imap "$LIVE_MAILBOX_USERNAME" "$LIVE_MAILBOX_PASSWORD" \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/.github/workflows/tests.yaml b/plugins/vendor/webklex/php-imap/.github/workflows/tests.yaml deleted file mode 100644 index 682cbd51..00000000 --- a/plugins/vendor/webklex/php-imap/.github/workflows/tests.yaml +++ /dev/null @@ -1,50 +0,0 @@ -name: Tests - -on: - push: - pull_request: - schedule: - - cron: '0 0 * * *' - -permissions: - contents: read - -jobs: - phpunit: - runs-on: ubuntu-latest - - strategy: - fail-fast: true - matrix: - php: ['8.0', 8.1, 8.2, 8.3, 8.4] - - name: PHP ${{ matrix.php }} - - env: - LIVE_MAILBOX: true - LIVE_MAILBOX_DEBUG: true - LIVE_MAILBOX_HOST: mail.example.local - LIVE_MAILBOX_PORT: 993 - LIVE_MAILBOX_USERNAME: root@example.local - LIVE_MAILBOX_ENCRYPTION: ssl - LIVE_MAILBOX_PASSWORD: foobar - LIVE_MAILBOX_QUOTA_SUPPORT: true - - steps: - - name: Checkout code - uses: actions/checkout@v3 - - - name: Setup PHP - uses: shivammathur/setup-php@v2 - with: - php-version: ${{ matrix.php }} - extensions: openssl, json, mbstring, iconv, fileinfo, libxml, zip - coverage: none - - - name: Install Composer dependencies - run: composer install --prefer-dist --no-interaction --no-progress - - - run: "sh .github/docker/dovecot_setup.sh" - - - name: Execute tests - run: vendor/bin/phpunit \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/.gitignore b/plugins/vendor/webklex/php-imap/.gitignore deleted file mode 100644 index d1816ad9..00000000 --- a/plugins/vendor/webklex/php-imap/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -vendor -composer.lock -.idea -/build/ -test.php -.phpunit.result.cache -phpunit.xml \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/CHANGELOG.md b/plugins/vendor/webklex/php-imap/CHANGELOG.md deleted file mode 100755 index 97935023..00000000 --- a/plugins/vendor/webklex/php-imap/CHANGELOG.md +++ /dev/null @@ -1,964 +0,0 @@ -# Changelog - -All notable changes to `webklex/php-imap` will be documented in this file. - -Updates should follow the [Keep a CHANGELOG](http://keepachangelog.com/) principles. - -## [UNRELEASED] -### Fixed -- NaN - -### Added -- NaN - -### Breaking changes -- NaN - -## [6.2.0] - 2025-04-25 -### Fixed -- When using the chunk function, some messages do not have an element with index 0 #552 #553 (thanks @zeddmaster) -- Get folders list in hierarchical order #560 #561 (thanks @rskrzypczak) -- Fix remaining implicit marking of parameters as nullable (PHP 8.4) #566 (thanks @steffenweber) -- Fix case sensitivity of folder attribute parsing (\NoSelect, \NoInferiors) #469 #571 (thanks @smajti1) -- Fix error on getUid(null) with 0 results (#499) #573 (thanks @pierement) -- Fix Date parsing on non-standard format from Aqua Mail #574 #575 (thanks @lm-cmxkonzepte) - -### Added -- SSL stream context options added #238 #546 (thanks @llemoine) -- Support copy/move Message with utf7 folder path #559 (thanks @loc4l) -- Public `Query::search()` method #565 (Thanks @madbob) - -## [6.1.0] - 2025-01-19 -### Fixed -- Filename sanitization is now optional (enabled via default) -- Address parsing improved and extended to include more cases -- Boundary parsing fixed and improved to support more formats #544 -- Decode partially encoded address names #511 -- Enforce RFC822 parsing if enabled #462 - -### Added -- Security configuration options added -- Spoofing detection added #40 -- RFC4315 MOVE fallback added #123 (thanks @freescout-help-desk) -- Content fetching RFC standard support added #510 (thanks @ybizeul) -- Support unescaped dates inside the search conditions #542 -- `Client::clone()` looses account configuration #521 (thanks @netpok) - -## [6.0.0] - 2025-01-17 -### Fixed -- Fixed date issue if timezone is UT and a 2 digit year #429 (thanks @ferrisbuellers) -- Make the space optional after a comma separator #437 (thanks @marc0adam) -- Fix bug when multipart message getHTMLBody() method returns null #455 (thanks @michalkortas) -- Fix: Improve return type hints and return docblocks for query classes #470 (thanks @olliescase) -- Fix - Query - Chunked - Resolved infinite loop when start chunk > 1 #477 (thanks @NeekTheNook) -- Attachment with symbols in filename #436 (thanks @nuernbergerA) -- Ignore possible untagged lines after IDLE and DONE commands #445 (thanks @gazben) -- Fix Empty Child Folder Error #474 (thanks @bierpub) -- Filename sanitization improved #501 (thanks @neolip) -- `Client::getFolderPath()` return null if folder is not set #506 (thanks @arnolem) -- Fix implicit marking of parameters as nullable, deprecated in PHP 8.4 #518 (thanks @campbell-m) - -### Added -- IMAP STATUS command support added `Folder::status()` #424 (thanks @InterLinked1) -- Add attributes and special flags #428 (thanks @sazanof) -- Better connection check for IMAP #449 (thanks @thin-k-design) -- Config handling moved into a new class `Config::class` to allow class serialization (sponsored by elb-BIT GmbH) -- Support for Carbon 3 added #483 -- Custom decoder support added -- Decoding filename with non-standard encoding #535 (thanks @grnsv) - -### Breaking changes -- The decoder config has been moved from `options.decoder` to `decoding` and contains now the `decoder` class to used as well as their decoding fallbacks -- `Folder::getStatus()` no longer returns the results of `EXAMINE` but `STATUS` instead. If you want to use `EXAMINE` you can use the `Folder::examine()` method instead. -- `ClientManager::class` has now longer access to all configs. Config handling has been moved to its own class `Config::class`. If you want to access the config you can use the retriever method `::getConfig()` instead. Example: `$client->getConfig()` or `$message->getConfig()`, etc. -- `ClientManager::get` isn't available anymore. Use the regular config accessor instead. Example: `$cm->getConfig()->get($key)` -- `M̀essage::getConfig()` now returns the client configuration instead of the fetching options configuration. Please use `$message->getOptions()` instead. -- `Attachment::getConfig()` now returns the client configuration instead of the fetching options configuration. Please use `$attachment->getOptions()` instead. -- `Header::getConfig()` now returns the client configuration instead of the fetching options configuration. Please use `$header->getOptions()` instead. -- `M̀essage::setConfig` now expects the client configuration instead of the fetching options configuration. Please use `$message->setOptions` instead. -- `Attachment::setConfig` now expects the client configuration instead of the fetching options configuration. Please use `$attachment->setOptions` instead. -- `Header::setConfig` now expects the client configuration instead of the fetching options configuration. Please use `$header->setOptions` instead. -- All protocol constructors now require a `Config::class` instance -- The `Client::class` constructor now require a `Config::class` instance -- The `Part::class` constructor now require a `Config::class` instance -- The `Header::class` constructor now require a `Config::class` instance -- The `Message::fromFile` method now requires a `Config::class` instance -- The `Message::fromString` method now requires a `Config::class` instance -- The `Message::boot` method now requires a `Config::class` instance -- The `Message::decode` method has been removed. Use `Message::getDecoder()->decode($str)` instead. -- The `Message::getEncoding` method has been removed. Use `Message::getDecoder()->getEncoding($str)` instead. -- The `Message::convertEncoding` method has been removed. Use `Message::getDecoder()->convertEncoding()` instead. -- The `Header::decode` method has been removed. Use `Header::getDecoder()->decode($str)` instead. - -## [5.5.0] - 2023-06-28 -### Fixed -- Error token length mismatch in `ImapProtocol::readResponse` #400 -- Attachment name parsing fixed #410 #421 (thanks @nuernbergerA) -- Additional Attachment name fallback added to prevent missing attachments -- Attachment id is now static (based on the raw part content) instead of random -- Always parse the attachment description if it is available - -### Added -- Attachment content hash added - - -## [5.4.0] - 2023-06-24 -### Fixed -- Legacy protocol support fixed (object to array conversion) #411 -- Header value decoding improved #410 -- Protocol exception handling improved (bad response message added) #408 -- Prevent fetching singular rfc partials from running indefinitely #407 -- Subject with colon ";" is truncated #401 -- Catching and handling iconv decoding exception #397 - -### Added -- Additional timestamp formats added #198 #392 (thanks @esk-ap) - - -## [5.3.0] - Security patch - 2023-06-20 -### Fixed -- Potential RCE through path traversal fixed #414 (special thanks @angelej) - -### Security Impact and Mitigation -Impacted are all versions below v5.3.0. -If possible, update to >= v5.3.0 as soon as possible. Impacted was the `Attachment::save` -method which could be used to write files to the local filesystem. The path was not -properly sanitized and could be used to write files to arbitrary locations. - -However, the `Attachment::save` method is not used by default and has to be called -manually. If you are using this method without providing a sanitized path, you are -affected by this vulnerability. -If you are not using this method or are providing a sanitized path, you are not affected -by this vulnerability and no immediate action is required. - -If you have any questions, please feel welcome to join this issue: https://github.com/Webklex/php-imap/issues/416 -#### Timeline -- 17.06.23 21:30: Vulnerability reported -- 18.06.23 19:14: Vulnerability confirmed -- 19.06.23 18:41: Vulnerability fixed via PR #414 -- 20.06.23 13:45: Security patch released -- 21.06.23 20:48: CVE-2023-35169 got assigned -- 21.06.23 20:58: Advisory released https://github.com/Webklex/php-imap/security/advisories/GHSA-47p7-xfcc-4pv9 - - -## [5.2.0] - 2023-04-11 -### Fixed -- Use all available methods to detect the attachment extension instead of just one -- Allow the `LIST` command response to be empty #393 -- Initialize folder children attributes on class initialization - -### Added -- Soft fail option added to all folder fetching methods. If soft fail is enabled, the method will return an empty collection instead of throwing an exception if the folder doesn't exist - - -## [5.1.0] - 2023-03-16 -### Fixed -- IMAP Quota root command fixed -- Prevent line-breaks in folder path caused by special chars -- Partial fix for #362 (allow overview response to be empty) -- `Message::setConfig()` config parameter type set to array -- Reset the protocol uid cache if the session gets expunged -- Set the "seen" flag only if the flag isn't set and the fetch option isn't `IMAP::FT_PEEK` -- `Message::is()` date comparison fixed -- `Message::$client` could not be set to null -- `in_reply_to` and `references` parsing fixed -- Prevent message body parser from injecting empty lines -- Don't parse regular inline message parts without name or filename as attachment -- `Message::hasTextBody()` and `Message::hasHtmlBody()` should return `false` if the body is empty -- Imap-Protocol "empty response" detection extended to catch an empty response caused by a broken resource stream -- `iconv_mime_decode()` is now used with `ICONV_MIME_DECODE_CONTINUE_ON_ERROR` to prevent the decoding from failing -- Date decoding rules extended to support more date formats -- Unset the currently active folder if it gets deleted (prevent infinite loop) -- Attachment name and filename parsing fixed and improved to support more formats -- Check if the next uid is available (after copying or moving a message) before fetching it #381 -- Default pagination `$total` attribute value set to 0 #385 (thanks @hhniao) -- Use attachment ID as fallback filename for saving an attachment -- Address decoding error detection added #388 - -### Added -- Extended UTF-7 support added (RFC2060) #383 -- `Protocol::sizes()` support added (fetch the message byte size via RFC822.SIZE). Accessible through `Message::getSize()` #379 (thanks @didi1357) -- `Message::hasFlag()` method added to check if a message has a specific flag -- `Message::getConfig()` method added to get the current message configuration -- `Folder::select()` method added to select a folder -- `Message::getAvailableFlags()` method added to get all available flags -- Live mailbox and fixture tests added -- `Attribute::map()` method added to map all attribute values -- `Header::has()` method added to check if a header attribute / value exist -- All part attributes are now accessible via linked attribute -- Restore a message from string `Message::fromString()` - - -## [5.0.1] - 2023-03-01 -### Fixed -- More unique ID generation to prevent multiple attachments with same ID #363 (thanks @Guite) -- Not all attachments are pushed to the collection #372 (thanks @AdrianKuriata) -- Partial fix for #362 (allow search response to be empty) -- Unsafe usage of switch case. #354 #366 (thanks @shuergab) -- Fix use of ST_MSGN as sequence method #356 (thanks @gioid) -- Prevent infinite loop in ImapProtocol #316 (thanks @thin-k-design) - - -## [5.0.0] - 2023-01-18 -### Fixed -- The message uid and message number will only be fetched if accessed and wasn't previously set #326 #285 (thanks @szymekjanaczek) -- Fix undefined attachment name when headers use "filename*=" format #301 (thanks @JulienChavee) -- Fixed `ImapProtocol::logout` always throws 'not connected' Exception after upgraded to 4.1.2 #351 -- Protocol interface and methods unified -- Strict attribute and return types introduced where ever possible -- Parallel messages during idle #338 -- Idle timeout / stale resource stream issue fixed -- Syntax updated to support php 8 features -- Get the attachment file extension from the filename if no mimetype detection library is available -- Prevent the structure parsing from parsing an empty part -- Convert all header keys to their lower case representation -- Restructure the decode function #355 (thanks @istid) - -### Added -- Unit tests added #347 #242 (thanks @sergiy-petrov, @boekkooi-lengoo) -- `Client::clone()` method added to clone a client instance -- Save an entire message (including its headers) `Message::save()` -- Restore a message from a local or remote file `Message::fromFile()` -- Protocol resource stream accessor added `Protocol::getStream()` -- Protocol resource stream meta data accessor added `Protocol::meta()` -- ImapProtocol resource stream reset method added `ImapProtocol::reset()` -- Protocol `Response::class` introduced to handle and unify all protocol requests -- Static mask config accessor added `ClientManager::getMask()` added -- An `Attribute::class` instance can be treated as array -- Get the current client account configuration via `Client::getConfig()` -- Delete a folder via `Client::deleteFolder()` - -### Breaking changes -- PHP ^8.0.2 required -- `nesbot/carbon` version bumped to ^2.62.1 -- `phpunit/phpunit` version bumped to ^9.5.10 -- `Header::get()` always returns an `Attribute::class` instance -- `Attribute::class` accessor methods renamed to shorten their names and improve the readability -- All protocol methods that used to return `array|bool` will now always return a `Response::class` instance. -- `ResponseException::class` gets thrown if a response is empty or contains errors -- Message client is optional and can be null (e.g. if used in combination with `Message::fromFile()`) -- The message text or html body is now "" if its empty and not `null` - - -## [4.1.2] - 2022-12-14 -### Fixed -- Attachment ID can return an empty value #318 -- Additional message date format added #345 (thanks @amorebietakoUdala) - - -## [4.1.1] - 2022-11-16 -### Fixed -- Fix for extension recognition #325 (thanks @pwoszczyk) -- Missing null check added #327 (thanks @spanjeta) -- Leading white-space in response causes an infinite loop #321 (thanks @thin-k-design) -- Fix error when creating folders with special chars #319 (thanks @thin-k-design) -- `Client::getFoldersWithStatus()` recursive loading fixed #312 (thanks @szymekjanaczek) -- Fix Folder name encoding error in `Folder::appendMessage()` #306 #307 (thanks @rskrzypczak) - - -## [4.1.0] - 2022-10-18 -### Fixed -- Fix assumedNextTaggedLine bug #288 (thanks @Blear) -- Fix empty response error for blank lines #274 (thanks @bierpub) -- Fix empty body #233 (thanks @latypoff) -- Fix imap_reopen folder argument #234 (thanks @latypoff) - -### Added -- Added possibility of loading a Folder status #298 (thanks @szymekjanaczek) - - -## [4.0.2] - 2022-08-26 -### Fixed -- RFC 822 3.1.1. long header fields regular expression fixed #268 #269 (thanks @hbraehne) - - -## [4.0.1] - 2022-08-25 -### Fixed -- Type casting added to several ImapProtocol return values #261 -- Remove IMAP::OP_READONLY flag from imap_reopen if POP3 or NNTP protocol is selected #135 (thanks @xianzhe18) -- Several statements optimized and redundant checks removed -- Check if the Protocol supports the fetch method if extensions are present -- Detect `NONEXISTENT` errors while selecting or examining a folder #266 -- Missing type cast added to `PaginatedCollection::paginate` #267 (thanks @rogerb87) -- Fix multiline header unfolding #250 (thanks @sulgie-eitea) -- Fix problem with illegal offset error #226 (thanks @szymekjanaczek) -- Typos fixed - -### Affected Classes -- [Query::class](src/Query/Query.php) -- [ImapProtocol::class](src/Connection/Protocols/ImapProtocol.php) -- [LegacyProtocol::class](src/Connection/Protocols/LegacyProtocol.php) -- [PaginatedCollection::class](src/Support/PaginatedCollection.php) - - -## [4.0.0] - 2022-08-19 -### Fixed -- PHP dependency updated to support php v8.0 #212 #214 (thanks @freescout-helpdesk) -- Method return and argument types added -- Imap `DONE` method refactored -- UID cache loop fixed -- `HasEvent::getEvent` return value set to mixed to allow multiple event types -- Protocol line reader changed to `fread` (stream_context timeout issue fixed) -- Issue setting the client timeout fixed -- IMAP Connection debugging improved -- `Folder::idle()` method reworked and several issues fixed #170 #229 #237 #249 #258 -- Datetime conversion rules extended #189 #173 - -### Affected Classes -- [Client::class](src/Client.php) -- [Folder::class](src/Folder.php) -- [ImapProtocol::class](src/Connection/Protocols/ImapProtocol.php) -- [HasEvents::class](src/Traits/HasEvents.php) - -### Breaking changes -- No longer supports php >=5.5.9 but instead requires at least php v7.0.0. -- `HasEvent::getEvent` returns a mixed result. Either an `Event` or a class string representing the event class. -- The error message, if the connection fails to read the next line, is now `empty response` instead of `failed to read - connection closed?`. -- The `$auto_reconnect` used with `Folder::indle()` is deprecated and doesn't serve any purpose anymore. - - -## [3.2.0] - 2022-03-07 -### Fixed -- Fix attribute serialization #179 (thanks @netpok) -- Use real tls instead of starttls #180 (thanks @netpok) -- Allow to fully overwrite default config arrays #194 (thanks @laurent-rizer) -- Query::chunked does not loop over the last chunk #196 (thanks @laurent-rizer) -- Fix isAttachment that did not properly take in consideration dispositions options #195 (thanks @laurent-rizer) -- Extend date parsing error message #173 -- Fixed 'Where' method replaces the content with uppercase #148 -- Don't surround numeric search values with quotes -- Context added to `InvalidWhereQueryCriteriaException` -- Redundant `stream_set_timeout()` removed - -### Added -- UID Cache added #204 (thanks @HelloSebastian) -- Query::class extended with `getByUidLower`, `getByUidLowerOrEqual` , `getByUidGreaterOrEqual` , `getByUidGreater` to fetch certain ranges of uids #201 (thanks @HelloSebastian) -- Check if IDLE is supported if `Folder::idle()` is called #199 (thanks @HelloSebastian) -- Fallback date support added. The config option `options.fallback_date` is used as fallback date is it is set. Otherwise, an exception will be thrown #198 -- UID filter support added -- Make boundary regex configurable #169 #150 #126 #121 #111 #152 #108 (thanks @EthraZa) -- IMAP ID support added #174 -- Enable debug mode via config -- Custom UID alternative support added -- Fetch additional extensions using `Folder::query(["FEATURE_NAME"])` -- Optionally move a message during "deletion" instead of just "flagging" it #106 (thanks @EthraZa) -- `WhereQuery::where()` accepts now a wide range of criteria / values. #104 - -### Affected Classes -- [Part::class](src/Part.php) -- [Query::class](src/Query/Query.php) -- [Client::class](src/Client.php) -- [Header::class](src/Header.php) -- [Protocol::class](src/Connection/Protocols/Protocol.php) -- [ClientManager::class](src/ClientManager.php) - -### Breaking changes -- If you are using the legacy protocol to search, the results no longer return false if the search criteria could not be interpreted but instead return an empty array. This will ensure it is compatible to the rest of this library and no longer result in a potential type confusion. -- `Folder::idle` will throw an `Webklex\PHPIMAP\Exceptions\NotSupportedCapabilityException` exception if IMAP isn't supported by the mail server -- All protocol methods which had a `boolean` `$uid` option no longer support a boolean value. Use `IMAP::ST_UID` or `IMAP::NIL` instead. If you want to use an alternative to `UID` just use the string instead. -- Default config option `options.sequence` changed from `IMAP::ST_MSGN` to `IMAP::ST_UID`. -- `Folder::query()` no longer accepts a charset string. It has been replaced by an extension array, which provides the ability to automatically fetch additional features. - - -## [3.1.0-alpha] - 2022-02-03 -### Fixed -- Fix attribute serialization #179 (thanks @netpok) -- Use real tls instead of starttls #180 (thanks @netpok) -- Allow to fully overwrite default config arrays #194 (thanks @laurent-rizer) -- Query::chunked does not loop over the last chunk #196 (thanks @laurent-rizer) -- Fix isAttachment that did not properly take in consideration dispositions options #195 (thanks @laurent-rizer) - -### Affected Classes -- [Header::class](src/Header.php) -- [Protocol::class](src/Connection/Protocols/Protocol.php) -- [Query::class](src/Query/Query.php) -- [Part::class](src/Part.php) -- [ClientManager::class](src/ClientManager.php) - -## [3.0.0-alpha] - 2021-11-04 -### Fixed -- Extend date parsing error message #173 -- Fixed 'Where' method replaces the content with uppercase #148 -- Don't surround numeric search values with quotes -- Context added to `InvalidWhereQueryCriteriaException` -- Redundant `stream_set_timeout()` removed - -### Added -- Make boundary regex configurable #169 #150 #126 #121 #111 #152 #108 (thanks @EthraZa) -- IMAP ID support added #174 -- Enable debug mode via config -- Custom UID alternative support added -- Fetch additional extensions using `Folder::query(["FEATURE_NAME"])` -- Optionally move a message during "deletion" instead of just "flagging" it #106 (thanks @EthraZa) -- `WhereQuery::where()` accepts now a wide range of criteria / values. #104 - -### Affected Classes -- [Header::class](src/Header.php) -- [Protocol::class](src/Connection/Protocols/Protocol.php) -- [Query::class](src/Query/Query.php) -- [WhereQuery::class](src/Query/WhereQuery.php) -- [Message::class](src/Message.php) - -### Breaking changes -- All protocol methods which had a `boolean` `$uid` option no longer support a boolean. Use `IMAP::ST_UID` or `IMAP::NIL` instead. If you want to use an alternative to `UID` just use the string instead. -- Default config option `options.sequence` changed from `IMAP::ST_MSGN` to `IMAP::ST_UID`. -- `Folder::query()` no longer accepts a charset string. It has been replaced by an extension array, which provides the ability to automatically fetch additional features. - -## [2.7.2] - 2021-09-27 -### Fixed -- Fixed problem with skipping last line of the response. #166 (thanks @szymekjanaczek) - -## [2.7.1] - 2021-09-08 -### Added -- Added `UID` as available search criteria #161 (thanks @szymekjanaczek) - -## [2.7.0] - 2021-09-04 -### Fixed -- Fixes handling of long header lines which are seperated by `\r\n\t` (thanks @Oliver-Holz) -- Fixes to line parsing with multiple addresses (thanks @Oliver-Holz) - -### Added -- Expose message folder path #154 (thanks @Magiczne) -- Adds mailparse_rfc822_parse_addresses integration (thanks @Oliver-Holz) -- Added moveManyMessages method (thanks @Magiczne) -- Added copyManyMessages method (thanks @Magiczne) - -### Affected Classes -- [Header::class](src/Header.php) -- [Message::class](src/Message.php) - -## [2.6.0] - 2021-08-20 -### Fixed -- POP3 fixes #151 (thanks @Korko) - -### Added -- Added imap 4 handling. #146 (thanks @szymekjanaczek) -- Added laravel's conditionable methods. #147 (thanks @szymekjanaczek) - -### Affected Classes -- [Query::class](src/Query/Query.php) -- [Client::class](src/Client.php) - -## [2.5.1] - 2021-06-19 -### Fixed -- Fix setting default mask from config #133 (thanks @shacky) -- Chunked fetch fails in case of less available mails than page size #114 -- Protocol::createStream() exception information fixed #137 -- Legacy methods (headers, content, flags) fixed #125 -- Legacy connection cycle fixed #124 (thanks @zssarkany) - -### Added -- Disable rfc822 header parsing via config option #115 - -## [2.5.0] - 2021-02-01 -### Fixed -- Attachment saving filename fixed -- Unnecessary parameter removed from `Client::getTimeout()` -- Missing encryption variable added - could have caused problems with unencrypted communications -- Prefer attachment filename attribute over name attribute #82 -- Missing connection settings added to `Folder:idle()` auto mode #89 -- Message move / copy expect a folder path #79 -- `Client::getFolder()` updated to circumvent special edge cases #79 -- Missing connection status checks added to various methods -- Unused default attribute `message_no` removed from `Message::class` - -### Added -- Dynamic Attribute access support added (e.g `$message->from[0]`) -- Message not found exception added #93 -- Chunked fetching support added `Query::chunked()`. Just in case you can't fetch all messages at once -- "Soft fail" support added -- Count method added to `Attribute:class` -- Convert an Attribute instance into a Carbon date object #95 - -### Affected Classes -- [Attachment::class](src/Attachment.php) -- [Attribute::class](src/Attribute.php) -- [Query::class](src/Query/Query.php) -- [Message::class](src/Message.php) -- [Client::class](src/Client.php) -- [Folder::class](src/Folder.php) - -### Breaking changes -- A new exception can occur if a message can't be fetched (`\Webklex\PHPIMAP\Exceptions\MessageNotFoundException::class`) -- `Message::move()` and `Message::copy()` no longer accept folder names as folder path -- A `Message::class` instance might no longer have a `message_no` attribute - -## [2.4.4] - 2021-01-22 -### Fixed -- Boundary detection simplified #90 -- Prevent potential body overwriting #90 -- CSV files are no longer regarded as plain body -- Boundary detection overhauled to support "related" and "alternative" multipart messages #90 #91 - -### Affected Classes -- [Structure::class](src/Structure.php) -- [Message::class](src/Message.php) -- [Header::class](src/Header.php) -- [Part::class](src/Part.php) - -## [2.4.3] - 2021-01-21 -### Fixed -- Attachment detection updated #82 #90 -- Timeout handling improved -- Additional utf-8 checks added to prevent decoding of unencoded values #76 - -### Added -- Auto reconnect option added to `Folder::idle()` #89 - -### Affected Classes -- [Folder::class](src/Folder.php) -- [Part::class](src/Part.php) -- [Client::class](src/Client.php) -- [Header::class](src/Header.php) - -## [2.4.2] - 2021-01-09 -### Fixed -- Attachment::save() return error 'A facade root has not been set' #87 -- Unused dependencies removed -- Fix PHP 8 error that changes null back in to an empty string. #88 (thanks @mennovanhout) -- Fix regex to be case insensitive #88 (thanks @mennovanhout) - -### Affected Classes -- [Attachment::class](src/Attachment.php) -- [Address::class](src/Address.php) -- [Attribute::class](src/Attribute.php) -- [Structure::class](src/Structure.php) - -## [2.4.1] - 2021-01-06 -### Fixed -- Debug line position fixed -- Handle incomplete address to string conversion #83 -- Configured message key gets overwritten by the first fetched message #84 - -### Affected Classes -- [Address::class](src/Address.php) -- [Query::class](src/Query/Query.php) - -## [2.4.0] - 2021-01-03 -### Fixed -- Get partial overview when `IMAP::ST_UID` is set #74 -- Unnecessary "'" removed from address names -- Folder referral typo fixed -- Legacy protocol fixed -- Treat message collection keys always as strings - -### Added -- Configurable supported default flags added -- Message attribute class added to unify value handling -- Address class added and integrated -- Alias `Message::attachments()` for `Message::getAttachments()` added -- Alias `Message::addFlag()` for `Message::setFlag()` added -- Alias `Message::removeFlag()` for `Message::unsetFlag()` added -- Alias `Message::flags()` for `Message::getFlags()` added -- New Exception `MessageFlagException::class` added -- New method `Message::setSequenceId($id)` added -- Optional Header attributizion option added - -### Affected Classes -- [Folder::class](src/Folder.php) -- [Header::class](src/Header.php) -- [Message::class](src/Message.php) -- [Address::class](src/Address.php) -- [Query::class](src/Query/Query.php) -- [Attribute::class](src/Attribute.php) - -### Breaking changes -- Stringified message headers are now separated by ", " instead of " ". -- All message header values such as subject, message_id, from, to, etc now consists of an `Àttribute::class` instance (should behave the same way as before, but might cause some problem in certain edge cases) -- The formal address object "from", "to", etc now consists of an `Address::class` instance (should behave the same way as before, but might cause some problem in certain edge cases) -- When fetching or manipulating message flags a `MessageFlagException::class` exception can be thrown if a runtime error occurs -- Learn more about the new `Attribute` class here: [www.php-imap.com/api/attribute](https://www.php-imap.com/api/attribute) -- Learn more about the new `Address` class here: [www.php-imap.com/api/address](https://www.php-imap.com/api/address) -- Folder attribute "referal" is now called "referral" - -## [2.3.1] - 2020-12-30 -### Fixed -- Missing RFC attributes added -- Set the message sequence when idling -- Missing UID commands added #64 - -### Added -- Get a message by its message number -- Get a message by its uid #72 #66 #63 - -### Affected Classes -- [Message::class](src/Message.php) -- [Folder::class](src/Folder.php) -- [Query::class](src/Query/Query.php) - -## [2.3.0] - 2020-12-21 -### Fixed -- Cert validation issue fixed -- Allow boundaries ending with a space or semicolon (thanks [@smartilabs](https://github.com/smartilabs)) -- Ignore IMAP DONE command response #57 -- Default `options.fetch` set to `IMAP::FT_PEEK` -- Address parsing fixed #60 -- Alternative rfc822 header parsing fixed #60 -- Parse more than one Received: header #61 -- Fetch folder overview fixed -- `Message::getTextBody()` fallback value fixed - -### Added -- Proxy support added -- Flexible disposition support added #58 -- New `options.message_key` option `uid` added -- Protocol UID support added -- Flexible sequence type support added - -### Affected Classes -- [Structure::class](src/Structure.php) -- [Query::class](src/Query/Query.php) -- [Client::class](src/Client.php) -- [Header::class](src/Header.php) -- [Folder::class](src/Folder.php) -- [Part::class](src/Part.php) - -### Breaking changes -- Depending on your configuration, your certificates actually get checked. Which can cause an aborted connection if the certificate can not be validated. -- Messages don't get flagged as read unless you are using your own custom config. -- All `Header::class` attribute keys are now in a snake_format and no longer minus-separated. -- `Message::getTextBody()` no longer returns false if no text body is present. `null` is returned instead. - -## [2.2.5] - 2020-12-11 -### Fixed -- Missing array decoder method added #51 (thanks [@lutchin](https://github.com/lutchin)) -- Additional checks added to prevent message from getting marked as seen #33 -- Boundary parsing improved #39 #36 (thanks [@AntonioDiPassio-AppSys](https://github.com/AntonioDiPassio-AppSys)) -- Idle operation updated #44 - -### Added -- Force a folder to be opened - -### Affected Classes -- [Header::class](src/Header.php) -- [Folder::class](src/Folder.php) -- [Query::class](src/Query/Query.php) -- [Message::class](src/Message.php) -- [Structure::class](src/Structure.php) - -## [2.2.4] - 2020-12-08 -### Fixed -- Search performance increased by fetching all headers, bodies and flags at once #42 -- Legacy protocol support updated -- Fix Query pagination. (#52 [@mikemiller891](https://github.com/mikemiller891)) - -### Added -- Missing message setter methods added -- `Folder::overview()` method added to fetch all headers of all messages in the current folder - -### Affected Classes -- [Message::class](src/Message.php) -- [Folder::class](src/Folder.php) -- [Query::class](src/Query/Query.php) -- [PaginatedCollection::class](src/Support/PaginatedCollection.php) - -## [2.2.3] - 2020-11-02 -### Fixed -- Text/Html body fetched as attachment if subtype is null #34 -- Potential header overwriting through header extensions #35 -- Prevent empty attachments #37 - -### Added -- Set fetch order during query #41 [@Max13](https://github.com/Max13) - -### Affected Classes -- [Message::class](src/Message.php) -- [Part::class](src/Part.php) -- [Header::class](src/Header.php) -- [Query::class](src/Query/Query.php) - - -## [2.2.2] - 2020-10-20 -### Fixed -- IMAP::FT_PEEK removing "Seen" flag issue fixed #33 - -### Affected Classes -- [Message::class](src/Message.php) - -## [2.2.1] - 2020-10-19 -### Fixed -- Header decoding problem fixed #31 - -### Added -- Search for messages by message-Id -- Search for messages by In-Reply-To -- Message threading added `Message::thread()` -- Default folder locations added - -### Affected Classes -- [Query::class](src/Query/Query.php) -- [Message::class](src/Message.php) -- [Header::class](src/Header.php) - - -## [2.2.0] - 2020-10-16 -### Fixed -- Prevent text bodies from being fetched as attachment #27 -- Missing variable check added to prevent exception while parsing an address [webklex/laravel-imap #356](https://github.com/Webklex/laravel-imap/issues/356) -- Missing variable check added to prevent exception while parsing a part subtype #27 -- Missing variable check added to prevent exception while parsing a part content-type [webklex/laravel-imap #356](https://github.com/Webklex/laravel-imap/issues/356) -- Mixed message header attribute `in_reply_to` "unified" to be always an array #26 -- Potential message moving / copying problem fixed #29 -- Move messages by using `Protocol::moveMessage()` instead of `Protocol::copyMessage()` and `Message::delete()` #29 - -### Added -- `Protocol::moveMessage()` method added #29 - -### Affected Classes -- [Message::class](src/Message.php) -- [Header::class](src/Header.php) -- [Part::class](src/Part.php) - -### Breaking changes -- Text bodies might no longer get fetched as attachment -- `Message::$in_reply_to` type changed from mixed to array - -## [2.1.13] - 2020-10-13 -### Fixed -- Boundary detection problem fixed (#28 [@DasTobbel](https://github.com/DasTobbel)) -- Content-Type detection problem fixed (#28 [@DasTobbel](https://github.com/DasTobbel)) - -### Affected Classes -- [Structure::class](src/Structure.php) - -## [2.1.12] - 2020-10-13 -### Fixed -- If content disposition is multiline, implode the array to a simple string (#25 [@DasTobbel](https://github.com/DasTobbel)) - -### Affected Classes -- [Part::class](src/Part.php) - -## [2.1.11] - 2020-10-13 -### Fixed -- Potential problematic prefixed white-spaces removed from header attributes - -### Added -- Expended `Client::getFolder($name, $deleimiter = null)` to accept either a folder name or path ([@DasTobbel](https://github.com/DasTobbel)) -- Special MS-Exchange header decoding support added - -### Affected Classes -- [Client::class](src/Client.php) -- [Header::class](src/Header.php) - -## [2.1.10] - 2020-10-09 -### Added -- `ClientManager::make()` method added to support undefined accounts - -### Affected Classes -- [ClientManager::class](src/ClientManager.php) - -## [2.1.9] - 2020-10-08 -### Fixed -- Fix inline attachments and embedded images (#22 [@dwalczyk](https://github.com/dwalczyk)) - -### Added -- Alternative attachment names support added (#20 [@oneFoldSoftware](https://github.com/oneFoldSoftware)) -- Fetch message content without leaving a "Seen" flag behind - -### Affected Classes -- [Attachment::class](src/Attachment.php) -- [Message::class](src/Message.php) -- [Part::class](src/Part.php) -- [Query::class](src/Query/Query.php) - -## [2.1.8] - 2020-10-08 -### Fixed -- Possible error during address decoding fixed (#16 [@Slauta](https://github.com/Slauta)) -- Flag event dispatching fixed #15 - -### Added -- Support multiple boundaries (#17, #19 [@dwalczyk](https://github.com/dwalczyk)) - -### Affected Classes -- [Structure::class](src/Structure.php) - -## [2.1.7] - 2020-10-03 -### Fixed -- Fixed `Query::paginate()` (#13 #14 by [@Max13](https://github.com/Max13)) - -### Affected Classes -- [Query::class](src/Query/Query.php) - -## [2.1.6] - 2020-10-02 -### Fixed -- `Message::getAttributes()` hasn't returned all parameters - -### Affected Classes -- [Message::class](src/Message.php) - -### Added -- Part number added to attachment -- `Client::getFolderByPath()` added (#12 by [@Max13](https://github.com/Max13)) -- `Client::getFolderByName()` added (#12 by [@Max13](https://github.com/Max13)) -- Throws exceptions if the authentication fails (#11 by [@Max13](https://github.com/Max13)) - -### Affected Classes -- [Client::class](src/Client.php) - -## [2.1.5] - 2020-09-30 -### Fixed -- Wrong message content property reference fixed (#10) - -## [2.1.4] - 2020-09-30 -### Fixed -- Fix header extension values -- Part header detection method changed (#10) - -### Affected Classes -- [Header::class](src/Header.php) -- [Part::class](src/Part.php) - -## [2.1.3] - 2020-09-29 -### Fixed -- Possible decoding problem fixed -- `Str::class` dependency removed from `Header::class` - -### Affected Classes -- [Header::class](src/Header.php) - -## [2.1.2] - 2020-09-28 -### Fixed -- Dependency problem in `Attachement::getExtension()` fixed (#9) - -### Affected Classes -- [Attachment::class](src/Attachment.php) - -## [2.1.1] - 2020-09-23 -### Fixed -- Missing default config parameter added - -### Added -- Default account config fallback added - -### Affected Classes -- [Client::class](src/Client.php) - -## [2.1.0] - 2020-09-22 -### Fixed -- Quota handling fixed - -### Added -- Event system and callbacks added - -### Affected Classes -- [Client::class](src/Client.php) -- [Folder::class](src/Folder.php) -- [Message::class](src/Message.php) - -## [2.0.1] - 2020-09-20 -### Fixed -- Carbon dependency fixed - -## [2.0.0] - 2020-09-20 -### Fixed -- Missing pagination item records fixed - -### Added -- php-imap module replaced by direct socket communication -- Legacy support added -- IDLE support added -- oAuth support added -- Charset detection method updated -- Decoding fallback charsets added - -### Affected Classes -- All - -## [1.4.5] - 2019-01-23 -### Fixed -- .csv attachement is not processed -- mail part structure property comparison changed to lowercase -- Replace helper functions for Laravel 6.0 #4 (@koenhoeijmakers) -- Date handling in Folder::appendMessage() fixed -- Carbon Exception Parse Data -- Convert sender name from non-utf8 to uf8 (@hwilok) -- Convert encoding of personal data struct - -### Added -- Path prefix option added to Client::getFolder() method -- Attachment size handling added -- Find messages by custom search criteria - -### Affected Classes -- [Query::class](src/Query/WhereQuery.php) -- [Mask::class](src/Support/Masks/Mask.php) -- [Attachment::class](src/Attachment.php) -- [Client::class](src/Client.php) -- [Folder::class](src/Folder.php) -- [Message::class](src/Message.php) - -## [1.4.2.1] - 2019-07-03 -### Fixed -- Error in Attachment::__construct #3 -- Examples added - -## [1.4.2] - 2019-07-02 -### Fixed -- Pagination count total bug #213 -- Changed internal message move and copy methods #210 -- Query::since() query returning empty response #215 -- Carbon Exception Parse Data #45 -- Reading a blank body (text / html) but only from this sender #203 -- Problem with Message::moveToFolder() and multiple moves #31 -- Problem with encoding conversion #203 -- Message null value attribute problem fixed -- Client connection path handling changed to be handled inside the calling method #31 -- iconv(): error suppressor for //IGNORE added #184 -- Typo Folder attribute fullName changed to full_name -- Query scope error fixed #153 -- Replace embedded image with URL #151 -- Fix sender name in non-latin emails sent from Gmail (#155) -- Fix broken non-latin characters in body in ASCII (us-ascii) charset #156 -- Message::getMessageId() returns wrong value #197 -- Message date validation extended #45 #192 -- Removed "-i" from "iso-8859-8-i" in Message::parseBody #146 - -### Added -- Message::getFolder() method -- Create a fast count method for queries #216 -- STARTTLS encryption alias added -- Mailbox fetching exception added #201 -- Message::moveToFolder() fetches new Message::class afterwards #31 -- Message structure accessor added #182 -- Shadow Imap const class added #188 -- Connectable "NOT" queries added -- Additional where methods added -- Message attribute handling changed -- Attachment attribute handling changed -- Message flag handling updated -- Message::getHTMLBody($callback) extended -- Masks added (take look at the examples for more information on masks) -- More examples added -- Query::paginate() method added -- Imap client timeout can be modified and read #186 -- Decoder config options added #175 -- Message search criteria "NOT" added #181 -- Invalid message date exception added -- Blade examples - -### Breaking changes -- Message::moveToFolder() returns either a Message::class instance or null and not a boolean -- Folder::fullName is now Folder::full_name -- Attachment::image_src might no longer work as expected - use Attachment::getImageSrc() instead - -### Affected Classes -- [Folder::class](src/Folder.php) -- [Client::class](src/Client.php) -- [Message::class](src/Message.php) -- [Attachment::class](src/Attachment.php) -- [Query::class](src/Query/Query.php) -- [WhereQuery::class](src/Query/WhereQuery.php) - -## 0.0.3 - 2018-12-02 -### Fixed -- Folder delimiter check added #137 -- Config setting not getting loaded -- Date parsing updated - -### Affected Classes -- [Folder::class](src/IMAP/Client.php) -- [Folder::class](src/IMAP/Message.php) - -## 0.0.1 - 2018-08-13 -### Added -- new php-imap package (fork from [webklex/laravel-imap](https://github.com/Webklex/laravel-imap)) diff --git a/plugins/vendor/webklex/php-imap/CODE_OF_CONDUCT.md b/plugins/vendor/webklex/php-imap/CODE_OF_CONDUCT.md deleted file mode 100644 index 2ed07c83..00000000 --- a/plugins/vendor/webklex/php-imap/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,46 +0,0 @@ -# Contributor Covenant Code of Conduct - -## Our Pledge - -In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. - -## Our Standards - -Examples of behavior that contributes to creating a positive environment include: - -* Using welcoming and inclusive language -* Being respectful of differing viewpoints and experiences -* Gracefully accepting constructive criticism -* Focusing on what is best for the community -* Showing empathy towards other community members - -Examples of unacceptable behavior by participants include: - -* The use of sexualized language or imagery and unwelcome sexual attention or advances -* Trolling, insulting/derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or electronic address, without explicit permission -* Other conduct which could reasonably be considered inappropriate in a professional setting - -## Our Responsibilities - -Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. - -Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. - -## Scope - -This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at github@webklex.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. - -Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. - -## Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] - -[homepage]: http://contributor-covenant.org -[version]: http://contributor-covenant.org/version/1/4/ diff --git a/plugins/vendor/webklex/php-imap/LICENSE b/plugins/vendor/webklex/php-imap/LICENSE deleted file mode 100644 index 6c13191e..00000000 --- a/plugins/vendor/webklex/php-imap/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2016 Webklex - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/plugins/vendor/webklex/php-imap/LICENSE.md b/plugins/vendor/webklex/php-imap/LICENSE.md deleted file mode 100644 index feae5f32..00000000 --- a/plugins/vendor/webklex/php-imap/LICENSE.md +++ /dev/null @@ -1,21 +0,0 @@ -# The MIT License (MIT) - -Copyright (c) 2016 Malte Goldenbaum - -> Permission is hereby granted, free of charge, to any person obtaining a copy -> of this software and associated documentation files (the "Software"), to deal -> in the Software without restriction, including without limitation the rights -> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -> copies of the Software, and to permit persons to whom the Software is -> furnished to do so, subject to the following conditions: -> -> The above copyright notice and this permission notice shall be included in -> all copies or substantial portions of the Software. -> -> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -> THE SOFTWARE. diff --git a/plugins/vendor/webklex/php-imap/README.md b/plugins/vendor/webklex/php-imap/README.md deleted file mode 100755 index da47d048..00000000 --- a/plugins/vendor/webklex/php-imap/README.md +++ /dev/null @@ -1,245 +0,0 @@ - -# IMAP Library for PHP - -[![Latest release on Packagist][ico-release]][link-packagist] -[![Latest prerelease on Packagist][ico-prerelease]][link-packagist] -[![Software License][ico-license]][link-license] -[![Total Downloads][ico-downloads]][link-downloads] -[![Hits][ico-hits]][link-hits] -[![Discord][ico-discord]][link-discord] -[![Snyk][ico-snyk]][link-snyk] - - -## Description -PHP-IMAP is a wrapper for common IMAP communication without the need to have the php-imap module installed / enabled. -The protocol is completely integrated and therefore supports IMAP IDLE operation and the "new" oAuth authentication -process as well. -You can enable the `php-imap` module in order to handle edge cases, improve message decoding quality and is required if -you want to use legacy protocols such as pop3. - -Official documentation: [php-imap.com](https://www.php-imap.com/) - -Laravel wrapper: [webklex/laravel-imap](https://github.com/Webklex/laravel-imap) - -Discord: [discord.gg/rd4cN9h6][link-discord] - -## Table of Contents -- [Documentations](#documentations) -- [Compatibility](#compatibility) -- [Basic usage example](#basic-usage-example) -- [Sponsors](#sponsors) -- [Testing](#testing) -- [Known issues](#known-issues) -- [Support](#support) -- [Features & pull requests](#features--pull-requests) -- [Alternatives & Different Flavors](#alternatives--different-flavors) -- [Security](#security) -- [Credits](#credits) -- [License](#license) - - -## Documentations -- Legacy (< v2.0.0): [legacy documentation](https://github.com/Webklex/php-imap/tree/1.4.5) -- Core documentation: [php-imap.com](https://www.php-imap.com/) - - -## Compatibility -| Version | PHP 5.6 | PHP 7 | PHP 8 | -|:--------|:-------:|:-----:|:-----:| -| v6.x | / | / | X | -| v5.x | / | / | X | -| v4.x | / | X | X | -| v3.x | / | X | / | -| v2.x | X | X | / | -| v1.x | X | / | / | - -## Basic usage example -This is a basic example, which will echo out all Mails within all imap folders -and will move every message into INBOX.read. Please be aware that this should not be -tested in real life and is only meant to give an impression on how things work. - -```php -use Webklex\PHPIMAP\ClientManager; - -require_once "vendor/autoload.php"; - -$cm = new ClientManager('path/to/config/imap.php'); - -/** @var \Webklex\PHPIMAP\Client $client */ -$client = $cm->account('account_identifier'); - -//Connect to the IMAP Server -$client->connect(); - -//Get all Mailboxes -/** @var \Webklex\PHPIMAP\Support\FolderCollection $folders */ -$folders = $client->getFolders(); - -//Loop through every Mailbox -/** @var \Webklex\PHPIMAP\Folder $folder */ -foreach($folders as $folder){ - - //Get all Messages of the current Mailbox $folder - /** @var \Webklex\PHPIMAP\Support\MessageCollection $messages */ - $messages = $folder->messages()->all()->get(); - - /** @var \Webklex\PHPIMAP\Message $message */ - foreach($messages as $message){ - echo $message->getSubject().'
'; - echo 'Attachments: '.$message->getAttachments()->count().'
'; - echo $message->getHTMLBody(); - - //Move the current Message to 'INBOX.read' - if($message->move('INBOX.read') == true){ - echo 'Message has been moved'; - }else{ - echo 'Message could not be moved'; - } - } -} -``` - -## Sponsors -[![elb-BIT][ico-sponsor-elb-bit]][link-sponsor-elb-bit] -[![Feline][ico-sponsor-feline]][link-sponsor-feline] - - -## Testing -To run the tests, please execute the following command: -```bash -composer test -``` - -### Quick-Test / Static Test -To disable all test which require a live mailbox, please copy the `phpunit.xml.dist` to `phpunit.xml` and adjust the configuration: -```xml - - - -``` - -### Full-Test / Live Mailbox Test -To run all tests, you need to provide a valid imap configuration. - -To provide a valid imap configuration, please copy the `phpunit.xml.dist` to `phpunit.xml` and adjust the configuration: -```xml - - - - - - - - - - - -``` - -The test account should **not** contain any important data, as it will be deleted during the test. -Furthermore, the test account should be able to create new folders, move messages and should **not** be used by any other -application during the test. - -It's recommended to use a dedicated test account for this purpose. You can use the provided `Dockerfile` to create an imap server used for testing purposes. - -Build the docker image: -```bash -cd .github/docker - -docker build -t php-imap-server . -``` -Run the docker image: -```bash -docker run --name imap-server -p 993:993 --rm -d php-imap-server -``` -Stop the docker image: -```bash -docker stop imap-server -``` - - -### Known issues -| Error | Solution | -|:---------------------------------------------------------------------------|:----------------------------------------------------------------------------------------| -| Kerberos error: No credentials cache file found (try running kinit) (...) | Uncomment "DISABLE_AUTHENTICATOR" inside your config and use the `legacy-imap` protocol | - - -## Support -If you encounter any problems or if you find a bug, please don't hesitate to create a new [issue](https://github.com/Webklex/php-imap/issues). -However, please be aware that it might take some time to get an answer. -Off-topic, rude or abusive issues will be deleted without any notice. - -If you need **commercial** support, feel free to send me a mail at github@webklex.com. - - -##### A little notice -If you write source code in your issue, please consider to format it correctly. This makes it so much nicer to read -and people are more likely to comment and help :) - -```php - -echo 'your php code...'; - -``` - -will turn into: -```php -echo 'your php code...'; -``` - - -## Features & pull requests -Everyone can contribute to this project. Every pull request will be considered, but it can also happen to be declined. -To prevent unnecessary work, please consider to create a [feature issue](https://github.com/Webklex/php-imap/issues/new?template=feature_request.md) -first, if you're planning to do bigger changes. Of course, you can also create a new [feature issue](https://github.com/Webklex/php-imap/issues/new?template=feature_request.md) -if you're just wishing a feature ;) - - -## Alternatives & Different Flavors -This library and especially the code flavor It's written in, is certainly not for everyone. If you are looking for a -different approach, you might want to check out the following libraries: -- [ddeboer/imap](https://github.com/ddeboer/imap) -- [barbushin/php-imap](https://github.com/barbushin/php-imap) -- [stevebauman/php-imap](https://github.com/stevebauman/php-imap) - - -## Change log -Please see [CHANGELOG][link-changelog] for more information what has changed recently. - - -## Security -If you discover any security related issues, please email github@webklex.com instead of using the issue tracker. - - -## Credits -- [Webklex][link-author] -- [All Contributors][link-contributors] - - -## License -The MIT License (MIT). Please see [License File][link-license] for more information. - - -[ico-release]: https://img.shields.io/packagist/v/Webklex/php-imap.svg?style=flat-square&label=version -[ico-prerelease]: https://img.shields.io/github/v/release/webklex/php-imap?include_prereleases&style=flat-square&label=pre-release -[ico-license]: https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square -[ico-downloads]: https://img.shields.io/packagist/dt/Webklex/php-imap.svg?style=flat-square -[ico-hits]: https://hits.webklex.com/svg/webklex/php-imap -[ico-snyk]: https://snyk-widget.herokuapp.com/badge/composer/webklex/php-imap/badge.svg -[ico-discord]: https://img.shields.io/static/v1?label=discord&message=open&color=5865f2&style=flat-square - -[link-packagist]: https://packagist.org/packages/Webklex/php-imap -[link-downloads]: https://packagist.org/packages/Webklex/php-imap -[link-author]: https://github.com/webklex -[link-contributors]: https://github.com/Webklex/php-imap/graphs/contributors -[link-license]: https://github.com/Webklex/php-imap/blob/master/LICENSE -[link-changelog]: https://github.com/Webklex/php-imap/blob/master/CHANGELOG.md -[link-hits]: https://hits.webklex.com -[link-snyk]: https://snyk.io/vuln/composer:webklex%2Fphp-imap -[link-discord]: https://discord.gg/vUHrbfbDr9 - - -[ico-sponsor-feline]: https://cdn.feline.dk/public/feline.png -[link-sponsor-feline]: https://www.feline.dk -[ico-sponsor-elb-bit]: https://www.elb-bit.de/user/themes/deliver/images/logo_small.png -[link-sponsor-elb-bit]: https://www.elb-bit.de?ref=webklex/php-imap \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/_config.yml b/plugins/vendor/webklex/php-imap/_config.yml deleted file mode 100644 index c4192631..00000000 --- a/plugins/vendor/webklex/php-imap/_config.yml +++ /dev/null @@ -1 +0,0 @@ -theme: jekyll-theme-cayman \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/composer.json b/plugins/vendor/webklex/php-imap/composer.json deleted file mode 100644 index 334275fa..00000000 --- a/plugins/vendor/webklex/php-imap/composer.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "name": "webklex/php-imap", - "type": "library", - "description": "PHP IMAP client", - "keywords": [ - "webklex", - "imap", - "pop3", - "php-imap", - "mail" - ], - "homepage": "https://github.com/webklex/php-imap", - "license": "MIT", - "authors": [ - { - "name": "Malte Goldenbaum", - "email": "github@webklex.com", - "role": "Developer" - } - ], - "require": { - "php": "^8.0.2", - "ext-openssl": "*", - "ext-json": "*", - "ext-mbstring": "*", - "ext-iconv": "*", - "ext-libxml": "*", - "ext-zip": "*", - "ext-fileinfo": "*", - "nesbot/carbon": "^2.62.1|^3.2.4", - "symfony/http-foundation": ">=2.8.0", - "illuminate/pagination": ">=5.0.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.5.10" - }, - "suggest": { - "symfony/mime": "Recomended for better extension support", - "symfony/var-dumper": "Usefull tool for debugging" - }, - "autoload": { - "psr-4": { - "Webklex\\PHPIMAP\\": "src" - } - }, - "autoload-dev": { - "psr-4": { - "Tests\\": "tests" - } - }, - "scripts": { - "test": "phpunit" - }, - "extra": { - "branch-alias": { - "dev-master": "6.0-dev" - } - }, - "minimum-stability": "dev", - "prefer-stable": true -} diff --git a/plugins/vendor/webklex/php-imap/examples/custom_attachment_mask.php b/plugins/vendor/webklex/php-imap/examples/custom_attachment_mask.php deleted file mode 100644 index eb4973e3..00000000 --- a/plugins/vendor/webklex/php-imap/examples/custom_attachment_mask.php +++ /dev/null @@ -1,57 +0,0 @@ -id, $this->getMessage()->getUid(), $this->name]); - } - - /** - * Custom attachment saving method - * @return bool - */ - public function custom_save(): bool { - $path = "foo".DIRECTORY_SEPARATOR."bar".DIRECTORY_SEPARATOR; - $filename = $this->token(); - - return file_put_contents($path.$filename, $this->getContent()) !== false; - } - -} - -$cm = new \Webklex\PHPIMAP\ClientManager('path/to/config/imap.php'); - -/** @var \Webklex\PHPIMAP\Client $client */ -$client = $cm->account('default'); -$client->connect(); -$client->setDefaultAttachmentMask(CustomAttachmentMask::class); - -/** @var \Webklex\PHPIMAP\Folder $folder */ -$folder = $client->getFolder('INBOX'); - -/** @var \Webklex\PHPIMAP\Message $message */ -$message = $folder->query()->limit(1)->get()->first(); - -/** @var \Webklex\PHPIMAP\Attachment $attachment */ -$attachment = $message->getAttachments()->first(); - -/** @var CustomAttachmentMask $masked_attachment */ -$masked_attachment = $attachment->mask(); - -echo 'Token for uid ['.$masked_attachment->getMessage()->getUid().']: '.$masked_attachment->token(); - -$masked_attachment->custom_save(); \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/examples/custom_message_mask.php b/plugins/vendor/webklex/php-imap/examples/custom_message_mask.php deleted file mode 100644 index 0463c65b..00000000 --- a/plugins/vendor/webklex/php-imap/examples/custom_message_mask.php +++ /dev/null @@ -1,51 +0,0 @@ -message_id, $this->uid, $this->message_no]); - } - - /** - * Get number of message attachments - * @return integer - */ - public function getAttachmentCount(): int { - return $this->getAttachments()->count(); - } - -} - -$cm = new \Webklex\PHPIMAP\ClientManager('path/to/config/imap.php'); - -/** @var \Webklex\PHPIMAP\Client $client */ -$client = $cm->account('default'); -$client->connect(); - -/** @var \Webklex\PHPIMAP\Folder $folder */ -$folder = $client->getFolder('INBOX'); - -/** @var \Webklex\PHPIMAP\Message $message */ -$message = $folder->query()->limit(1)->get()->first(); - -/** @var CustomMessageMask $masked_message */ -$masked_message = $message->mask(CustomMessageMask::class); - -echo 'Token for uid [' . $masked_message->uid . ']: ' . $masked_message->token() . ' @atms:' . $masked_message->getAttachmentCount(); - -$masked_message->setFlag('seen'); - diff --git a/plugins/vendor/webklex/php-imap/examples/folder_structure.blade.php b/plugins/vendor/webklex/php-imap/examples/folder_structure.blade.php deleted file mode 100644 index a80dfb6c..00000000 --- a/plugins/vendor/webklex/php-imap/examples/folder_structure.blade.php +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - count() > 0): ?> - - - - - - - - - - - - -
FolderUnread messages
name; ?>search()->unseen()->setFetchBody(false)->count(); ?>
No folders found
- -links(); ?> \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/examples/message_table.blade.php b/plugins/vendor/webklex/php-imap/examples/message_table.blade.php deleted file mode 100644 index c3bd7af8..00000000 --- a/plugins/vendor/webklex/php-imap/examples/message_table.blade.php +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - count() > 0): ?> - - - - - - - - - - - - - - -
UIDSubjectFromAttachments
getUid(); ?>getSubject(); ?>getFrom()[0]->mail; ?>getAttachments()->count() > 0 ? 'yes' : 'no'; ?>
No messages found
- -links(); ?> \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/phpunit.xml.dist b/plugins/vendor/webklex/php-imap/phpunit.xml.dist deleted file mode 100644 index 02d56a89..00000000 --- a/plugins/vendor/webklex/php-imap/phpunit.xml.dist +++ /dev/null @@ -1,35 +0,0 @@ - - - - - src/ - - - - - - - - - - tests - tests/fixtures - tests/issues - tests/live - - - - - - - - - - - - - - - - - diff --git a/plugins/vendor/webklex/php-imap/src/Address.php b/plugins/vendor/webklex/php-imap/src/Address.php deleted file mode 100644 index 87c6479e..00000000 --- a/plugins/vendor/webklex/php-imap/src/Address.php +++ /dev/null @@ -1,108 +0,0 @@ -personal = $object->personal ?? ''; } - if (property_exists($object, "mailbox")){ $this->mailbox = $object->mailbox ?? ''; } - if (property_exists($object, "host")){ $this->host = $object->host ?? ''; } - if (property_exists($object, "mail")){ $this->mail = $object->mail ?? ''; } - if (property_exists($object, "full")){ $this->full = $object->full ?? ''; } - $this->boot(); - } - - /** - * Boot the address - */ - private function boot(): void { - if($this->mail === "" && $this->mailbox !== "" && $this->host !== ""){ - $this->mail = $this->mailbox . "@" . $this->host; - }elseif($this->mail === "" && $this->mailbox !== ""){ - $this->mail = $this->mailbox; - } - - if($this->full === "" && $this->mail !== "" && $this->personal !== ""){ - $this->full = $this->personal . " <" . $this->mail . ">"; - }elseif($this->full === "" && $this->mail !== ""){ - $this->full = $this->mail; - } - } - - - /** - * Return the stringified address - * - * @return string - */ - public function __toString() { - return $this->full ?: ""; - } - - /** - * Return the serialized address - * - * @return array - */ - public function __serialize(){ - return [ - "personal" => $this->personal, - "mailbox" => $this->mailbox, - "host" => $this->host, - "mail" => $this->mail, - "full" => $this->full, - ]; - } - - /** - * Convert instance to array - * - * @return array - */ - public function toArray(): array { - return $this->__serialize(); - } - - /** - * Return the stringified attribute - * - * @return string - */ - public function toString(): string { - return $this->__toString(); - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/src/Attachment.php b/plugins/vendor/webklex/php-imap/src/Attachment.php deleted file mode 100755 index e2ce8128..00000000 --- a/plugins/vendor/webklex/php-imap/src/Attachment.php +++ /dev/null @@ -1,515 +0,0 @@ - null, - 'hash' => null, - 'type' => null, - 'part_number' => 0, - 'content_type' => null, - 'id' => null, - 'name' => null, - 'filename' => null, - 'description' => null, - 'disposition' => null, - 'img_src' => null, - 'size' => null, - ]; - - /** - * Default mask - * - * @var string $mask - */ - protected string $mask = AttachmentMask::class; - - /** - * Attachment constructor. - * @param Message $message - * @param Part $part - * @throws DecoderNotFoundException - */ - public function __construct(Message $message, Part $part) { - $this->message = $message; - $this->config = $this->message->getConfig(); - $this->options = $this->config->get('options'); - $this->decoder = $this->config->getDecoder("attachment"); - - $this->part = $part; - $this->part_number = $part->part_number; - - if ($this->message->getClient()) { - $default_mask = $this->message->getClient()?->getDefaultAttachmentMask(); - if ($default_mask != null) { - $this->mask = $default_mask; - } - } else { - $default_mask = $this->config->getMask("attachment"); - if ($default_mask != "") { - $this->mask = $default_mask; - } - } - - $this->findType(); - $this->fetch(); - } - - /** - * Call dynamic attribute setter and getter methods - * @param string $method - * @param array $arguments - * - * @return mixed - * @throws MethodNotFoundException - */ - public function __call(string $method, array $arguments) { - if (strtolower(substr($method, 0, 3)) === 'get') { - $name = Str::snake(substr($method, 3)); - - if (isset($this->attributes[$name])) { - return $this->attributes[$name]; - } - - return null; - } elseif (strtolower(substr($method, 0, 3)) === 'set') { - $name = Str::snake(substr($method, 3)); - - $this->attributes[$name] = array_pop($arguments); - - return $this->attributes[$name]; - } - - throw new MethodNotFoundException("Method " . self::class . '::' . $method . '() is not supported'); - } - - /** - * Magic setter - * @param $name - * @param $value - * - * @return mixed - */ - public function __set($name, $value) { - $this->attributes[$name] = $value; - - return $this->attributes[$name]; - } - - /** - * magic getter - * @param $name - * - * @return mixed|null - */ - public function __get($name) { - if (isset($this->attributes[$name])) { - return $this->attributes[$name]; - } - - return null; - } - - /** - * Determine the structure type - */ - protected function findType(): void { - $this->type = match ($this->part->type) { - IMAP::ATTACHMENT_TYPE_MESSAGE => 'message', - IMAP::ATTACHMENT_TYPE_APPLICATION => 'application', - IMAP::ATTACHMENT_TYPE_AUDIO => 'audio', - IMAP::ATTACHMENT_TYPE_IMAGE => 'image', - IMAP::ATTACHMENT_TYPE_VIDEO => 'video', - IMAP::ATTACHMENT_TYPE_MODEL => 'model', - IMAP::ATTACHMENT_TYPE_TEXT => 'text', - IMAP::ATTACHMENT_TYPE_MULTIPART => 'multipart', - default => 'other', - }; - } - - /** - * Fetch the given attachment - */ - protected function fetch(): void { - $content = $this->part->content; - - $this->content_type = $this->part->content_type; - $this->content = $this->decoder->decode($content, $this->part->encoding); - - // Create a hash of the raw part - this can be used to identify the attachment in the message context. However, - // it is not guaranteed to be unique and collisions are possible. - // Some additional online resources: - // - https://en.wikipedia.org/wiki/Hash_collision - // - https://www.php.net/manual/en/function.hash.php - // - https://php.watch/articles/php-hash-benchmark - // Benchmark speeds: - // -xxh3 ~15.19(GB/s) (requires php-xxhash extension or >= php8.1) - // -crc32c ~14.12(GB/s) - // -sha256 ~0.25(GB/s) - // xxh3 would be nice to use, because of its extra speed and 32 instead of 8 bytes, but it is not compatible with - // php < 8.1. crc32c is the next fastest and is compatible with php >= 5.1. sha256 is the slowest, but is compatible - // with php >= 5.1 and is the most likely to be unique. crc32c is the best compromise between speed and uniqueness. - // Unique enough for our purposes, but not so slow that it could be a bottleneck. - $this->hash = hash("crc32c", $this->part->getHeader()->raw."\r\n\r\n".$this->part->content); - - if (($id = $this->part->id) !== null) { - $this->id = str_replace(['<', '>'], '', $id); - }else { - $this->id = $this->hash; - } - - $this->size = $this->part->bytes; - $this->disposition = $this->part->disposition; - - if (($filename = $this->part->filename) !== null) { - $this->filename = $this->decodeName($filename); - } - - if (($description = $this->part->description) !== null) { - $this->description = $this->part->getHeader()->getDecoder()->decode($description); - } - - if (($name = $this->part->name) !== null) { - $this->name = $this->decodeName($name); - } - - if (IMAP::ATTACHMENT_TYPE_MESSAGE == $this->part->type) { - if ($this->part->ifdescription) { - if (!$this->name) { - $this->name = $this->part->description; - } - } else if (!$this->name) { - $this->name = $this->part->subtype; - } - } - $this->attributes = array_merge($this->part->getHeader()->getAttributes(), $this->attributes); - - if (!$this->filename) { - $this->filename = $this->hash; - } - - if (!$this->name && $this->filename != "") { - $this->name = $this->filename; - } - } - - /** - * Save the attachment content to your filesystem - * @param string $path - * @param string|null $filename - * - * @return boolean - */ - public function save(string $path, ?string $filename = null): bool { - $filename = $filename ? $this->decodeName($filename) : $this->filename; - - return file_put_contents($path . DIRECTORY_SEPARATOR . $filename, $this->getContent()) !== false; - } - - /** - * Decode a given name - * @param string|null $name - * - * @return string - */ - public function decodeName(?string $name): string { - if ($name !== null) { - if (str_contains($name, "''")) { - $parts = explode("''", $name); - if (EncodingAliases::has($parts[0])) { - $encoding = $parts[0]; - $name = implode("''", array_slice($parts, 1)); - } - } - - $decoder = $this->decoder->getOptions()['message']; - if (preg_match('/=\?([^?]+)\?(Q|B)\?(.+)\?=/i', $name, $matches)) { - $name = $this->part->getHeader()->getDecoder()->decode($name); - } elseif ($decoder === 'utf-8' && extension_loaded('imap')) { - $name = \imap_utf8($name); - } - - // check if $name is url encoded - if (preg_match('/%[0-9A-F]{2}/i', $name)) { - $name = urldecode($name); - } - - if (isset($encoding)) { - $name = EncodingAliases::convert($name, $encoding); - } - - if($this->config->get('security.sanitize_filenames', true)) { - $name = $this->sanitizeName($name); - } - - return $name; - } - return ""; - } - - /** - * Get the attachment mime type - * - * @return string|null - */ - public function getMimeType(): ?string { - return (new \finfo())->buffer($this->getContent(), FILEINFO_MIME_TYPE); - } - - /** - * Try to guess the attachment file extension - * - * @return string|null - */ - public function getExtension(): ?string { - $extension = null; - $guesser = "\Symfony\Component\Mime\MimeTypes"; - if (class_exists($guesser) !== false) { - /** @var Symfony\Component\Mime\MimeTypes $guesser */ - $extensions = $guesser::getDefault()->getExtensions($this->getMimeType()); - $extension = $extensions[0] ?? null; - } - if ($extension === null) { - $deprecated_guesser = "\Symfony\Component\HttpFoundation\File\MimeType\ExtensionGuesser"; - if (class_exists($deprecated_guesser) !== false) { - /** @var \Symfony\Component\HttpFoundation\File\MimeType\ExtensionGuesser $deprecated_guesser */ - $extension = $deprecated_guesser::getInstance()->guess($this->getMimeType()); - } - } - if ($extension === null) { - $parts = explode(".", $this->filename); - $extension = count($parts) > 1 ? end($parts) : null; - } - if ($extension === null) { - $parts = explode(".", $this->name); - $extension = count($parts) > 1 ? end($parts) : null; - } - return $extension; - } - - /** - * Get all attributes - * - * @return array - */ - public function getAttributes(): array { - return $this->attributes; - } - - /** - * @return Message - */ - public function getMessage(): Message { - return $this->message; - } - - /** - * Set the default mask - * @param $mask - * - * @return $this - */ - public function setMask($mask): Attachment { - if (class_exists($mask)) { - $this->mask = $mask; - } - - return $this; - } - - /** - * Get the used default mask - * - * @return string - */ - public function getMask(): string { - return $this->mask; - } - - /** - * Get the attachment options - * @return array - */ - public function getOptions(): array { - return $this->options; - } - - /** - * Set the attachment options - * @param array $options - * - * @return $this - */ - public function setOptions(array $options): Attachment { - $this->options = $options; - return $this; - } - - /** - * Get the used config - * - * @return Config - */ - public function getConfig(): Config { - return $this->config; - } - - /** - * Set the used config - * @param Config $config - * - * @return $this - */ - public function setConfig(Config $config): Attachment { - $this->config = $config; - return $this; - } - - /** - * Get a masked instance by providing a mask name - * @param string|null $mask - * - * @return mixed - * @throws MaskNotFoundException - */ - public function mask(?string $mask = null): mixed { - $mask = $mask !== null ? $mask : $this->mask; - if (class_exists($mask)) { - return new $mask($this); - } - - throw new MaskNotFoundException("Unknown mask provided: " . $mask); - } - - /** - * Get the decoder instance - * - * @return DecoderInterface - */ - public function getDecoder(): DecoderInterface { - return $this->decoder; - } - - /** - * Set the decoder instance - * @param DecoderInterface $decoder - * - * @return $this - */ - public function setDecoder(DecoderInterface $decoder): static { - $this->decoder = $decoder; - return $this; - } - - /** - * Sanitize a given name to prevent common attacks - * !!IMPORTANT!! Do not rely on this method alone - this is just the bare minimum. Additional measures should be taken - * to ensure that the file is safe to use. - * @param string $name - * - * @return string - */ - private function sanitizeName(string $name): string { - $replaces = [ - '/\\\\/' => '', - '/[\/\0:]+/' => '', - '/\.+/' => '.', - ]; - $name_starts_with_dots = str_starts_with($name, '..'); - $name = preg_replace(array_keys($replaces), array_values($replaces), $name); - if($name_starts_with_dots) { - return substr($name, 1); - } - return $name; - } -} diff --git a/plugins/vendor/webklex/php-imap/src/Attribute.php b/plugins/vendor/webklex/php-imap/src/Attribute.php deleted file mode 100644 index c50cab75..00000000 --- a/plugins/vendor/webklex/php-imap/src/Attribute.php +++ /dev/null @@ -1,325 +0,0 @@ -setName($name); - $this->add($value); - } - - /** - * Handle class invocation calls - * - * @return array|string - */ - public function __invoke(): array|string { - if ($this->count() > 1) { - return $this->toArray(); - } - return $this->toString(); - } - - /** - * Return the serialized address - * - * @return array - */ - public function __serialize(){ - return $this->values; - } - - /** - * Return the stringified attribute - * - * @return string - */ - public function __toString() { - return implode(", ", $this->values); - } - - /** - * Return the stringified attribute - * - * @return string - */ - public function toString(): string { - return $this->__toString(); - } - - /** - * Convert instance to array - * - * @return array - */ - public function toArray(): array { - return $this->__serialize(); - } - - /** - * Convert first value to a date object - * - * @return Carbon - */ - public function toDate(): Carbon { - $date = $this->first(); - if ($date instanceof Carbon) return $date; - - return Carbon::parse($date); - } - - /** - * Determine if a value exists at a given key. - * - * @param int|string $key - * @return bool - */ - public function has(mixed $key = 0): bool { - return array_key_exists($key, $this->values); - } - - /** - * Determine if a value exists at a given key. - * - * @param int|string $key - * @return bool - */ - public function exist(mixed $key = 0): bool { - return $this->has($key); - } - - /** - * Check if the attribute contains the given value - * @param mixed $value - * - * @return bool - */ - public function contains(mixed $value): bool { - return in_array($value, $this->values, true); - } - - /** - * Get a value by a given key. - * - * @param int|string $key - * @return mixed - */ - public function get(int|string $key = 0): mixed { - return $this->values[$key] ?? null; - } - - /** - * Set the value by a given key. - * - * @param mixed $key - * @param mixed $value - * @return Attribute - */ - public function set(mixed $value, mixed $key = 0): Attribute { - if (is_null($key)) { - $this->values[] = $value; - } else { - $this->values[$key] = $value; - } - return $this; - } - - /** - * Unset a value by a given key. - * - * @param int|string $key - * @return Attribute - */ - public function remove(int|string $key = 0): Attribute { - if (isset($this->values[$key])) { - unset($this->values[$key]); - } - return $this; - } - - /** - * Add one or more values to the attribute - * @param array|mixed $value - * @param boolean $strict - * - * @return Attribute - */ - public function add(mixed $value, bool $strict = false): Attribute { - if (is_array($value)) { - return $this->merge($value, $strict); - }elseif ($value !== null) { - $this->attach($value, $strict); - } - - return $this; - } - - /** - * Merge a given array of values with the current values array - * @param array $values - * @param boolean $strict - * - * @return Attribute - */ - public function merge(array $values, bool $strict = false): Attribute { - foreach ($values as $value) { - $this->attach($value, $strict); - } - - return $this; - } - - /** - * Attach a given value to the current value array - * @param $value - * @param bool $strict - * @return Attribute - */ - public function attach($value, bool $strict = false): Attribute { - if ($strict === true) { - if ($this->contains($value) === false) { - $this->values[] = $value; - } - }else{ - $this->values[] = $value; - } - return $this; - } - - /** - * Set the attribute name - * @param $name - * - * @return Attribute - */ - public function setName($name): Attribute { - $this->name = $name; - - return $this; - } - - /** - * Get the attribute name - * - * @return string - */ - public function getName(): string { - return $this->name; - } - - /** - * Get all values - * - * @return array - */ - public function all(): array { - reset($this->values); - return $this->values; - } - - /** - * Get the first value if possible - * - * @return mixed|null - */ - public function first(): mixed { - return reset($this->values); - } - - /** - * Get the last value if possible - * - * @return mixed|null - */ - public function last(): mixed { - return end($this->values); - } - - /** - * Get the number of values - * - * @return int - */ - public function count(): int { - return count($this->values); - } - - /** - * @see ArrayAccess::offsetExists - * @param mixed $offset - * @return bool - */ - public function offsetExists(mixed $offset): bool { - return $this->has($offset); - } - - /** - * @see ArrayAccess::offsetGet - * @param mixed $offset - * @return mixed - */ - public function offsetGet(mixed $offset): mixed { - return $this->get($offset); - } - - /** - * @see ArrayAccess::offsetSet - * @param mixed $offset - * @param mixed $value - * @return void - */ - public function offsetSet(mixed $offset, mixed $value): void { - $this->set($value, $offset); - } - - /** - * @see ArrayAccess::offsetUnset - * @param mixed $offset - * @return void - */ - public function offsetUnset(mixed $offset): void { - $this->remove($offset); - } - - /** - * @param callable $callback - * @return array - */ - public function map(callable $callback): array { - return array_map($callback, $this->values); - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/src/Client.php b/plugins/vendor/webklex/php-imap/src/Client.php deleted file mode 100755 index 5eb26ff2..00000000 --- a/plugins/vendor/webklex/php-imap/src/Client.php +++ /dev/null @@ -1,969 +0,0 @@ - null, - 'request_fulluri' => false, - 'username' => null, - 'password' => null, - ]; - - - /** - * SSL stream context options - * - * @see https://www.php.net/manual/en/context.ssl.php for possible options - * - * @var array - */ - protected array $ssl_options = []; - - /** - * Connection timeout - * @var int $timeout - */ - public int $timeout; - - /** - * Account username - * - * @var string - */ - public string $username; - - /** - * Account password. - * - * @var string - */ - public string $password; - - /** - * Additional data fetched from the server. - * - * @var array - */ - public array $extensions; - - /** - * Account rfc. - * - * @var string - */ - public string $rfc; - - /** - * Account authentication method. - * - * @var ?string - */ - public ?string $authentication; - - /** - * Active folder path. - * - * @var ?string - */ - protected ?string $active_folder = null; - - /** - * Default message mask - * - * @var string $default_message_mask - */ - protected string $default_message_mask = MessageMask::class; - - /** - * Default attachment mask - * - * @var string $default_attachment_mask - */ - protected string $default_attachment_mask = AttachmentMask::class; - - /** - * Used default account values - * - * @var array $default_account_config - */ - protected array $default_account_config = [ - 'host' => 'localhost', - 'port' => 993, - 'protocol' => 'imap', - 'encryption' => 'ssl', - 'validate_cert' => true, - 'username' => '', - 'password' => '', - 'rfc' => 'RFC822', - 'authentication' => null, - "extensions" => [], - 'proxy' => [ - 'socket' => null, - 'request_fulluri' => false, - 'username' => null, - 'password' => null, - ], - 'ssl_options' => [], - "timeout" => 30, - ]; - - /** - * Client constructor. - * @param Config $config - * - * @throws MaskNotFoundException - */ - public function __construct(Config $config) { - $this->setConfig($config); - $this->setMaskFromConfig(); - $this->setEventsFromConfig(); - } - - /** - * Client destructor - * - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - */ - public function __destruct() { - $this->disconnect(); - } - - /** - * Clone the current Client instance - * - * @return Client - * @throws MaskNotFoundException - */ - public function clone(): Client { - $client = new self($this->config); - $client->events = $this->events; - $client->timeout = $this->timeout; - $client->active_folder = $this->active_folder; - $client->default_account_config = $this->default_account_config; - $config = $this->getAccountConfig(); - foreach($config as $key => $value) { - $client->setAccountConfig($key, $config); - } - $client->default_message_mask = $this->default_message_mask; - $client->default_attachment_mask = $this->default_message_mask; - return $client; - } - - /** - * Set the Client configuration - * @param Config $config - * - * @return self - */ - public function setConfig(Config $config): Client { - $this->config = $config; - $default_account = $this->config->get('default'); - $default_config = $this->config->get("accounts.$default_account"); - - foreach ($this->default_account_config as $key => $value) { - $this->setAccountConfig($key, $default_config); - } - - return $this; - } - - /** - * Get the current config - * - * @return Config - */ - public function getConfig(): Config { - return $this->config; - } - - /** - * Set a specific account config - * @param string $key - * @param array $default_config - */ - private function setAccountConfig(string $key, array $default_config): void { - $value = $this->default_account_config[$key]; - if(isset($default_config[$key])) { - $value = $default_config[$key]; - } - $this->$key = $value; - } - - /** - * Get the current account config - * - * @return array - */ - public function getAccountConfig(): array { - $config = []; - foreach($this->default_account_config as $key => $value) { - if(property_exists($this, $key)) { - $config[$key] = $this->$key; - } - } - return $config; - } - - /** - * Look for a possible events in any available config - */ - protected function setEventsFromConfig(): void { - $this->events = $this->config->get("events"); - if(isset($config['events'])){ - foreach($config['events'] as $section => $events) { - $this->events[$section] = array_merge($this->events[$section], $events); - } - } - } - - /** - * Look for a possible mask in any available config - * - * @throws MaskNotFoundException - */ - protected function setMaskFromConfig(): void { - $masks = $this->config->get("masks"); - - if(isset($masks)){ - if(isset($masks['message'])) { - if(class_exists($masks['message'])) { - $this->default_message_mask = $masks['message']; - }else{ - throw new MaskNotFoundException("Unknown mask provided: ".$masks['message']); - } - }else{ - $default_mask = $this->config->getMask("message"); - if($default_mask != ""){ - $this->default_message_mask = $default_mask; - }else{ - throw new MaskNotFoundException("Unknown message mask provided"); - } - } - if(isset($masks['attachment'])) { - if(class_exists($masks['attachment'])) { - $this->default_attachment_mask = $masks['attachment']; - }else{ - throw new MaskNotFoundException("Unknown mask provided: ". $masks['attachment']); - } - }else{ - $default_mask = $this->config->getMask("attachment"); - if($default_mask != ""){ - $this->default_attachment_mask = $default_mask; - }else{ - throw new MaskNotFoundException("Unknown attachment mask provided"); - } - } - }else{ - $default_mask = $this->config->getMask("message"); - if($default_mask != ""){ - $this->default_message_mask = $default_mask; - }else{ - throw new MaskNotFoundException("Unknown message mask provided"); - } - - $default_mask = $this->config->getMask("attachment"); - if($default_mask != ""){ - $this->default_attachment_mask = $default_mask; - }else{ - throw new MaskNotFoundException("Unknown attachment mask provided"); - } - } - } - - /** - * Get the current imap resource - * - * @return ProtocolInterface - * @throws ConnectionFailedException - * @throws AuthFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - * @throws ResponseException - */ - public function getConnection(): ProtocolInterface { - $this->checkConnection(); - return $this->connection; - } - - /** - * Determine if connection was established. - * - * @return bool - */ - public function isConnected(): bool { - return $this->connection && $this->connection->connected(); - } - - /** - * Determine if connection was established and connect if not. - * Returns true if the connection was closed and has been reopened. - * - * @throws ConnectionFailedException - * @throws AuthFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - * @throws ResponseException - */ - public function checkConnection(): bool { - try { - if (!$this->isConnected()) { - $this->connect(); - return true; - } - } catch (\Throwable) { - $this->connect(); - } - return false; - } - - /** - * Force the connection to reconnect - * - * @throws ConnectionFailedException - * @throws AuthFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - * @throws ResponseException - */ - public function reconnect(): void { - if ($this->isConnected()) { - $this->disconnect(); - } - $this->connect(); - } - - /** - * Connect to server. - * - * @return $this - * @throws ConnectionFailedException - * @throws AuthFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - * @throws ResponseException - */ - public function connect(): Client { - $this->disconnect(); - $protocol = strtolower($this->protocol); - - if (in_array($protocol, ['imap', 'imap4', 'imap4rev1'])) { - $this->connection = new ImapProtocol($this->config, $this->validate_cert, $this->encryption); - $this->connection->setConnectionTimeout($this->timeout); - $this->connection->setProxy($this->proxy); - $this->connection->setSslOptions($this->ssl_options); - }else{ - if (extension_loaded('imap') === false) { - throw new ConnectionFailedException("connection setup failed", 0, new ProtocolNotSupportedException($protocol." is an unsupported protocol")); - } - $this->connection = new LegacyProtocol($this->config, $this->validate_cert, $this->encryption); - if (str_starts_with($protocol, "legacy-")) { - $protocol = substr($protocol, 7); - } - $this->connection->setProtocol($protocol); - } - - if ($this->config->get('options.debug')) { - $this->connection->enableDebug(); - } - - if (!$this->config->get('options.uid_cache')) { - $this->connection->disableUidCache(); - } - - try { - $this->connection->connect($this->host, $this->port); - } catch (ErrorException|RuntimeException $e) { - throw new ConnectionFailedException("connection setup failed", 0, $e); - } - $this->authenticate(); - - return $this; - } - - /** - * Authenticate the current session - * - * @throws AuthFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws ResponseException - */ - protected function authenticate(): void { - if ($this->authentication == "oauth") { - if (!$this->connection->authenticate($this->username, $this->password)->validatedData()) { - throw new AuthFailedException(); - } - } elseif (!$this->connection->login($this->username, $this->password)->validatedData()) { - throw new AuthFailedException(); - } - } - - /** - * Disconnect from server. - * - * @return $this - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - */ - public function disconnect(): Client { - if ($this->isConnected()) { - $this->connection->logout(); - } - $this->active_folder = null; - - return $this; - } - - /** - * Get a folder instance by a folder name - * @param string $folder_name - * @param string|null $delimiter - * @param bool $utf7 - * @return Folder|null - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws ResponseException - * @throws RuntimeException - */ - public function getFolder(string $folder_name, ?string $delimiter = null, bool $utf7 = false): ?Folder { - // Set delimiter to false to force selection via getFolderByName (maybe useful for uncommon folder names) - $delimiter = is_null($delimiter) ? $this->config->get('options.delimiter', "/") : $delimiter; - - if (str_contains($folder_name, (string)$delimiter)) { - return $this->getFolderByPath($folder_name, $utf7); - } - - return $this->getFolderByName($folder_name); - } - - /** - * Get a folder instance by a folder name - * @param $folder_name - * @param bool $soft_fail If true, it will return null instead of throwing an exception - * - * @return Folder|null - * @throws FolderFetchingException - * @throws ConnectionFailedException - * @throws AuthFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - * @throws ResponseException - */ - public function getFolderByName($folder_name, bool $soft_fail = false): ?Folder { - return $this->getFolders(false, null, $soft_fail)->where("name", $folder_name)->first(); - } - - /** - * Get a folder instance by a folder path - * @param $folder_path - * @param bool $utf7 - * @param bool $soft_fail If true, it will return null instead of throwing an exception - * - * @return Folder|null - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws ResponseException - * @throws RuntimeException - */ - public function getFolderByPath($folder_path, bool $utf7 = false, bool $soft_fail = false): ?Folder { - if (!$utf7) $folder_path = EncodingAliases::convert($folder_path, "utf-8", "utf7-imap"); - return $this->getFolders(false, null, $soft_fail)->where("path", $folder_path)->first(); - } - - /** - * Get folders list. - * If hierarchical order is set to true, it will make a tree of folders, otherwise it will return flat array. - * - * @param boolean $hierarchical - * @param string|null $parent_folder - * @param bool $soft_fail If true, it will return an empty collection instead of throwing an exception - * - * @return FolderCollection - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws ResponseException - * @throws RuntimeException - */ - public function getFolders(bool $hierarchical = true, ?string $parent_folder = null, bool $soft_fail = false): FolderCollection { - $this->checkConnection(); - $folders = FolderCollection::make([]); - - $pattern = $parent_folder.($hierarchical ? '%' : '*'); - $items = $this->connection->folders('', $pattern)->validatedData(); - - if(!empty($items)){ - foreach ($items as $folder_name => $item) { - $folder = new Folder($this, $folder_name, $item["delimiter"], $item["flags"]); - - if ($hierarchical && $folder->hasChildren()) { - $pattern = $folder->path.$folder->delimiter.'%'; - - $children = $this->getFolders(true, $pattern, true); - $folder->setChildren($children); - } - - $folders->push($folder); - } - - return $folders; - }else if (!$soft_fail){ - throw new FolderFetchingException("failed to fetch any folders"); - } - - return $folders; - } - - /** - * Get folders list. - * If hierarchical order is set to true, it will make a tree of folders, otherwise it will return flat array. - * - * @param boolean $hierarchical - * @param string|null $parent_folder - * @param bool $soft_fail If true, it will return an empty collection instead of throwing an exception - * - * @return FolderCollection - * @throws FolderFetchingException - * @throws ConnectionFailedException - * @throws AuthFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - * @throws ResponseException - */ - public function getFoldersWithStatus(bool $hierarchical = true, ?string $parent_folder = null, bool $soft_fail = false): FolderCollection { - $this->checkConnection(); - $folders = FolderCollection::make([]); - - $pattern = $parent_folder.($hierarchical ? '%' : '*'); - $items = $this->connection->folders('', $pattern)->validatedData(); - - if(!empty($items)){ - foreach ($items as $folder_name => $item) { - $folder = new Folder($this, $folder_name, $item["delimiter"], $item["flags"]); - - if ($hierarchical && $folder->hasChildren()) { - $pattern = $folder->path.$folder->delimiter.'%'; - - $children = $this->getFoldersWithStatus(true, $pattern, true); - $folder->setChildren($children); - } - - $folder->loadStatus(); - $folders->push($folder); - } - - return $folders; - }else if (!$soft_fail){ - throw new FolderFetchingException("failed to fetch any folders"); - } - - return $folders; - } - - /** - * Open a given folder. - * @param string $folder_path - * @param boolean $force_select - * - * @return array - * @throws ConnectionFailedException - * @throws AuthFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - * @throws ResponseException - */ - public function openFolder(string $folder_path, bool $force_select = false): array { - if ($this->active_folder == $folder_path && $this->isConnected() && $force_select === false) { - return []; - } - $this->checkConnection(); - $this->active_folder = $folder_path; - return $this->connection->selectFolder($folder_path)->validatedData(); - } - - /** - * Set active folder - * @param string|null $folder_path - * - * @return void - */ - public function setActiveFolder(?string $folder_path = null): void { - $this->active_folder = $folder_path; - } - - /** - * Get active folder - * - * @return string|null - */ - public function getActiveFolder(): ?string { - return $this->active_folder; - } - - /** - * Create a new Folder - * @param string $folder_path - * @param boolean $expunge - * @param bool $utf7 - * @return Folder - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws ResponseException - * @throws RuntimeException - */ - public function createFolder(string $folder_path, bool $expunge = true, bool $utf7 = false): Folder { - $this->checkConnection(); - - if (!$utf7) $folder_path = EncodingAliases::convert($folder_path, "utf-8", "UTF7-IMAP"); - - $status = $this->connection->createFolder($folder_path)->validatedData(); - - if($expunge) $this->expunge(); - - $folder = $this->getFolderByPath($folder_path, true); - if($status && $folder) { - $this->dispatch("folder", "new", $folder); - } - - return $folder; - } - - /** - * Delete a given folder - * @param string $folder_path - * @param boolean $expunge - * - * @return array - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - * @throws ResponseException - */ - public function deleteFolder(string $folder_path, bool $expunge = true): array { - $this->checkConnection(); - - $folder = $this->getFolderByPath($folder_path); - if ($this->active_folder == $folder->path){ - $this->active_folder = null; - } - $status = $this->getConnection()->deleteFolder($folder->path)->validatedData(); - if ($expunge) $this->expunge(); - - $this->dispatch("folder", "deleted", $folder); - - return $status; - } - - /** - * Check a given folder - * @param string $folder_path - * - * @return array - * @throws ConnectionFailedException - * @throws AuthFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - * @throws ResponseException - */ - public function checkFolder(string $folder_path): array { - $this->checkConnection(); - return $this->connection->examineFolder($folder_path)->validatedData(); - } - - /** - * Get the current active folder - * - * @return null|string - */ - public function getFolderPath(): ?string { - return $this->active_folder; - } - - /** - * Exchange identification information - * Ref.: https://datatracker.ietf.org/doc/html/rfc2971 - * - * @param array|null $ids - * @return array - * - * @throws ConnectionFailedException - * @throws AuthFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - * @throws ResponseException - */ - public function Id(?array $ids = null): array { - $this->checkConnection(); - return $this->connection->ID($ids)->validatedData(); - } - - /** - * Retrieve the quota level settings, and usage statics per mailbox - * - * @return array - * @throws ConnectionFailedException - * @throws AuthFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - * @throws ResponseException - */ - public function getQuota(): array { - $this->checkConnection(); - return $this->connection->getQuota($this->username)->validatedData(); - } - - /** - * Retrieve the quota settings per user - * @param string $quota_root - * - * @return array - * @throws ConnectionFailedException - * @throws AuthFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - * @throws ResponseException - */ - public function getQuotaRoot(string $quota_root = 'INBOX'): array { - $this->checkConnection(); - return $this->connection->getQuotaRoot($quota_root)->validatedData(); - } - - /** - * Delete all messages marked for deletion - * - * @return array - * @throws ConnectionFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - * @throws AuthFailedException - * @throws ResponseException - */ - public function expunge(): array { - $this->checkConnection(); - return $this->connection->expunge()->validatedData(); - } - - /** - * Set the connection timeout - * @param integer $timeout - * - * @return ProtocolInterface - * @throws ConnectionFailedException - * @throws AuthFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - * @throws ResponseException - */ - public function setTimeout(int $timeout): ProtocolInterface { - $this->timeout = $timeout; - if ($this->isConnected()) { - $this->connection->setConnectionTimeout($timeout); - $this->reconnect(); - } - return $this->connection; - } - - /** - * Get the connection timeout - * - * @return int - * @throws ConnectionFailedException - * @throws AuthFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - * @throws ResponseException - */ - public function getTimeout(): int { - $this->checkConnection(); - return $this->connection->getConnectionTimeout(); - } - - /** - * Get the default message mask - * - * @return string - */ - public function getDefaultMessageMask(): string { - return $this->default_message_mask; - } - - /** - * Get the default events for a given section - * @param $section - * - * @return array - */ - public function getDefaultEvents($section): array { - if (isset($this->events[$section])) { - return is_array($this->events[$section]) ? $this->events[$section] : []; - } - return []; - } - - /** - * Set the default message mask - * @param string $mask - * - * @return $this - * @throws MaskNotFoundException - */ - public function setDefaultMessageMask(string $mask): Client { - if(class_exists($mask)) { - $this->default_message_mask = $mask; - - return $this; - } - - throw new MaskNotFoundException("Unknown mask provided: ".$mask); - } - - /** - * Get the default attachment mask - * - * @return string - */ - public function getDefaultAttachmentMask(): string { - return $this->default_attachment_mask; - } - - /** - * Set the default attachment mask - * @param string $mask - * - * @return $this - * @throws MaskNotFoundException - */ - public function setDefaultAttachmentMask(string $mask): Client { - if(class_exists($mask)) { - $this->default_attachment_mask = $mask; - - return $this; - } - - throw new MaskNotFoundException("Unknown mask provided: ".$mask); - } -} diff --git a/plugins/vendor/webklex/php-imap/src/ClientManager.php b/plugins/vendor/webklex/php-imap/src/ClientManager.php deleted file mode 100644 index 6f66886b..00000000 --- a/plugins/vendor/webklex/php-imap/src/ClientManager.php +++ /dev/null @@ -1,131 +0,0 @@ -setConfig($config); - } - - /** - * Dynamically pass calls to the default account. - * @param string $method - * @param array $parameters - * - * @return mixed - * @throws Exceptions\MaskNotFoundException - */ - public function __call(string $method, array $parameters) { - $callable = [$this->account(), $method]; - - return call_user_func_array($callable, $parameters); - } - - /** - * Safely create a new client instance which is not listed in accounts - * @param array $config - * - * @return Client - * @throws Exceptions\MaskNotFoundException - */ - public function make(array $config): Client { - $name = $this->config->getDefaultAccount(); - $clientConfig = $this->config->all(); - $clientConfig["accounts"] = [$name => $config]; - return new Client(Config::make($clientConfig)); - } - - /** - * Resolve a account instance. - * @param string|null $name - * - * @return Client - * @throws Exceptions\MaskNotFoundException - */ - public function account(?string $name = null): Client { - $name = $name ?: $this->config->getDefaultAccount(); - - // If the connection has not been resolved we will resolve it now as all - // the connections are resolved when they are actually needed, so we do - // not make any unnecessary connection to the various queue end-points. - if (!isset($this->accounts[$name])) { - $this->accounts[$name] = $this->resolve($name); - } - - return $this->accounts[$name]; - } - - /** - * Resolve an account. - * @param string $name - * - * @return Client - * @throws Exceptions\MaskNotFoundException - */ - protected function resolve(string $name): Client { - $config = $this->config->getClientConfig($name); - - return new Client($config); - } - - - /** - * Merge the vendor settings with the local config - * - * The default account identifier will be used as default for any missing account parameters. - * If however the default account is missing a parameter the package default account parameter will be used. - * This can be disabled by setting imap.default in your config file to 'false' - * - * @param array|string|Config $config - * - * @return $this - */ - public function setConfig(array|string|Config $config): ClientManager { - if (!$config instanceof Config) { - $config = Config::make($config); - } - $this->config = $config; - - return $this; - } - - /** - * Get the config instance - * @return Config - */ - public function getConfig(): Config { - return $this->config; - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/src/Config.php b/plugins/vendor/webklex/php-imap/src/Config.php deleted file mode 100644 index f2f1a174..00000000 --- a/plugins/vendor/webklex/php-imap/src/Config.php +++ /dev/null @@ -1,295 +0,0 @@ -config = $config; - } - - /** - * Get a dotted config parameter - * @param string $key - * @param null $default - * - * @return mixed|null - */ - public function get(string $key, $default = null): mixed { - $parts = explode('.', $key); - $value = null; - foreach ($parts as $part) { - if ($value === null) { - if (isset($this->config[$part])) { - $value = $this->config[$part]; - } else { - break; - } - } else { - if (isset($value[$part])) { - $value = $value[$part]; - } else { - break; - } - } - } - - return $value === null ? $default : $value; - } - - /** - * Set a dotted config parameter - * @param string $key - * @param string|array|mixed$value - * - * @return void - */ - public function set(string $key, mixed $value): void { - $parts = explode('.', $key); - $config = &$this->config; - - foreach ($parts as $part) { - if (!isset($config[$part])) { - $config[$part] = []; - } - $config = &$config[$part]; - } - - if(is_array($config) && is_array($value)){ - $config = array_merge($config, $value); - }else{ - $config = $value; - } - } - - /** - * Get the decoder for a given name - * @param $name string Decoder name - * - * @return DecoderInterface - * @throws DecoderNotFoundException - */ - public function getDecoder(string $name): DecoderInterface { - $default_decoders = $this->get('decoding.decoder', [ - 'header' => \Webklex\PHPIMAP\Decoder\HeaderDecoder::class, - 'message' => \Webklex\PHPIMAP\Decoder\MessageDecoder::class, - 'attachment' => \Webklex\PHPIMAP\Decoder\AttachmentDecoder::class - ]); - $options = $this->get('decoding.options', [ - 'header' => 'utf-8', - 'message' => 'utf-8', - 'attachment' => 'utf-8', - ]); - if (isset($default_decoders[$name])) { - if (class_exists($default_decoders[$name])) { - return new $default_decoders[$name]($options); - } - } - throw new DecoderNotFoundException(); - } - - /** - * Get the mask for a given section - * @param string $section section name such as "message" or "attachment" - * - * @return string|null - */ - public function getMask(string $section): ?string { - $default_masks = $this->get('masks', []); - if (isset($default_masks[$section])) { - if (class_exists($default_masks[$section])) { - return $default_masks[$section]; - } - } - return null; - } - - /** - * Get the account configuration. - * @param string|null $name - * - * @return self - */ - public function getClientConfig(?string $name): self { - $config = $this->all(); - $defaultName = $this->getDefaultAccount(); - $defaultAccount = $this->get('accounts.'.$defaultName, []); - - if ($name === null || $name === 'null' || $name === "") { - $account = $defaultAccount; - $name = $defaultName; - }else{ - $account = $this->get('accounts.'.$name, $defaultAccount); - } - - $config["default"] = $name; - $config["accounts"] = [ - $name => $account - ]; - - return new self($config); - } - - /** - * Get the name of the default account. - * - * @return string - */ - public function getDefaultAccount(): string { - return $this->get('default', 'default'); - } - - /** - * Set the name of the default account. - * @param string $name - * - * @return void - */ - public function setDefaultAccount(string $name): void { - $this->set('default', $name); - } - - /** - * Create a new instance of the Config class - * @param array|string $config - * @return Config - */ - public static function make(array|string $config = []): Config { - if (is_array($config) === false) { - $config = require $config; - } - - $config_key = 'imap'; - $path = __DIR__ . '/config/' . $config_key . '.php'; - - $vendor_config = require $path; - $config = self::array_merge_recursive_distinct($vendor_config, $config); - - if (isset($config['default'])) { - if (isset($config['accounts']) && $config['default']) { - - $default_config = $vendor_config['accounts']['default']; - if (isset($config['accounts'][$config['default']])) { - $default_config = array_merge($default_config, $config['accounts'][$config['default']]); - } - - if (is_array($config['accounts'])) { - foreach ($config['accounts'] as $account_key => $account) { - $config['accounts'][$account_key] = array_merge($default_config, $account); - } - } - } - } - - return new self($config); - } - - /** - * Marge arrays recursively and distinct - * - * Merges any number of arrays / parameters recursively, replacing - * entries with string keys with values from latter arrays. - * If the entry or the next value to be assigned is an array, then it - * automatically treats both arguments as an array. - * Numeric entries are appended, not replaced, but only if they are - * unique - * - * @return array - * - * @link http://www.php.net/manual/en/function.array-merge-recursive.php#96201 - * @author Mark Roduner - */ - private static function array_merge_recursive_distinct(): array { - $arrays = func_get_args(); - $base = array_shift($arrays); - - // From https://stackoverflow.com/a/173479 - $isAssoc = function(array $arr) { - if (array() === $arr) return false; - return array_keys($arr) !== range(0, count($arr) - 1); - }; - - if (!is_array($base)) $base = empty($base) ? array() : array($base); - - foreach ($arrays as $append) { - if (!is_array($append)) $append = array($append); - - foreach ($append as $key => $value) { - - if (!array_key_exists($key, $base) and !is_numeric($key)) { - $base[$key] = $value; - continue; - } - - if ((is_array($value) && $isAssoc($value)) || (is_array($base[$key]) && $isAssoc($base[$key]))) { - // If the arrays are not associates we don't want to array_merge_recursive_distinct - // else merging $baseConfig['dispositions'] = ['attachment', 'inline'] with $customConfig['dispositions'] = ['attachment'] - // results in $resultConfig['dispositions'] = ['attachment', 'inline'] - $base[$key] = self::array_merge_recursive_distinct($base[$key], $value); - } else if (is_numeric($key)) { - if (!in_array($value, $base)) $base[] = $value; - } else { - $base[$key] = $value; - } - - } - - } - - return $base; - } - - /** - * Get all configuration values - * @return array - */ - public function all(): array { - return $this->config; - } - - /** - * Check if a configuration value exists - * @param string $key - * @return bool - */ - public function has(string $key): bool { - return $this->get($key) !== null; - } - - /** - * Remove all configuration values - * @return $this - */ - public function clear(): static { - $this->config = []; - return $this; - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/src/Connection/Protocols/ImapProtocol.php b/plugins/vendor/webklex/php-imap/src/Connection/Protocols/ImapProtocol.php deleted file mode 100644 index ed1dac6e..00000000 --- a/plugins/vendor/webklex/php-imap/src/Connection/Protocols/ImapProtocol.php +++ /dev/null @@ -1,1485 +0,0 @@ -config = $config; - $this->setCertValidation($cert_validation); - $this->encryption = $encryption; - } - - /** - * Handle the class destruction / tear down - */ - public function __destruct() { - $this->logout(); - } - - /** - * Open connection to IMAP server - * @param string $host hostname or IP address of IMAP server - * @param int|null $port of IMAP server, default is 143 and 993 for ssl - * - * @throws ConnectionFailedException - */ - public function connect(string $host, ?int $port = null): bool { - $transport = 'tcp'; - $encryption = ''; - - if ($this->encryption) { - $encryption = strtolower($this->encryption); - if (in_array($encryption, ['ssl', 'tls'])) { - $transport = $encryption; - $port = $port === null ? 993 : $port; - } - } - $port = $port === null ? 143 : $port; - try { - $response = new Response(0, $this->debug); - $this->stream = $this->createStream($transport, $host, $port, $this->connection_timeout); - if (!$this->stream || !$this->assumedNextLine($response, '* OK')) { - throw new ConnectionFailedException('connection refused'); - } - if ($encryption == 'starttls') { - $this->enableStartTls(); - } - } catch (Exception $e) { - throw new ConnectionFailedException('connection failed', 0, $e); - } - return true; - } - - /** - * Check if the current session is connected - * - * @return bool - * @throws ImapBadRequestException - */ - public function connected(): bool { - if ((bool)$this->stream) { - try { - $this->requestAndResponse('NOOP'); - return true; - } catch (ImapServerErrorException|RuntimeException) { - return false; - } - } - return false; - } - - /** - * Enable tls on the current connection - * - * @throws ConnectionFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - */ - protected function enableStartTls(): void { - $response = $this->requestAndResponse('STARTTLS'); - $result = $response->successful() && stream_socket_enable_crypto($this->stream, true, $this->getCryptoMethod()); - if (!$result) { - throw new ConnectionFailedException('failed to enable TLS'); - } - } - - /** - * Get the next line from stream - * - * @return string next line - * @throws RuntimeException - */ - public function nextLine(Response $response): string { - $line = ""; - while (($next_char = fread($this->stream, 1)) !== false && !in_array($next_char, ["", "\n"])) { - $line .= $next_char; - } - if ($line === "" && ($next_char === false || $next_char === "")) { - throw new RuntimeException('empty response'); - } - $line .= "\n"; - $response->addResponse($line); - if ($this->debug) echo "<< " . $line; - return $line; - } - - /** - * Get the next line and check if it starts with a given string - * @param Response $response - * @param string $start - * - * @return bool - * @throws RuntimeException - */ - protected function assumedNextLine(Response $response, string $start): bool { - return str_starts_with($this->nextLine($response), $start); - } - - /** - * Get the next line and check if it starts with a given string - * The server can send untagged status updates starting with '*' if we are not looking for a status update, - * the untagged lines will be ignored. - * - * @param Response $response - * @param string $start - * - * @return bool - * @throws RuntimeException - */ - protected function assumedNextLineIgnoreUntagged(Response $response, string $start): bool { - do { - $line = $this->nextLine($response); - } while (!(str_starts_with($start, '*')) && $this->isUntaggedLine($line)); - - return str_starts_with($line, $start); - } - - /** - * Get the next line and split the tag - * @param string|null $tag reference tag - * - * @return string next line - * @throws RuntimeException - */ - protected function nextTaggedLine(Response $response, ?string &$tag): string { - $line = $this->nextLine($response); - if (str_contains($line, ' ')) { - list($tag, $line) = explode(' ', $line, 2); - } - - return $line ?? ''; - } - - /** - * Get the next line and split the tag - * The server can send untagged status updates starting with '*', the untagged lines will be ignored. - * - * @param string|null $tag reference tag - * - * @return string next line - * @throws RuntimeException - */ - protected function nextTaggedLineIgnoreUntagged(Response $response, &$tag): string { - do { - $line = $this->nextLine($response); - } while ($this->isUntaggedLine($line)); - - list($tag, $line) = explode(' ', $line, 2); - - return $line; - } - - /** - * Get the next line and check if it contains a given string and split the tag - * @param Response $response - * @param string $start - * @param $tag - * - * @return bool - * @throws RuntimeException - */ - protected function assumedNextTaggedLine(Response $response, string $start, &$tag): bool { - return str_contains($this->nextTaggedLine($response, $tag), $start); - } - - /** - * Get the next line and check if it contains a given string and split the tag - * @param string $start - * @param $tag - * - * @return bool - * @throws RuntimeException - */ - protected function assumedNextTaggedLineIgnoreUntagged(Response $response, string $start, &$tag): bool { - $line = $this->nextTaggedLineIgnoreUntagged($response, $tag); - return strpos($line, $start) !== false; - } - - /** - * RFC3501 - 2.2.2 - * Data transmitted by the server to the client and status responses - * that do not indicate command completion are prefixed with the token - * "*", and are called untagged responses. - * - * @param string $line - * @return bool - */ - protected function isUntaggedLine(string $line) : bool { - return str_starts_with($line, '* '); - } - - /** - * Split a given line in values. A value is literal of any form or a list - * @param Response $response - * @param string $line - * - * @return array - * @throws RuntimeException - */ - protected function decodeLine(Response $response, string $line): array { - $tokens = []; - $stack = []; - - // replace any trailing including spaces with a single space - $line = rtrim($line) . ' '; - while (($pos = strpos($line, ' ')) !== false) { - $token = substr($line, 0, $pos); - if (!strlen($token)) { - $line = substr($line, $pos + 1); - continue; - } - while ($token[0] == '(') { - $stack[] = $tokens; - $tokens = []; - $token = substr($token, 1); - } - if ($token[0] == '"') { - if (preg_match('%^\(*\"((.|\\\|\")*?)\"( |$)%', $line, $matches)) { - $tokens[] = $matches[1]; - $line = substr($line, strlen($matches[0])); - continue; - } - } - if ($token[0] == '{') { - $endPos = strpos($token, '}'); - $chars = substr($token, 1, $endPos - 1); - if (is_numeric($chars)) { - $token = ''; - while (strlen($token) < $chars) { - $token .= $this->nextLine($response); - } - $line = ''; - if (strlen($token) > $chars) { - $line = substr($token, $chars); - $token = substr($token, 0, $chars); - } else { - $line .= $this->nextLine($response); - } - $tokens[] = $token; - $line = trim($line) . ' '; - continue; - } - } - if ($stack && $token[strlen($token) - 1] == ')') { - // closing braces are not separated by spaces, so we need to count them - $braces = strlen($token); - $token = rtrim($token, ')'); - // only count braces if more than one - $braces -= strlen($token) + 1; - // only add if token had more than just closing braces - if (rtrim($token) != '') { - $tokens[] = rtrim($token); - } - $token = $tokens; - $tokens = array_pop($stack); - // special handling if more than one closing brace - while ($braces-- > 0) { - $tokens[] = $token; - $token = $tokens; - $tokens = array_pop($stack); - } - } - $tokens[] = $token; - $line = substr($line, $pos + 1); - } - - // maybe the server forgot to send some closing braces - while ($stack) { - $child = $tokens; - $tokens = array_pop($stack); - $tokens[] = $child; - } - - return $tokens; - } - - /** - * Read abd decode a response "line" - * @param Response $response - * @param array|string $tokens to decode - * @param string $wantedTag targeted tag - * @param bool $dontParse if true only the unparsed line is returned in $tokens - * - * @return bool - * @throws RuntimeException - */ - public function readLine(Response $response, array|string &$tokens = [], string $wantedTag = '*', bool $dontParse = false): bool { - $line = $this->nextTaggedLine($response, $tag); // get next tag - if (!$dontParse) { - $tokens = $this->decodeLine($response, $line); - } else { - $tokens = $line; - } - - // if tag is wanted tag we might be at the end of a multiline response - return $tag == $wantedTag; - } - - /** - * Read all lines of response until given tag is found - * @param Response $response - * @param string $tag request tag - * @param bool $dontParse if true every line is returned unparsed instead of the decoded tokens - * - * @return array - * - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - */ - public function readResponse(Response $response, string $tag, bool $dontParse = false): array { - $lines = []; - $tokens = ""; // define $tokens variable before first use - do { - $readAll = $this->readLine($response, $tokens, $tag, $dontParse); - $lines[] = $tokens; - } while (!$readAll); - - $original = $tokens; - if ($dontParse) { - // First two chars are still needed for the response code - $tokens = [trim(substr($tokens, 0, 3))]; - } - - $original = is_array($original) ? $original : [$original]; - - - // last line has response code - if ($tokens[0] == 'OK') { - return $lines ?: [true]; - } elseif ($tokens[0] == 'NO' || $tokens[0] == 'BAD' || $tokens[0] == 'BYE') { - throw new ImapServerErrorException($this->stringifyArray($original)); - } - - throw new ImapBadRequestException($this->stringifyArray($original)); - } - - /** - * Convert an array to a string - * @param array $arr array to stringify - * - * @return string stringified array - */ - private function stringifyArray(array $arr): string { - $string = ""; - foreach ($arr as $value) { - if (is_array($value)) { - $string .= "(" . $this->stringifyArray($value) . ")"; - } else { - $string .= $value . " "; - } - } - return $string; - } - - /** - * Send a new request - * @param string $command - * @param array $tokens additional parameters to command, use escapeString() to prepare - * @param string|null $tag provide a tag otherwise an autogenerated is returned - * - * @return Response - * @throws RuntimeException - */ - public function sendRequest(string $command, array $tokens = [], ?string &$tag = null): Response { - if (!$tag) { - $this->noun++; - $tag = 'TAG' . $this->noun; - } - - $line = $tag . ' ' . $command; - - $response = new Response($this->noun, $this->debug); - - foreach ($tokens as $token) { - if (is_array($token)) { - $this->write($response, $line . ' ' . $token[0]); - if (!$this->assumedNextLine($response, '+ ')) { - throw new RuntimeException('failed to send literal string'); - } - $line = $token[1]; - } else { - $line .= ' ' . $token; - } - } - $this->write($response, $line); - - return $response; - } - - /** - * Write data to the current stream - * @param Response $response - * @param string $data - * - * @return void - * @throws RuntimeException - */ - public function write(Response $response, string $data): void { - $command = $data . "\r\n"; - if ($this->debug) echo ">> " . $command . "\n"; - - $response->addCommand($command); - - if (fwrite($this->stream, $command) === false) { - throw new RuntimeException('failed to write - connection closed?'); - } - } - - /** - * Send a request and get response at once - * - * @param string $command - * @param array $tokens parameters as in sendRequest() - * @param bool $dontParse if true unparsed lines are returned instead of tokens - * - * @return Response response as in readResponse() - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - */ - public function requestAndResponse(string $command, array $tokens = [], bool $dontParse = false): Response { - $response = $this->sendRequest($command, $tokens, $tag); - $response->setResult($this->readResponse($response, $tag, $dontParse)); - - return $response; - } - - /** - * Escape one or more literals i.e. for sendRequest - * @param array|string $string the literal/-s - * - * @return string|array escape literals, literals with newline ar returned - * as array('{size}', 'string'); - */ - public function escapeString(array|string $string): array|string { - if (func_num_args() < 2) { - if (str_contains($string, "\n")) { - return ['{' . strlen($string) . '}', $string]; - } else { - return '"' . str_replace(['\\', '"'], ['\\\\', '\\"'], $string) . '"'; - } - } - $result = []; - foreach (func_get_args() as $string) { - $result[] = $this->escapeString($string); - } - return $result; - } - - /** - * Escape a list with literals or lists - * @param array $list list with literals or lists as PHP array - * - * @return string escaped list for imap - */ - public function escapeList(array $list): string { - $result = []; - foreach ($list as $v) { - if (!is_array($v)) { - $result[] = $v; - continue; - } - $result[] = $this->escapeList($v); - } - return '(' . implode(' ', $result) . ')'; - } - - /** - * Login to a new session. - * - * @param string $user username - * @param string $password password - * - * @return Response - * @throws AuthFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - */ - public function login(string $user, string $password): Response { - try { - $command = 'LOGIN'; - $params = $this->escapeString($user, $password); - - return $this->requestAndResponse($command, $params, true); - } catch (RuntimeException $e) { - throw new AuthFailedException("failed to authenticate", 0, $e); - } - } - - /** - * Authenticate your current IMAP session. - * @param string $user username - * @param string $token access token - * - * @return Response - * @throws AuthFailedException - */ - public function authenticate(string $user, string $token): Response { - try { - $authenticateParams = ['XOAUTH2', base64_encode("user=$user\1auth=Bearer $token\1\1")]; - $response = $this->sendRequest('AUTHENTICATE', $authenticateParams); - - while (true) { - $tokens = ""; - $is_plus = $this->readLine($response, $tokens, '+', true); - if ($is_plus) { - // try to log the challenge somewhere where it can be found - error_log("got an extra server challenge: $tokens"); - // respond with an empty response. - $response->stack($this->sendRequest('')); - } else { - if (preg_match('/^NO /i', $tokens) || - preg_match('/^BAD /i', $tokens)) { - error_log("got failure response: $tokens"); - return $response->addError("got failure response: $tokens"); - } else if (preg_match("/^OK /i", $tokens)) { - return $response->setResult(is_array($tokens) ? $tokens : [$tokens]); - } - } - } - } catch (RuntimeException $e) { - throw new AuthFailedException("failed to authenticate", 0, $e); - } - } - - /** - * Logout of imap server - * - * @return Response - */ - public function logout(): Response { - if (!$this->stream) { - $this->reset(); - return new Response(0, $this->debug); - } elseif ($this->meta()["timed_out"]) { - $this->reset(); - return new Response(0, $this->debug); - } - - $result = null; - try { - $result = $this->requestAndResponse('LOGOUT', [], true); - fclose($this->stream); - } catch (Throwable) { - } - - $this->reset(); - - return $result ?? new Response(0, $this->debug); - } - - /** - * Reset the current stream and uid cache - * - * @return void - */ - public function reset(): void { - $this->stream = null; - $this->uid_cache = []; - } - - /** - * Get an array of available capabilities - * - * @return Response list of capabilities - * - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - * @throws ResponseException - */ - public function getCapabilities(): Response { - $response = $this->requestAndResponse('CAPABILITY'); - - if (!$response->getResponse()) return $response; - - return $response->setResult($response->validatedData()[0]); - } - - /** - * Examine and select have the same response. - * @param string $command can be 'EXAMINE' or 'SELECT' - * @param string $folder target folder - * - * @return Response - * @throws RuntimeException - */ - public function examineOrSelect(string $command = 'EXAMINE', string $folder = 'INBOX'): Response { - $response = $this->sendRequest($command, [$this->escapeString($folder)], $tag); - - $result = []; - $tokens = []; // define $tokens variable before first use - while (!$this->readLine($response, $tokens, $tag)) { - if ($tokens[0] == 'FLAGS') { - array_shift($tokens); - $result['flags'] = $tokens; - continue; - } - switch ($tokens[1]) { - case 'EXISTS': - case 'RECENT': - $result[strtolower($tokens[1])] = (int)$tokens[0]; - break; - case '[UIDVALIDITY': - $result['uidvalidity'] = (int)$tokens[2]; - break; - case '[UIDNEXT': - $result['uidnext'] = (int)$tokens[2]; - break; - case '[UNSEEN': - $result['unseen'] = (int)$tokens[2]; - break; - case '[NONEXISTENT]': - throw new RuntimeException("folder doesn't exist"); - default: - // ignore - break; - } - } - - $response->setResult($result); - - if ($tokens[0] != 'OK') { - $response->addError("request failed"); - } - return $response; - } - - /** - * Change the current folder - * @param string $folder change to this folder - * - * @return Response see examineOrSelect() - * @throws RuntimeException - */ - public function selectFolder(string $folder = 'INBOX'): Response { - $this->uid_cache = []; - - return $this->examineOrSelect('SELECT', $folder); - } - - /** - * Examine a given folder - * @param string $folder examine this folder - * - * @return Response see examineOrSelect() - * @throws RuntimeException - */ - public function examineFolder(string $folder = 'INBOX'): Response { - return $this->examineOrSelect('EXAMINE', $folder); - } - - /** - * Get the status of a given folder - * - * @param string $folder - * @param string[] $arguments - * @return Response list of STATUS items - * - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws ResponseException - * @throws RuntimeException - */ - public function folderStatus(string $folder = 'INBOX', $arguments = ['MESSAGES', 'UNSEEN', 'RECENT', 'UIDNEXT', 'UIDVALIDITY']): Response { - $response = $this->requestAndResponse('STATUS', [$this->escapeString($folder), $this->escapeList($arguments)]); - $data = $response->validatedData(); - - if (!isset($data[0]) || !isset($data[0][2])) { - throw new RuntimeException("folder status could not be fetched"); - } - - $result = []; - $key = null; - foreach ($data[0][2] as $value) { - if ($key === null) { - $key = $value; - } else { - $result[strtolower($key)] = (int)$value; - $key = null; - } - } - - $response->setResult($result); - - return $response; - } - - /** - * Fetch one or more items of one or more messages - * @param array|string $items items to fetch [RFC822.HEADER, FLAGS, RFC822.TEXT, etc] - * @param array|int $from message for items or start message if $to !== null - * @param int|null $to if null only one message ($from) is fetched, else it's the - * last message, INF means last message available - * @param int|string $uid set to IMAP::ST_UID or any string representing the UID - set to IMAP::ST_MSGN to use - * message numbers instead. - * - * @return Response if only one item of one message is fetched it's returned as string - * if items of one message are fetched it's returned as (name => value) - * if one item of messages are fetched it's returned as (msgno => value) - * if items of messages are fetched it's returned as (msgno => (name => value)) - * @throws RuntimeException - */ - public function fetch(array|string $items, array|int $from, mixed $to = null, int|string $uid = IMAP::ST_UID): Response { - if (is_array($from) && count($from) > 1) { - $set = implode(',', $from); - } elseif (is_array($from) && count($from) === 1) { - $from = array_values($from); - $set = $from[0] . ':' . $from[0]; - } elseif ($to === null) { - $set = $from . ':' . $from; - } elseif ($to == INF) { - $set = $from . ':*'; - } else { - $set = $from . ':' . (int)$to; - } - - $items = (array)$items; - $itemList = $this->escapeList($items); - - $response = $this->sendRequest($this->buildUIDCommand("FETCH", $uid), [$set, $itemList], $tag); - $result = []; - $tokens = []; // define $tokens variable before first use - while (!$this->readLine($response, $tokens, $tag)) { - // ignore other responses - if ($tokens[1] != 'FETCH') { - continue; - } - - $uidKey = 0; - $data = []; - - // find array key of UID value; try the last elements, or search for it - if ($uid === IMAP::ST_UID) { - $count = count($tokens[2]); - if ($tokens[2][$count - 2] == 'UID') { - $uidKey = $count - 1; - } else if ($tokens[2][0] == 'UID') { - $uidKey = 1; - } else { - $found = array_search('UID', $tokens[2]); - if ($found === false || $found === -1) { - continue; - } - - $uidKey = $found + 1; - } - } - - // ignore other messages - if ($to === null && !is_array($from) && ($uid === IMAP::ST_UID ? $tokens[2][$uidKey] != $from : $tokens[0] != $from)) { - continue; - } - - // if we only want one item we return that one directly - if (count($items) == 1) { - if ($tokens[2][0] == $items[0]) { - $data = $tokens[2][1]; - } elseif ($uid === IMAP::ST_UID && $tokens[2][2] == $items[0]) { - $data = $tokens[2][3]; - } else { - $expectedResponse = 0; - // maybe the server send another field we didn't wanted - $count = count($tokens[2]); - // we start with 2, because 0 was already checked - for ($i = 2; $i < $count; $i += 2) { - if ($tokens[2][$i] != $items[0]) { - continue; - } - $data = $tokens[2][$i + 1]; - $expectedResponse = 1; - break; - } - if (!$expectedResponse) { - continue; - } - } - } else { - while (key($tokens[2]) !== null) { - $data[current($tokens[2])] = next($tokens[2]); - next($tokens[2]); - } - } - - // if we want only one message we can ignore everything else and just return - if ($to === null && !is_array($from) && ($uid === IMAP::ST_UID ? $tokens[2][$uidKey] == $from : $tokens[0] == $from)) { - // we still need to read all lines - if (!$this->readLine($response, $tokens, $tag)) - return $response->setResult($data); - } - if ($uid === IMAP::ST_UID) { - $result[$tokens[2][$uidKey]] = $data; - } else { - $result[$tokens[0]] = $data; - } - } - - if ($to === null && !is_array($from)) { - throw new RuntimeException('the single id was not found in response'); - } - - return $response->setResult($result); - } - - /** - * Fetch message body (without headers) - * @param int|array $uids - * @param string $rfc - * @param int|string $uid set to IMAP::ST_UID or any string representing the UID - set to IMAP::ST_MSGN to use - * message numbers instead. - * - * @return Response - * @throws RuntimeException - */ - public function content(int|array $uids, string $rfc = "RFC822", int|string $uid = IMAP::ST_UID): Response { - $rfc = $rfc ?? "RFC822"; - $item = $rfc === "BODY" ? "BODY[TEXT]" : "$rfc.TEXT"; - return $this->fetch([$item], is_array($uids) ? $uids : [$uids], null, $uid); - } - - /** - * Fetch message headers - * @param int|array $uids - * @param string $rfc - * @param int|string $uid set to IMAP::ST_UID or any string representing the UID - set to IMAP::ST_MSGN to use - * message numbers instead. - * - * @return Response - * @throws RuntimeException - */ - public function headers(int|array $uids, string $rfc = "RFC822", int|string $uid = IMAP::ST_UID): Response { - return $this->fetch(["$rfc.HEADER"], is_array($uids) ? $uids : [$uids], null, $uid); - } - - /** - * Fetch message flags - * @param int|array $uids - * @param int|string $uid set to IMAP::ST_UID or any string representing the UID - set to IMAP::ST_MSGN to use - * message numbers instead. - * - * @return Response - * @throws RuntimeException - */ - public function flags(int|array $uids, int|string $uid = IMAP::ST_UID): Response { - return $this->fetch(["FLAGS"], is_array($uids) ? $uids : [$uids], null, $uid); - } - - /** - * Fetch message sizes - * @param int|array $uids - * @param int|string $uid set to IMAP::ST_UID or any string representing the UID - set to IMAP::ST_MSGN to use - * message numbers instead. - * - * @return Response - * @throws RuntimeException - */ - public function sizes(int|array $uids, int|string $uid = IMAP::ST_UID): Response { - return $this->fetch(["RFC822.SIZE"], is_array($uids) ? $uids : [$uids], null, $uid); - } - - /** - * Get uid for a given id - * @param int|null $id message number - * - * @return Response message number for given message or all messages as array - * @throws MessageNotFoundException - */ - public function getUid(?int $id = null): Response { - if (!$this->enable_uid_cache || empty($this->uid_cache) || count($this->uid_cache) <= 0) { - try { - $this->setUidCache((array)$this->fetch('UID', 1, INF)->data()); // set cache for this folder - } catch (RuntimeException) { - } - } - $uids = $this->uid_cache; - - if ($id == null) { - return Response::empty($this->debug)->setResult($uids)->setCanBeEmpty(true); - } - - foreach ($uids as $k => $v) { - if ($k == $id) { - return Response::empty($this->debug)->setResult($v); - } - } - - // clear uid cache and run method again - if ($this->enable_uid_cache && $this->uid_cache) { - $this->setUidCache(null); - return $this->getUid($id); - } - - throw new MessageNotFoundException('unique id not found'); - } - - /** - * Get a message number for a uid - * @param string $id uid - * - * @return Response message number - * @throws MessageNotFoundException - */ - public function getMessageNumber(string $id): Response { - foreach ($this->getUid()->data() as $k => $v) { - if ($v == $id) { - return Response::empty($this->debug)->setResult((int)$k); - } - } - - throw new MessageNotFoundException('message number not found: ' . $id); - } - - /** - * Get a list of available folders - * - * @param string $reference mailbox reference for list - * @param string $folder mailbox name match with wildcards - * - * @return Response folders that matched $folder as array(name => array('delimiter' => .., 'flags' => ..)) - * - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - */ - public function folders(string $reference = '', string $folder = '*'): Response { - $response = $this->requestAndResponse('LIST', $this->escapeString($reference, $folder))->setCanBeEmpty(true); - $list = $response->data(); - - $result = []; - if ($list[0] !== true) { - foreach ($list as $item) { - if (count($item) != 4 || $item[0] != 'LIST') { - continue; - } - $item[3] = str_replace("\\\\", "\\", str_replace("\\\"", "\"", $item[3])); - $result[$item[3]] = ['delimiter' => $item[2], 'flags' => $item[1]]; - } - } - - return $response->setResult($result); - } - - /** - * Manage flags - * - * @param array|string $flags flags to set, add or remove - see $mode - * @param int $from message for items or start message if $to !== null - * @param int|null $to if null only one message ($from) is fetched, else it's the - * last message, INF means last message available - * @param string|null $mode '+' to add flags, '-' to remove flags, everything else sets the flags as given - * @param bool $silent if false the return values are the new flags for the wanted messages - * @param int|string $uid set to IMAP::ST_UID or any string representing the UID - set to IMAP::ST_MSGN to use - * message numbers instead. - * @param string|null $item command used to store a flag - * - * @return Response new flags if $silent is false, else true or false depending on success - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - */ - public function store( - array|string $flags, int $from, ?int $to = null, ?string $mode = null, bool $silent = true, int|string $uid = IMAP::ST_UID, ?string $item = null - ): Response { - $flags = $this->escapeList(is_array($flags) ? $flags : [$flags]); - $set = $this->buildSet($from, $to); - - $command = $this->buildUIDCommand("STORE", $uid); - $item = ($mode == '-' ? "-" : "+") . ($item === null ? "FLAGS" : $item) . ($silent ? '.SILENT' : ""); - - $response = $this->requestAndResponse($command, [$set, $item, $flags], $silent); - - if ($silent) { - return $response; - } - - $result = []; - foreach ($response as $token) { - if ($token[1] != 'FETCH' || $token[2][0] != 'FLAGS') { - continue; - } - $result[$token[0]] = $token[2][1]; - } - - - return $response->setResult($result); - } - - /** - * Append a new message to given folder - * - * @param string $folder name of target folder - * @param string $message full message content - * @param array|null $flags flags for new message - * @param string|null $date date for new message - * - * @return Response - * - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - */ - public function appendMessage(string $folder, string $message, ?array $flags = null, ?string $date = null): Response { - $tokens = []; - $tokens[] = $this->escapeString($folder); - if ($flags !== null) { - $tokens[] = $this->escapeList($flags); - } - if ($date !== null) { - $tokens[] = $this->escapeString($date); - } - $tokens[] = $this->escapeString($message); - - return $this->requestAndResponse('APPEND', $tokens, true); - } - - /** - * Copy a message set from current folder to another folder - * - * @param string $folder destination folder - * @param $from - * @param int|null $to if null only one message ($from) is fetched, else it's the - * last message, INF means last message available - * @param int|string $uid set to IMAP::ST_UID or any string representing the UID - set to IMAP::ST_MSGN to use - * message numbers instead. - * - * @return Response - * - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - */ - public function copyMessage(string $folder, $from, ?int $to = null, int|string $uid = IMAP::ST_UID): Response { - $set = $this->buildSet($from, $to); - $command = $this->buildUIDCommand("COPY", $uid); - - return $this->requestAndResponse($command, [$set, $this->escapeString($folder)], true); - } - - /** - * Copy multiple messages to the target folder - * - * @param array $messages List of message identifiers - * @param string $folder Destination folder - * @param int|string $uid set to IMAP::ST_UID or any string representing the UID - set to IMAP::ST_MSGN to use - * message numbers instead. - * - * @return Response Tokens if operation successful, false if an error occurred - * - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - */ - public function copyManyMessages(array $messages, string $folder, int|string $uid = IMAP::ST_UID): Response { - $command = $this->buildUIDCommand("COPY", $uid); - - $set = implode(',', $messages); - $tokens = [$set, $this->escapeString($folder)]; - - return $this->requestAndResponse($command, $tokens, true); - } - - /** - * Move a message set from current folder to another folder - * - * @param string $folder destination folder - * @param $from - * @param int|null $to if null only one message ($from) is fetched, else it's the - * last message, INF means last message available - * @param int|string $uid set to IMAP::ST_UID or any string representing the UID - set to IMAP::ST_MSGN to use - * message numbers instead. - * - * @return Response - * - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - */ - public function moveMessage(string $folder, $from, ?int $to = null, int|string $uid = IMAP::ST_UID): Response { - $set = $this->buildSet($from, $to); - $command = $this->buildUIDCommand("MOVE", $uid); - - $result = $this->requestAndResponse($command, [$set, $this->escapeString($folder)], true); - // RFC4315 fallback to COPY, STORE and EXPUNGE. - // Required for cases where MOVE isn't supported by the server. So we copy the message to the target folder, - // mark the original message as deleted and expunge the mailbox. - // See the following links for more information: - // - https://github.com/freescout-help-desk/freescout/issues/4313 - // - https://github.com/Webklex/php-imap/issues/123 - if (!$result->boolean()) { - $result = $this->copyMessage($folder, $from, $to, $uid); - if (!$result->boolean()) { - return $result; - } - $result = $this->store(['\Deleted'], $from, $to, null, true, $uid); - if (!$result->boolean()) { - return $result; - } - return $this->expunge(); - } - return $result; - } - - /** - * Move multiple messages to the target folder - * - * @param array $messages List of message identifiers - * @param string $folder Destination folder - * @param int|string $uid set to IMAP::ST_UID or any string representing the UID - set to IMAP::ST_MSGN to use - * message numbers instead. - * - * @return Response - * - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - */ - public function moveManyMessages(array $messages, string $folder, int|string $uid = IMAP::ST_UID): Response { - $command = $this->buildUIDCommand("MOVE", $uid); - $set = implode(',', $messages); - $tokens = [$set, $this->escapeString($folder)]; - - $result = $this->requestAndResponse($command, $tokens, true); - // RFC4315 fallback to COPY, STORE and EXPUNGE. - // Required for cases where MOVE isn't supported by the server. So we copy the message to the target folder, - // mark the original message as deleted and expunge the mailbox. - // See the following links for more information: - // - https://github.com/freescout-help-desk/freescout/issues/4313 - // - https://github.com/Webklex/php-imap/issues/123 - if (!$result->boolean()) { - $result = $this->copyManyMessages($messages, $folder, $uid); - if (!$result->boolean()) { - return $result; - } - foreach ($messages as $message) { - $result = $this->store(['\Deleted'], $message, $message, null, true, $uid); - if (!$result->boolean()) { - return $result; - } - } - return $this->expunge(); - } - return $result; - } - - /** - * Exchange identification information - * Ref.: https://datatracker.ietf.org/doc/html/rfc2971 - * - * @param array|null $ids - * @return Response - * - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - */ - public function ID($ids = null): Response { - $token = "NIL"; - if (is_array($ids) && !empty($ids)) { - $token = "("; - foreach ($ids as $id) { - $token .= '"' . $id . '" '; - } - $token = rtrim($token) . ")"; - } - - return $this->requestAndResponse("ID", [$token], true); - } - - /** - * Create a new folder (and parent folders if needed) - * - * @param string $folder folder name - * @return Response - * - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - */ - public function createFolder(string $folder): Response { - return $this->requestAndResponse('CREATE', [$this->escapeString($folder)], true); - } - - /** - * Rename an existing folder - * - * @param string $old old name - * @param string $new new name - * - * @return Response - * - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - */ - public function renameFolder(string $old, string $new): Response { - return $this->requestAndResponse('RENAME', $this->escapeString($old, $new), true); - } - - /** - * Delete a folder - * - * @param string $folder folder name - * @return Response - * - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - */ - public function deleteFolder(string $folder): Response { - return $this->requestAndResponse('DELETE', [$this->escapeString($folder)], true); - } - - /** - * Subscribe to a folder - * - * @param string $folder folder name - * @return Response - * - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - */ - public function subscribeFolder(string $folder): Response { - return $this->requestAndResponse('SUBSCRIBE', [$this->escapeString($folder)], true); - } - - /** - * Unsubscribe from a folder - * - * @param string $folder folder name - * @return Response - * - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - */ - public function unsubscribeFolder(string $folder): Response { - return $this->requestAndResponse('UNSUBSCRIBE', [$this->escapeString($folder)], true); - } - - /** - * Apply session saved changes to the server - * - * @return Response - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - */ - public function expunge(): Response { - $this->uid_cache = []; - return $this->requestAndResponse('EXPUNGE'); - } - - /** - * Send noop command - * - * @return Response - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - */ - public function noop(): Response { - return $this->requestAndResponse('NOOP'); - } - - /** - * Retrieve the quota level settings, and usage statics per mailbox - * - * @param $username - * @return Response - * - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - * - * @Doc https://www.rfc-editor.org/rfc/rfc2087.txt - */ - public function getQuota($username): Response { - $command = "GETQUOTA"; - $params = ['"#user/' . $username . '"']; - - return $this->requestAndResponse($command, $params); - } - - /** - * Retrieve the quota settings per user - * - * @param string $quota_root - * @return Response - * - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - * - * @Doc https://www.rfc-editor.org/rfc/rfc2087.txt - */ - public function getQuotaRoot(string $quota_root = 'INBOX'): Response { - $command = "GETQUOTAROOT"; - $params = [$quota_root]; - - return $this->requestAndResponse($command, $params); - } - - /** - * Send idle command - * - * @throws RuntimeException - */ - public function idle(): void { - $response = $this->sendRequest("IDLE"); - if (!$this->assumedNextLineIgnoreUntagged($response, '+ ')) { - throw new RuntimeException('idle failed'); - } - } - - /** - * Send done command - * @throws RuntimeException - */ - public function done(): bool { - $response = new Response($this->noun, $this->debug); - $this->write($response, "DONE"); - if (!$this->assumedNextTaggedLineIgnoreUntagged($response, 'OK', $tags)) { - throw new RuntimeException('done failed'); - } - return true; - } - - /** - * Search for matching messages - * - * @param array $params - * @param int|string $uid set to IMAP::ST_UID or any string representing the UID - set to IMAP::ST_MSGN to use - * message numbers instead. - * - * @return Response message ids - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - */ - public function search(array $params, int|string $uid = IMAP::ST_UID): Response { - $command = $this->buildUIDCommand("SEARCH", $uid); - $response = $this->requestAndResponse($command, $params)->setCanBeEmpty(true); - - foreach ($response->data() as $ids) { - if ($ids[0] === 'SEARCH') { - array_shift($ids); - return $response->setResult($ids); - } - } - - return $response; - } - - /** - * Get a message overview - * @param string $sequence - * @param int|string $uid set to IMAP::ST_UID or any string representing the UID - set to IMAP::ST_MSGN to use - * message numbers instead. - * - * @return Response - * @throws RuntimeException - * @throws MessageNotFoundException - * @throws InvalidMessageDateException - */ - public function overview(string $sequence, int|string $uid = IMAP::ST_UID): Response { - $result = []; - list($from, $to) = explode(":", $sequence); - - $response = $this->getUid(); - $ids = []; - foreach ($response->data() as $msgn => $v) { - $id = $uid === IMAP::ST_UID ? $v : $msgn; - if (($to >= $id && $from <= $id) || ($to === "*" && $from <= $id)) { - $ids[] = $id; - } - } - if (!empty($ids)) { - $headers = $this->headers($ids, "RFC822", $uid); - $response->stack($headers); - foreach ($headers->data() as $id => $raw_header) { - $result[$id] = (new Header($raw_header, $this->config))->getAttributes(); - } - } - return $response->setResult($result)->setCanBeEmpty(true); - } - - /** - * Enable the debug mode - * - * @return void - */ - public function enableDebug(): void { - $this->debug = true; - } - - /** - * Disable the debug mode - * - * @return void - */ - public function disableDebug(): void { - $this->debug = false; - } - - /** - * Build a valid UID number set - * @param $from - * @param null $to - * - * @return int|string - */ - public function buildSet($from, $to = null): int|string { - $set = (int)$from; - if ($to !== null) { - $set .= ':' . ($to == INF ? '*' : (int)$to); - } - return $set; - } -} diff --git a/plugins/vendor/webklex/php-imap/src/Connection/Protocols/LegacyProtocol.php b/plugins/vendor/webklex/php-imap/src/Connection/Protocols/LegacyProtocol.php deleted file mode 100644 index 81b52f77..00000000 --- a/plugins/vendor/webklex/php-imap/src/Connection/Protocols/LegacyProtocol.php +++ /dev/null @@ -1,825 +0,0 @@ -config = $config; - $this->setCertValidation($cert_validation); - $this->encryption = $encryption; - } - - /** - * Public destructor - */ - public function __destruct() { - $this->logout(); - } - - /** - * Save the information for a nw connection - * @param string $host - * @param int|null $port - */ - public function connect(string $host, ?int $port = null): void { - if ($this->encryption) { - $encryption = strtolower($this->encryption); - if ($encryption == "ssl") { - $port = $port === null ? 993 : $port; - } - } - $port = $port === null ? 143 : $port; - $this->host = $host; - $this->port = $port; - } - - /** - * Login to a new session. - * @param string $user username - * @param string $password password - * - * @return Response - */ - public function login(string $user, string $password): Response { - return $this->response()->wrap(function($response) use ($user, $password) { - /** @var Response $response */ - try { - $this->stream = \imap_open( - $this->getAddress(), - $user, - $password, - 0, - $attempts = 3, - $this->config->get('options.open') - ); - $response->addCommand("imap_open"); - } catch (\ErrorException $e) { - $errors = \imap_errors(); - $message = $e->getMessage() . '. ' . implode("; ", (is_array($errors) ? $errors : array())); - throw new AuthFailedException($message); - } - - if (!$this->stream) { - $errors = \imap_errors(); - $message = implode("; ", (is_array($errors) ? $errors : array())); - throw new AuthFailedException($message); - } - - $errors = \imap_errors(); - $response->addCommand("imap_errors"); - if (is_array($errors)) { - $status = $this->examineFolder(); - $response->stack($status); - if ($status->data()['exists'] !== 0) { - $message = implode("; ", $errors); - throw new RuntimeException($message); - } - } - - if ($this->stream !== false) { - return ["TAG" . $response->Noun() . " OK [] Logged in\r\n"]; - } - - $response->addError("failed to login"); - return []; - }); - } - - /** - * Authenticate your current session. - * @param string $user username - * @param string $token access token - * - * @return Response - */ - public function authenticate(string $user, string $token): Response { - return $this->login($user, $token); - } - - /** - * Get full address of mailbox. - * - * @return string - */ - protected function getAddress(): string { - $address = "{" . $this->host . ":" . $this->port . "/" . $this->protocol; - if (!$this->cert_validation) { - $address .= '/novalidate-cert'; - } - if (in_array($this->encryption, ['tls', 'notls', 'ssl'])) { - $address .= '/' . $this->encryption; - } elseif ($this->encryption === "starttls") { - $address .= '/tls'; - } - - $address .= '}'; - - return $address; - } - - /** - * Logout of the current session - * - * @return Response - */ - public function logout(): Response { - return $this->response()->wrap(function($response) { - /** @var Response $response */ - if ($this->stream) { - $this->uid_cache = []; - $response->addCommand("imap_close"); - if (\imap_close($this->stream, IMAP::CL_EXPUNGE)) { - $this->stream = false; - return [ - 0 => "BYE Logging out\r\n", - 1 => "TAG" . $response->Noun() . " OK Logout completed (0.001 + 0.000 secs).\r\n", - ]; - } - $this->stream = false; - } - return []; - }); - } - - /** - * Get an array of available capabilities - * - * @throws MethodNotSupportedException - */ - public function getCapabilities(): Response { - throw new MethodNotSupportedException(); - } - - /** - * Change the current folder - * @param string $folder change to this folder - * - * @return Response see examineOrselect() - * @throws RuntimeException - */ - public function selectFolder(string $folder = 'INBOX'): Response { - $flags = IMAP::OP_READONLY; - if (in_array($this->protocol, ["pop3", "nntp"])) { - $flags = IMAP::NIL; - } - if ($this->stream === false) { - throw new RuntimeException("failed to reopen stream."); - } - - return $this->response("imap_reopen")->wrap(function($response) use ($folder, $flags) { - /** @var Response $response */ - \imap_reopen($this->stream, $this->getAddress() . $folder, $flags, 3); - $this->uid_cache = []; - - $status = $this->examineFolder($folder); - $response->stack($status); - - return $status->data(); - }); - } - - /** - * Examine a given folder - * @param string $folder examine this folder - * - * @return Response - * @throws RuntimeException - */ - public function examineFolder(string $folder = 'INBOX'): Response { - if (str_starts_with($folder, ".")) { - throw new RuntimeException("Segmentation fault prevented. Folders starts with an illegal char '.'."); - } - return $this->response("imap_status")->wrap(function($response) use ($folder) { - /** @var Response $response */ - $status = \imap_status($this->stream, $this->getAddress() . $folder, IMAP::SA_ALL); - - return $status ? [ - "flags" => [], - "exists" => $status->messages, - "recent" => $status->recent, - "unseen" => $status->unseen, - "uidnext" => $status->uidnext, - ] : []; - }); - } - - /** - * Get the status of a given folder - * - * @return Response list of STATUS items - * @throws MethodNotSupportedException - */ - public function folderStatus(string $folder = 'INBOX', $arguments = ['MESSAGES', 'UNSEEN', 'RECENT', 'UIDNEXT', 'UIDVALIDITY']): Response { - throw new MethodNotSupportedException(); - } - - /** - * Fetch message content - * @param int|array $uids - * @param string $rfc - * @param int|string $uid set to IMAP::ST_UID if you pass message unique identifiers instead of numbers. - * - * @return Response - */ - public function content(int|array $uids, string $rfc = "RFC822", int|string $uid = IMAP::ST_UID): Response { - return $this->response()->wrap(function($response) use ($uids, $uid) { - /** @var Response $response */ - - $result = []; - $uids = is_array($uids) ? $uids : [$uids]; - foreach ($uids as $id) { - $response->addCommand("imap_fetchbody"); - $result[$id] = \imap_fetchbody($this->stream, $id, "", $uid === IMAP::ST_UID ? IMAP::ST_UID : IMAP::NIL); - } - - return $result; - }); - } - - /** - * Fetch message headers - * @param int|array $uids - * @param string $rfc - * @param int|string $uid set to IMAP::ST_UID if you pass message unique identifiers instead of numbers. - * - * @return Response - */ - public function headers(int|array $uids, string $rfc = "RFC822", int|string $uid = IMAP::ST_UID): Response { - return $this->response()->wrap(function($response) use ($uids, $uid) { - /** @var Response $response */ - - $result = []; - $uids = is_array($uids) ? $uids : [$uids]; - foreach ($uids as $id) { - $response->addCommand("imap_fetchheader"); - $result[$id] = \imap_fetchheader($this->stream, $id, $uid ? IMAP::ST_UID : IMAP::NIL); - } - - return $result; - }); - } - - /** - * Fetch message flags - * @param int|array $uids - * @param int|string $uid set to IMAP::ST_UID if you pass message unique identifiers instead of numbers. - * - * @return Response - */ - public function flags(int|array $uids, int|string $uid = IMAP::ST_UID): Response { - return $this->response()->wrap(function($response) use ($uids, $uid) { - /** @var Response $response */ - - $result = []; - $uids = is_array($uids) ? $uids : [$uids]; - foreach ($uids as $id) { - $response->addCommand("imap_fetch_overview"); - $raw_flags = \imap_fetch_overview($this->stream, $id, $uid ? IMAP::ST_UID : IMAP::NIL); - $flags = []; - if (is_array($raw_flags) && isset($raw_flags[0])) { - $raw_flags = (array)$raw_flags[0]; - foreach ($raw_flags as $flag => $value) { - if ($value === 1 && in_array($flag, ["size", "uid", "msgno", "update"]) === false) { - $flags[] = "\\" . ucfirst($flag); - } - } - } - $result[$id] = $flags; - } - - return $result; - }); - } - - /** - * Fetch message sizes - * @param int|array $uids - * @param int|string $uid set to IMAP::ST_UID if you pass message unique identifiers instead of numbers. - * - * @return Response - */ - public function sizes(int|array $uids, int|string $uid = IMAP::ST_UID): Response { - return $this->response()->wrap(function($response) use ($uids, $uid) { - /** @var Response $response */ - $result = []; - $uids = is_array($uids) ? $uids : [$uids]; - $uid_text = implode("','", $uids); - $response->addCommand("imap_fetch_overview"); - if ($uid == IMAP::ST_UID) { - $raw_overview = \imap_fetch_overview($this->stream, $uid_text, IMAP::FT_UID); - } else { - $raw_overview = \imap_fetch_overview($this->stream, $uid_text); - } - if ($raw_overview !== false) { - foreach ($raw_overview as $overview_element) { - $overview_element = (array)$overview_element; - $result[$overview_element[$uid == IMAP::ST_UID ? 'uid' : 'msgno']] = $overview_element['size']; - } - } - return $result; - }); - } - - /** - * Get uid for a given id - * @param int|null $id message number - * - * @return Response message number for given message or all messages as array - */ - public function getUid(?int $id = null): Response { - return $this->response()->wrap(function($response) use ($id) { - /** @var Response $response */ - if ($id === null) { - if ($this->enable_uid_cache && $this->uid_cache) { - return $this->uid_cache; - } - - $overview = $this->overview("1:*"); - $response->stack($overview); - $uids = []; - foreach ($overview->data() as $set) { - $uids[$set->msgno] = $set->uid; - } - - $this->setUidCache($uids); - return $uids; - } - - $response->addCommand("imap_uid"); - $uid = \imap_uid($this->stream, $id); - if ($uid) { - return $uid; - } - - return []; - }); - } - - /** - * Get the message number of a given uid - * @param string $id uid - * - * @return Response message number - */ - public function getMessageNumber(string $id): Response { - return $this->response("imap_msgno")->wrap(function($response) use ($id) { - /** @var Response $response */ - return \imap_msgno($this->stream, $id); - }); - } - - /** - * Get a message overview - * @param string $sequence uid sequence - * @param int|string $uid set to IMAP::ST_UID if you pass message unique identifiers instead of numbers. - * - * @return Response - */ - public function overview(string $sequence, int|string $uid = IMAP::ST_UID): Response { - return $this->response("imap_fetch_overview")->wrap(function($response) use ($sequence, $uid) { - /** @var Response $response */ - return \imap_fetch_overview($this->stream, $sequence, $uid ? IMAP::ST_UID : IMAP::NIL) ?: []; - }); - } - - /** - * Get a list of available folders - * @param string $reference mailbox reference for list - * @param string $folder mailbox name match with wildcards - * - * @return Response folders that matched $folder as array(name => array('delimiter' => .., 'flags' => ..)) - */ - public function folders(string $reference = '', string $folder = '*'): Response { - return $this->response("imap_getmailboxes")->wrap(function($response) use ($reference, $folder) { - /** @var Response $response */ - $result = []; - - $items = \imap_getmailboxes($this->stream, $this->getAddress(), $reference . $folder); - if (is_array($items)) { - foreach ($items as $item) { - $name = $this->decodeFolderName($item->name); - $result[$name] = ['delimiter' => $item->delimiter, 'flags' => []]; - } - } else { - throw new RuntimeException(\imap_last_error()); - } - - return $result; - }); - } - - /** - * Manage flags - * @param array|string $flags flags to set, add or remove - see $mode - * @param int $from message for items or start message if $to !== null - * @param int|null $to if null only one message ($from) is fetched, else it's the - * last message, INF means last message available - * @param string|null $mode '+' to add flags, '-' to remove flags, everything else sets the flags as given - * @param bool $silent if false the return values are the new flags for the wanted messages - * @param int|string $uid set to IMAP::ST_UID if you pass message unique identifiers instead of numbers. - * @param string|null $item unused attribute - * - * @return Response new flags if $silent is false, else true or false depending on success - */ - public function store(array|string $flags, int $from, ?int $to = null, ?string $mode = null, bool $silent = true, int|string $uid = IMAP::ST_UID, ?string $item = null): Response { - $flag = trim(is_array($flags) ? implode(" ", $flags) : $flags); - - return $this->response()->wrap(function($response) use ($mode, $from, $flag, $uid, $silent) { - /** @var Response $response */ - - if ($mode == "+") { - $response->addCommand("imap_setflag_full"); - $status = \imap_setflag_full($this->stream, $from, $flag, $uid ? IMAP::ST_UID : IMAP::NIL); - } else { - $response->addCommand("imap_clearflag_full"); - $status = \imap_clearflag_full($this->stream, $from, $flag, $uid ? IMAP::ST_UID : IMAP::NIL); - } - - if ($silent === true) { - if ($status) { - return [ - "TAG" . $response->Noun() . " OK Store completed (0.001 + 0.000 secs).\r\n" - ]; - } - return []; - } - - return $this->flags($from); - }); - } - - /** - * Append a new message to given folder - * @param string $folder name of target folder - * @param string $message full message content - * @param array|null $flags flags for new message - * @param mixed $date date for new message - * - * @return Response - */ - public function appendMessage(string $folder, string $message, ?array $flags = null, mixed $date = null): Response { - return $this->response("imap_append")->wrap(function($response) use ($folder, $message, $flags, $date) { - /** @var Response $response */ - if ($date != null) { - if ($date instanceof \Carbon\Carbon) { - $date = $date->format('d-M-Y H:i:s O'); - } - if (\imap_append($this->stream, $this->getAddress() . $folder, $message, $flags, $date)) { - return [ - "OK Append completed (0.001 + 0.000 secs).\r\n" - ]; - } - } else if (\imap_append($this->stream, $this->getAddress() . $folder, $message, $flags)) { - return [ - "OK Append completed (0.001 + 0.000 secs).\r\n" - ]; - } - return []; - }); - } - - /** - * Copy message set from current folder to other folder - * @param string $folder destination folder - * @param $from - * @param int|null $to if null only one message ($from) is fetched, else it's the - * last message, INF means last message available - * @param int|string $uid set to IMAP::ST_UID if you pass message unique identifiers instead of numbers. - * - * @return Response - */ - public function copyMessage(string $folder, $from, ?int $to = null, int|string $uid = IMAP::ST_UID): Response { - return $this->response("imap_mail_copy")->wrap(function($response) use ($from, $folder, $uid) { - /** @var Response $response */ - - if (\imap_mail_copy($this->stream, $from, $this->getAddress() . $folder, $uid ? IMAP::ST_UID : IMAP::NIL)) { - return [ - "TAG" . $response->Noun() . " OK Copy completed (0.001 + 0.000 secs).\r\n" - ]; - } - throw new ImapBadRequestException("Invalid ID $from"); - }); - } - - /** - * Copy multiple messages to the target folder - * @param array $messages List of message identifiers - * @param string $folder Destination folder - * @param int|string $uid set to IMAP::ST_UID if you pass message unique identifiers instead of numbers. - * - * @return Response Tokens if operation successful, false if an error occurred - */ - public function copyManyMessages(array $messages, string $folder, int|string $uid = IMAP::ST_UID): Response { - return $this->response()->wrap(function($response) use ($messages, $folder, $uid) { - /** @var Response $response */ - foreach ($messages as $msg) { - $copy_response = $this->copyMessage($folder, $msg, null, $uid); - $response->stack($copy_response); - if (empty($copy_response->data())) { - return [ - "TAG" . $response->Noun() . " BAD Copy failed (0.001 + 0.000 secs).\r\n", - "Invalid ID $msg\r\n" - ]; - } - } - return [ - "TAG" . $response->Noun() . " OK Copy completed (0.001 + 0.000 secs).\r\n" - ]; - }); - } - - /** - * Move a message set from current folder to another folder - * @param string $folder destination folder - * @param $from - * @param int|null $to if null only one message ($from) is fetched, else it's the - * last message, INF means last message available - * @param int|string $uid set to IMAP::ST_UID if you pass message unique identifiers instead of numbers. - * - * @return Response success - */ - public function moveMessage(string $folder, $from, ?int $to = null, int|string $uid = IMAP::ST_UID): Response { - return $this->response("imap_mail_move")->wrap(function($response) use ($from, $folder, $uid) { - if (\imap_mail_move($this->stream, $from, $this->getAddress() . $folder, $uid ? IMAP::ST_UID : IMAP::NIL)) { - return [ - "TAG" . $response->Noun() . " OK Move completed (0.001 + 0.000 secs).\r\n" - ]; - } - throw new ImapBadRequestException("Invalid ID $from"); - }); - } - - /** - * Move multiple messages to the target folder - * @param array $messages List of message identifiers - * @param string $folder Destination folder - * @param int|string $uid set to IMAP::ST_UID if you pass message unique identifiers instead of numbers. - * - * @return Response Tokens if operation successful, false if an error occurred - * @throws ImapBadRequestException - */ - public function moveManyMessages(array $messages, string $folder, int|string $uid = IMAP::ST_UID): Response { - return $this->response()->wrap(function($response) use ($messages, $folder, $uid) { - foreach ($messages as $msg) { - $move_response = $this->moveMessage($folder, $msg, null, $uid); - $response = $response->include($response); - if (empty($move_response->data())) { - return [ - "TAG" . $response->Noun() . " BAD Move failed (0.001 + 0.000 secs).\r\n", - "Invalid ID $msg\r\n" - ]; - } - } - return [ - "TAG" . $response->Noun() . " OK Move completed (0.001 + 0.000 secs).\r\n" - ]; - }); - } - - /** - * Exchange identification information - * Ref.: https://datatracker.ietf.org/doc/html/rfc2971 - * - * @param null $ids - * @return Response - * - * @throws MethodNotSupportedException - */ - public function ID($ids = null): Response { - throw new MethodNotSupportedException(); - } - - /** - * Create a new folder (and parent folders if needed) - * @param string $folder folder name - * - * @return Response - */ - public function createFolder(string $folder): Response { - return $this->response("imap_createmailbox")->wrap(function($response) use ($folder) { - return \imap_createmailbox($this->stream, $this->getAddress() . $folder) ? [ - 0 => "TAG" . $response->Noun() . " OK Create completed (0.004 + 0.000 + 0.003 secs).\r\n", - ] : []; - }); - } - - /** - * Rename an existing folder - * @param string $old old name - * @param string $new new name - * - * @return Response - */ - public function renameFolder(string $old, string $new): Response { - return $this->response("imap_renamemailbox")->wrap(function($response) use ($old, $new) { - return \imap_renamemailbox($this->stream, $this->getAddress() . $old, $this->getAddress() . $new) ? [ - 0 => "TAG" . $response->Noun() . " OK Move completed (0.004 + 0.000 + 0.003 secs).\r\n", - ] : []; - }); - } - - /** - * Delete a folder - * @param string $folder folder name - * - * @return Response - */ - public function deleteFolder(string $folder): Response { - return $this->response("imap_deletemailbox")->wrap(function($response) use ($folder) { - return \imap_deletemailbox($this->stream, $this->getAddress() . $folder) ? [ - 0 => "OK Delete completed (0.004 + 0.000 + 0.003 secs).\r\n", - ] : []; - }); - } - - /** - * Subscribe to a folder - * @param string $folder folder name - * - * @throws MethodNotSupportedException - */ - public function subscribeFolder(string $folder): Response { - throw new MethodNotSupportedException(); - } - - /** - * Unsubscribe from a folder - * @param string $folder folder name - * - * @throws MethodNotSupportedException - */ - public function unsubscribeFolder(string $folder): Response { - throw new MethodNotSupportedException(); - } - - /** - * Apply session saved changes to the server - * - * @return Response - */ - public function expunge(): Response { - return $this->response("imap_expunge")->wrap(function($response) { - return \imap_expunge($this->stream) ? [ - 0 => "TAG" . $response->Noun() . " OK Expunge completed (0.001 + 0.000 secs).\r\n", - ] : []; - }); - } - - /** - * Send noop command - * - * @throws MethodNotSupportedException - */ - public function noop(): Response { - throw new MethodNotSupportedException(); - } - - /** - * Send idle command - * - * @throws MethodNotSupportedException - */ - public function idle() { - throw new MethodNotSupportedException(); - } - - /** - * Send done command - * - * @throws MethodNotSupportedException - */ - public function done() { - throw new MethodNotSupportedException(); - } - - /** - * Search for matching messages - * @param array $params - * @param int|string $uid set to IMAP::ST_UID if you pass message unique identifiers instead of numbers. - * - * @return Response message ids - */ - public function search(array $params, int|string $uid = IMAP::ST_UID): Response { - return $this->response("imap_search")->wrap(function($response) use ($params, $uid) { - $response->setCanBeEmpty(true); - $result = \imap_search($this->stream, $params[0], $uid ? IMAP::ST_UID : IMAP::NIL); - return $result ?: []; - }); - } - - /** - * Enable the debug mode - */ - public function enableDebug() { - $this->debug = true; - } - - /** - * Disable the debug mode - */ - public function disableDebug() { - $this->debug = false; - } - - /** - * Decode name. - * It converts UTF7-IMAP encoding to UTF-8. - * - * @param $name - * - * @return array|false|string|string[]|null - */ - protected function decodeFolderName($name): array|bool|string|null { - preg_match('#\{(.*)}(.*)#', $name, $preg); - return mb_convert_encoding($preg[2], "UTF-8", "UTF7-IMAP"); - } - - /** - * @return string - */ - public function getProtocol(): string { - return $this->protocol; - } - - /** - * Retrieve the quota level settings, and usage statics per mailbox - * @param $username - * - * @return Response - */ - public function getQuota($username): Response { - return $this->response("imap_get_quota")->wrap(function($response) use ($username) { - $result = \imap_get_quota($this->stream, 'user.' . $username); - return $result ?: []; - }); - } - - /** - * Retrieve the quota settings per user - * @param string $quota_root - * - * @return Response - */ - public function getQuotaRoot(string $quota_root = 'INBOX'): Response { - return $this->response("imap_get_quotaroot")->wrap(function($response) use ($quota_root) { - $result = \imap_get_quotaroot($this->stream, $this->getAddress() . $quota_root); - return $result ?: []; - }); - } - - /** - * @param string $protocol - * @return LegacyProtocol - */ - public function setProtocol(string $protocol): LegacyProtocol { - if (($pos = strpos($protocol, "legacy")) > 0) { - $protocol = substr($protocol, 0, ($pos + 2) * -1); - } - $this->protocol = $protocol; - return $this; - } - - /** - * Create a new Response instance - * @param string|null $command - * - * @return Response - */ - protected function response(?string $command = ""): Response { - return Response::make(0, $command == "" ? [] : [$command], [], $this->debug); - } -} diff --git a/plugins/vendor/webklex/php-imap/src/Connection/Protocols/Protocol.php b/plugins/vendor/webklex/php-imap/src/Connection/Protocols/Protocol.php deleted file mode 100644 index a1404b4b..00000000 --- a/plugins/vendor/webklex/php-imap/src/Connection/Protocols/Protocol.php +++ /dev/null @@ -1,417 +0,0 @@ - null, - 'request_fulluri' => false, - 'username' => null, - 'password' => null, - ]; - - /** - * SSL stream context options - * - * @see https://www.php.net/manual/en/context.ssl.php for possible options - * - * @var array - */ - protected array $ssl_options = []; - - /** - * Cache for uid of active folder. - * - * @var array - */ - protected array $uid_cache = []; - - /** - * Get an available cryptographic method - * - * @return int - */ - public function getCryptoMethod(): int { - // Allow the best TLS version(s) we can - $cryptoMethod = STREAM_CRYPTO_METHOD_TLS_CLIENT; - - // PHP 5.6.7 dropped inclusion of TLS 1.1 and 1.2 in STREAM_CRYPTO_METHOD_TLS_CLIENT - // so add them back in manually if we can - if (defined('STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT')) { - $cryptoMethod = STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT; - }elseif (defined('STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT')) { - $cryptoMethod = STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT; - } - - return $cryptoMethod; - } - - /** - * Enable SSL certificate validation - * - * @return Protocol - */ - public function enableCertValidation(): Protocol { - $this->cert_validation = true; - return $this; - } - - /** - * Disable SSL certificate validation - * @return Protocol - */ - public function disableCertValidation(): Protocol { - $this->cert_validation = false; - return $this; - } - - /** - * Set SSL certificate validation - * @var int $cert_validation - * - * @return Protocol - */ - public function setCertValidation(int $cert_validation): Protocol { - $this->cert_validation = $cert_validation; - return $this; - } - - /** - * Should we validate SSL certificate? - * - * @return bool - */ - public function getCertValidation(): bool { - return $this->cert_validation; - } - - /** - * Set connection proxy settings - * @var array $options - * - * @return Protocol - */ - public function setProxy(array $options): Protocol { - foreach ($this->proxy as $key => $val) { - if (isset($options[$key])) { - $this->proxy[$key] = $options[$key]; - } - } - - return $this; - } - - /** - * Get the current proxy settings - * - * @return array - */ - public function getProxy(): array { - return $this->proxy; - } - - /** - * Set SSL context options settings - * @var array $options - * - * @return Protocol - */ - public function setSslOptions(array $options): Protocol - { - $this->ssl_options = $options; - - return $this; - } - - /** - * Get the current SSL context options settings - * - * @return array - */ - public function getSslOptions(): array { - return $this->ssl_options; - } - - /** - * Prepare socket options - * @return array - *@var string $transport - * - */ - private function defaultSocketOptions(string $transport): array { - $options = []; - if ($this->encryption) { - $options["ssl"] = [ - 'verify_peer_name' => $this->getCertValidation(), - 'verify_peer' => $this->getCertValidation(), - ]; - - if (count($this->ssl_options)) { - /* Get the ssl context options from the config, but prioritize the 'validate_cert' config over the ssl context options */ - $options["ssl"] = array_replace($this->ssl_options, $options["ssl"]); - } - } - - if ($this->proxy["socket"] != null) { - $options[$transport]["proxy"] = $this->proxy["socket"]; - $options[$transport]["request_fulluri"] = $this->proxy["request_fulluri"]; - - if ($this->proxy["username"] != null) { - $auth = base64_encode($this->proxy["username"].':'.$this->proxy["password"]); - - $options[$transport]["header"] = [ - "Proxy-Authorization: Basic $auth" - ]; - } - } - - return $options; - } - - /** - * Create a new resource stream - * @param $transport - * @param string $host hostname or IP address of IMAP server - * @param int $port of IMAP server, default is 143 (993 for ssl) - * @param int $timeout timeout in seconds for initiating session - * - * @return resource The socket created. - * @throws ConnectionFailedException - */ - public function createStream($transport, string $host, int $port, int $timeout) { - $socket = "$transport://$host:$port"; - $stream = stream_socket_client($socket, $errno, $errstr, $timeout, - STREAM_CLIENT_CONNECT, - stream_context_create($this->defaultSocketOptions($transport)) - ); - - if (!$stream) { - throw new ConnectionFailedException($errstr, $errno); - } - - if (false === stream_set_timeout($stream, $timeout)) { - throw new ConnectionFailedException('Failed to set stream timeout'); - } - - return $stream; - } - - /** - * Get the current connection timeout - * - * @return int - */ - public function getConnectionTimeout(): int { - return $this->connection_timeout; - } - - /** - * Set the connection timeout - * @param int $connection_timeout - * - * @return Protocol - */ - public function setConnectionTimeout(int $connection_timeout): Protocol { - $this->connection_timeout = $connection_timeout; - return $this; - } - - /** - * Get the UID key string - * @param int|string $uid - * - * @return string - */ - public function getUIDKey(int|string $uid): string { - if ($uid == IMAP::ST_UID || $uid == IMAP::FT_UID) { - return "UID"; - } - if (strlen($uid) > 0 && !is_numeric($uid)) { - return (string)$uid; - } - - return ""; - } - - /** - * Build a UID / MSGN command - * @param string $command - * @param int|string $uid - * - * @return string - */ - public function buildUIDCommand(string $command, int|string $uid): string { - return trim($this->getUIDKey($uid)." ".$command); - } - - /** - * Set the uid cache of current active folder - * - * @param array|null $uids - */ - public function setUidCache(?array $uids): void { - if (is_null($uids)) { - $this->uid_cache = []; - return; - } - - $messageNumber = 1; - - $uid_cache = []; - foreach ($uids as $uid) { - $uid_cache[$messageNumber++] = (int)$uid; - } - - $this->uid_cache = $uid_cache; - } - - /** - * Enable the uid cache - * - * @return void - */ - public function enableUidCache(): void { - $this->enable_uid_cache = true; - } - - /** - * Disable the uid cache - * - * @return void - */ - public function disableUidCache(): void { - $this->enable_uid_cache = false; - } - - /** - * Set the encryption method - * @param string $encryption - * - * @return void - */ - public function setEncryption(string $encryption): void { - $this->encryption = $encryption; - } - - /** - * Get the encryption method - * @return string - */ - public function getEncryption(): string { - return $this->encryption; - } - - /** - * Check if the current session is connected - * - * @return bool - */ - public function connected(): bool { - return (bool)$this->stream; - } - - /** - * Retrieves header/metadata from the resource stream - * - * @return array - */ - public function meta(): array { - if (!$this->stream) { - return [ - "crypto" => [ - "protocol" => "", - "cipher_name" => "", - "cipher_bits" => 0, - "cipher_version" => "", - ], - "timed_out" => true, - "blocked" => true, - "eof" => true, - "stream_type" => "tcp_socket/unknown", - "mode" => "c", - "unread_bytes" => 0, - "seekable" => false, - ]; - } - return stream_get_meta_data($this->stream); - } - - /** - * Get the resource stream - * - * @return mixed - */ - public function getStream(): mixed { - return $this->stream; - } - - /** - * Set the Config instance - * - * @return Config - */ - public function getConfig(): Config { - return $this->config; - } -} diff --git a/plugins/vendor/webklex/php-imap/src/Connection/Protocols/ProtocolInterface.php b/plugins/vendor/webklex/php-imap/src/Connection/Protocols/ProtocolInterface.php deleted file mode 100644 index eb6d7c9d..00000000 --- a/plugins/vendor/webklex/php-imap/src/Connection/Protocols/ProtocolInterface.php +++ /dev/null @@ -1,458 +0,0 @@ - array('delim' => .., 'flags' => ..)) - * @throws RuntimeException - */ - public function folders(string $reference = '', string $folder = '*'): Response; - - /** - * Set message flags - * @param array|string $flags flags to set, add or remove - * @param int $from message for items or start message if $to !== null - * @param int|null $to if null only one message ($from) is fetched, else it's the - * last message, INF means last message available - * @param string|null $mode '+' to add flags, '-' to remove flags, everything else sets the flags as given - * @param bool $silent if false the return values are the new flags for the wanted messages - * @param int|string $uid set to IMAP::ST_UID or any string representing the UID - set to IMAP::ST_MSGN to use - * message numbers instead. - * @param string|null $item command used to store a flag - * - * @return Response containing the new flags if $silent is false, else true or false depending on success - * @throws RuntimeException - */ - public function store(array|string $flags, int $from, ?int $to = null, ?string $mode = null, bool $silent = true, int|string $uid = IMAP::ST_UID, ?string $item = null): Response; - - /** - * Append a new message to given folder - * @param string $folder name of target folder - * @param string $message full message content - * @param array|null $flags flags for new message - * @param string|null $date date for new message - * - * @return Response - * @throws RuntimeException - */ - public function appendMessage(string $folder, string $message, ?array $flags = null, ?string $date = null): Response; - - /** - * Copy message set from current folder to other folder - * - * @param string $folder destination folder - * @param $from - * @param int|null $to if null only one message ($from) is fetched, else it's the - * last message, INF means last message available - * @param int|string $uid set to IMAP::ST_UID or any string representing the UID - set to IMAP::ST_MSGN to use - * message numbers instead. - * - * @return Response - * @throws RuntimeException - */ - public function copyMessage(string $folder, $from, ?int $to = null, int|string $uid = IMAP::ST_UID): Response; - - /** - * Copy multiple messages to the target folder - * @param array $messages List of message identifiers - * @param string $folder Destination folder - * @param int|string $uid set to IMAP::ST_UID or any string representing the UID - set to IMAP::ST_MSGN to use - * message numbers instead. - * - * @return Response Tokens if operation successful, false if an error occurred - * @throws RuntimeException - */ - public function copyManyMessages(array $messages, string $folder, int|string $uid = IMAP::ST_UID): Response; - - /** - * Move a message set from current folder to another folder - * @param string $folder destination folder - * @param $from - * @param int|null $to if null only one message ($from) is fetched, else it's the - * last message, INF means last message available - * @param int|string $uid set to IMAP::ST_UID or any string representing the UID - set to IMAP::ST_MSGN to use - * message numbers instead. - * - * @return Response - */ - public function moveMessage(string $folder, $from, ?int $to = null, int|string $uid = IMAP::ST_UID): Response; - - /** - * Move multiple messages to the target folder - * - * @param array $messages List of message identifiers - * @param string $folder Destination folder - * @param int|string $uid set to IMAP::ST_UID or any string representing the UID - set to IMAP::ST_MSGN to use - * message numbers instead. - * - * @return Response Tokens if operation successful, false if an error occurred - * @throws RuntimeException - */ - public function moveManyMessages(array $messages, string $folder, int|string $uid = IMAP::ST_UID): Response; - - /** - * Exchange identification information - * Ref.: https://datatracker.ietf.org/doc/html/rfc2971 - * - * @param null $ids - * @return Response - * - * @throws RuntimeException - */ - public function ID($ids = null): Response; - - /** - * Create a new folder - * - * @param string $folder folder name - * @return Response - * @throws RuntimeException - */ - public function createFolder(string $folder): Response; - - /** - * Rename an existing folder - * - * @param string $old old name - * @param string $new new name - * @return Response - * @throws RuntimeException - */ - public function renameFolder(string $old, string $new): Response; - - /** - * Delete a folder - * - * @param string $folder folder name - * @return Response - * - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - */ - public function deleteFolder(string $folder): Response; - - /** - * Subscribe to a folder - * - * @param string $folder folder name - * @return Response - * - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - */ - public function subscribeFolder(string $folder): Response; - - /** - * Unsubscribe from a folder - * - * @param string $folder folder name - * @return Response - * - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - */ - public function unsubscribeFolder(string $folder): Response; - - /** - * Send idle command - * - * @throws RuntimeException - */ - public function idle(); - - /** - * Send done command - * @throws RuntimeException - */ - public function done(); - - /** - * Apply session saved changes to the server - * - * @return Response - * - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - */ - public function expunge(): Response; - - /** - * Retrieve the quota level settings, and usage statics per mailbox - * @param $username - * - * @return Response - * @throws RuntimeException - */ - public function getQuota($username): Response; - - /** - * Retrieve the quota settings per user - * - * @param string $quota_root - * - * @return Response - * @throws ConnectionFailedException - */ - public function getQuotaRoot(string $quota_root = 'INBOX'): Response; - - /** - * Send noop command - * - * @return Response - * - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - */ - public function noop(): Response; - - /** - * Do a search request - * - * @param array $params - * @param int|string $uid set to IMAP::ST_UID or any string representing the UID - set to IMAP::ST_MSGN to use - * message numbers instead. - * - * @return Response containing the message ids - * @throws RuntimeException - */ - public function search(array $params, int|string $uid = IMAP::ST_UID): Response; - - /** - * Get a message overview - * @param string $sequence uid sequence - * @param int|string $uid set to IMAP::ST_UID or any string representing the UID - set to IMAP::ST_MSGN to use - * message numbers instead. - * - * @return Response - * @throws RuntimeException - * @throws MessageNotFoundException - * @throws InvalidMessageDateException - */ - public function overview(string $sequence, int|string $uid = IMAP::ST_UID): Response; - - /** - * Enable the debug mode - */ - public function enableDebug(); - - /** - * Disable the debug mode - */ - public function disableDebug(); - - /** - * Enable uid caching - */ - public function enableUidCache(); - - /** - * Disable uid caching - */ - public function disableUidCache(); - - /** - * Set the uid cache of current active folder - * - * @param array|null $uids - */ - public function setUidCache(?array $uids); -} diff --git a/plugins/vendor/webklex/php-imap/src/Connection/Protocols/Response.php b/plugins/vendor/webklex/php-imap/src/Connection/Protocols/Response.php deleted file mode 100644 index 9a30d56d..00000000 --- a/plugins/vendor/webklex/php-imap/src/Connection/Protocols/Response.php +++ /dev/null @@ -1,417 +0,0 @@ -debug = $debug; - $this->noun = $noun > 0 ? $noun : (int)str_replace(".", "", (string)microtime(true)); - } - - /** - * Make a new response instance - * @param int $noun - * @param array $commands - * @param array $responses - * @param bool $debug - * - * @return Response - */ - public static function make(int $noun, array $commands = [], array $responses = [], bool $debug = false): Response { - return (new self($noun, $debug))->setCommands($commands)->setResponse($responses); - } - - /** - * Create a new empty response - * @param bool $debug - * - * @return Response - */ - public static function empty(bool $debug = false): Response { - return (new self(0, $debug)); - } - - /** - * Stack another response - * @param Response $response - * - * @return void - */ - public function stack(Response $response): void { - $this->response_stack[] = $response; - } - - /** - * Get the associated response stack - * - * @return array - */ - public function getStack(): array { - return $this->response_stack; - } - - /** - * Get all assigned commands - * - * @return array - */ - public function getCommands(): array { - return $this->commands; - } - - /** - * Add a new command - * @param string $command - * - * @return Response - */ - public function addCommand(string $command): Response { - $this->commands[] = $command; - return $this; - } - - /** - * Set and overwrite all commands - * @param array $commands - * - * @return Response - */ - public function setCommands(array $commands): Response { - $this->commands = $commands; - return $this; - } - - /** - * Get all set errors - * - * @return array - */ - public function getErrors(): array { - $errors = $this->errors; - foreach($this->getStack() as $response) { - $errors = array_merge($errors, $response->getErrors()); - } - return $errors; - } - - /** - * Set and overwrite all existing errors - * @param array $errors - * - * @return Response - */ - public function setErrors(array $errors): Response { - $this->errors = $errors; - return $this; - } - - /** - * Set the response - * @param string $error - * - * @return Response - */ - public function addError(string $error): Response { - $this->errors[] = $error; - return $this; - } - - /** - * Set the response - * @param array $response - * - * @return Response - */ - public function addResponse(mixed $response): Response { - $this->response[] = $response; - return $this; - } - - /** - * Set the response - * @param array $response - * - * @return Response - */ - public function setResponse(array $response): Response { - $this->response = $response; - return $this; - } - - /** - * Get the assigned response - * - * @return array - */ - public function getResponse(): array { - return $this->response; - } - - /** - * Set the result data - * @param mixed $result - * - * @return Response - */ - public function setResult(mixed $result): Response { - $this->result = $result; - return $this; - } - - /** - * Wrap a result bearing action - * @param callable $callback - * - * @return Response - */ - public function wrap(callable $callback): Response { - $this->result = call_user_func($callback, $this); - return $this; - } - - /** - * Get the response data - * - * @return mixed - */ - public function data(): mixed { - if ($this->result !== null) { - return $this->result; - } - return $this->getResponse(); - } - - /** - * Get the response data as array - * - * @return array - */ - public function array(): array { - $data = $this->data(); - if(is_array($data)){ - return $data; - } - return [$data]; - } - - /** - * Get the response data as string - * - * @return string - */ - public function string(): string { - $data = $this->data(); - if(is_array($data)){ - return implode(" ", $data); - } - return (string)$data; - } - - /** - * Get the response data as integer - * - * @return int - */ - public function integer(): int { - $data = $this->data(); - if(is_array($data) && isset($data[0])){ - return (int)$data[0]; - } - return (int)$data; - } - - /** - * Get the response data as boolean - * - * @return bool - */ - public function boolean(): bool { - return (bool)$this->data(); - } - - /** - * Validate and retrieve the response data - * - * @throws ResponseException - */ - public function validatedData(): mixed { - return $this->validate()->data(); - } - - /** - * Validate the response date - * - * @throws ResponseException - */ - public function validate(): Response { - if ($this->failed()) { - throw ResponseException::make($this, $this->debug); - } - return $this; - } - - /** - * Check if the Response can be considered successful - * - * @return bool - */ - public function successful(): bool { - foreach(array_merge($this->getResponse(), $this->array()) as $data) { - if (!$this->verify_data($data)) { - return false; - } - } - foreach($this->getStack() as $response) { - if (!$response->successful()) { - return false; - } - } - return ($this->boolean() || $this->canBeEmpty()) && !$this->getErrors(); - } - - - /** - * Check if the Response can be considered failed - * @param mixed $data - * - * @return bool - */ - public function verify_data(mixed $data): bool { - if (is_array($data)) { - foreach ($data as $line) { - if (is_array($line)) { - if(!$this->verify_data($line)){ - return false; - } - }else{ - if (!$this->verify_line((string)$line)) { - return false; - } - } - } - }else{ - if (!$this->verify_line((string)$data)) { - return false; - } - } - return true; - } - - /** - * Verify a single line - * @param string $line - * - * @return bool - */ - public function verify_line(string $line): bool { - return !str_starts_with($line, "TAG".$this->noun." BAD ") && !str_starts_with($line, "TAG".$this->noun." NO "); - } - - /** - * Check if the Response can be considered failed - * - * @return bool - */ - public function failed(): bool { - return !$this->successful(); - } - - /** - * Get the Response noun - * - * @return int - */ - public function Noun(): int { - return $this->noun; - } - - /** - * Set the Response to be allowed to be empty - * @param bool $can_be_empty - * - * @return $this - */ - public function setCanBeEmpty(bool $can_be_empty): Response { - $this->can_be_empty = $can_be_empty; - return $this; - } - - /** - * Check if the Response can be empty - * - * @return bool - */ - public function canBeEmpty(): bool { - return $this->can_be_empty; - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/src/Decoder/AttachmentDecoder.php b/plugins/vendor/webklex/php-imap/src/Decoder/AttachmentDecoder.php deleted file mode 100644 index 22780353..00000000 --- a/plugins/vendor/webklex/php-imap/src/Decoder/AttachmentDecoder.php +++ /dev/null @@ -1,25 +0,0 @@ -options = array_merge([ - 'header' => 'utf-8', - 'message' => 'utf-8', - 'attachment' => 'utf-8', - ], $this->options); - } - - /** - * Decode a given value - * @param array|string|null $value - * @param string|null $encoding - * @return mixed - */ - public function decode(array|string|null $value, ?string $encoding = null): mixed { - return $value; - } - - /** - * Convert the encoding - * @param string $str The string to convert - * @param string $from The source encoding - * @param string $to The target encoding - * - * @return mixed|string - */ - public function convertEncoding(string $str, string $from = "ISO-8859-2", string $to = "UTF-8"): mixed { - $from = EncodingAliases::get($from, $this->fallback_encoding); - $to = EncodingAliases::get($to, $this->fallback_encoding); - - if ($from === $to) { - return $str; - } - - return EncodingAliases::convert($str, $from, $to); - } - - /** - * Decode MIME header elements - * @link https://php.net/manual/en/function.imap-mime-header-decode.php - * @param string $text The MIME text - * - * @return array Returns an array of objects. Each *object has two properties, charset and text. - */ - public function mimeHeaderDecode(string $text): array { - if (extension_loaded('imap')) { - $result = \imap_mime_header_decode($text); - return is_array($result) ? $result : []; - } - $charset = $this->getEncoding($text); - return [(object)[ - "charset" => $charset, - "text" => $this->convertEncoding($text, $charset) - ]]; - } - - /** - * Test if a given value is utf-8 encoded - * @param $value - * - * @return bool - */ - public static function isUTF8($value): bool { - return str_starts_with(strtolower($value), '=?utf-8?'); - } - - /** - * Check if a given pair of strings has been decoded - * @param $encoded - * @param $decoded - * - * @return bool - */ - public static function notDecoded($encoded, $decoded): bool { - return str_starts_with($decoded, '=?') - && strlen($decoded) - 2 === strpos($decoded, '?=') - && str_contains($encoded, $decoded); - } - - /** - * Set the configuration used for decoding - * @param array $config - * - * @return Decoder - */ - public function setOptions(array $config): static { - $this->options = $config; - return $this; - } - - /** - * Get the configuration used for decoding - * - * @return array - */ - public function getOptions(): array { - return $this->options; - } - - /** - * Get the fallback encoding - * - * @return string - */ - public function getFallbackEncoding(): string { - return $this->fallback_encoding; - } - - /** - * Set the fallback encoding - * - * @param string $fallback_encoding - * @return Decoder - */ - public function setFallbackEncoding(string $fallback_encoding): static { - $this->fallback_encoding = $fallback_encoding; - return $this; - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/src/Decoder/DecoderInterface.php b/plugins/vendor/webklex/php-imap/src/Decoder/DecoderInterface.php deleted file mode 100644 index e4874602..00000000 --- a/plugins/vendor/webklex/php-imap/src/Decoder/DecoderInterface.php +++ /dev/null @@ -1,52 +0,0 @@ -decodeHeaderArray($value); - } - $original_value = $value; - $decoder = $this->options['header']; - - if ($value !== null) { - if ($decoder === 'utf-8') { - $decoded_values = $this->mimeHeaderDecode($value); - $tempValue = ""; - foreach ($decoded_values as $decoded_value) { - $tempValue .= $this->convertEncoding($decoded_value->text, $decoded_value->charset); - } - if ($tempValue) { - $value = $tempValue; - } else if (extension_loaded('imap')) { - $value = \imap_utf8($value); - } else if (function_exists('iconv_mime_decode')) { - $value = iconv_mime_decode($value, ICONV_MIME_DECODE_CONTINUE_ON_ERROR, "UTF-8"); - } else { - $value = mb_decode_mimeheader($value); - } - } elseif ($decoder === 'iconv') { - $value = iconv_mime_decode($value, ICONV_MIME_DECODE_CONTINUE_ON_ERROR, "UTF-8"); - } else if (self::isUTF8($value)) { - $value = mb_decode_mimeheader($value); - } - - if (self::notDecoded($original_value, $value)) { - $value = $this->convertEncoding($original_value, $this->getEncoding($original_value)); - } - } - - return $value; - } - - /** - * Get the encoding of a given abject - * @param object|string $structure - * - * @return string - */ - public function getEncoding(object|string $structure): string { - if (property_exists($structure, 'parameters')) { - foreach ($structure->parameters as $parameter) { - if (strtolower($parameter->attribute) == "charset") { - return EncodingAliases::get($parameter->value == "default" ? EncodingAliases::detectEncoding($parameter->value) : $parameter->value, $this->fallback_encoding); - } - } - } elseif (property_exists($structure, 'charset')) { - return EncodingAliases::get($structure->charset == "default" ? EncodingAliases::detectEncoding($structure->charset) : $structure->charset, $this->fallback_encoding); - } elseif (is_string($structure) === true) { - $result = mb_detect_encoding($structure); - return $result === false ? $this->fallback_encoding : $result; - } - - return $this->fallback_encoding; - } - - - /** - * Decode a given array - * @param array $values - * - * @return array - */ - private function decodeHeaderArray(array $values): array { - foreach ($values as $key => $value) { - $values[$key] = $this->decode($value); - } - return $values; - } - -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/src/Decoder/MessageDecoder.php b/plugins/vendor/webklex/php-imap/src/Decoder/MessageDecoder.php deleted file mode 100644 index 4a2cff2f..00000000 --- a/plugins/vendor/webklex/php-imap/src/Decoder/MessageDecoder.php +++ /dev/null @@ -1,119 +0,0 @@ -decode($item); - }, $value); - } - - switch ($encoding) { - case IMAP::MESSAGE_ENC_BINARY: - if (extension_loaded('imap')) { - return base64_decode(\imap_binary($value)); - } - return base64_decode($value); - case IMAP::MESSAGE_ENC_BASE64: - return base64_decode($value); - case IMAP::MESSAGE_ENC_QUOTED_PRINTABLE: - return quoted_printable_decode($value); - case IMAP::MESSAGE_ENC_8BIT: - case IMAP::MESSAGE_ENC_7BIT: - case IMAP::MESSAGE_ENC_OTHER: - default: - return $value; - } - } - - /** - * Get the encoding of a given abject - * @param object|string $structure - * - * @return string - */ - public function getEncoding(object|string $structure): string { - if (property_exists($structure, 'parameters')) { - foreach ($structure->parameters as $parameter) { - if (strtolower($parameter->attribute) == "charset") { - return EncodingAliases::get($parameter->value, "ISO-8859-2"); - } - } - } elseif (property_exists($structure, 'charset')) { - return EncodingAliases::get($structure->charset, "ISO-8859-2"); - } elseif (is_string($structure) === true) { - return EncodingAliases::detectEncoding($structure); - } - - return $this->fallback_encoding; - } - - - /** - * Convert the encoding - * @param $str - * @param string $from - * @param string $to - * - * @return mixed|string - */ - public function convertEncoding($str, string $from = "ISO-8859-2", string $to = "UTF-8"): mixed { - $from = EncodingAliases::get($from); - $to = EncodingAliases::get($to); - - if ($from === $to) { - return $str; - } - - // We don't need to do convertEncoding() if charset is ASCII (us-ascii): - // ASCII is a subset of UTF-8, so all ASCII files are already UTF-8 encoded - // https://stackoverflow.com/a/11303410 - // - // us-ascii is the same as ASCII: - // ASCII is the traditional name for the encoding system; the Internet Assigned Numbers Authority (IANA) - // prefers the updated name US-ASCII, which clarifies that this system was developed in the US and - // based on the typographical symbols predominantly in use there. - // https://en.wikipedia.org/wiki/ASCII - // - // convertEncoding() function basically means convertToUtf8(), so when we convert ASCII string into UTF-8 it gets broken. - if (strtolower($from ?? '') == 'us-ascii' && $to == 'UTF-8') { - return $str; - } - - if (function_exists('iconv') && !EncodingAliases::isUtf7($from) && !EncodingAliases::isUtf7($to)) { - try { - return iconv($from, $to.'//IGNORE', $str); - } catch (Exception) { - return @iconv($from, $to, $str); - } - } else { - if (!$from) { - return mb_convert_encoding($str, $to); - } - return mb_convert_encoding($str, $to, $from); - } - } - -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/src/EncodingAliases.php b/plugins/vendor/webklex/php-imap/src/EncodingAliases.php deleted file mode 100644 index 8a3dc0fb..00000000 --- a/plugins/vendor/webklex/php-imap/src/EncodingAliases.php +++ /dev/null @@ -1,591 +0,0 @@ - "us-ascii", - "us-ascii" => "us-ascii", - "ansi_x3.4-1968" => "us-ascii", - "646" => "us-ascii", - "iso-8859-1" => "ISO-8859-1", - "iso-8859-2" => "ISO-8859-2", - "iso-8859-3" => "ISO-8859-3", - "iso-8859-4" => "ISO-8859-4", - "iso-8859-5" => "ISO-8859-5", - "iso-8859-6" => "ISO-8859-6", - "iso-8859-6-i" => "ISO-8859-6-I", - "iso-8859-6-e" => "ISO-8859-6-E", - "iso-8859-7" => "ISO-8859-7", - "iso-8859-8" => "ISO-8859-8", - "iso-8859-8-i" => "ISO-8859-8-I", - "iso-8859-8-e" => "ISO-8859-8-E", - "iso-8859-9" => "ISO-8859-9", - "iso-8859-10" => "ISO-8859-10", - "iso-8859-11" => "ISO-8859-11", - "iso-8859-13" => "ISO-8859-13", - "iso-8859-14" => "ISO-8859-14", - "iso-8859-15" => "ISO-8859-15", - "iso-8859-16" => "ISO-8859-16", - "iso-ir-111" => "ISO-IR-111", - "iso-2022-cn" => "ISO-2022-CN", - "iso-2022-cn-ext" => "ISO-2022-CN", - "iso-2022-kr" => "ISO-2022-KR", - "iso-2022-jp" => "ISO-2022-JP", - "utf-16be" => "UTF-16BE", - "utf-16le" => "UTF-16LE", - "utf-16" => "UTF-16", - "windows-1250" => "windows-1250", - "windows-1251" => "windows-1251", - "windows-1252" => "windows-1252", - "windows-1253" => "windows-1253", - "windows-1254" => "windows-1254", - "windows-1255" => "windows-1255", - "windows-1256" => "windows-1256", - "windows-1257" => "windows-1257", - "windows-1258" => "windows-1258", - "ibm866" => "IBM866", - "ibm850" => "IBM850", - "ibm852" => "IBM852", - "ibm855" => "IBM855", - "ibm857" => "IBM857", - "ibm862" => "IBM862", - "ibm864" => "IBM864", - "utf-8" => "UTF-8", - "utf-7" => "UTF-7", - "utf-7-imap" => "UTF7-IMAP", - "utf7-imap" => "UTF7-IMAP", - "shift_jis" => "Shift_JIS", - "big5" => "Big5", - "euc-jp" => "EUC-JP", - "euc-kr" => "EUC-KR", - "gb2312" => "GB2312", - "gb18030" => "gb18030", - "viscii" => "VISCII", - "koi8-r" => "KOI8-R", - "koi8_r" => "KOI8-R", - "cskoi8r" => "KOI8-R", - "koi" => "KOI8-R", - "koi8" => "KOI8-R", - "koi8-u" => "KOI8-U", - "tis-620" => "TIS-620", - "t.61-8bit" => "T.61-8bit", - "hz-gb-2312" => "HZ-GB-2312", - "big5-hkscs" => "Big5-HKSCS", - "gbk" => "gbk", - "cns11643" => "x-euc-tw", - // - // Aliases for ISO-8859-1 - // - "latin1" => "ISO-8859-1", - "iso_8859-1" => "ISO-8859-1", - "iso8859-1" => "ISO-8859-1", - "iso8859-2" => "ISO-8859-2", - "iso8859-3" => "ISO-8859-3", - "iso8859-4" => "ISO-8859-4", - "iso8859-5" => "ISO-8859-5", - "iso8859-6" => "ISO-8859-6", - "iso8859-7" => "ISO-8859-7", - "iso8859-8" => "ISO-8859-8", - "iso8859-9" => "ISO-8859-9", - "iso8859-10" => "ISO-8859-10", - "iso8859-11" => "ISO-8859-11", - "iso8859-13" => "ISO-8859-13", - "iso8859-14" => "ISO-8859-14", - "iso8859-15" => "ISO-8859-15", - "iso_8859-1:1987" => "ISO-8859-1", - "iso-ir-100" => "ISO-8859-1", - "l1" => "ISO-8859-1", - "ibm819" => "ISO-8859-1", - "cp819" => "ISO-8859-1", - "csisolatin1" => "ISO-8859-1", - // - // Aliases for ISO-8859-2 - // - "latin2" => "ISO-8859-2", - "iso_8859-2" => "ISO-8859-2", - "iso_8859-2:1987" => "ISO-8859-2", - "iso-ir-101" => "ISO-8859-2", - "l2" => "ISO-8859-2", - "csisolatin2" => "ISO-8859-2", - // - // Aliases for ISO-8859-3 - // - "latin3" => "ISO-8859-3", - "iso_8859-3" => "ISO-8859-3", - "iso_8859-3:1988" => "ISO-8859-3", - "iso-ir-109" => "ISO-8859-3", - "l3" => "ISO-8859-3", - "csisolatin3" => "ISO-8859-3", - // - // Aliases for ISO-8859-4 - // - "latin4" => "ISO-8859-4", - "iso_8859-4" => "ISO-8859-4", - "iso_8859-4:1988" => "ISO-8859-4", - "iso-ir-110" => "ISO-8859-4", - "l4" => "ISO-8859-4", - "csisolatin4" => "ISO-8859-4", - // - // Aliases for ISO-8859-5 - // - "cyrillic" => "ISO-8859-5", - "iso_8859-5" => "ISO-8859-5", - "iso_8859-5:1988" => "ISO-8859-5", - "iso-ir-144" => "ISO-8859-5", - "csisolatincyrillic" => "ISO-8859-5", - // - // Aliases for ISO-8859-6 - // - "arabic" => "ISO-8859-6", - "iso_8859-6" => "ISO-8859-6", - "iso_8859-6:1987" => "ISO-8859-6", - "iso-ir-127" => "ISO-8859-6", - "ecma-114" => "ISO-8859-6", - "asmo-708" => "ISO-8859-6", - "csisolatinarabic" => "ISO-8859-6", - // - // Aliases for ISO-8859-6-I - // - "csiso88596i" => "ISO-8859-6-I", - // - // Aliases for ISO-8859-6-E", - // - "csiso88596e" => "ISO-8859-6-E", - // - // Aliases for ISO-8859-7", - // - "greek" => "ISO-8859-7", - "greek8" => "ISO-8859-7", - "sun_eu_greek" => "ISO-8859-7", - "iso_8859-7" => "ISO-8859-7", - "iso_8859-7:1987" => "ISO-8859-7", - "iso-ir-126" => "ISO-8859-7", - "elot_928" => "ISO-8859-7", - "ecma-118" => "ISO-8859-7", - "csisolatingreek" => "ISO-8859-7", - // - // Aliases for ISO-8859-8", - // - "hebrew" => "ISO-8859-8", - "iso_8859-8" => "ISO-8859-8", - "visual" => "ISO-8859-8", - "iso_8859-8:1988" => "ISO-8859-8", - "iso-ir-138" => "ISO-8859-8", - "csisolatinhebrew" => "ISO-8859-8", - // - // Aliases for ISO-8859-8-I", - // - "csiso88598i" => "ISO-8859-8-I", - "iso-8859-8i" => "ISO-8859-8-I", - "logical" => "ISO-8859-8-I", - // - // Aliases for ISO-8859-8-E", - // - "csiso88598e" => "ISO-8859-8-E", - // - // Aliases for ISO-8859-9", - // - "latin5" => "ISO-8859-9", - "iso_8859-9" => "ISO-8859-9", - "iso_8859-9:1989" => "ISO-8859-9", - "iso-ir-148" => "ISO-8859-9", - "l5" => "ISO-8859-9", - "csisolatin5" => "ISO-8859-9", - // - // Aliases for UTF-8", - // - "unicode-1-1-utf-8" => "UTF-8", - // nl_langinfo(CODESET) in HP/UX returns 'utf8' under UTF-8 locales", - "utf8" => "UTF-8", - // - // Aliases for Shift_JIS", - // - "x-sjis" => "Shift_JIS", - "shift-jis" => "Shift_JIS", - "ms_kanji" => "Shift_JIS", - "csshiftjis" => "Shift_JIS", - "windows-31j" => "Shift_JIS", - "cp932" => "Shift_JIS", - "sjis" => "Shift_JIS", - // - // Aliases for EUC_JP", - // - "cseucpkdfmtjapanese" => "EUC-JP", - "x-euc-jp" => "EUC-JP", - // - // Aliases for ISO-2022-JP", - // - "csiso2022jp" => "ISO-2022-JP", - // The following are really not aliases ISO-2022-JP, but sharing the same decoder", - "iso-2022-jp-2" => "ISO-2022-JP", - "csiso2022jp2" => "ISO-2022-JP", - // - // Aliases for Big5", - // - "csbig5" => "Big5", - "cn-big5" => "Big5", - // x-x-big5 is not really a alias for Big5, add it only for MS FrontPage", - "x-x-big5" => "Big5", - // Sun Solaris", - "zh_tw-big5" => "Big5", - // - // Aliases for EUC-KR", - // - "cseuckr" => "EUC-KR", - "ks_c_5601-1987" => "EUC-KR", - "iso-ir-149" => "EUC-KR", - "ks_c_5601-1989" => "EUC-KR", - "ksc_5601" => "EUC-KR", - "ksc5601" => "EUC-KR", - "korean" => "EUC-KR", - "csksc56011987" => "EUC-KR", - "5601" => "EUC-KR", - "windows-949" => "EUC-KR", - // - // Aliases for GB2312", - // - // The following are really not aliases GB2312, add them only for MS FrontPage", - "gb_2312-80" => "GB2312", - "iso-ir-58" => "GB2312", - "chinese" => "GB2312", - "csiso58gb231280" => "GB2312", - "csgb2312" => "GB2312", - "zh_cn.euc" => "GB2312", - // Sun Solaris", - "gb_2312" => "GB2312", - // - // Aliases for windows-125x ", - // - "x-cp1250" => "windows-1250", - "x-cp1251" => "windows-1251", - "x-cp1252" => "windows-1252", - "x-cp1253" => "windows-1253", - "x-cp1254" => "windows-1254", - "x-cp1255" => "windows-1255", - "x-cp1256" => "windows-1256", - "x-cp1257" => "windows-1257", - "x-cp1258" => "windows-1258", - // - // Aliases for windows-874 ", - // - "windows-874" => "windows-874", - "ibm874" => "windows-874", - "dos-874" => "windows-874", - // - // Aliases for macintosh", - // - "macintosh" => "macintosh", - "x-mac-roman" => "macintosh", - "mac" => "macintosh", - "csmacintosh" => "macintosh", - // - // Aliases for IBM866", - // - "cp866" => "IBM866", - "cp-866" => "IBM866", - "866" => "IBM866", - "csibm866" => "IBM866", - // - // Aliases for IBM850", - // - "cp850" => "IBM850", - "850" => "IBM850", - "csibm850" => "IBM850", - // - // Aliases for IBM852", - // - "cp852" => "IBM852", - "852" => "IBM852", - "csibm852" => "IBM852", - // - // Aliases for IBM855", - // - "cp855" => "IBM855", - "855" => "IBM855", - "csibm855" => "IBM855", - // - // Aliases for IBM857", - // - "cp857" => "IBM857", - "857" => "IBM857", - "csibm857" => "IBM857", - // - // Aliases for IBM862", - // - "cp862" => "IBM862", - "862" => "IBM862", - "csibm862" => "IBM862", - // - // Aliases for IBM864", - // - "cp864" => "IBM864", - "864" => "IBM864", - "csibm864" => "IBM864", - "ibm-864" => "IBM864", - // - // Aliases for T.61-8bit", - // - "t.61" => "T.61-8bit", - "iso-ir-103" => "T.61-8bit", - "csiso103t618bit" => "T.61-8bit", - // - // Aliases for UTF-7", - // - "x-unicode-2-0-utf-7" => "UTF-7", - "unicode-2-0-utf-7" => "UTF-7", - "unicode-1-1-utf-7" => "UTF-7", - "csunicode11utf7" => "UTF-7", - // - // Aliases for ISO-10646-UCS-2", - // - "csunicode" => "UTF-16BE", - "csunicode11" => "UTF-16BE", - "iso-10646-ucs-basic" => "UTF-16BE", - "csunicodeascii" => "UTF-16BE", - "iso-10646-unicode-latin1" => "UTF-16BE", - "csunicodelatin1" => "UTF-16BE", - "iso-10646" => "UTF-16BE", - "iso-10646-j-1" => "UTF-16BE", - // - // Aliases for ISO-8859-10", - // - "latin6" => "ISO-8859-10", - "iso-ir-157" => "ISO-8859-10", - "l6" => "ISO-8859-10", - // Currently .properties cannot handle : in key", - //iso_8859-10:1992" => "ISO-8859-10", - "csisolatin6" => "ISO-8859-10", - // - // Aliases for ISO-8859-15", - // - "iso_8859-15" => "ISO-8859-15", - "csisolatin9" => "ISO-8859-15", - "l9" => "ISO-8859-15", - // - // Aliases for ISO-IR-111", - // - "ecma-cyrillic" => "ISO-IR-111", - "csiso111ecmacyrillic" => "ISO-IR-111", - // - // Aliases for ISO-2022-KR", - // - "csiso2022kr" => "ISO-2022-KR", - // - // Aliases for VISCII", - // - "csviscii" => "VISCII", - // - // Aliases for x-euc-tw", - // - "zh_tw-euc" => "x-euc-tw", - // - // Following names appears in unix nl_langinfo(CODESET)", - // They can be compiled as platform specific if necessary", - // DONT put things here if it does not look generic enough (like hp15CN)", - // - "iso88591" => "ISO-8859-1", - "iso88592" => "ISO-8859-2", - "iso88593" => "ISO-8859-3", - "iso88594" => "ISO-8859-4", - "iso88595" => "ISO-8859-5", - "iso88596" => "ISO-8859-6", - "iso88597" => "ISO-8859-7", - "iso88598" => "ISO-8859-8", - "iso88599" => "ISO-8859-9", - "iso885910" => "ISO-8859-10", - "iso885911" => "ISO-8859-11", - "iso885912" => "ISO-8859-12", - "iso885913" => "ISO-8859-13", - "iso885914" => "ISO-8859-14", - "iso885915" => "ISO-8859-15", - "cp1250" => "windows-1250", - "cp1251" => "windows-1251", - "cp1252" => "windows-1252", - "cp1253" => "windows-1253", - "cp1254" => "windows-1254", - "cp1255" => "windows-1255", - "cp1256" => "windows-1256", - "cp1257" => "windows-1257", - "cp1258" => "windows-1258", - "x-gbk" => "gbk", - "windows-936" => "gbk", - "ansi-1251" => "windows-1251", - ]; - - /** - * Returns proper encoding mapping, if exists. If it doesn't, return unchanged $encoding - * @param string|null $encoding - * @param string|null $fallback - * - * @return string - */ - public static function get(?string $encoding, ?string $fallback = null): string { - if (isset(self::$aliases[strtolower($encoding ?? '')])) { - return self::$aliases[strtolower($encoding ?? '')]; - } - return $fallback ?: $encoding; - } - - - /** - * Convert the encoding of a string - * @param $str - * @param string $from - * @param string $to - * - * @return mixed - */ - public static function convert($str, string $from = "ISO-8859-2", string $to = "UTF-8"): mixed { - $from = self::get($from, self::detectEncoding($str)); - $to = self::get($to, self::detectEncoding($str)); - - if ($from === $to) { - return $str; - } - - // We don't need to do convertEncoding() if charset is ASCII (us-ascii): - // ASCII is a subset of UTF-8, so all ASCII files are already UTF-8 encoded - // https://stackoverflow.com/a/11303410 - // - // us-ascii is the same as ASCII: - // ASCII is the traditional name for the encoding system; the Internet Assigned Numbers Authority (IANA) - // prefers the updated name US-ASCII, which clarifies that this system was developed in the US and - // based on the typographical symbols predominantly in use there. - // https://en.wikipedia.org/wiki/ASCII - // - // convertEncoding() function basically means convertToUtf8(), so when we convert ASCII string into UTF-8 it gets broken. - if (strtolower($from) == 'us-ascii' && $to == 'UTF-8') { - return $str; - } - - try { - if (function_exists('iconv') && !self::isUtf7($from) && !self::isUtf7($to)) { - return iconv($from, $to, $str); - } - if (!$from) { - return mb_convert_encoding($str, $to); - } - return mb_convert_encoding($str, $to, $from); - } catch (\Exception $e) { - if (str_contains($from, '-')) { - $from = str_replace('-', '', $from); - return self::convert($str, $from, $to); - } - return $str; - } - } - - /** - * Attempts to detect the encoding of a string - * @param string $string - * - * @return string - */ - public static function detectEncoding(string $string): string { - $encoding = mb_detect_encoding($string, array_filter(self::getEncodings(), function($value){ - return !in_array($value, [ - 'ISO-8859-6-I', 'ISO-8859-6-E', 'ISO-8859-8-I', 'ISO-8859-8-E', - 'ISO-8859-11', 'ISO-8859-13', 'ISO-8859-14', 'ISO-8859-15', 'ISO-8859-16', 'ISO-IR-111',"ISO-2022-CN", - "windows-1250", "windows-1253", "windows-1255", "windows-1256", "windows-1257", "windows-1258", - "IBM852", "IBM855", "IBM857", "IBM866", "IBM864", "IBM862", "KOI8-R", "KOI8-U", - "TIS-620", "ISO-8859-1", "ISO-8859-2", "ISO-8859-3", "ISO-8859-4", - "VISCII", "T.61-8bit", "Big5-HKSCS", "windows-874", "macintosh", "ISO-8859-12", "ISO-8859-7", - "IMAP-UTF-7" - ]); - }), true); - if ($encoding === false) { - $encoding = 'UTF-8'; - } - return $encoding; - } - - /** - * Returns all available encodings - * - * @return array - */ - public static function getEncodings(): array { - $encodings = []; - foreach (self::$aliases as $encoding) { - if (!in_array($encoding, $encodings)) { - $encodings[] = $encoding; - } - } - return $encodings; - } - - /** - * Returns true if the encoding is UTF-7 like - * @param string $encoding - * - * @return bool - */ - public static function isUtf7(string $encoding): bool { - return str_contains(str_replace("-", "", strtolower($encoding)), "utf7"); - } - - /** - * Check if an encoding is supported - * @param string $encoding - * - * @return bool - */ - public static function has(string $encoding): bool { - return isset(self::$aliases[strtolower($encoding)]); - } -} diff --git a/plugins/vendor/webklex/php-imap/src/Events/Event.php b/plugins/vendor/webklex/php-imap/src/Events/Event.php deleted file mode 100644 index f9e3e8f6..00000000 --- a/plugins/vendor/webklex/php-imap/src/Events/Event.php +++ /dev/null @@ -1,28 +0,0 @@ -message = $arguments[0]; - $this->flag = $arguments[1]; - } -} diff --git a/plugins/vendor/webklex/php-imap/src/Events/FolderDeletedEvent.php b/plugins/vendor/webklex/php-imap/src/Events/FolderDeletedEvent.php deleted file mode 100644 index 89b5083f..00000000 --- a/plugins/vendor/webklex/php-imap/src/Events/FolderDeletedEvent.php +++ /dev/null @@ -1,22 +0,0 @@ -old_folder = $folders[0]; - $this->new_folder = $folders[1]; - } -} diff --git a/plugins/vendor/webklex/php-imap/src/Events/FolderNewEvent.php b/plugins/vendor/webklex/php-imap/src/Events/FolderNewEvent.php deleted file mode 100644 index 0c576cad..00000000 --- a/plugins/vendor/webklex/php-imap/src/Events/FolderNewEvent.php +++ /dev/null @@ -1,36 +0,0 @@ -folder = $folders[0]; - } -} diff --git a/plugins/vendor/webklex/php-imap/src/Events/MessageCopiedEvent.php b/plugins/vendor/webklex/php-imap/src/Events/MessageCopiedEvent.php deleted file mode 100644 index a6a3a447..00000000 --- a/plugins/vendor/webklex/php-imap/src/Events/MessageCopiedEvent.php +++ /dev/null @@ -1,22 +0,0 @@ -old_message = $messages[0]; - $this->new_message = $messages[1]; - } -} diff --git a/plugins/vendor/webklex/php-imap/src/Events/MessageNewEvent.php b/plugins/vendor/webklex/php-imap/src/Events/MessageNewEvent.php deleted file mode 100644 index 38892c49..00000000 --- a/plugins/vendor/webklex/php-imap/src/Events/MessageNewEvent.php +++ /dev/null @@ -1,36 +0,0 @@ -message = $messages[0]; - } -} diff --git a/plugins/vendor/webklex/php-imap/src/Events/MessageRestoredEvent.php b/plugins/vendor/webklex/php-imap/src/Events/MessageRestoredEvent.php deleted file mode 100644 index 25b6520a..00000000 --- a/plugins/vendor/webklex/php-imap/src/Events/MessageRestoredEvent.php +++ /dev/null @@ -1,22 +0,0 @@ -getErrors() as $error) { - $message .= "\t- $error\n"; - } - - if(!$response->data()) { - $message .= "\t- Empty response\n"; - } - - if ($debug) { - $message .= self::debug_message($response); - } - - foreach($response->getStack() as $_response) { - $exception = self::make($_response, $debug, $exception); - } - - return new self($message."Error occurred", 0, $exception); - } - - /** - * Generate a debug message containing all commands send and responses received - * @param Response $response - * - * @return string - */ - protected static function debug_message(Response $response): string { - $commands = $response->getCommands(); - $message = "Commands send:\n"; - if ($commands) { - foreach($commands as $command) { - $message .= "\t".str_replace("\r\n", "\\r\\n", $command)."\n"; - } - }else{ - $message .= "\tNo command send!\n"; - } - - $responses = $response->getResponse(); - $message .= "Responses received:\n"; - if ($responses) { - foreach($responses as $_response) { - if (is_array($_response)) { - foreach($_response as $value) { - $message .= "\t".str_replace("\r\n", "\\r\\n", "$value")."\n"; - } - }else{ - $message .= "\t".str_replace("\r\n", "\\r\\n", "$_response")."\n"; - } - } - }else{ - $message .= "\tNo responses received!\n"; - } - - return $message; - } -} diff --git a/plugins/vendor/webklex/php-imap/src/Exceptions/RuntimeException.php b/plugins/vendor/webklex/php-imap/src/Exceptions/RuntimeException.php deleted file mode 100644 index 926be1d1..00000000 --- a/plugins/vendor/webklex/php-imap/src/Exceptions/RuntimeException.php +++ /dev/null @@ -1,24 +0,0 @@ -client = $client; - - $this->events["message"] = $client->getDefaultEvents("message"); - $this->events["folder"] = $client->getDefaultEvents("folder"); - - $this->setDelimiter($delimiter); - $this->path = $folder_name; - $this->full_name = $this->decodeName($folder_name); - $this->name = $this->getSimpleName($this->delimiter, $this->full_name); - $this->children = new FolderCollection(); - $this->has_children = false; - - $this->parseAttributes($attributes); - } - - /** - * Get a new search query instance - * @param string[] $extensions - * - * @return WhereQuery - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws ResponseException - */ - public function query(array $extensions = []): WhereQuery { - $this->getClient()->checkConnection(); - $this->getClient()->openFolder($this->path); - $extensions = count($extensions) > 0 ? $extensions : $this->getClient()->extensions; - - return new WhereQuery($this->getClient(), $extensions); - } - - /** - * Get a new search query instance - * @param string[] $extensions - * - * @return WhereQuery - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws ResponseException - */ - public function search(array $extensions = []): WhereQuery { - return $this->query($extensions); - } - - /** - * Get a new search query instance - * @param string[] $extensions - * - * @return WhereQuery - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws ResponseException - */ - public function messages(array $extensions = []): WhereQuery { - return $this->query($extensions); - } - - /** - * Determine if folder has children. - * - * @return bool - */ - public function hasChildren(): bool { - return $this->has_children; - } - - /** - * Set children. - * @param FolderCollection $children - * - * @return Folder - */ - public function setChildren(FolderCollection $children): Folder { - $this->children = $children; - - return $this; - } - - /** - * Get children. - * - * @return FolderCollection - */ - public function getChildren(): FolderCollection { - return $this->children; - } - - /** - * Decode name. - * It converts UTF7-IMAP encoding to UTF-8. - * @param $name - * - * @return string|array|bool|string[]|null - */ - protected function decodeName($name): string|array|bool|null { - $parts = []; - foreach (explode($this->delimiter, $name) as $item) { - $parts[] = EncodingAliases::convert($item, "UTF7-IMAP"); - } - - return implode($this->delimiter, $parts); - } - - /** - * Get simple name (without parent folders). - * @param $delimiter - * @param $full_name - * - * @return string|bool - */ - protected function getSimpleName($delimiter, $full_name): string|bool { - $arr = explode($delimiter, $full_name); - return end($arr); - } - - /** - * Parse attributes and set it to object properties. - * @param $attributes - */ - protected function parseAttributes($attributes): void { - $this->no_inferiors = in_array('\NoInferiors', $attributes, true) || \in_array('\Noinferiors', $attributes, true); - $this->no_select = in_array('\NoSelect', $attributes, true) || \in_array('\Noselect', $attributes, true); - $this->marked = in_array('\Marked', $attributes); - $this->referral = in_array('\Referral', $attributes); - $this->has_children = in_array('\HasChildren', $attributes); - } - - /** - * Move or rename the current folder - * @param string $new_name - * @param boolean $expunge - * - * @return array - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - * @throws AuthFailedException - * @throws ResponseException - */ - public function move(string $new_name, bool $expunge = true): array { - $this->client->checkConnection(); - $status = $this->client->getConnection()->renameFolder($this->full_name, $new_name)->validatedData(); - if ($expunge) $this->client->expunge(); - - $folder = $this->client->getFolder($new_name); - $this->dispatch("folder", "moved", $this, $folder); - - return $status; - } - - /** - * Get a message overview - * @param string|null $sequence uid sequence - * - * @return array - * @throws ConnectionFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - * @throws AuthFailedException - * @throws InvalidMessageDateException - * @throws MessageNotFoundException - * @throws ResponseException - */ - public function overview(?string $sequence = null): array { - $this->client->openFolder($this->path); - $sequence = $sequence === null ? "1:*" : $sequence; - $uid = $this->client->getConfig()->get('options.sequence', IMAP::ST_MSGN); - $response = $this->client->getConnection()->overview($sequence, $uid); - return $response->validatedData(); - } - - /** - * Append a string message to the current mailbox - * @param string $message - * @param array|null $options - * @param string|Carbon|null $internal_date - * - * @return array - * @throws ConnectionFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - * @throws AuthFailedException - * @throws ResponseException - */ - public function appendMessage(string $message, ?array $options = null, Carbon|string|null $internal_date = null): array { - /** - * Check if $internal_date is parsed. If it is null it should not be set. Otherwise, the message can't be stored. - * If this parameter is set, it will set the INTERNALDATE on the appended message. The parameter should be a - * date string that conforms to the rfc2060 specifications for a date_time value or be a Carbon object. - */ - - if ($internal_date instanceof Carbon) { - $internal_date = $internal_date->format('d-M-Y H:i:s O'); - } - - return $this->client->getConnection()->appendMessage($this->path, $message, $options, $internal_date)->validatedData(); - } - - /** - * Rename the current folder - * @param string $new_name - * @param boolean $expunge - * - * @return array - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws RuntimeException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws AuthFailedException - * @throws ResponseException - */ - public function rename(string $new_name, bool $expunge = true): array { - return $this->move($new_name, $expunge); - } - - /** - * Delete the current folder - * @param boolean $expunge - * - * @return array - * @throws ConnectionFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - * @throws EventNotFoundException - * @throws AuthFailedException - * @throws ResponseException - */ - public function delete(bool $expunge = true): array { - $status = $this->client->getConnection()->deleteFolder($this->path)->validatedData(); - if ($this->client->getActiveFolder() == $this->path){ - $this->client->setActiveFolder(); - } - - if ($expunge) $this->client->expunge(); - - $this->dispatch("folder", "deleted", $this); - - return $status; - } - - /** - * Subscribe the current folder - * - * @return array - * @throws ConnectionFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - * @throws AuthFailedException - * @throws ResponseException - */ - public function subscribe(): array { - $this->client->openFolder($this->path); - return $this->client->getConnection()->subscribeFolder($this->path)->validatedData(); - } - - /** - * Unsubscribe the current folder - * - * @return array - * @throws ConnectionFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - * @throws AuthFailedException - * @throws ResponseException - */ - public function unsubscribe(): array { - $this->client->openFolder($this->path); - return $this->client->getConnection()->unsubscribeFolder($this->path)->validatedData(); - } - - /** - * Idle the current connection - * @param callable $callback function(Message $message) gets called if a new message is received - * @param integer $timeout max 1740 seconds - recommended by rfc2177 §3. Should not be lower than the servers "* OK Still here" message interval - * - * @throws ConnectionFailedException - * @throws RuntimeException - * @throws AuthFailedException - * @throws NotSupportedCapabilityException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws ResponseException - */ - public function idle(callable $callback, int $timeout = 300): void { - $this->client->setTimeout($timeout); - - if (!in_array("IDLE", $this->client->getConnection()->getCapabilities()->validatedData())) { - throw new Exceptions\NotSupportedCapabilityException("IMAP server does not support IDLE"); - } - - $idle_client = $this->client->clone(); - $idle_client->connect(); - $idle_client->openFolder($this->path, true); - $idle_client->getConnection()->idle(); - - $last_action = Carbon::now()->addSeconds($timeout); - - $sequence = $this->client->getConfig()->get('options.sequence', IMAP::ST_MSGN); - - while (true) { - try { - // This polymorphic call is fine - Protocol::idle() will throw an exception beforehand - $line = $idle_client->getConnection()->nextLine(Response::empty()); - } catch (Exceptions\RuntimeException $e) { - if(strpos($e->getMessage(), "empty response") >= 0 && $idle_client->getConnection()->connected()) { - continue; - } - if(!str_contains($e->getMessage(), "connection closed")) { - throw $e; - } - } - - if (($pos = strpos($line, "EXISTS")) !== false) { - $msgn = (int)substr($line, 2, $pos - 2); - - // Check if the stream is still alive or should be considered stale - if (!$this->client->isConnected() || $last_action->isBefore(Carbon::now())) { - // Reset the connection before interacting with it. Otherwise, the resource might be stale which - // would result in a stuck interaction. If you know of a way of detecting a stale resource, please - // feel free to improve this logic. I tried a lot but nothing seem to work reliably... - // Things that didn't work: - // - Closing the resource with fclose() - // - Verifying the resource with stream_get_meta_data() - // - Bool validating the resource stream (e.g.: (bool)$stream) - // - Sending a NOOP command - // - Sending a null package - // - Reading a null package - // - Catching the fs warning - - // This polymorphic call is fine - Protocol::idle() will throw an exception beforehand - $this->client->getConnection()->reset(); - // Establish a new connection - $this->client->connect(); - } - $last_action = Carbon::now()->addSeconds($timeout); - - // Always reopen the folder - otherwise the new message number isn't known to the current remote session - $this->client->openFolder($this->path, true); - - $message = $this->query()->getMessageByMsgn($msgn); - $message->setSequence($sequence); - $callback($message); - - $this->dispatch("message", "new", $message); - } - } - } - - /** - * Get folder status information from the EXAMINE command - * - * @return array - * @throws ConnectionFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - * @throws AuthFailedException - * @throws ResponseException - */ - public function status(): array { - return $this->client->getConnection()->folderStatus($this->path)->validatedData(); - } - - /** - * Get folder status information from the EXAMINE command - * - * @return array - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws ResponseException - * @throws RuntimeException - * - * @deprecated Use Folder::status() instead - */ - public function getStatus(): array { - return $this->status(); - } - - /** - * Load folder status information from the EXAMINE command - * @return Folder - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws ResponseException - * @throws RuntimeException - */ - public function loadStatus(): Folder { - $this->status = $this->examine(); - return $this; - } - - /** - * Examine the current folder - * - * @return array - * @throws ConnectionFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - * @throws AuthFailedException - * @throws ResponseException - */ - public function examine(): array { - return $this->client->getConnection()->examineFolder($this->path)->validatedData(); - } - - /** - * Select the current folder - * - * @return array - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws ResponseException - * @throws RuntimeException - */ - public function select(): array { - return $this->client->getConnection()->selectFolder($this->path)->validatedData(); - } - - /** - * Get the current Client instance - * - * @return Client - */ - public function getClient(): Client { - return $this->client; - } - - /** - * Set the delimiter - * @param $delimiter - */ - public function setDelimiter($delimiter): void { - if (in_array($delimiter, [null, '', ' ', false]) === true) { - $delimiter = $this->client->getConfig()->get('options.delimiter', '/'); - } - - $this->delimiter = $delimiter; - } -} diff --git a/plugins/vendor/webklex/php-imap/src/Header.php b/plugins/vendor/webklex/php-imap/src/Header.php deleted file mode 100644 index d18e98a1..00000000 --- a/plugins/vendor/webklex/php-imap/src/Header.php +++ /dev/null @@ -1,871 +0,0 @@ -decoder = $config->getDecoder("header"); - $this->raw = $raw_header; - $this->config = $config; - $this->options = $this->config->get('options'); - $this->parse(); - } - - /** - * Call dynamic attribute setter and getter methods - * @param string $method - * @param array $arguments - * - * @return Attribute|mixed - * @throws MethodNotFoundException - */ - public function __call(string $method, array $arguments) { - if (strtolower(substr($method, 0, 3)) === 'get') { - $name = preg_replace('/(.)(?=[A-Z])/u', '$1_', substr(strtolower($method), 3)); - - if (in_array($name, array_keys($this->attributes))) { - return $this->attributes[$name]; - } - - } - - throw new MethodNotFoundException("Method " . self::class . '::' . $method . '() is not supported'); - } - - /** - * Magic getter - * @param $name - * - * @return Attribute|null - */ - public function __get($name) { - return $this->get($name); - } - - /** - * Get a specific header attribute - * @param $name - * - * @return Attribute - */ - public function get($name): Attribute { - $name = str_replace(["-", " "], "_", strtolower($name)); - if (isset($this->attributes[$name])) { - return $this->attributes[$name]; - } - - return new Attribute($name); - } - - /** - * Check if a specific attribute exists - * @param string $name - * - * @return bool - */ - public function has(string $name): bool { - $name = str_replace(["-", " "], "_", strtolower($name)); - return isset($this->attributes[$name]); - } - - /** - * Set a specific attribute - * @param string $name - * @param array|mixed $value - * @param boolean $strict - * - * @return Attribute|array - */ - public function set(string $name, mixed $value, bool $strict = false): Attribute|array { - if (isset($this->attributes[$name]) && $strict === false) { - $this->attributes[$name]->add($value, true); - } else { - $this->attributes[$name] = new Attribute($name, $value); - } - - return $this->attributes[$name]; - } - - /** - * Perform a regex match all on the raw header and return the first result - * @param $pattern - * - * @return mixed|null - */ - public function find($pattern): mixed { - if (preg_match_all($pattern, $this->raw, $matches)) { - if (isset($matches[1])) { - if (count($matches[1]) > 0) { - return $matches[1][0]; - } - } - } - return null; - } - - /** - * Try to find a boundary if possible - * - * @return string|null - */ - public function getBoundary(): ?string { - $regex = $this->options["boundary"] ?? "/boundary=(.*?(?=;)|(.*))/i"; - $boundary = $this->find($regex); - - if ($boundary === null) { - return null; - } - - return $this->clearBoundaryString($boundary); - } - - /** - * Remove all unwanted chars from a given boundary - * @param string $str - * - * @return string - */ - private function clearBoundaryString(string $str): string { - return str_replace(['"', '\r', '\n', "\n", "\r", ";", "\s"], "", $str); - } - - /** - * Parse the raw headers - * - * @throws InvalidMessageDateException - * @throws SpoofingAttemptDetectedException - */ - protected function parse(): void { - $header = $this->rfc822_parse_headers($this->raw); - - $this->extractAddresses($header); - - if (property_exists($header, 'subject')) { - $this->set("subject", $this->decoder->decode($header->subject)); - } - if (property_exists($header, 'references')) { - $this->set("references", array_map(function($item) { - return str_replace(['<', '>'], '', $item); - }, explode(" ", $header->references))); - } - if (property_exists($header, 'message_id')) { - $this->set("message_id", str_replace(['<', '>'], '', $header->message_id)); - } - if (property_exists($header, 'in_reply_to')) { - $this->set("in_reply_to", str_replace(['<', '>'], '', $header->in_reply_to)); - } - - $this->parseDate($header); - foreach ($header as $key => $value) { - $key = trim(rtrim(strtolower($key))); - if (!isset($this->attributes[$key])) { - $this->set($key, $value); - } - } - - $this->extractHeaderExtensions(); - $this->findPriority(); - - if($this->config->get('security.detect_spoofing', true)) { - // Detect spoofing - $this->detectSpoofing(); - } - } - - /** - * Parse mail headers from a string - * @link https://php.net/manual/en/function.imap-rfc822-parse-headers.php - * @param $raw_headers - * - * @return object - */ - public function rfc822_parse_headers($raw_headers): object { - $headers = []; - $imap_headers = []; - if (extension_loaded('imap') && $this->options["rfc822"]) { - $raw_imap_headers = (array)\imap_rfc822_parse_headers($raw_headers); - foreach ($raw_imap_headers as $key => $values) { - $key = strtolower(str_replace("-", "_", $key)); - $imap_headers[$key] = $values; - } - } - $lines = explode("\r\n", preg_replace("/\r\n\s/", ' ', $raw_headers)); - $prev_header = null; - foreach ($lines as $line) { - if (str_starts_with($line, "\n")) { - $line = substr($line, 1); - } - - if (str_starts_with($line, "\t")) { - $line = substr($line, 1); - $line = trim(rtrim($line)); - if ($prev_header !== null) { - $headers[$prev_header][] = $line; - } - } elseif (str_starts_with($line, " ")) { - $line = substr($line, 1); - $line = trim(rtrim($line)); - if ($prev_header !== null) { - if (!isset($headers[$prev_header])) { - $headers[$prev_header] = ""; - } - if (is_array($headers[$prev_header])) { - $headers[$prev_header][] = $line; - } else { - $headers[$prev_header] .= $line; - } - } - } else { - if (($pos = strpos($line, ":")) > 0) { - $key = trim(rtrim(strtolower(substr($line, 0, $pos)))); - $key = strtolower(str_replace("-", "_", $key)); - - $value = trim(rtrim(substr($line, $pos + 1))); - if (isset($headers[$key])) { - $headers[$key][] = $value; - } else { - $headers[$key] = [$value]; - } - $prev_header = $key; - } - } - } - - foreach ($headers as $key => $values) { - if (isset($imap_headers[$key])) { - continue; - } - $value = null; - switch ((string)$key) { - case 'from': - case 'to': - case 'cc': - case 'bcc': - case 'reply_to': - case 'sender': - $value = $this->decodeAddresses($values); - $headers[$key . "address"] = implode(", ", $values); - break; - case 'subject': - $value = implode(" ", $values); - break; - default: - if (is_array($values)) { - foreach ($values as $k => $v) { - if ($v == "") { - unset($values[$k]); - } - } - $available_values = count($values); - if ($available_values === 1) { - $value = array_pop($values); - } elseif ($available_values === 2) { - $value = implode(" ", $values); - } elseif ($available_values > 2) { - $value = array_values($values); - } else { - $value = ""; - } - } - break; - } - $headers[$key] = $value; - } - - return (object)array_merge($headers, $imap_headers); - } - - /** - * Try to extract the priority from a given raw header string - */ - private function findPriority(): void { - $priority = $this->get("x_priority"); - - $priority = match ((int)"$priority") { - IMAP::MESSAGE_PRIORITY_HIGHEST => IMAP::MESSAGE_PRIORITY_HIGHEST, - IMAP::MESSAGE_PRIORITY_HIGH => IMAP::MESSAGE_PRIORITY_HIGH, - IMAP::MESSAGE_PRIORITY_NORMAL => IMAP::MESSAGE_PRIORITY_NORMAL, - IMAP::MESSAGE_PRIORITY_LOW => IMAP::MESSAGE_PRIORITY_LOW, - IMAP::MESSAGE_PRIORITY_LOWEST => IMAP::MESSAGE_PRIORITY_LOWEST, - default => IMAP::MESSAGE_PRIORITY_UNKNOWN, - }; - - $this->set("priority", $priority); - } - - /** - * Extract a given part as address array from a given header - * @param $values - * - * @return array - */ - private function decodeAddresses($values): array { - $addresses = []; - - if (extension_loaded('mailparse') && $this->options["rfc822"]) { - foreach ($values as $address) { - foreach (\mailparse_rfc822_parse_addresses($address) as $parsed_address) { - if (isset($parsed_address['address'])) { - $mail_address = explode('@', $parsed_address['address']); - if (count($mail_address) == 2) { - $addresses[] = (object)[ - "personal" => $parsed_address['display'] ?? '', - "mailbox" => $mail_address[0], - "host" => $mail_address[1], - ]; - } - } - } - } - - return $addresses; - } - - foreach ($values as $address) { - foreach (preg_split('/, ?(?=(?:[^"]*"[^"]*")*[^"]*$)/', $address) as $split_address) { - $split_address = trim(rtrim($split_address)); - - if (strpos($split_address, ",") == strlen($split_address) - 1) { - $split_address = substr($split_address, 0, -1); - } - if (preg_match( - '/^(?:(?P.+)\s)?(?(name)<|[^\s]+?)(?(name)>|>?)$/', - $split_address, - $matches - )) { - $name = trim(rtrim($matches["name"])); - $email = trim(rtrim($matches["email"])); - list($mailbox, $host) = array_pad(explode("@", $email), 2, null); - $addresses[] = (object)[ - "personal" => $name, - "mailbox" => $mailbox, - "host" => $host, - ]; - }elseif (preg_match( - '/^((?P.+)<)(?P[^<]+?)>$/', - $split_address, - $matches - )) { - $name = trim(rtrim($matches["name"])); - if(str_starts_with($name, "\"") && str_ends_with($name, "\"")) { - $name = substr($name, 1, -1); - }elseif(str_starts_with($name, "'") && str_ends_with($name, "'")) { - $name = substr($name, 1, -1); - } - $email = trim(rtrim($matches["email"])); - list($mailbox, $host) = array_pad(explode("@", $email), 2, null); - $addresses[] = (object)[ - "personal" => $name, - "mailbox" => $mailbox, - "host" => $host, - ]; - } - } - } - - return $addresses; - } - - /** - * Extract a given part as address array from a given header - * @param object $header - */ - private function extractAddresses(object $header): void { - foreach (['from', 'to', 'cc', 'bcc', 'reply_to', 'sender', 'return_path', 'envelope_from', 'envelope_to', 'delivered_to'] as $key) { - if (property_exists($header, $key)) { - $this->set($key, $this->parseAddresses($header->$key)); - } - } - } - - /** - * Parse Addresses - * @param $list - * - * @return array - */ - private function parseAddresses($list): array { - $addresses = []; - - if (is_array($list) === false) { - if(is_string($list)) { - if (preg_match( - '/^(?:(?P.+)\s)?(?(name)<|[^\s]+?)(?(name)>|>?)$/', - $list, - $matches - )) { - $name = trim(rtrim($matches["name"])); - $email = trim(rtrim($matches["email"])); - list($mailbox, $host) = array_pad(explode("@", $email), 2, null); - if($mailbox === ">") { // Fix trailing ">" in malformed mailboxes - $mailbox = ""; - } - if($name === "" && $mailbox === "" && $host === "") { - return $addresses; - } - $list = [ - (object)[ - "personal" => $name, - "mailbox" => $mailbox, - "host" => $host, - ] - ]; - }elseif (preg_match( - '/^((?P.+)<)(?P[^<]+?)>$/', - $list, - $matches - )) { - $name = trim(rtrim($matches["name"])); - $email = trim(rtrim($matches["email"])); - if(str_starts_with($name, "\"") && str_ends_with($name, "\"")) { - $name = substr($name, 1, -1); - }elseif(str_starts_with($name, "'") && str_ends_with($name, "'")) { - $name = substr($name, 1, -1); - } - list($mailbox, $host) = array_pad(explode("@", $email), 2, null); - if($mailbox === ">") { // Fix trailing ">" in malformed mailboxes - $mailbox = ""; - } - if($name === "" && $mailbox === "" && $host === "") { - return $addresses; - } - $list = [ - (object)[ - "personal" => $name, - "mailbox" => $mailbox, - "host" => $host, - ] - ]; - }else{ - return $addresses; - } - }else{ - return $addresses; - } - } - - foreach ($list as $item) { - $address = (object)$item; - - if (!property_exists($address, 'mailbox')) { - $address->mailbox = false; - } - if (!property_exists($address, 'host')) { - $address->host = false; - } - if (!property_exists($address, 'personal')) { - $address->personal = false; - } else { - $personal_slices = explode(" ", $address->personal); - $address->personal = ""; - foreach ($personal_slices as $slice) { - $personalParts = $this->decoder->mimeHeaderDecode($slice); - - $personal = ''; - foreach ($personalParts as $p) { - $personal .= $this->decoder->convertEncoding($p->text, $this->decoder->getEncoding($p)); - } - - if (str_starts_with($personal, "'")) { - $personal = str_replace("'", "", $personal); - } - $personal = $this->decoder->decode($personal); - $address->personal .= $personal . " "; - } - $address->personal = trim(rtrim($address->personal)); - } - - if ($address->host == ".SYNTAX-ERROR.") { - $address->host = ""; - }elseif ($address->host == "UNKNOWN") { - $address->host = ""; - } - if ($address->mailbox == "UNEXPECTED_DATA_AFTER_ADDRESS") { - $address->mailbox = ""; - }elseif ($address->mailbox == "MISSING_MAILBOX_TERMINATOR") { - $address->mailbox = ""; - } - - $addresses[] = new Address($address); - } - - return $addresses; - } - - /** - * Search and extract potential header extensions - */ - private function extractHeaderExtensions(): void { - foreach ($this->attributes as $key => $value) { - if (is_array($value)) { - $value = implode(", ", $value); - } else { - $value = (string)$value; - } - // Only parse strings and don't parse any attributes like the user-agent - if (!in_array($key, ["user-agent", "subject", "received"])) { - if (str_contains($value, ";") && str_contains($value, "=")) { - $_attributes = $this->read_attribute($value); - foreach($_attributes as $_key => $_value) { - if($_value === "") { - $this->set($key, $_key); - } - if (!isset($this->attributes[$_key])) { - $this->set($_key, $_value); - } - } - } - } - } - } - - /** - * Read a given attribute string - * - this isn't pretty, but it works - feel free to improve :) - * @param string $raw_attribute - * @return array - */ - private function read_attribute(string $raw_attribute): array { - $attributes = []; - $key = ''; - $value = ''; - $inside_word = false; - $inside_key = true; - $escaped = false; - foreach (str_split($raw_attribute) as $char) { - if($escaped) { - $escaped = false; - continue; - } - if($inside_word) { - if($char === '\\') { - $escaped = true; - }elseif($char === "\"" && $value !== "") { - $inside_word = false; - }else{ - $value .= $char; - } - }else{ - if($inside_key) { - if($char === '"') { - $inside_word = true; - }elseif($char === ';'){ - $attributes[$key] = $value; - $key = ''; - $value = ''; - $inside_key = true; - }elseif($char === '=') { - $inside_key = false; - }else{ - $key .= $char; - } - }else{ - if($char === '"' && $value === "") { - $inside_word = true; - }elseif($char === ';'){ - $attributes[$key] = $value; - $key = ''; - $value = ''; - $inside_key = true; - }else{ - $value .= $char; - } - } - } - } - $attributes[$key] = $value; - $result = []; - - foreach($attributes as $key => $value) { - if (($pos = strpos($key, "*")) !== false) { - $key = substr($key, 0, $pos); - } - $key = trim(rtrim(strtolower($key))); - - if(!isset($result[$key])) { - $result[$key] = ""; - } - $value = trim(rtrim(str_replace(["\r", "\n"], "", $value))); - if(str_starts_with($value, "\"") && str_ends_with($value, "\"")) { - $value = substr($value, 1, -1); - } - $result[$key] .= $value; - } - return $result; - } - - /** - * Exception handling for invalid dates - * - * Known bad and "invalid" formats: - * ^ Datetime ^ Problem ^ Cause - * | Mon, 20 Nov 2017 20:31:31 +0800 (GMT+8:00) | Double timezone specification | A Windows feature - * | Thu, 8 Nov 2018 08:54:58 -0200 (-02) | - * | | and invalid timezone (max 6 char) | - * | 04 Jan 2018 10:12:47 UT | Missing letter "C" | Unknown - * | Thu, 31 May 2018 18:15:00 +0800 (added by) | Non-standard details added by the | Unknown - * | | mail server | - * | Sat, 31 Aug 2013 20:08:23 +0580 | Invalid timezone | PHPMailer bug https://sourceforge.net/p/phpmailer/mailman/message/6132703/ - * | Mi., 23 Apr. 2025 09:48:37 +0200 (MESZ) | Non-standard localized format | Aqua Mail S/MIME implementation - * - * Please report any new invalid timestamps to [#45](https://github.com/Webklex/php-imap/issues) - * - * @param object $header - * - * @throws InvalidMessageDateException - */ - private function parseDate(object $header): void { - - if (property_exists($header, 'date')) { - $date = $header->date; - - if (preg_match('/\+0580/', $date)) { - $date = str_replace('+0580', '+0530', $date); - } - - $date = trim(rtrim($date)); - try { - if (str_contains($date, ' ')) { - $date = str_replace(' ', ' ', $date); - } - if (str_contains($date, ' UT ')) { - $date = str_replace(' UT ', ' UTC ', $date); - } - $parsed_date = Carbon::parse($date); - } catch (\Exception $e) { - switch (true) { - case preg_match('/([0-9]{4}\.[0-9]{1,2}\.[0-9]{1,2}\-[0-9]{1,2}\.[0-9]{1,2}.[0-9]{1,2})+$/i', $date) > 0: - $date = Carbon::createFromFormat("Y.m.d-H.i.s", $date); - break; - case preg_match('/([0-9]{2} [A-Z]{3} [0-9]{4} [0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2} [+-][0-9]{1,4} [0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2} [+-][0-9]{1,4})+$/i', $date) > 0: - $parts = explode(' ', $date); - array_splice($parts, -2); - $date = implode(' ', $parts); - break; - case preg_match('/([A-Z]{2,4}\,\ [0-9]{1,2}\ [A-Z]{2,3}\ [0-9]{4}\ [0-9]{1,2}\:[0-9]{1,2}\:[0-9]{1,2}\ [\-|\+][0-9]{4})+$/i', $date) > 0: - $array = explode(',', $date); - array_shift($array); - $date = Carbon::createFromFormat("d M Y H:i:s O", trim(implode(',', $array))); - break; - case preg_match('/([0-9]{1,2}\ [A-Z]{2,3}\ [0-9]{4}\ [0-9]{1,2}\:[0-9]{1,2}\:[0-9]{1,2}\ UT)+$/i', $date) > 0: - case preg_match('/([A-Z]{2,3}\,\ [0-9]{1,2}\ [A-Z]{2,3}\ ([0-9]{2}|[0-9]{4})\ [0-9]{1,2}\:[0-9]{1,2}\:[0-9]{1,2}\ UT)+$/i', $date) > 0: - $date .= 'C'; - break; - case preg_match('/([A-Z]{2,3}\,\ [0-9]{1,2}[\,]\ [A-Z]{2,3}\ [0-9]{4}\ [0-9]{1,2}\:[0-9]{1,2}\:[0-9]{1,2}\ [\-|\+][0-9]{4})+$/i', $date) > 0: - $date = str_replace(',', '', $date); - break; - // match case for: Di., 15 Feb. 2022 06:52:44 +0100 (MEZ)/Di., 15 Feb. 2022 06:52:44 +0100 (MEZ) and Mi., 23 Apr. 2025 09:48:37 +0200 (MESZ) - case preg_match('/([A-Z]{2,3}\.\,\ [0-9]{1,2}\ [A-Z]{2,3}\.\ [0-9]{4}\ [0-9]{1,2}\:[0-9]{1,2}\:[0-9]{1,2}\ [\-|\+][0-9]{4}\ \([A-Z]{3,4}\))(\/([A-Z]{2,3}\.\,\ [0-9]{1,2}\ [A-Z]{2,3}\.\ [0-9]{4}\ [0-9]{1,2}\:[0-9]{1,2}\:[0-9]{1,2}\ [\-|\+][0-9]{4}\ \([A-Z]{3,4}\))+)?$/i', $date) > 0: - $dates = explode('/', $date); - $date = array_shift($dates); - $array = explode(',', $date); - array_shift($array); - $date = trim(implode(',', $array)); - $array = explode(' ', $date); - array_pop($array); - $date = trim(implode(' ', $array)); - $date = Carbon::createFromFormat("d M. Y H:i:s O", $date); - break; - // match case for: fr., 25 nov. 2022 06:27:14 +0100/fr., 25 nov. 2022 06:27:14 +0100 - case preg_match('/([A-Z]{2,3}\.\,\ [0-9]{1,2}\ [A-Z]{2,3}\.\ [0-9]{4}\ [0-9]{1,2}\:[0-9]{1,2}\:[0-9]{1,2}\ [\-|\+][0-9]{4})\/([A-Z]{2,3}\.\,\ [0-9]{1,2}\ [A-Z]{2,3}\.\ [0-9]{4}\ [0-9]{1,2}\:[0-9]{1,2}\:[0-9]{1,2}\ [\-|\+][0-9]{4})+$/i', $date) > 0: - $dates = explode('/', $date); - $date = array_shift($dates); - $array = explode(',', $date); - array_shift($array); - $date = trim(implode(',', $array)); - $date = Carbon::createFromFormat("d M. Y H:i:s O", $date); - break; - case preg_match('/([A-Z]{2,3}\,\ [0-9]{1,2}\ [A-Z]{2,3}\ [0-9]{4}\ [0-9]{1,2}\:[0-9]{1,2}\:[0-9]{1,2}\ \+[0-9]{2,4}\ \(\+[0-9]{1,2}\))+$/i', $date) > 0: - case preg_match('/([A-Z]{2,3}[\,|\ \,]\ [0-9]{1,2}\ [A-Z]{2,3}\ [0-9]{4}\ [0-9]{1,2}\:[0-9]{1,2}\:[0-9]{1,2}.*)+$/i', $date) > 0: - case preg_match('/([A-Z]{2,3}\,\ [0-9]{1,2}\ [A-Z]{2,3}\ [0-9]{4}\ [0-9]{1,2}\:[0-9]{1,2}\:[0-9]{1,2}\ [\-|\+][0-9]{4}\ \(.*)\)+$/i', $date) > 0: - case preg_match('/([A-Z]{2,3}\, \ [0-9]{1,2}\ [A-Z]{2,3}\ [0-9]{4}\ [0-9]{1,2}\:[0-9]{1,2}\:[0-9]{1,2}\ [\-|\+][0-9]{4}\ \(.*)\)+$/i', $date) > 0: - case preg_match('/([0-9]{1,2}\ [A-Z]{2,3}\ [0-9]{2,4}\ [0-9]{2}\:[0-9]{2}\:[0-9]{2}\ [A-Z]{2}\ \-[0-9]{2}\:[0-9]{2}\ \([A-Z]{2,3}\ \-[0-9]{2}:[0-9]{2}\))+$/i', $date) > 0: - $array = explode('(', $date); - $array = array_reverse($array); - $date = trim(array_pop($array)); - break; - } - try { - $parsed_date = Carbon::parse($date); - } catch (\Exception $_e) { - if (!isset($this->options["fallback_date"])) { - throw new InvalidMessageDateException("Invalid message date. ID:" . $this->get("message_id") . " Date:" . $header->date . "/" . $date, 1100, $e); - } else { - $parsed_date = Carbon::parse($this->options["fallback_date"]); - } - } - } - - $this->set("date", $parsed_date); - } - } - - /** - * Get all available attributes - * - * @return array - */ - public function getAttributes(): array { - return $this->attributes; - } - - /** - * Set all header attributes - * @param array $attributes - * - * @return Header - */ - public function setAttributes(array $attributes): Header { - $this->attributes = $attributes; - return $this; - } - - /** - * Set the configuration used for parsing a raw header - * @param array $config - * - * @return Header - */ - public function setOptions(array $config): Header { - $this->options = $config; - return $this; - } - - /** - * Get the configuration used for parsing a raw header - * - * @return array - */ - public function getOptions(): array { - return $this->options; - } - - /** - * Set the configuration used for parsing a raw header - * @param Config $config - * - * @return Header - */ - public function setConfig(Config $config): Header { - $this->config = $config; - return $this; - } - - /** - * Get the configuration used for parsing a raw header - * - * @return Config - */ - public function getConfig(): Config { - return $this->config; - } - - /** - * Get the decoder instance - * - * @return DecoderInterface - */ - public function getDecoder(): DecoderInterface { - return $this->decoder; - } - - /** - * Set the decoder instance - * @param DecoderInterface $decoder - * - * @return $this - */ - public function setDecoder(DecoderInterface $decoder): static { - $this->decoder = $decoder; - return $this; - } - - /** - * Detect spoofing by checking the from, reply_to, return_path, sender and envelope_from headers - * @throws SpoofingAttemptDetectedException - */ - private function detectSpoofing(): void { - $header_keys = ["from", "reply_to", "return_path", "sender", "envelope_from"]; - $potential_senders = []; - foreach($header_keys as $key) { - $header = $this->get($key); - foreach ($header->toArray() as $address) { - $potential_senders[] = $address->mailbox . "@" . $address->host; - } - } - if(count($potential_senders) > 1) { - $this->set("spoofed", true); - if($this->config->get('security.detect_spoofing_exception', false)) { - throw new SpoofingAttemptDetectedException("Potential spoofing detected. Message ID: " . $this->get("message_id") . " Senders: " . implode(", ", $potential_senders)); - } - } - } - -} diff --git a/plugins/vendor/webklex/php-imap/src/IMAP.php b/plugins/vendor/webklex/php-imap/src/IMAP.php deleted file mode 100644 index 41ae8248..00000000 --- a/plugins/vendor/webklex/php-imap/src/IMAP.php +++ /dev/null @@ -1,375 +0,0 @@ -imap_close - * @link http://php.net/manual/en/imap.constants.php - */ - const CL_EXPUNGE = 32768; - - /** - * The parameter is a UID - * @link http://php.net/manual/en/imap.constants.php - */ - const FT_UID = 1; - - /** - * Do not set the \Seen flag if not already set - * @link http://php.net/manual/en/imap.constants.php - */ - const FT_PEEK = 2; - const FT_NOT = 4; - - /** - * The return string is in internal format, will not canonicalize to CRLF. - * @link http://php.net/manual/en/imap.constants.php - */ - const FT_INTERNAL = 8; - const FT_PREFETCHTEXT = 32; - - /** - * The sequence argument contains UIDs instead of sequence numbers - * @link http://php.net/manual/en/imap.constants.php - */ - const ST_UID = 1; - const ST_SILENT = 2; - const ST_MSGN = 3; - const ST_SET = 4; - - /** - * the sequence numbers contain UIDS - * @link http://php.net/manual/en/imap.constants.php - */ - const CP_UID = 1; - - /** - * Delete the messages from the current mailbox after copying - * with imap_mail_copy - * @link http://php.net/manual/en/imap.constants.php - */ - const CP_MOVE = 2; - - /** - * Return UIDs instead of sequence numbers - * @link http://php.net/manual/en/imap.constants.php - */ - const SE_UID = 1; - const SE_FREE = 2; - - /** - * Don't prefetch searched messages - * @link http://php.net/manual/en/imap.constants.php - */ - const SE_NOPREFETCH = 4; - const SO_FREE = 8; - const SO_NOSERVER = 16; - const SA_MESSAGES = 1; - const SA_RECENT = 2; - const SA_UNSEEN = 4; - const SA_UIDNEXT = 8; - const SA_UIDVALIDITY = 16; - const SA_ALL = 31; - - /** - * This mailbox has no "children" (there are no - * mailboxes below this one). - * @link http://php.net/manual/en/imap.constants.php - */ - const LATT_NOINFERIORS = 1; - - /** - * This is only a container, not a mailbox - you - * cannot open it. - * @link http://php.net/manual/en/imap.constants.php - */ - const LATT_NOSELECT = 2; - - /** - * This mailbox is marked. Only used by UW-IMAPD. - * @link http://php.net/manual/en/imap.constants.php - */ - const LATT_MARKED = 4; - - /** - * This mailbox is not marked. Only used by - * UW-IMAPD. - * @link http://php.net/manual/en/imap.constants.php - */ - const LATT_UNMARKED = 8; - const LATT_REFERRAL = 16; - const LATT_HASCHILDREN = 32; - const LATT_HASNOCHILDREN = 64; - - /** - * Sort criteria for imap_sort: - * message Date - * @link http://php.net/manual/en/imap.constants.php - */ - const SORTDATE = 0; - - /** - * Sort criteria for imap_sort: - * arrival date - * @link http://php.net/manual/en/imap.constants.php - */ - const SORTARRIVAL = 1; - - /** - * Sort criteria for imap_sort: - * mailbox in first From address - * @link http://php.net/manual/en/imap.constants.php - */ - const SORTFROM = 2; - - /** - * Sort criteria for imap_sort: - * message subject - * @link http://php.net/manual/en/imap.constants.php - */ - const SORTSUBJECT = 3; - - /** - * Sort criteria for imap_sort: - * mailbox in first To address - * @link http://php.net/manual/en/imap.constants.php - */ - const SORTTO = 4; - - /** - * Sort criteria for imap_sort: - * mailbox in first cc address - * @link http://php.net/manual/en/imap.constants.php - */ - const SORTCC = 5; - - /** - * Sort criteria for imap_sort: - * size of message in octets - * @link http://php.net/manual/en/imap.constants.php - */ - const SORTSIZE = 6; - const TYPETEXT = 0; - const TYPEMULTIPART = 1; - const TYPEMESSAGE = 2; - const TYPEAPPLICATION = 3; - const TYPEAUDIO = 4; - const TYPEIMAGE = 5; - const TYPEVIDEO = 6; - const TYPEMODEL = 7; - const TYPEOTHER = 8; - const ENC7BIT = 0; - const ENC8BIT = 1; - const ENCBINARY = 2; - const ENCBASE64 = 3; - const ENCQUOTEDPRINTABLE = 4; - const ENCOTHER = 5; - - /** - * Garbage collector, clear message cache elements. - * @link http://php.net/manual/en/imap.constants.php - */ - const IMAP_GC_ELT = 1; - - /** - * Garbage collector, clear envelopes and bodies. - * @link http://php.net/manual/en/imap.constants.php - */ - const IMAP_GC_ENV = 2; - - /** - * Garbage collector, clear texts. - * @link http://php.net/manual/en/imap.constants.php - */ - const IMAP_GC_TEXTS = 4; - -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/src/Message.php b/plugins/vendor/webklex/php-imap/src/Message.php deleted file mode 100755 index 9d15a7b8..00000000 --- a/plugins/vendor/webklex/php-imap/src/Message.php +++ /dev/null @@ -1,1674 +0,0 @@ -boot($client->getConfig()); - - $default_mask = $client->getDefaultMessageMask(); - if ($default_mask != null) { - $this->mask = $default_mask; - } - $this->events["message"] = $client->getDefaultEvents("message"); - $this->events["flag"] = $client->getDefaultEvents("flag"); - - $this->folder_path = $client->getFolderPath(); - - $this->setSequence($sequence); - $this->setFetchOption($fetch_options); - $this->setFetchBodyOption($fetch_body); - $this->setFetchFlagsOption($fetch_flags); - - $this->client = $client; - $this->client->openFolder($this->folder_path); - - $this->setSequenceId($uid, $msglist); - - if ($this->fetch_options == IMAP::FT_PEEK) { - $this->parseFlags(); - } - - $this->parseHeader(); - - if ($this->getFetchBodyOption() === true) { - $this->parseBody(); - } - - if ($this->getFetchFlagsOption() === true && $this->fetch_options !== IMAP::FT_PEEK) { - $this->parseFlags(); - } - } - - /** - * Create a new instance without fetching the message header and providing them raw instead - * @param int $uid - * @param int|null $msglist - * @param Client $client - * @param string $raw_header - * @param string $raw_body - * @param array $raw_flags - * @param null $fetch_options - * @param null $sequence - * - * @return Message - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws ReflectionException - * @throws RuntimeException - * @throws ResponseException - */ - public static function make(int $uid, ?int $msglist, Client $client, string $raw_header, string $raw_body, array $raw_flags, $fetch_options = null, $sequence = null): Message { - $reflection = new ReflectionClass(self::class); - /** @var Message $instance */ - $instance = $reflection->newInstanceWithoutConstructor(); - $instance->boot($client->getConfig()); - - $default_mask = $client->getDefaultMessageMask(); - if ($default_mask != null) { - $instance->setMask($default_mask); - } - $instance->setEvents([ - "message" => $client->getDefaultEvents("message"), - "flag" => $client->getDefaultEvents("flag"), - ]); - $instance->setFolderPath($client->getFolderPath()); - $instance->setSequence($sequence); - $instance->setFetchOption($fetch_options); - - $instance->setClient($client); - $instance->setSequenceId($uid, $msglist); - - $instance->parseRawHeader($raw_header); - $instance->parseRawFlags($raw_flags); - $instance->parseRawBody($raw_body); - $instance->peek(); - - return $instance; - } - - /** - * Create a new message instance by reading and loading a file or remote location - * @param string $filename - * @param ?Config $config - * - * @return Message - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws ReflectionException - * @throws ResponseException - * @throws RuntimeException - */ - public static function fromFile(string $filename, ?Config $config = null): Message { - $blob = file_get_contents($filename); - if ($blob === false) { - throw new RuntimeException("Unable to read file"); - } - return self::fromString($blob, $config); - } - - /** - * Create a new message instance by reading and loading a string - * @param string $blob - * @param ?Config $config - * - * @return Message - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws ReflectionException - * @throws ResponseException - * @throws RuntimeException - */ - public static function fromString(string $blob, ?Config $config = null): Message { - $reflection = new ReflectionClass(self::class); - /** @var Message $instance */ - $instance = $reflection->newInstanceWithoutConstructor(); - $instance->boot($config); - - $default_mask = $instance->getConfig()->getMask("message"); - if($default_mask != ""){ - $instance->setMask($default_mask); - }else{ - throw new MaskNotFoundException("Unknown message mask provided"); - } - - if(!str_contains($blob, "\r\n")){ - $blob = str_replace("\n", "\r\n", $blob); - } - $raw_header = substr($blob, 0, strpos($blob, "\r\n\r\n")); - $raw_body = substr($blob, strlen($raw_header)+4); - - $instance->parseRawHeader($raw_header); - $instance->parseRawBody($raw_body); - - $instance->setUid(0); - - return $instance; - } - - /** - * Boot a new instance - * @param ?Config $config - * @throws DecoderNotFoundException - */ - public function boot(?Config $config = null): void { - $this->attributes = []; - $this->client = null; - $this->config = $config ?? Config::make(); - $this->decoder = $this->config->getDecoder("message"); - - $this->options = $this->config->get('options'); - $this->available_flags = $this->config->get('flags'); - - $this->attachments = AttachmentCollection::make(); - $this->flags = FlagCollection::make(); - } - - /** - * Call dynamic attribute setter and getter methods - * @param string $method - * @param array $arguments - * - * @return mixed - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws MessageNotFoundException - * @throws MethodNotFoundException - * @throws MessageSizeFetchingException - * @throws RuntimeException - * @throws ResponseException - */ - public function __call(string $method, array $arguments) { - if (strtolower(substr($method, 0, 3)) === 'get') { - $name = Str::snake(substr($method, 3)); - return $this->get($name); - } elseif (strtolower(substr($method, 0, 3)) === 'set') { - $name = Str::snake(substr($method, 3)); - - if (in_array($name, array_keys($this->attributes))) { - return $this->__set($name, array_pop($arguments)); - } - - } - - throw new MethodNotFoundException("Method " . self::class . '::' . $method . '() is not supported'); - } - - /** - * Magic setter - * @param $name - * @param $value - * - * @return mixed - */ - public function __set($name, $value) { - $this->attributes[$name] = $value; - - return $this->attributes[$name]; - } - - /** - * Magic getter - * @param $name - * - * @return Attribute|mixed|null - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws MessageNotFoundException - * @throws MessageSizeFetchingException - * @throws RuntimeException - * @throws ResponseException - */ - public function __get($name) { - return $this->get($name); - } - - /** - * Get an available message or message header attribute - * @param $name - * - * @return Attribute|mixed|null - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws MessageNotFoundException - * @throws RuntimeException - * @throws ResponseException - * @throws MessageSizeFetchingException - */ - public function get($name): mixed { - if (isset($this->attributes[$name]) && $this->attributes[$name] !== null) { - return $this->attributes[$name]; - } - - switch ($name){ - case "uid": - $this->attributes[$name] = $this->client->getConnection()->getUid($this->msgn)->validate()->integer(); - return $this->attributes[$name]; - case "msgn": - $this->attributes[$name] = $this->client->getConnection()->getMessageNumber($this->uid)->validate()->integer(); - return $this->attributes[$name]; - case "size": - if (!isset($this->attributes[$name])) { - $this->fetchSize(); - } - return $this->attributes[$name]; - } - - return $this->header->get($name); - } - - /** - * Check if the Message has a text body - * - * @return bool - */ - public function hasTextBody(): bool { - return isset($this->bodies['text']) && $this->bodies['text'] !== ""; - } - - /** - * Get the Message text body - * - * @return string - */ - public function getTextBody(): string { - if (!isset($this->bodies['text'])) { - return ""; - } - - return $this->bodies['text']; - } - - /** - * Check if the Message has a html body - * - * @return bool - */ - public function hasHTMLBody(): bool { - return isset($this->bodies['html']) && $this->bodies['html'] !== ""; - } - - /** - * Get the Message html body - * - * @return string - */ - public function getHTMLBody(): string { - if (!isset($this->bodies['html'])) { - return ""; - } - - return $this->bodies['html']; - } - - /** - * Parse all defined headers - * - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - * @throws InvalidMessageDateException - * @throws MessageHeaderFetchingException - * @throws ResponseException - */ - private function parseHeader(): void { - $sequence_id = $this->getSequenceId(); - $headers = $this->client->getConnection()->headers([$sequence_id], "RFC822", $this->sequence)->setCanBeEmpty(true)->validatedData(); - if (!isset($headers[$sequence_id])) { - throw new MessageHeaderFetchingException("no headers found", 0); - } - - $this->parseRawHeader($headers[$sequence_id]); - } - - /** - * @param string $raw_header - * - * @throws InvalidMessageDateException - */ - public function parseRawHeader(string $raw_header): void { - $this->header = new Header($raw_header, $this->getConfig()); - } - - /** - * Parse additional raw flags - * @param array $raw_flags - */ - public function parseRawFlags(array $raw_flags): void { - $this->flags = FlagCollection::make(); - - foreach ($raw_flags as $flag) { - if (str_starts_with($flag, "\\")) { - $flag = substr($flag, 1); - } - $flag_key = strtolower($flag); - if ($this->available_flags === null || in_array($flag_key, $this->available_flags)) { - $this->flags->put($flag_key, $flag); - } - } - } - - /** - * Parse additional flags - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws MessageFlagException - * @throws RuntimeException - * @throws ResponseException - */ - private function parseFlags(): void { - $this->client->openFolder($this->folder_path); - $this->flags = FlagCollection::make(); - - $sequence_id = $this->getSequenceId(); - try { - $flags = $this->client->getConnection()->flags([$sequence_id], $this->sequence)->setCanBeEmpty(true)->validatedData(); - } catch (Exceptions\RuntimeException $e) { - throw new MessageFlagException("flag could not be fetched", 0, $e); - } - - if (isset($flags[$sequence_id])) { - $this->parseRawFlags($flags[$sequence_id]); - } - } - - /** - * Parse the Message body - * - * @return Message - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws RuntimeException - * @throws ResponseException - */ - public function parseBody(): Message { - $this->client->openFolder($this->folder_path); - - $sequence_id = $this->getSequenceId(); - try { - $contents = $this->client->getConnection()->content([$sequence_id], $this->client->rfc, $this->sequence)->validatedData(); - } catch (Exceptions\RuntimeException $e) { - throw new MessageContentFetchingException("failed to fetch content", 0, $e); - } - if (!isset($contents[$sequence_id])) { - throw new MessageContentFetchingException("no content found", 0); - } - $content = $contents[$sequence_id]; - - $body = $this->parseRawBody($content); - $this->peek(); - - return $body; - } - - /** - * Fetches the size for this message. - * - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws MessageSizeFetchingException - * @throws ResponseException - * @throws RuntimeException - */ - private function fetchSize(): void { - $sequence_id = $this->getSequenceId(); - $sizes = $this->client->getConnection()->sizes([$sequence_id], $this->sequence)->validatedData(); - if (!isset($sizes[$sequence_id])) { - throw new MessageSizeFetchingException("sizes did not set an array entry for the supplied sequence_id", 0); - } - $this->attributes["size"] = $sizes[$sequence_id]; - } - - /** - * Handle auto "Seen" flag handling - * - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws MessageFlagException - * @throws RuntimeException - * @throws ResponseException - */ - public function peek(): void { - if ($this->fetch_options == IMAP::FT_PEEK) { - if ($this->getFlags()->get("seen") == null) { - $this->unsetFlag("Seen"); - } - } elseif ($this->getFlags()->get("seen") == null) { - $this->setFlag("Seen"); - } - } - - /** - * Parse a given message body - * @param string $raw_body - * - * @return Message - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MessageContentFetchingException - * @throws RuntimeException - * @throws ResponseException - */ - public function parseRawBody(string $raw_body): Message { - $this->structure = new Structure($raw_body, $this->header); - $this->fetchStructure($this->structure); - - return $this; - } - - /** - * Fetch the Message structure - * @param Structure $structure - * - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - * @throws ResponseException - */ - private function fetchStructure(Structure $structure): void { - $this->client?->openFolder($this->folder_path); - - foreach ($structure->parts as $part) { - $this->fetchPart($part); - } - } - - /** - * Fetch a given part - * @param Part $part - */ - private function fetchPart(Part $part): void { - if ($part->isAttachment()) { - $this->fetchAttachment($part); - } else { - $encoding = $this->decoder->getEncoding($part); - - $content = $this->decoder->decode($part->content, $part->encoding); - - // We don't need to do convertEncoding() if charset is ASCII (us-ascii): - // ASCII is a subset of UTF-8, so all ASCII files are already UTF-8 encoded - // https://stackoverflow.com/a/11303410 - // - // us-ascii is the same as ASCII: - // ASCII is the traditional name for the encoding system; the Internet Assigned Numbers Authority (IANA) - // prefers the updated name US-ASCII, which clarifies that this system was developed in the US and - // based on the typographical symbols predominantly in use there. - // https://en.wikipedia.org/wiki/ASCII - // - // convertEncoding() function basically means convertToUtf8(), so when we convert ASCII string into UTF-8 it gets broken. - if ($encoding != 'us-ascii') { - $content = $this->decoder->convertEncoding($content, $encoding); - } - - $this->addBody($part->subtype ?? '', $content); - } - } - - /** - * Add a body to the message - * @param string $subtype - * @param string $content - * - * @return void - */ - protected function addBody(string $subtype, string $content): void { - $subtype = strtolower($subtype); - $subtype = $subtype == "plain" || $subtype == "" ? "text" : $subtype; - - if (isset($this->bodies[$subtype]) && $this->bodies[$subtype] !== null && $this->bodies[$subtype] !== "") { - if ($content !== "") { - $this->bodies[$subtype] .= "\n".$content; - } - } else { - $this->bodies[$subtype] = $content; - } - } - - /** - * Fetch the Message attachment - * @param Part $part - */ - protected function fetchAttachment(Part $part): void { - $oAttachment = new Attachment($this, $part); - - if ($oAttachment->getSize() > 0) { - if ($oAttachment->getId() !== null && $this->attachments->offsetExists($oAttachment->getId())) { - $this->attachments->put($oAttachment->getId(), $oAttachment); - } else { - $this->attachments->push($oAttachment); - } - } - } - - /** - * Fail proof setter for $fetch_option - * @param $option - * - * @return Message - */ - public function setFetchOption($option): Message { - if (is_long($option) === true) { - $this->fetch_options = $option; - } elseif (is_null($option) === true) { - $config = $this->config->get('options.fetch', IMAP::FT_UID); - $this->fetch_options = is_long($config) ? $config : 1; - } - - return $this; - } - - /** - * Set the sequence type - * @param int|null $sequence - * - * @return Message - */ - public function setSequence(?int $sequence): Message { - if (is_long($sequence)) { - $this->sequence = $sequence; - } elseif (is_null($sequence)) { - $config = $this->config->get('options.sequence', IMAP::ST_MSGN); - $this->sequence = is_long($config) ? $config : IMAP::ST_MSGN; - } - - return $this; - } - - /** - * Fail proof setter for $fetch_body - * @param $option - * - * @return Message - */ - public function setFetchBodyOption($option): Message { - if (is_bool($option)) { - $this->fetch_body = $option; - } elseif (is_null($option)) { - $config = $this->config->get('options.fetch_body', true); - $this->fetch_body = is_bool($config) ? $config : true; - } - - return $this; - } - - /** - * Fail proof setter for $fetch_flags - * @param $option - * - * @return Message - */ - public function setFetchFlagsOption($option): Message { - if (is_bool($option)) { - $this->fetch_flags = $option; - } elseif (is_null($option)) { - $config = $this->config->get('options.fetch_flags', true); - $this->fetch_flags = is_bool($config) ? $config : true; - } - - return $this; - } - - /** - * Get the messages folder - * - * @return ?Folder - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - * @throws ResponseException - */ - public function getFolder(): ?Folder { - return $this->client->getFolderByPath($this->folder_path); - } - - /** - * Create a message thread based on the current message - * @param Folder|null $sent_folder - * @param MessageCollection|null $thread - * @param Folder|null $folder - * - * @return MessageCollection - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws FolderFetchingException - * @throws GetMessagesFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - * @throws ResponseException - */ - public function thread(?Folder $sent_folder = null, ?MessageCollection &$thread = null, ?Folder $folder = null): MessageCollection { - $thread = $thread ?: MessageCollection::make(); - $folder = $folder ?: $this->getFolder(); - $sent_folder = $sent_folder ?: $this->client->getFolderByPath($this->config->get("options.common_folders.sent", "INBOX/Sent")); - - /** @var Message $message */ - foreach ($thread as $message) { - if ($message->message_id->first() == $this->message_id->first()) { - return $thread; - } - } - $thread->push($this); - - $this->fetchThreadByInReplyTo($thread, $this->message_id, $folder, $folder, $sent_folder); - $this->fetchThreadByInReplyTo($thread, $this->message_id, $sent_folder, $folder, $sent_folder); - - foreach ($this->in_reply_to->all() as $in_reply_to) { - $this->fetchThreadByMessageId($thread, $in_reply_to, $folder, $folder, $sent_folder); - $this->fetchThreadByMessageId($thread, $in_reply_to, $sent_folder, $folder, $sent_folder); - } - - return $thread; - } - - /** - * Fetch a partial thread by message id - * @param MessageCollection $thread - * @param string $in_reply_to - * @param Folder $primary_folder - * @param Folder $secondary_folder - * @param Folder $sent_folder - * - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws FolderFetchingException - * @throws GetMessagesFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - * @throws ResponseException - */ - protected function fetchThreadByInReplyTo(MessageCollection &$thread, string $in_reply_to, Folder $primary_folder, Folder $secondary_folder, Folder $sent_folder): void { - $primary_folder->query()->inReplyTo($in_reply_to) - ->setFetchBody($this->getFetchBodyOption()) - ->leaveUnread()->get()->each(function($message) use (&$thread, $secondary_folder, $sent_folder) { - /** @var Message $message */ - $message->thread($sent_folder, $thread, $secondary_folder); - }); - } - - /** - * Fetch a partial thread by message id - * @param MessageCollection $thread - * @param string $message_id - * @param Folder $primary_folder - * @param Folder $secondary_folder - * @param Folder $sent_folder - * - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws GetMessagesFailedException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - * @throws ResponseException - */ - protected function fetchThreadByMessageId(MessageCollection &$thread, string $message_id, Folder $primary_folder, Folder $secondary_folder, Folder $sent_folder): void { - $primary_folder->query()->messageId($message_id) - ->setFetchBody($this->getFetchBodyOption()) - ->leaveUnread()->get()->each(function($message) use (&$thread, $secondary_folder, $sent_folder) { - /** @var Message $message */ - $message->thread($sent_folder, $thread, $secondary_folder); - }); - } - - /** - * Copy the current Messages to a mailbox - * @param string $folder_path - * @param boolean $expunge - * @param bool $utf7 - * - * @return null|Message - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws RuntimeException - * @throws ResponseException - */ - public function copy(string $folder_path, bool $expunge = false, bool $utf7 = false): ?Message { - $this->client->openFolder($folder_path); - $status = $this->client->getConnection()->examineFolder($folder_path)->validatedData(); - - if (isset($status["uidnext"])) { - $next_uid = $status["uidnext"]; - if ((int)$next_uid <= 0) { - return null; - } - - /** @var Folder $folder */ - $folder = $this->client->getFolderByPath($folder_path, $utf7); - - $this->client->openFolder($this->folder_path); - if ($this->client->getConnection()->copyMessage($folder->path, $this->getSequenceId(), null, $this->sequence)->validatedData()) { - return $this->fetchNewMail($folder, $next_uid, "copied", $expunge); - } - } - - return null; - } - - /** - * Move the current Messages to a mailbox - * @param string $folder_path - * @param boolean $expunge - * @param bool $utf7 - * - * @return Message|null - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws RuntimeException - * @throws ResponseException - */ - public function move(string $folder_path, bool $expunge = false, bool $utf7 = false): ?Message { - $this->client->openFolder($folder_path); - $status = $this->client->getConnection()->examineFolder($folder_path)->validatedData(); - - if (isset($status["uidnext"])) { - $next_uid = $status["uidnext"]; - if ((int)$next_uid <= 0) { - return null; - } - - /** @var Folder $folder */ - $folder = $this->client->getFolderByPath($folder_path, $utf7); - - $this->client->openFolder($this->folder_path); - if ($this->client->getConnection()->moveMessage($folder->path, $this->getSequenceId(), null, $this->sequence)->validatedData()) { - return $this->fetchNewMail($folder, $next_uid, "moved", $expunge); - } - } - - return null; - } - - /** - * Fetch a new message and fire a given event - * @param Folder $folder - * @param int $next_uid - * @param string $event - * @param boolean $expunge - * - * @return Message - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws RuntimeException - * @throws ResponseException - */ - protected function fetchNewMail(Folder $folder, int $next_uid, string $event, bool $expunge): Message { - if ($expunge) $this->client->expunge(); - - $this->client->openFolder($folder->path); - - if ($this->sequence === IMAP::ST_UID) { - $sequence_id = $next_uid; - } else { - $sequence_id = $this->client->getConnection()->getMessageNumber($next_uid)->validatedData(); - } - - $message = $folder->query()->getMessage($sequence_id, null, $this->sequence); - $this->dispatch("message", $event, $this, $message); - - return $message; - } - - /** - * Delete the current Message - * @param bool $expunge - * @param string|null $trash_path - * @param boolean $force_move - * - * @return bool - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws RuntimeException - * @throws ResponseException - */ - public function delete(bool $expunge = true, ?string $trash_path = null, bool $force_move = false): bool { - $status = $this->setFlag("Deleted"); - if ($force_move) { - $trash_path = $trash_path === null ? $this->config["common_folders"]["trash"] : $trash_path; - $this->move($trash_path); - } - if ($expunge) $this->client->expunge(); - - $this->dispatch("message", "deleted", $this); - - return $status; - } - - /** - * Restore a deleted Message - * @param boolean $expunge - * - * @return bool - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws MessageFlagException - * @throws RuntimeException - * @throws ResponseException - */ - public function restore(bool $expunge = true): bool { - $status = $this->unsetFlag("Deleted"); - if ($expunge) $this->client->expunge(); - - $this->dispatch("message", "restored", $this); - - return $status; - } - - /** - * Set a given flag - * @param array|string $flag - * - * @return bool - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws MessageFlagException - * @throws RuntimeException - * @throws ResponseException - */ - public function setFlag(array|string $flag): bool { - $this->client->openFolder($this->folder_path); - $flag = "\\" . trim(is_array($flag) ? implode(" \\", $flag) : $flag); - $sequence_id = $this->getSequenceId(); - try { - $status = $this->client->getConnection()->store([$flag], $sequence_id, $sequence_id, "+", true, $this->sequence)->validatedData(); - } catch (Exceptions\RuntimeException $e) { - throw new MessageFlagException("flag could not be set", 0, $e); - } - $this->parseFlags(); - - $this->dispatch("flag", "new", $this, $flag); - - return (bool)$status; - } - - /** - * Unset a given flag - * @param array|string $flag - * - * @return bool - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws MessageFlagException - * @throws RuntimeException - * @throws ResponseException - */ - public function unsetFlag(array|string $flag): bool { - $this->client->openFolder($this->folder_path); - - $flag = "\\" . trim(is_array($flag) ? implode(" \\", $flag) : $flag); - $sequence_id = $this->getSequenceId(); - try { - $status = $this->client->getConnection()->store([$flag], $sequence_id, $sequence_id, "-", true, $this->sequence)->validatedData(); - } catch (Exceptions\RuntimeException $e) { - throw new MessageFlagException("flag could not be removed", 0, $e); - } - $this->parseFlags(); - - $this->dispatch("flag", "deleted", $this, $flag); - - return (bool)$status; - } - - /** - * Set a given flag - * @param array|string $flag - * - * @return bool - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws MessageFlagException - * @throws RuntimeException - * @throws ResponseException - */ - public function addFlag(array|string $flag): bool { - return $this->setFlag($flag); - } - - /** - * Unset a given flag - * @param array|string $flag - * - * @return bool - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws MessageFlagException - * @throws RuntimeException - * @throws ResponseException - */ - public function removeFlag(array|string $flag): bool { - return $this->unsetFlag($flag); - } - - /** - * Get all message attachments. - * - * @return AttachmentCollection - */ - public function getAttachments(): AttachmentCollection { - return $this->attachments; - } - - /** - * Get all message attachments. - * - * @return AttachmentCollection - */ - public function attachments(): AttachmentCollection { - return $this->getAttachments(); - } - - /** - * Checks if there are any attachments present - * - * @return boolean - */ - public function hasAttachments(): bool { - return $this->attachments->isEmpty() === false; - } - - /** - * Get the raw body - * - * @return string - */ - public function getRawBody(): string { - if ($this->raw_body === "") { - $this->raw_body = $this->structure->raw; - } - - return $this->raw_body; - } - - /** - * Get the message header - * - * @return ?Header - */ - public function getHeader(): ?Header { - return $this->header; - } - - /** - * Get the current client - * - * @return ?Client - */ - public function getClient(): ?Client { - return $this->client; - } - - /** - * Get the used fetch option - * - * @return ?integer - */ - public function getFetchOptions(): ?int { - return $this->fetch_options; - } - - /** - * Get the used fetch body option - * - * @return boolean - */ - public function getFetchBodyOption(): bool { - return $this->fetch_body; - } - - /** - * Get the used fetch flags option - * - * @return boolean - */ - public function getFetchFlagsOption(): bool { - return $this->fetch_flags; - } - - /** - * Get all available bodies - * - * @return array - */ - public function getBodies(): array { - return $this->bodies; - } - - /** - * Get all set flags - * - * @return FlagCollection - */ - public function getFlags(): FlagCollection { - return $this->flags; - } - - /** - * Get all set flags - * - * @return FlagCollection - */ - public function flags(): FlagCollection { - return $this->getFlags(); - } - - /** - * Check if a flag is set - * - * @param string $flag - * @return boolean - */ - public function hasFlag(string $flag): bool { - $flag = str_replace("\\", "", strtolower($flag)); - return $this->getFlags()->has($flag); - } - - /** - * Get the fetched structure - * - * @return Structure|null - */ - public function getStructure(): ?Structure { - return $this->structure; - } - - /** - * Check if a message matches another by comparing basic attributes - * - * @param null|Message $message - * @return boolean - */ - public function is(?Message $message = null): bool { - if (is_null($message)) { - return false; - } - - return $this->uid == $message->uid - && $this->message_id->first() == $message->message_id->first() - && $this->subject->first() == $message->subject->first() - && $this->date->toDate()->eq($message->date->toDate()); - } - - /** - * Get all message attributes - * - * @return array - */ - public function getAttributes(): array { - return array_merge($this->attributes, $this->header->getAttributes()); - } - - /** - * Set the message mask - * @param $mask - * - * @return Message - */ - public function setMask($mask): Message { - if (class_exists($mask)) { - $this->mask = $mask; - } - - return $this; - } - - /** - * Get the used message mask - * - * @return string - */ - public function getMask(): string { - return $this->mask; - } - - /** - * Get a masked instance by providing a mask name - * @param mixed|null $mask - * - * @return mixed - * @throws MaskNotFoundException - */ - public function mask(mixed $mask = null): mixed { - $mask = $mask !== null ? $mask : $this->mask; - if (class_exists($mask)) { - return new $mask($this); - } - - throw new MaskNotFoundException("Unknown mask provided: " . $mask); - } - - /** - * Get the message path aka folder path - * - * @return string - */ - public function getFolderPath(): string { - return $this->folder_path; - } - - /** - * Set the message path aka folder path - * @param $folder_path - * - * @return Message - */ - public function setFolderPath($folder_path): Message { - $this->folder_path = $folder_path; - - return $this; - } - - /** - * Set the config - * @param Config $config - * - * @return Message - */ - public function setConfig(Config $config): Message { - $this->config = $config; - - return $this; - } - - /** - * Get the config - * - * @return Config - */ - public function getConfig(): Config { - return $this->config; - } - - /** - * Set the options - * @param array $options - * - * @return Message - */ - public function setOptions(array $options): Message { - $this->options = $options; - - return $this; - } - - /** - * Get the options - * - * @return array - */ - public function getOptions(): array { - return $this->options; - } - - /** - * Set the available flags - * @param $available_flags - * - * @return Message - */ - public function setAvailableFlags($available_flags): Message { - $this->available_flags = $available_flags; - - return $this; - } - - /** - * Get the available flags - * - * @return array - */ - public function getAvailableFlags(): array { - return $this->available_flags; - } - - /** - * Set the attachment collection - * @param $attachments - * - * @return Message - */ - public function setAttachments($attachments): Message { - $this->attachments = $attachments; - - return $this; - } - - /** - * Set the flag collection - * @param $flags - * - * @return Message - */ - public function setFlags($flags): Message { - $this->flags = $flags; - - return $this; - } - - /** - * Set the client - * @param $client - * - * @return Message - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - * @throws ResponseException - */ - public function setClient($client): Message { - $this->client = $client; - $this->client?->openFolder($this->folder_path); - - return $this; - } - - /** - * Set the message number - * @param int $uid - * - * @return Message - */ - public function setUid(int $uid): Message { - $this->uid = $uid; - $this->msgn = null; - $this->msglist = null; - - return $this; - } - - /** - * Set the message number - * @param int $msgn - * @param int|null $msglist - * - * @return Message - */ - public function setMsgn(int $msgn, ?int $msglist = null): Message { - $this->msgn = $msgn; - $this->msglist = $msglist; - $this->uid = null; - - return $this; - } - - /** - * Get the current sequence type - * - * @return int - */ - public function getSequence(): int { - return $this->sequence; - } - - /** - * Get the current sequence id (either a UID or a message number!) - * - * @return int - */ - public function getSequenceId(): int { - return $this->sequence === IMAP::ST_UID ? $this->uid : $this->msgn; - } - - /** - * Set the sequence id - * @param $uid - * @param int|null $msglist - */ - public function setSequenceId($uid, ?int $msglist = null): void { - if ($this->getSequence() === IMAP::ST_UID) { - $this->setUid($uid); - $this->setMsglist($msglist); - } else { - $this->setMsgn($uid, $msglist); - } - } - - /** - * Get the decoder instance - * - * @return DecoderInterface - */ - public function getDecoder(): DecoderInterface { - return $this->decoder; - } - - /** - * Set the decoder instance - * @param DecoderInterface $decoder - * - * @return $this - */ - public function setDecoder(DecoderInterface $decoder): static { - $this->decoder = $decoder; - return $this; - } - - /** - * Safe the entire message in a file - * @param $filename - * - * @return bool|int - */ - public function save($filename): bool|int { - return file_put_contents($filename, $this->header->raw."\r\n\r\n".$this->structure->raw); - } -} diff --git a/plugins/vendor/webklex/php-imap/src/Part.php b/plugins/vendor/webklex/php-imap/src/Part.php deleted file mode 100644 index 3c55bdfb..00000000 --- a/plugins/vendor/webklex/php-imap/src/Part.php +++ /dev/null @@ -1,324 +0,0 @@ -raw = $raw_part; - $this->config = $config; - $this->header = $header; - $this->part_number = $part_number; - $this->parse(); - } - - /** - * Parse the raw parts - * - * @throws InvalidMessageDateException - */ - protected function parse(): void { - if ($this->header === null) { - $body = $this->findHeaders(); - }else{ - $body = $this->raw; - } - - $this->parseDisposition(); - $this->parseDescription(); - $this->parseEncoding(); - - $this->charset = $this->header->get("charset")->first(); - $this->name = $this->header->get("name"); - $this->filename = $this->header->get("filename"); - - if($this->header->get("id")->exist()) { - $this->id = $this->header->get("id"); - } else if($this->header->get("x_attachment_id")->exist()){ - $this->id = $this->header->get("x_attachment_id"); - } else if($this->header->get("content_id")->exist()){ - $this->id = strtr($this->header->get("content_id"), [ - '<' => '', - '>' => '' - ]); - } - - $content_types = $this->header->get("content_type")->all(); - if(!empty($content_types)){ - $this->subtype = $this->parseSubtype($content_types); - $content_type = $content_types[0]; - $parts = explode(';', $content_type); - $this->content_type = trim($parts[0]); - } - - $this->content = trim(rtrim($body)); - $this->bytes = strlen($this->content); - } - - /** - * Find all available headers and return the leftover body segment - * - * @return string - * @throws InvalidMessageDateException - */ - private function findHeaders(): string { - $body = $this->raw; - while (($pos = strpos($body, "\r\n")) > 0) { - $body = substr($body, $pos + 2); - } - $headers = substr($this->raw, 0, strlen($body) * -1); - $body = substr($body, 0, -2); - - $this->header = new Header($headers, $this->config); - - return $body; - } - - /** - * Try to parse the subtype if any is present - * @param $content_type - * - * @return ?string - */ - private function parseSubtype($content_type): ?string { - if (is_array($content_type)) { - foreach ($content_type as $part){ - if ((strpos($part, "/")) !== false){ - return $this->parseSubtype($part); - } - } - return null; - } - if (($pos = strpos($content_type, "/")) !== false){ - return substr(explode(";", $content_type)[0], $pos + 1); - } - return null; - } - - /** - * Try to parse the disposition if any is present - */ - private function parseDisposition(): void { - $content_disposition = $this->header->get("content_disposition")->first(); - if($content_disposition) { - $this->ifdisposition = true; - $this->disposition = (is_array($content_disposition)) ? implode(' ', $content_disposition) : explode(";", $content_disposition)[0]; - } - } - - /** - * Try to parse the description if any is present - */ - private function parseDescription(): void { - $content_description = $this->header->get("content_description")->first(); - if($content_description) { - $this->ifdescription = true; - $this->description = $content_description; - } - } - - /** - * Try to parse the encoding if any is present - */ - private function parseEncoding(): void { - $encoding = $this->header->get("content_transfer_encoding")->first(); - if($encoding) { - $this->encoding = match (strtolower($encoding)) { - "quoted-printable" => IMAP::MESSAGE_ENC_QUOTED_PRINTABLE, - "base64" => IMAP::MESSAGE_ENC_BASE64, - "7bit" => IMAP::MESSAGE_ENC_7BIT, - "8bit" => IMAP::MESSAGE_ENC_8BIT, - "binary" => IMAP::MESSAGE_ENC_BINARY, - default => IMAP::MESSAGE_ENC_OTHER, - }; - } - } - - /** - * Check if the current part represents an attachment - * - * @return bool - */ - public function isAttachment(): bool { - $valid_disposition = in_array(strtolower($this->disposition ?? ''), $this->config->get('options.dispositions')); - - if ($this->type == IMAP::MESSAGE_TYPE_TEXT && ($this->ifdisposition == 0 || empty($this->disposition) || !$valid_disposition)) { - if (($this->subtype == null || in_array((strtolower($this->subtype)), ["plain", "html"])) && $this->filename == null && $this->name == null) { - return false; - } - } - - if ($this->disposition === "inline" && $this->filename == null && $this->name == null && !$this->header->has("content_id")) { - return false; - } - return true; - } - - /** - * Get the part header - * - * @return Header|null - */ - public function getHeader(): ?Header { - return $this->header; - } - - /** - * Get the Config instance - * - * @return Config - */ - public function getConfig(): Config { - return $this->config; - } - -} diff --git a/plugins/vendor/webklex/php-imap/src/Query/Query.php b/plugins/vendor/webklex/php-imap/src/Query/Query.php deleted file mode 100644 index bed64a95..00000000 --- a/plugins/vendor/webklex/php-imap/src/Query/Query.php +++ /dev/null @@ -1,1103 +0,0 @@ -setClient($client); - $config = $this->client->getConfig(); - - $this->sequence = $config->get('options.sequence', IMAP::ST_MSGN); - if ($config->get('options.fetch') === IMAP::FT_PEEK) $this->leaveUnread(); - - if ($config->get('options.fetch_order') === 'desc') { - $this->fetch_order = 'desc'; - } else { - $this->fetch_order = 'asc'; - } - - $this->date_format = $config->get('date_format', 'd M y'); - $this->soft_fail = $config->get('options.soft_fail', false); - - $this->setExtensions($extensions); - $this->query = new Collection(); - $this->boot(); - } - - /** - * Instance boot method for additional functionality - */ - protected function boot(): void { - } - - /** - * Parse a given value - * @param mixed $value - * - * @return string - */ - protected function parse_value(mixed $value): string { - if ($value instanceof Carbon) { - $value = $value->format($this->date_format); - } - - return (string)$value; - } - - /** - * Check if a given date is a valid carbon object and if not try to convert it - * @param mixed $date - * - * @return Carbon - * @throws MessageSearchValidationException - */ - protected function parse_date(mixed $date): Carbon { - if ($date instanceof Carbon) return $date; - - try { - $date = Carbon::parse($date); - } catch (Exception) { - throw new MessageSearchValidationException(); - } - - return $date; - } - - /** - * Get the raw IMAP search query - * - * @return string - */ - public function generate_query(): string { - $query = ''; - $this->query->each(function($statement) use (&$query) { - if (count($statement) == 1) { - $query .= $statement[0]; - } else { - if ($statement[1] === null) { - $query .= $statement[0]; - } else { - if (is_numeric($statement[1]) || ( - ($statement[0] === 'SINCE' || $statement[0] === 'BEFORE') && - $this->client->getConfig()->get('options.unescaped_search_dates', false) - )) { - $query .= $statement[0] . ' ' . $statement[1]; - } else { - $query .= $statement[0] . ' "' . $statement[1] . '"'; - } - } - } - $query .= ' '; - - }); - - $this->raw_query = trim($query); - - return $this->raw_query; - } - - /** - * Perform an imap search request - * - * @return Collection - * @throws GetMessagesFailedException - * @throws AuthFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws ResponseException - */ - public function search(): Collection { - $this->generate_query(); - - try { - $available_messages = $this->client->getConnection()->search([$this->getRawQuery()], $this->sequence)->validatedData(); - return new Collection($available_messages); - } catch (RuntimeException|ConnectionFailedException $e) { - throw new GetMessagesFailedException("failed to fetch messages", 0, $e); - } - } - - /** - * Count all available messages matching the current search criteria - * - * @return int - * @throws AuthFailedException - * @throws GetMessagesFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws ResponseException - */ - public function count(): int { - return $this->search()->count(); - } - - /** - * Fetch a given id collection - * @param Collection $available_messages - * - * @return array - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - * @throws ResponseException - */ - protected function fetch(Collection $available_messages): array { - if ($this->fetch_order === 'desc') { - $available_messages = $available_messages->reverse(); - } - - $uids = $available_messages->forPage($this->page, $this->limit)->toArray(); - $extensions = $this->getExtensions(); - if (empty($extensions) === false && method_exists($this->client->getConnection(), "fetch")) { - // this polymorphic call is fine - the method exists at this point - $extensions = $this->client->getConnection()->fetch($extensions, $uids, null, $this->sequence)->validatedData(); - } - $flags = $this->client->getConnection()->flags($uids, $this->sequence)->validatedData(); - $headers = $this->client->getConnection()->headers($uids, "RFC822", $this->sequence)->validatedData(); - - $contents = []; - if ($this->getFetchBody()) { - $contents = $this->client->getConnection()->content($uids, $this->client->rfc, $this->sequence)->validatedData(); - } - - return [ - "uids" => $uids, - "flags" => $flags, - "headers" => $headers, - "contents" => $contents, - "extensions" => $extensions, - ]; - } - - /** - * Make a new message from given raw components - * @param integer $uid - * @param integer $msglist - * @param string $header - * @param string $content - * @param array $flags - * - * @return Message|null - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws GetMessagesFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws ReflectionException - * @throws ResponseException - */ - protected function make(int $uid, int $msglist, string $header, string $content, array $flags): ?Message { - try { - return Message::make($uid, $msglist, $this->getClient(), $header, $content, $flags, $this->getFetchOptions(), $this->sequence); - } catch (RuntimeException|MessageFlagException|InvalidMessageDateException|MessageContentFetchingException $e) { - $this->setError($uid, $e); - } - - $this->handleException($uid); - - return null; - } - - /** - * Get the message key for a given message - * @param string $message_key - * @param integer $msglist - * @param Message $message - * - * @return string - */ - protected function getMessageKey(string $message_key, int $msglist, Message $message): string { - $key = match ($message_key) { - 'number' => $message->getMessageNo(), - 'list' => $msglist, - 'uid' => $message->getUid(), - default => $message->getMessageId(), - }; - return (string)$key; - } - - /** - * Curates a given collection aof messages - * @param Collection $available_messages - * - * @return MessageCollection - * @throws GetMessagesFailedException - */ - public function curate_messages(Collection $available_messages): MessageCollection { - try { - if ($available_messages->count() > 0) { - return $this->populate($available_messages); - } - return MessageCollection::make(); - } catch (Exception $e) { - throw new GetMessagesFailedException($e->getMessage(), 0, $e); - } - } - - /** - * Populate a given id collection and receive a fully fetched message collection - * @param Collection $available_messages - * - * @return MessageCollection - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws GetMessagesFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws ReflectionException - * @throws RuntimeException - * @throws ResponseException - */ - protected function populate(Collection $available_messages): MessageCollection { - $messages = MessageCollection::make(); - $config = $this->client->getConfig(); - - $messages->total($available_messages->count()); - - $message_key = $config->get('options.message_key'); - - $raw_messages = $this->fetch($available_messages); - - $msglist = 0; - foreach ($raw_messages["headers"] as $uid => $header) { - $content = $raw_messages["contents"][$uid] ?? ""; - $flag = $raw_messages["flags"][$uid] ?? []; - $extensions = $raw_messages["extensions"][$uid] ?? []; - - $message = $this->make($uid, $msglist, $header, $content, $flag); - foreach ($extensions as $key => $extension) { - $message->getHeader()->set($key, $extension); - } - if ($message !== null) { - $key = $this->getMessageKey($message_key, $msglist, $message); - $messages->put("$key", $message); - } - $msglist++; - } - - return $messages; - } - - /** - * Fetch the current query and return all found messages - * - * @return MessageCollection - * @throws AuthFailedException - * @throws GetMessagesFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws ResponseException - */ - public function get(): MessageCollection { - return $this->curate_messages($this->search()); - } - - /** - * Fetch the current query as chunked requests - * @param callable $callback - * @param int $chunk_size - * @param int $start_chunk - * - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws GetMessagesFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws ReflectionException - * @throws RuntimeException - * @throws ResponseException - */ - public function chunked(callable $callback, int $chunk_size = 10, int $start_chunk = 1): void { - $start_chunk = max($start_chunk,1); - $chunk_size = max($chunk_size,1); - $skipped_messages_count = $chunk_size * ($start_chunk-1); - - $available_messages = $this->search(); - $available_messages_count = max($available_messages->count() - $skipped_messages_count,0); - - if ($available_messages_count > 0) { - $old_limit = $this->limit; - $old_page = $this->page; - - $this->limit = $chunk_size; - $this->page = $start_chunk; - $handled_messages_count = 0; - do { - $messages = $this->populate($available_messages); - $handled_messages_count += $messages->count(); - $callback($messages, $this->page); - $this->page++; - } while ($handled_messages_count < $available_messages_count); - $this->limit = $old_limit; - $this->page = $old_page; - } - } - - /** - * Paginate the current query - * @param int $per_page Results you which to receive per page - * @param null $page The current page you are on (e.g. 0, 1, 2, ...) use `null` to enable auto mode - * @param string $page_name The page name / uri parameter used for the generated links and the auto mode - * - * @return LengthAwarePaginator - * @throws AuthFailedException - * @throws GetMessagesFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws ResponseException - */ - public function paginate(int $per_page = 5, $page = null, string $page_name = 'imap_page'): LengthAwarePaginator { - if ($page === null && isset($_GET[$page_name]) && $_GET[$page_name] > 0) { - $this->page = intval($_GET[$page_name]); - } elseif ($page > 0) { - $this->page = (int)$page; - } - - $this->limit = $per_page; - - return $this->get()->paginate($per_page, $this->page, $page_name, true); - } - - /** - * Get a new Message instance - * @param int $uid - * @param null $msglist - * @param null $sequence - * - * @return Message - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws RuntimeException - * @throws ResponseException - */ - public function getMessage(int $uid, $msglist = null, $sequence = null): Message { - return new Message($uid, $msglist, $this->getClient(), $this->getFetchOptions(), $this->getFetchBody(), $this->getFetchFlags(), $sequence ?: $this->sequence); - } - - /** - * Get a message by its message number - * @param $msgn - * @param null $msglist - * - * @return Message - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws RuntimeException - * @throws ResponseException - */ - public function getMessageByMsgn($msgn, $msglist = null): Message { - return $this->getMessage($msgn, $msglist, IMAP::ST_MSGN); - } - - /** - * Get a message by its uid - * @param $uid - * - * @return Message - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws RuntimeException - * @throws ResponseException - */ - public function getMessageByUid($uid): Message { - return $this->getMessage($uid, null, IMAP::ST_UID); - } - - /** - * Filter all available uids by a given closure and get a curated list of messages - * @param callable $closure - * - * @return MessageCollection - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws GetMessagesFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws MessageNotFoundException - * @throws RuntimeException - * @throws ResponseException - */ - public function filter(callable $closure): MessageCollection { - $connection = $this->getClient()->getConnection(); - - $uids = $connection->getUid()->validatedData(); - $available_messages = new Collection(); - if (is_array($uids)) { - foreach ($uids as $id) { - if ($closure($id)) { - $available_messages->push($id); - } - } - } - - return $this->curate_messages($available_messages); - } - - /** - * Get all messages with an uid greater or equal to a given UID - * @param int $uid - * - * @return MessageCollection - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws GetMessagesFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws MessageNotFoundException - * @throws RuntimeException - * @throws ResponseException - */ - public function getByUidGreaterOrEqual(int $uid): MessageCollection { - return $this->filter(function($id) use ($uid) { - return $id >= $uid; - }); - } - - /** - * Get all messages with an uid greater than a given UID - * @param int $uid - * - * @return MessageCollection - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws GetMessagesFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws MessageNotFoundException - * @throws RuntimeException - * @throws ResponseException - */ - public function getByUidGreater(int $uid): MessageCollection { - return $this->filter(function($id) use ($uid) { - return $id > $uid; - }); - } - - /** - * Get all messages with an uid lower than a given UID - * @param int $uid - * - * @return MessageCollection - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws GetMessagesFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws MessageNotFoundException - * @throws RuntimeException - * @throws ResponseException - */ - public function getByUidLower(int $uid): MessageCollection { - return $this->filter(function($id) use ($uid) { - return $id < $uid; - }); - } - - /** - * Get all messages with an uid lower or equal to a given UID - * @param int $uid - * - * @return MessageCollection - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws GetMessagesFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws MessageNotFoundException - * @throws RuntimeException - * @throws ResponseException - */ - public function getByUidLowerOrEqual(int $uid): MessageCollection { - return $this->filter(function($id) use ($uid) { - return $id <= $uid; - }); - } - - /** - * Get all messages with an uid greater than a given UID - * @param int $uid - * - * @return MessageCollection - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws GetMessagesFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws MessageNotFoundException - * @throws RuntimeException - * @throws ResponseException - */ - public function getByUidLowerThan(int $uid): MessageCollection { - return $this->filter(function($id) use ($uid) { - return $id < $uid; - }); - } - - /** - * Don't mark messages as read when fetching - * - * @return $this - */ - public function leaveUnread(): static { - $this->setFetchOptions(IMAP::FT_PEEK); - - return $this; - } - - /** - * Mark all messages as read when fetching - * - * @return $this - */ - public function markAsRead(): static { - $this->setFetchOptions(IMAP::FT_UID); - - return $this; - } - - /** - * Set the sequence type - * @param int $sequence - * - * @return $this - */ - public function setSequence(int $sequence): static { - $this->sequence = $sequence; - - return $this; - } - - /** - * Get the sequence type - * - * @return int|string - */ - public function getSequence(): int|string { - return $this->sequence; - } - - /** - * @return Client - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - * @throws ResponseException - */ - public function getClient(): Client { - $this->client->checkConnection(); - return $this->client; - } - - /** - * Set the limit and page for the current query - * @param int $limit - * @param int $page - * - * @return $this - */ - public function limit(int $limit, int $page = 1): static { - if ($page >= 1) $this->page = $page; - $this->limit = $limit; - - return $this; - } - - /** - * Get the current query collection - * - * @return Collection - */ - public function getQuery(): Collection { - return $this->query; - } - - /** - * Set all query parameters - * @param array $query - * - * @return $this - */ - public function setQuery(array $query): static { - $this->query = new Collection($query); - return $this; - } - - /** - * Get the raw query - * - * @return string - */ - public function getRawQuery(): string { - return $this->raw_query; - } - - /** - * Set the raw query - * @param string $raw_query - * - * @return $this - */ - public function setRawQuery(string $raw_query): static { - $this->raw_query = $raw_query; - return $this; - } - - /** - * Get all applied extensions - * - * @return string[] - */ - public function getExtensions(): array { - return $this->extensions; - } - - /** - * Set all extensions that should be used - * @param string[] $extensions - * - * @return $this - */ - public function setExtensions(array $extensions): static { - $this->extensions = $extensions; - if (count($this->extensions) > 0) { - if (in_array("UID", $this->extensions) === false) { - $this->extensions[] = "UID"; - } - } - return $this; - } - - /** - * Set the client instance - * @param Client $client - * - * @return $this - */ - public function setClient(Client $client): static { - $this->client = $client; - return $this; - } - - /** - * Get the set fetch limit - * - * @return ?int - */ - public function getLimit(): ?int { - return $this->limit; - } - - /** - * Set the fetch limit - * @param int $limit - * - * @return $this - */ - public function setLimit(int $limit): static { - $this->limit = $limit <= 0 ? null : $limit; - return $this; - } - - /** - * Get the set page - * - * @return int - */ - public function getPage(): int { - return $this->page; - } - - /** - * Set the page - * @param int $page - * - * @return $this - */ - public function setPage(int $page): static { - $this->page = $page; - return $this; - } - - /** - * Set the fetch option flag - * @param int $fetch_options - * - * @return $this - */ - public function setFetchOptions(int $fetch_options): static { - $this->fetch_options = $fetch_options; - return $this; - } - - /** - * Set the fetch option flag - * @param int $fetch_options - * - * @return $this - */ - public function fetchOptions(int $fetch_options): static { - return $this->setFetchOptions($fetch_options); - } - - /** - * Get the fetch option flag - * - * @return ?int - */ - public function getFetchOptions(): ?int { - return $this->fetch_options; - } - - /** - * Get the fetch body flag - * - * @return boolean - */ - public function getFetchBody(): bool { - return $this->fetch_body; - } - - /** - * Set the fetch body flag - * @param boolean $fetch_body - * - * @return $this - */ - public function setFetchBody(bool $fetch_body): static { - $this->fetch_body = $fetch_body; - return $this; - } - - /** - * Set the fetch body flag - * @param boolean $fetch_body - * - * @return $this - */ - public function fetchBody(bool $fetch_body): static { - return $this->setFetchBody($fetch_body); - } - - /** - * Get the fetch body flag - * - * @return bool - */ - public function getFetchFlags(): bool { - return $this->fetch_flags; - } - - /** - * Set the fetch flag - * @param bool $fetch_flags - * - * @return $this - */ - public function setFetchFlags(bool $fetch_flags): static { - $this->fetch_flags = $fetch_flags; - return $this; - } - - /** - * Set the fetch order - * @param string $fetch_order - * - * @return $this - */ - public function setFetchOrder(string $fetch_order): static { - $fetch_order = strtolower($fetch_order); - - if (in_array($fetch_order, ['asc', 'desc'])) { - $this->fetch_order = $fetch_order; - } - - return $this; - } - - /** - * Set the fetch order - * @param string $fetch_order - * - * @return $this - */ - public function fetchOrder(string $fetch_order): static { - return $this->setFetchOrder($fetch_order); - } - - /** - * Get the fetch order - * - * @return string - */ - public function getFetchOrder(): string { - return $this->fetch_order; - } - - /** - * Set the fetch order to ascending - * - * @return $this - */ - public function setFetchOrderAsc(): static { - return $this->setFetchOrder('asc'); - } - - /** - * Set the fetch order to ascending - * - * @return $this - */ - public function fetchOrderAsc(): static { - return $this->setFetchOrderAsc(); - } - - /** - * Set the fetch order to descending - * - * @return $this - */ - public function setFetchOrderDesc(): static { - return $this->setFetchOrder('desc'); - } - - /** - * Set the fetch order to descending - * - * @return $this - */ - public function fetchOrderDesc(): static { - return $this->setFetchOrderDesc(); - } - - /** - * Set soft fail mode - * @var boolean $state - * - * @return $this - */ - public function softFail(bool $state = true): static { - return $this->setSoftFail($state); - } - - /** - * Set soft fail mode - * - * @var boolean $state - * @return $this - */ - public function setSoftFail(bool $state = true): static { - $this->soft_fail = $state; - - return $this; - } - - /** - * Get soft fail mode - * - * @return boolean - */ - public function getSoftFail(): bool { - return $this->soft_fail; - } - - /** - * Handle the exception for a given uid - * @param integer $uid - * - * @throws GetMessagesFailedException - */ - protected function handleException(int $uid): void { - if ($this->soft_fail === false && $this->hasError($uid)) { - $error = $this->getError($uid); - throw new GetMessagesFailedException($error->getMessage(), 0, $error); - } - } - - /** - * Add a new error to the error holder - * @param integer $uid - * @param Exception $error - */ - protected function setError(int $uid, Exception $error): void { - $this->errors[$uid] = $error; - } - - /** - * Check if there are any errors / exceptions present - * @var ?integer $uid - * - * @return boolean - */ - public function hasErrors(?int $uid = null): bool { - if ($uid !== null) { - return $this->hasError($uid); - } - return count($this->errors) > 0; - } - - /** - * Check if there is an error / exception present - * @var integer $uid - * - * @return boolean - */ - public function hasError(int $uid): bool { - return isset($this->errors[$uid]); - } - - /** - * Get all available errors / exceptions - * - * @return array - */ - public function errors(): array { - return $this->getErrors(); - } - - /** - * Get all available errors / exceptions - * - * @return array - */ - public function getErrors(): array { - return $this->errors; - } - - /** - * Get a specific error / exception - * @var integer $uid - * - * @return Exception|null - */ - public function error(int $uid): ?Exception { - return $this->getError($uid); - } - - /** - * Get a specific error / exception - * @var integer $uid - * - * @return ?Exception - */ - public function getError(int $uid): ?Exception { - if ($this->hasError($uid)) { - return $this->errors[$uid]; - } - return null; - } -} diff --git a/plugins/vendor/webklex/php-imap/src/Query/WhereQuery.php b/plugins/vendor/webklex/php-imap/src/Query/WhereQuery.php deleted file mode 100755 index 5636cf35..00000000 --- a/plugins/vendor/webklex/php-imap/src/Query/WhereQuery.php +++ /dev/null @@ -1,555 +0,0 @@ -whereNot(); - $name = substr($name, 3); - } - - if (!str_contains(strtolower($name), "where")) { - $method = 'where' . ucfirst($name); - } else { - $method = lcfirst($name); - } - - if (method_exists($this, $method) === true) { - return call_user_func_array([$that, $method], $arguments); - } - - throw new MethodNotFoundException("Method " . self::class . '::' . $method . '() is not supported'); - } - - /** - * Validate a given criteria - * @param $criteria - * - * @return string - * @throws InvalidWhereQueryCriteriaException - */ - protected function validate_criteria($criteria): string { - $command = strtoupper($criteria); - if (str_starts_with($command, "CUSTOM ")) { - return substr($criteria, 7); - } - if (in_array($command, $this->available_criteria) === false) { - throw new InvalidWhereQueryCriteriaException("Invalid imap search criteria: $command"); - } - - return $criteria; - } - - /** - * Register search parameters - * @param mixed $criteria - * @param mixed $value - * - * @return $this - * @throws InvalidWhereQueryCriteriaException - * - * Examples: - * $query->from("someone@email.tld")->seen(); - * $query->whereFrom("someone@email.tld")->whereSeen(); - * $query->where([["FROM" => "someone@email.tld"], ["SEEN"]]); - * $query->where(["FROM" => "someone@email.tld"])->where(["SEEN"]); - * $query->where(["FROM" => "someone@email.tld", "SEEN"]); - * $query->where("FROM", "someone@email.tld")->where("SEEN"); - */ - public function where(mixed $criteria, mixed $value = null): static { - if (is_array($criteria)) { - foreach ($criteria as $key => $value) { - if (is_numeric($key)) { - $this->where($value); - }else{ - $this->where($key, $value); - } - } - } else { - $this->push_search_criteria($criteria, $value); - } - - return $this; - } - - /** - * Push a given search criteria and value pair to the search query - * @param $criteria string - * @param $value mixed - * - * @throws InvalidWhereQueryCriteriaException - */ - protected function push_search_criteria(string $criteria, mixed $value): void { - $criteria = $this->validate_criteria($criteria); - $value = $this->parse_value($value); - - if ($value === '') { - $this->query->push([$criteria]); - } else { - $this->query->push([$criteria, $value]); - } - } - - /** - * @param Closure|null $closure - * - * @return $this - */ - public function orWhere(?Closure $closure = null): static { - $this->query->push(['OR']); - if ($closure !== null) $closure($this); - - return $this; - } - - /** - * @param Closure|null $closure - * - * @return $this - */ - public function andWhere(?Closure $closure = null): static { - $this->query->push(['AND']); - if ($closure !== null) $closure($this); - - return $this; - } - - /** - * @return $this - * @throws InvalidWhereQueryCriteriaException - */ - public function whereAll(): static { - return $this->where('ALL'); - } - - /** - * @return $this - * @throws InvalidWhereQueryCriteriaException - */ - public function whereAnswered(): static { - return $this->where('ANSWERED'); - } - - /** - * @param string $value - * - * @return $this - * @throws InvalidWhereQueryCriteriaException - */ - public function whereBcc(string $value): static { - return $this->where('BCC', $value); - } - - /** - * @param mixed $value - * @return $this - * @throws InvalidWhereQueryCriteriaException - * @throws MessageSearchValidationException - */ - public function whereBefore(mixed $value): static { - $date = $this->parse_date($value); - return $this->where('BEFORE', $date); - } - - /** - * @param string $value - * - * @return $this - * @throws InvalidWhereQueryCriteriaException - */ - public function whereBody(string $value): static { - return $this->where('BODY', $value); - } - - /** - * @param string $value - * - * @return $this - * @throws InvalidWhereQueryCriteriaException - */ - public function whereCc(string $value): static { - return $this->where('CC', $value); - } - - /** - * @return $this - * @throws InvalidWhereQueryCriteriaException - */ - public function whereDeleted(): static { - return $this->where('DELETED'); - } - - /** - * @param string $value - * - * @return $this - * @throws InvalidWhereQueryCriteriaException - */ - public function whereFlagged(string $value): static { - return $this->where('FLAGGED', $value); - } - - /** - * @param string $value - * - * @return $this - * @throws InvalidWhereQueryCriteriaException - */ - public function whereFrom(string $value): static { - return $this->where('FROM', $value); - } - - /** - * @param string $value - * - * @return $this - * @throws InvalidWhereQueryCriteriaException - */ - public function whereKeyword(string $value): static { - return $this->where('KEYWORD', $value); - } - - /** - * @return $this - * @throws InvalidWhereQueryCriteriaException - */ - public function whereNew(): static { - return $this->where('NEW'); - } - - /** - * @return $this - * @throws InvalidWhereQueryCriteriaException - */ - public function whereNot(): static { - return $this->where('NOT'); - } - - /** - * @return $this - * @throws InvalidWhereQueryCriteriaException - */ - public function whereOld(): static { - return $this->where('OLD'); - } - - /** - * @param mixed $value - * - * @return $this - * @throws MessageSearchValidationException - * @throws InvalidWhereQueryCriteriaException - */ - public function whereOn(mixed $value): static { - $date = $this->parse_date($value); - return $this->where('ON', $date); - } - - /** - * @return $this - * @throws InvalidWhereQueryCriteriaException - */ - public function whereRecent(): static { - return $this->where('RECENT'); - } - - /** - * @return $this - * @throws InvalidWhereQueryCriteriaException - */ - public function whereSeen(): static { - return $this->where('SEEN'); - } - - /** - * @param mixed $value - * - * @return $this - * @throws MessageSearchValidationException - * @throws InvalidWhereQueryCriteriaException - */ - public function whereSince(mixed $value): static { - $date = $this->parse_date($value); - return $this->where('SINCE', $date); - } - - /** - * @param string $value - * - * @return $this - * @throws InvalidWhereQueryCriteriaException - */ - public function whereSubject(string $value): static { - return $this->where('SUBJECT', $value); - } - - /** - * @param string $value - * - * @return $this - * @throws InvalidWhereQueryCriteriaException - */ - public function whereText(string $value): static { - return $this->where('TEXT', $value); - } - - /** - * @param string $value - * - * @return $this - * @throws InvalidWhereQueryCriteriaException - */ - public function whereTo(string $value): static { - return $this->where('TO', $value); - } - - /** - * @param string $value - * - * @return $this - * @throws InvalidWhereQueryCriteriaException - */ - public function whereUnkeyword(string $value): static { - return $this->where('UNKEYWORD', $value); - } - - /** - * @return $this - * @throws InvalidWhereQueryCriteriaException - */ - public function whereUnanswered(): static { - return $this->where('UNANSWERED'); - } - - /** - * @return $this - * @throws InvalidWhereQueryCriteriaException - */ - public function whereUndeleted(): static { - return $this->where('UNDELETED'); - } - - /** - * @return $this - * @throws InvalidWhereQueryCriteriaException - */ - public function whereUnflagged(): static { - return $this->where('UNFLAGGED'); - } - - /** - * @return $this - * @throws InvalidWhereQueryCriteriaException - */ - public function whereUnseen(): static { - return $this->where('UNSEEN'); - } - - /** - * @return $this - * @throws InvalidWhereQueryCriteriaException - */ - public function whereNoXSpam(): static { - return $this->where("CUSTOM X-Spam-Flag NO"); - } - - /** - * @return $this - * @throws InvalidWhereQueryCriteriaException - */ - public function whereIsXSpam(): static { - return $this->where("CUSTOM X-Spam-Flag YES"); - } - - /** - * Search for a specific header value - * @param $header - * @param $value - * - * @return $this - * @throws InvalidWhereQueryCriteriaException - */ - public function whereHeader($header, $value): static { - return $this->where("CUSTOM HEADER $header $value"); - } - - /** - * Search for a specific message id - * @param $messageId - * - * @return $this - * @throws InvalidWhereQueryCriteriaException - */ - public function whereMessageId($messageId): static { - return $this->whereHeader("Message-ID", $messageId); - } - - /** - * Search for a specific message id - * @param $messageId - * - * @return $this - * @throws InvalidWhereQueryCriteriaException - */ - public function whereInReplyTo($messageId): static { - return $this->whereHeader("In-Reply-To", $messageId); - } - - /** - * @param $country_code - * - * @return $this - * @throws InvalidWhereQueryCriteriaException - */ - public function whereLanguage($country_code): static { - return $this->where("Content-Language $country_code"); - } - - /** - * Get message be it UID. - * - * @param int|string $uid - * - * @return $this - * @throws InvalidWhereQueryCriteriaException - */ - public function whereUid(int|string $uid): static { - return $this->where('UID', $uid); - } - - /** - * Get messages by their UIDs. - * - * @param array $uids - * - * @return $this - * @throws InvalidWhereQueryCriteriaException - */ - public function whereUidIn(array $uids): static { - $uids = implode(',', $uids); - return $this->where('UID', $uids); - } - - /** - * Apply the callback if the given "value" is truthy. - * copied from @url https://github.com/laravel/framework/blob/8.x/src/Illuminate/Support/Traits/Conditionable.php - * - * @param mixed $value - * @param callable $callback - * @param callable|null $default - * @return $this|null - */ - public function when(mixed $value, callable $callback, ?callable $default = null): mixed { - if ($value) { - return $callback($this, $value) ?: $this; - } elseif ($default) { - return $default($this, $value) ?: $this; - } - - return $this; - } - - /** - * Apply the callback if the given "value" is falsy. - * copied from @url https://github.com/laravel/framework/blob/8.x/src/Illuminate/Support/Traits/Conditionable.php - * - * @param mixed $value - * @param callable $callback - * @param callable|null $default - * @return $this|mixed - */ - public function unless(mixed $value, callable $callback, ?callable $default = null): mixed { - if (!$value) { - return $callback($this, $value) ?: $this; - } elseif ($default) { - return $default($this, $value) ?: $this; - } - - return $this; - } - - /** - * Get all available search criteria - * - * @return array|string[] - */ - public function getAvailableCriteria(): array { - return $this->available_criteria; - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/src/Structure.php b/plugins/vendor/webklex/php-imap/src/Structure.php deleted file mode 100644 index 11f4cd66..00000000 --- a/plugins/vendor/webklex/php-imap/src/Structure.php +++ /dev/null @@ -1,172 +0,0 @@ -raw = $raw_structure; - $this->header = $header; - $this->options = $header->getConfig()->get('options'); - $this->parse(); - } - - /** - * Parse the given raw structure - * - * @throws MessageContentFetchingException - * @throws InvalidMessageDateException - */ - protected function parse(): void { - $this->findContentType(); - $this->parts = $this->find_parts(); - } - - /** - * Determine the message content type - */ - public function findContentType(): void { - $content_type = $this->header->get("content_type")->first(); - if($content_type && stripos($content_type, 'multipart') === 0) { - $this->type = IMAP::MESSAGE_TYPE_MULTIPART; - }else{ - $this->type = IMAP::MESSAGE_TYPE_TEXT; - } - } - - /** - * Find all available headers and return the leftover body segment - * @var string $context - * @var integer $part_number - * - * @return Part[] - * @throws InvalidMessageDateException - */ - private function parsePart(string $context, int $part_number = 0): array { - $body = $context; - while (($pos = strpos($body, "\r\n")) > 0) { - $body = substr($body, $pos + 2); - } - $headers = substr($context, 0, strlen($body) * -1); - $body = substr($body, 0, -2); - - $config = $this->header->getConfig(); - $headers = new Header($headers, $config); - if (($boundary = $headers->getBoundary()) !== null) { - $parts = $this->detectParts($boundary, $body, $part_number); - - if(count($parts) > 1) { - return $parts; - } - } - - return [new Part($body, $this->header->getConfig(), $headers, $part_number)]; - } - - /** - * @param string $boundary - * @param string $context - * @param int $part_number - * - * @return array - * @throws InvalidMessageDateException - */ - private function detectParts(string $boundary, string $context, int $part_number = 0): array { - $base_parts = explode( "--".$boundary, $context); - if(count($base_parts) == 0) { - $base_parts = explode($boundary, $context); - } - $final_parts = []; - foreach($base_parts as $ctx) { - $ctx = substr($ctx, 2); - if ($ctx !== "--" && $ctx != "" && $ctx != "\r\n") { - $parts = $this->parsePart($ctx, $part_number); - foreach ($parts as $part) { - $final_parts[] = $part; - $part_number = $part->part_number; - } - $part_number++; - } - } - return $final_parts; - } - - /** - * Find all available parts - * - * @return array - * @throws MessageContentFetchingException - * @throws InvalidMessageDateException - */ - public function find_parts(): array { - if($this->type === IMAP::MESSAGE_TYPE_MULTIPART) { - if (($boundary = $this->header->getBoundary()) === null) { - throw new MessageContentFetchingException("no content found", 0); - } - - return $this->detectParts($boundary, $this->raw); - } - - return [new Part($this->raw, $this->header->getConfig(), $this->header)]; - } -} diff --git a/plugins/vendor/webklex/php-imap/src/Support/AttachmentCollection.php b/plugins/vendor/webklex/php-imap/src/Support/AttachmentCollection.php deleted file mode 100644 index 9d2af20d..00000000 --- a/plugins/vendor/webklex/php-imap/src/Support/AttachmentCollection.php +++ /dev/null @@ -1,26 +0,0 @@ - - */ -class AttachmentCollection extends PaginatedCollection { - -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/src/Support/FlagCollection.php b/plugins/vendor/webklex/php-imap/src/Support/FlagCollection.php deleted file mode 100644 index b8bf352c..00000000 --- a/plugins/vendor/webklex/php-imap/src/Support/FlagCollection.php +++ /dev/null @@ -1,25 +0,0 @@ - - */ -class FlagCollection extends PaginatedCollection { - -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/src/Support/FolderCollection.php b/plugins/vendor/webklex/php-imap/src/Support/FolderCollection.php deleted file mode 100644 index 212ddb0a..00000000 --- a/plugins/vendor/webklex/php-imap/src/Support/FolderCollection.php +++ /dev/null @@ -1,26 +0,0 @@ - - */ -class FolderCollection extends PaginatedCollection { - -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/src/Support/Masks/AttachmentMask.php b/plugins/vendor/webklex/php-imap/src/Support/Masks/AttachmentMask.php deleted file mode 100644 index 2559c5b9..00000000 --- a/plugins/vendor/webklex/php-imap/src/Support/Masks/AttachmentMask.php +++ /dev/null @@ -1,45 +0,0 @@ -parent->content); - } - - /** - * Get a base64 image src string - * - * @return string|null - */ - public function getImageSrc(): ?string { - return 'data:'.$this->parent->content_type.';base64,'.$this->getContentBase64Encoded(); - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/src/Support/Masks/Mask.php b/plugins/vendor/webklex/php-imap/src/Support/Masks/Mask.php deleted file mode 100755 index 2101f574..00000000 --- a/plugins/vendor/webklex/php-imap/src/Support/Masks/Mask.php +++ /dev/null @@ -1,137 +0,0 @@ -parent = $parent; - - if(method_exists($this->parent, 'getAttributes')){ - $this->attributes = array_merge($this->attributes, $this->parent->getAttributes()); - } - - $this->boot(); - } - - /** - * Boot method made to be used by any custom mask - */ - protected function boot(): void {} - - /** - * Call dynamic attribute setter and getter methods and inherit the parent calls - * @param string $method - * @param array $arguments - * - * @return mixed - * @throws MethodNotFoundException - */ - public function __call(string $method, array $arguments) { - if(strtolower(substr($method, 0, 3)) === 'get') { - $name = Str::snake(substr($method, 3)); - - if(isset($this->attributes[$name])) { - return $this->attributes[$name]; - } - - }elseif (strtolower(substr($method, 0, 3)) === 'set') { - $name = Str::snake(substr($method, 3)); - - if(isset($this->attributes[$name])) { - $this->attributes[$name] = array_pop($arguments); - - return $this->attributes[$name]; - } - - } - - if(method_exists($this->parent, $method) === true){ - return call_user_func_array([$this->parent, $method], $arguments); - } - - throw new MethodNotFoundException("Method ".self::class.'::'.$method.'() is not supported'); - } - - /** - * Magic setter - * @param $name - * @param $value - * - * @return mixed - */ - public function __set($name, $value) { - $this->attributes[$name] = $value; - - return $this->attributes[$name]; - } - - /** - * Magic getter - * @param $name - * - * @return mixed|null - */ - public function __get($name) { - if(isset($this->attributes[$name])) { - return $this->attributes[$name]; - } - - return null; - } - - /** - * Get the parent instance - * - * @return mixed - */ - public function getParent(): mixed { - return $this->parent; - } - - /** - * Get all available attributes - * - * @return array - */ - public function getAttributes(): array { - return $this->attributes; - } - -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/src/Support/Masks/MessageMask.php b/plugins/vendor/webklex/php-imap/src/Support/Masks/MessageMask.php deleted file mode 100644 index aa3623f9..00000000 --- a/plugins/vendor/webklex/php-imap/src/Support/Masks/MessageMask.php +++ /dev/null @@ -1,87 +0,0 @@ -parent->getBodies(); - if (!isset($bodies['html'])) { - return null; - } - - if(is_object($bodies['html']) && property_exists($bodies['html'], 'content')) { - return $bodies['html']->content; - } - return $bodies['html']; - } - - /** - * Get the Message html body filtered by an optional callback - * @param callable|null $callback - * - * @return string|null - */ - public function getCustomHTMLBody(?callable $callback = null): ?string { - $body = $this->getHtmlBody(); - if($body === null) return null; - - if ($callback !== null) { - $aAttachment = $this->parent->getAttachments(); - $aAttachment->each(function($oAttachment) use(&$body, $callback) { - /** @var Attachment $oAttachment */ - if(is_callable($callback)) { - $body = $callback($body, $oAttachment); - }elseif(is_string($callback)) { - call_user_func($callback, [$body, $oAttachment]); - } - }); - } - - return $body; - } - - /** - * Get the Message html body with embedded base64 images - * the resulting $body. - * - * @return string|null - */ - public function getHTMLBodyWithEmbeddedBase64Images(): ?string { - return $this->getCustomHTMLBody(function($body, $oAttachment){ - /** @var Attachment $oAttachment */ - if ($oAttachment->id) { - $body = str_replace('cid:'.$oAttachment->id, 'data:'.$oAttachment->getContentType().';base64, '.base64_encode($oAttachment->getContent()), $body); - } - - return $body; - }); - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/src/Support/MessageCollection.php b/plugins/vendor/webklex/php-imap/src/Support/MessageCollection.php deleted file mode 100644 index 1ca97a70..00000000 --- a/plugins/vendor/webklex/php-imap/src/Support/MessageCollection.php +++ /dev/null @@ -1,26 +0,0 @@ - - */ -class MessageCollection extends PaginatedCollection { - -} diff --git a/plugins/vendor/webklex/php-imap/src/Support/PaginatedCollection.php b/plugins/vendor/webklex/php-imap/src/Support/PaginatedCollection.php deleted file mode 100644 index 3b3470e9..00000000 --- a/plugins/vendor/webklex/php-imap/src/Support/PaginatedCollection.php +++ /dev/null @@ -1,82 +0,0 @@ -total ?: $this->count(); - - $results = !$prepaginated && $total ? $this->forPage($page, $per_page)->toArray() : $this->all(); - - return $this->paginator($results, $total, $per_page, $page, [ - 'path' => Paginator::resolveCurrentPath(), - 'pageName' => $page_name, - ]); - } - - /** - * Create a new length-aware paginator instance. - * @param array $items - * @param int $total - * @param int $per_page - * @param int|null $current_page - * @param array $options - * - * @return LengthAwarePaginator - */ - protected function paginator(array $items, int $total, int $per_page, ?int $current_page, array $options): LengthAwarePaginator { - return new LengthAwarePaginator($items, $total, $per_page, $current_page, $options); - } - - /** - * Get and set the total amount - * @param null $total - * - * @return int|null - */ - public function total($total = null): ?int { - if($total === null) { - return $this->total; - } - - return $this->total = $total; - } -} diff --git a/plugins/vendor/webklex/php-imap/src/Traits/HasEvents.php b/plugins/vendor/webklex/php-imap/src/Traits/HasEvents.php deleted file mode 100644 index 6dc382b7..00000000 --- a/plugins/vendor/webklex/php-imap/src/Traits/HasEvents.php +++ /dev/null @@ -1,86 +0,0 @@ -events[$section])) { - $this->events[$section][$event] = $class; - } - } - - /** - * Set all events - * @param array $events - */ - public function setEvents(array $events): void { - $this->events = $events; - } - - /** - * Get a specific event callback - * @param string $section - * @param string $event - * - * @return Event|string - * @throws EventNotFoundException - */ - public function getEvent(string $section, string $event): Event|string { - if (isset($this->events[$section])) { - return $this->events[$section][$event]; - } - throw new EventNotFoundException(); - } - - /** - * Get all events - * - * @return array - */ - public function getEvents(): array { - return $this->events; - } - - /** - * Dispatch a specific event. - * @throws EventNotFoundException - */ - public function dispatch(string $section, string $event, mixed ...$args): void { - $event = $this->getEvent($section, $event); - $event::dispatch(...$args); - } - -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/src/config/imap.php b/plugins/vendor/webklex/php-imap/src/config/imap.php deleted file mode 100644 index abf8e6e6..00000000 --- a/plugins/vendor/webklex/php-imap/src/config/imap.php +++ /dev/null @@ -1,274 +0,0 @@ - 'd-M-Y', - - /* - |-------------------------------------------------------------------------- - | Default account - |-------------------------------------------------------------------------- - | - | The default account identifier. It will be used as default for any missing account parameters. - | If however the default account is missing a parameter the package default will be used. - | Set to 'false' [boolean] to disable this functionality. - | - */ - 'default' => 'default', - - /* - |-------------------------------------------------------------------------- - | Security options - |-------------------------------------------------------------------------- - | - | You can enable or disable certain security features here by setting them to true or false to enable or disable - | them. - | -detect_spoofing: - | Detect spoofing attempts by checking the message sender against the message headers. - | Default TRUE - | -detect_spoofing_exception: - | Throw an exception if a spoofing attempt is detected. - | Default FALSE - | -sanitize_filenames: - | Sanitize attachment filenames by removing any unwanted and potentially dangerous characters. This is not a - | 100% secure solution, but it should help to prevent some common attacks. Please sanitize the filenames - | again if you need a more secure solution. - | Default TRUE - | - */ - 'security' => [ - "detect_spoofing" => true, - "detect_spoofing_exception" => false, - "sanitize_filenames" => true, - ], - - /* - |-------------------------------------------------------------------------- - | Available accounts - |-------------------------------------------------------------------------- - | - | Please list all IMAP accounts which you are planning to use within the - | array below. - | - */ - 'accounts' => [ - - 'default' => [// account identifier - 'host' => 'localhost', - 'port' => 993, - 'protocol' => 'imap', //might also use imap, [pop3 or nntp (untested)] - 'encryption' => 'ssl', // Supported: false, 'ssl', 'tls' - 'validate_cert' => true, - 'username' => 'root@example.com', - 'password' => '', - 'authentication' => null, - 'rfc' => 'RFC822', // If you are using iCloud, you might want to set this to 'BODY' - 'proxy' => [ - 'socket' => null, - 'request_fulluri' => false, - 'username' => null, - 'password' => null, - ], - "timeout" => 30, - "extensions" => [] - ], - - /* - 'gmail' => [ // account identifier - 'host' => 'imap.gmail.com', - 'port' => 993, - 'encryption' => 'ssl', - 'validate_cert' => true, - 'username' => 'example@gmail.com', - 'password' => 'PASSWORD', - 'authentication' => 'oauth', - ], - - 'another' => [ // account identifier - 'host' => '', - 'port' => 993, - 'encryption' => false, - 'validate_cert' => true, - 'username' => '', - 'password' => '', - 'authentication' => null, - ] - */ - ], - - /* - |-------------------------------------------------------------------------- - | Available IMAP options - |-------------------------------------------------------------------------- - | - | Available php imap config parameters are listed below - | -Delimiter (optional): - | This option is only used when calling $oClient-> - | You can use any supported char such as ".", "/", (...) - | -Fetch option: - | IMAP::FT_UID - Message marked as read by fetching the body message - | IMAP::FT_PEEK - Fetch the message without setting the "seen" flag - | -Fetch sequence id: - | IMAP::ST_UID - Fetch message components using the message uid - | IMAP::ST_MSGN - Fetch message components using the message number - | -Body download option - | Default TRUE - | -Flag download option - | Default TRUE - | -Soft fail - | Default FALSE - Set to TRUE if you want to ignore certain exception while fetching bulk messages - | -RFC822 - | Default TRUE - Set to FALSE to prevent the usage of \imap_rfc822_parse_headers(). - | See https://github.com/Webklex/php-imap/issues/115 for more information. - | -Debug enable to trace communication traffic - | -UID cache enable the UID cache - | -Fallback date is used if the given message date could not be parsed - | -Boundary regex used to detect message boundaries. If you are having problems with empty messages, missing - | attachments or anything like this. Be advised that it likes to break which causes new problems.. - | -Message key identifier option - | You can choose between the following: - | 'id' - Use the MessageID as array key (default, might cause hickups with yahoo mail) - | 'number' - Use the message number as array key (isn't always unique and can cause some interesting behavior) - | 'list' - Use the message list number as array key (incrementing integer (does not always start at 0 or 1) - | 'uid' - Use the message uid as array key (isn't always unique and can cause some interesting behavior) - | -Fetch order - | 'asc' - Order all messages ascending (probably results in oldest first) - | 'desc' - Order all messages descending (probably results in newest first) - | -Disposition types potentially considered an attachment - | Default ['attachment', 'inline'] - | -Common folders - | Default folder locations and paths assumed if none is provided - | -Open IMAP options: - | DISABLE_AUTHENTICATOR - Disable authentication properties. - | Use 'GSSAPI' if you encounter the following - | error: "Kerberos error: No credentials cache - | file found (try running kinit) (...)" - | or ['GSSAPI','PLAIN'] if you are using outlook mail - | - */ - 'options' => [ - 'delimiter' => '/', - 'fetch' => \Webklex\PHPIMAP\IMAP::FT_PEEK, - 'sequence' => \Webklex\PHPIMAP\IMAP::ST_UID, - 'fetch_body' => true, - 'fetch_flags' => true, - 'soft_fail' => false, - 'rfc822' => true, - 'debug' => false, - 'unescaped_search_dates' => false, - 'uid_cache' => true, - // 'fallback_date' => "01.01.1970 00:00:00", - 'boundary' => '/boundary=(.*?(?=;)|(.*))/i', - 'message_key' => 'list', - 'fetch_order' => 'asc', - 'dispositions' => ['attachment', 'inline'], - 'common_folders' => [ - "root" => "INBOX", - "junk" => "INBOX/Junk", - "draft" => "INBOX/Drafts", - "sent" => "INBOX/Sent", - "trash" => "INBOX/Trash", - ], - 'open' => [ - // 'DISABLE_AUTHENTICATOR' => 'GSSAPI' - ] - ], - - /** - * |-------------------------------------------------------------------------- - * | Available decoding options - * |-------------------------------------------------------------------------- - * | - * | Available php imap config parameters are listed below - * | -options: Decoder options (currently only the message subject and attachment name decoder can be set) - * | 'utf-8' - Uses imap_utf8($string) to decode a string - * | 'mimeheader' - Uses mb_decode_mimeheader($string) to decode a string - * | -decoder: Decoder to be used. Can be replaced by custom decoders if needed. - * | 'header' - HeaderDecoder - * | 'message' - MessageDecoder - * | 'attachment' - AttachmentDecoder - */ - 'decoding' => [ - 'options' => [ - 'header' => 'utf-8', // mimeheader - 'message' => 'utf-8', // mimeheader - 'attachment' => 'utf-8' // mimeheader - ], - 'decoder' => [ - 'header' => \Webklex\PHPIMAP\Decoder\HeaderDecoder::class, - 'message' => \Webklex\PHPIMAP\Decoder\MessageDecoder::class, - 'attachment' => \Webklex\PHPIMAP\Decoder\AttachmentDecoder::class - ] - ], - - /* - |-------------------------------------------------------------------------- - | Available flags - |-------------------------------------------------------------------------- - | - | List all available / supported flags. Set to null to accept all given flags. - */ - 'flags' => ['recent', 'flagged', 'answered', 'deleted', 'seen', 'draft'], - - /* - |-------------------------------------------------------------------------- - | Available events - |-------------------------------------------------------------------------- - | - */ - 'events' => [ - "message" => [ - 'new' => \Webklex\PHPIMAP\Events\MessageNewEvent::class, - 'moved' => \Webklex\PHPIMAP\Events\MessageMovedEvent::class, - 'copied' => \Webklex\PHPIMAP\Events\MessageCopiedEvent::class, - 'deleted' => \Webklex\PHPIMAP\Events\MessageDeletedEvent::class, - 'restored' => \Webklex\PHPIMAP\Events\MessageRestoredEvent::class, - ], - "folder" => [ - 'new' => \Webklex\PHPIMAP\Events\FolderNewEvent::class, - 'moved' => \Webklex\PHPIMAP\Events\FolderMovedEvent::class, - 'deleted' => \Webklex\PHPIMAP\Events\FolderDeletedEvent::class, - ], - "flag" => [ - 'new' => \Webklex\PHPIMAP\Events\FlagNewEvent::class, - 'deleted' => \Webklex\PHPIMAP\Events\FlagDeletedEvent::class, - ], - ], - - /* - |-------------------------------------------------------------------------- - | Available masking options - |-------------------------------------------------------------------------- - | - | By using your own custom masks you can implement your own methods for - | a better and faster access and less code to write. - | - | Checkout the two examples custom_attachment_mask and custom_message_mask - | for a quick start. - | - | The provided masks below are used as the default masks. - */ - 'masks' => [ - 'message' => \Webklex\PHPIMAP\Support\Masks\MessageMask::class, - 'attachment' => \Webklex\PHPIMAP\Support\Masks\AttachmentMask::class - ] -]; diff --git a/plugins/vendor/webklex/php-imap/tests/AddressTest.php b/plugins/vendor/webklex/php-imap/tests/AddressTest.php deleted file mode 100644 index 442462fb..00000000 --- a/plugins/vendor/webklex/php-imap/tests/AddressTest.php +++ /dev/null @@ -1,72 +0,0 @@ - "Username", - "mailbox" => "info", - "host" => "domain.tld", - "mail" => "info@domain.tld", - "full" => "Username ", - ]; - - /** - * Address test - * - * @return void - */ - public function testAddress(): void { - $address = new Address((object)$this->data); - - self::assertSame("Username", $address->personal); - self::assertSame("info", $address->mailbox); - self::assertSame("domain.tld", $address->host); - self::assertSame("info@domain.tld", $address->mail); - self::assertSame("Username ", $address->full); - } - - /** - * Test Address to string conversion - * - * @return void - */ - public function testAddressToStringConversion(): void { - $address = new Address((object)$this->data); - - self::assertSame("Username ", (string)$address); - } - - /** - * Test Address serialization - * - * @return void - */ - public function testAddressSerialization(): void { - $address = new Address((object)$this->data); - - foreach($address as $key => $value) { - self::assertSame($this->data[$key], $value); - } - - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/AttachmentTest.php b/plugins/vendor/webklex/php-imap/tests/AttachmentTest.php deleted file mode 100644 index c9ba2f17..00000000 --- a/plugins/vendor/webklex/php-imap/tests/AttachmentTest.php +++ /dev/null @@ -1,37 +0,0 @@ -getFixture("attachment_encoded_filename.eml"); - $this->attachment = $message->getAttachments()->first(); - } - /** - * @dataProvider decodeNameDataProvider - */ - public function testDecodeName(string $input, string $output): void - { - $name = $this->attachment->decodeName($input); - $this->assertEquals($output, $name); - } - - public function decodeNameDataProvider(): array - { - return [ - ['../../../../../../../../../../../var/www/shell.php', 'varwwwshell.php'], - ['test..xml', 'test.xml'], - [chr(0), ''], - ['C:\\file.txt', 'Cfile.txt'], - ]; - } -} diff --git a/plugins/vendor/webklex/php-imap/tests/AttributeTest.php b/plugins/vendor/webklex/php-imap/tests/AttributeTest.php deleted file mode 100644 index 8374894f..00000000 --- a/plugins/vendor/webklex/php-imap/tests/AttributeTest.php +++ /dev/null @@ -1,75 +0,0 @@ -toString()); - self::assertSame("foo", $attribute->getName()); - self::assertSame("foos", $attribute->setName("foos")->getName()); - } - - /** - * Date Attribute test - * - * @return void - */ - public function testDateAttribute(): void { - $attribute = new Attribute("foo", "2022-12-26 08:07:14 GMT-0800"); - - self::assertInstanceOf(Carbon::class, $attribute->toDate()); - self::assertSame("2022-12-26 08:07:14 GMT-0800", $attribute->toDate()->format("Y-m-d H:i:s T")); - } - - /** - * Array Attribute test - * - * @return void - */ - public function testArrayAttribute(): void { - $attribute = new Attribute("foo", ["bar"]); - - self::assertSame("bar", $attribute->toString()); - - $attribute->add("bars"); - self::assertSame(true, $attribute->has(1)); - self::assertSame("bars", $attribute->get(1)); - self::assertSame(true, $attribute->contains("bars")); - self::assertSame("foo, bars", $attribute->set("foo", 0)->toString()); - - $attribute->remove(0); - self::assertSame("bars", $attribute->toString()); - - self::assertSame("bars, foos", $attribute->merge(["foos", "bars"], true)->toString()); - self::assertSame("bars, foos, foos, donk", $attribute->merge(["foos", "donk"], false)->toString()); - - self::assertSame(4, $attribute->count()); - - self::assertSame("donk", $attribute->last()); - self::assertSame("bars", $attribute->first()); - - self::assertSame(["bars", "foos", "foos", "donk"], array_values($attribute->all())); - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/ClientManagerTest.php b/plugins/vendor/webklex/php-imap/tests/ClientManagerTest.php deleted file mode 100644 index e7910cf1..00000000 --- a/plugins/vendor/webklex/php-imap/tests/ClientManagerTest.php +++ /dev/null @@ -1,94 +0,0 @@ -cm = new ClientManager(); - } - - /** - * Test if the config can be accessed - * - * @return void - */ - public function testConfigAccessorAccount(): void { - $config = $this->cm->getConfig(); - self::assertInstanceOf(Config::class, $config); - self::assertSame("default", $config->get("default")); - self::assertSame("d-M-Y", $config->get("date_format")); - self::assertSame(IMAP::FT_PEEK, $config->get("options.fetch")); - self::assertSame([], $config->get("options.open")); - } - - /** - * Test creating a client instance - * - * @throws MaskNotFoundException - */ - public function testMakeClient(): void { - self::assertInstanceOf(Client::class, $this->cm->make([])); - } - - /** - * Test accessing accounts - * - * @throws MaskNotFoundException - */ - public function testAccountAccessor(): void { - self::assertSame("default", $this->cm->getConfig()->getDefaultAccount()); - self::assertNotEmpty($this->cm->account("default")); - - $this->cm->getConfig()->setDefaultAccount("foo"); - self::assertSame("foo", $this->cm->getConfig()->getDefaultAccount()); - $this->cm->getConfig()->setDefaultAccount("default"); - } - - /** - * Test setting a config - * - * @throws MaskNotFoundException - */ - public function testSetConfig(): void { - $config = [ - "default" => "foo", - "options" => [ - "fetch" => IMAP::ST_MSGN, - "open" => "foo" - ] - ]; - $cm = new ClientManager($config); - - self::assertSame("foo", $cm->getConfig()->getDefaultAccount()); - self::assertInstanceOf(Client::class, $cm->account("foo")); - self::assertSame(IMAP::ST_MSGN, $cm->getConfig()->get("options.fetch")); - self::assertSame(false, is_array($cm->getConfig()->get("options.open"))); - - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/ClientTest.php b/plugins/vendor/webklex/php-imap/tests/ClientTest.php deleted file mode 100644 index 73a01be7..00000000 --- a/plugins/vendor/webklex/php-imap/tests/ClientTest.php +++ /dev/null @@ -1,348 +0,0 @@ - [ - "default" => [ - 'protocol' => 'imap', - 'encryption' => 'ssl', - 'username' => 'foo@domain.tld', - 'password' => 'bar', - 'proxy' => [ - 'socket' => null, - 'request_fulluri' => false, - 'username' => null, - 'password' => null, - ], - ]] - ]); - $this->client = new Client($config); - } - - /** - * Client test - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws RuntimeException - */ - public function testClient(): void { - $this->createNewProtocolMockup(); - - self::assertInstanceOf(ImapProtocol::class, $this->client->getConnection()); - self::assertSame(true, $this->client->isConnected()); - self::assertSame(false, $this->client->checkConnection()); - self::assertSame(30, $this->client->getTimeout()); - self::assertSame(MessageMask::class, $this->client->getDefaultMessageMask()); - self::assertSame(AttachmentMask::class, $this->client->getDefaultAttachmentMask()); - self::assertArrayHasKey("new", $this->client->getDefaultEvents("message")); - } - - /** - * @throws MaskNotFoundException - */ - public function testClientClone(): void { - $config = Config::make([ - "accounts" => [ - "default" => [ - 'host' => 'example.com', - 'port' => 993, - 'protocol' => 'imap', //might also use imap, [pop3 or nntp (untested)] - 'encryption' => 'ssl', // Supported: false, 'ssl', 'tls' - 'validate_cert' => true, - 'username' => 'root@example.com', - 'password' => 'foo', - 'authentication' => null, - 'rfc' => 'RFC822', // If you are using iCloud, you might want to set this to 'BODY' - 'proxy' => [ - 'socket' => null, - 'request_fulluri' => false, - 'username' => null, - 'password' => null, - ], - "timeout" => 30, - "extensions" => [] - ]] - ]); - $client = new Client($config); - $clone = $client->clone(); - self::assertInstanceOf(Client::class, $clone); - self::assertSame($client->getConfig(), $clone->getConfig()); - self::assertSame($client->getAccountConfig(), $clone->getAccountConfig()); - self::assertSame($client->host, $clone->host); - } - - public function testClientLogout(): void { - $this->createNewProtocolMockup(); - - $this->protocol->expects($this->any())->method('logout')->willReturn(Response::empty()->setResponse([ - 0 => "BYE Logging out\r\n", - 1 => "OK Logout completed (0.001 + 0.000 secs).\r\n", - ])); - self::assertInstanceOf(Client::class, $this->client->disconnect()); - - } - - public function testClientExpunge(): void { - $this->createNewProtocolMockup(); - $this->protocol->expects($this->any())->method('expunge')->willReturn(Response::empty()->setResponse([ - 0 => "OK", - 1 => "Expunge", - 2 => "completed", - 3 => [ - 0 => "0.001", - 1 => "+", - 2 => "0.000", - 3 => "secs).", - ], - ])); - self::assertNotEmpty($this->client->expunge()); - - } - - public function testClientFolders(): void { - $this->createNewProtocolMockup(); - $this->protocol->expects($this->any())->method('expunge')->willReturn(Response::empty()->setResponse([ - 0 => "OK", - 1 => "Expunge", - 2 => "completed", - 3 => [ - 0 => "0.001", - 1 => "+", - 2 => "0.000", - 3 => "secs).", - ], - ])); - - $this->protocol->expects($this->any())->method('selectFolder')->willReturn(Response::empty()->setResponse([ - "flags" => [ - 0 => [ - 0 => "\Answered", - 1 => "\Flagged", - 2 => "\Deleted", - 3 => "\Seen", - 4 => "\Draft", - 5 => "NonJunk", - 6 => "unknown-1", - ], - ], - "exists" => 139, - "recent" => 0, - "unseen" => 94, - "uidvalidity" => 1488899637, - "uidnext" => 278, - ])); - self::assertNotEmpty($this->client->openFolder("INBOX")); - self::assertSame("INBOX", $this->client->getFolderPath()); - - $this->protocol->expects($this->any())->method('examineFolder')->willReturn(Response::empty()->setResponse([ - "flags" => [ - 0 => [ - 0 => "\Answered", - 1 => "\Flagged", - 2 => "\Deleted", - 3 => "\Seen", - 4 => "\Draft", - 5 => "NonJunk", - 6 => "unknown-1", - ], - ], - "exists" => 139, - "recent" => 0, - "unseen" => 94, - "uidvalidity" => 1488899637, - "uidnext" => 278, - ])); - self::assertNotEmpty($this->client->checkFolder("INBOX")); - - $this->protocol->expects($this->any())->method('folders')->with($this->identicalTo(""), $this->identicalTo("*"))->willReturn(Response::empty()->setResponse([ - "INBOX" => [ - "delimiter" => ".", - "flags" => [ - 0 => "\HasChildren", - ], - ], - "INBOX.new" => [ - "delimiter" => ".", - "flags" => [ - 0 => "\HasNoChildren", - ], - ], - "INBOX.9AL56dEMTTgUKOAz" => [ - "delimiter" => ".", - "flags" => [ - 0 => "\HasNoChildren", - ], - ], - "INBOX.U9PsHCvXxAffYvie" => [ - "delimiter" => ".", - "flags" => [ - 0 => "\HasNoChildren", - ], - ], - "INBOX.Trash" => [ - "delimiter" => ".", - "flags" => [ - 0 => "\HasNoChildren", - 1 => "\Trash", - ], - ], - "INBOX.processing" => [ - "delimiter" => ".", - "flags" => [ - 0 => "\HasNoChildren", - ], - ], - "INBOX.Sent" => [ - "delimiter" => ".", - "flags" => [ - 0 => "\HasNoChildren", - 1 => "\Sent", - ], - ], - "INBOX.OzDWCXKV3t241koc" => [ - "delimiter" => ".", - "flags" => [ - 0 => "\HasNoChildren", - ], - ], - "INBOX.5F3bIVTtBcJEqIVe" => [ - "delimiter" => ".", - "flags" => [ - 0 => "\HasNoChildren", - ], - ], - "INBOX.8J3rll6eOBWnTxIU" => [ - "delimiter" => ".", - "flags" => [ - 0 => "\HasNoChildren", - ], - ], - "INBOX.Junk" => [ - "delimiter" => ".", - "flags" => [ - 0 => "\HasNoChildren", - 1 => "\Junk", - ], - ], - "INBOX.Drafts" => [ - "delimiter" => ".", - "flags" => [ - 0 => "\HasNoChildren", - 1 => "\Drafts", - ], - ], - "INBOX.test" => [ - "delimiter" => ".", - "flags" => [ - 0 => "\HasNoChildren", - ], - ], - ])); - - $this->protocol->expects($this->any())->method('createFolder')->willReturn(Response::empty()->setResponse([ - 0 => "OK Create completed (0.004 + 0.000 + 0.003 secs).\r\n", - ])); - self::assertNotEmpty($this->client->createFolder("INBOX.new")); - - $this->protocol->expects($this->any())->method('deleteFolder')->willReturn(Response::empty()->setResponse([ - 0 => "OK Delete completed (0.007 + 0.000 + 0.006 secs).\r\n", - ])); - self::assertNotEmpty($this->client->deleteFolder("INBOX.new")); - - self::assertInstanceOf(Folder::class, $this->client->getFolderByPath("INBOX.new")); - self::assertInstanceOf(Folder::class, $this->client->getFolderByName("new")); - self::assertInstanceOf(Folder::class, $this->client->getFolder("INBOX.new", ".")); - self::assertInstanceOf(Folder::class, $this->client->getFolder("new")); - } - - public function testClientId(): void { - $this->createNewProtocolMockup(); - $this->protocol->expects($this->any())->method('ID')->willReturn(Response::empty()->setResponse([ - 0 => "ID (\"name\" \"Dovecot\")\r\n", - 1 => "OK ID completed (0.001 + 0.000 secs).\r\n" - - ])); - self::assertSame("ID (\"name\" \"Dovecot\")\r\n", $this->client->Id()[0]); - - } - - public function testClientConfig(): void { - $config = $this->client->getConfig()->get("accounts.".$this->client->getConfig()->getDefaultAccount()); - self::assertSame("foo@domain.tld", $config["username"]); - self::assertSame("bar", $config["password"]); - self::assertSame("localhost", $config["host"]); - self::assertSame(true, $config["validate_cert"]); - self::assertSame(993, $config["port"]); - - $this->client->getConfig()->set("accounts.".$this->client->getConfig()->getDefaultAccount(), [ - "host" => "domain.tld", - 'password' => 'bar', - ]); - $config = $this->client->getConfig()->get("accounts.".$this->client->getConfig()->getDefaultAccount()); - - self::assertSame("bar", $config["password"]); - self::assertSame("domain.tld", $config["host"]); - self::assertSame(true, $config["validate_cert"]); - } - - protected function createNewProtocolMockup() { - $this->protocol = $this->createMock(ImapProtocol::class); - - $this->protocol->expects($this->any())->method('connected')->willReturn(true); - $this->protocol->expects($this->any())->method('getConnectionTimeout')->willReturn(30); - - $this->protocol - ->expects($this->any()) - ->method('createStream') - //->will($this->onConsecutiveCalls(true)); - ->willReturn(true); - - $this->client->connection = $this->protocol; - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/HeaderTest.php b/plugins/vendor/webklex/php-imap/tests/HeaderTest.php deleted file mode 100644 index 0ec60c6c..00000000 --- a/plugins/vendor/webklex/php-imap/tests/HeaderTest.php +++ /dev/null @@ -1,204 +0,0 @@ -config = Config::make(); - } - - /** - * Test parsing email headers - * - * @throws InvalidMessageDateException - */ - public function testHeaderParsing(): void { - $email = file_get_contents(implode(DIRECTORY_SEPARATOR, [__DIR__, "messages", "1366671050@github.com.eml"])); - if (!str_contains($email, "\r\n")) { - $email = str_replace("\n", "\r\n", $email); - } - - $raw_header = substr($email, 0, strpos($email, "\r\n\r\n")); - - $header = new Header($raw_header, $this->config); - $subject = $header->get("subject"); - $returnPath = $header->get("return_path"); - /** @var Carbon $date */ - $date = $header->get("date")->first(); - /** @var Address $from */ - $from = $header->get("from")->first(); - /** @var Address $to */ - $to = $header->get("to")->first(); - - self::assertSame($raw_header, $header->raw); - self::assertSame([ - 0 => 'from mx.domain.tld by localhost with LMTP id SABVMNfGqWP+PAAA0J78UA (envelope-from ) for ; Mon, 26 Dec 2022 17:07:51 +0100', - 1 => 'from localhost (localhost [127.0.0.1]) by mx.domain.tld (Postfix) with ESMTP id C3828140227 for ; Mon, 26 Dec 2022 17:07:51 +0100 (CET)', - 2 => 'from mx.domain.tld ([127.0.0.1]) by localhost (mx.domain.tld [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id JcIS9RuNBTNx for ; Mon, 26 Dec 2022 17:07:21 +0100 (CET)', - 3 => 'from smtp.github.com (out-26.smtp.github.com [192.30.252.209]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx.domain.tld (Postfix) with ESMTPS id 6410B13FEB2 for ; Mon, 26 Dec 2022 17:07:21 +0100 (CET)', - 4 => 'from github-lowworker-891b8d2.va3-iad.github.net (github-lowworker-891b8d2.va3-iad.github.net [10.48.109.104]) by smtp.github.com (Postfix) with ESMTP id 176985E0200 for ; Mon, 26 Dec 2022 08:07:14 -0800 (PST)', - ], $header->get("received")->toArray()); - self::assertInstanceOf(Attribute::class, $subject); - self::assertSame("Re: [Webklex/php-imap] Read all folders? (Issue #349)", $subject->toString()); - self::assertSame("Re: [Webklex/php-imap] Read all folders? (Issue #349)", (string)$header->subject); - self::assertSame("noreply@github.com", $returnPath->toString()); - self::assertSame("return_path", $returnPath->getName()); - self::assertSame("-4.299", (string)$header->get("X-Spam-Score")); - self::assertSame("Webklex/php-imap/issues/349/1365266070@github.com", (string)$header->get("Message-ID")); - self::assertSame(5, $header->get("received")->count()); - self::assertSame(IMAP::MESSAGE_PRIORITY_UNKNOWN, (int)$header->get("priority")()); - - self::assertSame("Username", $from->personal); - self::assertSame("notifications", $from->mailbox); - self::assertSame("github.com", $from->host); - self::assertSame("notifications@github.com", $from->mail); - self::assertSame("Username ", $from->full); - - self::assertSame("Webklex/php-imap", $to->personal); - self::assertSame("php-imap", $to->mailbox); - self::assertSame("noreply.github.com", $to->host); - self::assertSame("php-imap@noreply.github.com", $to->mail); - self::assertSame("Webklex/php-imap ", $to->full); - - self::assertInstanceOf(Carbon::class, $date); - self::assertSame("2022-12-26 08:07:14 GMT-0800", $date->format("Y-m-d H:i:s T")); - - self::assertSame(51, count($header->getAttributes())); - } - - public function testRfc822ParseHeaders() { - $mock = $this->getMockBuilder(Header::class) - ->disableOriginalConstructor() - ->onlyMethods([]) - ->getMock(); - - $config = new \ReflectionProperty($mock, 'options'); - $config->setAccessible(true); - $config->setValue($mock, $this->config->get("options")); - - $mockHeader = "Content-Type: text/csv; charset=WINDOWS-1252; name*0=\"TH_Is_a_F ile name example 20221013.c\"; name*1=sv\r\nContent-Transfer-Encoding: quoted-printable\r\nContent-Disposition: attachment; filename*0=\"TH_Is_a_F ile name example 20221013.c\"; filename*1=\"sv\"\r\n"; - - $expected = new \stdClass(); - $expected->content_type = 'text/csv; charset=WINDOWS-1252; name*0="TH_Is_a_F ile name example 20221013.c"; name*1=sv'; - $expected->content_transfer_encoding = 'quoted-printable'; - $expected->content_disposition = 'attachment; filename*0="TH_Is_a_F ile name example 20221013.c"; filename*1="sv"'; - - $this->assertEquals($expected, $mock->rfc822_parse_headers($mockHeader)); - } - - public function testExtractHeaderExtensions() { - $mock = $this->getMockBuilder(Header::class) - ->disableOriginalConstructor() - ->onlyMethods([]) - ->getMock(); - - $method = new \ReflectionMethod($mock, 'extractHeaderExtensions'); - $method->setAccessible(true); - - $mockAttributes = [ - 'content_type' => new Attribute('content_type', 'text/csv; charset=WINDOWS-1252; name*0="TH_Is_a_F ile name example 20221013.c"; name*1=sv'), - 'content_transfer_encoding' => new Attribute('content_transfer_encoding', 'quoted-printable'), - 'content_disposition' => new Attribute('content_disposition', 'attachment; filename*0="TH_Is_a_F ile name example 20221013.c"; filename*1="sv"; attribute_test=attribute_test_value'), - ]; - - $attributes = new \ReflectionProperty($mock, 'attributes'); - $attributes->setAccessible(true); - $attributes->setValue($mock, $mockAttributes); - - $method->invoke($mock); - - $this->assertArrayHasKey('filename', $mock->getAttributes()); - $this->assertArrayNotHasKey('filename*0', $mock->getAttributes()); - $this->assertEquals('TH_Is_a_F ile name example 20221013.csv', $mock->get('filename')); - - $this->assertArrayHasKey('name', $mock->getAttributes()); - $this->assertArrayNotHasKey('name*0', $mock->getAttributes()); - $this->assertEquals('TH_Is_a_F ile name example 20221013.csv', $mock->get('name')); - - $this->assertArrayHasKey('content_type', $mock->getAttributes()); - $this->assertEquals('text/csv', $mock->get('content_type')->last()); - - $this->assertArrayHasKey('charset', $mock->getAttributes()); - $this->assertEquals('WINDOWS-1252', $mock->get('charset')->last()); - - $this->assertArrayHasKey('content_transfer_encoding', $mock->getAttributes()); - $this->assertEquals('quoted-printable', $mock->get('content_transfer_encoding')); - - $this->assertArrayHasKey('content_disposition', $mock->getAttributes()); - $this->assertEquals('attachment', $mock->get('content_disposition')->last()); - $this->assertEquals('quoted-printable', $mock->get('content_transfer_encoding')); - - $this->assertArrayHasKey('attribute_test', $mock->getAttributes()); - $this->assertEquals('attribute_test_value', $mock->get('attribute_test')); - } - - public function testExtractHeaderExtensions2() { - $mock = $this->getMockBuilder(Header::class) - ->disableOriginalConstructor() - ->onlyMethods([]) - ->getMock(); - - $method = new \ReflectionMethod($mock, 'extractHeaderExtensions'); - $method->setAccessible(true); - - $mockAttributes = [ - 'content_type' => new Attribute('content_type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet; name="=?utf-8?Q?=D0=A2=D0=B8=D0=BF=D0=BE=D0=B2=D0=BE=D0=B9_?= =?utf-8?Q?=D1=80=D0=B0=D1=81=D1=87=D0=B5=D1=82_=D0=BF?= =?utf-8?Q?=D0=BE=D1=82=D1=80=D0=B5=D0=B1=D0=BB=D0=B5=D0=BD?= =?utf-8?Q?=D0=B8=D1=8F_=D1=8D=D0=BB=D0=B5=D0=BA=D1=82?= =?utf-8?Q?=D1=80=D0=BE=D1=8D=D0=BD=D0=B5=D1=80=D0=B3=D0=B8=D0=B8_=D0=B2_?= =?utf-8?Q?=D0=9A=D0=9F_=D0=97=D0=B2=D0=B5=D0=B7=D0=B4?= =?utf-8?Q?=D0=BD=D1=8B=D0=B9=2Exlsx?="'), - 'content_transfer_encoding' => new Attribute('content_transfer_encoding', 'base64'), - 'content_disposition' => new Attribute('content_disposition', 'attachment; name*0*=utf-8\'\'%D0%A2%D0%B8%D0%BF%D0%BE%D0%B2%D0%BE%D0%B9%20; name*1*=%D1%80%D0%B0%D1%81%D1%87%D0%B5%D1%82%20%D0%BF; name*2*=%D0%BE%D1%82%D1%80%D0%B5%D0%B1%D0%BB%D0%B5%D0%BD; name*3*=%D0%B8%D1%8F%20%D1%8D%D0%BB%D0%B5%D0%BA%D1%82; name*4*=%D1%80%D0%BE%D1%8D%D0%BD%D0%B5%D1%80%D0%B3%D0%B8; name*5*=%D0%B8%20%D0%B2%20%D0%9A%D0%9F%20%D0%97%D0%B2%D0%B5%D0%B7%D0%B4; name*6*=%D0%BD%D1%8B%D0%B9.xlsx; filename*0*=utf-8\'\'%D0%A2%D0%B8%D0%BF%D0%BE%D0%B2%D0%BE%D0%B9%20; filename*1*=%D1%80%D0%B0%D1%81%D1%87%D0%B5%D1%82%20%D0%BF; filename*2*=%D0%BE%D1%82%D1%80%D0%B5%D0%B1%D0%BB%D0%B5%D0%BD; filename*3*=%D0%B8%D1%8F%20%D1%8D%D0%BB%D0%B5%D0%BA%D1%82; filename*4*=%D1%80%D0%BE%D1%8D%D0%BD%D0%B5%D1%80%D0%B3%D0%B8; filename*5*=%D0%B8%20%D0%B2%20%D0%9A%D0%9F%20%D0%97; filename*6*=%D0%B2%D0%B5%D0%B7%D0%B4%D0%BD%D1%8B%D0%B9.xlsx; attribute_test=attribute_test_value'), - ]; - - $attributes = new \ReflectionProperty($mock, 'attributes'); - $attributes->setAccessible(true); - $attributes->setValue($mock, $mockAttributes); - - $method->invoke($mock); - - $this->assertArrayHasKey('filename', $mock->getAttributes()); - $this->assertArrayNotHasKey('filename*0', $mock->getAttributes()); - $this->assertEquals('utf-8\'\'%D0%A2%D0%B8%D0%BF%D0%BE%D0%B2%D0%BE%D0%B9%20%D1%80%D0%B0%D1%81%D1%87%D0%B5%D1%82%20%D0%BF%D0%BE%D1%82%D1%80%D0%B5%D0%B1%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F%20%D1%8D%D0%BB%D0%B5%D0%BA%D1%82%D1%80%D0%BE%D1%8D%D0%BD%D0%B5%D1%80%D0%B3%D0%B8%D0%B8%20%D0%B2%20%D0%9A%D0%9F%20%D0%97%D0%B2%D0%B5%D0%B7%D0%B4%D0%BD%D1%8B%D0%B9.xlsx', $mock->get('filename')); - - $this->assertArrayHasKey('name', $mock->getAttributes()); - $this->assertArrayNotHasKey('name*0', $mock->getAttributes()); - $this->assertEquals('=?utf-8?Q?=D0=A2=D0=B8=D0=BF=D0=BE=D0=B2=D0=BE=D0=B9_?= =?utf-8?Q?=D1=80=D0=B0=D1=81=D1=87=D0=B5=D1=82_=D0=BF?= =?utf-8?Q?=D0=BE=D1=82=D1=80=D0=B5=D0=B1=D0=BB=D0=B5=D0=BD?= =?utf-8?Q?=D0=B8=D1=8F_=D1=8D=D0=BB=D0=B5=D0=BA=D1=82?= =?utf-8?Q?=D1=80=D0=BE=D1=8D=D0=BD=D0=B5=D1=80=D0=B3=D0=B8=D0=B8_=D0=B2_?= =?utf-8?Q?=D0=9A=D0=9F_=D0=97=D0=B2=D0=B5=D0=B7=D0=B4?= =?utf-8?Q?=D0=BD=D1=8B=D0=B9=2Exlsx?=', $mock->get('name')); - - $this->assertArrayHasKey('content_type', $mock->getAttributes()); - $this->assertEquals('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', $mock->get('content_type')->last()); - - $this->assertArrayHasKey('content_transfer_encoding', $mock->getAttributes()); - $this->assertEquals('base64', $mock->get('content_transfer_encoding')); - - $this->assertArrayHasKey('content_disposition', $mock->getAttributes()); - $this->assertEquals('attachment', $mock->get('content_disposition')->last()); - - $this->assertArrayHasKey('attribute_test', $mock->getAttributes()); - $this->assertEquals('attribute_test_value', $mock->get('attribute_test')); - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/ImapProtocolTest.php b/plugins/vendor/webklex/php-imap/tests/ImapProtocolTest.php deleted file mode 100644 index 30f3a200..00000000 --- a/plugins/vendor/webklex/php-imap/tests/ImapProtocolTest.php +++ /dev/null @@ -1,64 +0,0 @@ -config = Config::make(); - } - - - /** - * ImapProtocol test - * - * @return void - */ - public function testImapProtocol(): void { - - $protocol = new ImapProtocol($this->config, false); - self::assertSame(false, $protocol->getCertValidation()); - self::assertSame("", $protocol->getEncryption()); - - $protocol->setCertValidation(true); - $protocol->setEncryption("ssl"); - - self::assertSame(true, $protocol->getCertValidation()); - self::assertSame("ssl", $protocol->getEncryption()); - - $protocol->setSslOptions([ - 'verify_peer' => true, - 'cafile' => '/dummy/path/for/testing', - 'peer_fingerprint' => ['md5' => 40], - ]); - - self::assertSame([ - 'verify_peer' => true, - 'cafile' => '/dummy/path/for/testing', - 'peer_fingerprint' => ['md5' => 40], - ], $protocol->getSslOptions()); - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/MessageTest.php b/plugins/vendor/webklex/php-imap/tests/MessageTest.php deleted file mode 100644 index 0ce55cd0..00000000 --- a/plugins/vendor/webklex/php-imap/tests/MessageTest.php +++ /dev/null @@ -1,302 +0,0 @@ - [ - "default" => [ - 'protocol' => 'imap', - 'encryption' => 'ssl', - 'username' => 'foo@domain.tld', - 'password' => 'bar', - 'proxy' => [ - 'socket' => null, - 'request_fulluri' => false, - 'username' => null, - 'password' => null, - ], - ]] - ]); - $this->client = new Client($config); - } - - /** - * Message test - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageNotFoundException - * @throws MessageSizeFetchingException - * @throws ReflectionException - * @throws ResponseException - * @throws RuntimeException - */ - public function testMessage(): void { - $this->createNewProtocolMockup(); - - $email = file_get_contents(implode(DIRECTORY_SEPARATOR, [__DIR__, "messages", "1366671050@github.com.eml"])); - if(!str_contains($email, "\r\n")){ - $email = str_replace("\n", "\r\n", $email); - } - - $raw_header = substr($email, 0, strpos($email, "\r\n\r\n")); - $raw_body = substr($email, strlen($raw_header)+8); - - $this->protocol->expects($this->any())->method('getUid')->willReturn(Response::empty()->setResult(22)); - $this->protocol->expects($this->any())->method('getMessageNumber')->willReturn(Response::empty()->setResult(21)); - $this->protocol->expects($this->any())->method('flags')->willReturn(Response::empty()->setResult([22 => [0 => "\\Seen"]])); - - self::assertNotEmpty($this->client->openFolder("INBOX")); - - $message = Message::make(22, null, $this->client, $raw_header, $raw_body, [0 => "\\Seen"], IMAP::ST_UID); - - self::assertInstanceOf(Client::class, $message->getClient()); - self::assertSame(22, $message->uid); - self::assertSame(21, $message->msgn); - self::assertContains("Seen", $message->flags()->toArray()); - - $subject = $message->get("subject"); - $returnPath = $message->get("Return-Path"); - - self::assertInstanceOf(Attribute::class, $subject); - self::assertSame("Re: [Webklex/php-imap] Read all folders? (Issue #349)", $subject->toString()); - self::assertSame("Re: [Webklex/php-imap] Read all folders? (Issue #349)", (string)$message->subject); - self::assertSame("noreply@github.com", $returnPath->toString()); - self::assertSame("return_path", $returnPath->getName()); - self::assertSame("-4.299", (string)$message->get("X-Spam-Score")); - self::assertSame("Webklex/php-imap/issues/349/1365266070@github.com", (string)$message->get("Message-ID")); - self::assertSame(5, $message->get("received")->count()); - self::assertSame(IMAP::MESSAGE_PRIORITY_UNKNOWN, (int)$message->get("priority")()); - } - - /** - * Test getMessageNumber - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testGetMessageNumber(): void { - $this->createNewProtocolMockup(); - $this->protocol->expects($this->any())->method('getMessageNumber')->willReturn(Response::empty()->setResult("")); - - self::assertNotEmpty($this->client->openFolder("INBOX")); - - try { - $this->client->getConnection()->getMessageNumber(21)->validatedData(); - $this->fail("Message number should not exist"); - } catch (ResponseException $e) { - self::assertTrue(true); - } - - } - - /** - * Test loadMessageFromFile - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageNotFoundException - * @throws ReflectionException - * @throws ResponseException - * @throws RuntimeException - * @throws MessageSizeFetchingException - */ - public function testLoadMessageFromFile(): void { - $filename = implode(DIRECTORY_SEPARATOR, [__DIR__, "messages", "1366671050@github.com.eml"]); - $message = Message::fromFile($filename); - - $subject = $message->get("subject"); - $returnPath = $message->get("Return-Path"); - - self::assertInstanceOf(Attribute::class, $subject); - self::assertSame("Re: [Webklex/php-imap] Read all folders? (Issue #349)", $subject->toString()); - self::assertSame("Re: [Webklex/php-imap] Read all folders? (Issue #349)", (string)$message->subject); - self::assertSame("noreply@github.com", $returnPath->toString()); - self::assertSame("return_path", $returnPath->getName()); - self::assertSame("-4.299", (string)$message->get("X-Spam-Score")); - self::assertSame("Webklex/php-imap/issues/349/1365266070@github.com", (string)$message->get("Message-ID")); - self::assertSame(5, $message->get("received")->count()); - self::assertSame(IMAP::MESSAGE_PRIORITY_UNKNOWN, (int)$message->get("priority")()); - - self::assertNull($message->getClient()); - self::assertSame(0, $message->uid); - - $filename = implode(DIRECTORY_SEPARATOR, [__DIR__, "messages", "example_attachment.eml"]); - $message = Message::fromFile($filename); - - $subject = $message->get("subject"); - $returnPath = $message->get("Return-Path"); - - self::assertInstanceOf(Attribute::class, $subject); - self::assertSame("ogqMVHhz7swLaq2PfSWsZj0k99w8wtMbrb4RuHdNg53i76B7icIIM0zIWpwGFtnk", $subject->toString()); - self::assertSame("ogqMVHhz7swLaq2PfSWsZj0k99w8wtMbrb4RuHdNg53i76B7icIIM0zIWpwGFtnk", (string)$message->subject); - self::assertSame("someone@domain.tld", $returnPath->toString()); - self::assertSame("return_path", $returnPath->getName()); - self::assertSame("1.103", (string)$message->get("X-Spam-Score")); - self::assertSame("d3a5e91963cb805cee975687d5acb1c6@swift.generated", (string)$message->get("Message-ID")); - self::assertSame(4, $message->get("received")->count()); - self::assertSame(IMAP::MESSAGE_PRIORITY_HIGHEST, (int)$message->get("priority")()); - - self::assertNull($message->getClient()); - self::assertSame(0, $message->uid); - self::assertSame(1, $message->getAttachments()->count()); - - /** @var Attachment $attachment */ - $attachment = $message->getAttachments()->first(); - self::assertSame("attachment", $attachment->disposition); - self::assertSame("znk551MP3TP3WPp9Kl1gnLErrWEgkJFAtvaKqkTgrk3dKI8dX38YT8BaVxRcOERN", $attachment->content); - self::assertSame("application/octet-stream", $attachment->content_type); - self::assertSame("6mfFxiU5Yhv9WYJx.txt", $attachment->name); - self::assertSame(2, $attachment->part_number); - self::assertSame("text", $attachment->type); - self::assertNotEmpty($attachment->id); - self::assertSame(90, $attachment->size); - self::assertSame("txt", $attachment->getExtension()); - self::assertInstanceOf(Message::class, $attachment->getMessage()); - self::assertSame("text/plain", $attachment->getMimeType()); - } - - /** - * Test issue #348 - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws ReflectionException - * @throws ResponseException - * @throws RuntimeException - */ - public function testIssue348() { - $filename = implode(DIRECTORY_SEPARATOR, [__DIR__, "messages", "issue-348.eml"]); - $message = Message::fromFile($filename); - - self::assertSame(1, $message->getAttachments()->count()); - - /** @var Attachment $attachment */ - $attachment = $message->getAttachments()->first(); - - self::assertSame("attachment", $attachment->disposition); - self::assertSame("application/pdf", $attachment->content_type); - self::assertSame("Kelvinsong—Font_test_page_bold.pdf", $attachment->name); - self::assertSame(1, $attachment->part_number); - self::assertSame("text", $attachment->type); - self::assertNotEmpty($attachment->id); - self::assertSame(92384, $attachment->size); - self::assertSame("pdf", $attachment->getExtension()); - self::assertInstanceOf(Message::class, $attachment->getMessage()); - self::assertSame("application/pdf", $attachment->getMimeType()); - } - - /** - * Create a new protocol mockup - * - * @return void - */ - protected function createNewProtocolMockup(): void { - $this->protocol = $this->createMock(ImapProtocol::class); - - $this->protocol->expects($this->any())->method('createStream')->willReturn(true); - $this->protocol->expects($this->any())->method('connected')->willReturn(true); - $this->protocol->expects($this->any())->method('getConnectionTimeout')->willReturn(30); - $this->protocol->expects($this->any())->method('logout')->willReturn(Response::empty()->setResponse([ - 0 => "BYE Logging out\r\n", - 1 => "OK Logout completed (0.001 + 0.000 secs).\r\n", - ])); - $this->protocol->expects($this->any())->method('selectFolder')->willReturn(Response::empty()->setResponse([ - "flags" => [ - 0 => [ - 0 => "\Answered", - 1 => "\Flagged", - 2 => "\Deleted", - 3 => "\Seen", - 4 => "\Draft", - 5 => "NonJunk", - 6 => "unknown-1", - ], - ], - "exists" => 139, - "recent" => 0, - "unseen" => 94, - "uidvalidity" => 1488899637, - "uidnext" => 278, - ])); - - $this->client->connection = $this->protocol; - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/PartTest.php b/plugins/vendor/webklex/php-imap/tests/PartTest.php deleted file mode 100644 index 8543c46b..00000000 --- a/plugins/vendor/webklex/php-imap/tests/PartTest.php +++ /dev/null @@ -1,107 +0,0 @@ -config = Config::make(); - } - - /** - * Test parsing a text Part - * @throws InvalidMessageDateException - */ - public function testTextPart(): void { - $raw_headers = "Content-Type: text/plain;\r\n charset=UTF-8\r\nContent-Transfer-Encoding: 7bit\r\n"; - $raw_body = "\r\nAny updates?"; - - $headers = new Header($raw_headers, $this->config); - $part = new Part($raw_body, $this->config, $headers, 0); - - self::assertSame("UTF-8", $part->charset); - self::assertSame("text/plain", $part->content_type); - self::assertSame(12, $part->bytes); - self::assertSame(0, $part->part_number); - self::assertSame(false, $part->ifdisposition); - self::assertSame(false, $part->isAttachment()); - self::assertSame("Any updates?", $part->content); - self::assertSame(IMAP::MESSAGE_TYPE_TEXT, $part->type); - self::assertSame(IMAP::MESSAGE_ENC_7BIT, $part->encoding); - } - - /** - * Test parsing a html Part - * @throws InvalidMessageDateException - */ - public function testHTMLPart(): void { - $raw_headers = "Content-Type: text/html;\r\n charset=UTF-8\r\nContent-Transfer-Encoding: 7bit\r\n"; - $raw_body = "\r\n

\r\n

Any updates?

"; - - $headers = new Header($raw_headers, $this->config); - $part = new Part($raw_body, $this->config, $headers, 0); - - self::assertSame("UTF-8", $part->charset); - self::assertSame("text/html", $part->content_type); - self::assertSame(39, $part->bytes); - self::assertSame(0, $part->part_number); - self::assertSame(false, $part->ifdisposition); - self::assertSame(false, $part->isAttachment()); - self::assertSame("

\r\n

Any updates?

", $part->content); - self::assertSame(IMAP::MESSAGE_TYPE_TEXT, $part->type); - self::assertSame(IMAP::MESSAGE_ENC_7BIT, $part->encoding); - } - - /** - * Test parsing a html Part - * @throws InvalidMessageDateException - */ - public function testBase64Part(): void { - $raw_headers = "Content-Type: application/octet-stream; name=6mfFxiU5Yhv9WYJx.txt\r\nContent-Transfer-Encoding: base64\r\nContent-Disposition: attachment; filename=6mfFxiU5Yhv9WYJx.txt\r\n"; - $raw_body = "em5rNTUxTVAzVFAzV1BwOUtsMWduTEVycldFZ2tKRkF0dmFLcWtUZ3JrM2RLSThkWDM4WVQ4QmFW\r\neFJjT0VSTg=="; - - $headers = new Header($raw_headers, $this->config); - $part = new Part($raw_body, $this->config, $headers, 0); - - self::assertSame("", $part->charset); - self::assertSame("application/octet-stream", $part->content_type); - self::assertSame(90, $part->bytes); - self::assertSame(0, $part->part_number); - self::assertSame("znk551MP3TP3WPp9Kl1gnLErrWEgkJFAtvaKqkTgrk3dKI8dX38YT8BaVxRcOERN", base64_decode($part->content)); - self::assertSame(true, $part->ifdisposition); - self::assertSame("attachment", $part->disposition); - self::assertSame("6mfFxiU5Yhv9WYJx.txt", $part->name); - self::assertSame("6mfFxiU5Yhv9WYJx.txt", $part->filename); - self::assertSame(true, $part->isAttachment()); - self::assertSame(IMAP::MESSAGE_TYPE_TEXT, $part->type); - self::assertSame(IMAP::MESSAGE_ENC_BASE64, $part->encoding); - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/StructureTest.php b/plugins/vendor/webklex/php-imap/tests/StructureTest.php deleted file mode 100644 index 22d71bbf..00000000 --- a/plugins/vendor/webklex/php-imap/tests/StructureTest.php +++ /dev/null @@ -1,68 +0,0 @@ -config = Config::make(); - } - - /** - * Test parsing email headers - * - * @throws InvalidMessageDateException - * @throws MessageContentFetchingException - */ - public function testStructureParsing(): void { - $email = file_get_contents(implode(DIRECTORY_SEPARATOR, [__DIR__, "messages", "1366671050@github.com.eml"])); - if(!str_contains($email, "\r\n")){ - $email = str_replace("\n", "\r\n", $email); - } - - $raw_header = substr($email, 0, strpos($email, "\r\n\r\n")); - $raw_body = substr($email, strlen($raw_header)+8); - - $header = new Header($raw_header, $this->config); - $structure = new Structure($raw_body, $header); - - self::assertSame(2, count($structure->parts)); - - $textPart = $structure->parts[0]; - - self::assertSame("UTF-8", $textPart->charset); - self::assertSame("text/plain", $textPart->content_type); - self::assertSame(278, $textPart->bytes); - - $htmlPart = $structure->parts[1]; - - self::assertSame("UTF-8", $htmlPart->charset); - self::assertSame("text/html", $htmlPart->content_type); - self::assertSame(1478, $htmlPart->bytes); - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/fixtures/AttachmentEncodedFilenameTest.php b/plugins/vendor/webklex/php-imap/tests/fixtures/AttachmentEncodedFilenameTest.php deleted file mode 100644 index b5da3597..00000000 --- a/plugins/vendor/webklex/php-imap/tests/fixtures/AttachmentEncodedFilenameTest.php +++ /dev/null @@ -1,52 +0,0 @@ -getFixture("attachment_encoded_filename.eml"); - - self::assertEquals("", $message->subject); - self::assertEquals("multipart/mixed", $message->content_type->last()); - self::assertFalse($message->hasTextBody()); - self::assertFalse($message->hasHTMLBody()); - - self::assertCount(1, $message->attachments()); - - $attachment = $message->attachments()->first(); - self::assertInstanceOf(Attachment::class, $attachment); - self::assertEquals("Prostřeno_2014_poslední volné termíny.xls", $attachment->filename); - self::assertEquals("Prostřeno_2014_poslední volné termíny.xls", $attachment->name); - self::assertEquals('xls', $attachment->getExtension()); - self::assertEquals('text', $attachment->type); - self::assertEquals("application/vnd.ms-excel", $attachment->content_type); - self::assertEquals("a0ef7cfbc05b73dbcb298fe0bc224b41900cdaf60f9904e3fea5ba6c7670013c", hash("sha256", $attachment->content)); - self::assertEquals(146, $attachment->size); - self::assertEquals(0, $attachment->part_number); - self::assertEquals("attachment", $attachment->disposition); - self::assertNotEmpty($attachment->id); - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/fixtures/AttachmentLongFilenameTest.php b/plugins/vendor/webklex/php-imap/tests/fixtures/AttachmentLongFilenameTest.php deleted file mode 100644 index 5a3e00ed..00000000 --- a/plugins/vendor/webklex/php-imap/tests/fixtures/AttachmentLongFilenameTest.php +++ /dev/null @@ -1,79 +0,0 @@ -getFixture("attachment_long_filename.eml"); - - self::assertEquals("", $message->subject); - self::assertEquals("multipart/mixed", $message->content_type->last()); - self::assertFalse($message->hasTextBody()); - self::assertFalse($message->hasHTMLBody()); - - $attachments = $message->attachments(); - self::assertCount(3, $attachments); - - $attachment = $attachments[0]; - self::assertInstanceOf(Attachment::class, $attachment); - self::assertEquals("Buchungsbestätigung- Rechnung-Geschäftsbedingungen-Nr.B123-45 - XXXX xxxxxxxxxxxxxxxxx XxxX, Lüdxxxxxxxx - VM Klaus XXXXXX - xxxxxxxx.pdf", $attachment->name); - self::assertEquals("Buchungsbestätigung- Rechnung-Geschäftsbedingungen-Nr.B123-45 - XXXXX xxxxxxxxxxxxxxxxx XxxX, Lüxxxxxxxxxx - VM Klaus XXXXXX - xxxxxxxx.pdf", $attachment->filename); - self::assertEquals('text', $attachment->type); - self::assertEquals('pdf', $attachment->getExtension()); - self::assertEquals("text/plain", $attachment->content_type); - self::assertEquals("ca51ce1fb15acc6d69b8a5700256172fcc507e02073e6f19592e341bd6508ab8", hash("sha256", $attachment->content)); - self::assertEquals(4, $attachment->size); - self::assertEquals(0, $attachment->part_number); - self::assertEquals("attachment", $attachment->disposition); - self::assertNotEmpty($attachment->id); - - $attachment = $attachments[1]; - self::assertInstanceOf(Attachment::class, $attachment); - self::assertEquals('01_A€àäąбيد@Z-0123456789-qwertyuiopasdfghjklzxcvbnmopqrstuvz-0123456789-qwertyuiopasdfghjklzxcvbnmopqrstuvz-0123456789-qwertyuiopasdfghjklzxcvbnmopqrstuvz.txt', $attachment->name); - self::assertEquals("cebd34e48eaa06311da3d3130d5a9b465b096dc1094a6548f8c94c24ca52f34e", hash("sha256", $attachment->filename)); - self::assertEquals('text', $attachment->type); - self::assertEquals('txt', $attachment->getExtension()); - self::assertEquals("text/plain", $attachment->content_type); - self::assertEquals("ca51ce1fb15acc6d69b8a5700256172fcc507e02073e6f19592e341bd6508ab8", hash("sha256", $attachment->content)); - self::assertEquals(4, $attachment->size); - self::assertEquals(1, $attachment->part_number); - self::assertEquals("attachment", $attachment->disposition); - self::assertNotEmpty($attachment->id); - - $attachment = $attachments[2]; - self::assertInstanceOf(Attachment::class, $attachment); - self::assertEquals('02_A€àäąбيد@Z-0123456789-qwertyuiopasdfghjklzxcvbnmopqrstuvz-0123456789-qwertyuiopasdfghjklzxcvbnmopqrstuvz-0123456789-qwertyuiopasdfghjklzxcvbnmopqrstuvz.txt', $attachment->name); - self::assertEquals('02_A€àäąбيد@Z-0123456789-qwertyuiopasdfghjklzxcvbnmopqrstuvz-0123456789-qwertyuiopasdfghjklzxcvbnmopqrstuvz-0123456789-qwertyuiopasdfghjklzxcvbnmopqrstuvz.txt', $attachment->filename); - self::assertEquals('text', $attachment->type); - self::assertEquals("text/plain", $attachment->content_type); - self::assertEquals('txt', $attachment->getExtension()); - self::assertEquals("ca51ce1fb15acc6d69b8a5700256172fcc507e02073e6f19592e341bd6508ab8", hash("sha256", $attachment->content)); - self::assertEquals(4, $attachment->size); - self::assertEquals(2, $attachment->part_number); - self::assertEquals("attachment", $attachment->disposition); - self::assertNotEmpty($attachment->id); - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/fixtures/AttachmentNoDispositionTest.php b/plugins/vendor/webklex/php-imap/tests/fixtures/AttachmentNoDispositionTest.php deleted file mode 100644 index aa1ef946..00000000 --- a/plugins/vendor/webklex/php-imap/tests/fixtures/AttachmentNoDispositionTest.php +++ /dev/null @@ -1,55 +0,0 @@ -getFixture("attachment_no_disposition.eml"); - - self::assertEquals("", $message->subject); - self::assertEquals("multipart/mixed", $message->content_type->last()); - self::assertFalse($message->hasTextBody()); - self::assertFalse($message->hasHTMLBody()); - - self::assertCount(1, $message->attachments()); - - $attachment = $message->attachments()->first(); - - self::assertInstanceOf(Attachment::class, $attachment); - self::assertEquals('26ed3dd2', $attachment->filename); - self::assertEquals('26ed3dd2', $attachment->id); - self::assertEquals("Prostřeno_2014_poslední volné termíny.xls", $attachment->name); - self::assertEquals('text', $attachment->type); - self::assertEquals('xls', $attachment->getExtension()); - self::assertEquals("application/vnd.ms-excel", $attachment->content_type); - self::assertEquals("a0ef7cfbc05b73dbcb298fe0bc224b41900cdaf60f9904e3fea5ba6c7670013c", hash("sha256", $attachment->content)); - self::assertEquals(146, $attachment->size); - self::assertEquals(0, $attachment->part_number); - self::assertNull($attachment->disposition); - self::assertNotEmpty($attachment->id); - self::assertEmpty($attachment->content_id); - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/fixtures/BccTest.php b/plugins/vendor/webklex/php-imap/tests/fixtures/BccTest.php deleted file mode 100644 index be8ef72e..00000000 --- a/plugins/vendor/webklex/php-imap/tests/fixtures/BccTest.php +++ /dev/null @@ -1,49 +0,0 @@ -getFixture("bcc.eml"); - - self::assertEquals("test", $message->subject); - self::assertSame([ - 'personal' => '', - 'mailbox' => 'return-path', - 'host' => 'here.com', - 'mail' => 'return-path@here.com', - 'full' => 'return-path@here.com', - ], $message->return_path->first()->toArray()); - self::assertEquals("1.0", $message->mime_version); - self::assertEquals("text/plain", $message->content_type); - self::assertEquals("Hi!", $message->getTextBody()); - self::assertFalse($message->hasHTMLBody()); - self::assertEquals("2017-09-27 10:48:51", $message->date->first()->setTimezone('UTC')->format("Y-m-d H:i:s")); - self::assertEquals("from@there.com", $message->from); - self::assertEquals("to@here.com", $message->to); - self::assertEquals("A_€@{è_Z ", $message->bcc); - self::assertEquals("sender@here.com", $message->sender); - self::assertEquals("reply-to@here.com", $message->reply_to); - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/fixtures/BooleanDecodedContentTest.php b/plugins/vendor/webklex/php-imap/tests/fixtures/BooleanDecodedContentTest.php deleted file mode 100644 index 5d15fe57..00000000 --- a/plugins/vendor/webklex/php-imap/tests/fixtures/BooleanDecodedContentTest.php +++ /dev/null @@ -1,55 +0,0 @@ -getFixture("boolean_decoded_content.eml"); - - self::assertEquals("Nuu", $message->subject); - self::assertEquals("Here is the problem mail\r\n \r\nBody text", $message->getTextBody()); - self::assertEquals("Here is the problem mail\r\n \r\nBody text", $message->getHTMLBody()); - - self::assertEquals("2017-09-13 11:05:45", $message->date->first()->setTimezone('UTC')->format("Y-m-d H:i:s")); - self::assertEquals("from@there.com", $message->from); - self::assertEquals("to@here.com", $message->to); - - $attachments = $message->getAttachments(); - self::assertCount(1, $attachments); - - $attachment = $attachments[0]; - self::assertInstanceOf(Attachment::class, $attachment); - self::assertEquals("Example Domain.pdf", $attachment->name); - self::assertEquals('text', $attachment->type); - self::assertEquals('pdf', $attachment->getExtension()); - self::assertEquals("application/pdf", $attachment->content_type); - self::assertEquals("1c449aaab4f509012fa5eaa180fd017eb7724ccacabdffc1c6066d3756dcde5c", hash("sha256", $attachment->content)); - self::assertEquals(53, $attachment->size); - self::assertEquals(2, $attachment->part_number); - self::assertEquals("attachment", $attachment->disposition); - self::assertNotEmpty($attachment->id); - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/fixtures/DateTemplateTest.php b/plugins/vendor/webklex/php-imap/tests/fixtures/DateTemplateTest.php deleted file mode 100644 index 77dfd7bb..00000000 --- a/plugins/vendor/webklex/php-imap/tests/fixtures/DateTemplateTest.php +++ /dev/null @@ -1,116 +0,0 @@ - "2019-04-05 10:10:49", - "04 Jan 2018 10:12:47 UT" => "2018-01-04 10:12:47", - "22 Jun 18 03:56:36 PM -05:00 (GMT -05:00)" => "2018-06-22 20:56:36", - "Sat, 31 Aug 2013 20:08:23 +0580" => "2013-08-31 14:38:23", - "Fri, 1 Feb 2019 01:30:04 +0600 (+06)" => "2019-01-31 19:30:04", - "Mon, 4 Feb 2019 04:03:49 -0300 (-03)" => "2019-02-04 07:03:49", - "Sun, 6 Apr 2008 21:24:33 UT" => "2008-04-06 21:24:33", - "Wed, 11 Sep 2019 15:23:06 +0600 (+06)" => "2019-09-11 09:23:06", - "14 Sep 2019 00:10:08 UT +0200" => "2019-09-14 00:10:08", - "Tue, 08 Nov 2022 18:47:20 +0000 14:03:33 +0000" => "2022-11-08 18:47:20", - "Sat, 10, Dec 2022 09:35:19 +0100" => "2022-12-10 08:35:19", - "Thur, 16 Mar 2023 15:33:07 +0400" => "2023-03-16 11:33:07", - "fr., 25 nov. 2022 06:27:14 +0100/fr., 25 nov. 2022 06:27:14 +0100" => "2022-11-25 05:27:14", - "Di., 15 Feb. 2022 06:52:44 +0100 (MEZ)/Di., 15 Feb. 2022 06:52:44 +0100 (MEZ)" => "2022-02-15 05:52:44", - "Mi., 23 Apr. 2025 09:48:37 +0200 (MESZ)" => "2025-04-23 07:48:37", - ]; - - /** - * Test the fixture date-template.eml - * - * @return void - * @throws InvalidMessageDateException - * @throws ReflectionException - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws ResponseException - * @throws RuntimeException - */ - public function testFixture() : void { - try { - $message = $this->getFixture("date-template.eml"); - $this->fail("Expected InvalidMessageDateException"); - } catch (InvalidMessageDateException $e) { - self::assertTrue(true); - } - - self::$manager->setConfig([ - "options" => [ - "fallback_date" => "2021-01-01 00:00:00", - ], - ]); - $message = $this->getFixture("date-template.eml", self::$manager->getConfig()); - - self::assertEquals("test", $message->subject); - self::assertEquals("1.0", $message->mime_version); - self::assertEquals("Hi!", $message->getTextBody()); - self::assertFalse($message->hasHTMLBody()); - self::assertEquals("2021-01-01 00:00:00", $message->date->first()->timezone("UTC")->format("Y-m-d H:i:s")); - self::assertEquals("from@there.com", (string)$message->from); - self::assertEquals("to@here.com", $message->to); - - self::$manager->setConfig([ - "options" => [ - "fallback_date" => null, - ], - ]); - - $filename = implode(DIRECTORY_SEPARATOR, [__DIR__, "..", "messages", "date-template.eml"]); - $blob = file_get_contents($filename); - self::assertNotFalse($blob); - - foreach ($this->dates as $date => $expected) { - $message = Message::fromString(str_replace("%date_raw_header%", $date, $blob)); - self::assertEquals("test", $message->subject); - self::assertEquals("1.0", $message->mime_version); - self::assertEquals("Hi!", $message->getTextBody()); - self::assertFalse($message->hasHTMLBody()); - self::assertEquals($expected, $message->date->first()->timezone("UTC")->format("Y-m-d H:i:s"), "Date \"$date\" should be \"$expected\""); - self::assertEquals("from@there.com", (string)$message->from); - self::assertEquals("to@here.com", $message->to); - } - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/fixtures/EmailAddressTest.php b/plugins/vendor/webklex/php-imap/tests/fixtures/EmailAddressTest.php deleted file mode 100644 index 0f87cf6a..00000000 --- a/plugins/vendor/webklex/php-imap/tests/fixtures/EmailAddressTest.php +++ /dev/null @@ -1,59 +0,0 @@ -getFixture("email_address.eml"); - - self::assertEquals("", $message->subject); - self::assertEquals("123@example.com", $message->message_id); - self::assertEquals("Hi\r\nHow are you?", $message->getTextBody()); - self::assertFalse($message->hasHTMLBody()); - self::assertFalse($message->date->first()); - self::assertEquals("no_host", (string)$message->from); - self::assertEquals("", $message->to); - self::assertEquals("This one: is \"right\" , No-address", (string)$message->cc); - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/fixtures/EmbeddedEmailTest.php b/plugins/vendor/webklex/php-imap/tests/fixtures/EmbeddedEmailTest.php deleted file mode 100644 index 024a8885..00000000 --- a/plugins/vendor/webklex/php-imap/tests/fixtures/EmbeddedEmailTest.php +++ /dev/null @@ -1,63 +0,0 @@ -getFixture("embedded_email.eml"); - - self::assertEquals("embedded message", $message->subject); - self::assertEquals([ - 'from webmail.my-office.cz (localhost [127.0.0.1]) by keira.cofis.cz ; Fri, 29 Jan 2016 14:25:40 +0100', - ], $message->received->toArray()); - self::assertEquals("7e5798da5747415e5b82fdce042ab2a6@cerstor.cz", $message->message_id); - self::assertEquals("demo@cerstor.cz", $message->return_path); - self::assertEquals("1.0", $message->mime_version); - self::assertEquals("Roundcube Webmail/1.0.0", $message->user_agent); - self::assertEquals("email that contains embedded message", $message->getTextBody()); - self::assertFalse($message->hasHTMLBody()); - - self::assertEquals("2016-01-29 13:25:40", $message->date->first()->setTimezone('UTC')->format("Y-m-d H:i:s")); - self::assertEquals("demo@cerstor.cz", $message->from); - self::assertEquals("demo@cerstor.cz", $message->x_sender); - self::assertEquals("demo@cerstor.cz", $message->to); - - $attachments = $message->getAttachments(); - self::assertCount(1, $attachments); - - $attachment = $attachments[0]; - self::assertInstanceOf(Attachment::class, $attachment); - self::assertEquals("demo.eml", $attachment->name); - self::assertEquals('text', $attachment->type); - self::assertEquals('eml', $attachment->getExtension()); - self::assertEquals("message/rfc822", $attachment->content_type); - self::assertEquals("a1f965f10a9872e902a82dde039a237e863f522d238a1cb1968fe3396dbcac65", hash("sha256", $attachment->content)); - self::assertEquals(893, $attachment->size); - self::assertEquals(1, $attachment->part_number); - self::assertEquals("attachment", $attachment->disposition); - self::assertNotEmpty($attachment->id); - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/fixtures/EmbeddedEmailWithoutContentDispositionEmbeddedTest.php b/plugins/vendor/webklex/php-imap/tests/fixtures/EmbeddedEmailWithoutContentDispositionEmbeddedTest.php deleted file mode 100644 index 387b0de0..00000000 --- a/plugins/vendor/webklex/php-imap/tests/fixtures/EmbeddedEmailWithoutContentDispositionEmbeddedTest.php +++ /dev/null @@ -1,74 +0,0 @@ -getFixture("embedded_email_without_content_disposition-embedded.eml"); - - self::assertEquals("embedded_message_subject", $message->subject); - self::assertEquals([ - 'from webmail.my-office.cz (localhost [127.0.0.1]) by keira.cofis.cz ; Fri, 29 Jan 2016 14:25:40 +0100', - ], $message->received->toArray()); - self::assertEquals("AC39946EBF5C034B87BABD5343E96979012671D40E38@VM002.cerk.cc", $message->message_id); - self::assertEquals("pl-PL, nl-NL", $message->accept_language); - self::assertEquals("pl-PL", $message->content_language); - self::assertEquals("1.0", $message->mime_version); - self::assertEquals("some txt", $message->getTextBody()); - self::assertEquals("\r\n

some txt

\r\n", $message->getHTMLBody()); - - self::assertEquals("2019-04-05 10:10:49", $message->date->first()->setTimezone('UTC')->format("Y-m-d H:i:s")); - self::assertEquals("demo@cerstor.cz", $message->from); - self::assertEquals("demo@cerstor.cz", $message->to); - - $attachments = $message->getAttachments(); - self::assertCount(2, $attachments); - - $attachment = $attachments[0]; - self::assertInstanceOf(Attachment::class, $attachment); - self::assertEquals("file1.xlsx", $attachment->name); - self::assertEquals('text', $attachment->type); - self::assertEquals('xlsx', $attachment->getExtension()); - self::assertEquals("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", $attachment->content_type); - self::assertEquals("87737d24c106b96e177f9564af6712e2c6d3e932c0632bfbab69c88b0bb934dc", hash("sha256", $attachment->content)); - self::assertEquals(40, $attachment->size); - self::assertEquals(2, $attachment->part_number); - self::assertEquals("attachment", $attachment->disposition); - self::assertNotEmpty($attachment->id); - - $attachment = $attachments[1]; - self::assertInstanceOf(Attachment::class, $attachment); - self::assertEquals("file2.xlsx", $attachment->name); - self::assertEquals('xlsx', $attachment->getExtension()); - self::assertEquals('text', $attachment->type); - self::assertEquals("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", $attachment->content_type); - self::assertEquals("87737d24c106b96e177f9564af6712e2c6d3e932c0632bfbab69c88b0bb934dc", hash("sha256", $attachment->content)); - self::assertEquals(40, $attachment->size); - self::assertEquals(3, $attachment->part_number); - self::assertEquals("attachment", $attachment->disposition); - self::assertNotEmpty($attachment->id); - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/fixtures/EmbeddedEmailWithoutContentDispositionTest.php b/plugins/vendor/webklex/php-imap/tests/fixtures/EmbeddedEmailWithoutContentDispositionTest.php deleted file mode 100644 index 2ec5a4fa..00000000 --- a/plugins/vendor/webklex/php-imap/tests/fixtures/EmbeddedEmailWithoutContentDispositionTest.php +++ /dev/null @@ -1,97 +0,0 @@ -getFixture("embedded_email_without_content_disposition.eml"); - - self::assertEquals("Subject", $message->subject); - self::assertEquals([ - 'from webmail.my-office.cz (localhost [127.0.0.1]) by keira.cofis.cz ; Fri, 29 Jan 2016 14:25:40 +0100', - ], $message->received->toArray()); - self::assertEquals("AC39946EBF5C034B87BABD5343E96979012671D9F7E4@VM002.cerk.cc", $message->message_id); - self::assertEquals("pl-PL, nl-NL", $message->accept_language); - self::assertEquals("1.0", $message->mime_version); - self::assertEquals("TexT\r\n\r\n[cid:file.jpg]", $message->getTextBody()); - self::assertEquals("

TexT

", $message->getHTMLBody()); - - self::assertEquals("2019-04-05 11:48:50", $message->date->first()->setTimezone('UTC')->format("Y-m-d H:i:s")); - self::assertEquals("demo@cerstor.cz", $message->from); - self::assertEquals("demo@cerstor.cz", $message->to); - - $attachments = $message->getAttachments(); - self::assertCount(4, $attachments); - - $attachment = $attachments[0]; - self::assertInstanceOf(Attachment::class, $attachment); - self::assertEquals("file.jpg", $attachment->name); - self::assertEquals('jpg', $attachment->getExtension()); - self::assertEquals('text', $attachment->type); - self::assertEquals("image/jpeg", $attachment->content_type); - self::assertEquals("6b7fa434f92a8b80aab02d9bf1a12e49ffcae424e4013a1c4f68b67e3d2bbcd0", hash("sha256", $attachment->content)); - self::assertEquals(96, $attachment->size); - self::assertEquals(2, $attachment->part_number); - self::assertEquals("inline", $attachment->disposition); - self::assertNotEmpty($attachment->id); - - $attachment = $attachments[1]; - self::assertInstanceOf(Attachment::class, $attachment); - self::assertEquals('a1abc19a', $attachment->name); - self::assertEquals('text', $attachment->type); - self::assertEquals('', $attachment->getExtension()); - self::assertEquals("message/rfc822", $attachment->content_type); - self::assertEquals("2476c8b91a93c6b2fe1bfff593cb55956c2fe8e7ca6de9ad2dc9d101efe7a867", hash("sha256", $attachment->content)); - self::assertEquals(2073, $attachment->size); - self::assertEquals(3, $attachment->part_number); - self::assertNull($attachment->disposition); - self::assertNotEmpty($attachment->id); - - $attachment = $attachments[2]; - self::assertInstanceOf(Attachment::class, $attachment); - self::assertEquals("file3.xlsx", $attachment->name); - self::assertEquals('xlsx', $attachment->getExtension()); - self::assertEquals('text', $attachment->type); - self::assertEquals("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", $attachment->content_type); - self::assertEquals("87737d24c106b96e177f9564af6712e2c6d3e932c0632bfbab69c88b0bb934dc", hash("sha256", $attachment->content)); - self::assertEquals(40, $attachment->size); - self::assertEquals(4, $attachment->part_number); - self::assertEquals("attachment", $attachment->disposition); - self::assertNotEmpty($attachment->id); - - $attachment = $attachments[3]; - self::assertInstanceOf(Attachment::class, $attachment); - self::assertEquals("file4.zip", $attachment->name); - self::assertEquals('zip', $attachment->getExtension()); - self::assertEquals('text', $attachment->type); - self::assertEquals("application/x-zip-compressed", $attachment->content_type); - self::assertEquals("87737d24c106b96e177f9564af6712e2c6d3e932c0632bfbab69c88b0bb934dc", hash("sha256", $attachment->content)); - self::assertEquals(40, $attachment->size); - self::assertEquals(5, $attachment->part_number); - self::assertEquals("attachment", $attachment->disposition); - self::assertNotEmpty($attachment->id); - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/fixtures/ExampleBounceTest.php b/plugins/vendor/webklex/php-imap/tests/fixtures/ExampleBounceTest.php deleted file mode 100644 index 8153518d..00000000 --- a/plugins/vendor/webklex/php-imap/tests/fixtures/ExampleBounceTest.php +++ /dev/null @@ -1,103 +0,0 @@ -getFixture("example_bounce.eml"); - - self::assertEquals([ - 'personal' => '', - 'mailbox' => '', - 'host' => '', - 'mail' => '', - 'full' => '', - ], (array)$message->return_path->first()); - self::assertEquals([ - 0 => 'from somewhere.your-server.de by somewhere.your-server.de with LMTP id 3TP8LrElAGSOaAAAmBr1xw (envelope-from <>); Thu, 02 Mar 2023 05:27:29 +0100', - 1 => 'from somewhere06.your-server.de ([1b21:2f8:e0a:50e4::2]) by somewhere.your-server.de with esmtps (TLS1.3) tls TLS_AES_256_GCM_SHA384 (Exim 4.94.2) id 1pXaXR-0006xQ-BN for demo@foo.de; Thu, 02 Mar 2023 05:27:29 +0100', - 2 => 'from [192.168.0.10] (helo=sslproxy01.your-server.de) by somewhere06.your-server.de with esmtps (TLSv1.3:TLS_AES_256_GCM_SHA384:256) (Exim 4.92) id 1pXaXO-000LYP-9R for demo@foo.de; Thu, 02 Mar 2023 05:27:26 +0100', - 3 => 'from localhost ([127.0.0.1] helo=sslproxy01.your-server.de) by sslproxy01.your-server.de with esmtps (TLSv1.3:TLS_AES_256_GCM_SHA384:256) (Exim 4.92) id 1pXaXO-0008gy-7x for demo@foo.de; Thu, 02 Mar 2023 05:27:26 +0100', - 4 => 'from Debian-exim by sslproxy01.your-server.de with local (Exim 4.92) id 1pXaXO-0008gb-6g for demo@foo.de; Thu, 02 Mar 2023 05:27:26 +0100', - ], $message->received->all()); - self::assertEquals("demo@foo.de", $message->envelope_to); - self::assertEquals("Thu, 02 Mar 2023 05:27:29 +0100", $message->delivery_date); - self::assertEquals([ - 0 => 'somewhere.your-server.de; iprev=pass (somewhere06.your-server.de) smtp.remote-ip=1b21:2f8:e0a:50e4::2; spf=none smtp.mailfrom=<>; dmarc=skipped', - 1 => 'somewhere.your-server.de' - ], $message->authentication_results->all()); - self::assertEquals([ - 0 => 'from somewhere.your-server.de by somewhere.your-server.de with LMTP id 3TP8LrElAGSOaAAAmBr1xw (envelope-from <>); Thu, 02 Mar 2023 05:27:29 +0100', - 1 => 'from somewhere06.your-server.de ([1b21:2f8:e0a:50e4::2]) by somewhere.your-server.de with esmtps (TLS1.3) tls TLS_AES_256_GCM_SHA384 (Exim 4.94.2) id 1pXaXR-0006xQ-BN for demo@foo.de; Thu, 02 Mar 2023 05:27:29 +0100', - 2 => 'from [192.168.0.10] (helo=sslproxy01.your-server.de) by somewhere06.your-server.de with esmtps (TLSv1.3:TLS_AES_256_GCM_SHA384:256) (Exim 4.92) id 1pXaXO-000LYP-9R for demo@foo.de; Thu, 02 Mar 2023 05:27:26 +0100', - 3 => 'from localhost ([127.0.0.1] helo=sslproxy01.your-server.de) by sslproxy01.your-server.de with esmtps (TLSv1.3:TLS_AES_256_GCM_SHA384:256) (Exim 4.92) id 1pXaXO-0008gy-7x for demo@foo.de; Thu, 02 Mar 2023 05:27:26 +0100', - 4 => 'from Debian-exim by sslproxy01.your-server.de with local (Exim 4.92) id 1pXaXO-0008gb-6g for demo@foo.de; Thu, 02 Mar 2023 05:27:26 +0100', - ], $message->received->all()); - self::assertEquals("ding@ding.de", $message->x_failed_recipients); - self::assertEquals("auto-replied", $message->auto_submitted); - self::assertEquals("Mail Delivery System ", $message->from); - self::assertEquals("demo@foo.de", $message->to); - self::assertEquals("1.0", $message->mime_version); - self::assertEquals("Mail delivery failed", $message->subject); - self::assertEquals("E1pXaXO-0008gb-6g@sslproxy01.your-server.de", $message->message_id); - self::assertEquals("2023-03-02 04:27:26", $message->date->first()->setTimezone('UTC')->format("Y-m-d H:i:s")); - self::assertEquals("Clear (ClamAV 0.103.8/26827/Wed Mar 1 09:28:49 2023)", $message->x_virus_scanned); - self::assertEquals("0.0 (/)", $message->x_spam_score); - self::assertEquals("bar-demo@foo.de", $message->delivered_to); - self::assertEquals("multipart/report", $message->content_type->last()); - self::assertEquals("5d4847c21c8891e73d62c8246f260a46496958041a499f33ecd47444fdaa591b", hash("sha256", $message->getTextBody())); - self::assertFalse($message->hasHTMLBody()); - - $attachments = $message->attachments(); - self::assertCount(2, $attachments); - - $attachment = $attachments[0]; - self::assertInstanceOf(Attachment::class, $attachment); - self::assertEquals('c541a506', $attachment->filename); - self::assertEquals("c541a506", $attachment->name); - self::assertEquals('', $attachment->getExtension()); - self::assertEquals('text', $attachment->type); - self::assertEquals("message/delivery-status", $attachment->content_type); - self::assertEquals("85ac09d1d74b2d85853084dc22abcad205a6bfde62d6056e3a933ffe7e82e45c", hash("sha256", $attachment->content)); - self::assertEquals(267, $attachment->size); - self::assertEquals(1, $attachment->part_number); - self::assertNull($attachment->disposition); - self::assertNotEmpty($attachment->id); - - $attachment = $attachments[1]; - self::assertInstanceOf(Attachment::class, $attachment); - self::assertEquals('da786518', $attachment->filename); - self::assertEquals("da786518", $attachment->name); - self::assertEquals('', $attachment->getExtension()); - self::assertEquals('text', $attachment->type); - self::assertEquals("message/rfc822", $attachment->content_type); - self::assertEquals("7525331f5fab23ea77f595b995336aca7b8dad12db00ada14abebe7fe5b96e10", hash("sha256", $attachment->content)); - self::assertEquals(776, $attachment->size); - self::assertEquals(2, $attachment->part_number); - self::assertNull($attachment->disposition); - self::assertNotEmpty($attachment->id); - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/fixtures/FixtureTestCase.php b/plugins/vendor/webklex/php-imap/tests/fixtures/FixtureTestCase.php deleted file mode 100644 index cb64a9a6..00000000 --- a/plugins/vendor/webklex/php-imap/tests/fixtures/FixtureTestCase.php +++ /dev/null @@ -1,94 +0,0 @@ - [ - "debug" => $_ENV["LIVE_MAILBOX_DEBUG"] ?? false, - ], - 'accounts' => [ - 'default' => [ - 'host' => getenv("LIVE_MAILBOX_HOST"), - 'port' => getenv("LIVE_MAILBOX_PORT"), - 'encryption' => getenv("LIVE_MAILBOX_ENCRYPTION"), - 'validate_cert' => getenv("LIVE_MAILBOX_VALIDATE_CERT"), - 'username' => getenv("LIVE_MAILBOX_USERNAME"), - 'password' => getenv("LIVE_MAILBOX_PASSWORD"), - 'protocol' => 'imap', //might also use imap, [pop3 or nntp (untested)] - ], - ], - ]); - return self::$manager; - } - - /** - * Get a fixture message - * @param string $template - * - * @return Message - * @throws ReflectionException - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws ResponseException - * @throws RuntimeException - */ - final public function getFixture(string $template, ?Config $config = null) : Message { - $filename = implode(DIRECTORY_SEPARATOR, [__DIR__, "..", "messages", $template]); - $message = Message::fromFile($filename, $config); - self::assertInstanceOf(Message::class, $message); - - return $message; - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/fixtures/FourNestedEmailsTest.php b/plugins/vendor/webklex/php-imap/tests/fixtures/FourNestedEmailsTest.php deleted file mode 100644 index e6c37ccd..00000000 --- a/plugins/vendor/webklex/php-imap/tests/fixtures/FourNestedEmailsTest.php +++ /dev/null @@ -1,55 +0,0 @@ -getFixture("four_nested_emails.eml"); - - self::assertEquals("3-third-subject", $message->subject); - self::assertEquals("3-third-content", $message->getTextBody()); - self::assertFalse($message->hasHTMLBody()); - self::assertFalse($message->date->first()); - self::assertEquals("test@example.com", $message->from->first()->mail); - self::assertEquals("test@example.com", $message->to->first()->mail); - - $attachments = $message->getAttachments(); - self::assertCount(1, $attachments); - - $attachment = $attachments[0]; - self::assertInstanceOf(Attachment::class, $attachment); - self::assertEquals("2-second-email.eml", $attachment->name); - self::assertEquals('text', $attachment->type); - self::assertEquals('eml', $attachment->getExtension()); - self::assertEquals("message/rfc822", $attachment->content_type); - self::assertEquals("85012e6a26d064a0288ee62618b3192687385adb4a4e27e48a28f738a325ca46", hash("sha256", $attachment->content)); - self::assertEquals(1376, $attachment->size); - self::assertEquals(2, $attachment->part_number); - self::assertEquals("attachment", $attachment->disposition); - self::assertNotEmpty($attachment->id); - - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/fixtures/GbkCharsetTest.php b/plugins/vendor/webklex/php-imap/tests/fixtures/GbkCharsetTest.php deleted file mode 100644 index 7492d908..00000000 --- a/plugins/vendor/webklex/php-imap/tests/fixtures/GbkCharsetTest.php +++ /dev/null @@ -1,37 +0,0 @@ -getFixture("gbk_charset.eml"); - - self::assertEquals("Nuu", $message->subject); - self::assertEquals("Hi", $message->getTextBody()); - self::assertFalse($message->hasHTMLBody()); - self::assertEquals("2017-09-13 11:05:45", $message->date->first()->setTimezone('UTC')->format("Y-m-d H:i:s")); - self::assertEquals("from@there.com", $message->from->first()->mail); - self::assertEquals("to@here.com", $message->to->first()->mail); - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/fixtures/HtmlOnlyTest.php b/plugins/vendor/webklex/php-imap/tests/fixtures/HtmlOnlyTest.php deleted file mode 100644 index 90ef44e3..00000000 --- a/plugins/vendor/webklex/php-imap/tests/fixtures/HtmlOnlyTest.php +++ /dev/null @@ -1,37 +0,0 @@ -getFixture("html_only.eml"); - - self::assertEquals("Nuu", $message->subject); - self::assertEquals("Hi", $message->getHTMLBody()); - self::assertFalse($message->hasTextBody()); - self::assertEquals("2017-09-13 11:05:45", $message->date->first()->setTimezone('UTC')->format("Y-m-d H:i:s")); - self::assertEquals("from@there.com", $message->from->first()->mail); - self::assertEquals("to@here.com", $message->to->first()->mail); - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/fixtures/ImapMimeHeaderDecodeReturnsFalseTest.php b/plugins/vendor/webklex/php-imap/tests/fixtures/ImapMimeHeaderDecodeReturnsFalseTest.php deleted file mode 100644 index 7f90a4ec..00000000 --- a/plugins/vendor/webklex/php-imap/tests/fixtures/ImapMimeHeaderDecodeReturnsFalseTest.php +++ /dev/null @@ -1,37 +0,0 @@ -getFixture("imap_mime_header_decode_returns_false.eml"); - - self::assertEquals("=?UTF-8?B?nnDusSNdG92w6Fuw61fMjAxOF8wMy0xMzMyNTMzMTkzLnBkZg==?=", $message->subject->first()); - self::assertEquals("Hi", $message->getTextBody()); - self::assertFalse($message->hasHTMLBody()); - self::assertEquals("2017-09-13 11:05:45", $message->date->first()->setTimezone('UTC')->format("Y-m-d H:i:s")); - self::assertEquals("from@there.com", $message->from->first()->mail); - self::assertEquals("to@here.com", $message->to->first()->mail); - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/fixtures/InlineAttachmentTest.php b/plugins/vendor/webklex/php-imap/tests/fixtures/InlineAttachmentTest.php deleted file mode 100644 index edb380cd..00000000 --- a/plugins/vendor/webklex/php-imap/tests/fixtures/InlineAttachmentTest.php +++ /dev/null @@ -1,62 +0,0 @@ -getFixture("inline_attachment.eml"); - - self::assertEquals("", $message->subject); - self::assertFalse($message->hasTextBody()); - self::assertEquals('', $message->getHTMLBody()); - - self::assertFalse($message->date->first()); - self::assertFalse($message->from->first()); - self::assertFalse($message->to->first()); - - - $attachments = $message->attachments(); - self::assertInstanceOf(AttachmentCollection::class, $attachments); - self::assertCount(1, $attachments); - - $attachment = $attachments[0]; - - self::assertInstanceOf(Attachment::class, $attachment); - self::assertEquals('d2913999', $attachment->name); - self::assertEquals('d2913999', $attachment->filename); - self::assertEquals('ii_15f0aad691bb745f', $attachment->id); - self::assertEquals('text', $attachment->type); - self::assertEquals('', $attachment->getExtension()); - self::assertEquals("image/png", $attachment->content_type); - self::assertEquals("6568c9e9c35a7fa06f236e89f704d8c9b47183a24f2c978dba6c92e2747e3a13", hash("sha256", $attachment->content)); - self::assertEquals(1486, $attachment->size); - self::assertEquals(1, $attachment->part_number); - self::assertEquals("inline", $attachment->disposition); - self::assertEquals("", $attachment->content_id); - self::assertNotEmpty($attachment->id); - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/fixtures/KsC56011987HeadersTest.php b/plugins/vendor/webklex/php-imap/tests/fixtures/KsC56011987HeadersTest.php deleted file mode 100644 index 944e9bfb..00000000 --- a/plugins/vendor/webklex/php-imap/tests/fixtures/KsC56011987HeadersTest.php +++ /dev/null @@ -1,46 +0,0 @@ -getFixture("ks_c_5601-1987_headers.eml"); - - self::assertEquals("RE: 회원님께 Ersi님이 메시지를 보냈습니다.", $message->subject); - self::assertEquals("=?ks_c_5601-1987?B?yLi/+LTUsrIgRXJzabTUwMwguN69w8H2uKYgurizwr3AtM+02S4=?=", $message->thread_topic); - self::assertEquals("1.0", $message->mime_version); - self::assertEquals("Content", $message->getTextBody()); - self::assertFalse($message->hasHTMLBody()); - self::assertEquals("2017-09-27 10:48:51", $message->date->first()->setTimezone('UTC')->format("Y-m-d H:i:s")); - self::assertEquals("to@here.com", $message->to->first()->mail); - - - $from = $message->from->first(); - self::assertEquals("김 현진", $from->personal); - self::assertEquals("from", $from->mailbox); - self::assertEquals("there.com", $from->host); - self::assertEquals("from@there.com", $from->mail); - self::assertEquals("김 현진 ", $from->full); - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/fixtures/MailThatIsAttachmentTest.php b/plugins/vendor/webklex/php-imap/tests/fixtures/MailThatIsAttachmentTest.php deleted file mode 100644 index 0f4164c9..00000000 --- a/plugins/vendor/webklex/php-imap/tests/fixtures/MailThatIsAttachmentTest.php +++ /dev/null @@ -1,63 +0,0 @@ -getFixture("mail_that_is_attachment.eml"); - - self::assertEquals("Report domain: yyy.cz Submitter: google.com Report-ID: 2244696771454641389", $message->subject); - self::assertEquals("2244696771454641389@google.com", $message->message_id); - self::assertEquals("1.0", $message->mime_version); - self::assertFalse($message->hasTextBody()); - self::assertFalse($message->hasHTMLBody()); - - self::assertEquals("2015-02-15 10:21:51", $message->date->first()->setTimezone('UTC')->format("Y-m-d H:i:s")); - self::assertEquals("xxx@yyy.cz", $message->to->first()->mail); - self::assertEquals("xxx@yyy.cz", $message->sender->first()->mail); - - $from = $message->from->first(); - self::assertEquals("noreply-dmarc-support via xxx", $from->personal); - self::assertEquals("xxx", $from->mailbox); - self::assertEquals("yyy.cz", $from->host); - self::assertEquals("xxx@yyy.cz", $from->mail); - self::assertEquals("noreply-dmarc-support via xxx ", $from->full); - - self::assertCount(1, $message->attachments()); - - $attachment = $message->attachments()->first(); - self::assertInstanceOf(Attachment::class, $attachment); - self::assertEquals("google.com!yyy.cz!1423872000!1423958399.zip", $attachment->name); - self::assertEquals('zip', $attachment->getExtension()); - self::assertEquals('text', $attachment->type); - self::assertEquals("application/zip", $attachment->content_type); - self::assertEquals("c0d4f47b6fde124cea7460c3e509440d1a062705f550b0502b8ba0cbf621c97a", hash("sha256", $attachment->content)); - self::assertEquals(1062, $attachment->size); - self::assertEquals(0, $attachment->part_number); - self::assertEquals("attachment", $attachment->disposition); - self::assertNotEmpty($attachment->id); - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/fixtures/MissingDateTest.php b/plugins/vendor/webklex/php-imap/tests/fixtures/MissingDateTest.php deleted file mode 100644 index 93595adc..00000000 --- a/plugins/vendor/webklex/php-imap/tests/fixtures/MissingDateTest.php +++ /dev/null @@ -1,37 +0,0 @@ -getFixture("missing_date.eml"); - - self::assertEquals("Nuu", $message->getSubject()); - self::assertEquals("Hi", $message->getTextBody()); - self::assertFalse($message->hasHTMLBody()); - self::assertFalse($message->date->first()); - self::assertEquals("from@here.com", $message->from->first()->mail); - self::assertEquals("to@here.com", $message->to->first()->mail); - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/fixtures/MissingFromTest.php b/plugins/vendor/webklex/php-imap/tests/fixtures/MissingFromTest.php deleted file mode 100644 index 5d57340c..00000000 --- a/plugins/vendor/webklex/php-imap/tests/fixtures/MissingFromTest.php +++ /dev/null @@ -1,37 +0,0 @@ -getFixture("missing_from.eml"); - - self::assertEquals("Nuu", $message->getSubject()); - self::assertEquals("Hi", $message->getTextBody()); - self::assertFalse($message->hasHTMLBody()); - self::assertEquals("2017-09-13 11:05:45", $message->date->first()->setTimezone('UTC')->format("Y-m-d H:i:s")); - self::assertFalse($message->from->first()); - self::assertEquals("to@here.com", $message->to->first()->mail); - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/fixtures/MixedFilenameTest.php b/plugins/vendor/webklex/php-imap/tests/fixtures/MixedFilenameTest.php deleted file mode 100644 index b2be0e32..00000000 --- a/plugins/vendor/webklex/php-imap/tests/fixtures/MixedFilenameTest.php +++ /dev/null @@ -1,61 +0,0 @@ -getFixture("mixed_filename.eml"); - - self::assertEquals("Свежий прайс-лист", $message->subject); - self::assertFalse($message->hasTextBody()); - self::assertFalse($message->hasHTMLBody()); - - self::assertEquals("2018-02-02 19:23:06", $message->date->first()->setTimezone('UTC')->format("Y-m-d H:i:s")); - - $from = $message->from->first(); - self::assertEquals("Прайсы || ПартКом", $from->personal); - self::assertEquals("support", $from->mailbox); - self::assertEquals("part-kom.ru", $from->host); - self::assertEquals("support@part-kom.ru", $from->mail); - self::assertEquals("Прайсы || ПартКом ", $from->full); - - self::assertEquals("foo@bar.com", $message->to->first()); - - self::assertCount(1, $message->attachments()); - - $attachment = $message->attachments()->first(); - self::assertInstanceOf(Attachment::class, $attachment); - self::assertEquals("Price4VladDaKar.xlsx", $attachment->name); - self::assertEquals('xlsx', $attachment->getExtension()); - self::assertEquals('text', $attachment->type); - self::assertEquals("application/octet-stream", $attachment->content_type); - self::assertEquals("b832983842b0ad65db69e4c7096444c540a2393e2d43f70c2c9b8b9fceeedbb1", hash('sha256', $attachment->content)); - self::assertEquals(94, $attachment->size); - self::assertEquals(2, $attachment->part_number); - self::assertEquals("attachment", $attachment->disposition); - self::assertNotEmpty($attachment->id); - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/fixtures/MultipartWithoutBodyTest.php b/plugins/vendor/webklex/php-imap/tests/fixtures/MultipartWithoutBodyTest.php deleted file mode 100644 index 01112bb7..00000000 --- a/plugins/vendor/webklex/php-imap/tests/fixtures/MultipartWithoutBodyTest.php +++ /dev/null @@ -1,62 +0,0 @@ -getFixture("multipart_without_body.eml"); - - self::assertEquals("This mail will not contain a body", $message->subject); - self::assertEquals("This mail will not contain a body", $message->getTextBody()); - self::assertEquals("d76dfb1ff3231e3efe1675c971ce73f722b906cc049d328db0d255f8d3f65568", hash("sha256", $message->getHTMLBody())); - self::assertEquals("2023-03-11 08:24:31", $message->date->first()->setTimezone('UTC')->format("Y-m-d H:i:s")); - self::assertEquals("Foo Bülow Bar ", $message->from); - self::assertEquals("some one ", $message->to); - self::assertEquals([ - 0 => 'from AS8PR02MB6805.eurprd02.prod.outlook.com (2603:10a6:20b:252::8) by PA4PR02MB7071.eurprd02.prod.outlook.com with HTTPS; Sat, 11 Mar 2023 08:24:33 +0000', - 1 => 'from omef0ahNgeoJu.eurprd02.prod.outlook.com (2603:10a6:10:33c::12) by AS8PR02MB6805.eurprd02.prod.outlook.com (2603:10a6:20b:252::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6178.19; Sat, 11 Mar 2023 08:24:31 +0000', - 2 => 'from omef0ahNgeoJu.eurprd02.prod.outlook.com ([fe80::38c0:9c40:7fc6:93a7]) by omef0ahNgeoJu.eurprd02.prod.outlook.com ([fe80::38c0:9c40:7fc6:93a7%7]) with mapi id 15.20.6178.019; Sat, 11 Mar 2023 08:24:31 +0000', - ], $message->received->all()); - self::assertEquals("This mail will not contain a body", $message->thread_topic); - self::assertEquals("AdlT8uVmpHPvImbCRM6E9LODIvAcQA==", $message->thread_index); - self::assertEquals("omef0ahNgeoJuEB51C568ED2227A2DAABB5BB9@omef0ahNgeoJu.eurprd02.prod.outlook.com", $message->message_id); - self::assertEquals("da-DK, en-US", $message->accept_language); - self::assertEquals("en-US", $message->content_language); - self::assertEquals("Internal", $message->x_ms_exchange_organization_authAs); - self::assertEquals("04", $message->x_ms_exchange_organization_authMechanism); - self::assertEquals("omef0ahNgeoJu.eurprd02.prod.outlook.com", $message->x_ms_exchange_organization_authSource); - self::assertEquals("", $message->x_ms_Has_Attach); - self::assertEquals("aa546a02-2b7a-4fb1-7fd4-08db220a09f1", $message->x_ms_exchange_organization_Network_Message_Id); - self::assertEquals("-1", $message->x_ms_exchange_organization_SCL); - self::assertEquals("", $message->x_ms_TNEF_Correlator); - self::assertEquals("0", $message->x_ms_exchange_organization_RecordReviewCfmType); - self::assertEquals("Email", $message->x_ms_publictraffictype); - self::assertEquals("ucf:0;jmr:0;auth:0;dest:I;ENG:(910001)(944506478)(944626604)(920097)(425001)(930097);", $message->X_Microsoft_Antispam_Mailbox_Delivery->first()); - self::assertEquals("0712b5fe22cf6e75fa220501c1a6715a61098983df9e69bad4000c07531c1295", hash("sha256", $message->X_Microsoft_Antispam_Message_Info)); - self::assertEquals("multipart/alternative", $message->Content_Type->last()); - self::assertEquals("1.0", $message->mime_version); - - self::assertCount(0, $message->getAttachments()); - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/fixtures/MultipleHtmlPartsAndAttachmentsTest.php b/plugins/vendor/webklex/php-imap/tests/fixtures/MultipleHtmlPartsAndAttachmentsTest.php deleted file mode 100644 index 48bc0172..00000000 --- a/plugins/vendor/webklex/php-imap/tests/fixtures/MultipleHtmlPartsAndAttachmentsTest.php +++ /dev/null @@ -1,76 +0,0 @@ -getFixture("multiple_html_parts_and_attachments.eml"); - - self::assertEquals("multiple_html_parts_and_attachments", $message->subject); - self::assertEquals("This is the first html part\r\n\r\n\r\n\r\nThis is the second html part\r\n\r\n\r\n\r\nThis is the last html part\r\nhttps://www.there.com", $message->getTextBody()); - self::assertEquals("This is the first html part

\n

This is the second html part

\n

This is the last html part
https://www.there.com



\r\n
", $message->getHTMLBody()); - - self::assertEquals("2023-02-16 09:19:02", $message->date->first()->setTimezone('UTC')->format("Y-m-d H:i:s")); - - $from = $message->from->first(); - self::assertEquals("FromName", $from->personal); - self::assertEquals("from", $from->mailbox); - self::assertEquals("there.com", $from->host); - self::assertEquals("from@there.com", $from->mail); - self::assertEquals("FromName ", $from->full); - - self::assertEquals("to@there.com", $message->to->first()); - - $attachments = $message->attachments(); - self::assertInstanceOf(AttachmentCollection::class, $attachments); - self::assertCount(2, $attachments); - - $attachment = $attachments[0]; - self::assertInstanceOf(Attachment::class, $attachment); - self::assertEquals("attachment1.pdf", $attachment->name); - self::assertEquals('pdf', $attachment->getExtension()); - self::assertEquals('text', $attachment->type); - self::assertEquals("application/pdf", $attachment->content_type); - self::assertEquals("c162adf19e0f67e26ef0b7f791b33a60b2c23b175560a505dc7f9ec490206e49", hash("sha256", $attachment->content)); - self::assertEquals(4814, $attachment->size); - self::assertEquals(2, $attachment->part_number); - self::assertEquals("inline", $attachment->disposition); - self::assertNotEmpty($attachment->id); - - $attachment = $attachments[1]; - self::assertInstanceOf(Attachment::class, $attachment); - self::assertEquals("attachment2.pdf", $attachment->name); - self::assertEquals('pdf', $attachment->getExtension()); - self::assertEquals('text', $attachment->type); - self::assertEquals("application/pdf", $attachment->content_type); - self::assertEquals("a337b37e9d3edb172a249639919f0eee3d344db352046d15f8f9887e55855a25", hash("sha256", $attachment->content)); - self::assertEquals(5090, $attachment->size); - self::assertEquals(4, $attachment->part_number); - self::assertEquals("inline", $attachment->disposition); - self::assertNotEmpty($attachment->id); - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/fixtures/MultipleNestedAttachmentsTest.php b/plugins/vendor/webklex/php-imap/tests/fixtures/MultipleNestedAttachmentsTest.php deleted file mode 100644 index a3cba097..00000000 --- a/plugins/vendor/webklex/php-imap/tests/fixtures/MultipleNestedAttachmentsTest.php +++ /dev/null @@ -1,69 +0,0 @@ -getFixture("multiple_nested_attachments.eml"); - - self::assertEquals("", $message->subject); - self::assertEquals("------------------------------------------------------------------------", $message->getTextBody()); - self::assertEquals("\r\n \r\n\r\n \r\n \r\n \r\n


\r\n

\r\n
\r\n \r\n \r\n  \"\"\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n

\r\n

\r\n
\r\n
\r\n \r\n", $message->getHTMLBody()); - - self::assertEquals("2018-01-15 09:54:09", $message->date->first()->setTimezone('UTC')->format("Y-m-d H:i:s")); - self::assertFalse($message->from->first()); - self::assertFalse($message->to->first()); - - $attachments = $message->attachments(); - self::assertInstanceOf(AttachmentCollection::class, $attachments); - self::assertCount(2, $attachments); - - $attachment = $attachments[0]; - self::assertInstanceOf(Attachment::class, $attachment); - self::assertEquals("mleokdgdlgkkecep.png", $attachment->name); - self::assertEquals('png', $attachment->getExtension()); - self::assertEquals('text', $attachment->type); - self::assertEquals("image/png", $attachment->content_type); - self::assertEquals("e0e99b0bd6d5ea3ced99add53cc98b6f8eea6eae8ddd773fd06f3489289385fb", hash("sha256", $attachment->content)); - self::assertEquals(114, $attachment->size); - self::assertEquals(3, $attachment->part_number); - self::assertEquals("inline", $attachment->disposition); - self::assertNotEmpty($attachment->id); - - $attachment = $attachments[1]; - self::assertInstanceOf(Attachment::class, $attachment); - self::assertEquals("FF4D00-1.png", $attachment->name); - self::assertEquals('png', $attachment->getExtension()); - self::assertEquals('text', $attachment->type); - self::assertEquals("image/png", $attachment->content_type); - self::assertEquals("e0e99b0bd6d5ea3ced99add53cc98b6f8eea6eae8ddd773fd06f3489289385fb", hash("sha256", $attachment->content)); - self::assertEquals(114, $attachment->size); - self::assertEquals(4, $attachment->part_number); - self::assertEquals("attachment", $attachment->disposition); - self::assertNotEmpty($attachment->id); - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/fixtures/NestesEmbeddedWithAttachmentTest.php b/plugins/vendor/webklex/php-imap/tests/fixtures/NestesEmbeddedWithAttachmentTest.php deleted file mode 100644 index e1ff57ea..00000000 --- a/plugins/vendor/webklex/php-imap/tests/fixtures/NestesEmbeddedWithAttachmentTest.php +++ /dev/null @@ -1,69 +0,0 @@ -getFixture("nestes_embedded_with_attachment.eml"); - - self::assertEquals("Nuu", $message->subject); - self::assertEquals("Dear Sarah", $message->getTextBody()); - self::assertEquals("\r\n\r\n
Dear Sarah,
\r\n", $message->getHTMLBody()); - - self::assertEquals("2017-09-13 11:05:45", $message->date->first()->setTimezone('UTC')->format("Y-m-d H:i:s")); - self::assertEquals("from@there.com", $message->from->first()->mail); - self::assertEquals("to@here.com", $message->to->first()->mail); - - $attachments = $message->attachments(); - self::assertInstanceOf(AttachmentCollection::class, $attachments); - self::assertCount(2, $attachments); - - $attachment = $attachments[0]; - self::assertInstanceOf(Attachment::class, $attachment); - self::assertEquals("first.eml", $attachment->name); - self::assertEquals('eml', $attachment->getExtension()); - self::assertEquals('text', $attachment->type); - self::assertEquals("message/rfc822", $attachment->content_type); - self::assertEquals("From: from@there.com\r\nTo: to@here.com\r\nSubject: FIRST\r\nDate: Sat, 28 Apr 2018 14:37:16 -0400\r\nMIME-Version: 1.0\r\nContent-Type: multipart/mixed;\r\n boundary=\"----=_NextPart_000_222_000\"\r\n\r\nThis is a multi-part message in MIME format.\r\n\r\n------=_NextPart_000_222_000\r\nContent-Type: multipart/alternative;\r\n boundary=\"----=_NextPart_000_222_111\"\r\n\r\n\r\n------=_NextPart_000_222_111\r\nContent-Type: text/plain;\r\n charset=\"UTF-8\"\r\nContent-Transfer-Encoding: quoted-printable\r\n\r\nPlease respond directly to this email to update your RMA\r\n\r\n\r\n2018-04-17T11:04:03-04:00\r\n------=_NextPart_000_222_111\r\nContent-Type: text/html;\r\n charset=\"UTF-8\"\r\nContent-Transfer-Encoding: quoted-printable\r\n\r\n\r\n\r\n
Please respond directly to this =\r\nemail to=20\r\nupdate your RMA
\r\n\r\n------=_NextPart_000_222_111--\r\n\r\n------=_NextPart_000_222_000\r\nContent-Type: image/png;\r\n name=\"chrome.png\"\r\nContent-Transfer-Encoding: base64\r\nContent-Disposition: attachment;\r\n filename=\"chrome.png\"\r\n\r\niVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAMAAADXqc3KAAAB+FBMVEUAAAA/mUPidDHiLi5Cn0Xk\r\nNTPmeUrkdUg/m0Q0pEfcpSbwaVdKskg+lUP4zA/iLi3msSHkOjVAmETdJSjtYFE/lkPnRj3sWUs8\r\nkkLeqCVIq0fxvhXqUkbVmSjwa1n1yBLepyX1xxP0xRXqUkboST9KukpHpUbuvRrzrhF/ljbwalju\r\nZFM4jELaoSdLtElJrUj1xxP6zwzfqSU4i0HYnydMtUlIqUfywxb60AxZqEXaoifgMCXptR9MtklH\r\npEY2iUHWnSjvvRr70QujkC+pUC/90glMuEnlOjVMt0j70QriLS1LtEnnRj3qUUXfIidOjsxAhcZF\r\no0bjNDH0xxNLr0dIrUdmntVTkMoyfL8jcLBRuErhJyrgKyb4zA/5zg3tYFBBmUTmQTnhMinruBzv\r\nvhnxwxZ/st+Ktt5zp9hqota2vtK6y9FemNBblc9HiMiTtMbFtsM6gcPV2r6dwroseLrMrbQrdLGd\r\nyKoobKbo3Zh+ynrgVllZulTsXE3rV0pIqUf42UVUo0JyjEHoS0HmsiHRGR/lmRz/1hjqnxjvpRWf\r\nwtOhusaz0LRGf7FEfbDVmqHXlJeW0pbXq5bec3fX0nTnzmuJuWvhoFFhm0FtrziBsjaAaDCYWC+u\r\nSi6jQS3FsSfLJiTirCOkuCG1KiG+wSC+GBvgyhTszQ64Z77KAAAARXRSTlMAIQRDLyUgCwsE6ebm\r\n5ubg2dLR0byXl4FDQzU1NDEuLSUgC+vr6urq6ubb29vb2tra2tG8vLu7u7uXl5eXgYGBgYGBLiUA\r\nLabIAAABsElEQVQoz12S9VPjQBxHt8VaOA6HE+AOzv1wd7pJk5I2adpCC7RUcHd3d3fXf5PvLkxh\r\neD++z+yb7GSRlwD/+Hj/APQCZWxM5M+goF+RMbHK594v+tPoiN1uHxkt+xzt9+R9wnRTZZQpXQ0T\r\n5uP1IQxToyOAZiQu5HEpjeA4SWIoksRxNiGC1tRZJ4LNxgHgnU5nJZBDvuDdl8lzQRBsQ+s9PZt7\r\ns7Pz8wsL39/DkIfZ4xlB2Gqsq62ta9oxVlVrNZpihFRpGO9fzQw1ms0NDWZz07iGkJmIFH8xxkc3\r\na/WWlubmFkv9AB2SEpDvKxbjidN2faseaNV3zoHXvv7wMODJdkOHAegweAfFPx4G67KluxzottCU\r\n9n8CUqXzcIQdXOytAHqXxomvykhEKN9EFutG22p//0rbNvHVxiJywa8yS2KDfV1dfbu31H8jF1RH\r\niTKtWYeHxUvq3bn0pyjCRaiRU6aDO+gb3aEfEeVNsDgm8zzLy9egPa7Qt8TSJdwhjplk06HH43ZN\r\nJ3s91KKCHQ5x4sw1fRGYDZ0n1L4FKb9/BP5JLYxToheoFCVxz57PPS8UhhEpLBVeAAAAAElFTkSu\r\nQmCC\r\n\r\n------=_NextPart_000_222_000--", $attachment->content); - self::assertEquals(2535, $attachment->size); - self::assertEquals(3, $attachment->part_number); - self::assertEquals("attachment", $attachment->disposition); - self::assertNotEmpty($attachment->id); - - $attachment = $attachments[1]; - self::assertInstanceOf(Attachment::class, $attachment); - self::assertEquals("second.eml", $attachment->name); - self::assertEquals('eml', $attachment->getExtension()); - self::assertEquals('text', $attachment->type); - self::assertEquals("message/rfc822", $attachment->content_type); - self::assertEquals("From: from@there.com\r\nTo: to@here.com\r\nSubject: SECOND\r\nDate: Sat, 28 Apr 2018 13:37:30 -0400\r\nMIME-Version: 1.0\r\nContent-Type: multipart/alternative;\r\n boundary=\"----=_NextPart_000_333_000\"\r\n\r\nThis is a multi-part message in MIME format.\r\n\r\n------=_NextPart_000_333_000\r\nContent-Type: text/plain;\r\n charset=\"UTF-8\"\r\nContent-Transfer-Encoding: quoted-printable\r\n\r\nT whom it may concern:\r\n------=_NextPart_000_333_000\r\nContent-Type: text/html;\r\n charset=\"UTF-8\"\r\nContent-Transfer-Encoding: quoted-printable\r\n\r\n\r\n\r\n
T whom it may concern:
\r\n\r\n\r\n------=_NextPart_000_333_000--", $attachment->content); - self::assertEquals(631, $attachment->size); - self::assertEquals(4, $attachment->part_number); - self::assertEquals("attachment", $attachment->disposition); - self::assertNotEmpty($attachment->id); - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/fixtures/NullContentCharsetTest.php b/plugins/vendor/webklex/php-imap/tests/fixtures/NullContentCharsetTest.php deleted file mode 100644 index f8e6c63f..00000000 --- a/plugins/vendor/webklex/php-imap/tests/fixtures/NullContentCharsetTest.php +++ /dev/null @@ -1,39 +0,0 @@ -getFixture("null_content_charset.eml"); - - self::assertEquals("test", $message->getSubject()); - self::assertEquals("Hi!", $message->getTextBody()); - self::assertEquals("1.0", $message->mime_version); - self::assertFalse($message->hasHTMLBody()); - - self::assertEquals("2017-09-27 10:48:51", $message->date->first()->setTimezone('UTC')->format("Y-m-d H:i:s")); - self::assertEquals("from@there.com", $message->from->first()->mail); - self::assertEquals("to@here.com", $message->to->first()->mail); - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/fixtures/PecTest.php b/plugins/vendor/webklex/php-imap/tests/fixtures/PecTest.php deleted file mode 100644 index 341ad185..00000000 --- a/plugins/vendor/webklex/php-imap/tests/fixtures/PecTest.php +++ /dev/null @@ -1,82 +0,0 @@ -getFixture("pec.eml"); - - self::assertEquals("Certified", $message->subject); - self::assertEquals("Signed", $message->getTextBody()); - self::assertEquals("Signed", $message->getHTMLBody()); - - self::assertEquals("2017-10-02 10:13:43", $message->date->first()->setTimezone('UTC')->format("Y-m-d H:i:s")); - self::assertEquals("test@example.com", $message->from->first()->mail); - self::assertEquals("test@example.com", $message->to->first()->mail); - - $attachments = $message->attachments(); - - self::assertInstanceOf(AttachmentCollection::class, $attachments); - self::assertCount(3, $attachments); - - $attachment = $attachments[0]; - self::assertInstanceOf(Attachment::class, $attachment); - self::assertEquals("data.xml", $attachment->name); - self::assertEquals('xml', $attachment->getExtension()); - self::assertEquals('text', $attachment->type); - self::assertEquals("application/xml", $attachment->content_type); - self::assertEquals("", $attachment->content); - self::assertEquals(8, $attachment->size); - self::assertEquals(3, $attachment->part_number); - self::assertEquals("inline", $attachment->disposition); - self::assertNotEmpty($attachment->id); - - $attachment = $attachments[1]; - self::assertInstanceOf(Attachment::class, $attachment); - self::assertEquals("postacert.eml", $attachment->name); - self::assertEquals('eml', $attachment->getExtension()); - self::assertEquals('text', $attachment->type); - self::assertEquals("message/rfc822", $attachment->content_type); - self::assertEquals("To: test@example.com\r\nFrom: test@example.com\r\nSubject: test-subject\r\nDate: Mon, 2 Oct 2017 12:13:50 +0200\r\nContent-Type: text/plain; charset=iso-8859-15; format=flowed\r\nContent-Transfer-Encoding: 7bit\r\n\r\ntest-content", $attachment->content); - self::assertEquals(216, $attachment->size); - self::assertEquals(4, $attachment->part_number); - self::assertEquals("inline", $attachment->disposition); - self::assertNotEmpty($attachment->id); - - $attachment = $attachments[2]; - self::assertInstanceOf(Attachment::class, $attachment); - self::assertEquals("smime.p7s", $attachment->name); - self::assertEquals('p7s', $attachment->getExtension()); - self::assertEquals('text', $attachment->type); - self::assertEquals("application/x-pkcs7-signature", $attachment->content_type); - self::assertEquals("1", $attachment->content); - self::assertEquals(4, $attachment->size); - self::assertEquals(5, $attachment->part_number); - self::assertEquals("attachment", $attachment->disposition); - self::assertNotEmpty($attachment->id); - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/fixtures/PlainOnlyTest.php b/plugins/vendor/webklex/php-imap/tests/fixtures/PlainOnlyTest.php deleted file mode 100644 index b3a65bfe..00000000 --- a/plugins/vendor/webklex/php-imap/tests/fixtures/PlainOnlyTest.php +++ /dev/null @@ -1,37 +0,0 @@ -getFixture("plain_only.eml"); - - self::assertEquals("Nuu", $message->getSubject()); - self::assertEquals("Hi", $message->getTextBody()); - self::assertFalse($message->hasHTMLBody()); - self::assertEquals("2017-09-13 11:05:45", $message->date->first()->setTimezone('UTC')->format("Y-m-d H:i:s")); - self::assertEquals("from@there.com", $message->from->first()->mail); - self::assertEquals("to@here.com", $message->to->first()->mail); - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/fixtures/PlainTextAttachmentTest.php b/plugins/vendor/webklex/php-imap/tests/fixtures/PlainTextAttachmentTest.php deleted file mode 100644 index 2e9993cc..00000000 --- a/plugins/vendor/webklex/php-imap/tests/fixtures/PlainTextAttachmentTest.php +++ /dev/null @@ -1,54 +0,0 @@ -getFixture("plain_text_attachment.eml"); - - self::assertEquals("Plain text attachment", $message->subject); - self::assertEquals("Test", $message->getTextBody()); - self::assertFalse($message->hasHTMLBody()); - - self::assertEquals("2018-08-21 07:05:14", $message->date->first()->setTimezone('UTC')->format("Y-m-d H:i:s")); - self::assertEquals("from@there.com", $message->from->first()->mail); - self::assertEquals("to@here.com", $message->to->first()->mail); - - self::assertCount(1, $message->attachments()); - - $attachment = $message->attachments()->first(); - self::assertInstanceOf(Attachment::class, $attachment); - self::assertEquals("a.txt", $attachment->name); - self::assertEquals('txt', $attachment->getExtension()); - self::assertEquals('text', $attachment->type); - self::assertNull($attachment->content_type); - self::assertEquals("Hi!", $attachment->content); - self::assertEquals(4, $attachment->size); - self::assertEquals(2, $attachment->part_number); - self::assertEquals("attachment", $attachment->disposition); - self::assertNotEmpty($attachment->id); - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/fixtures/ReferencesTest.php b/plugins/vendor/webklex/php-imap/tests/fixtures/ReferencesTest.php deleted file mode 100644 index c86aa96f..00000000 --- a/plugins/vendor/webklex/php-imap/tests/fixtures/ReferencesTest.php +++ /dev/null @@ -1,54 +0,0 @@ -getFixture("references.eml"); - - self::assertEquals("", $message->subject); - self::assertEquals("Hi\r\nHow are you?", $message->getTextBody()); - self::assertFalse($message->hasHTMLBody()); - self::assertFalse($message->date->first()); - - self::assertEquals("b9e87bd5e661a645ed6e3b832828fcc5@example.com", $message->in_reply_to); - self::assertEquals("", $message->from->first()->personal); - self::assertEquals("", $message->from->first()->host); - self::assertEquals("no_host", $message->from->first()->mail); - self::assertFalse($message->to->first()); - - self::assertEquals([ - "231d9ac57aec7d8c1a0eacfeab8af6f3@example.com", - "08F04024-A5B3-4FDE-BF2C-6710DE97D8D9@example.com" - ], $message->getReferences()->all()); - - self::assertEquals([ - 'This one: is "right" ', - 'No-address' - ], $message->cc->map(function($address){ - /** @var \Webklex\PHPIMAP\Address $address */ - return $address->full; - })); - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/fixtures/SimpleMultipartTest.php b/plugins/vendor/webklex/php-imap/tests/fixtures/SimpleMultipartTest.php deleted file mode 100644 index d2a2d885..00000000 --- a/plugins/vendor/webklex/php-imap/tests/fixtures/SimpleMultipartTest.php +++ /dev/null @@ -1,37 +0,0 @@ -getFixture("simple_multipart.eml"); - - self::assertEquals("test", $message->getSubject()); - self::assertEquals("MyPlain", $message->getTextBody()); - self::assertEquals("MyHtml", $message->getHTMLBody()); - self::assertEquals("2017-09-27 10:48:51", $message->date->first()->setTimezone('UTC')->format("Y-m-d H:i:s")); - self::assertEquals("from@there.com", $message->from->first()->mail); - self::assertEquals("to@here.com", $message->to->first()->mail); - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/fixtures/StructuredWithAttachmentTest.php b/plugins/vendor/webklex/php-imap/tests/fixtures/StructuredWithAttachmentTest.php deleted file mode 100644 index 3fc591c3..00000000 --- a/plugins/vendor/webklex/php-imap/tests/fixtures/StructuredWithAttachmentTest.php +++ /dev/null @@ -1,55 +0,0 @@ -getFixture("structured_with_attachment.eml"); - - self::assertEquals("Test", $message->getSubject()); - self::assertEquals("Test", $message->getTextBody()); - self::assertFalse($message->hasHTMLBody()); - - self::assertEquals("2017-09-29 08:55:23", $message->date->first()->setTimezone('UTC')->format("Y-m-d H:i:s")); - self::assertEquals("from@there.com", $message->from->first()->mail); - self::assertEquals("to@here.com", $message->to->first()->mail); - - self::assertCount(1, $message->attachments()); - - $attachment = $message->attachments()->first(); - self::assertInstanceOf(Attachment::class, $attachment); - self::assertEquals("MyFile.txt", $attachment->name); - self::assertEquals('txt', $attachment->getExtension()); - self::assertEquals('text', $attachment->type); - self::assertEquals("text/plain", $attachment->content_type); - self::assertEquals("MyFileContent", $attachment->content); - self::assertEquals(20, $attachment->size); - self::assertEquals(2, $attachment->part_number); - self::assertEquals("attachment", $attachment->disposition); - self::assertNotEmpty($attachment->id); - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/fixtures/UndefinedCharsetHeaderTest.php b/plugins/vendor/webklex/php-imap/tests/fixtures/UndefinedCharsetHeaderTest.php deleted file mode 100644 index f7a51cb0..00000000 --- a/plugins/vendor/webklex/php-imap/tests/fixtures/UndefinedCharsetHeaderTest.php +++ /dev/null @@ -1,64 +0,0 @@ -getFixture("undefined_charset_header.eml"); - - self::assertEquals("", $message->get("x-real-to")); - self::assertEquals("1.0", $message->get("mime-version")); - self::assertEquals("Mon, 27 Feb 2017 13:21:44 +0930", $message->get("Resent-Date")); - self::assertEquals("", $message->get("Resent-From")); - self::assertEquals("BlaBla", $message->get("X-Stored-In")); - self::assertSame([ - 'personal' => '', - 'mailbox' => 'info', - 'host' => 'bla.bla', - 'mail' => 'info@bla.bla', - 'full' => 'info@bla.bla', - ], $message->get("Return-Path")->first()->toArray()); - self::assertEquals([ - 'from by bla.bla (CommuniGate Pro RULE 6.1.13) with RULE id 14057804; Mon, 27 Feb 2017 13:21:44 +0930', - ], $message->get("Received")->all()); - self::assertEquals(")", $message->getHTMLBody()); - self::assertFalse($message->hasTextBody()); - self::assertEquals("2017-02-27 03:51:29", $message->date->first()->setTimezone('UTC')->format("Y-m-d H:i:s")); - - $from = $message->from->first(); - self::assertInstanceOf(Address::class, $from); - - self::assertEquals("myGov", $from->personal); - self::assertEquals("info", $from->mailbox); - self::assertEquals("bla.bla", $from->host); - self::assertEquals("info@bla.bla", $from->mail); - self::assertEquals("myGov ", $from->full); - - self::assertEquals("sales@bla.bla", $message->to->first()->mail); - self::assertEquals("Submit your tax refund | Australian Taxation Office.", $message->subject); - self::assertEquals("201702270351.BGF77614@bla.bla", $message->message_id); - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/fixtures/UndisclosedRecipientsMinusTest.php b/plugins/vendor/webklex/php-imap/tests/fixtures/UndisclosedRecipientsMinusTest.php deleted file mode 100644 index f9ee7999..00000000 --- a/plugins/vendor/webklex/php-imap/tests/fixtures/UndisclosedRecipientsMinusTest.php +++ /dev/null @@ -1,42 +0,0 @@ -getFixture("undisclosed_recipients_minus.eml"); - - self::assertEquals("test", $message->subject); - self::assertEquals("Hi!", $message->getTextBody()); - self::assertFalse($message->hasHTMLBody()); - self::assertEquals("2017-09-27 10:48:51", $message->date->first()->setTimezone('UTC')->format("Y-m-d H:i:s")); - self::assertEquals("from@there.com", $message->from); - self::assertEquals([ - "undisclosed-recipients", - "" - ], $message->to->map(function ($item) { - return $item->mailbox; - })); - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/fixtures/UndisclosedRecipientsSpaceTest.php b/plugins/vendor/webklex/php-imap/tests/fixtures/UndisclosedRecipientsSpaceTest.php deleted file mode 100644 index b86321eb..00000000 --- a/plugins/vendor/webklex/php-imap/tests/fixtures/UndisclosedRecipientsSpaceTest.php +++ /dev/null @@ -1,42 +0,0 @@ -getFixture("undisclosed_recipients_space.eml"); - - self::assertEquals("test", $message->subject); - self::assertEquals("Hi!", $message->getTextBody()); - self::assertFalse($message->hasHTMLBody()); - self::assertEquals("2017-09-27 10:48:51", $message->date->first()->setTimezone('UTC')->format("Y-m-d H:i:s")); - self::assertEquals("from@there.com", $message->from); - self::assertEquals([ - "Undisclosed recipients", - "" - ], $message->to->map(function ($item) { - return $item->mailbox; - })); - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/fixtures/UndisclosedRecipientsTest.php b/plugins/vendor/webklex/php-imap/tests/fixtures/UndisclosedRecipientsTest.php deleted file mode 100644 index f5f44164..00000000 --- a/plugins/vendor/webklex/php-imap/tests/fixtures/UndisclosedRecipientsTest.php +++ /dev/null @@ -1,42 +0,0 @@ -getFixture("undisclosed_recipients.eml"); - - self::assertEquals("test", $message->subject); - self::assertEquals("Hi!", $message->getTextBody()); - self::assertFalse($message->hasHTMLBody()); - self::assertEquals("2017-09-27 10:48:51", $message->date->first()->setTimezone('UTC')->format("Y-m-d H:i:s")); - self::assertEquals("from@there.com", $message->from); - self::assertEquals([ - "Undisclosed Recipients", - "" - ], $message->to->map(function ($item) { - return $item->mailbox; - })); - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/fixtures/UnknownEncodingTest.php b/plugins/vendor/webklex/php-imap/tests/fixtures/UnknownEncodingTest.php deleted file mode 100644 index 3a570cbd..00000000 --- a/plugins/vendor/webklex/php-imap/tests/fixtures/UnknownEncodingTest.php +++ /dev/null @@ -1,37 +0,0 @@ -getFixture("unknown_encoding.eml"); - - self::assertEquals("test", $message->getSubject()); - self::assertEquals("MyPlain", $message->getTextBody()); - self::assertEquals("MyHtml", $message->getHTMLBody()); - self::assertEquals("2017-09-27 10:48:51", $message->date->first()->setTimezone('UTC')->format("Y-m-d H:i:s")); - self::assertEquals("from@there.com", $message->from->first()->mail); - self::assertEquals("to@here.com", $message->to->first()->mail); - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/fixtures/WithoutCharsetPlainOnlyTest.php b/plugins/vendor/webklex/php-imap/tests/fixtures/WithoutCharsetPlainOnlyTest.php deleted file mode 100644 index 497334d5..00000000 --- a/plugins/vendor/webklex/php-imap/tests/fixtures/WithoutCharsetPlainOnlyTest.php +++ /dev/null @@ -1,37 +0,0 @@ -getFixture("without_charset_plain_only.eml"); - - self::assertEquals("Nuu", $message->getSubject()); - self::assertEquals("Hi", $message->getTextBody()); - self::assertFalse($message->hasHTMLBody()); - self::assertEquals("2017-09-13 11:05:45", $message->date->first()->setTimezone('UTC')->format("Y-m-d H:i:s")); - self::assertEquals("from@there.com", $message->from->first()->mail); - self::assertEquals("to@here.com", $message->to->first()->mail); - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/fixtures/WithoutCharsetSimpleMultipartTest.php b/plugins/vendor/webklex/php-imap/tests/fixtures/WithoutCharsetSimpleMultipartTest.php deleted file mode 100644 index 2a9ea2a0..00000000 --- a/plugins/vendor/webklex/php-imap/tests/fixtures/WithoutCharsetSimpleMultipartTest.php +++ /dev/null @@ -1,37 +0,0 @@ -getFixture("without_charset_simple_multipart.eml"); - - self::assertEquals("test", $message->getSubject()); - self::assertEquals("MyPlain", $message->getTextBody()); - self::assertEquals("MyHtml", $message->getHTMLBody()); - self::assertEquals("2017-09-27 10:48:51", $message->date->first()->setTimezone('UTC')->format("Y-m-d H:i:s")); - self::assertEquals("from@there.com", $message->from->first()->mail); - self::assertEquals("to@here.com", $message->to->first()->mail); - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/issues/Issue275Test.php b/plugins/vendor/webklex/php-imap/tests/issues/Issue275Test.php deleted file mode 100644 index 4049998d..00000000 --- a/plugins/vendor/webklex/php-imap/tests/issues/Issue275Test.php +++ /dev/null @@ -1,38 +0,0 @@ -subject); - self::assertSame("Asdf testing123 this is a body", $message->getTextBody()); - } - - public function testIssueEmail2() { - $filename = implode(DIRECTORY_SEPARATOR, [__DIR__, "..", "messages", "issue-275-2.eml"]); - $message = Message::fromFile($filename); - - $body = "Test\r\n\r\nMed venlig hilsen\r\nMartin Larsen\r\nFeline Holidays A/S\r\nTlf 78 77 04 12"; - - self::assertSame("Test 1017", (string)$message->subject); - self::assertSame($body, $message->getTextBody()); - } - -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/issues/Issue355Test.php b/plugins/vendor/webklex/php-imap/tests/issues/Issue355Test.php deleted file mode 100644 index 0fa6d07e..00000000 --- a/plugins/vendor/webklex/php-imap/tests/issues/Issue355Test.php +++ /dev/null @@ -1,30 +0,0 @@ -get("subject"); - - $this->assertEquals("Re: Uppdaterat ärende (447899), kostnader för hjälp med stadgeändring enligt ny lagstiftning", $subject->toString()); - } - -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/issues/Issue379Test.php b/plugins/vendor/webklex/php-imap/tests/issues/Issue379Test.php deleted file mode 100644 index 99b67921..00000000 --- a/plugins/vendor/webklex/php-imap/tests/issues/Issue379Test.php +++ /dev/null @@ -1,61 +0,0 @@ -getFolder('INBOX'); - - $message = $this->appendMessageTemplate($folder, "plain.eml"); - $this->assertEquals(214, $message->getSize()); - - // Clean up - $this->assertTrue($message->delete(true)); - } - -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/issues/Issue382Test.php b/plugins/vendor/webklex/php-imap/tests/issues/Issue382Test.php deleted file mode 100644 index 4e638827..00000000 --- a/plugins/vendor/webklex/php-imap/tests/issues/Issue382Test.php +++ /dev/null @@ -1,33 +0,0 @@ -from->first(); - - self::assertSame("Mail Delivery System", $from->personal); - self::assertSame("MAILER-DAEMON", $from->mailbox); - self::assertSame("mta-09.someserver.com", $from->host); - self::assertSame("MAILER-DAEMON@mta-09.someserver.com", $from->mail); - self::assertSame("Mail Delivery System ", $from->full); - } - -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/issues/Issue383Test.php b/plugins/vendor/webklex/php-imap/tests/issues/Issue383Test.php deleted file mode 100644 index 30cb3a9b..00000000 --- a/plugins/vendor/webklex/php-imap/tests/issues/Issue383Test.php +++ /dev/null @@ -1,69 +0,0 @@ -getClient(); - $client->connect(); - - $delimiter = $this->getManager()->getConfig()->get("options.delimiter"); - $folder_path = implode($delimiter, ['INBOX', 'Entwürfe+']); - - $folder = $client->getFolder($folder_path); - $this->deleteFolder($folder); - - $folder = $client->createFolder($folder_path, false); - self::assertInstanceOf(Folder::class, $folder); - - $folder = $this->getFolder($folder_path); - self::assertInstanceOf(Folder::class, $folder); - - $this->assertEquals('Entwürfe+', $folder->name); - $this->assertEquals($folder_path, $folder->full_name); - - $folder_path = implode($delimiter, ['INBOX', 'Entw&APw-rfe+']); - $this->assertEquals($folder_path, $folder->path); - - // Clean up - if ($this->deleteFolder($folder) === false) { - $this->fail("Could not delete folder: " . $folder->path); - } - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/issues/Issue393Test.php b/plugins/vendor/webklex/php-imap/tests/issues/Issue393Test.php deleted file mode 100644 index 017ff535..00000000 --- a/plugins/vendor/webklex/php-imap/tests/issues/Issue393Test.php +++ /dev/null @@ -1,62 +0,0 @@ -getClient(); - $client->connect(); - - $delimiter = $this->getManager()->getConfig()->get("options.delimiter"); - $pattern = implode($delimiter, ['doesnt_exist', '%']); - - $folder = $client->getFolder('doesnt_exist'); - $this->deleteFolder($folder); - - $folders = $client->getFolders(true, $pattern, true); - self::assertCount(0, $folders); - - try { - $client->getFolders(true, $pattern, false); - $this->fail('Expected FolderFetchingException::class exception not thrown'); - } catch (FolderFetchingException $e) { - self::assertInstanceOf(FolderFetchingException::class, $e); - } - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/issues/Issue401Test.php b/plugins/vendor/webklex/php-imap/tests/issues/Issue401Test.php deleted file mode 100644 index e250a550..00000000 --- a/plugins/vendor/webklex/php-imap/tests/issues/Issue401Test.php +++ /dev/null @@ -1,27 +0,0 @@ -subject); - } - -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/issues/Issue407Test.php b/plugins/vendor/webklex/php-imap/tests/issues/Issue407Test.php deleted file mode 100644 index 4adcbb39..00000000 --- a/plugins/vendor/webklex/php-imap/tests/issues/Issue407Test.php +++ /dev/null @@ -1,57 +0,0 @@ -getFolder('INBOX'); - self::assertInstanceOf(Folder::class, $folder); - - $message = $this->appendMessageTemplate($folder, "plain.eml"); - self::assertInstanceOf(Message::class, $message); - - $message->setFlag("Seen"); - - $flags = $this->getClient()->getConnection()->flags($message->uid, IMAP::ST_UID)->validatedData(); - - self::assertIsArray($flags); - self::assertSame(1, count($flags)); - self::assertSame("\\Seen", $flags[$message->uid][0]); - - $message->delete(); - } - -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/issues/Issue40Test.php b/plugins/vendor/webklex/php-imap/tests/issues/Issue40Test.php deleted file mode 100644 index 7288484c..00000000 --- a/plugins/vendor/webklex/php-imap/tests/issues/Issue40Test.php +++ /dev/null @@ -1,74 +0,0 @@ -getFixture("issue-40.eml"); - - self::assertSame("Zly from", (string)$message->subject); - self::assertSame([ - 'personal' => '', - 'mailbox' => 'faked_sender', - 'host' => 'sender_domain.pl', - 'mail' => 'faked_sender@sender_domain.pl', - 'full' => 'faked_sender@sender_domain.pl', - ], $message->from->first()->toArray()); - self::assertSame([ - 'personal' => '', - 'mailbox' => 'real_sender', - 'host' => 'sender_domain.pl', - 'mail' => 'real_sender@sender_domain.pl', - 'full' => ' ', - ], (array)$message->return_path->first()); - self::assertSame(true, $message->spoofed->first()); - - $config = $message->getConfig(); - self::assertSame(false, $config->get("security.detect_spoofing_exception")); - $config->set("security.detect_spoofing_exception", true); - self::assertSame(true, $config->get("security.detect_spoofing_exception")); - - $this->expectException(SpoofingAttemptDetectedException::class); - $this->getFixture("issue-40.eml", $config); - } - -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/issues/Issue410Test.php b/plugins/vendor/webklex/php-imap/tests/issues/Issue410Test.php deleted file mode 100644 index 4f8b831d..00000000 --- a/plugins/vendor/webklex/php-imap/tests/issues/Issue410Test.php +++ /dev/null @@ -1,111 +0,0 @@ -getFixture("issue-410.eml"); - - self::assertSame("☆第132号 「ガーデン&エクステリア」専門店のためのQ&Aサロン 【月刊エクステリア・ワーク】", (string)$message->subject); - - $attachments = $message->getAttachments(); - - self::assertSame(1, $attachments->count()); - - $attachment = $attachments->first(); - self::assertSame("☆第132号 「ガーデン&エクステリア」専門店のためのQ&Aサロン 【月刊エクステリア・ワーク】", $attachment->filename); - self::assertSame("☆第132号 「ガーデン&エクステリア」専門店のためのQ&Aサロン 【月刊エクステリア・ワーク】", $attachment->name); - } - - /** - * @throws RuntimeException - * @throws MessageContentFetchingException - * @throws ResponseException - * @throws ImapBadRequestException - * @throws InvalidMessageDateException - * @throws ConnectionFailedException - * @throws \ReflectionException - * @throws ImapServerErrorException - * @throws AuthFailedException - * @throws MaskNotFoundException - */ - public function testIssueEmailB() { - $message = $this->getFixture("issue-410b.eml"); - - self::assertSame("386 - 400021804 - 19., Heiligenstädter Straße 80 - 0819306 - Anfrage Vergabevorschlag", (string)$message->subject); - - $attachments = $message->getAttachments(); - - self::assertSame(1, $attachments->count()); - - $attachment = $attachments->first(); - self::assertSame("2021_Mängelliste_0819306.xlsx", $attachment->description); - self::assertSame("2021_Mängelliste_0819306.xlsx", $attachment->filename); - self::assertSame("2021_Mängelliste_0819306.xlsx", $attachment->name); - } - - /** - * @throws RuntimeException - * @throws MessageContentFetchingException - * @throws ResponseException - * @throws ImapBadRequestException - * @throws ConnectionFailedException - * @throws InvalidMessageDateException - * @throws ImapServerErrorException - * @throws AuthFailedException - * @throws \ReflectionException - * @throws MaskNotFoundException - */ - public function testIssueEmailSymbols() { - $message = $this->getFixture("issue-410symbols.eml"); - - $attachments = $message->getAttachments(); - - self::assertSame(1, $attachments->count()); - - /** @var Attachment $attachment */ - $attachment = $attachments->first(); - self::assertSame("Checkliste 10.,DAVIDGASSE 76-80;2;2.pdf", $attachment->description); - self::assertSame("Checkliste 10.,DAVIDGASSE 76-80;2;2.pdf", $attachment->name); - self::assertSame("Checkliste 10.,DAVIDGASSE 76-80;2;2.pdf", $attachment->filename); - } - -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/issues/Issue412Test.php b/plugins/vendor/webklex/php-imap/tests/issues/Issue412Test.php deleted file mode 100644 index bfaa883d..00000000 --- a/plugins/vendor/webklex/php-imap/tests/issues/Issue412Test.php +++ /dev/null @@ -1,31 +0,0 @@ -subject); - self::assertSame("64254d63e92a36ee02c760676351e60a", md5($message->getTextBody())); - self::assertSame("2e4de288f6a1ed658548ed11fcdb1d79", md5($message->getHTMLBody())); - self::assertSame(0, $message->attachments()->count()); - } - -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/issues/Issue413Test.php b/plugins/vendor/webklex/php-imap/tests/issues/Issue413Test.php deleted file mode 100644 index 2162d6b5..00000000 --- a/plugins/vendor/webklex/php-imap/tests/issues/Issue413Test.php +++ /dev/null @@ -1,82 +0,0 @@ -getFolder('INBOX'); - self::assertInstanceOf(Folder::class, $folder); - - /** @var Message $message */ - $_message = $this->appendMessageTemplate($folder, 'issue-413.eml'); - - $message = $folder->messages()->getMessageByMsgn($_message->msgn); - self::assertEquals($message->uid, $_message->uid); - - self::assertSame("Test Message", (string)$message->subject); - self::assertSame("This is just a test, so ignore it (if you can!)\r\n\r\nTony Marston", $message->getTextBody()); - - $message->delete(); - } - - /** - * Static parsing test - * - * @return void - * @throws \ReflectionException - * @throws \Webklex\PHPIMAP\Exceptions\AuthFailedException - * @throws \Webklex\PHPIMAP\Exceptions\ConnectionFailedException - * @throws \Webklex\PHPIMAP\Exceptions\ImapBadRequestException - * @throws \Webklex\PHPIMAP\Exceptions\ImapServerErrorException - * @throws \Webklex\PHPIMAP\Exceptions\InvalidMessageDateException - * @throws \Webklex\PHPIMAP\Exceptions\MaskNotFoundException - * @throws \Webklex\PHPIMAP\Exceptions\MessageContentFetchingException - * @throws \Webklex\PHPIMAP\Exceptions\ResponseException - * @throws \Webklex\PHPIMAP\Exceptions\RuntimeException - */ - public function testIssueEmail() { - $filename = implode(DIRECTORY_SEPARATOR, [__DIR__, "..", "messages", "issue-413.eml"]); - $message = Message::fromFile($filename); - - self::assertSame("Test Message", (string)$message->subject); - self::assertSame("This is just a test, so ignore it (if you can!)\r\n\r\nTony Marston", $message->getTextBody()); - } - -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/issues/Issue414Test.php b/plugins/vendor/webklex/php-imap/tests/issues/Issue414Test.php deleted file mode 100644 index 36a1d300..00000000 --- a/plugins/vendor/webklex/php-imap/tests/issues/Issue414Test.php +++ /dev/null @@ -1,43 +0,0 @@ -subject); - - $attachments = $message->getAttachments(); - - self::assertSame(2, $attachments->count()); - - $attachment = $attachments->first(); - self::assertEmpty($attachment->description); - self::assertSame("exampleMyFile.txt", $attachment->filename); - self::assertSame("exampleMyFile.txt", $attachment->name); - self::assertSame("be62f7e6", $attachment->id); - - $attachment = $attachments->last(); - self::assertEmpty($attachment->description); - self::assertSame("phpfoo", $attachment->filename); - self::assertSame("phpfoo", $attachment->name); - self::assertSame("12e1d38b", $attachment->hash); - } - -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/issues/Issue420Test.php b/plugins/vendor/webklex/php-imap/tests/issues/Issue420Test.php deleted file mode 100644 index 0cac9b6e..00000000 --- a/plugins/vendor/webklex/php-imap/tests/issues/Issue420Test.php +++ /dev/null @@ -1,31 +0,0 @@ -get("subject"); - - // Ticket No: [��17] Mailbox Inbox - (17) Incoming failed messages - $this->assertEquals('Ticket No: [??17] Mailbox Inbox - (17) Incoming failed messages', utf8_decode($subject->toString())); - } - -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/issues/Issue462Test.php b/plugins/vendor/webklex/php-imap/tests/issues/Issue462Test.php deleted file mode 100644 index e7fc2126..00000000 --- a/plugins/vendor/webklex/php-imap/tests/issues/Issue462Test.php +++ /dev/null @@ -1,48 +0,0 @@ -set('options.rfc822', false); - $message = $this->getFixture("issue-462.eml", $config); - self::assertSame("Undeliverable: Some subject", (string)$message->subject); - self::assertSame("postmaster@ ", (string)$message->from->first()); - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/issues/Issue469Test.php b/plugins/vendor/webklex/php-imap/tests/issues/Issue469Test.php deleted file mode 100644 index 13bd841b..00000000 --- a/plugins/vendor/webklex/php-imap/tests/issues/Issue469Test.php +++ /dev/null @@ -1,42 +0,0 @@ -createStub(Client::class); - $folder_name = '[Gmail]'; - $delimiter = '/'; - - $attributes = [ - '\NoInferiors', - '\NoSelect', - ]; - $folder = new Folder($client, $folder_name, $delimiter, $attributes); - - $attributes_lowercase = [ - '\Noinferiors', - '\Noselect', - ]; - $folder_lowercase = new Folder($client, $folder_name, $delimiter, $attributes_lowercase); - - self::assertSame( - $folder->no_inferiors, - $folder_lowercase->no_inferiors, - 'The parsed "\NoInferiors" attribute does not match the parsed "\Noinferiors" attribute' - ); - self::assertSame( - $folder->no_select, - $folder_lowercase->no_select, - 'The parsed "\NoSelect" attribute does not match the parsed "\Noselect" attribute' - ); - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/issues/Issue511Test.php b/plugins/vendor/webklex/php-imap/tests/issues/Issue511Test.php deleted file mode 100644 index 4782bace..00000000 --- a/plugins/vendor/webklex/php-imap/tests/issues/Issue511Test.php +++ /dev/null @@ -1,50 +0,0 @@ -getFixture("issue-511.eml"); - self::assertSame("RE: [EXTERNAL] Re: Lorem Ipsum /40 one", (string)$message->subject); - self::assertSame("COMPANYNAME | usługi ", (string)$message->from->first()); - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/issues/Issue544Test.php b/plugins/vendor/webklex/php-imap/tests/issues/Issue544Test.php deleted file mode 100644 index b8ee0e7e..00000000 --- a/plugins/vendor/webklex/php-imap/tests/issues/Issue544Test.php +++ /dev/null @@ -1,61 +0,0 @@ -getFixture("issue-544.eml"); - - self::assertSame("Test bad boundary", (string)$message->subject); - - $attachments = $message->getAttachments(); - - self::assertSame(1, $attachments->count()); - - /** @var Attachment $attachment */ - $attachment = $attachments->first(); - self::assertSame("file.pdf", $attachment->name); - self::assertSame("file.pdf", $attachment->filename); - self::assertStringStartsWith("%PDF-1.4", $attachment->content); - self::assertStringEndsWith("%%EOF\n", $attachment->content); - self::assertSame(14938, $attachment->size); - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/live/ClientTest.php b/plugins/vendor/webklex/php-imap/tests/live/ClientTest.php deleted file mode 100644 index 1d224d57..00000000 --- a/plugins/vendor/webklex/php-imap/tests/live/ClientTest.php +++ /dev/null @@ -1,318 +0,0 @@ -getClient()->connect()); - } - - /** - * Test if the connection is working - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws MaskNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testIsConnected(): void { - $client = $this->getClient()->connect(); - - self::assertTrue($client->isConnected()); - } - - /** - * Test if the connection state can be determined - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws MaskNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testDisconnect(): void { - $client = $this->getClient()->connect(); - - self::assertFalse($client->disconnect()->isConnected()); - } - - /** - * Test to get the default inbox folder - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws MaskNotFoundException - * @throws ResponseException - * @throws RuntimeException - * @throws FolderFetchingException - */ - public function testGetFolder(): void { - $client = $this->getClient()->connect(); - - $folder = $client->getFolder('INBOX'); - self::assertInstanceOf(Folder::class, $folder); - } - - /** - * Test to get the default inbox folder by name - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws MaskNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testGetFolderByName(): void { - $client = $this->getClient()->connect(); - - $folder = $client->getFolderByName('INBOX'); - self::assertInstanceOf(Folder::class, $folder); - } - - /** - * Test to get the default inbox folder by path - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws MaskNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testGetFolderByPath(): void { - $client = $this->getClient()->connect(); - - $folder = $client->getFolderByPath('INBOX'); - self::assertInstanceOf(Folder::class, $folder); - } - - /** - * Test to get all folders - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws MaskNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testGetFolders(): void { - $client = $this->getClient()->connect(); - - $folders = $client->getFolders(false); - self::assertTrue($folders->count() > 0); - } - - public function testGetFoldersWithStatus(): void { - $client = $this->getClient()->connect(); - - $folders = $client->getFoldersWithStatus(false); - self::assertTrue($folders->count() > 0); - } - - public function testOpenFolder(): void { - $client = $this->getClient()->connect(); - - $status = $client->openFolder("INBOX"); - self::assertTrue(isset($status["flags"]) && count($status["flags"]) > 0); - self::assertTrue(($status["uidnext"] ?? 0) > 0); - self::assertTrue(($status["uidvalidity"] ?? 0) > 0); - self::assertTrue(($status["recent"] ?? -1) >= 0); - self::assertTrue(($status["exists"] ?? -1) >= 0); - } - - public function testCreateFolder(): void { - $client = $this->getClient()->connect(); - - $delimiter = $this->getManager()->getConfig()->get("options.delimiter"); - $folder_path = implode($delimiter, ['INBOX', $this->getSpecialChars()]); - - $folder = $client->getFolder($folder_path); - - $this->deleteFolder($folder); - - $folder = $client->createFolder($folder_path, false); - self::assertInstanceOf(Folder::class, $folder); - - $folder = $this->getFolder($folder_path); - self::assertInstanceOf(Folder::class, $folder); - - $this->assertEquals($this->getSpecialChars(), $folder->name); - $this->assertEquals($folder_path, $folder->full_name); - - $folder_path = implode($delimiter, ['INBOX', EncodingAliases::convert($this->getSpecialChars(), "utf-8", "utf7-imap")]); - $this->assertEquals($folder_path, $folder->path); - - // Clean up - if ($this->deleteFolder($folder) === false) { - $this->fail("Could not delete folder: " . $folder->path); - } - } - - public function testCheckFolder(): void { - $client = $this->getClient()->connect(); - - $status = $client->checkFolder("INBOX"); - self::assertTrue(isset($status["flags"]) && count($status["flags"]) > 0); - self::assertTrue(($status["uidnext"] ?? 0) > 0); - self::assertTrue(($status["uidvalidity"] ?? 0) > 0); - self::assertTrue(($status["recent"] ?? -1) >= 0); - self::assertTrue(($status["exists"] ?? -1) >= 0); - } - - public function testGetFolderPath(): void { - $client = $this->getClient()->connect(); - - self::assertIsArray($client->openFolder("INBOX")); - self::assertEquals("INBOX", $client->getFolderPath()); - } - - public function testId(): void { - $client = $this->getClient()->connect(); - - $info = $client->Id(); - self::assertIsArray($info); - $valid = false; - foreach ($info as $value) { - if (str_starts_with($value, "OK")) { - $valid = true; - break; - } - } - self::assertTrue($valid); - } - - public function testGetQuotaRoot(): void { - if (!getenv("LIVE_MAILBOX_QUOTA_SUPPORT")) { - $this->markTestSkipped("Quota support is not enabled"); - } - - $client = $this->getClient()->connect(); - - $quota = $client->getQuotaRoot("INBOX"); - self::assertIsArray($quota); - self::assertTrue(count($quota) > 1); - self::assertIsArray($quota[0]); - self::assertEquals("INBOX", $quota[0][1]); - self::assertIsArray($quota[1]); - self::assertIsArray($quota[1][2]); - self::assertTrue($quota[1][2][2] > 0); - } - - public function testSetTimeout(): void { - $client = $this->getClient()->connect(); - - self::assertInstanceOf(ProtocolInterface::class, $client->setTimeout(57)); - self::assertEquals(57, $client->getTimeout()); - } - - public function testExpunge(): void { - $client = $this->getClient()->connect(); - - $client->openFolder("INBOX"); - $status = $client->expunge(); - - self::assertIsArray($status); - self::assertIsArray($status[0]); - self::assertEquals("OK", $status[0][0]); - } - - public function testGetDefaultMessageMask(): void { - $client = $this->getClient(); - - self::assertEquals(MessageMask::class, $client->getDefaultMessageMask()); - } - - public function testGetDefaultEvents(): void { - $client = $this->getClient(); - - self::assertIsArray($client->getDefaultEvents("message")); - } - - public function testSetDefaultMessageMask(): void { - $client = $this->getClient(); - - self::assertInstanceOf(Client::class, $client->setDefaultMessageMask(AttachmentMask::class)); - self::assertEquals(AttachmentMask::class, $client->getDefaultMessageMask()); - - $client->setDefaultMessageMask(MessageMask::class); - } - - public function testGetDefaultAttachmentMask(): void { - $client = $this->getClient(); - - self::assertEquals(AttachmentMask::class, $client->getDefaultAttachmentMask()); - } - - public function testSetDefaultAttachmentMask(): void { - $client = $this->getClient(); - - self::assertInstanceOf(Client::class, $client->setDefaultAttachmentMask(MessageMask::class)); - self::assertEquals(MessageMask::class, $client->getDefaultAttachmentMask()); - - $client->setDefaultAttachmentMask(AttachmentMask::class); - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/live/FolderTest.php b/plugins/vendor/webklex/php-imap/tests/live/FolderTest.php deleted file mode 100644 index 178329cf..00000000 --- a/plugins/vendor/webklex/php-imap/tests/live/FolderTest.php +++ /dev/null @@ -1,447 +0,0 @@ -getFolder('INBOX'); - self::assertInstanceOf(Folder::class, $folder); - - self::assertInstanceOf(WhereQuery::class, $folder->query()); - self::assertInstanceOf(WhereQuery::class, $folder->search()); - self::assertInstanceOf(WhereQuery::class, $folder->messages()); - } - - /** - * Test Folder::hasChildren() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws MaskNotFoundException - * @throws ResponseException - * @throws RuntimeException - * @throws EventNotFoundException - */ - public function testHasChildren(): void { - $folder = $this->getFolder('INBOX'); - self::assertInstanceOf(Folder::class, $folder); - - $delimiter = $this->getManager()->getConfig()->get("options.delimiter"); - $child_path = implode($delimiter, ['INBOX', 'test']); - if ($folder->getClient()->getFolder($child_path) === null) { - $folder->getClient()->createFolder($child_path, false); - $folder = $this->getFolder('INBOX'); - } - - self::assertTrue($folder->hasChildren()); - } - - /** - * Test Folder::setChildren() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws MaskNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testSetChildren(): void { - $folder = $this->getFolder('INBOX'); - self::assertInstanceOf(Folder::class, $folder); - - $delimiter = $this->getManager()->getConfig()->get("options.delimiter"); - $child_path = implode($delimiter, ['INBOX', 'test']); - if ($folder->getClient()->getFolder($child_path) === null) { - $folder->getClient()->createFolder($child_path, false); - $folder = $this->getFolder('INBOX'); - } - self::assertTrue($folder->hasChildren()); - - $folder->setChildren(new FolderCollection()); - self::assertTrue($folder->getChildren()->isEmpty()); - } - - /** - * Test Folder::getChildren() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws MaskNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testGetChildren(): void { - $folder = $this->getFolder('INBOX'); - self::assertInstanceOf(Folder::class, $folder); - - $delimiter = $this->getManager()->getConfig()->get("options.delimiter"); - $child_path = implode($delimiter, ['INBOX', 'test']); - if ($folder->getClient()->getFolder($child_path) === null) { - $folder->getClient()->createFolder($child_path, false); - } - - $folder = $folder->getClient()->getFolders()->where('name', 'INBOX')->first(); - self::assertInstanceOf(Folder::class, $folder); - - self::assertTrue($folder->hasChildren()); - self::assertFalse($folder->getChildren()->isEmpty()); - } - - /** - * Test Folder::move() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws MaskNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testMove(): void { - $client = $this->getClient(); - - $delimiter = $this->getManager()->getConfig()->get("options.delimiter"); - $folder_path = implode($delimiter, ['INBOX', 'test']); - - $folder = $client->getFolder($folder_path); - if ($folder === null) { - $folder = $client->createFolder($folder_path, false); - } - $new_folder_path = implode($delimiter, ['INBOX', 'other']); - $new_folder = $client->getFolder($new_folder_path); - $new_folder?->delete(false); - - $status = $folder->move($new_folder_path, false); - self::assertIsArray($status); - self::assertTrue(str_starts_with($status[0], 'OK')); - - $new_folder = $client->getFolder($new_folder_path); - self::assertEquals($new_folder_path, $new_folder->path); - self::assertEquals('other', $new_folder->name); - - if ($this->deleteFolder($new_folder) === false) { - $this->fail("Could not delete folder: " . $new_folder->path); - } - } - - /** - * Test Folder::delete() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws MaskNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testDelete(): void { - $client = $this->getClient(); - - $delimiter = $this->getManager()->getConfig()->get("options.delimiter"); - $folder_path = implode($delimiter, ['INBOX', 'test']); - - $folder = $client->getFolder($folder_path); - if ($folder === null) { - $folder = $client->createFolder($folder_path, false); - } - self::assertInstanceOf(Folder::class, $folder); - - if ($this->deleteFolder($folder) === false) { - $this->fail("Could not delete folder: " . $folder->path); - } - } - - /** - * Test Folder::overview() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws MaskNotFoundException - * @throws ResponseException - * @throws RuntimeException - * @throws InvalidMessageDateException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - */ - public function testOverview(): void { - $folder = $this->getFolder('INBOX'); - self::assertInstanceOf(Folder::class, $folder); - - $folder->select(); - - // Test empty overview - $overview = $folder->overview(); - self::assertIsArray($overview); - self::assertCount(0, $overview); - - $message = $this->appendMessageTemplate($folder, "plain.eml"); - - $overview = $folder->overview(); - - self::assertIsArray($overview); - self::assertCount(1, $overview); - - self::assertEquals($message->from->first()->full, end($overview)["from"]->toString()); - - self::assertTrue($message->delete()); - } - - /** - * Test Folder::appendMessage() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testAppendMessage(): void { - $folder = $this->getFolder('INBOX'); - self::assertInstanceOf(Folder::class, $folder); - - $message = $this->appendMessageTemplate($folder, "plain.eml"); - self::assertInstanceOf(Message::class, $message); - - self::assertEquals("Example", $message->subject); - self::assertEquals("to@someone-else.com", $message->to); - self::assertEquals("from@someone.com", $message->from); - - // Clean up - $this->assertTrue($message->delete(true)); - } - - /** - * Test Folder::subscribe() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws MaskNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testSubscribe(): void { - $folder = $this->getFolder('INBOX'); - self::assertInstanceOf(Folder::class, $folder); - - $status = $folder->subscribe(); - self::assertIsArray($status); - self::assertTrue(str_starts_with($status[0], 'OK')); - - // Clean up - $folder->unsubscribe(); - } - - /** - * Test Folder::unsubscribe() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws MaskNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testUnsubscribe(): void { - $folder = $this->getFolder('INBOX'); - self::assertInstanceOf(Folder::class, $folder); - - $folder->subscribe(); - - $status = $folder->subscribe(); - self::assertIsArray($status); - self::assertTrue(str_starts_with($status[0], 'OK')); - } - - /** - * Test Folder::status() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws MaskNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testStatus(): void { - $folder = $this->getFolder('INBOX'); - self::assertInstanceOf(Folder::class, $folder); - - $status = $folder->status(); - self::assertEquals(0, $status['messages']); - self::assertEquals(0, $status['recent']); - self::assertEquals(0, $status['unseen']); - self::assertGreaterThan(0, $status['uidnext']); - self::assertGreaterThan(0, $status['uidvalidity']); - } - - /** - * Test Folder::examine() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws MaskNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testExamine(): void { - $folder = $this->getFolder('INBOX'); - self::assertInstanceOf(Folder::class, $folder); - - $status = $folder->examine(); - self::assertTrue(isset($status["flags"]) && count($status["flags"]) > 0); - self::assertTrue(($status["uidnext"] ?? 0) > 0); - self::assertTrue(($status["uidvalidity"] ?? 0) > 0); - self::assertTrue(($status["recent"] ?? -1) >= 0); - self::assertTrue(($status["exists"] ?? -1) >= 0); - } - - /** - * Test Folder::getClient() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws MaskNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testGetClient(): void { - $folder = $this->getFolder('INBOX'); - self::assertInstanceOf(Folder::class, $folder); - self::assertInstanceOf(Client::class, $folder->getClient()); - } - - /** - * Test Folder::setDelimiter() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws MaskNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testSetDelimiter(): void { - $folder = $this->getFolder('INBOX'); - self::assertInstanceOf(Folder::class, $folder); - - $folder->setDelimiter("/"); - self::assertEquals("/", $folder->delimiter); - - $folder->setDelimiter("."); - self::assertEquals(".", $folder->delimiter); - - $default_delimiter = $this->getManager()->getConfig()->get("options.delimiter", "/"); - $folder->setDelimiter(null); - self::assertEquals($default_delimiter, $folder->delimiter); - } - -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/live/LegacyTest.php b/plugins/vendor/webklex/php-imap/tests/live/LegacyTest.php deleted file mode 100644 index 3e385eb0..00000000 --- a/plugins/vendor/webklex/php-imap/tests/live/LegacyTest.php +++ /dev/null @@ -1,475 +0,0 @@ -markTestSkipped("This test requires a live mailbox. Please set the LIVE_MAILBOX environment variable to run this test."); - } - - parent::__construct($name, $data, $dataName); - $manager = new ClientManager([ - 'options' => [ - "debug" => $_ENV["LIVE_MAILBOX_DEBUG"] ?? false, - ], - 'accounts' => [ - 'legacy' => [ - 'host' => getenv("LIVE_MAILBOX_HOST"), - 'port' => getenv("LIVE_MAILBOX_PORT"), - 'encryption' => getenv("LIVE_MAILBOX_ENCRYPTION"), - 'validate_cert' => getenv("LIVE_MAILBOX_VALIDATE_CERT"), - 'username' => getenv("LIVE_MAILBOX_USERNAME"), - 'password' => getenv("LIVE_MAILBOX_PASSWORD"), - 'protocol' => 'legacy-imap', - ], - ], - ]); - self::$client = $manager->account('legacy'); - self::$client->connect(); - self::assertInstanceOf(Client::class, self::$client->connect()); - } - - /** - * @throws RuntimeException - * @throws MessageFlagException - * @throws MessageContentFetchingException - * @throws ResponseException - * @throws ImapServerErrorException - * @throws MaskNotFoundException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ConnectionFailedException - * @throws InvalidMessageDateException - * @throws AuthFailedException - * @throws MessageHeaderFetchingException - */ - public function testSizes(): void { - - $delimiter = self::$client->getConfig()->get("options.delimiter"); - $child_path = implode($delimiter, ['INBOX', 'test']); - if (self::$client->getFolder($child_path) === null) { - self::$client->createFolder($child_path, false); - } - $folder = $this->getFolder($child_path); - - self::assertInstanceOf(Folder::class, $folder); - - $message = $this->appendMessageTemplate($folder, "plain.eml"); - self::assertInstanceOf(Message::class, $message); - - self::assertEquals(214, $message->size); - self::assertEquals(214, self::$client->getConnection()->sizes($message->uid)->array()[$message->uid]); - } - - /** - * Try to create a new query instance - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws MaskNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testQuery(): void { - $folder = $this->getFolder('INBOX'); - self::assertInstanceOf(Folder::class, $folder); - - self::assertInstanceOf(WhereQuery::class, $folder->query()); - self::assertInstanceOf(WhereQuery::class, $folder->search()); - self::assertInstanceOf(WhereQuery::class, $folder->messages()); - } - - /** - * Get a folder - * @param string $folder_path - * - * @return Folder - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws MaskNotFoundException - * @throws ResponseException - * @throws RuntimeException - * @throws FolderFetchingException - */ - final protected function getFolder(string $folder_path = "INDEX"): Folder { - $folder = self::$client->getFolderByPath($folder_path); - self::assertInstanceOf(Folder::class, $folder); - - return $folder; - } - - - /** - * Append a message to a folder - * @param Folder $folder - * @param string $message - * - * @return Message - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws ResponseException - * @throws RuntimeException - */ - final protected function appendMessage(Folder $folder, string $message): Message { - $status = $folder->select(); - if (!isset($status['uidnext'])) { - $this->fail("No UIDNEXT returned"); - } - - $response = $folder->appendMessage($message); - $valid_response = false; - foreach ($response as $line) { - if (str_starts_with($line, 'OK')) { - $valid_response = true; - break; - } - } - if (!$valid_response) { - $this->fail("Failed to append message: ".implode("\n", $response)); - } - - $message = $folder->messages()->getMessageByUid($status['uidnext']); - self::assertInstanceOf(Message::class, $message); - - return $message; - } - - /** - * Append a message template to a folder - * @param Folder $folder - * @param string $template - * - * @return Message - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws ResponseException - * @throws RuntimeException - */ - final protected function appendMessageTemplate(Folder $folder, string $template): Message { - $content = file_get_contents(implode(DIRECTORY_SEPARATOR, [__DIR__, "..", "messages", $template])); - return $this->appendMessage($folder, $content); - } - - /** - * Delete a folder if it is given - * @param Folder|null $folder - * - * @return bool - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws ResponseException - * @throws RuntimeException - */ - final protected function deleteFolder(?Folder $folder = null): bool { - $response = $folder?->delete(false); - if (is_array($response)) { - $valid_response = false; - foreach ($response as $line) { - if (str_starts_with($line, 'OK')) { - $valid_response = true; - break; - } - } - if (!$valid_response) { - $this->fail("Failed to delete mailbox: ".implode("\n", $response)); - } - return $valid_response; - } - return false; - } - - /** - * Try to create a new query instance with a where clause - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws ResponseException - * @throws RuntimeException - * @throws GetMessagesFailedException - * @throws InvalidWhereQueryCriteriaException - * @throws MessageSearchValidationException - */ - public function testQueryWhere(): void { - $delimiter = self::$client->getConfig()->get("options.delimiter"); - $folder_path = implode($delimiter, ['INBOX', 'search']); - - $folder = self::$client->getFolder($folder_path); - if ($folder !== null) { - self::assertTrue($this->deleteFolder($folder)); - } - $folder = self::$client->createFolder($folder_path, false); - - $messages = [ - $this->appendMessageTemplate($folder, '1366671050@github.com.eml'), - $this->appendMessageTemplate($folder, 'attachment_encoded_filename.eml'), - $this->appendMessageTemplate($folder, 'attachment_long_filename.eml'), - $this->appendMessageTemplate($folder, 'attachment_no_disposition.eml'), - $this->appendMessageTemplate($folder, 'bcc.eml'), - $this->appendMessageTemplate($folder, 'boolean_decoded_content.eml'), - $this->appendMessageTemplate($folder, 'email_address.eml'), - $this->appendMessageTemplate($folder, 'embedded_email.eml'), - $this->appendMessageTemplate($folder, 'embedded_email_without_content_disposition.eml'), - $this->appendMessageTemplate($folder, 'embedded_email_without_content_disposition-embedded.eml'), - $this->appendMessageTemplate($folder, 'example_attachment.eml'), - $this->appendMessageTemplate($folder, 'example_bounce.eml'), - $this->appendMessageTemplate($folder, 'four_nested_emails.eml'), - $this->appendMessageTemplate($folder, 'gbk_charset.eml'), - $this->appendMessageTemplate($folder, 'html_only.eml'), - $this->appendMessageTemplate($folder, 'imap_mime_header_decode_returns_false.eml'), - $this->appendMessageTemplate($folder, 'inline_attachment.eml'), - $this->appendMessageTemplate($folder, 'issue-275.eml'), - $this->appendMessageTemplate($folder, 'issue-275-2.eml'), - $this->appendMessageTemplate($folder, 'issue-348.eml'), - $this->appendMessageTemplate($folder, 'ks_c_5601-1987_headers.eml'), - $this->appendMessageTemplate($folder, 'mail_that_is_attachment.eml'), - $this->appendMessageTemplate($folder, 'missing_date.eml'), - $this->appendMessageTemplate($folder, 'missing_from.eml'), - $this->appendMessageTemplate($folder, 'mixed_filename.eml'), - $this->appendMessageTemplate($folder, 'multipart_without_body.eml'), - $this->appendMessageTemplate($folder, 'multiple_html_parts_and_attachments.eml'), - $this->appendMessageTemplate($folder, 'multiple_nested_attachments.eml'), - $this->appendMessageTemplate($folder, 'nestes_embedded_with_attachment.eml'), - $this->appendMessageTemplate($folder, 'null_content_charset.eml'), - $this->appendMessageTemplate($folder, 'pec.eml'), - $this->appendMessageTemplate($folder, 'plain.eml'), - $this->appendMessageTemplate($folder, 'plain_only.eml'), - $this->appendMessageTemplate($folder, 'plain_text_attachment.eml'), - $this->appendMessageTemplate($folder, 'references.eml'), - $this->appendMessageTemplate($folder, 'simple_multipart.eml'), - $this->appendMessageTemplate($folder, 'structured_with_attachment.eml'), - $this->appendMessageTemplate($folder, 'thread_my_topic.eml'), - $this->appendMessageTemplate($folder, 'thread_re_my_topic.eml'), - $this->appendMessageTemplate($folder, 'thread_unrelated.eml'), - $this->appendMessageTemplate($folder, 'undefined_charset_header.eml'), - $this->appendMessageTemplate($folder, 'undisclosed_recipients_minus.eml'), - $this->appendMessageTemplate($folder, 'undisclosed_recipients_space.eml'), - $this->appendMessageTemplate($folder, 'unknown_encoding.eml'), - $this->appendMessageTemplate($folder, 'without_charset_plain_only.eml'), - $this->appendMessageTemplate($folder, 'without_charset_simple_multipart.eml'), - ]; - - $folder->getClient()->expunge(); - - $query = $folder->query()->all(); - self::assertEquals(count($messages), $query->count()); - - $query = $folder->query()->whereSubject("test"); - self::assertEquals(11, $query->count()); - - $query = $folder->query()->whereOn(Carbon::now()); - self::assertEquals(count($messages), $query->count()); - - self::assertTrue($this->deleteFolder($folder)); - } - - /** - * Test query where criteria - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidWhereQueryCriteriaException - * @throws MaskNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testQueryWhereCriteria(): void { - self::$client->reconnect(); - - $folder = $this->getFolder('INBOX'); - self::assertInstanceOf(Folder::class, $folder); - - $this->assertWhereSearchCriteria($folder, 'SUBJECT', 'Test'); - $this->assertWhereSearchCriteria($folder, 'BODY', 'Test'); - $this->assertWhereSearchCriteria($folder, 'TEXT', 'Test'); - $this->assertWhereSearchCriteria($folder, 'KEYWORD', 'Test'); - $this->assertWhereSearchCriteria($folder, 'UNKEYWORD', 'Test'); - $this->assertWhereSearchCriteria($folder, 'FLAGGED', 'Seen'); - $this->assertWhereSearchCriteria($folder, 'UNFLAGGED', 'Seen'); - $this->assertHeaderSearchCriteria($folder, 'Message-ID', 'Seen'); - $this->assertHeaderSearchCriteria($folder, 'In-Reply-To', 'Seen'); - $this->assertWhereSearchCriteria($folder, 'BCC', 'test@example.com'); - $this->assertWhereSearchCriteria($folder, 'CC', 'test@example.com'); - $this->assertWhereSearchCriteria($folder, 'FROM', 'test@example.com'); - $this->assertWhereSearchCriteria($folder, 'TO', 'test@example.com'); - $this->assertWhereSearchCriteria($folder, 'UID', '1'); - $this->assertWhereSearchCriteria($folder, 'UID', '1,2'); - $this->assertWhereSearchCriteria($folder, 'ALL'); - $this->assertWhereSearchCriteria($folder, 'NEW'); - $this->assertWhereSearchCriteria($folder, 'OLD'); - $this->assertWhereSearchCriteria($folder, 'SEEN'); - $this->assertWhereSearchCriteria($folder, 'UNSEEN'); - $this->assertWhereSearchCriteria($folder, 'RECENT'); - $this->assertWhereSearchCriteria($folder, 'ANSWERED'); - $this->assertWhereSearchCriteria($folder, 'UNANSWERED'); - $this->assertWhereSearchCriteria($folder, 'DELETED'); - $this->assertWhereSearchCriteria($folder, 'UNDELETED'); - $this->assertHeaderSearchCriteria($folder, 'Content-Language','en_US'); - $this->assertWhereSearchCriteria($folder, 'CUSTOM X-Spam-Flag NO'); - $this->assertWhereSearchCriteria($folder, 'CUSTOM X-Spam-Flag YES'); - $this->assertWhereSearchCriteria($folder, 'NOT'); - $this->assertWhereSearchCriteria($folder, 'OR'); - $this->assertWhereSearchCriteria($folder, 'AND'); - $this->assertWhereSearchCriteria($folder, 'BEFORE', '01-Jan-2020', true); - $this->assertWhereSearchCriteria($folder, 'BEFORE', Carbon::now()->subDays(1), true); - $this->assertWhereSearchCriteria($folder, 'ON', '01-Jan-2020', true); - $this->assertWhereSearchCriteria($folder, 'ON', Carbon::now()->subDays(1), true); - $this->assertWhereSearchCriteria($folder, 'SINCE', '01-Jan-2020', true); - $this->assertWhereSearchCriteria($folder, 'SINCE', Carbon::now()->subDays(1), true); - } - - /** - * Assert where search criteria - * @param Folder $folder - * @param string $criteria - * @param string|Carbon|null $value - * @param bool $date - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidWhereQueryCriteriaException - * @throws ResponseException - * @throws RuntimeException - */ - protected function assertWhereSearchCriteria(Folder $folder, string $criteria, Carbon|string|null $value = null, bool $date = false): void { - $query = $folder->query()->where($criteria, $value); - self::assertInstanceOf(WhereQuery::class, $query); - - $item = $query->getQuery()->first(); - $criteria = str_replace("CUSTOM ", "", $criteria); - $expected = $value === null ? [$criteria] : [$criteria, $value]; - if ($date === true && $value instanceof Carbon) { - $date_format = $folder->getClient()->getConfig()->get('date_format', 'd M y'); - $expected[1] = $value->format($date_format); - } - - self::assertIsArray($item); - self::assertIsString($item[0]); - if($value !== null) { - self::assertCount(2, $item); - self::assertIsString($item[1]); - }else{ - self::assertCount(1, $item); - } - self::assertSame($expected, $item); - } - - /** - * Assert header search criteria - * @param Folder $folder - * @param string $criteria - * @param mixed|null $value - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidWhereQueryCriteriaException - * @throws ResponseException - * @throws RuntimeException - */ - protected function assertHeaderSearchCriteria(Folder $folder, string $criteria, mixed $value = null): void { - $query = $folder->query()->whereHeader($criteria, $value); - self::assertInstanceOf(WhereQuery::class, $query); - - $item = $query->getQuery()->first(); - - self::assertIsArray($item); - self::assertIsString($item[0]); - self::assertCount(1, $item); - self::assertSame(['HEADER '.$criteria.' '.$value], $item); - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/live/LiveMailboxTestCase.php b/plugins/vendor/webklex/php-imap/tests/live/LiveMailboxTestCase.php deleted file mode 100644 index d0f1b680..00000000 --- a/plugins/vendor/webklex/php-imap/tests/live/LiveMailboxTestCase.php +++ /dev/null @@ -1,220 +0,0 @@ --@#[]_ß_б_π_€_✔_你_يد_Z_'; - - /** - * Client manager - * @var ClientManager $manager - */ - protected static ClientManager $manager; - - /** - * Get the client manager - * - * @return ClientManager - */ - final protected function getManager(): ClientManager { - if (!isset(self::$manager)) { - self::$manager = new ClientManager([ - 'options' => [ - "debug" => $_ENV["LIVE_MAILBOX_DEBUG"] ?? false, - ], - 'accounts' => [ - 'default' => [ - 'host' => getenv("LIVE_MAILBOX_HOST"), - 'port' => getenv("LIVE_MAILBOX_PORT"), - 'encryption' => getenv("LIVE_MAILBOX_ENCRYPTION"), - 'validate_cert' => getenv("LIVE_MAILBOX_VALIDATE_CERT"), - 'username' => getenv("LIVE_MAILBOX_USERNAME"), - 'password' => getenv("LIVE_MAILBOX_PASSWORD"), - 'protocol' => 'imap', //might also use imap, [pop3 or nntp (untested)] - ], - ], - ]); - } - return self::$manager; - } - - /** - * Get the client - * - * @return Client - * @throws MaskNotFoundException - */ - final protected function getClient(): Client { - if (!getenv("LIVE_MAILBOX") ?? false) { - $this->markTestSkipped("This test requires a live mailbox. Please set the LIVE_MAILBOX environment variable to run this test."); - } - return $this->getManager()->account('default'); - } - - /** - * Get special chars - * - * @return string - */ - final protected function getSpecialChars(): string { - return self::SPECIAL_CHARS; - } - - /** - * Get a folder - * @param string $folder_path - * - * @return Folder - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws MaskNotFoundException - * @throws ResponseException - * @throws RuntimeException - * @throws FolderFetchingException - */ - final protected function getFolder(string $folder_path = "INDEX"): Folder { - $client = $this->getClient(); - self::assertInstanceOf(Client::class, $client->connect()); - - $folder = $client->getFolderByPath($folder_path); - self::assertInstanceOf(Folder::class, $folder); - - return $folder; - } - - /** - * Append a message to a folder - * @param Folder $folder - * @param string $message - * - * @return Message - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws ResponseException - * @throws RuntimeException - */ - final protected function appendMessage(Folder $folder, string $message): Message { - $status = $folder->select(); - if (!isset($status['uidnext'])) { - $this->fail("No UIDNEXT returned"); - } - - $response = $folder->appendMessage($message); - $valid_response = false; - foreach ($response as $line) { - if (str_starts_with($line, 'OK')) { - $valid_response = true; - break; - } - } - if (!$valid_response) { - $this->fail("Failed to append message: ".implode("\n", $response)); - } - - $message = $folder->messages()->getMessageByUid($status['uidnext']); - self::assertInstanceOf(Message::class, $message); - - return $message; - } - - /** - * Append a message template to a folder - * @param Folder $folder - * @param string $template - * - * @return Message - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws ResponseException - * @throws RuntimeException - */ - final protected function appendMessageTemplate(Folder $folder, string $template): Message { - $content = file_get_contents(implode(DIRECTORY_SEPARATOR, [__DIR__, "..", "messages", $template])); - return $this->appendMessage($folder, $content); - } - - /** - * Delete a folder if it is given - * @param Folder|null $folder - * - * @return bool - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws ResponseException - * @throws RuntimeException - */ - final protected function deleteFolder(?Folder $folder = null): bool { - $response = $folder?->delete(false); - if (is_array($response)) { - $valid_response = false; - foreach ($response as $line) { - if (str_starts_with($line, 'OK')) { - $valid_response = true; - break; - } - } - if (!$valid_response) { - $this->fail("Failed to delete mailbox: ".implode("\n", $response)); - } - return $valid_response; - } - return false; - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/live/MessageTest.php b/plugins/vendor/webklex/php-imap/tests/live/MessageTest.php deleted file mode 100644 index 841b125b..00000000 --- a/plugins/vendor/webklex/php-imap/tests/live/MessageTest.php +++ /dev/null @@ -1,2410 +0,0 @@ -getFolder('INBOX'); - - $message = $this->appendMessageTemplate($folder, "plain.eml"); - self::assertInstanceOf(Message::class, $message); - - return $message; - } - - /** - * Test Message::convertEncoding() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws ResponseException - * @throws RuntimeException - * @throws MessageNotFoundException - */ - public function testConvertEncoding(): void { - $message = $this->getDefaultMessage(); - self::assertEquals("Entwürfe+", $message->getDecoder()->convertEncoding("Entw&APw-rfe+", "UTF7-IMAP", "UTF-8")); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::thread() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - * @throws GetMessagesFailedException - */ - public function testThread(): void { - $client = $this->getClient(); - - $delimiter = $this->getManager()->getConfig()->get("options.delimiter"); - $folder_path = implode($delimiter, ['INBOX', 'thread']); - - $folder = $client->getFolder($folder_path); - if ($folder !== null) { - self::assertTrue($this->deleteFolder($folder)); - } - $folder = $client->createFolder($folder_path, false); - - $message1 = $this->appendMessageTemplate($folder, "thread_my_topic.eml"); - $message2 = $this->appendMessageTemplate($folder, "thread_re_my_topic.eml"); - $message3 = $this->appendMessageTemplate($folder, "thread_unrelated.eml"); - - $thread = $message1->thread($folder); - self::assertCount(2, $thread); - - $thread = $message2->thread($folder); - self::assertCount(2, $thread); - - $thread = $message3->thread($folder); - self::assertCount(1, $thread); - - // Cleanup - self::assertTrue($message1->delete()); - self::assertTrue($message2->delete()); - self::assertTrue($message3->delete()); - $client->expunge(); - - self::assertTrue($this->deleteFolder($folder)); - } - - /** - * Test Message::hasAttachments() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testHasAttachments(): void { - $message = $this->getDefaultMessage(); - self::assertFalse($message->hasAttachments()); - - $folder = $message->getFolder(); - self::assertInstanceOf(Folder::class, $folder); - self::assertTrue($message->delete()); - - $message = $this->appendMessageTemplate($folder, "example_attachment.eml"); - self::assertInstanceOf(Message::class, $message); - self::assertTrue($message->hasAttachments()); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::getFetchOptions() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testGetFetchOptions(): void { - $message = $this->getDefaultMessage(); - self::assertEquals(IMAP::FT_PEEK, $message->getFetchOptions()); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::getMessageId() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testGetMessageId(): void { - $folder = $this->getFolder('INBOX'); - $message = $this->appendMessageTemplate($folder, "example_attachment.eml"); - self::assertInstanceOf(Message::class, $message); - - self::assertEquals("d3a5e91963cb805cee975687d5acb1c6@swift.generated", $message->getMessageId()); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::getReplyTo() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testGetReplyTo(): void { - $folder = $this->getFolder('INBOX'); - $message = $this->appendMessageTemplate($folder, "example_attachment.eml"); - self::assertInstanceOf(Message::class, $message); - - self::assertEquals("testreply_to ", $message->getReplyTo()); - self::assertEquals("someone@domain.tld", $message->getReplyTo()->first()->mail); - self::assertEquals("testreply_to", $message->getReplyTo()->first()->personal); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::setSequence() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testSetSequence(): void { - $message = $this->getDefaultMessage(); - self::assertEquals($message->uid, $message->getSequenceId()); - - $message->setSequence(IMAP::ST_MSGN); - self::assertEquals($message->msgn, $message->getSequenceId()); - - $message->setSequence(null); - self::assertEquals($message->uid, $message->getSequenceId()); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::getEvent() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testGetEvent(): void { - $message = $this->getDefaultMessage(); - - $message->setEvent("message", "test", "test"); - self::assertEquals("test", $message->getEvent("message", "test")); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::__construct() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function test__construct(): void { - $message = $this->getDefaultMessage(); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::setFlag() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testSetFlag(): void { - $message = $this->getDefaultMessage(); - - self::assertTrue($message->setFlag("seen")); - self::assertTrue($message->getFlags()->has("seen")); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::getMsgn() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testGetMsgn(): void { - $client = $this->getClient(); - - $delimiter = $this->getManager()->getConfig()->get("options.delimiter"); - $folder_path = implode($delimiter, ['INBOX', 'test']); - - $folder = $client->getFolder($folder_path); - if ($folder !== null) { - self::assertTrue($this->deleteFolder($folder)); - } - $folder = $client->createFolder($folder_path, false); - - $message = $this->appendMessageTemplate($folder, "plain.eml"); - self::assertInstanceOf(Message::class, $message); - - self::assertEquals(1, $message->getMsgn()); - - // Cleanup - self::assertTrue($message->delete()); - self::assertTrue($this->deleteFolder($folder)); - } - - /** - * Test Message::peek() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testPeek(): void { - $message = $this->getDefaultMessage(); - self::assertFalse($message->getFlags()->has("seen")); - self::assertEquals(IMAP::FT_PEEK, $message->getFetchOptions()); - $message->peek(); - self::assertFalse($message->getFlags()->has("seen")); - - $message->setFetchOption(IMAP::FT_UID); - self::assertEquals(IMAP::FT_UID, $message->getFetchOptions()); - $message->peek(); - self::assertTrue($message->getFlags()->has("seen")); - - // Cleanup - self::assertTrue($message->delete()); - - } - - /** - * Test Message::unsetFlag() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testUnsetFlag(): void { - $message = $this->getDefaultMessage(); - - self::assertFalse($message->getFlags()->has("seen")); - - self::assertTrue($message->setFlag("seen")); - self::assertTrue($message->getFlags()->has("seen")); - - self::assertTrue($message->unsetFlag("seen")); - self::assertFalse($message->getFlags()->has("seen")); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::setSequenceId() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testSetSequenceId(): void { - $message = $this->getDefaultMessage(); - self::assertEquals($message->uid, $message->getSequenceId()); - - $original_sequence = $message->getSequenceId(); - - $message->setSequenceId(1, IMAP::ST_MSGN); - self::assertEquals(1, $message->getSequenceId()); - - $message->setSequenceId(1); - self::assertEquals(1, $message->getSequenceId()); - - $message->setSequenceId($original_sequence); - - // Cleanup - self::assertTrue($message->delete()); - - } - - /** - * Test Message::getTo() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testGetTo(): void { - $message = $this->getDefaultMessage(); - $folder = $message->getFolder(); - self::assertInstanceOf(Folder::class, $folder); - - self::assertEquals("to@someone-else.com", $message->getTo()); - self::assertTrue($message->delete()); - - $message = $this->appendMessageTemplate($folder, "example_attachment.eml"); - self::assertInstanceOf(Message::class, $message); - - self::assertEquals("testnameto ", $message->getTo()); - self::assertEquals("testnameto", $message->getTo()->first()->personal); - self::assertEquals("someone@domain.tld", $message->getTo()->first()->mail); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::setUid() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testSetUid(): void { - $message = $this->getDefaultMessage(); - self::assertEquals($message->uid, $message->getSequenceId()); - - $original_sequence = $message->getSequenceId(); - - $message->setUid(789); - self::assertEquals(789, $message->uid); - - $message->setUid($original_sequence); - - // Cleanup - self::assertTrue($message->delete()); - - } - - /** - * Test Message::getUid() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testGetUid(): void { - $message = $this->getDefaultMessage(); - self::assertEquals($message->uid, $message->getSequenceId()); - - $original_sequence = $message->uid; - - $message->setUid(789); - self::assertEquals(789, $message->uid); - self::assertEquals(789, $message->getUid()); - - $message->setUid($original_sequence); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::hasTextBody() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testHasTextBody(): void { - $message = $this->getDefaultMessage(); - self::assertTrue($message->hasTextBody()); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::__get() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function test__get(): void { - $message = $this->getDefaultMessage(); - self::assertEquals($message->uid, $message->getSequenceId()); - self::assertEquals("Example", $message->subject); - self::assertEquals("to@someone-else.com", $message->to); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::getDate() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testGetDate(): void { - $message = $this->getDefaultMessage(); - self::assertInstanceOf(Carbon::class, $message->getDate()->toDate()); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::setMask() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testSetMask(): void { - $message = $this->getDefaultMessage(); - self::assertEquals(MessageMask::class, $message->getMask()); - - $message->setMask(AttachmentMask::class); - self::assertEquals(AttachmentMask::class, $message->getMask()); - - $message->setMask(MessageMask::class); - self::assertEquals(MessageMask::class, $message->getMask()); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::getSequenceId() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testGetSequenceId(): void { - $message = $this->getDefaultMessage(); - self::assertEquals($message->uid, $message->getSequenceId()); - - $original_sequence = $message->getSequenceId(); - - $message->setSequenceId(789, IMAP::ST_MSGN); - self::assertEquals(789, $message->getSequenceId()); - - $message->setSequenceId(789); - self::assertEquals(789, $message->getSequenceId()); - - $message->setSequenceId($original_sequence); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::setConfig() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testSetConfig(): void { - $message = $this->getDefaultMessage(); - - $options = $message->getOptions(); - self::assertIsArray($options); - - $message->setOptions(["foo" => "bar"]); - self::assertArrayHasKey("foo", $message->getOptions()); - - $message->setOptions($options); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::getEvents() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testGetEvents(): void { - $message = $this->getDefaultMessage(); - - $events = $message->getEvents(); - self::assertIsArray($events); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::setFetchOption() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testSetFetchOption(): void { - $message = $this->getDefaultMessage(); - - $fetch_option = $message->fetch_options; - - $message->setFetchOption(IMAP::FT_UID); - self::assertEquals(IMAP::FT_UID, $message->fetch_options); - - $message->setFetchOption(IMAP::FT_PEEK); - self::assertEquals(IMAP::FT_PEEK, $message->fetch_options); - - $message->setFetchOption(IMAP::FT_UID | IMAP::FT_PEEK); - self::assertEquals(IMAP::FT_UID | IMAP::FT_PEEK, $message->fetch_options); - - $message->setFetchOption($fetch_option); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::getMsglist() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testGetMsglist(): void { - $message = $this->getDefaultMessage(); - - self::assertEquals(0, (int)$message->getMsglist()->toString()); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::decodeString() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testDecodeString(): void { - $message = $this->getDefaultMessage(); - - $string = '

Test

'; - self::assertEquals('

Test

', $message->getDecoder()->decode($string, IMAP::MESSAGE_ENC_QUOTED_PRINTABLE)); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::attachments() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testAttachments(): void { - $folder = $this->getFolder('INBOX'); - - $message = $this->appendMessageTemplate($folder, "example_attachment.eml"); - self::assertTrue($message->hasAttachments()); - self::assertSameSize([1], $message->attachments()); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::getMask() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testGetMask(): void { - $message = $this->getDefaultMessage(); - self::assertEquals(MessageMask::class, $message->getMask()); - - $message->setMask(AttachmentMask::class); - self::assertEquals(AttachmentMask::class, $message->getMask()); - - $message->setMask(MessageMask::class); - self::assertEquals(MessageMask::class, $message->getMask()); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::hasHTMLBody() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testHasHTMLBody(): void { - $folder = $this->getFolder('INBOX'); - - $message = $this->appendMessageTemplate($folder, "1366671050@github.com.eml"); - self::assertTrue($message->hasHTMLBody()); - - // Cleanup - self::assertTrue($message->delete()); - - $message = $this->getDefaultMessage(); - self::assertFalse($message->hasHTMLBody()); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::setEvents() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testSetEvents(): void { - $message = $this->getDefaultMessage(); - - $events = $message->getEvents(); - self::assertIsArray($events); - - $message->setEvents(["foo" => "bar"]); - self::assertArrayHasKey("foo", $message->getEvents()); - - $message->setEvents($events); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::__set() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function test__set(): void { - $message = $this->getDefaultMessage(); - - $message->foo = "bar"; - self::assertEquals("bar", $message->getFoo()); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::getHTMLBody() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testGetHTMLBody(): void { - $folder = $this->getFolder('INBOX'); - - $message = $this->appendMessageTemplate($folder, "1366671050@github.com.eml"); - self::assertTrue($message->hasHTMLBody()); - self::assertIsString($message->getHTMLBody()); - - // Cleanup - self::assertTrue($message->delete()); - - $message = $this->getDefaultMessage(); - self::assertFalse($message->hasHTMLBody()); - self::assertEmpty($message->getHTMLBody()); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::getSequence() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testGetSequence(): void { - $message = $this->getDefaultMessage(); - self::assertEquals(IMAP::ST_UID, $message->getSequence()); - - $original_sequence = $message->getSequence(); - - $message->setSequence(IMAP::ST_MSGN); - self::assertEquals(IMAP::ST_MSGN, $message->getSequence()); - - $message->setSequence($original_sequence); - self::assertEquals(IMAP::ST_UID, $message->getSequence()); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::restore() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testRestore(): void { - $message = $this->getDefaultMessage(); - - $message->setFlag("deleted"); - self::assertTrue($message->hasFlag("deleted")); - - $message->restore(); - self::assertFalse($message->hasFlag("deleted")); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::getPriority() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testGetPriority(): void { - $folder = $this->getFolder('INBOX'); - - $message = $this->appendMessageTemplate($folder, "example_attachment.eml"); - self::assertEquals(1, $message->getPriority()->first()); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::setAttachments() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testSetAttachments(): void { - $message = $this->getDefaultMessage(); - - $message->setAttachments(new AttachmentCollection(["foo" => "bar"])); - self::assertIsArray($message->attachments()->toArray()); - self::assertTrue($message->attachments()->has("foo")); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::getFrom() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testGetFrom(): void { - $message = $this->getDefaultMessage(); - self::assertEquals("from@someone.com", $message->getFrom()->first()->mail); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::setEvent() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testSetEvent(): void { - $message = $this->getDefaultMessage(); - - $message->setEvent("message", "bar", "foo"); - self::assertArrayHasKey("bar", $message->getEvents()["message"]); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::getInReplyTo() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testGetInReplyTo(): void { - $message = $this->getDefaultMessage(); - self::assertEquals("", $message->getInReplyTo()); - - // Cleanup - self::assertTrue($message->delete()); - - $folder = $this->getFolder('INBOX'); - - $message = $this->appendMessageTemplate($folder, "1366671050@github.com.eml"); - self::assertEquals("Webklex/php-imap/issues/349@github.com", $message->getInReplyTo()); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::copy() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testCopy(): void { - $message = $this->getDefaultMessage(); - $client = $message->getClient(); - self::assertInstanceOf(Client::class, $client); - - $delimiter = $this->getManager()->getConfig()->get("options.delimiter"); - $folder_path = implode($delimiter, ['INBOX', 'test']); - - $folder = $client->getFolder($folder_path); - if ($folder !== null) { - self::assertTrue($this->deleteFolder($folder)); - } - $folder = $client->createFolder($folder_path, false); - self::assertInstanceOf(Folder::class, $folder); - - $new_message = $message->copy($folder->path, true); - self::assertInstanceOf(Message::class, $new_message); - self::assertEquals($folder->path, $new_message->getFolder()->path); - - // Cleanup - self::assertTrue($message->delete()); - self::assertTrue($new_message->delete()); - - } - - /** - * Test Message::getBodies() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testGetBodies(): void { - $message = $this->getDefaultMessage(); - self::assertIsArray($message->getBodies()); - self::assertCount(1, $message->getBodies()); - - // Cleanup - self::assertTrue($message->delete()); - - } - - /** - * Test Message::getFlags() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testGetFlags(): void { - $message = $this->getDefaultMessage(); - self::assertIsArray($message->getFlags()->all()); - - self::assertFalse($message->hasFlag("seen")); - - self::assertTrue($message->setFlag("seen")); - self::assertTrue($message->getFlags()->has("seen")); - self::assertTrue($message->hasFlag("seen")); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::addFlag() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testAddFlag(): void { - $message = $this->getDefaultMessage(); - self::assertFalse($message->hasFlag("seen")); - - self::assertTrue($message->addFlag("seen")); - self::assertTrue($message->hasFlag("seen")); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::getSubject() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testGetSubject(): void { - $message = $this->getDefaultMessage(); - self::assertEquals("Example", $message->getSubject()); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::getClient() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testGetClient(): void { - $message = $this->getDefaultMessage(); - self::assertInstanceOf(Client::class, $message->getClient()); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::setFetchFlagsOption() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testSetFetchFlagsOption(): void { - $message = $this->getDefaultMessage(); - - self::assertTrue($message->getFetchFlagsOption()); - $message->setFetchFlagsOption(false); - self::assertFalse($message->getFetchFlagsOption()); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::mask() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testMask(): void { - $message = $this->getDefaultMessage(); - self::assertInstanceOf(MessageMask::class, $message->mask()); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::setMsglist() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testSetMsglist(): void { - $message = $this->getDefaultMessage(); - $message->setMsglist("foo"); - self::assertEquals("foo", $message->getMsglist()); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::flags() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testFlags(): void { - $message = $this->getDefaultMessage(); - self::assertInstanceOf(FlagCollection::class, $message->flags()); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::getAttributes() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testGetAttributes(): void { - $message = $this->getDefaultMessage(); - self::assertIsArray($message->getAttributes()); - self::assertArrayHasKey("subject", $message->getAttributes()); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::getAttachments() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testGetAttachments(): void { - $message = $this->getDefaultMessage(); - self::assertInstanceOf(AttachmentCollection::class, $message->getAttachments()); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::getRawBody() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testGetRawBody(): void { - $message = $this->getDefaultMessage(); - self::assertIsString($message->getRawBody()); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::is() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testIs(): void { - $message = $this->getDefaultMessage(); - self::assertTrue($message->is($message)); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::setFlags() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testSetFlags(): void { - $message = $this->getDefaultMessage(); - $message->setFlags(new FlagCollection()); - self::assertFalse($message->hasFlag("recent")); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::make() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws ResponseException - * @throws RuntimeException - * @throws ReflectionException - */ - public function testMake(): void { - $folder = $this->getFolder('INBOX'); - $folder->getClient()->openFolder($folder->path); - - $email = file_get_contents(implode(DIRECTORY_SEPARATOR, [__DIR__, "..", "messages", "1366671050@github.com.eml"])); - if(!str_contains($email, "\r\n")){ - $email = str_replace("\n", "\r\n", $email); - } - - $raw_header = substr($email, 0, strpos($email, "\r\n\r\n")); - $raw_body = substr($email, strlen($raw_header)+8); - - $message = Message::make(0, null, $folder->getClient(), $raw_header, $raw_body, [0 => "\\Seen"], IMAP::ST_UID); - self::assertInstanceOf(Message::class, $message); - } - - /** - * Test Message::setAvailableFlags() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testSetAvailableFlags(): void { - $message = $this->getDefaultMessage(); - - $message->setAvailableFlags(["foo"]); - self::assertSameSize(["foo"], $message->getAvailableFlags()); - self::assertEquals("foo", $message->getAvailableFlags()[0]); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::getSender() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testGetSender(): void { - $folder = $this->getFolder('INBOX'); - - $message = $this->appendMessageTemplate($folder, "example_attachment.eml"); - self::assertEquals("testsender ", $message->getSender()); - self::assertEquals("testsender", $message->getSender()->first()->personal); - self::assertEquals("someone@domain.tld", $message->getSender()->first()->mail); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::fromFile() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws ReflectionException - * @throws ResponseException - * @throws RuntimeException - */ - public function testFromFile(): void { - $this->getManager(); - $filename = implode(DIRECTORY_SEPARATOR, [__DIR__, "..", "messages", "1366671050@github.com.eml"]); - $message = Message::fromFile($filename); - self::assertInstanceOf(Message::class, $message); - } - - /** - * Test Message::getStructure() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testGetStructure(): void { - $message = $this->getDefaultMessage(); - self::assertInstanceOf(Structure::class, $message->getStructure()); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::get() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - * @throws MessageSizeFetchingException - */ - public function testGet(): void { - $message = $this->getDefaultMessage(); - self::assertEquals("Example", $message->get("subject")); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::getSize() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testGetSize(): void { - $message = $this->getDefaultMessage(); - self::assertEquals(214, $message->getSize()); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::getHeader() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testGetHeader(): void { - $message = $this->getDefaultMessage(); - self::assertInstanceOf(Header::class, $message->getHeader()); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::getReferences() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testGetReferences(): void { - $folder = $this->getFolder('INBOX'); - - $message = $this->appendMessageTemplate($folder, "1366671050@github.com.eml"); - self::assertIsArray($message->getReferences()->all()); - self::assertEquals("Webklex/php-imap/issues/349@github.com", $message->getReferences()->first()); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::setFolderPath() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testSetFolderPath(): void { - $message = $this->getDefaultMessage(); - - $folder_path = $message->getFolderPath(); - - $message->setFolderPath("foo"); - self::assertEquals("foo", $message->getFolderPath()); - - $message->setFolderPath($folder_path); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::getTextBody() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testGetTextBody(): void { - $message = $this->getDefaultMessage(); - self::assertIsString($message->getTextBody()); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::move() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testMove(): void { - $message = $this->getDefaultMessage(); - $client = $message->getClient(); - self::assertInstanceOf(Client::class, $client); - - $delimiter = $this->getManager()->getConfig()->get("options.delimiter"); - $folder_path = implode($delimiter, ['INBOX', 'test']); - - $folder = $client->getFolder($folder_path); - if ($folder !== null) { - self::assertTrue($this->deleteFolder($folder)); - } - $folder = $client->createFolder($folder_path, false); - self::assertInstanceOf(Folder::class, $folder); - - $message = $message->move($folder->path, true); - self::assertInstanceOf(Message::class, $message); - self::assertEquals($folder->path, $message->getFolder()->path); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::getFolderPath() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testGetFolderPath(): void { - $message = $this->getDefaultMessage(); - self::assertEquals("INBOX", $message->getFolderPath()); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::getFolder() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testGetFolder(): void { - $message = $this->getDefaultMessage(); - self::assertInstanceOf(Folder::class, $message->getFolder()); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::getFetchBodyOption() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testGetFetchBodyOption(): void { - $message = $this->getDefaultMessage(); - self::assertTrue($message->getFetchBodyOption()); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::setFetchBodyOption() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testSetFetchBodyOption(): void { - $message = $this->getDefaultMessage(); - - $message->setFetchBodyOption(false); - self::assertFalse($message->getFetchBodyOption()); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::getFetchFlagsOption() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testGetFetchFlagsOption(): void { - $message = $this->getDefaultMessage(); - self::assertTrue($message->getFetchFlagsOption()); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::__call() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function test__call(): void { - $message = $this->getDefaultMessage(); - self::assertEquals("Example", $message->getSubject()); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::setClient() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testSetClient(): void { - $message = $this->getDefaultMessage(); - $client = $message->getClient(); - self::assertInstanceOf(Client::class, $client); - - $message->setClient(null); - self::assertNull($message->getClient()); - - $message->setClient($client); - self::assertInstanceOf(Client::class, $message->getClient()); - - // Cleanup - self::assertTrue($message->delete()); - } - - /** - * Test Message::setMsgn() - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws MessageNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testSetMsgn(): void { - $message = $this->getDefaultMessage(); - - $uid = $message->getUid(); - $message->setMsgn(789); - self::assertEquals(789, $message->getMsgn()); - $message->setUid($uid); - - // Cleanup - self::assertTrue($message->delete()); - } -} diff --git a/plugins/vendor/webklex/php-imap/tests/live/QueryTest.php b/plugins/vendor/webklex/php-imap/tests/live/QueryTest.php deleted file mode 100644 index 194d804e..00000000 --- a/plugins/vendor/webklex/php-imap/tests/live/QueryTest.php +++ /dev/null @@ -1,283 +0,0 @@ -getFolder('INBOX'); - self::assertInstanceOf(Folder::class, $folder); - - self::assertInstanceOf(WhereQuery::class, $folder->query()); - self::assertInstanceOf(WhereQuery::class, $folder->search()); - self::assertInstanceOf(WhereQuery::class, $folder->messages()); - } - - /** - * Try to create a new query instance with a where clause - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws EventNotFoundException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidMessageDateException - * @throws MaskNotFoundException - * @throws MessageContentFetchingException - * @throws MessageFlagException - * @throws MessageHeaderFetchingException - * @throws ResponseException - * @throws RuntimeException - * @throws GetMessagesFailedException - * @throws InvalidWhereQueryCriteriaException - * @throws MessageSearchValidationException - */ - public function testQueryWhere(): void { - $client = $this->getClient(); - - $delimiter = $this->getManager()->getConfig()->get("options.delimiter"); - $folder_path = implode($delimiter, ['INBOX', 'search']); - - $folder = $client->getFolder($folder_path); - if ($folder !== null) { - self::assertTrue($this->deleteFolder($folder)); - } - $folder = $client->createFolder($folder_path, false); - - $messages = [ - $this->appendMessageTemplate($folder, '1366671050@github.com.eml'), - $this->appendMessageTemplate($folder, 'attachment_encoded_filename.eml'), - $this->appendMessageTemplate($folder, 'attachment_long_filename.eml'), - $this->appendMessageTemplate($folder, 'attachment_no_disposition.eml'), - $this->appendMessageTemplate($folder, 'bcc.eml'), - $this->appendMessageTemplate($folder, 'boolean_decoded_content.eml'), - $this->appendMessageTemplate($folder, 'email_address.eml'), - $this->appendMessageTemplate($folder, 'embedded_email.eml'), - $this->appendMessageTemplate($folder, 'embedded_email_without_content_disposition.eml'), - $this->appendMessageTemplate($folder, 'embedded_email_without_content_disposition-embedded.eml'), - $this->appendMessageTemplate($folder, 'example_attachment.eml'), - $this->appendMessageTemplate($folder, 'example_bounce.eml'), - $this->appendMessageTemplate($folder, 'four_nested_emails.eml'), - $this->appendMessageTemplate($folder, 'gbk_charset.eml'), - $this->appendMessageTemplate($folder, 'html_only.eml'), - $this->appendMessageTemplate($folder, 'imap_mime_header_decode_returns_false.eml'), - $this->appendMessageTemplate($folder, 'inline_attachment.eml'), - $this->appendMessageTemplate($folder, 'issue-275.eml'), - $this->appendMessageTemplate($folder, 'issue-275-2.eml'), - $this->appendMessageTemplate($folder, 'issue-348.eml'), - $this->appendMessageTemplate($folder, 'ks_c_5601-1987_headers.eml'), - $this->appendMessageTemplate($folder, 'mail_that_is_attachment.eml'), - $this->appendMessageTemplate($folder, 'missing_date.eml'), - $this->appendMessageTemplate($folder, 'missing_from.eml'), - $this->appendMessageTemplate($folder, 'mixed_filename.eml'), - $this->appendMessageTemplate($folder, 'multipart_without_body.eml'), - $this->appendMessageTemplate($folder, 'multiple_html_parts_and_attachments.eml'), - $this->appendMessageTemplate($folder, 'multiple_nested_attachments.eml'), - $this->appendMessageTemplate($folder, 'nestes_embedded_with_attachment.eml'), - $this->appendMessageTemplate($folder, 'null_content_charset.eml'), - $this->appendMessageTemplate($folder, 'pec.eml'), - $this->appendMessageTemplate($folder, 'plain.eml'), - $this->appendMessageTemplate($folder, 'plain_only.eml'), - $this->appendMessageTemplate($folder, 'plain_text_attachment.eml'), - $this->appendMessageTemplate($folder, 'references.eml'), - $this->appendMessageTemplate($folder, 'simple_multipart.eml'), - $this->appendMessageTemplate($folder, 'structured_with_attachment.eml'), - $this->appendMessageTemplate($folder, 'thread_my_topic.eml'), - $this->appendMessageTemplate($folder, 'thread_re_my_topic.eml'), - $this->appendMessageTemplate($folder, 'thread_unrelated.eml'), - $this->appendMessageTemplate($folder, 'undefined_charset_header.eml'), - $this->appendMessageTemplate($folder, 'undisclosed_recipients_minus.eml'), - $this->appendMessageTemplate($folder, 'undisclosed_recipients_space.eml'), - $this->appendMessageTemplate($folder, 'unknown_encoding.eml'), - $this->appendMessageTemplate($folder, 'without_charset_plain_only.eml'), - $this->appendMessageTemplate($folder, 'without_charset_simple_multipart.eml'), - ]; - - $folder->getClient()->expunge(); - - $query = $folder->query()->all(); - self::assertEquals(count($messages), $query->count()); - - $query = $folder->query()->whereSubject("test"); - self::assertEquals(11, $query->count()); - - $query = $folder->query()->whereOn(Carbon::now()); - self::assertEquals(count($messages), $query->count()); - - self::assertTrue($this->deleteFolder($folder)); - } - - /** - * Test query where criteria - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws FolderFetchingException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidWhereQueryCriteriaException - * @throws MaskNotFoundException - * @throws ResponseException - * @throws RuntimeException - */ - public function testQueryWhereCriteria(): void { - $folder = $this->getFolder('INBOX'); - self::assertInstanceOf(Folder::class, $folder); - - $this->assertWhereSearchCriteria($folder, 'SUBJECT', 'Test'); - $this->assertWhereSearchCriteria($folder, 'BODY', 'Test'); - $this->assertWhereSearchCriteria($folder, 'TEXT', 'Test'); - $this->assertWhereSearchCriteria($folder, 'KEYWORD', 'Test'); - $this->assertWhereSearchCriteria($folder, 'UNKEYWORD', 'Test'); - $this->assertWhereSearchCriteria($folder, 'FLAGGED', 'Seen'); - $this->assertWhereSearchCriteria($folder, 'UNFLAGGED', 'Seen'); - $this->assertHeaderSearchCriteria($folder, 'Message-ID', 'Seen'); - $this->assertHeaderSearchCriteria($folder, 'In-Reply-To', 'Seen'); - $this->assertWhereSearchCriteria($folder, 'BCC', 'test@example.com'); - $this->assertWhereSearchCriteria($folder, 'CC', 'test@example.com'); - $this->assertWhereSearchCriteria($folder, 'FROM', 'test@example.com'); - $this->assertWhereSearchCriteria($folder, 'TO', 'test@example.com'); - $this->assertWhereSearchCriteria($folder, 'UID', '1'); - $this->assertWhereSearchCriteria($folder, 'UID', '1,2'); - $this->assertWhereSearchCriteria($folder, 'ALL'); - $this->assertWhereSearchCriteria($folder, 'NEW'); - $this->assertWhereSearchCriteria($folder, 'OLD'); - $this->assertWhereSearchCriteria($folder, 'SEEN'); - $this->assertWhereSearchCriteria($folder, 'UNSEEN'); - $this->assertWhereSearchCriteria($folder, 'RECENT'); - $this->assertWhereSearchCriteria($folder, 'ANSWERED'); - $this->assertWhereSearchCriteria($folder, 'UNANSWERED'); - $this->assertWhereSearchCriteria($folder, 'DELETED'); - $this->assertWhereSearchCriteria($folder, 'UNDELETED'); - $this->assertHeaderSearchCriteria($folder, 'Content-Language','en_US'); - $this->assertWhereSearchCriteria($folder, 'CUSTOM X-Spam-Flag NO'); - $this->assertWhereSearchCriteria($folder, 'CUSTOM X-Spam-Flag YES'); - $this->assertWhereSearchCriteria($folder, 'NOT'); - $this->assertWhereSearchCriteria($folder, 'OR'); - $this->assertWhereSearchCriteria($folder, 'AND'); - $this->assertWhereSearchCriteria($folder, 'BEFORE', '01-Jan-2020', true); - $this->assertWhereSearchCriteria($folder, 'BEFORE', Carbon::now()->subDays(1), true); - $this->assertWhereSearchCriteria($folder, 'ON', '01-Jan-2020', true); - $this->assertWhereSearchCriteria($folder, 'ON', Carbon::now()->subDays(1), true); - $this->assertWhereSearchCriteria($folder, 'SINCE', '01-Jan-2020', true); - $this->assertWhereSearchCriteria($folder, 'SINCE', Carbon::now()->subDays(1), true); - } - - /** - * Assert where search criteria - * @param Folder $folder - * @param string $criteria - * @param string|Carbon|null $value - * @param bool $date - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidWhereQueryCriteriaException - * @throws ResponseException - * @throws RuntimeException - */ - protected function assertWhereSearchCriteria(Folder $folder, string $criteria, Carbon|string|null $value = null, bool $date = false): void { - $query = $folder->query()->where($criteria, $value); - self::assertInstanceOf(WhereQuery::class, $query); - - $item = $query->getQuery()->first(); - $criteria = str_replace("CUSTOM ", "", $criteria); - $expected = $value === null ? [$criteria] : [$criteria, $value]; - if ($date === true && $value instanceof Carbon) { - $date_format = $folder->getClient()->getConfig()->get('date_format', 'd M y'); - $expected[1] = $value->format($date_format); - } - - self::assertIsArray($item); - self::assertIsString($item[0]); - if($value !== null) { - self::assertCount(2, $item); - self::assertIsString($item[1]); - }else{ - self::assertCount(1, $item); - } - self::assertSame($expected, $item); - } - - /** - * Assert header search criteria - * @param Folder $folder - * @param string $criteria - * @param mixed|null $value - * - * @return void - * @throws AuthFailedException - * @throws ConnectionFailedException - * @throws ImapBadRequestException - * @throws ImapServerErrorException - * @throws InvalidWhereQueryCriteriaException - * @throws ResponseException - * @throws RuntimeException - */ - protected function assertHeaderSearchCriteria(Folder $folder, string $criteria, mixed $value = null): void { - $query = $folder->query()->whereHeader($criteria, $value); - self::assertInstanceOf(WhereQuery::class, $query); - - $item = $query->getQuery()->first(); - - self::assertIsArray($item); - self::assertIsString($item[0]); - self::assertCount(1, $item); - self::assertSame(['HEADER '.$criteria.' '.$value], $item); - } -} \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/messages/1366671050@github.com.eml b/plugins/vendor/webklex/php-imap/tests/messages/1366671050@github.com.eml deleted file mode 100644 index 97cb7ad1..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/1366671050@github.com.eml +++ /dev/null @@ -1,108 +0,0 @@ -Return-Path: -Delivered-To: someone@domain.tld -Received: from mx.domain.tld - by localhost with LMTP - id SABVMNfGqWP+PAAA0J78UA - (envelope-from ) - for ; Mon, 26 Dec 2022 17:07:51 +0100 -Received: from localhost (localhost [127.0.0.1]) - by mx.domain.tld (Postfix) with ESMTP id C3828140227 - for ; Mon, 26 Dec 2022 17:07:51 +0100 (CET) -X-Virus-Scanned: Debian amavisd-new at mx.domain.tld -X-Spam-Flag: NO -X-Spam-Score: -4.299 -X-Spam-Level: -X-Spam-Status: No, score=-4.299 required=6.31 tests=[BAYES_00=-1.9, - DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, - DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, HTML_IMAGE_ONLY_16=1.092, - HTML_MESSAGE=0.001, MAILING_LIST_MULTI=-1, RCVD_IN_DNSWL_MED=-2.3, - RCVD_IN_MSPIKE_H2=-0.001, T_KAM_HTML_FONT_INVALID=0.01] - autolearn=ham autolearn_force=no -Received: from mx.domain.tld ([127.0.0.1]) - by localhost (mx.domain.tld [127.0.0.1]) (amavisd-new, port 10024) - with ESMTP id JcIS9RuNBTNx for ; - Mon, 26 Dec 2022 17:07:21 +0100 (CET) -Received: from smtp.github.com (out-26.smtp.github.com [192.30.252.209]) - (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) - (No client certificate requested) - by mx.domain.tld (Postfix) with ESMTPS id 6410B13FEB2 - for ; Mon, 26 Dec 2022 17:07:21 +0100 (CET) -Received: from github-lowworker-891b8d2.va3-iad.github.net (github-lowworker-891b8d2.va3-iad.github.net [10.48.109.104]) - by smtp.github.com (Postfix) with ESMTP id 176985E0200 - for ; Mon, 26 Dec 2022 08:07:14 -0800 (PST) -DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=github.com; - s=pf2014; t=1672070834; - bh=v91TPiLpM/cpUb4lgt2NMIUfM4HOIxCEWMR1+JTco+Q=; - h=Date:From:Reply-To:To:Cc:In-Reply-To:References:Subject:List-ID: - List-Archive:List-Post:List-Unsubscribe:From; - b=jW4Tac9IjWAPbEImyiYf1bzGLzY3ceohVbBg1V8BlpMTQ+o+yY3YB0eOe20hAsqZR - jrDjArx7rKQcslqBFL/b2B1C51rHuCBrz2cccLEERu9l/u0mTGCxTNtCRXHbCKbnR1 - VLWBeFLjATHth83kK6Kt7lkVuty+G3V1B6ZKPhCI= -Date: Mon, 26 Dec 2022 08:07:14 -0800 -From: Username -Reply-To: Webklex/php-imap -To: Webklex/php-imap -Cc: Subscribed -Message-ID: -In-Reply-To: -References: -Subject: Re: [Webklex/php-imap] Read all folders? (Issue #349) -Mime-Version: 1.0 -Content-Type: multipart/alternative; - boundary="--==_mimepart_63a9c6b293fe_65b5c71014155a"; - charset=UTF-8 -Content-Transfer-Encoding: 7bit -Precedence: list -X-GitHub-Sender: consigliere23 -X-GitHub-Recipient: Webklex -X-GitHub-Reason: subscribed -List-ID: Webklex/php-imap -List-Archive: https://github.com/Webklex/php-imap -List-Post: -List-Unsubscribe: , - -X-Auto-Response-Suppress: All -X-GitHub-Recipient-Address: someone@domain.tld - - -----==_mimepart_63a9c6b293fe_65b5c71014155a -Content-Type: text/plain; - charset=UTF-8 -Content-Transfer-Encoding: 7bit - -Any updates? - --- -Reply to this email directly or view it on GitHub: -https://github.com/Webklex/php-imap/issues/349#issuecomment-1365266070 -You are receiving this because you are subscribed to this thread. - -Message ID: -----==_mimepart_63a9c6b293fe_65b5c71014155a -Content-Type: text/html; - charset=UTF-8 -Content-Transfer-Encoding: 7bit - -

-

Any updates?

- -


Reply to this email directly, view it on GitHub, or unsubscribe.
You are receiving this because you are subscribed to this thread.Message ID: <Webklex/php-imap/issues/349/1365266070@github.com>

- -----==_mimepart_63a9c6b293fe_65b5c71014155a-- diff --git a/plugins/vendor/webklex/php-imap/tests/messages/attachment_encoded_filename.eml b/plugins/vendor/webklex/php-imap/tests/messages/attachment_encoded_filename.eml deleted file mode 100644 index 231d0452..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/attachment_encoded_filename.eml +++ /dev/null @@ -1,10 +0,0 @@ -Content-Type: multipart/mixed; - boundary="BOUNDARY" - ---BOUNDARY -Content-Type: application/vnd.ms-excel; name="=?UTF-8?Q?Prost=C5=99eno=5F2014=5Fposledn=C3=AD_voln=C3=A9_term=C3=ADny.xls?="; charset="UTF-8" -Content-Transfer-Encoding: base64 -Content-Disposition: attachment; filename="=?UTF-8?Q?Prost=C5=99eno=5F2014=5Fposledn=C3=AD_voln=C3=A9_term=C3=ADny.xls?=" - -0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAPgADAP7/CQAGAAAAAAAAAAAAAAACAAAAwgAAAAAA -AAAAEAAA/v///wAAAAD+////AAAAAMAAAADBAAAA//////////////////////////////// diff --git a/plugins/vendor/webklex/php-imap/tests/messages/attachment_long_filename.eml b/plugins/vendor/webklex/php-imap/tests/messages/attachment_long_filename.eml deleted file mode 100644 index 8630280f..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/attachment_long_filename.eml +++ /dev/null @@ -1,55 +0,0 @@ -Content-Type: multipart/mixed; - boundary="BOUNDARY" - ---BOUNDARY -Content-Type: text/plain; - name*0*=utf-8''Buchungsbest%C3%A4tigung-%20Rechnung-Gesch%C3%A4ftsbedingung; - name*1*=en-Nr.B123-45%20-%20XXXX%20xxxxxxxxxxxxxxxxx%20XxxX%2C%20L%C3%BCd; - name*2*=xxxxxxxx%20-%20VM%20Klaus%20XXXXXX%20-%20xxxxxxxx.pdf -Content-Disposition: attachment; - filename*0*=utf-8''Buchungsbest%C3%A4tigung-%20Rechnung-Gesch%C3%A4ftsbedin; - filename*1*=gungen-Nr.B123-45%20-%20XXXXX%20xxxxxxxxxxxxxxxxx%20XxxX%2C; - filename*2*=%20L%C3%BCxxxxxxxxxx%20-%20VM%20Klaus%20XXXXXX%20-%20xxxxxxxx.p; - filename*3*=df -Content-Transfer-Encoding: base64 - -SGkh ---BOUNDARY -Content-Type: text/plain; charset=UTF-8; - name="=?UTF-8?B?MDFfQeKCrMOgw6TEhdCx2YrYr0BaLTAxMjM0NTY3ODktcXdlcnR5dWlv?= - =?UTF-8?Q?pasdfghjklzxcvbnmopqrstuvz-0123456789-qwertyuiopasdfghjklzx?= - =?UTF-8?Q?cvbnmopqrstuvz-0123456789-qwertyuiopasdfghjklzxcvbnmopqrstu?= - =?UTF-8?Q?vz.txt?=" -Content-Transfer-Encoding: base64 -Content-Disposition: attachment; - filename*0*=iso-8859-15''%30%31%5F%41%A4%E0%E4%3F%3F%3F%3F%40%5A%2D%30%31; - filename*1*=%32%33%34%35%36%37%38%39%2D%71%77%65%72%74%79%75%69%6F%70%61; - filename*2*=%73%64%66%67%68%6A%6B%6C%7A%78%63%76%62%6E%6D%6F%70%71%72%73; - filename*3*=%74%75%76%7A%2D%30%31%32%33%34%35%36%37%38%39%2D%71%77%65%72; - filename*4*=%74%79%75%69%6F%70%61%73%64%66%67%68%6A%6B%6C%7A%78%63%76%62; - filename*5*=%6E%6D%6F%70%71%72%73%74%75%76%7A%2D%30%31%32%33%34%35%36%37; - filename*6*=%38%39%2D%71%77%65%72%74%79%75%69%6F%70%61%73%64%66%67%68%6A; - filename*7*=%6B%6C%7A%78%63%76%62%6E%6D%6F%70%71%72%73%74%75%76%7A%2E%74; - filename*8*=%78%74 - -SGkh ---BOUNDARY -Content-Type: text/plain; charset=UTF-8; - name="=?UTF-8?B?MDJfQeKCrMOgw6TEhdCx2YrYr0BaLTAxMjM0NTY3ODktcXdlcnR5dWlv?= - =?UTF-8?Q?pasdfghjklzxcvbnmopqrstuvz-0123456789-qwertyuiopasdfghjklzx?= - =?UTF-8?Q?cvbnmopqrstuvz-0123456789-qwertyuiopasdfghjklzxcvbnmopqrstu?= - =?UTF-8?Q?vz.txt?=" -Content-Transfer-Encoding: base64 -Content-Disposition: attachment; - filename*0*=UTF-8''%30%32%5F%41%E2%82%AC%C3%A0%C3%A4%C4%85%D0%B1%D9%8A%D8; - filename*1*=%AF%40%5A%2D%30%31%32%33%34%35%36%37%38%39%2D%71%77%65%72%74; - filename*2*=%79%75%69%6F%70%61%73%64%66%67%68%6A%6B%6C%7A%78%63%76%62%6E; - filename*3*=%6D%6F%70%71%72%73%74%75%76%7A%2D%30%31%32%33%34%35%36%37%38; - filename*4*=%39%2D%71%77%65%72%74%79%75%69%6F%70%61%73%64%66%67%68%6A%6B; - filename*5*=%6C%7A%78%63%76%62%6E%6D%6F%70%71%72%73%74%75%76%7A%2D%30%31; - filename*6*=%32%33%34%35%36%37%38%39%2D%71%77%65%72%74%79%75%69%6F%70%61; - filename*7*=%73%64%66%67%68%6A%6B%6C%7A%78%63%76%62%6E%6D%6F%70%71%72%73; - filename*8*=%74%75%76%7A%2E%74%78%74 - -SGkh ---BOUNDARY-- diff --git a/plugins/vendor/webklex/php-imap/tests/messages/attachment_no_disposition.eml b/plugins/vendor/webklex/php-imap/tests/messages/attachment_no_disposition.eml deleted file mode 100644 index ce0ea3e9..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/attachment_no_disposition.eml +++ /dev/null @@ -1,9 +0,0 @@ -Content-Type: multipart/mixed; - boundary="BOUNDARY" - ---BOUNDARY -Content-Type: application/vnd.ms-excel; name="=?UTF-8?Q?Prost=C5=99eno=5F2014=5Fposledn=C3=AD_voln=C3=A9_term=C3=ADny.xls?="; charset="UTF-8" -Content-Transfer-Encoding: base64 - -0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAPgADAP7/CQAGAAAAAAAAAAAAAAACAAAAwgAAAAAA -AAAAEAAA/v///wAAAAD+////AAAAAMAAAADBAAAA//////////////////////////////// diff --git a/plugins/vendor/webklex/php-imap/tests/messages/bcc.eml b/plugins/vendor/webklex/php-imap/tests/messages/bcc.eml deleted file mode 100644 index 1a6f16a8..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/bcc.eml +++ /dev/null @@ -1,12 +0,0 @@ -Return-Path: -Subject: test -MIME-Version: 1.0 -Content-Type: text/plain -Date: Wed, 27 Sep 2017 12:48:51 +0200 -From: from@there.com -To: to@here.com -Bcc: =?UTF-8?B?QV/igqxAe8OoX1o=?= -Reply-To: reply-to@here.com -Sender: sender@here.com - -Hi! diff --git a/plugins/vendor/webklex/php-imap/tests/messages/boolean_decoded_content.eml b/plugins/vendor/webklex/php-imap/tests/messages/boolean_decoded_content.eml deleted file mode 100644 index 91818038..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/boolean_decoded_content.eml +++ /dev/null @@ -1,31 +0,0 @@ -From: from@there.com -To: to@here.com -Subject: Nuu -Date: Wed, 13 Sep 2017 13:05:45 +0200 -Content-Type: multipart/mixed; boundary="=-vyqYb0SSRwuGFKv/Trdf" - ---=-vyqYb0SSRwuGFKv/Trdf -Content-Type: multipart/alternative; boundary="=-ewUvwipK68Y6itClYNpy" - ---=-ewUvwipK68Y6itClYNpy -Content-Type: text/plain; charset="us-ascii" - -Here is the problem mail - -Body text ---=-ewUvwipK68Y6itClYNpy -Content-Type: text/html; charset="us-ascii" - -Here is the problem mail - -Body text ---=-ewUvwipK68Y6itClYNpy-- - ---=-vyqYb0SSRwuGFKv/Trdf -Content-Type: application/pdf; name="Example Domain.pdf" -Content-Disposition: attachment; filename="Example Domain.pdf" -Content-Transfer-Encoding: base64 - -nnDusSNdG92w6Fuw61fMjAxOF8wMy0xMzMyNTMzMTkzLnBkZg==?= - ---=-vyqYb0SSRwuGFKv/Trdf-- diff --git a/plugins/vendor/webklex/php-imap/tests/messages/date-template.eml b/plugins/vendor/webklex/php-imap/tests/messages/date-template.eml deleted file mode 100644 index 9354fd10..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/date-template.eml +++ /dev/null @@ -1,8 +0,0 @@ -Subject: test -MIME-Version: 1.0 -Content-Type: text/plain -Date: %date_raw_header% -From: from@there.com -To: to@here.com - -Hi! diff --git a/plugins/vendor/webklex/php-imap/tests/messages/email_address.eml b/plugins/vendor/webklex/php-imap/tests/messages/email_address.eml deleted file mode 100644 index 62b76d70..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/email_address.eml +++ /dev/null @@ -1,9 +0,0 @@ -Message-ID: <123@example.com> -From: no_host -Cc: "This one: is \"right\"" , No-address -Content-Type: text/plain; - charset="us-ascii" -Content-Transfer-Encoding: quoted-printable - -Hi -How are you? diff --git a/plugins/vendor/webklex/php-imap/tests/messages/embedded_email.eml b/plugins/vendor/webklex/php-imap/tests/messages/embedded_email.eml deleted file mode 100644 index 293bc28e..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/embedded_email.eml +++ /dev/null @@ -1,63 +0,0 @@ -Return-Path: demo@cerstor.cz -Received: from webmail.my-office.cz (localhost [127.0.0.1]) - by keira.cofis.cz - ; Fri, 29 Jan 2016 14:25:40 +0100 -MIME-Version: 1.0 -Content-Type: multipart/mixed; - boundary="=_5d4b2de51e6aad0435b4bfbd7a23594a" -Date: Fri, 29 Jan 2016 14:25:40 +0100 -From: demo@cerstor.cz -To: demo@cerstor.cz -Subject: embedded message -Message-ID: <7e5798da5747415e5b82fdce042ab2a6@cerstor.cz> -X-Sender: demo@cerstor.cz -User-Agent: Roundcube Webmail/1.0.0 - ---=_5d4b2de51e6aad0435b4bfbd7a23594a -Content-Transfer-Encoding: 7bit -Content-Type: text/plain; charset=US-ASCII; - format=flowed - -email that contains embedded message ---=_5d4b2de51e6aad0435b4bfbd7a23594a -Content-Transfer-Encoding: 8bit -Content-Type: message/rfc822; - name=demo.eml -Content-Disposition: attachment; - filename=demo.eml; - size=889 - -Return-Path: demo@cerstor.cz -Received: from webmail.my-office.cz (localhost [127.0.0.1]) - by keira.cofis.cz - ; Fri, 29 Jan 2016 14:22:13 +0100 -MIME-Version: 1.0 -Content-Type: multipart/mixed; - boundary="=_995890bdbf8bd158f2cbae0e8d966000" -Date: Fri, 29 Jan 2016 14:22:13 +0100 -From: demo-from@cerstor.cz -To: demo-to@cerstor.cz -Subject: demo -Message-ID: <4cbaf57cb00891c53b32e1d63367740c@cerstor.cz> -X-Sender: demo@cerstor.cz -User-Agent: Roundcube Webmail/1.0.0 - ---=_995890bdbf8bd158f2cbae0e8d966000 -Content-Transfer-Encoding: 7bit -Content-Type: text/plain; charset=US-ASCII; - format=flowed - -demo text ---=_995890bdbf8bd158f2cbae0e8d966000 -Content-Transfer-Encoding: base64 -Content-Type: text/plain; - name=testfile.txt -Content-Disposition: attachment; - filename=testfile.txt; - size=29 - -IHRoaXMgaXMgY29udGVudCBvZiB0ZXN0IGZpbGU= ---=_995890bdbf8bd158f2cbae0e8d966000-- - - ---=_5d4b2de51e6aad0435b4bfbd7a23594a-- diff --git a/plugins/vendor/webklex/php-imap/tests/messages/embedded_email_without_content_disposition-embedded.eml b/plugins/vendor/webklex/php-imap/tests/messages/embedded_email_without_content_disposition-embedded.eml deleted file mode 100644 index df5fa40b..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/embedded_email_without_content_disposition-embedded.eml +++ /dev/null @@ -1,61 +0,0 @@ -Received: from webmail.my-office.cz (localhost [127.0.0.1]) - by keira.cofis.cz - ; Fri, 29 Jan 2016 14:25:40 +0100 -From: demo@cerstor.cz -To: demo@cerstor.cz -Date: Fri, 5 Apr 2019 12:10:49 +0200 -Subject: embedded_message_subject -Message-ID: -Accept-Language: pl-PL, nl-NL -Content-Language: pl-PL -Content-Type: multipart/mixed; - boundary="_005_AC39946EBF5C034B87BABD5343E96979012671D40E38VM002emonsn_" -MIME-Version: 1.0 - ---_005_AC39946EBF5C034B87BABD5343E96979012671D40E38VM002emonsn_ -Content-Type: multipart/alternative; - boundary="_000_AC39946EBF5C034B87BABD5343E96979012671D40E38VM002emonsn_" - ---_000_AC39946EBF5C034B87BABD5343E96979012671D40E38VM002emonsn_ -Content-Type: text/plain; charset="iso-8859-2" -Content-Transfer-Encoding: quoted-printable - -some txt - - - - - ---_000_AC39946EBF5C034B87BABD5343E96979012671D40E38VM002emonsn_ -Content-Type: text/html; charset="iso-8859-2" -Content-Transfer-Encoding: quoted-printable - - -

some txt

- - ---_000_AC39946EBF5C034B87BABD5343E96979012671D40E38VM002emonsn_-- - ---_005_AC39946EBF5C034B87BABD5343E96979012671D40E38VM002emonsn_ -Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet; - name="file1.xlsx" -Content-Description: file1.xlsx -Content-Disposition: attachment; filename="file1.xlsx"; size=29; - creation-date="Fri, 05 Apr 2019 10:06:01 GMT"; - modification-date="Fri, 05 Apr 2019 10:10:49 GMT" -Content-Transfer-Encoding: base64 - -IHRoaXMgaXMgY29udGVudCBvZiB0ZXN0IGZpbGU= - ---_005_AC39946EBF5C034B87BABD5343E96979012671D40E38VM002emonsn_ -Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet; - name="file2.xlsx" -Content-Description: file2 -Content-Disposition: attachment; filename="file2.xlsx"; size=29; - creation-date="Fri, 05 Apr 2019 10:10:19 GMT"; - modification-date="Wed, 03 Apr 2019 11:04:32 GMT" -Content-Transfer-Encoding: base64 - -IHRoaXMgaXMgY29udGVudCBvZiB0ZXN0IGZpbGU= - ---_005_AC39946EBF5C034B87BABD5343E96979012671D40E38VM002emonsn_-- diff --git a/plugins/vendor/webklex/php-imap/tests/messages/embedded_email_without_content_disposition.eml b/plugins/vendor/webklex/php-imap/tests/messages/embedded_email_without_content_disposition.eml deleted file mode 100644 index c5c8cffe..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/embedded_email_without_content_disposition.eml +++ /dev/null @@ -1,141 +0,0 @@ -Return-Path: demo@cerstor.cz -Received: from webmail.my-office.cz (localhost [127.0.0.1]) - by keira.cofis.cz - ; Fri, 29 Jan 2016 14:25:40 +0100 -From: demo@cerstor.cz -To: demo@cerstor.cz -Date: Fri, 5 Apr 2019 13:48:50 +0200 -Subject: Subject -Message-ID: -Accept-Language: pl-PL, nl-NL -Content-Type: multipart/mixed; - boundary="_008_AC39946EBF5C034B87BABD5343E96979012671D9F7E4VM002emonsn_" -MIME-Version: 1.0 - ---_008_AC39946EBF5C034B87BABD5343E96979012671D9F7E4VM002emonsn_ -Content-Type: multipart/related; - boundary="_007_AC39946EBF5C034B87BABD5343E96979012671D9F7E4VM002emonsn_"; - type="multipart/alternative" - ---_007_AC39946EBF5C034B87BABD5343E96979012671D9F7E4VM002emonsn_ -Content-Type: multipart/alternative; - boundary="_000_AC39946EBF5C034B87BABD5343E96979012671D9F7E4VM002emonsn_" - ---_000_AC39946EBF5C034B87BABD5343E96979012671D9F7E4VM002emonsn_ -Content-Type: text/plain; charset="iso-8859-2" -Content-Transfer-Encoding: quoted-printable - -TexT - -[cid:file.jpg] - ---_000_AC39946EBF5C034B87BABD5343E96979012671D9F7E4VM002emonsn_ -Content-Type: text/html; charset="iso-8859-2" -Content-Transfer-Encoding: quoted-printable - -

TexT

= - ---_000_AC39946EBF5C034B87BABD5343E96979012671D9F7E4VM002emonsn_-- - ---_007_AC39946EBF5C034B87BABD5343E96979012671D9F7E4VM002emonsn_ -Content-Type: image/jpeg; name= - "file.jpg" -Content-Description: file.jpg -Content-Disposition: inline; filename= - "file.jpg"; - size=54558; creation-date="Fri, 05 Apr 2019 11:48:58 GMT"; - modification-date="Fri, 05 Apr 2019 11:48:58 GMT" -Content-ID: -Content-Transfer-Encoding: base64 - -iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg== - ---_007_AC39946EBF5C034B87BABD5343E96979012671D9F7E4VM002emonsn_-- - ---_008_AC39946EBF5C034B87BABD5343E96979012671D9F7E4VM002emonsn_ -Content-Type: message/rfc822 - -Received: from webmail.my-office.cz (localhost [127.0.0.1]) - by keira.cofis.cz - ; Fri, 29 Jan 2016 14:25:40 +0100 -From: demo@cerstor.cz -To: demo@cerstor.cz -Date: Fri, 5 Apr 2019 12:10:49 +0200 -Subject: embedded_message_subject -Message-ID: -Accept-Language: pl-PL, nl-NL -Content-Language: pl-PL -Content-Type: multipart/mixed; - boundary="_005_AC39946EBF5C034B87BABD5343E96979012671D40E38VM002emonsn_" -MIME-Version: 1.0 - ---_005_AC39946EBF5C034B87BABD5343E96979012671D40E38VM002emonsn_ -Content-Type: multipart/alternative; - boundary="_000_AC39946EBF5C034B87BABD5343E96979012671D40E38VM002emonsn_" - ---_000_AC39946EBF5C034B87BABD5343E96979012671D40E38VM002emonsn_ -Content-Type: text/plain; charset="iso-8859-2" -Content-Transfer-Encoding: quoted-printable - -some txt - - - - - ---_000_AC39946EBF5C034B87BABD5343E96979012671D40E38VM002emonsn_ -Content-Type: text/html; charset="iso-8859-2" -Content-Transfer-Encoding: quoted-printable - - -

some txt

- - ---_000_AC39946EBF5C034B87BABD5343E96979012671D40E38VM002emonsn_-- - ---_005_AC39946EBF5C034B87BABD5343E96979012671D40E38VM002emonsn_ -Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet; - name="file1.xlsx" -Content-Description: file1.xlsx -Content-Disposition: attachment; filename="file1.xlsx"; size=29; - creation-date="Fri, 05 Apr 2019 10:06:01 GMT"; - modification-date="Fri, 05 Apr 2019 10:10:49 GMT" -Content-Transfer-Encoding: base64 - -IHRoaXMgaXMgY29udGVudCBvZiB0ZXN0IGZpbGU= - ---_005_AC39946EBF5C034B87BABD5343E96979012671D40E38VM002emonsn_ -Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet; - name="file2.xlsx" -Content-Description: file2 -Content-Disposition: attachment; filename="file2.xlsx"; size=29; - creation-date="Fri, 05 Apr 2019 10:10:19 GMT"; - modification-date="Wed, 03 Apr 2019 11:04:32 GMT" -Content-Transfer-Encoding: base64 - -IHRoaXMgaXMgY29udGVudCBvZiB0ZXN0IGZpbGU= - ---_005_AC39946EBF5C034B87BABD5343E96979012671D40E38VM002emonsn_-- - ---_008_AC39946EBF5C034B87BABD5343E96979012671D9F7E4VM002emonsn_ -Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet; - name="file3.xlsx" -Content-Description: file3.xlsx -Content-Disposition: attachment; filename="file3.xlsx"; - size=90672; creation-date="Fri, 05 Apr 2019 11:46:30 GMT"; - modification-date="Thu, 28 Mar 2019 08:07:58 GMT" -Content-Transfer-Encoding: base64 - -IHRoaXMgaXMgY29udGVudCBvZiB0ZXN0IGZpbGU= - ---_008_AC39946EBF5C034B87BABD5343E96979012671D9F7E4VM002emonsn_ -Content-Type: application/x-zip-compressed; name="file4.zip" -Content-Description: file4.zip -Content-Disposition: attachment; filename="file4.zip"; size=29; - creation-date="Fri, 05 Apr 2019 11:48:45 GMT"; - modification-date="Fri, 05 Apr 2019 11:35:24 GMT" -Content-Transfer-Encoding: base64 - -IHRoaXMgaXMgY29udGVudCBvZiB0ZXN0IGZpbGU= - ---_008_AC39946EBF5C034B87BABD5343E96979012671D9F7E4VM002emonsn_-- diff --git a/plugins/vendor/webklex/php-imap/tests/messages/example_attachment.eml b/plugins/vendor/webklex/php-imap/tests/messages/example_attachment.eml deleted file mode 100644 index 3e929a34..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/example_attachment.eml +++ /dev/null @@ -1,56 +0,0 @@ -Return-Path: -Delivered-To: -Received: from mx.domain.tld - by localhost (Dovecot) with LMTP id T7mwLn3ddlvKWwAA0J78UA - for ; Fri, 17 Aug 2018 16:36:45 +0200 -Received: from localhost (localhost [127.0.0.1]) - by mx.domain.tld (Postfix) with ESMTP id B642913BA0BE2 - for ; Fri, 17 Aug 2018 16:36:45 +0200 (CEST) -X-Virus-Scanned: Debian amavisd-new at mx.domain.tld -X-Spam-Flag: NO -X-Spam-Score: 1.103 -X-Spam-Level: * -X-Spam-Status: No, score=1.103 required=6.31 tests=[ALL_TRUSTED=-1, - OBFU_TEXT_ATTACH=1, TRACKER_ID=1.102, TVD_SPACE_RATIO=0.001] - autolearn=no autolearn_force=no -Received: from mx.domain.tld ([127.0.0.1]) - by localhost (mx.domain.tld [127.0.0.1]) (amavisd-new, port 10024) - with ESMTP id L8E9vyX80d44 for ; - Fri, 17 Aug 2018 16:36:39 +0200 (CEST) -Received: from [127.0.0.1] (ip.dynamic.domain.tld [192.168.0.24]) - (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) - (No client certificate requested) - by mx.domain.tld (Postfix) with ESMTPSA id EF01E13BA0BD7 - for ; Fri, 17 Aug 2018 16:36:38 +0200 (CEST) -Sender: testsender -Message-ID: -Date: Fri, 17 Aug 2018 14:36:24 +0000 -Subject: ogqMVHhz7swLaq2PfSWsZj0k99w8wtMbrb4RuHdNg53i76B7icIIM0zIWpwGFtnk -From: testfrom -Reply-To: testreply_to -To: testnameto -Cc: testnamecc -MIME-Version: 1.0 -Content-Type: multipart/mixed; - boundary="_=_swift_v4_1534516584_32c032a3715d2dfd5cd84c26f84dba8d_=_" -X-Priority: 1 (Highest) - - - - ---_=_swift_v4_1534516584_32c032a3715d2dfd5cd84c26f84dba8d_=_ -Content-Type: text/plain; charset=utf-8 -Content-Transfer-Encoding: quoted-printable - -n1IaXFkbeqKyg4lYToaJ3u1Ond2EDrN3UWuiLFNjOLJEAabSYagYQaOHtV5QDlZE - ---_=_swift_v4_1534516584_32c032a3715d2dfd5cd84c26f84dba8d_=_ -Content-Type: application/octet-stream; name=6mfFxiU5Yhv9WYJx.txt -Content-Transfer-Encoding: base64 -Content-Disposition: attachment; filename=6mfFxiU5Yhv9WYJx.txt - -em5rNTUxTVAzVFAzV1BwOUtsMWduTEVycldFZ2tKRkF0dmFLcWtUZ3JrM2RLSThkWDM4WVQ4QmFW -eFJjT0VSTg== - ---_=_swift_v4_1534516584_32c032a3715d2dfd5cd84c26f84dba8d_=_-- - diff --git a/plugins/vendor/webklex/php-imap/tests/messages/example_bounce.eml b/plugins/vendor/webklex/php-imap/tests/messages/example_bounce.eml deleted file mode 100644 index a1f5683f..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/example_bounce.eml +++ /dev/null @@ -1,96 +0,0 @@ -Return-Path: <> -Received: from somewhere.your-server.de - by somewhere.your-server.de with LMTP - id 3TP8LrElAGSOaAAAmBr1xw - (envelope-from <>); Thu, 02 Mar 2023 05:27:29 +0100 -Envelope-to: demo@foo.de -Delivery-date: Thu, 02 Mar 2023 05:27:29 +0100 -Authentication-Results: somewhere.your-server.de; - iprev=pass (somewhere06.your-server.de) smtp.remote-ip=1b21:2f8:e0a:50e4::2; - spf=none smtp.mailfrom=<>; - dmarc=skipped -Received: from somewhere06.your-server.de ([1b21:2f8:e0a:50e4::2]) - by somewhere.your-server.de with esmtps (TLS1.3) tls TLS_AES_256_GCM_SHA384 - (Exim 4.94.2) - id 1pXaXR-0006xQ-BN - for demo@foo.de; Thu, 02 Mar 2023 05:27:29 +0100 -Received: from [192.168.0.10] (helo=sslproxy01.your-server.de) - by somewhere06.your-server.de with esmtps (TLSv1.3:TLS_AES_256_GCM_SHA384:256) - (Exim 4.92) - id 1pXaXO-000LYP-9R - for demo@foo.de; Thu, 02 Mar 2023 05:27:26 +0100 -Received: from localhost ([127.0.0.1] helo=sslproxy01.your-server.de) - by sslproxy01.your-server.de with esmtps (TLSv1.3:TLS_AES_256_GCM_SHA384:256) - (Exim 4.92) - id 1pXaXO-0008gy-7x - for demo@foo.de; Thu, 02 Mar 2023 05:27:26 +0100 -Received: from Debian-exim by sslproxy01.your-server.de with local (Exim 4.92) - id 1pXaXO-0008gb-6g - for demo@foo.de; Thu, 02 Mar 2023 05:27:26 +0100 -X-Failed-Recipients: ding@ding.de -Auto-Submitted: auto-replied -From: Mail Delivery System -To: demo@foo.de -Content-Type: multipart/report; report-type=delivery-status; boundary=1677731246-eximdsn-678287796 -MIME-Version: 1.0 -Subject: Mail delivery failed -Message-Id: -Date: Thu, 02 Mar 2023 05:27:26 +0100 -X-Virus-Scanned: Clear (ClamAV 0.103.8/26827/Wed Mar 1 09:28:49 2023) -X-Spam-Score: 0.0 (/) -Delivered-To: bar-demo@foo.de - ---1677731246-eximdsn-678287796 -Content-type: text/plain; charset=us-ascii - -This message was created automatically by mail delivery software. - -A message sent by - - - -could not be delivered to one or more of its recipients. The following -address(es) failed: - - ding@ding.de - host 36.143.65.153 [36.143.65.153] - SMTP error from remote mail server after pipelined end of data: - 550-Verification failed for - 550-Unrouteable address - 550 Sender verify failed - ---1677731246-eximdsn-678287796 -Content-type: message/delivery-status - -Reporting-MTA: dns; sslproxy01.your-server.de - -Action: failed -Final-Recipient: rfc822;ding@ding.de -Status: 5.0.0 -Remote-MTA: dns; 36.143.65.153 -Diagnostic-Code: smtp; 550-Verification failed for - 550-Unrouteable address - 550 Sender verify failed - ---1677731246-eximdsn-678287796 -Content-type: message/rfc822 - -Return-path: -Received: from [31.18.107.47] (helo=127.0.0.1) - by sslproxy01.your-server.de with esmtpsa (TLSv1.3:TLS_AES_256_GCM_SHA384:256) - (Exim 4.92) - (envelope-from ) - id 1pXaXO-0008eK-11 - for ding@ding.de; Thu, 02 Mar 2023 05:27:26 +0100 -Date: Thu, 2 Mar 2023 05:27:25 +0100 -To: ding -From: =?iso-8859-1?Q?S=C3=BCderbar_Foo_=28SI=29_GmbH?= -Subject: Test -Message-ID: -X-Mailer: PHPMailer 6.7.1 (https://github.com/PHPMailer/PHPMailer) -Return-Path: bounce@foo.de -MIME-Version: 1.0 -Content-Type: text/html; charset=iso-8859-1 -X-Authenticated-Sender: demo@foo.de - -
Hallo, dies ist ein Beispiel-Text.
\ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/messages/four_nested_emails.eml b/plugins/vendor/webklex/php-imap/tests/messages/four_nested_emails.eml deleted file mode 100644 index 0b34e986..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/four_nested_emails.eml +++ /dev/null @@ -1,69 +0,0 @@ -To: test@example.com -From: test@example.com -Subject: 3-third-subject -Content-Type: multipart/mixed; - boundary="------------2E5D78A17C812FEFF825F7D5" - -This is a multi-part message in MIME format. ---------------2E5D78A17C812FEFF825F7D5 -Content-Type: text/plain; charset=iso-8859-15; format=flowed -Content-Transfer-Encoding: 7bit - -3-third-content ---------------2E5D78A17C812FEFF825F7D5 -Content-Type: message/rfc822; - name="2-second-email.eml" -Content-Transfer-Encoding: 7bit -Content-Disposition: attachment; - filename="2-second-email.eml" - -To: test@example.com -From: test@example.com -Subject: 2-second-subject -Content-Type: multipart/mixed; - boundary="------------9919377E37A03209B057D47F" - -This is a multi-part message in MIME format. ---------------9919377E37A03209B057D47F -Content-Type: text/plain; charset=iso-8859-15; format=flowed -Content-Transfer-Encoding: 7bit - -2-second-content ---------------9919377E37A03209B057D47F -Content-Type: message/rfc822; - name="1-first-email.eml" -Content-Transfer-Encoding: 7bit -Content-Disposition: attachment; - filename="1-first-email.eml" - -To: test@example.com -From: test@example.com -Subject: 1-first-subject -Content-Type: multipart/mixed; - boundary="------------0919377E37A03209B057D47A" - -This is a multi-part message in MIME format. ---------------0919377E37A03209B057D47A -Content-Type: text/plain; charset=iso-8859-15; format=flowed -Content-Transfer-Encoding: 7bit - -1-first-content ---------------0919377E37A03209B057D47A -Content-Type: message/rfc822; - name="0-zero-email.eml" -Content-Transfer-Encoding: 7bit -Content-Disposition: attachment; - filename="0-zero-email.eml" - -To: test@example.com -From: test@example.com -Subject: 0-zero-subject -Content-Type: text/plain; charset=iso-8859-15; format=flowed -Content-Transfer-Encoding: 7bit - -0-zero-content ---------------0919377E37A03209B057D47A-- - ---------------9919377E37A03209B057D47F-- - ---------------2E5D78A17C812FEFF825F7D5-- diff --git a/plugins/vendor/webklex/php-imap/tests/messages/gbk_charset.eml b/plugins/vendor/webklex/php-imap/tests/messages/gbk_charset.eml deleted file mode 100644 index b40936bd..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/gbk_charset.eml +++ /dev/null @@ -1,9 +0,0 @@ -From: from@there.com -To: to@here.com -Subject: Nuu -Date: Wed, 13 Sep 2017 13:05:45 +0200 -Content-Type: text/plain; - charset="X-GBK" -Content-Transfer-Encoding: quoted-printable - -Hi diff --git a/plugins/vendor/webklex/php-imap/tests/messages/html_only.eml b/plugins/vendor/webklex/php-imap/tests/messages/html_only.eml deleted file mode 100644 index ce3ee17c..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/html_only.eml +++ /dev/null @@ -1,9 +0,0 @@ -From: from@there.com -To: to@here.com -Subject: Nuu -Date: Wed, 13 Sep 2017 13:05:45 +0200 -Content-Type: text/html; - charset="us-ascii" -Content-Transfer-Encoding: quoted-printable - -Hi \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/messages/imap_mime_header_decode_returns_false.eml b/plugins/vendor/webklex/php-imap/tests/messages/imap_mime_header_decode_returns_false.eml deleted file mode 100644 index af3a7f36..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/imap_mime_header_decode_returns_false.eml +++ /dev/null @@ -1,9 +0,0 @@ -From: from@there.com -To: to@here.com -Subject: =?UTF-8?B?nnDusSNdG92w6Fuw61fMjAxOF8wMy0xMzMyNTMzMTkzLnBkZg==?= -Date: Wed, 13 Sep 2017 13:05:45 +0200 -Content-Type: text/plain; - charset="us-ascii" -Content-Transfer-Encoding: quoted-printable - -Hi diff --git a/plugins/vendor/webklex/php-imap/tests/messages/inline_attachment.eml b/plugins/vendor/webklex/php-imap/tests/messages/inline_attachment.eml deleted file mode 100644 index be60f598..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/inline_attachment.eml +++ /dev/null @@ -1,41 +0,0 @@ -Content-Type: multipart/mixed; - boundary="----=_Part_1114403_1160068121.1505882828080" - -------=_Part_1114403_1160068121.1505882828080 -Content-Type: multipart/related; - boundary="----=_Part_1114404_576719783.1505882828080" - -------=_Part_1114404_576719783.1505882828080 -Content-Type: text/html;charset=UTF-8 -Content-Transfer-Encoding: quoted-printable - - -------=_Part_1114404_576719783.1505882828080 -Content-Type: image/png -Content-Disposition: inline -Content-Transfer-Encoding: base64 -Content-ID: - -iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAMAAADXqc3KAAAB+FBMVEUAAAA/mUPidDHiLi5Cn0Xk -NTPmeUrkdUg/m0Q0pEfcpSbwaVdKskg+lUP4zA/iLi3msSHkOjVAmETdJSjtYFE/lkPnRj3sWUs8 -kkLeqCVIq0fxvhXqUkbVmSjwa1n1yBLepyX1xxP0xRXqUkboST9KukpHpUbuvRrzrhF/ljbwalju -ZFM4jELaoSdLtElJrUj1xxP6zwzfqSU4i0HYnydMtUlIqUfywxb60AxZqEXaoifgMCXptR9MtklH -pEY2iUHWnSjvvRr70QujkC+pUC/90glMuEnlOjVMt0j70QriLS1LtEnnRj3qUUXfIidOjsxAhcZF -o0bjNDH0xxNLr0dIrUdmntVTkMoyfL8jcLBRuErhJyrgKyb4zA/5zg3tYFBBmUTmQTnhMinruBzv -vhnxwxZ/st+Ktt5zp9hqota2vtK6y9FemNBblc9HiMiTtMbFtsM6gcPV2r6dwroseLrMrbQrdLGd -yKoobKbo3Zh+ynrgVllZulTsXE3rV0pIqUf42UVUo0JyjEHoS0HmsiHRGR/lmRz/1hjqnxjvpRWf -wtOhusaz0LRGf7FEfbDVmqHXlJeW0pbXq5bec3fX0nTnzmuJuWvhoFFhm0FtrziBsjaAaDCYWC+u -Si6jQS3FsSfLJiTirCOkuCG1KiG+wSC+GBvgyhTszQ64Z77KAAAARXRSTlMAIQRDLyUgCwsE6ebm -5ubg2dLR0byXl4FDQzU1NDEuLSUgC+vr6urq6ubb29vb2tra2tG8vLu7u7uXl5eXgYGBgYGBLiUA -LabIAAABsElEQVQoz12S9VPjQBxHt8VaOA6HE+AOzv1wd7pJk5I2adpCC7RUcHd3d3fXf5PvLkxh -eD++z+yb7GSRlwD/+Hj/APQCZWxM5M+goF+RMbHK594v+tPoiN1uHxkt+xzt9+R9wnRTZZQpXQ0T -5uP1IQxToyOAZiQu5HEpjeA4SWIoksRxNiGC1tRZJ4LNxgHgnU5nJZBDvuDdl8lzQRBsQ+s9PZt7 -s7Pz8wsL39/DkIfZ4xlB2Gqsq62ta9oxVlVrNZpihFRpGO9fzQw1ms0NDWZz07iGkJmIFH8xxkc3 -a/WWlubmFkv9AB2SEpDvKxbjidN2faseaNV3zoHXvv7wMODJdkOHAegweAfFPx4G67KluxzottCU -9n8CUqXzcIQdXOytAHqXxomvykhEKN9EFutG22p//0rbNvHVxiJywa8yS2KDfV1dfbu31H8jF1RH -iTKtWYeHxUvq3bn0pyjCRaiRU6aDO+gb3aEfEeVNsDgm8zzLy9egPa7Qt8TSJdwhjplk06HH43ZN -J3s91KKCHQ5x4sw1fRGYDZ0n1L4FKb9/BP5JLYxToheoFCVxz57PPS8UhhEpLBVeAAAAAElFTkSu -QmCC -------=_Part_1114404_576719783.1505882828080-- - -------=_Part_1114403_1160068121.1505882828080-- diff --git a/plugins/vendor/webklex/php-imap/tests/messages/issue-275-2.eml b/plugins/vendor/webklex/php-imap/tests/messages/issue-275-2.eml deleted file mode 100644 index d80e66ed..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/issue-275-2.eml +++ /dev/null @@ -1,123 +0,0 @@ -Received: from AS4PR02MB8234.eurprd02.prod.outlook.com (2603:10a6:20b:4f1::17) - by PA4PR02MB7071.eurprd02.prod.outlook.com with HTTPS; Wed, 18 Jan 2023 - 09:17:10 +0000 -Received: from AS1PR02MB7917.eurprd02.prod.outlook.com (2603:10a6:20b:4a5::5) - by AS4PR02MB8234.eurprd02.prod.outlook.com (2603:10a6:20b:4f1::17) with - Microsoft SMTP Server (version=TLS1_2, - cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5986.19; Wed, 18 Jan - 2023 09:17:09 +0000 -Received: from AS1PR02MB7917.eurprd02.prod.outlook.com - ([fe80::4871:bdde:a499:c0d9]) by AS1PR02MB7917.eurprd02.prod.outlook.com - ([fe80::4871:bdde:a499:c0d9%9]) with mapi id 15.20.5986.023; Wed, 18 Jan 2023 - 09:17:09 +0000 -From: =?iso-8859-1?Q?Martin_B=FClow_Larsen?= -To: Cofman Drift -Subject: Test 1017 -Thread-Topic: Test 1017 -Thread-Index: AdkrHaKsy+bUiL/eTIS5W3AP+zzLjQ== -Date: Wed, 18 Jan 2023 09:17:09 +0000 -Message-ID: - -Accept-Language: da-DK, en-US -Content-Language: en-US -X-MS-Exchange-Organization-AuthAs: Internal -X-MS-Exchange-Organization-AuthMechanism: 04 -X-MS-Exchange-Organization-AuthSource: AS1PR02MB7917.eurprd02.prod.outlook.com -X-MS-Has-Attach: -X-MS-Exchange-Organization-Network-Message-Id: - 98cea1c9-a497-454a-6606-08daf934c6c4 -X-MS-Exchange-Organization-SCL: -1 -X-MS-TNEF-Correlator: -X-MS-Exchange-Organization-RecordReviewCfmType: 0 -x-ms-publictraffictype: Email -X-Microsoft-Antispam-Mailbox-Delivery: - ucf:0;jmr:0;auth:0;dest:I;ENG:(910001)(944506478)(944626604)(920097)(425001)(930097); -X-Microsoft-Antispam-Message-Info: - BzqL6hvPyQW0lSkWGop6vQlsIZK48umY74vuKlNgF0pb/H659W+0fuTB+6guqGM0oof00mlzu3gn1pu1R5pUOE2Fb58OqnBEFkB30vVrG6TNsG/6KBtecXkP3FptqO/WRmsxCQx7bK7J2VyS2SbOibqX8mDZhkTrwP1+IA0R9eD0/NvoMqX9GssewUDxSAbaaKdADCuU1dG7qpF8M9tfLDJz+dUL5qZoO+oGINGLLdo2y6Z/F+h3UWv7BXiS4BJKc+jwAng26BUMKmg2VVRdMvc+LbZTovUr9hyEq1orS9fOg1iIV6sPcyIVl3NIEy5bHMYh1d6sUCqvTO1UPSdf7lIvKxSszyKptIPNgioOvFpF9tTHDyKU5p1IiLm5FxW/+kGdPq6ZoTIZVriJoyjx6gWKpPY3vHN6bHUK9mA+LspIYAeuDFFvwkZx2b2Rtw3S99S7zz3eBqv3xlGqJixx/apl4Af7ZaxKFpMj9XZXAQVIv9BA0tIA+1nLByt4dPW4Xzoj3KcBbX5K/HkuR/30Lrq7gRQQDyNYgf5S/MO2MLJqcvnVFPXgVubK6XFu5quDibsZjPjxOUfBTJkJ/n4gB8Z8/TOM0oKD76hszXXoaWd9leUeQ1x88oy+QuXPRxzuLzVec3GiPNMYA42QvvTiWmrrhdceRzhV0J7pJBbi10ik+hXqSeNkldgktd5cWPss5F74yxAaEaPJO9I7MOUpE0XzlRfljPptykrIQt8SARMllykzJNrDt8VAl37ArEZbWxFLm3RuypOI0zgCZMRLf5JeElpCv1ay4wilz4vsYGr4fs3KUQzI1YY43uaDxNMz8k7dH/UkC9Dfg1oyHlNs+w== -Content-Type: multipart/alternative; - boundary="_000_AS1PR02MB791721260DE0273A15AFEC3EB5C79AS1PR02MB7917eurp_" -MIME-Version: 1.0 - ---_000_AS1PR02MB791721260DE0273A15AFEC3EB5C79AS1PR02MB7917eurp_ -Content-Type: text/plain; charset="iso-8859-1" -Content-Transfer-Encoding: quoted-printable - -Test - -Med venlig hilsen -Martin Larsen -Feline Holidays A/S -Tlf 78 77 04 12 - - - ---_000_AS1PR02MB791721260DE0273A15AFEC3EB5C79AS1PR02MB7917eurp_ -Content-Type: text/html; charset="iso-8859-1" -Content-Transfer-Encoding: quoted-printable - - - - - - - - -
-

Test

-

 

-

= -Med venlig hilsen

-

Martin Larsen

-

Feline Holidays A/S

-

Tlf 78 77 04 12

-

 

-

 

-
- - - ---_000_AS1PR02MB791721260DE0273A15AFEC3EB5C79AS1PR02MB7917eurp_-- diff --git a/plugins/vendor/webklex/php-imap/tests/messages/issue-275.eml b/plugins/vendor/webklex/php-imap/tests/messages/issue-275.eml deleted file mode 100644 index 642d6a42..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/issue-275.eml +++ /dev/null @@ -1,208 +0,0 @@ -Received: from FR0P281MB2649.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:50::12) - by BEZP281MB2374.DEUP281.PROD.OUTLOOK.COM with HTTPS; Tue, 17 Jan 2023 - 09:25:19 +0000 -Received: from DB6P191CA0002.EURP191.PROD.OUTLOOK.COM (2603:10a6:6:28::12) by - FR0P281MB2649.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:50::12) with Microsoft - SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id - 15.20.5986.23; Tue, 17 Jan 2023 09:25:18 +0000 -Received: from DB5EUR02FT011.eop-EUR02.prod.protection.outlook.com - (2603:10a6:6:28:cafe::3b) by DB6P191CA0002.outlook.office365.com - (2603:10a6:6:28::12) with Microsoft SMTP Server (version=TLS1_2, - cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6002.19 via Frontend - Transport; Tue, 17 Jan 2023 09:25:18 +0000 -Authentication-Results: spf=pass (sender IP is 80.241.56.171) - smtp.mailfrom=*****; dkim=pass (signature was verified) - header.d=jankoppe.de;dmarc=pass action=none - header.from=jankoppe.de;compauth=pass reason=100 -Received-SPF: Pass (protection.outlook.com: domain of **** designates - 80.241.56.171 as permitted sender) receiver=protection.outlook.com; - client-ip=80.241.56.171; helo=mout-p-201.mailbox.org; pr=C -Received: from **** - DB5EUR02FT011.mail.protection.outlook.com (10.13.58.70) with Microsoft SMTP - Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id - 15.20.6002.13 via Frontend Transport; Tue, 17 Jan 2023 09:25:18 +0000 -Received: from **** - (***) with Microsoft SMTP Server (version=TLS1_2, - cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.2375.34; Tue, 17 - Jan 2023 10:25:18 +0100 -Received: from ***** - (***) with Microsoft SMTP Server (version=TLS1_2, - cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2375.34; Tue, 17 Jan - 2023 10:25:16 +0100 -Received: from **** - (***) with Microsoft SMTP Server (version=TLS1_2, - cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.1.2375.34 via Frontend - Transport; Tue, 17 Jan 2023 10:25:16 +0100 -Received: from ***** - (***) with Microsoft SMTP Server (version=TLS1_2, - cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P521) id 15.1.2375.34; Tue, 17 - Jan 2023 10:25:18 +0100 -IronPort-SDR: qF6UeVYj8pb73gXrskSNOtfmUEgr2JLTtqbIK+/6ymuIu+hw8DzzyKrOGqm7zNPwG/4zr+ma5y - XERFv6Zyf/cxrWoVjWXswWrkCVjqQuHglLaONZt1Mg4okFzEByeEZsyg3/3n6kI4O+kgViBgLW - nNMzGlNLSqYBX+EDhOfE1GEWB/4iRbwDY32SnTr5BYqR0HwgHf+0M0E3b23/NqV6iYrF3KETah - cLtLRt/b5JY6f5KvmKoz0Y395r7MwryWR1eLKAU2j3w+ioNYBUw36K/hsIRojcquvQk9w3Qtfu - Yz1BUNwOEOwfxr0VjQScHirO -X-IRON-External-Mail-Tag: Extern -X-IronPort-MID: 60840111 -X-IPAS-Result: =?us-ascii?q?A0G0CQCSaMZjmKs48VBaglqEBz5Fk0mfZoFqEw8BAQEBA?= - =?us-ascii?q?QEBAQEJRAQBAQQDihcCJToEDQECBAEBAQEDAgMBAQEBBQEBAQQBAQECAQEGA?= - =?us-ascii?q?wEBAQIQAQEBAQEBAQEVCRkFDhAFLw1XDV0LgUQLgXQLAzENgjgiggQsgXYnA?= - =?us-ascii?q?QE4hE6DIwetVIEBgggBAQaCY5xECYFBi12ESYEhHD8BgU2EP4VPhXKaXIE7f?= - =?us-ascii?q?IEnDoFIgSk3A0QdQAMLbQpANRZKKxobB4EJKigVAwQEAwIGEwMiAg0oMRQEK?= - =?us-ascii?q?RMNJyZpCQIDImYDAwQoLQkgHwcmJDwHVj0CDx83BgMJAwIhToEgJAUDCxUqR?= - =?us-ascii?q?wQINgUGUhICCA8SDyxDDkI3NBMGgQYLDhEDUIFOBIENfwpXxUKgLYIqgVChG?= - =?us-ascii?q?oNmAZMikiGXS6gMgXwKFoFcTSQUgyJPAQIBAQENAQIBAQMBAgEBAQkBAQEBj?= - =?us-ascii?q?jaEDIosQzE7AgcLAQEDCYwjAQE?= -IronPort-PHdr: A9a23:3aIm3RBfYL78XRTcz0LxUyQUT0MY04WdBeb1wqQuh78GSKm/5ZOqZ - BWZua8wygaRAM6CsKgMotGVmp6jcFRI2YyGvnEGfc4EfD4+ouJSoTYdBtWYA1bwNv/gYn9yN - s1DUFh44yPzahANS47xaFLIv3K98yMZFAnhOgppPOT1HZPZg9iq2+yo9JDffQVFiCCgbb9uL - Bi6ohjdu8cIjYB/Nqs/1xzFr2dHdOhR2W5mP0+YkQzm5se38p5j8iBQtOwk+sVdT6j0fLk2Q - KJBAjg+PG87+MPktR/YTQuS/XQcSXkZkgBJAwfe8h73WIr6vzbguep83CmaOtD2TawxVD+/4 - apnVAPkhSEaPDM/7WrZiNF/jLhDrRyiuhJxw5Dab52aOvRwcazQZs8aSGhbU8pNSyBNHp+wY - o0SBOQBJ+ZYqIz9qkMKoxSkAwmnGebhyjhQhn/uw6IxzuMsERnB3Aw7A9IDq3bUo8/zNKcRV - uC11LHIwivZY/xLxzjw8Y7FeQ0urv+QR7x/a9bRyVUxGAPfiFWdsZDpMjKV2OkTvWWV7+RtW - OOhhmMmqAx8oDuiy8Uih4fGh48Y1FPJ+Th4zYs6J9C0VFJ3bN64HZZftiyXKoR7Tt4kTmp1u - yg60qULtJ2ncCQQ1pgqyAPTZ+aHfoWJ+B7vSeScLSp+iXl4YrywnQyy/lKlyuDkVsm7zlJKr - i1dn9nJsXANygDT5tGfSvdk4EutxSuD2xrW6u5eIEA0kbHUK5kuw7IqkZoTq0vDEjf3mEXwk - qCWal0p9+u05+j9fLnrqYKQO5V0hwz/KKgih86yDfkgPggLRWeb+OC81LP5/U3+RbVHluU2k - q7CsJDGPskbpLS2AwlW0oYk8xa/Fymp3M4FknYZNF5FfgmIgJDzO17SOPD4Eeu/g1O0nTt23 - /zGJKHuAo3RLnjfl7fsZbJ960lTyAoyy9BT/olUCqwZIPLrXU/xrsDYAwQiPAyp2eboFc9y2 - poQWWKIGK+YPrndsUWV6e41PuaDetxdhDGoL/8q5virlmIhgVgHYYGjwIEbYTW2Ge55Kl+VJ - 3bh0fkbFmJfnAM4BM/tkEWPGWpLYG2ud6A14DI8EJqrS4vOENP+yIed1Tu2S8UFLltNDUqBR - C+ASg== -IronPort-Data: A9a23:VhC+4aKGZF33Q9F0FE+RvpMlxSXFcZb7ZxGr2PjKsXjdYENS1zBVm - zYfDDuGOvjcMGT0etAkYN6x8kwD7MLQm9Q3G1ForCE8RH9jl5HIVI+TRqvSF3rJd5WcFiqLz - Cm/hv3odp1coqr0/E/F3oAMLhCQ7InQLlbGILes1htZGEk1F0/NtTo5w7Ri2tcx3oDga++wk - YqaT/P3aQfNNwFcbzp8B5Kr8HuDa9yr5Vv0FnRnDRx6lAe2e0s9VfrzFonoR5fMebS4K8bhL - wr15ODjpz2Bp3/BPfv++lrzWhVirrc/pmFigFIOM0SpqkAqSiDfTs/XnRfTAKtao2zhojx/9 - DlCnZWXSl0jF72Qo9YUcCEfFTpSP4Rt/KCSdBBTseTLp6HHW37r3ukrFARsZdRe/+92BWtJ5 - bofMj9lghKr17rwmu7iDLQywJ18daEHP6tH0p1k5SneFuoOQ5nFQKLS/dIe0DpYasVmQ66OO - 5JAMGMHgBLoWwRwMVsFObICo/qFn1bzdyRihGDOnP9ii4TU5Fcojeaxb4O9lsaxbcFSkUee4 - 3nb53z+GA0yPsGFxTPA/HW2mebVkWX3Veov+KaQ8/l3nBiLgzZLUVsTXFq/q/6pzEmkVLqzN - nD45AIniqto/mW7EuLPVj6A53ifkhw1cN5PRrhSBB629oLY5AOQB24hRzFHacA7uMJeeQHGx - mNljPu0X2E06uT9pWa1r+zI9WroUcQABTVaDRLoWzfp9PHPjenfZDrlQ8xnEajdYjbdQGmpm - mHiQMQWo7wVgYYh2r+//Favvt5Bjp3OUxJw/kCNBjvj6wp4YISid8qv81ezARd8wGSxEQXpU - JsswZL2AAUy4XelyHzlrAIlQejB2hp9GGeA6WOD5rF4n9hXx1atfJpL/BZ1L1pzP8APdFfBO - RGM4lMAv88JYiL6Ncebhr5d7ex0ncAM8vy6DpjpgiZmO/CdiSfcrH02DaJu9zmyziDAbp3Ty - b/AKJvyUSlDYUiW5Dq7RuEZ3L4tgzsj3XvUX4yzwBGt0dKjiI29Ft843K+1Rrlhtsus+VyNm - /4Gbpfi40gBDIXWP3eGmaZNdgpiBSZgWvjLRzl/K7TrzvxOQj9xUpc8ANoJJuRYokiivryZo - S/lAxEGmAGXaL+uAVziV02PoYjHBf5XxU/X9wR1Vbpx83R8M4up8okFcJ47Iesu+OB5lKcmT - fADeMKYGvkJRjmeo2YRapz0rYpDchW3hFvQYHP+PWViJsBtF17T59vpXgrz7y1SXCC5gs1v8 - bSv2zTSTYcHWwk/Xt3db+iizg3tsHVEwLByUkLEL8N9YkLp9IQ2eSX9guVuepMOIBPAwSOC2 - kCaDE5A9+XKpoY09vjPhLyF9tn2SrAjQxcDQWSCtOS4LyjX+Gan0LRsaufQcGCPTn7w9YWje - f5Rk6P2PsoBzQRDvIdLGrp2yb4zuon0rLhAwwU6QHjGYgj5Cr5kJXXaj8BDurcXnO1cvhaqH - 1rKoIEDf7CAOcfvF05XIxAqN7zR2fYRkzjUzPI0PESjunAup+faDBwMMknekjFZIZt0LJghn - bUrtvkQul62hRcdO9qbijxZqjaXJXsaXqR56pwXXN3xhgwwxg0QaJDQEHWsspSIdskJKgxwe - mbSgaPDg75b1gzFaXVqTSrB2u9UhJIvvhFWzQZceA3Sx4eY36E6jE9L7DA6bgVJ1REbgeh9D - W46ZUR6KJKH8ypsmMUeDXunHBtMBUPF90H8o7fTeLY1k6V1uqfxwKHR9ApDEI31M46RQ9SDw - Iyl9Q== -IronPort-HdrOrdr: A9a23:8y8NqqHssZLZ5JoIpLqE88eALOsnbusQ8zAXPidKKSC9E/b4qy - nKpp4mPHDP+VUssR0b9uxoW5PwI080l6QZ3WB5B97LNzUO01HFEGgN1+Xf/wE= -X-IronPort-Anti-Spam-Filtered: true -X-IronPort-AV: E=Sophos;i="5.97,222,1669071600"; - d="scan'208";a="60840111" -X-Amp-Result: SKIPPED(no attachment in message) -Received: from mout-p-201.mailbox.org ([80.241.56.171]) - by maila.burda.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Jan 2023 10:25:16 +0100 -Received: from smtp1.mailbox.org (smtp1.mailbox.org [10.196.197.1]) - (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) - key-exchange ECDHE (P-384) server-signature RSA-PSS (4096 bits) server-digest SHA256) - (No client certificate requested) - by mout-p-201.mailbox.org (Postfix) with ESMTPS id 4Nx3QJ6GdJz9sQp - for <***>; Tue, 17 Jan 2023 10:25:12 +0100 (CET) -DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=****; s=MBO0001; - t=1673947512; - h=from:from:reply-to:subject:subject:date:date:message-id:message-id: - to:to:cc:mime-version:mime-version:content-type:content-type: - content-transfer-encoding:content-transfer-encoding; - bh=OMh+Pfp7SvIiDJjyXg53DevMPfaJRBhjQUkokwQIgDY=; - b=m3nM2KPbJdO7D+Vq/fMLLCXpkeDgvLs/JRzGTzWO4OoQhSaXLp76/vkBGPCU7BSGxir2Fu - g6e9Ggnrf0l8vL7rpvTgttta64wImaP9wOmJ0fOjzHcg/PX7sYjlUjyVyfThqZ7M5qg6/P - E9wItt4lQoUeQRVc6EoUlUaL7S+2R4P2WsQ6HCjulmpC3fmZdPOTXph/a1YfGvSfSj0pjp - LauH2n6EURKFmtMv8MbDcvTVKcq7o1bLGnK/RAjkLmRAORt+eC08IEAb5stVE6T6UPZ14Q - GUqrK2HEm5THS9vlH/11LwxwmnAdqUm8nl+Ymo3n1UNF9r8wkh8BUndGQFOQqQ== -Message-ID: <****> -Subject: Testing 123 -From: **** -To: *** -Content-Type: text/plain -Content-Transfer-Encoding: 7bit -Date: Tue, 17 Jan 2023 10:25:11 +0100 -Return-Path: *** -X-OrganizationHeadersPreserved: *** -X-MS-Exchange-Organization-ExpirationStartTime: 17 Jan 2023 09:25:18.2389 - (UTC) -X-MS-Exchange-Organization-ExpirationStartTimeReason: OriginalSubmit -X-MS-Exchange-Organization-ExpirationInterval: 1:00:00:00.0000000 -X-MS-Exchange-Organization-ExpirationIntervalReason: OriginalSubmit -X-MS-Exchange-Organization-Network-Message-Id: - ca3e116b-7c15-4efe-897e-08daf86cbfae -X-EOPAttributedMessage: 0 -X-MS-Exchange-Organization-MessageDirectionality: Originating -X-MS-Exchange-SkipListedInternetSender: - ip=[80.241.56.171];domain=mout-p-201.mailbox.org -X-MS-Exchange-ExternalOriginalInternetSender: - ip=[80.241.56.171];domain=mout-p-201.mailbox.org -X-CrossPremisesHeadersPromoted: - DB5EUR02FT011.eop-EUR02.prod.protection.outlook.com -X-CrossPremisesHeadersFiltered: - DB5EUR02FT011.eop-EUR02.prod.protection.outlook.com -X-MS-PublicTrafficType: Email -X-MS-TrafficTypeDiagnostic: DB5EUR02FT011:EE_|FR0P281MB2649:EE_ -X-MS-Exchange-Organization-AuthSource: **** -X-MS-Exchange-Organization-AuthAs: Anonymous -X-OriginatorOrg: *** -X-MS-Office365-Filtering-Correlation-Id: ca3e116b-7c15-4efe-897e-08daf86cbfae -X-MS-Exchange-Organization-SCL: 1 -X-Microsoft-Antispam: BCL:0; -X-Forefront-Antispam-Report: - CIP:193.26.100.144;CTRY:DE;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mout-p-201.mailbox.org;PTR:mout-p-201.mailbox.org;CAT:NONE;SFS:(13230022)(4636009)(451199015)(6916009)(82310400005)(558084003)(2616005)(7116003)(6266002)(36005)(8676002)(86362001)(36756003)(5660300002)(1096003)(336012)(8936002)(156005)(7636003)(7596003);DIR:INB; -X-MS-Exchange-CrossTenant-OriginalArrivalTime: 17 Jan 2023 09:25:18.1452 - (UTC) -X-MS-Exchange-CrossTenant-Network-Message-Id: ca3e116b-7c15-4efe-897e-08daf86cbfae -X-MS-Exchange-CrossTenant-Id: 0a3106bb-aab1-42df-9639-39f349ecd2a0 -X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=0a3106bb-aab1-42df-9639-39f349ecd2a0**** -X-MS-Exchange-CrossTenant-AuthSource: *** -X-MS-Exchange-CrossTenant-AuthAs: Anonymous -X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem -X-MS-Exchange-Transport-CrossTenantHeadersStamped: FR0P281MB2649 -X-MS-Exchange-Transport-EndToEndLatency: 00:00:01.4839051 -X-MS-Exchange-Processed-By-BccFoldering: 15.20.6002.012 -X-Microsoft-Antispam-Mailbox-Delivery: - ucf:0;jmr:0;auth:0;dest:I;ENG:(910001)(944506478)(944626604)(920097)(930097); -X-Microsoft-Antispam-Message-Info: - =?iso-8859-1?Q?DN6oyY29jzFhRK1BGCOfg1yFnX4ACBaHBh9nbhnIoNZ4DGdi6zN+tIXnUR?= - =?iso-8859-1?Q?AY3F6SV1doOncexZBgqeE70YqvkB0xmo97NgnkQFb48xPvmZwoiAqkmIrS?= - =?iso-8859-1?Q?EbPesMMRL/pVX22Pde2C0KNThL0e02Li5ZCNvDxq+mEt0T9cww7HhoY6SS?= - =?iso-8859-1?Q?vMbDIBDA4c6Gyvb+34A6rYNFyHtZFVMas8S1KP4bV7QtI2WooRBzL1tOgM?= - =?iso-8859-1?Q?gyRVbzR69Mk++hTLhqTK7kBIkGMFhUC1McOMGMTOuUh9Ay7vMeY/oNGwOG?= - =?iso-8859-1?Q?WEFVsQjOz6lY4FIc3A+U5t3LMxkHtxRCql//ZhfKfjy78hPR7FCzYk70+T?= - =?iso-8859-1?Q?iCLlDZNF73KjvxH82FFKOersAl26L1kb2x5F/d1XJxAJe7BTG20/LXuMmx?= - =?iso-8859-1?Q?wGJs7s+C69LYa4cliwtGTMEuS6Rd7bOLihXnIy6hn8UhjVhNBv0+yGjint?= - =?iso-8859-1?Q?hbwBnQJ4Ny2jeS42bJYmKw+7Dnol+pphbvhjhtsDvKifo4Xx7xM45eV2s3?= - =?iso-8859-1?Q?wfKtSfeNGIR3Oi0VwreHTtsCOfvY8jbP+T2Z6KOFtQRvlUyutOFnOB2x1J?= - =?iso-8859-1?Q?BVgSblJzekltOB7gCAmZiCQnZuUMOtVVqRfURwUhOuQ47I/2LDJzi/NQnf?= - =?iso-8859-1?Q?XiqeHojof9SfngGas5TNx9tuQxmFqw4AWJE7iy4hxJo2ehSt4ReEvPzyt9?= - =?iso-8859-1?Q?1DTwLNYbyZ8Ub7Uq3EtUDE5vn3jY2thuVBo8eemdrjOvsx+hdH9RxcFwYz?= - =?iso-8859-1?Q?qU8NIflZ0TMRHTT2M2aBdzB9zsR3Kda+I8tNi7T6DCWve+MEEmLeRa4lU6?= - =?iso-8859-1?Q?XAFgPATiTR9BGrBBrwqKLye2Pnn6Bx8Hs+R7sFsv6HnQkS8B585+mjXV0A?= - =?iso-8859-1?Q?jXMm+5KDT/IUTiTAeJPwBTNEAG6Yo8gDg+6/9EMuZtQYAYZnM4tMefCwBm?= - =?iso-8859-1?Q?oV/M1vLbCGr7m1BDeRerH34C/2SWa0XnU9zOzqvm6/ery2Cv81aakjQr+S?= - =?iso-8859-1?Q?FdFwyYhZi96v0+HHAeT1Ncyrb84GZVp0kb1VYOBI0JH7TTZy88PMtFfbXQ?= - =?iso-8859-1?Q?nrSZ/VgrVa7hCvBOf2VQnj6iMnNqaJlmnI+E/yXvDNQJn2JDhor7QrClSA?= - =?iso-8859-1?Q?rrCXMDZyWWZhhDrf+VkN7ePKkju46/dqh0NRjqz6571xFdftnXx/b9dli1?= - =?iso-8859-1?Q?+XoZOiqbV8FyrJNCWDLuZRc1gIr0KVbbxN9nggMGa5c8tslnJvW/OTImm7?= - =?iso-8859-1?Q?SEKOX/bZx/aOe9bLlgzQhqdtwBkOJurGSWeDajB/ko2pFUcIYWyMaB6dFW?= - =?iso-8859-1?Q?RcQgdjWDgNNqiUnyvY585ZCFJCfiMaWj8hglJWADRQdLHNSqFAtuZdVCc1?= - =?iso-8859-1?Q?HPXeZDkLqPP+0VfD8EO3A1Fmp+E3kIrykjPJtNslbzwmtL3ATsC8e2mcob?= - =?iso-8859-1?Q?NGBKDmktRjDYG3mhya2XCCiFWaYiig6J/s1ePtuRp3TbBojEAUg2E5xItx?= - =?iso-8859-1?Q?gRGc6bNfg9Rihie4+BZSN+l+ynuYJQ/FGK3CvQYA9gXp00ZtfPwlHx7mXA?= - =?iso-8859-1?Q?gaDydNv1CyuYCOgUeTxo4Bi7N4Rrz72tn9pYxoZ7okujjzLWuiK7etRoRz?= - =?iso-8859-1?Q?JwOHGQklwT4VgMwwLQdXxNR+WMLbOyXjt6bfrKSUHq34oLx6ZVk2F6r9HI?= - =?iso-8859-1?Q?5uaCMLO8dLt3O9rb8FdV3EfLGg+zThKobHlrVJ2WFZLm0xtSsbzC04WLdR?= - =?iso-8859-1?Q?Oqf0F2GVBbFjulBFs9mvdhDXD33oUn5atsgLnkAitzWZH8qgeTOKgCbZD4?= - =?iso-8859-1?Q?WIXnz+DQx0g6sgmqGwa5fkPzRn+NfdGnwNwRyjXcAw7jW5DVkAnzd2OkEc?= - =?iso-8859-1?Q?WrVWN1eIbPedT77yCWDwLAjGBWSrpmI1bZkqI=3D?= -MIME-Version: 1.0 - -Asdf testing123 this is a body \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/messages/issue-348.eml b/plugins/vendor/webklex/php-imap/tests/messages/issue-348.eml deleted file mode 100644 index 6c9d385d..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/issue-348.eml +++ /dev/null @@ -1,1261 +0,0 @@ -MIME-Version: 1.0 -Date: Fri, 18 Nov 2022 16:52:06 +0100 -From: sender@testaddres.com -To: receiver@testaddres.com -Subject: 2 - test with a strange attachement -In-Reply-To: <30fdd5117dd9408487d74e9b50dedc27@testaddres.com> -References: - <30fdd5117dd9408487d74e9b50dedc27@testaddres.com> -User-Agent: REDACTED -Message-ID: <0a5495c56acb49d56545a2017dd1f931@testaddres.com> -X-Sender: sender@testaddres.com -Content-Type: multipart/mixed; - boundary="=_be6bc52b94449e229e651d02e56a25f1" - ---=_be6bc52b94449e229e651d02e56a25f1 -Content-Transfer-Encoding: 8bit -Content-Type: text/plain; charset=UTF-8; - format=flowed - - - --------- Original Message -------- -Subject: 2 - test with a strange attachement -Date: 2022-11-09 08:36 - From: anotherSender@testaddres.com> -To: "receiver@testaddres.com" - ---- First Text as body test 80 column new line linux style 0x0A --- - -Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor -incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis -nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. -Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu -fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in -culpa qui officia deserunt mollit anim id est laborum. - ---------------------------------------------------------- - - ---- Second Text as body test no column limit (865 characters) one single line ending with 0x0A --- - -Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur - - ---------------------------------------------------------- - -Da: From Test sender in another language (IT) -Inviato: mercoledì 9 novembre 2022 03:17 -A: To in another language (IT) -Oggetto: Subject in another language - ---- Third Text as body test 80 column new line linux style 0x0A --- - -At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis -praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias -excepturi sint occaecati -cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia -animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et -expedita distinctio. Nam -libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo -minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, -omnis dolor repellendus. -Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus -saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. -Itaque earum rerum hic tenetur a -sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut -perferendis doloribus asperiores repellat. ---=_be6bc52b94449e229e651d02e56a25f1 -Content-Transfer-Encoding: base64 -Content-Type: application/pdf; - name="Kelvinsong—Font_test_page_bold.pdf" -Content-Disposition: attachment; - filename="Kelvinsong—Font_test_page_bold.pdf"; - size=35648 - -JVBERi0xLjUKJcfsj6IKNSAwIG9iago8PC9MZW5ndGggNiAwIFIvRmlsdGVyIC9GbGF0ZURlY29k -ZT4+CnN0cmVhbQp4nK1Y+3PbxhEe4wAcSXEMgC9IlEJDskWKNAHi/YjTmlbixMm400mqmf4Q9IdO -mqRJY3rMdqb/fr+9A0BSsltl0jiWgLu9vX18++3C7xzfC2PHpz/1w3dvOqtvMufHf3bEsrP9sfOu -E3tBmqaZWNh//u6Nc30D+dzJvTx3bn7AocBxA2yFfuQloRMHiRcFgXPzpnP1QGGqpvNWu9zwI95l -5ZY/NMyu1dN431TZQDF75XbIR/bxyfzm504QOjevO1fjU3s04mcPPprwR065OcfRC7Xc9h7PZ52X -N52vO4Hzb/z9Cn9/rmz+5otOFudOkgZenAYO/s/iyNl+3/nTPXwJ4ILv+YfeBIXvRaETRIXnZztv -FE3XhD9k734YgsKT1j+cOE8m/BKGT/uTxuIwdMIgSWGdE6ehE0WJtC7H5WFchLRRFE6e+Lv1IPKT -aj32M7lOXtbr8LJZF/JBLrwn+TjcrddRwXoTFaGnkic9+/JBFkTVvVmW7+RrOyHf2Cn0VPIU9Vr+ -XSfNIliaihviwikAie33zp+dzT0zEh6mIwu8KHWi0MsSPxXpAKDK7UNDw0/NtHr9cjsYHmkjZmvH -x+bRyfj07PQjypJIwNe/EQf7F/PJoxabOK0R0NAfTdTWeQ2GzCuE2VkYEizCyPNj5+ZvnW+vHsI6 -ppTbuRv6fubF8dVs/pebr+StNYbcNECAc8dNU69I6eBVt9U+Z5OLiTJq3UacG8DaGCbnXhYK4XKr -l1flnC1U9rSci9o7GhhmOW9burlEGbmua93dIMVJFpPnUeCludBle8cn9sxe+YFP+whE6iXSptWJ -PR5zHn40RVk/iuK9AoWkW6lyU8EwdMAJIYiC4LPZSbCyIY5wGKrFLxIsggusS4vjshP7dGSvTk73 -DMrCWklC7NHCNSkzFW3I/dmQ48fBlXFeSz/RehbPVifc9sc+H53ivzHuvSy3+eF6YJ/IwO7lIZLa -gtCvI2spjyfnrb1sJzEikvt1mp70DT681AY2s6d2FS95ckYZGS/O7mTvbpiSmh+ZouPxgCQFR8KB -29zY2L6PXHlzH0EeGhaMemCbdlMJ7wj9eQL3UKsgHyrTMBJlKjoBTn/29r71crcJIHZwJwSzRE25 -PJV0GWWkBULCOgG7EEhP42rJUkbt1tORFHbDMKXCk1s9e2i64kAu0F7p8Cbn5aYpDpRW5lX6v71a -6ZbZ1bR5mCcwMrwanCtUsL4oOxmJThEHDavFVErpr+KoD3mfFLkXFLJprPTh0fD/R0MBPIyE5m+v -hqzctANUc7lRFdaau1GQo1sFRBrqZFRFRlu22Dk2izBKKMSPBZtMtMcT7UG5QWoEkVVktIfPMI/p -0ZWNDdEuyk2/D/Hw7OyC4+Xi44lAdZIWXlan1WE6CHmOMuVRuVV01Dmh2rP5YMCfXfLLgmfc54KY -Y/IoK2rGaZfbBRULId8Cqes4/NQt55qhfmIx9U6VijBF0jZ40g4jtNyWFqMqzu/2Z2qn9U0X0+SC -HOH0i4dH5MwZt8fBjJ963sgO7tzlAkShk8Y1BVZ8MFMYGIFiv5teBkFLRUa8ybSF7h/74gjWh61p -65EyUrBYSc7KTUJv0q7XB40l3YkZqPPJND0YJWrMYpRoWvFvgmycpV5YzTmI4DRSdyFs0Jj6OBNV -cLCHI0m+hWBJt+HK0UyQjRuHxI7N8tQR9Ys+HtcFPxsfz2bHo9Ht9ukmkU92+tQMSfCs3C6BorZm -cB3gUvH70ex0uTwnHDoAJf/dA+fJ74e8P3mGThLMfM8Dw99xwM0Ep7iN4mflxkbjGVd9JAJt1bYJ -J5IiIZsqShmPh1h2iyxKvDS9su19Lgn8YjdSBRgYwqQmk4OtN/I1imIxNP2CzCGpmJSQVT+u5q4i -yu+b1PdN4kAH3EzywAsSmdOLZds0VFN03IaNwPu7W2lAvP+t74NSBPpFQWeJl1S3LhbZaTkXoQ0K -3ILLajgMFVWUaz3FldvY1Iz2+TSqhuswIaCIynmfaLkdVbIoFKk7pe5CunfXSjcL0FMd/jjKgPns -3h8HuZMeOBkjqIfjYEuQnG7ypWbo7Dlfg8DQu08t2+bycTaiZ63ema2sVbMV1M8vmLJmBktTU34o -rbUe9f1n5gA8igfF4qO9CaCcD0w5Alh8qvVQF9uFyRVT4SDc+ULHjAe1eFm0NfDR1tA4jWiMmwaZ -y/VPmLbGPUuTrxnXFgvNoAPdLluUWxX70IRRkVMUrwbMNBQSpDc5m76mcVNRmc7apsUnUik0lfPr -ayyaH4jD6kNxIDGLI5kCW/IOFKzoEU0Lso4eAgJ5uT3CbKMVxkODmx9jqK7qXBwRJ9yomar6pnKt -GUQf6xemsWaK9pxTYPXdOiJdbeG5qxHPdDWFiYDwB9OLJ2Gfa4pqmByWjsYIofQB0UW3Y0vsmQda -FioCat5O6/8Yz812u5zLO5cayV/DVdLBlU/FuHosx9XPOFNEVmTKEfOl7LQw4rZBh37W5klfWI+D -SJfS3nL7kvWYKlZxQkU+VbwtGFRCyvicVvUekEV+ML7QFOyJUPEBUKVdXwNmTEZBDvez1SjguqVb -EBZWmMZSE/60DQ3nAVBpj0g7xgABKqRroQ0A+OecVfYJXOn1OqXIBBhpga01At5CAlhJaWpm+KxQ -eBMbXEVTtSC/S4MCZQ4RQGgxqLJkjiqD/ZktDB5ynCFZhZzldX3DN36JQkCYkCaKzAJVRJesSRal -ReFYM3VXvUQJhJU5aYOXV3Ca9Q6qiEK9kOSs8WumSNjIxDUeiwWBqtrkHazoSWZf2UHww0EoNwup -ViZ759AXdI82EBuNCcs261WfXI0Z+ifamqxCfna2P7MKi6/sI9s7Gtn2ichpEIjvXzg5BZv0JQSY -+vlzSsAOvSJGxFwNSKqaa5sqgAfjVcR0Lutx32Kyprh7WtIeUkMRBf0ttFupM7tdZJ+KhUiQiA8u -HQajbZDQWkQbFmDqaAuokSrMH3CuSaCgfRJblHNz72a5Ullg0aenqCi40DW5ORCwRnGpIgiVx5JU -CH16XcXANshIFXMx0WsPRQE6rkE3pOqSnixUgvZ7vNAQRbLG3AUSO9C5XYoy3CF1P44EV6rzVEJO -jrhicILTuMMU8NBUUvFcEEFPRh7fq/MKMTBYTvQLlOaCSWrBZ5lB75wiAqwqoihuswLwuNNPgBFd -UVsIEmJoA5WrIkSR2TMJ07sOUs+SqRw58oi+UaoeMjP40tS6bjVQHA4KzWyNQeFXzNZ507P2RgXx -hZ/GRTMQPWHLlwaB45IZ9URLXzqiRYuYHfQyNw1SD99geVx3s3Lz37iX3mryHc+O8GPEdf0QE2vC -iqA3kZ5tlxKnEQx7gqbXjOyQvbxpWGSyWGgTpEQdANY6uxbM0+AICoABahI9QOJVw+WvhvzVIQW8 -gsJXInt9SrLoZyLTryy+y8f9/z06iJ1M/DOsWMWY5xVFkRbNbwr+zTdfvnjt/OGPn710XOfTX376 -7h/O37/HiP7D263z5i0eftrg8c1f//XT283eF/t/AGaEuvFlbmRzdHJlYW0KZW5kb2JqCjYgMCBv -YmoKMjY0NgplbmRvYmoKNCAwIG9iago8PC9UeXBlL1BhZ2UvTWVkaWFCb3ggWzAgMCA1OTUgODQy -XQovUm90YXRlIDkwL1BhcmVudCAzIDAgUgovUmVzb3VyY2VzPDwvUHJvY1NldFsvUERGIC9JbWFn -ZUMgL1RleHRdCi9FeHRHU3RhdGUgMTYgMCBSCi9YT2JqZWN0IDE3IDAgUgovRm9udCAxOCAwIFIK -Pj4KL0Fubm90c1sxMyAwIFJdL0NvbnRlbnRzIDUgMCBSCj4+CmVuZG9iagozIDAgb2JqCjw8IC9U -eXBlIC9QYWdlcyAvS2lkcyBbCjQgMCBSCl0gL0NvdW50IDEKPj4KZW5kb2JqCjEgMCBvYmoKPDwv -VHlwZSAvQ2F0YWxvZyAvUGFnZXMgMyAwIFIKL01ldGFkYXRhIDI1IDAgUgo+PgplbmRvYmoKNyAw -IG9iago8PC9UeXBlL0V4dEdTdGF0ZQovT1BNIDE+PmVuZG9iagoxMyAwIG9iago8PC9UeXBlL0Fu -bm90Ci9SZWN0IFswIDAgNTk0Ljk2IDE1XQovQm9yZGVyIFswIDAgMl0KL0MgWzEgMCAwXQovQTw8 -L1VSSShodHRwOi8vd3d3LmJ1bGx6aXAuY29tL2Rpc3BhdGNoLz9hY3Rpb249VHJpYWwmcHJvZHVj -dGlkPXBkZiZ2PTExLjExLjI4MDQmZj1Qcm9mZXNzaW9uYWwlMjBmZWF0dXJlczolMjBVc2VyJTIw -aXMlMjBub3QlMjBpbnRlcmFjdGl2ZSZyZD10cmlhbCZmbD0mcmZsPVBSTykKL1MvVVJJPj4KL1N1 -YnR5cGUvTGluaz4+ZW5kb2JqCjE2IDAgb2JqCjw8L1I3CjcgMCBSPj4KZW5kb2JqCjE3IDAgb2Jq -Cjw8L1IxMgoxMiAwIFI+PgplbmRvYmoKMTIgMCBvYmoKPDwvU3VidHlwZS9JbWFnZQovQ29sb3JT -cGFjZS9EZXZpY2VSR0IKL1dpZHRoIDQ4NQovSGVpZ2h0IDE3OAovQml0c1BlckNvbXBvbmVudCA4 -Ci9GaWx0ZXIvRmxhdGVEZWNvZGUKL0RlY29kZVBhcm1zPDwvUHJlZGljdG9yIDE1Ci9Db2x1bW5z -IDQ4NQovQ29sb3JzIDM+Pi9MZW5ndGggODU5Nj4+c3RyZWFtCnic7Z1PrF/Fdcfv29kKErY3cfAi -buxKkQKKI2ErSOFPFk1MKwVbIqHOJhg2UIjAKZGC8w/yx1RKGpME4mzAzqJxaSr5gdTEJgv8cKVU -BglXGDULE6gUE7qxXYnG3rmHN2RyfGbu3Lm/371zvnfe+SiKzHu/97tz5893Zs6ZOWfh8uXLDTAX -3rl052NHnv3335Z86NXvW/Xmv+xZc9Wqtg+8+fYFKtXSqTcLFupdXnnq3i2b1/v/XDzxWyrG//7f -pcLFMAyjPC/8cPcCuF7f8sDB8rJIHPzKjjtv/Vjbb9f89WMqKrn//u0PfvYG9+9Dv3pl9z8sli+D -YRgqfGH7Fmi9pmXsX9yxv/xzP/j+NbS+bvutolCe/7eH/apfayYzDEMF2l5D6zVt9n929FT5537z -zlse2f3Jtt9qCSXNroce3un+rTWTGYahws1bNh5HtodceOfSxs/tVzE7vPHMno3r10R/pSiUL/xw -9y1bNrp/P/jjX/3wX/9DpRiGYZTHWWhx9VrL7HDbJz68+N1dbb/VEkpuolGcyQzDKM/V71t14ZcP -0z9w9XrL3Qf+88zb5Z975Du7dtz44eivFIWS+z/N02gYK4oHbv/441+8tYHV6+On3vzkAwfLPxfT -0yjOF2rNZIZhqOAttKB6jelp1BJK7mk8debtj919oHwZDMNQgVtoEfX6wjuX1v7NYyqP5gfmBIpC -ya/JUOVsuevAf//PBZWSGIZRkgdu/zitIL0oIer147/4zZ4njpZ/Ll/Ghmgt+T+6ef2pp+4t/1zD -MNBA1OuNn9uvsn7kB+YEIJ5GwzBWMnB6bZ5Gjj/H46Bp45GDL5wyZ6Nh1M6aq1aFB4vh9HrHVw8X -ju7k4KE5QrSW/P4cT7NsQN+x97BZrg1jhRCKEpZeK94eTHgatZb8zZU3LbUM6IZhqBBaaLH0mjb7 -jx46Xv65mJ5GFzHA/VvxzIxhGOWJWmix9FrL7CDiSnMUhZJ7GrVmMsMwVIgeNADS68UTv935tcPl -n5s+MKd1uFDMrlozmWEY5WlLmQKk15ipCbSEkt+01JrJDMNQoc1Ci6LXWp7GdOovRaHknkZLTWAY -K4o2Cy2KXmvFKU17GrUOF/KIAZaawDBWFPyggQBFr7UyIiY8jYpCyWO6mjHEMFYOtONf3Ler7aI1 -hF5r3R5Mexq1jmSE53ge/8VvLrxj2QkMo34e/OwNbebZBkSvzdPISd+0NAxjxaKv11pxSkVoDoGi -FULctKT6scW1YVTPxvVr2tLGevT1Wuv2IA/NEYKQBN1Fd7K8uoaxEkifVXMo67UlQRfwiAEWMMQw -VhSJkM4OZb3W8jQmTsw0lgTdMIzipEM6O5T1WisjYtrTqHW4kJdK6x68YRgqpJPHOjT1WitOadrT -CJIE3QKGGMaKIhHS2aOp15hJ0BE8jYoRtw3DKE/6orVHTa8V45Riehr5TUvzNBrGiqLT0+hQ02st -+ywPzRGCkATdAoYYxooix9PoUNNrLfssD80hAEmCbp5Gw1hRpI8/cHT02pKgc4T/U+vCp2EYhaGx -/8juW/LjT+jotVac0rSnUetwYfqmpWEYhkNBrxXtswlPo+KqNlEqwzAMj4JeWxJ0TvqmpWEYhkdB -r7U8jYkTM4qexoT/05gKtDmj+b6wMc3MaCuQ0nqtFac07WkESYLuoMnjVMGRv+aqVW0ZdowcFC83 -XV56VOW5Wrz59gX6n3YphiEnempIab3Wuj2YTgKAkARdMXrqPBkSii0tw2RAJJR37jtSuOHCYmhZ -0oR9T2WNPx60lDn19L38fjYtqh45eLyaCGg50VNDiuq1oqcxcTdfcX3EPY26dxpnM8sUblBeXSA3 -UUFC7yreFh4P/oJVXiLLP3btKarXmEnQtYSS37RUH2+zGUNLNqhwzGr1JbG+BknyWd8dK/GCWs09 -Hvl3GjlF9VorTmna06gllLxU6uMtnXq4jZINyhcjIDdRGz1LGkgxxkPY6LSkYzxyoqeGlNNrrduD -k/A0Ioy3nHCOnJINKq6AgtxE1XKeC9OnYq7R8eC9Uau5R2W2Wxfl9NqSoHP48gEkempfE3bJ66DC -XANyExUh9G6jd1t4PMQLatXzeKSjziUopNeKSdATTliQJOgg0VN7mbALNyhfjIDcRDWH53hwU2GV -4XQyo6eGFNJrkDNPAq2FCS8Vznjr5QAp2aBiMQJyE1XLAyaKoeXwHA/hSgFZzQzIbJ5GRwm9VvQO -8ZWIAOQkFtR4y7SpFXbSckONon9Y2ItU9JqG+uK+XbxL1+eIA3Esj8c81x1K6LWWuyB95kFLKEWp -EDyNnswDoSWdtCAH18I1EUkJFaZkGdZctYpahxv36nPECQNmfS/Y9Hfsc0roNWYSdISTWGie/cwk -ciWrThx7QriJikN9jjjRA6FWM4OQOcTaGF2vFZOgJzyNIEnQ0Tz7OZa1wnMMX4yA3EQFAcfzMSC8 -nkHOTQ1LwkKbw+h6reUuSJ92QDiJhTneOoWp5BwjFiMgXmsX6aVkTC6CBrnoz/U54oQrtb4XnO1W -GmdcvbYk6AI+u0J5Gj1pI1LhqgOJICEidWy564DKJp13niodccLTWF9ElBkChgjG1Wst71A6CQDI -SSxMz37avlay6oRxZoVH6hDFqM8RJ+6OYq5m5mG2gHyCcfUawacXoiWUvFSw4y1twtYKGNJg3ERV -LIZweGr58McDxLE8HoPklxhRrxU9jXyiFoCEnkD27Le5RAoHDEEIkSGKoegB437XKq/8cQMm2rmp -QRjEZT2iXmsdfsD0NPJSYXoaPW3n+Uuu6UAiSGA6POtzxIkrrGjnpuZnqDStY+m1JUEX8FKBB/ON -BqMpXHUgITJAilF9agJ+dxR8NTMb83saHWPptZa7IB34CiT0BKan0RM1KJWsOpBIHZaaoAyWmiCf -sfRay12QCAoKkgQd1tPIESbswms6sRhB8A83MM7z+hxxlpogn1H0GjM1AUipJuHZF0Oo5JoOMzUB -yIXYKq/8WWqCfEbRay3vUHoe0xJKXqqpePaFWankmg4zNYHWJl106foccSCO5fGYOTVBlOH12jyN -Apwk6Pnw1WXhw1WAqQmaZYsQaWXhMpBS86j2VTriQK6wjkfftE1phtdrrZUIpqdRJEGf0B1ib8Iu -uaYDiSAx1OmrYanvyp+lJujL8HptSdA5vFTTss05E3bhJY9ITYDgH8ahPk+jpSboy8B6DeLTE4DE -fJiEp9Hj1piKAUNAWq1Z9vIdf+WNkmXYuH6NOK47rck+B0tNMAMD67WWJKXnMYTQE1P07F9eerTk -bgkkgoQohpZ9TxyprM8RJzyN01rN5DBnaoIoQ+q1oncoMY+BxHyYom2OVpolFRMkVj2gw7M+Rxx1 -reM/2o3Q3CNBuwd6wXlSE0QZUq9BoisIEEpV5R3iYQEJkQFSDOE8V7zyd3OLT2geSMVoB8MXWFr1 -TNPGxg8MnzaI5qHHv3jrsJYQx2B6reguwPQ08v1sfXeIBwfkXBdIpA4Ev+tHN6+nqWvwFWKIVj0/ -cPvHxbSBz2B6jelptCTok8BSEySKoTWyiqWsVKlnzCObnQym1wg+vRCEmA/12eYGByQnAGYxVBxx -JeVMpZ4xj2x2MoxeYyZBBwlyP0VPY0ksNYEAITXBUPE/O1Fp7sGvsRRjGL0G8Q4JtIIt4CdBhwIk -goQoBkLnafRG1uWlR8s8SKWeBwyYV5gB9BrEpycACWNS3x3iwQHJCQBSDBCH5/77t2/5yw8M+520 -aRCjVauei5nmB2cAvdZyywifnkBLKIXhzzyNaUQjgqQmAOnS9R0rEgsslUE6xjWWYgyg1wg+vRCE -UlWZNnRYMFMTqFiNb/vEh0lHuDOmvskeITVB4vgvPvPqNYh3SAAS5L6+aMXDgpMTIMx/RpJ94Z1y -UhLaCqo8VsQNESrNPV1Po2NevQZxywgsCfokwExNAEJ9x4oQHMvFzr2MxFx6DeLTE4CUyjyNnQBG -6nAcL6sj9HRRgCone/UrrOlN+SSYS69BfHoCkIQJ9aUNHRbM1ASkI7RlLLzMD3WkvskeIQn6pD2N -jrn0GsGnF6IllJNLgq4LSKx6hEgdzQpLgq5Vz9M9xueZXa+hvEMekDAm9UUrHhaL1MERXbrKY0Xq -SdAnGjBEMLteI/j0QhBSs1dpfBwWzNQEWg5PUYz6JnuE1ART9zQ6ZtRrEJ+eAMRnpRiteCpYaoK2 -YlQ52XNPo0o9T/0Yn2dGvdaSpPSmBiSMiXka0wjHLEirWWqCkRBaqVLP0w0YIphRrxF8egKQhAnm -aewEJEQGSDFEl65vsheeRpV6rsDT6JhFr0F8egKQUtVnfBwWS02QKEaVkz33NKrUcwXH+Dyz6DWI -W0aAkJpd0QY6FTBzAoAUo/oc4Sr1POmAIYLeeg3ilhGARJev7w7x4PDqAgk+A9J5qpzseUA+lXqu -xtPo6K3XIG4ZAYLPStGAPhUwcwJo2WTEydT6JnsRHlalues4xufpp9cg99AEIAkTqjQ+DgtITgAR -hZn6D0lJ4TI8ePsNvD9XOdlzrbSAIYPQT69BfHoCkOjy9RkfhwUzNQEI9aUmEFppqQkGoZ9ea7ll -EncaaWGy5a4D6mFMqjQ+DgtmagIQ6gsYguBprOYYn6eHXiu6ZWh9fWhvZJ588w/nH/zxUZVhb0nQ -eyGqCyRSR7M80S6e+K+SZSAFERNGfakJxFEuCxgyFD302iSJIzyNWgb0qYAQq74JNmpankZxwkzR -hy8ykI2EpSYYily9NkkS8K1WfcbHwbFIHW3F0BpZxa5oq9RzZcf4PLl6bZLEsSTovcBMTQASA0dr -jc+Pfo+KSj1XEzBEkKvXJkkcvtWqz/g4OJaagIOQmqDkwQkVx3J9nkZHll5XGUB9ZoTPysz6aUCS -oINE6gBJTVDsirZKPdd3jM+Tpdda99Aw4T4rM+t3YqkJEsXQGlkibsl4qNQzzc2nnr63pmsynm69 -rjKA+jxYEvReWGqCtmLUN7LEsr2+SwniZmx5uvXaJIkjwpiYWT+NpSbgVJ+aAKS5xyOdjLAA3Xpt -ksThPqvCxkcSncn1fuHis9QEdacmAHEsj4d6aNYOvbYYRhzhsyppfHSPnlYyBEtNkChGfSNLuFLr -OwGMcKa7Q6+nJRBjo5gE3T16WrYpzJwAKlYI0rLFfbv40qy+kSVsBfXty4s5aROk9Lo+f8ic8CsG -haXT+ammddYbMDVBs7xPp6Vf4WLQOOdlqM8R18A4lkcCJDRrSq/r84fMg2K8Me7GWbj5m2UeOieY -qQlAqM8RV72nEaQjpfS6Pn/IPCgmQed+qqmchefVhZOaAIEqHXG8i1a5LwfpSK16XZ8/ZB4Uk6CD -uMt6AZKaIIyo+cjBF46XtRpvXL9GrMvqG1kgjuXxwMlx0arXli2Fw10NhZcPwssxCdMnZmoCrS4t -DoHV54gDucI6HjihWeN6PQlRKIZwNRReLYZx1MDtVJipCRSLAZKLfTwQHMvjEea4UCSu1/W5C+ZB -uBpKymXUywFuwsZMTaBVDJCrleMB0tzjoX6nkRPR6yr9IfOgmAQ9ep8K3ITNq8sidSCkJhgVEMfy -eECFZo3oNbgcFEa4GhQ9jR5kaxVIagKQSB2iNuobWaKL1ncCGC0JZESv63MXzINiEvSElwPWhA0S -QcJSE5RBOMNhu+XMiJAv6ki9rtIfMjOKSdDT96kwzaAgLj6QSB0gqQnGA8SxPB4IAUMEUq8xhUAL -kZqg5DItfZ8Kc2wIzwxITgCQYoB7iWdAdNH6TgADJoG8Qq+r9IfMA3c1FJbI9H0qTMcOSAQJfrzM -HJ7jAeJYHg8oT6PjCr2u72LSPAhXQ8nlQ859KjRjKEgECZDzc6I26htZoovWty8HCRgiuEKv0SRA -F0xPowdthACmJmiUjmSQWNNQ576H+hxxII7l8VBPTRDlz3pdnz9kHhSToGdGboQyYYMEOYk6iAoH -DKGGE4YsqJYaBBDH8ngAehodf9br+vwh88BdDYVXi5n3qaBMoiARJHDiPHCqv/JX374cITVBlPf0 -GmrwI8BdDYVXi/leDhyPPEIECZCI8oIqRxaIY3k8wqA9ILyn1/X5Q+ZBMQl6r/tUINfJMFMTnDrz -9p2PHSk8n4WOYjQ3w/yAXGEdD0xPo+M9va7PHzIP3HVWePnQa0cP4nIAiSDBj5eBFKNKRxyIY3k8 -QFITRHlXr+tzF8yDcDUU9jT2ityIMFpAYtWLRZ9WMcT6ur6RBdLc44GTmiDKu3pdnz9kHhQ9jTPc -p1I3YWOmJgBxeKq3zuCAOJbHA9Nl7Vl44w/n6/OHzAN3NcB6Gj26JmyQCBIgx8tWQmoC3kVBzHED -gumy5iw88KNfIvisQABJgp6P7pgBiVVvqQnKAOJYHg+o1ARRFq6+dV9l/pB54K6zwuuj2SI36pqw -QVx8IJE6hJ9q4eZvqhRjPEAcy+MBGDBEYOvr96CtEK0duGKSFG6560CB9XX46F6cOvP2jr2HC5sR -P/j+NYf27hQXdsuba8NigKQmaOq6JhPtojW9YLQ/A9KaH90wJgdOagLDGAPTa6MeQByehjESptdG -PWjt0AED2xtVYnpt1EP50zK0sn5k9y2YsYGM+jC9NgzDmAam14ZhGNPA9NowDGMamF4bhmFMA9Nr -wzCMaWB6bRiGMQ1Mrw3DMKaB6bVhGMY0ML02DMOYBqbXhmEY08D02jAMYxqYXhuGYUyDhd///uzi -kWf9f2/btnXrtuvFhy5evHjs6K/Pnj2b/hjx4tKJV1897f9z8+ZNn97+qaHLXDmLR57zVb1hw4Yd -Oz8z+CPOnTt/7OjzZ8++Rfgfbtr0odWrV1933bXRljWMYlDP7BSllcnCw1/52qVLV8R3333XF2jQ -+v+kunv6qUPnz58Xfyk+Rjz5xIHXX/+d+NjfP7Rnw4ZrBi1zzYR1uGvXHcN2VppQDz79s7bfbt16 -/a7P3zHg4wyjF9Q/D//8GS5Kq1ateujLX1q3bm308y+dfPno0edpabgS+u3CngcfEj/69Kf/ii+K -oyocfoxq7fDhZ8Rn1q5d+/Vv7B2utJVDU+M/fl/mxBtWr2mr9O1v7RMz9HiPM4y+kFi/9NLL4off -3fct2vzxn1BPPv3qa6TUbil5zTXXPPTlPeVKqUSHXkcVJPwYQSoQrsFt8PciOud97et721YWQz2C -Ew4MwyhJqCThso90idaRfNlx0003jmE5RKNDr6NznYNXUHSLvUJmvAEJa5t2gvse+/aoj2j+NK2e -OfM6rVmEjcswSkI98Kt7vyF+KGx00T3iClkaRvTaG6bPnTv/nW/va/vLTZs+dN/997p/R20mf3ff -PZs3bxq0tJUTriyuvfYjd91956iPMJuVgUN05ce1mFbWtObgfnLHCvG7RPTa62xicd0wvY7aTLia -O+hjtBmnRVxY1/Rhdyyh706cZloqJP0//Zv+lhos/AZ64otLJ9xniB07bxP+z/D0y67P/y03QThL -GfUk+ioxq3eWnF755MmX3L/pM0586atcVdC3kVxu3/4p+oboymLHjs/cdPON/j/pD6kk586d8z9Z -t25dZjd1R3fCaZWW8FQh9Bb8Qc3ybE1/ErYXFZi6BxW4bTKmF1k88pwvpHPu0w+Xq+Jl921Ub6KS -Q3jVNbGGC59FUA3ztnDPDV+c3prKnz4M01kA8QHalfI64Z2ToOqlx7nO5ms1HCZtHDv6PP2V+7c/ -NeRe7fTp15rl7Sz9kBfA/ZbGXThDuxZPL0hdZ6OHij9PVx19norq/zM82pH+ALXmiy+eEN/pzyyE -ZhAO1QCNhXB0tw1eVw/ULhNaVrbqdXpx3bCuFpV1vrh2gyoh/Q7qB1TdvfbjTz91yHVWR2iBoZ5x -7NivxVO4r5lek3qA6JHcIkSadfTo8wkHnftOkomw1cOnk/6SmggLsrNQR1cWvhrbTulkLiuiw0Dg -R0Vme1EHEOLo+P739guJp28Wa6LOYofdLzwkQCOQ6iSxL6b6X1o6kW47GrT0FuFMENaYsE1Fu5b/ -AJX/+9/7gTjkQPuYJ5/4Ka+HTKtrWBh6TXp93kZ8n9S2CBXQeLnv/nvCFmzrbJ1/HvZh0WrRTs6P -kIU7dV+r9L4/efKnnUXiChAeNYkyobV5q16nF9fNn/Q6Kut81ZDZ9uLpmR8OW/cH+7/n/93WwHxI -R03G1O9dL+ysBP5X9Mpi2IfKRf1J/MSP2Kikutdp63b5Nru9D3+9s9e6YZNewgjCCTJa59QfRDN1 -OlGjuw3RN8LWJ82i8lDb0Z8LZUwQPS4WGo7Ey4aNy/U66tcVrc97Wpov7fly+qsa1hk6Xcrie4Tm -5siiRyidWD85+JCMfoC7uMM39SbBnDUHV55e9SBOT8AS12vaZYerG6pT3oNd1YSrjIaNq3CVwf+c -pCH8VS9zatiEfK4OR5TDt03aBJEv1tGSR79cwEdsqD6JGm5bFbbRqddOjDpP+4WIjh4trSBzORMq -JtfrqKx410vbIdQ2hF0iugrhxY42Lnc25IhLpkbkCKjve20i5axe0Trp1FyqHFftJ0++HC68uByH -3UxUbPgBPgtG39TXUs545JdCot4gqoSLFy+dPPlSaBuZhBcncl+GRgW1uqgaqjWqTd7ebjscDu9O -PyR9FQmiE6lotw5v4rTx4tKJxcXnROFd30rMrr4HhOLie0+061Cn37nztrXr1p4/d56aPHw1vuBN -X0sRJWliKwtaer9rfg36KHW7qKU+QaIw9FLbtm11a/zo8oca1LXX6VdfCzu6sBJEv0GQeUIx/Cpe -XW3TWxPrFc3ygNy+/VPUdm+dfWtp6USoO3ym7/R6RT/AnQ1tawVP/uI6Zwp0ZYsuj1yndSWn7kQF -S2huOA8JPXWmZzfErtlwDZV/w/L/Ny1+LN5knbNgevGXXky4Xup1IywMfxA1H3USV3j/IpOwYi88 -8eOfiH5Pchkaoahv0fgRek3jPNREX79RyRMHHqJNmL83CR/hnp5uWleG6Gd84Tvvakb/nL9d2zCj -enOOKepSJFuur+dvQmdeCESVlLtocvzG0VmQL3vbFvLUplu3baX3padkbgtC2fUdI31QPVxYhU6L -dK+LLiP4NNOpLNGtFRWD5oxrr7t29epVVIbMemibAqmzUYGdCct9VeKwpv/PdAtGf0vzEClap5xF -p0m+9op+OS9epzklOk1G/V5R7wLNW/Qik75uHdHr0NrourKQMPoY9TkxMPjwjta+a3v+k8QOqJNw -YLiel96NttkZvCk5qlzhLj6xxIv+tmk/n5ezhhKF7EtaYpoWkRIm47QFqe12Vf6GiRPOYb5jhIrs -fxUd0mGPCte/vGnStummpXG9srTNvrPFZohOgdExEn7SecL5T2h7Eapqeo3lcQcq6JM05YQ7pM57 -idEP8DpJW0uajCW8Jzp5ZL4IMhG9FviNW45JLmep1Ukv2794CmnHps2bRKPSUBTHSO67/x6xOub7 -02hjh4MtrdehfSOxBc4xI/h3me1EdufiJXyd0J0YHTBer6MLqHmc76IOXfWGT/FuxqZlWgovbSaO -unfapsOCNVc2fbQMs3m0oluB6B6rl59QwIdtpyXHEa4bOj200X2PnwWjXUs8pXN758n3xEzrYmS3 -XiesvQKxdw77dCa9rioJlQnt7E4lxQikR4iGF+fAwjfl0uYIJyQ/qqODJ6Fcvea22W6od/qCogZ0 -0ZXThw47F1B9EdrhChwOe75+z5l1oors+3m07bhtOqoaadt6M2urtRkoxGH5tmJnwuczqhxh+WyD -d49O23T0A3wWjL6p2JllhhZxZB5qbCZ1N7JDr/mSsFOvxUQXjn9aF+R02ejNiDbEqr/tnJMY5FSS -8KyL/8+cNVra49Rpy+MkgrREmWFFkLN4SRyl8qQHTLg0m9PtLh7nbieJihWFTBzg9aSlodNwFJVj -3rjR43ezxWaIVnhU+qN6Tc9dvXpV51PCOzvUYU4v3zGJHuJy8Irt9NBGX6Qz9IV40+gB2XTF0iuc -fvW1s2fPJlQu/9aSOh16zSs0rdfhO4e9doxz6ZmlSh/wEmvA6HeKRU102+i7V6fxgdN2lMXJU3hb -Z4agIjmLl2jELj5LpR3IOZEf+hJOe/Tu6Uib0WHP3zS6U+ZVmnA1J24S+YrKt7HmkD8Fpg84zgO9 -9fLJkF+HHd536fSQabMm81mwM1JCjp0qDa3xSbjDqwz16HWnT9wTWpFCzRKjy0cl93+4afOmde/S -Y9uY3gZ6IU4YiMOxFB1yzr987XUfuXjxEhU7/DauTZ2eE05UYnxHjFZ73x1czuIl+hl/miV6mbBh -7d55xG0GOvf4Ydu1xfV1l/5pxNJbhLrDvyc6b7lTj+FxRv/9Xll6ba3S9JoCox8Oj/fQK/hzbO+O -tHVr3YE8l7/C3Z53a2ohl+n7nNFJzp2HiZ6edCTOEYZv2tYZaJtIo/L1M697s62/uO+KJCoh7OeV -6LWor4ReR1+47QjzzcuHec8tH2FOjP9MEvfm+X6/rfDcVcWJDtoE3HAULVLCiBH1w/hvi04efffX -OWGeZjCAdh6enT9bRcILEl1pznDlR9zxm8Hvwuuhl401Td8psG3GdVNFW/QY19PajjO5Z5Eahjf7 -+Vv3vaDUXCkaOW/aeXbFdYaoK8hpOvWN18/8Ljw0MSX79c//6Z/bbg2J9VeivtpEtu8VwdkqLjrA -xGGMNr1uW/j0Ei9xGb3znCknJ8xTtAvmS2H+Mq1Xe4lJOsdwPAOJ4wptva7XReQwkEDfqbq5snE7 -j0nk03cK7DtX8XfvVWlNMMnlH3DydC6nwjdNuOV9f84/GuuY0OKaWDj6q2PR1wvXg21uscQLuxBl -OQ3Jb2H1JdpXhD5mBhHkUA8+cuTZzt4fRgWL9pi24wHRiUH01OgL5nsdOw88cDIlO3x64rTMPLSd -Ik1/eab6RENWJY7uut1hWllyjtlkErUopqfA/HA9YUiD/Nk6rLf0+oY6W+LQd5M92Se02PfnXqFj -SOWpaSaUoGPhj3/8o5DUhHSKYeC6b6cjhUd9DKF+s23b9e7y20yvIE8ghYElw8I7y1qnadXlpaXC -R1WbJCMaVVLc+o2GguLwYdkW6i8dKaUTMfLT+xh3Wze6vaXi0StTi4eNJfrGUCMhqrzphH4OUi56 -izYBcjv9NstbNDiff3Gua2HjCk2Z53iviL1FHZv6Rucwoe5HLx6N9eG/h4Zt2wBfWjqREDuqN/rD -6JY0ur7xlzDF6BMKk/mmibOG4u5xugZcayZiAsOycPny5WIP834Ajw8+AI53xXgm19J9ofelt+Y/ -8X6qkrSFoMk/bhH2upy2E68/xeYOW7CZ6d0dma3Pa3uk0U2rKB7xvGl/qeiL9D3RAEVRvTaMTtzJ -303LQWCiy/yphFIzjMExvTaw6HstyzBWDqbXBhbpMDXTivZgGMNiem1gkTjJO6G8TYYxBqbXBhbR -9XXmSSTDqBvTawMRfiBH5VyKYQDy/x/DPzUKZW5kc3RyZWFtCmVuZG9iagoxOCAwIG9iago8PC9S -OAo4IDAgUi9SMTAKMTAgMCBSL1IxNAoxNCAwIFI+PgplbmRvYmoKMjIgMCBvYmoKPDwvRmlsdGVy -L0ZsYXRlRGVjb2RlL0xlbmd0aCA1ODU+PnN0cmVhbQp4nF2UvW7cMBCE+3sKvcFxl5RkAwYbp3GR -IEjyAjqJMq6wTpDPRd4+M7NxihRjYI4/u9+szPPzy5eX7Xrvzt+P2/yz3bv1ui1He799HHPrLu31 -up3Mu+U63/86/Z3fpv10fv467b9+763DhraG/za9tfMPj18szsy3pb3v09yOaXttp6eU6tO61lPb -lv+WRo8Tl/Vzq9VQ6vsK6zWUhkabaygNj7SlhtJYaPsaSoPODjWUhkw71lDyRPtQQ6nX6mMNpVGr -Uw2lYrSXGkq+0M41lMaBdqmhNGhzq6HU66q1htLosIYsKGxeacFq4nUCGlgteGdasJp4C5s0sJp4 -h5EWrCZe12awmnizCoHVxJvZhoHVxOuqC1YTb2aSBlYTb2aSBlYTb36gBauJt6gQWE28RW2A1cRb -dDNYTbzOswhbQhrsysHqwcu6DlYXb5EFq4t3lAWri7dnVw5WF29h7A5WF29hdA5WD15OAcUlXCUL -Vo/58ttwsLp4RwbrYHXxFmaFOCXkzHFj5hI2kxeDklBIbYDVxZt5FcKWYFkIvUiwPIvJSCikVbDm -mC/DQfYSeCdasGbx9iyEahLa0CpYc3zPF1qw5uBl7JiqhJuJkMGa43vWZrDm4GWwGaw5eHUWrFm8 -vXoGa475ahWsOXjZBgKTcJZX4d9FQlc8CywJq0TAVyyldGHOKC7hKnaFSCRsZhoYspRS02awFvE2 -toFeJBRyvSyfTwgfGb5Wn49TN38cR9vuetL0ZPGpum7t36u333ae6qDTH+WnOLQKZW5kc3RyZWFt -CmVuZG9iago4IDAgb2JqCjw8L0Jhc2VGb250L0dBVkNCTytBcmlhbC9Gb250RGVzY3JpcHRvciA5 -IDAgUi9Ub1VuaWNvZGUgMjIgMCBSL1R5cGUvRm9udAovRmlyc3RDaGFyIDEvTGFzdENoYXIgNzIv -V2lkdGhzWyA3MjIgNTU2IDIyMiAyNzggNTU2IDUwMCAyNzggNjY3IDU1NiA2NjcgMzMzIDUwMCA1 -NTYgNjY3IDMzMwo1NTYgMjc4IDIyMiA3MjIgNTU2IDI3OCA1NTYgNTU2IDI3OCA1NTYgNTU2IDU1 -NiA1NTYgNzc4IDc3OCAzMzMKNzIyIDMzMyAyNzggNTAwIDYxMSA2MTEgNzIyIDU1NiA1NTYgNTU2 -IDUwMCAxMDE1IDgzMyA3MjIgNTU2IDU1Ngo1NTYgNTU2IDY2NyA2NjcgNjExIDY2NyA1MDAgNTg0 -IDUwMCA4MzMgNjY3IDcyMiA1NTYgOTQ0IDcyMiAyNzgKNTU2IDE5MSAyNzggNDAwIDI3OCA1NTYg -NTU2IDU1NiAzNTVdCi9TdWJ0eXBlL1RydWVUeXBlPj4KZW5kb2JqCjIzIDAgb2JqCjw8L0ZpbHRl -ci9GbGF0ZURlY29kZS9MZW5ndGggNTAyPj5zdHJlYW0KeJxd1E1u2zAQBeC9T6EbmDP8kQME3KSb -LFoUbS8gU1SgRWRBcRa9fd+8qbvo4gV4EWnyo0yfX16/vG7rfTh/P27tZ78Py7rNR/+4fR6tD9f+ -tm4n0WFe2/1v49/2Pu2n88vXaf/1e+8DBvTF+7fpvZ9/aOR/xOe029w/9qn1Y9re+uk5hPq8LPXU -t/m/R/niM67LY6hUT8ihomr1hLJYjdUTRrWaqieMyWqunqCcW6onKOeO1RMy516qJ5Rs9al6whit -TtUTili9Vk9I/KhWPSFx3bl6Qnqy2qsnpG51qZ6QbCHBWVhQ7ZMFVqE32boCq9Cb+RRWoTdzLqxC -b+ZgWIXebNsQWIXeYusKrEKvssIq9EbjC6xCr85WYRV6IxeCVeiN3AasQm8sVmEVeiO3AavQW4wv -sAq9xQbjVTCotpDCqvQWm6uwKr3jZBVWpbeYSGFV945WYVV608UqrOreZhVWpTdxXVjVvRwMq9Ib -7buhsKp7uRCsSm/hQrCqv1/uGValV/kUVnWvnSS+XJ4w2Tbw8QwG20ni/BgAbV2cPYNqB4vzY1A5 -GNboXiPgVTB4agScPYM921lFWKO/X64La6Q38ymskd5ke8YMBrXxHj4unF1Ju9uPqzy0z+Po250/ -ALzgdrHXrf/7jdhvu80akNMfVk8LMQplbmRzdHJlYW0KZW5kb2JqCjEwIDAgb2JqCjw8L0Jhc2VG -b250L1FaUEVYSitBcmlhbCxCb2xkL0ZvbnREZXNjcmlwdG9yIDExIDAgUi9Ub1VuaWNvZGUgMjMg -MCBSL1R5cGUvRm9udAovRmlyc3RDaGFyIDEvTGFzdENoYXIgNTgvV2lkdGhzWyA2NjcgNjExIDM4 -OSAzMzMgMjc4IDI3OCA3MjIgNTU2IDU1NiA1NTYgNzc4IDcyMiAyNzggNzIyIDY2Nwo3MjIgNzIy -IDc3OCA3MjIgNjY3IDYxMSA2MTEgMjc4IDU1NiAzMzMgNTU2IDU1NiA1NTYgNTU2IDI3OCAzMzMK -ODg5IDU1NiA1MDAgNjExIDk0NCA3MjIgMjc4IDYxMSA1NTYgNTU2IDU1NiA2MTEgODMzIDIzOCA2 -MTEgNTU2Cjg4OSA2MTEgNjExIDYxMSA2NjcgNTU2IDMzMyAyNzggNjExIDc3OCA2MTFdCi9TdWJ0 -eXBlL1RydWVUeXBlPj4KZW5kb2JqCjI0IDAgb2JqCjw8L0ZpbHRlci9GbGF0ZURlY29kZS9MZW5n -dGggMzEyPj5zdHJlYW0KeJxdksFugzAMhu88Rd6AkBLTSpUv7aWHTdO2F4BgKg4NiNLD3n6/TbvD -Dr+lDxL5s5zydDlf8ri68mOZ0pesbhhzv8h9eixJXCfXMRdVcP2Y1idZTbd2LsrTWzt//8zicECG -jd/bm5SfobYv1XYnTb3c5zbJ0uarFEfv+TgMXEju//0KcbvRDc+jAUc13qMCe94SqgCsK7Z4jwrc -sQW4U6zZAqwVI1uAUfHAFuBBMbEFmBTRRAPsFQe2AOF9jIEt3kfViGgSrVHURgQjMitSK4IRmRWp -FUGBTINUg4gtQFLcswW4V4QgmSSpJHVsAXaK8CVzJnUm+JI5kzqTsAUoitAnG4F0hAb6jY3Q6AgN -9BsbAVUX89qA7kiX/dqtS49lkbzai7CN66bHLH+PZp5mveWQ4heSYaHqCmVuZHN0cmVhbQplbmRv -YmoKMTQgMCBvYmoKPDwvQmFzZUZvbnQvRk1ZRExOK0M6XFdpbmRvd3NcRm9udHNcYXJpYWwudHRm -L0ZvbnREZXNjcmlwdG9yIDE1IDAgUi9Ub1VuaWNvZGUgMjQgMCBSL1R5cGUvRm9udAovRmlyc3RD -aGFyIDMyL0xhc3RDaGFyIDExNi9XaWR0aHNbCjI3OCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAz -MzMgMCAwCjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAKMCA2NjcgMCA3MjIgNzIyIDY2 -NyAwIDAgMCAyNzggMCAwIDU1NiA4MzMgMCA3NzgKMCAwIDcyMiAwIDYxMSAwIDAgMCAwIDAgMCAw -IDAgMCAwIDAKMCA1NTYgMCA1MDAgMCA1NTYgMjc4IDAgNTU2IDIyMiAwIDUwMCAyMjIgODMzIDU1 -NiA1NTYKMCAwIDMzMyAwIDI3OF0KL1N1YnR5cGUvVHJ1ZVR5cGU+PgplbmRvYmoKOSAwIG9iago8 -PC9UeXBlL0ZvbnREZXNjcmlwdG9yL0ZvbnROYW1lL0dBVkNCTytBcmlhbC9Gb250QkJveFswIC0y -MTAgOTc5IDcyOV0vRmxhZ3MgNAovQXNjZW50IDcyOQovQ2FwSGVpZ2h0IDcyOQovRGVzY2VudCAt -MjEwCi9JdGFsaWNBbmdsZSAwCi9TdGVtViAxNDYKL01pc3NpbmdXaWR0aCA3NTAKL0ZvbnRGaWxl -MiAxOSAwIFI+PgplbmRvYmoKMTkgMCBvYmoKPDwvRmlsdGVyL0ZsYXRlRGVjb2RlCi9MZW5ndGgx -IDYzMDI4L0xlbmd0aCAyODM2OT4+c3RyZWFtCnicpL0JfBTl/TD+PM+cuzu7O7vJHtnd7M5mkw3J -AoEkEAKRDLeISBAICRIJcgooBPA+CCqHEQVtS9VaxaviQd0cQDhaqPLTqqXaam21VanF89cotUg9 -yO77fZ7ZWTbV/t++n/9Onuf5zjPPzHN97+eZCcIIITtqRxxqmDGrohKx3+8uhKhx0RUL1xjnry5H -CL+86Or12p4j790FGX9BSLxy6ZplV4x63JtASILytuSyVdctNcpH4L5tLyxfsnDx/05r/A1CX56F -zJHLIcNdFViAkJueFy+/Yv21mfoeg9ORq1YvWmicPzMKodiwKxZeu8Z3p+VZhPI0yNSuXHjFkkz5 -aoh8a1avW2+cf/kXen3N2iVrHu76+FMoryOkVAgHUQGEgPAEKuDjyI9Q+iMIH9M0dXn6Y3qdpgTu -QL2ZgNButAdfjvagI+g5fAruehYdQD3o18iHJqIH0I3oh2gLEtE8yLkdXQyHAPk/xAXpHlSBHoZx -fBgdh7Jz0c3oIPJif/oTtAFt4l6HuzbBSBehcagBrUZ34gvTV6H56D3+VlSDLkRXojW4Pd2Uvit9 -T/ox9Dg6wP063Y9sKIAWwXE8/Znwp/Rf0BC440foPvQevseyF+lQSzuU/Clai+7nWnicXpb+BloQ -RddAG3g0HR3HR0kCnr4EfYT9+EZuAjzl0XQyfQxKhVALWo7uRwfxCDyFRIX56enp48gLdVwLT70P -daF9cPSiX6C3sSKcSj+WPoUK0GA0FfrTg36Lj3Kp/o2pehgxAUapDNXCldXol+hF9BqO4V+R1YIi -VAq6cH36DZSPhqM50Non4M4P8b/IzXBs4F7gJ6fHIweMy910tNH/oL/iAK7AM3AjKSOryYPcWiRD -jcPhWIwuh/G+F57+Lk7gfUQhr3KP8k/z34qFqRNpB8xIHP0E/RT9Ctuhpxpeh2/Bb+K/kQlkAfkJ -eZ/7If8k/3tpIfT6UnQFuhM9jf6F3XgUnokvwcvxjXgLvhvfh4/j1/DHZByZTVaSz7nlXBv3C348 -HLP4dfytwmbhDvHjVFPqWOp3qX+lK9Ob0UzAh43Q+h+hB6FnB9Cr6C043kPvYwHbsAMODUfxHHwD -HDfjO/EjeDd+EvdALa/h9/En+Av8Jf6WIDhEEiRRUgRHjKwl15AfkgfIq3C8Rv5OvuZ8XBGX4EZw -dVwztxpatYXbAcde7q98gH+VT8M4Vwo7hYeE3cLTwnPCKVGRbpGR/Juzj/aX97+bQqmtqZ2prlRP -+q/IA3MYgFGIoDpo/UI4VsB87wSMexa9jhUYuwAux2PxhTAyC/AK3IavhZG8Dd+PH2dt/zk+DKP0 -R/w5tNlOQqzNQ8kIMp7MgONSsoS0kR3kHtJD3iTfcBJn45ychyvnpnAt3BJuPXcdt5NLcr/h3uHe -585wZ+FI81Y+whfxcT7BT+EX8FfxD/If8R8J84VXhA9Eq3iFuFnsFf8hjZTGSg3STKlF2i7tk96Q -WwE7n0d70X6U88MnuI3cJG4vuotU8QXkt+S3gM8L0GJuOgFMJbvxVnIT7iHFwrXiGDIGX4RO8XEY -6xfIQ+QMGcNNx9PwLLSCDDeeJubzT0FSxz+P+vjD0LffwpOvFRV8M/lcVFAXRqQW6vwfbhif4F5B -b3PvYYl/GP2Zt2If7iNPcA2ABb/gxwpNKMo9gH7OteGb0F4yCSHrt/I2wOOL8FPAF2bjSvwVl0Yc -uQiwqIb7G7oVrSR/Qn1Ax1vRj/Fifhm6C1XhG9FH6GdAFWXClWK56MEvkcv5DpKHexDhn4Te1eJi -zAn56Dbcwt0vfk7eQlehV3krepd7Blr/Kvk5N50/JVyMlwMF3IQ2o7b0RnSd0MT/Hi9DHG5EJfwJ -4G43cpV8FNINwFXmA0/bB9R9EPjAOG465PgBcy4EvJgDHOJ+OO4FPsEDBl0OND4XuNhvUY84m/Si -ZYIDA9dBiH8ldTGal/4Zui+9DF2ZvgcNAX6wJX0jPHE3+gBtR7vxptQNaA0KA+W8iy8UJpNXhcnp -IaSDvEVmkZ0D5xdGuwT70adw/BxOxgqHUAf/RzQL1ae3pf8A2D0IOOx96DJ0AToJvfwMajifO4qq -UheRzvRkbg309z00M/1EOoKtaHl6FZqBDqPHJQEtlBIwx0n8e+jvDWgJuTi9nluSuhzGYTuMgg6j -dRXwn9v5Nv5W/mu0DWh+J/CbXUA3TwHlUNpH+iWb1q9b27Zm9ZVXrFq54vLly5YuuaylaW7jnNkz -Lhqn1489r27M6NpRNSOqqyqHD6sYOmRworxsUGm8pDhWFNUi4cJQMFDg93k9+Xlul+p02BWb1SJL -osBzBKPBk2KTW7VkvDXJx2Pnnz+EnscWQsbCnIzWpAZZkweWSWqtrJg2sKQOJZf+W0ndKKlnS2JV -q0N1QwZrk2Ja8vjEmNaL581sAvjOibFmLdnH4OkM3sFgO8DRKNygTfIvn6glcas2KTn56uUdk1on -wuM6bdYJsQlLrEMGo06rDUAbQElfbE0n9o3FDCC+SaM7CZLt0KhkIDZxUrIgNpG2IMmVTFq4ONkw -s2nSxGA02jxkcBJPWBS7LIli45POBCuCJrBqkuKEpMSq0S6nvUF3aJ2Dj3Zs61XRZa0JZXFs8cL5 -TUluYTOtw5WAeicmfdef9J87hYe7JzRtyb0a5Dom+S/X6GlHxxYtuWtmU+7VKI2bm+EZcC8pmdza -MRmq3gaDOG2WBrWRTc1NSbwJqtRoT2ivjP4tiU2iOa0rtKQlNj62vGNFK0xNoCOJLr4u2hUI6AfS -J1BgktYxuykWTdYHY80LJ4Y681HHxdd1F+hawcArQwZ3qi5jYDsdzgyg2HOBJdlrDGLFKTTt4uzI -Ytqi2FRAiKS2SIOWNMWgT6NotGQU6lg0CorBrxnDXcnFMCOXJy0TWjvU0TSf3p8UStSY1vElAgyI -9f19YM7CTI5Yon6JKEjxJItqcN2Ek4lEsrycoog0AeYU2jiWnY8YMvjqXhKLrVE1SGD4UAOM7cLm -0RUw/NEoneA7enV0GZwk22c2GecauizYhfSKRHOStNIrR80rnjn0Srt5JXt7awwwuQdRFdmTlOPZ -P6fqzZu0fHQSe/8/Li8xrk+bFZs2c16TNqmjNTO202YPODOuj8pey0DJvAlNXJBkIBLk2FVAyvnZ -wvSkSUnyJfAnMqRe3CvJgJUsB2uTk2rr+UbcbI1G/8ubetOn6F0sOXdbppnJ0YmB52MGnA9ontLB -QYNBvE6bPa+jwzrgGqCaUeHUTAIYj2Y3RbUJSTQHKLME/nrTR0fR0BxM6jBkE2gBwD8jK3M6oGAw -AzfDj2LnkMGTgdF1dEyOaZM7WjsW9qbbL4tpaqzjAHmOPNexZlKriTi96YN3BJOTtzXDWC3Ho4cM -jtErHR2LOxFXAtXowU7MgJoJdzQnZySaY8nLErForGkJ9KVzNFKis1snAETQ+M4Y3jqzU8dbZ81r -OqCCVbJ1dlMXwWRC6/jmzmK41nQAjBmd5RKaSzPpiUZP0DQMQ9NFZFY+eADsmHZ2lWcZ7HxRL0Ys -TzbzMFrUS4w81agozirSQbFc1MsbV3SzNA95spHXbpQelCktwxWVXjmIQOIgdtH4dcLJ7CbdWqOP -1sfoY0k9gRGhWV2QcxDKjsGoeyyux8FOeObFLLsXt3eO0YMH2JMuzpRsh5I0rz2bBy2nxXIeBPUZ -HZ9zrgdz5jV1j0XwfBZDifH0RzktNCKXhhhjong+N9GkkI5pswAD6UXrqKA157JGb0ziWHJB7Noo -7V2yMXZdFDJjSQ24NRTqRFNCzR0dGhwxGJVFjU1GTC/hwSF4UnOy/TKzbDAEOHHuVIFbGV51hygP -ydZ2g1nbWqiNAh1mdclF31sbtD6JL6Ex+2PN7xyJYkb9IKWNSjvmd8wDfIwmC2nFmXbAqSPUzJ4A -LbmXtQQz4bQIdIKllJY0yuSATcYu6CQXJViKWdpxQWzSYihBAwjdETBZUW1xMy0Vo0RDEf8/FsI5 -haggYQ/vUMeYZzhzZpBvR3LZwNPl2dPJNICOUjLUYBPQF0ay0eSKYHJVcyJbZCHtcwfQ9mhK4KPZ -zVNoaAWxMyXZvmghNBHkzdRFMci4ADK0psuMEaSCuoNqTosWwm10lDM1Ja9MDHgk8AQMLAoeRLuT -bG/QWpu1VuAheCYMdlBLCpBqS0F9ii2kfKPB6E8DMH9IFnbMgnsRnbZgUgJ+tnThkhhlrkmK78bo -0zby0Do0qymJgh0dMcAhaGLJZCgMj48nxfhUmsDfmkRs4RKq2S2lit0SQ+WA5rLRoU8LTopFm6EI -KWFjCQMHhHYZjRZ1UL2xpTUBI+HqcHdotR1A8C3Aq/j4osZW4Guaqk3W2FQvDMIZDMJUetYMDzIK -WkpoQbif/cWTVyQ6W6SScznsb3XCKCyzpzIlItlgFpHYHwBtiSTxjYKLtPP44nlMLsBE0cETSqbC -8OqAVUF6N1DR7IzYMO6fSm8NmhNm3AY5zaYAAHzvLMFbG3I54fyke9rFlwRhYIdQyS2NTV2EJqjo -m2e/uR7aigfaGug2muP6MdkL1vLLSIKnqMwWQIIvnUYCIp2zN42zcYPpQYpQIYqAmV4OhSNceZdY -GOnlBnXH/ZHXDnNl6AQEwpV1JQojB7hSrrBrTETv5WLdbk+lc9wQToOqKlisQbwawrMQjkDg0QIu -DPkqxBsgtEN4FsIRCK9BEBGCmF7VIKyG8BCEE/QKV8iFurSIOq6UK4B7C6ADTs6HPoeQhsBBO31Q -qw/NgLAAwnYID0EQWTmasxrCBghHIJxiV3TO13VPFbTd13UHS7pXrKpkpwuN0/kt7LR7brORTp9p -pBOnGsVGG8WGVxvZQ8cbaelgI3WXVLbT1GqvPDrOy3mhk15o+BqIMTmGnBiDDbqL86AkBMKJmRyd -c3cXxysfOsLxCHOEw2gxiqSPcrjL7qocZyVp8jlyowj5jPQZV0hft8NV+dC4C8j76FkIRyBw5H04 -/kr+ijaQE3TMIa6H8BCEIxBehfA5BJGcgOM9ON4l7yIneQdVQKiHsADCQxCOQPgcgkTegVglf6Go -xGIK10Mg5C8Qq+TP0K0/Q+wkbwP0NnkbmvZ6V01t5QEGJCoyQKQkA/iCGcDtrewlv+/6ugwwKg4z -DRh1iCtCY1EVV9RVMhzQz99Vd3mkl/ytW0tEdo0bRt5ASQgEWvIG1PwG0iA0QGiFsAaCCNCbAL2J -2iHsgLALQhICYBnEKgSNvAzhNxDeRMMg6BAaIMjktS6oppe82hUfHxnnJb8lLyIfjPhx8muW/oa8 -wNJXyP+w9CVIw5C+TF7oCkfQOBtcR3CPCqkKaQVcF8ivuovdkfQ4FzkCYxeBuAJCPYQZEBZA2A5B -JEdIUdfiiBsecgi9LCMo2YU+YenP0CMy0ldE9PgEQECNRvHR5wEE0UPaQ3Gix3feB6c0it91D0A0 -it+2DSAaxa/fCBCN4quuBohG8cUrAKJRfN4CgGgUnzEbIIh6yYP7i0sjNTNWYm2ck1wDo3QNjNI1 -MErXIJ5cQw/0NU/b9pOu8nIYsfv1RFl5pB30o8O4/WLc/ghuX4Lbb8btG3F7HW6/FLcncHsIt4dx -u47bD+FRMBTtWO8ZcFqr+3H7y7h9D25fh9vjuL0Etxfjdg3X6L0k2jW1iiWTWNI9jhIdpOeNBe7j -JFEY0SjgfBR4whGIX4WQZmc6FNKKjMIFYZoWdZfXG+dDR1euBvJ5Hm58HqbhefQeBB4m6HlAo+fh -Ic/DA5wQ10NYAOEohM8hpCGIULoIGr6dxU6IKyDUQ1gAYQOEzyGIrDmfQyBodaaJz7KG0UZXZBo+ -AwJPnoeDelCjJKoXqiE1oZ7PbQ9hZxjPCKfDpAZ5vcDT3S7Z1Yvt+/5l/+pfdmQZZyF3ke2UdZMd -mXR719fAuvG9XfFDkXEe/GMU5gHzcC2K4xJIR6F17HwECsk0rUYh8jSklV2hRrjN2RUfHDmIHfSu -fZGvQycjn4R6CYAfhw5F/qj18rgr8gfIeXpf5I3Q7ZGXKnplyDkc78WQHNRY0QOhUZE9L7OiG+HC -/V2Rm2myL3JTaEpkZYhdWGJcuHQdnOnOyMXxeZHz4XkTQ5dF9HXwzH2R+tClkTqj1Ah6z77IMGhC -wgDLobFlIVZpLAw5PZERc+bU9OLl+mBpp9QkzZBGSpXSYCkqRaRCKSjly25ZlR2yIltlWRZlXiYy -kvN70yf0BBWc+SKTnyJPY57BKqExQUyuEiwTdAFK5nHTyLRZ4/G05NFFaNplWvLMrFgvtoLxKMTG -Y5DOaNrs8clRiWm9UvriZE1iWlJquKSpE+O7miE3SbaC+TO7qRenadamIHXTHEAYuzbdGaTpoE13 -Njcjv/fqen+9e6yrdvLE74laM3Hi3M8/AC4cn9w5bVZT14innioc35ysZHA6DfC05A+oO+cA/gKf -mjTxAP4HTZqbDnBj8ReTLqb53NiJzc3TenEjK4c0/A8oB6jzD1ZOBilNyyFNDhvl7jfKlcD9UK6Y -JlDOYkElrFyJxcLK8ZiW61xXPGliZ3ExK+PT0DpWZp1Pyy3zcgmUKSlhZbzt6GVW5mVvOy2THMuK -hEJQJBxiRXAAhViREA6wIo3nilRkityeLXI7q4nD58qEjDL2E2YZ+wkok/hvf0vGJxK4e0zzovnU -FdYam7QEQmvyjquX+6lWr3Uuas74yOKtly1aTlPQa5tjSyYmF8Umap1j5n/P5fn08pjYxE40f9Ls -ps75+pKJXWP0MZNiCyc2d09pqK4ZUNft2bqqG77nYQ30YdW0rik133O5hl6eQuuqoXXV0Lqm6FNY -XYihekNTp4zGN0+Yb6TdxGYFtG0FW2C8V10zluHwmKj/5uBBUF12I1uiOanExiftEOilIeOGjKOX -gLToJQf1d2Yu+W8eEw0exLszl1TIdsXGo8T6q9ZdhfyTLp9o/K2DH2Stv4oOuBEn1v2nH1yblNQX -TqSrq9OS5bOmJevBgO6UJMhtpV1KjjbzbLZJvemjRuZQyBxNMzkuW5Dm1dE8iyVT8Lvzf1UmnUCp -oJ0c6sZ6GK9H65q5ZHjabAIcYXbGsXQQFCsqK9Y1QwfX4QReZz4j0+xEAhnniPbZDOuvykCZsVif -SY074ZZ15pBkf3SwEtkRW88ey4YzMb9pnIMbyVWgcaA7D4N0CKRDIK2EtJKr0N3xCEdqIha5JmKz -ToxI4sSI+dTmBGKOFTAcBNDZwZ4Y30PwSVHqJffpeUjgT3LIKvEnMSqQReEk4Q6T4ciC78NDkT+h -nqnrr7tIPV03vb8O1QOsnoVo+LCoK+oqgQiYLjqrcUfP6gL6Fmn8UagLXcp1k2uEg1CdDf0guSkB -I4zSX3UXlVQLvemv9KJ4WbVNtEoCAoEmCKLtM4sscxxBklxndVraLcQCs6Z77M5qy7uY4+sI1u2u -alygtD3hT0BjErQ1an+ipY41SoWjvw4i7HLX1tIwfBhOJIK6gnnJigQRRAaIA399vXrMVztseHMe -N6LKw1WxeEfl8SHvDD8+jOvGvlOnUp8YMZUd8yCrlPWijvZB9yCBw8JnBHEbNbwDE7xCpO1Rz7T0 -ofo+bNQb3At90lltgeO15yrbOpRV4f7yy9Rn8OwbUzNJq/A62HUXsWdbS50guNySrKq9uKobPeSQ -IdVd0kOOSxGnchrHcc+4frqNVdd/pk89A3XW1cNE4JZgN3JKmHYPasNx4qquGVlTJUpweFSM3/vR -b6fPO7zxutLzYgmcSM08jL/Cjs/e7v/2teaOnYd+kYqkNDSgRVezFimDyCCVWKwqRm4LbZP1IQ5D -2gOG2qWO3vSpHlUlcwD4qsfpZMDJHrudAX/XnVYrmeN0RBzE8Yw702qKit9pOXZazJbnxZCrujQO -R5XX5/WopH8jTGLReaXXbzw8b/qrqZn4BP7r4QM7O+b9/tv+tz9LfZGSabvXoj5+NL8PMK2ZtTuC -rrSQr2XuSkESLVdaeevXAr6ynswghBQoc+cx/GmZfrqur049WVeHKk4D6pyGedtPycMqcaSXq+pc -xSF/RaKqsrKqogKaVuKKjoi6qlxRT9RFcKoNb38Kb0+19eF7dtN0d+pK2pKnUu/iW9FxZEWLaUv2 -WoHUnhZ7cYMex1wdIdiK65AVLESuDomjpNEz0AK0Gm1Au6DmXbaH74VROt1y+qQKLQOsprHap/Yz -xKJ4JYmY+kopXlUch0ZVAVrli1LpyJE1+443zK2sHckdP952R3x6wcJLoDXjcC9ZQa4Aej+PjUvB -GrKGI9PxdGhIDJGAsAYKFfBr7qQjcrJF/RBVTO8bPgy1wbR0IR1mpSJAq8kbEfWMI2W4d+9euOEg -dHQL9JFDNeypfkK7VGd05FnE74Iyu3jWlzMtjC6g6d3ZhmeaffD48eNMO0t/RGoB5zhjxA4gLv1u -V34t6U2/q2v5tT/mMOEe4p4Fq/pqhPPhDmBjwKu4jxH5GHDxyb0I8d3XQ1116uk+1cCrLcLQRMtN -6jGKX8ADuoGTmRjmwVUYP7kj1VQg/P2bfGAJc9If8S7hKOB8IU7RFnQSw+EcCPNCfthu9wEj+pjh -NwX0AorgFhdSaA7yKgrECs1DFYDcxyE6Dj1mfe4Uv/uk0/AkkT7pQ6AUBnymF9hsIn2kSnOQqig0 -pnnZR557pn4RL24hW21bnS85BItk85NJeRd6LiiYEJydN98zv+Di4EpppW1R3irPyoLW4HXkGvFq -2/XOLeK90k71Jf/b5E3xTdufnYFsk8ap6dNIQQpMTyPypb8AGrJl4K+QHdmxrrsafessejRWPQzo -1KICZx5nhZvMgpb0x0bB/Y2WHRGXoii9YB42uhw2mwHIdjsA3Y2udYiydAWepCHqFjOLIjlTFBlF -9zWiHeEX76D4A11vSfRBTMGWNgZmhgK3tKGWJJmQ1BuaekStQA0BQ+oimu2X6RPIC8ENwQlhFP1h -CM3NzcFOe34vV9Gzym7nAwB0reIFwIxEfYKiueoeWVXp9bqB8YixotJ4nuqtqhzpUuOxIkmcs/L1 -XVd3rR+/4vWH37ju7gNP3njjk0/efOMFLeR1zOPznlnQnUq/nUqlnt9z737809SPPz+Fl+MVn12+ -GXD8PRCI3wKOWbGDYli3NdtzE7Cao4VMwGqMRXZQ9GgjRyXgSn4D2U7uk/lneGxBokA4i4AVgl+2 -stG10nlCmDrzwD5i/BmAT3UXQ9cQQ1cHQ1cYLb2AIqOJcQz7Aoqgg8wV6LMc9FkC1gRdIEKB7SCu -w5uQwSrajBlhPzgxNIN6Xy12UbnbglpAzLAfCGCCLaIuCBasWOhY17trgasAQ4MRj8ZcoiiNAPZV -Rb7tGff67B+/X7Gev2HsjZGfT3l5AfShDqhbgpELk1JGmwZFWVyq3Z+XJ86xU4JyuRjwmW5RVYDC -+UKYEqqPFgiH6dVwyAFXwgrtYbiXHII2WX0+LaK6CNEi0JSKN2iDKo6jCopgiXoaH6ukJEyyFSpu -N2EV6hani5j1nNBt7jwyJ5xP8+izu+DRlGHYbGSOj8pBNtrfVxulalofrY1Vpk8ZI4wRDwlHxEPS -i/JLIWmq0qzMdqxUFjuud1+fd7v7sPuDwAfBUwHliG1/HglbVVkUXw4F8kOhgBwKAKeUAyHOHlZ7 -yWPdM1zY1Yv9e2k7EW1YNyaKdQC5W3PI3Zold3ujdZ3vdWC0lOTxIbIRaUjFo3TFtbeeLCCryQbC -k4OkGEXw9k5GpC3AeM8kKP9l1AnCtL6vv+Wky03xAaItjqEJB7BjQ4plSFa3BNWQWqiGVfGX6VNI -AkKVIbVAMOl1VDNqwS1rgWrp1NqDkmQnYRDNPauIkm9n1JufoV5XrasKhpTKaU80XgMINXLkiGqg -WyYcgahBTIIuJEq8dLaG+Eoevf/z3ffdcMsD+EDeV797/cz5Tzz3yPzwnj3j6hYdvfnYB0tX/uCB -jrxX3/p0T9NThx/bunA4YGJj+kPeC5iYwGdypIStwK/T+fWHEKYkk1DgBJfFrHan4gxbrWWecIgP -l4WEMnvMrvgLQJHSVEqEmhSnWEKLxysojweBDgdy14KGCnIMOtP3gvqCu1Y9lqikgeLHMMHutU+y -b7bzk1xzXVcHuYu9q9QV+Yu9V9mvy99s78i/Pfi43WpT7A5ewlAfpohAF2kPYbpN0o5H9CiKh/cf -JI+hArJct0DrBGie3T0AL9w5eOHOEQPudQu01RrR/JSOtHZpwE1Szk1Szk3SujiTHXGM4mqcQK9P -76f3x3cM8ffiUV0Fr+ODeBSoAUd1W1Yy7Bjci+/JIFeij6FXhvmfTrRkZUD/SUpGoB9RXDNQLYte -XYLGAXUCGjVTdoTbKBIhjPmYYndaAXf2rnI6Q2U8QPtXldkL/P6Qh2FUiGFUZUUVRSqq/9VCUkWl -Q42XSgOGVVJNFjQRjGKYRGMUK4o39kR+tHLDs4/cVHVhvtu2rnfzisu35fdEP/35tS+vXLr4lh2p -j9/8VRrf6r9vS/KWGx/Of5Bce9OiW267Tdv74rKuxQseGBr+xV1HU19+SO2oAHBAFSwQK7KTEMW8 -w0hJf2MMe0+jXcwIEMGUJKIJWLKyxQQEU7aIJmDJShsTkORMYdkEJFM6y3K2TEY0ySYgmIBoAhYT -yMgxvabR3aQsV+5XnlReUoQLuQvtP+Q5N7AspIicJFhtnATS0G5/mePzOY7n7Igodl7iDpFDoDgS -vEu3Ip6HIuhlK99Llu4XBKteGKm2mmLOauhUDPiMKVfWXlyj2yW9KFYttUdHSDuchNKozZ5fjYhK -NAKKPtxM7wHg5D56D9nr6MXbGOr9neoeVMqdpjKhTv1QZUIO7OAzda7aWmbsbRma4IGzOZ1OEHvM -jWAH9dVdC3LiDd1WVcsVDanl+MLCOmaEAyJCGT1f0W21SntDraLHa5WiEKRDag0zHX+PlwolgvsU -3iJydrBLKvdT1QUpvClKE1VVlYYsBQMFV7mqPDEX58JkZ/9t5Kc/eOGFntQIvOBxbt/ZCx5PPQyc -+0f9K4EhUK03KvwM5KrENJI8E0fcJpCnZGbbbQJ5SmZK3QAcoIRuMMEDCMOo2ukw4pDDGvZ4Qm4q -ZG1Ong+H7A6MJD+oIEyFZgBjmFT8UYZHCRm60X8MmBzlcdVuJqadLJ4WuK6wo3Bn3hN5zytvKn8O -ypY8v6M8wOVZPe68vJcdznxHXr7DaQc+p+fRqnXHLrA3HU7dgzPN2O/k8euUB4Iw1F20Qa4F6mp1 -g7pd5dX/mof5GQ/zgxWh+onf5GH+HZr7MB6BnPhHUHJUl2Pv9/GyyEBeNoCbtVArD/gXG4MW4DQt -wPxPbpGHJgRAK5QrMHssw4RhtoMgJznG1yhna2uhrh1T0UIoZM9zgL7BewwO5/E4QzxTd0N2pxsk -Z9cqJ28KzAoaAF9chtzMZW/A0/LAzuWAryFPvgS6cHzOLzz3rbqlZ8+2udsGPXkXeat//4zb7j6K -5fV3nv51P25XO+449sj9XTPqveQfz6Sunp8687sX7+46Ad2fDpjmAblZiMrxJzmSM+LEEbwAczg4 -KKzbsd0O6lRQKArn261hjEpUqmgxW0sN+1SKOj4mN33M1vJlDKPjbxxX/8dEoZY+9VgLRaEhKwvw -REn3TCyYqM1zz9ZWcoulxfIK92JtvXxVaJO8OfSm/IbXJWl0DksNFiDOiVFlLkihKLtAm9VgJ9Cw -IH6d6qK9VGKajcRUdqG9JQPwpyQHf0py8KdkncrwR8VIBVYFfTu1n+rc6o7BwKNGdYdNogubbDgM -XPMQe04Y1+r2et8C32rfBh/vUzMFYDQYW3U0+rz0UT4vbbOvlxR3J7KmkyErc/GtzxCcTGDCgGWR -6wBVwHpKtZgW7TWxiz6Ays7m4F6MBat9EMMpuz2YX8RwKt8eFJjIDArncKrSwCYsxUuZ1SRKVDq6 -qfoVK0IutYbKSpyfg2vct93+wVNXNo6bcxkZd3hZT/81r93219TJn97+8Z53+mtm3HXR2sceueH6 -p/hZjhXDpg8b+9lfFrWm/vX7jr6b8TR8I37yV7ufO/tOy1PNvQ/e++yzMEsLQV56hSdg7O9g3gnH -MTvm4Y/IvAWECmVMwwjmLYp9HccROi0zmFbLkYBTXmf5XzQDsHIB4eohWY03gG1X4MgQMPUatdVN -P913kXqG2jzU20C1XdAQDNUW6DHYY1E4wBVKa5jRWlV9xoMiIk6UYiPd7pqF3N5tqb5pI50HuFv+ -eTv/zZ5tP0q5U9/2/nkP/hS/+ADi0CygmgKgGh+KoWHkhXN006OgYHgoFWNg35A5Q4e6o2FRGBR2 -28NU4DMnxel9zEeRcFIPHSUdp2mQUIBddPo5033HmaW4LMlxxR6FFvewJ3oYyXnO+SIGOjqoDOpj -bk/DOtvPGiKaDRGNhpxkfg+nKWYz9dM8AM7qRTSTVkvv9DDe72E9Pdc/szKoC1dkGmAGSvXTR3hx -mXeqd2r8Q+WTYYJlGL4J3YRv5NfLbba1ylX26313oA68jd8sb7Tdpmy23+n7jeuFPLeCwn6kQE27 -huKcwRxA1+Ecug6bdL2vMbzuiAVbxrnJMpTIKZ3IKZ3I4QKJdU5dAy7gxMipOomzF9/dU+k3Sd9v -kr7fdIL41yU5zPWSZd3FZqFis1Cx6VQpXucxTXXNo3uIZ8fwF01ZwwQMc56czsqbrPLsrm1hQ2m4 -rLNsoCh9oiukBYAJdGlaBU2GaKCzn+gs0xhXMOROy9o21AZ2WTeM3FDGFoJB0T2IsQW3XYwytiDm -sAXmBcfx+IjqjDFmqsoIcvLyc7hBLmvAK9as+vDI0U9XXrHlztSZt95Knbn7ss0rl2+6femyraOn -7pi1cfeeWzY8wQXL7l2x6+33di39cdngY1sPp0HNP7r9V3j28ttuXbBoy21n09N3zPhZ+y1P7UYZ -fx+lrDAqJ/PO+RT22yIg3UtcINvPMLSkQp7JBT91lAyieOl3McR0MX+Jy+8anLANClMP9wwH53Dk -owaMmRFoV13iHExVjSJqfNPRPpZoqWQct5INOOAsJSKVyq93/ifrZ8hpxDl1SS9n+pKL0eJ/qHVg -Xf9WVUVuRfqU0YELvXrsEu/c2FJulfeKwLLY9YGbwtsCd4Tv9z4ZOBz41PuhdkbLO8/7oHePlxtd -tlgkg8IzHAuoXhWileDXGwxp2EOrjYwrzcH9SA7uR0zcpzCuRbaccrb0mWw5W045Gx6luwYqWzsG -U1m7F2StSQUlJhWUmFRQss6VpQKX7iKuHYkBVAAiMEMBGfzPqlznROAhVAq6VSx9ojuqiZrpf2jD -Lc1MAPI2hyEAYcyzShWThLleiKwANNSpsWREdSmVfJAiQHy3i3kW45iht4fh/Zo93hsXzrqpYSQe -eeiKfWex9ML2vhuu/8cjz7xNXnl8/bVdT95408N4lnr9lRdu+NMaxd+4Est/eg+r96f+lvoi9VGq -++dHuOqf7Dv2wDYQf4DfBxDCm/k4W+Mz1pU0sBVEyULEOp6rwyJvJXWgdiNCfYQPy5k1hzYqy/pU -Ywkrs4ol8LK5CFBvLANUeehC1oHjx49zzcePn33i+HGoka15sBod6CFWY8U62622H9getZ2yCTCl -cWuNdbK10brEutf6vlWyWR0SbYlUJ4qCg7c9baXrIzGhjmeN24iQIEp1vHWUbbRQwdfzROMx/7DT -bGjd6ZNgiNGFEWqM9ff3qcYqCWs6Ul+iYhitbQvut1kHdKAitwvZRZPjmWUTsz/m4gnd85OaKf1B -+AOagubiEaxfc/moqnmj0ZIR9irHJMdU/8To5OLJU6c0znZcX+bwlpThuKW8MF42IjCydkJJo7+5 -8JJoY1nj1ObGJf4lJUvLrg5cX7i2eJP/tsC2wjuiW+IFDrXBgbhZVCmxOkuH2RpsxCZ5D5Hz0QQ0 -jRzqmTCas0aoETMaa4k1CZI4iKejUnJoX8X5xU4JS73kVt2pNoxFxe5dzuJh6hpQLg/iJ1GQPNhT -P6q8GMpbUIw8qFu0EXhEQdPcbZm1r75+aom09J3uh8Fs6UMVfX0twDtOwjDWt5wEyshoNNQBF9SD -5eUVo52lFU6Hc9Ysm807ehonI693ghwZTddVqurBjKhnhkSVu7ayvqoiY1OUUNSnTJ/51X01VZyB -8zUj3SOqSXGsiCeefDdfpRXXVIkiHysqLi6F0jVuFK3k6fofMz1K4zg/Q0tANQ7C3z7u4ZnNuy9/ -9Iu1cx+sLereES4rHNG4dtPTqT3HP03d9Ic/4B98iUV8WdPeqq9ST/3j3dTtqa8mzF58Pf4V1r/C -d6xd+Jt9f5o0J9+e8t4ye9SNbedvWai3rdAfnXbJ8j9tfAjX77qk5Sf9C7c5g6XnNWD79idw0c// -nFr26ZepB59M3nz52xvWfvCjX/z59DvYibVXXtrzSurdv75cXlqAL7z93gm3vbJ0685xO34L2JPu -BzRuFg4CFTpIB8WecYVgJ3+V43w9m4UtOflCDsybcI47RuSzfhlF+WXmlm8MZgrFRJvtl5l7T5uZ -RDEz8blM0Wp6c7zm0oNp6NtMp5LVanqOTMDiMJth5khGzv5G7HCqzJHyRU8G+IrJT0LVymamETLt -TmBxhTpMXSYvt7SqW7kd6kvCC+JR9ZRqk4Vm3Ega1OW2pPpP5Z/2fzosvMLbeQdns1oEnlfsDlmU -JAVgWVQkjBDdTOBkyxqapOTDJcJxNM9D8ziNV/LhLktYEOSwyIm9ZI1uQbLyiU4wIQexDXQFm+5W -NLRE4i5u4F/l3+O5HcBvejHWbQ3KUek9hduhYIWeq07pVYlskNolIv3A+eYfDX5UAAH+/EA6gQK1 -rw8Ioi4ApFRHF3H76FJkAkz5LUP9LDW2J9TWblGPHXMcO7ZFMFJgWtOStlnTkuGZ8wx5NK+ph3dy -snQwfYpunDD0rrVtLd/jIMr+gp2y2MsN15VVsowwMD9ZwYQRaD1bcACSjOEqHOOiXF6Ui5eKEkeq -fkea3nm6/ycPv4X/cd/kolCVcPCbyfhwaiKZh3ceuObOO4Cv7wSb6hPAZRez4t811mkBwfQyukrJ -85NjjbGlsXWW2yzi5YGrhDUW4P/CrTax1Gvh/KXlYW+hBfTpj3Pw/ePvLh/q/kaLJc8dLi8vK0Oh -wjBMUCQcdiHZD/emsvf6czQMP2gRCrvX2uiPiwo1Z8Te9Id6CVWeRDdVnESRIoIo05aKDPXEfIqW -4uySAc8daLubz1UbS+JKiD5XsdKnKRSZFfosJTAY2vgdu91qmuVhjS3CaZkVuDNMn2NAZvXtmx6G -tQYgGutxVrYG15IYM9+fXV9rqeun7seL2Pl0wwdu/M4tt0CA+a0DuUhVS7oa4q7FzB3O1uKCXRZ3 -OZike1e53RgZSyhIxoWGlUpy1HS6OO+K5nizHSSGo5XGako8FoVrNYwRA7yTxHe/sm7psk3b57b/ -alvqB/i8jaMumDb5lgdTf8ZXXBqfMG/07B9tS+0RDjYfWHLpz6pKD7cv62wdzl3s8i6dPnV12be7 -JGXUyskXX0dXV5amPxKuFl5HhbiC7ZtYRFYUEmyYrWxsPtYXUEhDlfZFaA1aX9iObivcge4XnuYe -tx/geuwv2l9DJwv/WehyuAtdhYVcuTjIVR7SIlPsjflzPY0Fy4WVhTe473Dfz93nuD+0Gz9Gdrv+ -4MhD+Sig5qsBnm446BpUyxR4bVCt6gQCCuaFFS4Y5i1q3HkBimugaQciPnPSfeak+zKTbm30xTUZ -A19mp/ZGmWGKXBBeNN/Ys5RoYRMIcwlAxhnj8hlblVroenYigdcGdSvwNd6pqgof7OUqe1bxFiUP -gK5VCmfMFZW0mWUJ7GOCE+bEXVwFUlOKU9WSylWqXPI9z52Xev6DvtQff/IsnvDcX/DgMUeqnvvB -k3+bf8WHmx99n5Dhn3/7K3zl7z/AczpPvDJk1z2PpD6/+1Dqk47DVAN6EGTYPKB7J8yLoUu6tQie -IBvU6VLDTiT7BlDRwB0EJhVF6MBYcIQtlVkYSVisbEeFn+UwomISIhApVM1hVa0Zf7NqKP5AVOp/ -TVT/MonqK5Oowt9DVJnTlgGUNHzYhOv0kVxQkkVZkHmZFwv8AT8RbVbgAVZQYbz53jwvJwY5XxS7 -HRD55VAUe62uKErQde9y+G0EvakTqd9Pahkq83l9XrcnnwCNlUQrM0uWpUBZD+Kvn553c/P6dRdd -f/fxTalOXHv348MnTf/xqov2pH4jHPQUXnhZ6tVjT6RSTy6s3DNy+KRPfvbhv8rDdDfNI4A49Osy -NtRn7FcThbAsSxLieDplVkvYhmSJ4ni+6q6WZnMXaFbNTqwBO28hWRlvrg5lmZnl/4GZWSz/gasp -Yy7JUEFmCqabjK1l+umT3+Fk1CoWZMa1BAEjizmU/He4ljGcnmgmPMIXn32QS5z9A3ebcHBPqv6Z -lH0PHRsw//lNMDYW9DobmyI2NttBjTaHB4bmAY1oNkICtv+f46HbjJ1BGfaV+s5oWMfM/4+jcdLw -K1L7dMBI7Gcj8W9D4P73EdjNvXP2A5Lsb6C9H72nfym09ArgrweAv5bgJ1jfA8H8oIe0luJL5Tzs -5oqLUdTtIyUoTBgD9NDWYiz6wg4uGhYtGMdLS4oHUHpxDqUXZynd3liscRyMYWkrW107yUaGKYWZ -Zba3GaYwpdBBayFr20txaaE52IXmYBdmmWphXLNia5apWpn7xVoQX3TJAKY6XW05kxlJlQ0lVXmy -HkoYTjg3lolrqWUDND6RjwVDgVBBiBOVuFriiUficgkfj5X47YVR5HXmRaFwfp4mwVmRUBLFIRsQ -e74LorAlGkXFHERs2y8QPbVCs4oYJX/UEtzP6cXFUQdzB+9dhbGDesYq968SLe68PIePsXQHN2C9 -2cV2x1C+PqLENYCze33SUAKsnW7ppEYTMAwXdyG5YnvqtV1/Sj3U040b/vwQxvfEn41etm/1pueu -iY7agsndN58aS+qfwf0n1q47gC/905t4Xc+y3h8OW9M+feZtM7Y+dCz1VfvCGuwCHHkMuH0R5R14 -sqHh2QETvHmeap4LW6y7rK9ZiVUgxCYDVxyACnIOKsgmKuxtlDVJEulaLFPGAAV0G1PI2DqOSFdb -PEwpw0wpa2m3YzuxmXhgM/HAZuDB/kabltnVdFS3QqP+C+KTM8SXIwu8GVak2bFmb7C32tfY+THN -/kRLW3Y7U1Y2GOiUqDOwiW0srG2pYAICg6rNWWFWdfsqjkMY1G1ZIIwg68/p2nRxjW4ZjUH82HPk -m+ee6xeFg/0/I/O+mUy6+6dDb44AY9oIY87hBrYOS8z+cyZApMxAcACMs2fMuK+zA45MGIoKiiEw -OQCyRb815oMVzcD7GimvI3STV/eo89hmr+6qaiMdMsxIB5UZaazESAvDRuoPGJvDyu1qtSbsEJ4V -gN5BX9mOdqEk4iuQjhrQe+gUEtwaZO5AnGAsutO58Wfm7O/mnH1mztkZXTWMODZnj/BvNucI6wnz -m7rawVJraW5bW9efNYHoajxTnbL2TzcwR5LZ6UlH/8hz1JqBcQYLRriY4jaZzfhfmCuqqZUto0ut -I8SR1inWudxm7o+cdLX1Le4tEPGUOzHVZJCwje8QnuI/lQUrj0fwb/J0X/oJ3eKOVnMajUBt7FZq -3TS3G87lTMrTtJClR7vdXpr/rj6hAOosKTlPthQUnMeX+/3jwTyRLFaLbBU4ntcEa74gwBlQjgim -rGi1IoHwGFAA8MvKERtGfC8ZrTuHCXiXkBSOCicEXrhApnm2YRLWwDRNSpzUSzZ3/0dKAhZq0/5f -TZMvzgnx3dTsTZzTm/pb2vqo/5AywDpKJnV1NAANUNuX7vuC1M+2SUiyWifXgaXrB0s3eM7Spcbk -n0Y1G554enKqW3HRoT2l+wAQVYerWlYdarWFQlYVUC/ztkVz4hwC0K0VLksRjPHgglqehqJgLSDf -u/u8AHprRToFNnetXJRfy+v5tXRK9pYA6KnNsaGb6ZNx29qWBKLGdhAeKYo8B1PBqJwfQOVVIFKq -MriGoxj+JNfO58ifsNR/H7kljfrPnAKCLyN/7P/52XvJh5+meAMX+XL2TsFjxi57TIDDCkimfs5e -8sReiWSpnzMnj8vqHtx/rYud+Y4OLH6fDvxhi6F6UTUDcaaaxXqZ5WIe6NXvgZb+yTSpexESndAD -lTO4llxuMxgPAWDAzhAQBwYzlh12FxP7QPEACHS/5iAKKW56WXAqnAVhIltsDiRbiNUm0v7ZVNon -G/RpHy1lUxHd5JPp+Vdmz8/2DNh/Tdcl648eVV977SjdEpbIoAgy92NHJMZkRBZzLOZZLLBYptge -oxBh2hsoB1RNcZzzYFlZLJkOLpkOcITtaROwolnd1U4WCWCtYQfo2zCYbE8SfRoD2EMOkUbkRipp -1O0ZNVE0p4s9FtFVzsTpitPMNAGSMjrTksPxDCII6hsQccr5JCjzVyublV/DUCpTlalOrowvsQ92 -NHGX8Ffbr3Vsscs2Isi19pGOGWQaN1HS5en28Q7rveQ+bqe0U97NPSGJbuJ0OIYJBBgRkRW7fZgg -AygrFzsvxjomRJYtVhswc4dDpfPU6m53E/dBshvEyvAuQZN78fC9isVqOhczHkTd0mjVdGWDDdsO -Qrcd2AZlSS8kTozGWXMWgxDTHxQq8JHmXKNitZc07teEVqFdAElCdne7qLwuoK9JtNT5+ykCM78b -nAVyTk+2UPytY+8FmUdA7WP+uC03MXccJMOHoazbrekXSAEBKaffRCT9JnO3TUsqcG1QLqOyp7/q -dFjpxcxurzf2RWsdg6Nsx9e+mlpHZQ0D9w6B3MyurkTz2rYW4CZ0KQnR+bJTfi7QF1qJM+Ogo4ch -tcCS9I2swVFQG3AMu+7FxfiSYd6CEXgBFg6lGp9NNQkHv/3i7vMbfsKd/WYy/8q3I/gT31KO8ADI -uAi1bwhhVMn5TQexbPreuhrdNlOBkv2Kly36f9yTAU7rMZdr/BxZYTEBuS7JIIZkInGcbOEJsUgy -z4Hq921W9eNyVD/OzN8LPEoUBVPMC1nVTzBoHTQyPcAIrkWzYc3WYGu1rbG12wSbnGtrZawvzdD5 -7NDk/87m4r+r9mVtrhytItGSqGP40tJ2+t/1PLb+UVu7hWfIYsolLn1iP4gjWYMIsY1Xw4dR3R8w -oUfWJ9fCEB7dN7lW1isNsLJWAmlEHUv7CgCsNECaGzPeb7HFaiVHPoQ8en56Xx6AhQZYCKCHgl91 -ZsUTzqF6A5EUTkZY+nexZHjxqjBVPbHrgRc5cvDFsynAmo38BsCY9m/b6TdJwCJ8R3gDOVAQGzrR -tIAT56v5+UFfMMjzKp9v89mC/JO+fY4XHJzP5w8SrVB3zcib4dMDTUKTZa46x7Ugb55vgb8xMDd4 -h+8+ohaEOc4dtlk8A+wDTw6SeEz7YF+jJ66B7f3LnFdJJMBFOr2SqRhKdJMInVSJrojTeZXMZXmJ -TjhjylKgvRAXOk2R6TRRyJm1IJ1xijnZt0wypmReIxJz+G5BaNE5i9z007VkkWX6v7960tLSFuy0 -uZmDzmbhCpg1x3E5b5PQVSzq32FWXI2KqiqRq5rEY0VoEd6KR76CJz/dk9p35NXUwd2/xoV//DMO -XvfJ3b9N/ZG8jK/AP30u9fhf3kvt2vtrPO+XqX+lXsXVONiNbT9IfWB45vh+oHU78uOhhka7xLUy -n0xTp+Vfol6Sz9uUMDBy5PMbfg33gAn53g3e3Y3uuHwIpsfwxjsaZebxltWMUDytu+k4yQEtgOEv -4LebI243R9yeVVLs/68Oku+6iwpydZVzXvA2Y0oy02H6i5hRRk3uTofCHCUOB3WU+L/fUVLpCxOY -l2jUBXDW6UbK7pm+6p7mz1IvpbbiGw4/2HLh8NtStwsHHe4l+644lOrvf4bD2zbMv9Vjp77Rh4Hb -7oEZ8KMisoHNQNRtc2D3yNC8yFL5ighvYS/UyCyWWFwMTIFhM3tthQKKCdhMwN2bfr/bHaiG9FR3 -UWm1i54XllarmdSZSeH6n7oL48Z1KK9mUnpdnwpAieOC0AXaLNv80BWhtZZrHdc5N1m3On9sf9LZ -6/zY8ZFTBdrRXM58l8vpcioWd5BEA16r6KZvugh+i8XrCxSEfb9MH83x5x41LHafD0WLGF75/U6n -Qw4PQK6Bm6Wy3oBw3PGAaL5JJ5qYwNwABcwhILJVmRateE1xezFXXOQn39kZlUUv/3+LXuJ/lAUx -ash81/+WofiCk/6MT5gqDhksA1sHTmor2HstxmstQvYtw5wfytisulXWnbVOdbTLPZqybNzGdAYH -cP5AQa0LZIMbgkMP1apgkqhFEQhZZt8c7LIUUBeRbltVUICwE7g8LmJMJoPPhp/h35ZsfF5fXowb -SgCjYwy72Vaq6MOk49hvrn/59emD5lyYPv3cnCvnDolO+yt+eNPOi378aGqYcHDGr6974M3CkuKL -rkq14eG3bRtlk/qv4qpqrpuynL7BNj/9Ef+/wutoGDeOrWW7UGnOrp14Dpzd9wrzpWZmsMAEAgCM -i7By9pw1QCUHtuXAoRw4aMJgC/kzCEFMABuAPqhxEbeIX8et5/mS0hFcbWgCN1W6sHBSZGLx5NJZ -XLM0v3DuoNvzHDHqkKTIU2wCJSYQN4FSE4gxvDIKG0CJCcRNoJR6MCZTaJA9XkyKudKSkc7q2MSS -SRXztMbYnJJVthX2lY6l+Uv819mut1/vvEm9qnhdyWauw3a7vcN5p7qp+NaSe+w7nTs94YyZMiQa -dwfjAUu8DMcRKgu4+crhcbQEWI99yHXB24MkWOK1DwmXluASwStkl1CE8BBLOOzlmKii7sQWw+9J -kxb2jkxFn3EE9SElxQ67TYiGCsNBWQIrl4i4pLgI8kQhHBwS0CkNbQde3+dFQ5hjmClwKtZwA27F -a/AOLOJenNSVIWEtL2/8HFqxQEnaTs9oU6AHF1gGbKa05PAHy7nNlJY4KsNlVMw7HGROGe0PI+Gy -QGXU3PgVNTlB1NwjCWOE426qadK73CYHcGd3BbhnU0ZRMDzjLG6ZfjJBd0RnVuFMuc6W4uiLeGp/ -S4LuiEmcpiMFRE7VKbqS2kz3wrSdo3Gce8IoPrgfB/GQoHeIwEzoITZvmEkfL2euVAC5GlvDwqSq -MrPYU1zKNkWyN4gya3eefJ+X9zF6FkFziM/fb1/w65tWPzWrYf6Y1KqZly+7+YsfPvr1ZuGgc8+T -yYdrR+G3mtqv3/ztT19M/fM+/Ef1yjvnjl83cdKymG9houbRJat/tfjy32x03HHXxktmVFWtHDRm -79VXvbpuPfu6wTDQIg7SPSrYxywG0WS5kgmIpvdR+r96H0XT+yj9X7yPwL8FEgZkQ+wT05Zesq5b -M7Zc7Bc1TCrorleM9+KMv/dj3cb4vJxh8l+Y/o33TW5/1uTuKcNypk+U992X6+qAqQcF/2TLhyp7 -s74+48bN/oI9SBbZi/+gxDH+WlmfeamGvfGflyrkO1JBwb5nzzf/pGP3MOjP1Fuej8cYX2+IO5v4 -Jvklmff2Zvzm1fwYeTJ/gXy182fCx05JQcRFXxAVLfkDBGZ+DkHkmwKzuzE/TkwLimQtKKJmVk9O -GBYUadG8WPM2eEmrd4233ct5/6NWtq/RzhZSTPvPqmXemjKkp9WkHWtWelr5jMfCkJ7WrPS0tnio -JXVOehqewOkq6MS52lmf8YmHBNXLRBeM7b5VogURm2GqUGUMV7ky+vEIsFaMvb8uvvW5xalv3/ht -6ps1z03Zc9Ob+4SDZzvfSZ199C5s/4SbcbbryN7LnmPfAkAW0MIm07fjwECnGCwMNl9xM0UDD0BG -5MgD1iy+ycJogAmSu5bxRVbkmINJHFk6sKQ/zUo92YR7Gq35dvsvM8/90MzExZm1bGIC1oBpndNi -mV1euNj0+gOQ40jT3XTdj2nyViRYZAEToeKd4+o7x11VVciw+ujm3uIKAZejQVyJtUIZprQqt8u3 -W3YoR5VTik1TGhTCE5tMMhueLVixMT9ffT3blAR3Wy0WTRbyZVlAQHxEyCdEsEBVn2hWJFuWyHgJ -JVBERi0xLjUKJbXtrvsKMyAwIG9iago8PCAvTGVuZ3RoIDQgMCBSCiAgIC9GaWx0ZXIgL0ZsYXRl -RGVjb2RlCj4+CnN0cmVhbQp4nNVaa5vjNhX+7l8h7jZLXEuybrA7sEsLpdBC6UApk6U4sTOT7kyy -TWZ3OuXy23mPZE+cSEm3tHxg9tE6kXXec9HR0TlSPs8qRv82l+ytpmKX2+zZeca578ND2IqZqi4r -+uPs/CZ7azGpJnjHzhfZRT4VQtfFROgKHzUvnp+/F0bwfsTjM7zkj4n67OHlA3mg1CAV+Kisxwud -A6oUZkDl+4Q8bwqdz4tDWFEq7YQRjJdc6krU7LzN8k8f/orzz7KJKJ0UrrJscmTUaLAsgYZ/NFZa -brnzY0XjkXZvRSlUrWqPdAHBVL4uJi7fFhPFHalmCtk/SWZRVkpoZ1lVKkK1HpUrQh3bkIwnzobO -XknQ8MrUwstUBYHMIaUuuZZWCnCAgNwKGkZw8hBumIppLiJr56siGo0Zk4HiUZgKNS08ofOe45jU -phQ064JpJfb95yRyQH0SHsGhID3n5Iylpj/jlbVEunPU2hIPbi1T0pTSWGOI20X+cWF43rEZzUR3 -uVwFcdcFr/JXG7YtXH6Ltt4UE1nl92y5Yh90d+yTQlPni5KdX3WbIqsBsV7N4W8du2u2rGGXy801 -ewHS1fpuxWb3rHvdEQjP79erjjWrlq3WoOlK9m63YVddg7dcZPktC0qFmbPOueAvkBAydSTY9Xp1 -2bXslj6v2XZ90xHk3dWazQvTy+7HtSt4k7h9UKO5L6cZiXzPrtevAdE1cxp4xTwRDYE6bFNAH//i -xXW33V7fl4HmZbMkrjSIvYTWMNlyTmNL9hG60nK3zYpcPchLlvUzt1hvLrtbdrW8KWGUHDZg7YaE -fw3oZksj8bajGbD5LXgBAeMf5F0ti4nNL68KrJzbwP6mmJi8aTu22HhTLbtVu/WG7lbdzbLbkqVh -8WlG6Nf3R+Tdkic0d545uQOEu1pug9QQETPc3Gy9QVY0faxt7jGWzZsbeBHEszl5xXKa3SyJeHXJ -luQPi1cea3UfDLhcXQbFn726HVyjCq5B/pMW7a7x6oJ+vodB2l/3sYSmkcwKj7Y5sLd4t1hj+CsY -AjptuyIj11h4y5DveIOu74JcxUTngYuXYyfZvtQXXD73MiIq+RVmscKYkXq0ki/yc0/6yR9gvCp/ -51e/L/D4wH85D8vsPLz5qP/qQx/ivMvfb8gHvZZFlt40KgpUNZo6snHw/CLab4hGHwa3/LmPFWGj -w2MXKwxXZSWV0+YwNI0DB7yJIgfzVu491i9NmE64EDTIaiFwmGoIHHD3bgNvFMpHD79ZGR9A8CCf -2XmBCA7QBxWT0+D9uOKdx8efhh6ILrS/BNghxtAybMK6vY3B9wMMmIQYY0OIwbPzvRRoiPs41rhR -qKHlVQ3RptdyCDeeJ+03+IcHXEbU1dHkoQm2pejRdovLq+VnL65vVuuXXs7PNz6ovXp998X9lw+6 -BE2ekqM9+yWsz/O3C+97v373N+/99nc0C+9/QO7tfRGOiY8fFhj2Rz/4o/M//dmjf/yXT/4aHG/P -wbkZO3iO3UvWShvrDnfWC3I00zuoRrNo7mwiqb9Bm6HN0VpyYLQu4cRT7MmU+vjNNF4EoFpAEpKG -00aKJtHq9HJQhvBqNIWmv/Pd731/CpIf/PBH03xa/PjRT8g2k/Ktn/6MPjx+cvbzX1xMp8//9unf -//HPf/07cpapqCFbDdlqiQbMGmlabaZCVWh4p/BO4Z0CT4V3Cu90RVkgGvo0aDSldug36DcYbzDe -mCnUQONoAk2i1WgKTaMZODDmaio5RnGM4hjFJYmNJ0ZyjOS6/w40URXcUqbIadLxFOSheEqEQgIS -dd+hivBdU1o5lRIMJBhIMJAQQwJcAlzq2B5SgqCuKH7iyfunoD0JT9l/r/un6vvBqDYFdcFsEmaT -MJtUEIyEh+mkAj+YT8J8SEPReFCMMmJHT9k/a++4+KD6DhDBthK2lfAjCftK2FfCByR8QBq8NyaO -riOt4GIczsnhwNxQRERzaHBgPgvOzOHEHE7MO7RF6KO8TsAlBT4IeZaFTqwE+EYFH6gw3xUqhwoJ -diUAJrAaBIAEgASABPxaUhoKEMxehYmoYNtKZgCAFSooVUkASABIAEgASADINkggASIXYfXVPPTV -AKoBVKOzVhn+A1ANoNr2AwBWA6wGWA2wuj07mGUaBOR6EdYsMmxk6GgyACggK7xQAFYAVpBQAVQB -VAFUzftxGfRUAFKLEBw0gDSANMTTANEA0Tq1jjHzAi6OsJMMCBpcNbhqcNVN4KbBWUMdDaYaTPUi -RCYDpkZETIgBVqIUqZBm5Jm09ISQRvWfoYEBoLEJcxkIYqC+gRAGQhgIYSCEWYSQaCGEheYWmluA -WmhuAWgBaG0yJkqT2tUtGFkwsmBk53H5Aq0Qa/qFe6iW7d3GdkNiYSGfq5LGqVKGcdDDQQ8HPVwd -0Bx0cdDFmbQeVVIWB7O4fqdwUMjRTkHIsJ5LeaSDOd2CdpUkG9TL0vjMCo3THo2wL5Ksm1QJDgoE -ZURIcr0qdjuii6pPIkOsFhWYVirNTCaZ8fQZAVmjgX80qWQPVBBRpvfIBjPQpGaAsfR42L+BMzWw -fQPbN7B7A69tYOZmETbuGWZ7hjmZYbZnFGPoidmegdeM1lZGAwA0A9AMQDNQzQA0A9AMQLNFYiIp -HZiDcC6CvnOgzoE+V/13oM+BPgfwHMBzAM8BPAfhHMBzAM+zPgZTXtECrIWYLYDa3ilbiNkCqAVQ -C6AWQG0fKVqAtQBrQdx2iJAt9O1itwoZG0dkRV4sZKmltbUN++D/tJweVUW0HfTZ3gsC/1pVNtWW -fd6+K6dRGIesPc3lSJU9znwP8l5s00Pii8XjS9fMxaW2olLb7SrtNPtU/X1QfvtCW+8KbZaosadZ -XGWnGYba21Ht/U1K72m2X3zHpffYxsnSm71J1W1C1X0DMuQbuS+600x8Ke7BR6U4leGeX/AfqtqG -UhzVmKiiojs7WnUbqrqP6BdqcXKch2L869fi2bgY9yXK7pTLCab1+Dg2v17e9BtWdDy6iI5G/RvK -kfP4lO+LxCnf/ple7fSpw7wv4o1zOPxtsOGh7H9M0fLsQCXDS4c/7RhC1gibBs/ijecpGext+u9Z -+rTZs5nzgTUwYis8pYPYUD8+iywxnOjWbHe2SyeOL9P6UToxm58dogyT8PkJKZvmCFmVbzzZhMuy -pjNlxSbhgPpp+sSU508Kjvoi/zRiB/Mii+V0HI46y/L+DHieSKLY/h9FtXgTJdoF0Q71OHW0/z1Y -W/3/gHXfAIzHR/jacM0Nk6VDTatUOP/3lwpYCLW2RvkIw8N1w6H7YZAYDSD5bMwDdRjK7hGOv19w -JWpHVETUjxzW8f7S4jV7kpZ+ER2qMfkTVrPEZUVXxWM9zyGMcOevBmrJlFElx+JX8uF0aJR2urO9 -I37hg58tDQis60NE7MbDjCQki/02mtAT1PEM2lJjaVrJaq9Q2AZCTn4QkvPZsZuON742i0LELBHe -h5s0t3eTFiMcvTlDLa6P3Jz192ZWazqwPnVvdurSLLJMc+xwVhtZchTtysRHh99+Ghqd+Oxd89g3 -TEAjlFMZafqCx371oWvE5fDGh/s01B1moScvfMJJ0Rj1ZZ/s+eudUQ6qTuegBxloljqL/tayzwj5 -MB2tKB3derqHzHPIOutx1hkhpdJQt0tDhyx0nG9GGMfugg4S0NO3PlkeZfKDGU/eA71Z6hnP+y4Z -JTGPXQyNfiOgSyqSEQoUclMKz8pF2eEiFVJR7sdJZ5ybXiC3TKWyEhkqNqy9m/XhWVfp7wf9bPCh -MT8kXXTipVnlA3wd8r9FMoS/eTZNMUrkj478mgGTk4rnxcPNmU4TItQfyfP1183zx8PoRxQSVhj/ -voBdhTv3EruwxiSWdGIcXn15CJpjXkTpUpPuoi174oibrmkj9QZ38U8oDtUZXfhF+/Kg/qNo+Ghj -jY9GB3M//Pyg54+Fs00j+Sz+xC9bRgqkJamOSXK4iW8RcU5AHBfhOOERK0zqkg45K5pgIWladhs3 -0lIkk7W0o3xSpvJSg1H1V+emtaCNfoelD7EqpBuK0kPKkQckN2RxI/RU3+zYuLEUUNLZGgFr4BAS -ZMrApa2scqfEm8Q6HFNVcVJjh+WvFN85zz7M/gOSUtWRCmVuZHN0cmVhbQplbmRvYmoKNCAwIG9i -agogICAzMDk0CmVuZG9iagoyIDAgb2JqCjw8CiAgIC9FeHRHU3RhdGUgPDwKICAgICAgL2EwIDw8 -IC9DQSAxIC9jYSAxID4+CiAgID4+CiAgIC9Gb250IDw8CiAgICAgIC9mLTAtMCA1IDAgUgogICAg -ICAvZi0wLTEgNiAwIFIKICAgICAgL2YtMS0wIDcgMCBSCiAgICAgIC9mLTEtMSA4IDAgUgogICA+ -Pgo+PgplbmRvYmoKOSAwIG9iago8PCAvVHlwZSAvUGFnZQogICAvUGFyZW50IDEgMCBSCiAgIC9N -ZWRpYUJveCBbIDAgMCA2MTIgNzkyIF0KICAgL0NvbnRlbnRzIDMgMCBSCiAgIC9Hcm91cCA8PAog -ICAgICAvVHlwZSAvR3JvdXAKICAgICAgL1MgL1RyYW5zcGFyZW5jeQogICAgICAvSSB0cnVlCiAg -ICAgIC9DUyAvRGV2aWNlUkdCCiAgID4+CiAgIC9SZXNvdXJjZXMgMiAwIFIKPj4KZW5kb2JqCjEw -IDAgb2JqCjw8IC9MZW5ndGggMTEgMCBSCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9TdWJ0 -eXBlIC9UeXBlMUMKPj4Kc3RyZWFtCnicnXoHQBTH9/9QllvuuLOuXQ5UxK7Yuyg2bBgRRYqgFKkK -SBUQRKwvIlKVIoiIIhYEERVBwF4Se4mJ3fSYqPHrLM6Z/b89jTHffH/tL7LsvJl5OzOvfd7MGBBj -Y2JgYKBxnG8/ee7E8QsGTVgW5E0MjAkhBvg7XGxGxI4GYidDsbOR2NpYZ96JLepk4vV2LNcZW4Q0 -wyfJaY5Po/Yt5HdLfHT/piUxNjAw7zNkhN2ykJgw/yV+4RY9vHpaDBxgM6SPRaBPUKT/0j59+nz8 -poX80Y+lSRFhy5DTzazBh4ZW3PEYuMhr2fJsmyHDelT27jlm+Hwfi8VL/JdGhIXHzIpaENhvrl9Q -pPfU4LQQR98JroPcZ0+a7DAzIDR6xXi7iVPsp02f8dkcp3nOLgNGHDtRW2fZpWu3RKvu1r369O0/ -ctToseNs3RZ6xsbFr9xRtHNXye49pXvL9h04WH646kj10eM1J+sbGk+dPnP23PkLFy9d/uLLK1ev -Xb9x89btu1/d+/qb+w8ePnr85Omzb7/7/ocff/r5l+e//vbi5avfX//rDRWb3jLduz+kz/M25hSk -bF+/dUtSekby2nVrNkAuIcuIQPJIW1JM9hBb0opMIBPJbDKXbCAtSRvSjpiSUmJGlMSctCfDyWSU -gh2ZSqYRBzKPOBIn4kL6E2cykswgzcgQYk9mkvlkEulJZhGefEYGkymkKxlNWpOxxIZ0J9ZkAOlH -ppM5ZAFxJV1IN2JFepBepDfpQ/qSgWQQGUqGkRFkFGlBOpAssp3kkp3EkBgRY8IZbCQmREH8iIqo -iYY0Jx1JJ9KZaIkFsSRjyDgSR9yIO1lIPIgnWUQWE29SSHzJarKXAAkg2WQXSSQ7SDzZSpaTMLKG -bCbRJJYcIGVkHykn+8lBspEcIlWkglSSw+QYOUKqyVGSQ46TOlJDTpCTpJZsIqdJA2kkp8gZkk8y -ySVynlwgX5CL5DJJJV+S6+QKuUqukdvkBrlJbpHd5A75mtwlX5FvyD1SQNLJY/KAPCSPyBNSRJ6S -FJJB6sl9cpacI8/ISpJAxpMI4k+iSCQJIaEkhqwggSSI3DLEpe+Ci+SMxJP40e/JS4NxBrMM5hv4 -GCw1iDXYaiAadjCcbnjW8J6RyqidkaVRb6PBRsOMNhm3MLYw7mk80HiU8UTj08b3jJ8Z/84Zcmac -wGm5HtwcbhEXwH3H/WbSyqSjSbBJrcktxQJFmGKv4qjiNW/Me/Ah/JemVqZ9TceYTjada+pu6msa -YrrKdKNpmWmV6UnTX5STlbOUq5VXlfeUL1W8Kk21V3Vcdd/M3uyI2T11sDpSXa1uUF9U31Q/Vf+u -0Wi6az5v9lmzRc1imiU1u93safPhzf2ar2qe3fznFpNbuLd0aenX8lgru1aOrYJb1bY621rRunlr -j9ZrW6e23tb6futfhDnCEmGlkC7sFc4Ij9vYt2Ftm7e1ajui7Zy2i9qGtE1sm9l2Z9uGtnfaPm9n -3K5ju2HtN7Tf1r60/fH2V9t/26FXh5cduY4dOvbvOKmjZ8cVnSw6ne90p9P3nd50VnXu0LlX55Gd -Z3c+0Lmu8/XO33fWmbcw720+Qbtam6Yt0pZrT2tvakULM4swi58s3lqaWnazHGQ5wXK65VxLd0sf -y+WWqyxTLIssT1he7WLQRdVFgFrRptagtpbW1xrVthG7iZm6bia1Oi9BtKH1OhuFpoD6CaJntc7T -RPOQXmwyFViRziUjUowAOK8bBdSJPgLd59PCIIYmAuTPzgXxMacJrdopdFfSkbRJYNeq6TUF82X2 -SNGUUju6Wygp2plaBnxdnbdV30DvOW4u52hnLdAAqqCGVHWejy3h2JCZzJZpgS3lmc0VW9qJtvz6 -W2r6q8MVZmQ+B3xjgwN5zURq1+Qm+Ck1offpG4Hms/y9e1k+zefYCWOKf4OwxPI5DVthLK6v1q03 -0VAP8YogkVHGthLpyeq97PALo3uxdsyGmfJbFolqyKOtI1NDvFkEcI8vUBs6APD/688uW8F0cIpy -9OWzQ7nKzPwtx4HXbKCrRXthqrKaJQn2Ss08uk20EKYpNWU0V+wqLFCmHRJclBpHGout3JUa0UVe -zbftqv9oZ6IZRQsOCSD+xhbEQsyjBNCd6CMv4glcRE7jVpsg0Fm06xXaWwtXg6pm7fLI/2zzaOCL -cE3dYOs3yVtZPCxkFzOjuSsgEesbP0nSu31dJWLZp40kvXK8L5G+msuS9Dz4lERULwdL0u20MbCE -H+xhy8aZa4bkiceEzBX0AHATmb0dGzSATeW/CqFRTYax29kTwCWbSHFBBaCuDbTN3Vt8XCHXf3I3 -Zg3MG/8/Z9a/TOZzCrmxt5xoG2zEa7rRW+IKASrDdy7OlaSXk8ZIhDuZLEk/HccRcLZxUZ9X5hwr -gzPQ4LdvCsyDoLglEXx6BFe0ZVtKIeyH4hUQBO4rli4K4VMiucKNWRsLEiTSrmcWMksskQh/O0CS -fklwgRB+wVJvJpj7KmhXqqz+UasJpd7iGEFnVi2ayYrmKysajt9eHj9zdWJtxo7ncyK576++otZA -vfF/T2rd6yofF8ndHd/A2mAjHlWWdpF11sS4uyzARvpE6I0i8xWPiD8JdkqND00SuwkzkXOk5hp1 -brIXmD1K7noCvDOjZntWneHoFdpeoN2mnBltPhjcnf28eTfF7vJ9FSeAP1kRyFqwzk5OjlpfiEiJ -2Mozs6XckchLa24DT6depAO+02q20HixhzBLSe2sBAcle6cbK0y87vcvan3/7i1zuIZL2XuJRHr1 -6SlJWTe3SaTNjTs8E3ZzgWmxGbANslMzd+/kQ7M5r3BPZ/CDhUXhjfF82WqqDuEqk7bHQjDvEebV -e5xbaZ05HM7NqtnHB6ZzkauGB8IMnp4QNwuzcXK2dNl+YY5ytnhfcFRqXtMgcYrgrETbdxfHCx5K -zVSkTBTclBorNKVqYaFSE3aEaYRVyav6coVr8zbsg1Ooj92bOklkUsBgiYw2eSaRjMzLPB0qWl3M -h3w2EiDmTJw129qdZlfnIiEYCSfj6WidFRftIklvL9dJ0ottO1DugyZI0lNfD3zLDZekZ/2PS9J3 -3p9Lknh1cjjEgW9WXAqvocF0zBFhpJKeo9bCKOU9FNdopYbmiZPF/oKnUvNGXI+kicpi5iJMUmqu -VjeNEJyUtDe7IMzDCUehnrcXLJSaL+hjbDceu6poGIr3M6wcKTeer9SAOFZsL3wcfmNcT7a9O83X -Dz8UCfXxdIyu5xG0m4Zq6ipMV2L7JGEG8kppbGopDEZFUje1RC8wFPzdlzjxmV5cSeWusirgj+xN -7Ic+KGJOBBp/5HsPSjdxL1zrh5jrRm4Q2ERUsi8SgP06VXYPsdjCCVvkciVVxaX/Q//hEOrp58xr -2NnHTZOFRKXmnphHowRXpS6ezhX0bHW3p4Zjx83YcXwuNPGcZiflGwRbnHt7erVplDCCaWzZFO1G -mBoBsVcA2C+T5HFkYYfR+KV/UQJwiOGjgoPLn+/M3J+1NTNlJxTAsZictXzOlm2PuJjUqJQA9Ja0 -/xlcC4i6FQG6mrFhEEVLgKOzrl+mGi08H3e0e8bFzDsn4SlPDZwqWT/zcN2Pgp3YUGtyrzFsYPf5 -wUO07ouvmPzaGNizl4tHd62GDaA5TeMF1ufdTdq/yGTUVmj6/O5WTuMlWtAFAlzxr3DYEZG+fPPS -z2uLrp+Hx3DPuXYYzATXqHm+fE4YdyAnO7UKjkHZciROi3S0W8SnBnJHN0qkxTY0L9KsuUTMfZeg -13nxAh1r4A1J+tlMIxGzjL6S9Oj3V7CQl6Q9fzQ6SdIJg7FsqrmfgrpR63O0pzy2Kzg0CL+7Et59 -PmolhNP+AE03Oc1Nukb8Rag1eVa52KqL//Qu2jWBaSZ0/MMnVENNZ59ivbWsJMpEv0Tj5SUqBCgY -gRHhFd0g/iDYKGmh8UClZjdde0gQG+lMRcHAqhSgrXWT4cPC6nvtwl7cEHpAoB1gh+MhANrXByIc -WQfUUJopthRfC2OUfu+IMBY1c3RTC5QLm6wLZXZiqPUc6q2rO4fRWGzgqEInB6n6q7lQxPxhj1MK -gO7Q9HD8RIr8iXfDiwTxQKrit9NsBUD49VjQ1Y+Sa+fKtRo2moaLv6EjYVPYDGEuKiAtQSNg1sN7 -sy6s15NZT7QXoXrHgUP8fsXS0LBEN+AXOh6g5rRV+ckr2iooWFucxFOzEm55hk3+CPSUzu/UOJxd -hXcjgZmFZLqDrlCvjuv1UXMzjaJJAgbzhdNikGiFRP9cakCnctvTBUQWYy7K9toW7XVH/GBmzS1C -h5G/DUmOSDq1gpoyl4ds6MoE7DsT+zrmM4Eu4zTO9MeDwiK05Vm0samd0Ee5W9dR6IvlmWL3BKEf -vqQ1tumvpHPE28IALC0ToUoYpNRYUkCRDUFTUtJkfBuKddP1b8OU9Ix4Uhiu1NzRi3WEUpbKF5ME -tqkhxoMutc6Ffbc55oBe6KOYaDe95ozDt4XiTrpBmIBvg8XL4s/CzXwoZAsBIm9Hs166hcxGXHhm -O5JQRJGXY2mYrqlBlntfeomKAlvMrkyKgkg6FaBwfiGdSo9wO3F5RtCsK3KnIdjpYBTTsnhuAF0l -HMpFWjjS6uKpPTtNe7KC8ETsvQh7L9jKfOkrTvNQXFgtTFZqvqV1OJnbu7owB3RJLZLdwpzD/ePj -PMAW/F4DdQDaYktNcV3R/p3bqoEP1b0Weik1mfQBpUJIePTaQOCd3fe//LGk4vTxageGiJAFMAUz -ZKpZfG4IR4dcoLYUYeJSntrMuM06sZa2iNp6nJvxL/PTUJZbWoaergONEc2FQFyaN02W9JoQrNSt -/xrL9IHYRViqJ2ua8vBtjA4QOLJ31PJD6/dk9gcr+gTE2MogJlEGMfUyiEn8/wUxiTKIqZdBTKIM -Ymz/CWLoT2wMjlbD3O41aYS9utFfpu8Rx8Zt4Vx02+ToxAbTeVhhqWSxsfjUuGRinBG5Oh1nUkPb -fHije+hQoYuS2WfgU5NIuetC9LceGzaz5tyR+PqkS0C7wpWb8B08tz9qcWL0weBiaIQLR/achEoo -Scpfw+cOP7oJqDEXkeqUPRmYEqbYwwjoc8r5jctjr8IwmAOzPPxmgw8s3eKVz78UJeFdXmlTnkJD -O4vdaYiwn91VOMdALCeqqPKvEv2WvRK+h2sF+3P4NGrskhLbl1uWFL7eHXjWaforOp4Orv+NttKe -gEOrS+L5zCFVkEqVnP+26dvGYBN7ZoDuwo7NpwaWdIRWI9o1DaGXhK7KWHZH6KbU9RLffiyIbelb -wQolGkCX0G8FOoNFcm5+oatmI3xfcBYuQkPWibpjfOQOwW7OlBkwBGzO21IDeAr1R+rP8jdsUMGg -0PlgnzfcsS+rf8o/y5+UjWIOGsD9KG6dZ3C/xQ48ujVX7mx1+SH4gm/0Pze01/xpo81h1mHXfT78 -nVph2T6fo3CKP5q/59DBwqWO5rAo3iPAF5Xzy0q9BDWe1EfcKlg8iN0Y6pYeR1t7Mm78+hUHffJS -vqbkIGuTk3S8KCVvDDXkaIc1W7OS6+PSWGuv47Rlcs78zIQETgYtZrStYI1qMesodRN6yHpD85om -CD3fIxpxBOoMO2xs8UkxiR3R9xhJV4gTBObCXCj+7tvPxqDtj6bDke3Ib7EmwJ+OYSPYaDa8LIBi -Gw4TGP8mc4Qu9nOXhfDbQ7iKkr3bGqABqoJgLvhLUlNNgyT9GEDwMXGcJH2bRfhuTAVh30zZvi25 -5vELTiJa2YB69cJHZ9moet6yhbNww+s6aw18zHsNp2niALFMYHPZWNaHebBgOtyGDtPehUc7Go7w -ccWcg8+MtdNQHdox7U06nzpgtqiivWmPn2yZNTNymOSujYbkrC0H+Zyfy6gFh6P5AT9lUlwvSdeu -mUnE2NUWaZMPI4v+3ZkFMxlXFVuhPQoV+w8/5VfNwQ7iQDTPazRRIu2/wLff+MQaDDom1PhHOoB2 -7vEGgVAUmy/kQd7qrER+XSgXYOE1eTnw4cm51dczv72Dcd9tB0phURxNfOdXlcNp1qC/bxDoYNZ8 -dxmbTWey2Wzm7kBOM4RObxosTJHzlEaaLZxNKvBNHsonMUMuyaJy3tNkPqWQ806Pq0h/xmf8zG2l -3JyDi3Krck8fXEk5PulnbvWznIqKdH59ITco2WtehgWfgV3Thkb5zk5CRTvwVVOW8Edczds4hZwI -pdMyYXZGVHnaIz4DlSrjjVf9oDR+fSRXsTrHe/VAPqk3t5Jxp5dUxS6KnbNkK+P4jN5c+sA4b+/V -sht7mlZZn/SGT8KuyY8Kys9mYLIkjqV7BL+lccneMAs8y6eCCziFuzry2yO4A3ty0irgPBzx/RJO -QENRzSle1k4v5iEEiaOnrl6qG5uzhjshbhMWKzUBtELMFCx0z0vWvxGfc+7MRM6fAzGQvBLs3kNP -iJ2I0PM6Qs8tCIGjxJaYojdzT40exgYirkl7hfiT69Zoguhzd/r+rPTszTL6PPgP9PlS3CTWCZdl -a56A1twYxTi2kqlpQqVMQvQSeT6WTmM/nAFu+GkhyEPvuX4CcPSAD2/jJ8jQKhuRzfjt8DV3f/+I -U/i710Reb9pT0DWrEZspXJsMBPa8hj5XaBKoD3qggJ2ca6StE0wAzIZGbHoiSRdOzpNIQJi5JH1h -u/fx4r3LwBlmuAbMgVBwSPMq4hMeeqHLVnFHVjQmostuB/fuw334WpLqxnaXyODjnSXp84Z7Ehk2 -6akklc/ZiunWMDNJerzfD5Hr+ddwCc4eyt+fzx9i8UJlKHds+zf1cA++laRz0/qjEdr+Kklbqq5J -ZOjJltj/O1OJWNtdRWzbnkqkw4kBUA2ny/cfhxI4tSp/FZ85pnITvOEiMhZsnQxdYbwtzmSsRPo8 -ccOZWLeViE/nYkm6fPfHR567V4A9uIcGu6zkUcEjxXuCl5INa+OFtp0gGoulQhGUrM1Zw+dM3A9b -KOFi0pakLwa+C1OPZwOZ9ctJT7Q1cCb7yDF+ZR4XGbcwwQf4Ufa3qZqafVF9TsueMHvBWxncxkfO -Ph0xpZkLgfHeoTKW37l16+YS4Ct3rZinjVRErg/a6Lpq3qoVrhACfkWLTmJorszbUcmnzKVt8mDH -kpTks/A79/WC3Q7m29lowUexyjcqPhYiYVUm7IRijPXP0FW1qCQS6dpRdiIz8U3983KJGCakYBhv -vUkiBolh2zbxaOEX6UrBV8nuUhv8o0kX+9BAATNH6qvQ9fMQREOortb1kwFYAjYdJ9C3NYq64si5 -E3yiJ2kRavZgi78FyA4uY22oDVebcboMvuKveR0YZM58ok0uLAf2vX57bbaMcdlXmNp8WAMfqkLf -sgR9iCft0tRV2FcaNlcLy9YmxK9IXLUqORwCIFAO8Lu3ZG/Ly8rMSisCPpnNEb6srblxe3rpoqku -bna2F4OqtCisYPRG/krNI+qFaT6bsBpiLsWDbtwqNikrjnK7g6g/ty2ucHUOPIC9R8rreBhAbQs3 -5rmkJVwHeuvPDmwrF+LhHyDD+MhdD7SaclqFkPWy7pej4g8mt3ZAAUsCjnWdOoyZMtXjmbS9lmUc -RReVga68UY4BQ2hz5ikEKDX9qGuTlXBwx8LhWnBaHxIXHpeQvC4SlsDyYziEhtSSnKKc7DTEXHw8 -2y9Qg7MXXlMD20N2zGDOrC7M4Kb3DS1K5i1dIQQp5zMbfGIUC2bLhEfwRePuEj66hPMOCYp3AidY -tBfXaD/KeCIKuk0WCrpNDQq/QwDhX1EVFI+8Eh2f5jqkO8aHRxi7pFu38PEE45l0u1c9zAa7yokU -o1j+e4eGSUL1W1P07AMGfZIpzBJVSPRXMkuc3idk+qBpl7BMeX/c39ouaborhCjZDDb2b211TQf/ -NKjXrPe/sXkuhCp//UwIU7JWrP9fdSLXlIPJnS4r0uRW5AP4kHiLnpBFWy9OXTYQkzoQT9DpIOeR -HNvAXAR0ONmOR+SU0RMSHFk7lNgb1lmgxUdYgQldhC7NGViernZUBKYB8xEtORShbs+kj3FqW0K5 -q2mXKqEODq8ssM3jJdLpayf0OZ1XIwZwSeiIVvMLeqkJLxiG2PXTJWJxOEMimuALfDo1c0pZYc2F -JPonu2CE7jDkJXWiU0/9Qi0QFjbGlSTwmQOOo9tozfnnOOQPArYMmDHrBmw+SNJAfoJEfC9skqSM -UR0kUtMpU5KogyHm51fbP8D0PLgoM4YrT8qNgeUQsSJ00WoeE+oyvZwwj+j0Ma9+RaX3cprFUj8h -XtdLqZw1/4T24i9pnGOuHyssaW892zXIdYhcTNAzdER++uIcPSs6CnnpyyF/saFzkM8QGQgdoFeE -5Uoa2CYcS8Hi6vf68Pxd9j+3uTLpI/335iPDv3LFTHGw/rNWLPlvVMX7r6uZ8d/Iqe8/YMUW/41s -9cnYujGHv9W9bRotSNL54RjPKmML0DYuv+qF4rx/UpJOq3eisyzZidXnPgPmA6wZawmYRErShlVn -JNJj6TtJOtQjAMNh99OSdGXYNJTThQBEjlXm60ojMTC1miiRaf2iUWdsbGzkvZbO2HY84stXDwIl -MgSDNfUB2grNjiJXsnyHTpLuJqKizfScjl/lHSQyYF06at/wKDckRnbnWI6zgNxMN2Lz3qsOIkid -9QJRae5xSfqyLoCX/njilST9EW0zD2fyw6qW2P+0C+Zsr1dIxLb5POw045dCTF93HN1Xt3f/4aIb -gMw3TzOSpNTufshYcFiLE6mIkoiZb6QkNQzsj5M9/PoVZsExHgHOQf7ey+2QcuVUP3zeqL6N2n/T -WJIetn4ukf7H5/OY09Ov9XJ8rovVZ/YLxf56CdbofvtQNnwvu526ZR8IFp+I57juuEx9Q3/T93rE -Uv7a8bxPv8N0oy987nMOuHuVS3pZ+7v00cYG5pnQgU9vUFNqPKWOddL2/1q4JLvoFICom/JOkh7u -pCPcmbyd0/xOzzbZCiOY8Sh5N3Aj6FoA8Pq9l6noQbw5uLypInN/VnF+bhlcgQO+mPO7rAuPjXAJ -dfFBJzkT57kY/eY9f3SyE/LRed7IqucblmTHgi8sCY/yx0CdmBqdwcffcl23pRt3IHFnci28hOOX -4Bpcl6Sbf8ipw0vsV2eAHHppkNflM6dQ43Z1kKTvRo5Br+3yHWKW4q2FO3N3H87eDyf5h66Xhpmz -jqxWOOSgsEMQyWk20M/0uHv+iA/HNhFKpO3SRz8rXK5PiNHiVb2tTPqEKBo0Gb23lOGfNs36C+qg -oVj9jUtTuz898yDW868azKwOIm4IXue5YXL8uLiwGeANC8pm34Y7UN9Q0rBvUq3P73AV6op2F/PJ -+dzSlcGrl8IwcGhYQ5vzNH5P2gnuN7ea0eYzEXAtWbCy1mXXNJgJblHO+q3Ng9sLMqqAb6hcOlQ7 -yXieIs7eK3Apqt6zEwSfzyeSXDgGe7ZVHs0o25KxqTSFpwuoo7CvIMBW6xneK57b9G1h4yUEzfOo -03/06uYDhiEEbGaMFtp7XDrCJR7d+MDB9yXSbIS9RCxdXRA4HdTqcdxKn2RP4EcuuCLjuGOI44pg -5zpEgYW21WnJvyMIXIwgkLUAZjoR2BAcXmDv9hJxTUlFv/3YSyL+r9A9/PGmWHbmCX5I1D36hzP3 -oW56sU5nKvmIxoeW6yXKTFjC+/Lq98I0sHhf3PGJwNqxafpjndHUTM9j/WAhUl/01POYh3nL+/Kg -9zzG2n4of/YJEyfWS6Y20hhxkUBn06ERuzDVG8pRB+YuHFD4F/tvnYpRrfXcAVaMPzeTdqLqB/dp -Ly1Q50nUkPWlxnxMBEcNGFfYF1gk3y/Y3tHR5/SLH4uOnzMvh5NJ5ct4zWtx2nv1W8NGyocyZTTi -w6zNPh42ltELf0498RNi3of5M/IXEf27npsNW/hJy+N/W5rpH2tCqzBP9RDNqhVsHRuETeguYy+Z -Sx/RHyPBvdBhaJGzeqP/fDz3Dvr/M2sk6b5TF9SNXz6TpG+eXQNmBUMHy090jfY9JNKWaCXp0qpn -qCqtMV7f3/EORXzt5xmSVJ9G5TjQ5946iYw5kYta1tVdwty96hGafoyTJL3ZtBbfZnUDagWPn8lP -iThb5+G3A2PR67eaL0nXn2OWZVHhgtradTfmPTYtKzlm54LOuoP9DGzeZnwYOvh3qGrNj2Aq9t04 -jAKSW7qzJGmb3cFZvJ3qLZF2v42UJN1ThCydGryxk4URD9S0+MJ92f87mvaVpIrATchS6fAFfnuN -Nc52t0KSvnLncJLXKyajUkfOGIHvDyKm4/PpGQxHbS2mogkWYojr2T+F1zykyXohMksb+XztIb37 -Xn6OGIz15TK96MrGvC9d+Es8jayvTAujR9/3uPZugxD16SGPOO/9Ic+7u58e8rxVctin9C8+E9/N -lfuJrUUi/iCc0p0YaWLt+IxiLkHbZB+UA96+Agx4mVUC+4xpmIotY1G03wRqrBWXfsSRvnocORU+ -nEdwbC27J1Dhb6cPgpwEFaK37Cqc22+HjExjp49w8LlFVdS04MJ9LSoasxo1GL3rkF8dX1GrO8+o -FR3Sv8FSS2vbsOZDBiF8bnPWhlprG+Cs7BhXo2NMXLJuKfBD3Rqolprl1Fyt2B5so10Y3x3AnyZB -1hnupf3REeaanTSrqVaIUbLUd+fl4y1HGoaTjVF2Z+Hy0fwb+uiTaPqQLfgrfD6kFfqeF95dlze5 -nTGxlTumvuPkQ4Eh1FUvH3z5Xm9OGnb2R3GOkCC/PH4tn7o5Yp4mE6hbmwS5dEl/GMfc2ujrLv3+ -sRBKvbHq3eTqpsnyOXaIfI6NZjdRf5VCDPi3GjGr6TLtIO/zfdXmw0PT1Pi29tOdUTN657/fJmXz -qEafvspvY/XpkiYhWxyTTd2z92wzYStAob+d1kpc31pcIWw3U35upiEb5Ds+rYiW9CaziR8JJ7Fk -B9lDDpOrBn0MnAzcDfYYnDP4ypAYtjL0MSw1PG34o5GxUXejKUZeRiFGa4zKja4atzQuN37AtePm -cXFcCneUO22iMplistbkpMlNRSuFlWKYwk6xTlGgOKS4rviRV/KWvA8fy6fzl00501Wm1aavlb2V -TsolyhhlrrJWeUV5W9VCZa6aovJQhao2q3JV+1S3VT+o3pp1MRtlFmWWojZVK9Ud1Z3UndXmaq3a -Qj1LHaeOV69UJ6gT1avUSerV6mT1GvVa9Tr1evUG9UY1qD9Xb1KnqDerU9Vb1GnqdHWGOlOdpc5W -b1VvU+eoc9V56nz1dnWBulC9Q12k3qku9g4O9vYuDaqo2Lu3oiKo1FurKmRTT6Zvp9PitnAq1lpX -dziJthbrOFVd6bw+WpiZFBoTsiIueXUAOIN/PfwEF7JL8kvyctLT9gGvosY3rlMz2sLmyCRmPHES -M2Mtnnlc06qY9E6xL4pKTQpOhe5YZ2ai8g1d5uu9L6xCm5IM8s+SIA+XYD4rivuqsu4LeMKfCt67 -yFxFfS8xXxMVk7cm42hikx+non2+R/mH0zjG3+jL+vTFj4SzOKoc/6NWVbnjm4vwDX938Xk0elOH -0aPNgdnS/AXA1PykJV6zZy2svGcOd4v2X6jgo/ZwM4IGToQRfLdrC2gz2vLeVz+bAx3Ddu1B58yf -3n34aF3pkonmsCBh7oJgXsWCdS/tI9EnzUKfNG3HWTqR+sIFNtkhCmlr5bO3PBYj/gtXbSZ8R4s4 -1c9wvWR/zv89S+TRWWGWyOazQGrMCPXQquhWExpBW1IFDaELxvyLlWnZ5g8nrmPDONVlEzr17AQ2 -h4WPnMT6aieZqDDJ/fOUdTZ8cnwtBn/0fhGAa9ntb86uG5JWrl26fokc9ge/+p+GGcKMPgzTCIfp -qX0KV/NO78do41WzA/LZBoCYhxGc6tNDXhmaT9kOtIimAmbkU/6kceO3g9ig327BYtSVCGDrGTah -668gjVPdlGu2/g3lY6lgwvZ/q7rOwYyVzGDCdD57BUe5L25TI6AKXnVKbrQGG92Q+9vJ/Tdh/+nY -/+p2KGYTAcJqoth0Fu3hSkPYNdoLBepexZLo8Q9fyP7z4/pl9IVC2to9NXwgi8Y1EwM2KeppC4Zp -RaR8ntxo+/E8WcWuiIHzWAv6s24rp7pWhJwckNPFcNDZhrGx97D3b3dxHfWnj3/lXdYwXB65w9/z -NxX1kTNIvfIP+oq1Yz5ymqpX//6jaDut6obJtV3eo5mRj0cXLSRSN3aVWuBEFh1lUyhwp/Ke1QCi -tt8cMXcyZ+WfntlvwcHa53OqyN/c1qeyzlxN7JlV14EOgjvfwAugBpJUPTsREckMTGfWH8S3oZWY -zuxuwsSmh3xG8dAEk52OxfVwHq4eLzsDR6EsqSCZz+93HJWwORe2ZfbWscDawrgJMAAsJTLOExmd -+xU7RRZg9wstkJGHFabLN14g8zZf49vTZokwA6a4+tjDIvBPW1iA87eGgj5Vm9ZS8yiYv1angfmp -UbCWmVdtKPwJ60BXOz6MQ9UoUMiawWzmLexr7XSKdkW7fnNeliLg2l9H5foX4qovRtFJdNilX+gQ -rH51Wa6eo6/mVDOAmetmMnNx5qeH0ov0h9JAu4pzP9fSrjqnBqDzRfrxKPt6NGunm4Hm+MmGvZql -MhXdUvHphr2OXJZtL51xbJPC7s8NehzvbqA3xEvxJeyZfmLxzPL4hvwfaSywa7qL2cvEubCdmrun -cqopvhBJLZlyD7qZWeD8IYOq3L4jHTOoy0U+tlo/xT/TtBo4W7z3NA+j6didG/NcNiecBzoXAfys -in7mKgdFnKN/UCAshegCOAR7JGK4q0QiWvGeRKxcMDdSK7ojuNxJJMJno9i6uOObkZ8tJmKq/5Qd -8awFZkdsCOv1w9Q32hq4/uce+T9yK5X+VoX5f3urojS5eBV/WBGR7pMehKy7yJcxsOOft9m6fdzZ -5VTV2wP7aeck9ZXB1EZI14OpwUzVf6iMxC73o9bmH5CYnKIm+uqR2Hw9EiuouaRV1We7zRiduNTF -NebIpTtZB2q1qidTa7p3HzdtyOAvXV+8uHPxKUYlLie1elUmM/XgPo5B9+Ifl532lB4H/sju/3zZ -aaH+slOAu68rrwKxC5u48sOdqb8uh6jkiPxphDZXvb8AZYReLoYZfvRyd6ghQnxeVChUH8aiZxKD -TFxyockaR9mFjaL9WDDtjLSFR9hQ6vovqv6yEIowt4Fw7m/95I9P/9Dvv77KtV9/let/MbtzFRNk -3IxJhYOnHjdjLoKysxqqR82/y6j5sR41WyFqVtEedheGm48CjwX+XvrLiCUH64GvPBGEjq6z14Ip -Wl8ISQlL470V+Wt2r9n5/ipi38fI8OMK6oeaId/2ygO6hdt1eFdGOZRC/pqdyXzOlqwfuRWpKzYv -hbng6xY4HwO7av7ciVqwq/F77Iu52250TN/GoDtq7YyO6dXaevAD96AoR/wTnfHnbg8j3IFVJ1bX -YroBDY1wD75y3jWoQpIuBqFptK3Djl+nI4tW4+vhABwsLjgB+6EgOWc1v93ucMqGV1xwhmemOzr0 -3t4wPBQWR0DslxgP93H994ScNT8Jp/LL9/ErC7nolTFrIoH3Xll0SksLqOEhZkg1CtXHswvgLCtc -vzH/Ck4cK6/5bw44FvkFo0UtXl74QKtyAEbYvn5067E/LzLWx9OB8k1AytNGqmaN+NZPvvjI5bOR -MYrGuN5sB2rCZKDR9I+kErYR5uqdE1+9Lu8eBkoWzd6lLaOvIZfynuicKkpLKyqC93p7BwV5e+8N -rtCqgovDSkuLi0tLw4qDg8PCgtGCptOOaHKOdDbVMi3G3elM/jsbf8yRPt1cxVxpH9aXeuJPX/xx -pZ6sB+2BEc+TIZ25Io8OdIBvKZv5/oy6Yh+6VN+jMlrcvS8aE0HbyHGsfy9+SyAthjxqqL8g3Q64 -W+cffQnP4IbXcTuYBQGxrn781lDu4La81D0oDyvWd084taRKKORU/76HVN6wfHtCtOPof9/KQfs1 -YcPjMHSg9n05MgyiZROSA1AHNqA8mM6ksxn+egcgxYWdSI+mPwGcZFUY3OlsYC8K4UYhiF05lW7D -u7cVUeKGprc4F8NpRcWsHaKKdqxFIYK8pZEJa6LRlQft9YRl4J3g7CyfXO8pzN6yHSpgb9AR2A0V -2XV1vGpf+rIAn6TooODE3WUH0or2aVUNPgdmz/ZavMCp3O/s2cMVJ81VL1mRydj3MIr7z9CSrbeS -o9TGy4q/g0taQg3KTf5jvKiX40W9HC9s5Xhh+1/Fi//g7Kbncqp/XMgl8oVc5DJaQeQLufX/lwu5 -9fKF3Hr5Qq6tfCHXVr6QmyhfyK2XL+QmyhdybT9eyFWpmOHl8DCKS01xySOLOZX+X/nOXfsrgou9 -tOvTIAXScFAdjBIL8KlLPFHKJxZwY7x8Z4IDP78kuMpc5bs81N+7NKxSTmnWY0qDfkSXGIVPo8Q/ -U5vyC3COPxlSiqnN//bf/wPDaOSsCmVuZHN0cmVhbQplbmRvYmoKMTEgMCBvYmoKICAgMTA4MjkK -ZW5kb2JqCjEyIDAgb2JqCjw8IC9MZW5ndGggMTMgMCBSCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2Rl -Cj4+CnN0cmVhbQp4nGWWy24jNxBF9/qKXk4WA0tssikBgoFgsvEiD8TJB/BRnBEQy4KsWfjv07eO -MBlMFnaXqKrLU5cUmw+fnn55Op9u08Mf19f2bLdpnM79am+vX6/NpmqfT+fNLkz91G73T/6/vZTL -5mEtfn5/u9nL03m8bo7H6eHP9cu32/V9+vBzf63202aapoffr92up/Pn6cPfn54Zev56ufxjL3a+ -TdvN4+PUbaxyv5bLb+XFpgcv/vjU1+9Pt/ePa9l/GX+9X2wK/nkHUnvt9nYpza7l/Nk2x+32cTqO -8bixc//hu912S00d7Uu5bo6HZc0N2938uDnOcY232/WxOdadx+tjHV8YXzQeGA9r3LPH62NzTMPj -9bHmkzMrZ0Fnkc4yE2uuhfxF+ZnxrPFDhkcMM7WzMyTipJh5Z80b9h6vj5UNnSqdUBmvig/EB9V2 -artiamfVJjSTNBfmWjRX2FK71Th9Ld4X+Yvno79IfzFiU1/oZOlkarNqMz5n9ZipzaqN1EavRT+7 -t+Qk16evxfsiPyg/oZmkudDXor6WRtykyTpmreNC/qL8SH70fPxZ5M8hsBaaN+NDlg8Jn5OvI5qL -NCM9RvWY4EzinMmflZ/QT9JPaCZpRryK8iqiGV2TfRK1TyK1UbVLYd4iNvZJ1j7J9JLVSyYnKyeS -E5UT4YniifgQ3Qc8j/I84nn0dUEnug59RfUV8TbK24R+kn7Ch+Q+0FdSX4m+kvpKcCbfe+gn6c94 -MsuTGYZZDJW4esy8VfNWPKnypLIfqvZDgCeIJ8ATxBPoPfhvhN6Det9vfa2LNAPMwfc/zEHMAX+C -/+5gDmIO8ASvhSeIJ7B2wc8E8mfvEQ9n3xvUzqqd4Z/FP1M7+7rjyfrQiXY/uf53kiWUkq8GSklK -C9WLHM3MnDVzJj/7LwPqLOpMbVZtwcUiFwsuFrlYcLHIxYJbRW4V3Cpyq+BWkVuF1S5a7cJKFq1k -wZUiVwpsRWwFNl+NAk9xHlwpcqXSV1VflZWsfnLDU8VT4al+csNTxVPhqX5qwlDFUGGoYqjMVTVX -Y66muRqeNHnS8KTJk4YnTZ40eJp4GjxNPA2eJp4GTxNPg6eJp+FPkz8Ntia2BlsTW8OfJn8aa9e0 -dg2vmrxq8Dfxd/i7+Dv8Xfwd/u5vM/i7+Dv8Xfwd/i7+Dn8Xf4e5i7nD3MXcYe5i7jB3MXeYu5g7 -zF3MHeYu5g5zF7PBbGI2mE3MBrOJ2WA2MRvMJmaD2cRsMJuYDc9Nnhv8Jn6D38Rv8Jv4DX4Tv8Fv -4jf4TfwGv4nf4DfxD/iH+Af8Q/wD/iH+Af8Q/4B/iH/AP8Q/4B/iH/AP8Q/4h/gH/EP8A/4h/gH/ -EP+Af4h/wD/EP+Af4h/w6+503Hv+zk/xwz0W5971d36eHO6x+jp47c7fPHsj9rfoPZb+3pmD9v93 -J1n44UpGkm+Uw86P5Z2L3l/HauwwE3tOJNZk+3vsk3G186vLnmuVvw72iViG7g8e++tmX4ll4uEe -l+9BdZ3UvffbPbV9vV7XK6pfjv1uqlvp6Wzf7s+X14uq/O9f/gio4gplbmRzdHJlYW0KZW5kb2Jq -CjEzIDAgb2JqCiAgIDExNjkKZW5kb2JqCjE0IDAgb2JqCjw8IC9UeXBlIC9Gb250RGVzY3JpcHRv -cgogICAvRm9udE5hbWUgL1JLSUFUTStTV0lGVERBWTNCb2xkCiAgIC9Gb250RmFtaWx5IChTV0lG -VERBWTMpCiAgIC9GbGFncyA0CiAgIC9Gb250QkJveCBbIC0zOTQgLTExODMgMTYzNSA5MzggXQog -ICAvSXRhbGljQW5nbGUgMAogICAvQXNjZW50IDc3MAogICAvRGVzY2VudCAtNDMwCiAgIC9DYXBI -ZWlnaHQgOTM4CiAgIC9TdGVtViA4MAogICAvU3RlbUggODAKICAgL0ZvbnRGaWxlMyAxMCAwIFIK -Pj4KZW5kb2JqCjUgMCBvYmoKPDwgL1R5cGUgL0ZvbnQKICAgL1N1YnR5cGUgL1R5cGUxCiAgIC9C -YXNlRm9udCAvUktJQVRNK1NXSUZUREFZM0JvbGQKICAgL0ZpcnN0Q2hhciAzMgogICAvTGFzdENo -YXIgMjU1CiAgIC9Gb250RGVzY3JpcHRvciAxNCAwIFIKICAgL0VuY29kaW5nIC9XaW5BbnNpRW5j -b2RpbmcKICAgL1dpZHRocyBbIDI2MCAyODYgMzI2IDQzNyA0NzUgOTE3IDcwMCAxNzIgMzEwIDMx -MCA0NDMgNDYwIDI1OSAzMDAgMjU5IDI4NiA1NzYgNDA2IDUwMCA0NDYgNTcwIDQzOSA1MTYgNDAw -IDUxOCA0OTYgMjU5IDI1OSAzMjAgNDYwIDMyMCA0MzAgNzQwIDY3MiA2NDEgNjcxIDc0MCA1ODkg -NTE0IDcwNSA3MzYgMzgwIDM2OCA2NjkgNTYyIDkxMCA3MDMgNzQzIDU1OSA3NDMgNjMwIDUxMCA1 -NTIgNjg4IDY0NiA5NTIgNjM5IDU5MyA1NzAgMzMwIDI4NiAzMzAgNDgwIDUwMCA0MDAgNDg0IDU1 -NiA0MzMgNTQwIDQ0OCAzNTMgNDkyIDYwNSAzMTQgMzE4IDU1NSAzMjAgODYzIDU5MSA1MTggNTY1 -IDU2NSA0MTkgNDMwIDM4NCA1NzAgNDg2IDc1MCA0OTAgNDYxIDQzNSAzMTAgMjA0IDMxMCA0NjAg -MCA2MjMgMCAxODAgMCA0MzAgMTAwMCA0NjAgNDYwIDQwMCAxMzAwIDUxMCAyOTIgODcwIDAgNTcw -IDAgMCAxODAgMTgwIDQzMCA0MzAgMCA1MDAgOTQwIDQwMCAwIDQzMCAyOTIgNzU0IDAgNDM1IDU5 -MyAwIDI4NiA0NTMgNDU0IDAgNTg4IDIwNCA0NzQgNDAwIDcyMSAzODQgNDgwIDQ5NCAwIDcyMSA0 -NDggMjgyIDQ2MCA0MTUgMzgzIDQwMCA1NzEgNTIzIDIzMCA0MDAgMzUyIDM5MyA0ODAgODQwIDg0 -MCA4NDAgNDMwIDY3MiA2NzIgNjcyIDY3MiA2NzIgNjcyIDg1NSA2NzEgNTg5IDU4OSA1ODkgNTg5 -IDM4MCAzODAgMzgwIDM4MCA3NDAgNzAzIDc0MyA3NDMgNzQzIDc0MyA3NDMgNDYwIDc0MyA2ODgg -Njg4IDY4OCA2ODggNTkzIDU2OCA1OTAgNDg0IDQ4NCA0ODQgNDg0IDQ4NCA0ODQgNjg0IDQzMyA0 -NDggNDQ4IDQ0OCA0NDggMzE4IDMxOCAzMTggMzE4IDU0MSA1OTEgNTE4IDUxOCA1MTggNTE4IDUx -OCA0NjAgNTE4IDU3MCA1NzAgNTcwIDU3MCA0NjEgNTY1IDQ2MSBdCiAgICAvVG9Vbmljb2RlIDEy -IDAgUgo+PgplbmRvYmoKMTUgMCBvYmoKPDwgL0xlbmd0aCAxNiAwIFIKICAgL0ZpbHRlciAvRmxh -dGVEZWNvZGUKICAgL1N1YnR5cGUgL0NJREZvbnRUeXBlMEMKPj4Kc3RyZWFtCnicnXoHXFRH1/dS -7u7lLrsKchWNsmpEjb1hizHYsCsBCyAgKigoXTqogKjoSRBRilJFLChYsGAXe+wt0WhMjKlvuqZ4 -7jqL+51715Z8yfM+38fvt7sz8z9n2qkzg5XK1lZlZWWl954+1mPKyGG+fYdHhQerrGxVKpUVfdyl -N6TWYO8iNVFJbawkF2vJYCM52ZpcWrNZrdVzng7lMN6+fRuVqo2vfQf6Ue2xd5V/aprI34ccVJyV -lVrfddDwYcFRs0PGBodExoXFJY+Iik6ODZsXGte285y32vbp1dutW9sFIeEJYZHdunV7OZO28lRe -1lQqa5rRAxtlWqqHqodytb2qi2qD6rrqrupL1Y8qo9Vyq3yrUqstVjut6q3M1rx1kvVR689tBtss -tllns92mweZj2z6252zv2H5ri5yGa8F15Ppzo7gALp5byv2qtlE7qjuq3dRj1T7qfE2GpkCzRVOv -uav5nrfn2/Du/CQ+hs/gc3m087abbRdrl2G3xq7Cbrfd78JgYZwwRQgRlgrrhCrhiHBD66htp+2j -HaZ9TxukjdIu1uZoa7VXtT9pTfbO9p3sR9lPtZ9rf17XQzdK56uL0i3VlesO6S7q7ul+0El6O31L -/Vv6gfrR+mn6EH2cPku/Vl+pr9Nf0H+hf9RE1cShSdsmvZu4N5naZH6TjCYFTa419W4a3DSu6aqm -65tua1rf9HzTOw7tHbo5uDkMdZjoMNUh0GGeQ7RDssMKhwKHK47Wjh6ORY4/Of7p+KyZXTPHZm2b -dWk2v1las+XNcpvtbfaxk52To1Nrp5lOFU43nB6ITUV3MUBcJ/4s/imam09uvqj5582lFk4t+rSY -1SKvRXGLnS1utnjYwuzcxtndeZZzvPNK5wrneue7zt+05Fp2bNmn5dSWoS3jW2a3LGlZ3fJYy/ut -7Ft1bzWolV+rVa2qW51sdQ+OSb2PWR07hg3HbI41lzpI+aYO6mOmOaLUGxtMvTX678/gz+JyQf8N -vrdcrLid/9UH+B4/C1ZO5sxm1jfCbI5W3zSbT11eazbXGntEhvK5iRw+wW/FdmyHGuZtSC7N4Esz -sPXmVZsnf5C4i7uLxWLJg9TC0DS2H7jR4B85azZfGstt31DzwVng9wOqs58Ap8cSvIebRNZgis6L -NTaHIuwcnBvnYcoCPCDNgo0slSyjC5T32Z8D6GQilqxYTt8b10ktxDJBn4+fYg9xs6CfjSMkvVgu -6DFPaieWCImm7mKp3Jx6QzSr2s9oMJt/qnU3qxyr3M3mr7wawI9nmremM2eXeRqchD1vYlcDXJ93 -YMJGs/n7b4lQU08sD1s2mFU2Y9wj36+v+vocPIR7vsfehhEwO3HqXH5DLFdXUpJbAwdgVyxMgOGR -M4bO4leHcQfBrGq16rLZ/NRqgFnVOr6f2fzrswu8/jTuxTyxQghHa3GjoA88xlLESkFfjSNwq7hJ -0LfbjI/EKkG/A0/hl2JXQR+CScaF4sGNE5jWAENXhSSGpaYuWREPgRBzEVALn6yuK68tLi7K2Qh8 -oqmFiOqbX2BbbDfw9Aim9hjA2rJ2971uGfRdMdJYKEYIetbhGD4UsTnaHvrZAAcX7gksMZu/+G6c -WaU9Mctsvu18gJbrXj4F+PVfYSfIv5JZyIbCfBZclModoFWJnp+bzeaPp5lVzrvam81Pumyn9XU0 -mM1/XHjPrLK/+5B2uf8uiOQ9o0OZvYu+I74pFYoVm4vzK4GvLY4Z7Z8QGTlv4YFvDYCdztb8cIhf -vI1jWn+m7gmsGe96Yuo3X145de/K3EPuLnNhQUpCEq9nYzcYPcX8FAwEzp9xke8NYm34y5HYVWqT -WsaWkg71w8XSVbFm/ak9cJY/HVI7sHegj48LMD1OSYJB/MzY5OA5URuPukD9tq0Hq/iUMs4vcUAg -TOZHNUR/9+PZ4xdcAO2Z7xr4id+xfmPt9or42S4wPzM0IpGnFWRLf4gJMakZccCHpVZcO1yxbduu -TSG9DMA6TQvpFsAXRXKoPYxW3wE24x9PP9m736QpQ8bunX3bpQa2llSU8XrSrzhjgThPuMveFbsJ -W01viN0F/UrUSyepEe3YIHGMUM8yxXhBpn1gPCwmCZGs/+u0ydI31JjPer1GOlH6tPm5UnVACUuW -/hwLLNz0eGwCJOMkgNJxG9FNSsR3TMmJc7kxQf5B4AVT94ddhX2wq3RTMZ9RxiVnLloRDfyCuM11 -53ZdQQeDqRuGi3h2NzurphF34QxxrDATM8VJ4JPoo+j73rKNa/cDf7kyxN0QqolYEbTSY9G7abET -IBh8d3jehiNwrmr7GT7fg4YMVYY8rAy57y9DhkH4Zqgjderx3u+kNaYOZlXbh2RoI2zum1VvHLjC -f2pWtRPTV5WErs7YBxjKodWkuh4u8oInPbUTwwSmanwk9hD00/CYsR/V32RLxXHKhrQzbhajBNQ0 -RlvwXOm6XNcyGwsB/mjcJc4RzjUeseB+0j2qXmSTnvO/aTwmJgttnwkWOE/6H6p2YKUKnId/KrCp -W+MzsaeAXtJtsRe1zzfaGMPFFMH0pWmTOF6QhkqZ4gSZfideExcKuKB5nKA/WU/7ybp8OelLl4tQ -v3HnHh680L1iVYlf3pKbILmdAtgzBQBbsLGpkHxzCfT3Am5MPKRiU4AOXPzakLXhwLP2A7uy9ga8 -zuzEyJjYdH/gA713ogs2233immE/VGdVZfD63zBU0bcaFiX2FrDCto/sS1oq6vYHCxQnCkRyS1Gz -YWzuayRZipatZFMtJCXKZiWxGa+RTFR2rIGNU0ik2OaT3v+P+rUA4mRhn9u88+J2ni2iDX3Zl9kq -sHGLWSW07UEu2oFfRk63Sm1W6UvyzSr+6S1CAsgR27kb+axSLjJ97opI4PtPP4kGAy6HtWe5x2MP -9mPanv1ZO9b8cg/s5GJWWQ1YRXplNbCXmfKYZ3LpKJW4H83mSz6rzOa7VZ+ZzaRk5MOWimA2X73m -+h9nbVb1Si0yq1zfJD/X/cN2ZtXbd01mVef78bzZ/Hb6VurowU2au03T+WbVzM59KLzMpBl3vHPV -rBrqyANft2lBD4NXJkd7+ZGiOmwi2/7aZi5T9ItxbL28mxj1Qn/DGweLfQX9GnI+sv7+0kGcJOAI -V3GywBpNQ8VUAY9Kq0VPhaW9Isc/GnMtHCsVES5h7/07y3MjwH6Nyyw8XopMDzCP/zDM2Dmk4ace -WBhCpXVimrCDWf8rQw7+oSyFTR4k9qO6Fs8Yr1B96xjxPRk+ZXQUIfHjeHhrEXiTlt8AMPUdFguJ -uBagfHQZYCXmAgesZPSLxmFlIA26TGYyDuDnjzdCOaPWRO4a9cFyqekaNXE4gVbBVCwXVRp5VFup -QgRT/JhY8oup5BenFgMWc1v2b6s+DPyBrek9yI/He8UTmkCoJ6EfcI8CG9xcBsL8gLkzeBz77Z5e -2ELz0ipXgGyUnL4dfmr8RIwWOrNI0Y0i6xA8arShelf2jphAsfyBYoE4gExQgRsszn4wG6rA6K2I -7TSZn4W7nyK3c8xNhtuierEYOCsmmEL95KPh1+AYHHyhn1lJ2eS1584qPXOurAE7G6B8Bm3MSWVD -CmlDPooH0xFOz9yxBznHtsJlliWykYsh+coSYL8kTeH+6359i+RltrYoiw15ActMo6SR8hwxXvqU -1Le/wL6WdsgQdpR2Sr+K3gIbzSaIUwR23dRe9BI8pc+oTc8EHGdR7iGsKXHJPfWyeOcR7uIiYh8v -tZV1jL1NqjFAwLPSCXGgoL+OPymtl4xzxKkCdmUXxGmC/iKNPkxkw5dC8qVFtKxRsnyTSYJ+xRzq -pDdEiKtOZu3Z29iDRWAbAgIPsP4440/UXa2ASk5/B9OVUOLJcsVBNJnBGPa0txxaMtg8cbpA+M/K -sDY0GQs+T6l70DRkWPIwjpTr/r1lOEZSKRGAPfCzMF+TVLRpozBNRn2xDr+jKltO+bIC35QcRNiZ -sZo5TmDNvCFs3XJ0usQ1YKUyVnPcLdlZcJspzHaGgnOnOSbi7zI/RkidLHHwVOMhcbCA57GT+LZw -T/pBHCLo/8BflKDI/Ji/6KNQOytTT/niH2i/U6BWUoyFFE0WN3Wy8dY/EJ+2uCtflqBQO+MKaTSV -2DA8T70Qe71s1Qk3U8F0yj2OzJYCWvmESpDmfwB42bQAPDkYtyopMyw9LXXFQkikc0NaLp+2LPNt -rnRZybIa4D9D/if0MYC0/UYl6fNk0ueLcWByZ9ekBeRFJVtprPjcMgM0W/bXVu9/bsWsRvPfdY3R -GsW+WfflIhvxwiwU/5Ci+Ac6k+RjqcV67dgc8R0htFElDpXT8j7PI+hM0VfI2yP60ZLzJV4x5Hzm -9zpl6fNAOu11Sv+nanGxwOIL6DubFb9O/9jY+yWUxgpfcXXAZxZRv8feF98V9GNwr0W6BpqFv0wg -OSki7GFsbsFD5WqWFGlBKcwrAvVkWyxwtkWGLixZJtiEJy3dr2ncKboLem9audy9Ky0nQIbXKTYb -0djDgkZbLFY3yoJOYEHifGE0FljQTkr1gVGU0Ss4R6mio/GAOEzQu2IbpX7FuFQMlOEdysy82TYL -+oXRXV5HW/aGAkuT8Kq4hx3SyNGBwyzcbSH7iGxqD4t73jyAMiyixkAJFG+ca7oiDhf0D6R+ijNm -i5m7OFPGscgi0XLTVYUAhymy3MqGWXDJRhEj9jOdteA1igSHsIHPcWvjz2KM8Mt7YqxwwXTcQrPD -6PyijY1ivZ9TTn9NzNipUW2ZkOo1CfekzbfQTt0u9ov4r/Knfcc+Pszfxflyb1+gv+z9hj33fsC1 -q5tx3+UuHD20+whfOPi/TL69VHLyPUxOvo/LyfcJOfk+9bfk+/eXPraIi54VGkEJ5+zYis8Nemmu -lG7x5wOZXhxBqymRWlq0o2dXMUjQP8FTFvxDwkcKVaRRowR9LIJC1L3RTkyU9/AzRf8+bDwoegh6 -H9yoqN9q04/iLBlNsQSfpMalFniokqngu6YDMs7elFoY+4rJuYk584EfxPTubLQBTI5KNCggax5S -DNJwDi6/vym/tqAoP2cTlMOh5A3L+Q1rODaOItqetzWWcE7RKIbiGsUhN/RWshsqvG90kf2aGwZY -jMZ6HH3r3X5QVIea45TJUmEMFUbLBX9Fa6jgqkyUCjNe6QjVtr6mBXpa3VvkME2/Jao/loP2y/TH -Qw7ouJhSoiMer7IfTonynP5/sAbPiCyF7ciLlcJe3JiwO4ALsBA2soGYikte3piMt9yYfCN1x5Nk -OAs0QWkQx2EnPCLe3kyJ0mRKgOyz/GJ94sIWpc0Edwj9A3AyoMOaI1XHK2s3ra8HPsb0h9hF0F/C -1UtE7HDvAbY0wOXQwz5beHSA57c804FjfdzcWBfW+ZdpaGs4hJJ4OqZoBgwBj6XzF85PSEpZGgYj -IPi4cnNRfvZWPq8/gWuNHuKzbnuedtOMYwfEZVs41ipyeGfozLNeKHqjNfZ/8gjbYi9mf4LZuGTM -4W4f85BvQ/olhURHJiQlZs2iKY+4pfRZdObBIV7PJh1Ef7Gz8KpQjqGiFFRvClLr2bnvacAM2Vnd -UgrMvznV2DrU4ClKlvStbRtac0fwkvimkMruiB0EU3O886pi/3qli/T0ZUVqgU9FV+qp7KFxlOjP -QmoXPcFJSzdx+qeOtlJ2vSlbrTelYKqxRIwkyaulM5grmqZmk4d2iaihY4En0mfHLuaKLaQp2RSE -1HvlaU/NYR2YS/V8Orp6MvosmIeurIVpSg5RbDG2wXki4a3/houmWqCOW/+tY1Hu9TDmiFnKDI5h -hLhMKZ3A7qLJLxsN6EQsI5gH0odY2lIq5ZvNmfJwoSj55VDMcaKRRqAHow+N1JbpTL7yTNQ4V9oi -vuCsrmHUk+SXDfUm32ySno7Dzmy8GDEfqQeTXw7MlHxzyNPrdsyTe7Ms1kekZq+18nJqwmk547PK -OXYfqduJbHxeopQP1J3XUnldlnX40Dqybj5fwhkSn2lkdmKI5JPNTbM1+WSXh0gjae6zborYC3u+ -vhWW8fqL0sic8j0mnxyuwVbyyUncYxqZw0mzRoqsF+v5+o4S/TTpSXOWaXQeCyy90Zk7u1vEUcr1 -SiKBV42LKLg0eihm/MxVMeNSMtkhZfC0K94Eahvyok0246ddZTNmjhizSZS2av7RPa3/gvurWzNt -lROchRlh6YszsuUEJ6BUSXAW9edKl5dnKwmO/jaONuhj9uMCsSOpoj8d4IeLbwn679EkPRPrwzd5 -utSW1WymmLB7QdU8CIe4zKhkviCJKy/Iz6mAUihOhTgIWZQ2I4pfm8qdrIwNCwiKG2qI1qDthf2X -Dew02yxfEn+PhcZYkc0q1NTSgWl2OnCZV8XSJA0dxP0L0jAKYDubQlGJnZepMU1a8YX44Iszj38d -d3Cw4V2Y9E78HL4klqs+VnP0GPB3tk2c7J86x9/AeHLbuWwc8AP6e7l2uhR433AHLtzduJdPqeIi -fMP8fIF/N+rC+cPFew8bkIdSOuURsX4Z/klpIbti6lsaLzUlNWFfAO7CRk4fc6xEXJOynfwgPkFn -9vgUrCtiQ6QhUUCY1FPqLS4rCQfmxJ4wZ3w8BTIX4xDTkK2E+p5fJVZlF+YDruZQfXD7jeu7gjq5 -ACs4/KJRP/M0Hdw1M0cwKxe9r2QvDRVjc5ZkAFvNMXVg+CiPeQd+dQEs8H/RqK/3Rg419beQGGKk -3lghrhBkabUnad217ShIGmyuNOERiZLTDiav7RmU33lxbDf75e80xB9EhVR0t7DUyFvgbBKJxVkS -ucds4etotYw6KqgjoayM7aEOUW0r60mvvc1xRT1bocZQ/EVkoawP0mfLLrLyJjgc9dxrJNurRaLq -w+gTTcbLmrDhjAikAmm49K2YLbC7ts+/qM14mc49bana/PkXteHw9dSEd/Huqx+ZNNtb4ab6yx99 -109ZinhZDcTVCX/6GZvySaUcs2M6NtzkBKalvL4rupLpjXuWdllN1FSkViSQMncdX1bKvYVNGbFS -DzLtReoOpKVsuOTE7FDHJyVzP7OmlLb+BCYLwavOLGU1AYzwt1hTviyZQ+JC4qZOKNCM/FWe3lMf -9SdFUMnak9awkTjoZReEU/lZGrav1Awtgqc+Cj6XeJ6msfZxmk8Ww7Pnba/xPK/4qIcuhjiUOx2E -7xDPFeMcNWDAH/vOlfLLK7i+S1ibAcCm8y9g/JJgddjOWcX7i2t3UpHHr8cykwbcFs/zzOQTNecy -i+aBm0IveytfDXFjmwFfLeFzKzjP0vaU7AXwxjkaIlhCBGOfpV1Ry2Xq3EjEOJ21edC3kF+ewJ1L -/mM2sAC+8RUxo9GZujZ0f+qs1LBQKvLs6ytIoz8s2nVuHV+u8Vy3eBc85F/QN9JiWED72Z7JfG4C -91UhtnlAI9Cezj6KVSK2NvU9tJ61lFyxpdQhYD1t0mxKajaJrLXUN2ARtjS5spamDocWcfpXT6j2 -8ktoO/mJNMpxSaH0TiEGFG5br2YpoFGQZlK2k5QiltkL79vrVSvlZ81mKieVqBqs8lIFqkJUc1UR -qmRVvuqxVSur9lYRVu9blVmdtfrEuot1pPVK653WF6x/tLG36WzjZjPOJt4m3+aObbztJtvPuDe4 -YZw3t4hbyV1X26vHq7PU69WfqH9QmzS8ZoImWJOgKdTs1FzTfMt34d15H96Xz7PT2420y7A7aPel -3Vd2f9o9sUM7yc4sqASd0F8YIAwUpgmzhYVCqbBLOCl8r7XWDtVO1V7X/mZvY9/BPsd+l/11+/v2 -n9l/rrPX6XR6XTtdP52nLkX3vu4DXY5utS5Xt0aXp1urW6fL1xXoCnVFuvW6DbpiXYmuVFemK9ed -032uM+r76Yfpp+h366UmYpMZTfybBDQJDI6ICA6uDq+r2769ri68Otig1WqPV0/rZoCJmTHJ0Slp -WUvngw+ENcAPcKFwS+mWkg1r8yj0aNH21k20R4feB0Yx25GjmD1z+HrmDYOWmRs1NYloNmo4rWRf -b7JXa7U49xKbq9ZSIA3dn4bpxlBOi92+Qz3GYRrjb3Vn3boTfxxLQ2HY9wbt3o33L8J9/pPZdI5g -dpOHDCEv7I6lvkAWPmreHM9JgXvvucAnlbUX6vjEbdyE8D4jYRDf4YYvOS/He3d/JB/8Dtu8DdCV -P7N138Hj1fNGuoDvkim+EbyWRfzlyeQckvnBBeYxOZHallObt/K2wmnZRPgWKzntj3BzS+0Gfi3a -T81J6cRFp4dl+QHPWrk9xqk45vRP2NZwFE6lbVnC5/c6DGvQiQvbMLm0L5FEMVtKbaazBWjLVDjT -oMUiNcajIyWe0ej7zp9sh4Gtfn4QGBrLaS+rccy54cyLxQ0exbobRqm1OP1lUu8Jyt2pTAmJUgQU -oNPs3Kg+LB5oLzvARu89ANg9BOK9WQdqWrw8MnsezcGp32//2zSjmc3zadrQNIMMX8H1kjO1POCc -Ixsp4K4ESH4Qz2mfD/9/Xdi+fl/LDXt5Lylf1F6LB5YtX9RitnJTq/1IRope3FgOl9moVj687G/Q -TQ4mLGZWw8fzhSkcclduow2ghteelomWEdEtmX+EzP8B8Y8n/utlUMVGAsQeSWTjWdLMGRjNbmAX -EmjAfpaJh5+P8PK6VNnGuVCBTgG5cX1YEu2ZNP8DTQM6sDHw9wst0oZr0oJpzAF/NBVx2r9eVMWy -ofeI+9dPaB/lo5VD8sz5PuFhwQtHQCcYKM9cPlttPFhzfHvtvspbsumEYDPKT2Tl73uXObMQiqmO -ivr3fBudDdpb6hubg4cwm5CZ7Q2Qjv7sOralhcw6yEYjcKdLvj4CaMv/6n2ctXZhu18/Sq6hyY4t -5bQJv/pn57I23JHUsxk3AfvCnfvwCNDKbK73TDerek9oMJuzd1Gp/153s3mr0d2s6jyDSg/UDWbV -G1UN8CFcP7zjLByEHZnlWXxpj8OkhE252DWeRUOBtYB3h0MvaGdWvRtEHZ3/hZgSyon9ggN1NNNV -ZTbfekSdN/+USl81SYcJMHpGyFiYBWF5geW0/k5Q3m3/B8vRJRGmLzfpYXpuIixnLvtXVvxAGJiO -DYvlSDXKNbJmsN7TArt3mnoa3yS7fvKhLEWgvb9JyvUnx0ZceRtH4YBLP6Ebwb9dlmEvBea0E4C5 -mCYyF2ni2TKoYDkk18upOMtkPAkc4JvSlPcN+KZp6kmKQxJ+VEokgbLokyipmkDmKPMMp4ZTiZR+ -5DItrqmTm1Ko6cNUHGdSXZZtby2lhB9oFF0stKjKVsBb0qVFW9jXysIWsXaHV5Z+j6nAbpguFkZJ -U6AMXQJyOe3ouZCA7ZiwjdzM//OLKwzBoZtWlfitXvIh4JTnD6bayZo077DwBRAJSeWwB7aZVdab -t5hVBumeWeXq52dW6TQdzSrnTSqzii8ksbUPoJJNqHt1Dq+thE0rNizjK9zr87J+55LzZq+dTe7B -gdmNZHTI/58xTwxH4GbhgUP84hIuYXFIVhDwg32vUXpkf6j+PDn+1186azX/+la5T/PXl03ti4eW -xg4vX0c5bX2Z8o7WHSAMV/3j099JOFe5tervD4VoX37kkkHbUOg/YUh6pN+M5AOX7hTsPGbQfjnm -SMeO745z63d1xqNHdy5+5aJFbkNufUY+s5vJvZyD6dH/97uRFqT2r15dlAupbCLktHJYfT3MumgV -GpMNeblkZv3Sy91Ba0A7XtJotM/n8tobBxg70Sz/9XmDuQLEcX/hkwcf/5xvZOrrt96vr+7Vffr/ -srrzdcOZltklTBg0Oehj1KJd1YXPSHau/fsxV+b2u/dv6Prwa3RFN9eT7SiJeLUTypDr5Ku5EsA1 -3OZ9m9fthmooXbYpi069Bd9zKbkpqyNhCsz1XzCdArR2+pSRBhhxJPThXLPqna3kYL5JJrfi5EMO -5rflDRAKAeGJ3vSTtC5pHb/o4xkr1jAVtzPj6NJjgM3h5Cm4B3d9NvetM5svhpOKtzhOjJ+upS6a -DWuAnbCrqvwo1EJ51oalfNmIfTkrf+Mi1gXlB5Bj7hoMA2NgdjykXqW4VsP13BZ9zuUEnC7dXcMv -ruCSFicvSwA+eHHlaQOWo/UeZo16jfblfelfb2Wh16vHfvz4Hy5VF1Z8btBOBqZiNT2w6FAxBdsI -CrYNi7CP6a0DgDyeQh07RaUekuvFUq6UDU7WnErryjaSRD0Ak/BZ5ha2CqYoToavX1FyjwIeS2KN -eVH4BxQjH0RORhtRFVtdXVVVXR1bFRERGxvhQhkeZWQH5YxM68q6b4vDdihABaddE8Ndz7u0F47D -vsXl7iX87pMLy5YkeQ/JT+Z2ZxYnw0KIT4mZtZQnfubHjq5Nwh8ATrD9FN7QE9ijCrhVAdKbnNa0 -svFpXaK00viUHKT1uMoqOms7UKBzqKA0JzJhybIkcmbh24MgCoKX+PjwZfHctorCNWVQB9vDD8BW -qCs8fpzX1qyNmh+SmRQekb51x868yhqD9mTITk/PObN9p+4OPXduX90JF+1jVqkeakkkuH9Orli2 -q+ynV13W/DW9wi1otVv9jx6zQfaYDbLHdJc9pvu/ecx/MPfxxZw2IyujO1exvGRlDZwGs6qjkThG -zadehmiotC6/gcf+skRJ4INJ4GfTOrGijlhY/0IDTizCISZXLsnPbH56mfT/0Xr6etxX/je2ufT1 -uDjdbP66J7V9G0wl6TrlKWkwtyCNZjQNwovjd/Ex6VzF5PrAq3AV6g9WnOdjCrj4eeGp00jHmfXl -uFgkWSDJJKGK046awxVH58VCPEQuT06O5QuSudO7dtbDOdiaXplRyGtH3gz9Ezt99snHLnDDbP6h -K0X2Lt1oHgUfyTH+VgPPxK3cgrzUdbAeCnPzt27iYwq5OXFBPmSjgZVxpxbxO5aiLprbm1mWChH8 -zNg5Xd/1rz7uAvuKC47U8AvWcgkZAxfABF57Yy+XuiWrCjbCttzS0io+vZTznhc6EzwhqiAuf8mr -Df8336kNYh47l3yHfbMoEGu1s6JDpxtg8m6vu3P4gnLOrzqRshtTOsmkpU065EHOB3n83u1VdbUL -N8+VDz5ZiTiRja/Zzjpga8lrKdRz2rxyNhHHzw/HDqy1yWstUKw4W4J6k6YO8Mun70Tks4ONx/vg -4bQ81moMpw2NiVwWSeelGXu9SMVnp08L4otjuJ2bt63ZRmZ1ZM4ZUvF9BQ0HeG1wdQRFg2o6dG2n -6BAerJjl3/+ulo1U/hEwMygxLCFpyfIoGANxlqvvwgPltRVlRau3ygll+wdfYxfs1e5kb9Z+UD/W -hfX63fsbg/ZGOWkUud7kOwnAfnSTdXQb6ejbpKP7a1K9DDB4Sn/m2pZfswBvQwk6JeRGB7NBwN2/ -8Msn8A1cDzo4EMZBQKK3JTEpKVlTS6OZ3tmk+fI4SO8mkF3titGwA6bu6xKkUIAPTV1kU3v5z5Xz -6ydtnlk6evUQ4DehB86EwvtZRSwdAtkX+ZncXflJ6iypsSlRtqvBpFI/ZZOVuB6j0g8ryVR0wwn9 -KlEFQXyHEZNZTxftlspN+TuAP75vpmv36GAv/5nnsY0BcD6ZvTVqP+RTt3DMbSJzZxTOInnW+6I7 -tkbH29+g3S++HzEbFy+YmxCxgNfmp1CuzHmwsR6srxsbw9+NxgijdWoZO0sLiI5btHwB8D6zax9/ -v7HuzOG6yYwGYfPbs2ZMO4kvjubQ7QL2x16AkTz2nnCbtWA6997MrvP5CY9czsCW4uodspPU/h8t -ahH9CmVuZHN0cmVhbQplbmRvYmoKMTYgMCBvYmoKICAgODc5MgplbmRvYmoKMTcgMCBvYmoKPDwg -L0xlbmd0aCAxOCAwIFIKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnicbdfLbttG -FIDhvZ6Cy3QRiHPmSsAwUKQbL3pB3T7A3OgKqCWBlhd++1Lzn6ZB0AAJ8EfikN/wMuLxy9NPT+fT -bTr+tl3qc79N6+nctv52ed9qn0p/OZ0PRqZ2qjet8W99zdfDcd/4+ePt1l+fzuvl8PAwHX/fP3y7 -bR/Tpx/bpfQfDtM0HX/dWt9O55fp059fnvmv5/fr9e/+2s+3aT48Pk6tr/twP+frL/m1T8ex8een -tn9+un183jf77xt/fFz7JKMNh1Qvrb9dc+1bPr/0w8O8/3mcHtb9z+Ohn9t3n5t5Zruy1r/yNr5v -9u+LmPw4SvaabZ0py2eGcveRo9Xy1EIFSqhI6SiJstRCOSpTnipUoCoVqUYlqt+PbI66h5ViTDNT -jGkMxZhGKMY0lmJM4yhE5u7bx2IPJlDYTaTQmkThMwulx5IpPZZC6bFUSo+lUXosndJjWSnOkcxU -oQxVKaEaZalOOWql8Bl8gk/PtOAz+ASfwSf4DD7BZ/AJPoNP8Bl8gs/gE3wGn+DTa9DiM/gsPoPP -4jP4LD6Dz+Iz+Cw+wWfxCT6LT/BZfILP4hN8Fp/gs/gEn8Un+Cw+wWfxCT6LT/A5fILP4RN8Dp/g -c/gEn8Mn+Bw+vcccPr03HT69Gx0+vf8cPr3/HD69/xw+vf8cPr3/HD69/xw+vfsdPovP47P4PD6L -z+Oz+Dw+i8/js/g8PofP43P4PD6Hz+Nz+Dw+h8/jc/g8PofP43P4PD6Hz+Nz+Dw+hy/gc/gCPocv -4HP4Aj6HL+BzPJn1Cfw/T+SA3CMPyD3ygNyjC8g9uoDcowvIPbqA3KMLyD26gNyrDrlXHXKPLiL3 -6CJyjy4i95y9iDxwhiLywBmK+AKGiC9giPgChogvYIj4AoaIL2CI+AKGiC9giPiCGvAFNeALGBK+ -gCHh0zUm4Yuch4Qv4kv4Ir6ET1ejhE9Xo4RPV6OET1ejhE/Xn4QvIkr4IqKELyJK+KIe9fCJ3rVp -+KSw3TJTbLcMn1S+uQjF3hdLsffFUTrK8EnjPCyB0u0ipdslirlehs9m5nPJFHO2DJ8tOubw2aqf -DZ9tzODCyq/r1sLKr+tWZuXXdSuz8us6kln5dXXIrPz67M6s/Pr0zJ7SUQLFFZLjKH265LtPzMKx -5IXS7TKl3yyjCjOR6yj9lZUbpd/sFFdIXikMZaY4f2X4TGOUIhR7L/xy018axVHYy/CJrj9l+ETn -rESKuS6J0m8ulO49U8xLKYypx1IpZrc0inNbOsX1UlaK66UOn+haUfllqs/uKhRjVnz6tK749Gld -8QWOpeLTp03Fp0+biq/3b5/I4r5/IFfgnemrwFcdHvjKpVMH3C5MWG2UcjrFJVBXiulrM8Ue2oD/ -e6M0odhDsxSnqzmKG6V5CmoLFNQWKS6Iligmsy0Uk9kyxWS2QnGCGr6Mr+HL+Bq+jK8NX+yM2Wdq -+Xai768n93epr+8+9X3b9tee8cI13nfubzqnc//6Tna9XO9bjb//AJ+bDlkKZW5kc3RyZWFtCmVu -ZG9iagoxOCAwIG9iagogICAxMTM1CmVuZG9iagoxOSAwIG9iago8PCAvVHlwZSAvRm9udERlc2Ny -aXB0b3IKICAgL0ZvbnROYW1lIC9QR0RSSVkrU1dJRlREQVkzQm9sZAogICAvRm9udEZhbWlseSAo -U1dJRlREQVkzKQogICAvRmxhZ3MgNAogICAvRm9udEJCb3ggWyAtMzk0IC0xMTgzIDE2MzUgOTM4 -IF0KICAgL0l0YWxpY0FuZ2xlIDAKICAgL0FzY2VudCA3NzAKICAgL0Rlc2NlbnQgLTQzMAogICAv -Q2FwSGVpZ2h0IDkzOAogICAvU3RlbVYgODAKICAgL1N0ZW1IIDgwCiAgIC9Gb250RmlsZTMgMTUg -MCBSCj4+CmVuZG9iagoyMCAwIG9iago8PCAvVHlwZSAvRm9udAogICAvU3VidHlwZSAvQ0lERm9u -dFR5cGUwCiAgIC9CYXNlRm9udCAvUEdEUklZK1NXSUZUREFZM0JvbGQKICAgL0NJRFN5c3RlbUlu -Zm8KICAgPDwgL1JlZ2lzdHJ5IChBZG9iZSkKICAgICAgL09yZGVyaW5nIChJZGVudGl0eSkKICAg -ICAgL1N1cHBsZW1lbnQgMAogICA+PgogICAvRm9udERlc2NyaXB0b3IgMTkgMCBSCiAgIC9XIFsw -IFsgNTAwIDU4MCA1NzYgNzUwIDM5NiA0OTYgNDQ1IDUwMCA0NDUgNTQyIDQ0MSA1MTYgMzgwIDUx -OCA0NDggMzkwIDM0MiAzODUgMzA1IDM5OSAzODUgNjcyIDQ4NCA2NzIgNDg0IDY3MSA0ODQgNjcx -IDQzMyA2NzEgNDMzIDY3MSA0MzMgNjcxIDQzMyA3NDAgNzAwIDc0MCA1NDAgNTg5IDQ0OCA1ODkg -NDQ4IDU4OSA0NDggNTg5IDQ0OCA1ODkgNDQ4IDcwNSA0OTIgNzA1IDQ5MiA3MDUgNDkyIDcwNSA0 -OTIgNzM2IDYwNSA3MzYgNjA1IDM4MCAzMTggMzgwIDMxOCAzODAgMzE4IDM3OSAzMTQgMzgwIDMx -OCA3MTEgNjMyIDM2OCAzMTggNjY5IDU1NSA1NDkgNTYyIDMyMCA1NjIgMzIwIDU2MiA0NjAgNTYy -IDQzNiA1NjIgMzU2IDcwMyA1OTEgNzAzIDU5MSA3MDMgNTkxIDYxOCA3MDMgNTg5IDc0MyA1MTgg -NzQzIDUxOCA3NDMgNTE4IDYzMCA0MTkgNjMwIDQxOSA2MzAgNDE5IDUxMCA0MzAgNTEwIDQzMCA1 -MTAgNDMwIDU1MiAzODQgNTUyIDM4NCA1NTIgMzg0IDY4OCA1NzAgNjg4IDU3MCA2ODggNTcwIDY4 -OCA1NzAgNjg4IDU3MCA2ODggNTcxIDk1MiA3NTAgNTkzIDQ2MSA1NzAgNDM1IDU3MCA0MzUgMzQz -IDMxOCA0MDAgNDAwIDQwMCA0MDAgNDAwIDQwMCA0MDAgNDAwIDQwMCA0MDAgNzE2IDU3OSA1NzYg -NTUwIDUzOCAzMDAgMzAwIDUwMCAxODAgNDMwIDIzMCAxNzAyIDIyMCA1MDAgMCA2MDAgNjAwIDc2 -MCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDY4MCA4MDAgMzYwIDQ2MCAyODYgNTgw -IDU4MCA3MTggNDgwIDQ2MCA0NjAgNDM2IDQzNiA0NjAgNDYwIDQ2MCA0NjAgNDYwIDQ2MCAzMzAg -MzMwIDEwMDAgMTAwMCAxMDAwIDEwMDAgMzkwIDM5MCAzOTAgMzkwIDM5MCAzOTAgMzEwIDMxMCAz -MTAgMzEwIDMxMCAzMTAgNDA0IDQwNCA0MDQgNDA0IDQwNCA0MDQgNDA0IDI4MCAyODAgXV0KPj4K -ZW5kb2JqCjYgMCBvYmoKPDwgL1R5cGUgL0ZvbnQKICAgL1N1YnR5cGUgL1R5cGUwCiAgIC9CYXNl -Rm9udCAvUEdEUklZK1NXSUZUREFZM0JvbGQKICAgL0VuY29kaW5nIC9JZGVudGl0eS1ICiAgIC9E -ZXNjZW5kYW50Rm9udHMgWyAyMCAwIFJdCiAgIC9Ub1VuaWNvZGUgMTcgMCBSCj4+CmVuZG9iagoy -MSAwIG9iago8PCAvTGVuZ3RoIDIyIDAgUgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvU3Vi -dHlwZSAvVHlwZTFDCj4+CnN0cmVhbQp4nH1WCVhU1R4/d4bjud6xMYWrqeCgLW5UEpoKZbIKiKzK -GigOiyP7AOOwyKKC2onYF0GQfZMQEc20cd/KNCJ7fWal9arXy77K972+c+nM93pnBkNt8c439zv3 -v/7+5/yXwwELC8BxnFVQiJfHOjfnMAeXlMQYr4zoRI0acBYAAI79naTJQJrFSdYyyUYuWVkYeWsa -bT3B7deV0Iax351senc8zt6ccoppPYe9LEamFk6SATnHzXZ4yTUlNUurid+cYTtfvcD2hcX2S+1s -E2ITdZpkOzu7cd+2Jue2Y97Hiczc3Gh1ckis7aZ4TUqmNj0jy3drWMJz6zYn6mI8kyri9KlpztkA -uAA34AeWAw8G2RV4Am/gD4JBEFgH1oNw8DwIBY7AB0wGS4EXWAtCgDtYAHwBD1aDMBAAAsFcEAGe -lDHluWAxWMHM+TDFUFACGsAB8DY4C66Aj8E34EcgcTJuCjeHW8St4Fw4H66Ma+beki2RrZT5yi7L -eflGeZo8GxskewNnMJDTBrlhmvSUVG18aoLBqBYle3LaaI+U3dJ0yUv0FFwiRC9BuYz8xr7WCMpT -pJctwgSltFD6RfpedBWUgeQrRvIVlLRD2UPeG/UQqW9GSfqFYuy/wHgd9hW8t6sb8yTqLnEhdneD -m2NUftjZbR0VeDLrP6K3oGyUbJmBAJOrQGYlgKSNLhFtBQPNF9cJyiLyLeOGCzERYoSgPEta2ddG -QbmYdLPFq0x+OrnAVpFs5UT2SQNilDBM54obBGULqWaMTYKSLCO2o1NFJ7baQGoYLVpQ/kO6xeC7 -CcU0XHQXGPCPGPBggZSTO2IIs5VOniEzGArlLfK19KO4SiBzpzkLynPkOpMLYgLh5BJbhQrKLLNJ -6spiPl9c6p9Ha+Fuz4H8g5jIMfEg9ZhMx43F7flVvK50YRSs0VdE4xT8pCNdqMFZeEd1yQCvPCQZ -mDEfgVoSg7iW4UwfXSN9IzoI9IB0Ulwi9JJWcSkjnzBvP11r9oX9tXRRDHUrLyCgpf4WvEhcDd8d -xF24Vr9TzWdQq7/i1el3qPl4GphHZaX5xLV1T1tAGb54mKTC+tvhPZF4OY4L8qMqvv7mPcKLOMbP -l87jlfQCCZfeE/NZ7E9KS0ZdRT9hEz0t+gvKRNJoQrUqpST9DO7ccpK+cpQGEpeuPW3rcWrferIG -ukeIaynISU/CmTi7TFfO5+3MWA5rt9fvbsb9uLe9ubutr7JpmEzkySqiEzfjNK0uOSMxX+s/j++b -cO6H+pZu3IJri5uL+LqK1i9gflXuGzrMKw+Sjgf3I4xeDaa55pgHSBiseq0SV5hS76cHUm/VWOpZ -m1OvyZx6VE3l1IXaPX1aN6i6hEc+OEsE3t1ozTbIn22QF9ugK5J8iLjALTWBpcmYZ5najrsK6gv4 -HbEwhDqvckzAfEZ+1SkytY9Y/qxSEhsSSRLFRQLxleaIdoLyeTKZOVILytx6yQuTyNqBNybQbIzM -3chS2m0lFYr7JgmvT1KCIlORWwIrIIJpYDp4AswAM8EsYA1swDzWEfxY3zD1A1PnSAGvgSpQDWpA -LagDe8H74Cq4Bj4Aw+Cf4H/gN86R28ClcxlcJtfJnee+kqlkobKtsnfkU+U28kQ5ll+X/yy/azHR -wsUiyqLL4pTFR3AS3ARfg9Xw1oSQCQY0ASHEo4lIQAo0CT2GlGgyehxNQVORJbJCIpqGpqMn0Aw0 -E81C1sgGzUYqZIvmIFfkhtyRB1qNPJEX8kZrkA9ai3yRH/JHASgQBaF1aD0KRiEoFIWhcBSBXkWR -KAptQBtRNNqE1CgGxaI4FI82xyQlxcT0JA4O9vYODib2xKgU9x8yjMsH6DCGCnrNOOqdjbeSQIz3 -uzeSbCn+a2Oct55RihglqIFaSb/Ce2o32vF+WoHx1it6B+NJFy0TYl/7PZqg4vrvrGET6+XfWWsY -i/Tj8qO0H9+zgnXv618wnnPKwjoSjXHzK42fSbuI3njoJr4j/fT+PtxMAzHEuk+y3Y0+NFLSjuk5 -GM+YrdaaHX4tXYKKiqePlewlc5JxWDGlOLwsCSfSOW/vGbjLNPwwDTF6+Ese55qYwRyMdRdyvjGO -vsMsk2gp/HXVNWOEAbNWSEYamYA/E7isp2uNblBxxaTxIiMc30odaN1LZO+QiZLCKGdyyGNGcImF -MkQqKcRqWuJqAlXKQJlgUvXT5nI4YS6Hq+ZySKQrS/KI971+0U6eOXK/HBQPFYPX/WJoMxWDorW2 -MIROjaGWjqoErKnNreHL++Ep4nL1iyNMl1rTBdSO/eD5hE9V1/CHp89f4nUtMF4TqYnGfOSWti8J -aPr3HdWbuFPbso2vK+u/AbMbdNUmx+OTJoPOg9vfKCzJwzxdSR+nnvSZe9V8/cMx+Kvuw38HMsSd -efU5fHGyCfHLy8cRdxJLAlQKOpHOpPOoPYXvJnzMQN0YB7VeE4L5+KSOm2R2+5cj++oLtCocWhBM -J+XzSYjMrP/hLP6UP775UOhsxWas3RaXFpXg7J9FZfwKYwnMcyzQJ+FUrKnX1vB5xanLYUNxx64W -1gLb9w50HDvw8cVGIuM/l0pg3Wc1TT24E7+Z217AQu78AuaUpZVmspArDtEN2Ddzdw7LejW1+FPf -2kQLYe6SjO1BOAqv3hfTw2/bnr4Sdmwdyj+Mz+PmskNNx9sId6qV2PBDpOhvT/GVh06RyFX399rb -OP/hyXLSPFkaHjFZQsyDRG0eJAq65l67jqWah4VZ8o178TLOjxvz0lx7G7LNTE3PSMpMLsp1ms8n -JfxCk4gDGzDhOK5vIfGCFz+tqe5kI6KxiI2IytKO23B7pa5c/2CKvGyM+6O3vx+kYyHtfURIYQ+G -5ECdFlMNhSMJH35FXvqWaAh0PeChUgx1bVxKxbhnV0enHvmSiAe/H1Y95NQc4S/N9bdhGwEjZNYZ -vB/X7Wko5KvLev8Fd1Rsq8zE3jjCJ4jO5BWL6cQAexWO7Is/G3cutjELJ+Kk3J1x7Jw9hzIb+Kzi -nOWwqcCQcwLfwv+9gD/HF7YcDBjc2K3Zj7txV2tVOz6Gj6e35PCNZS2fQ31VWpnp1BdluhjtYfaC -Lv0ZfBJf6+vv4wuboD4voSALb8E791ef40ek+dCUd1ocO5Z33mMROMfTGJj7oiHpbXwbH750mcxj -mxX0UJuYP0jcimooyMxdBv2pa+hz8ezuk9dUcZh/kwQyS3++NZ3Hl68cucPvcnzgFuX8t7co57Fb -VKHpFlVHgmFZS/lR3MHSYEzSblzy2WV0STLOG5P8YwRnzRH0myOIpDWsfrLN9eP8QP0cN9dPX8nB -luPd351oJdasfIoHifsjolPTGS27YNvhzsqj2/mbuXQF1S61b0yHR3s6KnuLeOKYcAy/RWZklsJ0 -ddbO6CqeTukgTkT7yY2sNrgxJac4vYynC7qg4hEPjtYkRKXxtTr40eGrJ/FNfiilL06tzdDMxvHN -ukOF/KOU7z//B39W2BAKZW5kc3RyZWFtCmVuZG9iagoyMiAwIG9iagogICAyNjEzCmVuZG9iagoy -MyAwIG9iago8PCAvTGVuZ3RoIDI0IDAgUgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl -YW0KeJxdks9ugzAMxu88RY7doYLSgFcJVZq6Sw/7o3V7AEhMh7QGlNJD3352vqqTdoD8cL7PNonz -3f55H4bZ5O9xdAeeTT8EH/k8XqJj0/FxCNmqNH5w8+0rvd2pnbJczIfreebTPvRj1jQm/5DN8xyv -ZvHkx44fMmNM/hY9xyEczeJrd0DocJmmHz5xmE2RbbfGcy/pXtrptT2xyZN5ufeyP8zXpdj+FJ/X -iU2ZvldoyY2ez1PrOLbhyFlTFFvT9P024+D/7a0tLF3vvtuYNfVKpEUhi/AavFZmMAtXlFgWiVeI -V8JlkVgWiZeIl8rQ10m/AW+Ue7A01hDykOYheEm9hB5IeyALtsrIQ5rHojervRFqkdaqoKlSrQ61 -Ou0T+jL9C3JWmrN+hOZR2YGd5qyRs9Y49LXqLfQ26T3iXnij/ZfFKtWFt1YvQU+qJ5wV6VkRzpz0 -zC3YKlOLeJsu7nZDeoU6a/fZcJcYZSzSQKZ50EkYAt9ndhondaXnF1p7vskKZW5kc3RyZWFtCmVu -ZG9iagoyNCAwIG9iagogICAzODMKZW5kb2JqCjI1IDAgb2JqCjw8IC9UeXBlIC9Gb250RGVzY3Jp -cHRvcgogICAvRm9udE5hbWUgL0hRUUtGUCtTV0lGVERBWTNCb2xkSXRhbGljCiAgIC9Gb250RmFt -aWx5IChTV0lGVERBWTMpCiAgIC9GbGFncyA0CiAgIC9Gb250QkJveCBbIC0zNzIgLTExODMgMTYw -NCA5MzggXQogICAvSXRhbGljQW5nbGUgMAogICAvQXNjZW50IDc3MAogICAvRGVzY2VudCAtNDMw -CiAgIC9DYXBIZWlnaHQgOTM4CiAgIC9TdGVtViA4MAogICAvU3RlbUggODAKICAgL0ZvbnRGaWxl -MyAyMSAwIFIKPj4KZW5kb2JqCjcgMCBvYmoKPDwgL1R5cGUgL0ZvbnQKICAgL1N1YnR5cGUgL1R5 -cGUxCiAgIC9CYXNlRm9udCAvSFFRS0ZQK1NXSUZUREFZM0JvbGRJdGFsaWMKICAgL0ZpcnN0Q2hh -ciAzMgogICAvTGFzdENoYXIgMTQ2CiAgIC9Gb250RGVzY3JpcHRvciAyNSAwIFIKICAgL0VuY29k -aW5nIC9XaW5BbnNpRW5jb2RpbmcKICAgL1dpZHRocyBbIDIyMCAwIDAgMCAwIDAgMCAwIDAgMCAw -IDAgMCAwIDI3MCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCA2MzAgMCAwIDAg -MCAwIDAgNzE2IDAgMCAwIDAgMCA2NTYgMCAwIDAgMCAwIDU3NyAwIDAgODk5IDAgNTY4IDAgMCAw -IDAgMCAwIDAgNTIyIDUyMyA0MDkgNTMxIDQzNiAzNTAgNTExIDU0OSAzMDQgMCA1MjMgMjk1IDc4 -OCA1NDUgNDg3IDUyOSA1MTIgNDAyIDM2MiAzMjYgNTQ4IDQ3NSA2OTYgNDYyIDUxNSA0MDEgMCAw -IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDE4OCBdCiAgICAvVG9V -bmljb2RlIDIzIDAgUgo+PgplbmRvYmoKMjYgMCBvYmoKPDwgL0xlbmd0aCAyNyAwIFIKICAgL0Zp -bHRlciAvRmxhdGVEZWNvZGUKICAgL1N1YnR5cGUgL0NJREZvbnRUeXBlMEMKPj4Kc3RyZWFtCnic -Y2RgYWFgZGQUCQ73dAtxcYw0dsrPSfEsSczJTGZgZGFgYGAEYqcf0j9kunnkfvAz/JBl/CHH9EOe -+YcIyx8Omd+JMmwuv+xY+3iUZIFqu3hUgBTDAR5VELWbH0SeEGzkYWJgZWRk49N28HRMyU9K9UxJ -zSvJLKl0zi+oLMpMzyhR0EjWVDAyMDTVUchOzSnLzNPR0YG7SAHkJAWIm+CCDAxMQKcxMoPdx8DM -wMzIqJS3p3vvD8O9jHv3fj+wl3mv2A+VH1P/qLDt/ZMs+sPw+4E/hux8u783f38u6l3aXf19Xvek -jaxm3yeJHp3j8Vvod0zAb2vDwIbz34W+xxz4bvVUftEO0d8Wv/l/x/4u+6263va7+HeL7/zfY7+X -fVdNv/lbXJ5v2fc7P5xFq/JY97eviOk25fitHGFo65Gy/aFc95tZt27s46hbwPpbPCpAqVuR4zfr -lahP3wW/G7z5HvKdwX6nhtys7/2iv03+yW1s/W7yS46VDxHaPKBQUwQF5wKhmlk/PLu/x07f0Mf2 -u6qbHSwj/KND5Eej6Bwerh4ePoZWRkYmZhZWNnYOTi5uHl4+fgFBIWERUTFxCUkpaRlZOXkFRSVl -FVU1dQ1NLW0dXT19A0MjYxNTM3MLSytrG1s7ewdHJ2cXVzd3D08vbx9fP/+AwKDgkNCw8IjIqOiY -2Lj4hMSk5JTUtPSMzKzsnNy8/ILCouKS0rLyisqq6prauvqGxqbmltY27sEAAJhry3MKZW5kc3Ry -ZWFtCmVuZG9iagoyNyAwIG9iagogICA1NjUKZW5kb2JqCjI4IDAgb2JqCjw8IC9MZW5ndGggMjkg -MCBSCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4nF2QwWrDMAyG734KHbtDcZJS -2CEYRnfJYetotgdwbDkzLLZRnEPefo5SOpjAht/6P/Fb8tK9dsFnkB8UTY8ZnA+WcI4LGYQBRx9E -3YD1Jt8V32bSScgC9+ucceqCi6JtQd5Kc860wuHFxgGfBADIK1kkH0Y4fF36/alfUvrBCUOGSigF -Fl0Z96bTu54QJMPHzpa+z+uxYH+OzzUhNKzrPZKJFuekDZIOI4q2KqWgdaWUwGD/9ZudGpz51sTu -urir0/CsWDWs7JnZu2ubsn35EdEsRCUd74VjbYF8wMfqUkwbxecX6UZzeQplbmRzdHJlYW0KZW5k -b2JqCjI5IDAgb2JqCiAgIDIzMwplbmRvYmoKMzAgMCBvYmoKPDwgL1R5cGUgL0ZvbnREZXNjcmlw -dG9yCiAgIC9Gb250TmFtZSAvUFdDREVaK1NXSUZUREFZM0JvbGRJdGFsaWMKICAgL0ZvbnRGYW1p -bHkgKFNXSUZUREFZMykKICAgL0ZsYWdzIDQKICAgL0ZvbnRCQm94IFsgLTM3MiAtMTE4MyAxNjA0 -IDkzOCBdCiAgIC9JdGFsaWNBbmdsZSAwCiAgIC9Bc2NlbnQgNzcwCiAgIC9EZXNjZW50IC00MzAK -ICAgL0NhcEhlaWdodCA5MzgKICAgL1N0ZW1WIDgwCiAgIC9TdGVtSCA4MAogICAvRm9udEZpbGUz -IDI2IDAgUgo+PgplbmRvYmoKMzEgMCBvYmoKPDwgL1R5cGUgL0ZvbnQKICAgL1N1YnR5cGUgL0NJ -REZvbnRUeXBlMAogICAvQmFzZUZvbnQgL1BXQ0RFWitTV0lGVERBWTNCb2xkSXRhbGljCiAgIC9D -SURTeXN0ZW1JbmZvCiAgIDw8IC9SZWdpc3RyeSAoQWRvYmUpCiAgICAgIC9PcmRlcmluZyAoSWRl -bnRpdHkpCiAgICAgIC9TdXBwbGVtZW50IDAKICAgPj4KICAgL0ZvbnREZXNjcmlwdG9yIDMwIDAg -UgogICAvVyBbMCBbIDUwMCA1NDEgNTIwIF1dCj4+CmVuZG9iago4IDAgb2JqCjw8IC9UeXBlIC9G -b250CiAgIC9TdWJ0eXBlIC9UeXBlMAogICAvQmFzZUZvbnQgL1BXQ0RFWitTV0lGVERBWTNCb2xk -SXRhbGljCiAgIC9FbmNvZGluZyAvSWRlbnRpdHktSAogICAvRGVzY2VuZGFudEZvbnRzIFsgMzEg -MCBSXQogICAvVG9Vbmljb2RlIDI4IDAgUgo+PgplbmRvYmoKMSAwIG9iago8PCAvVHlwZSAvUGFn -ZXMKICAgL0tpZHMgWyA5IDAgUiBdCiAgIC9Db3VudCAxCj4+CmVuZG9iagozMiAwIG9iago8PCAv -Q3JlYXRvciAoY2Fpcm8gMS4xMy4xIChodHRwOi8vY2Fpcm9ncmFwaGljcy5vcmcpKQogICAvUHJv -ZHVjZXIgKGNhaXJvIDEuMTMuMSAoaHR0cDovL2NhaXJvZ3JhcGhpY3Mub3JnKSkKPj4KZW5kb2Jq -CjMzIDAgb2JqCjw8IC9UeXBlIC9DYXRhbG9nCiAgIC9QYWdlcyAxIDAgUgo+PgplbmRvYmoKeHJl -ZgowIDM0CjAwMDAwMDAwMDAgNjU1MzUgZiAKMDAwMDAzNDYzNSAwMDAwMCBuIAowMDAwMDAzMjA5 -IDAwMDAwIG4gCjAwMDAwMDAwMTUgMDAwMDAgbiAKMDAwMDAwMzE4NiAwMDAwMCBuIAowMDAwMDE2 -MDg0IDAwMDAwIG4gCjAwMDAwMjg3MzUgMDAwMDAgbiAKMDAwMDAzMjM5NSAwMDAwMCBuIAowMDAw -MDM0NDY2IDAwMDAwIG4gCjAwMDAwMDMzNzUgMDAwMDAgbiAKMDAwMDAwMzU4OSAwMDAwMCBuIAow -MDAwMDE0NTE3IDAwMDAwIG4gCjAwMDAwMTQ1NDIgMDAwMDAgbiAKMDAwMDAxNTc5MCAwMDAwMCBu -IAowMDAwMDE1ODE0IDAwMDAwIG4gCjAwMDAwMTcxNzIgMDAwMDAgbiAKMDAwMDAyNjA3MCAwMDAw -MCBuIAowMDAwMDI2MDk0IDAwMDAwIG4gCjAwMDAwMjczMDggMDAwMDAgbiAKMDAwMDAyNzMzMiAw -MDAwMCBuIAowMDAwMDI3NjAyIDAwMDAwIG4gCjAwMDAwMjg4OTggMDAwMDAgbiAKMDAwMDAzMTYx -MCAwMDAwMCBuIAowMDAwMDMxNjM0IDAwMDAwIG4gCjAwMDAwMzIwOTYgMDAwMDAgbiAKMDAwMDAz -MjExOSAwMDAwMCBuIAowMDAwMDMyOTEzIDAwMDAwIG4gCjAwMDAwMzM1ODQgMDAwMDAgbiAKMDAw -MDAzMzYwNyAwMDAwMCBuIAowMDAwMDMzOTE5IDAwMDAwIG4gCjAwMDAwMzM5NDIgMDAwMDAgbiAK -MDAwMDAzNDIxOCAwMDAwMCBuIAowMDAwMDM0NzAwIDAwMDAwIG4gCjAwMDAwMzQ4MjggMDAwMDAg -biAKdHJhaWxlcgo8PCAvU2l6ZSAzNAogICAvUm9vdCAzMyAwIFIKICAgL0luZm8gMzIgMCBSCj4+ -CnN0YXJ0eHJlZgozNDg4MQolJUVPRgo= ---=_be6bc52b94449e229e651d02e56a25f1-- diff --git a/plugins/vendor/webklex/php-imap/tests/messages/issue-382.eml b/plugins/vendor/webklex/php-imap/tests/messages/issue-382.eml deleted file mode 100644 index f34b89fc..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/issue-382.eml +++ /dev/null @@ -1,9 +0,0 @@ -From: MAILER-DAEMON@mta-09.someserver.com (Mail Delivery System) -To: to@here.com -Subject: Test -Date: Wed, 13 Sep 2017 13:05:45 +0200 -Content-Type: text/plain; - charset="us-ascii" -Content-Transfer-Encoding: quoted-printable - -Hi \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/messages/issue-40.eml b/plugins/vendor/webklex/php-imap/tests/messages/issue-40.eml deleted file mode 100644 index 52e7ff9a..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/issue-40.eml +++ /dev/null @@ -1,39 +0,0 @@ -Return-Path: -Delivered-To: receipent@receipent_domain.pl -Received: from h2.server.pl -\tby h2.server.pl with LMTP -\tid 4IDTIEUkm18ZSSkA87l24w -\t(envelope-from ) -\tfor ; Thu, 29 Oct 2020 21:21:25 +0100 -Return-path: -Envelope-to: receipent@receipent_domain.pl -Delivery-date: Thu, 29 Oct 2020 21:21:25 +0100 -Received: from sender_domain.pl ([server ip]) -\tby h2.server.pl with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 -\t(Exim 4.94) -\t(envelope-from ) -\tid 1kYEQG-00BPgD-S0 -\tfor receipent@receipent_domain.pl; Thu, 29 Oct 2020 21:21:25 +0100 -Received: by sender_domain.pl (Postfix, from userid 1000) -\tid 57DADAB; Thu, 29 Oct 2020 21:21:23 +0100 (CET) -DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=sender_domain.pl; s=default; -\tt=1604002883; bh=CsZufJouWdjY/W12No6MSSMwbp0VaS8EOMGg9WptEaI=; -\th=From:To:Subject:Date; -\tb=v0NAncnNT/w+gInANxAkMt20ktM4LZquuwlokUmLpPyO3++8dy112olu63Dkn9L2E -\t GwfHGqW+8f7g494UK6asUKqTx8fHxlEJbHqAiEV5QrlynSeZDFXsKvGDW8XNMFBKop -\t sAjvp8NTUiNcA4MTbFaZ7RX15A/9d9QVEynU8MaNP2ZYKnq9J/JXgUjjMnx+FiULqf -\t xJN/5rjwHRx7f6JQoXXUxuck6Zh4tSDiLLnDFasrSxed6sTNfnZMAggCyb1++estNk -\t q6HNBwp85Az3ELo10RbBF/WM2FhxxFz1khncRtCyLXLUZ2lzhjan765KXpeYg7FUa9 -\t zItPWVTaTzTEg== -From: faked_sender@sender_domain.pl -To: receipent@receipent_domain.pl -Subject: Zly from -Message-Id: <20201029202123.57DADAB@sender_domain.pl> -Date: Thu, 29 Oct 2020 21:21:01 +0100 (CET) -Forward-Confirmed-ReverseDNS: Reverse and forward lookup success on server ip, -10 Spam score -SPFCheck: Server passes SPF test, -30 Spam score -X-DKIM: signer='sender_domain.pl' status='pass' reason='' -DKIMCheck: Server passes DKIM test, -20 Spam score -X-Spam-Score: -0.2 (/) - -Test message diff --git a/plugins/vendor/webklex/php-imap/tests/messages/issue-401.eml b/plugins/vendor/webklex/php-imap/tests/messages/issue-401.eml deleted file mode 100644 index 386fdad8..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/issue-401.eml +++ /dev/null @@ -1,9 +0,0 @@ -From: from@there.com -To: to@here.com -Subject: 1;00pm Client running few minutes late -Date: Wed, 13 Sep 2017 13:05:45 +0200 -Content-Type: text/plain; - charset="us-ascii" -Content-Transfer-Encoding: quoted-printable - -Hi \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/messages/issue-410.eml b/plugins/vendor/webklex/php-imap/tests/messages/issue-410.eml deleted file mode 100644 index e5fe0c62..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/issue-410.eml +++ /dev/null @@ -1,16 +0,0 @@ -From: from@there.com -To: to@here.com -Subject: =?ISO-2022-JP?B?GyRCIXlCaBsoQjEzMhskQjlmISEhViUsITwlRyVzGyhCJhskQiUoJS8lOSVGJWolIiFXQGxMZ0U5JE4kPyRhJE4jURsoQiYbJEIjQSU1JW0lcyEhIVo3bjQpJSglLyU5JUYlaiUiISYlbyE8JS8hWxsoQg==?= -Date: Wed, 13 Sep 2017 13:05:45 +0200 -MIME-Version: 1.0 -Content-Type: multipart/mixed; - boundary="------------B832AF745285AEEC6D5AEE42" - -Hi ---------------B832AF745285AEEC6D5AEE42 -Content-Transfer-Encoding: base64 -Content-Disposition: attachment; - filename="=?ISO-2022-JP?B?GyRCIXlCaBsoQjEzMhskQjlmISEhViUsITwlRyVzGyhCJhskQiUoJS8lOSVGJWolIiFXQGxMZ0U5JE4kPyRhJE4jURsoQiYbJEIjQSU1JW0lcyEhIVo3bjQpJSglLyU5JUYlaiUiISYlbyE8JS8hWxsoQg==?=" - -SGkh ---------------B832AF745285AEEC6D5AEE42-- \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/messages/issue-410b.eml b/plugins/vendor/webklex/php-imap/tests/messages/issue-410b.eml deleted file mode 100644 index b260a1e0..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/issue-410b.eml +++ /dev/null @@ -1,22 +0,0 @@ -From: from@there.com -To: to@here.com -Subject: =?iso-8859-1?Q?386_-_400021804_-_19.,_Heiligenst=E4dter_Stra=DFe_80_-_081?= - =?iso-8859-1?Q?9306_-_Anfrage_Vergabevorschlag?= -Date: Wed, 13 Sep 2017 13:05:45 +0200 -MIME-Version: 1.0 -Content-Type: multipart/mixed; - boundary="------------B832AF745285AEEC6D5AEE42" - -Hi ---------------B832AF745285AEEC6D5AEE42 -Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet; - name="=?iso-8859-1?Q?2021=5FM=E4ngelliste=5F0819306.xlsx?=" -Content-Description: =?iso-8859-1?Q?2021=5FM=E4ngelliste=5F0819306.xlsx?= -Content-Disposition: attachment; - filename="=?iso-8859-1?Q?2021=5FM=E4ngelliste=5F0819306.xlsx?="; size=11641; - creation-date="Mon, 10 Jan 2022 09:01:00 GMT"; - modification-date="Mon, 10 Jan 2022 09:01:00 GMT" -Content-Transfer-Encoding: base64 - -SGkh ---------------B832AF745285AEEC6D5AEE42-- \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/messages/issue-410symbols.eml b/plugins/vendor/webklex/php-imap/tests/messages/issue-410symbols.eml deleted file mode 100644 index b83a2f26..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/issue-410symbols.eml +++ /dev/null @@ -1,22 +0,0 @@ -From: from@there.com -To: to@here.com -Subject: =?iso-8859-1?Q?386_-_400021804_-_19.,_Heiligenst=E4dter_Stra=DFe_80_-_081?= - =?iso-8859-1?Q?9306_-_Anfrage_Vergabevorschlag?= -Date: Wed, 13 Sep 2017 13:05:45 +0200 -MIME-Version: 1.0 -Content-Type: multipart/mixed; - boundary="------------B832AF745285AEEC6D5AEE42" - -Hi ---------------B832AF745285AEEC6D5AEE42 -Content-Type: application/pdf; name="Checkliste 10.,DAVIDGASSE 76-80;2;2.pdf" -Content-Description: Checkliste 10.,DAVIDGASSE 76-80;2;2.pdf -Content-Disposition: attachment; - filename="Checkliste 10.,DAVIDGASSE 76-80;2;2.pdf"; size=3439313; - creation-date="Tue, 12 Sep 2023 06:53:03 GMT"; - modification-date="Tue, 12 Sep 2023 08:18:16 GMT" -Content-ID: <34A0EDD24A954140A472605B7526F190@there.com> -Content-Transfer-Encoding: base64 - -SGkh ---------------B832AF745285AEEC6D5AEE42-- \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/messages/issue-412.eml b/plugins/vendor/webklex/php-imap/tests/messages/issue-412.eml deleted file mode 100644 index f28b81a7..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/issue-412.eml +++ /dev/null @@ -1,216 +0,0 @@ -Return-Path: -Delivered-To: gmx@tonymarston.co.uk -Received: from ion.dnsprotect.com - by ion.dnsprotect.com with LMTP - id YFDRGeZ6d2SlCRUAzEkvSQ - (envelope-from ) - for ; Wed, 31 May 2023 12:50:46 -0400 -Return-path: -Envelope-to: gmx@tonymarston.co.uk -Delivery-date: Wed, 31 May 2023 12:50:46 -0400 -Received: from mail-vi1eur04olkn2050.outbound.protection.outlook.com ([40.92.75.50]:23637 helo=EUR04-VI1-obe.outbound.protection.outlook.com) - by ion.dnsprotect.com with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 - (Exim 4.96) - (envelope-from ) - id 1q4P28-005pTm-0E - for gmx@tonymarston.co.uk; - Wed, 31 May 2023 12:50:46 -0400 -ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; - b=SYBG6BEOiWsmVfcgXUQJ0moS1SuG/IdTK6DIT4H3g7CQ+hbWIbItTxOhFzJiHP+q0uz+XzR1FzX2Daso+4iKotX7x2ViHIA0Hs65xUZVFtvflMsUrB+5RLlf3Pr7DiNKguQQtC+R2IBLvedc+IqElnMrTHcxLVS2gWl89MZx5Q0bXGWW/9wBVq6yvc6C69ynppcEdD0QZsoUQlp2DgzDpg8iG3y6dYGxFiTvLzw08nTQiCuqi8qQ+nmHyeeItIiAmyKynvyiL+kh4frcSDS67r6PU/CBxvto/nP3RCAxHuzJEGOpS7LJPqoJAlRSrUp2zpeEMpmDFJUE/Jo0K+EgcQ== -ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; - s=arcselector9901; - h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; - bh=ISg5C/1AgVASEPkGp/cgowfc/y9qywGvXMTv5yjJffs=; - b=eVYGErUWMxOeFGLg2nPuB0E/ngKet0hEVcN8Ay4ujGFY4k7i+1hrmnOMD6XiaIk3gVrqPalsmDjmEHpS0zV3+fPPTSktlSvkLrUr5ViVI1kMVBbBQsowLD5x3FpX7fnP2q17WPQ2P6R8Ibudkdnei8uq7gZhc3CSDLv4PfNma45H0FmdaB40mF2dCYzj5hEzr6jmMliANHJjznuDEFEUH3CfS1/iIA9rzhBKPKtahipTNeYiLqvZpKo1fO/XkZ57T44fqHkocfCyEK3Y1rehWudmkU8a9eEZlU5nBC6xoGO3P5Q1XIUNEHFmx2HH7eO8IgGzq/vbLMhcvbc3Ysdb2A== -ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; - dkim=none; arc=none -DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=hotmail.com; - s=selector1; - h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; - bh=ISg5C/1AgVASEPkGp/cgowfc/y9qywGvXMTv5yjJffs=; - b=Qv71Bx+LsM9Lo0uen0vxQzWI3ju4Q095ZMkKPXDaKsd5Y8dA3QteMpAPhy3/mAdP1+EV8NviDBhamtTG4qMO+zEqu/pyRpBGZOtjyiJGKh7aFh2bbodOkJkiGqH3jPwYBnE7T1XAqDVFmvRpuqIkqBe9FXeCZKRrF/Na5Y+zuklH7ebuGQVzIK+xol6q7BDgb/oLul7Wa3r3Lw40cPW5leUgwxngRFMucUVVO5aJ4MWlk76CmcN8XqgwVcFaACY80HLWRqRZfM8n24/KzV9nKSZIQFCgJi2CiqnEWVRSZZtZ9SudJJv4S3C/gU4OYoiFKr7GkEQibyqE2QkGHCBA1g== -Received: from PAXP193MB2364.EURP193.PROD.OUTLOOK.COM (2603:10a6:102:22b::9) - by DB8P193MB0773.EURP193.PROD.OUTLOOK.COM (2603:10a6:10:15a::10) with - Microsoft SMTP Server (version=TLS1_2, - cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6455.22; Wed, 31 May - 2023 16:50:03 +0000 -Received: from PAXP193MB2364.EURP193.PROD.OUTLOOK.COM - ([fe80::b962:59b:2d33:85c2]) by PAXP193MB2364.EURP193.PROD.OUTLOOK.COM - ([fe80::b962:59b:2d33:85c2%5]) with mapi id 15.20.6455.020; Wed, 31 May 2023 - 16:50:03 +0000 -From: Tony Marston -To: "gmx@tonymarston.co.uk" -Subject: RE: TEST MESSAGE -Thread-Topic: TEST MESSAGE -Thread-Index: AQHZjysmbQn8p2cYOEawNV6ywnFmN690oIyAgAAA5rw= -Date: Wed, 31 May 2023 16:50:03 +0000 -Message-ID: - -References: - - <944a7d16fcb607628f358cdd0f5ba8c0@tonymarston.co.uk> -In-Reply-To: <944a7d16fcb607628f358cdd0f5ba8c0@tonymarston.co.uk> -Accept-Language: en-GB, en-US -Content-Language: en-GB -X-MS-Has-Attach: -X-MS-TNEF-Correlator: -x-ms-exchange-messagesentrepresentingtype: 1 -x-tmn: [ABOzTq1ytyWYuvBD5A4I78Eqna1hBLeM] -x-ms-publictraffictype: Email -x-ms-traffictypediagnostic: PAXP193MB2364:EE_|DB8P193MB0773:EE_ -x-ms-office365-filtering-correlation-id: 7fbd6771-9a0d-495d-c4d3-08db61f714a6 -x-microsoft-antispam: BCL:0; -x-microsoft-antispam-message-info: - fwWKs8Qs/JyQ+pSnCNC804PQ86JYn/R63U7P6WCeXLC/fVSGqcAnslOc2vbxC2cUeTPPfow1WAz3f73/7Uk+byKxiE6L48WkgL6BFKVkYCwPKcQ3ps6KyEdGL6uUvPqYKwf5gFgUiTt+fKDiR/GJljj6qmN51jd5lUBvLf1g59q3LryUC+lEy6iLQ8cjCivzmBcR+0C2+uaa/xsjJxokbIEQoMicjjUiVWFkxRFBDr6FO8kEQyzzs70pNivK6mcXpVeJSOiLQfYa/2Q5QDYhE8kznG1EYUzHBQD/sLp/maUgmpKj1b8ObeI13QXed1qih+CtdLYAmPs5GPaoz8aY7pmaxroKLjBAqfOAC2IeQ3grxdQ8eRXlrnZ29cQnvD9tDryUvE9nyQLinaM2Dft4MueHvBTL5+WOTNnVQB98zVjnop8iVkwNrBKzPYiox9ufs9XFXNl0+2fFn66647ET7y/DkBKcszTKYF5RRp5o59QAh8rUTsaKeGJkPkyowZd+i6R12NIavL+eOOgnKvziTTbNl1lGgP+3zTKbgbb6K+DxfbKNl1zaTNvonOHwzI3jfdkDRtg5BvZVKstyl9AfZqo6OZ7ii3JKgVquRVWAtEQ6J6tx1Va/nTVrn1478+Dj -x-ms-exchange-antispam-messagedata-chunkcount: 1 -x-ms-exchange-antispam-messagedata-0: - =?us-ascii?Q?EMaSeqWhMBslXR7KptI34/opub+lBzTReVt3ACHDu/w7NvVUPpdp4YhwogpL?= - =?us-ascii?Q?8V9o/Zj+8vv6zZ7YL0n2NpODi8fzrPScgRiZGtJmfS58OqfgW2yygp1BmawZ?= - =?us-ascii?Q?y99Omv39THENDmCAba4d8zYLikOc+HJUfhpWeb/L9yqut7T2QkPFJYoeN5vU?= - =?us-ascii?Q?LeJ1hoPlguhNnDwMtE3HTgAl0Hbesms0Rb7wGaTDsgAc7XOO+8XpqLamnU0m?= - =?us-ascii?Q?zPpkQXV8+V5dFU2HxgIcYPYSaTX1CLPCdNcCAr1uHPnN81Ntm9Jb7fpYs1oA?= - =?us-ascii?Q?tgzPMwt37Ks9eQucJWZ5LQnNmZl/kYtVnvkylqYYMWiAg3y2XtjVkW/Ut/V2?= - =?us-ascii?Q?6vMfyCB5fEGJrn/uCp+KwL1s7s/4B332Bn4zvwpYd5TioMSGf9Rdp157eAfg?= - =?us-ascii?Q?LiNlLjDFdRc5SSEkUEl1TeX0FOQLsaCsQQqC/hzb10boa49GuxpoKwRmwhAO?= - =?us-ascii?Q?LZ2+veS5Jr1qWngBGo4MTkEq7nD6vBRIXQmKiLMpJc+Gk3/PCADL+H0IRH0+?= - =?us-ascii?Q?4uHnvcVr6CrDDZ2BEwcaWOa/ct8yUI5G9SC5gFP53TaS2llCnYwHAX1PkMAo?= - =?us-ascii?Q?w2LHFHE5I5dtQQJHaWNGMJGYdPmb9dDrksggLWXN+IxsxvFcFNSK2GPaqOMJ?= - =?us-ascii?Q?H4ht1rpqHTlU0uzgjb19gKCCcBdZfIzv118RTjFYG+EX/rsHlNRei/OWdTBF?= - =?us-ascii?Q?xf5cdnap836rQmre5ZoubNsSw2qKSRJhmZH1pCHoCFLtreM1fk7kkVJfkUz5?= - =?us-ascii?Q?ApMa03dEfFvzVv5wvPdWBLiCqzI6z6z8fUmwg2XfvK9Nyxb1AOZoT7JUXnp2?= - =?us-ascii?Q?Me6dTKqGKsBx87Dtny+fANHqgOm+Eo/pBZqyXwN93udbltxPmtNJ84MJJjyx?= - =?us-ascii?Q?vbEiDnMVb4knBO+sBqlKAVUv1F9ZJA2oUTrOD7t1xx6nBmQTgoYN6zsi+dgw?= - =?us-ascii?Q?nPebsl1/6fUy73FWLUKkeA64PeSa00Zi/q53ylXmUZV4Pc+11blKdL8o+p32?= - =?us-ascii?Q?dTD0ndul0WvvpQf8RdYNtGJ/BMurqNfvHq9wJo7Iu4fgTElR50ngwEsr28Bc?= - =?us-ascii?Q?G81pAb2fNhID6ewyOGfj87kqybxUhv1E+4pquh770UagjD1J3rKAUiw1sxWp?= - =?us-ascii?Q?u+FSmd7HKgd2cKJsmMErnQelF3DNozw5d0qdNELXZNO03xlMiADVvhqEJuqc?= - =?us-ascii?Q?uArdsSo2hyApUaiB+dM4Fp+oeiGienEQl64NJ7QFxRb/h96J0iTL3Vp8+8Y?= - =?us-ascii?Q?=3D?= -Content-Type: multipart/alternative; - boundary="_000_PAXP193MB2364F1160B9E7C559D7D897ABB489PAXP193MB2364EURP_" -MIME-Version: 1.0 -X-OriginatorOrg: sct-15-20-4755-11-msonline-outlook-80ceb.templateTenant -X-MS-Exchange-CrossTenant-AuthAs: Internal -X-MS-Exchange-CrossTenant-AuthSource: PAXP193MB2364.EURP193.PROD.OUTLOOK.COM -X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 -X-MS-Exchange-CrossTenant-Network-Message-Id: 7fbd6771-9a0d-495d-c4d3-08db61f714a6 -X-MS-Exchange-CrossTenant-originalarrivaltime: 31 May 2023 16:50:03.3982 - (UTC) -X-MS-Exchange-CrossTenant-fromentityheader: Hosted -X-MS-Exchange-CrossTenant-id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa -X-MS-Exchange-CrossTenant-rms-persistedconsumerorg: 00000000-0000-0000-0000-000000000000 -X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB8P193MB0773 -X-Spam-Status: No, score=-1.6 -X-Spam-Score: -15 -X-Spam-Bar: - -X-Ham-Report: Spam detection software, running on the system "ion.dnsprotect.com", - has NOT identified this incoming email as spam. The original - message has been attached to this so you can view it or label - similar future email. If you have any questions, see - root\@localhost for details. - Content preview: Here is my reply to your reply. Tony Marston From: gmx@tonymarston.co.uk - Sent: 31 May 2023 17:46 To: Tony Marston - Subject: Re: TEST MESSAGE - Content analysis details: (-1.6 points, 8.0 required) - pts rule name description - ---- ---------------------- -------------------------------------------------- - -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1% - [score: 0.0005] - 0.0 FREEMAIL_FROM Sender email is commonly abused enduser mail - provider - [tonymarston[at]hotmail.com] - -0.0 SPF_PASS SPF: sender matches SPF record - 0.5 SUBJ_ALL_CAPS Subject is all capitals - -0.0 SPF_HELO_PASS SPF: HELO matches SPF record - 0.0 HTML_MESSAGE BODY: HTML included in message - -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from - author's domain - 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily - valid - -0.1 DKIM_VALID_EF Message has a valid DKIM or DK signature from - envelope-from domain - -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature - -0.0 T_SCC_BODY_TEXT_LINE No description available. -X-Spam-Flag: NO -X-From-Rewrite: unmodified, no actual sender determined from check mail permissions - ---_000_PAXP193MB2364F1160B9E7C559D7D897ABB489PAXP193MB2364EURP_ -Content-Type: text/plain; charset="us-ascii" -Content-Transfer-Encoding: quoted-printable - -Here is my reply to your reply. - -Tony Marston - -From: gmx@tonymarston.co.uk -Sent: 31 May 2023 17:46 -To: Tony Marston -Subject: Re: TEST MESSAGE - -On 2023-05-25 13:06, Tony Marston wrote: -Here is my reply to your message -> Tony Marston - - ---_000_PAXP193MB2364F1160B9E7C559D7D897ABB489PAXP193MB2364EURP_ -Content-Type: text/html; charset="us-ascii" -Content-Transfer-Encoding: quoted-printable - - - - - - - - -
-

Here is my reply to your reply.

-

 

-

Tony Marston

-

 

-
-

From: gmx@tonymarston.co.uk
-Sent: 31 May 2023 17:46
-To: Tony Marston
-Subject: Re: TEST MESSAGE

-
-

 

-

On 2023-05-25 13:06, Tony Marston wrote:
-Here is my reply to your message
-> Tony Marston

-

 

-
- - - ---_000_PAXP193MB2364F1160B9E7C559D7D897ABB489PAXP193MB2364EURP_-- \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/messages/issue-413.eml b/plugins/vendor/webklex/php-imap/tests/messages/issue-413.eml deleted file mode 100644 index 9f0cbfa2..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/issue-413.eml +++ /dev/null @@ -1,32 +0,0 @@ -Return-Path: -Delivered-To: gmx@tonymarston.co.uk -Received: from ion.dnsprotect.com - by ion.dnsprotect.com with LMTP - id oPy8IzIke2Rr4gIAzEkvSQ - (envelope-from ) - for ; Sat, 03 Jun 2023 07:29:54 -0400 -Return-path: -Envelope-to: gmx@tonymarston.net -Delivery-date: Sat, 03 Jun 2023 07:29:54 -0400 -Received: from [::1] (port=48740 helo=ion.dnsprotect.com) - by ion.dnsprotect.com with esmtpa (Exim 4.96) - (envelope-from ) - id 1q5PSF-000nPQ-1F - for gmx@tonymarston.net; - Sat, 03 Jun 2023 07:29:54 -0400 -MIME-Version: 1.0 -Date: Sat, 03 Jun 2023 07:29:54 -0400 -From: radicore -To: gmx@tonymarston.net -Subject: Test Message -User-Agent: Roundcube Webmail/1.6.0 -Message-ID: -X-Sender: radicore@radicore.org -Content-Type: text/plain; charset=US-ASCII; - format=flowed -Content-Transfer-Encoding: 7bit -X-From-Rewrite: unmodified, already matched - -This is just a test, so ignore it (if you can!) - -Tony Marston diff --git a/plugins/vendor/webklex/php-imap/tests/messages/issue-414.eml b/plugins/vendor/webklex/php-imap/tests/messages/issue-414.eml deleted file mode 100644 index 302e4492..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/issue-414.eml +++ /dev/null @@ -1,27 +0,0 @@ -From: from@there.com -To: to@here.com -Subject: Test -Date: Fri, 29 Sep 2017 10:55:23 +0200 -MIME-Version: 1.0 -Content-Type: multipart/mixed; - boundary="------------5B1F217006A67C28E756A62E" - -This is a multi-part message in MIME format. - ---------------5B1F217006A67C28E756A62E -Content-Type: text/plain; charset=UTF-8; - name="../../example/MyFile.txt" -Content-Transfer-Encoding: base64 -Content-Disposition: attachment; - filename="../../example/MyFile.txt" - -TXlGaWxlQ29udGVudA== ---------------5B1F217006A67C28E756A62E -Content-Type: text/plain; charset=UTF-8; - name="php://foo" -Content-Transfer-Encoding: base64 -Content-Disposition: attachment; - filename="php://foo" - -TXlGaWxlQ29udGVudA== ---------------5B1F217006A67C28E756A62E-- diff --git a/plugins/vendor/webklex/php-imap/tests/messages/issue-462.eml b/plugins/vendor/webklex/php-imap/tests/messages/issue-462.eml deleted file mode 100644 index d13b3cf1..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/issue-462.eml +++ /dev/null @@ -1,5 +0,0 @@ -From: "postmaster@" -To: receipent@receipent_domain.tld -Subject: Undeliverable: Some subject - -Test message diff --git a/plugins/vendor/webklex/php-imap/tests/messages/issue-511.eml b/plugins/vendor/webklex/php-imap/tests/messages/issue-511.eml deleted file mode 100644 index 7cd61faa..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/issue-511.eml +++ /dev/null @@ -1,5 +0,0 @@ -From: COMPANYNAME | =?iso-8859-2?q?us=B3ugi?= -To: receipent@receipent_domain.tld -Subject: =?utf-8?B?UkU6IFtFWFRFUk5BTF0gUmU6IExvcmVtIElwc3VtIC8=?= =?utf-8?Q?40_one?= - -Test message diff --git a/plugins/vendor/webklex/php-imap/tests/messages/issue-544.eml b/plugins/vendor/webklex/php-imap/tests/messages/issue-544.eml deleted file mode 100644 index 96e2c48c..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/issue-544.eml +++ /dev/null @@ -1,220 +0,0 @@ -Sender: "test@mail.com" -From: "test@mail.com" -Subject: Test bad boundary -To: "test_1@mail.com" -Cc: -Bcc: -MIME-Version: 1.0 -Content-Type: multipart/mixed; boundary="-" - -This is a multi-part message in MIME format. - ---- -Content-Type: text/plain - -This message may contain an attachment in a PDF format. - -Special Comments -- -See attached document - ---- -Content-Type: application/pdf; name="file.pdf" -Content-Transfer-Encoding: base64 -Content-Disposition: inline; filename="file.pdf" -Content-MD5: MLGn6wT7mIo/SUBWQ/mmng== - -JVBERi0xLjQKJdPr6eEKMSAwIG9iago8PC9UaXRsZSAoZmlsZS0xLnBkZikKL1Byb2R1Y2VyIChT -a2lhL1BERiBtMTE5IEdvb2dsZSBEb2NzIFJlbmRlcmVyKT4+CmVuZG9iagozIDAgb2JqCjw8L2Nh -IDEKL0JNIC9Ob3JtYWw+PgplbmRvYmoKNSAwIG9iago8PC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCi9M -ZW5ndGggMTkzPj4gc3RyZWFtCnicdZBNDgIhDIX3PUUvILZDoZAYFxrHtYYb+JeYuHC8fyIwo2NM -oASa99FHgZFyLDgvGjs8PeAJRl1VP3sWGUsc9zgmww2We4u3FxQe2COT8zhc4AqHPwftysweVKXs -MSazxybBshdkMb4MxXQFnvsyojGw2oipmCzYmk7Vig2YzrgikrjGdAcxpBzVaa6ZwLaCfN55lmhn -0LdAqCAYdsyk4QuYpjtCIC/uB0irghtdOduoEG2B8YG7lD/3DS1VWPgKZW5kc3RyZWFtCmVuZG9i -agoyIDAgb2JqCjw8L1R5cGUgL1BhZ2UKL1Jlc291cmNlcyA8PC9Qcm9jU2V0IFsvUERGIC9UZXh0 -IC9JbWFnZUIgL0ltYWdlQyAvSW1hZ2VJXQovRXh0R1N0YXRlIDw8L0czIDMgMCBSPj4KL0ZvbnQg -PDwvRjQgNCAwIFI+Pj4+Ci9NZWRpYUJveCBbMCAwIDYxMiA3OTJdCi9Db250ZW50cyA1IDAgUgov -U3RydWN0UGFyZW50cyAwCi9QYXJlbnQgNiAwIFI+PgplbmRvYmoKNiAwIG9iago8PC9UeXBlIC9Q -YWdlcwovQ291bnQgMQovS2lkcyBbMiAwIFJdPj4KZW5kb2JqCjcgMCBvYmoKPDwvVHlwZSAvQ2F0 -YWxvZwovUGFnZXMgNiAwIFI+PgplbmRvYmoKOCAwIG9iago8PC9MZW5ndGgxIDE3ODUyCi9GaWx0 -ZXIgL0ZsYXRlRGVjb2RlCi9MZW5ndGggODc4OD4+IHN0cmVhbQp4nO16C3wURdbvqerueSWTzOT9 -mGQ6DAmSAQJ5kBAimZAHaowECJggSAJEAogEAoiPlbgughGF9VNUdAXf+GQSIgbUJauuu6IIq6gr -PoiIiroI+ikqSPr7V80EQtR75d7vPvz9tpvzr1NVp05Vn3PqdE0HYkQUCVBp6JiS0jI2n80g4nFo -zR9TOXbCssvWX0SkiHrLmAkTR9v+bF5FxPyoDx07ISNzqefpNMhXoV47qaSiuvKWOd8SZZ9F5Lx1 -xry6RraXf4X+dvTPnLFkkX6v6+0viEwHQFWXNM6a9+oVNeuI7HmoXzarrqmR4sgK/QWQd8y69IpL -Si/57HmiAZgvdEnDzHlL93yTeTsWvJHIck5Dfd3MrqiXoI91QX54AxoisqxJqGON1L9h3qKl/ZZo -DiLtVrRVXjp/Rl32j8Ma8DwPoP/ReXVLG7VN9mb0nY+6flndvPrY2mHvwxiVaCtpnN+0yEinteAv -Ff2NC+sbU9+q2E6UeIQo5M9oU8hCnJzEDAO8sGUVfU0F9Ccyo91BGTQJ2h6HrIa6QvIyBgidP3Nh -vHlU9wVU7KBjm45d6ZAtp11VssVGQ3BrdQvrppM+44qFl5I+a2H9XNIb6qcvJP3SukWXkX5KJ2nx -6+4qOfz2tPCCby2JFtl830cD0kX5SuXILcc2nZjlIEsoqtaTM4oyNMhzPE2gzSGelaJwMxpD5wLP -x81oLG5GE3CLcYqykq3BE1u0dVoWhiUGSuUfdAmPsGg8xKRycanSgr2uirEXjCUfDaYntDe6x7Es -8yjW5hPGNWDFNO0Z4QVS5YoCI6OCVo9Ca6WIGdyifQgNo0toNl1KjfSEGA2dw2jmqRbjo173jJ/Y -mYJ2Hk1TSJEWHhSwsLRtlFwDQS/DSk7xrBeP9c2tXwjZ3hjUK+Q4IodJCgs+kYtipL4oaddzjXeF -pY0GuZro/8mdhzgT9zv/N252kB9SHhS3ukrcWmHgNo2UazXTZOEVFfuY5lBzkGew5pIgz/HMDUFe -gb/PCvJqLxmNEiAV4E3giIpoIfxXBw9WYB9MonrUm9Ayn0S050ifD0V/hWyZT4voCvi6Hn3n0jy0 -z4LsZUAdsaD30qbTeEjNosXg69B6eu2U3COQzMQMw3DrWEGD1P3T2YpRWwheYB3aAyscIue8NDjf -bMzQgL6m4OxN8mmWAGfSENPPhOOZXPxRKuIjaFtPXW2iff9bCv8/uvAsZaByPF9kTxv7G63sxV/X -R36Fto3iQQnawxSvpuENQ8anoIOi7J5tHBT9ouSfY0BHkIg20hNsNj1B2+l5dgSjNtFWaqe/UyyV -0N10Nd1KKxCZk9FyA3w4HhFbQreyeKMdWf9eRO69tBOyF9I18EQMizM+o2W0XHkDo5aTnfohGioR -GTex843FyDL71OsoF7n0MmpkzUa1cbNxi/EAPUhblb8bJygEu2EG7p3Gl9o/jfcQwVPoNrqT9rFb -rE9hB12IfbZV+RNiaJ0yVWXGLOMYVpBCl2MNKmJ0J+vkXmivp09ZHLtaKYaW+w2/8SKkXDQVsbiO -trEcNoanaFOMCmMnctFgWgqtd1IbbcHdQc/RXhaqHTEeMI5QPA3CrloGe7zGOpXuE9d2F8JiGqw0 -kEagZz79mf5Gu5mH/YXP10K1TM2nXWnsQW4bRhOx2ocx8hP2Hb8G9zLlJbXMGI09vpz+KKxNf6UP -WQLLYGPZJD6Qz+f3KAuRKQfJnSdy+A10B7R/wLxsCw/lu5T71cfU46ak7i4jDB5Jo7vw/v0Ls+NJ -ddbEfs/eYh/xYj6N38X3K7eqj6ivm+vw1BcjK9xEj9F3LILlsXHsItbArmYr2B/ZnWwn240sV8Sr -+Fx+WGlQFijPqaNxT1Cb1Ou067UbTQe7q7tf7P5H93dGpnE9jUM8XIvV30b34Mm20i6ZKffRfqax -EBaGW2cpbCK7Cvc17CZ2H9vIHmHtmGU3288+Y1+zb9lxjsTITTyRp/B+uD18Ib+c38rv5rtw7+b/ -4j8osUo/xavkKAVKjTIfq1qhrMH9lPKhmqDuUg3YOVNbq63XNmqPac9rR0yh5t9byPLqj/efSD/x -QTd1r+xe293W3W58iHdGPGLKRW6cVsYhT9UhVy/FueRBxPkbLBS2S2DpbBQ7H5aZxuawBWwpLPkH -to49KNf+JHsWVnqbHcaa7dwl1zyE5/DRfCzui3k9X8DX8Ft4O3+LH1PMSogSrkQr6coYZapSryxS -rlDWKn7lVeV9Zb9yVPkRt6HaVLfaT01TveoYdZq6WL1H/VT9VJuivaJ9bLKZ5pmuN3WYvjIPN48y -V5rHmaeaV5u3mPdYahGdL9BT9HTvfc+6lGuVUuUpuplnqfH8Nf4a4nkazVQqOCKVb2Qr+e9YO++v -LTWN5CPZBXRETYOtX+Lr+VE+Uqlg5WwCzeHDAtpMUeqjKArUF+iQ+iye7TVoXmoKZdfww6ZQasNr -ewTm/KsyVPUqr9BeZR8zq/fSu6qNxbJD/GGlElHwnDpKq6YU5W56UlnAfkdP8VIcMY5bViGOL2CP -Ii9UsUz2vYKTJL8AUZSrfIRcNpf/kw5hH6+k29lMdRbdTFnsavqUHsKuGKhdZko3RbOX+Wy1hUey -duLqI3i6Eaw/U7Qo+gObqqwzHebv4G22S7XRB8rjWP0u/qRSoR7RxrMG7IDf0fW0wLiWrtCq1dfZ -LFLYJEpVu5DdrlYy1RSUy5BVpiCnbcHu3oY8UKRUoCUOkXM+4mIiMsQ63HcgT6iIoNnY4xcii71G -7aYq3kGztDCGrINM/Er3eJpsPER3GrPoMuMWGox8sMK4Gho30se0mjay5d1X4b2ZjJ3zATtfK+O7 -tDJjMG/h7/AJfO3p/oW1U1kcfY77SVRG4WzYor6N82ehscp4E9F9FjLsnTSdzqMDeMovMcM5Sidl -dV/AW40ypRHPu4/GGQ8bbmajBuNSnF+fpQfNGtWZvfCxn72O572K6vl4Y5FS3z0bdlgNK/hgrcXI -Pzf4iidWFfkKR51dMDJ/RF5uTnZW5rChGUMGD/KmDzxrQFpqf0+/FN2dnORKTIiPi42JjoqMcDrC -w+yhITarxWzSVIUzGlTqKavV/Wm1fjXNc845g0XdU4eGul4NtX4dTWWny/j1Wimmny7pg+QlfSR9 -AUnfSUnm0AuoYPAgvdSj+3eWePQONnlcNfibSjw1uv+Q5Cskv0bydvApKRigl8Y1lOh+VquX+suW -NLSU1pZAXWuIrdhTXG8bPIhabSFgQ8D5Yz2NrSx2FJMMjy3Nb8WJ145F+RM8JaX+eE+JWIFfSS2t -m+mvHFddWpKYklIzeJCfFc/wTPeTZ7Q/3CtFqFhO4zcV+81yGn22eBq6UW8d1NmyqsNB02u9oTM9 -M+umVPuVuhoxh9OLeUv8sVceiDtVhfKI4uoVvXsTlZbSuNm6qLa0rND9G8ZV9+5NEVhTAx0Yy1PL -alvKMPUqGLF8go7Z+PKaaj9bjil18STiqQLPV+8pFS21c3S/1TPa09AypxauSWjx0/grUtoSEnxb -jS5KKNVbqqo9Kf7CRE9NXYmrNYpaxl+xOd6nx5/eM3hQq8MZMGxrWHiQCbX3ZupP9klOiguufPxJ -yzKxIs+5CAi/PkPHSqo9eKY8AfV51DIjD2K4ahhG+WfCI7P91uLaFke+aBfj/Vqqw6O3fEuIAM+h -f53eUhdsMaU6viXBijg5GWro7+H9Xq8/PV2EiLkYPsUaR8l6zuBBSzq4x9Po0FHAfFQJ29bV5GfA -/CkpwsE3dvhoOir+5nHVgbpO0xPbyJfhrfHzWtHT2dMTPVH0NPf0nBxe60Ekt8sTdrTfknbyX7gj -JrK0Id/PYv4H3fWB/vIJnvJxk6v10pbaoG3Lq06rBfrzTvYFOX9kcbWSyIMcT1RkL4JyyklhUakO -9aup+GeSQT2zw2xBVMoWppf5HbXnBLDGlpLyKwd1GEfEKFmcGhZcpj/fe3p95Gn105YX2qJgwXhV -lldNbmmxndaHUAtMeG6wQMRTVXWKXuynidiZqfjXYXTmCapJ9PtgsmIhgPgLNAWrpwkmBvkaXCI6 -Bw8qQ6JraSnz6GUttS11HUbzdI/u8LRs5c/z51saS2t7AqfD2HZjor9sVQ1s1cDysSk4jW71sJXj -Wn1s5YTJ1VsdRPrKquo2znhx7eia1v7oq96qE/lkKxetolFUdFGhcoaHbOMWKZ+41UfULHtV2SDr -MzoYyTZLTxujGR080OboaeNoUwNtPtkmLpFjiquqe0eP3JI1g+ULT3yDqw6xWPr+IlJwPjmDX1DB -y2RS5WcU8SUFw0Ot1p/Raz5zvWazIj/NiK8wGG632frqVf879IaHhPQR0KC3r21+xWWxqCf1Yrgj -NLSPgNDb1za/4rJaVfFRVerFcKfd3kfApP0v6tV6640MC/sZvX1t8yuukBCT1Cu+RWF4tMPRR8Bs -OvVB8Ez0hprED8MevXEREX0ELCJKzlxvmN0s9YrQhwkSo6L6CFjhzfAz1xsebpZKhV4MT4qJ6SNg -E1Fy5nodDosMXBH6IvHExfURCIE3+9rmV1xOp+2kXidRSnz8f4/eiF56MTzV5eojEGoTnyXP+IqO -OqUXw9N1vY9AGIIs9sz1xsbaxQdb8U8MH+Lx9BEIR3/CmetNSAg7qRfDM9PS+gg40d/XNr/icrnC -5H4SWwrDhw8c2EcgAtGXfOZ6k5PD5X4SWwrD8wcN6iMQKaLvzPXquuOkXgwvzszsIxATiSg5c72p -qZFyo4mtiuHleXl9BOJFlJy53vT0aLkhnCSHTxg1qo+AS0TJmesdMiRObgixpTB8SmlpHwE3oiTr -zPVmZSWKP2PIvxFg+Mzy8j4CKYiSvrb5FVdeXhJ8I/+J4VupSjlrc1qce/ezykDqAnFlYJs3yb1V -GaAktY10+zoUz+aI6MzwosGKjrNLhkQdOB+0CbRdEX+DmaYki78HAZeBmkGbQNtBu0HInkDRq4Pm -g9aDukSPkqS42nS3o2iAEo+x8TiBhCuxdBhkgBRyAzNAY0HTQKtB60EmKSda5oOWgbaDjsgenxLb -dksW1h7bdqMsNs+5NFNW6wLVKVNldfOFNYGyYlygLDk3IJYfEBuWHWgeMjpQDhgUKCNSM5tFabNn -dhbFKDF4yBgsvBHI+IsUzhi5aYMSTX4QV0zBFp8Ssbl/Wub67YpKTOEKo5nkNjoV1mZ3ZhbZuMEP -I5Dc/Et+KNDDD20Oc2auLzqP76dNoO0ghe/H/SH/kJbxLmFzYCFoPWg7aBfoMMjEu3Dvw/0B/4DC -+fuUASoETQOtB20HHQaZ+ftAB39P/M6RKPhCEOfvAR38XTzWu8BwvhfcXr4XS3ujLXdE5lbJeDOC -jDs1yMQmBpmImMwO/nrbDwMRUWnwNCLqGaUfjaIspV9b6jB3hxLXVjDb3cE/2qx73RuKhvI95AeJ -o+gezLyHdFAlqBbUCDKBewvcW9QMWgPaAPKDEGVAB0jnO0Cvgt6ioSAfqBJk4bvbME0H39WWNtpd -FMNf43/D68HNd/K/y/JV/pIsX+F/leXLKJNR7uAvtSW7qSgE/YQxDpQOlBno1/hfNvePcBtFTr4d -tnMDM0CFoLGgaaDVIBPfzvu1zXRHQMkztAOvfzdvo89k+RDdZyHfHLcvrRgBqAtIyz8bHGC9vj6N -+9LW3omqgLSbbwEnIO0Pq8AJSLvyWnAC0i5dAk5A2sw54ASkTZ4GTkDa2CpwgA5+z9P9B7hzx85l -elE4vxxWuhxWuhxWupxUfrm46QdVrO2utvR0WGydzzsw3d28jTU/y5rHs+b7WHM9a76GNV/LmgtY -88Ws2cuaXaw5mTX7WPMzLA+maGa+9tOqI3xxrHkHa36CNTex5jTWnMqa+7NmneX6OnhK27lZsiiV -xeYiselQnj0K2Secp8CiKYj5FOSE7cBdIEPWfBDS+wWE45NF2W9zemGgPiQ/c37ROfwFDHwBbniB -9oFUOOgFhNELUPICFIQDC0HTQJ2gwyADZIJ0Pyx8tcRwYAaoEDQNtAx0GGSSyzkM4jQ/uMRNcmEZ -wUWPFTX+Am7xIT+Fp/iSHC6H13GOstrFwpPZ2GQjmeeSPFtGOC3ODmbf8p39++/sZC2y8pv5akqC -I9YEy9VtPyS5O9gdbWnPuIui2e2UrCLq2AhKY6ko86hJ1nPIZRFlNrn4Yygz21yTMCy8LW2QexsL -E6O2uH9wHXB/5urgYA+6nnG/rXeorM39Jloe2+Le47rB/XJGhwUtz6Z1MBTbdCm61ZXnfmKHFL0W -Heva3NeIYov7d64x7rku2VEf6Li4CTVfuHt82mT3OdBX4pru9jVB5xZ3oetid0FAKkeM2eIeiiV4 -A2w6FjvQJSf1JEuFE3M7WINvkHmtudo81jzcnGkeZE4xu81J5kRzlCXC4rCEWUItNovFYrKoFm4h -S1SH0eXzir+vR5nkf54Qv3EZqZJ3cJJ/Xpd/gufMwuk88kcq5bx8wmhW7u+cQeXTdf/RCZ4OZhs3 -2a95RjN/RDmVV43253nLO8zGeH+ut9xvrryoupWxm2vQ6ucr8Wu/qrqDGaJpeaL4vriVGHMuvylR -lGctv6mmhuJilhTGFUaMco4oK/kZqA2i99QVdxqf5F9bPqHa/2hSjT9TMEZSTbn/P8QHyK3sa3ak -tGQr+0oUNdVblVHs69Lxol0ZVVJTU97BJkk50tlXkEPEfCXlLHgxCznSLckBuXUBuVSMh1x/UUDO -aqVUKZdqtUo5lQm51qb+pSWt/ftLmVidmqRMU6zeW2ZHKmRSU6VMTDPtkDI7YpqFjH+UFHG5IJLs -kiIsgVxSxMUSpMikUyIZQZEbTorcIGdS2CkZV0DG3tUjY++CjPfXXvWjvV62eWTNjCni422tp7Qe -VOu/cUlDnL95uq63zqgJftVNq50+o0GUdfX+Gk99iX+Gp0RvHTnlZ7qniO6RnpJWnBOrqlun+OpL -2kb6RpZ66kpqNo+pzM49ba4bTs6VXfkzyiqFsmwx15jcn+nOFd1jxFy5Yq5cMdcY3xg5F8kYr6xu -tdDomuIpgXIzD7EhXmsTU2pGxzgaR8ngHZkSd03iNpxWNlKIt8Yf6hntt4NE1+CiwUWiC3tKdIWJ -L/TBrrhrRqYkbmMbg10ONDs9o8m7aHHTYoornV0S+NeEC02LFguDB9Db9EsX+kr9vrqSpkX4VeBP -n1DuLxw3ubrVbEZrrXgkf35PW0hIaYfRGWgcgsZ80agoJwVFW4Fos1qDgj/1/+JgWSx2QTN/ZjPz -JbNF1FSj+JPLqzhSQVXwU+g2nKXE66GpBg/YxLysqUdHcNleLwXqJJ65hxYtDnJBWywKloGRGNLU -Y5KTlzCW96TFFkGhyFwkvnto4gsQfkOnOFOcqQDxX4p+1JXOH30aHSdd7RRproh18Dl8HiQH+eIb -eaPCK1gF58xDPEFrhEC82nhTnPcCx4Gpjk8oo+LQsKG0gE2NzEmJLuIDWcdTTwkt2wAraCe0pPri -eAHZeME0mk/LaBOpG9C/Qb33jjiv4+jUqYeoECqycrKit+3cuVOM3YcFH9c68et5r6/EFhoaOnoi -SbSFhYSAl2iz2O3gJSo+uzN7rrqMr+Z3WtTHVWYlk8YVq8ZCOdthI7jPZ0vxZA8lJn6XIOG3Oxx8 -IpjPfc7wcHCu0FBgmN0uW4/44sPDTRPFdz2BdjswIVTz2cOzNaErTOjSmK75NK7Fh2xjBWw5BUyy -wIuHCnoClYKKEwVUWBg7gjlHDBvKptJULwt0pnicJpM5Z/jw3Cx+vL3ojarb92csUq8adbX7yTE7 -puGVU2YcVPZp2/BbNIlt911t46o91Z5tL7FrOVE5rgt5lW181ATXLD5Tq7fOiKp1dbr3aG9Gvh// -ceTHUYdjv4j/OKnLbbhj3G5vQkFMQUJ5QqN7jds8hPe3D4nJ5zn2cl5qL4s613WhbZJ9lv1j06cx -x9g3YQ4WrYSFOMIp0RVidpIt2qWExHUY37cLOwvmaeGIuCxhxa+flu5IdYb3CID5pl0IgPnaN0B0 -h6c6HLudzOH0OWudzU7V7QsJ4RPdPmFqZ4RwgxODAm5wmsLCgHGyT2gICQkxTXSGORwmUf+yXfjD -GZgswPhqxWzORREyDiJklETI+Ijob3aImtkherabd5n3mQ2z6jYX4lygmJPFKsxxwu3mZDGfOVTM -ZQ4Vms0JYiJzfHJ2pfDqNyfd6a04BOZEr902dUGBQ7Q5TngLDmCvFR4qLBDkHOGMgMdpKlswlRak -5Jg8/dLScrIjhmdlxsQ6s5wsKiYrc3hOdpqnn0nJq39x2ZuL5+y5rnZtxuYT+uOLlzy48aql915/ -z6rj969nSsu4Ih52rIxHvLrjLy/tffVF8f293DioJqujKBrRcY8v1k2uaD5RmapNtU4MqVfmavOt -9SGW6A7jQI+pDvjGCy7JJXBAxDvasaijCeqwiPz4Ya6iiIqEIte4iCnx4111EfMS6lxLTUujj/Kj -cQ6KYeH22NjKmNqYRvyEdYWvcWxwcIdDTXTZzLSNP0rM6JS7icmdIVzlYIzdFulSQ2KxlWQ4gPm6 -XXgFzPdbhENiffYO4712YXm78KxYFZjPpYvtQpV1QHq2387sCW7UNqemZYvy6WTsPDdzx3QYP/qm -CEUxWQ6LmMIhve6QceDob/b1T8/u8bWMCuFZoN7L7y7p9zDpd5f0eIz0Pvye28vvcLK3Qvj8ANoQ -A0cXiDYZCXD3ianoKDwUMSJjasGJBQUMbh8R0bPXcTpYsJDFmuB9cjooK5OcUeaUGOF6lpI2QDr/ -4m2Dvtz6WfdhFvXemyyM/XjQ1rZ8xqoTe/m40LxJN1z9CJsUe387czOFhbKzuj/o/sGhb9rWwG67 -vrjhIZEtIxEOzdobFMsG+pKjrCw8PiN+aDxSd/xdoXfbH7FbEuxn2f3xnfFqvDCrL8GdnWSxK6Hh -LhuL5t6oSFUxkW19FIsyIqUNI31qrGRipTFjpfliU1X8OLmFiX3fuXlYXrZMql6XO3sNsXif2L3x -Pjt2L0XJ1HqWTKv9xH6mQcG0iv0s02yUsLhIvu0iWsB80i7TbYdx7GmZce+Pi3+WbaMUOspsyKve -o703nNdb4PimwFEgd90h76GpyK8FBQUnsO1GiCRbfIUvyuE0Wc0mi4mbHNaIRHKawhPxyvWmX3st -82I/LsxyenKycrJzh2M7xpqFG6Kjs6I9zrb16yMTrlty/pTEvMzxJbt2KetWLZibXXZhxJ9sZbXT -V/14CXbeSvE/zZGX8SZlD/viuU2YSpFokmiWiO3wowx56mG0HkYVwZskOB4ibKtINEk0S8TgE3Lj -UA+j9TAYfMKXJDi8EMS7T6JJolminFm+HHsYrYeRM+cLzjpcbISx1jXWDVa/tdO6z3rEaiar29po -bbauDzZ1WQ2rzW1lxMwqXqcmRfh8sJz1GvxO0kyqzWRO1Uhdr25Q/Wqn2qWaOtUjKidVV3ejpqoi -WYuAAHPMFyvCQVVFEKg2Mb8qQ0HtCQUw3TITyHXaRCyoF1jGVMadeqci4S4skO9U+Nsrd5sgsd8W -LviFU7rXG4nThYKsu7K9vV39Yteu49Fq2vG9YvdcB8gV3mQVPntvX57mP5+zr7dO85DP2dcfp/nA -FyKdIC0uzg+bc/PkOWJzdk6gHDosUPZLDZwvUqNjs8M1t7Ze26epYwFHNMWtNWrNmqHhVzsOU0pq -YCPmBjdiNKJ5PbFOOiJ+rOq0m7pwtusxvthZviS5F6XxSRo/uA8twU0YsDwYQ+ZgOukCukA93QXC -B9iF0gvC8KLW98qCta9r17YdKxNvqxXds9UUvK0iKJmt9S0KdQx2nO0od6iFul/nbn1gqCcpMzoz -aXRSo75Gt+TH5ieeF3teYo3lotApsVMS51jmhs52zIudm9ipvxH1ftz7CW8kH4g6kNylG3qMR/U6 -vNE5ar6jTD3PMdnxccgXSd2OEGcYXlYuk5mZYlxhIRQW3/MGiu85osSL44NbeCa+/24bc9h8tlpb -s03V5QFFlwcUG3KTL0SkMltcsH6sXVjQJt5Zwnw2oU5kLzAHfTnCXrZFLDKLZwWPJIHDSOBgkkrU -ydgatoH52RGmulkhG4u8LtOB8A5ziEmYQ8zAHGIZTJ5KIHFUbhApGiOmY6FiKhYhfMbi3WNy41jv -N5bcJhUO8db65oDjxKnWwFsLJ5TCQ84RwRMKZGlBpDMrWqTDmJjoKC5OKwOcSq8zyooH8m9pWLl7 -zuJ9V01ePcT50JKljz28qKm1e7b2XMu4cauMO+7vPn7j+fknjisP7HzxlTdf2fF24C8JCnaWuDRF -YRxvjzjtXyGd9L3FIAtZjG6yktU4gZO+Tf5/5RBgKIUC7WQHhkkMpzCgg8KBTuCPiCMnMJIigFEU -CYwGHqcYigLGUjQwDniM4ikWfALFg0+kBKBLYhIlApPJZfxAbok6JQFTyA3sRzrQA/ye+lMKMJX6 -AdOA39EA8gDPov7AgZQGTJfopQHGURpEZwEHSxxC6cAM8gKH0mDgMOC3lElDgFmUAcymocY3lCNx -OA0D5lIWMI+yjf+kERLzKQc4UmIBDQeeTbnAUZQHLKQRxtfko3xgEY0EjqYCYDHwKyqhs4GlNApY -RoXGERpDPuA5VAQ8l0YDz5NYTsXA86kEWIHfH4fpAoljaQywks4BjqNzjS9pvMQJdB6wCmfRQzSR -KoCTJF5IFwCraazxL6qhSuBk4CG6iMaBn0ITgFOpCnixxGk00fiCamkSsI4uBE4Hfk4zqAY4kyYD -6+ki4CU0xfiMZklsoKnA2XSxcZDmUC34uRIvpTrgPJqO9stoBnC+xEaaaXxKC6geuJBmAZskLqIG -4xNaTLOBS2gO8HLgx7SU5gKvoHnAK+ky4FUSr6b5wN9RI/AaWmAcwI9agc3UBLyWFgF/T4sN8f9w -lwD/IHE5XW7sp+tpKXAFXQFcSVcCb6CrjA+pha4G3ki/Q8sq4Id0E10DvJmWAVfTtcA1wC76I/0e -eAtdB/wP+oOxj26VeBstB66lFcDbaSV67wDuozvpBuA6ajE+oLvoRuDdtAr4J4n30M3A9bQauIHW -AO8Fvk/30R+B99MtwAfoP4AP0q3Ge/QQ3Wa8Sw/TWuBGuh34iMRH6Q7gY3Qn8HG6C/iExCfpbuAm -+hPQT/cAW4F7qY3WAzfTBmA73We8Q0/R/cY/aYvEp+kBYAc9CNxKDwG3SXyGNgKfpUeMt+k5ehT4 -Z4nb6TFgJz0O/As9AXyengS+QJuMt+hF8gP/Sq3Gm/SSxL9RG/DvtNnYQy9TO3AHPQV8hbYAX6Wn -gTvx/ttDr9FW4C6Ju2kb8B/0LPB1es54g94Avk576M/AN2k78C3qNP5Bb0v8Jz0PfIdeAO6lF4Hv -SnyP/gp8n14CfkB/M3bTPold9LKxiz6kHcD99ArwI4kH6FXgx7QT+Am9BvyUdhuv0UGJn9E/gJ/T -68ZO+oLeAP5L4iHaA/yS3jJepcP0NvCIxK/on8Cv6R3gf9Je4DcSv6X3jFfoKL0P/I4+AH4P3EE/ -0D7gMeoCHqcPgT9KPEEfGS9TNx0AGvQx8N85/f98Tv/qN57Tv/jVOf2zX8jpn/0kpx/8hZz+6U9y -+ie/IqcfOJnTF56W0z/6hZz+kczpH/0kp++XOX1/r5y+X+b0/TKn7++V0z/8SU7vkjm9S+b0rt9g -Tn/n/1FO3/PvnP7vnP6by+m/9XP6bzen/9I5/d85/d85/edz+t9/+zn9vwCXmHoeCmVuZHN0cmVh -bQplbmRvYmoKOSAwIG9iago8PC9UeXBlIC9Gb250RGVzY3JpcHRvcgovRm9udE5hbWUgL0FBQUFB -QStBcmlhbE1UCi9GbGFncyA0Ci9Bc2NlbnQgOTA1LjI3MzQ0Ci9EZXNjZW50IC0yMTEuOTE0MDYK -L1N0ZW1WIDQ1Ljg5ODQzOAovQ2FwSGVpZ2h0IDcxNS44MjAzMQovSXRhbGljQW5nbGUgMAovRm9u -dEJCb3ggWy02NjQuNTUwNzggLTMyNC43MDcwMyAyMDAwIDEwMDUuODU5MzhdCi9Gb250RmlsZTIg -OCAwIFI+PgplbmRvYmoKMTAgMCBvYmoKPDwvVHlwZSAvRm9udAovRm9udERlc2NyaXB0b3IgOSAw -IFIKL0Jhc2VGb250IC9BQUFBQUErQXJpYWxNVAovU3VidHlwZSAvQ0lERm9udFR5cGUyCi9DSURU -b0dJRE1hcCAvSWRlbnRpdHkKL0NJRFN5c3RlbUluZm8gPDwvUmVnaXN0cnkgKEFkb2JlKQovT3Jk -ZXJpbmcgKElkZW50aXR5KQovU3VwcGxlbWVudCAwPj4KL1cgWzE2IFszMzMuMDA3ODEgMjc3Ljgz -MjAzXSAyMCA3MiA1NTYuMTUyMzQgNzMgWzI3Ny44MzIwM10gNzYgNzkgMjIyLjE2Nzk3IDgzIFs1 -NTYuMTUyMzRdXQovRFcgNzUwPj4KZW5kb2JqCjExIDAgb2JqCjw8L0ZpbHRlciAvRmxhdGVEZWNv -ZGUKL0xlbmd0aCAyNzE+PiBzdHJlYW0KeJxdkdtqxCAQhu99irncXizRbNplIQSWLAu56IGmfQCj -k1RojBhzkbevhzSFCiofM//vzJjVza3RykH2ZifRooNeaWlxnhYrEDoclCYsB6mE2yieYuSGZF7c -rrPDsdH9RMoSIHv30dnZFQ5XOXX4QLJXK9EqPcDhs249t4sx3ziidkBJVYHE3js9c/PCR4Qsyo6N -9HHl1qPX/GV8rAYhj8xSNWKSOBsu0HI9ICmpXxWUd78qglr+ixdJ1fXii9uQzQqfTemJVYGKOtLT -JdE9UR3p8RTpTKPv5pD/+u3PMxrTGItXfktO50jFJRkWm0UShSrDNPcRiMVa330ceWw7NKw07r9i -JhNUYf8AtiGI+QplbmRzdHJlYW0KZW5kb2JqCjQgMCBvYmoKPDwvVHlwZSAvRm9udAovU3VidHlw -ZSAvVHlwZTAKL0Jhc2VGb250IC9BQUFBQUErQXJpYWxNVAovRW5jb2RpbmcgL0lkZW50aXR5LUgK -L0Rlc2NlbmRhbnRGb250cyBbMTAgMCBSXQovVG9Vbmljb2RlIDExIDAgUj4+CmVuZG9iagp4cmVm -CjAgMTIKMDAwMDAwMDAwMCA2NTUzNSBmIAowMDAwMDAwMDE1IDAwMDAwIG4gCjAwMDAwMDA0MDEg -MDAwMDAgbiAKMDAwMDAwMDEwMSAwMDAwMCBuIAowMDAwMDEwNDU5IDAwMDAwIG4gCjAwMDAwMDAx -MzggMDAwMDAgbiAKMDAwMDAwMDYwOSAwMDAwMCBuIAowMDAwMDAwNjY0IDAwMDAwIG4gCjAwMDAw -MDA3MTEgMDAwMDAgbiAKMDAwMDAwOTU4NSAwMDAwMCBuIAowMDAwMDA5ODE5IDAwMDAwIG4gCjAw -MDAwMTAxMTcgMDAwMDAgbiAKdHJhaWxlcgo8PC9TaXplIDEyCi9Sb290IDcgMCBSCi9JbmZvIDEg -MCBSPj4Kc3RhcnR4cmVmCjEwNTk4CiUlRU9GCg== - ------ diff --git a/plugins/vendor/webklex/php-imap/tests/messages/ks_c_5601-1987_headers.eml b/plugins/vendor/webklex/php-imap/tests/messages/ks_c_5601-1987_headers.eml deleted file mode 100644 index a8de3d08..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/ks_c_5601-1987_headers.eml +++ /dev/null @@ -1,10 +0,0 @@ -Subject: =?ks_c_5601-1987?B?UkU6IMi4v/i01LKyIEVyc2m01MDMILjevcPB9rimILq4s8K9wLTP?= - =?ks_c_5601-1987?B?tNku?= -MIME-Version: 1.0 -Content-Type: text/plain -Date: Wed, 27 Sep 2017 12:48:51 +0200 -Thread-Topic: =?ks_c_5601-1987?B?yLi/+LTUsrIgRXJzabTUwMwguN69w8H2uKYgurizwr3AtM+02S4=?= -From: =?ks_c_5601-1987?B?seggx/bB+A==?= -To: to@here.com - -Content diff --git a/plugins/vendor/webklex/php-imap/tests/messages/mail_that_is_attachment.eml b/plugins/vendor/webklex/php-imap/tests/messages/mail_that_is_attachment.eml deleted file mode 100644 index 89215cf8..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/mail_that_is_attachment.eml +++ /dev/null @@ -1,28 +0,0 @@ -Sender: xxx@yyy.cz -MIME-Version: 1.0 -Message-ID: <2244696771454641389@google.com> -Date: Sun, 15 Feb 2015 10:21:51 +0000 -Subject: Report domain: yyy.cz Submitter: google.com Report-ID: 2244696771454641389 -From: noreply-dmarc-support via xxx -To: xxx@yyy.cz -Content-Type: application/zip; - name="google.com!yyy.cz!1423872000!1423958399.zip" -Content-Disposition: attachment; - filename="google.com!yyy.cz!1423872000!1423958399.zip" -Content-Transfer-Encoding: base64 -Reply-To: noreply-dmarc-support@google.com - -UEsDBAoAAAAIABRPT0bdJB+DSwIAALgKAAAuAAAAZ29vZ2xlLmNvbSFzdW5mb3guY3ohMTQyMzg3 -MjAwMCExNDIzOTU4Mzk5LnhtbO1WwY6bMBC971dEuQcDIQSQQ3rqF7RnZIwh7oJt2WY32a+viQ2h -u9moqnarqOop8Gbmjd/4OQbuj127eCJSUc52y8DzlwvCMK8oa3bL79++rpLlYp8/wJqQqkT4MX9Y -LKAkgktddESjCmk0YAblsikY6kjecN60xMO8g2ACbQ7pEG1zxg1De1pVHZJ4pXox0H2Zl9k8V3PU -EhWYM42wLiireX7QWmQAuErvUgkQKCkDiKlnIj1x2tunXRjF8SbxDfFbMtvFaaJVHoZRFKfxdhtE -myiOgnWSQnAJ23SjmxQSscYpM1BJGsryIArXyTb0fdPMImOcsOocTTfJOjWUw7slA7+yTd3mA4aC -txSfCtGXLVUHMi2Em1GxXPVGytHDL4bMIjaMqkfa5RIC++BAJeozNvxaSOSS/CBYQyAcoi6QGjGB -dR4MyoaH80qvrcrMEnM5LlDy52kEivcSk4KKPIz9bVYnpZ9Fvr/OsB9kWbgOTa8pZSzCvGemLQT2 -YYRdZ/KE2t6MrxoDw0yoElxRbTxtvMaImckMmeUNIxFIKZMwTceJr11gGtFM7aueZr9GjZBWhGla -U3OiprIDQRWRRS15N9+nOex43lRD1OtDIYnqW30hfLXY2xZw7h4YnCT3Mqma08GZ3g+gvhgMvFYy -JI82+R3HpL4XbDdesIm84SB/tE9Gr99wSm3+k646xQbu0Sl/uptW0Sfu5tXzH6b3dP7vd1f/+vl/ -KU83eRnpzbX6uY5JzMeJZ25PLwji920S/r8m/tVrAoLLR+hPUEsBAgoACgAAAAgAFE9PRt0kH4NL -AgAAuAoAAC4AAAAAAAAAAAAAAAAAAAAAAGdvb2dsZS5jb20hc3VuZm94LmN6ITE0MjM4NzIwMDAh -MTQyMzk1ODM5OS54bWxQSwUGAAAAAAEAAQBcAAAAlwIAAAAA \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/messages/missing_date.eml b/plugins/vendor/webklex/php-imap/tests/messages/missing_date.eml deleted file mode 100644 index 5f8a6032..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/missing_date.eml +++ /dev/null @@ -1,7 +0,0 @@ -From: from@here.com -To: to@here.com -Subject: Nuu -Content-Type: text/plain; charset="us-ascii" -Content-Transfer-Encoding: quoted-printable - -Hi diff --git a/plugins/vendor/webklex/php-imap/tests/messages/missing_from.eml b/plugins/vendor/webklex/php-imap/tests/messages/missing_from.eml deleted file mode 100644 index e09dd9d9..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/missing_from.eml +++ /dev/null @@ -1,7 +0,0 @@ -To: to@here.com -Subject: Nuu -Date: Wed, 13 Sep 2017 13:05:45 +0200 -Content-Type: text/plain; charset="us-ascii" -Content-Transfer-Encoding: quoted-printable - -Hi diff --git a/plugins/vendor/webklex/php-imap/tests/messages/mixed_filename.eml b/plugins/vendor/webklex/php-imap/tests/messages/mixed_filename.eml deleted file mode 100644 index 4a353da3..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/mixed_filename.eml +++ /dev/null @@ -1,25 +0,0 @@ -Date: Fri, 02 Feb 2018 22:23:06 +0300 -To: foo@bar.com -Subject: =?windows-1251?B?0eLl5ujpIO/w4OnxLevo8fI=?= -From: =?windows-1251?B?z/Dg6fH7IHx8IM/g8PLK7uw=?= -Content-Transfer-Encoding: quoted-printable -Content-Type: multipart/mixed; - boundary="=_743251f7a933f6b30c004fcb14eabb57" -Content-Disposition: inline - -This is a message in Mime Format. If you see this, your mail reader does not support this format. - ---=_743251f7a933f6b30c004fcb14eabb57 -Content-Type: text/html; charset=windows-1251 -Content-Transfer-Encoding: quoted-printable -Content-Disposition: inline - - ---=_743251f7a933f6b30c004fcb14eabb57 -Content-Type: application/octet-stream -Content-Transfer-Encoding: base64 -Content-Disposition: attachment; filename="Price4VladDaKar.xlsx" - -UEsDBBQAAgAIAHOyQkwNlxQhWwEAAAYFAAATAAAAW0NvbnRlbnRfVHlwZXNdLnhtbK2UTU7D -CwALANECAAAT1E4AAAA= ---=_743251f7a933f6b30c004fcb14eabb57-- diff --git a/plugins/vendor/webklex/php-imap/tests/messages/multipart_without_body.eml b/plugins/vendor/webklex/php-imap/tests/messages/multipart_without_body.eml deleted file mode 100644 index 8f86799f..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/multipart_without_body.eml +++ /dev/null @@ -1,110 +0,0 @@ -Received: from AS8PR02MB6805.eurprd02.prod.outlook.com (2603:10a6:20b:252::8) - by PA4PR02MB7071.eurprd02.prod.outlook.com with HTTPS; Sat, 11 Mar 2023 - 08:24:33 +0000 -Received: from omef0ahNgeoJu.eurprd02.prod.outlook.com (2603:10a6:10:33c::12) - by AS8PR02MB6805.eurprd02.prod.outlook.com (2603:10a6:20b:252::8) with - Microsoft SMTP Server (version=TLS1_2, - cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6178.19; Sat, 11 Mar - 2023 08:24:31 +0000 -Received: from omef0ahNgeoJu.eurprd02.prod.outlook.com - ([fe80::38c0:9c40:7fc6:93a7]) by omef0ahNgeoJu.eurprd02.prod.outlook.com - ([fe80::38c0:9c40:7fc6:93a7%7]) with mapi id 15.20.6178.019; Sat, 11 Mar 2023 - 08:24:31 +0000 -From: =?iso-8859-1?Q?Foo_B=FClow_Bar?= -To: some one -Subject: This mail will not contain a body -Thread-Topic: This mail will not contain a body -Thread-Index: AdlT8uVmpHPvImbCRM6E9LODIvAcQA== -Date: Sat, 11 Mar 2023 08:24:31 +0000 -Message-ID: - -Accept-Language: da-DK, en-US -Content-Language: en-US -X-MS-Exchange-Organization-AuthAs: Internal -X-MS-Exchange-Organization-AuthMechanism: 04 -X-MS-Exchange-Organization-AuthSource: omef0ahNgeoJu.eurprd02.prod.outlook.com -X-MS-Has-Attach: -X-MS-Exchange-Organization-Network-Message-Id: - aa546a02-2b7a-4fb1-7fd4-08db220a09f1 -X-MS-Exchange-Organization-SCL: -1 -X-MS-TNEF-Correlator: -X-MS-Exchange-Organization-RecordReviewCfmType: 0 -x-ms-publictraffictype: Email -X-Microsoft-Antispam-Mailbox-Delivery: - ucf:0;jmr:0;auth:0;dest:I;ENG:(910001)(944506478)(944626604)(920097)(425001)(930097); -X-Microsoft-Antispam-Message-Info: - PeifKDwBVlQGeDu/c7oB3MKTffBwvlRIg5GJo1AiA4LroGAjwgwlg+oPfLetX9CgtbtKZy4gZnbjLCn3jJnod5ehn3Sv9gQaoH9PWkH/PIj6izaJzwlcEk81/MdprZFrORMwR7TGNqP/7ELAHw8rOH2Dmz9vGCE4cv0EwyYS3ShUhXABj4eJ17GNu1B4o53T2m9CzTgm647FRR5jpvk5xNIjQOwrhonVXMkCf2XKwF21sd/k4XLS/jX08tFJXBNyBALhsB4cG9gx2rxZYDn11SBejGFDw4eaqIQw6fYsmsyZvEoCnBkO+vK9lGIrQhRzGj7nJ41+uHVBcUYThce7P/ORpxl3GgThHyQpXQDV00JbP1aCBzm+4w8TyFiL0aOHXDhU9UKRHg3A01F+oH8IKAIaYazLCoOzbVcijSw0icNjBQsNLWa0FvfRT8y/rIvGkOB3rZpKf7ZR0g7cSlDAB3Ml2AaTbIB4ZL6QMukP/waDIObMZFmlVaAvmJzdTEdhGSLtUBFk4CNJhd6szcwaaPZxROumOGtz0sDke2iap8wRZqpdMWHVYi/trA+IESlF2G8TPzZiXs1lRDvYjNlam5r+1Ay1zlSmKTMnGbfNvsJgHkTlcgswKTlip4jGFPh6INTSDZtx9dQuDi4vbyNQiN1qVxoOPScTXzxUKVZ2PJ+8ipL2dqudLb3R2GSDHL10uQTuoIftA/Wjf67QZ629qQ== -Content-Type: multipart/alternative; - boundary="_000_omef0ahNgeoJuEB51C568ED2227A2DAABB5BB9omef0ahNgeoJueurp_" -MIME-Version: 1.0 - ---_000_omef0ahNgeoJuEB51C568ED2227A2DAABB5BB9omef0ahNgeoJueurp_ -Content-Type: text/plain; charset="iso-8859-1" -Content-Transfer-Encoding: quoted-printable - -This mail will not contain a body - - - ---_000_omef0ahNgeoJuEB51C568ED2227A2DAABB5BB9omef0ahNgeoJueurp_ -Content-Type: text/html; charset="iso-8859-1" -Content-Transfer-Encoding: quoted-printable - - - - - - - - -
-

This mail will not contain a bo= -dy

-

 

-
- - - ---_000_omef0ahNgeoJuEB51C568ED2227A2DAABB5BB9omef0ahNgeoJueurp_-- diff --git a/plugins/vendor/webklex/php-imap/tests/messages/multiple_html_parts_and_attachments.eml b/plugins/vendor/webklex/php-imap/tests/messages/multiple_html_parts_and_attachments.eml deleted file mode 100644 index 5ccbd2c3..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/multiple_html_parts_and_attachments.eml +++ /dev/null @@ -1,203 +0,0 @@ -Return-Path: -Delivered-To: to@there.com -Return-path: -Envelope-to: to@there.com -Delivery-date: Thu, 16 Feb 2023 09:19:23 +0000 -From: FromName -Content-Type: multipart/alternative; - boundary="Apple-Mail=_5382A451-FE2F-4504-9E3F-8FEB0B716E43" -Mime-Version: 1.0 (Mac OS X Mail 16.0 \(3731.400.51.1.1\)) -Subject: multiple_html_parts_and_attachments -Date: Thu, 16 Feb 2023 10:19:02 +0100 -To: to@there.com - - - ---Apple-Mail=_5382A451-FE2F-4504-9E3F-8FEB0B716E43 -Content-Transfer-Encoding: quoted-printable -Content-Type: text/plain; - charset=utf-8 - -This is the first html part - -=EF=BF=BC - -This is the second html part - -=EF=BF=BC - -This is the last html part -https://www.there.com - - ---Apple-Mail=_5382A451-FE2F-4504-9E3F-8FEB0B716E43 -Content-Type: multipart/mixed; - boundary="Apple-Mail=_7C42F551-D023-4101-858E-D004D27871BE" - - ---Apple-Mail=_7C42F551-D023-4101-858E-D004D27871BE -Content-Transfer-Encoding: 7bit -Content-Type: text/html; - charset=us-ascii - -This is the first html part

---Apple-Mail=_7C42F551-D023-4101-858E-D004D27871BE -Content-Disposition: inline; - filename=attachment1.pdf -Content-Type: application/pdf; - x-unix-mode=0666; - name="attachment1.pdf" -Content-Transfer-Encoding: base64 - -JVBERi0xLjMKJcTl8uXrp/Og0MTGCjMgMCBvYmoKPDwgL0ZpbHRlciAvRmxhdGVEZWNvZGUgL0xl -bmd0aCA5MyA+PgpzdHJlYW0KeAEdjDsOgCAQBXtP8U7AzwWW3sZOKmtDKExEhej9JWbamamIqFAd -G6ww3jowacEcGC1jxQm55Jby/bzbgbZ3W2v6CzPCkBJu9AxSQRBRGFKBnIvGdPVz/ABGZhatCmVu -ZHN0cmVhbQplbmRvYmoKMSAwIG9iago8PCAvVHlwZSAvUGFnZSAvUGFyZW50IDIgMCBSIC9SZXNv -dXJjZXMgNCAwIFIgL0NvbnRlbnRzIDMgMCBSIC9NZWRpYUJveCBbMCAwIDU5NS4yNzU2IDg0MS44 -ODk4XQo+PgplbmRvYmoKNCAwIG9iago8PCAvUHJvY1NldCBbIC9QREYgL0ltYWdlQiAvSW1hZ2VD -IC9JbWFnZUkgXSAvWE9iamVjdCA8PCAvSW0xIDUgMCBSID4+ID4+CmVuZG9iago1IDAgb2JqCjw8 -IC9UeXBlIC9YT2JqZWN0IC9TdWJ0eXBlIC9JbWFnZSAvV2lkdGggMTE0IC9IZWlnaHQgMjMgL0lu -dGVycG9sYXRlIHRydWUKL0NvbG9yU3BhY2UgNiAwIFIgL0ludGVudCAvUGVyY2VwdHVhbCAvQml0 -c1BlckNvbXBvbmVudCA4IC9MZW5ndGggMTUzNCAvRmlsdGVyCi9GbGF0ZURlY29kZSA+PgpzdHJl -YW0KeAHtmAlTllUUxz9CZTVN+75rmkJmZqMpVgoCoogikArhgmyhKYoKCqK4gQQoCgIBKiiEGCIg -u4CoKU1Mi/uu7fUB7CdnunPnPmLvy4Bj08s888w592z3/J9zz7kvN286/voWgb9u9Hc8PUagu2/T -Y4cOQxBwoNoXZXBvonrj0uCfLg3ui3zvjk9bUD16/MP7xh3j2Vo0z9jVhTNvd3476rerA2XdYA1l -29nHvZoGzyq3Xb+PNG1M58p556CETV9W+6pt2ILqgpR4QXVsRL4yFCIwIRnRkWMf3ZY1lG1n7xFU -jey6239i9iJASMharBT+FVXq8Hmf2icmNT47pe7+8Uc7O0cqWwgjrsHqmnbR/wlUvz7psmJLzISF -O4DFXlSLK/0xmZe0Tip25bYlCp+AuNQXptUgHRW6i3WDFbWiioDgxA39Aw4MDS6dv27tnko/ZQ6x -r2bqB5H5T01u4MNNWrJN1bygWn7IZ+qyDEKMmFesV8KUmK3sp6Zpol9s2qt+B31XpFc1Tjrz4/CZ -8SkSKDot9o/rA1QgehSiIbP20VWCEze2HR2nRLgir6Y2N++lma9Mrxoxtzguc8mfXba3TUcZQmSV -zAZPgdReVAmHSd1hD0JDDJq5X3n2XJz1tHc9i06B+xanxhksahm7Q5DyAPvI+bsfnNAGXbh/pnjI -3DOXLfVzO/J+6K7nfGoR8T79w7tIQfUB13b0H3ZvHfBxhThZnxclhkgf6hI96nlYNsDK6/6VqKGM -QwjAEeWGFvcnJzewwtcZPmdvP9f2xyY2872UK2wf8WhByg4Jh+aa7M+QWtMRE+t7c2EYVvp3v3MH -OHPqHTapkITAvL7FXXk2jrzBukQUAE7rP7UBjJhTNphfPe9MS8E5JQdLn6HhI92Q9yksmYrmxbND -qZyc0k9gOWsSV6ToXz731vWLQ1hHyhdpaR+PQmX9ZFiOADS2lB9sckGEjNSSqukA6xRUprui2q9d -cGKFs4Oy28IckRrpyKL1bS+q63KjiLJqW7S4Wr5lGSwHWXk24hpsfvksVZmYkBHmHDpoRNAccOWq -45vRiJLzI1gBN8oY0ET6+7U3qKKXfKuFFSmTV9jVWbeGBadeWJBEgZYC29g6AdHAGV+JSN5jwgpZ -PH5iLCyanAi+nYjoG9StCmSkozvRaXtRdQ4qYwPTlmdEJcfzSDfg0P16ZZC4NeIaLDrNR1zpgaPD -drJVaUGCKucFz3qX1vdJshxJfQVzJqasIH1Rk6YUhOMqbVeo0n/Gu45Nwu4oDUYEwtSzevDMYkWd -Nwq4op0qQ4jX/A6qQNZ0dE1F24WqNFI2YH2YQeLTiKuz1AwAYksTYNzMWLU5NnMprKAauWk1tPUC -LG5J1rivGqjqUkFVdwWqTEBc0U+IAoz0IuM51OyJgjUQqNKHb5udLFrfdqEakpTElpJyFjBe1SM9 -QZDBvw6jwdIwMWeHp7oGEFKGLytiu/GLSOg5a9erTX7/3XvhGxNpoaxYk+0ZqsUHbl1gmDsqCgSB -aPW/dB03a6A+rdWfL78JIPQcfl/oWzrL/HJtZwTLuqCq5pHO5pYFkZHeORelrlSoMvKgGdnqd1n4 -hjWsgHYvosrtmt3SKhlqkgW/hflAdGlpy7agqrLTcdBp22s1ryyQHLlD6uZCj4/KRZS6Mwx2afoK -aK/o7Uwig2Uc0EjJiIvK9r2zgVf6KvO39rAHyh6LsrFl4G4pCvGP/Zz7AMdWCtuabM9qlSjysbg1 -cQqyS4K5XBGUGYGIxxpIr1UjOzGxvm1HVVJmUludpO+ez8ZcwgsR8R2ZsLByrg2WwmOsIOWhuZVW -+TL4oOXqQrXI+BMFrm1c5iUc84JLux76Zd9qaZUsGlJJKrN4rtLnlkVrFZb/0oSuXysheHPFjUlf -rqat4QoTfkeoQEY6yr9BUGB45nerWr/zfVWp3ZngoKkjhqbOcikCqxMdLsoDNNdgxZ4/Pay60etk -xxg01WKvE0TkLrq/dsq508Psda6nY6Ntr6BqY6z/j5oD1b741g5U7yaq3aHtWLcXgb8Bi7W2lwpl -bmRzdHJlYW0KZW5kb2JqCjcgMCBvYmoKPDwgL04gMyAvQWx0ZXJuYXRlIC9EZXZpY2VSR0IgL0xl -bmd0aCAzNDMgL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngBdZA7SwNBFIXPxsiCpkgh -Vim2sRBWiZsgdpKoiJBiiYqPbrKJiZDHsFkRG7HzD4iVYCdprWKhIP4CQVCxshC1FwI+wnomUTaF -3uHOfHPm3N3LBUIRIWU5DKBS9dzsfNpYXVs39BeEEIWOJEzh1GXKtjO04PdUHETrFpq63Yypb8VO -P7Kv+eP9+7Q5rYvGYuD7kwbyhbrDly+m5UjXA7Q42d72pOI98pDLpsgHiotdbijOdfm841nKztBz -TY46JZEnP5LNXI9e7OFKeUv9V4XqPlKoLqteh5kxzGIOGS4DNixOYQJT1PBPTbJTM4MaJHbgYhNF -lOCxOkVFoowCeQFVOBiHSbYQZybUrFnLCGYYaLUIMPnMx6tAE0/A2e7PSAxVCYzQEz0CLt6lcEVX -4661wvWNhNW5a4NNoP/Q999WAH0UaN/5/mfT99snQN8DcNn6BsE0ZMMKZW5kc3RyZWFtCmVuZG9i -ago2IDAgb2JqClsgL0lDQ0Jhc2VkIDcgMCBSIF0KZW5kb2JqCjIgMCBvYmoKPDwgL1R5cGUgL1Bh -Z2VzIC9NZWRpYUJveCBbMCAwIDU5NS4yNzU2IDg0MS44ODk4XSAvQ291bnQgMSAvS2lkcyBbIDEg -MCBSIF0KPj4KZW5kb2JqCjggMCBvYmoKPDwgL1R5cGUgL0NhdGFsb2cgL1BhZ2VzIDIgMCBSID4+ -CmVuZG9iago5IDAgb2JqCjw8IC9UaXRsZSAo/v9cMDAwU1wwMDBjXDAwMGhcMDAwZVwwMDByXDAw -MG1cMDAwrVwwMDBhXDAwMGZcMDAwYlwwMDBlXDAwMGVcMDAwbFwwMDBkXDAwMGlcMDAwblwwMDBn -XDAwMCBcMDAwMlwwMDAwXDAwMDJcMDAwM1wwMDAtXDAwMDBcMDAwMlwwMDAtXDAwMDFcMDAwNlww -MDAgXDAwMG9cMDAwbVwwMDAgXDAwMDFcMDAwMFwwMDAuXDAwMDFcMDAwMVwwMDAuXDAwMDBcMDAw -M1wwMDAuXDAwMHBcMDAwblwwMDBnKQovUHJvZHVjZXIgKG1hY09TIFZlcnNpZSAxMy4yIFwoYnVp -bGQgMjJENDlcKSBRdWFydHogUERGQ29udGV4dCkgL0NyZWF0b3IgKFZvb3J2ZXJ0b25pbmcpCi9D -cmVhdGlvbkRhdGUgKEQ6MjAyMzAyMTYwOTExNDdaMDAnMDAnKSAvTW9kRGF0ZSAoRDoyMDIzMDIx -NjA5MTE0N1owMCcwMCcpCj4+CmVuZG9iagp4cmVmCjAgMTAKMDAwMDAwMDAwMCA2NTUzNSBmIAow -MDAwMDAwMTg2IDAwMDAwIG4gCjAwMDAwMDI2MDIgMDAwMDAgbiAKMDAwMDAwMDAyMiAwMDAwMCBu -IAowMDAwMDAwMzAwIDAwMDAwIG4gCjAwMDAwMDAzODkgMDAwMDAgbiAKMDAwMDAwMjU2NyAwMDAw -MCBuIAowMDAwMDAyMTI1IDAwMDAwIG4gCjAwMDAwMDI2OTUgMDAwMDAgbiAKMDAwMDAwMjc0NCAw -MDAwMCBuIAp0cmFpbGVyCjw8IC9TaXplIDEwIC9Sb290IDggMCBSIC9JbmZvIDkgMCBSIC9JRCBb -IDxlNzk0OWE2YzQ2MWM1MDYxNTk0ODU5YjkxZjczYzAzMz4KPGU3OTQ5YTZjNDYxYzUwNjE1OTQ4 -NTliOTFmNzNjMDMzPiBdID4+CnN0YXJ0eHJlZgozMTYxCiUlRU9GCg== ---Apple-Mail=_7C42F551-D023-4101-858E-D004D27871BE -Content-Transfer-Encoding: 7bit -Content-Type: text/html; - charset=us-ascii - -

This is the second html part

---Apple-Mail=_7C42F551-D023-4101-858E-D004D27871BE -Content-Disposition: inline; - filename=attachment2.pdf -Content-Type: application/pdf; - x-unix-mode=0666; - name="attachment2.pdf" -Content-Transfer-Encoding: base64 - -JVBERi0xLjMKJcTl8uXrp/Og0MTGCjMgMCBvYmoKPDwgL0ZpbHRlciAvRmxhdGVEZWNvZGUgL0xl -bmd0aCA5MyA+PgpzdHJlYW0KeAEdjDsOgCAQBXtP8U4ALB9Zehs7qawNoTARFaL3l5hpZ6YiokJ1 -XHBCezeCLQnmwGgZK07IJbeU7+fdDrS926TpL4yCNl6Q8QyrnAjWhiEVyLkQpquf4wdGBBarCmVu -ZHN0cmVhbQplbmRvYmoKMSAwIG9iago8PCAvVHlwZSAvUGFnZSAvUGFyZW50IDIgMCBSIC9SZXNv -dXJjZXMgNCAwIFIgL0NvbnRlbnRzIDMgMCBSIC9NZWRpYUJveCBbMCAwIDU5NS4yNzU2IDg0MS44 -ODk4XQo+PgplbmRvYmoKNCAwIG9iago8PCAvUHJvY1NldCBbIC9QREYgL0ltYWdlQiAvSW1hZ2VD -IC9JbWFnZUkgXSAvWE9iamVjdCA8PCAvSW0xIDUgMCBSID4+ID4+CmVuZG9iago1IDAgb2JqCjw8 -IC9UeXBlIC9YT2JqZWN0IC9TdWJ0eXBlIC9JbWFnZSAvV2lkdGggMTIxIC9IZWlnaHQgMzAgL0lu -dGVycG9sYXRlIHRydWUKL0NvbG9yU3BhY2UgNiAwIFIgL0ludGVudCAvUGVyY2VwdHVhbCAvQml0 -c1BlckNvbXBvbmVudCA4IC9MZW5ndGggMTczNSAvRmlsdGVyCi9GbGF0ZURlY29kZSA+PgpzdHJl -YW0KeAHtl4lT1kUYx/+Eymq677s0TTHzajSPPBFE8UA0T1RuxRMVUfEAEVECFQVREQ9UxiNFVFAU -FJAxGrDM+9bu+gPsI8+0s+27v3qFmnLm987OO8+9u9999nn2d++e+3MRcBFwEXARcBFwEXBE4Le7 -Td3RYAQcYbUpGjyL6wgCNkQdZS5ijUHAEVabojETNd737vWW311v2fg4/1UEG6KOMn2RVdU9Hul1 -mrFme6guh7568aO62s4/3WoucoM1jL1nnws43nL0Xu/t/yXLv93O+XMd0rZEjluUMjRu1ayMuZXV -PWQljrDaFPrip6xIEKi7R+fqcugxC1NRVZzuKXKDNYy9Z/8nUP/1dsjAt4IOsf0n+51kQDzue2rd -zvFs04aoo0zBQsa+Nrj4+QGlrwwqebR3VV1dJ6WCMBZjsLrlA9EPBdQ9J28C3qUbYoDo1lWflXmR -sE/7l106384RVptCIZNfOJwIoUlLJbfnr41VqhHz0l4fehht54ityA1WzLbvHxGyeFnTEQfahBSE -L03cURis3CH2HB7y6aTcFwce4zQHxK5Vt0Og3ntk8JA5q5iiY2j+wqwZynHQ7DWs5/Dx/sHx6e8E -Hwyam1FUOuDit+1HJayQiWamx/9yp5myp8ShajV6D0UpZHHKqapeSkUo9nX8VN/AWZlvDyvqODF/ -Xmbsr/W+1u0oR+AFVWIqCYTP2N2gsfNgsA1RR5mKwBpwLynzYz0QLUbtUyr/GVkvBR5F6DNmz4y0 -eQaL2aptYWgZnEWn8G3cL+i8faMkQuaOiVyTJn0rPonY+urgYlT8XzjXAS1QP9anEnsuZrPP9kuQ -5I0x4oj2iXrVM/5lsgAk7w0vxAxjAkKAmBgfK+/3wsBjSDiy9hN2NulT+Wz/ExyiCoXvU37laFmh -1IEl2dPQem5HXOS/trYzCRCbPlcJOSCQZyLyxxFWm0IiXDzfjpUreCEIdbS8n4pvVAyD7Ra9GcRO -/pFFYIs7CYb7rSutqUgEJzlhSZKxC5ejXbZxMizbF8trl9qwhZyCcbC+U9fLvKLF/sblD+9ca4Uc -LcdUXtkbg8KjA2G5LND4kqiwqZujmQLJrqJhoE366aG4F7ev+iABJYz7Ts0RrbEdETr9b9w9Bl/O -kWZqQ9RRJgEpRLgvWDtT2LjVc2CpA2o6YzEGm7t3tMphXNgm7txZaFTQ1AcVquarLqhSc6ORACYJ -D5Ki/fn2++Tbm0GHhBXtzSuthV2UNZ1QFA1hgRcDKhJs6UlfVM1HfiEq+e8amYew+kx3WCy5Oxyo -qCg7ZLiayNiOHkSneZdShVgwg3RC5QirTSGhWtcXH14yMakJDCkm3Nkfb7YQA2MxBovNiYo+1NUu -kVtYPythjwI1tRdar/wSUP5BgButS3CnNSvtG5p2xeYoQqVvjVD2LweWsEjY9QUhqICdzFeDyAj3 -lwRiwESUaOUI8W7wQTWR53Z0S6FpRlK7eI2QSyK0Ieoow0WKM6vyHMSXmMZidJbsAlV8qSGUtZEL -VsZnzoIVqCctXwTt+VCXsCBgvKsNqHWtQK2HAmpaLaEoR8wCtpQyYxw54Y+B50RATW237k6E6p+K -NCExmfjcOIo2jxClcoTVpsArLCmJOEk5U2juakhJEbiw0bE1WIow7iybd76sgdaPRHxTNk2CZqmi -4v+brz+OSllMWYb2RKBhUOcfuP98osGpWWQi2scP9RfTcyLvs3rayvkEbzt+l9QifQoboo6y7298 -AErUMYq8HoRHI22FB4DIBWrV+HR2w+6xrESvxtPT7q9NoKa3QvNgkG7FFFHLliDhCKA9EWgY1HwF -sFrKL91TdsEnP6HIQyn1nhN5Qq12p+PASRGEJ9DZs3/60BAbR1htCumnvHX1+EL3jtkAJnyQwvI1 -Ch0wc52UKZ3lrCnObJO3E99QYC61mu5fXOaHr9/0bHxp96u3hw2P/5zXCLderoAnAg2DmlnkBHnI -cV+yd4Xw3mNS+o7sxXMiHWp9O2Kv/uXO0hHYhTHoxTZEHWWCA+8EFVwRGdvCWW23qDwknDj9HVZy -1WBJUfoXWgYFs6AoiA4LLa8p8kr6rBjwkuRLRGahMRlfBzQdKb8YGFr5TMvMv9/6ZfDwo1wLzfMg -IjlRpuCfPJydEafauhEKFz6C1ETGdlR8iMScqSqmQTT4E0aP70RzT9UNxUZneacB4JmabsoXmue6 -Yq9caHuoNODLmq5YKuE/TjAjb+Z9xYMuX2j7oMH17Xjp65jBNoWXMV0zKwI2RB1l1giu0EsEHGG1 -KbyM6ZpZEbAh6spcBFwEXARcBB4aBH4HWDJl2AplbmRzdHJlYW0KZW5kb2JqCjcgMCBvYmoKPDwg -L04gMyAvQWx0ZXJuYXRlIC9EZXZpY2VSR0IgL0xlbmd0aCAzNDMgL0ZpbHRlciAvRmxhdGVEZWNv -ZGUgPj4Kc3RyZWFtCngBdZA7SwNBFIXPxsiCpkghVim2sRBWiZsgdpKoiJBiiYqPbrKJiZDHsFkR -G7HzD4iVYCdprWKhIP4CQVCxshC1FwI+wnomUTaF3uHOfHPm3N3LBUIRIWU5DKBS9dzsfNpYXVs3 -9BeEEIWOJEzh1GXKtjO04PdUHETrFpq63Yypb8VOP7Kv+eP9+7Q5rYvGYuD7kwbyhbrDly+m5UjX -A7Q42d72pOI98pDLpsgHiotdbijOdfm841nKztBzTY46JZEnP5LNXI9e7OFKeUv9V4XqPlKoLqte -h5kxzGIOGS4DNixOYQJT1PBPTbJTM4MaJHbgYhNFlOCxOkVFoowCeQFVOBiHSbYQZybUrFnLCGYY -aLUIMPnMx6tAE0/A2e7PSAxVCYzQEz0CLt6lcEVX4661wvWNhNW5a4NNoP/Q999WAH0UaN/5/mfT -99snQN8DcNn6BsE0ZMMKZW5kc3RyZWFtCmVuZG9iago2IDAgb2JqClsgL0lDQ0Jhc2VkIDcgMCBS -IF0KZW5kb2JqCjIgMCBvYmoKPDwgL1R5cGUgL1BhZ2VzIC9NZWRpYUJveCBbMCAwIDU5NS4yNzU2 -IDg0MS44ODk4XSAvQ291bnQgMSAvS2lkcyBbIDEgMCBSIF0KPj4KZW5kb2JqCjggMCBvYmoKPDwg -L1R5cGUgL0NhdGFsb2cgL1BhZ2VzIDIgMCBSID4+CmVuZG9iago5IDAgb2JqCjw8IC9UaXRsZSAo -/v9cMDAwU1wwMDBjXDAwMGhcMDAwZVwwMDByXDAwMG1cMDAwrVwwMDBhXDAwMGZcMDAwYlwwMDBl -XDAwMGVcMDAwbFwwMDBkXDAwMGlcMDAwblwwMDBnXDAwMCBcMDAwMlwwMDAwXDAwMDJcMDAwM1ww -MDAtXDAwMDBcMDAwMlwwMDAtXDAwMDFcMDAwNlwwMDAgXDAwMG9cMDAwbVwwMDAgXDAwMDFcMDAw -MFwwMDAuXDAwMDFcMDAwMVwwMDAuXDAwMDFcMDAwMFwwMDAuXDAwMHBcMDAwblwwMDBnKQovUHJv -ZHVjZXIgKG1hY09TIFZlcnNpZSAxMy4yIFwoYnVpbGQgMjJENDlcKSBRdWFydHogUERGQ29udGV4 -dCkgL0NyZWF0b3IgKFZvb3J2ZXJ0b25pbmcpCi9DcmVhdGlvbkRhdGUgKEQ6MjAyMzAyMTYwOTEx -MzhaMDAnMDAnKSAvTW9kRGF0ZSAoRDoyMDIzMDIxNjA5MTEzOFowMCcwMCcpCj4+CmVuZG9iagp4 -cmVmCjAgMTAKMDAwMDAwMDAwMCA2NTUzNSBmIAowMDAwMDAwMTg2IDAwMDAwIG4gCjAwMDAwMDI4 -MDMgMDAwMDAgbiAKMDAwMDAwMDAyMiAwMDAwMCBuIAowMDAwMDAwMzAwIDAwMDAwIG4gCjAwMDAw -MDAzODkgMDAwMDAgbiAKMDAwMDAwMjc2OCAwMDAwMCBuIAowMDAwMDAyMzI2IDAwMDAwIG4gCjAw -MDAwMDI4OTYgMDAwMDAgbiAKMDAwMDAwMjk0NSAwMDAwMCBuIAp0cmFpbGVyCjw8IC9TaXplIDEw -IC9Sb290IDggMCBSIC9JbmZvIDkgMCBSIC9JRCBbIDxjOWI4YzBlZGQ5Mjk1Y2U3ZmQ2YzFkOWJj -ZTJhZTRiOD4KPGM5YjhjMGVkZDkyOTVjZTdmZDZjMWQ5YmNlMmFlNGI4PiBdID4+CnN0YXJ0eHJl -ZgozMzYyCiUlRU9GCg== ---Apple-Mail=_7C42F551-D023-4101-858E-D004D27871BE -Content-Transfer-Encoding: 7bit -Content-Type: text/html; - charset=us-ascii - -

This is the last html part
https://www.there.com



-
---Apple-Mail=_7C42F551-D023-4101-858E-D004D27871BE-- - ---Apple-Mail=_5382A451-FE2F-4504-9E3F-8FEB0B716E43-- diff --git a/plugins/vendor/webklex/php-imap/tests/messages/multiple_nested_attachments.eml b/plugins/vendor/webklex/php-imap/tests/messages/multiple_nested_attachments.eml deleted file mode 100644 index ad48d47b..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/multiple_nested_attachments.eml +++ /dev/null @@ -1,84 +0,0 @@ -Date: Mon, 15 Jan 2018 10:54:09 +0100 -User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 - Thunderbird/52.5.0 -MIME-Version: 1.0 -Content-Type: multipart/mixed; - boundary="------------85793CE1578A77318D5A90A6" -Content-Language: en-US - -This is a multi-part message in MIME format. ---------------85793CE1578A77318D5A90A6 -Content-Type: multipart/alternative; - boundary="------------32D598A7FC3F8A8E228998B0" - - ---------------32D598A7FC3F8A8E228998B0 -Content-Type: text/plain; charset=utf-8; format=flowed -Content-Transfer-Encoding: 7bit - - ------------------------------------------------------------------------- - - - - ---------------32D598A7FC3F8A8E228998B0 -Content-Type: multipart/related; - boundary="------------261DC39B47CFCDB73BCE3C18" - - ---------------261DC39B47CFCDB73BCE3C18 -Content-Type: text/html; charset=utf-8 -Content-Transfer-Encoding: 8bit - - - - - - - -


-

-
- - - Â -
- - - - - - - -

-

-
-
- - - ---------------261DC39B47CFCDB73BCE3C18 -Content-Type: image/png; - name="mleokdgdlgkkecep.png" -Content-Transfer-Encoding: base64 -Content-ID: -Content-Disposition: inline; - filename="mleokdgdlgkkecep.png" - -iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEX/TQBcNTh/AAAACklE -QVR4nGNiAAAABgADNjd8qAAAAABJRU5ErkJggg== ---------------261DC39B47CFCDB73BCE3C18-- - ---------------32D598A7FC3F8A8E228998B0-- - ---------------85793CE1578A77318D5A90A6 -Content-Type: image/png; - name="FF4D00-1.png" -Content-Transfer-Encoding: base64 -Content-Disposition: attachment; - filename="FF4D00-1.png" - -iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEX/TQBcNTh/AAAACklE -QVR4nGNiAAAABgADNjd8qAAAAABJRU5ErkJggg== ---------------85793CE1578A77318D5A90A6-- \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/messages/nestes_embedded_with_attachment.eml b/plugins/vendor/webklex/php-imap/tests/messages/nestes_embedded_with_attachment.eml deleted file mode 100644 index 44498103..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/nestes_embedded_with_attachment.eml +++ /dev/null @@ -1,145 +0,0 @@ -From: from@there.com -To: to@here.com -Subject: Nuu -Date: Wed, 13 Sep 2017 13:05:45 +0200 -MIME-Version: 1.0 -Content-Type: multipart/mixed; - boundary="----=_NextPart_000_000_000" - -This is a multi-part message in MIME format. - -------=_NextPart_000_000_000 -Content-Type: multipart/alternative; - boundary="----=_NextPart_000_111_000" - - -------=_NextPart_000_111_000 -Content-Type: text/plain; - charset="iso-8859-1" -Content-Transfer-Encoding: quoted-printable - -Dear Sarah - -------=_NextPart_000_111_000 -Content-Type: text/html; - charset="iso-8859-1" -Content-Transfer-Encoding: quoted-printable - - - -
Dear Sarah,
- - -------=_NextPart_000_111_000-- - -------=_NextPart_000_000_000 -Content-Type: message/rfc822; - name="first.eml" -Content-Transfer-Encoding: 7bit -Content-Disposition: attachment; - filename="first.eml" - -From: from@there.com -To: to@here.com -Subject: FIRST -Date: Sat, 28 Apr 2018 14:37:16 -0400 -MIME-Version: 1.0 -Content-Type: multipart/mixed; - boundary="----=_NextPart_000_222_000" - -This is a multi-part message in MIME format. - -------=_NextPart_000_222_000 -Content-Type: multipart/alternative; - boundary="----=_NextPart_000_222_111" - - -------=_NextPart_000_222_111 -Content-Type: text/plain; - charset="UTF-8" -Content-Transfer-Encoding: quoted-printable - -Please respond directly to this email to update your RMA - - -2018-04-17T11:04:03-04:00 -------=_NextPart_000_222_111 -Content-Type: text/html; - charset="UTF-8" -Content-Transfer-Encoding: quoted-printable - - - -
Please respond directly to this = -email to=20 -update your RMA
- -------=_NextPart_000_222_111-- - -------=_NextPart_000_222_000 -Content-Type: image/png; - name="chrome.png" -Content-Transfer-Encoding: base64 -Content-Disposition: attachment; - filename="chrome.png" - -iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAMAAADXqc3KAAAB+FBMVEUAAAA/mUPidDHiLi5Cn0Xk -NTPmeUrkdUg/m0Q0pEfcpSbwaVdKskg+lUP4zA/iLi3msSHkOjVAmETdJSjtYFE/lkPnRj3sWUs8 -kkLeqCVIq0fxvhXqUkbVmSjwa1n1yBLepyX1xxP0xRXqUkboST9KukpHpUbuvRrzrhF/ljbwalju -ZFM4jELaoSdLtElJrUj1xxP6zwzfqSU4i0HYnydMtUlIqUfywxb60AxZqEXaoifgMCXptR9MtklH -pEY2iUHWnSjvvRr70QujkC+pUC/90glMuEnlOjVMt0j70QriLS1LtEnnRj3qUUXfIidOjsxAhcZF -o0bjNDH0xxNLr0dIrUdmntVTkMoyfL8jcLBRuErhJyrgKyb4zA/5zg3tYFBBmUTmQTnhMinruBzv -vhnxwxZ/st+Ktt5zp9hqota2vtK6y9FemNBblc9HiMiTtMbFtsM6gcPV2r6dwroseLrMrbQrdLGd -yKoobKbo3Zh+ynrgVllZulTsXE3rV0pIqUf42UVUo0JyjEHoS0HmsiHRGR/lmRz/1hjqnxjvpRWf -wtOhusaz0LRGf7FEfbDVmqHXlJeW0pbXq5bec3fX0nTnzmuJuWvhoFFhm0FtrziBsjaAaDCYWC+u -Si6jQS3FsSfLJiTirCOkuCG1KiG+wSC+GBvgyhTszQ64Z77KAAAARXRSTlMAIQRDLyUgCwsE6ebm -5ubg2dLR0byXl4FDQzU1NDEuLSUgC+vr6urq6ubb29vb2tra2tG8vLu7u7uXl5eXgYGBgYGBLiUA -LabIAAABsElEQVQoz12S9VPjQBxHt8VaOA6HE+AOzv1wd7pJk5I2adpCC7RUcHd3d3fXf5PvLkxh -eD++z+yb7GSRlwD/+Hj/APQCZWxM5M+goF+RMbHK594v+tPoiN1uHxkt+xzt9+R9wnRTZZQpXQ0T -5uP1IQxToyOAZiQu5HEpjeA4SWIoksRxNiGC1tRZJ4LNxgHgnU5nJZBDvuDdl8lzQRBsQ+s9PZt7 -s7Pz8wsL39/DkIfZ4xlB2Gqsq62ta9oxVlVrNZpihFRpGO9fzQw1ms0NDWZz07iGkJmIFH8xxkc3 -a/WWlubmFkv9AB2SEpDvKxbjidN2faseaNV3zoHXvv7wMODJdkOHAegweAfFPx4G67KluxzottCU -9n8CUqXzcIQdXOytAHqXxomvykhEKN9EFutG22p//0rbNvHVxiJywa8yS2KDfV1dfbu31H8jF1RH -iTKtWYeHxUvq3bn0pyjCRaiRU6aDO+gb3aEfEeVNsDgm8zzLy9egPa7Qt8TSJdwhjplk06HH43ZN -J3s91KKCHQ5x4sw1fRGYDZ0n1L4FKb9/BP5JLYxToheoFCVxz57PPS8UhhEpLBVeAAAAAElFTkSu -QmCC - -------=_NextPart_000_222_000-- - -------=_NextPart_000_000_000 -Content-Type: message/rfc822; - name="second.eml" -Content-Transfer-Encoding: 7bit -Content-Disposition: attachment; - filename="second.eml" - -From: from@there.com -To: to@here.com -Subject: SECOND -Date: Sat, 28 Apr 2018 13:37:30 -0400 -MIME-Version: 1.0 -Content-Type: multipart/alternative; - boundary="----=_NextPart_000_333_000" - -This is a multi-part message in MIME format. - -------=_NextPart_000_333_000 -Content-Type: text/plain; - charset="UTF-8" -Content-Transfer-Encoding: quoted-printable - -T whom it may concern: -------=_NextPart_000_333_000 -Content-Type: text/html; - charset="UTF-8" -Content-Transfer-Encoding: quoted-printable - - - -
T whom it may concern:
- - -------=_NextPart_000_333_000-- - -------=_NextPart_000_000_000-- - diff --git a/plugins/vendor/webklex/php-imap/tests/messages/null_content_charset.eml b/plugins/vendor/webklex/php-imap/tests/messages/null_content_charset.eml deleted file mode 100644 index 0f19eb44..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/null_content_charset.eml +++ /dev/null @@ -1,8 +0,0 @@ -Subject: test -MIME-Version: 1.0 -Content-Type: text/plain -Date: Wed, 27 Sep 2017 12:48:51 +0200 -From: from@there.com -To: to@here.com - -Hi! \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/messages/pec.eml b/plugins/vendor/webklex/php-imap/tests/messages/pec.eml deleted file mode 100644 index 15dfacca..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/pec.eml +++ /dev/null @@ -1,65 +0,0 @@ -To: test@example.com -From: test@example.com -Subject: Certified -Date: Mon, 2 Oct 2017 12:13:43 +0200 -Content-Type: multipart/signed; protocol="application/x-pkcs7-signature"; micalg="sha1"; boundary="----258A05BDE519DE69AAE8D59024C32F5E" - -This is an S/MIME signed message - -------258A05BDE519DE69AAE8D59024C32F5E -Content-Type: multipart/mixed; boundary="----------=_1506939223-24530-42" -Content-Transfer-Encoding: binary - -------------=_1506939223-24530-42 -Content-Type: multipart/alternative; - boundary="----------=_1506939223-24530-43" -Content-Transfer-Encoding: binary - -------------=_1506939223-24530-43 -Content-Type: text/plain; charset="iso-8859-1" -Content-Disposition: inline -Content-Transfer-Encoding: quoted-printable - -Signed - -------------=_1506939223-24530-43 -Content-Type: text/html; charset="iso-8859-1" -Content-Disposition: inline -Content-Transfer-Encoding: quoted-printable - -Signed - -------------=_1506939223-24530-43-- - -------------=_1506939223-24530-42 -Content-Type: application/xml; name="data.xml" -Content-Disposition: inline; filename="data.xml" -Content-Transfer-Encoding: base64 - -PHhtbC8+ - -------------=_1506939223-24530-42 -Content-Type: message/rfc822; name="postacert.eml" -Content-Disposition: inline; filename="postacert.eml" -Content-Transfer-Encoding: 7bit - -To: test@example.com -From: test@example.com -Subject: test-subject -Date: Mon, 2 Oct 2017 12:13:50 +0200 -Content-Type: text/plain; charset=iso-8859-15; format=flowed -Content-Transfer-Encoding: 7bit - -test-content - -------------=_1506939223-24530-42-- - -------258A05BDE519DE69AAE8D59024C32F5E -Content-Type: application/x-pkcs7-signature; name="smime.p7s" -Content-Transfer-Encoding: base64 -Content-Disposition: attachment; filename="smime.p7s" - -MQ== - -------258A05BDE519DE69AAE8D59024C32F5E-- - diff --git a/plugins/vendor/webklex/php-imap/tests/messages/plain.eml b/plugins/vendor/webklex/php-imap/tests/messages/plain.eml deleted file mode 100644 index 4d3d22b1..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/plain.eml +++ /dev/null @@ -1,9 +0,0 @@ -From: from@someone.com -To: to@someone-else.com -Subject: Example -Date: Mon, 21 Jan 2023 19:36:45 +0200 -Content-Type: text/plain; - charset=\"us-ascii\" -Content-Transfer-Encoding: quoted-printable - -Hi there! \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/messages/plain_only.eml b/plugins/vendor/webklex/php-imap/tests/messages/plain_only.eml deleted file mode 100644 index bbf9f3b3..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/plain_only.eml +++ /dev/null @@ -1,9 +0,0 @@ -From: from@there.com -To: to@here.com -Subject: Nuu -Date: Wed, 13 Sep 2017 13:05:45 +0200 -Content-Type: text/plain; - charset="us-ascii" -Content-Transfer-Encoding: quoted-printable - -Hi \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/messages/plain_text_attachment.eml b/plugins/vendor/webklex/php-imap/tests/messages/plain_text_attachment.eml deleted file mode 100644 index 6ec6a6c5..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/plain_text_attachment.eml +++ /dev/null @@ -1,21 +0,0 @@ -To: to@here.com -From: from@there.com -Subject: Plain text attachment -Date: Tue, 21 Aug 2018 09:05:14 +0200 -MIME-Version: 1.0 -Content-Type: multipart/mixed; - boundary="------------B832AF745285AEEC6D5AEE42" - -This is a multi-part message in MIME format. ---------------B832AF745285AEEC6D5AEE42 -Content-Type: text/plain; charset=iso-8859-15; format=flowed -Content-Transfer-Encoding: 7bit - -Test ---------------B832AF745285AEEC6D5AEE42 -Content-Transfer-Encoding: base64 -Content-Disposition: attachment; - filename="a.txt" - -SGkh ---------------B832AF745285AEEC6D5AEE42-- diff --git a/plugins/vendor/webklex/php-imap/tests/messages/references.eml b/plugins/vendor/webklex/php-imap/tests/messages/references.eml deleted file mode 100644 index 478383cf..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/references.eml +++ /dev/null @@ -1,11 +0,0 @@ -Message-ID: <123@example.com> -From: no_host -Cc: "This one: is \"right\"" , No-address -In-Reply-To: -References: <231d9ac57aec7d8c1a0eacfeab8af6f3@example.com> <08F04024-A5B3-4FDE-BF2C-6710DE97D8D9@example.com> -Content-Type: text/plain; - charset="us-ascii" -Content-Transfer-Encoding: quoted-printable - -Hi -How are you? diff --git a/plugins/vendor/webklex/php-imap/tests/messages/simple_multipart.eml b/plugins/vendor/webklex/php-imap/tests/messages/simple_multipart.eml deleted file mode 100644 index 60a6521c..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/simple_multipart.eml +++ /dev/null @@ -1,23 +0,0 @@ -From: from@there.com -To: to@here.com -Date: Wed, 27 Sep 2017 12:48:51 +0200 -Subject: test -Content-Type: multipart/alternative; - boundary="----=_NextPart_000_0081_01D32C91.033E7020" - -This is a multipart message in MIME format. - -------=_NextPart_000_0081_01D32C91.033E7020 -Content-Type: text/plain; - charset="us-ascii" -Content-Transfer-Encoding: 7bit - -MyPlain -------=_NextPart_000_0081_01D32C91.033E7020 -Content-Type: text/html; - charset="us-ascii" -Content-Transfer-Encoding: quoted-printable - -MyHtml -------=_NextPart_000_0081_01D32C91.033E7020-- - diff --git a/plugins/vendor/webklex/php-imap/tests/messages/structured_with_attachment.eml b/plugins/vendor/webklex/php-imap/tests/messages/structured_with_attachment.eml deleted file mode 100644 index f795ec3a..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/structured_with_attachment.eml +++ /dev/null @@ -1,24 +0,0 @@ -From: from@there.com -To: to@here.com -Subject: Test -Date: Fri, 29 Sep 2017 10:55:23 +0200 -MIME-Version: 1.0 -Content-Type: multipart/mixed; - boundary="------------5B1F217006A67C28E756A62E" - -This is a multi-part message in MIME format. ---------------5B1F217006A67C28E756A62E -Content-Type: text/plain; charset=iso-8859-15; format=flowed -Content-Transfer-Encoding: 7bit - -Test - ---------------5B1F217006A67C28E756A62E -Content-Type: text/plain; charset=UTF-8; - name="MyFile.txt" -Content-Transfer-Encoding: base64 -Content-Disposition: attachment; - filename="MyFile.txt" - -TXlGaWxlQ29udGVudA== ---------------5B1F217006A67C28E756A62E-- diff --git a/plugins/vendor/webklex/php-imap/tests/messages/thread_my_topic.eml b/plugins/vendor/webklex/php-imap/tests/messages/thread_my_topic.eml deleted file mode 100644 index 9a196351..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/thread_my_topic.eml +++ /dev/null @@ -1,10 +0,0 @@ -Message-ID: <123@example.com> -From: from@there.com -To: to@here.com -Subject: Nuu -Date: Wed, 13 Sep 2017 13:05:45 +0200 -Content-Type: text/plain; - charset="us-ascii" -Content-Transfer-Encoding: quoted-printable - -Hi diff --git a/plugins/vendor/webklex/php-imap/tests/messages/thread_re_my_topic.eml b/plugins/vendor/webklex/php-imap/tests/messages/thread_re_my_topic.eml deleted file mode 100644 index db4fdf41..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/thread_re_my_topic.eml +++ /dev/null @@ -1,11 +0,0 @@ -Message-ID: <456@example.com> -In-Reply-To: <123@example.com> -From: from@there.com -To: to@here.com -Subject: Re: Nuu -Date: Wed, 13 Sep 2017 13:05:45 +0200 -Content-Type: text/plain; - charset="us-ascii" -Content-Transfer-Encoding: quoted-printable - -Hi diff --git a/plugins/vendor/webklex/php-imap/tests/messages/thread_unrelated.eml b/plugins/vendor/webklex/php-imap/tests/messages/thread_unrelated.eml deleted file mode 100644 index e47faa81..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/thread_unrelated.eml +++ /dev/null @@ -1,10 +0,0 @@ -Message-ID: <999@example.com> -From: from@there.com -To: to@here.com -Subject: Wut -Date: Wed, 13 Sep 2017 13:05:45 +0200 -Content-Type: text/plain; - charset="us-ascii" -Content-Transfer-Encoding: quoted-printable - -Hi diff --git a/plugins/vendor/webklex/php-imap/tests/messages/undefined_charset_header.eml b/plugins/vendor/webklex/php-imap/tests/messages/undefined_charset_header.eml deleted file mode 100644 index 117a33e4..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/undefined_charset_header.eml +++ /dev/null @@ -1,20 +0,0 @@ -X-Real-To: -X-Stored-In: BlaBla -Return-Path: -Received: from - by bla.bla (CommuniGate Pro RULE 6.1.13) - with RULE id 14057804; Mon, 27 Feb 2017 13:21:44 +0930 -X-Autogenerated: Mirror -Resent-From: -Resent-Date: Mon, 27 Feb 2017 13:21:44 +0930 -Message-Id: <201702270351.BGF77614@bla.bla> -From: =?X-IAS-German?B?bXlHb3Y=?= -To: sales@bla.bla -Subject: =?X-IAS-German?B?U3VibWl0IHlvdXIgdGF4IHJlZnVuZCB8IEF1c3RyYWxpYW4gVGF4YXRpb24gT2ZmaWNlLg==?= -Date: 27 Feb 2017 04:51:29 +0100 -MIME-Version: 1.0 -Content-Type: text/html; - charset="iso-8859-1" -Content-Transfer-Encoding: quoted-printable - -) \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/messages/undisclosed_recipients.eml b/plugins/vendor/webklex/php-imap/tests/messages/undisclosed_recipients.eml deleted file mode 100644 index 5d33ecff..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/undisclosed_recipients.eml +++ /dev/null @@ -1,8 +0,0 @@ -Subject: test -MIME-Version: 1.0 -Content-Type: text/plain -Date: Wed, 27 Sep 2017 12:48:51 +0200 -From: from@there.com -To: "Undisclosed Recipients" <> - -Hi! diff --git a/plugins/vendor/webklex/php-imap/tests/messages/undisclosed_recipients_minus.eml b/plugins/vendor/webklex/php-imap/tests/messages/undisclosed_recipients_minus.eml deleted file mode 100644 index 73f7b83f..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/undisclosed_recipients_minus.eml +++ /dev/null @@ -1,8 +0,0 @@ -Subject: test -MIME-Version: 1.0 -Content-Type: text/plain -Date: Wed, 27 Sep 2017 12:48:51 +0200 -From: from@there.com -To: undisclosed-recipients:; - -Hi! diff --git a/plugins/vendor/webklex/php-imap/tests/messages/undisclosed_recipients_space.eml b/plugins/vendor/webklex/php-imap/tests/messages/undisclosed_recipients_space.eml deleted file mode 100644 index 6c06cbd4..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/undisclosed_recipients_space.eml +++ /dev/null @@ -1,8 +0,0 @@ -Subject: test -MIME-Version: 1.0 -Content-Type: text/plain -Date: Wed, 27 Sep 2017 12:48:51 +0200 -From: from@there.com -To: Undisclosed recipients:; - -Hi! diff --git a/plugins/vendor/webklex/php-imap/tests/messages/unknown_encoding.eml b/plugins/vendor/webklex/php-imap/tests/messages/unknown_encoding.eml deleted file mode 100644 index 271bc4e2..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/unknown_encoding.eml +++ /dev/null @@ -1,24 +0,0 @@ -From: from@there.com -To: to@here.com -Date: Wed, 27 Sep 2017 12:48:51 +0200 -Subject: test -Content-Type: multipart/alternative; - boundary="----=_NextPart_000_0081_01D32C91.033E7020" - -This is a multipart message in MIME format. - -------=_NextPart_000_0081_01D32C91.033E7020 -Content-Type: text/plain; - charset= -Content-Transfer-Encoding: foobar - -MyPlain - -------=_NextPart_000_0081_01D32C91.033E7020 -Content-Type: text/html; - charset="" -Content-Transfer-Encoding: quoted-printable - -MyHtml -------=_NextPart_000_0081_01D32C91.033E7020-- - diff --git a/plugins/vendor/webklex/php-imap/tests/messages/without_charset_plain_only.eml b/plugins/vendor/webklex/php-imap/tests/messages/without_charset_plain_only.eml deleted file mode 100644 index bd4fe5de..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/without_charset_plain_only.eml +++ /dev/null @@ -1,8 +0,0 @@ -From: from@there.com -To: to@here.com -Subject: Nuu -Date: Wed, 13 Sep 2017 13:05:45 +0200 -Content-Type: text/plain; charset= -Content-Transfer-Encoding: quoted-printable - -Hi \ No newline at end of file diff --git a/plugins/vendor/webklex/php-imap/tests/messages/without_charset_simple_multipart.eml b/plugins/vendor/webklex/php-imap/tests/messages/without_charset_simple_multipart.eml deleted file mode 100644 index d1a092d2..00000000 --- a/plugins/vendor/webklex/php-imap/tests/messages/without_charset_simple_multipart.eml +++ /dev/null @@ -1,23 +0,0 @@ -From: from@there.com -To: to@here.com -Date: Wed, 27 Sep 2017 12:48:51 +0200 -Subject: test -Content-Type: multipart/alternative; - boundary="----=_NextPart_000_0081_01D32C91.033E7020" - -This is a multipart message in MIME format. - -------=_NextPart_000_0081_01D32C91.033E7020 -Content-Type: text/plain; - charset= -Content-Transfer-Encoding: 7bit - -MyPlain -------=_NextPart_000_0081_01D32C91.033E7020 -Content-Type: text/html; - charset="" -Content-Transfer-Encoding: quoted-printable - -MyHtml -------=_NextPart_000_0081_01D32C91.033E7020-- - diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/ErrorBag.php b/plugins/vendor/zbateson/mail-mime-parser/src/ErrorBag.php index dc338f61..030a98e1 100644 --- a/plugins/vendor/zbateson/mail-mime-parser/src/ErrorBag.php +++ b/plugins/vendor/zbateson/mail-mime-parser/src/ErrorBag.php @@ -79,6 +79,14 @@ abstract class ErrorBag implements IErrorBag return $this; } + /** + * Copies the source bag's own errors into this one without re-logging them. + */ + protected function copyErrorsFrom(ErrorBag $source) : void + { + $this->errors = \array_merge($this->errors, $source->getErrors(false, LogLevel::DEBUG)); + } + public function getErrors(bool $validate = false, string $minPsrLevel = LogLevel::ERROR) : array { if ($validate && !$this->validated) { diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Header/Part/MimeToken.php b/plugins/vendor/zbateson/mail-mime-parser/src/Header/Part/MimeToken.php index 1d4a8ae3..8e1002ad 100644 --- a/plugins/vendor/zbateson/mail-mime-parser/src/Header/Part/MimeToken.php +++ b/plugins/vendor/zbateson/mail-mime-parser/src/Header/Part/MimeToken.php @@ -43,7 +43,8 @@ class MimeToken extends Token public function __construct(LoggerInterface $logger, MbWrapper $charsetConverter, string $value) { parent::__construct($logger, $charsetConverter, $value); - $this->value = $this->decodeMime(\preg_replace('/\r|\n/', '', $this->value)); + $decoded = $this->decodeMime(\preg_replace('/\r|\n/', '', $this->value)); + $this->value = \preg_replace('/[\r\n]+/', '', $decoded) ?? ''; $pattern = self::MIME_PART_PATTERN; $this->canIgnoreSpacesBefore = (bool) \preg_match("/^\s*{$pattern}|\s+/", $this->rawValue); $this->canIgnoreSpacesAfter = (bool) \preg_match("/{$pattern}\s*|\s+\$/", $this->rawValue); diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Header/Part/ParameterPart.php b/plugins/vendor/zbateson/mail-mime-parser/src/Header/Part/ParameterPart.php index 96e61892..ed5b4b8c 100644 --- a/plugins/vendor/zbateson/mail-mime-parser/src/Header/Part/ParameterPart.php +++ b/plugins/vendor/zbateson/mail-mime-parser/src/Header/Part/ParameterPart.php @@ -64,10 +64,10 @@ class ParameterPart extends NameValuePart protected function decodePartValue(string $value, ?string $charset = null) : string { - if ($charset !== null) { - return $this->convertEncoding(\rawurldecode($value), $charset, true); - } - return $this->convertEncoding(\rawurldecode($value)); + $decoded = ($charset !== null) + ? $this->convertEncoding(\rawurldecode($value), $charset, true) + : $this->convertEncoding(\rawurldecode($value)); + return \preg_replace('/[\r\n]+/', '', $decoded) ?? $decoded; } protected function getValueFromParts(array $parts) : string diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Message/Helper/MultipartHelper.php b/plugins/vendor/zbateson/mail-mime-parser/src/Message/Helper/MultipartHelper.php index e9fe10aa..2a2c5d9d 100644 --- a/plugins/vendor/zbateson/mail-mime-parser/src/Message/Helper/MultipartHelper.php +++ b/plugins/vendor/zbateson/mail-mime-parser/src/Message/Helper/MultipartHelper.php @@ -48,7 +48,7 @@ class MultipartHelper extends AbstractHelper public function getUniqueBoundary(string $mimeType) : string { $type = \ltrim(\strtoupper(\preg_replace('/^(multipart\/(.{3}).*|.*)$/i', '$2-', $mimeType)), '-'); - return \uniqid('----=MMP-' . $type . '-', true); + return '----=MMP-' . $type . '-' . \bin2hex(\random_bytes(16)); } /** @@ -311,7 +311,8 @@ class MultipartHelper extends AbstractHelper $filename = 'file' . \uniqid(); } - $safe = \iconv('UTF-8', 'US-ASCII//translit//ignore', $filename); + $converted = \iconv('UTF-8', 'US-ASCII//translit//ignore', $filename); + $safe = \preg_replace('/[\x00-\x1F\x7F]+/', ' ', ($converted !== false) ? $converted : '') ?? ''; if ($message->isMime()) { $part = $this->mimePartFactory->newInstance(); $part->setRawHeader(HeaderConsts::CONTENT_TRANSFER_ENCODING, $encoding); diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Message/PartChildrenContainer.php b/plugins/vendor/zbateson/mail-mime-parser/src/Message/PartChildrenContainer.php index 139f940b..30a038ab 100644 --- a/plugins/vendor/zbateson/mail-mime-parser/src/Message/PartChildrenContainer.php +++ b/plugins/vendor/zbateson/mail-mime-parser/src/Message/PartChildrenContainer.php @@ -100,13 +100,16 @@ class PartChildrenContainer implements ArrayAccess, RecursiveIterator */ public function add(IMessagePart $part, $position = null) : static { - $index = $position ?? \count($this->children); - \array_splice( - $this->children, - $index, - 0, - [$part] - ); + if ($position === null || $position >= \count($this->children)) { + $this->children[] = $part; + } else { + \array_splice( + $this->children, + $position, + 0, + [$part] + ); + } return $this; } diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Message/PartHeaderContainer.php b/plugins/vendor/zbateson/mail-mime-parser/src/Message/PartHeaderContainer.php index 7db9bb5b..92feee44 100644 --- a/plugins/vendor/zbateson/mail-mime-parser/src/Message/PartHeaderContainer.php +++ b/plugins/vendor/zbateson/mail-mime-parser/src/Message/PartHeaderContainer.php @@ -77,6 +77,7 @@ class PartHeaderContainer extends ErrorBag implements IteratorAggregate $this->headerObjects = $cloneSource->headerObjects; $this->headerMap = $cloneSource->headerMap; $this->nextIndex = $cloneSource->nextIndex; + $this->copyErrorsFrom($cloneSource); } } diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Parser/HeaderParserService.php b/plugins/vendor/zbateson/mail-mime-parser/src/Parser/HeaderParserService.php index 666dd02e..fb6f9a4c 100644 --- a/plugins/vendor/zbateson/mail-mime-parser/src/Parser/HeaderParserService.php +++ b/plugins/vendor/zbateson/mail-mime-parser/src/Parser/HeaderParserService.php @@ -17,6 +17,16 @@ use ZBateson\MailMimeParser\Message\PartHeaderContainer; */ class HeaderParserService { + private int $maxHeaderCount; + + private int $maxHeaderSizeBytes; + + public function __construct(int $maxHeaderCount = 1000, int $maxHeaderSizeBytes = 1048576) + { + $this->maxHeaderCount = $maxHeaderCount; + $this->maxHeaderSizeBytes = $maxHeaderSizeBytes; + } + /** * Ensures the header isn't empty and contains a colon separator character, * then splits it and adds it to the passed PartHeaderContainer. @@ -51,16 +61,28 @@ class HeaderParserService public function parse($handle, PartHeaderContainer $container) : static { $header = ''; + $count = 0; + $start = \ftell($handle); do { $offset = \ftell($handle); $line = MessageParserService::readLine($handle); if ($line === false || $line === '' || $line[0] !== "\t" && $line[0] !== ' ') { + if ($header !== '') { + ++$count; + } $this->addRawHeaderToPart($offset, $header, $container); $header = ''; } else { $line = "\r\n" . $line; } $header .= \rtrim($line, "\r\n"); + if ($count >= $this->maxHeaderCount || \ftell($handle) - $start >= $this->maxHeaderSizeBytes) { + $container->addError( + 'Header count or total size limit reached while parsing headers', + LogLevel::ERROR + ); + break; + } } while ($header !== ''); return $this; } diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Parser/MimeParserService.php b/plugins/vendor/zbateson/mail-mime-parser/src/Parser/MimeParserService.php index e3f0a48b..403d98d2 100644 --- a/plugins/vendor/zbateson/mail-mime-parser/src/Parser/MimeParserService.php +++ b/plugins/vendor/zbateson/mail-mime-parser/src/Parser/MimeParserService.php @@ -7,6 +7,7 @@ namespace ZBateson\MailMimeParser\Parser; +use Psr\Log\LogLevel; use ZBateson\MailMimeParser\Message\Factory\PartHeaderContainerFactory; use ZBateson\MailMimeParser\Message\PartHeaderContainer; use ZBateson\MailMimeParser\Parser\Proxy\ParserMessageProxyFactory; @@ -32,16 +33,23 @@ class MimeParserService extends AbstractParserService */ protected HeaderParserService $headerParser; + /** + * @var int Maximum multipart nesting depth. + */ + protected int $maxMimePartDepth; + public function __construct( ParserMessageProxyFactory $parserMessageProxyFactory, ParserMimePartProxyFactory $parserMimePartProxyFactory, PartBuilderFactory $partBuilderFactory, PartHeaderContainerFactory $partHeaderContainerFactory, - HeaderParserService $headerParser + HeaderParserService $headerParser, + int $maxMimePartDepth = 256 ) { parent::__construct($parserMessageProxyFactory, $parserMimePartProxyFactory, $partBuilderFactory); $this->partHeaderContainerFactory = $partHeaderContainerFactory; $this->headerParser = $headerParser; + $this->maxMimePartDepth = $maxMimePartDepth; } /** @@ -160,8 +168,29 @@ class MimeParserService extends AbstractParserService if ($proxy->isParentBoundaryFound()) { return null; } + if ($this->exceedsMaxDepth($proxy)) { + $proxy->addError( + 'Maximum MIME part nesting depth of ' . $this->maxMimePartDepth . ' reached', + LogLevel::ERROR + ); + return null; + } $headerContainer = $this->partHeaderContainerFactory->newInstance(); $child = $this->partBuilderFactory->newChildPartBuilder($headerContainer, $proxy); return $this->createPart($proxy, $headerContainer, $child); } + + /** + * Returns true if adding a child to $proxy would exceed $maxMimePartDepth. + */ + private function exceedsMaxDepth(ParserMimePartProxy $proxy) : bool + { + $depth = 1; + for ($p = $proxy->getParent(); $p !== null; $p = $p->getParent()) { + if (++$depth >= $this->maxMimePartDepth) { + return true; + } + } + return false; + } } diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/di_config.php b/plugins/vendor/zbateson/mail-mime-parser/src/di_config.php index 030ddf59..65bf6165 100644 --- a/plugins/vendor/zbateson/mail-mime-parser/src/di_config.php +++ b/plugins/vendor/zbateson/mail-mime-parser/src/di_config.php @@ -14,6 +14,8 @@ use ZBateson\MailMimeParser\Header\Consumer\Received\GenericReceivedConsumerServ use ZBateson\MailMimeParser\Header\Consumer\ReceivedConsumerService; use ZBateson\MailMimeParser\Message\Factory\PartStreamContainerFactory; use ZBateson\MailMimeParser\Message\PartStreamContainer; +use ZBateson\MailMimeParser\Parser\HeaderParserService; +use ZBateson\MailMimeParser\Parser\MimeParserService; use ZBateson\MailMimeParser\Parser\Part\ParserPartStreamContainerFactory; use ZBateson\MailMimeParser\Stream\StreamFactory; @@ -24,6 +26,13 @@ return [ // header parts 'throwExceptionReadingPartContentFromUnsupportedCharsets' => false, + // Maximum multipart nesting depth before parsing stops with a recorded error. + 'maxMimePartDepth' => 256, + + // Maximum header count and total header bytes before parsing stops. + 'maxHeaderCount' => 1000, + 'maxHeaderSizeBytes' => 1048576, + 'fromDomainConsumerService' => (new AutowireDefinitionHelper(DomainConsumerService::class)) ->constructorParameter('partName', 'from'), 'byDomainConsumerService' => (new AutowireDefinitionHelper(DomainConsumerService::class)) @@ -61,4 +70,13 @@ return [ ->constructor( throwExceptionReadingPartContentFromUnsupportedCharsets: new Reference('throwExceptionReadingPartContentFromUnsupportedCharsets') ), + HeaderParserService::class => (new AutowireDefinitionHelper()) + ->constructor( + maxHeaderCount: new Reference('maxHeaderCount'), + maxHeaderSizeBytes: new Reference('maxHeaderSizeBytes') + ), + MimeParserService::class => (new AutowireDefinitionHelper()) + ->constructor( + maxMimePartDepth: new Reference('maxMimePartDepth') + ), ]; diff --git a/plugins/vendor/zbateson/mail-mime-parser/version.txt b/plugins/vendor/zbateson/mail-mime-parser/version.txt index b0f2dcb3..818bd47a 100644 --- a/plugins/vendor/zbateson/mail-mime-parser/version.txt +++ b/plugins/vendor/zbateson/mail-mime-parser/version.txt @@ -1 +1 @@ -3.0.4 +3.0.6