#!/usr/bin/env php ; stubs/SPL.phpstubdicdi/G"stubs/CoreGenericIterators.phpstubjcjbd"stubs/CoreGenericFunctions.phpstubc ̤ stubs/CoreGenericClasses.phpstub7c7stubs/phpparser.phpstubcBstubs/extensions/ffi.phpstub c Ohstubs/extensions/dom.phpstub]c]Ln%rstubs/extensions/gmp.phpstubcrU stubs/extensions/decimal.phpstub@c@f.stubs/extensions/apcu.phpstubcͤstubs/extensions/soap.phpstub{+c{+lNstubs/extensions/mysqli.phpstub'c'":8stubs/extensions/geos.phpstubcSstubs/extensions/ds.phpstub4cc4cNQ٤stubs/extensions/pdo.phpstubc+/ stubs/extensions/mongodb.phpstubcG@stubs/extensions/random.phpstubG cG Yf'stubs/extensions/redis.phpstub Pc Pdܤstubs/extensions/xdebug.phpstubcȤ"stubs/extensions/simplexml.phpstub=c=zѩstubs/Php81.phpstub c stubs/Php82.phpstubqcqTstubs/Reflection.phpstubx8cx8"stubs/CoreImmutableClasses.phpstubclȤstubs/Php80.phpstubc:vendor/netresearch/jsonmapper/src/JsonMapper/Exception.php0c00vendor/netresearch/jsonmapper/src/JsonMapper.phplclރ %vendor/netresearch/jsonmapper/LICENSER(cR((}vendor/autoload.phpc!ۻΤ-vendor/spatie/array-to-xml/src/ArrayToXml.phpc ʙ+vendor/dnoegel/php-xdg-base-dir/src/Xdg.php c yE,E'vendor/dnoegel/php-xdg-base-dir/LICENSE!c!W&Mvendor/composer/package-versions-deprecated/src/PackageVersions/Installer.php9$c9$ӘmLvendor/composer/package-versions-deprecated/src/PackageVersions/Versions.phpM"cM")❝Tvendor/composer/package-versions-deprecated/src/PackageVersions/FallbackVersions.phpcm3vendor/composer/package-versions-deprecated/LICENSE!c!vendor/composer/ClassLoader.php/@c/@!mj%vendor/composer/autoload_classmap.php"c"!vendor/composer/installed.php[Sc[S Ti*vendor/composer/pcre/src/ReplaceResult.phpc-T*vendor/composer/pcre/src/PcreException.php c X3 9vendor/composer/pcre/src/UnexpectedNullMatchException.phpczC4vendor/composer/pcre/src/MatchStrictGroupsResult.phpc&!6vendor/composer/pcre/src/MatchAllWithOffsetsResult.phpc_k(vendor/composer/pcre/src/MatchResult.phpc_7vendor/composer/pcre/src/MatchAllStrictGroupsResult.phpc+T-"vendor/composer/pcre/src/Regex.phpcma!vendor/composer/pcre/src/Preg.phpDcDd+vendor/composer/pcre/src/MatchAllResult.phpc3vendor/composer/pcre/src/MatchWithOffsetsResult.phpcvendor/composer/pcre/LICENSEchg^#vendor/composer/autoload_static.php@c@w7"vendor/composer/autoload_files.phpckP!vendor/composer/autoload_real.phpc(+-vendor/composer/xdebug-handler/src/Status.phpc?.vendor/composer/xdebug-handler/src/Process.phpR cR ~450vendor/composer/xdebug-handler/src/PhpConfig.phpcI4vendor/composer/xdebug-handler/src/XdebugHandler.phpVNcVN$Ť&vendor/composer/xdebug-handler/LICENSE)c)#;^vendor/composer/LICENSE.c. !vendor/composer/autoload_psr4.phpM cM J(vendor/composer/semver/src/Intervals.phpNcN]<%vendor/composer/semver/src/Semver.php\ c\ o,,vendor/composer/semver/src/VersionParser.phpeTceT+=vendor/composer/semver/src/Constraint/MatchNoneConstraint.phpcg!<vendor/composer/semver/src/Constraint/MatchAllConstraint.phpcy4vendor/composer/semver/src/Constraint/Constraint.php0c0,[Z9vendor/composer/semver/src/Constraint/MultiConstraint.phpD#cD#ȿͤ/vendor/composer/semver/src/Constraint/Bound.phpI cI ~=vendor/composer/semver/src/Constraint/ConstraintInterface.phpcܒu)vendor/composer/semver/src/Comparator.phpj cj b#6/vendor/composer/semver/src/CompilingMatcher.php5 c5 %.'vendor/composer/semver/src/Interval.phpc#qvendor/composer/semver/LICENSEcBh%vendor/composer/InstalledVersions.php;c;7"vendor/composer/platform_check.phpcqK\'vendor/composer/autoload_namespaces.phpc/t5vendor/nikic/php-parser/lib/PhpParser/NodeVisitor.phpcb..vendor/nikic/php-parser/lib/PhpParser/Node.phpc/@vendor/nikic/php-parser/lib/PhpParser/PrettyPrinter/Standard.php+c+e6vendor/nikic/php-parser/lib/PhpParser/ErrorHandler.php>c>`)5vendor/nikic/php-parser/lib/PhpParser/NameContext.php+&c+&{Lvendor/nikic/php-parser/lib/PhpParser/Internal/PrintableNewAnonClassNode.phpQcQW>vendor/nikic/php-parser/lib/PhpParser/Internal/TokenStream.php $c $";vendor/nikic/php-parser/lib/PhpParser/Internal/DiffElem.phpFcF]ʤ9vendor/nikic/php-parser/lib/PhpParser/Internal/Differ.php<c<\5k4vendor/nikic/php-parser/lib/PhpParser/NodeFinder.php c .h=vendor/nikic/php-parser/lib/PhpParser/NodeVisitorAbstract.phpc6vendor/nikic/php-parser/lib/PhpParser/NodeAbstract.phpici ɤFvendor/nikic/php-parser/lib/PhpParser/ConstExprEvaluationException.phpncn,7vendor/nikic/php-parser/lib/PhpParser/ParserFactory.phpc?47/vendor/nikic/php-parser/lib/PhpParser/Lexer.phpZcZ}9vendor/nikic/php-parser/lib/PhpParser/Lexer/Emulative.phpN$cN$[vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyFunctionTokenEmulator.phpcf|KWvendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FlexibleDocStringEmulator.php c VMvendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReverseEmulator.phpcK2qePvendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/MatchTokenEmulator.phpc[ Svendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyTokenEmulator.phpjcjSSvendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ExplicitOctalEmulator.phpcx]vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NumericLiteralSeparatorEmulator.phptct*OMvendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/KeywordEmulator.phpc'#ʤMvendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FnTokenEmulator.phpc3ڤSvendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NullsafeTokenEmulator.phpcޕOvendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/EnumTokenEmulator.phpcOvendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/AttributeEmulator.phpc? Wvendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/CoaleseEqualTokenEmulator.php)c)"Kvendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/TokenEmulator.phpcC4vendor/nikic/php-parser/lib/PhpParser/NodeDumper.phpcL8vendor/nikic/php-parser/lib/PhpParser/BuilderFactory.php+c+̐r8vendor/nikic/php-parser/lib/PhpParser/Builder/Class_.phpc\8vendor/nikic/php-parser/lib/PhpParser/Builder/Trait_.php!c!ε)6vendor/nikic/php-parser/lib/PhpParser/Builder/Use_.php*c*$L:vendor/nikic/php-parser/lib/PhpParser/Builder/EnumCase.phpct<vendor/nikic/php-parser/lib/PhpParser/Builder/Interface_.php" c" ;[7:vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUse.phpc]M7vendor/nikic/php-parser/lib/PhpParser/Builder/Param.php c K;vendor/nikic/php-parser/lib/PhpParser/Builder/Function_.phpc3"8vendor/nikic/php-parser/lib/PhpParser/Builder/Method.phpcȤ:vendor/nikic/php-parser/lib/PhpParser/Builder/Property.phpc y7vendor/nikic/php-parser/lib/PhpParser/Builder/Enum_.php c  >vendor/nikic/php-parser/lib/PhpParser/Builder/FunctionLike.phpc7f<vendor/nikic/php-parser/lib/PhpParser/Builder/Namespace_.phpc>tDvendor/nikic/php-parser/lib/PhpParser/Builder/TraitUseAdaptation.phpcMa=vendor/nikic/php-parser/lib/PhpParser/Builder/Declaration.php c <vendor/nikic/php-parser/lib/PhpParser/Builder/ClassConst.php c {<8vendor/nikic/php-parser/lib/PhpParser/BuilderHelpers.php%c%~8vendor/nikic/php-parser/lib/PhpParser/ParserAbstract.phpΚcΚ"??vendor/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.phpc^1vendor/nikic/php-parser/lib/PhpParser/Comment.phpcNv5vendor/nikic/php-parser/lib/PhpParser/Comment/Doc.phpc 0Avendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Collecting.phpc|A?vendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Throwing.phpc]<vendor/nikic/php-parser/lib/PhpParser/ConstExprEvaluator.php%c%3r0vendor/nikic/php-parser/lib/PhpParser/Parser.phpcS5vendor/nikic/php-parser/lib/PhpParser/JsonDecoder.php/ c/ 0E7vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.phpl'cl'r@vendor/nikic/php-parser/lib/PhpParser/NodeTraverserInterface.phpciM3vendor/nikic/php-parser/lib/PhpParser/Node/Name.php>c>*5vendor/nikic/php-parser/lib/PhpParser/Node/Scalar.phpzcz&D>?vendor/nikic/php-parser/lib/PhpParser/Node/IntersectionType.phpc.8vendor/nikic/php-parser/lib/PhpParser/Node/Attribute.phpucu ~:vendor/nikic/php-parser/lib/PhpParser/Node/ComplexType.phpqcq Bvendor/nikic/php-parser/lib/PhpParser/Node/VariadicPlaceholder.phpcD>vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Encapsed.phpcE|=vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/String_.phpcHvendor/nikic/php-parser/lib/PhpParser/Node/Scalar/EncapsedStringPart.phpc*&=vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.phpcg=vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php c fR@vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst.phpcoEvendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Line.phpncnNeSDvendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Dir.phpkck7Gvendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Class_.phprcr7Gvendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Trait_.phprcrJvendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Function_.php{c{Gvendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Method.phptct剝Evendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/File.phpncn YeKvendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Namespace_.php~c~t2vendor/nikic/php-parser/lib/PhpParser/Node/Arg.php]c]x{4vendor/nikic/php-parser/lib/PhpParser/Node/Param.phpc(،Ĥ7vendor/nikic/php-parser/lib/PhpParser/Node/MatchArm.phpc4k=vendor/nikic/php-parser/lib/PhpParser/Node/AttributeGroup.phpcp) ;vendor/nikic/php-parser/lib/PhpParser/Node/FunctionLike.phpc@e5vendor/nikic/php-parser/lib/PhpParser/Node/Const_.phpcvi@vendor/nikic/php-parser/lib/PhpParser/Node/VarLikeIdentifier.phpcYWJ;vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Ternary.php c pIP:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Yield_.phpzcz\Q>vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BooleanNot.phpcN;vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Closure.php c E,P=vendor/nikic/php-parser/lib/PhpParser/Node/Expr/YieldFrom.phpcP&Ivendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafePropertyFetch.phpc>9vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Eval_.phpcWV?vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Instanceof_.phpci>vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryMinus.phpc2Pڌ9vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Exit_.php#c#$mAvendor/nikic/php-parser/lib/PhpParser/Node/Expr/ErrorSuppress.phpc͠Avendor/nikic/php-parser/lib/PhpParser/Node/Expr/PropertyFetch.phpccS:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Array_.phpVcVZEvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotEqual.phpkckE豽Fvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Identical.phpncnhLGvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseAnd.phpncn|Gvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseXor.phpncn4DNAvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Plus.phpbcbu"2\Dvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Greater.phphchkq@vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mod.php`c`;~Bvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Minus.phpdcdNsGvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanAnd.phpoco"Ivendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotIdentical.phptctVbFvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanOr.phpmcmGCvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Concat.phpfcfYNGvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalAnd.phppcp!Fvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Spaceship.phpncnڦFvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftLeft.phpmcm-d^xGvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalXor.phppcpt@vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Div.php`c`ƙ%@vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Pow.phpacaBvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Equal.phpece{ӤGvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftRight.phpoco_WQKvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/GreaterOrEqual.phpwcw|Kvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/SmallerOrEqual.phpwcwBF;Evendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Coalesce.phpkck>@vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mul.php`c`bFvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseOr.phplclj~`Dvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Smaller.phphchFvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalOr.phpmcmЩGvendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticPropertyFetch.phpbcb6s:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Print_.phpca/<vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Include_.phpc*":vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Clone_.phpcyʎ<vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Variable.phpc?(-<vendor/nikic/php-parser/lib/PhpParser/Node/Expr/FuncCall.php`c`|ǭ}=vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignRef.phpfcf>E<vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp.phpc8vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast.php_c_RPLB>vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BitwiseNot.phpc 2Avendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrowFunction.php c <{>vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ConstFetch.phpc;vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostDec.phpcl8vendor/nikic/php-parser/lib/PhpParser/Node/Expr/New_.phpcw<>vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClosureUse.phpc9*Avendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayDimFetch.phpkcki:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Throw_.phpcKT:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreDec.phpceFvendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafeMethodCall.phpc'Ky:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Isset_.phpc(yۤ:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Empty_.phpc<&9vendor/nikic/php-parser/lib/PhpParser/Node/Expr/List_.phpcxޠ+Cvendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClassConstFetch.php0c0 &r>vendor/nikic/php-parser/lib/PhpParser/Node/Expr/MethodCall.phpc!2Τ:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Assign.php5c5D:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Match_.phpc8=vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayItem.phpcOYaV:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreInc.phpcs:=vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryPlus.phpcr|=vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ShellExec.phpcU; OGvendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseAnd.phpcbGvendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseXor.phpcŤAvendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Plus.phpc k@vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mod.phpc Bvendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Minus.phpcٹCvendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Concat.phpc~:bFvendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftLeft.phpce4K@vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Div.phpc<~Y@vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Pow.phpc[Gvendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftRight.phpcA Evendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Coalesce.phpc @vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mul.phpc D|Fvendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseOr.phpcfN9vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Error.php c ,팤?vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Array_.phpc l.?>vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Bool_.phpcV?vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Double.phpc/|@vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/String_.phpcg Sؤ?vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Unset_.phpcrz=vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Int_.phpcww@vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Object_.phpcj='<vendor/nikic/php-parser/lib/PhpParser/Node/Expr/CallLike.phpbcb ,ؤ;vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostInc.phpc猤>vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticCall.phpcSx[<vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp.phpcB <vendor/nikic/php-parser/lib/PhpParser/Node/Name/Relative.phpc_s Bvendor/nikic/php-parser/lib/PhpParser/Node/Name/FullyQualified.phpcYMl9vendor/nikic/php-parser/lib/PhpParser/Node/Identifier.php c Bd8vendor/nikic/php-parser/lib/PhpParser/Node/UnionType.phpcB3vendor/nikic/php-parser/lib/PhpParser/Node/Stmt.phpctS3vendor/nikic/php-parser/lib/PhpParser/Node/Expr.phpch,;vendor/nikic/php-parser/lib/PhpParser/Node/NullableType.phpc)ۤ7vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Do_.php`c`i'=vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Continue_.phpcDՕ<vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Declare_.phpc@E9vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Else_.phpc5 :vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Catch_.phpcЈ4:vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.phpc89vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Echo_.phpc5n"Qvendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Precedence.phpxcx\2Lvendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Alias.php_c__rJl:vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Trait_.php!c!H'8vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Use_.phpc_<vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/EnumCase.phpcb>vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Interface_.phpc5k<vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUse.phpc =vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.phpY cY 1;vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Static_.phpc2N9vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Label.phpc=vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.php c ]<vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Property.php c #9vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Enum_.php[c[D):vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Const_.phpc^;vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Switch_.phpScS=ͤBvendor/nikic/php-parser/lib/PhpParser/Node/Stmt/DeclareDeclare.phpck0%9vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Goto_.php=c= x>vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Expression.phpc*n:vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Throw_.phpcZ:vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/While_.phpccc31>vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Namespace_.phpc(Oq:vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Break_.phpcޏ7vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/If_.phpXcXX<@vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/HaltCompiler.php%c%rѼ8vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/For_.php\c\1B=vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/StaticVar.phpcH;vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Global_.phpcFvendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation.php8c8B;vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ElseIf_.phpgcg!4;vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Return_.phpc.B7vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Nop.php^c^<vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Foreach_.phpc$G5<vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TryCatch.phpBcBXki9vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Case_.phpc,7:vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Unset_.phpc򯾤:vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/UseUse.phpc/2<vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Finally_.phpc>vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/InlineHTML.phpc~Ap<vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/GroupUse.php7c79eD ?vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassMethod.php*c*7Dvendor/nikic/php-parser/lib/PhpParser/Node/Stmt/PropertyProperty.phpc3>vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassConst.phpct1-5vendor/nikic/php-parser/lib/PhpParser/Parser/Php7.phpOcO_/7vendor/nikic/php-parser/lib/PhpParser/Parser/Tokens.php5c5ﯤ5vendor/nikic/php-parser/lib/PhpParser/Parser/Php5.phpL,cL,Ѕ 9vendor/nikic/php-parser/lib/PhpParser/Parser/Multiple.phpcOä/vendor/nikic/php-parser/lib/PhpParser/Error.phpc|h1vendor/nikic/php-parser/lib/PhpParser/Builder.phpcrMvendor/nikic/php-parser/lib/PhpParser/NodeVisitor/ParentConnectingVisitor.phpc<ƤDvendor/nikic/php-parser/lib/PhpParser/NodeVisitor/CloningVisitor.php?c?ݤKvendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NodeConnectingVisitor.phpc,.Ivendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FirstFindingVisitor.php8c8vDvendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FindingVisitor.phpcٗDBvendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NameResolver.php&c&H&vendor/nikic/php-parser/grammar/php7.yc /vendor/nikic/php-parser/grammar/parser.template c -ɚQ&vendor/nikic/php-parser/grammar/php5.ycP%PG/vendor/nikic/php-parser/grammar/tokens.template*c*_֤,vendor/nikic/php-parser/grammar/phpyLang.phpcݤ2vendor/nikic/php-parser/grammar/rebuildParsers.phpcƾ(vendor/nikic/php-parser/grammar/tokens.y c C~jvendor/nikic/php-parser/LICENSEc*%vendor/nikic/php-parser/bin/php-parsezczԩd5vendor/phpdocumentor/type-resolver/src/PseudoType.phpc8vendor/phpdocumentor/type-resolver/src/FqsenResolver.php c O:vendor/phpdocumentor/type-resolver/src/Types/Callable_.phpcr-,7vendor/phpdocumentor/type-resolver/src/Types/Scalar.phpc,?vendor/phpdocumentor/type-resolver/src/Types/ContextFactory.php 7c 7$F@vendor/phpdocumentor/type-resolver/src/Types/InterfaceString.phpc-47vendor/phpdocumentor/type-resolver/src/Types/Array_.phpcQ;vendor/phpdocumentor/type-resolver/src/Types/Collection.phpc ^=vendor/phpdocumentor/type-resolver/src/Types/AbstractList.phpcn8vendor/phpdocumentor/type-resolver/src/Types/Static_.php#c#%3Ѥ6vendor/phpdocumentor/type-resolver/src/Types/Void_.php%c%DqCl:vendor/phpdocumentor/type-resolver/src/Types/Resource_.phpc~8vendor/phpdocumentor/type-resolver/src/Types/Parent_.phpcF26vendor/phpdocumentor/type-resolver/src/Types/Self_.phpcNpY?vendor/phpdocumentor/type-resolver/src/Types/AggregatedType.php c mx9vendor/phpdocumentor/type-resolver/src/Types/Compound.php%c%<=vendor/phpdocumentor/type-resolver/src/Types/Intersection.php4c4) 9vendor/phpdocumentor/type-resolver/src/Types/ArrayKey.phpc}‡;vendor/phpdocumentor/type-resolver/src/Types/Expression.phpFcFؔ8vendor/phpdocumentor/type-resolver/src/Types/String_.phpcȤ8vendor/phpdocumentor/type-resolver/src/Types/Context.php c <vendor/phpdocumentor/type-resolver/src/Types/ClassString.phpkck6vendor/phpdocumentor/type-resolver/src/Types/Null_.phpcT_9vendor/phpdocumentor/type-resolver/src/Types/Nullable.phpucu8vendor/phpdocumentor/type-resolver/src/Types/Boolean.phpcbeФ7vendor/phpdocumentor/type-resolver/src/Types/Mixed_.phpc8S5vendor/phpdocumentor/type-resolver/src/Types/This.phpwcww7vendor/phpdocumentor/type-resolver/src/Types/Never_.phpct:7vendor/phpdocumentor/type-resolver/src/Types/Float_.phpc5Oۤ8vendor/phpdocumentor/type-resolver/src/Types/Integer.phpcԿQY8vendor/phpdocumentor/type-resolver/src/Types/Object_.phpcZ.:vendor/phpdocumentor/type-resolver/src/Types/Iterable_.phpNcN ;f 7vendor/phpdocumentor/type-resolver/src/TypeResolver.php[c[•Ť?vendor/phpdocumentor/type-resolver/src/PseudoTypes/Numeric_.php`c`~E<vendor/phpdocumentor/type-resolver/src/PseudoTypes/True_.phpcmW$Dvendor/phpdocumentor/type-resolver/src/PseudoTypes/LiteralString.phpco]Fvendor/phpdocumentor/type-resolver/src/PseudoTypes/LowercaseString.phpc=vendor/phpdocumentor/type-resolver/src/PseudoTypes/False_.phpc^yNvendor/phpdocumentor/type-resolver/src/PseudoTypes/NonEmptyLowercaseString.phpcHvendor/phpdocumentor/type-resolver/src/PseudoTypes/HtmlEscapedString.phpcgTDvendor/phpdocumentor/type-resolver/src/PseudoTypes/NumericString.phpc1+ڤCvendor/phpdocumentor/type-resolver/src/PseudoTypes/IntegerRange.phpAcA+<<vendor/phpdocumentor/type-resolver/src/PseudoTypes/List_.phpcCܤFvendor/phpdocumentor/type-resolver/src/PseudoTypes/PositiveInteger.phpcyäFvendor/phpdocumentor/type-resolver/src/PseudoTypes/NegativeInteger.phpcstBvendor/phpdocumentor/type-resolver/src/PseudoTypes/TraitString.phpc&Evendor/phpdocumentor/type-resolver/src/PseudoTypes/NonEmptyString.phpcEvendor/phpdocumentor/type-resolver/src/PseudoTypes/CallableString.phpcR/vendor/phpdocumentor/type-resolver/src/Type.phpcDZ̤@vendor/phpdocumentor/type-resolver/composer-require-checker.jsonoco,:G*vendor/phpdocumentor/type-resolver/LICENSE8c8ʤ-vendor/phpdocumentor/type-resolver/rector.phpcn@vendor/phpdocumentor/reflection-docblock/src/DocBlockFactory.php0%c0%4m6vendor/phpdocumentor/reflection-docblock/src/Utils.php c g/OSIvendor/phpdocumentor/reflection-docblock/src/DocBlockFactoryInterface.phpcUCHvendor/phpdocumentor/reflection-docblock/src/Exception/PcreException.phpcTIsLvendor/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.phpc#QFDvendor/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.phpIcI{Lvendor/phpdocumentor/reflection-docblock/src/DocBlock/StandardTagFactory.phpE2cE2sSDvendor/phpdocumentor/reflection-docblock/src/DocBlock/TagFactory.phpc*Evendor/phpdocumentor/reflection-docblock/src/DocBlock/Description.phpcyL=vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tag.phpcϭϾGvendor/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.phpJcJCvendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php:c:gFvendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/BaseTag.phpcIvendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Deprecated.php6 c6 sLvendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Url.phpc(&Rvendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Reference.phpcڤNvendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Fqsen.phpJcJLqCvendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Link.phpcDvendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.phpxcxݳ2Kvendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.phpQcQEEvendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php" c" TjLvendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.phpOcOꑋ Bvendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/See.php c SfFvendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Version.php c Wvendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/AlignFormatter.phpc2u]vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/PassthroughFormatter.phpc.Gvendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.phpCcC6Evendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Covers.php c -Hvendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter.php<c<5 Dvendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Since.php c BEvendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Throws.phpycy7Cvendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Uses.php c Jvendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/TagWithType.phpcI^+Fvendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Example.php c GkIvendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/InvalidTag.phpJcJ7Svendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/StaticMethod.php-c- äEvendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Author.php c ,#Fvendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.phpxcx)?Fvendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Generic.php c ]Evendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Source.php c e.3ܤ9vendor/phpdocumentor/reflection-docblock/src/DocBlock.phpcǀ 0vendor/phpdocumentor/reflection-docblock/LICENSE8c8ʤ6vendor/phpdocumentor/reflection-common/src/Project.phpcŤ7vendor/phpdocumentor/reflection-common/src/Location.phpc4=vendor/phpdocumentor/reflection-common/src/ProjectFactory.phpncn٦j3vendor/phpdocumentor/reflection-common/src/File.phpcKo4vendor/phpdocumentor/reflection-common/src/Fqsen.phpcgA4=6vendor/phpdocumentor/reflection-common/src/Element.phpcݳ.vendor/phpdocumentor/reflection-common/LICENSE9c9*2Ȑ)vendor/amphp/amp/lib/TimeoutException.phpcXݝ-vendor/amphp/amp/lib/MultiReasonException.phpc1vendor/amphp/amp/lib/Internal/ResolutionQueue.php c @0vendor/amphp/amp/lib/Internal/PrivatePromise.php1c11vendor/amphp/amp/lib/Internal/PrivateIterator.phpcp5+vendor/amphp/amp/lib/Internal/functions.php c }*vendor/amphp/amp/lib/Internal/Producer.php,c,+QS\-vendor/amphp/amp/lib/Internal/Placeholder.php+c+#fk@1vendor/amphp/amp/lib/TimeoutCancellationToken.php3c3j_$$vendor/amphp/amp/lib/LazyPromise.phpcX- vendor/amphp/amp/lib/Emitter.phpc[!vendor/amphp/amp/lib/Iterator.php\c\vendor/amphp/amp/lib/Loop.phpFcF<.vendor/amphp/amp/lib/NullCancellationToken.phpcӟDvendor/amphp/amp/lib/Struct.phpcQ#+vendor/amphp/amp/lib/CancelledException.phpkck"vendor/amphp/amp/lib/functions.php]c]¤"vendor/amphp/amp/lib/Coroutine.php)c) 72vendor/amphp/amp/lib/CombinedCancellationToken.phpc3o0vendor/amphp/amp/lib/CancellationTokenSource.php=c=h vendor/amphp/amp/lib/Failure.phpc9!vendor/amphp/amp/lib/Producer.phpcqV| vendor/amphp/amp/lib/Success.phpc5M&vendor/amphp/amp/lib/CallableMaker.php c *@S!vendor/amphp/amp/lib/Deferred.php)c):=+vendor/amphp/amp/lib/Loop/TracingDriver.phpici *vendor/amphp/amp/lib/Loop/NativeDriver.php8c871vendor/amphp/amp/lib/Loop/Internal/TimerQueue.phpJcJ&$vendor/amphp/amp/lib/Loop/Driver.phpCgcCgP̤&vendor/amphp/amp/lib/Loop/EvDriver.php!c!.1vendor/amphp/amp/lib/Loop/InvalidWatcherError.php*c*t/j)vendor/amphp/amp/lib/Loop/EventDriver.phpL%cL%d-F+vendor/amphp/amp/lib/Loop/DriverFactory.phpcƓ'%vendor/amphp/amp/lib/Loop/Watcher.phpcY9a&vendor/amphp/amp/lib/Loop/UvDriver.php(c(Tg9vendor/amphp/amp/lib/Loop/UnsupportedFeatureException.php(c(e.*vendor/amphp/amp/lib/CancellationToken.phpcs*vendor/amphp/amp/lib/InvalidYieldError.phpcx_Ǥ vendor/amphp/amp/lib/Delayed.phpca vendor/amphp/amp/lib/Promise.phpcvendor/amphp/amp/LICENSEqcqrg4vendor/amphp/byte-stream/lib/ResourceInputStream.php<c<oȸ1vendor/amphp/byte-stream/lib/PendingReadError.phpc,Bvendor/amphp/byte-stream/lib/Base64/Base64DecodingOutputStream.phpcAvendor/amphp/byte-stream/lib/Base64/Base64DecodingInputStream.phpPcPatѤAvendor/amphp/byte-stream/lib/Base64/Base64EncodingInputStream.phpc\Bvendor/amphp/byte-stream/lib/Base64/Base64EncodingOutputStream.phpc!p0vendor/amphp/byte-stream/lib/StreamException.phpfcf)(vendor/amphp/byte-stream/lib/Payload.php c !u)1vendor/amphp/byte-stream/lib/ZlibOutputStream.phpg cg j,vendor/amphp/byte-stream/lib/InputStream.phpOcOqc+vendor/amphp/byte-stream/lib/LineReader.php c ~*vendor/amphp/byte-stream/lib/functions.phpc D1vendor/amphp/byte-stream/lib/InputStreamChain.phpc[-vendor/amphp/byte-stream/lib/OutputStream.phpJcJP5vendor/amphp/byte-stream/lib/ResourceOutputStream.php0*c0*ز0vendor/amphp/byte-stream/lib/ClosedException.phpqcqkHb/vendor/amphp/byte-stream/lib/InMemoryStream.phpcDQp/vendor/amphp/byte-stream/lib/IteratorStream.phpc=h(vendor/amphp/byte-stream/lib/Message.phppcp#0vendor/amphp/byte-stream/lib/ZlibInputStream.php c -vendor/amphp/byte-stream/lib/OutputBuffer.phpc-W vendor/amphp/byte-stream/LICENSE6c6\>W-vendor/symfony/polyfill-mbstring/Mbstring.phppcpFN].vendor/symfony/polyfill-mbstring/bootstrap.php c (vendor/symfony/polyfill-mbstring/LICENSE)c)\@vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.phpUcU@vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.phpW[cW[:{)Fvendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.phpc30vendor/symfony/polyfill-mbstring/bootstrap80.phpP%cP%lՄ`1vendor/symfony/deprecation-contracts/function.php4c4a d,vendor/symfony/deprecation-contracts/LICENSE)c)2+vendor/symfony/polyfill-php80/bootstrap.phpc1T%vendor/symfony/polyfill-php80/LICENSE$c$LO! ;vendor/symfony/polyfill-php80/Resources/stubs/Attribute.phpcMK<<vendor/symfony/polyfill-php80/Resources/stubs/Stringable.phpct]\ڤEvendor/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.phpjcj0<vendor/symfony/polyfill-php80/Resources/stubs/ValueError.phpacaL:vendor/symfony/polyfill-php80/Resources/stubs/PhpToken.phpwcw=7T8'vendor/symfony/polyfill-php80/Php80.php c cH*vendor/symfony/polyfill-php80/PhpToken.phpc]f(vendor/symfony/console/ConsoleEvents.phpc] *vendor/symfony/console/Input/ArgvInput.php0c0& G./vendor/symfony/console/Input/InputInterface.phpc .vendor/symfony/console/Input/InputArgument.php c MD4vendor/symfony/console/Input/InputAwareInterface.phpPcPM=0vendor/symfony/console/Input/InputDefinition.php`.c`.TOa&vendor/symfony/console/Input/Input.phpHcH7+vendor/symfony/console/Input/ArrayInput.phpc>km,vendor/symfony/console/Input/InputOption.php5c5̪w9vendor/symfony/console/Input/StreamableInputInterface.php~c~ʾ,vendor/symfony/console/Input/StringInput.php c ^0vendor/symfony/console/Command/LockableTrait.php;c;b8vendor/symfony/console/Command/DumpCompletionCommand.phpzczOX2vendor/symfony/console/Command/CompleteCommand.php/!c/!C.vendor/symfony/console/Command/HelpCommand.phpB cB Ql>Τ=vendor/symfony/console/Command/SignalableCommandInterface.phpcS*vendor/symfony/console/Command/Command.phpPcPͤ.vendor/symfony/console/Command/LazyCommand.phpccc:iK.vendor/symfony/console/Command/ListCommand.php9 c9 EƤ#vendor/symfony/console/Terminal.php~c~,OO<3vendor/symfony/console/Event/ConsoleSignalEvent.phpc Z!2vendor/symfony/console/Event/ConsoleErrorEvent.php1c1s(6vendor/symfony/console/Event/ConsoleTerminateEvent.phpzczNSm-vendor/symfony/console/Event/ConsoleEvent.phpcߤ4vendor/symfony/console/Event/ConsoleCommandEvent.phpcۤ,vendor/symfony/console/Style/OutputStyle.php` c` nb-vendor/symfony/console/Style/SymfonyStyle.php&:c&:J/vendor/symfony/console/Style/StyleInterface.phpS cS m&vendor/symfony/console/Application.phpcθZ.vendor/symfony/console/Attribute/AsCommand.phpRcRe\8vendor/symfony/console/SignalRegistry/SignalRegistry.phpHcH,3vendor/symfony/console/Exception/LogicException.phpc{P?vendor/symfony/console/Exception/NamespaceNotFoundException.phpcH7vendor/symfony/console/Exception/ExceptionInterface.phpcNL*45vendor/symfony/console/Exception/RuntimeException.phpcFb=vendor/symfony/console/Exception/CommandNotFoundException.phpck_hi;vendor/symfony/console/Exception/InvalidOptionException.phpc'mR:vendor/symfony/console/Exception/MissingInputException.phpcvw&Ť=vendor/symfony/console/Exception/InvalidArgumentException.phpcw&I?vendor/symfony/console/CommandLoader/CommandLoaderInterface.phpc}=vendor/symfony/console/CommandLoader/FactoryCommandLoader.phpmcm$Dl-?vendor/symfony/console/CommandLoader/ContainerCommandLoader.php"c"M>vendor/symfony/console/Formatter/OutputFormatterStyleStack.php5 c5 x9vendor/symfony/console/Formatter/OutputFormatterStyle.phpk ck =vendor/symfony/console/Formatter/OutputFormatterInterface.phpHcH38vendor/symfony/console/Formatter/NullOutputFormatter.phpscswںD4vendor/symfony/console/Formatter/OutputFormatter.phpcGBFvendor/symfony/console/Formatter/WrappableOutputFormatterInterface.phpcW)=vendor/symfony/console/Formatter/NullOutputFormatterStyle.phpct5Bvendor/symfony/console/Formatter/OutputFormatterStyleInterface.phpkck0vendor/symfony/console/Completion/Suggestion.phpcbx;vendor/symfony/console/Completion/CompletionSuggestions.phpvcvRW5vendor/symfony/console/Completion/CompletionInput.phpo co n֤Fvendor/symfony/console/Completion/Output/CompletionOutputInterface.phpc}$=uAvendor/symfony/console/Completion/Output/BashCompletionOutput.php!c!Z" vendor/symfony/console/Color.phpbcbDvendor/symfony/console/DependencyInjection/AddConsoleCommandPass.phpcDҤ2vendor/symfony/console/CI/GithubActionReporter.php c '6vendor/symfony/console/EventListener/ErrorListener.phpy cy 6/vendor/symfony/console/Logger/ConsoleLogger.phpc~vendor/symfony/console/LICENSE)c)ax2vendor/symfony/console/Question/ChoiceQuestion.phpc8%8vendor/symfony/console/Question/ConfirmationQuestion.php-c-Qy,vendor/symfony/console/Question/Question.phpcRƤ4vendor/symfony/console/Resources/bin/hiddeninput.exe$c$v0vendor/symfony/console/Resources/completion.bash c z((vendor/symfony/console/Helper/Helper.phpctŻ0vendor/symfony/console/Helper/QuestionHelper.phpMcMD+vendor/symfony/console/Helper/TableCell.phpc=3vendor/symfony/console/Helper/ProgressIndicator.phpc>!1vendor/symfony/console/Helper/FormatterHelper.php c /,vendor/symfony/console/Helper/TableStyle.php0c072vendor/symfony/console/Helper/DescriptorHelper.php c "mΤ7vendor/symfony/console/Helper/SymfonyQuestionHelper.phpc cc ı0vendor/symfony/console/Helper/TableCellStyle.phplclbh(+vendor/symfony/console/Helper/HelperSet.phpO cO A%0vendor/symfony/console/Helper/TableSeparator.php)c)>"6vendor/symfony/console/Helper/DebugFormatterHelper.php` c` Uvͤ1vendor/symfony/console/Helper/HelperInterface.phpacau/vendor/symfony/console/Helper/ProcessHelper.phpcS)դ'vendor/symfony/console/Helper/Table.phprcr-vendor/symfony/console/Helper/ProgressBar.php6Hc6Hy2vendor/symfony/console/Helper/InputAwareHelper.php-c-f(vendor/symfony/console/Helper/Dumper.phpjcjX+vendor/symfony/console/Helper/TableRows.phpZcZaФ5vendor/symfony/console/Output/TrimmedBufferOutput.phpzcz/vendor/symfony/console/Output/ConsoleOutput.php/c/Gk1vendor/symfony/console/Output/OutputInterface.php| c| lݤ0vendor/symfony/console/Output/BufferedOutput.phpgcg;OT.vendor/symfony/console/Output/StreamOutput.php c yr(vendor/symfony/console/Output/Output.phprcrv&lM6vendor/symfony/console/Output/ConsoleSectionOutput.phpckrդ8vendor/symfony/console/Output/ConsoleOutputInterface.php5c5c_,vendor/symfony/console/Output/NullOutput.phpD cD FN3vendor/symfony/console/SingleCommandApplication.phpGcG3vendor/symfony/console/Tester/ApplicationTester.php c h3 -vendor/symfony/console/Tester/TesterTrait.phpce9vendor/symfony/console/Tester/CommandCompletionTester.php\c\2@vendor/symfony/console/Tester/Constraint/CommandIsSuccessful.phpc5y%/vendor/symfony/console/Tester/CommandTester.phpV cV %Fˤ!vendor/symfony/console/Cursor.phpGcG4vendor/symfony/console/Descriptor/JsonDescriptor.phpcU1<vendor/symfony/console/Descriptor/ApplicationDescription.php4c4ώ*3vendor/symfony/console/Descriptor/XmlDescriptor.phpE'cE';[n8vendor/symfony/console/Descriptor/MarkdownDescriptor.phpc(箤4vendor/symfony/console/Descriptor/TextDescriptor.php.2c.2sXD0vendor/symfony/console/Descriptor/Descriptor.php: c: o9vendor/symfony/console/Descriptor/DescriptorInterface.phpYcYsPU.vendor/symfony/string/Slugger/AsciiSlugger.phpAcA e2vendor/symfony/string/Slugger/SluggerInterface.phpc@aդ$vendor/symfony/string/LazyString.php|c|1 ^3vendor/symfony/string/Inflector/FrenchInflector.php@c@0%6vendor/symfony/string/Inflector/InflectorInterface.phpZcZR*4vendor/symfony/string/Inflector/EnglishInflector.php&=c&=1]6vendor/symfony/string/Exception/ExceptionInterface.phpgcgP4vendor/symfony/string/Exception/RuntimeException.phpc.m <vendor/symfony/string/Exception/InvalidArgumentException.phpc8"I)vendor/symfony/string/CodePointString.phpcŵ 'vendor/symfony/string/UnicodeString.php2c2?$vendor/symfony/string/ByteString.php<c<k/vendor/symfony/string/AbstractUnicodeString.phpiciInPvendor/symfony/string/LICENSE)c)=<vendor/symfony/string/Resources/data/wcswidth_table_wide.phpc W<vendor/symfony/string/Resources/data/wcswidth_table_zero.phpcɤ-vendor/symfony/string/Resources/functions.phptctu(vendor/symfony/string/AbstractString.php2Oc2O4ep+vendor/symfony/polyfill-ctype/bootstrap.php4c4Y6%vendor/symfony/polyfill-ctype/LICENSE)c)`e0'vendor/symfony/polyfill-ctype/Ctype.phpc"-vendor/symfony/polyfill-ctype/bootstrap80.phppcp֤8vendor/symfony/service-contracts/ServiceLocatorTrait.phpcħ;vendor/symfony/service-contracts/ServiceSubscriberTrait.phpc4@vendor/symfony/service-contracts/Attribute/SubscribedService.phpBcBCf7vendor/symfony/service-contracts/Attribute/Required.phpc$3vendor/symfony/service-contracts/ResetInterface.phpcME?vendor/symfony/service-contracts/ServiceSubscriberInterface.phpc0?Br=vendor/symfony/service-contracts/ServiceProviderInterface.phpcENF(vendor/symfony/service-contracts/LICENSE)c)5古"vendor/symfony/filesystem/Path.phpfcfJ¨:vendor/symfony/filesystem/Exception/ExceptionInterface.phpc{H9=vendor/symfony/filesystem/Exception/FileNotFoundException.phpcva8vendor/symfony/filesystem/Exception/RuntimeException.phpc_ 3vendor/symfony/filesystem/Exception/IOException.phpcG1)<vendor/symfony/filesystem/Exception/IOExceptionInterface.phpcQQH@vendor/symfony/filesystem/Exception/InvalidArgumentException.phpcɿ!vendor/symfony/filesystem/LICENSE)c)ax(vendor/symfony/filesystem/Filesystem.phprtcrtt2vendor/symfony/polyfill-intl-grapheme/Grapheme.php&c&t|K3vendor/symfony/polyfill-intl-grapheme/bootstrap.php c Mޤ-vendor/symfony/polyfill-intl-grapheme/LICENSE)c)\5vendor/symfony/polyfill-intl-grapheme/bootstrap80.phpI cI x5vendor/symfony/polyfill-intl-normalizer/bootstrap.php0c03PyŤ/vendor/symfony/polyfill-intl-normalizer/LICENSE)c)\6vendor/symfony/polyfill-intl-normalizer/Normalizer.phpO$cO$raFvendor/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.phpc8jXvendor/symfony/polyfill-intl-normalizer/Resources/unidata/compatibilityDecomposition.phpcbRvendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalComposition.php=c=Tvendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalDecomposition.phpcX3Lvendor/symfony/polyfill-intl-normalizer/Resources/unidata/combiningClass.php.c.Yv7vendor/symfony/polyfill-intl-normalizer/bootstrap80.php+c+!Τ+vendor/symfony/polyfill-php73/bootstrap.phpc$͓%vendor/symfony/polyfill-php73/LICENSE)c)`e0?vendor/symfony/polyfill-php73/Resources/stubs/JsonException.phphchФ'vendor/symfony/polyfill-php73/Php73.phpcbC&vendor/webmozart/assert/src/Assert.phpcGa%vendor/webmozart/assert/src/Mixin.php=c=(Ɩ8vendor/webmozart/assert/src/InvalidArgumentException.phpqcqxvendor/webmozart/assert/LICENSE<c<t}7vendor/psr/container/src/NotFoundExceptionInterface.phpc7 8vendor/psr/container/src/ContainerExceptionInterface.phpc8t/vendor/psr/container/src/ContainerInterface.php&c&Ćvendor/psr/container/LICENSEycyOpvendor/psr/log/LICENSE=c=pO*vendor/psr/log/Psr/Log/LoggerInterface.php9 c9 ZҤ/vendor/psr/log/Psr/Log/LoggerAwareInterface.php@c@ )vendor/psr/log/Psr/Log/AbstractLogger.php0 c0 G¤#vendor/psr/log/Psr/Log/LogLevel.phpPcPW\{&vendor/psr/log/Psr/Log/LoggerTrait.phpf cf -mg%vendor/psr/log/Psr/Log/NullLogger.phpcM;+vendor/psr/log/Psr/Log/LoggerAwareTrait.phpcD3vendor/psr/log/Psr/Log/InvalidArgumentException.phpwcw#"vendor/sebastian/diff/src/Line.php[c[H@vendor/sebastian/diff/src/LongestCommonSubsequenceCalculator.phpc=l >vendor/sebastian/diff/src/Exception/ConfigurationException.phpLcLM1vendor/sebastian/diff/src/Exception/Exception.phpycySHΣ@vendor/sebastian/diff/src/Exception/InvalidArgumentException.phpc]#vendor/sebastian/diff/src/Chunk.phpncnuOvendor/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.phpc. "vendor/sebastian/diff/src/Diff.phpycygq<$vendor/sebastian/diff/src/Differ.php:$c:$MnH$vendor/sebastian/diff/src/Parser.php c ?vendor/sebastian/diff/src/Output/AbstractChunkOutputBuilder.phpcx:vendor/sebastian/diff/src/Output/DiffOnlyOutputBuilder.phpcޤ=vendor/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php\c\LCvendor/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php(c(٬?vendor/sebastian/diff/src/Output/DiffOutputBuilderInterface.php#c#oM2ĤMvendor/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.phpcvendor/sebastian/diff/LICENSE c a1;vendor/felixfbecker/advanced-json-rpc/lib/ErrorResponse.phprcr6vendor/felixfbecker/advanced-json-rpc/lib/Response.phpc㉑7vendor/felixfbecker/advanced-json-rpc/lib/ErrorCode.php c Qɤ=vendor/felixfbecker/advanced-json-rpc/lib/SuccessResponse.phphchOzZ:vendor/felixfbecker/advanced-json-rpc/lib/Notification.phpcJd 8vendor/felixfbecker/advanced-json-rpc/lib/Dispatcher.phpcp5vendor/felixfbecker/advanced-json-rpc/lib/Message.phpccS3vendor/felixfbecker/advanced-json-rpc/lib/Error.phpcSo5vendor/felixfbecker/advanced-json-rpc/lib/Request.phpc^-vendor/felixfbecker/advanced-json-rpc/LICENSEc>9>vendor/felixfbecker/language-server-protocol/package-lock.jsonNcNj\Ivendor/felixfbecker/language-server-protocol/src/SignatureHelpOptions.phpc$t]vendor/felixfbecker/language-server-protocol/src/SemanticTokensClientCapabilitiesRequests.phpcmS:vendor/felixfbecker/language-server-protocol/src/Hover.phpc,^vendor/felixfbecker/language-server-protocol/src/DocumentRangeFormattingClientCapabilities.phpcUvendor/felixfbecker/language-server-protocol/src/TypeDefinitionClientCapabilities.phpc!.TOvendor/felixfbecker/language-server-protocol/src/InitializeResultServerInfo.phpcM=_vendor/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItem.phpcHyDvendor/felixfbecker/language-server-protocol/src/CodeDescription.phpcڨ^Gvendor/felixfbecker/language-server-protocol/src/DiagnosticSeverity.phpkckϤFvendor/felixfbecker/language-server-protocol/src/FormattingOptions.phpcuOvendor/felixfbecker/language-server-protocol/src/CompletionItemLabelDetails.php~c~v,=vendor/felixfbecker/language-server-protocol/src/Location.php)c)iMCvendor/felixfbecker/language-server-protocol/src/CompletionItem.phpcmLvendor/felixfbecker/language-server-protocol/src/TextDocumentSyncOptions.phpclMvendor/felixfbecker/language-server-protocol/src/RenameClientCapabilities.phpc`ϤEvendor/felixfbecker/language-server-protocol/src/InsertTextFormat.phpcvendor/felixfbecker/language-server-protocol/src/ErrorCode.phpici?vendor/felixfbecker/language-server-protocol/src/MarkupKind.php$c$pY@vendor/felixfbecker/language-server-protocol/src/TokenFormat.phpcdvendor/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilitiesResolveSupport.phpc~_vendor/felixfbecker/language-server-protocol/src/DocumentSymbolClientCapabilitiesTagSupport.phpKcK4Avendor/felixfbecker/language-server-protocol/src/MarkedString.phpc8@xȤ?vendor/felixfbecker/language-server-protocol/src/LogMessage.php6c61Evendor/felixfbecker/language-server-protocol/src/InitializeResult.phpc5ّBvendor/felixfbecker/language-server-protocol/src/WorkspaceEdit.php> c> nSFvendor/felixfbecker/language-server-protocol/src/PackageDescriptor.phpc(Uvendor/felixfbecker/language-server-protocol/src/ExecuteCommandClientCapabilities.phpycy?vendor/felixfbecker/language-server-protocol/src/Diagnostic.php c Uۤ`vendor/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilitiesTagSupport.phpc;8Yvendor/felixfbecker/language-server-protocol/src/LinkedEditingRangeClientCapabilities.phpLcLTvendor/felixfbecker/language-server-protocol/src/SignatureHelpClientCapabilities.phpck}0Pvendor/felixfbecker/language-server-protocol/src/ReferenceClientCapabilities.phpwcw?HHNvendor/felixfbecker/language-server-protocol/src/SymbolLocationInformation.phpzcz[Svendor/felixfbecker/language-server-protocol/src/ShowDocumentClientCapabilities.phpVcVx(Cvendor/felixfbecker/language-server-protocol/src/CodeActionKind.phpc OGvendor/felixfbecker/language-server-protocol/src/ClientCapabilities.phpcuۤTvendor/felixfbecker/language-server-protocol/src/VersionedTextDocumentIdentifier.phpce[Ivendor/felixfbecker/language-server-protocol/src/TextDocumentSyncKind.php>c>xYvendor/felixfbecker/language-server-protocol/src/RegularExpressionsClientCapabilities.php[c[ ^jvendor/felixfbecker/language-server-protocol/src/ShowMessageRequestClientCapabilitiesMessageActionItem.php c դGvendor/felixfbecker/language-server-protocol/src/CodeActionDisabled.phpcƀVvendor/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilities.phpc eFvendor/felixfbecker/language-server-protocol/src/CompletionContext.php$c$)Pvendor/felixfbecker/language-server-protocol/src/ClientCapabilitiesWorkspace.phpici Uvendor/felixfbecker/language-server-protocol/src/SelectionRangeClientCapabilities.phpJcJ0QSvendor/felixfbecker/language-server-protocol/src/TextDocumentClientCapabilities.php+c+!rUvendor/felixfbecker/language-server-protocol/src/SemanticTokensClientCapabilities.phpcՏ_vendor/felixfbecker/language-server-protocol/src/DocumentSymbolClientCapabilitiesSymbolKind.phpc}ФEvendor/felixfbecker/language-server-protocol/src/TextDocumentItem.phpc&tsEvendor/felixfbecker/language-server-protocol/src/ChangeAnnotation.phpc`?vendor/felixfbecker/language-server-protocol/src/ClientInfo.php c 1Xvendor/felixfbecker/language-server-protocol/src/CodeLensWorkspaceClientCapabilities.phpc=YͤRvendor/felixfbecker/language-server-protocol/src/PrepareSupportDefaultBehavior.php c |ec>vendor/felixfbecker/language-server-protocol/src/SymbolTag.php-c-Cjդ_vendor/felixfbecker/language-server-protocol/src/DocumentOnTypeFormattingClientCapabilities.phpcܱZ0ivendor/felixfbecker/language-server-protocol/src/CodeActionClientCapabilitiesCodeActionLiteralSupport.phpctkOmvendor/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItemResolveSupport.phpc_Cvendor/felixfbecker/language-server-protocol/src/InsertTextMode.phpc &Dvendor/felixfbecker/language-server-protocol/src/WorkspaceFolder.phpcr_vendor/felixfbecker/language-server-protocol/src/CodeActionClientCapabilitiesResolveSupport.phpc\hvendor/felixfbecker/language-server-protocol/src/SignatureHelpClientCapabilitiesSignatureInformation.phpc tFvendor/felixfbecker/language-server-protocol/src/CodeActionContext.php,c,շSvendor/felixfbecker/language-server-protocol/src/DocumentLinkClientCapabilities.phpcpQQvendor/felixfbecker/language-server-protocol/src/DiagnosticRelatedInformation.phpc֤Jvendor/felixfbecker/language-server-protocol/src/ResourceOperationKind.phpc8+<vendor/felixfbecker/language-server-protocol/src/Command.phpc6;oTvendor/felixfbecker/language-server-protocol/src/DocumentOnTypeFormattingOptions.phpc(פJvendor/felixfbecker/language-server-protocol/src/ExecuteCommandOptions.phpgcg<Mvendor/felixfbecker/language-server-protocol/src/ClientCapabilitiesWindow.phpEcEװnQvendor/felixfbecker/language-server-protocol/src/CodeActionClientCapabilities.php c Tm¤ivendor/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItemTagSupport.phpcknTvendor/felixfbecker/language-server-protocol/src/WorkspaceEditClientCapabilities.phpcXUvendor/felixfbecker/language-server-protocol/src/ImplementationClientCapabilities.phpcm:Uvendor/felixfbecker/language-server-protocol/src/DocumentSymbolClientCapabilities.phpc8}4Jvendor/felixfbecker/language-server-protocol/src/DocumentHighlightKind.phpcIvendor/felixfbecker/language-server-protocol/src/ParameterInformation.phpc"/cvendor/felixfbecker/language-server-protocol/src/PublishDiagnosticsClientCapabilitiesTagSupport.phpc_Fvendor/felixfbecker/language-server-protocol/src/CompletionOptions.phpc)%Bvendor/felixfbecker/language-server-protocol/src/MarkupContent.phpcϳP?vendor/felixfbecker/language-server-protocol/src/CodeAction.phpcm1fwvendor/felixfbecker/language-server-protocol/src/CodeActionClientCapabilitiesCodeActionLiteralSupportcodeActionKind.phpcSs+Rvendor/felixfbecker/language-server-protocol/src/DeclarationClientCapabilities.phpc(^vendor/felixfbecker/language-server-protocol/src/SemanticTokensWorkspaceClientCapabilities.phpc.e]vendor/felixfbecker/language-server-protocol/src/DidChangeConfigurationClientCapabilities.phpcF/Yvendor/felixfbecker/language-server-protocol/src/DocumentFormattingClientCapabilities.phpcl4a|vendor/felixfbecker/language-server-protocol/src/SignatureHelpClientCapabilitiesSignatureInformationParameterInformation.php!c!WؤOvendor/felixfbecker/language-server-protocol/src/CodeLensClientCapabilities.phpcP^\vendor/felixfbecker/language-server-protocol/src/DidChangeWatchedFilesClientCapabilities.phpcԽ:Nvendor/felixfbecker/language-server-protocol/src/MonikerClientCapabilities.phpAcAؔGvendor/felixfbecker/language-server-protocol/src/ContentChangeEvent.phpfcf4GIvendor/felixfbecker/language-server-protocol/src/SignatureInformation.phpcn==vendor/felixfbecker/language-server-protocol/src/TextEdit.phpzczy V>vendor/felixfbecker/language-server-protocol/src/FileEvent.phpcSvendor/felixfbecker/language-server-protocol/src/FoldingRangeClientCapabilities.phpcYդ=vendor/felixfbecker/language-server-protocol/src/LogTrace.phpc*g Jvendor/felixfbecker/language-server-protocol/src/CompletionTriggerKind.php6c6aU Dvendor/felixfbecker/language-server-protocol/src/CodeLensOptions.phpqcqSuQvendor/felixfbecker/language-server-protocol/src/CompletionClientCapabilities.phplcl|8.Ivendor/felixfbecker/language-server-protocol/src/ReferenceInformation.php`c`;H`vendor/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilitiesSymbolKind.phpcTƤFvendor/felixfbecker/language-server-protocol/src/CompletionItemTag.phpcۂGvendor/felixfbecker/language-server-protocol/src/ServerCapabilities.php c e@vendor/felixfbecker/language-server-protocol/src/MessageType.phpkck(I=vendor/felixfbecker/language-server-protocol/src/CodeLens.phpclJ>Cvendor/felixfbecker/language-server-protocol/src/CompletionList.phpcꊪCvendor/felixfbecker/language-server-protocol/src/FileChangeType.phpTcTL,WJvendor/felixfbecker/language-server-protocol/src/CodeActionTriggerKind.phpc}Ф9vendor/felixfbecker/language-server-protocol/package.jsonNcN2W>4vendor/felixfbecker/language-server-protocol/LICENSEc>94vendor/fidry/cpu-core-counter/src/CpuCoreCounter.phpwcw/vendor/fidry/cpu-core-counter/src/Diagnoser.phpc3vendor/fidry/cpu-core-counter/src/Exec/ProcOpen.phpcTY.=vendor/fidry/cpu-core-counter/src/NumberOfCpuCoreNotFound.php(c(:vendor/fidry/cpu-core-counter/src/Finder/CpuInfoFinder.phpc_\;vendor/fidry/cpu-core-counter/src/Finder/FinderRegistry.phpc6n=vendor/fidry/cpu-core-counter/src/Finder/HwPhysicalFinder.php~c~wä@vendor/fidry/cpu-core-counter/src/Finder/SkipOnWindowsFinder.php"c"E=vendor/fidry/cpu-core-counter/src/Finder/NProcessorFinder.phpcb@vendor/fidry/cpu-core-counter/src/Finder/ProcOpenBasedFinder.phpJcJ`:vendor/fidry/cpu-core-counter/src/Finder/CpuCoreFinder.phpcפ>vendor/fidry/cpu-core-counter/src/Finder/NullCpuCoreFinder.phpc>vendor/fidry/cpu-core-counter/src/Finder/_NProcessorFinder.phpc 2>vendor/fidry/cpu-core-counter/src/Finder/WmicLogicalFinder.phpcEΤ?vendor/fidry/cpu-core-counter/src/Finder/WmicPhysicalFinder.phpcOڤ?vendor/fidry/cpu-core-counter/src/Finder/DummyCpuCoreFinder.phpEcE<#8vendor/fidry/cpu-core-counter/src/Finder/NProcFinder.phpch@vendor/fidry/cpu-core-counter/src/Finder/OnlyOnWindowsFinder.php/c/#1<vendor/fidry/cpu-core-counter/src/Finder/HwLogicalFinder.phpzcz"٤.vendor/fidry/cpu-core-counter/bin/diagnose.phpxcx8t@-vendor/fidry/cpu-core-counter/bin/execute.phpwcw  config.xsd.c.src/Psalm/StatementsSource.phpclĤ$src/Psalm/Report/SonarqubeReport.phpcVˤ&src/Psalm/Report/JsonSummaryReport.phpcTۤ&src/Psalm/Report/CodeClimateReport.phpZ cZ +  src/Psalm/Report/CountReport.phpcEŤ"src/Psalm/Report/ConsoleReport.php'c' ρ&(src/Psalm/Report/GithubActionsReport.phpmcm$"src/Psalm/Report/ReportOptions.php\c\bxsrc/Psalm/Report/JsonReport.phpcmࢶ"src/Psalm/Report/CompactReport.php c j src/Psalm/Report/SarifReport.php% c% _ src/Psalm/Report/EmacsReport.phpcσɼsrc/Psalm/Report/TextReport.phpcL] .src/Psalm/Report/ByIssueLevelAndTypeReport.phpc;%src/Psalm/Report/CheckstyleReport.phpcysrc/Psalm/Report/XmlReport.phpcttB!src/Psalm/Report/PylintReport.php+c+%/a#src/Psalm/Report/PhpStormReport.phpv cv DK{ src/Psalm/Report/JunitReport.phpcҁ1!src/Psalm/Config/IssueHandler.phpc&src/Psalm/Config/ProjectFileFilter.php c &src/Psalm/Config/Creator.php c =src/Psalm/Config/FileFilter.phpHcH/z,src/Psalm/Config/TaintAnalysisFileFilter.phpzcz" )src/Psalm/Config/ErrorLevelFileFilter.phpcYǤsrc/Psalm/Progress/Progress.phpUcUV&src/Psalm/Progress/DefaultProgress.phpc mm#src/Psalm/Progress/LongProgress.php" c" q#src/Psalm/Progress/VoidProgress.phpc_$src/Psalm/Progress/DebugProgress.phpcrF E"src/Psalm/Issue/InvalidOperand.phpcgū&src/Psalm/Issue/TaintedUnserialize.phpc>ͤ,src/Psalm/Issue/UndefinedInterfaceMethod.phpchL(src/Psalm/Issue/MixedReturnStatement.phpc*src/Psalm/Issue/MixedArrayTypeCoercion.phpcљ&(src/Psalm/Issue/PossiblyNullArgument.phpc4>c&src/Psalm/Issue/InvalidArrayOffset.phpcPZ*src/Psalm/Issue/UndefinedDocblockClass.phpc(%src/Psalm/Issue/MissingReturnType.phpc׊3src/Psalm/Issue/MismatchingDocblockPropertyType.phpcg4&src/Psalm/Issue/DeprecatedProperty.phpch z(src/Psalm/Issue/PossiblyNullIterator.phpc(src/Psalm/Issue/PossiblyUnusedMethod.phpc:src/Psalm/Issue/RedundantFunctionCallGivenDocblockType.phpcR%src/Psalm/Issue/DuplicateConstant.phpc$\0src/Psalm/Issue/MismatchingDocblockParamType.phpc(src/Psalm/Issue/InvalidEnumCaseValue.phpcܤ0src/Psalm/Issue/TraitMethodSignatureMismatch.phpc7¤/src/Psalm/Issue/UnimplementedAbstractMethod.phpc -src/Psalm/Issue/PossiblyNullPropertyFetch.php:c:o!src/Psalm/Issue/FunctionIssue.phpcCN-src/Psalm/Issue/PossiblyInvalidMethodCall.phpc-u 1src/Psalm/Issue/MismatchingDocblockReturnType.phpcOy"src/Psalm/Issue/ImpureVariable.phpck !src/Psalm/Issue/InternalClass.phpcW-src/Psalm/Issue/MixedArgumentTypeCoercion.phpc4src/Psalm/Issue/NonInvariantDocblockPropertyType.phpc2 ¤!src/Psalm/Issue/ForbiddenCode.phpcy6!src/Psalm/Issue/TaintedCustom.phpciT"src/Psalm/Issue/TaintedInclude.phpc`!src/Psalm/Issue/TaintedCookie.phpc5R*src/Psalm/Issue/InvalidReturnStatement.phpcqaTsrc/Psalm/Issue/ParseError.phpc$src/Psalm/Issue/NoEnumProperties.phpc/src/Psalm/Issue/MixedStringOffsetAssignment.phpc>(src/Psalm/Issue/InvalidPropertyFetch.phpcRFO3src/Psalm/Issue/PossiblyUndefinedIntArrayOffset.phpcIMΤ7src/Psalm/Issue/PossiblyNullPropertyAssignmentValue.phpc0%src/Psalm/Issue/DuplicateEnumCase.phpc%*Ť(src/Psalm/Issue/InvalidTemplateParam.phpc!a src/Psalm/Issue/UnusedMethod.phpccѳ-src/Psalm/Issue/PossiblyUndefinedVariable.phpc$&src/Psalm/Issue/DeprecatedConstant.phpcp'+դ6src/Psalm/Issue/PossiblyUndefinedStringArrayOffset.phpcu(src/Psalm/Issue/MissingTemplateParam.phpc9=௤'src/Psalm/Issue/ContinueOutsideLoop.phpc KA/src/Psalm/Issue/ImpureByReferenceAssignment.phpc|ҍ&src/Psalm/Issue/InvalidExtendClass.phpca Ȥsrc/Psalm/Issue/MethodIssue.phpcLup!src/Psalm/Issue/VariableIssue.phpc"vG!src/Psalm/Issue/InvalidParent.phpc7 src/Psalm/Issue/InvalidScope.phpcߏǤ4src/Psalm/Issue/InvalidTraversableImplementation.phpc!src/Psalm/Issue/ComplexMethod.phpc0ZB&src/Psalm/Issue/PsalmInternalError.phpca3,src/Psalm/Issue/InvalidDocblockParamName.phpcZ*src/Psalm/Issue/UnrecognizedExpression.phpc0 !src/Psalm/Issue/TaintedHeader.phpc[ݤ*src/Psalm/Issue/DuplicateEnumCaseValue.phpce%src/Psalm/Issue/ParamNameMismatch.phpcT&src/Psalm/Issue/DeprecatedFunction.phpc_Ĥ*src/Psalm/Issue/NullPropertyAssignment.php0c06#src/Psalm/Issue/NullArrayOffset.phpc6*src/Psalm/Issue/UndefinedPropertyFetch.phpcMn.src/Psalm/Issue/PossiblyInvalidArrayOffset.phpcuۤ#src/Psalm/Issue/DeprecatedTrait.phpcIݰsrc/Psalm/Issue/NullOperand.phpcEwV+src/Psalm/Issue/OverriddenFinalConstant.phpcw7$src/Psalm/Issue/InternalProperty.phpc`w'src/Psalm/Issue/PossiblyInvalidCast.phpcl:%src/Psalm/Issue/MixedFunctionCall.phpcӭ2src/Psalm/Issue/RedundantCastGivenDocblockType.phpcYߤ"src/Psalm/Issue/UndefinedTrace.phpc$src/Psalm/Issue/TaintedFile.phpc¤+src/Psalm/Issue/PossiblyNullArrayAccess.php8c8*'M"src/Psalm/Issue/UndefinedTrait.phpcϤsrc/Psalm/Issue/InvalidCast.phpcye5src/Psalm/Issue/LessSpecificImplementedReturnType.phpc!3#src/Psalm/Issue/UndefinedMethod.phpc%Ӥ*src/Psalm/Issue/PossiblyInvalidOperand.phpcȤ#src/Psalm/Issue/InvalidToString.phpc 0src/Psalm/Issue/PossiblyInvalidPropertyFetch.phpcY9k,src/Psalm/Issue/MissingClosureReturnType.phpcKI src/Psalm/Issue/InvalidClone.phpc?-src/Psalm/Issue/MixedPropertyTypeCoercion.phpcp/=̤0src/Psalm/Issue/ReferenceConstraintViolation.phpc(src/Psalm/Issue/ImpureStaticVariable.phpc2B(src/Psalm/Issue/ImplicitToStringCast.phpcnUv%src/Psalm/Issue/UndefinedFunction.phpcN'src/Psalm/Issue/PossiblyNullOperand.phpc R[8src/Psalm/Issue/RedundantPropertyInitializationCheck.phpc֕.src/Psalm/Issue/ConstantDeclarationInTrait.phpc7lsrc/Psalm/Issue/Trace.phpc))src/Psalm/Issue/TaintedTextWithQuotes.phpcpLX90src/Psalm/Issue/ConstructorSignatureMismatch.phpcyg֤)src/Psalm/Issue/UninitializedProperty.phpc[J41-src/Psalm/Issue/InaccessibleClassConstant.phpc"src/Psalm/Issue/UnusedVariable.phpc&3src/Psalm/Issue/UndefinedThisPropertyAssignment.phpc֤*src/Psalm/Issue/InvalidPassByReference.phpc#src/Psalm/Issue/InvalidDocblock.phpcQ}J2src/Psalm/Issue/InvalidConstantAssignmentValue.phpc Z%src/Psalm/Issue/UnusedReturnValue.phpcY,src/Psalm/Issue/OverriddenPropertyAccess.phpcl **src/Psalm/Issue/InvalidLiteralArgument.phpcT+src/Psalm/Issue/MixedInferredReturnType.phpc)b'src/Psalm/Issue/UnresolvableInclude.phpc $k*src/Psalm/Issue/MoreSpecificReturnType.phpc&src/Psalm/Issue/UnusedFunctionCall.phpcOԅ'src/Psalm/Issue/UnsafeInstantiation.phpcw&*src/Psalm/Issue/TypeDoesNotContainNull.phpc淽Ф&src/Psalm/Issue/ImpureFunctionCall.phpce?e%src/Psalm/Issue/NonStaticSelfCall.phpcR*src/Psalm/Issue/InvalidArrayAssignment.phpcj!/src/Psalm/Issue/OverriddenInterfaceConstant.phpcQ(src/Psalm/Issue/MixedArrayAssignment.phpc40src/Psalm/Issue/UnimplementedInterfaceMethod.phpc2 src/Psalm/Issue/TaintedShell.phpcQ*src/Psalm/Issue/OverriddenMethodAccess.phpcˡ&src/Psalm/Issue/MixedPropertyFetch.phpcĤΤ4src/Psalm/Issue/MoreSpecificImplementedParamType.phpc¤/src/Psalm/Issue/PropertyNotSetInConstructor.phpc 0src/Psalm/Issue/RiskyCast.phpcW˖4src/Psalm/Issue/UndefinedMagicPropertyAssignment.phpc޾פ)src/Psalm/Issue/PossiblyFalseArgument.phpc](src/Psalm/Issue/PossiblyFalseOperand.phpcΤ$src/Psalm/Issue/IfThisIsMismatch.phpcaŔ$src/Psalm/Issue/DeprecatedMethod.phpc:src/Psalm/Issue/PossiblyInvalidPropertyAssignmentValue.phpcT(src/Psalm/Issue/UnresolvableConstant.phpcЯt&src/Psalm/Issue/InaccessibleMethod.phpc-_#src/Psalm/Issue/InvalidArgument.phpcdYԪ1src/Psalm/Issue/LessSpecificClassConstantType.phpcf-src/Psalm/Issue/PossiblyUnusedReturnValue.phpc#src/Psalm/Issue/DeprecatedClass.phpcHn src/Psalm/Issue/NullIterator.phpcQyh(src/Psalm/Issue/PropertyTypeCoercion.phpcNi!src/Psalm/Issue/InvalidGlobal.phpcY@.$src/Psalm/Issue/MixedArrayOffset.phpcIsrc/Psalm/Issue/ClassIssue.phpcnۤ)src/Psalm/Issue/RedundantFunctionCall.phpc $src/Psalm/Issue/MixedArrayAccess.phpc\OѤ&src/Psalm/Issue/UnusedClosureParam.phpcR 0/*src/Psalm/Issue/InvalidEnumBackingType.phpcor%src/Psalm/Issue/InvalidReturnType.phpc("src/Psalm/Issue/UndefinedClass.phpc.src/Psalm/Issue/MissingImmutableAnnotation.phpc/m&src/Psalm/Issue/AbstractMethodCall.phpcd%src/Psalm/Issue/InvalidMethodCall.phpcHE&src/Psalm/Issue/UndefinedInterface.phpco%src/Psalm/Issue/MissingDependency.phpcӬ1src/Psalm/Issue/ExtensionRequirementViolation.phpcIsrc/Psalm/Issue/ConfigIssue.phpcµ 2src/Psalm/Issue/InvalidPropertyAssignmentValue.phpcm!src/Psalm/Issue/NullReference.phpcФ/src/Psalm/Issue/PossiblyInvalidFunctionCall.phpcң`'src/Psalm/Issue/InvalidFunctionCall.phpcN$src/Psalm/Issue/EmptyArrayAccess.phpcRXR"src/Psalm/Issue/InternalMethod.phpc!1*src/Psalm/Issue/InterfaceInstantiation.phpc^ᔤ src/Psalm/Issue/InvalidClass.phpce+src/Psalm/Issue/PossiblyInvalidArgument.phpco##src/Psalm/Issue/TooFewArguments.phpciH8%src/Psalm/Issue/TaintedUserSecret.phpcn+src/Psalm/Issue/PossiblyNullArrayOffset.phpcxm.src/Psalm/Issue/UncaughtThrowInGlobalScope.phpc,src/Psalm/Issue/NonInvariantPropertyType.phpcc -src/Psalm/Issue/InvalidNullableReturnType.phpcDH'src/Psalm/Issue/MissingPropertyType.phpc#src/Psalm/Issue/MixedMethodCall.phpc?Eͤ src/Psalm/Issue/ReservedWord.phpc=F src/Psalm/Issue/NullArgument.phpcMl'src/Psalm/Issue/UnusedBaselineEntry.phpc )5src/Psalm/Issue/ReferenceReusedFromConfusingScope.phpcݪD+src/Psalm/Issue/MixedReturnTypeCoercion.phpcc+(src/Psalm/Issue/ImpureStaticProperty.phpc0i$src/Psalm/Issue/ImpureMethodCall.phpc'src/Psalm/Issue/UnusedPsalmSuppress.phpcġ))src/Psalm/Issue/AbstractInstantiation.phpc%ɤ&src/Psalm/Issue/RawObjectIteration.phpc4@b(src/Psalm/Issue/InaccessibleProperty.phpc@'src/Psalm/Issue/DeprecatedInterface.phpcD#src/Psalm/Issue/InvalidIterator.phpc.Q$src/Psalm/Issue/InvalidAttribute.phpcŻsrc/Psalm/Issue/TaintedSql.php~c~=%src/Psalm/Issue/UndefinedConstant.phpcȊФsrc/Psalm/Issue/TaintedSSRF.phpcj_+src/Psalm/Issue/NamedArgumentNotAllowed.phpc2G{$src/Psalm/Issue/LoopInvalidation.phpc2#src/Psalm/Issue/MixedIssueTrait.phpcq'src/Psalm/Issue/TaintedSystemSecret.phpc+src/Psalm/Issue/NullableReturnStatement.phpc ),src/Psalm/Issue/UnnecessaryVarAnnotation.phpc6zb]/src/Psalm/Issue/UndefinedPropertyAssignment.phpc+M7%src/Psalm/Issue/UndefinedVariable.phpcG6%src/Psalm/Issue/UnusedConstructor.phpcي*src/Psalm/Issue/TypeDoesNotContainType.phpcz`Isrc/Psalm/Issue/NoValue.phpc`w#src/Psalm/Issue/DuplicateMethod.phpcʤU(src/Psalm/Issue/InvalidNamedArgument.phpc)פ+src/Psalm/Issue/UnhandledMatchCondition.phpcCah.src/Psalm/Issue/PossiblyInvalidDocblockTag.phpcT-%src/Psalm/Issue/InvalidTypeImport.phpcR%src/Psalm/Issue/DuplicateFunction.phpcҴ8K#src/Psalm/Issue/MixedAssignment.phpc¿)src/Psalm/Issue/TooManyTemplateParams.phpc^!src/Psalm/Issue/MixedArgument.phpcx +src/Psalm/Issue/MissingClosureParamType.phpcR'src/Psalm/Issue/InvalidParamDefault.phpc q: src/Psalm/Issue/FalseOperand.phpc,src/Psalm/Issue/PossiblyNullFunctionCall.phpc+src/Psalm/Issue/MixedPropertyAssignment.phpcX8src/Psalm/Issue/MethodSignatureMustProvideReturnType.phpc11썤+src/Psalm/Issue/InvalidStaticInvocation.phpcsrc/Psalm/Issue/MixedClone.phpc֤src/Psalm/Issue/MixedIssue.phpc!Ϥ.src/Psalm/Issue/PossibleRawObjectIteration.phpcM!&src/Psalm/Issue/InvalidStringClass.phpc5J.src/Psalm/Issue/UndefinedThisPropertyFetch.phpcD5src/Psalm/Issue/MethodSignatureMustOmitReturnType.phpci2src/Psalm/Issue/ConflictingReferenceConstraint.phpctN'src/Psalm/Issue/MissingDocblockType.phpcL."src/Psalm/Issue/ParentNotFound.phpcޤ6src/Psalm/Issue/ImplementationRequirementViolation.phpc-Ϥ+src/Psalm/Issue/FalsableReturnStatement.phpcsrc/Psalm/Issue/TaintedHtml.phpc$!src/Psalm/Issue/PropertyIssue.phpc̨#src/Psalm/Issue/StringIncrement.phpckq%src/Psalm/Issue/MutableDependency.phpc5mݤ&src/Psalm/Issue/InvalidArrayAccess.phpcͤ&src/Psalm/Issue/ClassConstantIssue.php}c}`0ڤsrc/Psalm/Issue/PluginIssue.php]c]䕿H.src/Psalm/Issue/UnsafeGenericInstantiation.phpc&/src/Psalm/Issue/UndefinedMagicPropertyFetch.phpc6K)src/Psalm/Issue/PossiblyFalseIterator.phpcfG"src/Psalm/Issue/DuplicateParam.phpcM#src/Psalm/Issue/UnevaluatedCode.phpc"0src/Psalm/Issue/ImplementedParamTypeMismatch.phpce src/Psalm/Issue/InvalidCatch.phpcUYje0src/Psalm/Issue/PossiblyUndefinedArrayOffset.phpc12src/Psalm/Issue/PossiblyInvalidArrayAssignment.phpc 5src/Psalm/Issue/PossiblyInvalidPropertyAssignment.phpcZϙ$src/Psalm/Issue/AssignmentToVoid.phpcvx(%src/Psalm/Issue/DuplicateArrayKey.phpc6/src/Psalm/Issue/PossiblyNullArrayAssignment.phpcc"=)src/Psalm/Issue/MissingThrowsDocblock.phpcLe,src/Psalm/Issue/InvalidClassConstantType.phpc4Nsrc/Psalm/Issue/CheckType.phpc>#C'src/Psalm/Issue/ImpurePropertyFetch.phpcȤ#src/Psalm/Issue/NullArrayAccess.php)c)bNw-src/Psalm/Issue/DocblockTypeContradiction.phpc21,src/Psalm/Issue/ImpurePropertyAssignment.phpch)$src/Psalm/Issue/NullFunctionCall.phpcјu.src/Psalm/Issue/PossiblyInvalidArrayAccess.phpcQr<-src/Psalm/Issue/RedundantIdentityWithTrue.phpcy$src/Psalm/Issue/UnusedMethodCall.phpcr0src/Psalm/Issue/AmbiguousConstantInheritance.phpcK(src/Psalm/Issue/PossiblyInvalidClone.phpcjŐ"src/Psalm/Issue/UnusedProperty.phpcUsrc/Psalm/Issue/MissingFile.php|c|,src/Psalm/Issue/UnusedClass.phpc)src/Psalm/Issue/UnrecognizedStatement.phpc5w-src/Psalm/Issue/UnsupportedReferenceUsage.phpcy61src/Psalm/Issue/ImplementedReturnTypeMismatch.phpc5*src/Psalm/Issue/LessSpecificReturnType.phpcyp+src/Psalm/Issue/PossiblyInvalidIterator.phpc|;B&src/Psalm/Issue/UnusedForeachValue.phpcp'src/Psalm/Issue/PossiblyUnusedParam.phpcH)src/Psalm/Issue/NoInterfaceProperties.phpcX7f+src/Psalm/Issue/UndefinedAttributeClass.phpc(src/Psalm/Issue/ParadoxicalCondition.phpc 2src/Psalm/Issue/PossiblyNullPropertyAssignment.php?c?*&src/Psalm/Issue/RedundantCondition.phpcX|Ϥsrc/Psalm/Issue/CodeIssue.php c K?+src/Psalm/Issue/UndefinedGlobalVariable.phpcGW턤%src/Psalm/Issue/NullPropertyFetch.php+c+3src/Psalm/Issue/PossiblyUndefinedGlobalVariable.phpcߤ src/Psalm/Issue/InvalidThrow.phpc23)src/Psalm/Issue/InvalidScalarArgument.phpc@A9*src/Psalm/Issue/PossiblyUnusedProperty.phpc/src/Psalm/Issue/LessSpecificReturnStatement.phpc^s"src/Psalm/Issue/DuplicateClass.phpc77*-src/Psalm/Issue/InvalidPropertyAssignment.phpc&f.#src/Psalm/Issue/ComplexFunction.phpcE(src/Psalm/Issue/UndefinedMagicMethod.phpcڥsrc/Psalm/Issue/TaintedEval.phpc&sxP!src/Psalm/Issue/ArgumentIssue.phpc,!src/Psalm/Issue/RedundantCast.phpcb)src/Psalm/Issue/PossiblyNullReference.phpc27src/Psalm/Issue/RedundantConditionGivenDocblockType.phpcD< src/Psalm/Issue/MixedOperand.phpc|\&src/Psalm/Issue/MissingConstructor.phpcQ8src/Psalm/Issue/PossiblyFalsePropertyAssignmentValue.phpcJ8$src/Psalm/Issue/TooManyArguments.phpcU0%src/Psalm/Issue/CircularReference.phpcYj+src/Psalm/Issue/PossiblyUndefinedMethod.phpc*src/Psalm/Issue/PossiblyFalseReference.phpcWϤ src/Psalm/Issue/TaintedInput.phpc +src/Psalm/Issue/MethodSignatureMismatch.phpcūM$src/Psalm/Issue/MissingParamType.phpcj-src/Psalm/Issue/InvalidFalsableReturnType.phpc1Dsrc/Psalm/Issue/TaintedLdap.phpc:(src/Psalm/Issue/ArgumentTypeCoercion.phpcӖ#src/Psalm/Issue/TaintedCallable.phpc\ˤ%src/Psalm/Issue/InvalidEnumMethod.phpcsxPsrc/Psalm/Issue/UnusedParam.phpc/i=src/Psalm/Internal/Stubs/Generator/ClassLikeStubGenerator.phpP"cP"bg5src/Psalm/Internal/Stubs/Generator/StubsGenerator.php3.c3.8src/Psalm/Internal/Provider/ClassLikeStorageProvider.phpc!~8src/Psalm/Internal/Provider/FileStorageCacheProvider.phpDcDr+:src/Psalm/Internal/Provider/PropertyVisibilityProvider.phpc@w)src/Psalm/Internal/Provider/Providers.phpt ct {O4src/Psalm/Internal/Provider/MethodParamsProvider.php c ȝɤ4src/Psalm/Internal/Provider/PropertyTypeProvider.phpcx2src/Psalm/Internal/Provider/StatementsProvider.phpU:cU:?Gxä:src/Psalm/Internal/Provider/FunctionReturnTypeProvider.phpcޤCsrc/Psalm/Internal/Provider/AddRemoveTaints/HtmlFunctionTainter.php c rMsrc/Psalm/Internal/Provider/ReturnTypeProvider/ArrayPadReturnTypeProvider.phpc~9hVTsrc/Psalm/Internal/Provider/ReturnTypeProvider/GetClassMethodsReturnTypeProvider.phpzcz9[src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayPointerAdjustmentReturnTypeProvider.phpcXJKsrc/Psalm/Internal/Provider/ReturnTypeProvider/PdoStatementSetFetchMode.php3 c3 KְRsrc/Psalm/Internal/Provider/ReturnTypeProvider/GetObjectVarsReturnTypeProvider.phpc#R(Hsrc/Psalm/Internal/Provider/ReturnTypeProvider/SimpleXmlElementAsXml.php<c<-^Rsrc/Psalm/Internal/Provider/ReturnTypeProvider/ArrayFillKeysReturnTypeProvider.php8 c8 +]Psrc/Psalm/Internal/Provider/ReturnTypeProvider/ArrayReduceReturnTypeProvider.php$c$q Lsrc/Psalm/Internal/Provider/ReturnTypeProvider/DirnameReturnTypeProvider.phpxcxO[Msrc/Psalm/Internal/Provider/ReturnTypeProvider/BasenameReturnTypeProvider.phpcxZcTsrc/Psalm/Internal/Provider/ReturnTypeProvider/IteratorToArrayReturnTypeProvider.phpcEsrc/Psalm/Internal/Provider/ReturnTypeProvider/DomNodeAppendChild.phpaca4xNsrc/Psalm/Internal/Provider/ReturnTypeProvider/ArrayRandReturnTypeProvider.phpzczhU \Osrc/Psalm/Internal/Provider/ReturnTypeProvider/ArrayMergeReturnTypeProvider.php'c'{Xsrc/Psalm/Internal/Provider/ReturnTypeProvider/ClosureFromCallableReturnTypeProvider.phpc'BPsrc/Psalm/Internal/Provider/ReturnTypeProvider/ArrayColumnReturnTypeProvider.php%c%\~Ssrc/Psalm/Internal/Provider/ReturnTypeProvider/DateTimeModifyReturnTypeProvider.phpc!Ksrc/Psalm/Internal/Provider/ReturnTypeProvider/HexdecReturnTypeProvider.phpRcRȤLsrc/Psalm/Internal/Provider/ReturnTypeProvider/InArrayReturnTypeProvider.php_ c_ vVsrc/Psalm/Internal/Provider/ReturnTypeProvider/ImagickPixelColorReturnTypeProvider.php c tNsrc/Psalm/Internal/Provider/ReturnTypeProvider/FilterVarReturnTypeProvider.phpiciBIJsrc/Psalm/Internal/Provider/ReturnTypeProvider/RoundReturnTypeProvider.php7 c7 pQsrc/Psalm/Internal/Provider/ReturnTypeProvider/ArrayReverseReturnTypeProvider.php2 c2 D Ksrc/Psalm/Internal/Provider/ReturnTypeProvider/MktimeReturnTypeProvider.phpBcBZOMsrc/Psalm/Internal/Provider/ReturnTypeProvider/ArrayPopReturnTypeProvider.php c cw>Wsrc/Psalm/Internal/Provider/ReturnTypeProvider/MbInternalEncodingReturnTypeProvider.php4 c4 ? _Qsrc/Psalm/Internal/Provider/ReturnTypeProvider/PdoStatementReturnTypeProvider.php c Msrc/Psalm/Internal/Provider/ReturnTypeProvider/ArrayMapReturnTypeProvider.phpBcBᒤMsrc/Psalm/Internal/Provider/ReturnTypeProvider/ParseUrlReturnTypeProvider.php"c"syhuKsrc/Psalm/Internal/Provider/ReturnTypeProvider/MinMaxReturnTypeProvider.phpxcxms.Psrc/Psalm/Internal/Provider/ReturnTypeProvider/ArrayFilterReturnTypeProvider.php%c%rIsrc/Psalm/Internal/Provider/ReturnTypeProvider/RandReturnTypeProvider.phpEcEu ZSsrc/Psalm/Internal/Provider/ReturnTypeProvider/VersionCompareReturnTypeProvider.phpocoG2Psrc/Psalm/Internal/Provider/ReturnTypeProvider/ArrayUniqueReturnTypeProvider.phpc)Osrc/Psalm/Internal/Provider/ReturnTypeProvider/StrReplaceReturnTypeProvider.php\ c\ )"Jsrc/Psalm/Internal/Provider/ReturnTypeProvider/StrTrReturnTypeProvider.phpcTҤOsrc/Psalm/Internal/Provider/ReturnTypeProvider/ArraySliceReturnTypeProvider.php c 'Ssrc/Psalm/Internal/Provider/ReturnTypeProvider/FirstArgStringReturnTypeProvider.phpcBQsrc/Psalm/Internal/Provider/ReturnTypeProvider/TriggerErrorReturnTypeProvider.php c P$Nsrc/Psalm/Internal/Provider/ReturnTypeProvider/ArrayFillReturnTypeProvider.phpcPsrc/Psalm/Internal/Provider/ReturnTypeProvider/ArraySpliceReturnTypeProvider.phpcH Qsrc/Psalm/Internal/Provider/ReturnTypeProvider/ArrayCombineReturnTypeProvider.php_c_kz#ؤOsrc/Psalm/Internal/Provider/ReturnTypeProvider/ArrayChunkReturnTypeProvider.phpct29src/Psalm/Internal/Provider/PropertyExistenceProvider.phpc 6src/Psalm/Internal/Provider/FunctionParamsProvider.phpKcKʐ 3src/Psalm/Internal/Provider/FileStorageProvider.php c &>src/Psalm/Internal/Provider/DynamicFunctionStorageProvider.php c 耫0src/Psalm/Internal/Provider/FakeFileProvider.phptctjV9src/Psalm/Internal/Provider/FunctionExistenceProvider.phpbcbE,src/Psalm/Internal/Provider/FileProvider.phpc.=src/Psalm/Internal/Provider/ClassLikeStorageCacheProvider.phpc}հ7src/Psalm/Internal/Provider/StatementsVolatileCache.php c C8src/Psalm/Internal/Provider/MethodReturnTypeProvider.php2 c2 :src/Psalm/Internal/Provider/FileReferenceCacheProvider.phpycy&C!U8src/Psalm/Internal/Provider/MethodVisibilityProvider.phpWcW5src/Psalm/Internal/Provider/FileReferenceProvider.phpc,&$Tsrc/Psalm/Internal/Provider/PropertyTypeProvider/DomDocumentPropertyTypeProvider.phpcAxפ3src/Psalm/Internal/Provider/ParserCacheProvider.phpx.cx.qKa4src/Psalm/Internal/Provider/ProjectCacheProvider.phpc.[7src/Psalm/Internal/Provider/MethodExistenceProvider.phpjcj,0src/Psalm/Internal/Provider/NodeDataProvider.phpcws&src/Psalm/Internal/EventDispatcher.php7c7Jv#src/Psalm/Internal/ErrorHandler.phpA cA ßNu#src/Psalm/Internal/Cli/Refactor.php''c'') !src/Psalm/Internal/Cli/Plugin.php"c"ዜ)src/Psalm/Internal/Cli/LanguageServer.php#c#d;"src/Psalm/Internal/Cli/Psalter.phpIcIX  src/Psalm/Internal/Cli/Psalm.phpYcYo$src/Psalm/Internal/Scope/IfScope.phpcɣ/src/Psalm/Internal/Scope/IfConditionalScope.php]c]9g&src/Psalm/Internal/Scope/CaseScope.phpcs(src/Psalm/Internal/Scope/SwitchScope.phpc&src/Psalm/Internal/Scope/LoopScope.phpc؉+)src/Psalm/Internal/Scope/FinallyScope.phptct,[src/Psalm/Internal/CliUtils.phpB?cB? M@src/Psalm/Internal/FileManipulation/ClassDocblockManipulator.php c }2TCsrc/Psalm/Internal/FileManipulation/FunctionDocblockManipulator.phpFcFZä>src/Psalm/Internal/FileManipulation/FileManipulationBuffer.phpcP֤5src/Psalm/Internal/FileManipulation/CodeMigration.phpceCsrc/Psalm/Internal/FileManipulation/PropertyDocblockManipulator.phpce^2src/Psalm/Internal/Fork/ForkProcessDoneMessage.phpc= src/Psalm/Internal/Fork/Pool.phprBcrBv>*src/Psalm/Internal/Fork/PsalmRestarter.phpc]/src/Psalm/Internal/Fork/ForkTaskDoneMessage.phpc8%3src/Psalm/Internal/Fork/ForkProcessErrorMessage.phplclS*'src/Psalm/Internal/Fork/ForkMessage.phpAcA>src/Psalm/Internal/ExecutionEnvironment/BuildInfoCollector.phpz)cz)-`+Asrc/Psalm/Internal/ExecutionEnvironment/SystemCommandExecutor.phpcƤۤ<src/Psalm/Internal/ExecutionEnvironment/GitInfoCollector.php c f8src/Psalm/Internal/Analyzer/Statements/UnsetAnalyzer.phpc'S8src/Psalm/Internal/Analyzer/Statements/ThrowAnalyzer.php c *9src/Psalm/Internal/Analyzer/Statements/StaticAnalyzer.phpc<9src/Psalm/Internal/Analyzer/Statements/ReturnAnalyzer.phpVTcVT!WФ7src/Psalm/Internal/Analyzer/Statements/EchoAnalyzer.php c bfCsrc/Psalm/Internal/Analyzer/Statements/Expression/CloneAnalyzer.phpgcgWzCsrc/Psalm/Internal/Analyzer/Statements/Expression/EmptyAnalyzer.phpcsݤBsrc/Psalm/Internal/Analyzer/Statements/Expression/CastAnalyzer.phpstcst ZKCsrc/Psalm/Internal/Analyzer/Statements/Expression/IssetAnalyzer.phpchHsrc/Psalm/Internal/Analyzer/Statements/Expression/AssignmentAnalyzer.phpcaHsrc/Psalm/Internal/Analyzer/Statements/Expression/BooleanNotAnalyzer.phpcꕄIsrc/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/OrAnalyzer.phpZ1cZ1.LOsrc/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/CoalesceAnalyzer.phpX cX IY\Jsrc/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/AndAnalyzer.phpscsIk_Msrc/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/ConcatAnalyzer.phpZ9cZ9Vsrc/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/NonComparisonOpAnalyzer.php[ c[ |Ssrc/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/ArithmeticOpAnalyzer.phpcFsrc/Psalm/Internal/Analyzer/Statements/Expression/NullsafeAnalyzer.phpK cK 8pEsrc/Psalm/Internal/Analyzer/Statements/Expression/TernaryAnalyzer.php()c()OHsrc/Psalm/Internal/Analyzer/Statements/Expression/ClassConstAnalyzer.phpucuZEsrc/Psalm/Internal/Analyzer/Statements/Expression/IncludeAnalyzer.php^9c^9ûEsrc/Psalm/Internal/Analyzer/Statements/Expression/AssertionFinder.phpc%PNsrc/Psalm/Internal/Analyzer/Statements/Expression/IncDecExpressionAnalyzer.phpccsrc/Psalm/Internal/Analyzer/Statements/Expression/Assignment/InstancePropertyAssignmentAnalyzer.php^c^;Xsrc/Psalm/Internal/Analyzer/Statements/Expression/Assignment/ArrayAssignmentAnalyzer.phpcYQsrc/Psalm/Internal/Analyzer/Statements/Expression/Assignment/AssignedProperty.phpcŤasrc/Psalm/Internal/Analyzer/Statements/Expression/Assignment/StaticPropertyAssignmentAnalyzer.phpe(ce(noBsrc/Psalm/Internal/Analyzer/Statements/Expression/CallAnalyzer.phpcVIGsrc/Psalm/Internal/Analyzer/Statements/Expression/SimpleTypeInferer.php~`c~`êGsrc/Psalm/Internal/Analyzer/Statements/Expression/ArrayCreationInfo.phpcpBHsrc/Psalm/Internal/Analyzer/Statements/Expression/BitwiseNotAnalyzer.php/c/!?Bsrc/Psalm/Internal/Analyzer/Statements/Expression/EvalAnalyzer.php c kLsrc/Psalm/Internal/Analyzer/Statements/Expression/UnaryPlusMinusAnalyzer.phpcxئ|Fsrc/Psalm/Internal/Analyzer/Statements/Expression/BinaryOpAnalyzer.phpTFcTFI~Gsrc/Psalm/Internal/Analyzer/Statements/Expression/YieldFromAnalyzer.php c Hsrc/Psalm/Internal/Analyzer/Statements/Expression/MagicConstAnalyzer.phpocoECsrc/Psalm/Internal/Analyzer/Statements/Expression/PrintAnalyzer.php c n>Jsrc/Psalm/Internal/Analyzer/Statements/Expression/ExpressionIdentifier.phpc [1Hsrc/Psalm/Internal/Analyzer/Statements/Expression/InstanceofAnalyzer.php c =Msrc/Psalm/Internal/Analyzer/Statements/Expression/Call/MethodCallAnalyzer.phpM4cM4o#Ssrc/Psalm/Internal/Analyzer/Statements/Expression/Call/NamedFunctionCallHandler.phpfNcfNIդMsrc/Psalm/Internal/Analyzer/Statements/Expression/Call/StaticCallAnalyzer.php--c-- mKsrc/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentAnalyzer.phpc2POsrc/Psalm/Internal/Analyzer/Statements/Expression/Call/FunctionCallAnalyzer.phpƑcƑpFsrc/Psalm/Internal/Analyzer/Statements/Expression/Call/NewAnalyzer.phplcl;Osrc/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentMapPopulator.php{c{[}Ksrc/Psalm/Internal/Analyzer/Statements/Expression/Call/FunctionCallInfo.phpceNVsrc/Psalm/Internal/Analyzer/Statements/Expression/Call/ClassTemplateParamCollector.php%c%MO_src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodCallProhibitionAnalyzer.phpcTӤZsrc/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodVisibilityAnalyzer.phpcRhZsrc/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MissingMethodCallHandler.php73c73Ibsrc/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/ExistingAtomicMethodCallAnalyzer.phpXPcXPlZsrc/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodCallPurityAnalyzer.phpc ޤ`src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/AtomicMethodCallAnalysisResult.phpcaSsrc/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/AtomicCallContext.phpcRFEZsrc/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/AtomicMethodCallAnalyzer.phpicip]src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodCallReturnTypeFetcher.phpmHcmHjfYsrc/Psalm/Internal/Analyzer/Statements/Expression/Call/ArrayFunctionArgumentsAnalyzer.phpscsXsrc/Psalm/Internal/Analyzer/Statements/Expression/Call/FunctionCallReturnTypeFetcher.phpbcb>HLsrc/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentsAnalyzer.phpcw0hsrc/Psalm/Internal/Analyzer/Statements/Expression/Call/StaticMethod/ExistingAtomicStaticCallAnalyzer.phpiNciN1`src/Psalm/Internal/Analyzer/Statements/Expression/Call/StaticMethod/AtomicStaticCallAnalyzer.phpc,ݤCsrc/Psalm/Internal/Analyzer/Statements/Expression/MatchAnalyzer.php%c%=Csrc/Psalm/Internal/Analyzer/Statements/Expression/ArrayAnalyzer.phpIVcIVQBsrc/Psalm/Internal/Analyzer/Statements/Expression/ExitAnalyzer.php\c\ Csrc/Psalm/Internal/Analyzer/Statements/Expression/YieldAnalyzer.php1c1F;Psrc/Psalm/Internal/Analyzer/Statements/Expression/EncapsulatedStringAnalyzer.phpc5 E.Wsrc/Psalm/Internal/Analyzer/Statements/Expression/Fetch/AtomicPropertyFetchAnalyzer.phpcK$Qsrc/Psalm/Internal/Analyzer/Statements/Expression/Fetch/VariableFetchAnalyzer.phphch/Ysrc/Psalm/Internal/Analyzer/Statements/Expression/Fetch/InstancePropertyFetchAnalyzer.phpQ:cQ:λ'Nsrc/Psalm/Internal/Analyzer/Statements/Expression/Fetch/ArrayFetchAnalyzer.phpcdxNsrc/Psalm/Internal/Analyzer/Statements/Expression/Fetch/ConstFetchAnalyzer.phpu&cu&KWsrc/Psalm/Internal/Analyzer/Statements/Expression/Fetch/StaticPropertyFetchAnalyzer.php8c86?src/Psalm/Internal/Analyzer/Statements/Block/SwitchAnalyzer.phpc^ y>src/Psalm/Internal/Analyzer/Statements/Block/WhileAnalyzer.php@c@src/Psalm/Internal/Scanner/UnresolvedConstant/KeyValuePair.phpc&0Fsrc/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedBitwiseAnd.phpcBCsrc/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedTernary.phpc5Fsrc/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedAdditionOp.phpc܃Bsrc/Psalm/Internal/Scanner/UnresolvedConstant/ArrayOffsetFetch.phpc_=src/Psalm/Internal/Scanner/UnresolvedConstant/ScalarValue.phpc\=Isrc/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedSubtractionOp.php c p?Dsrc/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedBinaryOp.phpFcFՖäEsrc/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedBitwiseOr.phpcU츤Dsrc/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedConcatOp.phpc?src/Psalm/Internal/Scanner/UnresolvedConstant/ClassConstant.phpcnjaFsrc/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedBitwiseXor.phpcra2Lsrc/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedMultiplicationOp.php#c#:src/Psalm/Internal/Scanner/UnresolvedConstant/Constant.phpcqM =src/Psalm/Internal/Scanner/UnresolvedConstant/ArraySpread.phpvcvY<src/Psalm/Internal/Scanner/UnresolvedConstant/ArrayValue.phpciFsrc/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedDivisionOp.phpcRB"2src/Psalm/Internal/Scanner/PhpStormMetaScanner.php2c28H@7src/Psalm/Internal/Scanner/ClassLikeDocblockComment.phpcʩv*src/Psalm/Internal/Scanner/FileScanner.php c D4src/Psalm/Internal/LanguageServer/ProtocolReader.php<c<o1f4src/Psalm/Internal/LanguageServer/ProtocolWriter.phpcAŤ:src/Psalm/Internal/LanguageServer/ProtocolStreamReader.php c Kפ6src/Psalm/Internal/LanguageServer/EmitterInterface.phpcx09src/Psalm/Internal/LanguageServer/Server/TextDocument.php<c<y86src/Psalm/Internal/LanguageServer/Server/Workspace.phpc4l1src/Psalm/Internal/LanguageServer/IdGenerator.phpOcO5F9src/Psalm/Internal/LanguageServer/Client/TextDocument.phpcE14src/Psalm/Internal/LanguageServer/LanguageServer.phppKcpK ꟤4src/Psalm/Internal/LanguageServer/LanguageClient.phpcnߙ3src/Psalm/Internal/LanguageServer/ClientHandler.php c ޘɤ:src/Psalm/Internal/LanguageServer/ProtocolStreamWriter.phpc FФ-src/Psalm/Internal/LanguageServer/Message.php2c2۽ݤ2src/Psalm/Internal/LanguageServer/EmitterTrait.phpcm'src/Psalm/Internal/IncludeCollector.phpc+src/Psalm/Internal/Type/TypeCombination.php c N$25src/Psalm/Internal/Type/SimpleAssertionReconciler.phpMcM976src/Psalm/Internal/Type/NegatedAssertionReconciler.php=c=s~#<src/Psalm/Internal/Type/SimpleNegatedAssertionReconciler.phpOcOH;ʤ/src/Psalm/Internal/Type/AssertionReconciler.phpcr=7src/Psalm/Internal/Type/TemplateStandinTypeReplacer.phpcz &src/Psalm/Internal/Type/TypeParser.phpcp?;src/Psalm/Internal/Type/Comparator/TypeComparisonResult.phpVcV7R1=src/Psalm/Internal/Type/Comparator/IntegerRangeComparator.phpc;src/Psalm/Internal/Type/Comparator/ScalarTypeComparator.php6Fc6Fx:src/Psalm/Internal/Type/Comparator/UnionTypeComparator.phpCcC-:src/Psalm/Internal/Type/Comparator/ArrayTypeComparator.phpc0=src/Psalm/Internal/Type/Comparator/CallableTypeComparator.php|Ac|AS;src/Psalm/Internal/Type/Comparator/KeyedArrayComparator.phpc7src/Psalm/Internal/Type/Comparator/ObjectComparator.php1c12K@src/Psalm/Internal/Type/Comparator/ClassLikeStringComparator.php c *<src/Psalm/Internal/Type/Comparator/GenericTypeComparator.phpece ;src/Psalm/Internal/Type/Comparator/AtomicTypeComparator.php{`c{`8src/Psalm/Internal/Type/TemplateInferredTypeReplacer.phpAcAM3)src/Psalm/Internal/Type/TypeTokenizer.php5c5(src/Psalm/Internal/Type/TypeCombiner.php:c:9K%src/Psalm/Internal/Type/ArrayType.phpcFN0src/Psalm/Internal/Type/ParseTree/MethodTree.php@c@(04src/Psalm/Internal/Type/ParseTree/TemplateIsTree.phpXcXD+src/Psalm/Internal/Type/ParseTree/Value.phpUcUr/src/Psalm/Internal/Type/ParseTree/UnionTree.phpcZ5src/Psalm/Internal/Type/ParseTree/ConditionalTree.phpc'am.7src/Psalm/Internal/Type/ParseTree/EncapsulationTree.phpc/B7src/Psalm/Internal/Type/ParseTree/CallableParamTree.phpc[<6src/Psalm/Internal/Type/ParseTree/IntersectionTree.phpcJJ3src/Psalm/Internal/Type/ParseTree/FieldEllipsis.phpcs)*src/Psalm/Internal/Type/ParseTree/Root.phpc1src/Psalm/Internal/Type/ParseTree/GenericTree.phpgcgS84src/Psalm/Internal/Type/ParseTree/KeyedArrayTree.phpjcju@src/Psalm/Internal/Type/ParseTree/CallableWithReturnTypeTree.phpcΓ2src/Psalm/Internal/Type/ParseTree/NullableTree.phpclv>src/Psalm/Internal/Type/ParseTree/MethodWithReturnTypeTree.phpc2ˤ5src/Psalm/Internal/Type/ParseTree/MethodParamTree.phpcHvo4src/Psalm/Internal/Type/ParseTree/TemplateAsTree.phpc_A<src/Psalm/Internal/Type/ParseTree/KeyedArrayPropertyTree.phpLcL ޤ2src/Psalm/Internal/Type/ParseTree/CallableTree.phphch7src/Psalm/Internal/Type/ParseTree/IndexedAccessTree.phpGcG=q S4src/Psalm/Internal/Type/TypeAlias/ClassTypeAlias.phpc3r5src/Psalm/Internal/Type/TypeAlias/InlineTypeAlias.phpHcHd~?7src/Psalm/Internal/Type/TypeAlias/LinkableTypeAlias.php6c6 *src/Psalm/Internal/Type/TemplateResult.phpc%src/Psalm/Internal/Type/ParseTree.php~c~U-n%src/Psalm/Internal/Type/TypeAlias.php?c?4,src/Psalm/Internal/Type/ParseTreeCreator.phpgcgb )src/Psalm/Internal/Type/TemplateBound.php{c{i(src/Psalm/Internal/Type/TypeExpander.php2c2dX src/Psalm/Internal/Json/Json.phpcx=src/Psalm/Internal/Algebra.phpWcWg6e'src/Psalm/Internal/MethodIdentifier.phpHcHqH$src/Psalm/Internal/RuntimeCaches.phpcv*src/Psalm/Internal/ReferenceConstraint.phpcz6ɤGsrc/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeDocblockScanner.phpcxO=src/Psalm/Internal/PhpVisitor/Reflector/AttributeResolver.phpcC <src/Psalm/Internal/PhpVisitor/Reflector/TypeHintResolver.phpcccLԤ@src/Psalm/Internal/PhpVisitor/Reflector/ClassLikeNodeScanner.phpvcvICsrc/Psalm/Internal/PhpVisitor/Reflector/ClassLikeDocblockParser.phpOcOTL>src/Psalm/Internal/PhpVisitor/Reflector/ExpressionResolver.phpr<cr<\⧤Csrc/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeNodeScanner.php[c[Y6֤Fsrc/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeDocblockParser.phpaca4_=src/Psalm/Internal/PhpVisitor/Reflector/ExpressionScanner.php,c,vH0src/Psalm/Internal/PhpVisitor/CloningVisitor.phpc6src/Psalm/Internal/PhpVisitor/PartialParserVisitor.phpX3cX3l4src/Psalm/Internal/PhpVisitor/TypeMappingVisitor.php`c``c9src/Psalm/Internal/PhpVisitor/ConditionCloningVisitor.phpcl_9src/Psalm/Internal/PhpVisitor/CheckTrivialExprVisitor.php c ö4src/Psalm/Internal/PhpVisitor/SimpleNameResolver.phpYcY!4src/Psalm/Internal/PhpVisitor/NodeCleanerVisitor.phpccc 2src/Psalm/Internal/PhpVisitor/ReflectorVisitor.phpUcUXᐤ6src/Psalm/Internal/PhpVisitor/AssignmentMapVisitor.phpc$iM4src/Psalm/Internal/PhpVisitor/NodeCounterVisitor.php:c:ZO4src/Psalm/Internal/PhpVisitor/YieldTypeCollector.phpc Oɤ9src/Psalm/Internal/PhpVisitor/ParamReplacementVisitor.php c (|-src/Psalm/Internal/PhpVisitor/TraitFinder.phph ch |6src/Psalm/Internal/PhpVisitor/OffsetShifterVisitor.phpc5src/Psalm/Internal/PhpVisitor/ShortClosureVisitor.phpch?src/Psalm/Internal/Codebase/ClassConstantByWildcardResolver.phpcH M0src/Psalm/Internal/Codebase/VariableUseGraph.phpc& *src/Psalm/Internal/Codebase/Reflection.phpGcG_&֤+src/Psalm/Internal/Codebase/PropertyMap.phpc.-src/Psalm/Internal/Codebase/DataFlowGraph.phpRcR5src/Psalm/Internal/Codebase/ReferenceMapGenerator.phpc >*src/Psalm/Internal/Codebase/ClassLikes.php<5c<5hV|'src/Psalm/Internal/Codebase/Methods.phprcrx)(src/Psalm/Internal/Codebase/Analyzer.phpc-)src/Psalm/Internal/Codebase/Populator.phpcو.src/Psalm/Internal/Codebase/TaintFlowGraph.php<c< )src/Psalm/Internal/Codebase/Functions.phpA[cA[X'src/Psalm/Internal/Codebase/Scanner.php2fc2fe2*src/Psalm/Internal/Codebase/Properties.php0)c0) ̤6src/Psalm/Internal/Codebase/InternalCallMapHandler.php2c2Oiä4src/Psalm/Internal/Codebase/ConstantTypeResolver.php,c,cB.src/Psalm/Internal/TypeVisitor/TypeScanner.php c j X.src/Psalm/Internal/TypeVisitor/TypeChecker.php+c+j;src/Psalm/Internal/TypeVisitor/ContainsClassLikeVisitor.phpcAW9src/Psalm/Internal/TypeVisitor/ContainsLiteralVisitor.phpc_8src/Psalm/Internal/TypeVisitor/TemplateTypeCollector.phpcx,>src/Psalm/Internal/TypeVisitor/CanContainObjectTypeVisitor.phpci,8src/Psalm/Internal/TypeVisitor/ContainsStaticVisitor.phplclj\(4src/Psalm/Internal/TypeVisitor/ClasslikeReplacer.phpjcjm5src/Psalm/Internal/TypeVisitor/FromDocblockSetter.phpc貀0src/Psalm/Internal/TypeVisitor/TypeLocalizer.php# c# ݐ$src/Psalm/Internal/DataFlow/Path.phpcȤ,src/Psalm/Internal/DataFlow/DataFlowNode.phpX cX ]H+src/Psalm/Internal/DataFlow/TaintSource.phpcWǽ)src/Psalm/Internal/DataFlow/TaintSink.phpc˜src/Psalm/Internal/Clause.phpcA&src/Psalm/Internal/Diff/FileDiffer.php!c!H$src/Psalm/Internal/Diff/DiffElem.php$c$ [;0src/Psalm/Internal/Diff/FileStatementsDiffer.phpcی5src/Psalm/Internal/Diff/NamespaceStatementsDiffer.phpc5I1src/Psalm/Internal/Diff/ClassStatementsDiffer.phpk%ck%.%src/Psalm/Internal/Diff/AstDiffer.php] c] UVͤ#src/Psalm/Internal/VersionUtils.php' c' D+i3src/Psalm/Internal/PhpTraverser/CustomTraverser.phpcUQ@src/Psalm/NodeTypeProvider.phpc K 0src/Psalm/Storage/ImmutableNonCloneableTrait.phpcخsrc/Psalm/Storage/Assertion.phpcUG*src/Psalm/Storage/Assertion/IsNotIsset.php/c/#F+src/Psalm/Storage/Assertion/IsIdentical.phpcDȚ-src/Psalm/Storage/Assertion/HasExactCount.phpEcE23src/Psalm/Storage/Assertion/IsLessThanOrEqualTo.phpBcBO1src/Psalm/Storage/Assertion/DoesNotHaveMethod.phpce9src/Psalm/Storage/Assertion/HasIntOrStringArrayAccess.php c ZE\#src/Psalm/Storage/Assertion/Any.phpcq'src/Psalm/Storage/Assertion/IsIsset.phpcMw+src/Psalm/Storage/Assertion/IsNotAClass.phpc)src/Psalm/Storage/Assertion/IsNotType.phpcFb&src/Psalm/Storage/Assertion/Truthy.phpcev3&src/Psalm/Storage/Assertion/IsType.phpc0-^,src/Psalm/Storage/Assertion/IsClassEqual.phpcF!4src/Psalm/Storage/Assertion/NotNonEmptyCountable.phpycyE.src/Psalm/Storage/Assertion/IsLooselyEqual.php c MGw.src/Psalm/Storage/Assertion/IsNotCountable.phpcSRl*src/Psalm/Storage/Assertion/IsLessThan.php c hs(src/Psalm/Storage/Assertion/NonEmpty.phpc:Efx*src/Psalm/Storage/Assertion/NotInArray.php$c$R//src/Psalm/Storage/Assertion/IsClassNotEqual.phpcO=p/&src/Psalm/Storage/Assertion/Empty_.php.c.uؤ.src/Psalm/Storage/Assertion/ArrayKeyExists.php c n7src/Psalm/Storage/Assertion/DoesNotHaveAtLeastCount.php?c?)src/Psalm/Storage/Assertion/HasMethod.phpcF/7+src/Psalm/Storage/Assertion/HasArrayKey.php_c_"fg-src/Psalm/Storage/Assertion/IsGreaterThan.phpc@Ŏ1src/Psalm/Storage/Assertion/IsNotLooselyEqual.phpUcUl_1src/Psalm/Storage/Assertion/NonEmptyCountable.phpfcf6$?.src/Psalm/Storage/Assertion/IsNotIdentical.phpLcLic4src/Psalm/Storage/Assertion/HasStringArrayAccess.phpc!00src/Psalm/Storage/Assertion/NestedAssertions.php=c=@,src/Psalm/Storage/Assertion/IsEqualIsset.phpc=m&6src/Psalm/Storage/Assertion/IsGreaterThanOrEqualTo.phpKcKr'src/Psalm/Storage/Assertion/InArray.phpc#3src/Psalm/Storage/Assertion/NotNestedAssertions.phpcJ7h4src/Psalm/Storage/Assertion/ArrayKeyDoesNotExist.phpOcOaDW%src/Psalm/Storage/Assertion/Falsy.php$c$ÃQ/src/Psalm/Storage/Assertion/HasAtLeastCount.phpc쎤5src/Psalm/Storage/Assertion/DoesNotHaveExactCount.php<c<ZϤ+src/Psalm/Storage/Assertion/IsCountable.phpcPV)(src/Psalm/Storage/Assertion/IsAClass.phpWcWnar+src/Psalm/Storage/FunctionLikeParameter.phpce¤)src/Psalm/Storage/CustomMetadataTrait.phpc}ѕ!src/Psalm/Storage/FileStorage.phpjcjޫ,src/Psalm/Exception/FileIncludeException.phpiciJݤ2src/Psalm/Exception/CircularReferenceException.phpoco9ػ9src/Psalm/Exception/InvalidClasslikeOverrideException.phpvcvd>5src/Psalm/Exception/UnpopulatedClasslikeException.phpqcq%src/Psalm/Exception/CodeException.phpbcb'$5src/Psalm/Exception/UnresolvableConstantException.phpc%Ф/src/Psalm/Exception/ConfigCreationException.phplcl2#)src/Psalm/Exception/RefactorException.phpfcf>Rh.src/Psalm/Exception/DocblockParseException.phpece^٤6src/Psalm/Exception/ComplicatedExpressionException.phpscs{?u/src/Psalm/Exception/ConfigNotFoundException.phptct=g2src/Psalm/Exception/IncorrectDocblockException.php~c~ޤ6src/Psalm/Exception/InvalidMethodOverrideException.phpscs.src/Psalm/Exception/ScopeAnalysisException.phpkckUg&src/Psalm/PluginRegistrationSocket.php c `Nsrc/Psalm/Report.php~ c~ _Gsrc/Psalm/IssueBuffer.php~c~~*src/Psalm/SourceControl/Git/RemoteInfo.phpc[EФ*src/Psalm/SourceControl/Git/CommitInfo.php c `/'src/Psalm/SourceControl/Git/GitInfo.phpcuYl-src/Psalm/SourceControl/SourceControlInfo.php|c|T.src/Psalm/Plugin/PluginEntryPointInterface.phpc,src/Psalm/Plugin/DynamicTemplateProvider.phpcJ2src/Psalm/Plugin/PluginFileExtensionsInterface.phpc+src/Psalm/Plugin/DynamicFunctionStorage.phpc2,src/Psalm/Plugin/FileExtensionsInterface.php6c6j>src/Psalm/Plugin/EventHandler/AfterClassLikeVisitInterface.phpQcQݷ<src/Psalm/Plugin/EventHandler/AfterFileAnalysisInterface.php!c!o9src/Psalm/Plugin/EventHandler/BeforeAddIssueInterface.phpc١E?src/Psalm/Plugin/EventHandler/PropertyTypeProviderInterface.phpjcjYިAsrc/Psalm/Plugin/EventHandler/AfterClassLikeAnalysisInterface.phpcM78src/Psalm/Plugin/EventHandler/AfterAnalysisInterface.phpcAX:src/Psalm/Plugin/EventHandler/Event/AfterAnalysisEvent.phpcDsrc/Psalm/Plugin/EventHandler/Event/MethodExistenceProviderEvent.phpc&Csrc/Psalm/Plugin/EventHandler/Event/AfterClassLikeAnalysisEvent.php5c5HFsrc/Psalm/Plugin/EventHandler/Event/FunctionExistenceProviderEvent.phpcCKsrc/Psalm/Plugin/EventHandler/Event/DynamicFunctionStorageProviderEvent.phpgcg,e>src/Psalm/Plugin/EventHandler/Event/AfterFileAnalysisEvent.phpcog٤Isrc/Psalm/Plugin/EventHandler/Event/AfterClassLikeExistenceCheckEvent.phpc>ۤKsrc/Psalm/Plugin/EventHandler/Event/AfterEveryFunctionCallAnalysisEvent.phpcvDsrc/Psalm/Plugin/EventHandler/Event/AfterExpressionAnalysisEvent.phpc䑤Gsrc/Psalm/Plugin/EventHandler/Event/FunctionReturnTypeProviderEvent.phpcֳPCsrc/Psalm/Plugin/EventHandler/Event/FunctionParamsProviderEvent.phpc8SlCsrc/Psalm/Plugin/EventHandler/Event/AfterCodebasePopulatedEvent.phpc@$;src/Psalm/Plugin/EventHandler/Event/BeforeAddIssueEvent.phpc AAsrc/Psalm/Plugin/EventHandler/Event/PropertyTypeProviderEvent.phpcKb@src/Psalm/Plugin/EventHandler/Event/AfterClassLikeVisitEvent.phpc; WDsrc/Psalm/Plugin/EventHandler/Event/BeforeStatementAnalysisEvent.php&c&3>src/Psalm/Plugin/EventHandler/Event/StringInterpreterEvent.phpdcdlaGsrc/Psalm/Plugin/EventHandler/Event/PropertyVisibilityProviderEvent.phpc3Fsrc/Psalm/Plugin/EventHandler/Event/AfterFunctionLikeAnalysisEvent.php' c' WEsrc/Psalm/Plugin/EventHandler/Event/MethodVisibilityProviderEvent.php c ֓Csrc/Psalm/Plugin/EventHandler/Event/AfterStatementAnalysisEvent.phpc'-Fsrc/Psalm/Plugin/EventHandler/Event/PropertyExistenceProviderEvent.phpcbA]Fsrc/Psalm/Plugin/EventHandler/Event/AfterFunctionCallAnalysisEvent.phpcfD¤Asrc/Psalm/Plugin/EventHandler/Event/MethodParamsProviderEvent.phpcbqDsrc/Psalm/Plugin/EventHandler/Event/AfterMethodCallAnalysisEvent.php c 1%?src/Psalm/Plugin/EventHandler/Event/BeforeFileAnalysisEvent.phpc焤Esrc/Psalm/Plugin/EventHandler/Event/MethodReturnTypeProviderEvent.php c !<src/Psalm/Plugin/EventHandler/Event/AddRemoveTaintsEvent.php:c:CIsrc/Psalm/Plugin/EventHandler/DynamicFunctionStorageProviderInterface.phpc7ߍBsrc/Psalm/Plugin/EventHandler/AfterExpressionAnalysisInterface.phpccc(uBsrc/Psalm/Plugin/EventHandler/MethodExistenceProviderInterface.phpc'Dsrc/Psalm/Plugin/EventHandler/AfterFunctionLikeAnalysisInterface.phpfcf4`Gsrc/Psalm/Plugin/EventHandler/AfterClassLikeExistenceCheckInterface.phpc<=Bsrc/Psalm/Plugin/EventHandler/AfterMethodCallAnalysisInterface.phpc<=src/Psalm/Plugin/EventHandler/BeforeFileAnalysisInterface.php&c& 54src/Psalm/Plugin/EventHandler/AddTaintsInterface.php7c7hEsrc/Psalm/Plugin/EventHandler/FunctionReturnTypeProviderInterface.phpcs?src/Psalm/Plugin/EventHandler/MethodParamsProviderInterface.phpcʫIsrc/Psalm/Plugin/EventHandler/AfterEveryFunctionCallAnalysisInterface.phpc7tCsrc/Psalm/Plugin/EventHandler/MethodVisibilityProviderInterface.php_c_Esrc/Psalm/Plugin/EventHandler/PropertyVisibilityProviderInterface.phpgcg/Dsrc/Psalm/Plugin/EventHandler/PropertyExistenceProviderInterface.phpc+Ǥ<src/Psalm/Plugin/EventHandler/StringInterpreterInterface.phpWcWn2Dsrc/Psalm/Plugin/EventHandler/FunctionExistenceProviderInterface.phpc^I*Csrc/Psalm/Plugin/EventHandler/MethodReturnTypeProviderInterface.phpcف Asrc/Psalm/Plugin/EventHandler/FunctionParamsProviderInterface.phpcUDsrc/Psalm/Plugin/EventHandler/AfterFunctionCallAnalysisInterface.phpc,7src/Psalm/Plugin/EventHandler/RemoveTaintsInterface.php?c?暤Asrc/Psalm/Plugin/EventHandler/AfterCodebasePopulatedInterface.phpc+m7Bsrc/Psalm/Plugin/EventHandler/BeforeStatementAnalysisInterface.php c V&Asrc/Psalm/Plugin/EventHandler/AfterStatementAnalysisInterface.php]c]&#src/Psalm/Plugin/ArgTypeInferer.phpscsnu$src/Psalm/Plugin/PluginInterface.php>c>Ѓ *src/Psalm/Plugin/RegistrationInterface.phpc%դsrc/Psalm/Plugin/Shepherd.phpc{_src/Psalm/ErrorBaseline.phpe#ce#Qsrc/Psalm/CodeLocation/Raw.phpc4u/src/Psalm/CodeLocation/DocblockTypeLocation.phpcK-src/Psalm/CodeLocation/ParseErrorLocation.phpcVsrc/Psalm/FileSource.phpc=;src/Psalm/Context.phpfcfr}7src/Psalm/CodeLocation.php-c-#;src/Psalm/Aliases.phpcsrc/Psalm/Type/TypeVisitor.phpcʡbsrc/Psalm/Type/TypeNode.phpcY Rsrc/Psalm/Type/Reconciler.phpca#)src/Psalm/Type/Atomic/TNonEmptyString.phpc6 src/Psalm/Type/Atomic/TFalse.phpcm  src/Psalm/Type/Atomic/Scalar.phpcJч,src/Psalm/Type/Atomic/TDependentGetClass.phpcx]*src/Psalm/Type/Atomic/TLowercaseString.phpxcx٤'src/Psalm/Type/Atomic/TLiteralFloat.phpc\~<&src/Psalm/Type/Atomic/TTraitString.phpcT"src/Psalm/Type/Atomic/TClosure.php c 'src/Psalm/Type/Atomic/TSingleLetter.phpck,'src/Psalm/Type/Atomic/DependentType.php.c.RI%src/Psalm/Type/Atomic/TEmptyMixed.phpcFv'src/Psalm/Type/Atomic/TEmptyNumeric.phpqcqO̙6&src/Psalm/Type/Atomic/TEmptyScalar.php-c-a-̤-src/Psalm/Type/Atomic/TTemplateParamClass.phpch(src/Psalm/Type/Atomic/TTemplateParam.phpca> src/Psalm/Type/Atomic/TFloat.phpCcCj6&src/Psalm/Type/Atomic/TClassString.phpcT/src/Psalm/Type/Atomic/TObjectWithProperties.phpc *'src/Psalm/Type/Atomic/TPropertiesOf.php c v2/src/Psalm/Type/Atomic/TTemplatePropertiesOf.php c F#src/Psalm/Type/Atomic/TIterable.phpc Q"src/Psalm/Type/Atomic/TNumeric.phpc-src/Psalm/Type/Atomic/TLiteralClassString.php c :*src/Psalm/Type/Atomic/TTemplateValueOf.phpc4!+src/Psalm/Type/Atomic/TDependentListKey.php}c}@+N src/Psalm/Type/Atomic/TArray.php@c@-Bb&src/Psalm/Type/Atomic/TNamedObject.phpce|;#src/Psalm/Type/Atomic/TIntRange.phpc0src/Psalm/Type/Atomic/TTemplateIndexedAccess.phpc)src/Psalm/Type/Atomic/TCallableObject.php:c:Pc1src/Psalm/Type/Atomic/TAnonymousClassInstance.phpc1Z%src/Psalm/Type/Atomic/TLiteralInt.phpWcW<Ӥ'src/Psalm/Type/Atomic/TCallableList.phpc)src/Psalm/Type/Atomic/TCallableString.phpc&src/Psalm/Type/Atomic/TConditional.phpc,?$)src/Psalm/Type/Atomic/TNonEmptyScalar.php8c8ge$src/Psalm/Type/Atomic/TTypeAlias.phpc>'src/Psalm/Type/Atomic/CallableTrait.php7#c7#?"src/Psalm/Type/Atomic/TValueOf.phpPcP'ݤ;src/Psalm/Type/Atomic/TNonEmptyNonspecificLiteralString.phpc78 src/Psalm/Type/Atomic/TMixed.phpHcHTQsrc/Psalm/Type/Atomic/TBool.php>c>$src/Psalm/Type/Atomic/TInt.php;c;[[%!src/Psalm/Type/Atomic/TString.phpGcG-7src/Psalm/Type/Atomic/TVoid.phpcXx src/Psalm/Type/Atomic/TKeyOf.php; c; src/Psalm/Type/Atomic/TNull.phpncn\ !|0src/Psalm/Type/Atomic/TDependentGetDebugType.phpcQ)src/Psalm/Type/Atomic/TNonFalsyString.phpc;-src/Psalm/Type/Atomic/TCallableKeyedArray.php.c.rQB)src/Psalm/Type/Atomic/TClassStringMap.phpc (src/Psalm/Type/Atomic/TClassConstant.php{c{y]m(src/Psalm/Type/Atomic/TLiteralString.phpcENż%src/Psalm/Type/Atomic/TKeyedArray.phpJcJTCڤ#src/Psalm/Type/Atomic/TEnumCase.php c m,(src/Psalm/Type/Atomic/TCallableArray.phpccmפ(src/Psalm/Type/Atomic/TNonEmptyMixed.phpc src/Psalm/Type/Atomic/TNever.phpcĤ&src/Psalm/Type/Atomic/GenericTrait.phpcV2src/Psalm/Type/Atomic/TNonEmptyLowercaseString.phpmcm(VMa#src/Psalm/Type/Atomic/TResource.phpcaf!src/Psalm/Type/Atomic/TScalar.php8c8MԤ'src/Psalm/Type/Atomic/TNonEmptyList.php\c\lsrc/Psalm/Type/Atomic/TList.php4c4ɤ(src/Psalm/Type/Atomic/TGenericObject.phpcUa+src/Psalm/Type/Atomic/TDependentGetType.php\c\ w$src/Psalm/Type/Atomic/TIntMaskOf.phpc0src/Psalm/Type/Atomic/TNonspecificLiteralInt.phpCcCil(src/Psalm/Type/Atomic/TNumericString.phpc;m(src/Psalm/Type/Atomic/TNonEmptyArray.phpcg)src/Psalm/Type/Atomic/TClosedResource.phpcyoJ#src/Psalm/Type/Atomic/TCallable.phpMcM3src/Psalm/Type/Atomic/TNonspecificLiteralString.phpces,!src/Psalm/Type/Atomic/TObject.phpciY̤#src/Psalm/Type/Atomic/TArrayKey.phpc".src/Psalm/Type/Atomic/HasIntersectionTrait.phpc}9(src/Psalm/Type/Atomic/TTemplateKeyOf.phpc&ɤsrc/Psalm/Type/Atomic/TTrue.phpc݆"src/Psalm/Type/Atomic/TIntMask.phpc̫nsrc/Psalm/Type/MutableUnion.php8c84!src/Psalm/Type/TaintKindGroup.phpcsrc/Psalm/Type/UnionTrait.phpבcבB src/Psalm/Type/TaintKind.phpc\wksrc/Psalm/Type/Atomic.phpdcdJ/5G%src/Psalm/Type/MutableTypeVisitor.phpcOsrc/Psalm/Type/Union.phpj$cj$pJsrc/Psalm/Config.phpf@cf@sgsrc/Psalm/FileManipulation.phpcuN| &src/Psalm/Node/VirtualNullableType.phpc#.Bsrc/Psalm/Node/VirtualName.phpci ʤ"src/Psalm/Node/VirtualMatchArm.phpc?1src/Psalm/Node/Expr/BinaryOp/VirtualBooleanOr.phpc)VP-src/Psalm/Node/Expr/BinaryOp/VirtualEqual.phpcD,src/Psalm/Node/Expr/BinaryOp/VirtualPlus.phpcNQ Z0src/Psalm/Node/Expr/BinaryOp/VirtualNotEqual.phpc1j 6src/Psalm/Node/Expr/BinaryOp/VirtualSmallerOrEqual.phpch}1src/Psalm/Node/Expr/BinaryOp/VirtualBitwiseOr.phpc:٤+src/Psalm/Node/Expr/BinaryOp/VirtualPow.phpc(̤.src/Psalm/Node/Expr/BinaryOp/VirtualConcat.phpc+src/Psalm/Node/Expr/BinaryOp/VirtualDiv.phpcD5UF4src/Psalm/Node/Expr/BinaryOp/VirtualNotIdentical.phpcBJ2src/Psalm/Node/Expr/BinaryOp/VirtualLogicalAnd.phpc: /src/Psalm/Node/Expr/BinaryOp/VirtualGreater.phpc2src/Psalm/Node/Expr/BinaryOp/VirtualShiftRight.phpc )2src/Psalm/Node/Expr/BinaryOp/VirtualLogicalXor.phpcx11src/Psalm/Node/Expr/VirtualNullsafeMethodCall.phpcm$src/Psalm/Node/Expr/VirtualError.phpc^n)src/Psalm/Node/Expr/VirtualClosureUse.phpc$src/Psalm/Node/Expr/VirtualEmpty.phpcXc,src/Psalm/Node/Expr/VirtualArrayDimFetch.phpc-9(src/Psalm/Node/Expr/VirtualAssignRef.phpcޤ,src/Psalm/Node/Expr/VirtualErrorSuppress.phpc42src/Psalm/Node/Expr/AssignOp/VirtualBitwiseXor.phpc*[+.+src/Psalm/Node/Expr/AssignOp/VirtualMul.phpcԶ+src/Psalm/Node/Expr/AssignOp/VirtualMod.phpc_W1Ϥ0src/Psalm/Node/Expr/AssignOp/VirtualCoalesce.phpce-src/Psalm/Node/Expr/AssignOp/VirtualMinus.phpc.2src/Psalm/Node/Expr/AssignOp/VirtualBitwiseAnd.phpco'1src/Psalm/Node/Expr/AssignOp/VirtualShiftLeft.phpc ,src/Psalm/Node/Expr/AssignOp/VirtualPlus.phpc07X1src/Psalm/Node/Expr/AssignOp/VirtualBitwiseOr.phpc[+src/Psalm/Node/Expr/AssignOp/VirtualPow.phpcP.src/Psalm/Node/Expr/AssignOp/VirtualConcat.phpcw+src/Psalm/Node/Expr/AssignOp/VirtualDiv.phpc2src/Psalm/Node/Expr/AssignOp/VirtualShiftRight.phpcc&src/Psalm/Node/Expr/VirtualInclude.phpcJ;")src/Psalm/Node/Expr/Cast/VirtualArray.phpc I)src/Psalm/Node/Expr/Cast/VirtualUnset.phpcˤ'src/Psalm/Node/Expr/Cast/VirtualInt.phpcS2]!(src/Psalm/Node/Expr/Cast/VirtualBool.phpc*src/Psalm/Node/Expr/Cast/VirtualObject.phpc t*src/Psalm/Node/Expr/Cast/VirtualDouble.phpck*src/Psalm/Node/Expr/Cast/VirtualString.phpc;j$src/Psalm/Node/Expr/VirtualPrint.phpcF6$src/Psalm/Node/Expr/VirtualClone.phpc.src/Psalm/Node/Expr/VirtualClassConstFetch.phpcʚ#src/Psalm/Node/Expr/VirtualExit.phpcQn,src/Psalm/Node/Expr/VirtualArrowFunction.phpc,&src/Psalm/Node/Expr/VirtualClosure.phpcUU,src/Psalm/Node/Expr/VirtualPropertyFetch.phpck'src/Psalm/Node/Name/VirtualRelative.phpcd-src/Psalm/Node/Name/VirtualFullyQualified.phpch Ċsrc/Psalm/Node/VirtualConst.phpci/src/Psalm/Node/Stmt/VirtualPropertyProperty.phpcrxZ"src/Psalm/Node/Stmt/VirtualFor.phpcT2$src/Psalm/Node/Stmt/VirtualClass.phpc2docs/running_psalm/issues/LessSpecificImplementedReturnType.mdc8(R;docs/running_psalm/issues/InvalidPropertyAssignmentValue.mdcX3.docs/running_psalm/issues/NullPropertyFetch.md{c{=]X.docs/running_psalm/issues/MutableDependency.mdPcPv0docs/running_psalm/issues/InvalidParamDefault.mdc}-docs/running_psalm/issues/IfThisIsMismatch.md7c7a*docs/running_psalm/issues/InvalidParent.mdcӤ,docs/running_psalm/issues/StringIncrement.mdc$<docs/running_psalm/issues/UndefinedThisPropertyAssignment.mdcG_}1docs/running_psalm/issues/PossiblyNullArgument.mdc;Y41docs/running_psalm/issues/PossiblyFalseOperand.mdc״1docs/running_psalm/issues/ImpureStaticProperty.md7c7U74docs/running_psalm/issues/NullableReturnStatement.mdc 4docs/running_psalm/issues/MixedInferredReturnType.mdc>4docs/running_psalm/issues/OverriddenFinalConstant.mdcΌv-docs/running_psalm/issues/InvalidAttribute.md+c+)֫ɤ8docs/running_psalm/issues/UndefinedPropertyAssignment.mdcuȐ.docs/running_psalm/issues/UnusedConstructor.mdc3n: 6docs/running_psalm/issues/DocblockTypeContradiction.mdycy\0docs/running_psalm/issues/UnresolvableInclude.mdc=docs/running_psalm/issues/InvalidTraversableImplementation.md>c>iM0docs/running_psalm/issues/PossiblyNullOperand.mdc פ+docs/running_psalm/issues/UnusedProperty.mdc629/docs/running_psalm/issues/ImpureFunctionCall.md@c@U/docs/running_psalm/issues/AbstractMethodCall.mdcW8Τ4docs/running_psalm/issues/UnhandledMatchCondition.mdWcW94docs/running_psalm/issues/PossiblyNullArrayOffset.mdc1@docs/running_psalm/issues/RedundantConditionGivenDocblockType.md{c{tޤ+docs/running_psalm/issues/UndefinedClass.mdhch /docs/running_psalm/issues/MissingConstructor.mdcKX4docs/running_psalm/issues/PossiblyNullArrayAccess.mdc=.docs/running_psalm/issues/MissingReturnType.mdcLƤ)docs/running_psalm/issues/MixedOperand.mdWcWT ,docs/running_psalm/issues/DeprecatedTrait.md0c0Xz3docs/running_psalm/issues/LessSpecificReturnType.mdcL6e3docs/running_psalm/issues/OverriddenMethodAccess.mdcn8docs/running_psalm/issues/PossiblyInvalidFunctionCall.mdcJj/docs/running_psalm/issues/RedundantCondition.mdcaICdocs/running_psalm/issues/PossiblyInvalidPropertyAssignmentValue.md5c5Z,docs/running_psalm/issues/ComplexFunction.mdici{Τ,docs/running_psalm/issues/NullArrayAccess.mdxcx6Mx14docs/running_psalm/issues/MixedReturnTypeCoercion.mdcLjAdocs/running_psalm/issues/RedundantPropertyInitializationCheck.md3c3rA7docs/running_psalm/issues/PossiblyInvalidArrayAccess.mdcci,7docs/running_psalm/issues/PossiblyInvalidArrayOffset.mdc(;%+docs/running_psalm/issues/UndefinedTrace.mdc%N,docs/running_psalm/issues/TaintedCallable.md4c49Qפ0docs/running_psalm/issues/MissingDocblockType.mdcOf3docs/running_psalm/issues/UndefinedDocblockClass.mdc^1docs/running_psalm/issues/InvalidPropertyFetch.mdc`&(docs/running_psalm/issues/TaintedLdap.mdcֵ)docs/running_psalm/issues/InvalidClass.mdbcbn;+docs/running_psalm/issues/DuplicateParam.mdc ,docs/running_psalm/issues/UnevaluatedCode.mdcߒ6docs/running_psalm/issues/InvalidFalsableReturnType.mdc-docs/running_psalm/issues/MixedArrayOffset.mdcTCdocs/running_psalm/issues/RedundantFunctionCallGivenDocblockType.mdece(90docs/running_psalm/issues/InvalidFunctionCall.mdxcxѶs/docs/running_psalm/issues/MixedPropertyFetch.mdcFF.docs/running_psalm/issues/UndefinedFunction.mdfcfT*docs/running_psalm/issues/MixedArgument.mdcfD,docs/running_psalm/issues/UndefinedMethod.mdmcm^/docs/running_psalm/issues/DeprecatedConstant.mdcdnj5docs/running_psalm/issues/InvalidDocblockParamName.md c $\/docs/running_psalm/issues/DeprecatedProperty.mdcG`7docs/running_psalm/issues/PossiblyInvalidDocblockTag.mdcE)6docs/running_psalm/issues/PossiblyNullPropertyFetch.mdcuŤ<docs/running_psalm/issues/MismatchingDocblockPropertyType.mdcN/docs/running_psalm/issues/UnusedForeachValue.mdcW'docs/running_psalm/issues/MixedClone.mdxcx;ɮ,docs/running_psalm/issues/InvalidArgument.mdzczɤ/docs/running_psalm/issues/InvalidStringClass.mdc*q1docs/running_psalm/issues/ArgumentTypeCoercion.md]c]?&^6docs/running_psalm/issues/PossiblyInvalidMethodCall.mdc~ 6docs/running_psalm/issues/UnsupportedReferenceUsage.mdcXd\>1docs/running_psalm/issues/UndefinedMagicMethod.mdc.docs/running_psalm/issues/NonStaticSelfCall.mdc̄)docs/running_psalm/issues/NullIterator.md^c^Vj-docs/running_psalm/issues/NullFunctionCall.mdscsY4docs/running_psalm/issues/InvalidStaticInvocation.mdcAĤ<docs/running_psalm/issues/PossiblyUndefinedIntArrayOffset.mdcy7-docs/running_psalm/issues/NoEnumProperties.mdc0lѤ+docs/running_psalm/issues/InternalMethod.mdc3docs/running_psalm/issues/UndefinedPropertyFetch.mdc~h1docs/running_psalm/issues/PossiblyUnusedMethod.mdbcb`4docs/running_psalm/issues/PossiblyInvalidIterator.mdcD13docs/running_psalm/issues/PossiblyInvalidOperand.mdcL/-docs/running_psalm/issues/EmptyArrayAccess.mdxcx-B4docs/running_psalm/issues/PossiblyInvalidArgument.mdc/docs/running_psalm/issues/InaccessibleMethod.mdcwb.docs/running_psalm/issues/DuplicateConstant.mdcB8docs/running_psalm/issues/LessSpecificReturnStatement.mdc16docs/running_psalm/issues/InaccessibleClassConstant.mdc 8docs/running_psalm/issues/UndefinedMagicPropertyFetch.mdc(docs/running_psalm/issues/PluginIssue.md*c*xͤ1docs/running_psalm/issues/InvalidNamedArgument.mdcM*docs/running_psalm/issues/ForbiddenCode.mdc(g1docs/running_psalm/issues/ParadoxicalCondition.mdc. 8docs/running_psalm/issues/OverriddenInterfaceConstant.mdcN.docs/running_psalm/issues/DuplicateArrayKey.mdc_2docs/running_psalm/issues/AbstractInstantiation.mdc!Ȥ0docs/running_psalm/issues/UnsafeInstantiation.md=c=*docs/running_psalm/issues/RedundantCast.mdc /12docs/running_psalm/issues/TaintedTextWithQuotes.mdc;-docs/running_psalm/issues/UnusedMethodCall.mdc0T3docs/running_psalm/issues/InvalidPassByReference.mdcp0docs/running_psalm/issues/UnusedPsalmSuppress.mdcW0/docs/running_psalm/issues/DeprecatedFunction.md2c2/%B2docs/running_psalm/issues/RedundantFunctionCall.mdc+docs/running_psalm/issues/TaintedInclude.mdc#0docs/running_psalm/issues/ImpurePropertyFetch.mdcRV3docs/running_psalm/issues/TypeDoesNotContainNull.mdc:^6docs/running_psalm/issues/InvalidPropertyAssignment.mdcD6docs/running_psalm/issues/PossiblyUnusedReturnValue.md c 0 $docs/running_psalm/issues/NoValue.mdBcBI)docs/running_psalm/issues/InvalidScope.mdacal#1docs/running_psalm/issues/PossiblyNullIterator.mdcia)2docs/running_psalm/issues/MissingThrowsDocblock.mdc *">docs/running_psalm/issues/PossiblyInvalidPropertyAssignment.md`c`bݤ9docs/running_psalm/issues/TraitMethodSignatureMismatch.mdc,,docs/running_psalm/issues/MixedAssignment.mdc=&docs/running_psalm/issues/CheckType.md{c{WRo8docs/running_psalm/issues/UnimplementedAbstractMethod.mdc+a)docs/running_psalm/issues/TaintedShell.mdcQ3docs/running_psalm/issues/InvalidReturnStatement.mdc6docs/running_psalm/issues/InvalidNullableReturnType.mdcDŤ,docs/running_psalm/issues/InvalidToString.mdc۱3docs/running_psalm/issues/NullPropertyAssignment.mdycy p9docs/running_psalm/issues/MismatchingDocblockParamType.mdcX(docs/running_psalm/issues/MissingFile.mdcH3G(docs/running_psalm/issues/UnusedClass.mdcHYڤ(docs/running_psalm/issues/UnusedParam.mdpcp0docs/running_psalm/issues/PossiblyUnusedParam.mdc6ˤ1docs/running_psalm/issues/InaccessibleProperty.mdc&ؤ9docs/running_psalm/issues/PossiblyInvalidPropertyFetch.mdYcYϾӤ1docs/running_psalm/issues/MissingTemplateParam.mdc:4docs/running_psalm/issues/FalsableReturnStatement.mdcY/8docs/running_psalm/issues/MixedStringOffsetAssignment.mdc4docs/running_psalm/issues/NamedArgumentNotAllowed.mdc8Ѥ6docs/running_psalm/issues/PossiblyUndefinedVariable.mdc 1docs/running_psalm/issues/UnresolvableConstant.mdc0ۤ.docs/running_psalm/issues/CircularReference.mdcp(docs/running_psalm/issues/ConfigIssue.mdc=docs/running_psalm/issues/UndefinedMagicPropertyAssignment.md3c3734docs/running_psalm/issues/MethodSignatureMismatch.md'c'd:5docs/running_psalm/issues/PossiblyNullFunctionCall.mdcR>'<docs/running_psalm/issues/PossiblyUndefinedGlobalVariable.mdctf@/docs/running_psalm/issues/InvalidArrayAccess.mdc[H9docs/running_psalm/issues/ImplementedParamTypeMismatch.md c 6J5docs/running_psalm/issues/NonInvariantPropertyType.mdNcN4-docs/running_psalm/issues/InternalProperty.mdcy6Q,docs/running_psalm/issues/DeprecatedClass.md"c"2C3docs/running_psalm/issues/DuplicateEnumCaseValue.mdRcRhqA/docs/running_psalm/issues/InvalidArrayOffset.mdcyyڤ*docs/running_psalm/issues/NullReference.mdmcmߍ&;docs/running_psalm/issues/RedundantCastGivenDocblockType.mdc$6v9docs/running_psalm/issues/UnimplementedInterfaceMethod.mdc_פ5docs/running_psalm/issues/OverriddenPropertyAccess.md c 77docs/running_psalm/issues/PossibleRawObjectIteration.mdce3docs/running_psalm/issues/PossiblyFalseReference.mdcW\]42docs/running_psalm/issues/PossiblyFalseIterator.mdcI/docs/running_psalm/issues/RawObjectIteration.mdmcm𒮤7docs/running_psalm/issues/MissingImmutableAnnotation.mdc>մz@docs/running_psalm/issues/PossiblyNullPropertyAssignmentValue.md$c$-}7docs/running_psalm/issues/ConstantDeclarationInTrait.mdc9[0docs/running_psalm/issues/MissingPropertyType.mdc`1docs/running_psalm/issues/MixedReturnStatement.mdcDm*docs/running_psalm/issues/TaintedCustom.mdhch%*docs/running_psalm/issues/ComplexMethod.mdcccX5docs/running_psalm/issues/InvalidClassConstantType.mdIcI/L)docs/running_psalm/issues/InvalidCatch.mdc,.docs/running_psalm/issues/ParamNameMismatch.md c 3)docs/running_psalm/issues/NullArgument.mdcϥŤ,docs/running_psalm/issues/MixedMethodCall.mdfcfx!/docs/running_psalm/issues/UndefinedInterface.mdcg@vV&docs/running_psalm/issues/RiskyCast.md3c3;*docs/running_psalm/issues/TaintedCookie.mdc8docs/running_psalm/issues/PossiblyNullArrayAssignment.mdcǤ1docs/running_psalm/issues/ImpureStaticVariable.mdc .docs/running_psalm/issues/InvalidEnumMethod.mdcŇѤ*docs/running_psalm/issues/InternalClass.mdcዂ7docs/running_psalm/issues/UndefinedThisPropertyFetch.mdcGvkAdocs/running_psalm/issues/PossiblyFalsePropertyAssignmentValue.md3c3f큤?docs/running_psalm/issues/PossiblyUndefinedStringArrayOffset.md)c)V0-docs/running_psalm/issues/ImpureMethodCall.mdzczw1w2docs/running_psalm/issues/PossiblyFalseArgument.mdTcTM2docs/running_psalm/issues/NoInterfaceProperties.md-c-/4docs/running_psalm/issues/UndefinedGlobalVariable.mdncns7docs/running_psalm/issues/UnsafeGenericInstantiation.md5 c5 ZNj>4docs/running_psalm/issues/UndefinedAttributeClass.mdc]2/docs/running_psalm/issues/TaintedUnserialize.mdcc-docs/running_psalm/issues/AssignmentToVoid.mdcPɤ.docs/running_psalm/issues/InvalidMethodCall.mdtctlq (docs/running_psalm/issues/TaintedHtml.mdgcgc:docs/running_psalm/issues/ImplementedReturnTypeMismatch.mdcO3docs/running_psalm/issues/InterfaceInstantiation.mdcZ.docs/running_psalm/issues/UndefinedVariable.mdc_5docs/running_psalm/issues/UndefinedInterfaceMethod.mdc6ܬ>docs/running_psalm/issues/ReferenceReusedFromConfusingScope.mdc+h/docs/running_psalm/issues/InvalidExtendClass.mdc0'R5docs/running_psalm/issues/UnnecessaryVarAnnotation.mdcuf+docs/running_psalm/issues/UndefinedTrait.mdqcqݹͤ'docs/running_psalm/issues/ParseError.mdcuAf=docs/running_psalm/issues/NonInvariantDocblockPropertyType.mdc 4docs/running_psalm/issues/PossiblyUndefinedMethod.mdc,docs/running_psalm/issues/NullArrayOffset.mdc%S3docs/running_psalm/issues/InvalidArrayAssignment.md}c}Q1docs/running_psalm/issues/PossiblyInvalidClone.mdcd2docs/running_psalm/issues/TooManyTemplateParams.mdEcELQڤ:docs/running_psalm/issues/MismatchingDocblockReturnType.mdcB s,docs/running_psalm/issues/DuplicateMethod.mdc)5docs/running_psalm/issues/ImpurePropertyAssignment.mdca3")docs/running_psalm/issues/ReservedWord.md|c|>)docs/running_psalm/issues/UnusedMethod.mdc:V9docs/running_psalm/issues/ReferenceConstraintViolation.mdc sϤ*docs/running_psalm/issues/InvalidGlobal.mdZcZ.docs/running_psalm/issues/InvalidTypeImport.mdcKAdocs/running_psalm/issues/MethodSignatureMustProvideReturnType.mdc&)docs/running_psalm/issues/FalseOperand.mdcy4docs/running_psalm/issues/MixedPropertyAssignment.mdcK`2docs/running_psalm/issues/UnrecognizedStatement.mdcC4docs/running_psalm/issues/MissingClosureParamType.mdc"&f-docs/running_psalm/issues/DeprecatedMethod.mdccc^ӂ;docs/running_psalm/issues/InvalidConstantAssignmentValue.mdc3docs/running_psalm/issues/UnrecognizedExpression.mdccB+docs/running_psalm/issues/DuplicateClass.mdc+docs/running_psalm/issues/UnusedVariable.md:c:b?docs/running_psalm/issues/ImplementationRequirementViolation.mdcդ:docs/running_psalm/issues/LessSpecificClassConstantType.mdKcKi7a^"docs/running_psalm/issues/Trace.mdcx1docs/running_psalm/issues/PropertyTypeCoercion.mdc .docs/running_psalm/issues/TaintedUserSecret.mdcZ0docs/running_psalm/issues/PossiblyInvalidCast.mdcS)docs/running_psalm/issues/InvalidClone.mdzczx&%3docs/running_psalm/issues/TypeDoesNotContainType.mdcm(docs/running_psalm/issues/NullOperand.mdcp$/docs/running_psalm/issues/UnusedClosureParam.mdcz<6docs/running_psalm/issues/MixedPropertyTypeCoercion.md2c29A3docs/running_psalm/issues/InvalidLiteralArgument.mdcbgK2docs/running_psalm/issues/InvalidScalarArgument.mdca 1docs/running_psalm/issues/InvalidTemplateParam.mdtct|K))docs/running_psalm/issues/InvalidThrow.mdc)Ԥ8docs/running_psalm/issues/ImpureByReferenceAssignment.mdcӬF*docs/running_psalm/issues/TaintedHeader.mdc &9docs/running_psalm/issues/ConstructorSignatureMismatch.mdc =docs/running_psalm/issues/MoreSpecificImplementedParamType.mdcYt9docs/running_psalm/issues/PossiblyUndefinedArrayOffset.mdMcM֚]l1docs/running_psalm/issues/ImplicitToStringCast.mdtct!;docs/running_psalm/issues/PossiblyInvalidArrayAssignment.mdc,-docs/running_psalm/issues/MixedArrayAccess.mdcRࣤ,docs/running_psalm/issues/InvalidDocblock.mdtct%Fz-docs/running_psalm/issues/TooManyArguments.mdc4>docs/running_psalm/issues/MethodSignatureMustOmitReturnType.mdc#0docs/running_psalm/issues/ContinueOutsideLoop.mdcO9Y֤(docs/running_psalm/issues/TaintedFile.mdcȤ.docs/running_psalm/issues/UndefinedConstant.mdncny}-docs/running_psalm/issues/LoopInvalidation.mdc|.docs/running_psalm/issues/MixedFunctionCall.mdc$0docs/running_psalm/issues/TaintedSystemSecret.mdcG@1docs/running_psalm/issues/InvalidEnumCaseValue.mdYcYxw6docs/running_psalm/issues/RedundantIdentityWithTrue.md9c9q`3docs/running_psalm/issues/MixedArrayTypeCoercion.md2c2{2docs/running_psalm/issues/PossiblyNullReference.mdc9n(67docs/running_psalm/issues/UncaughtThrowInGlobalScope.mdc^0docs/running_psalm/issues/UnusedBaselineEntry.mdcl_2docs/running_psalm/issues/UninitializedProperty.mdc }9docs/running_psalm/issues/AmbiguousConstantInheritance.md(c( ;f (docs/running_psalm/issues/TaintedSSRF.mdOcO8.docs/running_psalm/issues/MissingDependency.mdcC+docs/running_psalm/issues/ParentNotFound.mdc'docs/running_psalm/issues/TaintedSql.mdycy(docs/running_psalm/issues/TaintedEval.mdAcA<6docs/running_psalm/issues/MixedArgumentTypeCoercion.md&c&>@#.docs/running_psalm/issues/UnusedReturnValue.md4c43Yۤ+docs/running_psalm/issues/InvalidOperand.mdcjVz1docs/running_psalm/issues/MixedArrayAssignment.mdc;l(docs/running_psalm/issues/InvalidCast.mdcM8docs/running_psalm/issues/PropertyNotSetInConstructor.mdcwä-docs/running_psalm/issues/MissingParamType.mdc_@d3docs/running_psalm/issues/MoreSpecificReturnType.mdMcM+&3docs/running_psalm/issues/InvalidEnumBackingType.mdc8K;docs/running_psalm/issues/ConflictingReferenceConstraint.mdc -phar-versions.phpc$~assets/psalm-phar/dot-gitignorecP sTassets/psalm-phar/README.mdncn+Eassets/psalm-phar/composer.jsonc+.box/vendor/autoload.phpcs$.box/vendor/composer/ClassLoader.php>c>5Ky*.box/vendor/composer/autoload_classmap.php, c, ӽǤ(.box/vendor/composer/autoload_static.phpKcK?&.box/vendor/composer/autoload_real.phpcyi\.box/vendor/composer/LICENSE.c. &.box/vendor/composer/autoload_psr4.php6c60Ӥ*.box/vendor/composer/semver/src/Semver.phpcׯ1.box/vendor/composer/semver/src/VersionParser.php9c9Wz 9.box/vendor/composer/semver/src/Constraint/Constraint.php'&c'&`>.box/vendor/composer/semver/src/Constraint/MultiConstraint.php~c~5[eB.box/vendor/composer/semver/src/Constraint/ConstraintInterface.phpcwQ..box/vendor/composer/semver/src/Comparator.phpucu 74,.box/vendor/composer/autoload_namespaces.phpct!פ.box/src/Terminal.php c %V.box/src/Printer.php c )8AV".box/src/IsPhpVersionFulfilled.phpc!83".box/src/RequirementCollection.phpcWb?.box/src/Requirement.phpmcmB.box/src/IsFulfilled.phpvcv%*H.box/src/Checker.phpc)W>.box/src/IO.php c [l%!.box/src/IsExtensionFulfilled.phpvcv'0Ҥ.box/.requirements.phpdcd.box/bin/check-requirements.phpc^ʨ * @template-implements ArrayAccess */ class SplDoublyLinkedList implements Iterator, Countable, ArrayAccess, Serializable { public function __construct() {} /** * Add/insert a new value at the specified index * * @param int $index The index where the new value is to be inserted. * @param TValue $newval The new value for the index. * @return void * * @link https://php.net/spldoublylinkedlist.add * @since 5.5.0 */ public function add($index, $newval) {} /** * Pops a node from the end of the doubly linked list * @link https://php.net/manual/en/spldoublylinkedlist.pop.php * * @return TValue The value of the popped node. * * @since 5.3.0 */ public function pop() {} /** * Shifts a node from the beginning of the doubly linked list * @link https://php.net/manual/en/spldoublylinkedlist.shift.php * * @return TValue The value of the shifted node. * * @since 5.3.0 */ public function shift() {} /** * Pushes an element at the end of the doubly linked list * @link https://php.net/manual/en/spldoublylinkedlist.push.php * * @param TValue $value The value to push. * @return void * * @since 5.3.0 */ public function push($value) {} /** * Prepends the doubly linked list with an element * @link https://php.net/manual/en/spldoublylinkedlist.unshift.php * * @param TValue $value The value to unshift. * @return void * * @since 5.3.0 */ public function unshift($value) {} /** * Peeks at the node from the end of the doubly linked list * @link https://php.net/manual/en/spldoublylinkedlist.top.php * * @return TValue The value of the last node. * * @since 5.3.0 */ public function top() {} /** * Peeks at the node from the beginning of the doubly linked list * @link https://php.net/manual/en/spldoublylinkedlist.bottom.php * * @return TValue The value of the first node. * * @since 5.3.0 */ public function bottom() {} /** * Counts the number of elements in the doubly linked list. * @link https://php.net/manual/en/spldoublylinkedlist.count.php * * @return int the number of elements in the doubly linked list. * * @since 5.3.0 */ public function count() {} /** * Checks whether the doubly linked list is empty. * @link https://php.net/manual/en/spldoublylinkedlist.isempty.php * * @return bool whether the doubly linked list is empty. * * @since 5.3.0 */ public function isEmpty() {} /** * Returns whether the requested $index exists * @link https://php.net/manual/en/spldoublylinkedlist.offsetexists.php * * @param int $index The index being checked. * @return bool true if the requested index exists, otherwise false * * @since 5.3.0 */ public function offsetExists($index) {} /** * Returns the value at the specified $index * @link https://php.net/manual/en/spldoublylinkedlist.offsetget.php * * @param int $index The index with the value. * @return TValue The value at the specified index. * * @since 5.3.0 */ public function offsetGet($index) {} /** * Sets the value at the specified $index to $newval * @link https://php.net/manual/en/spldoublylinkedlist.offsetset.php * * @param int $index The index being set. * @param TValue $newval The new value for the index. * @return void * * @since 5.3.0 */ public function offsetSet($index, $newval) {} /** * Unsets the value at the specified $index * @link https://php.net/manual/en/spldoublylinkedlist.offsetunset.php * * @param int $index The index being unset. * @return void * * @since 5.3.0 */ public function offsetUnset($index) {} /** * Return current array entry * @link https://php.net/manual/en/spldoublylinkedlist.current.php * * @return TValue The current node value. * * @since 5.3.0 */ public function current() {} /** * Return current node index * @link https://php.net/manual/en/spldoublylinkedlist.key.php * * @return int The current node index. * * @since 5.3.0 */ public function key() {} } /** * The SplFixedArray class provides the main functionalities of array. * The main differences between a SplFixedArray and a normal PHP array is that * the SplFixedArray is of fixed length and allows only integers within the range as indexes. * The advantage is that it uses less memory than a standard array. * * @link https://php.net/manual/en/class.splfixedarray.php * * @template TValue * @template-implements ArrayAccess * @template-implements Iterator */ class SplFixedArray implements Iterator, ArrayAccess, Countable { /** * Constructs a new fixed array * * Initializes a fixed array with a number of NULL values equal to size. * @link https://php.net/manual/en/splfixedarray.construct.php * * @param int $size The size of the fixed array. This expects a number between 0 and PHP_INT_MAX. * @since 5.3.0 */ public function __construct(int $size = 0) {} /** * Import a PHP array in a new SplFixedArray instance * @link https://php.net/manual/en/splfixedarray.fromarray.php * * @template TInValue * @param array $array The array to import * @param bool $save_indexes [optional] Try to save the numeric indexes used in the original array. * * @return SplFixedArray Instance of SplFixedArray containing the array content * @since 5.3.0 */ public static function fromArray(array $array, bool $save_indexes = true): SplFixedArray {} /** * Returns a PHP array from the fixed array * @link https://php.net/manual/en/splfixedarray.toarray.php * * @return array * @since 5.3.0 */ public function toArray(): array {} /** * Returns the size of the array. * @link https://php.net/manual/en/splfixedarray.getsize.php * * @return int The size of the array * @see SplFixedArray::count() * * @since 5.3.0 */ public function getSize(): int {} /** * Returns the size of the array. * @link https://php.net/manual/en/splfixedarray.count.php * * @return int The size of the array * * @since 5.3.0 */ public function count(): int {} /** * Rewind the iterator back to the start * @link https://php.net/manual/en/splfixedarray.rewind.php * * @return void * * @since 5.3.0 */ public function rewind(): void {} /** * Check whether the array contains more elements * @link https://php.net/manual/en/splfixedarray.valid.php * * @return bool true if the array contains any more elements, false otherwise. * * @since 5.3.0 */ public function valid(): bool {} /** * Returns current array index * @link https://php.net/manual/en/splfixedarray.key.php * * @return int The current array index * * @since 5.3.0 */ public function key(): int {} /** * Returns the current array entry * @link https://php.net/manual/en/splfixedarray.current.php * * @return TValue The current element value * * @since 5.3.0 */ public function current() {} /** * Move to the next entry * @link https://php.net/manual/en/splfixedarray.next.php * * @return void * * @since 5.3.0 */ public function next(): void {} /** * Returns whether the specified index exists * @link https://php.net/manual/en/splfixedarray.offsetexists.php * * @param int $index The index being checked. * @return bool true if the requested index exists, and false otherwise. * * @since 5.3.0 */ public function offsetExists(int $index): bool {} /** * Sets a new value at a specified index * @link https://php.net/manual/en/splfixedarray.offsetset.php * * @param int $index The index being sent. * @param TValue $newval The new value for the index * @return void * * @since 5.3.0 */ public function offsetSet(int $index, $newval): void {} /** * Unsets the value at the specified $index * @link https://php.net/manual/en/splfixedarray.offsetunset.php * * @param int $index The index being unset * @return void * * @since 5.3.0 */ public function offsetUnset(int $index): void {} /** * Returns the value at the specified index * @link https://php.net/manual/en/splfixedarray.offsetget.php * * @param int $index The index with the value * @return TValue The value at the specified index * * @since 5.3.0 */ public function offsetGet(int $index) {} } /** * The SplStack class provides the main functionalities of a stack implemented using a doubly linked list. * @link https://php.net/manual/en/class.splstack.php * * @template TValue * @template-extends SplDoublyLinkedList */ class SplStack extends SplDoublyLinkedList { } /** * The SplQueue class provides the main functionalities of a queue implemented using a doubly linked list. * @link https://php.net/manual/en/class.splqueue.php * * @template TValue * @template-extends SplDoublyLinkedList */ class SplQueue extends SplDoublyLinkedList { /** * Adds an element to the queue. * @link https://php.net/manual/en/splqueue.enqueue.php * * @param TValue $value The value to enqueue. * @return void * * @since 5.3.0 */ public function enqueue($value) {} /** * Dequeues a node from the queue * @link https://php.net/manual/en/splqueue.dequeue.php * * @return TValue The value of the dequeued node. * * @since 5.3.0 */ public function dequeue() {} } /** * The SplHeap class provides the main functionalities of a Heap. * @link https://php.net/manual/en/class.splheap.php * * @template TValue * @template-implements Iterator */ abstract class SplHeap implements Iterator, Countable { public function __construct() {} /** * Compare elements in order to place them correctly in the heap while sifting up * @link https://php.net/manual/en/splheap.compare.php * * @param TValue $value1 The value of the first node being compared. * @param TValue $value2 The value of the second node being compared. * @return int Positive integer if value1 is greater than value2, 0 if they are equal, negative integer otherwise. * * @since 5.3.0 */ protected abstract function compare($value1, $value2): int; /** * Counts the number of elements in the heap * @link https://php.net/manual/en/splheap.count.php * * @return int The number of elements in the heap. * * @since 5.3.0 */ public function count(): int {} /** * Get the current datastructure node. * @link https://php.net/manual/en/splheap.current.php * * @return TValue The current node value * * @since 5.3.0 */ public function current() {} /** * Extracts a node from top of the heap and sift up * @link https://php.net/manual/en/splheap.extract.php * * @return TValue The current node value * * @since 5.3.0 */ public function extract() {} /** * Inserts an element in the heap by sifting it up * @link https://php.net/manual/en/splheap.insert.php * * @param TValue $value The value to insert. * @return void * * @since 5.3.0 */ public function insert($value): void {} /** * Tells if the heap is in a corrupted state * @link https://php.net/manual/en/splheap.isCorrupted.php * * @return bool true if the heap is corrupted, false otherwise. * * @since 7.0.0 */ public function isCorrupted(): bool {} /** * Checks whether the heap is empty * @link https://php.net/manual/en/splheap.isEmpty.php * * @return bool Whether the heap is empty * * @since 5.3.0 */ public function isEmpty(): bool {} /** * Return current node index * @link https://php.net/manual/en/splheap.key.php * * @return int The current node index * * @since 5.3.0 */ public function key() {} /** * Move to the next node. This will delete the top node of the heap. * @link https://php.net/manual/en/splheap.next.php * * @return void * * @since 5.3.0 */ public function next(): void {} /** * Recover from the corrupted state and allow further actions on the heap * @link https://php.net/manual/en/splheap.recoverFromCorruption.php * * @return void * * @since 5.3.0 */ public function recoverFromCorruption(): void {} /** * Rewind iterator back to the start (no-op) * @link https://php.net/manual/en/splheap.rewind.php * * @return void * * @since 5.3.0 */ public function rewind(): void {} /** * Peeks at the node from the top of the heap * @link https://php.net/manual/en/splheap.top.php * * @return TValue The value of the node on the top. * * @since 5.3.0 */ public function top() {} /** * Check whether the heap contains any more nodes * @link https://php.net/manual/en/splheap.valid.php * * @return bool Returns true if the heap contains any more nodes, false otherwise. * * @since 5.3.0 */ public function valid(): bool {} } /** * The SplMaxHeap class provides the main functionalities of a heap, keeping the maximum on the top. * @link https://php.net/manual/en/class.splmaxheap.php * * @template TValue * @template-extends SplHeap */ class SplMaxHeap extends SplHeap { } /** * The SplMinHeap class provides the main functionalities of a heap, keeping the maximum on the top. * @link https://php.net/manual/en/class.splminheap.php * * @template TValue * @template-extends SplHeap */ class SplMinHeap extends SplHeap { } /** * The SplPriorityQueue class provides the main functionalities of a prioritized queue, implemented using a max heap. * @link https://php.net/manual/en/class.splpriorityqueue.php * * @template TPriority * @template TValue * @template-implements Iterator */ class SplPriorityQueue implements Iterator, Countable { /** * Extract the data */ const EXTR_DATA = 0x00000001; /** * Extract the priority */ const EXTR_PRIORITY = 0x00000002; /** * Extract an array containing both */ const EXTR_BOTH = 0x00000003; public function __construct() {} /** * Compare priorities in order to place them correctly in the queue while sifting up * @link https://php.net/manual/en/splpriorityqueue.compare.php * * @param TValue $priority1 The priority of the first node being compared. * @param TValue $priority2 The priority of the second node being compared. * @return int Positive integer if priority1 is greater than priority2, 0 if they are equal, negative integer otherwise. * * @since 5.3.0 */ public function compare($priority1, $priority2): int {} /** * Counts the number of elements in the queue * @link https://php.net/manual/en/splpriorityqueue.count.php * * @return int The number of elements in the queue. * * @since 5.3.0 */ public function count(): int {} /** * Get the current datastructure node. * @link https://php.net/manual/en/splpriorityqueue.current.php * * @return TValue The current node value * * @since 5.3.0 */ public function current() {} /** * Extracts a node from top of the queue and sift up * @link https://php.net/manual/en/splpriorityqueue.extract.php * * @return TValue The current node value * * @since 5.3.0 */ public function extract() {} /** * Get the flags of extraction * @link https://php.net/manual/en/splpriorityqueue.getextractflags.php * * @return SplPriorityQueue::EXTR_* Returns the current extraction mode * * @see SplPriorityQueue::setExtractFlags * * @since 5.3.0 */ public function getExtractFlags(): int {} /** * Inserts an element in the queue by sifting it up * @link https://php.net/manual/en/splpriorityqueue.insert.php * * @param TValue $value The value to insert. * @param TPriority $priority The associated priority. * @return true * * @since 5.3.0 */ public function insert($value, $priority): bool {} /** * Tells if the queue is in a corrupted state * @link https://php.net/manual/en/splpriorityqueue.isCorrupted.php * * @return bool true if the queue is corrupted, false otherwise. * * @since 7.0.0 */ public function isCorrupted(): bool {} /** * Checks whether the queue is empty * @link https://php.net/manual/en/splpriorityqueue.isEmpty.php * * @return bool Whether the queue is empty * * @since 5.3.0 */ public function isEmpty(): bool {} /** * Return current node index * @link https://php.net/manual/en/splpriorityqueue.key.php * * @return int The current node index * * @since 5.3.0 */ public function key() {} /** * Move to the next node. * @link https://php.net/manual/en/splpriorityqueue.next.php * * @return void * * @since 5.3.0 */ public function next(): void {} /** * Recover from the corrupted state and allow further actions on the queue * @link https://php.net/manual/en/splpriorityqueue.recoverFromCorruption.php * * @return void * * @since 5.3.0 */ public function recoverFromCorruption(): void {} /** * Rewind iterator back to the start (no-op) * @link https://php.net/manual/en/splpriorityqueue.rewind.php * * @return void * * @since 5.3.0 */ public function rewind(): void {} /** * Sets the mode of extraction * @link https://php.net/manual/en/splpriorityqueue.setextractflags.php * * @param SplPriorityQueue::EXTR_* $flags Defines what is extracted by SplPriorityQueue::current(), SplPriorityQueue::top() and SplPriorityQueue::extract(). * * @return void * * @since 5.3.0 */ public function setExtractFlags(int $flags): void {} /** * Peeks at the node from the top of the queue * @link https://php.net/manual/en/splpriorityqueue.top.php * * @return TValue The value of the node on the top. * * @since 5.3.0 */ public function top() {} /** * Check whether the queue contains any more nodes * @link https://php.net/manual/en/splpriorityqueue.valid.php * * @return bool Returns true if the queue contains any more nodes, false otherwise. * * @since 5.3.0 */ public function valid(): bool {} } /** * The SplObjectStorage class provides a map from objects to data or, by * ignoring data, an object set. This dual purpose can be useful in many * cases involving the need to uniquely identify objects. * @link https://php.net/manual/en/class.splobjectstorage.php * * @template TObject as object * @template TArrayValue * @template-implements ArrayAccess * @template-implements Iterator */ class SplObjectStorage implements Countable, Iterator, Serializable, ArrayAccess { public function __construct() {} /** * Adds an object in the storage * @link https://php.net/manual/en/splobjectstorage.attach.php * * @param TObject $object The object to add. * @param TArrayValue|null $data [optional] The data to associate with the object. * @return void * * @since 5.1.0 */ public function attach($object, $data = null) {} /** * Removes an object from the storage * @link https://php.net/manual/en/splobjectstorage.detach.php * * @param TObject $object The object to remove. * @return void * * @since 5.1.0 */ public function detach($object) {} /** * Checks if the storage contains a specific object * @link https://php.net/manual/en/splobjectstorage.contains.php * * @param TObject $object The object to look for. * @return bool true if the object is in the storage, false otherwise. * * @since 5.1.0 */ public function contains($object) {} /** * Adds all objects from another storage * @link https://php.net/manual/en/splobjectstorage.addall.php * * @param SplObjectStorage $storage The storage you want to import. * @return void * * @since 5.3.0 */ public function addAll($storage) {} /** * Removes objects contained in another storage from the current storage * @link https://php.net/manual/en/splobjectstorage.removeall.php * * @param SplObjectStorage $storage The storage containing the elements to remove. * @return void * * @since 5.3.0 */ public function removeAll($storage) {} /** * Removes all objects except for those contained in another storage from the current storage * @link https://php.net/manual/en/splobjectstorage.removeallexcept.php * * @param SplObjectStorage $storage The storage containing the elements to retain in the current storage. * @return void * * @since 5.3.6 */ public function removeAllExcept($storage) {} /** * Returns the data associated with the current iterator entry * @link https://php.net/manual/en/splobjectstorage.getinfo.php * * @return TArrayValue The data associated with the current iterator position. * * @since 5.3.0 */ public function getInfo() {} /** * Sets the data associated with the current iterator entry * @link https://php.net/manual/en/splobjectstorage.setinfo.php * * @param TArrayValue $data The data to associate with the current iterator entry. * @return void * * @since 5.3.0 */ public function setInfo($data) {} /** * Returns the number of objects in the storage * @link https://php.net/manual/en/splobjectstorage.count.php * * @return int The number of objects in the storage. * * @since 5.1.0 */ public function count() {} /** * Rewind the iterator to the first storage element * @link https://php.net/manual/en/splobjectstorage.rewind.php * * @return void * * @since 5.1.0 */ public function rewind() {} /** * Returns if the current iterator entry is valid * @link https://php.net/manual/en/splobjectstorage.valid.php * * @return bool true if the iterator entry is valid, false otherwise. * * @since 5.1.0 */ public function valid() {} /** * Returns the index at which the iterator currently is * @link https://php.net/manual/en/splobjectstorage.key.php * * @return int The index corresponding to the position of the iterator. * * @since 5.1.0 */ public function key() {} /** * Returns the current storage entry * @link https://php.net/manual/en/splobjectstorage.current.php * * @return TObject The object at the current iterator position. * * @since 5.1.0 */ public function current() {} /** * Move to the next entry * @link https://php.net/manual/en/splobjectstorage.next.php * * @return void * * @since 5.1.0 */ public function next() {} /** * Unserializes a storage from its string representation * @link https://php.net/manual/en/splobjectstorage.unserialize.php * * @param string $serialized The serialized representation of a storage. * @return void * * @since 5.2.2 */ public function unserialize($serialized) {} /** * Serializes the storage * @link https://php.net/manual/en/splobjectstorage.serialize.php * * @return string A string representing the storage. * * @since 5.2.2 */ public function serialize() {} /** * Checks whether an object exists in the storage * @link https://php.net/manual/en/splobjectstorage.offsetexists.php * * @param TObject $object The object to look for. * @return bool true if the object exists in the storage, and false otherwise. * * @since 5.3.0 */ public function offsetExists($object) {} /** * Associates data to an object in the storage * @link https://php.net/manual/en/splobjectstorage.offsetset.php * * @param TObject $object The object to associate data with. * @param TArrayValue|null $data [optional] The data to associate with the object. * @return void * * @since 5.3.0 */ public function offsetSet($object, $data = null) {} /** * Removes an object from the storage * @link https://php.net/manual/en/splobjectstorage.offsetunset.php * * @param TObject $object The object to remove. * @return void * * @since 5.3.0 */ public function offsetUnset($object) {} /** * Returns the data associated with an object * @link https://php.net/manual/en/splobjectstorage.offsetget.php * * @param TObject $object The object to look for. * @return TArrayValue The data previously associated with the object in the storage. * * @since 5.3.0 */ public function offsetGet($object) {} /** * Calculate a unique identifier for the contained objects * @link https://php.net/manual/en/splobjectstorage.gethash.php * * @param object $object object whose identifier is to be calculated. * @return string A string with the calculated identifier. * * @since 5.4.0 */ public function getHash($object) {} } */ interface IteratorAggregate extends Traversable { /** * @return Traversable An instance of an object implementing Iterator or Traversable */ public function getIterator(); } /** * @template-covariant TKey * @template-covariant TValue * * @template-extends Traversable */ interface Iterator extends Traversable { /** * @return TValue|null returns current value or null when iterator is drained * @psalm-ignore-nullable-return */ public function current(); /** * @return void Any returned value is ignored. */ public function next(); /** * @return TKey|null current key or null when iterator is drained * @psalm-ignore-nullable-return */ public function key(); /** * @return bool The return value will be casted to boolean and then evaluated. * Returns true on success or false on failure. */ public function valid(); /** * @return void Any returned value is ignored. */ public function rewind(); } /** * @template-covariant TKey * @template-covariant TValue * * @template-extends Iterator */ interface OuterIterator extends Iterator { /** * @return Iterator */ public function getInnerIterator(); } /** * @template-covariant TKey * @template-covariant TValue * * @template-extends Iterator */ interface RecursiveIterator extends Iterator { /** * @return bool true if the current entry can be iterated over, otherwise returns false. */ public function hasChildren(); /** * @return RecursiveIterator An iterator for the current entry. */ public function getChildren(); } /** * @template-covariant TKey * @template-covariant TValue * @template-extends Iterator */ interface SeekableIterator extends Iterator { /** * Seeks to a position * @link https://php.net/manual/en/seekableiterator.seek.php * * @param int $position The position to seek to. * @return void * * @since 5.1.0 */ public function seek($position); } /** * @template-covariant TKey * @template-covariant TValue * @template-covariant TIterator as Traversable * * @template-implements OuterIterator * * @mixin TIterator */ class IteratorIterator implements OuterIterator { /** * @param TIterator $iterator */ public function __construct(Traversable $iterator) {} /** * @return TValue|null current value or null when iterator is drained * @psalm-ignore-nullable-return */ public function current() {} /** * @return TKey|null current key value or null when iterator is drained * @psalm-ignore-nullable-return */ public function key() {} } /** * @template TKey * @template TValue * @template TIterator as Iterator * * @template-extends IteratorIterator */ class AppendIterator extends IteratorIterator { public function __construct(){} /** * @param TIterator $iterator * @return void */ public function append(Iterator $iterator) {} /** * @return ArrayIterator */ public function getArrayIterator() {} /** * @return int */ public function getIteratorIndex() {} /** * @return TValue|null current value or null when iterator is drained * @psalm-ignore-nullable-return */ public function current() {} /** * @return TKey|null current value or null when iterator is drained * @psalm-ignore-nullable-return */ public function key() {} } /** * @template TKey as array-key * @template TValue * @template-implements SeekableIterator * @template-implements ArrayAccess */ class ArrayIterator implements SeekableIterator, ArrayAccess, Serializable, Countable { const STD_PROP_LIST = 1; const ARRAY_AS_PROPS = 2; /** * @param array $array The array or object to be iterated on. * @param int-mask-of $flags Flags to control the behaviour of the ArrayObject object. */ public function __construct($array = array(), $flags = 0) { } /** * @param TKey $index The offset being checked. * @return bool true if the offset exists, otherwise false */ public function offsetExists($index) { } /** * @param TKey $index The offset to get the value from. * @return TValue|null The value at offset index, null when accessing invalid indexes * @psalm-ignore-nullable-return */ public function offsetGet($index) { } /** * @param TKey $index The index to set for. * @param TValue $newval The new value to store at the index. * @return void */ public function offsetSet($index, $newval) { } /** * @param TKey $index The offset to unset. * @return void */ public function offsetUnset($index) { } /** * @param TValue $value The value to append. * @return void */ public function append($value) { } /** * @return array A copy of the array, or array of public properties * if ArrayIterator refers to an object. */ public function getArrayCopy() { } /** * @return int The number of elements or public properties in the associated * array or object, respectively. */ public function count() { } /** * @return int-mask-of The current flags. */ public function getFlags() { } /** * @param int-mask-of $flags bitmask * @return void */ public function setFlags($flags) { } /** * @return void */ public function asort() { } /** * @return void */ public function ksort() { } /** * @param callable(TValue,TValue):int $cmp_function The compare function used for the sort. * @return void */ public function uasort($cmp_function) { } /** * @param callable(TKey,TKey):int $cmp_function The compare function used for the sort. * @return void */ public function uksort($cmp_function) { } /** * @return void */ public function natsort() { } /** * @return void */ public function natcasesort() { } /** * @param string $serialized The serialized ArrayIterator object to be unserialized. * @return void */ public function unserialize($serialized) { } /** * @return string The serialized ArrayIterator */ public function serialize() { } /** * @return void */ public function rewind() { } /** * @return TValue|null current value or null when iterator is drained * @psalm-ignore-nullable-return */ public function current() { } /** * @return TKey|null The current array key or null when iterator is drained * @psalm-ignore-nullable-return */ public function key() { } /** * @return void */ public function next() { } /** * @return bool */ public function valid() { } /** * @param int $position The position to seek to. * @return void */ public function seek($position) { } } /** * @template-covariant TKey * @template-covariant TValue * @template-covariant TIterator as Traversable * * @template-extends IteratorIterator */ abstract class FilterIterator extends IteratorIterator { /** @return bool */ abstract public function accept(); /** * @return TValue Can return any type. */ public function current() {} /** * @return TKey scalar on success, or null on failure. */ public function key() {} } /** * @template-covariant TKey * @template-covariant TValue * @template-covariant TIterator as Iterator * * @template-implements OuterIterator * @template-implements ArrayAccess * * @template-extends IteratorIterator */ class CachingIterator extends IteratorIterator implements OuterIterator , ArrayAccess , Countable { const CALL_TOSTRING = 1 ; const CATCH_GET_CHILD = 16 ; const TOSTRING_USE_KEY = 2 ; const TOSTRING_USE_CURRENT = 4 ; const TOSTRING_USE_INNER = 8 ; const FULL_CACHE = 256 ; /** * @param TIterator $iterator * @param int-mask-of $flags */ public function __construct(Iterator $iterator, int $flags = self::CALL_TOSTRING) {} /** @return bool */ public function hasNext () {} /** * @return TValue|null current value or null when iterator is drained * @psalm-ignore-nullable-return */ public function current() {} /** * @return TKey|null current key or null when iterator is drained * @psalm-ignore-nullable-return */ public function key() {} /** * @return array */ public function getCache() {} } /** * @template-covariant TKey * @template-covariant TValue * @template-covariant TIterator as Iterator * * @template-implements OuterIterator * * @template-extends FilterIterator */ class CallbackFilterIterator extends FilterIterator implements OuterIterator { /** * @param TIterator $iterator * @param callable(TValue, TKey, TIterator): bool $callback */ public function __construct(Iterator $iterator, callable $callback) {} /** * @return TValue|null current value or null when iterator is drained * @psalm-ignore-nullable-return */ public function current() {} /** * @return TKey|null current key or null when iterator is drained * @psalm-ignore-nullable-return */ public function key() {} } /** * @template-implements SeekableIterator */ class DirectoryIterator extends SplFileInfo implements SeekableIterator { public function __construct(string $path){} /** * @return self */ public function current() {} /** * @return int|false * @psalm-ignore-falsable-return */ public function key() {} /** * @return void */ public function next(){} /** * @return void */ public function rewind(){} /** * @param int $position */ public function seek($position) {} /** * @return bool */ public function valid(){} } /** * @template-implements Iterator */ class EmptyIterator implements Iterator { /** * @return never */ public function current() {} /** * @return never */ public function key() {} /** * @return void */ public function next() {} /** * @return void */ public function rewind() {} /** * @return false */ public function valid() {} } /** * @template-extends SeekableIterator */ class FilesystemIterator extends DirectoryIterator { const CURRENT_AS_PATHNAME = 32; const CURRENT_AS_FILEINFO = 0; const CURRENT_AS_SELF = 16; const CURRENT_MODE_MASK = 240; const KEY_AS_PATHNAME = 0; const KEY_AS_FILENAME = 256; const FOLLOW_SYMLINKS = 512; const KEY_MODE_MASK = 3840; const NEW_CURRENT_AND_KEY = 256; const SKIP_DOTS = 4096; const UNIX_PATHS = 8192; /** * @param int-mask $flags */ public function __construct(string $path, int $flags = self::KEY_AS_PATHNAME|self::CURRENT_AS_FILEINFO|self::SKIP_DOTS) {} /** * @return FilesystemIterator|SplFileInfo|string|null * @psalm-ignore-nullable-return */ public function current() {} /** * @return int-mask */ public function getFlags() {} /** * @param int-mask $flags * @return void */ public function setFlags($flags) {} /** * @return string|null * @psalm-ignore-nullable-return */ public function key() {} } /** * @template-extends SeekableIterator */ class GlobIterator extends FilesystemIterator implements Countable { /** * @return int */ public function count() {} } /** * @template-covariant TKey * @template-covariant TValue * @template-covariant TIterator as Iterator * * @template-extends IteratorIterator */ class InfiniteIterator extends IteratorIterator { /** * @param TIterator $iterator */ public function __construct(Iterator $iterator) {} /** * @return TValue|null current value or null if iterator is drained * @psalm-ignore-nullable-return */ public function current() {} /** * @return TKey|null current key or null when iterator is drained * @psalm-ignore-nullable-return */ public function key() {} } /** * @template-covariant TKey * @template-covariant TValue * @template-covariant TIterator as Iterator * * @template-implements OuterIterator * * @template-extends IteratorIterator */ class LimitIterator extends IteratorIterator implements OuterIterator { /** * @param TIterator $iterator */ public function __construct(Iterator $iterator, int $offset = 0, int $limit = -1) {} /** * @return TValue|null current value or null when iterator is drained * @psalm-ignore-nullable-return */ public function current() {} /** * @return TKey|null current key or null when iterator is drained * @psalm-ignore-nullable-return */ public function key() {} } /** * @template-covariant TKey * @template-covariant TValue * @template-covariant TIterator as Iterator * * @template-extends IteratorIterator */ class NoRewindIterator extends IteratorIterator { /** * @param TIterator $iterator */ public function __construct(Iterator $iterator) {} /** * @return TValue|null current value or null when iterator is drained * @psalm-ignore-nullable-return */ public function current() {} /** * @return TKey|null current value or null when iterator is drained * @psalm-ignore-nullable-return */ public function key() {} } /** * * @template-covariant TKey * @template-covariant TValue * * @template-implements Iterator */ class MultipleIterator implements Iterator { const MIT_NEED_ANY = 0 ; const MIT_NEED_ALL = 1 ; const MIT_KEYS_NUMERIC = 0 ; const MIT_KEYS_ASSOC = 2 ; /** * @param int-mask-of $flags */ public function __construct (int $flags = 0) {} /** * @param Iterator $iterator * @param string|int $infos * @return void */ public function attachIterator(Iterator $iterator, $infos = '') {} /** * @param Iterator $iterator * @return bool */ public function containsIterator(Iterator $iterator) {} /** * @return int */ public function countIterators() {} /** * nullable values are returned when MIT_NEED_ANY is set * and one of the iterators is already drained. * When MIT_NEED_ALL is set and one of the iterators * is already drained, `current()` throws * * @return array */ public function current() {} /** * @param Iterator $iterator * @return void */ public function detachIterator(Iterator $iterator) {} /** * @return int-mask-of */ public function getFlags() {} /** * @return array */ public function key() {} /** * @param int-mask-of $flags * @return void */ public function setFlags( int $flags ) {} } /** * @template TKey * @template TValue * @template TIterator as RecursiveIterator * * @template-extends FilterIterator * @template-implements RecursiveIterator */ abstract class RecursiveFilterIterator extends FilterIterator implements RecursiveIterator { /** * @param TIterator $iterator */ public function __construct(RecursiveIterator $iterator) {} /** * @return TIterator */ public function getChildren() {} /** * @return bool */ public function hasChildren() {} /** * @return TValue|null current value or null when iterator is drained * @psalm-ignore-nullable-return */ public function current() {} /** * @return TKey|null current value or null when iterator is drained * @psalm-ignore-nullable-return */ public function key() {} } /** * @template TKey * @template TValue * @template TIterator as RecursiveIterator * * @template-extends RecursiveFilterIterator */ class ParentIterator extends RecursiveFilterIterator implements RecursiveIterator, OuterIterator { /** * @return bool */ public function accept() {} /** * @param TIterator $iterator */ public function __construct(RecursiveIterator $iterator) {} /** * @return ParentIterator */ public function getChildren() {} /** * @return bool */ public function hasChildren() {} /** * @return void */ public function next() {} /** * @return void */ public function rewind() {} /** * @return TValue|null current value or null when iterator is drained * @psalm-ignore-nullable-return */ public function current() {} /** * @return TKey|null current key or null when iterator is drained * @psalm-ignore-nullable-return */ public function key() {} } /** * @template TKey * @template TValue * * @template-implements RecursiveIterator * @template-extends ArrayIterator */ class RecursiveArrayIterator extends ArrayIterator implements RecursiveIterator { const STD_PROP_LIST = 1 ; const ARRAY_AS_PROPS = 2 ; const CHILD_ARRAYS_ONLY = 4 ; /** * @return RecursiveArrayIterator */ public function getChildren() {} /** * @return bool */ public function hasChildren() {} /** * @return TValue|null current value or null when iterator is drained * @psalm-ignore-nullable-return */ public function current() {} /** * @return TKey|null current key or null when iterator is drained * @psalm-ignore-nullable-return */ public function key() {} } /** * @template TKey * @template TValue * @template TIterator as Iterator * * @template-implements RecursiveIterator * @template-extends CachingIterator */ class RecursiveCachingIterator extends CachingIterator implements RecursiveIterator { /** * @return RecursiveCachingIterator */ public function getChildren() {} /** * @return bool */ public function hasChildren() {} } /** * @template TKey * @template TValue * @template TIterator as RecursiveIterator * * @template-implements RecursiveIterator * @template-extends CallbackFilterIterator */ class RecursiveCallbackFilterIterator extends CallbackFilterIterator implements RecursiveIterator { /** * @param TIterator $iterator * @param callable(TValue, TKey, TIterator): bool $callback */ public function __construct(RecursiveIterator $iterator, callable $callback) {} /** * @return RecursiveCallbackFilterIterator */ public function getChildren() {} /** * @return bool */ public function hasChildren() {} /** * @return TValue|null current value or null when iterator is drained */ public function current() {} /** * @return TKey|null current value or null when iterator is drained */ public function key() {} } /** * @template-implements RecursiveIterator * @template-implements SeekableIterator */ class RecursiveDirectoryIterator extends FilesystemIterator implements RecursiveIterator, SeekableIterator { const CURRENT_AS_PATHNAME = 32 ; const CURRENT_AS_FILEINFO = 0 ; const CURRENT_AS_SELF = 16 ; const CURRENT_MODE_MASK = 240 ; const KEY_AS_PATHNAME = 0 ; const KEY_AS_FILENAME = 256 ; const FOLLOW_SYMLINKS = 512 ; const KEY_MODE_MASK = 3840 ; const NEW_CURRENT_AND_KEY = 256 ; const SKIP_DOTS = 4096 ; const UNIX_PATHS = 8192 ; /** * @param string $path * @param int-mask $flags */ public function __construct(string $path, int $flags = self::KEY_AS_PATHNAME|self::CURRENT_AS_FILEINFO) {} /** * @return string */ public function getSubPath() {} /** * @return string */ public function getSubPathname() {} /** * @return RecursiveDirectoryIterator|string|SplFileInfo|null current value or null when iterator is drained * @psalm-ignore-nullable-return */ public function current() {} /** * @return string|null current key or null when iterator is drained * @psalm-ignore-nullable-return */ public function key() {} } /** * @template TIterator as RecursiveIterator|IteratorAggregate * @mixin TIterator */ class RecursiveIteratorIterator implements OuterIterator { /** * @param TIterator $iterator * @param int $mode * @param int $flags * * @return void */ public function __construct($iterator, $mode = 0, $flags = 0) {} } /** * @template TKey * @template TValue * @template TIterator as RecursiveIterator * * @template-implements RecursiveIterator * @template-extends RegexIterator */ class RecursiveRegexIterator extends RegexIterator implements RecursiveIterator { const MATCH = 0 ; const GET_MATCH = 1 ; const ALL_MATCHES = 2 ; const SPLIT = 3 ; const REPLACE = 4 ; const USE_KEY = 1 ; /** * @param TIterator $iterator * @param string $regex * @param self::MATH|self::GET_MATCH|self::ALL_MATCHES|self::SPLIT|self::REPLACE $mode * @param self::USE_KEY|0 $flags * @param int $preg_flags */ public function __construct(RecursiveIterator $iterator, string $regex, int $mode = self::MATCH, int $flags = 0, int $preg_flags = 0) {} /** * @return RecursiveRegexIterator */ public function getChildren() {} } /** * @template TKey * @template TValue * * @template-extends RecursiveIteratorIterator * @template-implements OuterIterator */ class RecursiveTreeIterator extends RecursiveIteratorIterator implements OuterIterator { const LEAVES_ONLY = 0 ; const SELF_FIRST = 1 ; const CHILD_FIRST = 2 ; const CATCH_GET_CHILD = 16 ; const BYPASS_CURRENT = 4 ; const BYPASS_KEY = 8 ; const PREFIX_LEFT = 0 ; const PREFIX_MID_HAS_NEXT = 1 ; const PREFIX_MID_LAST = 2 ; const PREFIX_END_HAS_NEXT = 3 ; const PREFIX_END_LAST = 4 ; const PREFIX_RIGHT = 5 ; /** * @return void */ public function beginChildren() {} /** * @return RecursiveIterator */ public function beginIteration() {} /** * @return RecursiveIterator */ public function callGetChildren() {} /** * @return bool */ public function callHasChildren() {} /** * @param RecursiveIterator|IteratorAggregate $it * @param int-mask $flags * @param int-mask $cit_flags * @param self::LEAVES_ONLY|self::SELF_FIRST|self::CHILD_FIRST $mode */ public function __construct($it, int $flags = self::BYPASS_KEY, int $cit_flags = self::CATCH_GET_CHILD, int $mode = self::SELF_FIRST) {} /** * @return string */ public function current() {} /** * @return void */ public function endChildren() {} /** * @return void */ public function endIteration() {} /** * @return string */ public function getEntry() {} /** * @return string */ public function getPostfix() {} /** * @return string */ public function getPrefix() {} /** * @return string */ public function key() {} /** * @return void */ public function next() {} /** * @return void */ public function nextElement() {} /** * @return void */ public function rewind() {} /** * @return void */ public function setPostfix(string $postfix ) {} /** * @param self::PREFIX_* $part * @param string $value * @return void */ public function setPrefixPart(int $part , string $value ) {} /** * @return bool */ public function valid() {} } /** * @template TKey * @template TValue * @template TIterator as Iterator * * @template-extends FilterIterator */ class RegexIterator extends FilterIterator { const MATCH = 0 ; const GET_MATCH = 1 ; const ALL_MATCHES = 2 ; const SPLIT = 3 ; const REPLACE = 4 ; const USE_KEY = 1 ; /** * @param TIterator $iterator * @param string $regex * @param self::MATCH|self::GET_MATCH|self::ALL_MATCHES|self::SPLIT|self::REPLACE $mode * @param int-mask $flags * @param int $preg_flags */ public function __construct(Iterator $iterator, string $regex, int $mode = self::MATCH, int $flags = 0, int $preg_flags = 0) {} /** * @return TValue Can return any type. */ public function current() {} /** * @return TKey scalar on success, or null on failure. */ public function key() {} } > : list>) * @psalm-pure */ function array_keys(array $array, $search_value = null, bool $strict = false) { } /** * @psalm-template TKey as array-key * @psalm-template TValue * * @param array $array * @param array ...$arrays * * @return array * @psalm-pure */ function array_intersect(array $array, array ...$arrays) { } /** * @psalm-template TKey as array-key * @psalm-template TValue * * @param array $array * @param array ...$arrays * * @return array * @psalm-pure */ function array_intersect_key(array $array, array ...$arrays) { } /** * @psalm-template TKey as array-key * @psalm-template TValue * * @param array $array * @param array ...$arrays * * @return array * @psalm-pure */ function array_intersect_assoc(array $array, array ...$arrays) { } /** * @psalm-template TKey as array-key * @psalm-template TValue * * @param array $keys * @param array $values * * @return ( * PHP_MAJOR_VERSION is 8 ? * ($keys is non-empty-array ? non-empty-array : array) : * ($keys is non-empty-array ? non-empty-array|false : array|false) * ) * @psalm-ignore-falsable-return * @psalm-pure */ function array_combine(array $keys, array $values) { } /** * @psalm-template TKey as array-key * @psalm-template TValue * * @param array $array * @param array ...$arrays * * @return array * @psalm-pure */ function array_diff(array $array, array ...$arrays) { } /** * @psalm-template TKey as array-key * @psalm-template TValue * * @param array $array * @param array ...$arrays * * @return array * @psalm-pure */ function array_diff_key(array $array, array ...$arrays) { } /** * @psalm-template TKey as array-key * @psalm-template TValue * * @param array $array * @param array ...$arrays * * @return array * @psalm-pure */ function array_diff_assoc(array $array, array ...$arrays) { } /** * @psalm-template TKey as array-key * @psalm-template TValue * * @param array $array * * @return array * @psalm-pure */ function array_flip(array $array) { } /** * @psalm-template TKey as array-key * @psalm-template TArray as array * * @param TArray $array * * @return (TArray is array ? null : (TArray is non-empty-list ? int<0,max> : (TArray is non-empty-array ? TKey : TKey|null))) * @psalm-pure * @psalm-ignore-nullable-return */ function key($array) { } /** * @psalm-template TKey as array-key * @psalm-template TValue * @psalm-template TArray as array * * @param TArray $array * * @return (TArray is array ? false : (TArray is non-empty-array ? TValue : TValue|false)) * @psalm-pure */ function current($array) { } /** * @psalm-template TKey as array-key * @psalm-template TValue * @psalm-template TArray as array * * @param TArray $array * * @return (TArray is array ? false : (TArray is non-empty-array ? TValue : TValue|false)) */ function reset(&$array) { } /** * @psalm-template TKey as array-key * @psalm-template TValue * @psalm-template TArray as array * * @param TArray $array * * @return (TArray is array ? false : (TArray is non-empty-array ? TValue : TValue|false)) */ function end(&$array) { } /** * @psalm-template TKey as array-key * @psalm-template TArray as array * * @param TArray $array * * @return (TArray is array ? null : (TArray is non-empty-array ? key-of : key-of|null)) * @psalm-pure */ function array_key_first($array) { } /** * @psalm-template TArray as array * * @param TArray $array * * @return (TArray is array ? null : (TArray is non-empty-array ? key-of : key-of|null)) * @psalm-pure */ function array_key_last($array) { } /** * @psalm-template TArray as array * * @param TArray $array * * @return (TArray is non-empty-array ? non-empty-list> : list>) * @psalm-pure */ function array_values($array) { } /** * @psalm-template T * * @param mixed $needle * @param array $haystack * @param bool $strict * * @return T|false * @psalm-pure */ function array_search($needle, array $haystack, bool $strict = false) { } /** * @psalm-template T * @psalm-template TArray as array * * @param TArray $array * @param-out (TArray is non-empty-array ? non-empty-list : list) $array */ function shuffle(array &$array): bool { } /** * @psalm-template T * @psalm-template TArray as array * * @param TArray $array * @param-out (TArray is non-empty-array ? non-empty-list : list) $array */ function sort(array &$array, int $flags = SORT_REGULAR): bool { } /** * @psalm-template T * @psalm-template TArray as array * * @param TArray $array * @param-out (TArray is non-empty-array ? non-empty-list : list) $array */ function rsort(array &$array, int $flags = SORT_REGULAR): bool { } /** * @psalm-template T * @psalm-template TArray as array * * @param TArray $array * @param callable(T,T):int $callback * @param-out (TArray is non-empty-array ? non-empty-list : list) $array */ function usort(array &$array, callable $callback): bool { } /** * @psalm-template TKey * @psalm-template T * @psalm-template TArray as array * * @param TArray $array * @param callable(T,T):int $callback * @param-out (TArray is non-empty-array ? non-empty-array : array) $array */ function uasort(array &$array, callable $callback): bool { } /** * @psalm-template TKey * @psalm-template T * @psalm-template TArray as array * * @param TArray $array * @param callable(TKey,TKey):int $callback * @param-out (TArray is non-empty-array ? non-empty-array : array) $array */ function uksort(array &$array, callable $callback): bool { } /** * @psalm-pure * * @psalm-template K of array-key * @psalm-template T * * @param array $array * * @return array */ function array_change_key_case(array $array, int $case = CASE_LOWER) { } /** * @psalm-pure * * @psalm-template TKey as array-key * * @param TKey $key * @param array $array * * @return bool */ function array_key_exists($key, array $array) : bool { } /** * @psalm-pure * * @no-named-arguments * * @psalm-template TKey as array-key * @psalm-template TValue * * @param array ...$arrays * * @return array */ function array_merge_recursive(array ...$arrays) { } /** * @psalm-pure * * @no-named-arguments * * @psalm-template TKey as array-key * @psalm-template TValue * * @param array ...$arrays * * @return array */ function array_merge(array ...$arrays) { } /** * @psalm-pure * * @psalm-template TKey as array-key * @psalm-template TValue * * @param array $keys * @param TValue $value * * @return array */ function array_fill_keys(array $keys, $value): array { } /** * @psalm-pure * * @psalm-template TKey * * @param string $pattern * @param array $array * @param 0|1 $flags 1=PREG_GREP_INVERT * @return array */ function preg_grep($pattern, array $array, $flags = 0) { } /** * @param resource $stream * @param-out closed-resource $stream */ function fclose(&$stream) : bool { } /** * @psalm-pure * @template T as string * @param T $string * @return (T is non-empty-string ? non-empty-string : string) */ function sodium_bin2base64(string $string, int $id): string /** * @psalm-pure * @template T as string * @param T $string * @return (T is non-empty-string ? non-empty-string : string) */ function sodium_bin2hex(string $string): string {} /** * @param string $string * @param-out null $string */ function sodium_memzero(string &$string): void { } /** * @param mixed $value * @param bool $return * @return ($return is true ? string : void) * * @psalm-taint-specialize * @psalm-flow ($value) -> return * @psalm-taint-sink html $value */ function var_export($value, bool $return = false) {} /** * @param mixed $value * @param list $values * @return string * * @psalm-taint-specialize * @psalm-flow ($value, $values) -> return * @psalm-taint-sink html $value * @psalm-taint-sink html $values */ function var_dump($value, ...$values) {} /** * @param mixed $value * @param bool $return * @return ($return is true ? string : true) * * @psalm-taint-specialize * @psalm-flow ($value) -> return * @psalm-taint-sink html $value */ function print_r($value, bool $return = false) {} /** * @psalm-pure * * @psalm-taint-sink file $filename * @param mixed $filename * @return ($return is true ? string : bool) */ function highlight_file($filename, bool $return = false) {} /** * @psalm-pure * * @psalm-taint-sink file $filename * @param mixed $filename * @return ($return is true ? string : bool) */ function show_source($filename, bool $return = false) {} /** * @psalm-pure * * @psalm-taint-sink file $filename */ function php_strip_whitespace(string $filename) : string {} /** * @psalm-pure * * @param mixed $string * @return ($return is true ? string : bool) * * @psalm-flow ($string) -> return */ function highlight_string($string, bool $return = false) {} /** * @psalm-pure * * @return ($as_float is true ? float : string) */ function microtime(bool $as_float = false) {} /** * @psalm-pure * * @return ($as_float is true ? float : array) */ function gettimeofday(bool $as_float = false) {} /** * @psalm-pure * * @param numeric $num * @return ($num is int ? positive-int|0 : ($num is float ? float : positive-int|0|float)) */ function abs($num) {} /** * @psalm-pure * * @template T as string|int|float * @template TStep as int|float * @param T $start * @param T $end * @param TStep $step * @return ( * T is int * ? (TStep is int ? non-empty-list : non-empty-list) * : ( * T is float * ? non-empty-list * : ( * T is string * ? non-empty-list * : ( * T is int|float * ? non-empty-list * : non-empty-list * ) * ) * ) * ) */ function range($start, $end, $step = 1) {} /** * @psalm-pure * * @return ( * $format is 'd'|'j'|'N'|'w'|'z'|'W'|'m'|'n'|'t'|'L'|'o'|'Y'|'y'|'B'|'g'|'G'|'h'|'H'|'i'|'s'|'u'|'v'|'Z'|'U'|'I' * ? numeric-string * : ($timestamp is numeric ? string : string|false) * ) */ function date(string $format, int $timestamp = 0) {} /** * @psalm-pure * * @param mixed $vars * @param-out string|int|float|null $vars * @psalm-flow ($string, $format) -> return * @return (func_num_args() is 2 ? (null|list) : int) */ function sscanf(string $string, string $format, &...$vars) {} /** * @psalm-pure * * @return ( * func_num_args() is 1 * ? array{dirname: string, basename: string, extension?: string, filename: string} * : string * ) */ function pathinfo(string $path, int $flags = \PATHINFO_DIRNAME) {} /** * @psalm-pure * * @return (func_num_args() is 0 ? array : string|false) */ function getenv(string $varname = '', bool $local_only = false) {} /** * @psalm-pure * * @return ( * $string is non-empty-string ? non-empty-lowercase-string : lowercase-string * ) * * @psalm-flow ($string) -> return */ function strtolower(string $string) : string {} /** * @psalm-pure * * @return ( * $string is non-falsy-string * ? non-falsy-string * : ($string is non-empty-string ? non-empty-string : string) * ) * * @psalm-flow ($string) -> return */ function strtoupper(string $string) : string {} /** * @psalm-pure * * @param string|array $string * @param string|array $replace * @param int|array $offset * @param null|int|array $length * * @return ($string is array ? array : string) * * @psalm-flow ($string, $replace) -> return */ function substr_replace($string, $replace, $offset, $length = null) {} /** * @psalm-pure * * @param string $haystack * * @psalm-return positive-int|0|false */ function strpos($haystack, $needle, int $offset = 0) : int {} /** * @psalm-pure * * @return ( * $string is class-string * ? ($characters is '\\' ? class-string : string) * : ($string is lowercase-string ? lowercase-string : string) * ) * * @psalm-flow ($string) -> return */ function trim(string $string, string $characters = " \t\n\r\0\x0B") : string {} /** * @psalm-pure * * @return ( * $string is class-string * ? ($characters is '\\' ? class-string : string) * : ($string is lowercase-string ? lowercase-string : string) * ) * * @psalm-flow ($string) -> return */ function ltrim(string $string, string $characters = " \t\n\r\0\x0B") : string {} /** * @psalm-pure * * @return ($string is lowercase-string ? lowercase-string : string) * * @psalm-flow ($string) -> return */ function rtrim(string $string, string $characters = " \t\n\r\0\x0B") : string {} /** * @psalm-pure * * @param string|array $separator * @param array $array * * @return ( * $separator is non-empty-string * ? ($array is non-empty-array * ? ($array is array * ? ($separator is literal-string ? non-empty-literal-string : non-empty-string) * : non-empty-string * ) * : string) * : ($array is non-empty-array * ? ($array is array * ? ($array is array ? non-empty-literal-string : non-empty-string) * : string * ) * : string) * ) * * @psalm-flow ($separator) -> return * @psalm-flow ($array) -(array-fetch)-> return */ function implode($separator, array $array = []) : string {} /** * @psalm-pure * * @param string|array $separator * @param array $array * * @return ( * $separator is non-empty-string * ? ($array is non-empty-array * ? ($array is array * ? ($separator is literal-string ? non-empty-literal-string : non-empty-string) * : non-empty-string * ) * : string) * : ($array is non-empty-array * ? ($array is array * ? ($array is array ? non-empty-literal-string : non-empty-string) * : string * ) * : string) * ) * * @psalm-flow ($separator) -> return * @psalm-flow ($array) -(array-fetch)-> return */ function join($separator, array $array = []): string { } /** * @psalm-pure * * @param non-empty-string $separator * * @return ( * $string is lowercase-string * ? ( * $limit is int * ? list * : ( * $limit is int<0, 1> * ? list{lowercase-string} * : ( * $limit is 2 * ? list{0: lowercase-string, 1?: lowercase-string} * : ( * $limit is 3 * ? list{0: lowercase-string, 1?: lowercase-string, 2?: lowercase-string} * : non-empty-list * ) * ) * ) * ) * : ( * $limit is int * ? list * : ( * $limit is int<0, 1> * ? list{string} * : ( * $limit is 2 * ? list{0: string, 1?: string} * : ( * $limit is 3 * ? list{0: string, 1?: string, 2?: string} * : non-empty-list * ) * ) * ) * ) * ) * * @psalm-flow ($string) -(array-assignment)-> return */ function explode(string $separator, string $string, int $limit = -1) : array {} /** * @psalm-pure * * @psalm-flow ($subject) -(array-assignment)-> return * * @template TFlags as int-mask<0, 1, 2, 4> * * @param TFlags $flags * * @return (TFlags is 0|2 ? non-empty-list|false : (TFlags is 1|3 ? list|false : list|false)) * * @psalm-ignore-falsable-return */ function preg_split(string $pattern, string $subject, int $limit = -1, int $flags = 0) {} /** * @param array $array * * @return ( * $array is array * ? int * : ($array is array * ? float * : float|int * ) * ) */ function array_sum(array $array) {} /** * @param array $array * * @return ( * $array is array * ? int * : ($array is array * ? float * : float|int * ) * ) */ function array_product(array $array) {} /** * 257 is FILTER_VALIDATE_INT * @psalm-taint-escape ($filter is 257 ? 'html' : null) * * 258 is FILTER_VALIDATE_BOOLEAN * @psalm-taint-escape ($filter is 258 ? 'html' : null) * * 259 is FILTER_VALIDATE_FLOAT * @psalm-taint-escape ($filter is 259 ? 'html' : null) * * 519 is FILTER_SANITIZE_NUMBER_INT * @psalm-taint-escape ($filter is 519 ? 'html' : null) * * 520 is FILTER_SANITIZE_NUMBER_FLOAT * @psalm-taint-escape ($filter is 520 ? 'html' : null) * * @psalm-flow ($value, $filter, $options) -> return */ function filter_var(mixed $value, int $filter = FILTER_DEFAULT, array|int $options = 0): mixed {} /** * @psalm-pure * * @psalm-taint-escape html * @psalm-flow ($string) -> return */ function strip_tags(string $string, ?string $allowed_tags = null) : string {} /** * @psalm-pure * * @psalm-flow ($string) -> return */ function stripcslashes(string $string) : string {} /** * @psalm-pure * * @psalm-flow ($string) -> return */ function stripslashes(string $string) : string {} /** * @psalm-pure * * Tainting is handled in a plugin * * @psalm-flow ($string) -> return */ function htmlentities(string $string, ?int $flags = null, ?string $encoding = null, bool $double_encode = true) : string {} /** * @psalm-pure * * Tainting is handled in a plugin * * @psalm-flow ($string) -> return */ function html_entity_decode(string $string, ?int $flags = null, ?string $encoding = null) : string {} /** * @psalm-pure * * Tainting is handled in a plugin * * @psalm-flow ($string) -> return * @psalm-return ( * $string is non-empty-string * ? non-empty-string * : string * ) */ function htmlspecialchars(string $string, int $flags = ENT_COMPAT | ENT_HTML401, ?string $encoding = 'UTF-8', bool $double_encode = true) : string {} /** * @psalm-pure * * Tainting is handled in a plugin * * @psalm-flow ($string) -> return */ function htmlspecialchars_decode(string $string, ?int $flags = null) : string {} /** * @psalm-pure * * @psalm-taint-escape html * @psalm-taint-escape has_quotes * @psalm-flow ($string) -> return */ function urlencode(string $string) : string {} /** * @psalm-pure * * @psalm-return ( * $string is '' * ? 0 * : ( * $string is non-empty-string * ? positive-int * : (0|positive-int) * ) * ) */ function strlen(string $string) : int {} /** * @psalm-pure * * @param string|array $search * @param string|array $replace * @param string|array $subject * @param int $count * @return ($subject is array ? array : string) * * @psalm-flow ($replace, $subject) -> return */ function str_replace($search, $replace, $subject, &$count = null) {} /** * @psalm-pure * * @param string|array $search * @param string|array $replace * @param string|array $subject * @param int $count * @return ($subject is array ? array : string) * * @psalm-flow ($replace, $subject) -> return */ function str_ireplace($search, $replace, $subject, &$count = null) {} /** * @psalm-pure * * @return ($string is non-empty-string ? non-empty-string : ($length is positive-int ? non-empty-string: string)) * * @psalm-flow ($string, $pad_string) -> return */ function str_pad(string $string, int $length, $pad_string = '', int $pad_type = STR_PAD_RIGHT): string {} /** * @psalm-pure * * @todo update $times to be `0|positive-int` * @return ( * $string is non-empty-string * ? ( * $times is positive-int * ? non-empty-string * : ($times is 0 ? '' : string) * ) * : ($times is 0 ? '' : string) * ) * * @psalm-flow ($string) -> return */ function str_repeat(string $string, int $times): string {} /** * @psalm-pure * * @psalm-flow ($string) -> return */ function str_rot13(string $string): string {} /** * @psalm-pure * * @psalm-flow ($string) -> return */ function str_shuffle(string $string): string {} /** * @psalm-pure * @return ($length is positive-int ? list : false) * * @psalm-flow ($string) -> return */ function str_split(string $string, int $length = 1) {} /** * @psalm-pure * @return string|false * @psalm-ignore-falsable-return * * @psalm-flow ($haystack) -> return */ function strstr(string $haystack, string $needle, bool $before_needle = false) {} /** * @psalm-pure * @return string|false * @psalm-ignore-falsable-return * * @psalm-flow ($haystack) -> return */ function stristr(string $haystack, string $needle, bool $before_needle = false) {} /** * @psalm-pure * @return string|false * @psalm-ignore-falsable-return * * @psalm-flow ($haystack) -> return */ function strchr(string $haystack, string $needle, bool $before_needle = false) {} /** * @psalm-pure * @return string|false * @psalm-ignore-falsable-return * * @psalm-flow ($string) -> return */ function strpbrk(string $string, string $characters) {} /** * @psalm-pure * @return string|false * @psalm-ignore-falsable-return * * @psalm-flow ($haystack) -> return */ function strrchr(string $haystack, string $needle) {} /** * @psalm-pure * * @psalm-flow ($string) -> return */ function strrev(string $string): string {} /** * @psalm-pure * * @param 0|1|2 $format * @return ( * $format is 0 ? * int : * ( * $format is 1 ? * list : * array * ) * ) */ function str_word_count(string $string, int $format = 0, string|null $characters = null) {} /** * @psalm-pure * * @param string|string[] $pattern * @param string|array $replacement * @param string|array $subject * @param int $count * @return ($subject is array ? array : string|null) * * @psalm-flow ($replacement, $subject) -> return */ function preg_filter($pattern, $replacement, $subject, int $limit = -1, &$count = null) {} /** * @psalm-pure * * @param string|string[] $pattern * @param string|array $replacement * @param string|array $subject * @param int $count * @return ($subject is array ? array|null : string|null) * * @psalm-flow ($replacement, $subject) -> return */ function preg_replace($pattern, $replacement, $subject, int $limit = -1, &$count = null) {} /** * @param string|string[] $pattern * @param callable(string[]):string $callback * @param string|array $subject * @param int $count * @return ($subject is array ? array|null : string|null) * * @psalm-taint-specialize * @psalm-flow ($subject) -> return */ function preg_replace_callback($pattern, $callback, $subject, int $limit = -1, &$count = null, int $flags = 0) {} /** * @psalm-pure * @template TFlags as int * * @param string $pattern * @param string $subject * @param mixed $matches * @param TFlags $flags * @param-out ( * TFlags is 1 * ? array> * : (TFlags is 2 * ? list> * : (TFlags is 256|257 * ? array> * : (TFlags is 258 * ? list> * : (TFlags is 512|513 * ? array> * : (TFlags is 514 * ? list> * : (TFlags is 770 * ? list> * : array * ) * ) * ) * ) * ) * ) * ) $matches * @return int|false * @psalm-ignore-falsable-return */ function preg_match_all($pattern, $subject, &$matches = [], int $flags = 1, int $offset = 0) {} /** * @psalm-pure * @template TFlags as int-mask<0, 256, 512> * * @param string $pattern * @param string $subject * @param mixed $matches * @param TFlags $flags * @param-out (TFlags is 256 ? array : * TFlags is 512 ? array : * TFlags is 768 ? array : * array * ) $matches * @return 1|0|false * @psalm-ignore-falsable-return */ function preg_match($pattern, $subject, &$matches = [], int $flags = 0, int $offset = 0) {} /** * @psalm-pure * * @return (PHP_MAJOR_VERSION is 5|7 ? string|false : string) * @psalm-ignore-falsable-return * * @psalm-flow ($string) -> return */ function substr(string $string, int $offset, ?int $length = null) {} /** * @psalm-pure * * @psalm-flow ($str) -> return */ function preg_quote(string $str, ?string $delimiter = null) : string {} /** * @psalm-pure * * @param string|int|float $values * @return ($format is non-empty-string * ? ($values is non-empty-string|int|float ? non-empty-string : string) * : string) * * @psalm-flow ($format, $values) -> return */ function sprintf(string $format, ...$values) : string {} /** * @psalm-pure * @return string|false * @psalm-ignore-falsable-return * * @psalm-flow ($format, $values) -> return */ function vsprintf(string $format, array $values) {} /** * @psalm-pure * @return string * * @psalm-flow ($string) -> return */ function wordwrap(string $string, int $width = 75, string $break = "\n", bool $cut_long_words = false) : string {} /** * @psalm-pure * * @param string|int|float $values * * @psalm-taint-specialize * @psalm-flow ($format, $values) -> return * @psalm-taint-sink html $format * @psalm-taint-sink html $values */ function printf(string $format, ...$values) : string {} /** * @psalm-taint-specialize * @psalm-taint-sink html $format * @psalm-taint-sink html $values */ function vprintf(string $format, array $values) : int {} /** * @psalm-pure * * @return string|false * @psalm-ignore-falsable-return * * @psalm-flow ($path) -> return */ function realpath(string $path) {} /** * @psalm-pure * * @param numeric-string $num1 * @param numeric-string $num2 * @return (PHP_MAJOR_VERSION is 8 ? numeric-string : ($num2 is "0" ? null : numeric-string)) */ function bcdiv(string $num1, string $num2, int $scale = 0): ?string {} /** * @psalm-pure * * @param scalar|null|object $value * @return string The string value of var. * * @psalm-flow ($value) -> return */ function strval ($value): string {} /** * @return ($string is non-empty-string ? non-empty-list : non-empty-list|array{null}) * @psalm-pure * * @psalm-flow ($string) -> return */ function str_getcsv(string $string, string $separator = ',', string $enclosure = '"', string $escape = '\\\\') { } /** * @template TKey as array-key * @template TArray as array * * @param TArray $array * * @return (TArray is non-empty-array ? non-empty-array : array) * * @psalm-pure */ function array_count_values(array $array): array {} /** * @psalm-pure * * @psalm-flow ($string) -> return */ function addcslashes(string $string, string $characters) : string { } /** * @psalm-pure * * @psalm-flow ($string) -> return */ function addslashes(string $string): string { } /** * @psalm-pure * * @psalm-flow ($string) -> return */ function ucfirst(string $string): string { } /** * @psalm-pure * * @psalm-flow ($string, $separators) -> return */ function ucwords (string $string, string $separators = " \t\r\n\f\v"): string { } /** * @psalm-pure * * @psalm-flow ($string) -> return */ function lcfirst(string $string): string { } /** * @psalm-pure * * @psalm-flow ($string) -> return */ function nl2br(string $string, bool $use_xhtml = false): string { } /** * @psalm-pure * * @psalm-flow ($string) -> return */ function quoted_printable_decode(string $string): string { } /** * @psalm-pure * * @psalm-flow ($string) -> return */ function quoted_printable_encode(string $string): string { } /** * @psalm-pure * * @psalm-flow ($string) -> return */ function quotemeta(string $string): string { } /** * @psalm-pure * * @psalm-flow ($string) -> return */ function chop(string $string, string $characters = " \t\n\r\0\x0B"): string { } /** * @psalm-pure * @psalm-flow ($string, $separator) -> return */ function chunk_split(string $string, int $length = 76, string $separator= ''): string { } /** * @psalm-pure * * @psalm-flow ($string) -> return */ function convert_uudecode(string $string): string { } /** * @psalm-pure * * @psalm-flow ($string) -> return */ function convert_uuencode(string $string) : string { } /** * @psalm-pure * * @psalm-taint-escape ldap * @psalm-flow ($value) -> return */ function ldap_escape(string $value, string $ignore = "", int $flags = 0) : string {} /** * @psalm-pure * * @return mixed * @psalm-flow ($json) -> return */ function json_decode(string $json, ?bool $associative = null, int $depth = 512, int $flags = 0) {} /** * @psalm-pure * * @return ($flags is 4194304 ? non-empty-string : non-empty-string|false) * * @psalm-flow ($value) -> return * @psalm-ignore-falsable-return */ function json_encode(mixed $value, int $flags = 0, int $depth = 512) {} /** * @psalm-pure * * @return string|false * * @psalm-flow ($values) -> return * @psalm-ignore-falsable-return */ function pack(string $format, mixed ...$values) {} /** * @psalm-pure * * @param string|int $in_codepage * @param string|int $out_codepage * @psalm-flow ($subject) -> return */ function sapi_windows_cp_conv($in_codepage, $out_codepage, string $subject) : ?string {} /** * @psalm-pure * * @psalm-flow ($prefix) -> return */ function uniqid(string $prefix = "", bool $more_entropy = false) : string {} /** * @psalm-pure * * @return array|false * @psalm-ignore-falsable-return * * @psalm-flow ($string) -> return */ function unpack(string $format, string $string, int $offset = 0) {} /** * @psalm-pure * * @return string|false * * @psalm-flow ($string) -> return * @psalm-ignore-falsable-return */ function base64_decode(string $string, bool $strict = false) {} /** * @psalm-pure * * @psalm-flow ($string) -> return * @template T as string * @param T $string * @return (T is non-empty-string ? non-empty-string : string) */ function base64_encode(string $string) : string {} /** * @psalm-pure * * @template T as string * @param T $string * @return (T is non-empty-string ? non-empty-string : string) */ function bin2hex(string $string): string {} /** * @psalm-pure * * @param resource|null $context * * @return ($associative is false|0 ? list : array>)|false * * @psalm-taint-sink ssrf $url */ function get_headers(string $url, int $associative = 0, $context = null) : array|false {} /** * @psalm-pure * * @return array|false * * @psalm-taint-sink ssrf $filename */ function get_meta_tags(string $filename, bool $use_include_path = false) : array|false {} /** * @return ($categorize is false ? array : array>) */ function get_defined_constants(bool $categorize = false): array {} /** * @param mixed $object_or_class * @param class-string $class * @param bool $allow_string * @return ($allow_string is false ? ($object_or_class is object ? bool : false) : bool) */ function is_a($object_or_class, string $class, $allow_string = false): bool{} /** * @template T of array|string * @param T $string * @return (T is array ? array : T is array ? array : string|false) * @psalm-ignore-falsable-return */ function mb_convert_encoding(array|string $string, string $to_encoding, array|string|null $from_encoding = null): array|string|false{} /** * @template TRead of null|array * @template TWrite of null|array * @template TExcept of null|array * @param TRead $read * @param TWrite $write * @param TExcept $except * @return false|int<0, max> * @param-out (TRead is null ? null : array) $read * @param-out (TWrite is null ? null : array) $write * @param-out (TExcept is null ? null : array) $except * @psalm-suppress ReferenceConstraintViolation */ function stream_select(null|array &$read, null|array &$write, null|array &$except, null|int $seconds, null|int $microseconds = null) : bool|int {} /** * @psalm-pure * * @psalm-taint-escape sql * @psalm-flow ($string) -> return */ function mysqli_escape_string($string) {} /** * @psalm-pure * * @psalm-taint-escape sql * @psalm-flow ($string) -> return */ function mysqli_real_escape_string($string) {} /** * @psalm-pure * * @psalm-taint-escape sql * @psalm-flow ($string) -> return */ function db2_escape_string($string) {} /** * @psalm-pure * * @psalm-taint-escape sql * @psalm-flow ($string) -> return */ function cubrid_real_escape_string($string) {} /** * @psalm-pure * * @psalm-taint-escape sql * @psalm-flow ($string1, $string2) -> return */ function pg_escape_bytea($string1, $string2 = null) {} /** * @psalm-pure * * @psalm-taint-escape sql * @psalm-flow ($string1, $string2) -> return */ function pg_escape_identifier($string1, $string2 = null) {} /** * @psalm-pure * * @psalm-taint-escape sql * @psalm-flow ($string1, $string2) -> return */ function pg_escape_literal($string1, $string2 = null) {} /** * @psalm-pure * * @psalm-taint-escape sql * @psalm-flow ($string1, $string2) -> return */ function pg_escape_string($string1, $string2 = null) {} */ class Generator implements Traversable { /** * @psalm-ignore-nullable-return * @return ?TValue Can return any type. */ public function current() {} /** * @return void Any returned value is ignored. */ public function next() {} /** * @return TKey scalar on success, or null on failure. */ public function key() {} /** * @return bool The return value will be casted to boolean and then evaluated. */ public function valid() {} /** * @return void Any returned value is ignored. */ public function rewind() {} /** * @return TReturn Can return any type. */ public function getReturn() {} /** * @param TSend $value * @psalm-ignore-nullable-return * @return ?TValue Can return any type. */ public function send($value) {} /** * @psalm-ignore-nullable-return * @return ?TValue Can return any type. */ public function throw(Throwable $exception) {} } /** * Interface to provide accessing objects as arrays. * @link http://php.net/manual/en/class.arrayaccess.php * * @template TKey * @template TValue */ interface ArrayAccess { /** * Whether a offset exists * @link http://php.net/manual/en/arrayaccess.offsetexists.php * * @param TKey $offset An offset to check for. * @return bool true on success or false on failure. * The return value will be casted to boolean if non-boolean was returned. * * @since 5.0.0 */ public function offsetExists($offset); /** * Offset to retrieve * @link http://php.net/manual/en/arrayaccess.offsetget.php * * @param TKey $offset The offset to retrieve. * @return TValue|null Can return all value types. * @psalm-ignore-nullable-return * * @since 5.0.0 */ public function offsetGet($offset); /** * Offset to set * @link http://php.net/manual/en/arrayaccess.offsetset.php * * @param TKey|null $offset The offset to assign the value to. * @param TValue $value The value to set. * @return void * * @since 5.0.0 */ public function offsetSet($offset, $value); /** * Offset to unset * @link http://php.net/manual/en/arrayaccess.offsetunset.php * * @param TKey $offset The offset to unset. * @return void * * @since 5.0.0 */ public function offsetUnset($offset); } /** * This class allows objects to work as arrays. * @link http://php.net/manual/en/class.arrayobject.php * * @template TKey * @template TValue * @template-implements IteratorAggregate * @template-implements ArrayAccess */ class ArrayObject implements IteratorAggregate, ArrayAccess, Serializable, Countable { /** * Properties of the object have their normal functionality when accessed as list (var_dump, foreach, etc.). */ const STD_PROP_LIST = 1; /** * Entries can be accessed as properties (read and write). */ const ARRAY_AS_PROPS = 2; /** * Construct a new array object * @link http://php.net/manual/en/arrayobject.construct.php * * @param array|object $input The input parameter accepts an array or an Object. * @param int $flags Flags to control the behaviour of the ArrayObject object. * @param string $iterator_class Specify the class that will be used for iteration of the ArrayObject object. ArrayIterator is the default class used. * @psalm-param class-string>|class-string> $iterator_class * * @since 5.0.0 */ public function __construct($input = null, $flags = 0, $iterator_class = "ArrayIterator") { } /** * Returns whether the requested index exists * @link http://php.net/manual/en/arrayobject.offsetexists.php * * @param TKey $index The index being checked. * @return bool true if the requested index exists, otherwise false * * @since 5.0.0 */ public function offsetExists($index) { } /** * Returns the value at the specified index * @link http://php.net/manual/en/arrayobject.offsetget.php * * @param TKey $index The index with the value. * @return TValue The value at the specified index or false. * * @since 5.0.0 */ public function offsetGet($index) { } /** * Sets the value at the specified index to newval * @link http://php.net/manual/en/arrayobject.offsetset.php * * @param TKey $index The index being set. * @param TValue $newval The new value for the index. * @return void * * @since 5.0.0 */ public function offsetSet($index, $newval) { } /** * Unsets the value at the specified index * @link http://php.net/manual/en/arrayobject.offsetunset.php * * @param TKey $index The index being unset. * @return void * * @since 5.0.0 */ public function offsetUnset($index) { } /** * Appends the value * @link http://php.net/manual/en/arrayobject.append.php * * @param TValue $value The value being appended. * @return void * * @since 5.0.0 */ public function append($value) { } /** * Creates a copy of the ArrayObject. * @link http://php.net/manual/en/arrayobject.getarraycopy.php * * @return array a copy of the array. When the ArrayObject refers to an object * an array of the public properties of that object will be returned. * * @since 5.0.0 */ public function getArrayCopy() { } /** * Get the number of public properties in the ArrayObject * When the ArrayObject is constructed from an array all properties are public. * @link http://php.net/manual/en/arrayobject.count.php * * @return int The number of public properties in the ArrayObject. * * @since 5.0.0 */ public function count() { } /** * Gets the behavior flags. * @link http://php.net/manual/en/arrayobject.getflags.php * * @return int the behavior flags of the ArrayObject. * * @since 5.1.0 */ public function getFlags() { } /** * Sets the behavior flags. * * It takes on either a bitmask, or named constants. Using named * constants is strongly encouraged to ensure compatibility for future * versions. * * The available behavior flags are listed below. The actual * meanings of these flags are described in the * predefined constants. * * * ArrayObject behavior flags * * * * * * * * * * * * *
valueconstant
1 * ArrayObject::STD_PROP_LIST *
2 * ArrayObject::ARRAY_AS_PROPS *
* * @link http://php.net/manual/en/arrayobject.setflags.php * * @param int $flags The new ArrayObject behavior. * @return void * * @since 5.1.0 */ public function setFlags($flags) { } /** * Sort the entries by value * @link http://php.net/manual/en/arrayobject.asort.php * * @return void * * @since 5.2.0 */ public function asort() { } /** * Sort the entries by key * @link http://php.net/manual/en/arrayobject.ksort.php * * @return void * * @since 5.2.0 */ public function ksort() { } /** * Sort the entries with a user-defined comparison function and maintain key association * @link http://php.net/manual/en/arrayobject.uasort.php * * Function cmp_function should accept two * parameters which will be filled by pairs of entries. * The comparison function must return an integer less than, equal * to, or greater than zero if the first argument is considered to * be respectively less than, equal to, or greater than the * second. * * @param callable(TValue, TValue):int $cmp_function * @return void * * @since 5.2.0 */ public function uasort($cmp_function) { } /** * Sort the entries by keys using a user-defined comparison function * @link http://php.net/manual/en/arrayobject.uksort.php * * Function cmp_function should accept two * parameters which will be filled by pairs of entry keys. * The comparison function must return an integer less than, equal * to, or greater than zero if the first argument is considered to * be respectively less than, equal to, or greater than the * second. * * @param callable(TKey, TKey):int $cmp_function The callable comparison function. * @return void * * @since 5.2.0 */ public function uksort($cmp_function) { } /** * Sort entries using a "natural order" algorithm * @link http://php.net/manual/en/arrayobject.natsort.php * * @return void * * @since 5.2.0 */ public function natsort() { } /** * Sort an array using a case insensitive "natural order" algorithm * @link http://php.net/manual/en/arrayobject.natcasesort.php * * @return void * * @since 5.2.0 */ public function natcasesort() { } /** * Unserialize an ArrayObject * @link http://php.net/manual/en/arrayobject.unserialize.php * * @param string $serialized The serialized ArrayObject * @return void The unserialized ArrayObject * * @since 5.3.0 */ public function unserialize($serialized) { } /** * Serialize an ArrayObject * @link http://php.net/manual/en/arrayobject.serialize.php * * @return string The serialized representation of the ArrayObject. * * @since 5.3.0 */ public function serialize() { } /** * Create a new iterator from an ArrayObject instance * @link http://php.net/manual/en/arrayobject.getiterator.php * * @return ArrayIterator An iterator from an ArrayObject. * * @since 5.0.0 */ public function getIterator() { } /** * Exchange the array for another one. * @link http://php.net/manual/en/arrayobject.exchangearray.php * * @param mixed $input The new array or object to exchange with the current array. * @return array the old array. * * @since 5.1.0 */ public function exchangeArray($input) { } /** * Sets the iterator classname for the ArrayObject. * @link http://php.net/manual/en/arrayobject.setiteratorclass.php * * @param string $iterator_class The classname of the array iterator to use when iterating over this object. * @psalm-param class-string>|class-string> $iterator_class * @return void * * @since 5.1.0 */ public function setIteratorClass($iterator_class) { } /** * Gets the iterator classname for the ArrayObject. * @link http://php.net/manual/en/arrayobject.getiteratorclass.php * * @return string the iterator class name that is used to iterate over this object. * @psalm-return class-string>|class-string> * * @since 5.1.0 */ public function getIteratorClass() { } } interface Serializable { /** * @return null|string */ public function serialize(); /** * @param string $data * @return void */ public function unserialize($data); } /** * @template-covariant T as object * @psalm-immutable */ final class WeakReference { // always fail public function __construct() {} /** * @template TIn as object * @param TIn $referent * @return WeakReference */ public static function create(object $referent): WeakReference {} /** @return ?T */ public function get(): ?object {} } /** * @template TKey of object * @template TVal of mixed * @implements ArrayAccess * @implements IteratorAggregate * @implements Traversable * * @since 8.0.0 */ final class WeakMap implements ArrayAccess, Countable, IteratorAggregate, Traversable { /** * @param TKey $offset * @return bool */ public function offsetExists($offset) {} /** * @param TKey $offset * @return TVal|null * @psalm-ignore-nullable-return */ public function offsetGet($offset) {} /** * @param TKey $offset * @param TVal $value * @return void */ public function offsetSet($offset, $value) {} /** * @param TKey $offset * @return void */ public function offsetUnset($offset) {} } class mysqli { /** * @psalm-pure * * @psalm-taint-escape sql * @psalm-flow ($string) -> return */ function escape_string($string) {} /** * @psalm-pure * * @psalm-taint-escape sql * @psalm-flow ($string) -> return */ function real_escape_string($string) {} } class SQLite3 { /** * @psalm-pure * * @psalm-taint-escape sql * @psalm-flow ($string) -> return */ static function escapeString($string) {} } #[Attribute(Attribute::TARGET_METHOD)] final class ReturnTypeWillChange { public function __construct() {} } #[Attribute(Attribute::TARGET_PARAMETER)] final class SensitiveParameter { public function __construct() {} } #[Attribute(Attribute::TARGET_CLASS)] final class AllowDynamicProperties { public function __construct() {} } */ abstract public function getRawArgs(): array; public function isFirstClassCallable(): bool {} /** * @psalm-pure * @return list */ public function getArgs(): array {} } > $dimensions */ public static function arrayType(\FFI\CType $type, array $dimensions): \FFI\CType { } public static function addr(\FFI\CData $ptr): \FFI\CData { } /** * @param \FFI\CData|\FFI\CType $ptr * @return int<0,max> */ public static function sizeof($ptr): int { } /** * @param \FFI\CData|\FFI\CType $ptr * @return positive-int */ public static function alignof($ptr): int { } /** * @param \FFI\CData|string $from * @param int<0,max> $size */ public static function memcpy(\FFI\CData $to, $from, int $size): void { } /** * @param string|\FFI\CData $ptr1 * @param string|\FFI\CData $ptr2 * @param int<0,max> $size */ public static function memcmp(&$ptr1, &$ptr2, int $size): int { } /** * @param int<0,max> $size */ public static function memset(\FFI\CData $ptr, int $value, int $size): void { } /** * @param int<0,max>|null $size */ public static function string(\FFI\CData $ptr, ?int $size = null): string { } public static function isNull(\FFI\CData $ptr): bool { } } } namespace FFI { /** * @since 7.4.0 */ final class CData { } /** * @since 7.4.0 */ final class CType { /** * @since 8.1 */ public const TYPE_VOID = 0; /** * @since 8.1 */ public const TYPE_FLOAT = 1; /** * @since 8.1 */ public const TYPE_DOUBLE = 2; /** * @since 8.1 */ public const TYPE_LONGDOUBLE = 3; /** * @since 8.1 */ public const TYPE_UINT8 = 4; /** * @since 8.1 */ public const TYPE_SINT8 = 5; /** * @since 8.1 */ public const TYPE_UINT16 = 6; /** * @since 8.1 */ public const TYPE_SINT16 = 7; /** * @since 8.1 */ public const TYPE_UINT32 = 8; /** * @since 8.1 */ public const TYPE_SINT32 = 9; /** * @since 8.1 */ public const TYPE_UINT64 = 10; /** * @since 8.1 */ public const TYPE_SINT64 = 11; /** * @since 8.1 */ public const TYPE_ENUM = 12; /** * @since 8.1 */ public const TYPE_BOOL = 13; /** * @since 8.1 */ public const TYPE_CHAR = 14; /** * @since 8.1 */ public const TYPE_POINTER = 15; /** * @since 8.1 */ public const TYPE_FUNC = 16; /** * @since 8.1 */ public const TYPE_ARRAY = 17; /** * @since 8.1 */ public const TYPE_STRUCT = 18; /** * @since 8.1 */ public const ATTR_CONST = 1; /** * @since 8.1 */ public const ATTR_INCOMPLETE_TAG = 2; /** * @since 8.1 */ public const ATTR_VARIADIC = 4; /** * @since 8.1 */ public const ATTR_INCOMPLETE_ARRAY = 8; /** * @since 8.1 */ public const ATTR_VLA = 16; /** * @since 8.1 */ public const ATTR_UNION = 32; /** * @since 8.1 */ public const ATTR_PACKED = 64; /** * @since 8.1 */ public const ATTR_MS_STRUCT = 128; /** * @since 8.1 */ public const ATTR_GCC_STRUCT = 256; /** * @since 8.1 */ public const ABI_DEFAULT = 0; /** * @since 8.1 */ public const ABI_CDECL = 1; /** * @since 8.1 */ public const ABI_FASTCALL = 2; /** * @since 8.1 */ public const ABI_THISCALL = 3; /** * @since 8.1 */ public const ABI_STDCALL = 4; /** * @since 8.1 */ public const ABI_PASCAL = 5; /** * @since 8.1 */ public const ABI_REGISTER = 6; /** * @since 8.1 */ public const ABI_MS = 7; /** * @since 8.1 */ public const ABI_SYSV = 8; /** * @since 8.1 */ public const ABI_VECTORCALL = 9; public function getName(): string { } /** * @since 8.1.0 * @return self::TYPE_* */ public function getKind(): int { } /** * @since 8.1.0 * @return int<0,max> */ public function getSize(): int { } /** * @since 8.1.0 * @return int<0,max> */ public function getAlignment(): int { } /** * @since 8.1.0 */ public function getAttributes(): int { } /** * @since 8.1.0 * @return self::TYPE_UINT32|self::TYPE_UINT64 */ public function getEnumKind(): int { } /** * @since 8.1.0 */ public function getArrayElementType(): CType { } /** * @since 8.1.0 * @return int<0,max> */ public function getArrayLength(): int { } /** * @since 8.1.0 */ public function getPointerType(): CType { } /** * @since 8.1.0 * @return string[] */ public function getStructFieldNames(): array { } /** * @since 8.1.0 * @return int<0,max> */ public function getStructFieldOffset(string $name): int { } /** * @since 8.1.0 */ public function getStructFieldType(string $name): CType { } /** * @since 8.1.0 * @return self::ABI_* */ public function getFuncABI(): int { } /** * @since 8.1.0 */ public function getFuncReturnType(): CType { } /** * @since 8.1.0 * @return int<0,max> */ public function getFuncParameterCount(): int { } /** * @param int<0,max> $index * @since 8.1.0 */ public function getFuncParameterType(int $index): CType { } } /** * @since 7.4.0 */ class Exception extends \Error { } /** * @since 7.4.0 */ final class ParserException extends Exception { } } */ public DOMNodeList $childNodes; /** @readonly */ public ?DOMNode $firstChild; /** @readonly */ public ?DOMNode $lastChild; /** @readonly */ public ?DOMNode $previousSibling; /** @readonly */ public ?DOMNode $nextSibling; /** * @readonly * @var DOMNamedNodeMap|null */ public ?DOMNamedNodeMap $attributes; /** @readonly */ public ?DOMDocument $ownerDocument; /** @readonly */ public ?string $namespaceURI; public string $prefix; /** @readonly */ public ?string $localName; /** @readonly */ public ?string $baseURI; public string $textContent; /** * @return DOMNode|false * @psalm-ignore-falsable-return */ public function appendChild(DOMNode $node) {} /** * @return string|false * @psalm-ignore-falsable-return */ public function C14N(bool $exclusive = false, bool $withComments = false, ?array $xpath = null, ?array $nsPrefixes = null) {} /** * @return int|false * @psalm-ignore-falsable-return */ public function C14NFile(string $uri, bool $exclusive = false, bool $withComments = false, ?array $xpath = null, ?array $nsPrefixes = null) {} /** * @return DOMNode|false * @psalm-ignore-falsable-return */ public function cloneNode(bool $deep = false) {} public function getLineNo(): int {} public function getNodePath(): ?string {} public function hasAttributes(): bool {} public function hasChildNodes(): bool {} /** * @return DOMNode|false * @psalm-ignore-falsable-return */ public function insertBefore(DOMNode $node, ?DOMNode $child = null) {} public function isDefaultNamespace(string $namespace): bool {} public function isSameNode(DOMNode $otherNode): bool {} public function isSupported(string $feature, string $version): bool {} public function lookupNamespaceURI(?string $prefix): ?string {} public function lookupPrefix(string $namespace): ?string {} public function normalize(): void {} /** * @return DOMNode|false * @psalm-ignore-falsable-return */ public function removeChild(DOMNode $child) {} /** * @return DOMNode|false * @psalm-ignore-falsable-return */ public function replaceChild(DOMNode $node, DOMNode $child) {} } class DOMNameSpaceNode { /** @readonly */ public string $nodeName; /** @readonly */ public ?string $nodeValue; /** @readonly */ public int $nodeType; /** @readonly */ public string $prefix; /** @readonly */ public ?string $localName; /** @readonly */ public ?string $namespaceURI; /** @readonly */ public ?DOMDocument $ownerDocument; /** @readonly */ public ?DOMNode $parentNode; } class DOMDocumentFragment extends DOMNode implements DOMParentNode { /** @readonly */ public ?DOMElement $firstElementChild; /** @readonly */ public ?DOMElement $lastElementChild; /** @readonly */ public int $childElementCount; public function __construct() {} public function appendXML(string $data): bool {} /** * @param DOMNode|string ...$nodes * @php-from 8.0 */ public function append(...$nodes): void {} /** * @param DOMNode|string ...$nodes * @php-from 8.0 */ public function prepend(...$nodes): void {} } class DOMDocument extends DOMNode implements DOMParentNode { /** @readonly */ public ?DOMDocumentType $doctype; /** @readonly */ public DOMImplementation $implementation; /** @readonly */ public ?DOMElement $documentElement; /** * @deprecated * @readonly */ public ?string $actualEncoding; /** * @var ?string */ public $encoding; /** @readonly */ public ?string $xmlEncoding; /** * @var bool */ public $standalone; /** * @var bool */ public $xmlStandalone; /** * @var ?string */ public $version; /** * @var ?string */ public $xmlVersion; /** * @var bool */ public $strictErrorChecking; /** * @var ?string */ public $documentURI; /** * @var mixed * @readonly * @deprecated */ public $config; /** * @var bool */ public $formatOutput; /** * @var bool */ public $validateOnParse; /** * @var bool */ public $resolveExternals; /** * @var bool */ public $preserveWhiteSpace; /** * @var bool */ public $recover; /** * @var bool */ public $substituteEntities; /** @readonly */ public ?DOMElement $firstElementChild; /** @readonly */ public ?DOMElement $lastElementChild; /** @readonly */ public int $childElementCount; public function __construct(string $version = '1.0', string $encoding = '') {} /** * @return DOMAttr|false * @psalm-ignore-falsable-return */ public function createAttribute(string $localName) {} /** * @return DOMAttr|false * @psalm-ignore-falsable-return */ public function createAttributeNS(?string $namespace, string $qualifiedName) {} /** * @return DOMCdataSection|false * @psalm-ignore-falsable-return */ public function createCDATASection(string $data) {} /** * @return DOMComment|false * @psalm-ignore-falsable-return */ public function createComment(string $data) {} /** * @throws DOMException * @php-from 8.1 */ public function createComment(string $data): DOMComment {} /** * @return DOMDocumentFragment|false * @psalm-ignore-falsable-return */ public function createDocumentFragment() {} /** * @throws DOMException * @php-from 8.1 */ public function createDocumentFragment(): DOMDocumentFragment {} /** * @return DOMElement|false * @psalm-ignore-falsable-return */ public function createElement(string $localName, string $value = '') {} /** * @return DOMElement|false * @psalm-ignore-falsable-return */ public function createElementNS(?string $namespace, string $qualifiedName, string $value = '') {} /** * @return DOMEntityReference|false * @psalm-ignore-falsable-return */ public function createEntityReference(string $name) {} /** * @return DOMProcessingInstruction|false * @psalm-ignore-falsable-return */ public function createProcessingInstruction(string $target, string $data = '') {} /** * @return DOMText|false * @psalm-ignore-falsable-return */ public function createTextNode(string $data) {} /** * @throws DOMException * @php-from 8.1 */ public function createTextNode(string $data): DOMText {} public function getElementById(string $elementId): ?DOMElement {} /** @return DOMNodeList */ public function getElementsByTagName(string $qualifiedName): DOMNodeList {} /** @return DOMNodeList */ public function getElementsByTagNameNS(string $namespace, string $localName): DOMNodeList {} /** * @return DOMNodeList * @php-from 8.0.3 */ public function getElementsByTagNameNS(?string $namespace, string $localName): DOMNodeList {} /** * @return DOMNode|false * @psalm-ignore-falsable-return */ public function importNode(DOMNode $node, bool $deep = false) {} /** * @return DOMDocument|false * @psalm-ignore-falsable-return **/ public function load(string $filename, int $options = 0) {} /** * @return DOMDocument|false * @psalm-ignore-falsable-return */ public function loadXML(string $source, int $options = 0) {} public function normalizeDocument(): void {} public function registerNodeClass(string $baseClass, ?string $extendedClass): bool {} /** * @return int|false * @psalm-ignore-falsable-return */ public function save(string $filename, int $options = 0) {} /** @return DOMDocument|bool */ public function loadHTML(string $source, int $options = 0) {} /** @return DOMDocument|bool */ public function loadHTMLFile(string $filename, int $options = 0) {} /** * @return string|false * @psalm-ignore-falsable-return */ public function saveHTML(?DOMNode $node = null) {} /** * @return int|false * @psalm-ignore-falsable-return */ public function saveHTMLFile(string $filename) {} /** * @return string|false * @psalm-ignore-falsable-return */ public function saveXML(?DOMNode $node = null, int $options = 0) {} public function schemaValidate(string $filename, int $flags = 0): bool {} public function schemaValidateSource(string $source, int $flags = 0): bool {} public function relaxNGValidate(string $filename): bool {} public function relaxNGValidateSource(string $source): bool {} public function validate(): bool {} /** * @return int|false * @psalm-ignore-falsable-return */ public function xinclude(int $options = 0) {} /** * @return DOMNode|false * @psalm-ignore-falsable-return */ public function adoptNode(DOMNode $node) {} /** * @return DOMNode|string ...$nodes * @php-from 8.0 */ public function append(...$nodes) : void {} /** * @return DOMNode|string ...$nodes * @php-from 8.0 */ public function prepend(...$nodes) : void {} } /** * @template-covariant TNode as DOMNode * @template-implements Traversable */ class DOMNodeList implements Traversable { /** @readonly */ public int $length; /** * @return TNode|null * @psalm-ignore-nullable-return */ public function item(int $index) {} } /** * @template-covariant TNode as DOMNode * @template-implements Traversable * * @php-from 7.2 */ class DOMNodeList implements Traversable, Countable { /** @readonly */ public int $length; public function count(): int {} /** * @return TNode|null * @psalm-ignore-nullable-return */ public function item(int $index) {} } /** * @template-covariant TNode as DOMNode * @template-implements IteratorAggregate * * @php-from 8.0 */ class DOMNodeList implements IteratorAggregate, Countable { /** @readonly */ public int $length; public function count(): int {} /** @return Iterator */ public function getIterator() : Iterator {} /** * @return TNode|null * @psalm-ignore-nullable-return */ public function item(int $index) {} } /** * @template-covariant TNode as DOMNode * @template-implements Traversable */ class DOMNamedNodeMap implements Traversable, Countable { /** @readonly */ public int $length; /** @return TNode|null */ public function getNamedItem(string $qualifiedName): ?DOMNode {} /** @return TNode|null */ public function getNamedItemNS(?string $namespace, string $localName): ?DOMNode {} /** * @return TNode|null * @psalm-ignore-nullable-return */ public function item(int $index): ?DOMNode {} public function count(): int {} } /** * @template-covariant TNode as DOMNode * @template-implements IteratorAggregate * * @php-from 8.0 */ class DOMNamedNodeMap implements IteratorAggregate, Countable { /** @readonly */ public int $length; /** @return TNode|null */ public function getNamedItem(string $qualifiedName): ?DOMNode {} /** @return TNode|null */ public function getNamedItemNS(?string $namespace, string $localName): ?DOMNode {} /** * @return TNode|null * @psalm-ignore-nullable-return */ public function item(int $index): ?DOMNode {} public function count(): int {} /** @return Iterator */ public function getIterator() : Iterator {} } class DOMCharacterData extends DOMNode implements DOMChildNode { public string $data; /** @readonly */ public int $length; /** @readonly */ public ?DOMElement $previousElementSibling; /** @readonly */ public ?DOMElement $nextElementSibling; public function appendData(string $data): bool {} /** * @return string|false * @psalm-ignore-falsable-return */ public function substringData(int $offset, int $count) {} public function insertData(int $offset, string $data): bool {} public function deleteData(int $offset, int $count): bool {} public function replaceData(int $offset, int $count, string $data): bool {} /** * @param DOMNode|string ...$nodes * @php-from 8.0 */ public function replaceWith(...$nodes) : void {} /** @php-from 8.0 */ public function remove() : void {} /** * @param DOMNode|string ...$nodes * @php-from 8.0 */ public function before(...$nodes) : void {} /** * @param DOMNode|string ...$nodes * @php-from 8.0 */ public function after(...$nodes) : void {} } class DOMAttr extends DOMNode { /** @readonly */ public string $name; /** @readonly */ public bool $specified; public string $value; /** @readonly */ public ?DOMElement $ownerElement; /** @readonly */ public mixed $schemaTypeInfo; /** * Inherited from DOMNode, but always non-null * @readonly */ public string $localName; public function __construct(string $name, string $value = '') {} public function isId(): bool {} } class DOMElement extends DOMNode implements DOMParentNode, DOMChildNode { /** @readonly */ public string $tagName; /** @readonly */ public mixed $schemaTypeInfo; /** @readonly */ public ?DOMElement $firstElementChild; /** @readonly */ public ?DOMElement $lastElementChild; /** @readonly */ public int $childElementCount; /** @readonly */ public ?DOMElement $previousElementSibling; /** @readonly */ public ?DOMElement $nextElementSibling; /** * Inherited from DOMNode, but always non-null. * * @readonly * @var DOMNamedNodeMap */ public DOMNamedNodeMap $attributes; /** * Inherited from DOMNode, but always non-null * @readonly */ public string $localName; public function __construct(string $qualifiedName, ?string $value = null, string $namespace = '') {} public function getAttribute(string $qualifiedName): string {} public function getAttributeNS(?string $namespace, string $localName): string {} /** * @return DOMAttr|DOMNameSpaceNode|false * @psalm-ignore-falsable-return */ public function getAttributeNode(string $qualifiedName) {} /** * @return DOMAttr|DOMNameSpaceNode|false * @psalm-ignore-falsable-return */ public function getAttributeNodeNS(?string $namespace, string $localName) {} /** @return DOMNodeList */ public function getElementsByTagName(string $qualifiedName): DOMNodeList {} /** @return DOMNodeList */ public function getElementsByTagNameNS(string $namespace, string $localName): DOMNodeList {} /** * @return DOMNodeList * @php-from 8.0.3 */ public function getElementsByTagNameNS(?string $namespace, string $localName): DOMNodeList {} public function hasAttribute(string $qualifiedName): bool {} public function hasAttributeNS(?string $namespace, string $localName): bool {} public function removeAttribute(string $qualifiedName): bool {} public function removeAttributeNS(?string $namespace, string $localName): void {} /** * @return DOMAttr|false * @psalm-ignore-falsable-return */ public function removeAttributeNode(DOMAttr $attr) {} /** * @return DOMAttr|false * @psalm-ignore-falsable-return */ public function setAttribute(string $qualifiedName, string $value) {} public function setAttributeNS(?string $namespace, string $qualifiedName, string $value): void {} /** * @return DOMAttr|null|false * @psalm-ignore-falsable-return */ public function setAttributeNode(DOMAttr $attr) {} /** * @return DOMAttr|null|false * @psalm-ignore-falsable-return */ public function setAttributeNodeNS(DOMAttr $attr) {} public function setIdAttribute(string $qualifiedName, bool $isId): void {} public function setIdAttributeNS(string $namespace, string $qualifiedName, bool $isId): void {} public function setIdAttributeNode(DOMAttr $attr, bool $isId): void {} /** @php-from 8.0 */ public function remove() : void {} /** * @param DOMNode|string ...$nodes * @php-from 8.0 */ public function before(...$nodes) : void {} /** * @param DOMNode|string ...$nodes * @php-from 8.0 */ public function after(...$nodes) : void {} /** * @param DOMNode|string ...$nodes * @php-from 8.0 */ public function replaceWith(...$nodes) : void {} /** * @param DOMNode|string ...$nodes * @php-from 8.0 */ public function append(...$nodes) : void {} /** * @param DOMNode|string ...$nodes * @php-from 8.0 */ public function prepend(...$nodes) : void {} } class DOMText extends DOMCharacterData { /** @readonly */ public string $wholeText; public function __construct(string $data = '') {} public function isWhitespaceInElementContent(): bool {} /** * @alias DOMText::isWhitespaceInElementContent */ public function isElementContentWhitespace(): bool {} /** * @return DOMText|false * @psalm-ignore-falsable-return */ public function splitText(int $offset) {} } class DOMComment extends DOMCharacterData { public function __construct(string $data = '') {} } class DOMCdataSection extends DOMText { public function __construct(string $data) {} } class DOMDocumentType extends DOMNode { /** @readonly */ public string $name; /** @readonly */ public DOMNamedNodeMap $entities; /** @readonly */ public DOMNamedNodeMap $notations; /** @readonly */ public string $publicId; /** @readonly */ public string $systemId; /** @readonly */ public ?string $internalSubset; } class DOMNotation extends DOMNode { /** @readonly */ public string $publicId; /** @readonly */ public string $systemId; } class DOMEntity extends DOMNode { /** @readonly */ public ?string $publicId; /** @readonly */ public ?string $systemId; /** @readonly */ public ?string $notationName; /** * @readonly * @deprecated */ public ?string $actualEncoding; /** * @readonly * @deprecated */ public ?string $encoding; /** * @readonly * @deprecated */ public ?string $version; } class DOMEntityReference extends DOMNode { public function __construct(string $name) {} } class DOMProcessingInstruction extends DOMNode { /** @readonly */ public string $target; public string $data; public function __construct(string $name, string $value = '') {} } class DOMXPath { /** @readonly */ public DOMDocument $document; public bool $registerNodeNamespaces; public function __construct(DOMDocument $document, bool $registerNodeNS = true) {} public function evaluate(string $expression, ?DOMNode $contextNode = null, bool $registerNodeNS = true): mixed {} /** * @return DOMNodeList|false */ public function query(string $expression, ?DOMNode $contextNode = null, bool $registerNodeNS = true): mixed {} public function registerNamespace(string $prefix, string $namespace): bool {} public function registerPhpFunctions(string|array|null $restrict = null): void {} } ` operator. * * @param mixed $other * * @return int 0 if this decimal is considered is equal to $other, * -1 if this decimal should be placed before $other, * 1 if this decimal should be placed after $other. */ public function compareTo($other): int {} /** * String representation. * * This method is equivalent to a cast to string, as well as `toString`. * * @return string the value of this decimal represented exactly, in either * fixed or scientific form, depending on the value. */ public function __toString(): string {} /** * JSON * * This method is only here to honour the interface, and is equivalent to * `toString`. JSON does not have a decimal type so all decimals are encoded * as strings in the same format as `toString`. * * @return string */ public function jsonSerialize() {} } |null|string $search * @param int $format * @param int $chunk_size * @param int $list * * @return void */ public function __construct($search, $format = APC_ITER_ALL, $chunk_size = 100, $list = APC_LIST_ACTIVE) { } /** * @return void */ public function rewind() { } /** * @return void */ public function next() { } /** * @return bool */ public function valid() { } /** * @return string */ public function key() { } /** * @return mixed */ public function current() { } /** * @return int */ public function getTotalHits() { } /** * @return int */ public function getTotalSize() { } /** * @return int */ public function getTotalCount() { } } * URI of the WSDL file or NULL if working in * non-WSDL mode. *

*

* During development, WSDL caching may be disabled by the * use of the soap.wsdl_cache_ttl php.ini setting * otherwise changes made to the WSDL file will have no effect until * soap.wsdl_cache_ttl is expired. *

* @param array $options [optional]

* An array of options. If working in WSDL mode, this parameter is optional. * If working in non-WSDL mode, the location and * uri options must be set, where location * is the URL of the SOAP server to send the request to, and uri * is the target namespace of the SOAP service. *

*

* The style and use options only work in * non-WSDL mode. In WSDL mode, they come from the WSDL file. *

*

* The soap_version option should be one of either * SOAP_1_1 or SOAP_1_2 to * select SOAP 1.1 or 1.2, respectively. If omitted, 1.1 is used. *

*

* For HTTP authentication, the login and * password options can be used to supply credentials. * For making an HTTP connection through * a proxy server, the options proxy_host, * proxy_port, proxy_login * and proxy_password are also available. * For HTTPS client certificate authentication use * local_cert and passphrase options. An * authentication may be supplied in the authentication * option. The authentication method may be either * SOAP_AUTHENTICATION_BASIC (default) or * SOAP_AUTHENTICATION_DIGEST. *

*

* The compression option allows to use compression * of HTTP SOAP requests and responses. *

*

* The encoding option defines internal character * encoding. This option does not change the encoding of SOAP requests (it is * always utf-8), but converts strings into it. *

*

* The trace option enables tracing of request so faults * can be backtraced. This defaults to FALSE *

*

* The classmap option can be used to map some WSDL * types to PHP classes. This option must be an array with WSDL types * as keys and names of PHP classes as values. *

*

* Setting the boolean trace option enables use of the * methods * SoapClient->__getLastRequest, * SoapClient->__getLastRequestHeaders, * SoapClient->__getLastResponse and * SoapClient->__getLastResponseHeaders. *

*

* The exceptions option is a boolean value defining whether * soap errors throw exceptions of type * SoapFault. *

*

* The connection_timeout option defines a timeout in seconds * for the connection to the SOAP service. This option does not define a timeout * for services with slow responses. To limit the time to wait for calls to finish the * default_socket_timeout setting * is available. *

*

* The typemap option is an array of type mappings. * Type mapping is an array with keys type_name, * type_ns (namespace URI), from_xml * (callback accepting one string parameter) and to_xml * (callback accepting one object parameter). *

*

* The cache_wsdl option is one of * WSDL_CACHE_NONE, * WSDL_CACHE_DISK, * WSDL_CACHE_MEMORY or * WSDL_CACHE_BOTH. *

*

* The user_agent option specifies string to use in * User-Agent header. *

*

* The stream_context option is a resource * for context. *

*

* The features option is a bitmask of * SOAP_SINGLE_ELEMENT_ARRAYS, * SOAP_USE_XSI_ARRAY_TYPE, * SOAP_WAIT_ONE_WAY_CALLS. *

*

* The keep_alive option is a boolean value defining whether * to send the Connection: Keep-Alive header or * Connection: close. *

*

* The ssl_method option is one of * SOAP_SSL_METHOD_TLS, * SOAP_SSL_METHOD_SSLv2, * SOAP_SSL_METHOD_SSLv3 or * SOAP_SSL_METHOD_SSLv23. *

* @throws SoapFault A SoapFault exception will be thrown if the wsdl URI cannot be loaded. * @since 5.0.1 */ public function __construct ($wsdl, array $options = null) {} /** * Calls a SOAP function (deprecated) * @link https://php.net/manual/en/soapclient.call.php * @param string $function_name * @param array $arguments * @return mixed * @since 5.0.1 */ public function __call ($function_name, $arguments) {} /** * Calls a SOAP function * @link https://php.net/manual/en/soapclient.soapcall.php * @param string $function_name

* The name of the SOAP function to call. *

* @param array $arguments

* An array of the arguments to pass to the function. This can be either * an ordered or an associative array. Note that most SOAP servers require * parameter names to be provided, in which case this must be an * associative array. *

* @param array $options [optional]

* An associative array of options to pass to the client. *

*

* The location option is the URL of the remote Web service. *

*

* The uri option is the target namespace of the SOAP service. *

*

* The soapaction option is the action to call. *

* @param mixed $input_headers [optional]

* An array of headers to be sent along with the SOAP request. *

* @param array $output_headers [optional]

* If supplied, this array will be filled with the headers from the SOAP response. *

* @return mixed SOAP functions may return one, or multiple values. If only one value is returned * by the SOAP function, the return value of __soapCall will be * a simple value (e.g. an integer, a string, etc). If multiple values are * returned, __soapCall will return * an associative array of named output parameters. *

*

* On error, if the SoapClient object was constructed with the exceptions * option set to FALSE, a SoapFault object will be returned. * @since 5.0.1 */ public function __soapCall (string $function_name, array $arguments, array $options = null, $input_headers = null, &$output_headers = null) {} /** * Returns last SOAP request * @link https://php.net/manual/en/soapclient.getlastrequest.php * @return string|null The last SOAP request, as an XML string. * @since 5.0.1 */ public function __getLastRequest () {} /** * Returns last SOAP response * @link https://php.net/manual/en/soapclient.getlastresponse.php * @return string|null The last SOAP response, as an XML string. * @since 5.0.1 */ public function __getLastResponse () {} /** * Returns the SOAP headers from the last request * @link https://php.net/manual/en/soapclient.getlastrequestheaders.php * @return string|null The last SOAP request headers. * @since 5.0.1 */ public function __getLastRequestHeaders () {} /** * Returns the SOAP headers from the last response * @link https://php.net/manual/en/soapclient.getlastresponseheaders.php * @return string|null The last SOAP response headers. * @since 5.0.1 */ public function __getLastResponseHeaders () {} /** * Returns list of available SOAP functions * @link https://php.net/manual/en/soapclient.getfunctions.php * @return array|null The array of SOAP function prototypes, detailing the return type, * the function name and type-hinted parameters. * @since 5.0.1 */ public function __getFunctions () {} /** * Returns a list of SOAP types * @link https://php.net/manual/en/soapclient.gettypes.php * @return array|null The array of SOAP types, detailing all structures and types. * @since 5.0.1 */ public function __getTypes () {} /** * Returns a list of all cookies * @link https://php.net/manual/en/soapclient.getcookies.php * @return array The array of all cookies * @since 5.4.3 */ public function __getCookies () {} /** * The __setCookie purpose * @link https://php.net/manual/en/soapclient.setcookie.php * @param string $name

* The name of the cookie. *

* @param string $value [optional]

* The value of the cookie. If not specified, the cookie will be deleted. *

* @return void No value is returned. * @since 5.0.4 */ public function __setCookie ($name, $value = null) {} /** * Sets the location of the Web service to use * @link https://php.net/manual/en/soapclient.setlocation.php * @param string $new_location [optional]

* The new endpoint URL. *

* @return string The old endpoint URL. * @since 5.0.1 */ public function __setLocation ($new_location = null) {} /** * Sets SOAP headers for subsequent calls * @link https://php.net/manual/en/soapclient.setsoapheaders.php * @param mixed $soapheaders [optional]

* The headers to be set. It could be SoapHeader * object or array of SoapHeader objects. * If not specified or set to NULL, the headers will be deleted. *

* @return bool TRUE on success or FALSE on failure. * @since 5.0.5 */ public function __setSoapHeaders ($soapheaders = null) {} } class SoapFault extends Exception { /** * @param array|string|null $code */ public function __construct( $code, string $string, ?string $actor = null, mixed $details = null, ?string $name = null, mixed $headerFault = null ) {} } class SoapHeader { public function __construct( string $namespace, string $name, // Actually doesn't have a default, not specifying results in no SoapHeader::$data property. Specifying null // results in a SoapHeader::$data property with null as the value. This probably makes no difference. mixed $data = null, bool $mustUnderstand = false, // Same as $data, no default. The documentation specifies this as a `string` but it accepts null. ?string $actor = null ) {} } */ class mysqli_result implements Traversable { /** * @psalm-taint-sink callable $class * * @template T of object * @param class-string $class * @param array $constructor_args * @return T|null|false */ function fetch_object(string $class = stdClass::class, array $constructor_args = []): object|false|null {} } /** * @psalm-taint-sink callable $class * * @template T of object * @template TValue * * @param mysqli_result $result * @param class-string $class * @param array $constructor_args * @return T|null|false */ function mysqli_fetch_object(mysqli_result $result, string $class = stdClass::class, array $constructor_args = []): object|false|null {} */ interface Collection extends Traversable, Countable, JsonSerializable { /** * @return Collection * @psalm-mutation-free */ public function copy(): Collection; /** * @return array * @psalm-mutation-free */ public function toArray(): array; /** * @psalm-mutation-free */ public function isEmpty(): bool; /** * @psalm-mutation-free */ public function count(): int; } /** * @template TValue * @implements Sequence */ final class Deque implements Sequence { /** * @param iterable $values */ public function __construct(iterable $values = []) { } /** * @return Deque * @psalm-mutation-free */ public function copy(): Deque { } /** * @return list * @psalm-mutation-free */ public function toArray(): array { } /** * @psalm-mutation-free */ public function isEmpty(): bool { } /** * @psalm-mutation-free */ public function count(): int { } /** * @psalm-mutation-free */ public function allocate(int $capacity): void { } /** * @psalm-mutation-free */ public function capacity(): int { } /** * @return float|int * @psalm-mutation-free */ public function sum() { } /** * @param TValue ...$values * @psalm-mutation-free */ public function contains(...$values): bool { } /** * @param (callable(TValue): bool)|null $callback * @return Deque * @psalm-mutation-free */ public function filter(callable $callback = null): Deque { } /** * @param TValue $value * @return int|false * @psalm-mutation-free */ public function find($value) { } /** * @return TValue * @throws \UnderflowException * @psalm-mutation-free */ public function first() { } /** * @return TValue * @throws \OutOfRangeException * @psalm-mutation-free */ public function get(int $index) { } /** * @psalm-mutation-free */ public function join(?string $glue = null): string { } /** * @return TValue * @throws \UnderflowException * @psalm-mutation-free */ public function last() { } /** * @template TNewValue * @param callable(TValue): TNewValue $callback * @return Deque * @psalm-mutation-free */ public function map(callable $callback): Deque { } /** * @template TValue2 * @param iterable $values * @return Deque * @psalm-mutation-free */ public function merge(iterable $values): Deque { } /** * @return TValue * @throws \UnderflowException */ public function pop() { } /** * @template TCarry * @param callable(TCarry, TValue): TCarry $callback * @param TCarry $initial * @return TCarry * @psalm-mutation-free */ public function reduce(callable $callback, $initial = null) { } /** * @return TValue * @throws \OutOfRangeException */ public function remove(int $index) { } /** * @return Deque * @psalm-mutation-free */ public function reversed(): Deque { } /** * @return TValue * @throws \UnderflowException */ public function shift() { } /** * @return Deque * @psalm-mutation-free */ public function slice(int $offset, ?int $length = null): Deque { } /** * @param (callable(TValue, TValue): int)|null $comparator * @return Deque * @psalm-mutation-free */ public function sorted(callable $comparator = null): Deque { } } /** * @template TKey * @template TValue * @implements Collection * @implements ArrayAccess */ final class Map implements Collection, ArrayAccess { /** * @param iterable $values */ public function __construct(iterable $values = []) { } /** * @psalm-mutation-free */ public function allocate(int $capacity): void { } /** * @psalm-mutation-free */ public function capacity(): int { } /** * @return Map * @psalm-mutation-free */ public function copy(): Map { } /** * @return array * @psalm-mutation-free */ public function toArray(): array { } /** * @psalm-mutation-free */ public function isEmpty(): bool { } /** * @psalm-mutation-free */ public function count(): int { } /** * @param callable(TKey, TValue): TValue $callback */ public function apply(callable $callback): void { } /** * @return Pair * @throws UnderflowException * @psalm-mutation-free */ public function first(): Pair { } /** * @return Pair * @throws UnderflowException * @psalm-mutation-free */ public function last(): Pair { } /** * @return Pair * @throws OutOfRangeException * @psalm-mutation-free */ public function skip(int $position): Pair { } /** * @template TKey2 * @template TValue2 * @param iterable $values * @return Map * @psalm-mutation-free */ public function merge(iterable $values): Map { } /** * @template TKey2 * @template TValue2 * @param Map $map * @return Map * @psalm-mutation-free */ public function intersect(Map $map): Map { } /** * @template TValue2 * @param Map $map * @return Map * @psalm-mutation-free */ public function diff(Map $map): Map { } /** * @param TKey $key * @psalm-mutation-free */ public function hasKey($key): bool { } /** * @param TValue $value * @psalm-mutation-free */ public function hasValue($value): bool { } /** * @param (callable(TKey, TValue): bool)|null $callback * @return Map * @psalm-mutation-free */ public function filter(callable $callback = null): Map { } /** * @template TDefault * @param TKey $key * @param TDefault $default * @return ( * func_num_args() is 1 * ? TValue * : TValue|TDefault * ) * @throws OutOfBoundsException * @psalm-mutation-free */ public function get($key, $default = null) { } /** * @return Set * @psalm-mutation-free */ public function keys(): Set { } /** * @template TNewValue * @param callable(TKey, TValue): TNewValue $callback * @return Map * @psalm-mutation-free */ public function map(callable $callback): Map { } /** * @return Sequence> * @psalm-mutation-free */ public function pairs(): Sequence { } /** * @param TKey $key * @param TValue $value */ public function put($key, $value) { } /** * @param iterable $values */ public function putAll(iterable $values) { } /** * @template TCarry * @param callable(TCarry, TKey, TValue): TCarry $callback * @param TCarry $initial * @return TCarry * @psalm-mutation-free */ public function reduce(callable $callback, $initial = null) { } /** * @template TDefault * @param TKey $key * @param TDefault $default * @return ( * func_num_args() is 1 * ? TValue * : TValue|TDefault * ) * @throws \OutOfBoundsException */ public function remove($key, $default = null) { } /** * @return Map * @psalm-mutation-free */ public function reversed(): Map { } /** * @return Map * @psalm-mutation-free */ public function slice(int $offset, ?int $length = null): Map { } /** * @param (callable(TValue, TValue): int)|null $comparator */ public function sort(callable $comparator = null) { } /** * @param (callable(TValue, TValue): int)|null $comparator * @return Map * @psalm-mutation-free */ public function sorted(callable $comparator = null): Map { } /** * @param (callable(TKey, TKey): int)|null $comparator */ public function ksort(callable $comparator = null) { } /** * @param (callable(TKey, TKey): int)|null $comparator * @return Map * @psalm-mutation-free */ public function ksorted(callable $comparator = null): Map { } /** * @return Sequence * @psalm-mutation-free */ public function values(): Sequence { } /** * @template TKey2 * @template TValue2 * @param Map $map * @return Map * @psalm-mutation-free */ public function union(Map $map): Map { } /** * @template TKey2 * @template TValue2 * @param Map $map * @return Map * @psalm-mutation-free */ public function xor(Map $map): Map { } } /** * @template-covariant TKey * @template-covariant TValue */ final class Pair implements JsonSerializable { /** * @var TKey */ public $key; /** * @var TValue */ public $value; /** * @param TKey $key * @param TValue $value */ public function __construct($key = null, $value = null) { } /** * @return Pair * @psalm-mutation-free */ public function copy(): Pair { } } /** * @template TValue * @extends Collection * @extends ArrayAccess */ interface Sequence extends Collection, ArrayAccess { /** * @return Sequence * @psalm-mutation-free */ public function copy(): Sequence; /** * @return list * @psalm-mutation-free */ public function toArray(): array; /** * @psalm-mutation-free */ public function isEmpty(): bool; /** * @psalm-mutation-free */ public function count(): int; /** * @psalm-mutation-free */ public function allocate(int $capacity): void; /** * @psalm-mutation-free */ public function capacity(): int; /** * @return float|int * @psalm-mutation-free */ public function sum(); /** * @param callable(TValue): TValue $callback */ public function apply(callable $callback): void; /** * @param TValue ...$values * @psalm-mutation-free */ public function contains(...$values): bool; /** * @param (callable(TValue): bool)|null $callback * @return Sequence * @psalm-mutation-free */ public function filter(callable $callback = null): Sequence; /** * @param TValue $value * @return int|false * @psalm-mutation-free */ public function find($value); /** * @return TValue * @throws \UnderflowException * @psalm-mutation-free */ public function first(); /** * @return TValue * @throws \OutOfRangeException * @psalm-mutation-free */ public function get(int $index); /** * @param TValue ...$values * @throws \OutOfRangeException */ public function insert(int $index, ...$values); /** * @psalm-mutation-free */ public function join(?string $glue = null): string; /** * @return TValue * @throws \UnderflowException * @psalm-mutation-free */ public function last(); /** * @template TNewValue * @param callable(TValue): TNewValue $callback * @return Sequence * @psalm-mutation-free */ public function map(callable $callback): Sequence; /** * @template TValue2 * @param iterable $values * @return Sequence * @psalm-mutation-free */ public function merge(iterable $values): Sequence; /** * @return TValue * @throws \UnderflowException */ public function pop(); /** * @param TValue ...$values */ public function push(...$values); /** * @template TCarry * @param callable(TCarry, TValue): TCarry $callback * @param TCarry $initial * @return TCarry * @psalm-mutation-free */ public function reduce(callable $callback, $initial = null); /** * @return TValue * @throws \OutOfRangeException */ public function remove(int $index); /** * @return Sequence * @psalm-mutation-free */ public function reversed(): Sequence; /** * @param TValue $value * @throws \OutOfRangeException */ public function set(int $index, $value); /** * @return TValue * @throws \UnderflowException */ public function shift(); /** * @return Sequence * @psalm-mutation-free */ public function slice(int $index, ?int $length = null): Sequence; /** * @param (callable(TValue, TValue): int)|null $comparator */ public function sort(callable $comparator = null); /** * @param (callable(TValue, TValue): int)|null $comparator * @return Sequence * @psalm-mutation-free */ public function sorted(callable $comparator = null): Sequence; /** * @param TValue ...$values */ public function unshift(...$values); } /** * @template TValue * @implements Sequence */ final class Vector implements Sequence { /** * @param iterable $values */ public function __construct(iterable $values = []) { } /** * @return Vector * @psalm-mutation-free */ public function copy(): Vector { } /** * @return list * @psalm-mutation-free */ public function toArray(): array { } /** * @psalm-mutation-free */ public function isEmpty(): bool { } /** * @psalm-mutation-free */ public function count(): int { } /** * @psalm-mutation-free */ public function allocate(int $capacity): void { } /** * @psalm-mutation-free */ public function capacity(): int { } /** * @return float|int * @psalm-mutation-free */ public function sum() { } /** * @param TValue ...$values * @psalm-mutation-free */ public function contains(...$values): bool { } /** * @param (callable(TValue): bool)|null $callback * @return Vector * @psalm-mutation-free */ public function filter(callable $callback = null): Vector { } /** * @param TValue $value * @return int|false * @psalm-mutation-free */ public function find($value) { } /** * @return TValue * @throws \UnderflowException * @psalm-mutation-free */ public function first() { } /** * @return TValue * @throws \OutOfRangeException * @psalm-mutation-free */ public function get(int $index) { } /** * @psalm-mutation-free */ public function join(?string $glue = null): string { } /** * @return TValue * @throws \UnderflowException * @psalm-mutation-free */ public function last() { } /** * @template TNewValue * @param callable(TValue): TNewValue $callback * @return Vector * @psalm-mutation-free */ public function map(callable $callback): Vector { } /** * @template TValue2 * @param iterable $values * @return Vector * @psalm-mutation-free */ public function merge(iterable $values): Sequence { } /** * @return TValue * @throws \UnderflowException */ public function pop() { } /** * @template TCarry * @param callable(TCarry, TValue): TCarry $callback * @param TCarry $initial * @return TCarry * @psalm-mutation-free */ public function reduce(callable $callback, $initial = null) { } /** * @return TValue * @throws \OutOfRangeException */ public function remove(int $index) { } /** * @return Vector * @psalm-mutation-free */ public function reversed(): Vector { } /** * @return TValue * @throws \UnderflowException */ public function shift() { } /** * @return Vector * @psalm-mutation-free */ public function slice(int $offset, ?int $length = null): Vector { } /** * @param (callable(TValue, TValue): int)|null $comparator * @return Vector * @psalm-mutation-free */ public function sorted(callable $comparator = null): Vector { } } /** * @template TValue * @implements Collection * @implements ArrayAccess */ final class Set implements Collection, ArrayAccess { /** * @param iterable $values */ public function __construct(iterable $values = []) { } /** * @return Set * @psalm-mutation-free */ public function copy(): Set { } /** * @return list * @psalm-mutation-free */ public function toArray(): array { } /** * @psalm-mutation-free */ public function isEmpty(): bool { } /** * @psalm-mutation-free */ public function count(): int { } /** * @psalm-mutation-free */ public function allocate(int $capacity): void { } /** * @psalm-mutation-free */ public function capacity(): int { } /** * @param TValue ...$values */ public function add(...$values): void { } /** * @param TValue ...$values * @psalm-mutation-free */ public function contains(...$values): bool { } /** * @template TValue2 * @param Set $set * @return Set * @psalm-mutation-free */ public function diff(Set $set): Set { } /** * @param (callable(TValue): bool)|null $callback * @return Set * @psalm-mutation-free */ public function filter(callable $callback = null): Set { } /** * @return TValue * @throws \UnderflowException * @psalm-mutation-free */ public function first() { } /** * @return TValue * @throws \OutOfRangeException * @psalm-mutation-free */ public function get(int $index) { } /** * @template TValue2 * @param Set $set * @return Set * @psalm-mutation-free */ public function intersect(Set $set): Set { } /** * @return TValue * @throws \UnderflowException * @psalm-mutation-free */ public function last() { } /** * @template TNewValue * @param callable(TValue): TNewValue $callback * @return Set */ public function map(callable $callback): Set { } /** * @template TValue2 * @param iterable $values * @return Set * @psalm-mutation-free */ public function merge(iterable $values): Set { } /** * @param TValue ...$values */ public function remove(...$values): void { } /** * @return Set * @psalm-mutation-free */ public function reversed(): Set { } /** * @return Set * @psalm-mutation-free */ public function slice(int $index, ?int $length = null): Set { } /** * @param (callable(TValue, TValue): int)|null $comparator */ public function sort(callable $comparator = null): void { } /** * @param (callable(TValue, TValue): int)|null $comparator * @return Set * @psalm-mutation-free */ public function sorted(callable $comparator = null): Set { } /** * @template TValue2 * @param Set $set * @return Set * @psalm-mutation-free */ public function union(Set $set): Set { } /** * @template TValue2 * @param Set $set * @return Set * @psalm-mutation-free */ public function xor(Set $set): Set { } } /** * @template TValue * @implements Collection * @implements ArrayAccess */ final class Stack implements Collection, ArrayAccess { /** * @param iterable $values */ public function __construct(iterable $values = []) { } /** * @return Stack * @psalm-mutation-free */ public function copy(): Stack { } /** * @return list * @psalm-mutation-free */ public function toArray(): array { } /** * @psalm-mutation-free */ public function isEmpty(): bool { } /** * @psalm-mutation-free */ public function count(): int { } /** * @psalm-mutation-free */ public function allocate(int $capacity): void { } /** * @psalm-mutation-free */ public function capacity(): int { } /** * @return TValue * @throws UnderflowException * @psalm-mutation-free */ public function peek() { } /** * @return TValue * @throws UnderflowException */ public function pop() { } /** * @param TValue ...$values */ public function push(...$values): void { } } /** * @template TValue * @implements Collection * @implements ArrayAccess */ final class Queue implements Collection, ArrayAccess { /** * @param iterable $values */ public function __construct(iterable $values = []) { } /** * @return Queue * @psalm-mutation-free */ public function copy(): Queue { } /** * @return list * @psalm-mutation-free */ public function toArray(): array { } /** * @psalm-mutation-free */ public function isEmpty(): bool { } /** * @psalm-mutation-free */ public function count(): int { } /** * @psalm-mutation-free */ public function allocate(int $capacity): void { } /** * @psalm-mutation-free */ public function capacity(): int { } /** * @return TValue * @throws UnderflowException * @psalm-mutation-free */ public function peek() { } /** * @return TValue * @throws UnderflowException */ public function pop() { } /** * @param TValue ...$values */ public function push(...$values): void { } } /** * @template TValue * @implements Collection */ final class PriorityQueue implements Collection { /** * @return PriorityQueue * @psalm-mutation-free */ public function copy(): PriorityQueue { } /** * @return list * @psalm-mutation-free */ public function toArray(): array { } /** * @psalm-mutation-free */ public function isEmpty(): bool { } /** * @psalm-mutation-free */ public function count(): int { } /** * @psalm-mutation-free */ public function allocate(int $capacity): void { } /** * @psalm-mutation-free */ public function capacity(): int { } /** * @return TValue * @throws UnderflowException * @psalm-mutation-free */ public function peek() { } /** * @return TValue * @throws UnderflowException */ public function pop() { } /** * @param TValue $value */ public function push($value, int $priority): void { } } */ class PDOStatement implements Traversable { /** * @psalm-taint-sink callable $class * * @template T of object * @param class-string $class * @param array $ctorArgs * @return false|T */ public function fetchObject($class = \stdclass::class, array $ctorArgs = array()) {} } class PDOException extends RuntimeException { protected string $code; public ?array $errorInfo = null; } */ interface CursorInterface extends Traversable { /** * @return array */ public function toArray(); } /** * @template-covariant TValue of array|object * * @template-implements Iterator * @template-implements CursorInterface */ final class Cursor implements CursorInterface, Iterator { /** * @return TValue */ public function current() {} /** * @return void */ public function next() {} /** * @return int */ public function key() {} /** * @return bool */ public function valid() {} /** * @return void */ public function rewind() {} /** * @return array */ public function toArray() {} } |Redis */ public function mget(array $keys) {} public function migrate(string $host, int $port, string $key, string $dst, int $timeout, bool $copy = false, bool $replace = false): bool {} public function move(string $key, int $index): bool {} /** * @param array */ public function mset($key_values): Redis|bool {} /** * @param array */ public function msetnx($key_values): Redis|bool {} public function multi(int $value = Redis::MULTI): bool|Redis {} public function object(string $subcommand, string $key): Redis|int|string|false {} /** * @deprecated * @alias Redis::connect */ public function open(string $host, int $port = 6379, float $timeout = 0, string $persistent_id = NULL, int $retry_interval = 0, float $read_timeout = 0, array $context = NULL): bool {} public function pconnect(string $host, int $port = 6379, float $timeout = 0, string $persistent_id = NULL, int $retry_interval = 0, float $read_timeout = 0, array $context = NULL): bool {} public function persist(string $key): bool {} public function pexpire(string $key, int $timeout): bool {} public function pexpireAt(string $key, int $timestamp): bool {} public function pfadd(string $key, array $elements): int {} public function pfcount(string $key): int {} public function pfmerge(string $dst, array $keys): bool {} /** @return false|string|Redis */ public function ping(string $key = NULL) {} public function pipeline(): bool|Redis {} /** * @deprecated * @alias Redis::pconnect */ public function popen(string $host, int $port = 6379, float $timeout = 0, string $persistent_id = NULL, int $retry_interval = 0, float $read_timeout = 0, array $context = NULL): bool {} /** @return bool|Redis */ public function psetex(string $key, int $expire, string $value) {} public function psubscribe(array $patterns): void {} public function pttl(string $key): Redis|int|false {} public function publish(string $channel, string $message): mixed {} public function pubsub(string $command, mixed $arg = null): mixed {} public function punsubscribe(array $patterns): array|false {} /** @return false|string|Redis */ public function rPop(string $key) {} /** @return false|string|Redis */ public function randomKey() {} public function rawcommand(string $command, mixed ...$args): mixed {} /** @return bool|Redis */ public function rename(string $key_src, string $key_dst) {} /** @return bool|Redis */ public function renameNx(string $key_src, string $key_dst) {} public function restore(string $key, int $timeout, string $value): bool {} public function role(): mixed {} public function rpoplpush(string $src, string $dst): Redis|string|false {} public function sAdd(string $key, string $value, mixed ...$other_values): Redis|int|false {} public function sAddArray(string $key, array $values): int {} public function sDiff(string $key, string ...$other_keys): Redis|array|false {} public function sDiffStore(string $dst, string $key, string ...$other_keys): Redis|int|false {} public function sInter(array|string $key, string ...$other_keys): Redis|array|false {} public function sInterStore(array|string $key, string ...$other_keys): Redis|int|false {} public function sMembers(string $key): Redis|array|false {} public function sMisMember(string $key, string $member, string ...$other_members): array|false {} public function sMove(string $src, string $dst, string $value): Redis|bool {} public function sPop(string $key, int $count = 0): Redis|string|array|false {} public function sRandMember(string $key, int $count = 0): Redis|string|array|false {} public function sUnion(string $key, string ...$other_keys): Redis|array|false {} public function sUnionStore(string $dst, string $key, string ...$other_keys): Redis|int|false {} public function save(): bool {} public function scan(?int &$iterator, ?string $pattern = null, int $count = 0, string $type = NULL): array|false {} public function scard(string $key): Redis|int|false {} public function script(string $command, mixed ...$args): mixed {} public function select(int $db): bool {} /** @return bool|Redis */ public function set(string $key, string $value, mixed $opt = NULL) {} /** @return false|int|Redis */ public function setBit(string $key, int $idx, bool $value) {} /** @return false|int|Redis */ public function setRange(string $key, int $start, string $value) {} public function setOption(int $option, mixed $value): bool {} /** @return bool|Redis */ public function setex(string $key, int $expire, string $value) {} /** @return bool|array|Redis */ public function setnx(string $key, string $value) {} public function sismember(string $key, string $value): Redis|bool {} public function slaveof(string $host = null, int $port = 6379): bool {} public function slowlog(string $mode, int $option = 0): mixed {} public function sort(string $key, array $options = null): mixed {} /** * @deprecated */ public function sortAsc(string $key, ?string $pattern = null, mixed $get = null, int $offset = -1, int $count = -1, ?string $store = null): array {} /** * @deprecated */ public function sortAscAlpha(string $key, ?string $pattern = null, mixed $get = null, int $offset = -1, int $count = -1, ?string $store = null): array {} /** * @deprecated */ public function sortDesc(string $key, ?string $pattern = null, mixed $get = null, int $offset = -1, int $count = -1, ?string $store = null): array {} /** * @deprecated */ public function sortDescAlpha(string $key, ?string $pattern = null, mixed $get = null, int $offset = -1, int $count = -1, ?string $store = null): array {} public function srem(string $key, string $value, mixed ...$other_values): Redis|int|false {} public function sscan(string $key, int &$iterator, ?string $pattern = null, int $count = 0): array|false {} /** @return false|int|Redis */ public function strlen(string $key) {} public function subscribe(string $channel, string ...$other_channels): array|false {} public function swapdb(string $src, string $dst): bool {} public function time(): array|false {} public function ttl(string $key): Redis|int|false {} /** @return false|int|Redis */ public function type(string $key) {} /** * @return false|int|Redis */ public function unlink(array|string $key, string ...$other_keys) {} public function unsubscribe(string $channel, string ...$other_channels): array|false {} /** @return bool|Redis */ public function unwatch() {} /** * @return bool|Redis */ public function watch(array|string $key, string ...$other_keys) {} public function wait(int $count, int $timeout): int|false {} public function xack(string $key, string $group, array $ids): int|false {} public function xadd(string $key, string $id, array $values, int $maxlen = 0, bool $approx = false): string|false {} public function xclaim(string $key, string $group, string $consumer, int $min_iddle, array $ids, array $options): string|array|false {} public function xdel(string $key, array $ids): Redis|int|false {} public function xgroup(string $operation, string $key = null, string $arg1 = null, string $arg2 = null, bool $arg3 = false): mixed {} public function xinfo(string $operation, ?string $arg1 = null, ?string $arg2 = null, int $count = -1): mixed {} public function xlen(string $key): int {} public function xpending(string $key, string $group, string $start = null, string $end = null, int $count = -1, string $consumer = null): Redis|array|false {} public function xrange(string $key, string $start, string $end, int $count = -1): bool|array {} public function xread(array $streams, int $count = -1, int $block = -1): bool|array {} public function xreadgroup(string $group, string $consumer, array $streams, int $count = 1, int $block = 1): bool|array {} public function xrevrange(string $key, string $start, string $end, int $count = -1): bool|array {} public function xtrim(string $key, int $maxlen, bool $approx = false): int {} public function zAdd(string $key, array|float $score_or_options, mixed ...$more_scores_and_mems): Redis|int|false {} public function zCard(string $key): Redis|int|false {} public function zCount(string $key, string $start , string $end): Redis|int|false {} public function zIncrBy(string $key, float $value, mixed $member): Redis|float|false {} public function zLexCount(string $key, string $min, string $max): Redis|int|false {} public function zMscore(string $key, string $member, string ...$other_members): array|false {} public function zPopMax(string $key, int $value = null): array|false {} public function zPopMin(string $key, int $value = null): array|false {} public function zRange(string $key, int $start, int $end, mixed $scores = null): Redis|array|false {} public function zRangeByLex(string $key, string $min, string $max, int $offset = -1, int $count = -1): array|false {} public function zRangeByScore(string $key, string $start, string $end, array $options = []): Redis|array|false {} public function zRandMember(string $key, array $options = null): string|array|false {} public function zRank(string $key, mixed $member): Redis|int|false {} public function zRem(mixed $key, mixed $member, mixed ...$other_members): Redis|int|false {} public function zRemRangeByLex(string $key, string $min, string $max): int|false {} public function zRemRangeByRank(string $key, int $start, int $end): Redis|int|false {} public function zRemRangeByScore(string $key, string $start, string $end): Redis|int|false {} public function zRevRange(string $key, int $start, int $end, mixed $scores = null): Redis|array|false {} public function zRevRangeByLex(string $key, string $min, string $max, int $offset = -1, int $count = -1): array|false {} public function zRevRangeByScore(string $key, string $start, string $end, array $options = []): array|false {} public function zRevRank(string $key, mixed $member): Redis|int|false {} public function zScore(string $key, mixed $member): Redis|float|false {} public function zdiff(array $keys, array $options = null): array|false {} public function zdiffstore(string $dst, array $keys, array $options = null): int {} public function zinter(array $keys, ?array $weights = null, ?array $options = null): Redis|array|false {} public function zinterstore(string $dst, array $keys, ?array $weights = null, ?string $aggregate = null): Redis|int|false {} public function zscan(string $key, ?int &$iterator, ?string $pattern = null, int $count = 0): bool|array {} public function zunion(array $keys, ?array $weights = null, ?array $options = null): Redis|array|false {} public function zunionstore(string $dst, array $keys, ?array $weights = NULL, ?string $aggregate = NULL): Redis|int|false {} } > */ function xdebug_get_code_coverage() : array { } /** * @param array $configuration */ function xdebug_set_filter(int $group, int $list_type, array $configuration) : array { } function xdebug_start_code_coverage(int $options) : void { } function xdebug_stop_code_coverage(int $cleanup = 1) : void { } $class_name * @return SimpleXMLElement|false */ function simplexml_load_file(string $filename, ?string $class_name = SimpleXMLElement::class, int $options = 0, string $namespace_or_prefix = '', bool $is_prefix = false) {} /** * @param class-string $class_name * @return SimpleXMLElement|false */ function simplexml_load_string(string $data, ?string $class_name = 'SimpleXMLElement', int $options = 0, string $namespace_or_prefix = '', bool $is_prefix = false) {} /** * @param class-string $class_name */ function simplexml_import_dom(DOMNode $node, ?string $class_name = 'SimpleXMLElement'): ?SimpleXMLElement {} /** * @param class-string $class_name * @php-from 8.1 */ function simplexml_import_dom(SimpleXMLElement|DOMNode $node, ?string $class_name = 'SimpleXMLElement'): ?SimpleXMLElement {} /** * @implements Traversable */ class SimpleXMLElement implements Traversable, Countable { /** @return array|null|false */ public function xpath(string $expression) {} public function registerXPathNamespace(string $prefix, string $namespace): bool {} /** @return ($filename is null ? string|false : bool) */ public function asXML(?string $filename = null) {} /** * @return ($filename is null ? string|false : bool) * @alias SimpleXMLElement::asXML */ public function saveXML(?string $filename = null) {} public function getNamespaces(bool $recursive = false): array {} /** @return array|false */ public function getDocNamespaces(bool $recursive = false, bool $fromRoot = true) {} public function children(?string $namespaceOrPrefix = null, bool $isPrefix = false): ?SimpleXMLElement {} public function attributes(?string $namespaceOrPrefix = null, bool $isPrefix = false): ?SimpleXMLElement {} final public function __construct(string $data, int $options = 0, bool $dataIsURL = false, string $namespaceOrPrefix = '', bool $isPrefix = false) {} public function addChild(string $qualifiedName, ?string $value = null, ?string $namespace = null): ?SimpleXMLElement {} public function addAttribute(string $qualifiedName, string $value, ?string $namespace = null): void {} public function getName(): string {} public function __toString(): string {} public function count(): int {} } /** * @implements RecursiveIterator */ class SimpleXMLIterator extends SimpleXMLElement implements RecursiveIterator, Countable { public function count(): int {} public function rewind(): void {} public function valid(): bool {} public function current(): SimpleXMLIterator {} public function key(): ?string {} public function next(): void {} public function hasChildren(): bool {} public function getChildren(): SimpleXMLIterator {} } /** * @implements RecursiveIterator * @php-from 8.0 */ class SimpleXMLElement implements Stringable, Countable, RecursiveIterator { public function count(): int {} public function rewind(): void {} public function valid(): bool {} public function current(): SimpleXMLElement {} public function key(): ?string {} public function next(): void {} public function hasChildren(): bool {} public function getChildren(): ?SimpleXMLElement {} } /** @php-from 8.0 */ class SimpleXMLIterator extends SimpleXMLElement { public function current(): SimpleXMLElement {} public function getChildren(): ?SimpleXMLElement {} } */ public static function cases(): array; } interface BackedEnum extends UnitEnum { /** @var non-empty-string $name */ public readonly string $name; public readonly int|string $value; /** * @psalm-pure */ public static function from(string|int $value): static; /** * @psalm-pure */ public static function tryFrom(string|int $value): ?static; /** * @psalm-pure * @return list */ public static function cases(): array; } class ReflectionClass implements Reflector { /** @psalm-pure */ public function isEnum(): bool {} } class ReflectionProperty implements Reflector { /** * Starting from PHP 8.1, this method is pure, and has no effect. * * @psalm-pure */ public function setAccessible(bool $accessible): void {} } class ReflectionMethod extends ReflectionFunctionAbstract { /** * Starting from PHP 8.1, this method is pure, and has no effect. * * @psalm-pure */ public function setAccessible(bool $accessible): void {} } /** @psalm-immutable */ class ReflectionEnum extends ReflectionClass implements Reflector { public function getBackingType(): ?ReflectionType; public function getCase(string $name): ReflectionEnumUnitCase; /** @return list */ public function getCases(): array; public function hasCase(string $name): bool; public function isBacked(): bool; } /** @psalm-immutable */ class ReflectionEnumUnitCase extends ReflectionClassConstant implements Reflector { public function getEnum(): ReflectionEnum; public function getValue(): UnitEnum; } /** @psalm-immutable */ class ReflectionEnumBackedCase extends ReflectionEnumUnitCase implements Reflector { public function getBackingValue(): int|string; } /** @psalm-immutable */ class ReflectionIntersectionType extends ReflectionType { /** @return non-empty-list */ public function getTypes(): array {} /** @return false */ public function allowsNull(): bool {} } } namespace FTP { final class Connection {} } namespace IMAP { final class Connection {} } namespace LDAP { final class Connection {} final class Result {} final class ResultEntry {} } namespace PgSql { final class Connection {} final class Result {} final class Lob {} } namespace PSpell { final class Config {} final class Dictionary {} } */ public function getTypes(): array {} } } $name */ class ReflectionClass implements Reflector { /** * @var class-string */ public $name; /** * @param T|class-string|interface-string|trait-string|enum-string $argument * @psalm-pure */ public function __construct($argument) {} /** * @return class-string * @psalm-pure */ public function getName(): string {} /** @psalm-pure */ public function isInternal(): bool {} /** @psalm-pure */ public function isUserDefined(): bool {} /** @psalm-pure */ public function isInstantiable(): bool {} /** @psalm-pure */ public function isCloneable(): bool {} /** * @return non-empty-string|false * @psalm-pure */ public function getFileName() {} /** * @return positive-int|false * @psalm-pure */ public function getStartLine() {} /** * @return positive-int|false * @psalm-pure */ public function getEndLine() {} /** * @return non-empty-string|false * @psalm-pure */ public function getDocComment() {} /** @psalm-pure */ public function getConstructor(): ?ReflectionMethod {} /** @psalm-pure */ public function hasMethod(string $name): bool {} /** * @psalm-pure * @throws ReflectionException */ public function getMethod(string $name): ReflectionMethod {} /** * @param int-mask-of|null $filter * @return list * @psalm-pure */ public function getMethods(?int $filter = null): array {} /** * @psalm-pure * @throws ReflectionException */ public function hasProperty(string $name): bool {} /** * @psalm-pure * @throws ReflectionException */ public function getProperty(string $name): ReflectionProperty {} /** * @param int-mask-of|null $filter * @return list * * @psalm-pure */ public function getProperties(?int $filter = null): array {} /** * @psalm-pure */ public function hasConstant(string $name): bool {} /** * @return mixed * * @psalm-pure * @throws ReflectionException */ public function getConstant(string $name) {} /** * @return ReflectionClassConstant|false * * @psalm-pure * @throws ReflectionException */ public function getReflectionConstant(string $name) {} /** * @param int-mask-of|null $filter * @return array * * @psalm-pure */ public function getConstants(?int $filter = null): array {} /** * @param int-mask-of|null $filter * @return list * * @psalm-pure */ public function getReflectionConstants(?int $filter = null): array {} /** * @return array * @psalm-pure */ public function getInterfaces(): array {} /** * @return list * @psalm-pure */ public function getInterfaceNames(): array {} /** @psalm-pure */ public function isInterface(): bool {} /** * @return array * * @psalm-pure */ public function getTraits(): array {} /** * @return array * * @psalm-pure */ public function getTraitAliases(): array {} /** @psalm-pure */ public function isTrait(): bool {} /** @psalm-pure */ public function isAbstract(): bool {} /** @psalm-pure */ public function isFinal(): bool {} /** * @return int-mask-of * @psalm-pure */ public function getModifiers(): int {} /** * @template J as object * @param J $object * @psalm-assert-if-true T&J $object * @psalm-pure */ public function isInstance(object $object): bool {} /** * @param mixed ...$args * * @return T */ public function newInstance(...$args): object {} /** * @param list $args * * @return T */ public function newInstanceArgs(array $args): object {} /** * @return T */ public function newInstanceWithoutConstructor(): object {} /** * @psalm-pure * * @return ReflectionClass|false */ public function getParentClass() {} /** * @template J as object * @param self|class-string $class * @psalm-assert-if-true self $this * @psalm-pure */ public function isSubclassOf($class): bool {} /** @return array */ public function getStaticProperties(): array {} /** * @return array * * @psalm-pure */ public function getDefaultProperties(): array {} /** @psalm-pure */ public function isIterateable(): bool {} /** @psalm-pure */ public function isIterable(): bool {} /** * @template J as object * @param self|interface-string $interface * @psalm-assert-if-true self $this * @psalm-pure */ public function implementsInterface($interface): bool {} /** @psalm-pure */ public function getExtension(): ?ReflectionExtension {} /** * @return non-empty-string|false * * @psalm-pure */ public function getExtensionName() {} /** @psalm-pure */ public function inNamespace(): bool {} /** @psalm-pure */ public function getNamespaceName(): string {} /** * @return non-empty-string * * @psalm-pure */ public function getShortName(): string {} /** * @return list * @psalm-pure */ public function getTraitNames(): array {} /** * @since 8.0 * @template TClass as object * @param class-string|null $name * @return ($name is null ? list> : list>) * @psalm-pure */ public function getAttributes(?string $name = null, int $flags = 0): array {} } abstract class ReflectionFunctionAbstract implements Reflector { /** @psalm-pure */ public function inNamespace(): bool {} /** @psalm-pure */ public function isClosure(): bool {} /** @psalm-pure */ public function isDeprecated(): bool {} /** @psalm-pure */ public function isInternal(): bool {} /** @psalm-pure */ public function isUserDefined(): bool {} public function getClosureThis(): ?object {} /** @psalm-pure */ public function getClosureScopeClass(): ?ReflectionClass {} /** @psalm-pure */ public function getClosureCalledClass(): ?ReflectionClass {} /** * @return non-empty-string|false * * @psalm-pure */ public function getDocComment() {} /** * @return positive-int|false * * @psalm-pure */ public function getStartLine() {} /** * @return positive-int|false * * @psalm-pure */ public function getEndLine() {} /** @psalm-pure */ public function getExtension(): ?ReflectionExtension {} /** * @return non-empty-string|false * * @psalm-pure */ public function getExtensionName() {} /** * @return non-empty-string|false * * @psalm-pure */ public function getFileName() {} /** * @return non-empty-string * * @psalm-pure */ public function getName(): string {} /** @psalm-pure */ public function getNamespaceName(): string {} /** * @return positive-int|0 * * @psalm-pure */ public function getNumberOfParameters(): int {} /** * @return positive-int|0 * * @psalm-pure */ public function getNumberOfRequiredParameters(): int {} /** * @return list * * @psalm-pure */ public function getParameters(): array {} /** * @psalm-assert-if-true ReflectionType $this->getReturnType() * * @psalm-pure */ public function hasReturnType(): bool {} /** @psalm-pure */ public function getReturnType(): ?ReflectionType {} /** * @return non-empty-string * * @psalm-pure */ public function getShortName(): string {} /** @psalm-pure */ public function returnsReference(): bool {} /** @psalm-pure */ public function isGenerator(): bool {} /** @psalm-pure */ public function isVariadic(): bool {} /** @psalm-pure */ public function isDisabled(): bool {} /** @psalm-pure */ public function getClosure(): Closure {} /** * @since 8.0 * @template TClass as object * @param class-string|null $name * @return ($name is null ? array> : array>) */ public function getAttributes(?string $name = null, int $flags = 0): array {} } class ReflectionFunction extends ReflectionFunctionAbstract { /** * @param callable-string|Closure $function * * @psalm-pure */ public function __construct(callable $function) {} /** * @return non-empty-string * * @psalm-pure */ public function __toString(): string {} } class ReflectionProperty implements Reflector { /** * @var string * @readonly */ public $name; /** * @var class-string * @readonly */ public $class; /** * @return non-empty-string * * @psalm-pure */ public function getName(): string {} /** * @since 8.0 * @template TClass as object * @param class-string|null $name * @return ($name is null ? array> : array>) */ public function getAttributes(?string $name = null, int $flags = 0): array {} /** * @since 7.4 * @psalm-assert-if-true ReflectionType $this->getType() * @psalm-pure */ public function hasType() : bool {} /** * @since 7.4 * @psalm-pure */ public function getType() : ?ReflectionType {} /** @psalm-pure */ public function isPublic(): bool {} /** @psalm-pure */ public function isPrivate(): bool {} /** @psalm-pure */ public function isProtected(): bool {} /** @psalm-pure */ public function isStatic(): bool {} /** @psalm-pure */ public function isDefault(): bool {} /** * @return int-mask-of * @psalm-pure */ public function getModifiers(): int {} /** @psalm-pure */ public function getDeclaringClass(): ReflectionClass {} /** * @return non-empty-string|false * * @psalm-pure */ public function getDocComment() {} /** * @since 8.0 * @psalm-pure */ public function hasDefaultValue(): bool {} /** * @return mixed * * @psalm-pure */ public function getDefaultValue() {} /** * @since 8.0 * @psalm-pure */ public function isPromoted(): bool {} /** * @since 8.1 * @psalm-pure */ public function isReadOnly(): bool {} } class ReflectionMethod extends ReflectionFunctionAbstract { /** * @var string * @readonly */ public $name; /** * @var class-string * @readonly */ public $class; /** @psalm-pure */ public function isStatic(): bool {} /** @psalm-pure */ public function isConstructor(): bool {} /** @psalm-pure */ public function isDestructor(): bool {} /** * @return int-mask-of * @psalm-pure */ public function getModifiers(): int {} /** @psalm-pure */ public function getDeclaringClass(): ReflectionClass {} /** @psalm-pure */ public function getPrototype(): ReflectionMethod {} } /** @psalm-immutable */ class ReflectionClassConstant implements Reflector { /** * @var non-empty-string * @readonly */ public $name; /** * @var class-string * @readonly */ public $class; /** * @var bool * @since 8.1 * @readonly */ public $isFinal; /** * @since 8.0 * @template TClass as object * @param class-string|null $name * @return ($name is null ? array> : array>) */ public function getAttributes(?string $name = null, int $flags = 0): array {} /** @return non-empty-string */ public function getName(): string {} /** @return int-mask-of */ public function getModifiers(): int {} /** @return non-empty-string|false */ public function getDocComment() {} } /** @psalm-immutable */ class ReflectionParameter implements Reflector { /** * @var non-empty-string * @readonly */ public $name; /** @return non-empty-string */ public function getName(): string {} /** * @psalm-assert-if-true ReflectionType $this->getType() */ public function hasType() : bool {} public function getType() : ?ReflectionType {} /** * @since 8.0 * @template TClass as object * @param class-string|null $name * @return ($name is null ? array> : array>) */ public function getAttributes(?string $name = null, int $flags = 0): array {} /** * @since 8.0 */ public function isPromoted(): bool {} /** * @psalm-assert-if-true string $this->getDefaultValueConstantName() */ public function isDefaultValueConstant(): bool {} public function getDefaultValueConstantName(): ?string {} } /** @psalm-immutable */ abstract class ReflectionType { } /** @psalm-immutable */ class ReflectionNamedType extends ReflectionType { /** @return non-empty-string */ public function getName(): string {} /** * @psalm-assert-if-false class-string|'self'|'static' $this->getName() */ public function isBuiltin(): bool {} /** @return non-empty-string */ public function __toString(): string {} } */ class DatePeriod implements Traversable { const EXCLUDE_START_DATE = 1; /** * @param Start $start * @param (Start is string ? 0|self::EXCLUDE_START_DATE : DateInterval) $interval * @param (Start is string ? never : DateTimeInterface|positive-int) $end * @param (Start is string ? never : 0|self::EXCLUDE_START_DATE) $options */ public function __construct($start, $interval = 0, $end = 1, $options = 0) {} } /** * @psalm-taint-specialize */ interface Throwable { /** * @psalm-mutation-free */ public function getMessage() : string; /** * @psalm-mutation-free * * @return int|string https://www.php.net/manual/en/throwable.getcode.php */ public function getCode(); /** * @psalm-mutation-free */ public function getFile() : string; /** * @psalm-mutation-free */ public function getLine() : int; /** * @psalm-mutation-free * @return list',args?:array}> */ public function getTrace() : array; /** * @psalm-mutation-free */ public function getPrevious() : ?Throwable; /** * @psalm-mutation-free * @psalm-taint-source input */ public function getTraceAsString() : string; /** * @return string * @psalm-taint-source input */ public function __toString(); } /** * @psalm-taint-specialize */ class Exception implements Throwable { /** * @var string */ protected $message = ''; /** * @var int */ protected $code = 0; /** * @var string */ protected $file = ''; /** * @var int */ protected $line = 0; /** * @psalm-external-mutation-free * @param string $message * @param int $code * @param Throwable $previous */ public function __construct($message = "", $code = 0, Throwable $previous = null) {} /** * @psalm-mutation-free */ public final function getMessage() : string {} /** * @psalm-mutation-free * * @return int|string https://www.php.net/manual/en/throwable.getcode.php */ public final function getCode() {} /** * @psalm-mutation-free */ public final function getFile(): string {} /** * @psalm-mutation-free */ public final function getLine(): int {} /** * @psalm-mutation-free * @return list',args?:array}> */ public final function getTrace() : array {} /** * @psalm-mutation-free */ public final function getPrevious() : ?Throwable {} /** * @psalm-mutation-free * @psalm-taint-source input */ public final function getTraceAsString() : string {} /** * @return string * @psalm-taint-source input */ public function __toString() {} } /** * @psalm-taint-specialize */ class Error implements Throwable { /** * @var string */ protected $message = ''; /** * @var int */ protected $code = 0; /** * @var string */ protected $file = ''; /** * @var int */ protected $line = 0; /** * @psalm-external-mutation-free * @param string $message * @param int $code * @param Throwable $previous */ public function __construct($message = "", $code = 0, Throwable $previous = null) {} /** * @psalm-mutation-free */ public final function getMessage() : string {} /** * @psalm-mutation-free */ public final function getCode(): int {} /** * @psalm-mutation-free */ public final function getFile(): string {} /** * @psalm-mutation-free */ public final function getLine(): int{} /** * @psalm-mutation-free * @return list',args?:array}> */ public final function getTrace() : array {} /** * @psalm-mutation-free */ public final function getPrevious() : ?Throwable {} /** * @psalm-mutation-free * @psalm-taint-source input */ public final function getTraceAsString() : string {} /** * @return string * @psalm-taint-source input */ public function __toString() {} } */ public function getTarget() : int { } /** @psalm-pure */ public function isRepeated() : bool { } public function getArguments() : array { } /** * @return TClass */ public function newInstance() : object { } /** * @return never-return */ private function __clone() { } } /** * @template-covariant T as object * * @property-read class-string $name */ class ReflectionClass implements Reflector { /** * @return non-empty-string|false * @psalm-pure */ public function getFileName(): string|false {} /** * @return positive-int|false * @psalm-pure */ public function getStartLine(): int|false {} /** * @return positive-int|false * @psalm-pure */ public function getEndLine(): int|false {} /** * @return non-empty-string|false * @psalm-pure */ public function getDocComment(): string|false {} /** * @template J as object * @param self|class-string $class * @psalm-assert-if-true self $this * @psalm-pure */ public function isSubclassOf(self|string $class): bool {} /** * @template J as object * @param self|interface-string $interface * @psalm-assert-if-true self $this * @psalm-pure */ public function implementsInterface(self|string $interface): bool {} /** * @return non-empty-string|false * * @psalm-pure */ public function getExtensionName(): string|false {} /** * @param list|array $args * * @return T */ public function newInstanceArgs(array $args): object {} } /** @psalm-immutable */ class ReflectionClassConstant { public const IS_PUBLIC = 1; public const IS_PROTECTED = 2; public const IS_PRIVATE = 4; /** @return non-empty-string|false */ public function getDocComment(): string|false {} } abstract class ReflectionFunctionAbstract implements Reflector { /** * @return non-empty-string|false * * @psalm-pure */ public function getDocComment(): string|false {} /** * @return positive-int|false * * @psalm-pure */ public function getStartLine(): int|false {} /** * @return positive-int|false * * @psalm-pure */ public function getEndLine(): int|false {} /** * @return non-empty-string|false * * @psalm-pure */ public function getFileName(): string|false {} /** * @return non-empty-string|false * * @psalm-pure */ public function getExtensionName(): string|false {} } /** @psalm-immutable */ class Attribute { public int $flags; public const TARGET_CLASS = 1; public const TARGET_FUNCTION = 2; public const TARGET_METHOD = 4; public const TARGET_PROPERTY = 8; public const TARGET_CLASS_CONSTANT = 16; public const TARGET_PARAMETER = 32; public const TARGET_ALL = 63; public const IS_REPEATABLE = 64; /** * @param int-mask-of $flags */ public function __construct(int $flags = self::TARGET_ALL) { } } class ReflectionProperty implements Reflector { /** * @return non-empty-string|false * * @psalm-pure */ public function getDocComment(): string|false {} } /** @psalm-immutable */ class ReflectionUnionType extends ReflectionType { /** @return non-empty-list */ public function getTypes(): array {} } class UnhandledMatchError extends Error {} /** * @psalm-immutable * * @template-covariant Start of string|DateTimeInterface * @implements IteratorAggregate */ class DatePeriod implements IteratorAggregate { const EXCLUDE_START_DATE = 1; /** * @param Start $start * @param (Start is string ? 0|self::EXCLUDE_START_DATE : DateInterval) $interval * @param (Start is string ? never : DateTimeInterface|positive-int) $end * @param (Start is string ? never : 0|self::EXCLUDE_START_DATE) $options */ public function __construct($start, $interval = 0, $end = 1, $options = 0) {} /** @psalm-return (Start is string ? (Traversable&Iterator) : (Traversable&Iterator)) */ public function getIterator(): Iterator {} } /** * @psalm-pure * * @param resource|null $context * * @return ($associative is false|0 ? list : array>)|false * * @psalm-taint-sink ssrf $url */ function get_headers(string $url, bool $associative = false, $context = null) : array|false {} * @license OSL-3.0 http://opensource.org/licenses/osl-3.0 * @link http://cweiske.de/ */ /** * Simple exception * * @category Netresearch * @package JsonMapper * @author Christian Weiske * @license OSL-3.0 http://opensource.org/licenses/osl-3.0 * @link http://cweiske.de/ */ class JsonMapper_Exception extends \Exception { } * @license OSL-3.0 http://opensource.org/licenses/osl-3.0 * @link http://cweiske.de/ */ /** * Automatically map JSON structures into objects. * * @category Netresearch * @package JsonMapper * @author Christian Weiske * @license OSL-3.0 http://opensource.org/licenses/osl-3.0 * @link http://cweiske.de/ */ class JsonMapper { /** * PSR-3 compatible logger object * * @link http://www.php-fig.org/psr/psr-3/ * @var object * @see setLogger() */ protected $logger; /** * Throw an exception when JSON data contain a property * that is not defined in the PHP class * * @var boolean */ public $bExceptionOnUndefinedProperty = \false; /** * Throw an exception if the JSON data miss a property * that is marked with @required in the PHP class * * @var boolean */ public $bExceptionOnMissingData = \false; /** * If the types of map() parameters shall be checked. * * You have to disable it if you're using the json_decode "assoc" parameter. * * json_decode($str, false) * * @var boolean */ public $bEnforceMapType = \true; /** * Throw an exception when an object is expected but the JSON contains * a non-object type. * * @var boolean */ public $bStrictObjectTypeChecking = \false; /** * Throw an exception, if null value is found * but the type of attribute does not allow nulls. * * @var bool */ public $bStrictNullTypes = \true; /** * Allow mapping of private and proteted properties. * * @var boolean */ public $bIgnoreVisibility = \false; /** * Remove attributes that were not passed in JSON, * to avoid confusion between them and NULL values. * * @var boolean */ public $bRemoveUndefinedAttributes = \false; /** * Override class names that JsonMapper uses to create objects. * Useful when your setter methods accept abstract classes or interfaces. * * @var array */ public $classMap = array(); /** * Callback used when an undefined property is found. * * Works only when $bExceptionOnUndefinedProperty is disabled. * * Parameters to this function are: * 1. Object that is being filled * 2. Name of the unknown JSON property * 3. JSON value of the property * * @var callable */ public $undefinedPropertyHandler = null; /** * Runtime cache for inspected classes. This is particularly effective if * mapArray() is called with a large number of objects * * @var array property inspection result cache */ protected $arInspectedClasses = array(); /** * Method to call on each object after deserialization is done. * * Is only called if it exists on the object. * * @var string|null */ public $postMappingMethod = null; /** * Map data all data in $json into the given $object instance. * * @param object|array $json JSON object structure from json_decode() * @param object $object Object to map $json data into * * @return mixed Mapped object is returned. * @see mapArray() */ public function map($json, $object) { if ($this->bEnforceMapType && !\is_object($json)) { throw new \InvalidArgumentException('JsonMapper::map() requires first argument to be an object' . ', ' . \gettype($json) . ' given.'); } if (!\is_object($object)) { throw new \InvalidArgumentException('JsonMapper::map() requires second argument to be an object' . ', ' . \gettype($object) . ' given.'); } $strClassName = \get_class($object); $rc = new \ReflectionClass($object); $strNs = $rc->getNamespaceName(); $providedProperties = array(); foreach ($json as $key => $jvalue) { $key = $this->getSafeName($key); $providedProperties[$key] = \true; // Store the property inspection results so we don't have to do it // again for subsequent objects of the same type if (!isset($this->arInspectedClasses[$strClassName][$key])) { $this->arInspectedClasses[$strClassName][$key] = $this->inspectProperty($rc, $key); } list($hasProperty, $accessor, $type, $isNullable) = $this->arInspectedClasses[$strClassName][$key]; if (!$hasProperty) { if ($this->bExceptionOnUndefinedProperty) { throw new JsonMapper_Exception('JSON property "' . $key . '" does not exist' . ' in object of type ' . $strClassName); } else { if ($this->undefinedPropertyHandler !== null) { \call_user_func($this->undefinedPropertyHandler, $object, $key, $jvalue); } else { $this->log('info', 'Property {property} does not exist in {class}', array('property' => $key, 'class' => $strClassName)); } } continue; } if ($accessor === null) { if ($this->bExceptionOnUndefinedProperty) { throw new JsonMapper_Exception('JSON property "' . $key . '" has no public setter method' . ' in object of type ' . $strClassName); } $this->log('info', 'Property {property} has no public setter method in {class}', array('property' => $key, 'class' => $strClassName)); continue; } if ($isNullable || !$this->bStrictNullTypes) { if ($jvalue === null) { $this->setProperty($object, $accessor, null); continue; } $type = $this->removeNullable($type); } else { if ($jvalue === null) { throw new JsonMapper_Exception('JSON property "' . $key . '" in class "' . $strClassName . '" must not be NULL'); } } $type = $this->getFullNamespace($type, $strNs); $type = $this->getMappedType($type, $jvalue); if ($type === null || $type === 'mixed') { //no given type - simply set the json data $this->setProperty($object, $accessor, $jvalue); continue; } else { if ($this->isObjectOfSameType($type, $jvalue)) { $this->setProperty($object, $accessor, $jvalue); continue; } else { if ($this->isSimpleType($type)) { if ($type === 'string' && \is_object($jvalue)) { throw new JsonMapper_Exception('JSON property "' . $key . '" in class "' . $strClassName . '" is an object and' . ' cannot be converted to a string'); } \settype($jvalue, $type); $this->setProperty($object, $accessor, $jvalue); continue; } } } //FIXME: check if type exists, give detailed error message if not if ($type === '') { throw new JsonMapper_Exception('Empty type at property "' . $strClassName . '::$' . $key . '"'); } else { if (\strpos($type, '|')) { throw new JsonMapper_Exception('Cannot decide which of the union types shall be used: ' . $type); } } $array = null; $subtype = null; if ($this->isArrayOfType($type)) { //array $array = array(); $subtype = \substr($type, 0, -2); } else { if (\substr($type, -1) == ']') { list($proptype, $subtype) = \explode('[', \substr($type, 0, -1)); if ($proptype == 'array') { $array = array(); } else { $array = $this->createInstance($proptype, \false, $jvalue); } } else { if (\is_a($type, 'ArrayObject', \true)) { $array = $this->createInstance($type, \false, $jvalue); } } } if ($array !== null) { if (!\is_array($jvalue) && $this->isFlatType(\gettype($jvalue))) { throw new JsonMapper_Exception('JSON property "' . $key . '" must be an array, ' . \gettype($jvalue) . ' given'); } $cleanSubtype = $this->removeNullable($subtype); $subtype = $this->getFullNamespace($cleanSubtype, $strNs); $child = $this->mapArray($jvalue, $array, $subtype, $key); } else { if ($this->isFlatType(\gettype($jvalue))) { //use constructor parameter if we have a class // but only a flat type (i.e. string, int) if ($this->bStrictObjectTypeChecking) { throw new JsonMapper_Exception('JSON property "' . $key . '" must be an object, ' . \gettype($jvalue) . ' given'); } $child = $this->createInstance($type, \true, $jvalue); } else { $child = $this->createInstance($type, \false, $jvalue); $this->map($jvalue, $child); } } $this->setProperty($object, $accessor, $child); } if ($this->bExceptionOnMissingData) { $this->checkMissingData($providedProperties, $rc); } if ($this->bRemoveUndefinedAttributes) { $this->removeUndefinedAttributes($object, $providedProperties); } if ($this->postMappingMethod !== null && $rc->hasMethod($this->postMappingMethod)) { $refDeserializePostMethod = $rc->getMethod($this->postMappingMethod); $refDeserializePostMethod->setAccessible(\true); $refDeserializePostMethod->invoke($object); } return $object; } /** * Convert a type name to a fully namespaced type name. * * @param string $type Type name (simple type or class name) * @param string $strNs Base namespace that gets prepended to the type name * * @return string Fully-qualified type name with namespace */ protected function getFullNamespace($type, $strNs) { if ($type === null || $type === '' || $type[0] === '\\' || $strNs === '') { return $type; } list($first) = \explode('[', $type, 2); if ($first === 'mixed' || $this->isSimpleType($first)) { return $type; } //create a full qualified namespace return '\\' . $strNs . '\\' . $type; } /** * Check required properties exist in json * * @param array $providedProperties array with json properties * @param object $rc Reflection class to check * * @throws JsonMapper_Exception * * @return void */ protected function checkMissingData($providedProperties, \ReflectionClass $rc) { foreach ($rc->getProperties() as $property) { $rprop = $rc->getProperty($property->name); $docblock = $rprop->getDocComment(); $annotations = static::parseAnnotations($docblock); if (isset($annotations['required']) && !isset($providedProperties[$property->name])) { throw new JsonMapper_Exception('Required property "' . $property->name . '" of class ' . $rc->getName() . ' is missing in JSON data'); } } } /** * Remove attributes from object that were not passed in JSON data. * * This is to avoid confusion between those that were actually passed * as NULL, and those that weren't provided at all. * * @param object $object Object to remove properties from * @param array $providedProperties Array with JSON properties * * @return void */ protected function removeUndefinedAttributes($object, $providedProperties) { foreach (\get_object_vars($object) as $propertyName => $dummy) { if (!isset($providedProperties[$propertyName])) { unset($object->{$propertyName}); } } } /** * Map an array * * @param array $json JSON array structure from json_decode() * @param mixed $array Array or ArrayObject that gets filled with * data from $json * @param string $class Class name for children objects. * All children will get mapped onto this type. * Supports class names and simple types * like "string" and nullability "string|null". * Pass "null" to not convert any values * @param string $parent_key Defines the key this array belongs to * in order to aid debugging. * * @return mixed Mapped $array is returned */ public function mapArray($json, $array, $class = null, $parent_key = '') { $originalClass = $class; foreach ($json as $key => $jvalue) { $class = $this->getMappedType($originalClass, $jvalue); if ($class === null) { $array[$key] = $jvalue; } else { if ($this->isArrayOfType($class)) { $array[$key] = $this->mapArray($jvalue, array(), \substr($class, 0, -2)); } else { if ($this->isFlatType(\gettype($jvalue))) { //use constructor parameter if we have a class // but only a flat type (i.e. string, int) if ($jvalue === null) { $array[$key] = null; } else { if ($this->isSimpleType($class)) { \settype($jvalue, $class); $array[$key] = $jvalue; } else { $array[$key] = $this->createInstance($class, \true, $jvalue); } } } else { if ($this->isFlatType($class)) { throw new JsonMapper_Exception('JSON property "' . ($parent_key ? $parent_key : '?') . '"' . ' is an array of type "' . $class . '"' . ' but contained a value of type' . ' "' . \gettype($jvalue) . '"'); } else { if (\is_a($class, 'ArrayObject', \true)) { $array[$key] = $this->mapArray($jvalue, $this->createInstance($class)); } else { $array[$key] = $this->map($jvalue, $this->createInstance($class, \false, $jvalue)); } } } } } } return $array; } /** * Try to find out if a property exists in a given class. * Checks property first, falls back to setter method. * * @param ReflectionClass $rc Reflection class to check * @param string $name Property name * * @return array First value: if the property exists * Second value: the accessor to use ( * ReflectionMethod or ReflectionProperty, or null) * Third value: type of the property * Fourth value: if the property is nullable */ protected function inspectProperty(\ReflectionClass $rc, $name) { //try setter method first $setter = 'set' . $this->getCamelCaseName($name); if ($rc->hasMethod($setter)) { $rmeth = $rc->getMethod($setter); if ($rmeth->isPublic() || $this->bIgnoreVisibility) { $isNullable = \false; $rparams = $rmeth->getParameters(); if (\count($rparams) > 0) { $isNullable = $rparams[0]->allowsNull(); $ptype = $rparams[0]->getType(); if ($ptype !== null) { $typeName = $this->stringifyReflectionType($ptype); //allow overriding an "array" type hint // with a more specific class in the docblock if ($typeName !== 'array') { return array(\true, $rmeth, $typeName, $isNullable); } } } $docblock = $rmeth->getDocComment(); $annotations = static::parseAnnotations($docblock); if (!isset($annotations['param'][0])) { return array(\true, $rmeth, null, $isNullable); } list($type) = \explode(' ', \trim($annotations['param'][0])); return array(\true, $rmeth, $type, $this->isNullable($type)); } } //now try to set the property directly //we have to look it up in the class hierarchy $class = $rc; $rprop = null; do { if ($class->hasProperty($name)) { $rprop = $class->getProperty($name); } } while ($rprop === null && ($class = $class->getParentClass())); if ($rprop === null) { //case-insensitive property matching foreach ($rc->getProperties() as $p) { if (\strcasecmp($p->name, $name) === 0) { $rprop = $p; break; } } } if ($rprop !== null) { if ($rprop->isPublic() || $this->bIgnoreVisibility) { $docblock = $rprop->getDocComment(); $annotations = static::parseAnnotations($docblock); if (!isset($annotations['var'][0])) { // If there is no annotations (higher priority) inspect // if there's a scalar type being defined if (\PHP_VERSION_ID >= 70400 && $rprop->hasType()) { $rPropType = $rprop->getType(); $propTypeName = $this->stringifyReflectionType($rPropType); if ($this->isSimpleType($propTypeName)) { return array(\true, $rprop, $propTypeName, $rPropType->allowsNull()); } return array(\true, $rprop, '\\' . \ltrim($propTypeName, '\\'), $rPropType->allowsNull()); } return array(\true, $rprop, null, \false); } //support "@var type description" list($type) = \explode(' ', $annotations['var'][0]); return array(\true, $rprop, $type, $this->isNullable($type)); } else { //no setter, private property return array(\true, null, null, \false); } } //no setter, no property return array(\false, null, null, \false); } /** * Removes - and _ and makes the next letter uppercase * * @param string $name Property name * * @return string CamelCasedVariableName */ protected function getCamelCaseName($name) { return \str_replace(' ', '', \ucwords(\str_replace(array('_', '-'), ' ', $name))); } /** * Since hyphens cannot be used in variables we have to uppercase them. * * Technically you may use them, but they are awkward to access. * * @param string $name Property name * * @return string Name without hyphen */ protected function getSafeName($name) { if (\strpos($name, '-') !== \false) { $name = $this->getCamelCaseName($name); } return $name; } /** * Set a property on a given object to a given value. * * Checks if the setter or the property are public are made before * calling this method. * * @param object $object Object to set property on * @param object $accessor ReflectionMethod or ReflectionProperty * @param mixed $value Value of property * * @return void */ protected function setProperty($object, $accessor, $value) { if (!$accessor->isPublic() && $this->bIgnoreVisibility) { $accessor->setAccessible(\true); } if ($accessor instanceof \ReflectionProperty) { $accessor->setValue($object, $value); } else { //setter method $accessor->invoke($object, $value); } } /** * Create a new object of the given type. * * This method exists to be overwritten in child classes, * so you can do dependency injection or so. * * @param string $class Class name to instantiate * @param boolean $useParameter Pass $parameter to the constructor or not * @param mixed $jvalue Constructor parameter (the json value) * * @return object Freshly created object */ protected function createInstance($class, $useParameter = \false, $jvalue = null) { if ($useParameter) { return new $class($jvalue); } else { $reflectClass = new \ReflectionClass($class); $constructor = $reflectClass->getConstructor(); if (null === $constructor || $constructor->getNumberOfRequiredParameters() > 0) { return $reflectClass->newInstanceWithoutConstructor(); } return $reflectClass->newInstance(); } } /** * Get the mapped class/type name for this class. * Returns the incoming classname if not mapped. * * @param string $type Type name to map * @param mixed $jvalue Constructor parameter (the json value) * * @return string The mapped type/class name */ protected function getMappedType($type, $jvalue = null) { if (isset($this->classMap[$type])) { $target = $this->classMap[$type]; } else { if (\is_string($type) && $type !== '' && $type[0] == '\\' && isset($this->classMap[\substr($type, 1)])) { $target = $this->classMap[\substr($type, 1)]; } else { $target = null; } } if ($target) { if (\is_callable($target)) { $type = $target($type, $jvalue); } else { $type = $target; } } return $type; } /** * Checks if the given type is a "simple type" * * @param string $type type name from gettype() * * @return boolean True if it is a simple PHP type * * @see isFlatType() */ protected function isSimpleType($type) { return $type == 'string' || $type == 'boolean' || $type == 'bool' || $type == 'integer' || $type == 'int' || $type == 'double' || $type == 'float' || $type == 'array' || $type == 'object'; } /** * Checks if the object is of this type or has this type as one of its parents * * @param string $type class name of type being required * @param mixed $value Some PHP value to be tested * * @return boolean True if $object has type of $type */ protected function isObjectOfSameType($type, $value) { if (\false === \is_object($value)) { return \false; } return \is_a($value, $type); } /** * Checks if the given type is a type that is not nested * (simple type except array and object) * * @param string $type type name from gettype() * * @return boolean True if it is a non-nested PHP type * * @see isSimpleType() */ protected function isFlatType($type) { return $type == 'NULL' || $type == 'string' || $type == 'boolean' || $type == 'bool' || $type == 'integer' || $type == 'int' || $type == 'double' || $type == 'float'; } /** * Returns true if type is an array of elements * (bracket notation) * * @param string $strType type to be matched * * @return bool */ protected function isArrayOfType($strType) { return \substr($strType, -2) === '[]'; } /** * Checks if the given type is nullable * * @param string $type type name from the phpdoc param * * @return boolean True if it is nullable */ protected function isNullable($type) { return \stripos('|' . $type . '|', '|null|') !== \false; } /** * Remove the 'null' section of a type * * @param string $type type name from the phpdoc param * * @return string The new type value */ protected function removeNullable($type) { if ($type === null) { return null; } return \substr(\str_ireplace('|null|', '|', '|' . $type . '|'), 1, -1); } /** * Get a string representation of the reflection type. * Required because named, union and intersection types need to be handled. * * @param ReflectionType $type Native PHP type * * @return string "foo|bar" */ protected function stringifyReflectionType(\ReflectionType $type) { if ($type instanceof \ReflectionNamedType) { return ($type->isBuiltin() ? '' : '\\') . $type->getName(); } return \implode('|', \array_map(function (\ReflectionNamedType $type) { return ($type->isBuiltin() ? '' : '\\') . $type->getName(); }, $type->getTypes())); } /** * Copied from PHPUnit 3.7.29, Util/Test.php * * @param string $docblock Full method docblock * * @return array Array of arrays. * Key is the "@"-name like "param", * each value is an array of the rest of the @-lines */ protected static function parseAnnotations($docblock) { $annotations = array(); // Strip away the docblock header and footer // to ease parsing of one line annotations $docblock = \substr($docblock, 3, -2); $re = '/@(?P[A-Za-z_-]+)(?:[ \\t]+(?P.*?))?[ \\t]*\\r?$/m'; if (\preg_match_all($re, $docblock, $matches)) { $numMatches = \count($matches[0]); for ($i = 0; $i < $numMatches; ++$i) { $annotations[$matches['name'][$i]][] = $matches['value'][$i]; } } return $annotations; } /** * Log a message to the $logger object * * @param string $level Logging level * @param string $message Text to log * @param array $context Additional information * * @return null */ protected function log($level, $message, array $context = array()) { if ($this->logger) { $this->logger->log($level, $message, $context); } } /** * Sets a logger instance on the object * * @param LoggerInterface $logger PSR-3 compatible logger object * * @return null */ public function setLogger($logger) { $this->logger = $logger; } } Open Software License v. 3.0 (OSL-3.0) This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work: Licensed under the Open Software License version 3.0 1) Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following: a) to reproduce the Original Work in copies, either alone or as part of a collective work; b) to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work; c) to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License; d) to perform the Original Work publicly; and e) to display the Original Work publicly. 2) Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works. 3) Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work. 4) Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor’s trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license. 5) External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c). 6) Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work. 7) Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer. 8) Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation. 9) Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including “fair use” or “fair dealing”). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c). 10) Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware. 11) Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License. 12) Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License. 13) Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. 14) Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. 15) Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You. 16) Modification of This License. This License is Copyright (c) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under " or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.document = new DOMDocument($xmlVersion, $xmlEncoding ?? ''); if (!\is_null($xmlStandalone)) { $this->document->xmlStandalone = $xmlStandalone; } if (!empty($domProperties)) { $this->setDomProperties($domProperties); } $this->replaceSpacesByUnderScoresInKeyNames = $replaceSpacesByUnderScoresInKeyNames; if (!empty($array) && $this->isArrayAllKeySequential($array)) { throw new DOMException('Invalid Character Error'); } $root = $this->createRootElement($rootElement); $this->document->appendChild($root); $this->convertElement($root, $array); } public function setNumericTagNamePrefix(string $prefix) { $this->numericTagNamePrefix = $prefix; } public static function convert(array $array, $rootElement = '', bool $replaceSpacesByUnderScoresInKeyNames = \true, string $xmlEncoding = null, string $xmlVersion = '1.0', array $domProperties = [], bool $xmlStandalone = null) { $converter = new static($array, $rootElement, $replaceSpacesByUnderScoresInKeyNames, $xmlEncoding, $xmlVersion, $domProperties, $xmlStandalone); return $converter->toXml(); } public function toXml() : string { return $this->addXmlDeclaration ? $this->document->saveXML() : $this->document->saveXml($this->document->documentElement); } public function toDom() : DOMDocument { return $this->document; } protected function ensureValidDomProperties(array $domProperties) { foreach ($domProperties as $key => $value) { if (!\property_exists($this->document, $key)) { throw new Exception("{$key} is not a valid property of DOMDocument"); } } } public function setDomProperties(array $domProperties) { $this->ensureValidDomProperties($domProperties); foreach ($domProperties as $key => $value) { $this->document->{$key} = $value; } return $this; } public function prettify() { $this->document->preserveWhiteSpace = \false; $this->document->formatOutput = \true; return $this; } public function dropXmlDeclaration() { $this->addXmlDeclaration = \false; return $this; } public function addProcessingInstruction($target, $data) { $elements = $this->document->getElementsByTagName('*'); $rootElement = $elements->count() > 0 ? $elements->item(0) : null; $processingInstruction = $this->document->createProcessingInstruction($target, $data); $this->document->insertBefore($processingInstruction, $rootElement); return $this; } private function convertElement(DOMElement $element, $value) { $sequential = $this->isArrayAllKeySequential($value); if (!\is_array($value)) { $value = \htmlspecialchars($value ?? ''); $value = $this->removeControlCharacters($value); $element->nodeValue = $value; return; } foreach ($value as $key => $data) { if (!$sequential) { if ($key === '_attributes' || $key === '@attributes') { $this->addAttributes($element, $data); } elseif (($key === '_value' || $key === '@value') && \is_string($data)) { $element->nodeValue = \htmlspecialchars($data); } elseif (($key === '_cdata' || $key === '@cdata') && \is_string($data)) { $element->appendChild($this->document->createCDATASection($data)); } elseif (($key === '_mixed' || $key === '@mixed') && \is_string($data)) { $fragment = $this->document->createDocumentFragment(); $fragment->appendXML($data); $element->appendChild($fragment); } elseif ($key === '__numeric') { $this->addNumericNode($element, $data); } elseif (\substr($key, 0, 9) === '__custom:') { $this->addNode($element, \str_replace('\\:', ':', \preg_split('/(?addNode($element, $key, $data); } } elseif (\is_array($data)) { $this->addCollectionNode($element, $data); } else { $this->addSequentialNode($element, $data); } } } protected function addNumericNode(DOMElement $element, $value) { foreach ($value as $key => $item) { $this->convertElement($element, [$this->numericTagNamePrefix . $key => $item]); } } protected function addNode(DOMElement $element, $key, $value) { if ($this->replaceSpacesByUnderScoresInKeyNames) { $key = \str_replace(' ', '_', $key); } $child = $this->document->createElement($key); $element->appendChild($child); $this->convertElement($child, $value); } protected function addCollectionNode(DOMElement $element, $value) { if ($element->childNodes->length === 0 && $element->attributes->length === 0) { $this->convertElement($element, $value); return; } $child = $this->document->createElement($element->tagName); $element->parentNode->appendChild($child); $this->convertElement($child, $value); } protected function addSequentialNode(DOMElement $element, $value) { if (empty($element->nodeValue) && !\is_numeric($element->nodeValue)) { $element->nodeValue = \htmlspecialchars($value); return; } $child = $this->document->createElement($element->tagName); $child->nodeValue = \htmlspecialchars($value); $element->parentNode->appendChild($child); } protected function isArrayAllKeySequential($value) { if (!\is_array($value)) { return \false; } if (\count($value) <= 0) { return \true; } if (\key($value) === '__numeric') { return \false; } return \array_unique(\array_map('is_int', \array_keys($value))) === [\true]; } protected function addAttributes(DOMElement $element, array $data) { foreach ($data as $attrKey => $attrVal) { $element->setAttribute($attrKey, $attrVal ?? ''); } } protected function createRootElement($rootElement) : DOMElement { if (\is_string($rootElement)) { $rootElementName = $rootElement ?: 'root'; return $this->document->createElement($rootElementName); } $rootElementName = $rootElement['rootElementName'] ?? 'root'; $element = $this->document->createElement($rootElementName); foreach ($rootElement as $key => $value) { if ($key !== '_attributes' && $key !== '@attributes') { continue; } $this->addAttributes($element, $rootElement[$key]); } return $element; } protected function removeControlCharacters(string $value) : string { return \preg_replace('/[\\x00-\\x09\\x0B\\x0C\\x0E-\\x1F\\x7F]/', '', $value); } } getHomeDir(); $path = \DIRECTORY_SEPARATOR === $homeDir ? $homeDir . '.config' : $homeDir . \DIRECTORY_SEPARATOR . '.config'; return $path; } /** * @return string */ public function getHomeDataDir() { $path = \getenv('XDG_DATA_HOME') ?: $this->getHomeDir() . \DIRECTORY_SEPARATOR . '.local' . \DIRECTORY_SEPARATOR . 'share'; return $path; } /** * @return array */ public function getConfigDirs() { $configDirs = \getenv('XDG_CONFIG_DIRS') ? \explode(':', \getenv('XDG_CONFIG_DIRS')) : array('/etc/xdg'); $paths = \array_merge(array($this->getHomeConfigDir()), $configDirs); return $paths; } /** * @return array */ public function getDataDirs() { $dataDirs = \getenv('XDG_DATA_DIRS') ? \explode(':', \getenv('XDG_DATA_DIRS')) : array('/usr/local/share', '/usr/share'); $paths = \array_merge(array($this->getHomeDataDir()), $dataDirs); return $paths; } /** * @return string */ public function getHomeCacheDir() { $path = \getenv('XDG_CACHE_HOME') ?: $this->getHomeDir() . \DIRECTORY_SEPARATOR . '.cache'; return $path; } public function getRuntimeDir($strict = \true) { if ($runtimeDir = \getenv('XDG_RUNTIME_DIR')) { return $runtimeDir; } if ($strict) { throw new \RuntimeException('XDG_RUNTIME_DIR was not set'); } $fallback = \sys_get_temp_dir() . \DIRECTORY_SEPARATOR . self::RUNTIME_DIR_FALLBACK . \getenv('USER'); $create = \false; if (!\is_dir($fallback)) { \mkdir($fallback, 0700, \true); } $st = \lstat($fallback); # The fallback must be a directory if (!$st['mode'] & self::S_IFDIR) { \rmdir($fallback); $create = \true; } elseif ($st['uid'] != $this->getUid() || $st['mode'] & (self::S_IRWXG | self::S_IRWXO)) { \rmdir($fallback); $create = \true; } if ($create) { \mkdir($fallback, 0700, \true); } return $fallback; } private function getUid() { if (\function_exists('posix_getuid')) { return \posix_getuid(); } return \getmyuid(); } } Copyright (c) 2014 Daniel Nögel 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. * @internal */ const VERSIONS = %s; private function __construct() { } /** * @psalm-pure * * @psalm-suppress ImpureMethodCall we know that {@see InstalledVersions} interaction does not * cause any side effects here. */ public static function rootPackageName() : string { if (!self::composer2ApiUsable()) { return self::ROOT_PACKAGE_NAME; } return InstalledVersions::getRootPackage()['name']; } /** * @throws OutOfBoundsException If a version cannot be located. * * @psalm-param key-of $packageName * @psalm-pure * * @psalm-suppress ImpureMethodCall we know that {@see InstalledVersions} interaction does not * cause any side effects here. */ public static function getVersion(string $packageName): string { if (self::composer2ApiUsable()) { return InstalledVersions::getPrettyVersion($packageName) . '@' . InstalledVersions::getReference($packageName); } if (isset(self::VERSIONS[$packageName])) { return self::VERSIONS[$packageName]; } throw new OutOfBoundsException( 'Required package "' . $packageName . '" is not installed: check your ./vendor/composer/installed.json and/or ./composer.lock files' ); } private static function composer2ApiUsable(): bool { if (!class_exists(InstalledVersions::class, false)) { return false; } if (method_exists(InstalledVersions::class, 'getAllRawData')) { $rawData = InstalledVersions::getAllRawData(); if (count($rawData) === 1 && count($rawData[0]) === 0) { return false; } } else { $rawData = InstalledVersions::getRawData(); if ($rawData === null || $rawData === []) { return false; } } return true; } } PHP; public function activate(Composer $composer, IOInterface $io) { // Nothing to do here, as all features are provided through event listeners } public function deactivate(Composer $composer, IOInterface $io) { // Nothing to do here, as all features are provided through event listeners } public function uninstall(Composer $composer, IOInterface $io) { // Nothing to do here, as all features are provided through event listeners } /** * {@inheritDoc} */ public static function getSubscribedEvents() : array { return [ScriptEvents::POST_AUTOLOAD_DUMP => 'dumpVersionsClass']; } /** * @throws RuntimeException */ public static function dumpVersionsClass(Event $composerEvent) { $composer = $composerEvent->getComposer(); $rootPackage = $composer->getPackage(); $versions = iterator_to_array(self::getVersions($composer->getLocker(), $rootPackage)); if (!array_key_exists('composer/package-versions-deprecated', $versions)) { //plugin must be globally installed - we only want to generate versions for projects which specifically //require composer/package-versions-deprecated return; } $versionClass = self::generateVersionsClass($rootPackage->getName(), $versions); self::writeVersionClassToFile($versionClass, $composer, $composerEvent->getIO()); } /** * @param string[] $versions */ private static function generateVersionsClass(string $rootPackageName, array $versions) : string { return sprintf( self::$generatedClassTemplate, 'fin' . 'al ' . 'cla' . 'ss ' . 'Versions', // note: workaround for regex-based code parsers :-( $rootPackageName, var_export($versions, \true) ); } /** * @throws RuntimeException */ private static function writeVersionClassToFile(string $versionClassSource, Composer $composer, IOInterface $io) { $installPath = self::locateRootPackageInstallPath($composer->getConfig(), $composer->getPackage()) . '/src/PackageVersions/Versions.php'; $installDir = dirname($installPath); if (!file_exists($installDir)) { $io->write('composer/package-versions-deprecated: Package not found (probably scheduled for removal); generation of version class skipped.'); return; } if (!is_writable($installDir)) { $io->write(sprintf('composer/package-versions-deprecated: %s is not writable; generation of version class skipped.', $installDir)); return; } $io->write('composer/package-versions-deprecated: Generating version class...'); $installPathTmp = $installPath . '_' . uniqid('tmp', \true); file_put_contents($installPathTmp, $versionClassSource); chmod($installPathTmp, 0664); rename($installPathTmp, $installPath); $io->write('composer/package-versions-deprecated: ...done generating version class'); } /** * @throws RuntimeException */ private static function locateRootPackageInstallPath(Config $composerConfig, RootPackageInterface $rootPackage) : string { if (self::getRootPackageAlias($rootPackage)->getName() === 'composer/package-versions-deprecated') { return dirname($composerConfig->get('vendor-dir')); } return $composerConfig->get('vendor-dir') . '/composer/package-versions-deprecated'; } private static function getRootPackageAlias(RootPackageInterface $rootPackage) : PackageInterface { $package = $rootPackage; while ($package instanceof AliasPackage) { $package = $package->getAliasOf(); } return $package; } /** * @return Generator&string[] * * @psalm-return Generator */ private static function getVersions(Locker $locker, RootPackageInterface $rootPackage) : Generator { $lockData = $locker->getLockData(); $lockData['packages-dev'] = $lockData['packages-dev'] ?? []; $packages = $lockData['packages']; if (\getenv('COMPOSER_DEV_MODE') !== '0') { $packages = array_merge($packages, $lockData['packages-dev']); } foreach ($packages as $package) { (yield $package['name'] => $package['version'] . '@' . ($package['source']['reference'] ?? $package['dist']['reference'] ?? '')); } foreach ($rootPackage->getReplaces() as $replace) { $version = $replace->getPrettyConstraint(); if ($version === 'self.version') { $version = $rootPackage->getPrettyVersion(); } (yield $replace->getTarget() => $version . '@' . $rootPackage->getSourceReference()); } (yield $rootPackage->getName() => $rootPackage->getPrettyVersion() . '@' . $rootPackage->getSourceReference()); } } * @internal */ const VERSIONS = array('amphp/amp' => 'v2.6.2@9d5100cebffa729aaffecd3ad25dc5aeea4f13bb', 'amphp/byte-stream' => 'v1.8.1@acbd8002b3536485c997c4e019206b3f10ca15bd', 'composer/package-versions-deprecated' => '1.11.99.5@b4f54f74ef3453349c24a845d22392cd31e65f1d', 'composer/pcre' => '3.1.0@4bff79ddd77851fe3cdd11616ed3f92841ba5bd2', 'composer/semver' => '3.3.2@3953f23262f2bff1919fc82183ad9acb13ff62c9', 'composer/xdebug-handler' => '3.0.3@ced299686f41dce890debac69273b47ffe98a40c', 'dnoegel/php-xdg-base-dir' => 'v0.1.1@8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd', 'felixfbecker/advanced-json-rpc' => 'v3.2.1@b5f37dbff9a8ad360ca341f3240dc1c168b45447', 'felixfbecker/language-server-protocol' => 'v1.5.2@6e82196ffd7c62f7794d778ca52b69feec9f2842', 'fidry/cpu-core-counter' => '0.4.1@79261cc280aded96d098e1b0e0ba0c4881b432c2', 'netresearch/jsonmapper' => 'v4.1.0@cfa81ea1d35294d64adb9c68aa4cb9e92400e53f', 'nikic/php-parser' => 'v4.15.3@570e980a201d8ed0236b0a62ddf2c9cbb2034039', 'phpdocumentor/reflection-common' => '2.2.0@1d01c49d4ed62f25aa84a747ad35d5a16924662b', 'phpdocumentor/reflection-docblock' => '5.3.0@622548b623e81ca6d78b721c5e029f4ce664f170', 'phpdocumentor/type-resolver' => '1.6.2@48f445a408c131e38cab1c235aa6d2bb7a0bb20d', 'psr/container' => '1.1.2@513e0666f7216c7459170d56df27dfcefe1689ea', 'psr/log' => '1.1.4@d49695b909c3b7628b6289db5479a1c204601f11', 'sebastian/diff' => '4.0.4@3461e3fccc7cfdfc2720be910d3bd73c69be590d', 'spatie/array-to-xml' => '2.17.1@5cbec9c6ab17e320c58a259f0cebe88bde4a7c46', 'symfony/console' => 'v5.4.17@58422fdcb0e715ed05b385f70d3e8b5ed4bbd45f', 'symfony/deprecation-contracts' => 'v2.5.2@e8b495ea28c1d97b5e0c121748d6f9b53d075c66', 'symfony/filesystem' => 'v5.4.13@ac09569844a9109a5966b9438fc29113ce77cf51', 'symfony/polyfill-ctype' => 'v1.27.0@5bbc823adecdae860bb64756d639ecfec17b050a', 'symfony/polyfill-intl-grapheme' => 'v1.27.0@511a08c03c1960e08a883f4cffcacd219b758354', 'symfony/polyfill-intl-normalizer' => 'v1.27.0@19bd1e4fcd5b91116f14d8533c57831ed00571b6', 'symfony/polyfill-mbstring' => 'v1.27.0@8ad114f6b39e2c98a8b0e3bd907732c207c2b534', 'symfony/polyfill-php73' => 'v1.27.0@9e8ecb5f92152187c4799efd3c96b78ccab18ff9', 'symfony/polyfill-php80' => 'v1.27.0@7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936', 'symfony/service-contracts' => 'v2.5.2@4b426aac47d6427cc1a1d0f7e2ac724627f5966c', 'symfony/string' => 'v5.4.17@55733a8664b8853b003e70251c58bc8cb2d82a6b', 'webmozart/assert' => '1.11.0@11cb2199493b2f8a3b53e7f19068fc6aac760991', 'bamarni/composer-bin-plugin' => '1.8.2@92fd7b1e6e9cdae19b0d57369d8ad31a37b6a880', 'brianium/paratest' => 'v6.8.1@168c1cfdf79e5b19b57cb03060fc9a6a79c5f582', 'dealerdirect/phpcodesniffer-composer-installer' => 'v1.0.0@4be43904336affa5c2f70744a348312336afd0da', 'dg/bypass-finals' => 'v1.4.1@4c424c3ed359220fce044f35cdf9f48b0089b2ca', 'doctrine/instantiator' => '1.5.0@0a0fa9780f5d4e507415a065172d26a98d02047b', 'hamcrest/hamcrest-php' => 'v2.0.1@8c3d0a3f6af734494ad8f6fbbee0ba92422859f3', 'jean85/pretty-package-versions' => '2.0.5@ae547e455a3d8babd07b96966b17d7fd21d9c6af', 'mockery/mockery' => '1.5.1@e92dcc83d5a51851baf5f5591d32cb2b16e3684e', 'myclabs/deep-copy' => '1.11.0@14daed4296fae74d9e3201d2c4925d1acb7aa614', 'nunomaduro/mock-final-classes' => 'v1.1.0@5d113210c085ac13a8e1225f8b6f390c797a98f0', 'phar-io/manifest' => '2.0.3@97803eca37d319dfa7826cc2437fc020857acb53', 'phar-io/version' => '3.2.1@4f7fd7836c6f332bb2933569e566a0d6c4cbed74', 'php-parallel-lint/php-parallel-lint' => 'v1.3.2@6483c9832e71973ed29cf71bd6b3f4fde438a9de', 'phpstan/phpdoc-parser' => '1.15.3@61800f71a5526081d1b5633766aa88341f1ade76', 'phpunit/php-code-coverage' => '9.2.23@9f1f0f9a2fbb680b26d1cf9b61b6eac43a6e4e9c', 'phpunit/php-file-iterator' => '3.0.6@cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf', 'phpunit/php-invoker' => '3.1.1@5a10147d0aaf65b58940a0b72f71c9ac0423cc67', 'phpunit/php-text-template' => '2.0.4@5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28', 'phpunit/php-timer' => '5.0.3@5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2', 'phpunit/phpunit' => '9.5.28@954ca3113a03bf780d22f07bf055d883ee04b65e', 'psalm/plugin-mockery' => '1.1.0@876247d15f91df08240d00dac69c5135b6689283', 'psalm/plugin-phpunit' => '0.18.4@e4ab3096653d9eb6f6d0ea5f4461898d59ae4dbc', 'sebastian/cli-parser' => '1.0.1@442e7c7e687e42adc03470c7b668bc4b2402c0b2', 'sebastian/code-unit' => '1.0.8@1fc9f64c0927627ef78ba436c9b17d967e68e120', 'sebastian/code-unit-reverse-lookup' => '2.0.3@ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5', 'sebastian/comparator' => '4.0.8@fa0f136dd2334583309d32b62544682ee972b51a', 'sebastian/complexity' => '2.0.2@739b35e53379900cc9ac327b2147867b8b6efd88', 'sebastian/environment' => '5.1.4@1b5dff7bb151a4db11d49d90e5408e4e938270f7', 'sebastian/exporter' => '4.0.5@ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d', 'sebastian/global-state' => '5.0.5@0ca8db5a5fc9c8646244e629625ac486fa286bf2', 'sebastian/lines-of-code' => '1.0.3@c1c2e997aa3146983ed888ad08b15470a2e22ecc', 'sebastian/object-enumerator' => '4.0.4@5c9eeac41b290a3712d88851518825ad78f45c71', 'sebastian/object-reflector' => '2.0.4@b4f479ebdbf63ac605d183ece17d8d7fe49c15c7', 'sebastian/recursion-context' => '4.0.4@cd9d8cf3c5804de4341c283ed787f099f5506172', 'sebastian/resource-operations' => '3.0.3@0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8', 'sebastian/type' => '3.2.0@fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e', 'sebastian/version' => '3.0.2@c6c1022351a901512170118436c764e473f6de8c', 'slevomat/coding-standard' => '8.8.0@59e25146a4ef0a7b194c5bc55b32dd414345db89', 'squizlabs/php_codesniffer' => '3.7.1@1359e176e9307e906dc3d890bcc9603ff6d90619', 'symfony/process' => 'v5.4.11@6e75fe6874cbc7e4773d049616ab450eff537bf1', 'theseer/tokenizer' => '1.2.1@34a41e998c2183e22995f158c581e7b5e755ab9e', 'vimeo/psalm' => '5.6.0@e784128902dfe01d489c4123d69918a9f3c1eac5'); private function __construct() { } /** * @psalm-pure * * @psalm-suppress ImpureMethodCall we know that {@see InstalledVersions} interaction does not * cause any side effects here. */ public static function rootPackageName() : string { if (!self::composer2ApiUsable()) { return self::ROOT_PACKAGE_NAME; } return InstalledVersions::getRootPackage()['name']; } /** * @throws OutOfBoundsException If a version cannot be located. * * @psalm-param key-of $packageName * @psalm-pure * * @psalm-suppress ImpureMethodCall we know that {@see InstalledVersions} interaction does not * cause any side effects here. */ public static function getVersion(string $packageName) : string { if (self::composer2ApiUsable()) { return InstalledVersions::getPrettyVersion($packageName) . '@' . InstalledVersions::getReference($packageName); } if (isset(self::VERSIONS[$packageName])) { return self::VERSIONS[$packageName]; } throw new OutOfBoundsException('Required package "' . $packageName . '" is not installed: check your ./vendor/composer/installed.json and/or ./composer.lock files'); } private static function composer2ApiUsable() : bool { if (!\class_exists(InstalledVersions::class, \false)) { return \false; } if (\method_exists(InstalledVersions::class, 'getAllRawData')) { $rawData = InstalledVersions::getAllRawData(); if (\count($rawData) === 1 && \count($rawData[0]) === 0) { return \false; } } else { $rawData = InstalledVersions::getRawData(); if ($rawData === null || $rawData === []) { return \false; } } return \true; } } */ private static function getVersions(array $packageData) : Generator { foreach ($packageData as $package) { (yield $package['name'] => $package['version'] . '@' . ($package['source']['reference'] ?? $package['dist']['reference'] ?? '')); } (yield self::ROOT_PACKAGE_NAME => self::ROOT_PACKAGE_NAME); } } Copyright (c) 2016 Marco Pivetta 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. * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Autoload; /** * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. * * $loader = new \Composer\Autoload\ClassLoader(); * * // register classes with namespaces * $loader->add('Symfony\Component', __DIR__.'/component'); * $loader->add('Symfony', __DIR__.'/framework'); * * // activate the autoloader * $loader->register(); * * // to enable searching the include path (eg. for PEAR packages) * $loader->setUseIncludePath(true); * * In this example, if you try to use a class in the Symfony\Component * namespace or one of its children (Symfony\Component\Console for instance), * the autoloader will first look for the class under the component/ * directory, and it will then fallback to the framework/ directory if not * found before giving up. * * This class is loosely based on the Symfony UniversalClassLoader. * * @author Fabien Potencier * @author Jordi Boggiano * @see https://www.php-fig.org/psr/psr-0/ * @see https://www.php-fig.org/psr/psr-4/ */ class ClassLoader { /** @var \Closure(string):void */ private static $includeFile; /** @var ?string */ private $vendorDir; // PSR-4 /** * @var array[] * @psalm-var array> */ private $prefixLengthsPsr4 = array(); /** * @var array[] * @psalm-var array> */ private $prefixDirsPsr4 = array(); /** * @var array[] * @psalm-var array */ private $fallbackDirsPsr4 = array(); // PSR-0 /** * @var array[] * @psalm-var array> */ private $prefixesPsr0 = array(); /** * @var array[] * @psalm-var array */ private $fallbackDirsPsr0 = array(); /** @var bool */ private $useIncludePath = false; /** * @var string[] * @psalm-var array */ private $classMap = array(); /** @var bool */ private $classMapAuthoritative = false; /** * @var bool[] * @psalm-var array */ private $missingClasses = array(); /** @var ?string */ private $apcuPrefix; /** * @var self[] */ private static $registeredLoaders = array(); /** * @param ?string $vendorDir */ public function __construct($vendorDir = null) { $this->vendorDir = $vendorDir; self::initializeIncludeClosure(); } /** * @return string[] */ public function getPrefixes() { if (!empty($this->prefixesPsr0)) { return call_user_func_array('array_merge', array_values($this->prefixesPsr0)); } return array(); } /** * @return array[] * @psalm-return array> */ public function getPrefixesPsr4() { return $this->prefixDirsPsr4; } /** * @return array[] * @psalm-return array */ public function getFallbackDirs() { return $this->fallbackDirsPsr0; } /** * @return array[] * @psalm-return array */ public function getFallbackDirsPsr4() { return $this->fallbackDirsPsr4; } /** * @return string[] Array of classname => path * @psalm-return array */ public function getClassMap() { return $this->classMap; } /** * @param string[] $classMap Class to filename map * @psalm-param array $classMap * * @return void */ public function addClassMap(array $classMap) { if ($this->classMap) { $this->classMap = array_merge($this->classMap, $classMap); } else { $this->classMap = $classMap; } } /** * Registers a set of PSR-0 directories for a given prefix, either * appending or prepending to the ones previously set for this prefix. * * @param string $prefix The prefix * @param string[]|string $paths The PSR-0 root directories * @param bool $prepend Whether to prepend the directories * * @return void */ public function add($prefix, $paths, $prepend = false) { if (!$prefix) { if ($prepend) { $this->fallbackDirsPsr0 = array_merge( (array) $paths, $this->fallbackDirsPsr0 ); } else { $this->fallbackDirsPsr0 = array_merge( $this->fallbackDirsPsr0, (array) $paths ); } return; } $first = $prefix[0]; if (!isset($this->prefixesPsr0[$first][$prefix])) { $this->prefixesPsr0[$first][$prefix] = (array) $paths; return; } if ($prepend) { $this->prefixesPsr0[$first][$prefix] = array_merge( (array) $paths, $this->prefixesPsr0[$first][$prefix] ); } else { $this->prefixesPsr0[$first][$prefix] = array_merge( $this->prefixesPsr0[$first][$prefix], (array) $paths ); } } /** * Registers a set of PSR-4 directories for a given namespace, either * appending or prepending to the ones previously set for this namespace. * * @param string $prefix The prefix/namespace, with trailing '\\' * @param string[]|string $paths The PSR-4 base directories * @param bool $prepend Whether to prepend the directories * * @throws \InvalidArgumentException * * @return void */ public function addPsr4($prefix, $paths, $prepend = false) { if (!$prefix) { // Register directories for the root namespace. if ($prepend) { $this->fallbackDirsPsr4 = array_merge( (array) $paths, $this->fallbackDirsPsr4 ); } else { $this->fallbackDirsPsr4 = array_merge( $this->fallbackDirsPsr4, (array) $paths ); } } elseif (!isset($this->prefixDirsPsr4[$prefix])) { // Register directories for a new namespace. $length = strlen($prefix); if ('\\' !== $prefix[$length - 1]) { throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); } $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; $this->prefixDirsPsr4[$prefix] = (array) $paths; } elseif ($prepend) { // Prepend directories for an already registered namespace. $this->prefixDirsPsr4[$prefix] = array_merge( (array) $paths, $this->prefixDirsPsr4[$prefix] ); } else { // Append directories for an already registered namespace. $this->prefixDirsPsr4[$prefix] = array_merge( $this->prefixDirsPsr4[$prefix], (array) $paths ); } } /** * Registers a set of PSR-0 directories for a given prefix, * replacing any others previously set for this prefix. * * @param string $prefix The prefix * @param string[]|string $paths The PSR-0 base directories * * @return void */ public function set($prefix, $paths) { if (!$prefix) { $this->fallbackDirsPsr0 = (array) $paths; } else { $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; } } /** * Registers a set of PSR-4 directories for a given namespace, * replacing any others previously set for this namespace. * * @param string $prefix The prefix/namespace, with trailing '\\' * @param string[]|string $paths The PSR-4 base directories * * @throws \InvalidArgumentException * * @return void */ public function setPsr4($prefix, $paths) { if (!$prefix) { $this->fallbackDirsPsr4 = (array) $paths; } else { $length = strlen($prefix); if ('\\' !== $prefix[$length - 1]) { throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); } $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; $this->prefixDirsPsr4[$prefix] = (array) $paths; } } /** * Turns on searching the include path for class files. * * @param bool $useIncludePath * * @return void */ public function setUseIncludePath($useIncludePath) { $this->useIncludePath = $useIncludePath; } /** * Can be used to check if the autoloader uses the include path to check * for classes. * * @return bool */ public function getUseIncludePath() { return $this->useIncludePath; } /** * Turns off searching the prefix and fallback directories for classes * that have not been registered with the class map. * * @param bool $classMapAuthoritative * * @return void */ public function setClassMapAuthoritative($classMapAuthoritative) { $this->classMapAuthoritative = $classMapAuthoritative; } /** * Should class lookup fail if not found in the current class map? * * @return bool */ public function isClassMapAuthoritative() { return $this->classMapAuthoritative; } /** * APCu prefix to use to cache found/not-found classes, if the extension is enabled. * * @param string|null $apcuPrefix * * @return void */ public function setApcuPrefix($apcuPrefix) { $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null; } /** * The APCu prefix in use, or null if APCu caching is not enabled. * * @return string|null */ public function getApcuPrefix() { return $this->apcuPrefix; } /** * Registers this instance as an autoloader. * * @param bool $prepend Whether to prepend the autoloader or not * * @return void */ public function register($prepend = false) { spl_autoload_register(array($this, 'loadClass'), true, $prepend); if (null === $this->vendorDir) { return; } if ($prepend) { self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders; } else { unset(self::$registeredLoaders[$this->vendorDir]); self::$registeredLoaders[$this->vendorDir] = $this; } } /** * Unregisters this instance as an autoloader. * * @return void */ public function unregister() { spl_autoload_unregister(array($this, 'loadClass')); if (null !== $this->vendorDir) { unset(self::$registeredLoaders[$this->vendorDir]); } } /** * Loads the given class or interface. * * @param string $class The name of the class * @return true|null True if loaded, null otherwise */ public function loadClass($class) { if ($file = $this->findFile($class)) { (self::$includeFile)($file); return true; } return null; } /** * Finds the path to the file where the class is defined. * * @param string $class The name of the class * * @return string|false The path if found, false otherwise */ public function findFile($class) { // class map lookup if (isset($this->classMap[$class])) { return $this->classMap[$class]; } if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { return false; } if (null !== $this->apcuPrefix) { $file = apcu_fetch($this->apcuPrefix.$class, $hit); if ($hit) { return $file; } } $file = $this->findFileWithExtension($class, '.php'); // Search for Hack files if we are running on HHVM if (false === $file && defined('HHVM_VERSION')) { $file = $this->findFileWithExtension($class, '.hh'); } if (null !== $this->apcuPrefix) { apcu_add($this->apcuPrefix.$class, $file); } if (false === $file) { // Remember that this class does not exist. $this->missingClasses[$class] = true; } return $file; } /** * Returns the currently registered loaders indexed by their corresponding vendor directories. * * @return self[] */ public static function getRegisteredLoaders() { return self::$registeredLoaders; } /** * @param string $class * @param string $ext * @return string|false */ private function findFileWithExtension($class, $ext) { // PSR-4 lookup $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; $first = $class[0]; if (isset($this->prefixLengthsPsr4[$first])) { $subPath = $class; while (false !== $lastPos = strrpos($subPath, '\\')) { $subPath = substr($subPath, 0, $lastPos); $search = $subPath . '\\'; if (isset($this->prefixDirsPsr4[$search])) { $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); foreach ($this->prefixDirsPsr4[$search] as $dir) { if (file_exists($file = $dir . $pathEnd)) { return $file; } } } } } // PSR-4 fallback dirs foreach ($this->fallbackDirsPsr4 as $dir) { if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { return $file; } } // PSR-0 lookup if (false !== $pos = strrpos($class, '\\')) { // namespaced class name $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); } else { // PEAR-like class name $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; } if (isset($this->prefixesPsr0[$first])) { foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { if (0 === strpos($class, $prefix)) { foreach ($dirs as $dir) { if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { return $file; } } } } } // PSR-0 fallback dirs foreach ($this->fallbackDirsPsr0 as $dir) { if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { return $file; } } // PSR-0 include paths. if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { return $file; } return false; } private static function initializeIncludeClosure(): void { if (self::$includeFile !== null) { return; } /** * Scope isolated include. * * Prevents access to $this/self from included files. * * @param string $file * @return void */ self::$includeFile = static function($file) { include $file; }; } } $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Attribute.php', 'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php', 'PhpToken' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php', 'Psalm\\Aliases' => $baseDir . '/src/Psalm/Aliases.php', 'Psalm\\CodeLocation' => $baseDir . '/src/Psalm/CodeLocation.php', 'Psalm\\CodeLocation\\DocblockTypeLocation' => $baseDir . '/src/Psalm/CodeLocation/DocblockTypeLocation.php', 'Psalm\\CodeLocation\\ParseErrorLocation' => $baseDir . '/src/Psalm/CodeLocation/ParseErrorLocation.php', 'Psalm\\CodeLocation\\Raw' => $baseDir . '/src/Psalm/CodeLocation/Raw.php', 'Psalm\\Codebase' => $baseDir . '/src/Psalm/Codebase.php', 'Psalm\\Config' => $baseDir . '/src/Psalm/Config.php', 'Psalm\\Config\\Creator' => $baseDir . '/src/Psalm/Config/Creator.php', 'Psalm\\Config\\ErrorLevelFileFilter' => $baseDir . '/src/Psalm/Config/ErrorLevelFileFilter.php', 'Psalm\\Config\\FileFilter' => $baseDir . '/src/Psalm/Config/FileFilter.php', 'Psalm\\Config\\IssueHandler' => $baseDir . '/src/Psalm/Config/IssueHandler.php', 'Psalm\\Config\\ProjectFileFilter' => $baseDir . '/src/Psalm/Config/ProjectFileFilter.php', 'Psalm\\Config\\TaintAnalysisFileFilter' => $baseDir . '/src/Psalm/Config/TaintAnalysisFileFilter.php', 'Psalm\\Context' => $baseDir . '/src/Psalm/Context.php', 'Psalm\\DocComment' => $baseDir . '/src/Psalm/DocComment.php', 'Psalm\\ErrorBaseline' => $baseDir . '/src/Psalm/ErrorBaseline.php', 'Psalm\\Exception\\CircularReferenceException' => $baseDir . '/src/Psalm/Exception/CircularReferenceException.php', 'Psalm\\Exception\\CodeException' => $baseDir . '/src/Psalm/Exception/CodeException.php', 'Psalm\\Exception\\ComplicatedExpressionException' => $baseDir . '/src/Psalm/Exception/ComplicatedExpressionException.php', 'Psalm\\Exception\\ConfigCreationException' => $baseDir . '/src/Psalm/Exception/ConfigCreationException.php', 'Psalm\\Exception\\ConfigException' => $baseDir . '/src/Psalm/Exception/ConfigException.php', 'Psalm\\Exception\\ConfigNotFoundException' => $baseDir . '/src/Psalm/Exception/ConfigNotFoundException.php', 'Psalm\\Exception\\DocblockParseException' => $baseDir . '/src/Psalm/Exception/DocblockParseException.php', 'Psalm\\Exception\\FileIncludeException' => $baseDir . '/src/Psalm/Exception/FileIncludeException.php', 'Psalm\\Exception\\IncorrectDocblockException' => $baseDir . '/src/Psalm/Exception/IncorrectDocblockException.php', 'Psalm\\Exception\\InvalidClasslikeOverrideException' => $baseDir . '/src/Psalm/Exception/InvalidClasslikeOverrideException.php', 'Psalm\\Exception\\InvalidMethodOverrideException' => $baseDir . '/src/Psalm/Exception/InvalidMethodOverrideException.php', 'Psalm\\Exception\\RefactorException' => $baseDir . '/src/Psalm/Exception/RefactorException.php', 'Psalm\\Exception\\ScopeAnalysisException' => $baseDir . '/src/Psalm/Exception/ScopeAnalysisException.php', 'Psalm\\Exception\\TypeParseTreeException' => $baseDir . '/src/Psalm/Exception/TypeParseTreeException.php', 'Psalm\\Exception\\UnanalyzedFileException' => $baseDir . '/src/Psalm/Exception/UnanalyzedFileException.php', 'Psalm\\Exception\\UnpopulatedClasslikeException' => $baseDir . '/src/Psalm/Exception/UnpopulatedClasslikeException.php', 'Psalm\\Exception\\UnpreparedAnalysisException' => $baseDir . '/src/Psalm/Exception/UnpreparedAnalysisException.php', 'Psalm\\Exception\\UnresolvableConstantException' => $baseDir . '/src/Psalm/Exception/UnresolvableConstantException.php', 'Psalm\\Exception\\UnsupportedIssueToFixException' => $baseDir . '/src/Psalm/Exception/UnsupportedIssueToFixException.php', 'Psalm\\FileBasedPluginAdapter' => $baseDir . '/src/Psalm/FileBasedPluginAdapter.php', 'Psalm\\FileManipulation' => $baseDir . '/src/Psalm/FileManipulation.php', 'Psalm\\FileSource' => $baseDir . '/src/Psalm/FileSource.php', 'Psalm\\Internal\\Algebra' => $baseDir . '/src/Psalm/Internal/Algebra.php', 'Psalm\\Internal\\Algebra\\FormulaGenerator' => $baseDir . '/src/Psalm/Internal/Algebra/FormulaGenerator.php', 'Psalm\\Internal\\Analyzer\\AlgebraAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/AlgebraAnalyzer.php', 'Psalm\\Internal\\Analyzer\\AttributesAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/AttributesAnalyzer.php', 'Psalm\\Internal\\Analyzer\\CanAlias' => $baseDir . '/src/Psalm/Internal/Analyzer/CanAlias.php', 'Psalm\\Internal\\Analyzer\\ClassAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/ClassAnalyzer.php', 'Psalm\\Internal\\Analyzer\\ClassLikeAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/ClassLikeAnalyzer.php', 'Psalm\\Internal\\Analyzer\\ClassLikeNameOptions' => $baseDir . '/src/Psalm/Internal/Analyzer/ClassLikeNameOptions.php', 'Psalm\\Internal\\Analyzer\\ClosureAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/ClosureAnalyzer.php', 'Psalm\\Internal\\Analyzer\\CommentAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/CommentAnalyzer.php', 'Psalm\\Internal\\Analyzer\\DataFlowNodeData' => $baseDir . '/src/Psalm/Internal/Analyzer/DataFlowNodeData.php', 'Psalm\\Internal\\Analyzer\\FileAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/FileAnalyzer.php', 'Psalm\\Internal\\Analyzer\\FunctionAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/FunctionAnalyzer.php', 'Psalm\\Internal\\Analyzer\\FunctionLikeAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/FunctionLikeAnalyzer.php', 'Psalm\\Internal\\Analyzer\\FunctionLike\\ReturnTypeAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/FunctionLike/ReturnTypeAnalyzer.php', 'Psalm\\Internal\\Analyzer\\FunctionLike\\ReturnTypeCollector' => $baseDir . '/src/Psalm/Internal/Analyzer/FunctionLike/ReturnTypeCollector.php', 'Psalm\\Internal\\Analyzer\\InterfaceAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/InterfaceAnalyzer.php', 'Psalm\\Internal\\Analyzer\\IssueData' => $baseDir . '/src/Psalm/Internal/Analyzer/IssueData.php', 'Psalm\\Internal\\Analyzer\\MethodAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/MethodAnalyzer.php', 'Psalm\\Internal\\Analyzer\\MethodComparator' => $baseDir . '/src/Psalm/Internal/Analyzer/MethodComparator.php', 'Psalm\\Internal\\Analyzer\\NamespaceAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/NamespaceAnalyzer.php', 'Psalm\\Internal\\Analyzer\\ProjectAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/ProjectAnalyzer.php', 'Psalm\\Internal\\Analyzer\\ScopeAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/ScopeAnalyzer.php', 'Psalm\\Internal\\Analyzer\\SourceAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/SourceAnalyzer.php', 'Psalm\\Internal\\Analyzer\\StatementsAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/StatementsAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Block\\DoAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Block/DoAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Block\\ForAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Block/ForAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Block\\ForeachAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Block/ForeachAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Block\\IfConditionalAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Block/IfConditionalAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Block\\IfElseAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Block/IfElseAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Block\\IfElse\\ElseAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Block/IfElse/ElseAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Block\\IfElse\\ElseIfAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Block/IfElse/ElseIfAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Block\\IfElse\\IfAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Block/IfElse/IfAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Block\\LoopAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Block/LoopAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Block\\SwitchAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Block/SwitchAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Block\\SwitchCaseAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Block/SwitchCaseAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Block\\TryAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Block/TryAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Block\\WhileAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Block/WhileAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\BreakAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/BreakAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\ContinueAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/ContinueAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\EchoAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/EchoAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\ExpressionAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\ArrayAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/ArrayAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\ArrayCreationInfo' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/ArrayCreationInfo.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\AssertionFinder' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/AssertionFinder.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\AssignmentAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/AssignmentAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Assignment\\ArrayAssignmentAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/ArrayAssignmentAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Assignment\\AssignedProperty' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/AssignedProperty.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Assignment\\InstancePropertyAssignmentAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/InstancePropertyAssignmentAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Assignment\\StaticPropertyAssignmentAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/StaticPropertyAssignmentAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\BinaryOpAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOpAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\BinaryOp\\AndAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/AndAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\BinaryOp\\ArithmeticOpAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/ArithmeticOpAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\BinaryOp\\CoalesceAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/CoalesceAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\BinaryOp\\ConcatAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/ConcatAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\BinaryOp\\NonComparisonOpAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/NonComparisonOpAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\BinaryOp\\OrAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/OrAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\BitwiseNotAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/BitwiseNotAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\BooleanNotAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/BooleanNotAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\CallAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/CallAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\ArgumentAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\ArgumentMapPopulator' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentMapPopulator.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\ArgumentsAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentsAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\ArrayFunctionArgumentsAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArrayFunctionArgumentsAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\ClassTemplateParamCollector' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ClassTemplateParamCollector.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\FunctionCallAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/Call/FunctionCallAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\FunctionCallInfo' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/Call/FunctionCallInfo.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\FunctionCallReturnTypeFetcher' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/Call/FunctionCallReturnTypeFetcher.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\MethodCallAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/Call/MethodCallAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\Method\\AtomicCallContext' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/AtomicCallContext.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\Method\\AtomicMethodCallAnalysisResult' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/AtomicMethodCallAnalysisResult.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\Method\\AtomicMethodCallAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/AtomicMethodCallAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\Method\\ExistingAtomicMethodCallAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/ExistingAtomicMethodCallAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\Method\\MethodCallProhibitionAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodCallProhibitionAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\Method\\MethodCallPurityAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodCallPurityAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\Method\\MethodCallReturnTypeFetcher' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodCallReturnTypeFetcher.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\Method\\MethodVisibilityAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodVisibilityAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\Method\\MissingMethodCallHandler' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MissingMethodCallHandler.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\NamedFunctionCallHandler' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/Call/NamedFunctionCallHandler.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\NewAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/Call/NewAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\StaticCallAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/Call/StaticCallAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\StaticMethod\\AtomicStaticCallAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/Call/StaticMethod/AtomicStaticCallAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\StaticMethod\\ExistingAtomicStaticCallAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/Call/StaticMethod/ExistingAtomicStaticCallAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\CastAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/CastAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\ClassConstAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/ClassConstAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\CloneAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/CloneAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\EmptyAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/EmptyAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\EncapsulatedStringAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/EncapsulatedStringAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\EvalAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/EvalAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\ExitAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/ExitAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\ExpressionIdentifier' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/ExpressionIdentifier.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Fetch\\ArrayFetchAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/ArrayFetchAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Fetch\\AtomicPropertyFetchAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/AtomicPropertyFetchAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Fetch\\ConstFetchAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/ConstFetchAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Fetch\\InstancePropertyFetchAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/InstancePropertyFetchAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Fetch\\StaticPropertyFetchAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/StaticPropertyFetchAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Fetch\\VariableFetchAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/VariableFetchAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\IncDecExpressionAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/IncDecExpressionAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\IncludeAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/IncludeAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\InstanceofAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/InstanceofAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\IssetAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/IssetAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\MagicConstAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/MagicConstAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\MatchAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/MatchAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\NullsafeAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/NullsafeAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\PrintAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/PrintAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\SimpleTypeInferer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/SimpleTypeInferer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\TernaryAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/TernaryAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\UnaryPlusMinusAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/UnaryPlusMinusAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\YieldAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/YieldAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\YieldFromAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/Expression/YieldFromAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\GlobalAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/GlobalAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\ReturnAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/ReturnAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\StaticAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/StaticAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\ThrowAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/ThrowAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\UnsetAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/UnsetAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\UnusedAssignmentRemover' => $baseDir . '/src/Psalm/Internal/Analyzer/Statements/UnusedAssignmentRemover.php', 'Psalm\\Internal\\Analyzer\\TraitAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/TraitAnalyzer.php', 'Psalm\\Internal\\Analyzer\\TypeAnalyzer' => $baseDir . '/src/Psalm/Internal/Analyzer/TypeAnalyzer.php', 'Psalm\\Internal\\Clause' => $baseDir . '/src/Psalm/Internal/Clause.php', 'Psalm\\Internal\\CliUtils' => $baseDir . '/src/Psalm/Internal/CliUtils.php', 'Psalm\\Internal\\Cli\\LanguageServer' => $baseDir . '/src/Psalm/Internal/Cli/LanguageServer.php', 'Psalm\\Internal\\Cli\\Plugin' => $baseDir . '/src/Psalm/Internal/Cli/Plugin.php', 'Psalm\\Internal\\Cli\\Psalm' => $baseDir . '/src/Psalm/Internal/Cli/Psalm.php', 'Psalm\\Internal\\Cli\\Psalter' => $baseDir . '/src/Psalm/Internal/Cli/Psalter.php', 'Psalm\\Internal\\Cli\\Refactor' => $baseDir . '/src/Psalm/Internal/Cli/Refactor.php', 'Psalm\\Internal\\Codebase\\Analyzer' => $baseDir . '/src/Psalm/Internal/Codebase/Analyzer.php', 'Psalm\\Internal\\Codebase\\ClassConstantByWildcardResolver' => $baseDir . '/src/Psalm/Internal/Codebase/ClassConstantByWildcardResolver.php', 'Psalm\\Internal\\Codebase\\ClassLikes' => $baseDir . '/src/Psalm/Internal/Codebase/ClassLikes.php', 'Psalm\\Internal\\Codebase\\ConstantTypeResolver' => $baseDir . '/src/Psalm/Internal/Codebase/ConstantTypeResolver.php', 'Psalm\\Internal\\Codebase\\DataFlowGraph' => $baseDir . '/src/Psalm/Internal/Codebase/DataFlowGraph.php', 'Psalm\\Internal\\Codebase\\Functions' => $baseDir . '/src/Psalm/Internal/Codebase/Functions.php', 'Psalm\\Internal\\Codebase\\InternalCallMapHandler' => $baseDir . '/src/Psalm/Internal/Codebase/InternalCallMapHandler.php', 'Psalm\\Internal\\Codebase\\Methods' => $baseDir . '/src/Psalm/Internal/Codebase/Methods.php', 'Psalm\\Internal\\Codebase\\Populator' => $baseDir . '/src/Psalm/Internal/Codebase/Populator.php', 'Psalm\\Internal\\Codebase\\Properties' => $baseDir . '/src/Psalm/Internal/Codebase/Properties.php', 'Psalm\\Internal\\Codebase\\PropertyMap' => $baseDir . '/src/Psalm/Internal/Codebase/PropertyMap.php', 'Psalm\\Internal\\Codebase\\ReferenceMapGenerator' => $baseDir . '/src/Psalm/Internal/Codebase/ReferenceMapGenerator.php', 'Psalm\\Internal\\Codebase\\Reflection' => $baseDir . '/src/Psalm/Internal/Codebase/Reflection.php', 'Psalm\\Internal\\Codebase\\Scanner' => $baseDir . '/src/Psalm/Internal/Codebase/Scanner.php', 'Psalm\\Internal\\Codebase\\TaintFlowGraph' => $baseDir . '/src/Psalm/Internal/Codebase/TaintFlowGraph.php', 'Psalm\\Internal\\Codebase\\VariableUseGraph' => $baseDir . '/src/Psalm/Internal/Codebase/VariableUseGraph.php', 'Psalm\\Internal\\Composer' => $baseDir . '/src/Psalm/Internal/Composer.php', 'Psalm\\Internal\\DataFlow\\DataFlowNode' => $baseDir . '/src/Psalm/Internal/DataFlow/DataFlowNode.php', 'Psalm\\Internal\\DataFlow\\Path' => $baseDir . '/src/Psalm/Internal/DataFlow/Path.php', 'Psalm\\Internal\\DataFlow\\TaintSink' => $baseDir . '/src/Psalm/Internal/DataFlow/TaintSink.php', 'Psalm\\Internal\\DataFlow\\TaintSource' => $baseDir . '/src/Psalm/Internal/DataFlow/TaintSource.php', 'Psalm\\Internal\\Diff\\AstDiffer' => $baseDir . '/src/Psalm/Internal/Diff/AstDiffer.php', 'Psalm\\Internal\\Diff\\ClassStatementsDiffer' => $baseDir . '/src/Psalm/Internal/Diff/ClassStatementsDiffer.php', 'Psalm\\Internal\\Diff\\DiffElem' => $baseDir . '/src/Psalm/Internal/Diff/DiffElem.php', 'Psalm\\Internal\\Diff\\FileDiffer' => $baseDir . '/src/Psalm/Internal/Diff/FileDiffer.php', 'Psalm\\Internal\\Diff\\FileStatementsDiffer' => $baseDir . '/src/Psalm/Internal/Diff/FileStatementsDiffer.php', 'Psalm\\Internal\\Diff\\NamespaceStatementsDiffer' => $baseDir . '/src/Psalm/Internal/Diff/NamespaceStatementsDiffer.php', 'Psalm\\Internal\\ErrorHandler' => $baseDir . '/src/Psalm/Internal/ErrorHandler.php', 'Psalm\\Internal\\EventDispatcher' => $baseDir . '/src/Psalm/Internal/EventDispatcher.php', 'Psalm\\Internal\\ExecutionEnvironment\\BuildInfoCollector' => $baseDir . '/src/Psalm/Internal/ExecutionEnvironment/BuildInfoCollector.php', 'Psalm\\Internal\\ExecutionEnvironment\\GitInfoCollector' => $baseDir . '/src/Psalm/Internal/ExecutionEnvironment/GitInfoCollector.php', 'Psalm\\Internal\\ExecutionEnvironment\\SystemCommandExecutor' => $baseDir . '/src/Psalm/Internal/ExecutionEnvironment/SystemCommandExecutor.php', 'Psalm\\Internal\\FileManipulation\\ClassDocblockManipulator' => $baseDir . '/src/Psalm/Internal/FileManipulation/ClassDocblockManipulator.php', 'Psalm\\Internal\\FileManipulation\\CodeMigration' => $baseDir . '/src/Psalm/Internal/FileManipulation/CodeMigration.php', 'Psalm\\Internal\\FileManipulation\\FileManipulationBuffer' => $baseDir . '/src/Psalm/Internal/FileManipulation/FileManipulationBuffer.php', 'Psalm\\Internal\\FileManipulation\\FunctionDocblockManipulator' => $baseDir . '/src/Psalm/Internal/FileManipulation/FunctionDocblockManipulator.php', 'Psalm\\Internal\\FileManipulation\\PropertyDocblockManipulator' => $baseDir . '/src/Psalm/Internal/FileManipulation/PropertyDocblockManipulator.php', 'Psalm\\Internal\\Fork\\ForkMessage' => $baseDir . '/src/Psalm/Internal/Fork/ForkMessage.php', 'Psalm\\Internal\\Fork\\ForkProcessDoneMessage' => $baseDir . '/src/Psalm/Internal/Fork/ForkProcessDoneMessage.php', 'Psalm\\Internal\\Fork\\ForkProcessErrorMessage' => $baseDir . '/src/Psalm/Internal/Fork/ForkProcessErrorMessage.php', 'Psalm\\Internal\\Fork\\ForkTaskDoneMessage' => $baseDir . '/src/Psalm/Internal/Fork/ForkTaskDoneMessage.php', 'Psalm\\Internal\\Fork\\Pool' => $baseDir . '/src/Psalm/Internal/Fork/Pool.php', 'Psalm\\Internal\\Fork\\PsalmRestarter' => $baseDir . '/src/Psalm/Internal/Fork/PsalmRestarter.php', 'Psalm\\Internal\\IncludeCollector' => $baseDir . '/src/Psalm/Internal/IncludeCollector.php', 'Psalm\\Internal\\Json\\Json' => $baseDir . '/src/Psalm/Internal/Json/Json.php', 'Psalm\\Internal\\LanguageServer\\ClientHandler' => $baseDir . '/src/Psalm/Internal/LanguageServer/ClientHandler.php', 'Psalm\\Internal\\LanguageServer\\Client\\TextDocument' => $baseDir . '/src/Psalm/Internal/LanguageServer/Client/TextDocument.php', 'Psalm\\Internal\\LanguageServer\\EmitterInterface' => $baseDir . '/src/Psalm/Internal/LanguageServer/EmitterInterface.php', 'Psalm\\Internal\\LanguageServer\\EmitterTrait' => $baseDir . '/src/Psalm/Internal/LanguageServer/EmitterTrait.php', 'Psalm\\Internal\\LanguageServer\\IdGenerator' => $baseDir . '/src/Psalm/Internal/LanguageServer/IdGenerator.php', 'Psalm\\Internal\\LanguageServer\\LanguageClient' => $baseDir . '/src/Psalm/Internal/LanguageServer/LanguageClient.php', 'Psalm\\Internal\\LanguageServer\\LanguageServer' => $baseDir . '/src/Psalm/Internal/LanguageServer/LanguageServer.php', 'Psalm\\Internal\\LanguageServer\\Message' => $baseDir . '/src/Psalm/Internal/LanguageServer/Message.php', 'Psalm\\Internal\\LanguageServer\\ProtocolReader' => $baseDir . '/src/Psalm/Internal/LanguageServer/ProtocolReader.php', 'Psalm\\Internal\\LanguageServer\\ProtocolStreamReader' => $baseDir . '/src/Psalm/Internal/LanguageServer/ProtocolStreamReader.php', 'Psalm\\Internal\\LanguageServer\\ProtocolStreamWriter' => $baseDir . '/src/Psalm/Internal/LanguageServer/ProtocolStreamWriter.php', 'Psalm\\Internal\\LanguageServer\\ProtocolWriter' => $baseDir . '/src/Psalm/Internal/LanguageServer/ProtocolWriter.php', 'Psalm\\Internal\\LanguageServer\\Server\\TextDocument' => $baseDir . '/src/Psalm/Internal/LanguageServer/Server/TextDocument.php', 'Psalm\\Internal\\LanguageServer\\Server\\Workspace' => $baseDir . '/src/Psalm/Internal/LanguageServer/Server/Workspace.php', 'Psalm\\Internal\\MethodIdentifier' => $baseDir . '/src/Psalm/Internal/MethodIdentifier.php', 'Psalm\\Internal\\PhpTraverser\\CustomTraverser' => $baseDir . '/src/Psalm/Internal/PhpTraverser/CustomTraverser.php', 'Psalm\\Internal\\PhpVisitor\\AssignmentMapVisitor' => $baseDir . '/src/Psalm/Internal/PhpVisitor/AssignmentMapVisitor.php', 'Psalm\\Internal\\PhpVisitor\\CheckTrivialExprVisitor' => $baseDir . '/src/Psalm/Internal/PhpVisitor/CheckTrivialExprVisitor.php', 'Psalm\\Internal\\PhpVisitor\\CloningVisitor' => $baseDir . '/src/Psalm/Internal/PhpVisitor/CloningVisitor.php', 'Psalm\\Internal\\PhpVisitor\\ConditionCloningVisitor' => $baseDir . '/src/Psalm/Internal/PhpVisitor/ConditionCloningVisitor.php', 'Psalm\\Internal\\PhpVisitor\\NodeCleanerVisitor' => $baseDir . '/src/Psalm/Internal/PhpVisitor/NodeCleanerVisitor.php', 'Psalm\\Internal\\PhpVisitor\\NodeCounterVisitor' => $baseDir . '/src/Psalm/Internal/PhpVisitor/NodeCounterVisitor.php', 'Psalm\\Internal\\PhpVisitor\\OffsetShifterVisitor' => $baseDir . '/src/Psalm/Internal/PhpVisitor/OffsetShifterVisitor.php', 'Psalm\\Internal\\PhpVisitor\\ParamReplacementVisitor' => $baseDir . '/src/Psalm/Internal/PhpVisitor/ParamReplacementVisitor.php', 'Psalm\\Internal\\PhpVisitor\\PartialParserVisitor' => $baseDir . '/src/Psalm/Internal/PhpVisitor/PartialParserVisitor.php', 'Psalm\\Internal\\PhpVisitor\\ReflectorVisitor' => $baseDir . '/src/Psalm/Internal/PhpVisitor/ReflectorVisitor.php', 'Psalm\\Internal\\PhpVisitor\\Reflector\\AttributeResolver' => $baseDir . '/src/Psalm/Internal/PhpVisitor/Reflector/AttributeResolver.php', 'Psalm\\Internal\\PhpVisitor\\Reflector\\ClassLikeDocblockParser' => $baseDir . '/src/Psalm/Internal/PhpVisitor/Reflector/ClassLikeDocblockParser.php', 'Psalm\\Internal\\PhpVisitor\\Reflector\\ClassLikeNodeScanner' => $baseDir . '/src/Psalm/Internal/PhpVisitor/Reflector/ClassLikeNodeScanner.php', 'Psalm\\Internal\\PhpVisitor\\Reflector\\ExpressionResolver' => $baseDir . '/src/Psalm/Internal/PhpVisitor/Reflector/ExpressionResolver.php', 'Psalm\\Internal\\PhpVisitor\\Reflector\\ExpressionScanner' => $baseDir . '/src/Psalm/Internal/PhpVisitor/Reflector/ExpressionScanner.php', 'Psalm\\Internal\\PhpVisitor\\Reflector\\FunctionLikeDocblockParser' => $baseDir . '/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeDocblockParser.php', 'Psalm\\Internal\\PhpVisitor\\Reflector\\FunctionLikeDocblockScanner' => $baseDir . '/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeDocblockScanner.php', 'Psalm\\Internal\\PhpVisitor\\Reflector\\FunctionLikeNodeScanner' => $baseDir . '/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeNodeScanner.php', 'Psalm\\Internal\\PhpVisitor\\Reflector\\TypeHintResolver' => $baseDir . '/src/Psalm/Internal/PhpVisitor/Reflector/TypeHintResolver.php', 'Psalm\\Internal\\PhpVisitor\\ShortClosureVisitor' => $baseDir . '/src/Psalm/Internal/PhpVisitor/ShortClosureVisitor.php', 'Psalm\\Internal\\PhpVisitor\\SimpleNameResolver' => $baseDir . '/src/Psalm/Internal/PhpVisitor/SimpleNameResolver.php', 'Psalm\\Internal\\PhpVisitor\\TraitFinder' => $baseDir . '/src/Psalm/Internal/PhpVisitor/TraitFinder.php', 'Psalm\\Internal\\PhpVisitor\\TypeMappingVisitor' => $baseDir . '/src/Psalm/Internal/PhpVisitor/TypeMappingVisitor.php', 'Psalm\\Internal\\PhpVisitor\\YieldTypeCollector' => $baseDir . '/src/Psalm/Internal/PhpVisitor/YieldTypeCollector.php', 'Psalm\\Internal\\PluginManager\\Command\\DisableCommand' => $baseDir . '/src/Psalm/Internal/PluginManager/Command/DisableCommand.php', 'Psalm\\Internal\\PluginManager\\Command\\EnableCommand' => $baseDir . '/src/Psalm/Internal/PluginManager/Command/EnableCommand.php', 'Psalm\\Internal\\PluginManager\\Command\\ShowCommand' => $baseDir . '/src/Psalm/Internal/PluginManager/Command/ShowCommand.php', 'Psalm\\Internal\\PluginManager\\ComposerLock' => $baseDir . '/src/Psalm/Internal/PluginManager/ComposerLock.php', 'Psalm\\Internal\\PluginManager\\ConfigFile' => $baseDir . '/src/Psalm/Internal/PluginManager/ConfigFile.php', 'Psalm\\Internal\\PluginManager\\PluginList' => $baseDir . '/src/Psalm/Internal/PluginManager/PluginList.php', 'Psalm\\Internal\\PluginManager\\PluginListFactory' => $baseDir . '/src/Psalm/Internal/PluginManager/PluginListFactory.php', 'Psalm\\Internal\\Provider\\AddRemoveTaints\\HtmlFunctionTainter' => $baseDir . '/src/Psalm/Internal/Provider/AddRemoveTaints/HtmlFunctionTainter.php', 'Psalm\\Internal\\Provider\\ClassLikeStorageCacheProvider' => $baseDir . '/src/Psalm/Internal/Provider/ClassLikeStorageCacheProvider.php', 'Psalm\\Internal\\Provider\\ClassLikeStorageProvider' => $baseDir . '/src/Psalm/Internal/Provider/ClassLikeStorageProvider.php', 'Psalm\\Internal\\Provider\\DynamicFunctionStorageProvider' => $baseDir . '/src/Psalm/Internal/Provider/DynamicFunctionStorageProvider.php', 'Psalm\\Internal\\Provider\\FakeFileProvider' => $baseDir . '/src/Psalm/Internal/Provider/FakeFileProvider.php', 'Psalm\\Internal\\Provider\\FileProvider' => $baseDir . '/src/Psalm/Internal/Provider/FileProvider.php', 'Psalm\\Internal\\Provider\\FileReferenceCacheProvider' => $baseDir . '/src/Psalm/Internal/Provider/FileReferenceCacheProvider.php', 'Psalm\\Internal\\Provider\\FileReferenceProvider' => $baseDir . '/src/Psalm/Internal/Provider/FileReferenceProvider.php', 'Psalm\\Internal\\Provider\\FileStorageCacheProvider' => $baseDir . '/src/Psalm/Internal/Provider/FileStorageCacheProvider.php', 'Psalm\\Internal\\Provider\\FileStorageProvider' => $baseDir . '/src/Psalm/Internal/Provider/FileStorageProvider.php', 'Psalm\\Internal\\Provider\\FunctionExistenceProvider' => $baseDir . '/src/Psalm/Internal/Provider/FunctionExistenceProvider.php', 'Psalm\\Internal\\Provider\\FunctionParamsProvider' => $baseDir . '/src/Psalm/Internal/Provider/FunctionParamsProvider.php', 'Psalm\\Internal\\Provider\\FunctionReturnTypeProvider' => $baseDir . '/src/Psalm/Internal/Provider/FunctionReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\MethodExistenceProvider' => $baseDir . '/src/Psalm/Internal/Provider/MethodExistenceProvider.php', 'Psalm\\Internal\\Provider\\MethodParamsProvider' => $baseDir . '/src/Psalm/Internal/Provider/MethodParamsProvider.php', 'Psalm\\Internal\\Provider\\MethodReturnTypeProvider' => $baseDir . '/src/Psalm/Internal/Provider/MethodReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\MethodVisibilityProvider' => $baseDir . '/src/Psalm/Internal/Provider/MethodVisibilityProvider.php', 'Psalm\\Internal\\Provider\\NodeDataProvider' => $baseDir . '/src/Psalm/Internal/Provider/NodeDataProvider.php', 'Psalm\\Internal\\Provider\\ParserCacheProvider' => $baseDir . '/src/Psalm/Internal/Provider/ParserCacheProvider.php', 'Psalm\\Internal\\Provider\\ProjectCacheProvider' => $baseDir . '/src/Psalm/Internal/Provider/ProjectCacheProvider.php', 'Psalm\\Internal\\Provider\\PropertyExistenceProvider' => $baseDir . '/src/Psalm/Internal/Provider/PropertyExistenceProvider.php', 'Psalm\\Internal\\Provider\\PropertyTypeProvider' => $baseDir . '/src/Psalm/Internal/Provider/PropertyTypeProvider.php', 'Psalm\\Internal\\Provider\\PropertyTypeProvider\\DomDocumentPropertyTypeProvider' => $baseDir . '/src/Psalm/Internal/Provider/PropertyTypeProvider/DomDocumentPropertyTypeProvider.php', 'Psalm\\Internal\\Provider\\PropertyVisibilityProvider' => $baseDir . '/src/Psalm/Internal/Provider/PropertyVisibilityProvider.php', 'Psalm\\Internal\\Provider\\Providers' => $baseDir . '/src/Psalm/Internal/Provider/Providers.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayChunkReturnTypeProvider' => $baseDir . '/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayChunkReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayColumnReturnTypeProvider' => $baseDir . '/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayColumnReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayCombineReturnTypeProvider' => $baseDir . '/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayCombineReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayFillKeysReturnTypeProvider' => $baseDir . '/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayFillKeysReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayFillReturnTypeProvider' => $baseDir . '/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayFillReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayFilterReturnTypeProvider' => $baseDir . '/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayFilterReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayMapReturnTypeProvider' => $baseDir . '/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayMapReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayMergeReturnTypeProvider' => $baseDir . '/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayMergeReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayPadReturnTypeProvider' => $baseDir . '/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayPadReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayPointerAdjustmentReturnTypeProvider' => $baseDir . '/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayPointerAdjustmentReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayPopReturnTypeProvider' => $baseDir . '/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayPopReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayRandReturnTypeProvider' => $baseDir . '/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayRandReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayReduceReturnTypeProvider' => $baseDir . '/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayReduceReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayReverseReturnTypeProvider' => $baseDir . '/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayReverseReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArraySliceReturnTypeProvider' => $baseDir . '/src/Psalm/Internal/Provider/ReturnTypeProvider/ArraySliceReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArraySpliceReturnTypeProvider' => $baseDir . '/src/Psalm/Internal/Provider/ReturnTypeProvider/ArraySpliceReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayUniqueReturnTypeProvider' => $baseDir . '/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayUniqueReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\BasenameReturnTypeProvider' => $baseDir . '/src/Psalm/Internal/Provider/ReturnTypeProvider/BasenameReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ClosureFromCallableReturnTypeProvider' => $baseDir . '/src/Psalm/Internal/Provider/ReturnTypeProvider/ClosureFromCallableReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\DateTimeModifyReturnTypeProvider' => $baseDir . '/src/Psalm/Internal/Provider/ReturnTypeProvider/DateTimeModifyReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\DirnameReturnTypeProvider' => $baseDir . '/src/Psalm/Internal/Provider/ReturnTypeProvider/DirnameReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\DomNodeAppendChild' => $baseDir . '/src/Psalm/Internal/Provider/ReturnTypeProvider/DomNodeAppendChild.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\FilterVarReturnTypeProvider' => $baseDir . '/src/Psalm/Internal/Provider/ReturnTypeProvider/FilterVarReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\FirstArgStringReturnTypeProvider' => $baseDir . '/src/Psalm/Internal/Provider/ReturnTypeProvider/FirstArgStringReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\GetClassMethodsReturnTypeProvider' => $baseDir . '/src/Psalm/Internal/Provider/ReturnTypeProvider/GetClassMethodsReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\GetObjectVarsReturnTypeProvider' => $baseDir . '/src/Psalm/Internal/Provider/ReturnTypeProvider/GetObjectVarsReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\HexdecReturnTypeProvider' => $baseDir . '/src/Psalm/Internal/Provider/ReturnTypeProvider/HexdecReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ImagickPixelColorReturnTypeProvider' => $baseDir . '/src/Psalm/Internal/Provider/ReturnTypeProvider/ImagickPixelColorReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\InArrayReturnTypeProvider' => $baseDir . '/src/Psalm/Internal/Provider/ReturnTypeProvider/InArrayReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\IteratorToArrayReturnTypeProvider' => $baseDir . '/src/Psalm/Internal/Provider/ReturnTypeProvider/IteratorToArrayReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\MbInternalEncodingReturnTypeProvider' => $baseDir . '/src/Psalm/Internal/Provider/ReturnTypeProvider/MbInternalEncodingReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\MinMaxReturnTypeProvider' => $baseDir . '/src/Psalm/Internal/Provider/ReturnTypeProvider/MinMaxReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\MktimeReturnTypeProvider' => $baseDir . '/src/Psalm/Internal/Provider/ReturnTypeProvider/MktimeReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ParseUrlReturnTypeProvider' => $baseDir . '/src/Psalm/Internal/Provider/ReturnTypeProvider/ParseUrlReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\PdoStatementReturnTypeProvider' => $baseDir . '/src/Psalm/Internal/Provider/ReturnTypeProvider/PdoStatementReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\PdoStatementSetFetchMode' => $baseDir . '/src/Psalm/Internal/Provider/ReturnTypeProvider/PdoStatementSetFetchMode.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\RandReturnTypeProvider' => $baseDir . '/src/Psalm/Internal/Provider/ReturnTypeProvider/RandReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\RoundReturnTypeProvider' => $baseDir . '/src/Psalm/Internal/Provider/ReturnTypeProvider/RoundReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\SimpleXmlElementAsXml' => $baseDir . '/src/Psalm/Internal/Provider/ReturnTypeProvider/SimpleXmlElementAsXml.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\StrReplaceReturnTypeProvider' => $baseDir . '/src/Psalm/Internal/Provider/ReturnTypeProvider/StrReplaceReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\StrTrReturnTypeProvider' => $baseDir . '/src/Psalm/Internal/Provider/ReturnTypeProvider/StrTrReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\TriggerErrorReturnTypeProvider' => $baseDir . '/src/Psalm/Internal/Provider/ReturnTypeProvider/TriggerErrorReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\VersionCompareReturnTypeProvider' => $baseDir . '/src/Psalm/Internal/Provider/ReturnTypeProvider/VersionCompareReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\StatementsProvider' => $baseDir . '/src/Psalm/Internal/Provider/StatementsProvider.php', 'Psalm\\Internal\\Provider\\StatementsVolatileCache' => $baseDir . '/src/Psalm/Internal/Provider/StatementsVolatileCache.php', 'Psalm\\Internal\\ReferenceConstraint' => $baseDir . '/src/Psalm/Internal/ReferenceConstraint.php', 'Psalm\\Internal\\RuntimeCaches' => $baseDir . '/src/Psalm/Internal/RuntimeCaches.php', 'Psalm\\Internal\\Scanner\\ClassLikeDocblockComment' => $baseDir . '/src/Psalm/Internal/Scanner/ClassLikeDocblockComment.php', 'Psalm\\Internal\\Scanner\\DocblockParser' => $baseDir . '/src/Psalm/Internal/Scanner/DocblockParser.php', 'Psalm\\Internal\\Scanner\\FileScanner' => $baseDir . '/src/Psalm/Internal/Scanner/FileScanner.php', 'Psalm\\Internal\\Scanner\\FunctionDocblockComment' => $baseDir . '/src/Psalm/Internal/Scanner/FunctionDocblockComment.php', 'Psalm\\Internal\\Scanner\\ParsedDocblock' => $baseDir . '/src/Psalm/Internal/Scanner/ParsedDocblock.php', 'Psalm\\Internal\\Scanner\\PhpStormMetaScanner' => $baseDir . '/src/Psalm/Internal/Scanner/PhpStormMetaScanner.php', 'Psalm\\Internal\\Scanner\\UnresolvedConstantComponent' => $baseDir . '/src/Psalm/Internal/Scanner/UnresolvedConstantComponent.php', 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\ArrayOffsetFetch' => $baseDir . '/src/Psalm/Internal/Scanner/UnresolvedConstant/ArrayOffsetFetch.php', 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\ArraySpread' => $baseDir . '/src/Psalm/Internal/Scanner/UnresolvedConstant/ArraySpread.php', 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\ArrayValue' => $baseDir . '/src/Psalm/Internal/Scanner/UnresolvedConstant/ArrayValue.php', 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\ClassConstant' => $baseDir . '/src/Psalm/Internal/Scanner/UnresolvedConstant/ClassConstant.php', 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\Constant' => $baseDir . '/src/Psalm/Internal/Scanner/UnresolvedConstant/Constant.php', 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\KeyValuePair' => $baseDir . '/src/Psalm/Internal/Scanner/UnresolvedConstant/KeyValuePair.php', 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\ScalarValue' => $baseDir . '/src/Psalm/Internal/Scanner/UnresolvedConstant/ScalarValue.php', 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedAdditionOp' => $baseDir . '/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedAdditionOp.php', 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedBinaryOp' => $baseDir . '/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedBinaryOp.php', 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedBitwiseAnd' => $baseDir . '/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedBitwiseAnd.php', 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedBitwiseOr' => $baseDir . '/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedBitwiseOr.php', 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedBitwiseXor' => $baseDir . '/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedBitwiseXor.php', 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedConcatOp' => $baseDir . '/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedConcatOp.php', 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedDivisionOp' => $baseDir . '/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedDivisionOp.php', 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedMultiplicationOp' => $baseDir . '/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedMultiplicationOp.php', 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedSubtractionOp' => $baseDir . '/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedSubtractionOp.php', 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedTernary' => $baseDir . '/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedTernary.php', 'Psalm\\Internal\\Scanner\\VarDocblockComment' => $baseDir . '/src/Psalm/Internal/Scanner/VarDocblockComment.php', 'Psalm\\Internal\\Scope\\CaseScope' => $baseDir . '/src/Psalm/Internal/Scope/CaseScope.php', 'Psalm\\Internal\\Scope\\FinallyScope' => $baseDir . '/src/Psalm/Internal/Scope/FinallyScope.php', 'Psalm\\Internal\\Scope\\IfConditionalScope' => $baseDir . '/src/Psalm/Internal/Scope/IfConditionalScope.php', 'Psalm\\Internal\\Scope\\IfScope' => $baseDir . '/src/Psalm/Internal/Scope/IfScope.php', 'Psalm\\Internal\\Scope\\LoopScope' => $baseDir . '/src/Psalm/Internal/Scope/LoopScope.php', 'Psalm\\Internal\\Scope\\SwitchScope' => $baseDir . '/src/Psalm/Internal/Scope/SwitchScope.php', 'Psalm\\Internal\\Stubs\\Generator\\ClassLikeStubGenerator' => $baseDir . '/src/Psalm/Internal/Stubs/Generator/ClassLikeStubGenerator.php', 'Psalm\\Internal\\Stubs\\Generator\\StubsGenerator' => $baseDir . '/src/Psalm/Internal/Stubs/Generator/StubsGenerator.php', 'Psalm\\Internal\\TypeVisitor\\CanContainObjectTypeVisitor' => $baseDir . '/src/Psalm/Internal/TypeVisitor/CanContainObjectTypeVisitor.php', 'Psalm\\Internal\\TypeVisitor\\ClasslikeReplacer' => $baseDir . '/src/Psalm/Internal/TypeVisitor/ClasslikeReplacer.php', 'Psalm\\Internal\\TypeVisitor\\ContainsClassLikeVisitor' => $baseDir . '/src/Psalm/Internal/TypeVisitor/ContainsClassLikeVisitor.php', 'Psalm\\Internal\\TypeVisitor\\ContainsLiteralVisitor' => $baseDir . '/src/Psalm/Internal/TypeVisitor/ContainsLiteralVisitor.php', 'Psalm\\Internal\\TypeVisitor\\ContainsStaticVisitor' => $baseDir . '/src/Psalm/Internal/TypeVisitor/ContainsStaticVisitor.php', 'Psalm\\Internal\\TypeVisitor\\FromDocblockSetter' => $baseDir . '/src/Psalm/Internal/TypeVisitor/FromDocblockSetter.php', 'Psalm\\Internal\\TypeVisitor\\TemplateTypeCollector' => $baseDir . '/src/Psalm/Internal/TypeVisitor/TemplateTypeCollector.php', 'Psalm\\Internal\\TypeVisitor\\TypeChecker' => $baseDir . '/src/Psalm/Internal/TypeVisitor/TypeChecker.php', 'Psalm\\Internal\\TypeVisitor\\TypeLocalizer' => $baseDir . '/src/Psalm/Internal/TypeVisitor/TypeLocalizer.php', 'Psalm\\Internal\\TypeVisitor\\TypeScanner' => $baseDir . '/src/Psalm/Internal/TypeVisitor/TypeScanner.php', 'Psalm\\Internal\\Type\\ArrayType' => $baseDir . '/src/Psalm/Internal/Type/ArrayType.php', 'Psalm\\Internal\\Type\\AssertionReconciler' => $baseDir . '/src/Psalm/Internal/Type/AssertionReconciler.php', 'Psalm\\Internal\\Type\\Comparator\\ArrayTypeComparator' => $baseDir . '/src/Psalm/Internal/Type/Comparator/ArrayTypeComparator.php', 'Psalm\\Internal\\Type\\Comparator\\AtomicTypeComparator' => $baseDir . '/src/Psalm/Internal/Type/Comparator/AtomicTypeComparator.php', 'Psalm\\Internal\\Type\\Comparator\\CallableTypeComparator' => $baseDir . '/src/Psalm/Internal/Type/Comparator/CallableTypeComparator.php', 'Psalm\\Internal\\Type\\Comparator\\ClassLikeStringComparator' => $baseDir . '/src/Psalm/Internal/Type/Comparator/ClassLikeStringComparator.php', 'Psalm\\Internal\\Type\\Comparator\\GenericTypeComparator' => $baseDir . '/src/Psalm/Internal/Type/Comparator/GenericTypeComparator.php', 'Psalm\\Internal\\Type\\Comparator\\IntegerRangeComparator' => $baseDir . '/src/Psalm/Internal/Type/Comparator/IntegerRangeComparator.php', 'Psalm\\Internal\\Type\\Comparator\\KeyedArrayComparator' => $baseDir . '/src/Psalm/Internal/Type/Comparator/KeyedArrayComparator.php', 'Psalm\\Internal\\Type\\Comparator\\ObjectComparator' => $baseDir . '/src/Psalm/Internal/Type/Comparator/ObjectComparator.php', 'Psalm\\Internal\\Type\\Comparator\\ScalarTypeComparator' => $baseDir . '/src/Psalm/Internal/Type/Comparator/ScalarTypeComparator.php', 'Psalm\\Internal\\Type\\Comparator\\TypeComparisonResult' => $baseDir . '/src/Psalm/Internal/Type/Comparator/TypeComparisonResult.php', 'Psalm\\Internal\\Type\\Comparator\\UnionTypeComparator' => $baseDir . '/src/Psalm/Internal/Type/Comparator/UnionTypeComparator.php', 'Psalm\\Internal\\Type\\NegatedAssertionReconciler' => $baseDir . '/src/Psalm/Internal/Type/NegatedAssertionReconciler.php', 'Psalm\\Internal\\Type\\ParseTree' => $baseDir . '/src/Psalm/Internal/Type/ParseTree.php', 'Psalm\\Internal\\Type\\ParseTreeCreator' => $baseDir . '/src/Psalm/Internal/Type/ParseTreeCreator.php', 'Psalm\\Internal\\Type\\ParseTree\\CallableParamTree' => $baseDir . '/src/Psalm/Internal/Type/ParseTree/CallableParamTree.php', 'Psalm\\Internal\\Type\\ParseTree\\CallableTree' => $baseDir . '/src/Psalm/Internal/Type/ParseTree/CallableTree.php', 'Psalm\\Internal\\Type\\ParseTree\\CallableWithReturnTypeTree' => $baseDir . '/src/Psalm/Internal/Type/ParseTree/CallableWithReturnTypeTree.php', 'Psalm\\Internal\\Type\\ParseTree\\ConditionalTree' => $baseDir . '/src/Psalm/Internal/Type/ParseTree/ConditionalTree.php', 'Psalm\\Internal\\Type\\ParseTree\\EncapsulationTree' => $baseDir . '/src/Psalm/Internal/Type/ParseTree/EncapsulationTree.php', 'Psalm\\Internal\\Type\\ParseTree\\FieldEllipsis' => $baseDir . '/src/Psalm/Internal/Type/ParseTree/FieldEllipsis.php', 'Psalm\\Internal\\Type\\ParseTree\\GenericTree' => $baseDir . '/src/Psalm/Internal/Type/ParseTree/GenericTree.php', 'Psalm\\Internal\\Type\\ParseTree\\IndexedAccessTree' => $baseDir . '/src/Psalm/Internal/Type/ParseTree/IndexedAccessTree.php', 'Psalm\\Internal\\Type\\ParseTree\\IntersectionTree' => $baseDir . '/src/Psalm/Internal/Type/ParseTree/IntersectionTree.php', 'Psalm\\Internal\\Type\\ParseTree\\KeyedArrayPropertyTree' => $baseDir . '/src/Psalm/Internal/Type/ParseTree/KeyedArrayPropertyTree.php', 'Psalm\\Internal\\Type\\ParseTree\\KeyedArrayTree' => $baseDir . '/src/Psalm/Internal/Type/ParseTree/KeyedArrayTree.php', 'Psalm\\Internal\\Type\\ParseTree\\MethodParamTree' => $baseDir . '/src/Psalm/Internal/Type/ParseTree/MethodParamTree.php', 'Psalm\\Internal\\Type\\ParseTree\\MethodTree' => $baseDir . '/src/Psalm/Internal/Type/ParseTree/MethodTree.php', 'Psalm\\Internal\\Type\\ParseTree\\MethodWithReturnTypeTree' => $baseDir . '/src/Psalm/Internal/Type/ParseTree/MethodWithReturnTypeTree.php', 'Psalm\\Internal\\Type\\ParseTree\\NullableTree' => $baseDir . '/src/Psalm/Internal/Type/ParseTree/NullableTree.php', 'Psalm\\Internal\\Type\\ParseTree\\Root' => $baseDir . '/src/Psalm/Internal/Type/ParseTree/Root.php', 'Psalm\\Internal\\Type\\ParseTree\\TemplateAsTree' => $baseDir . '/src/Psalm/Internal/Type/ParseTree/TemplateAsTree.php', 'Psalm\\Internal\\Type\\ParseTree\\TemplateIsTree' => $baseDir . '/src/Psalm/Internal/Type/ParseTree/TemplateIsTree.php', 'Psalm\\Internal\\Type\\ParseTree\\UnionTree' => $baseDir . '/src/Psalm/Internal/Type/ParseTree/UnionTree.php', 'Psalm\\Internal\\Type\\ParseTree\\Value' => $baseDir . '/src/Psalm/Internal/Type/ParseTree/Value.php', 'Psalm\\Internal\\Type\\SimpleAssertionReconciler' => $baseDir . '/src/Psalm/Internal/Type/SimpleAssertionReconciler.php', 'Psalm\\Internal\\Type\\SimpleNegatedAssertionReconciler' => $baseDir . '/src/Psalm/Internal/Type/SimpleNegatedAssertionReconciler.php', 'Psalm\\Internal\\Type\\TemplateBound' => $baseDir . '/src/Psalm/Internal/Type/TemplateBound.php', 'Psalm\\Internal\\Type\\TemplateInferredTypeReplacer' => $baseDir . '/src/Psalm/Internal/Type/TemplateInferredTypeReplacer.php', 'Psalm\\Internal\\Type\\TemplateResult' => $baseDir . '/src/Psalm/Internal/Type/TemplateResult.php', 'Psalm\\Internal\\Type\\TemplateStandinTypeReplacer' => $baseDir . '/src/Psalm/Internal/Type/TemplateStandinTypeReplacer.php', 'Psalm\\Internal\\Type\\TypeAlias' => $baseDir . '/src/Psalm/Internal/Type/TypeAlias.php', 'Psalm\\Internal\\Type\\TypeAlias\\ClassTypeAlias' => $baseDir . '/src/Psalm/Internal/Type/TypeAlias/ClassTypeAlias.php', 'Psalm\\Internal\\Type\\TypeAlias\\InlineTypeAlias' => $baseDir . '/src/Psalm/Internal/Type/TypeAlias/InlineTypeAlias.php', 'Psalm\\Internal\\Type\\TypeAlias\\LinkableTypeAlias' => $baseDir . '/src/Psalm/Internal/Type/TypeAlias/LinkableTypeAlias.php', 'Psalm\\Internal\\Type\\TypeCombination' => $baseDir . '/src/Psalm/Internal/Type/TypeCombination.php', 'Psalm\\Internal\\Type\\TypeCombiner' => $baseDir . '/src/Psalm/Internal/Type/TypeCombiner.php', 'Psalm\\Internal\\Type\\TypeExpander' => $baseDir . '/src/Psalm/Internal/Type/TypeExpander.php', 'Psalm\\Internal\\Type\\TypeParser' => $baseDir . '/src/Psalm/Internal/Type/TypeParser.php', 'Psalm\\Internal\\Type\\TypeTokenizer' => $baseDir . '/src/Psalm/Internal/Type/TypeTokenizer.php', 'Psalm\\Internal\\VersionUtils' => $baseDir . '/src/Psalm/Internal/VersionUtils.php', 'Psalm\\IssueBuffer' => $baseDir . '/src/Psalm/IssueBuffer.php', 'Psalm\\Issue\\AbstractInstantiation' => $baseDir . '/src/Psalm/Issue/AbstractInstantiation.php', 'Psalm\\Issue\\AbstractMethodCall' => $baseDir . '/src/Psalm/Issue/AbstractMethodCall.php', 'Psalm\\Issue\\AmbiguousConstantInheritance' => $baseDir . '/src/Psalm/Issue/AmbiguousConstantInheritance.php', 'Psalm\\Issue\\ArgumentIssue' => $baseDir . '/src/Psalm/Issue/ArgumentIssue.php', 'Psalm\\Issue\\ArgumentTypeCoercion' => $baseDir . '/src/Psalm/Issue/ArgumentTypeCoercion.php', 'Psalm\\Issue\\AssignmentToVoid' => $baseDir . '/src/Psalm/Issue/AssignmentToVoid.php', 'Psalm\\Issue\\CheckType' => $baseDir . '/src/Psalm/Issue/CheckType.php', 'Psalm\\Issue\\CircularReference' => $baseDir . '/src/Psalm/Issue/CircularReference.php', 'Psalm\\Issue\\ClassConstantIssue' => $baseDir . '/src/Psalm/Issue/ClassConstantIssue.php', 'Psalm\\Issue\\ClassIssue' => $baseDir . '/src/Psalm/Issue/ClassIssue.php', 'Psalm\\Issue\\CodeIssue' => $baseDir . '/src/Psalm/Issue/CodeIssue.php', 'Psalm\\Issue\\ComplexFunction' => $baseDir . '/src/Psalm/Issue/ComplexFunction.php', 'Psalm\\Issue\\ComplexMethod' => $baseDir . '/src/Psalm/Issue/ComplexMethod.php', 'Psalm\\Issue\\ConfigIssue' => $baseDir . '/src/Psalm/Issue/ConfigIssue.php', 'Psalm\\Issue\\ConflictingReferenceConstraint' => $baseDir . '/src/Psalm/Issue/ConflictingReferenceConstraint.php', 'Psalm\\Issue\\ConstantDeclarationInTrait' => $baseDir . '/src/Psalm/Issue/ConstantDeclarationInTrait.php', 'Psalm\\Issue\\ConstructorSignatureMismatch' => $baseDir . '/src/Psalm/Issue/ConstructorSignatureMismatch.php', 'Psalm\\Issue\\ContinueOutsideLoop' => $baseDir . '/src/Psalm/Issue/ContinueOutsideLoop.php', 'Psalm\\Issue\\DeprecatedClass' => $baseDir . '/src/Psalm/Issue/DeprecatedClass.php', 'Psalm\\Issue\\DeprecatedConstant' => $baseDir . '/src/Psalm/Issue/DeprecatedConstant.php', 'Psalm\\Issue\\DeprecatedFunction' => $baseDir . '/src/Psalm/Issue/DeprecatedFunction.php', 'Psalm\\Issue\\DeprecatedInterface' => $baseDir . '/src/Psalm/Issue/DeprecatedInterface.php', 'Psalm\\Issue\\DeprecatedMethod' => $baseDir . '/src/Psalm/Issue/DeprecatedMethod.php', 'Psalm\\Issue\\DeprecatedProperty' => $baseDir . '/src/Psalm/Issue/DeprecatedProperty.php', 'Psalm\\Issue\\DeprecatedTrait' => $baseDir . '/src/Psalm/Issue/DeprecatedTrait.php', 'Psalm\\Issue\\DocblockTypeContradiction' => $baseDir . '/src/Psalm/Issue/DocblockTypeContradiction.php', 'Psalm\\Issue\\DuplicateArrayKey' => $baseDir . '/src/Psalm/Issue/DuplicateArrayKey.php', 'Psalm\\Issue\\DuplicateClass' => $baseDir . '/src/Psalm/Issue/DuplicateClass.php', 'Psalm\\Issue\\DuplicateConstant' => $baseDir . '/src/Psalm/Issue/DuplicateConstant.php', 'Psalm\\Issue\\DuplicateEnumCase' => $baseDir . '/src/Psalm/Issue/DuplicateEnumCase.php', 'Psalm\\Issue\\DuplicateEnumCaseValue' => $baseDir . '/src/Psalm/Issue/DuplicateEnumCaseValue.php', 'Psalm\\Issue\\DuplicateFunction' => $baseDir . '/src/Psalm/Issue/DuplicateFunction.php', 'Psalm\\Issue\\DuplicateMethod' => $baseDir . '/src/Psalm/Issue/DuplicateMethod.php', 'Psalm\\Issue\\DuplicateParam' => $baseDir . '/src/Psalm/Issue/DuplicateParam.php', 'Psalm\\Issue\\EmptyArrayAccess' => $baseDir . '/src/Psalm/Issue/EmptyArrayAccess.php', 'Psalm\\Issue\\ExtensionRequirementViolation' => $baseDir . '/src/Psalm/Issue/ExtensionRequirementViolation.php', 'Psalm\\Issue\\FalsableReturnStatement' => $baseDir . '/src/Psalm/Issue/FalsableReturnStatement.php', 'Psalm\\Issue\\FalseOperand' => $baseDir . '/src/Psalm/Issue/FalseOperand.php', 'Psalm\\Issue\\ForbiddenCode' => $baseDir . '/src/Psalm/Issue/ForbiddenCode.php', 'Psalm\\Issue\\FunctionIssue' => $baseDir . '/src/Psalm/Issue/FunctionIssue.php', 'Psalm\\Issue\\IfThisIsMismatch' => $baseDir . '/src/Psalm/Issue/IfThisIsMismatch.php', 'Psalm\\Issue\\ImplementationRequirementViolation' => $baseDir . '/src/Psalm/Issue/ImplementationRequirementViolation.php', 'Psalm\\Issue\\ImplementedParamTypeMismatch' => $baseDir . '/src/Psalm/Issue/ImplementedParamTypeMismatch.php', 'Psalm\\Issue\\ImplementedReturnTypeMismatch' => $baseDir . '/src/Psalm/Issue/ImplementedReturnTypeMismatch.php', 'Psalm\\Issue\\ImplicitToStringCast' => $baseDir . '/src/Psalm/Issue/ImplicitToStringCast.php', 'Psalm\\Issue\\ImpureByReferenceAssignment' => $baseDir . '/src/Psalm/Issue/ImpureByReferenceAssignment.php', 'Psalm\\Issue\\ImpureFunctionCall' => $baseDir . '/src/Psalm/Issue/ImpureFunctionCall.php', 'Psalm\\Issue\\ImpureMethodCall' => $baseDir . '/src/Psalm/Issue/ImpureMethodCall.php', 'Psalm\\Issue\\ImpurePropertyAssignment' => $baseDir . '/src/Psalm/Issue/ImpurePropertyAssignment.php', 'Psalm\\Issue\\ImpurePropertyFetch' => $baseDir . '/src/Psalm/Issue/ImpurePropertyFetch.php', 'Psalm\\Issue\\ImpureStaticProperty' => $baseDir . '/src/Psalm/Issue/ImpureStaticProperty.php', 'Psalm\\Issue\\ImpureStaticVariable' => $baseDir . '/src/Psalm/Issue/ImpureStaticVariable.php', 'Psalm\\Issue\\ImpureVariable' => $baseDir . '/src/Psalm/Issue/ImpureVariable.php', 'Psalm\\Issue\\InaccessibleClassConstant' => $baseDir . '/src/Psalm/Issue/InaccessibleClassConstant.php', 'Psalm\\Issue\\InaccessibleMethod' => $baseDir . '/src/Psalm/Issue/InaccessibleMethod.php', 'Psalm\\Issue\\InaccessibleProperty' => $baseDir . '/src/Psalm/Issue/InaccessibleProperty.php', 'Psalm\\Issue\\InterfaceInstantiation' => $baseDir . '/src/Psalm/Issue/InterfaceInstantiation.php', 'Psalm\\Issue\\InternalClass' => $baseDir . '/src/Psalm/Issue/InternalClass.php', 'Psalm\\Issue\\InternalMethod' => $baseDir . '/src/Psalm/Issue/InternalMethod.php', 'Psalm\\Issue\\InternalProperty' => $baseDir . '/src/Psalm/Issue/InternalProperty.php', 'Psalm\\Issue\\InvalidArgument' => $baseDir . '/src/Psalm/Issue/InvalidArgument.php', 'Psalm\\Issue\\InvalidArrayAccess' => $baseDir . '/src/Psalm/Issue/InvalidArrayAccess.php', 'Psalm\\Issue\\InvalidArrayAssignment' => $baseDir . '/src/Psalm/Issue/InvalidArrayAssignment.php', 'Psalm\\Issue\\InvalidArrayOffset' => $baseDir . '/src/Psalm/Issue/InvalidArrayOffset.php', 'Psalm\\Issue\\InvalidAttribute' => $baseDir . '/src/Psalm/Issue/InvalidAttribute.php', 'Psalm\\Issue\\InvalidCast' => $baseDir . '/src/Psalm/Issue/InvalidCast.php', 'Psalm\\Issue\\InvalidCatch' => $baseDir . '/src/Psalm/Issue/InvalidCatch.php', 'Psalm\\Issue\\InvalidClass' => $baseDir . '/src/Psalm/Issue/InvalidClass.php', 'Psalm\\Issue\\InvalidClassConstantType' => $baseDir . '/src/Psalm/Issue/InvalidClassConstantType.php', 'Psalm\\Issue\\InvalidClone' => $baseDir . '/src/Psalm/Issue/InvalidClone.php', 'Psalm\\Issue\\InvalidConstantAssignmentValue' => $baseDir . '/src/Psalm/Issue/InvalidConstantAssignmentValue.php', 'Psalm\\Issue\\InvalidDocblock' => $baseDir . '/src/Psalm/Issue/InvalidDocblock.php', 'Psalm\\Issue\\InvalidDocblockParamName' => $baseDir . '/src/Psalm/Issue/InvalidDocblockParamName.php', 'Psalm\\Issue\\InvalidEnumBackingType' => $baseDir . '/src/Psalm/Issue/InvalidEnumBackingType.php', 'Psalm\\Issue\\InvalidEnumCaseValue' => $baseDir . '/src/Psalm/Issue/InvalidEnumCaseValue.php', 'Psalm\\Issue\\InvalidEnumMethod' => $baseDir . '/src/Psalm/Issue/InvalidEnumMethod.php', 'Psalm\\Issue\\InvalidExtendClass' => $baseDir . '/src/Psalm/Issue/InvalidExtendClass.php', 'Psalm\\Issue\\InvalidFalsableReturnType' => $baseDir . '/src/Psalm/Issue/InvalidFalsableReturnType.php', 'Psalm\\Issue\\InvalidFunctionCall' => $baseDir . '/src/Psalm/Issue/InvalidFunctionCall.php', 'Psalm\\Issue\\InvalidGlobal' => $baseDir . '/src/Psalm/Issue/InvalidGlobal.php', 'Psalm\\Issue\\InvalidIterator' => $baseDir . '/src/Psalm/Issue/InvalidIterator.php', 'Psalm\\Issue\\InvalidLiteralArgument' => $baseDir . '/src/Psalm/Issue/InvalidLiteralArgument.php', 'Psalm\\Issue\\InvalidMethodCall' => $baseDir . '/src/Psalm/Issue/InvalidMethodCall.php', 'Psalm\\Issue\\InvalidNamedArgument' => $baseDir . '/src/Psalm/Issue/InvalidNamedArgument.php', 'Psalm\\Issue\\InvalidNullableReturnType' => $baseDir . '/src/Psalm/Issue/InvalidNullableReturnType.php', 'Psalm\\Issue\\InvalidOperand' => $baseDir . '/src/Psalm/Issue/InvalidOperand.php', 'Psalm\\Issue\\InvalidParamDefault' => $baseDir . '/src/Psalm/Issue/InvalidParamDefault.php', 'Psalm\\Issue\\InvalidParent' => $baseDir . '/src/Psalm/Issue/InvalidParent.php', 'Psalm\\Issue\\InvalidPassByReference' => $baseDir . '/src/Psalm/Issue/InvalidPassByReference.php', 'Psalm\\Issue\\InvalidPropertyAssignment' => $baseDir . '/src/Psalm/Issue/InvalidPropertyAssignment.php', 'Psalm\\Issue\\InvalidPropertyAssignmentValue' => $baseDir . '/src/Psalm/Issue/InvalidPropertyAssignmentValue.php', 'Psalm\\Issue\\InvalidPropertyFetch' => $baseDir . '/src/Psalm/Issue/InvalidPropertyFetch.php', 'Psalm\\Issue\\InvalidReturnStatement' => $baseDir . '/src/Psalm/Issue/InvalidReturnStatement.php', 'Psalm\\Issue\\InvalidReturnType' => $baseDir . '/src/Psalm/Issue/InvalidReturnType.php', 'Psalm\\Issue\\InvalidScalarArgument' => $baseDir . '/src/Psalm/Issue/InvalidScalarArgument.php', 'Psalm\\Issue\\InvalidScope' => $baseDir . '/src/Psalm/Issue/InvalidScope.php', 'Psalm\\Issue\\InvalidStaticInvocation' => $baseDir . '/src/Psalm/Issue/InvalidStaticInvocation.php', 'Psalm\\Issue\\InvalidStringClass' => $baseDir . '/src/Psalm/Issue/InvalidStringClass.php', 'Psalm\\Issue\\InvalidTemplateParam' => $baseDir . '/src/Psalm/Issue/InvalidTemplateParam.php', 'Psalm\\Issue\\InvalidThrow' => $baseDir . '/src/Psalm/Issue/InvalidThrow.php', 'Psalm\\Issue\\InvalidToString' => $baseDir . '/src/Psalm/Issue/InvalidToString.php', 'Psalm\\Issue\\InvalidTraversableImplementation' => $baseDir . '/src/Psalm/Issue/InvalidTraversableImplementation.php', 'Psalm\\Issue\\InvalidTypeImport' => $baseDir . '/src/Psalm/Issue/InvalidTypeImport.php', 'Psalm\\Issue\\LessSpecificClassConstantType' => $baseDir . '/src/Psalm/Issue/LessSpecificClassConstantType.php', 'Psalm\\Issue\\LessSpecificImplementedReturnType' => $baseDir . '/src/Psalm/Issue/LessSpecificImplementedReturnType.php', 'Psalm\\Issue\\LessSpecificReturnStatement' => $baseDir . '/src/Psalm/Issue/LessSpecificReturnStatement.php', 'Psalm\\Issue\\LessSpecificReturnType' => $baseDir . '/src/Psalm/Issue/LessSpecificReturnType.php', 'Psalm\\Issue\\LoopInvalidation' => $baseDir . '/src/Psalm/Issue/LoopInvalidation.php', 'Psalm\\Issue\\MethodIssue' => $baseDir . '/src/Psalm/Issue/MethodIssue.php', 'Psalm\\Issue\\MethodSignatureMismatch' => $baseDir . '/src/Psalm/Issue/MethodSignatureMismatch.php', 'Psalm\\Issue\\MethodSignatureMustOmitReturnType' => $baseDir . '/src/Psalm/Issue/MethodSignatureMustOmitReturnType.php', 'Psalm\\Issue\\MethodSignatureMustProvideReturnType' => $baseDir . '/src/Psalm/Issue/MethodSignatureMustProvideReturnType.php', 'Psalm\\Issue\\MismatchingDocblockParamType' => $baseDir . '/src/Psalm/Issue/MismatchingDocblockParamType.php', 'Psalm\\Issue\\MismatchingDocblockPropertyType' => $baseDir . '/src/Psalm/Issue/MismatchingDocblockPropertyType.php', 'Psalm\\Issue\\MismatchingDocblockReturnType' => $baseDir . '/src/Psalm/Issue/MismatchingDocblockReturnType.php', 'Psalm\\Issue\\MissingClosureParamType' => $baseDir . '/src/Psalm/Issue/MissingClosureParamType.php', 'Psalm\\Issue\\MissingClosureReturnType' => $baseDir . '/src/Psalm/Issue/MissingClosureReturnType.php', 'Psalm\\Issue\\MissingConstructor' => $baseDir . '/src/Psalm/Issue/MissingConstructor.php', 'Psalm\\Issue\\MissingDependency' => $baseDir . '/src/Psalm/Issue/MissingDependency.php', 'Psalm\\Issue\\MissingDocblockType' => $baseDir . '/src/Psalm/Issue/MissingDocblockType.php', 'Psalm\\Issue\\MissingFile' => $baseDir . '/src/Psalm/Issue/MissingFile.php', 'Psalm\\Issue\\MissingImmutableAnnotation' => $baseDir . '/src/Psalm/Issue/MissingImmutableAnnotation.php', 'Psalm\\Issue\\MissingParamType' => $baseDir . '/src/Psalm/Issue/MissingParamType.php', 'Psalm\\Issue\\MissingPropertyType' => $baseDir . '/src/Psalm/Issue/MissingPropertyType.php', 'Psalm\\Issue\\MissingReturnType' => $baseDir . '/src/Psalm/Issue/MissingReturnType.php', 'Psalm\\Issue\\MissingTemplateParam' => $baseDir . '/src/Psalm/Issue/MissingTemplateParam.php', 'Psalm\\Issue\\MissingThrowsDocblock' => $baseDir . '/src/Psalm/Issue/MissingThrowsDocblock.php', 'Psalm\\Issue\\MixedArgument' => $baseDir . '/src/Psalm/Issue/MixedArgument.php', 'Psalm\\Issue\\MixedArgumentTypeCoercion' => $baseDir . '/src/Psalm/Issue/MixedArgumentTypeCoercion.php', 'Psalm\\Issue\\MixedArrayAccess' => $baseDir . '/src/Psalm/Issue/MixedArrayAccess.php', 'Psalm\\Issue\\MixedArrayAssignment' => $baseDir . '/src/Psalm/Issue/MixedArrayAssignment.php', 'Psalm\\Issue\\MixedArrayOffset' => $baseDir . '/src/Psalm/Issue/MixedArrayOffset.php', 'Psalm\\Issue\\MixedArrayTypeCoercion' => $baseDir . '/src/Psalm/Issue/MixedArrayTypeCoercion.php', 'Psalm\\Issue\\MixedAssignment' => $baseDir . '/src/Psalm/Issue/MixedAssignment.php', 'Psalm\\Issue\\MixedClone' => $baseDir . '/src/Psalm/Issue/MixedClone.php', 'Psalm\\Issue\\MixedFunctionCall' => $baseDir . '/src/Psalm/Issue/MixedFunctionCall.php', 'Psalm\\Issue\\MixedInferredReturnType' => $baseDir . '/src/Psalm/Issue/MixedInferredReturnType.php', 'Psalm\\Issue\\MixedIssue' => $baseDir . '/src/Psalm/Issue/MixedIssue.php', 'Psalm\\Issue\\MixedIssueTrait' => $baseDir . '/src/Psalm/Issue/MixedIssueTrait.php', 'Psalm\\Issue\\MixedMethodCall' => $baseDir . '/src/Psalm/Issue/MixedMethodCall.php', 'Psalm\\Issue\\MixedOperand' => $baseDir . '/src/Psalm/Issue/MixedOperand.php', 'Psalm\\Issue\\MixedPropertyAssignment' => $baseDir . '/src/Psalm/Issue/MixedPropertyAssignment.php', 'Psalm\\Issue\\MixedPropertyFetch' => $baseDir . '/src/Psalm/Issue/MixedPropertyFetch.php', 'Psalm\\Issue\\MixedPropertyTypeCoercion' => $baseDir . '/src/Psalm/Issue/MixedPropertyTypeCoercion.php', 'Psalm\\Issue\\MixedReturnStatement' => $baseDir . '/src/Psalm/Issue/MixedReturnStatement.php', 'Psalm\\Issue\\MixedReturnTypeCoercion' => $baseDir . '/src/Psalm/Issue/MixedReturnTypeCoercion.php', 'Psalm\\Issue\\MixedStringOffsetAssignment' => $baseDir . '/src/Psalm/Issue/MixedStringOffsetAssignment.php', 'Psalm\\Issue\\MoreSpecificImplementedParamType' => $baseDir . '/src/Psalm/Issue/MoreSpecificImplementedParamType.php', 'Psalm\\Issue\\MoreSpecificReturnType' => $baseDir . '/src/Psalm/Issue/MoreSpecificReturnType.php', 'Psalm\\Issue\\MutableDependency' => $baseDir . '/src/Psalm/Issue/MutableDependency.php', 'Psalm\\Issue\\NamedArgumentNotAllowed' => $baseDir . '/src/Psalm/Issue/NamedArgumentNotAllowed.php', 'Psalm\\Issue\\NoEnumProperties' => $baseDir . '/src/Psalm/Issue/NoEnumProperties.php', 'Psalm\\Issue\\NoInterfaceProperties' => $baseDir . '/src/Psalm/Issue/NoInterfaceProperties.php', 'Psalm\\Issue\\NoValue' => $baseDir . '/src/Psalm/Issue/NoValue.php', 'Psalm\\Issue\\NonInvariantDocblockPropertyType' => $baseDir . '/src/Psalm/Issue/NonInvariantDocblockPropertyType.php', 'Psalm\\Issue\\NonInvariantPropertyType' => $baseDir . '/src/Psalm/Issue/NonInvariantPropertyType.php', 'Psalm\\Issue\\NonStaticSelfCall' => $baseDir . '/src/Psalm/Issue/NonStaticSelfCall.php', 'Psalm\\Issue\\NullArgument' => $baseDir . '/src/Psalm/Issue/NullArgument.php', 'Psalm\\Issue\\NullArrayAccess' => $baseDir . '/src/Psalm/Issue/NullArrayAccess.php', 'Psalm\\Issue\\NullArrayOffset' => $baseDir . '/src/Psalm/Issue/NullArrayOffset.php', 'Psalm\\Issue\\NullFunctionCall' => $baseDir . '/src/Psalm/Issue/NullFunctionCall.php', 'Psalm\\Issue\\NullIterator' => $baseDir . '/src/Psalm/Issue/NullIterator.php', 'Psalm\\Issue\\NullOperand' => $baseDir . '/src/Psalm/Issue/NullOperand.php', 'Psalm\\Issue\\NullPropertyAssignment' => $baseDir . '/src/Psalm/Issue/NullPropertyAssignment.php', 'Psalm\\Issue\\NullPropertyFetch' => $baseDir . '/src/Psalm/Issue/NullPropertyFetch.php', 'Psalm\\Issue\\NullReference' => $baseDir . '/src/Psalm/Issue/NullReference.php', 'Psalm\\Issue\\NullableReturnStatement' => $baseDir . '/src/Psalm/Issue/NullableReturnStatement.php', 'Psalm\\Issue\\OverriddenFinalConstant' => $baseDir . '/src/Psalm/Issue/OverriddenFinalConstant.php', 'Psalm\\Issue\\OverriddenInterfaceConstant' => $baseDir . '/src/Psalm/Issue/OverriddenInterfaceConstant.php', 'Psalm\\Issue\\OverriddenMethodAccess' => $baseDir . '/src/Psalm/Issue/OverriddenMethodAccess.php', 'Psalm\\Issue\\OverriddenPropertyAccess' => $baseDir . '/src/Psalm/Issue/OverriddenPropertyAccess.php', 'Psalm\\Issue\\ParadoxicalCondition' => $baseDir . '/src/Psalm/Issue/ParadoxicalCondition.php', 'Psalm\\Issue\\ParamNameMismatch' => $baseDir . '/src/Psalm/Issue/ParamNameMismatch.php', 'Psalm\\Issue\\ParentNotFound' => $baseDir . '/src/Psalm/Issue/ParentNotFound.php', 'Psalm\\Issue\\ParseError' => $baseDir . '/src/Psalm/Issue/ParseError.php', 'Psalm\\Issue\\PluginIssue' => $baseDir . '/src/Psalm/Issue/PluginIssue.php', 'Psalm\\Issue\\PossibleRawObjectIteration' => $baseDir . '/src/Psalm/Issue/PossibleRawObjectIteration.php', 'Psalm\\Issue\\PossiblyFalseArgument' => $baseDir . '/src/Psalm/Issue/PossiblyFalseArgument.php', 'Psalm\\Issue\\PossiblyFalseIterator' => $baseDir . '/src/Psalm/Issue/PossiblyFalseIterator.php', 'Psalm\\Issue\\PossiblyFalseOperand' => $baseDir . '/src/Psalm/Issue/PossiblyFalseOperand.php', 'Psalm\\Issue\\PossiblyFalsePropertyAssignmentValue' => $baseDir . '/src/Psalm/Issue/PossiblyFalsePropertyAssignmentValue.php', 'Psalm\\Issue\\PossiblyFalseReference' => $baseDir . '/src/Psalm/Issue/PossiblyFalseReference.php', 'Psalm\\Issue\\PossiblyInvalidArgument' => $baseDir . '/src/Psalm/Issue/PossiblyInvalidArgument.php', 'Psalm\\Issue\\PossiblyInvalidArrayAccess' => $baseDir . '/src/Psalm/Issue/PossiblyInvalidArrayAccess.php', 'Psalm\\Issue\\PossiblyInvalidArrayAssignment' => $baseDir . '/src/Psalm/Issue/PossiblyInvalidArrayAssignment.php', 'Psalm\\Issue\\PossiblyInvalidArrayOffset' => $baseDir . '/src/Psalm/Issue/PossiblyInvalidArrayOffset.php', 'Psalm\\Issue\\PossiblyInvalidCast' => $baseDir . '/src/Psalm/Issue/PossiblyInvalidCast.php', 'Psalm\\Issue\\PossiblyInvalidClone' => $baseDir . '/src/Psalm/Issue/PossiblyInvalidClone.php', 'Psalm\\Issue\\PossiblyInvalidDocblockTag' => $baseDir . '/src/Psalm/Issue/PossiblyInvalidDocblockTag.php', 'Psalm\\Issue\\PossiblyInvalidFunctionCall' => $baseDir . '/src/Psalm/Issue/PossiblyInvalidFunctionCall.php', 'Psalm\\Issue\\PossiblyInvalidIterator' => $baseDir . '/src/Psalm/Issue/PossiblyInvalidIterator.php', 'Psalm\\Issue\\PossiblyInvalidMethodCall' => $baseDir . '/src/Psalm/Issue/PossiblyInvalidMethodCall.php', 'Psalm\\Issue\\PossiblyInvalidOperand' => $baseDir . '/src/Psalm/Issue/PossiblyInvalidOperand.php', 'Psalm\\Issue\\PossiblyInvalidPropertyAssignment' => $baseDir . '/src/Psalm/Issue/PossiblyInvalidPropertyAssignment.php', 'Psalm\\Issue\\PossiblyInvalidPropertyAssignmentValue' => $baseDir . '/src/Psalm/Issue/PossiblyInvalidPropertyAssignmentValue.php', 'Psalm\\Issue\\PossiblyInvalidPropertyFetch' => $baseDir . '/src/Psalm/Issue/PossiblyInvalidPropertyFetch.php', 'Psalm\\Issue\\PossiblyNullArgument' => $baseDir . '/src/Psalm/Issue/PossiblyNullArgument.php', 'Psalm\\Issue\\PossiblyNullArrayAccess' => $baseDir . '/src/Psalm/Issue/PossiblyNullArrayAccess.php', 'Psalm\\Issue\\PossiblyNullArrayAssignment' => $baseDir . '/src/Psalm/Issue/PossiblyNullArrayAssignment.php', 'Psalm\\Issue\\PossiblyNullArrayOffset' => $baseDir . '/src/Psalm/Issue/PossiblyNullArrayOffset.php', 'Psalm\\Issue\\PossiblyNullFunctionCall' => $baseDir . '/src/Psalm/Issue/PossiblyNullFunctionCall.php', 'Psalm\\Issue\\PossiblyNullIterator' => $baseDir . '/src/Psalm/Issue/PossiblyNullIterator.php', 'Psalm\\Issue\\PossiblyNullOperand' => $baseDir . '/src/Psalm/Issue/PossiblyNullOperand.php', 'Psalm\\Issue\\PossiblyNullPropertyAssignment' => $baseDir . '/src/Psalm/Issue/PossiblyNullPropertyAssignment.php', 'Psalm\\Issue\\PossiblyNullPropertyAssignmentValue' => $baseDir . '/src/Psalm/Issue/PossiblyNullPropertyAssignmentValue.php', 'Psalm\\Issue\\PossiblyNullPropertyFetch' => $baseDir . '/src/Psalm/Issue/PossiblyNullPropertyFetch.php', 'Psalm\\Issue\\PossiblyNullReference' => $baseDir . '/src/Psalm/Issue/PossiblyNullReference.php', 'Psalm\\Issue\\PossiblyUndefinedArrayOffset' => $baseDir . '/src/Psalm/Issue/PossiblyUndefinedArrayOffset.php', 'Psalm\\Issue\\PossiblyUndefinedGlobalVariable' => $baseDir . '/src/Psalm/Issue/PossiblyUndefinedGlobalVariable.php', 'Psalm\\Issue\\PossiblyUndefinedIntArrayOffset' => $baseDir . '/src/Psalm/Issue/PossiblyUndefinedIntArrayOffset.php', 'Psalm\\Issue\\PossiblyUndefinedMethod' => $baseDir . '/src/Psalm/Issue/PossiblyUndefinedMethod.php', 'Psalm\\Issue\\PossiblyUndefinedStringArrayOffset' => $baseDir . '/src/Psalm/Issue/PossiblyUndefinedStringArrayOffset.php', 'Psalm\\Issue\\PossiblyUndefinedVariable' => $baseDir . '/src/Psalm/Issue/PossiblyUndefinedVariable.php', 'Psalm\\Issue\\PossiblyUnusedMethod' => $baseDir . '/src/Psalm/Issue/PossiblyUnusedMethod.php', 'Psalm\\Issue\\PossiblyUnusedParam' => $baseDir . '/src/Psalm/Issue/PossiblyUnusedParam.php', 'Psalm\\Issue\\PossiblyUnusedProperty' => $baseDir . '/src/Psalm/Issue/PossiblyUnusedProperty.php', 'Psalm\\Issue\\PossiblyUnusedReturnValue' => $baseDir . '/src/Psalm/Issue/PossiblyUnusedReturnValue.php', 'Psalm\\Issue\\PropertyIssue' => $baseDir . '/src/Psalm/Issue/PropertyIssue.php', 'Psalm\\Issue\\PropertyNotSetInConstructor' => $baseDir . '/src/Psalm/Issue/PropertyNotSetInConstructor.php', 'Psalm\\Issue\\PropertyTypeCoercion' => $baseDir . '/src/Psalm/Issue/PropertyTypeCoercion.php', 'Psalm\\Issue\\PsalmInternalError' => $baseDir . '/src/Psalm/Issue/PsalmInternalError.php', 'Psalm\\Issue\\RawObjectIteration' => $baseDir . '/src/Psalm/Issue/RawObjectIteration.php', 'Psalm\\Issue\\RedundantCast' => $baseDir . '/src/Psalm/Issue/RedundantCast.php', 'Psalm\\Issue\\RedundantCastGivenDocblockType' => $baseDir . '/src/Psalm/Issue/RedundantCastGivenDocblockType.php', 'Psalm\\Issue\\RedundantCondition' => $baseDir . '/src/Psalm/Issue/RedundantCondition.php', 'Psalm\\Issue\\RedundantConditionGivenDocblockType' => $baseDir . '/src/Psalm/Issue/RedundantConditionGivenDocblockType.php', 'Psalm\\Issue\\RedundantFunctionCall' => $baseDir . '/src/Psalm/Issue/RedundantFunctionCall.php', 'Psalm\\Issue\\RedundantFunctionCallGivenDocblockType' => $baseDir . '/src/Psalm/Issue/RedundantFunctionCallGivenDocblockType.php', 'Psalm\\Issue\\RedundantIdentityWithTrue' => $baseDir . '/src/Psalm/Issue/RedundantIdentityWithTrue.php', 'Psalm\\Issue\\RedundantPropertyInitializationCheck' => $baseDir . '/src/Psalm/Issue/RedundantPropertyInitializationCheck.php', 'Psalm\\Issue\\ReferenceConstraintViolation' => $baseDir . '/src/Psalm/Issue/ReferenceConstraintViolation.php', 'Psalm\\Issue\\ReferenceReusedFromConfusingScope' => $baseDir . '/src/Psalm/Issue/ReferenceReusedFromConfusingScope.php', 'Psalm\\Issue\\ReservedWord' => $baseDir . '/src/Psalm/Issue/ReservedWord.php', 'Psalm\\Issue\\RiskyCast' => $baseDir . '/src/Psalm/Issue/RiskyCast.php', 'Psalm\\Issue\\StringIncrement' => $baseDir . '/src/Psalm/Issue/StringIncrement.php', 'Psalm\\Issue\\TaintedCallable' => $baseDir . '/src/Psalm/Issue/TaintedCallable.php', 'Psalm\\Issue\\TaintedCookie' => $baseDir . '/src/Psalm/Issue/TaintedCookie.php', 'Psalm\\Issue\\TaintedCustom' => $baseDir . '/src/Psalm/Issue/TaintedCustom.php', 'Psalm\\Issue\\TaintedEval' => $baseDir . '/src/Psalm/Issue/TaintedEval.php', 'Psalm\\Issue\\TaintedFile' => $baseDir . '/src/Psalm/Issue/TaintedFile.php', 'Psalm\\Issue\\TaintedHeader' => $baseDir . '/src/Psalm/Issue/TaintedHeader.php', 'Psalm\\Issue\\TaintedHtml' => $baseDir . '/src/Psalm/Issue/TaintedHtml.php', 'Psalm\\Issue\\TaintedInclude' => $baseDir . '/src/Psalm/Issue/TaintedInclude.php', 'Psalm\\Issue\\TaintedInput' => $baseDir . '/src/Psalm/Issue/TaintedInput.php', 'Psalm\\Issue\\TaintedLdap' => $baseDir . '/src/Psalm/Issue/TaintedLdap.php', 'Psalm\\Issue\\TaintedSSRF' => $baseDir . '/src/Psalm/Issue/TaintedSSRF.php', 'Psalm\\Issue\\TaintedShell' => $baseDir . '/src/Psalm/Issue/TaintedShell.php', 'Psalm\\Issue\\TaintedSql' => $baseDir . '/src/Psalm/Issue/TaintedSql.php', 'Psalm\\Issue\\TaintedSystemSecret' => $baseDir . '/src/Psalm/Issue/TaintedSystemSecret.php', 'Psalm\\Issue\\TaintedTextWithQuotes' => $baseDir . '/src/Psalm/Issue/TaintedTextWithQuotes.php', 'Psalm\\Issue\\TaintedUnserialize' => $baseDir . '/src/Psalm/Issue/TaintedUnserialize.php', 'Psalm\\Issue\\TaintedUserSecret' => $baseDir . '/src/Psalm/Issue/TaintedUserSecret.php', 'Psalm\\Issue\\TooFewArguments' => $baseDir . '/src/Psalm/Issue/TooFewArguments.php', 'Psalm\\Issue\\TooManyArguments' => $baseDir . '/src/Psalm/Issue/TooManyArguments.php', 'Psalm\\Issue\\TooManyTemplateParams' => $baseDir . '/src/Psalm/Issue/TooManyTemplateParams.php', 'Psalm\\Issue\\Trace' => $baseDir . '/src/Psalm/Issue/Trace.php', 'Psalm\\Issue\\TraitMethodSignatureMismatch' => $baseDir . '/src/Psalm/Issue/TraitMethodSignatureMismatch.php', 'Psalm\\Issue\\TypeDoesNotContainNull' => $baseDir . '/src/Psalm/Issue/TypeDoesNotContainNull.php', 'Psalm\\Issue\\TypeDoesNotContainType' => $baseDir . '/src/Psalm/Issue/TypeDoesNotContainType.php', 'Psalm\\Issue\\UncaughtThrowInGlobalScope' => $baseDir . '/src/Psalm/Issue/UncaughtThrowInGlobalScope.php', 'Psalm\\Issue\\UndefinedAttributeClass' => $baseDir . '/src/Psalm/Issue/UndefinedAttributeClass.php', 'Psalm\\Issue\\UndefinedClass' => $baseDir . '/src/Psalm/Issue/UndefinedClass.php', 'Psalm\\Issue\\UndefinedConstant' => $baseDir . '/src/Psalm/Issue/UndefinedConstant.php', 'Psalm\\Issue\\UndefinedDocblockClass' => $baseDir . '/src/Psalm/Issue/UndefinedDocblockClass.php', 'Psalm\\Issue\\UndefinedFunction' => $baseDir . '/src/Psalm/Issue/UndefinedFunction.php', 'Psalm\\Issue\\UndefinedGlobalVariable' => $baseDir . '/src/Psalm/Issue/UndefinedGlobalVariable.php', 'Psalm\\Issue\\UndefinedInterface' => $baseDir . '/src/Psalm/Issue/UndefinedInterface.php', 'Psalm\\Issue\\UndefinedInterfaceMethod' => $baseDir . '/src/Psalm/Issue/UndefinedInterfaceMethod.php', 'Psalm\\Issue\\UndefinedMagicMethod' => $baseDir . '/src/Psalm/Issue/UndefinedMagicMethod.php', 'Psalm\\Issue\\UndefinedMagicPropertyAssignment' => $baseDir . '/src/Psalm/Issue/UndefinedMagicPropertyAssignment.php', 'Psalm\\Issue\\UndefinedMagicPropertyFetch' => $baseDir . '/src/Psalm/Issue/UndefinedMagicPropertyFetch.php', 'Psalm\\Issue\\UndefinedMethod' => $baseDir . '/src/Psalm/Issue/UndefinedMethod.php', 'Psalm\\Issue\\UndefinedPropertyAssignment' => $baseDir . '/src/Psalm/Issue/UndefinedPropertyAssignment.php', 'Psalm\\Issue\\UndefinedPropertyFetch' => $baseDir . '/src/Psalm/Issue/UndefinedPropertyFetch.php', 'Psalm\\Issue\\UndefinedThisPropertyAssignment' => $baseDir . '/src/Psalm/Issue/UndefinedThisPropertyAssignment.php', 'Psalm\\Issue\\UndefinedThisPropertyFetch' => $baseDir . '/src/Psalm/Issue/UndefinedThisPropertyFetch.php', 'Psalm\\Issue\\UndefinedTrace' => $baseDir . '/src/Psalm/Issue/UndefinedTrace.php', 'Psalm\\Issue\\UndefinedTrait' => $baseDir . '/src/Psalm/Issue/UndefinedTrait.php', 'Psalm\\Issue\\UndefinedVariable' => $baseDir . '/src/Psalm/Issue/UndefinedVariable.php', 'Psalm\\Issue\\UnevaluatedCode' => $baseDir . '/src/Psalm/Issue/UnevaluatedCode.php', 'Psalm\\Issue\\UnhandledMatchCondition' => $baseDir . '/src/Psalm/Issue/UnhandledMatchCondition.php', 'Psalm\\Issue\\UnimplementedAbstractMethod' => $baseDir . '/src/Psalm/Issue/UnimplementedAbstractMethod.php', 'Psalm\\Issue\\UnimplementedInterfaceMethod' => $baseDir . '/src/Psalm/Issue/UnimplementedInterfaceMethod.php', 'Psalm\\Issue\\UninitializedProperty' => $baseDir . '/src/Psalm/Issue/UninitializedProperty.php', 'Psalm\\Issue\\UnnecessaryVarAnnotation' => $baseDir . '/src/Psalm/Issue/UnnecessaryVarAnnotation.php', 'Psalm\\Issue\\UnrecognizedExpression' => $baseDir . '/src/Psalm/Issue/UnrecognizedExpression.php', 'Psalm\\Issue\\UnrecognizedStatement' => $baseDir . '/src/Psalm/Issue/UnrecognizedStatement.php', 'Psalm\\Issue\\UnresolvableConstant' => $baseDir . '/src/Psalm/Issue/UnresolvableConstant.php', 'Psalm\\Issue\\UnresolvableInclude' => $baseDir . '/src/Psalm/Issue/UnresolvableInclude.php', 'Psalm\\Issue\\UnsafeGenericInstantiation' => $baseDir . '/src/Psalm/Issue/UnsafeGenericInstantiation.php', 'Psalm\\Issue\\UnsafeInstantiation' => $baseDir . '/src/Psalm/Issue/UnsafeInstantiation.php', 'Psalm\\Issue\\UnsupportedReferenceUsage' => $baseDir . '/src/Psalm/Issue/UnsupportedReferenceUsage.php', 'Psalm\\Issue\\UnusedBaselineEntry' => $baseDir . '/src/Psalm/Issue/UnusedBaselineEntry.php', 'Psalm\\Issue\\UnusedClass' => $baseDir . '/src/Psalm/Issue/UnusedClass.php', 'Psalm\\Issue\\UnusedClosureParam' => $baseDir . '/src/Psalm/Issue/UnusedClosureParam.php', 'Psalm\\Issue\\UnusedConstructor' => $baseDir . '/src/Psalm/Issue/UnusedConstructor.php', 'Psalm\\Issue\\UnusedForeachValue' => $baseDir . '/src/Psalm/Issue/UnusedForeachValue.php', 'Psalm\\Issue\\UnusedFunctionCall' => $baseDir . '/src/Psalm/Issue/UnusedFunctionCall.php', 'Psalm\\Issue\\UnusedMethod' => $baseDir . '/src/Psalm/Issue/UnusedMethod.php', 'Psalm\\Issue\\UnusedMethodCall' => $baseDir . '/src/Psalm/Issue/UnusedMethodCall.php', 'Psalm\\Issue\\UnusedParam' => $baseDir . '/src/Psalm/Issue/UnusedParam.php', 'Psalm\\Issue\\UnusedProperty' => $baseDir . '/src/Psalm/Issue/UnusedProperty.php', 'Psalm\\Issue\\UnusedPsalmSuppress' => $baseDir . '/src/Psalm/Issue/UnusedPsalmSuppress.php', 'Psalm\\Issue\\UnusedReturnValue' => $baseDir . '/src/Psalm/Issue/UnusedReturnValue.php', 'Psalm\\Issue\\UnusedVariable' => $baseDir . '/src/Psalm/Issue/UnusedVariable.php', 'Psalm\\Issue\\VariableIssue' => $baseDir . '/src/Psalm/Issue/VariableIssue.php', 'Psalm\\NodeTypeProvider' => $baseDir . '/src/Psalm/NodeTypeProvider.php', 'Psalm\\Node\\Expr\\AssignOp\\VirtualBitwiseAnd' => $baseDir . '/src/Psalm/Node/Expr/AssignOp/VirtualBitwiseAnd.php', 'Psalm\\Node\\Expr\\AssignOp\\VirtualBitwiseOr' => $baseDir . '/src/Psalm/Node/Expr/AssignOp/VirtualBitwiseOr.php', 'Psalm\\Node\\Expr\\AssignOp\\VirtualBitwiseXor' => $baseDir . '/src/Psalm/Node/Expr/AssignOp/VirtualBitwiseXor.php', 'Psalm\\Node\\Expr\\AssignOp\\VirtualCoalesce' => $baseDir . '/src/Psalm/Node/Expr/AssignOp/VirtualCoalesce.php', 'Psalm\\Node\\Expr\\AssignOp\\VirtualConcat' => $baseDir . '/src/Psalm/Node/Expr/AssignOp/VirtualConcat.php', 'Psalm\\Node\\Expr\\AssignOp\\VirtualDiv' => $baseDir . '/src/Psalm/Node/Expr/AssignOp/VirtualDiv.php', 'Psalm\\Node\\Expr\\AssignOp\\VirtualMinus' => $baseDir . '/src/Psalm/Node/Expr/AssignOp/VirtualMinus.php', 'Psalm\\Node\\Expr\\AssignOp\\VirtualMod' => $baseDir . '/src/Psalm/Node/Expr/AssignOp/VirtualMod.php', 'Psalm\\Node\\Expr\\AssignOp\\VirtualMul' => $baseDir . '/src/Psalm/Node/Expr/AssignOp/VirtualMul.php', 'Psalm\\Node\\Expr\\AssignOp\\VirtualPlus' => $baseDir . '/src/Psalm/Node/Expr/AssignOp/VirtualPlus.php', 'Psalm\\Node\\Expr\\AssignOp\\VirtualPow' => $baseDir . '/src/Psalm/Node/Expr/AssignOp/VirtualPow.php', 'Psalm\\Node\\Expr\\AssignOp\\VirtualShiftLeft' => $baseDir . '/src/Psalm/Node/Expr/AssignOp/VirtualShiftLeft.php', 'Psalm\\Node\\Expr\\AssignOp\\VirtualShiftRight' => $baseDir . '/src/Psalm/Node/Expr/AssignOp/VirtualShiftRight.php', 'Psalm\\Node\\Expr\\BinaryOp\\VirtualBitwiseAnd' => $baseDir . '/src/Psalm/Node/Expr/BinaryOp/VirtualBitwiseAnd.php', 'Psalm\\Node\\Expr\\BinaryOp\\VirtualBitwiseOr' => $baseDir . '/src/Psalm/Node/Expr/BinaryOp/VirtualBitwiseOr.php', 'Psalm\\Node\\Expr\\BinaryOp\\VirtualBitwiseXor' => $baseDir . '/src/Psalm/Node/Expr/BinaryOp/VirtualBitwiseXor.php', 'Psalm\\Node\\Expr\\BinaryOp\\VirtualBooleanAnd' => $baseDir . '/src/Psalm/Node/Expr/BinaryOp/VirtualBooleanAnd.php', 'Psalm\\Node\\Expr\\BinaryOp\\VirtualBooleanOr' => $baseDir . '/src/Psalm/Node/Expr/BinaryOp/VirtualBooleanOr.php', 'Psalm\\Node\\Expr\\BinaryOp\\VirtualCoalesce' => $baseDir . '/src/Psalm/Node/Expr/BinaryOp/VirtualCoalesce.php', 'Psalm\\Node\\Expr\\BinaryOp\\VirtualConcat' => $baseDir . '/src/Psalm/Node/Expr/BinaryOp/VirtualConcat.php', 'Psalm\\Node\\Expr\\BinaryOp\\VirtualDiv' => $baseDir . '/src/Psalm/Node/Expr/BinaryOp/VirtualDiv.php', 'Psalm\\Node\\Expr\\BinaryOp\\VirtualEqual' => $baseDir . '/src/Psalm/Node/Expr/BinaryOp/VirtualEqual.php', 'Psalm\\Node\\Expr\\BinaryOp\\VirtualGreater' => $baseDir . '/src/Psalm/Node/Expr/BinaryOp/VirtualGreater.php', 'Psalm\\Node\\Expr\\BinaryOp\\VirtualGreaterOrEqual' => $baseDir . '/src/Psalm/Node/Expr/BinaryOp/VirtualGreaterOrEqual.php', 'Psalm\\Node\\Expr\\BinaryOp\\VirtualIdentical' => $baseDir . '/src/Psalm/Node/Expr/BinaryOp/VirtualIdentical.php', 'Psalm\\Node\\Expr\\BinaryOp\\VirtualLogicalAnd' => $baseDir . '/src/Psalm/Node/Expr/BinaryOp/VirtualLogicalAnd.php', 'Psalm\\Node\\Expr\\BinaryOp\\VirtualLogicalOr' => $baseDir . '/src/Psalm/Node/Expr/BinaryOp/VirtualLogicalOr.php', 'Psalm\\Node\\Expr\\BinaryOp\\VirtualLogicalXor' => $baseDir . '/src/Psalm/Node/Expr/BinaryOp/VirtualLogicalXor.php', 'Psalm\\Node\\Expr\\BinaryOp\\VirtualMinus' => $baseDir . '/src/Psalm/Node/Expr/BinaryOp/VirtualMinus.php', 'Psalm\\Node\\Expr\\BinaryOp\\VirtualMod' => $baseDir . '/src/Psalm/Node/Expr/BinaryOp/VirtualMod.php', 'Psalm\\Node\\Expr\\BinaryOp\\VirtualMul' => $baseDir . '/src/Psalm/Node/Expr/BinaryOp/VirtualMul.php', 'Psalm\\Node\\Expr\\BinaryOp\\VirtualNotEqual' => $baseDir . '/src/Psalm/Node/Expr/BinaryOp/VirtualNotEqual.php', 'Psalm\\Node\\Expr\\BinaryOp\\VirtualNotIdentical' => $baseDir . '/src/Psalm/Node/Expr/BinaryOp/VirtualNotIdentical.php', 'Psalm\\Node\\Expr\\BinaryOp\\VirtualPlus' => $baseDir . '/src/Psalm/Node/Expr/BinaryOp/VirtualPlus.php', 'Psalm\\Node\\Expr\\BinaryOp\\VirtualPow' => $baseDir . '/src/Psalm/Node/Expr/BinaryOp/VirtualPow.php', 'Psalm\\Node\\Expr\\BinaryOp\\VirtualShiftLeft' => $baseDir . '/src/Psalm/Node/Expr/BinaryOp/VirtualShiftLeft.php', 'Psalm\\Node\\Expr\\BinaryOp\\VirtualShiftRight' => $baseDir . '/src/Psalm/Node/Expr/BinaryOp/VirtualShiftRight.php', 'Psalm\\Node\\Expr\\BinaryOp\\VirtualSmaller' => $baseDir . '/src/Psalm/Node/Expr/BinaryOp/VirtualSmaller.php', 'Psalm\\Node\\Expr\\BinaryOp\\VirtualSmallerOrEqual' => $baseDir . '/src/Psalm/Node/Expr/BinaryOp/VirtualSmallerOrEqual.php', 'Psalm\\Node\\Expr\\BinaryOp\\VirtualSpaceship' => $baseDir . '/src/Psalm/Node/Expr/BinaryOp/VirtualSpaceship.php', 'Psalm\\Node\\Expr\\Cast\\VirtualArray' => $baseDir . '/src/Psalm/Node/Expr/Cast/VirtualArray.php', 'Psalm\\Node\\Expr\\Cast\\VirtualBool' => $baseDir . '/src/Psalm/Node/Expr/Cast/VirtualBool.php', 'Psalm\\Node\\Expr\\Cast\\VirtualDouble' => $baseDir . '/src/Psalm/Node/Expr/Cast/VirtualDouble.php', 'Psalm\\Node\\Expr\\Cast\\VirtualInt' => $baseDir . '/src/Psalm/Node/Expr/Cast/VirtualInt.php', 'Psalm\\Node\\Expr\\Cast\\VirtualObject' => $baseDir . '/src/Psalm/Node/Expr/Cast/VirtualObject.php', 'Psalm\\Node\\Expr\\Cast\\VirtualString' => $baseDir . '/src/Psalm/Node/Expr/Cast/VirtualString.php', 'Psalm\\Node\\Expr\\Cast\\VirtualUnset' => $baseDir . '/src/Psalm/Node/Expr/Cast/VirtualUnset.php', 'Psalm\\Node\\Expr\\VirtualArray' => $baseDir . '/src/Psalm/Node/Expr/VirtualArray.php', 'Psalm\\Node\\Expr\\VirtualArrayDimFetch' => $baseDir . '/src/Psalm/Node/Expr/VirtualArrayDimFetch.php', 'Psalm\\Node\\Expr\\VirtualArrayItem' => $baseDir . '/src/Psalm/Node/Expr/VirtualArrayItem.php', 'Psalm\\Node\\Expr\\VirtualArrowFunction' => $baseDir . '/src/Psalm/Node/Expr/VirtualArrowFunction.php', 'Psalm\\Node\\Expr\\VirtualAssign' => $baseDir . '/src/Psalm/Node/Expr/VirtualAssign.php', 'Psalm\\Node\\Expr\\VirtualAssignRef' => $baseDir . '/src/Psalm/Node/Expr/VirtualAssignRef.php', 'Psalm\\Node\\Expr\\VirtualBitwiseNot' => $baseDir . '/src/Psalm/Node/Expr/VirtualBitwiseNot.php', 'Psalm\\Node\\Expr\\VirtualBooleanNot' => $baseDir . '/src/Psalm/Node/Expr/VirtualBooleanNot.php', 'Psalm\\Node\\Expr\\VirtualClassConstFetch' => $baseDir . '/src/Psalm/Node/Expr/VirtualClassConstFetch.php', 'Psalm\\Node\\Expr\\VirtualClone' => $baseDir . '/src/Psalm/Node/Expr/VirtualClone.php', 'Psalm\\Node\\Expr\\VirtualClosure' => $baseDir . '/src/Psalm/Node/Expr/VirtualClosure.php', 'Psalm\\Node\\Expr\\VirtualClosureUse' => $baseDir . '/src/Psalm/Node/Expr/VirtualClosureUse.php', 'Psalm\\Node\\Expr\\VirtualConstFetch' => $baseDir . '/src/Psalm/Node/Expr/VirtualConstFetch.php', 'Psalm\\Node\\Expr\\VirtualEmpty' => $baseDir . '/src/Psalm/Node/Expr/VirtualEmpty.php', 'Psalm\\Node\\Expr\\VirtualError' => $baseDir . '/src/Psalm/Node/Expr/VirtualError.php', 'Psalm\\Node\\Expr\\VirtualErrorSuppress' => $baseDir . '/src/Psalm/Node/Expr/VirtualErrorSuppress.php', 'Psalm\\Node\\Expr\\VirtualEval' => $baseDir . '/src/Psalm/Node/Expr/VirtualEval.php', 'Psalm\\Node\\Expr\\VirtualExit' => $baseDir . '/src/Psalm/Node/Expr/VirtualExit.php', 'Psalm\\Node\\Expr\\VirtualFuncCall' => $baseDir . '/src/Psalm/Node/Expr/VirtualFuncCall.php', 'Psalm\\Node\\Expr\\VirtualInclude' => $baseDir . '/src/Psalm/Node/Expr/VirtualInclude.php', 'Psalm\\Node\\Expr\\VirtualInstanceof' => $baseDir . '/src/Psalm/Node/Expr/VirtualInstanceof.php', 'Psalm\\Node\\Expr\\VirtualIsset' => $baseDir . '/src/Psalm/Node/Expr/VirtualIsset.php', 'Psalm\\Node\\Expr\\VirtualList' => $baseDir . '/src/Psalm/Node/Expr/VirtualList.php', 'Psalm\\Node\\Expr\\VirtualMatch' => $baseDir . '/src/Psalm/Node/Expr/VirtualMatch.php', 'Psalm\\Node\\Expr\\VirtualMethodCall' => $baseDir . '/src/Psalm/Node/Expr/VirtualMethodCall.php', 'Psalm\\Node\\Expr\\VirtualNew' => $baseDir . '/src/Psalm/Node/Expr/VirtualNew.php', 'Psalm\\Node\\Expr\\VirtualNullsafeMethodCall' => $baseDir . '/src/Psalm/Node/Expr/VirtualNullsafeMethodCall.php', 'Psalm\\Node\\Expr\\VirtualNullsafePropertyFetch' => $baseDir . '/src/Psalm/Node/Expr/VirtualNullsafePropertyFetch.php', 'Psalm\\Node\\Expr\\VirtualPostDec' => $baseDir . '/src/Psalm/Node/Expr/VirtualPostDec.php', 'Psalm\\Node\\Expr\\VirtualPostInc' => $baseDir . '/src/Psalm/Node/Expr/VirtualPostInc.php', 'Psalm\\Node\\Expr\\VirtualPreDec' => $baseDir . '/src/Psalm/Node/Expr/VirtualPreDec.php', 'Psalm\\Node\\Expr\\VirtualPreInc' => $baseDir . '/src/Psalm/Node/Expr/VirtualPreInc.php', 'Psalm\\Node\\Expr\\VirtualPrint' => $baseDir . '/src/Psalm/Node/Expr/VirtualPrint.php', 'Psalm\\Node\\Expr\\VirtualPropertyFetch' => $baseDir . '/src/Psalm/Node/Expr/VirtualPropertyFetch.php', 'Psalm\\Node\\Expr\\VirtualShellExec' => $baseDir . '/src/Psalm/Node/Expr/VirtualShellExec.php', 'Psalm\\Node\\Expr\\VirtualStaticCall' => $baseDir . '/src/Psalm/Node/Expr/VirtualStaticCall.php', 'Psalm\\Node\\Expr\\VirtualStaticPropertyFetch' => $baseDir . '/src/Psalm/Node/Expr/VirtualStaticPropertyFetch.php', 'Psalm\\Node\\Expr\\VirtualTernary' => $baseDir . '/src/Psalm/Node/Expr/VirtualTernary.php', 'Psalm\\Node\\Expr\\VirtualThrow' => $baseDir . '/src/Psalm/Node/Expr/VirtualThrow.php', 'Psalm\\Node\\Expr\\VirtualUnaryMinus' => $baseDir . '/src/Psalm/Node/Expr/VirtualUnaryMinus.php', 'Psalm\\Node\\Expr\\VirtualUnaryPlus' => $baseDir . '/src/Psalm/Node/Expr/VirtualUnaryPlus.php', 'Psalm\\Node\\Expr\\VirtualVariable' => $baseDir . '/src/Psalm/Node/Expr/VirtualVariable.php', 'Psalm\\Node\\Expr\\VirtualYield' => $baseDir . '/src/Psalm/Node/Expr/VirtualYield.php', 'Psalm\\Node\\Expr\\VirtualYieldFrom' => $baseDir . '/src/Psalm/Node/Expr/VirtualYieldFrom.php', 'Psalm\\Node\\Name\\VirtualFullyQualified' => $baseDir . '/src/Psalm/Node/Name/VirtualFullyQualified.php', 'Psalm\\Node\\Name\\VirtualRelative' => $baseDir . '/src/Psalm/Node/Name/VirtualRelative.php', 'Psalm\\Node\\Scalar\\MagicConst\\VirtualClass' => $baseDir . '/src/Psalm/Node/Scalar/MagicConst/VirtualClass.php', 'Psalm\\Node\\Scalar\\MagicConst\\VirtualDir' => $baseDir . '/src/Psalm/Node/Scalar/MagicConst/VirtualDir.php', 'Psalm\\Node\\Scalar\\MagicConst\\VirtualFile' => $baseDir . '/src/Psalm/Node/Scalar/MagicConst/VirtualFile.php', 'Psalm\\Node\\Scalar\\MagicConst\\VirtualFunction' => $baseDir . '/src/Psalm/Node/Scalar/MagicConst/VirtualFunction.php', 'Psalm\\Node\\Scalar\\MagicConst\\VirtualLine' => $baseDir . '/src/Psalm/Node/Scalar/MagicConst/VirtualLine.php', 'Psalm\\Node\\Scalar\\MagicConst\\VirtualMethod' => $baseDir . '/src/Psalm/Node/Scalar/MagicConst/VirtualMethod.php', 'Psalm\\Node\\Scalar\\MagicConst\\VirtualNamespace' => $baseDir . '/src/Psalm/Node/Scalar/MagicConst/VirtualNamespace.php', 'Psalm\\Node\\Scalar\\MagicConst\\VirtualTrait' => $baseDir . '/src/Psalm/Node/Scalar/MagicConst/VirtualTrait.php', 'Psalm\\Node\\Scalar\\VirtualDNumber' => $baseDir . '/src/Psalm/Node/Scalar/VirtualDNumber.php', 'Psalm\\Node\\Scalar\\VirtualEncapsed' => $baseDir . '/src/Psalm/Node/Scalar/VirtualEncapsed.php', 'Psalm\\Node\\Scalar\\VirtualEncapsedStringPart' => $baseDir . '/src/Psalm/Node/Scalar/VirtualEncapsedStringPart.php', 'Psalm\\Node\\Scalar\\VirtualLNumber' => $baseDir . '/src/Psalm/Node/Scalar/VirtualLNumber.php', 'Psalm\\Node\\Scalar\\VirtualString' => $baseDir . '/src/Psalm/Node/Scalar/VirtualString.php', 'Psalm\\Node\\Stmt\\TraitUseAdaptation\\VirtualAlias' => $baseDir . '/src/Psalm/Node/Stmt/TraitUseAdaptation/VirtualAlias.php', 'Psalm\\Node\\Stmt\\TraitUseAdaptation\\VirtualPrecedence' => $baseDir . '/src/Psalm/Node/Stmt/TraitUseAdaptation/VirtualPrecedence.php', 'Psalm\\Node\\Stmt\\VirtualBreak' => $baseDir . '/src/Psalm/Node/Stmt/VirtualBreak.php', 'Psalm\\Node\\Stmt\\VirtualCase' => $baseDir . '/src/Psalm/Node/Stmt/VirtualCase.php', 'Psalm\\Node\\Stmt\\VirtualCatch' => $baseDir . '/src/Psalm/Node/Stmt/VirtualCatch.php', 'Psalm\\Node\\Stmt\\VirtualClass' => $baseDir . '/src/Psalm/Node/Stmt/VirtualClass.php', 'Psalm\\Node\\Stmt\\VirtualClassConst' => $baseDir . '/src/Psalm/Node/Stmt/VirtualClassConst.php', 'Psalm\\Node\\Stmt\\VirtualClassMethod' => $baseDir . '/src/Psalm/Node/Stmt/VirtualClassMethod.php', 'Psalm\\Node\\Stmt\\VirtualConst' => $baseDir . '/src/Psalm/Node/Stmt/VirtualConst.php', 'Psalm\\Node\\Stmt\\VirtualContinue' => $baseDir . '/src/Psalm/Node/Stmt/VirtualContinue.php', 'Psalm\\Node\\Stmt\\VirtualDeclare' => $baseDir . '/src/Psalm/Node/Stmt/VirtualDeclare.php', 'Psalm\\Node\\Stmt\\VirtualDeclareDeclare' => $baseDir . '/src/Psalm/Node/Stmt/VirtualDeclareDeclare.php', 'Psalm\\Node\\Stmt\\VirtualDo' => $baseDir . '/src/Psalm/Node/Stmt/VirtualDo.php', 'Psalm\\Node\\Stmt\\VirtualEcho' => $baseDir . '/src/Psalm/Node/Stmt/VirtualEcho.php', 'Psalm\\Node\\Stmt\\VirtualElse' => $baseDir . '/src/Psalm/Node/Stmt/VirtualElse.php', 'Psalm\\Node\\Stmt\\VirtualElseIf' => $baseDir . '/src/Psalm/Node/Stmt/VirtualElseIf.php', 'Psalm\\Node\\Stmt\\VirtualExpression' => $baseDir . '/src/Psalm/Node/Stmt/VirtualExpression.php', 'Psalm\\Node\\Stmt\\VirtualFinally' => $baseDir . '/src/Psalm/Node/Stmt/VirtualFinally.php', 'Psalm\\Node\\Stmt\\VirtualFor' => $baseDir . '/src/Psalm/Node/Stmt/VirtualFor.php', 'Psalm\\Node\\Stmt\\VirtualForeach' => $baseDir . '/src/Psalm/Node/Stmt/VirtualForeach.php', 'Psalm\\Node\\Stmt\\VirtualFunction' => $baseDir . '/src/Psalm/Node/Stmt/VirtualFunction.php', 'Psalm\\Node\\Stmt\\VirtualGlobal' => $baseDir . '/src/Psalm/Node/Stmt/VirtualGlobal.php', 'Psalm\\Node\\Stmt\\VirtualGoto' => $baseDir . '/src/Psalm/Node/Stmt/VirtualGoto.php', 'Psalm\\Node\\Stmt\\VirtualGroupUse' => $baseDir . '/src/Psalm/Node/Stmt/VirtualGroupUse.php', 'Psalm\\Node\\Stmt\\VirtualHaltCompiler' => $baseDir . '/src/Psalm/Node/Stmt/VirtualHaltCompiler.php', 'Psalm\\Node\\Stmt\\VirtualIf' => $baseDir . '/src/Psalm/Node/Stmt/VirtualIf.php', 'Psalm\\Node\\Stmt\\VirtualInlineHTML' => $baseDir . '/src/Psalm/Node/Stmt/VirtualInlineHTML.php', 'Psalm\\Node\\Stmt\\VirtualInterface' => $baseDir . '/src/Psalm/Node/Stmt/VirtualInterface.php', 'Psalm\\Node\\Stmt\\VirtualLabel' => $baseDir . '/src/Psalm/Node/Stmt/VirtualLabel.php', 'Psalm\\Node\\Stmt\\VirtualNamespace' => $baseDir . '/src/Psalm/Node/Stmt/VirtualNamespace.php', 'Psalm\\Node\\Stmt\\VirtualNop' => $baseDir . '/src/Psalm/Node/Stmt/VirtualNop.php', 'Psalm\\Node\\Stmt\\VirtualProperty' => $baseDir . '/src/Psalm/Node/Stmt/VirtualProperty.php', 'Psalm\\Node\\Stmt\\VirtualPropertyProperty' => $baseDir . '/src/Psalm/Node/Stmt/VirtualPropertyProperty.php', 'Psalm\\Node\\Stmt\\VirtualReturn' => $baseDir . '/src/Psalm/Node/Stmt/VirtualReturn.php', 'Psalm\\Node\\Stmt\\VirtualStatic' => $baseDir . '/src/Psalm/Node/Stmt/VirtualStatic.php', 'Psalm\\Node\\Stmt\\VirtualStaticVar' => $baseDir . '/src/Psalm/Node/Stmt/VirtualStaticVar.php', 'Psalm\\Node\\Stmt\\VirtualSwitch' => $baseDir . '/src/Psalm/Node/Stmt/VirtualSwitch.php', 'Psalm\\Node\\Stmt\\VirtualThrow' => $baseDir . '/src/Psalm/Node/Stmt/VirtualThrow.php', 'Psalm\\Node\\Stmt\\VirtualTrait' => $baseDir . '/src/Psalm/Node/Stmt/VirtualTrait.php', 'Psalm\\Node\\Stmt\\VirtualTraitUse' => $baseDir . '/src/Psalm/Node/Stmt/VirtualTraitUse.php', 'Psalm\\Node\\Stmt\\VirtualTryCatch' => $baseDir . '/src/Psalm/Node/Stmt/VirtualTryCatch.php', 'Psalm\\Node\\Stmt\\VirtualUnset' => $baseDir . '/src/Psalm/Node/Stmt/VirtualUnset.php', 'Psalm\\Node\\Stmt\\VirtualUse' => $baseDir . '/src/Psalm/Node/Stmt/VirtualUse.php', 'Psalm\\Node\\Stmt\\VirtualUseUse' => $baseDir . '/src/Psalm/Node/Stmt/VirtualUseUse.php', 'Psalm\\Node\\Stmt\\VirtualWhile' => $baseDir . '/src/Psalm/Node/Stmt/VirtualWhile.php', 'Psalm\\Node\\VirtualArg' => $baseDir . '/src/Psalm/Node/VirtualArg.php', 'Psalm\\Node\\VirtualAttribute' => $baseDir . '/src/Psalm/Node/VirtualAttribute.php', 'Psalm\\Node\\VirtualAttributeGroup' => $baseDir . '/src/Psalm/Node/VirtualAttributeGroup.php', 'Psalm\\Node\\VirtualConst' => $baseDir . '/src/Psalm/Node/VirtualConst.php', 'Psalm\\Node\\VirtualIdentifier' => $baseDir . '/src/Psalm/Node/VirtualIdentifier.php', 'Psalm\\Node\\VirtualMatchArm' => $baseDir . '/src/Psalm/Node/VirtualMatchArm.php', 'Psalm\\Node\\VirtualName' => $baseDir . '/src/Psalm/Node/VirtualName.php', 'Psalm\\Node\\VirtualNode' => $baseDir . '/src/Psalm/Node/VirtualNode.php', 'Psalm\\Node\\VirtualNullableType' => $baseDir . '/src/Psalm/Node/VirtualNullableType.php', 'Psalm\\Node\\VirtualParam' => $baseDir . '/src/Psalm/Node/VirtualParam.php', 'Psalm\\Node\\VirtualUnionType' => $baseDir . '/src/Psalm/Node/VirtualUnionType.php', 'Psalm\\Node\\VirtualVarLikeIdentifier' => $baseDir . '/src/Psalm/Node/VirtualVarLikeIdentifier.php', 'Psalm\\PluginFileExtensionsSocket' => $baseDir . '/src/Psalm/PluginFileExtensionsSocket.php', 'Psalm\\PluginRegistrationSocket' => $baseDir . '/src/Psalm/PluginRegistrationSocket.php', 'Psalm\\Plugin\\ArgTypeInferer' => $baseDir . '/src/Psalm/Plugin/ArgTypeInferer.php', 'Psalm\\Plugin\\DynamicFunctionStorage' => $baseDir . '/src/Psalm/Plugin/DynamicFunctionStorage.php', 'Psalm\\Plugin\\DynamicTemplateProvider' => $baseDir . '/src/Psalm/Plugin/DynamicTemplateProvider.php', 'Psalm\\Plugin\\EventHandler\\AddTaintsInterface' => $baseDir . '/src/Psalm/Plugin/EventHandler/AddTaintsInterface.php', 'Psalm\\Plugin\\EventHandler\\AfterAnalysisInterface' => $baseDir . '/src/Psalm/Plugin/EventHandler/AfterAnalysisInterface.php', 'Psalm\\Plugin\\EventHandler\\AfterClassLikeAnalysisInterface' => $baseDir . '/src/Psalm/Plugin/EventHandler/AfterClassLikeAnalysisInterface.php', 'Psalm\\Plugin\\EventHandler\\AfterClassLikeExistenceCheckInterface' => $baseDir . '/src/Psalm/Plugin/EventHandler/AfterClassLikeExistenceCheckInterface.php', 'Psalm\\Plugin\\EventHandler\\AfterClassLikeVisitInterface' => $baseDir . '/src/Psalm/Plugin/EventHandler/AfterClassLikeVisitInterface.php', 'Psalm\\Plugin\\EventHandler\\AfterCodebasePopulatedInterface' => $baseDir . '/src/Psalm/Plugin/EventHandler/AfterCodebasePopulatedInterface.php', 'Psalm\\Plugin\\EventHandler\\AfterEveryFunctionCallAnalysisInterface' => $baseDir . '/src/Psalm/Plugin/EventHandler/AfterEveryFunctionCallAnalysisInterface.php', 'Psalm\\Plugin\\EventHandler\\AfterExpressionAnalysisInterface' => $baseDir . '/src/Psalm/Plugin/EventHandler/AfterExpressionAnalysisInterface.php', 'Psalm\\Plugin\\EventHandler\\AfterFileAnalysisInterface' => $baseDir . '/src/Psalm/Plugin/EventHandler/AfterFileAnalysisInterface.php', 'Psalm\\Plugin\\EventHandler\\AfterFunctionCallAnalysisInterface' => $baseDir . '/src/Psalm/Plugin/EventHandler/AfterFunctionCallAnalysisInterface.php', 'Psalm\\Plugin\\EventHandler\\AfterFunctionLikeAnalysisInterface' => $baseDir . '/src/Psalm/Plugin/EventHandler/AfterFunctionLikeAnalysisInterface.php', 'Psalm\\Plugin\\EventHandler\\AfterMethodCallAnalysisInterface' => $baseDir . '/src/Psalm/Plugin/EventHandler/AfterMethodCallAnalysisInterface.php', 'Psalm\\Plugin\\EventHandler\\AfterStatementAnalysisInterface' => $baseDir . '/src/Psalm/Plugin/EventHandler/AfterStatementAnalysisInterface.php', 'Psalm\\Plugin\\EventHandler\\BeforeAddIssueInterface' => $baseDir . '/src/Psalm/Plugin/EventHandler/BeforeAddIssueInterface.php', 'Psalm\\Plugin\\EventHandler\\BeforeFileAnalysisInterface' => $baseDir . '/src/Psalm/Plugin/EventHandler/BeforeFileAnalysisInterface.php', 'Psalm\\Plugin\\EventHandler\\BeforeStatementAnalysisInterface' => $baseDir . '/src/Psalm/Plugin/EventHandler/BeforeStatementAnalysisInterface.php', 'Psalm\\Plugin\\EventHandler\\DynamicFunctionStorageProviderInterface' => $baseDir . '/src/Psalm/Plugin/EventHandler/DynamicFunctionStorageProviderInterface.php', 'Psalm\\Plugin\\EventHandler\\Event\\AddRemoveTaintsEvent' => $baseDir . '/src/Psalm/Plugin/EventHandler/Event/AddRemoveTaintsEvent.php', 'Psalm\\Plugin\\EventHandler\\Event\\AfterAnalysisEvent' => $baseDir . '/src/Psalm/Plugin/EventHandler/Event/AfterAnalysisEvent.php', 'Psalm\\Plugin\\EventHandler\\Event\\AfterClassLikeAnalysisEvent' => $baseDir . '/src/Psalm/Plugin/EventHandler/Event/AfterClassLikeAnalysisEvent.php', 'Psalm\\Plugin\\EventHandler\\Event\\AfterClassLikeExistenceCheckEvent' => $baseDir . '/src/Psalm/Plugin/EventHandler/Event/AfterClassLikeExistenceCheckEvent.php', 'Psalm\\Plugin\\EventHandler\\Event\\AfterClassLikeVisitEvent' => $baseDir . '/src/Psalm/Plugin/EventHandler/Event/AfterClassLikeVisitEvent.php', 'Psalm\\Plugin\\EventHandler\\Event\\AfterCodebasePopulatedEvent' => $baseDir . '/src/Psalm/Plugin/EventHandler/Event/AfterCodebasePopulatedEvent.php', 'Psalm\\Plugin\\EventHandler\\Event\\AfterEveryFunctionCallAnalysisEvent' => $baseDir . '/src/Psalm/Plugin/EventHandler/Event/AfterEveryFunctionCallAnalysisEvent.php', 'Psalm\\Plugin\\EventHandler\\Event\\AfterExpressionAnalysisEvent' => $baseDir . '/src/Psalm/Plugin/EventHandler/Event/AfterExpressionAnalysisEvent.php', 'Psalm\\Plugin\\EventHandler\\Event\\AfterFileAnalysisEvent' => $baseDir . '/src/Psalm/Plugin/EventHandler/Event/AfterFileAnalysisEvent.php', 'Psalm\\Plugin\\EventHandler\\Event\\AfterFunctionCallAnalysisEvent' => $baseDir . '/src/Psalm/Plugin/EventHandler/Event/AfterFunctionCallAnalysisEvent.php', 'Psalm\\Plugin\\EventHandler\\Event\\AfterFunctionLikeAnalysisEvent' => $baseDir . '/src/Psalm/Plugin/EventHandler/Event/AfterFunctionLikeAnalysisEvent.php', 'Psalm\\Plugin\\EventHandler\\Event\\AfterMethodCallAnalysisEvent' => $baseDir . '/src/Psalm/Plugin/EventHandler/Event/AfterMethodCallAnalysisEvent.php', 'Psalm\\Plugin\\EventHandler\\Event\\AfterStatementAnalysisEvent' => $baseDir . '/src/Psalm/Plugin/EventHandler/Event/AfterStatementAnalysisEvent.php', 'Psalm\\Plugin\\EventHandler\\Event\\BeforeAddIssueEvent' => $baseDir . '/src/Psalm/Plugin/EventHandler/Event/BeforeAddIssueEvent.php', 'Psalm\\Plugin\\EventHandler\\Event\\BeforeFileAnalysisEvent' => $baseDir . '/src/Psalm/Plugin/EventHandler/Event/BeforeFileAnalysisEvent.php', 'Psalm\\Plugin\\EventHandler\\Event\\BeforeStatementAnalysisEvent' => $baseDir . '/src/Psalm/Plugin/EventHandler/Event/BeforeStatementAnalysisEvent.php', 'Psalm\\Plugin\\EventHandler\\Event\\DynamicFunctionStorageProviderEvent' => $baseDir . '/src/Psalm/Plugin/EventHandler/Event/DynamicFunctionStorageProviderEvent.php', 'Psalm\\Plugin\\EventHandler\\Event\\FunctionExistenceProviderEvent' => $baseDir . '/src/Psalm/Plugin/EventHandler/Event/FunctionExistenceProviderEvent.php', 'Psalm\\Plugin\\EventHandler\\Event\\FunctionParamsProviderEvent' => $baseDir . '/src/Psalm/Plugin/EventHandler/Event/FunctionParamsProviderEvent.php', 'Psalm\\Plugin\\EventHandler\\Event\\FunctionReturnTypeProviderEvent' => $baseDir . '/src/Psalm/Plugin/EventHandler/Event/FunctionReturnTypeProviderEvent.php', 'Psalm\\Plugin\\EventHandler\\Event\\MethodExistenceProviderEvent' => $baseDir . '/src/Psalm/Plugin/EventHandler/Event/MethodExistenceProviderEvent.php', 'Psalm\\Plugin\\EventHandler\\Event\\MethodParamsProviderEvent' => $baseDir . '/src/Psalm/Plugin/EventHandler/Event/MethodParamsProviderEvent.php', 'Psalm\\Plugin\\EventHandler\\Event\\MethodReturnTypeProviderEvent' => $baseDir . '/src/Psalm/Plugin/EventHandler/Event/MethodReturnTypeProviderEvent.php', 'Psalm\\Plugin\\EventHandler\\Event\\MethodVisibilityProviderEvent' => $baseDir . '/src/Psalm/Plugin/EventHandler/Event/MethodVisibilityProviderEvent.php', 'Psalm\\Plugin\\EventHandler\\Event\\PropertyExistenceProviderEvent' => $baseDir . '/src/Psalm/Plugin/EventHandler/Event/PropertyExistenceProviderEvent.php', 'Psalm\\Plugin\\EventHandler\\Event\\PropertyTypeProviderEvent' => $baseDir . '/src/Psalm/Plugin/EventHandler/Event/PropertyTypeProviderEvent.php', 'Psalm\\Plugin\\EventHandler\\Event\\PropertyVisibilityProviderEvent' => $baseDir . '/src/Psalm/Plugin/EventHandler/Event/PropertyVisibilityProviderEvent.php', 'Psalm\\Plugin\\EventHandler\\Event\\StringInterpreterEvent' => $baseDir . '/src/Psalm/Plugin/EventHandler/Event/StringInterpreterEvent.php', 'Psalm\\Plugin\\EventHandler\\FunctionExistenceProviderInterface' => $baseDir . '/src/Psalm/Plugin/EventHandler/FunctionExistenceProviderInterface.php', 'Psalm\\Plugin\\EventHandler\\FunctionParamsProviderInterface' => $baseDir . '/src/Psalm/Plugin/EventHandler/FunctionParamsProviderInterface.php', 'Psalm\\Plugin\\EventHandler\\FunctionReturnTypeProviderInterface' => $baseDir . '/src/Psalm/Plugin/EventHandler/FunctionReturnTypeProviderInterface.php', 'Psalm\\Plugin\\EventHandler\\MethodExistenceProviderInterface' => $baseDir . '/src/Psalm/Plugin/EventHandler/MethodExistenceProviderInterface.php', 'Psalm\\Plugin\\EventHandler\\MethodParamsProviderInterface' => $baseDir . '/src/Psalm/Plugin/EventHandler/MethodParamsProviderInterface.php', 'Psalm\\Plugin\\EventHandler\\MethodReturnTypeProviderInterface' => $baseDir . '/src/Psalm/Plugin/EventHandler/MethodReturnTypeProviderInterface.php', 'Psalm\\Plugin\\EventHandler\\MethodVisibilityProviderInterface' => $baseDir . '/src/Psalm/Plugin/EventHandler/MethodVisibilityProviderInterface.php', 'Psalm\\Plugin\\EventHandler\\PropertyExistenceProviderInterface' => $baseDir . '/src/Psalm/Plugin/EventHandler/PropertyExistenceProviderInterface.php', 'Psalm\\Plugin\\EventHandler\\PropertyTypeProviderInterface' => $baseDir . '/src/Psalm/Plugin/EventHandler/PropertyTypeProviderInterface.php', 'Psalm\\Plugin\\EventHandler\\PropertyVisibilityProviderInterface' => $baseDir . '/src/Psalm/Plugin/EventHandler/PropertyVisibilityProviderInterface.php', 'Psalm\\Plugin\\EventHandler\\RemoveTaintsInterface' => $baseDir . '/src/Psalm/Plugin/EventHandler/RemoveTaintsInterface.php', 'Psalm\\Plugin\\EventHandler\\StringInterpreterInterface' => $baseDir . '/src/Psalm/Plugin/EventHandler/StringInterpreterInterface.php', 'Psalm\\Plugin\\FileExtensionsInterface' => $baseDir . '/src/Psalm/Plugin/FileExtensionsInterface.php', 'Psalm\\Plugin\\PluginEntryPointInterface' => $baseDir . '/src/Psalm/Plugin/PluginEntryPointInterface.php', 'Psalm\\Plugin\\PluginFileExtensionsInterface' => $baseDir . '/src/Psalm/Plugin/PluginFileExtensionsInterface.php', 'Psalm\\Plugin\\PluginInterface' => $baseDir . '/src/Psalm/Plugin/PluginInterface.php', 'Psalm\\Plugin\\RegistrationInterface' => $baseDir . '/src/Psalm/Plugin/RegistrationInterface.php', 'Psalm\\Plugin\\Shepherd' => $baseDir . '/src/Psalm/Plugin/Shepherd.php', 'Psalm\\Progress\\DebugProgress' => $baseDir . '/src/Psalm/Progress/DebugProgress.php', 'Psalm\\Progress\\DefaultProgress' => $baseDir . '/src/Psalm/Progress/DefaultProgress.php', 'Psalm\\Progress\\LongProgress' => $baseDir . '/src/Psalm/Progress/LongProgress.php', 'Psalm\\Progress\\Progress' => $baseDir . '/src/Psalm/Progress/Progress.php', 'Psalm\\Progress\\VoidProgress' => $baseDir . '/src/Psalm/Progress/VoidProgress.php', 'Psalm\\Report' => $baseDir . '/src/Psalm/Report.php', 'Psalm\\Report\\ByIssueLevelAndTypeReport' => $baseDir . '/src/Psalm/Report/ByIssueLevelAndTypeReport.php', 'Psalm\\Report\\CheckstyleReport' => $baseDir . '/src/Psalm/Report/CheckstyleReport.php', 'Psalm\\Report\\CodeClimateReport' => $baseDir . '/src/Psalm/Report/CodeClimateReport.php', 'Psalm\\Report\\CompactReport' => $baseDir . '/src/Psalm/Report/CompactReport.php', 'Psalm\\Report\\ConsoleReport' => $baseDir . '/src/Psalm/Report/ConsoleReport.php', 'Psalm\\Report\\CountReport' => $baseDir . '/src/Psalm/Report/CountReport.php', 'Psalm\\Report\\EmacsReport' => $baseDir . '/src/Psalm/Report/EmacsReport.php', 'Psalm\\Report\\GithubActionsReport' => $baseDir . '/src/Psalm/Report/GithubActionsReport.php', 'Psalm\\Report\\JsonReport' => $baseDir . '/src/Psalm/Report/JsonReport.php', 'Psalm\\Report\\JsonSummaryReport' => $baseDir . '/src/Psalm/Report/JsonSummaryReport.php', 'Psalm\\Report\\JunitReport' => $baseDir . '/src/Psalm/Report/JunitReport.php', 'Psalm\\Report\\PhpStormReport' => $baseDir . '/src/Psalm/Report/PhpStormReport.php', 'Psalm\\Report\\PylintReport' => $baseDir . '/src/Psalm/Report/PylintReport.php', 'Psalm\\Report\\ReportOptions' => $baseDir . '/src/Psalm/Report/ReportOptions.php', 'Psalm\\Report\\SarifReport' => $baseDir . '/src/Psalm/Report/SarifReport.php', 'Psalm\\Report\\SonarqubeReport' => $baseDir . '/src/Psalm/Report/SonarqubeReport.php', 'Psalm\\Report\\TextReport' => $baseDir . '/src/Psalm/Report/TextReport.php', 'Psalm\\Report\\XmlReport' => $baseDir . '/src/Psalm/Report/XmlReport.php', 'Psalm\\SourceControl\\Git\\CommitInfo' => $baseDir . '/src/Psalm/SourceControl/Git/CommitInfo.php', 'Psalm\\SourceControl\\Git\\GitInfo' => $baseDir . '/src/Psalm/SourceControl/Git/GitInfo.php', 'Psalm\\SourceControl\\Git\\RemoteInfo' => $baseDir . '/src/Psalm/SourceControl/Git/RemoteInfo.php', 'Psalm\\SourceControl\\SourceControlInfo' => $baseDir . '/src/Psalm/SourceControl/SourceControlInfo.php', 'Psalm\\StatementsSource' => $baseDir . '/src/Psalm/StatementsSource.php', 'Psalm\\Storage\\Assertion' => $baseDir . '/src/Psalm/Storage/Assertion.php', 'Psalm\\Storage\\Assertion\\Any' => $baseDir . '/src/Psalm/Storage/Assertion/Any.php', 'Psalm\\Storage\\Assertion\\ArrayKeyDoesNotExist' => $baseDir . '/src/Psalm/Storage/Assertion/ArrayKeyDoesNotExist.php', 'Psalm\\Storage\\Assertion\\ArrayKeyExists' => $baseDir . '/src/Psalm/Storage/Assertion/ArrayKeyExists.php', 'Psalm\\Storage\\Assertion\\DoesNotHaveAtLeastCount' => $baseDir . '/src/Psalm/Storage/Assertion/DoesNotHaveAtLeastCount.php', 'Psalm\\Storage\\Assertion\\DoesNotHaveExactCount' => $baseDir . '/src/Psalm/Storage/Assertion/DoesNotHaveExactCount.php', 'Psalm\\Storage\\Assertion\\DoesNotHaveMethod' => $baseDir . '/src/Psalm/Storage/Assertion/DoesNotHaveMethod.php', 'Psalm\\Storage\\Assertion\\Empty_' => $baseDir . '/src/Psalm/Storage/Assertion/Empty_.php', 'Psalm\\Storage\\Assertion\\Falsy' => $baseDir . '/src/Psalm/Storage/Assertion/Falsy.php', 'Psalm\\Storage\\Assertion\\HasArrayKey' => $baseDir . '/src/Psalm/Storage/Assertion/HasArrayKey.php', 'Psalm\\Storage\\Assertion\\HasAtLeastCount' => $baseDir . '/src/Psalm/Storage/Assertion/HasAtLeastCount.php', 'Psalm\\Storage\\Assertion\\HasExactCount' => $baseDir . '/src/Psalm/Storage/Assertion/HasExactCount.php', 'Psalm\\Storage\\Assertion\\HasIntOrStringArrayAccess' => $baseDir . '/src/Psalm/Storage/Assertion/HasIntOrStringArrayAccess.php', 'Psalm\\Storage\\Assertion\\HasMethod' => $baseDir . '/src/Psalm/Storage/Assertion/HasMethod.php', 'Psalm\\Storage\\Assertion\\HasStringArrayAccess' => $baseDir . '/src/Psalm/Storage/Assertion/HasStringArrayAccess.php', 'Psalm\\Storage\\Assertion\\InArray' => $baseDir . '/src/Psalm/Storage/Assertion/InArray.php', 'Psalm\\Storage\\Assertion\\IsAClass' => $baseDir . '/src/Psalm/Storage/Assertion/IsAClass.php', 'Psalm\\Storage\\Assertion\\IsClassEqual' => $baseDir . '/src/Psalm/Storage/Assertion/IsClassEqual.php', 'Psalm\\Storage\\Assertion\\IsClassNotEqual' => $baseDir . '/src/Psalm/Storage/Assertion/IsClassNotEqual.php', 'Psalm\\Storage\\Assertion\\IsCountable' => $baseDir . '/src/Psalm/Storage/Assertion/IsCountable.php', 'Psalm\\Storage\\Assertion\\IsEqualIsset' => $baseDir . '/src/Psalm/Storage/Assertion/IsEqualIsset.php', 'Psalm\\Storage\\Assertion\\IsGreaterThan' => $baseDir . '/src/Psalm/Storage/Assertion/IsGreaterThan.php', 'Psalm\\Storage\\Assertion\\IsGreaterThanOrEqualTo' => $baseDir . '/src/Psalm/Storage/Assertion/IsGreaterThanOrEqualTo.php', 'Psalm\\Storage\\Assertion\\IsIdentical' => $baseDir . '/src/Psalm/Storage/Assertion/IsIdentical.php', 'Psalm\\Storage\\Assertion\\IsIsset' => $baseDir . '/src/Psalm/Storage/Assertion/IsIsset.php', 'Psalm\\Storage\\Assertion\\IsLessThan' => $baseDir . '/src/Psalm/Storage/Assertion/IsLessThan.php', 'Psalm\\Storage\\Assertion\\IsLessThanOrEqualTo' => $baseDir . '/src/Psalm/Storage/Assertion/IsLessThanOrEqualTo.php', 'Psalm\\Storage\\Assertion\\IsLooselyEqual' => $baseDir . '/src/Psalm/Storage/Assertion/IsLooselyEqual.php', 'Psalm\\Storage\\Assertion\\IsNotAClass' => $baseDir . '/src/Psalm/Storage/Assertion/IsNotAClass.php', 'Psalm\\Storage\\Assertion\\IsNotCountable' => $baseDir . '/src/Psalm/Storage/Assertion/IsNotCountable.php', 'Psalm\\Storage\\Assertion\\IsNotIdentical' => $baseDir . '/src/Psalm/Storage/Assertion/IsNotIdentical.php', 'Psalm\\Storage\\Assertion\\IsNotIsset' => $baseDir . '/src/Psalm/Storage/Assertion/IsNotIsset.php', 'Psalm\\Storage\\Assertion\\IsNotLooselyEqual' => $baseDir . '/src/Psalm/Storage/Assertion/IsNotLooselyEqual.php', 'Psalm\\Storage\\Assertion\\IsNotType' => $baseDir . '/src/Psalm/Storage/Assertion/IsNotType.php', 'Psalm\\Storage\\Assertion\\IsType' => $baseDir . '/src/Psalm/Storage/Assertion/IsType.php', 'Psalm\\Storage\\Assertion\\NestedAssertions' => $baseDir . '/src/Psalm/Storage/Assertion/NestedAssertions.php', 'Psalm\\Storage\\Assertion\\NonEmpty' => $baseDir . '/src/Psalm/Storage/Assertion/NonEmpty.php', 'Psalm\\Storage\\Assertion\\NonEmptyCountable' => $baseDir . '/src/Psalm/Storage/Assertion/NonEmptyCountable.php', 'Psalm\\Storage\\Assertion\\NotInArray' => $baseDir . '/src/Psalm/Storage/Assertion/NotInArray.php', 'Psalm\\Storage\\Assertion\\NotNestedAssertions' => $baseDir . '/src/Psalm/Storage/Assertion/NotNestedAssertions.php', 'Psalm\\Storage\\Assertion\\NotNonEmptyCountable' => $baseDir . '/src/Psalm/Storage/Assertion/NotNonEmptyCountable.php', 'Psalm\\Storage\\Assertion\\Truthy' => $baseDir . '/src/Psalm/Storage/Assertion/Truthy.php', 'Psalm\\Storage\\AttributeArg' => $baseDir . '/src/Psalm/Storage/AttributeArg.php', 'Psalm\\Storage\\AttributeStorage' => $baseDir . '/src/Psalm/Storage/AttributeStorage.php', 'Psalm\\Storage\\ClassConstantStorage' => $baseDir . '/src/Psalm/Storage/ClassConstantStorage.php', 'Psalm\\Storage\\ClassLikeStorage' => $baseDir . '/src/Psalm/Storage/ClassLikeStorage.php', 'Psalm\\Storage\\CustomMetadataTrait' => $baseDir . '/src/Psalm/Storage/CustomMetadataTrait.php', 'Psalm\\Storage\\EnumCaseStorage' => $baseDir . '/src/Psalm/Storage/EnumCaseStorage.php', 'Psalm\\Storage\\FileStorage' => $baseDir . '/src/Psalm/Storage/FileStorage.php', 'Psalm\\Storage\\FunctionLikeParameter' => $baseDir . '/src/Psalm/Storage/FunctionLikeParameter.php', 'Psalm\\Storage\\FunctionLikeStorage' => $baseDir . '/src/Psalm/Storage/FunctionLikeStorage.php', 'Psalm\\Storage\\FunctionStorage' => $baseDir . '/src/Psalm/Storage/FunctionStorage.php', 'Psalm\\Storage\\HasAttributesInterface' => $baseDir . '/src/Psalm/Storage/HasAttributesInterface.php', 'Psalm\\Storage\\ImmutableNonCloneableTrait' => $baseDir . '/src/Psalm/Storage/ImmutableNonCloneableTrait.php', 'Psalm\\Storage\\MethodStorage' => $baseDir . '/src/Psalm/Storage/MethodStorage.php', 'Psalm\\Storage\\Possibilities' => $baseDir . '/src/Psalm/Storage/Possibilities.php', 'Psalm\\Storage\\PropertyStorage' => $baseDir . '/src/Psalm/Storage/PropertyStorage.php', 'Psalm\\Type' => $baseDir . '/src/Psalm/Type.php', 'Psalm\\Type\\Atomic' => $baseDir . '/src/Psalm/Type/Atomic.php', 'Psalm\\Type\\Atomic\\CallableTrait' => $baseDir . '/src/Psalm/Type/Atomic/CallableTrait.php', 'Psalm\\Type\\Atomic\\DependentType' => $baseDir . '/src/Psalm/Type/Atomic/DependentType.php', 'Psalm\\Type\\Atomic\\GenericTrait' => $baseDir . '/src/Psalm/Type/Atomic/GenericTrait.php', 'Psalm\\Type\\Atomic\\HasIntersectionTrait' => $baseDir . '/src/Psalm/Type/Atomic/HasIntersectionTrait.php', 'Psalm\\Type\\Atomic\\Scalar' => $baseDir . '/src/Psalm/Type/Atomic/Scalar.php', 'Psalm\\Type\\Atomic\\TAnonymousClassInstance' => $baseDir . '/src/Psalm/Type/Atomic/TAnonymousClassInstance.php', 'Psalm\\Type\\Atomic\\TArray' => $baseDir . '/src/Psalm/Type/Atomic/TArray.php', 'Psalm\\Type\\Atomic\\TArrayKey' => $baseDir . '/src/Psalm/Type/Atomic/TArrayKey.php', 'Psalm\\Type\\Atomic\\TBool' => $baseDir . '/src/Psalm/Type/Atomic/TBool.php', 'Psalm\\Type\\Atomic\\TCallable' => $baseDir . '/src/Psalm/Type/Atomic/TCallable.php', 'Psalm\\Type\\Atomic\\TCallableArray' => $baseDir . '/src/Psalm/Type/Atomic/TCallableArray.php', 'Psalm\\Type\\Atomic\\TCallableKeyedArray' => $baseDir . '/src/Psalm/Type/Atomic/TCallableKeyedArray.php', 'Psalm\\Type\\Atomic\\TCallableList' => $baseDir . '/src/Psalm/Type/Atomic/TCallableList.php', 'Psalm\\Type\\Atomic\\TCallableObject' => $baseDir . '/src/Psalm/Type/Atomic/TCallableObject.php', 'Psalm\\Type\\Atomic\\TCallableString' => $baseDir . '/src/Psalm/Type/Atomic/TCallableString.php', 'Psalm\\Type\\Atomic\\TClassConstant' => $baseDir . '/src/Psalm/Type/Atomic/TClassConstant.php', 'Psalm\\Type\\Atomic\\TClassString' => $baseDir . '/src/Psalm/Type/Atomic/TClassString.php', 'Psalm\\Type\\Atomic\\TClassStringMap' => $baseDir . '/src/Psalm/Type/Atomic/TClassStringMap.php', 'Psalm\\Type\\Atomic\\TClosedResource' => $baseDir . '/src/Psalm/Type/Atomic/TClosedResource.php', 'Psalm\\Type\\Atomic\\TClosure' => $baseDir . '/src/Psalm/Type/Atomic/TClosure.php', 'Psalm\\Type\\Atomic\\TConditional' => $baseDir . '/src/Psalm/Type/Atomic/TConditional.php', 'Psalm\\Type\\Atomic\\TDependentGetClass' => $baseDir . '/src/Psalm/Type/Atomic/TDependentGetClass.php', 'Psalm\\Type\\Atomic\\TDependentGetDebugType' => $baseDir . '/src/Psalm/Type/Atomic/TDependentGetDebugType.php', 'Psalm\\Type\\Atomic\\TDependentGetType' => $baseDir . '/src/Psalm/Type/Atomic/TDependentGetType.php', 'Psalm\\Type\\Atomic\\TDependentListKey' => $baseDir . '/src/Psalm/Type/Atomic/TDependentListKey.php', 'Psalm\\Type\\Atomic\\TEmptyMixed' => $baseDir . '/src/Psalm/Type/Atomic/TEmptyMixed.php', 'Psalm\\Type\\Atomic\\TEmptyNumeric' => $baseDir . '/src/Psalm/Type/Atomic/TEmptyNumeric.php', 'Psalm\\Type\\Atomic\\TEmptyScalar' => $baseDir . '/src/Psalm/Type/Atomic/TEmptyScalar.php', 'Psalm\\Type\\Atomic\\TEnumCase' => $baseDir . '/src/Psalm/Type/Atomic/TEnumCase.php', 'Psalm\\Type\\Atomic\\TFalse' => $baseDir . '/src/Psalm/Type/Atomic/TFalse.php', 'Psalm\\Type\\Atomic\\TFloat' => $baseDir . '/src/Psalm/Type/Atomic/TFloat.php', 'Psalm\\Type\\Atomic\\TGenericObject' => $baseDir . '/src/Psalm/Type/Atomic/TGenericObject.php', 'Psalm\\Type\\Atomic\\TInt' => $baseDir . '/src/Psalm/Type/Atomic/TInt.php', 'Psalm\\Type\\Atomic\\TIntMask' => $baseDir . '/src/Psalm/Type/Atomic/TIntMask.php', 'Psalm\\Type\\Atomic\\TIntMaskOf' => $baseDir . '/src/Psalm/Type/Atomic/TIntMaskOf.php', 'Psalm\\Type\\Atomic\\TIntRange' => $baseDir . '/src/Psalm/Type/Atomic/TIntRange.php', 'Psalm\\Type\\Atomic\\TIterable' => $baseDir . '/src/Psalm/Type/Atomic/TIterable.php', 'Psalm\\Type\\Atomic\\TKeyOf' => $baseDir . '/src/Psalm/Type/Atomic/TKeyOf.php', 'Psalm\\Type\\Atomic\\TKeyedArray' => $baseDir . '/src/Psalm/Type/Atomic/TKeyedArray.php', 'Psalm\\Type\\Atomic\\TList' => $baseDir . '/src/Psalm/Type/Atomic/TList.php', 'Psalm\\Type\\Atomic\\TLiteralClassString' => $baseDir . '/src/Psalm/Type/Atomic/TLiteralClassString.php', 'Psalm\\Type\\Atomic\\TLiteralFloat' => $baseDir . '/src/Psalm/Type/Atomic/TLiteralFloat.php', 'Psalm\\Type\\Atomic\\TLiteralInt' => $baseDir . '/src/Psalm/Type/Atomic/TLiteralInt.php', 'Psalm\\Type\\Atomic\\TLiteralString' => $baseDir . '/src/Psalm/Type/Atomic/TLiteralString.php', 'Psalm\\Type\\Atomic\\TLowercaseString' => $baseDir . '/src/Psalm/Type/Atomic/TLowercaseString.php', 'Psalm\\Type\\Atomic\\TMixed' => $baseDir . '/src/Psalm/Type/Atomic/TMixed.php', 'Psalm\\Type\\Atomic\\TNamedObject' => $baseDir . '/src/Psalm/Type/Atomic/TNamedObject.php', 'Psalm\\Type\\Atomic\\TNever' => $baseDir . '/src/Psalm/Type/Atomic/TNever.php', 'Psalm\\Type\\Atomic\\TNonEmptyArray' => $baseDir . '/src/Psalm/Type/Atomic/TNonEmptyArray.php', 'Psalm\\Type\\Atomic\\TNonEmptyList' => $baseDir . '/src/Psalm/Type/Atomic/TNonEmptyList.php', 'Psalm\\Type\\Atomic\\TNonEmptyLowercaseString' => $baseDir . '/src/Psalm/Type/Atomic/TNonEmptyLowercaseString.php', 'Psalm\\Type\\Atomic\\TNonEmptyMixed' => $baseDir . '/src/Psalm/Type/Atomic/TNonEmptyMixed.php', 'Psalm\\Type\\Atomic\\TNonEmptyNonspecificLiteralString' => $baseDir . '/src/Psalm/Type/Atomic/TNonEmptyNonspecificLiteralString.php', 'Psalm\\Type\\Atomic\\TNonEmptyScalar' => $baseDir . '/src/Psalm/Type/Atomic/TNonEmptyScalar.php', 'Psalm\\Type\\Atomic\\TNonEmptyString' => $baseDir . '/src/Psalm/Type/Atomic/TNonEmptyString.php', 'Psalm\\Type\\Atomic\\TNonFalsyString' => $baseDir . '/src/Psalm/Type/Atomic/TNonFalsyString.php', 'Psalm\\Type\\Atomic\\TNonspecificLiteralInt' => $baseDir . '/src/Psalm/Type/Atomic/TNonspecificLiteralInt.php', 'Psalm\\Type\\Atomic\\TNonspecificLiteralString' => $baseDir . '/src/Psalm/Type/Atomic/TNonspecificLiteralString.php', 'Psalm\\Type\\Atomic\\TNull' => $baseDir . '/src/Psalm/Type/Atomic/TNull.php', 'Psalm\\Type\\Atomic\\TNumeric' => $baseDir . '/src/Psalm/Type/Atomic/TNumeric.php', 'Psalm\\Type\\Atomic\\TNumericString' => $baseDir . '/src/Psalm/Type/Atomic/TNumericString.php', 'Psalm\\Type\\Atomic\\TObject' => $baseDir . '/src/Psalm/Type/Atomic/TObject.php', 'Psalm\\Type\\Atomic\\TObjectWithProperties' => $baseDir . '/src/Psalm/Type/Atomic/TObjectWithProperties.php', 'Psalm\\Type\\Atomic\\TPropertiesOf' => $baseDir . '/src/Psalm/Type/Atomic/TPropertiesOf.php', 'Psalm\\Type\\Atomic\\TResource' => $baseDir . '/src/Psalm/Type/Atomic/TResource.php', 'Psalm\\Type\\Atomic\\TScalar' => $baseDir . '/src/Psalm/Type/Atomic/TScalar.php', 'Psalm\\Type\\Atomic\\TSingleLetter' => $baseDir . '/src/Psalm/Type/Atomic/TSingleLetter.php', 'Psalm\\Type\\Atomic\\TString' => $baseDir . '/src/Psalm/Type/Atomic/TString.php', 'Psalm\\Type\\Atomic\\TTemplateIndexedAccess' => $baseDir . '/src/Psalm/Type/Atomic/TTemplateIndexedAccess.php', 'Psalm\\Type\\Atomic\\TTemplateKeyOf' => $baseDir . '/src/Psalm/Type/Atomic/TTemplateKeyOf.php', 'Psalm\\Type\\Atomic\\TTemplateParam' => $baseDir . '/src/Psalm/Type/Atomic/TTemplateParam.php', 'Psalm\\Type\\Atomic\\TTemplateParamClass' => $baseDir . '/src/Psalm/Type/Atomic/TTemplateParamClass.php', 'Psalm\\Type\\Atomic\\TTemplatePropertiesOf' => $baseDir . '/src/Psalm/Type/Atomic/TTemplatePropertiesOf.php', 'Psalm\\Type\\Atomic\\TTemplateValueOf' => $baseDir . '/src/Psalm/Type/Atomic/TTemplateValueOf.php', 'Psalm\\Type\\Atomic\\TTraitString' => $baseDir . '/src/Psalm/Type/Atomic/TTraitString.php', 'Psalm\\Type\\Atomic\\TTrue' => $baseDir . '/src/Psalm/Type/Atomic/TTrue.php', 'Psalm\\Type\\Atomic\\TTypeAlias' => $baseDir . '/src/Psalm/Type/Atomic/TTypeAlias.php', 'Psalm\\Type\\Atomic\\TValueOf' => $baseDir . '/src/Psalm/Type/Atomic/TValueOf.php', 'Psalm\\Type\\Atomic\\TVoid' => $baseDir . '/src/Psalm/Type/Atomic/TVoid.php', 'Psalm\\Type\\MutableTypeVisitor' => $baseDir . '/src/Psalm/Type/MutableTypeVisitor.php', 'Psalm\\Type\\MutableUnion' => $baseDir . '/src/Psalm/Type/MutableUnion.php', 'Psalm\\Type\\Reconciler' => $baseDir . '/src/Psalm/Type/Reconciler.php', 'Psalm\\Type\\TaintKind' => $baseDir . '/src/Psalm/Type/TaintKind.php', 'Psalm\\Type\\TaintKindGroup' => $baseDir . '/src/Psalm/Type/TaintKindGroup.php', 'Psalm\\Type\\TypeNode' => $baseDir . '/src/Psalm/Type/TypeNode.php', 'Psalm\\Type\\TypeVisitor' => $baseDir . '/src/Psalm/Type/TypeVisitor.php', 'Psalm\\Type\\Union' => $baseDir . '/src/Psalm/Type/Union.php', 'Psalm\\Type\\UnionTrait' => $baseDir . '/src/Psalm/Type/UnionTrait.php', 'Stringable' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Stringable.php', '_HumbugBox1cb33d1f20f1\\AdvancedJsonRpc\\Dispatcher' => $vendorDir . '/felixfbecker/advanced-json-rpc/lib/Dispatcher.php', '_HumbugBox1cb33d1f20f1\\AdvancedJsonRpc\\Error' => $vendorDir . '/felixfbecker/advanced-json-rpc/lib/Error.php', '_HumbugBox1cb33d1f20f1\\AdvancedJsonRpc\\ErrorCode' => $vendorDir . '/felixfbecker/advanced-json-rpc/lib/ErrorCode.php', '_HumbugBox1cb33d1f20f1\\AdvancedJsonRpc\\ErrorResponse' => $vendorDir . '/felixfbecker/advanced-json-rpc/lib/ErrorResponse.php', '_HumbugBox1cb33d1f20f1\\AdvancedJsonRpc\\Message' => $vendorDir . '/felixfbecker/advanced-json-rpc/lib/Message.php', '_HumbugBox1cb33d1f20f1\\AdvancedJsonRpc\\Notification' => $vendorDir . '/felixfbecker/advanced-json-rpc/lib/Notification.php', '_HumbugBox1cb33d1f20f1\\AdvancedJsonRpc\\Request' => $vendorDir . '/felixfbecker/advanced-json-rpc/lib/Request.php', '_HumbugBox1cb33d1f20f1\\AdvancedJsonRpc\\Response' => $vendorDir . '/felixfbecker/advanced-json-rpc/lib/Response.php', '_HumbugBox1cb33d1f20f1\\AdvancedJsonRpc\\SuccessResponse' => $vendorDir . '/felixfbecker/advanced-json-rpc/lib/SuccessResponse.php', '_HumbugBox1cb33d1f20f1\\Amp\\ByteStream\\Base64\\Base64DecodingInputStream' => $vendorDir . '/amphp/byte-stream/lib/Base64/Base64DecodingInputStream.php', '_HumbugBox1cb33d1f20f1\\Amp\\ByteStream\\Base64\\Base64DecodingOutputStream' => $vendorDir . '/amphp/byte-stream/lib/Base64/Base64DecodingOutputStream.php', '_HumbugBox1cb33d1f20f1\\Amp\\ByteStream\\Base64\\Base64EncodingInputStream' => $vendorDir . '/amphp/byte-stream/lib/Base64/Base64EncodingInputStream.php', '_HumbugBox1cb33d1f20f1\\Amp\\ByteStream\\Base64\\Base64EncodingOutputStream' => $vendorDir . '/amphp/byte-stream/lib/Base64/Base64EncodingOutputStream.php', '_HumbugBox1cb33d1f20f1\\Amp\\ByteStream\\ClosedException' => $vendorDir . '/amphp/byte-stream/lib/ClosedException.php', '_HumbugBox1cb33d1f20f1\\Amp\\ByteStream\\InMemoryStream' => $vendorDir . '/amphp/byte-stream/lib/InMemoryStream.php', '_HumbugBox1cb33d1f20f1\\Amp\\ByteStream\\InputStream' => $vendorDir . '/amphp/byte-stream/lib/InputStream.php', '_HumbugBox1cb33d1f20f1\\Amp\\ByteStream\\InputStreamChain' => $vendorDir . '/amphp/byte-stream/lib/InputStreamChain.php', '_HumbugBox1cb33d1f20f1\\Amp\\ByteStream\\IteratorStream' => $vendorDir . '/amphp/byte-stream/lib/IteratorStream.php', '_HumbugBox1cb33d1f20f1\\Amp\\ByteStream\\LineReader' => $vendorDir . '/amphp/byte-stream/lib/LineReader.php', '_HumbugBox1cb33d1f20f1\\Amp\\ByteStream\\Message' => $vendorDir . '/amphp/byte-stream/lib/Message.php', '_HumbugBox1cb33d1f20f1\\Amp\\ByteStream\\OutputBuffer' => $vendorDir . '/amphp/byte-stream/lib/OutputBuffer.php', '_HumbugBox1cb33d1f20f1\\Amp\\ByteStream\\OutputStream' => $vendorDir . '/amphp/byte-stream/lib/OutputStream.php', '_HumbugBox1cb33d1f20f1\\Amp\\ByteStream\\Payload' => $vendorDir . '/amphp/byte-stream/lib/Payload.php', '_HumbugBox1cb33d1f20f1\\Amp\\ByteStream\\PendingReadError' => $vendorDir . '/amphp/byte-stream/lib/PendingReadError.php', '_HumbugBox1cb33d1f20f1\\Amp\\ByteStream\\ResourceInputStream' => $vendorDir . '/amphp/byte-stream/lib/ResourceInputStream.php', '_HumbugBox1cb33d1f20f1\\Amp\\ByteStream\\ResourceOutputStream' => $vendorDir . '/amphp/byte-stream/lib/ResourceOutputStream.php', '_HumbugBox1cb33d1f20f1\\Amp\\ByteStream\\StreamException' => $vendorDir . '/amphp/byte-stream/lib/StreamException.php', '_HumbugBox1cb33d1f20f1\\Amp\\ByteStream\\ZlibInputStream' => $vendorDir . '/amphp/byte-stream/lib/ZlibInputStream.php', '_HumbugBox1cb33d1f20f1\\Amp\\ByteStream\\ZlibOutputStream' => $vendorDir . '/amphp/byte-stream/lib/ZlibOutputStream.php', '_HumbugBox1cb33d1f20f1\\Amp\\CallableMaker' => $vendorDir . '/amphp/amp/lib/CallableMaker.php', '_HumbugBox1cb33d1f20f1\\Amp\\CancellationToken' => $vendorDir . '/amphp/amp/lib/CancellationToken.php', '_HumbugBox1cb33d1f20f1\\Amp\\CancellationTokenSource' => $vendorDir . '/amphp/amp/lib/CancellationTokenSource.php', '_HumbugBox1cb33d1f20f1\\Amp\\CancelledException' => $vendorDir . '/amphp/amp/lib/CancelledException.php', '_HumbugBox1cb33d1f20f1\\Amp\\CombinedCancellationToken' => $vendorDir . '/amphp/amp/lib/CombinedCancellationToken.php', '_HumbugBox1cb33d1f20f1\\Amp\\Coroutine' => $vendorDir . '/amphp/amp/lib/Coroutine.php', '_HumbugBox1cb33d1f20f1\\Amp\\Deferred' => $vendorDir . '/amphp/amp/lib/Deferred.php', '_HumbugBox1cb33d1f20f1\\Amp\\Delayed' => $vendorDir . '/amphp/amp/lib/Delayed.php', '_HumbugBox1cb33d1f20f1\\Amp\\Emitter' => $vendorDir . '/amphp/amp/lib/Emitter.php', '_HumbugBox1cb33d1f20f1\\Amp\\Failure' => $vendorDir . '/amphp/amp/lib/Failure.php', '_HumbugBox1cb33d1f20f1\\Amp\\Internal\\Placeholder' => $vendorDir . '/amphp/amp/lib/Internal/Placeholder.php', '_HumbugBox1cb33d1f20f1\\Amp\\Internal\\PrivateIterator' => $vendorDir . '/amphp/amp/lib/Internal/PrivateIterator.php', '_HumbugBox1cb33d1f20f1\\Amp\\Internal\\PrivatePromise' => $vendorDir . '/amphp/amp/lib/Internal/PrivatePromise.php', '_HumbugBox1cb33d1f20f1\\Amp\\Internal\\Producer' => $vendorDir . '/amphp/amp/lib/Internal/Producer.php', '_HumbugBox1cb33d1f20f1\\Amp\\Internal\\ResolutionQueue' => $vendorDir . '/amphp/amp/lib/Internal/ResolutionQueue.php', '_HumbugBox1cb33d1f20f1\\Amp\\InvalidYieldError' => $vendorDir . '/amphp/amp/lib/InvalidYieldError.php', '_HumbugBox1cb33d1f20f1\\Amp\\Iterator' => $vendorDir . '/amphp/amp/lib/Iterator.php', '_HumbugBox1cb33d1f20f1\\Amp\\LazyPromise' => $vendorDir . '/amphp/amp/lib/LazyPromise.php', '_HumbugBox1cb33d1f20f1\\Amp\\Loop' => $vendorDir . '/amphp/amp/lib/Loop.php', '_HumbugBox1cb33d1f20f1\\Amp\\Loop\\Driver' => $vendorDir . '/amphp/amp/lib/Loop/Driver.php', '_HumbugBox1cb33d1f20f1\\Amp\\Loop\\DriverFactory' => $vendorDir . '/amphp/amp/lib/Loop/DriverFactory.php', '_HumbugBox1cb33d1f20f1\\Amp\\Loop\\EvDriver' => $vendorDir . '/amphp/amp/lib/Loop/EvDriver.php', '_HumbugBox1cb33d1f20f1\\Amp\\Loop\\EventDriver' => $vendorDir . '/amphp/amp/lib/Loop/EventDriver.php', '_HumbugBox1cb33d1f20f1\\Amp\\Loop\\Internal\\TimerQueue' => $vendorDir . '/amphp/amp/lib/Loop/Internal/TimerQueue.php', '_HumbugBox1cb33d1f20f1\\Amp\\Loop\\InvalidWatcherError' => $vendorDir . '/amphp/amp/lib/Loop/InvalidWatcherError.php', '_HumbugBox1cb33d1f20f1\\Amp\\Loop\\NativeDriver' => $vendorDir . '/amphp/amp/lib/Loop/NativeDriver.php', '_HumbugBox1cb33d1f20f1\\Amp\\Loop\\TracingDriver' => $vendorDir . '/amphp/amp/lib/Loop/TracingDriver.php', '_HumbugBox1cb33d1f20f1\\Amp\\Loop\\UnsupportedFeatureException' => $vendorDir . '/amphp/amp/lib/Loop/UnsupportedFeatureException.php', '_HumbugBox1cb33d1f20f1\\Amp\\Loop\\UvDriver' => $vendorDir . '/amphp/amp/lib/Loop/UvDriver.php', '_HumbugBox1cb33d1f20f1\\Amp\\Loop\\Watcher' => $vendorDir . '/amphp/amp/lib/Loop/Watcher.php', '_HumbugBox1cb33d1f20f1\\Amp\\MultiReasonException' => $vendorDir . '/amphp/amp/lib/MultiReasonException.php', '_HumbugBox1cb33d1f20f1\\Amp\\NullCancellationToken' => $vendorDir . '/amphp/amp/lib/NullCancellationToken.php', '_HumbugBox1cb33d1f20f1\\Amp\\Producer' => $vendorDir . '/amphp/amp/lib/Producer.php', '_HumbugBox1cb33d1f20f1\\Amp\\Promise' => $vendorDir . '/amphp/amp/lib/Promise.php', '_HumbugBox1cb33d1f20f1\\Amp\\Struct' => $vendorDir . '/amphp/amp/lib/Struct.php', '_HumbugBox1cb33d1f20f1\\Amp\\Success' => $vendorDir . '/amphp/amp/lib/Success.php', '_HumbugBox1cb33d1f20f1\\Amp\\TimeoutCancellationToken' => $vendorDir . '/amphp/amp/lib/TimeoutCancellationToken.php', '_HumbugBox1cb33d1f20f1\\Amp\\TimeoutException' => $vendorDir . '/amphp/amp/lib/TimeoutException.php', '_HumbugBox1cb33d1f20f1\\Composer\\Pcre\\MatchAllResult' => $vendorDir . '/composer/pcre/src/MatchAllResult.php', '_HumbugBox1cb33d1f20f1\\Composer\\Pcre\\MatchAllStrictGroupsResult' => $vendorDir . '/composer/pcre/src/MatchAllStrictGroupsResult.php', '_HumbugBox1cb33d1f20f1\\Composer\\Pcre\\MatchAllWithOffsetsResult' => $vendorDir . '/composer/pcre/src/MatchAllWithOffsetsResult.php', '_HumbugBox1cb33d1f20f1\\Composer\\Pcre\\MatchResult' => $vendorDir . '/composer/pcre/src/MatchResult.php', '_HumbugBox1cb33d1f20f1\\Composer\\Pcre\\MatchStrictGroupsResult' => $vendorDir . '/composer/pcre/src/MatchStrictGroupsResult.php', '_HumbugBox1cb33d1f20f1\\Composer\\Pcre\\MatchWithOffsetsResult' => $vendorDir . '/composer/pcre/src/MatchWithOffsetsResult.php', '_HumbugBox1cb33d1f20f1\\Composer\\Pcre\\PcreException' => $vendorDir . '/composer/pcre/src/PcreException.php', '_HumbugBox1cb33d1f20f1\\Composer\\Pcre\\Preg' => $vendorDir . '/composer/pcre/src/Preg.php', '_HumbugBox1cb33d1f20f1\\Composer\\Pcre\\Regex' => $vendorDir . '/composer/pcre/src/Regex.php', '_HumbugBox1cb33d1f20f1\\Composer\\Pcre\\ReplaceResult' => $vendorDir . '/composer/pcre/src/ReplaceResult.php', '_HumbugBox1cb33d1f20f1\\Composer\\Pcre\\UnexpectedNullMatchException' => $vendorDir . '/composer/pcre/src/UnexpectedNullMatchException.php', '_HumbugBox1cb33d1f20f1\\Composer\\Semver\\Comparator' => $vendorDir . '/composer/semver/src/Comparator.php', '_HumbugBox1cb33d1f20f1\\Composer\\Semver\\CompilingMatcher' => $vendorDir . '/composer/semver/src/CompilingMatcher.php', '_HumbugBox1cb33d1f20f1\\Composer\\Semver\\Constraint\\Bound' => $vendorDir . '/composer/semver/src/Constraint/Bound.php', '_HumbugBox1cb33d1f20f1\\Composer\\Semver\\Constraint\\Constraint' => $vendorDir . '/composer/semver/src/Constraint/Constraint.php', '_HumbugBox1cb33d1f20f1\\Composer\\Semver\\Constraint\\ConstraintInterface' => $vendorDir . '/composer/semver/src/Constraint/ConstraintInterface.php', '_HumbugBox1cb33d1f20f1\\Composer\\Semver\\Constraint\\MatchAllConstraint' => $vendorDir . '/composer/semver/src/Constraint/MatchAllConstraint.php', '_HumbugBox1cb33d1f20f1\\Composer\\Semver\\Constraint\\MatchNoneConstraint' => $vendorDir . '/composer/semver/src/Constraint/MatchNoneConstraint.php', '_HumbugBox1cb33d1f20f1\\Composer\\Semver\\Constraint\\MultiConstraint' => $vendorDir . '/composer/semver/src/Constraint/MultiConstraint.php', '_HumbugBox1cb33d1f20f1\\Composer\\Semver\\Interval' => $vendorDir . '/composer/semver/src/Interval.php', '_HumbugBox1cb33d1f20f1\\Composer\\Semver\\Intervals' => $vendorDir . '/composer/semver/src/Intervals.php', '_HumbugBox1cb33d1f20f1\\Composer\\Semver\\Semver' => $vendorDir . '/composer/semver/src/Semver.php', '_HumbugBox1cb33d1f20f1\\Composer\\Semver\\VersionParser' => $vendorDir . '/composer/semver/src/VersionParser.php', '_HumbugBox1cb33d1f20f1\\Composer\\XdebugHandler\\PhpConfig' => $vendorDir . '/composer/xdebug-handler/src/PhpConfig.php', '_HumbugBox1cb33d1f20f1\\Composer\\XdebugHandler\\Process' => $vendorDir . '/composer/xdebug-handler/src/Process.php', '_HumbugBox1cb33d1f20f1\\Composer\\XdebugHandler\\Status' => $vendorDir . '/composer/xdebug-handler/src/Status.php', '_HumbugBox1cb33d1f20f1\\Composer\\XdebugHandler\\XdebugHandler' => $vendorDir . '/composer/xdebug-handler/src/XdebugHandler.php', '_HumbugBox1cb33d1f20f1\\Fidry\\CpuCoreCounter\\CpuCoreCounter' => $vendorDir . '/fidry/cpu-core-counter/src/CpuCoreCounter.php', '_HumbugBox1cb33d1f20f1\\Fidry\\CpuCoreCounter\\Diagnoser' => $vendorDir . '/fidry/cpu-core-counter/src/Diagnoser.php', '_HumbugBox1cb33d1f20f1\\Fidry\\CpuCoreCounter\\Exec\\ProcOpen' => $vendorDir . '/fidry/cpu-core-counter/src/Exec/ProcOpen.php', '_HumbugBox1cb33d1f20f1\\Fidry\\CpuCoreCounter\\Finder\\CpuCoreFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/CpuCoreFinder.php', '_HumbugBox1cb33d1f20f1\\Fidry\\CpuCoreCounter\\Finder\\CpuInfoFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/CpuInfoFinder.php', '_HumbugBox1cb33d1f20f1\\Fidry\\CpuCoreCounter\\Finder\\DummyCpuCoreFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/DummyCpuCoreFinder.php', '_HumbugBox1cb33d1f20f1\\Fidry\\CpuCoreCounter\\Finder\\FinderRegistry' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/FinderRegistry.php', '_HumbugBox1cb33d1f20f1\\Fidry\\CpuCoreCounter\\Finder\\HwLogicalFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/HwLogicalFinder.php', '_HumbugBox1cb33d1f20f1\\Fidry\\CpuCoreCounter\\Finder\\HwPhysicalFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/HwPhysicalFinder.php', '_HumbugBox1cb33d1f20f1\\Fidry\\CpuCoreCounter\\Finder\\NProcFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/NProcFinder.php', '_HumbugBox1cb33d1f20f1\\Fidry\\CpuCoreCounter\\Finder\\NProcessorFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/NProcessorFinder.php', '_HumbugBox1cb33d1f20f1\\Fidry\\CpuCoreCounter\\Finder\\NullCpuCoreFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/NullCpuCoreFinder.php', '_HumbugBox1cb33d1f20f1\\Fidry\\CpuCoreCounter\\Finder\\OnlyOnWindowsFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/OnlyOnWindowsFinder.php', '_HumbugBox1cb33d1f20f1\\Fidry\\CpuCoreCounter\\Finder\\ProcOpenBasedFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/ProcOpenBasedFinder.php', '_HumbugBox1cb33d1f20f1\\Fidry\\CpuCoreCounter\\Finder\\SkipOnWindowsFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/SkipOnWindowsFinder.php', '_HumbugBox1cb33d1f20f1\\Fidry\\CpuCoreCounter\\Finder\\WmicLogicalFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/WmicLogicalFinder.php', '_HumbugBox1cb33d1f20f1\\Fidry\\CpuCoreCounter\\Finder\\WmicPhysicalFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/WmicPhysicalFinder.php', '_HumbugBox1cb33d1f20f1\\Fidry\\CpuCoreCounter\\Finder\\_NProcessorFinder' => $vendorDir . '/fidry/cpu-core-counter/src/Finder/_NProcessorFinder.php', '_HumbugBox1cb33d1f20f1\\Fidry\\CpuCoreCounter\\NumberOfCpuCoreNotFound' => $vendorDir . '/fidry/cpu-core-counter/src/NumberOfCpuCoreNotFound.php', '_HumbugBox1cb33d1f20f1\\JsonException' => $vendorDir . '/symfony/polyfill-php73/Resources/stubs/JsonException.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\CallHierarchyClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/CallHierarchyClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\ChangeAnnotation' => $vendorDir . '/felixfbecker/language-server-protocol/src/ChangeAnnotation.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\ClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/ClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\ClientCapabilitiesGeneral' => $vendorDir . '/felixfbecker/language-server-protocol/src/ClientCapabilitiesGeneral.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\ClientCapabilitiesWindow' => $vendorDir . '/felixfbecker/language-server-protocol/src/ClientCapabilitiesWindow.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\ClientCapabilitiesWorkspace' => $vendorDir . '/felixfbecker/language-server-protocol/src/ClientCapabilitiesWorkspace.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\ClientCapabilitiesWorkspaceFileOperations' => $vendorDir . '/felixfbecker/language-server-protocol/src/ClientCapabilitiesWorkspaceFileOperations.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\ClientInfo' => $vendorDir . '/felixfbecker/language-server-protocol/src/ClientInfo.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\CodeAction' => $vendorDir . '/felixfbecker/language-server-protocol/src/CodeAction.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\CodeActionClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/CodeActionClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\CodeActionClientCapabilitiesCodeActionLiteralSupport' => $vendorDir . '/felixfbecker/language-server-protocol/src/CodeActionClientCapabilitiesCodeActionLiteralSupport.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\CodeActionClientCapabilitiesCodeActionLiteralSupportcodeActionKind' => $vendorDir . '/felixfbecker/language-server-protocol/src/CodeActionClientCapabilitiesCodeActionLiteralSupportcodeActionKind.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\CodeActionClientCapabilitiesResolveSupport' => $vendorDir . '/felixfbecker/language-server-protocol/src/CodeActionClientCapabilitiesResolveSupport.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\CodeActionContext' => $vendorDir . '/felixfbecker/language-server-protocol/src/CodeActionContext.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\CodeActionDisabled' => $vendorDir . '/felixfbecker/language-server-protocol/src/CodeActionDisabled.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\CodeActionKind' => $vendorDir . '/felixfbecker/language-server-protocol/src/CodeActionKind.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\CodeActionTriggerKind' => $vendorDir . '/felixfbecker/language-server-protocol/src/CodeActionTriggerKind.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\CodeDescription' => $vendorDir . '/felixfbecker/language-server-protocol/src/CodeDescription.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\CodeLens' => $vendorDir . '/felixfbecker/language-server-protocol/src/CodeLens.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\CodeLensClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/CodeLensClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\CodeLensOptions' => $vendorDir . '/felixfbecker/language-server-protocol/src/CodeLensOptions.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\CodeLensWorkspaceClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/CodeLensWorkspaceClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\Command' => $vendorDir . '/felixfbecker/language-server-protocol/src/Command.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\CompletionClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/CompletionClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\CompletionClientCapabilitiesCompletionItem' => $vendorDir . '/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItem.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\CompletionClientCapabilitiesCompletionItemInsertTextModeSupport' => $vendorDir . '/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItemInsertTextModeSupport.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\CompletionClientCapabilitiesCompletionItemResolveSupport' => $vendorDir . '/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItemResolveSupport.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\CompletionClientCapabilitiesCompletionItemTagSupport' => $vendorDir . '/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItemTagSupport.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\CompletionClientCapabilitiesCompletionList' => $vendorDir . '/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionList.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\CompletionContext' => $vendorDir . '/felixfbecker/language-server-protocol/src/CompletionContext.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\CompletionItem' => $vendorDir . '/felixfbecker/language-server-protocol/src/CompletionItem.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\CompletionItemKind' => $vendorDir . '/felixfbecker/language-server-protocol/src/CompletionItemKind.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\CompletionItemLabelDetails' => $vendorDir . '/felixfbecker/language-server-protocol/src/CompletionItemLabelDetails.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\CompletionItemTag' => $vendorDir . '/felixfbecker/language-server-protocol/src/CompletionItemTag.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\CompletionList' => $vendorDir . '/felixfbecker/language-server-protocol/src/CompletionList.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\CompletionOptions' => $vendorDir . '/felixfbecker/language-server-protocol/src/CompletionOptions.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\CompletionTriggerKind' => $vendorDir . '/felixfbecker/language-server-protocol/src/CompletionTriggerKind.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\ContentChangeEvent' => $vendorDir . '/felixfbecker/language-server-protocol/src/ContentChangeEvent.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\DeclarationClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/DeclarationClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\DefinitionClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/DefinitionClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\DependencyReference' => $vendorDir . '/felixfbecker/language-server-protocol/src/DependencyReference.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\Diagnostic' => $vendorDir . '/felixfbecker/language-server-protocol/src/Diagnostic.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\DiagnosticRelatedInformation' => $vendorDir . '/felixfbecker/language-server-protocol/src/DiagnosticRelatedInformation.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\DiagnosticSeverity' => $vendorDir . '/felixfbecker/language-server-protocol/src/DiagnosticSeverity.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\DiagnosticTag' => $vendorDir . '/felixfbecker/language-server-protocol/src/DiagnosticTag.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\DidChangeConfigurationClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/DidChangeConfigurationClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\DidChangeWatchedFilesClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/DidChangeWatchedFilesClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\DocumentColorClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/DocumentColorClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\DocumentFormattingClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/DocumentFormattingClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\DocumentHighlight' => $vendorDir . '/felixfbecker/language-server-protocol/src/DocumentHighlight.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\DocumentHighlightClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/DocumentHighlightClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\DocumentHighlightKind' => $vendorDir . '/felixfbecker/language-server-protocol/src/DocumentHighlightKind.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\DocumentLinkClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/DocumentLinkClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\DocumentOnTypeFormattingClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/DocumentOnTypeFormattingClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\DocumentOnTypeFormattingOptions' => $vendorDir . '/felixfbecker/language-server-protocol/src/DocumentOnTypeFormattingOptions.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\DocumentRangeFormattingClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/DocumentRangeFormattingClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\DocumentSymbolClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/DocumentSymbolClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\DocumentSymbolClientCapabilitiesSymbolKind' => $vendorDir . '/felixfbecker/language-server-protocol/src/DocumentSymbolClientCapabilitiesSymbolKind.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\DocumentSymbolClientCapabilitiesTagSupport' => $vendorDir . '/felixfbecker/language-server-protocol/src/DocumentSymbolClientCapabilitiesTagSupport.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\ErrorCode' => $vendorDir . '/felixfbecker/language-server-protocol/src/ErrorCode.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\ExecuteCommandClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/ExecuteCommandClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\ExecuteCommandOptions' => $vendorDir . '/felixfbecker/language-server-protocol/src/ExecuteCommandOptions.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\FailureHandlingKind' => $vendorDir . '/felixfbecker/language-server-protocol/src/FailureHandlingKind.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\FileChangeType' => $vendorDir . '/felixfbecker/language-server-protocol/src/FileChangeType.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\FileEvent' => $vendorDir . '/felixfbecker/language-server-protocol/src/FileEvent.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\FoldingRangeClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/FoldingRangeClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\FormattingOptions' => $vendorDir . '/felixfbecker/language-server-protocol/src/FormattingOptions.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\Hover' => $vendorDir . '/felixfbecker/language-server-protocol/src/Hover.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\HoverClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/HoverClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\ImplementationClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/ImplementationClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\InitializeResult' => $vendorDir . '/felixfbecker/language-server-protocol/src/InitializeResult.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\InitializeResultServerInfo' => $vendorDir . '/felixfbecker/language-server-protocol/src/InitializeResultServerInfo.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\InsertTextFormat' => $vendorDir . '/felixfbecker/language-server-protocol/src/InsertTextFormat.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\InsertTextMode' => $vendorDir . '/felixfbecker/language-server-protocol/src/InsertTextMode.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\LinkedEditingRangeClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/LinkedEditingRangeClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\Location' => $vendorDir . '/felixfbecker/language-server-protocol/src/Location.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\LogMessage' => $vendorDir . '/felixfbecker/language-server-protocol/src/LogMessage.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\LogTrace' => $vendorDir . '/felixfbecker/language-server-protocol/src/LogTrace.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\MarkdownClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/MarkdownClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\MarkedString' => $vendorDir . '/felixfbecker/language-server-protocol/src/MarkedString.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\MarkupContent' => $vendorDir . '/felixfbecker/language-server-protocol/src/MarkupContent.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\MarkupKind' => $vendorDir . '/felixfbecker/language-server-protocol/src/MarkupKind.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\MessageActionItem' => $vendorDir . '/felixfbecker/language-server-protocol/src/MessageActionItem.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\MessageType' => $vendorDir . '/felixfbecker/language-server-protocol/src/MessageType.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\MonikerClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/MonikerClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\PackageDescriptor' => $vendorDir . '/felixfbecker/language-server-protocol/src/PackageDescriptor.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\ParameterInformation' => $vendorDir . '/felixfbecker/language-server-protocol/src/ParameterInformation.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\Position' => $vendorDir . '/felixfbecker/language-server-protocol/src/Position.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\PrepareSupportDefaultBehavior' => $vendorDir . '/felixfbecker/language-server-protocol/src/PrepareSupportDefaultBehavior.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\PublishDiagnosticsClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/PublishDiagnosticsClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\PublishDiagnosticsClientCapabilitiesTagSupport' => $vendorDir . '/felixfbecker/language-server-protocol/src/PublishDiagnosticsClientCapabilitiesTagSupport.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\Range' => $vendorDir . '/felixfbecker/language-server-protocol/src/Range.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\ReferenceClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/ReferenceClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\ReferenceContext' => $vendorDir . '/felixfbecker/language-server-protocol/src/ReferenceContext.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\ReferenceInformation' => $vendorDir . '/felixfbecker/language-server-protocol/src/ReferenceInformation.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\RegularExpressionsClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/RegularExpressionsClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\RenameClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/RenameClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\ResourceOperationKind' => $vendorDir . '/felixfbecker/language-server-protocol/src/ResourceOperationKind.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\SaveOptions' => $vendorDir . '/felixfbecker/language-server-protocol/src/SaveOptions.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\SelectionRangeClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/SelectionRangeClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\SemanticTokensClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/SemanticTokensClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\SemanticTokensClientCapabilitiesRequests' => $vendorDir . '/felixfbecker/language-server-protocol/src/SemanticTokensClientCapabilitiesRequests.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\SemanticTokensWorkspaceClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/SemanticTokensWorkspaceClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\ServerCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/ServerCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\ShowDocumentClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/ShowDocumentClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\ShowMessageRequestClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/ShowMessageRequestClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\ShowMessageRequestClientCapabilitiesMessageActionItem' => $vendorDir . '/felixfbecker/language-server-protocol/src/ShowMessageRequestClientCapabilitiesMessageActionItem.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\SignatureHelp' => $vendorDir . '/felixfbecker/language-server-protocol/src/SignatureHelp.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\SignatureHelpClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/SignatureHelpClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\SignatureHelpClientCapabilitiesSignatureInformation' => $vendorDir . '/felixfbecker/language-server-protocol/src/SignatureHelpClientCapabilitiesSignatureInformation.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\SignatureHelpClientCapabilitiesSignatureInformationParameterInformation' => $vendorDir . '/felixfbecker/language-server-protocol/src/SignatureHelpClientCapabilitiesSignatureInformationParameterInformation.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\SignatureHelpOptions' => $vendorDir . '/felixfbecker/language-server-protocol/src/SignatureHelpOptions.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\SignatureInformation' => $vendorDir . '/felixfbecker/language-server-protocol/src/SignatureInformation.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\SymbolDescriptor' => $vendorDir . '/felixfbecker/language-server-protocol/src/SymbolDescriptor.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\SymbolInformation' => $vendorDir . '/felixfbecker/language-server-protocol/src/SymbolInformation.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\SymbolKind' => $vendorDir . '/felixfbecker/language-server-protocol/src/SymbolKind.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\SymbolLocationInformation' => $vendorDir . '/felixfbecker/language-server-protocol/src/SymbolLocationInformation.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\SymbolTag' => $vendorDir . '/felixfbecker/language-server-protocol/src/SymbolTag.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\TextDocumentClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/TextDocumentClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\TextDocumentContentChangeEvent' => $vendorDir . '/felixfbecker/language-server-protocol/src/TextDocumentContentChangeEvent.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\TextDocumentIdentifier' => $vendorDir . '/felixfbecker/language-server-protocol/src/TextDocumentIdentifier.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\TextDocumentItem' => $vendorDir . '/felixfbecker/language-server-protocol/src/TextDocumentItem.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\TextDocumentSyncClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/TextDocumentSyncClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\TextDocumentSyncKind' => $vendorDir . '/felixfbecker/language-server-protocol/src/TextDocumentSyncKind.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\TextDocumentSyncOptions' => $vendorDir . '/felixfbecker/language-server-protocol/src/TextDocumentSyncOptions.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\TextEdit' => $vendorDir . '/felixfbecker/language-server-protocol/src/TextEdit.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\TokenFormat' => $vendorDir . '/felixfbecker/language-server-protocol/src/TokenFormat.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\TypeDefinitionClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/TypeDefinitionClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\VersionedTextDocumentIdentifier' => $vendorDir . '/felixfbecker/language-server-protocol/src/VersionedTextDocumentIdentifier.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\WorkspaceEdit' => $vendorDir . '/felixfbecker/language-server-protocol/src/WorkspaceEdit.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\WorkspaceEditClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/WorkspaceEditClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\WorkspaceEditClientCapabilitiesChangeAnnotationSupport' => $vendorDir . '/felixfbecker/language-server-protocol/src/WorkspaceEditClientCapabilitiesChangeAnnotationSupport.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\WorkspaceFolder' => $vendorDir . '/felixfbecker/language-server-protocol/src/WorkspaceFolder.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\WorkspaceSymbolClientCapabilities' => $vendorDir . '/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\WorkspaceSymbolClientCapabilitiesResolveSupport' => $vendorDir . '/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilitiesResolveSupport.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\WorkspaceSymbolClientCapabilitiesSymbolKind' => $vendorDir . '/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilitiesSymbolKind.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\WorkspaceSymbolClientCapabilitiesTagSupport' => $vendorDir . '/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilitiesTagSupport.php', '_HumbugBox1cb33d1f20f1\\Normalizer' => $vendorDir . '/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php', '_HumbugBox1cb33d1f20f1\\PackageVersions\\FallbackVersions' => $vendorDir . '/composer/package-versions-deprecated/src/PackageVersions/FallbackVersions.php', '_HumbugBox1cb33d1f20f1\\PackageVersions\\Installer' => $vendorDir . '/composer/package-versions-deprecated/src/PackageVersions/Installer.php', '_HumbugBox1cb33d1f20f1\\PackageVersions\\Versions' => $vendorDir . '/composer/package-versions-deprecated/src/PackageVersions/Versions.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Builder' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\BuilderFactory' => $vendorDir . '/nikic/php-parser/lib/PhpParser/BuilderFactory.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\BuilderHelpers' => $vendorDir . '/nikic/php-parser/lib/PhpParser/BuilderHelpers.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Builder\\ClassConst' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/ClassConst.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Builder\\Class_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Class_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Builder\\Declaration' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Declaration.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Builder\\EnumCase' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/EnumCase.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Builder\\Enum_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Enum_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Builder\\FunctionLike' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/FunctionLike.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Builder\\Function_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Function_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Builder\\Interface_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Interface_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Builder\\Method' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Method.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Builder\\Namespace_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Namespace_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Builder\\Param' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Param.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Builder\\Property' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Property.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Builder\\TraitUse' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/TraitUse.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Builder\\TraitUseAdaptation' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/TraitUseAdaptation.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Builder\\Trait_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Trait_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Builder\\Use_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder/Use_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Comment' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Comment.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Comment\\Doc' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Comment/Doc.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\ConstExprEvaluationException' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ConstExprEvaluationException.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\ConstExprEvaluator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ConstExprEvaluator.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Error' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Error.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\ErrorHandler' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ErrorHandler.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\ErrorHandler\\Collecting' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ErrorHandler/Collecting.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\ErrorHandler\\Throwing' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ErrorHandler/Throwing.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Internal\\DiffElem' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Internal/DiffElem.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Internal\\Differ' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Internal/Differ.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Internal\\PrintableNewAnonClassNode' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Internal/PrintableNewAnonClassNode.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Internal\\TokenStream' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Internal/TokenStream.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\JsonDecoder' => $vendorDir . '/nikic/php-parser/lib/PhpParser/JsonDecoder.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Lexer' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Lexer\\Emulative' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/Emulative.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Lexer\\TokenEmulator\\AttributeEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/AttributeEmulator.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Lexer\\TokenEmulator\\CoaleseEqualTokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/CoaleseEqualTokenEmulator.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Lexer\\TokenEmulator\\EnumTokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/EnumTokenEmulator.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Lexer\\TokenEmulator\\ExplicitOctalEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ExplicitOctalEmulator.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Lexer\\TokenEmulator\\FlexibleDocStringEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FlexibleDocStringEmulator.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Lexer\\TokenEmulator\\FnTokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FnTokenEmulator.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Lexer\\TokenEmulator\\KeywordEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/KeywordEmulator.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Lexer\\TokenEmulator\\MatchTokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/MatchTokenEmulator.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Lexer\\TokenEmulator\\NullsafeTokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NullsafeTokenEmulator.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Lexer\\TokenEmulator\\NumericLiteralSeparatorEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NumericLiteralSeparatorEmulator.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Lexer\\TokenEmulator\\ReadonlyFunctionTokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyFunctionTokenEmulator.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Lexer\\TokenEmulator\\ReadonlyTokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyTokenEmulator.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Lexer\\TokenEmulator\\ReverseEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReverseEmulator.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Lexer\\TokenEmulator\\TokenEmulator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/TokenEmulator.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\NameContext' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NameContext.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\NodeAbstract' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeAbstract.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\NodeDumper' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeDumper.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\NodeFinder' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeFinder.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\NodeTraverser' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeTraverser.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\NodeTraverserInterface' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeTraverserInterface.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\NodeVisitor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\NodeVisitorAbstract' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitorAbstract.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\NodeVisitor\\CloningVisitor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor/CloningVisitor.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\NodeVisitor\\FindingVisitor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor/FindingVisitor.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\NodeVisitor\\FirstFindingVisitor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor/FirstFindingVisitor.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\NodeVisitor\\NameResolver' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor/NameResolver.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\NodeVisitor\\NodeConnectingVisitor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor/NodeConnectingVisitor.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\NodeVisitor\\ParentConnectingVisitor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/NodeVisitor/ParentConnectingVisitor.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Arg' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Arg.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Attribute' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Attribute.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\AttributeGroup' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/AttributeGroup.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\ComplexType' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/ComplexType.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Const_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Const_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\ArrayDimFetch' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayDimFetch.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\ArrayItem' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayItem.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\Array_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Array_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\ArrowFunction' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ArrowFunction.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\Assign' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Assign.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\AssignOp' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\AssignOp\\BitwiseAnd' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseAnd.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\AssignOp\\BitwiseOr' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseOr.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\AssignOp\\BitwiseXor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseXor.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\AssignOp\\Coalesce' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Coalesce.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\AssignOp\\Concat' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Concat.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\AssignOp\\Div' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Div.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\AssignOp\\Minus' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Minus.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\AssignOp\\Mod' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mod.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\AssignOp\\Mul' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mul.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\AssignOp\\Plus' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Plus.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\AssignOp\\Pow' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Pow.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\AssignOp\\ShiftLeft' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftLeft.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\AssignOp\\ShiftRight' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftRight.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\AssignRef' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignRef.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BinaryOp' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BinaryOp\\BitwiseAnd' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseAnd.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BinaryOp\\BitwiseOr' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseOr.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BinaryOp\\BitwiseXor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseXor.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BinaryOp\\BooleanAnd' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanAnd.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BinaryOp\\BooleanOr' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanOr.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BinaryOp\\Coalesce' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Coalesce.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BinaryOp\\Concat' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Concat.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BinaryOp\\Div' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Div.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BinaryOp\\Equal' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Equal.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BinaryOp\\Greater' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Greater.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BinaryOp\\GreaterOrEqual' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/GreaterOrEqual.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BinaryOp\\Identical' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Identical.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BinaryOp\\LogicalAnd' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalAnd.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BinaryOp\\LogicalOr' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalOr.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BinaryOp\\LogicalXor' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalXor.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BinaryOp\\Minus' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Minus.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BinaryOp\\Mod' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mod.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BinaryOp\\Mul' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mul.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BinaryOp\\NotEqual' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotEqual.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BinaryOp\\NotIdentical' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotIdentical.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BinaryOp\\Plus' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Plus.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BinaryOp\\Pow' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Pow.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BinaryOp\\ShiftLeft' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftLeft.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BinaryOp\\ShiftRight' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftRight.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BinaryOp\\Smaller' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Smaller.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BinaryOp\\SmallerOrEqual' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/SmallerOrEqual.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BinaryOp\\Spaceship' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Spaceship.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BitwiseNot' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BitwiseNot.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BooleanNot' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/BooleanNot.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\CallLike' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/CallLike.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\Cast' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\Cast\\Array_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Array_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\Cast\\Bool_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Bool_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\Cast\\Double' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Double.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\Cast\\Int_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Int_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\Cast\\Object_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Object_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\Cast\\String_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/String_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\Cast\\Unset_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Unset_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\ClassConstFetch' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ClassConstFetch.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\Clone_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Clone_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\Closure' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Closure.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\ClosureUse' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ClosureUse.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\ConstFetch' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ConstFetch.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\Empty_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Empty_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\Error' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Error.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\ErrorSuppress' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ErrorSuppress.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\Eval_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Eval_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\Exit_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Exit_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\FuncCall' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/FuncCall.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\Include_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Include_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\Instanceof_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Instanceof_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\Isset_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Isset_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\List_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/List_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\Match_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Match_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\MethodCall' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/MethodCall.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\New_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/New_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\NullsafeMethodCall' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafeMethodCall.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\NullsafePropertyFetch' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafePropertyFetch.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\PostDec' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/PostDec.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\PostInc' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/PostInc.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\PreDec' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/PreDec.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\PreInc' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/PreInc.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\Print_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Print_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\PropertyFetch' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/PropertyFetch.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\ShellExec' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ShellExec.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\StaticCall' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/StaticCall.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\StaticPropertyFetch' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/StaticPropertyFetch.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\Ternary' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Ternary.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\Throw_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Throw_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\UnaryMinus' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryMinus.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\UnaryPlus' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryPlus.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\Variable' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Variable.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\YieldFrom' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/YieldFrom.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\Yield_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/Yield_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\FunctionLike' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/FunctionLike.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Identifier' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Identifier.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\IntersectionType' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/IntersectionType.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\MatchArm' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/MatchArm.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Name' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Name.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Name\\FullyQualified' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Name/FullyQualified.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Name\\Relative' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Name/Relative.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\NullableType' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/NullableType.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Param' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Param.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Scalar' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Scalar\\DNumber' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Scalar\\Encapsed' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/Encapsed.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Scalar\\EncapsedStringPart' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/EncapsedStringPart.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Scalar\\LNumber' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Scalar\\MagicConst' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Scalar\\MagicConst\\Class_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Class_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Scalar\\MagicConst\\Dir' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Dir.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Scalar\\MagicConst\\File' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/File.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Scalar\\MagicConst\\Function_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Function_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Scalar\\MagicConst\\Line' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Line.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Scalar\\MagicConst\\Method' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Method.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Scalar\\MagicConst\\Namespace_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Namespace_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Scalar\\MagicConst\\Trait_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Trait_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Scalar\\String_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/String_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\Break_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Break_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\Case_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Case_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\Catch_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Catch_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\ClassConst' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassConst.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\ClassLike' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\ClassMethod' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassMethod.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\Class_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\Const_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Const_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\Continue_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Continue_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\DeclareDeclare' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/DeclareDeclare.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\Declare_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Declare_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\Do_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Do_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\Echo_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Echo_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\ElseIf_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ElseIf_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\Else_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Else_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\EnumCase' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/EnumCase.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\Enum_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Enum_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\Expression' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Expression.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\Finally_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Finally_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\For_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/For_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\Foreach_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Foreach_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\Function_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\Global_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Global_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\Goto_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Goto_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\GroupUse' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/GroupUse.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\HaltCompiler' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/HaltCompiler.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\If_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/If_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\InlineHTML' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/InlineHTML.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\Interface_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Interface_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\Label' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Label.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\Namespace_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Namespace_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\Nop' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Nop.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\Property' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Property.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\PropertyProperty' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/PropertyProperty.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\Return_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Return_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\StaticVar' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/StaticVar.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\Static_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Static_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\Switch_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Switch_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\Throw_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Throw_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\TraitUse' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUse.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\TraitUseAdaptation' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\TraitUseAdaptation\\Alias' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Alias.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\TraitUseAdaptation\\Precedence' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Precedence.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\Trait_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Trait_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\TryCatch' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TryCatch.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\Unset_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Unset_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\UseUse' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/UseUse.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\Use_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Use_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\While_' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/While_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\UnionType' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/UnionType.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\VarLikeIdentifier' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/VarLikeIdentifier.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\VariadicPlaceholder' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/VariadicPlaceholder.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Parser' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Parser.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\ParserAbstract' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ParserAbstract.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\ParserFactory' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ParserFactory.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Parser\\Multiple' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Parser/Multiple.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Parser\\Php5' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Parser/Php5.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Parser\\Php7' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Parser/Php7.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Parser\\Tokens' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Parser/Tokens.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\PrettyPrinterAbstract' => $vendorDir . '/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\PrettyPrinter\\Standard' => $vendorDir . '/nikic/php-parser/lib/PhpParser/PrettyPrinter/Standard.php', '_HumbugBox1cb33d1f20f1\\Psr\\Container\\ContainerExceptionInterface' => $vendorDir . '/psr/container/src/ContainerExceptionInterface.php', '_HumbugBox1cb33d1f20f1\\Psr\\Container\\ContainerInterface' => $vendorDir . '/psr/container/src/ContainerInterface.php', '_HumbugBox1cb33d1f20f1\\Psr\\Container\\NotFoundExceptionInterface' => $vendorDir . '/psr/container/src/NotFoundExceptionInterface.php', '_HumbugBox1cb33d1f20f1\\Psr\\Log\\AbstractLogger' => $vendorDir . '/psr/log/Psr/Log/AbstractLogger.php', '_HumbugBox1cb33d1f20f1\\Psr\\Log\\InvalidArgumentException' => $vendorDir . '/psr/log/Psr/Log/InvalidArgumentException.php', '_HumbugBox1cb33d1f20f1\\Psr\\Log\\LogLevel' => $vendorDir . '/psr/log/Psr/Log/LogLevel.php', '_HumbugBox1cb33d1f20f1\\Psr\\Log\\LoggerAwareInterface' => $vendorDir . '/psr/log/Psr/Log/LoggerAwareInterface.php', '_HumbugBox1cb33d1f20f1\\Psr\\Log\\LoggerAwareTrait' => $vendorDir . '/psr/log/Psr/Log/LoggerAwareTrait.php', '_HumbugBox1cb33d1f20f1\\Psr\\Log\\LoggerInterface' => $vendorDir . '/psr/log/Psr/Log/LoggerInterface.php', '_HumbugBox1cb33d1f20f1\\Psr\\Log\\LoggerTrait' => $vendorDir . '/psr/log/Psr/Log/LoggerTrait.php', '_HumbugBox1cb33d1f20f1\\Psr\\Log\\NullLogger' => $vendorDir . '/psr/log/Psr/Log/NullLogger.php', '_HumbugBox1cb33d1f20f1\\SebastianBergmann\\Diff\\Chunk' => $vendorDir . '/sebastian/diff/src/Chunk.php', '_HumbugBox1cb33d1f20f1\\SebastianBergmann\\Diff\\ConfigurationException' => $vendorDir . '/sebastian/diff/src/Exception/ConfigurationException.php', '_HumbugBox1cb33d1f20f1\\SebastianBergmann\\Diff\\Diff' => $vendorDir . '/sebastian/diff/src/Diff.php', '_HumbugBox1cb33d1f20f1\\SebastianBergmann\\Diff\\Differ' => $vendorDir . '/sebastian/diff/src/Differ.php', '_HumbugBox1cb33d1f20f1\\SebastianBergmann\\Diff\\Exception' => $vendorDir . '/sebastian/diff/src/Exception/Exception.php', '_HumbugBox1cb33d1f20f1\\SebastianBergmann\\Diff\\InvalidArgumentException' => $vendorDir . '/sebastian/diff/src/Exception/InvalidArgumentException.php', '_HumbugBox1cb33d1f20f1\\SebastianBergmann\\Diff\\Line' => $vendorDir . '/sebastian/diff/src/Line.php', '_HumbugBox1cb33d1f20f1\\SebastianBergmann\\Diff\\LongestCommonSubsequenceCalculator' => $vendorDir . '/sebastian/diff/src/LongestCommonSubsequenceCalculator.php', '_HumbugBox1cb33d1f20f1\\SebastianBergmann\\Diff\\MemoryEfficientLongestCommonSubsequenceCalculator' => $vendorDir . '/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php', '_HumbugBox1cb33d1f20f1\\SebastianBergmann\\Diff\\Output\\AbstractChunkOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php', '_HumbugBox1cb33d1f20f1\\SebastianBergmann\\Diff\\Output\\DiffOnlyOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php', '_HumbugBox1cb33d1f20f1\\SebastianBergmann\\Diff\\Output\\DiffOutputBuilderInterface' => $vendorDir . '/sebastian/diff/src/Output/DiffOutputBuilderInterface.php', '_HumbugBox1cb33d1f20f1\\SebastianBergmann\\Diff\\Output\\StrictUnifiedDiffOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php', '_HumbugBox1cb33d1f20f1\\SebastianBergmann\\Diff\\Output\\UnifiedDiffOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php', '_HumbugBox1cb33d1f20f1\\SebastianBergmann\\Diff\\Parser' => $vendorDir . '/sebastian/diff/src/Parser.php', '_HumbugBox1cb33d1f20f1\\SebastianBergmann\\Diff\\TimeEfficientLongestCommonSubsequenceCalculator' => $vendorDir . '/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php', '_HumbugBox1cb33d1f20f1\\Spatie\\ArrayToXml\\ArrayToXml' => $vendorDir . '/spatie/array-to-xml/src/ArrayToXml.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Application' => $vendorDir . '/symfony/console/Application.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Attribute\\AsCommand' => $vendorDir . '/symfony/console/Attribute/AsCommand.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\CI\\GithubActionReporter' => $vendorDir . '/symfony/console/CI/GithubActionReporter.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Color' => $vendorDir . '/symfony/console/Color.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\CommandLoader\\CommandLoaderInterface' => $vendorDir . '/symfony/console/CommandLoader/CommandLoaderInterface.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\CommandLoader\\ContainerCommandLoader' => $vendorDir . '/symfony/console/CommandLoader/ContainerCommandLoader.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\CommandLoader\\FactoryCommandLoader' => $vendorDir . '/symfony/console/CommandLoader/FactoryCommandLoader.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Command\\Command' => $vendorDir . '/symfony/console/Command/Command.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Command\\CompleteCommand' => $vendorDir . '/symfony/console/Command/CompleteCommand.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Command\\DumpCompletionCommand' => $vendorDir . '/symfony/console/Command/DumpCompletionCommand.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Command\\HelpCommand' => $vendorDir . '/symfony/console/Command/HelpCommand.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Command\\LazyCommand' => $vendorDir . '/symfony/console/Command/LazyCommand.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Command\\ListCommand' => $vendorDir . '/symfony/console/Command/ListCommand.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Command\\LockableTrait' => $vendorDir . '/symfony/console/Command/LockableTrait.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Command\\SignalableCommandInterface' => $vendorDir . '/symfony/console/Command/SignalableCommandInterface.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Completion\\CompletionInput' => $vendorDir . '/symfony/console/Completion/CompletionInput.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Completion\\CompletionSuggestions' => $vendorDir . '/symfony/console/Completion/CompletionSuggestions.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Completion\\Output\\BashCompletionOutput' => $vendorDir . '/symfony/console/Completion/Output/BashCompletionOutput.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Completion\\Output\\CompletionOutputInterface' => $vendorDir . '/symfony/console/Completion/Output/CompletionOutputInterface.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Completion\\Suggestion' => $vendorDir . '/symfony/console/Completion/Suggestion.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\ConsoleEvents' => $vendorDir . '/symfony/console/ConsoleEvents.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Cursor' => $vendorDir . '/symfony/console/Cursor.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\DependencyInjection\\AddConsoleCommandPass' => $vendorDir . '/symfony/console/DependencyInjection/AddConsoleCommandPass.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Descriptor\\ApplicationDescription' => $vendorDir . '/symfony/console/Descriptor/ApplicationDescription.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Descriptor\\Descriptor' => $vendorDir . '/symfony/console/Descriptor/Descriptor.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Descriptor\\DescriptorInterface' => $vendorDir . '/symfony/console/Descriptor/DescriptorInterface.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Descriptor\\JsonDescriptor' => $vendorDir . '/symfony/console/Descriptor/JsonDescriptor.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Descriptor\\MarkdownDescriptor' => $vendorDir . '/symfony/console/Descriptor/MarkdownDescriptor.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Descriptor\\TextDescriptor' => $vendorDir . '/symfony/console/Descriptor/TextDescriptor.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Descriptor\\XmlDescriptor' => $vendorDir . '/symfony/console/Descriptor/XmlDescriptor.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\EventListener\\ErrorListener' => $vendorDir . '/symfony/console/EventListener/ErrorListener.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Event\\ConsoleCommandEvent' => $vendorDir . '/symfony/console/Event/ConsoleCommandEvent.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Event\\ConsoleErrorEvent' => $vendorDir . '/symfony/console/Event/ConsoleErrorEvent.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Event\\ConsoleEvent' => $vendorDir . '/symfony/console/Event/ConsoleEvent.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Event\\ConsoleSignalEvent' => $vendorDir . '/symfony/console/Event/ConsoleSignalEvent.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Event\\ConsoleTerminateEvent' => $vendorDir . '/symfony/console/Event/ConsoleTerminateEvent.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Exception\\CommandNotFoundException' => $vendorDir . '/symfony/console/Exception/CommandNotFoundException.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/console/Exception/ExceptionInterface.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/console/Exception/InvalidArgumentException.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Exception\\InvalidOptionException' => $vendorDir . '/symfony/console/Exception/InvalidOptionException.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Exception\\LogicException' => $vendorDir . '/symfony/console/Exception/LogicException.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Exception\\MissingInputException' => $vendorDir . '/symfony/console/Exception/MissingInputException.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Exception\\NamespaceNotFoundException' => $vendorDir . '/symfony/console/Exception/NamespaceNotFoundException.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Exception\\RuntimeException' => $vendorDir . '/symfony/console/Exception/RuntimeException.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Formatter\\NullOutputFormatter' => $vendorDir . '/symfony/console/Formatter/NullOutputFormatter.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Formatter\\NullOutputFormatterStyle' => $vendorDir . '/symfony/console/Formatter/NullOutputFormatterStyle.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Formatter\\OutputFormatter' => $vendorDir . '/symfony/console/Formatter/OutputFormatter.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Formatter\\OutputFormatterInterface' => $vendorDir . '/symfony/console/Formatter/OutputFormatterInterface.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Formatter\\OutputFormatterStyle' => $vendorDir . '/symfony/console/Formatter/OutputFormatterStyle.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleInterface' => $vendorDir . '/symfony/console/Formatter/OutputFormatterStyleInterface.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleStack' => $vendorDir . '/symfony/console/Formatter/OutputFormatterStyleStack.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Formatter\\WrappableOutputFormatterInterface' => $vendorDir . '/symfony/console/Formatter/WrappableOutputFormatterInterface.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Helper\\DebugFormatterHelper' => $vendorDir . '/symfony/console/Helper/DebugFormatterHelper.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Helper\\DescriptorHelper' => $vendorDir . '/symfony/console/Helper/DescriptorHelper.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Helper\\Dumper' => $vendorDir . '/symfony/console/Helper/Dumper.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Helper\\FormatterHelper' => $vendorDir . '/symfony/console/Helper/FormatterHelper.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Helper\\Helper' => $vendorDir . '/symfony/console/Helper/Helper.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Helper\\HelperInterface' => $vendorDir . '/symfony/console/Helper/HelperInterface.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Helper\\HelperSet' => $vendorDir . '/symfony/console/Helper/HelperSet.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Helper\\InputAwareHelper' => $vendorDir . '/symfony/console/Helper/InputAwareHelper.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Helper\\ProcessHelper' => $vendorDir . '/symfony/console/Helper/ProcessHelper.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Helper\\ProgressBar' => $vendorDir . '/symfony/console/Helper/ProgressBar.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Helper\\ProgressIndicator' => $vendorDir . '/symfony/console/Helper/ProgressIndicator.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Helper\\QuestionHelper' => $vendorDir . '/symfony/console/Helper/QuestionHelper.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Helper\\SymfonyQuestionHelper' => $vendorDir . '/symfony/console/Helper/SymfonyQuestionHelper.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Helper\\Table' => $vendorDir . '/symfony/console/Helper/Table.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Helper\\TableCell' => $vendorDir . '/symfony/console/Helper/TableCell.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Helper\\TableCellStyle' => $vendorDir . '/symfony/console/Helper/TableCellStyle.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Helper\\TableRows' => $vendorDir . '/symfony/console/Helper/TableRows.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Helper\\TableSeparator' => $vendorDir . '/symfony/console/Helper/TableSeparator.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Helper\\TableStyle' => $vendorDir . '/symfony/console/Helper/TableStyle.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Input\\ArgvInput' => $vendorDir . '/symfony/console/Input/ArgvInput.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Input\\ArrayInput' => $vendorDir . '/symfony/console/Input/ArrayInput.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Input\\Input' => $vendorDir . '/symfony/console/Input/Input.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Input\\InputArgument' => $vendorDir . '/symfony/console/Input/InputArgument.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Input\\InputAwareInterface' => $vendorDir . '/symfony/console/Input/InputAwareInterface.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Input\\InputDefinition' => $vendorDir . '/symfony/console/Input/InputDefinition.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Input\\InputInterface' => $vendorDir . '/symfony/console/Input/InputInterface.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Input\\InputOption' => $vendorDir . '/symfony/console/Input/InputOption.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Input\\StreamableInputInterface' => $vendorDir . '/symfony/console/Input/StreamableInputInterface.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Input\\StringInput' => $vendorDir . '/symfony/console/Input/StringInput.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Logger\\ConsoleLogger' => $vendorDir . '/symfony/console/Logger/ConsoleLogger.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Output\\BufferedOutput' => $vendorDir . '/symfony/console/Output/BufferedOutput.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Output\\ConsoleOutput' => $vendorDir . '/symfony/console/Output/ConsoleOutput.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Output\\ConsoleOutputInterface' => $vendorDir . '/symfony/console/Output/ConsoleOutputInterface.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Output\\ConsoleSectionOutput' => $vendorDir . '/symfony/console/Output/ConsoleSectionOutput.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Output\\NullOutput' => $vendorDir . '/symfony/console/Output/NullOutput.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Output\\Output' => $vendorDir . '/symfony/console/Output/Output.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Output\\OutputInterface' => $vendorDir . '/symfony/console/Output/OutputInterface.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Output\\StreamOutput' => $vendorDir . '/symfony/console/Output/StreamOutput.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Output\\TrimmedBufferOutput' => $vendorDir . '/symfony/console/Output/TrimmedBufferOutput.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Question\\ChoiceQuestion' => $vendorDir . '/symfony/console/Question/ChoiceQuestion.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Question\\ConfirmationQuestion' => $vendorDir . '/symfony/console/Question/ConfirmationQuestion.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Question\\Question' => $vendorDir . '/symfony/console/Question/Question.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\SignalRegistry\\SignalRegistry' => $vendorDir . '/symfony/console/SignalRegistry/SignalRegistry.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\SingleCommandApplication' => $vendorDir . '/symfony/console/SingleCommandApplication.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Style\\OutputStyle' => $vendorDir . '/symfony/console/Style/OutputStyle.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Style\\StyleInterface' => $vendorDir . '/symfony/console/Style/StyleInterface.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Style\\SymfonyStyle' => $vendorDir . '/symfony/console/Style/SymfonyStyle.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Terminal' => $vendorDir . '/symfony/console/Terminal.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Tester\\ApplicationTester' => $vendorDir . '/symfony/console/Tester/ApplicationTester.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Tester\\CommandCompletionTester' => $vendorDir . '/symfony/console/Tester/CommandCompletionTester.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Tester\\CommandTester' => $vendorDir . '/symfony/console/Tester/CommandTester.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Tester\\Constraint\\CommandIsSuccessful' => $vendorDir . '/symfony/console/Tester/Constraint/CommandIsSuccessful.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Tester\\TesterTrait' => $vendorDir . '/symfony/console/Tester/TesterTrait.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Filesystem\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/filesystem/Exception/ExceptionInterface.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Filesystem\\Exception\\FileNotFoundException' => $vendorDir . '/symfony/filesystem/Exception/FileNotFoundException.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Filesystem\\Exception\\IOException' => $vendorDir . '/symfony/filesystem/Exception/IOException.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Filesystem\\Exception\\IOExceptionInterface' => $vendorDir . '/symfony/filesystem/Exception/IOExceptionInterface.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Filesystem\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/filesystem/Exception/InvalidArgumentException.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Filesystem\\Exception\\RuntimeException' => $vendorDir . '/symfony/filesystem/Exception/RuntimeException.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Filesystem\\Filesystem' => $vendorDir . '/symfony/filesystem/Filesystem.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Filesystem\\Path' => $vendorDir . '/symfony/filesystem/Path.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\String\\AbstractString' => $vendorDir . '/symfony/string/AbstractString.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\String\\AbstractUnicodeString' => $vendorDir . '/symfony/string/AbstractUnicodeString.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\String\\ByteString' => $vendorDir . '/symfony/string/ByteString.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\String\\CodePointString' => $vendorDir . '/symfony/string/CodePointString.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\String\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/string/Exception/ExceptionInterface.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\String\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/string/Exception/InvalidArgumentException.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\String\\Exception\\RuntimeException' => $vendorDir . '/symfony/string/Exception/RuntimeException.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\String\\Inflector\\EnglishInflector' => $vendorDir . '/symfony/string/Inflector/EnglishInflector.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\String\\Inflector\\FrenchInflector' => $vendorDir . '/symfony/string/Inflector/FrenchInflector.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\String\\Inflector\\InflectorInterface' => $vendorDir . '/symfony/string/Inflector/InflectorInterface.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\String\\LazyString' => $vendorDir . '/symfony/string/LazyString.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\String\\Slugger\\AsciiSlugger' => $vendorDir . '/symfony/string/Slugger/AsciiSlugger.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\String\\Slugger\\SluggerInterface' => $vendorDir . '/symfony/string/Slugger/SluggerInterface.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\String\\UnicodeString' => $vendorDir . '/symfony/string/UnicodeString.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Contracts\\Service\\Attribute\\Required' => $vendorDir . '/symfony/service-contracts/Attribute/Required.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Contracts\\Service\\Attribute\\SubscribedService' => $vendorDir . '/symfony/service-contracts/Attribute/SubscribedService.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Contracts\\Service\\ResetInterface' => $vendorDir . '/symfony/service-contracts/ResetInterface.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Contracts\\Service\\ServiceLocatorTrait' => $vendorDir . '/symfony/service-contracts/ServiceLocatorTrait.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Contracts\\Service\\ServiceProviderInterface' => $vendorDir . '/symfony/service-contracts/ServiceProviderInterface.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Contracts\\Service\\ServiceSubscriberInterface' => $vendorDir . '/symfony/service-contracts/ServiceSubscriberInterface.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Contracts\\Service\\ServiceSubscriberTrait' => $vendorDir . '/symfony/service-contracts/ServiceSubscriberTrait.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Polyfill\\Ctype\\Ctype' => $vendorDir . '/symfony/polyfill-ctype/Ctype.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Polyfill\\Intl\\Grapheme\\Grapheme' => $vendorDir . '/symfony/polyfill-intl-grapheme/Grapheme.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Polyfill\\Intl\\Normalizer\\Normalizer' => $vendorDir . '/symfony/polyfill-intl-normalizer/Normalizer.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Polyfill\\Mbstring\\Mbstring' => $vendorDir . '/symfony/polyfill-mbstring/Mbstring.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Polyfill\\Php73\\Php73' => $vendorDir . '/symfony/polyfill-php73/Php73.php', '_HumbugBox1cb33d1f20f1\\UnhandledMatchError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php', '_HumbugBox1cb33d1f20f1\\ValueError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/ValueError.php', '_HumbugBox1cb33d1f20f1\\Webmozart\\Assert\\Assert' => $vendorDir . '/webmozart/assert/src/Assert.php', '_HumbugBox1cb33d1f20f1\\Webmozart\\Assert\\InvalidArgumentException' => $vendorDir . '/webmozart/assert/src/InvalidArgumentException.php', '_HumbugBox1cb33d1f20f1\\Webmozart\\Assert\\Mixin' => $vendorDir . '/webmozart/assert/src/Mixin.php', '_HumbugBox1cb33d1f20f1\\XdgBaseDir\\Xdg' => $vendorDir . '/dnoegel/php-xdg-base-dir/src/Xdg.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlockFactory' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlockFactory.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlockFactoryInterface' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlockFactoryInterface.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Description' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Description.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\DescriptionFactory' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\ExampleFinder' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Serializer' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\StandardTagFactory' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/StandardTagFactory.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tag' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tag.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\TagFactory' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/TagFactory.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Author' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Author.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tags\\BaseTag' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/BaseTag.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Covers' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Covers.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Deprecated' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Deprecated.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Example' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Example.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Factory\\StaticMethod' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/StaticMethod.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Formatter' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Formatter\\AlignFormatter' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/AlignFormatter.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Formatter\\PassthroughFormatter' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/PassthroughFormatter.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Generic' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Generic.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tags\\InvalidTag' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/InvalidTag.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Link' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Link.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Method' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Param' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Property' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tags\\PropertyRead' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tags\\PropertyWrite' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Reference\\Fqsen' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Fqsen.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Reference\\Reference' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Reference.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Reference\\Url' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Url.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Return_' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tags\\See' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/See.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Since' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Since.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Source' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Source.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tags\\TagWithType' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/TagWithType.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Throws' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Throws.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Uses' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Uses.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Var_' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Version' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Version.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Element' => $vendorDir . '/phpdocumentor/reflection-common/src/Element.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Exception\\PcreException' => $vendorDir . '/phpdocumentor/reflection-docblock/src/Exception/PcreException.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\File' => $vendorDir . '/phpdocumentor/reflection-common/src/File.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Fqsen' => $vendorDir . '/phpdocumentor/reflection-common/src/Fqsen.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\FqsenResolver' => $vendorDir . '/phpdocumentor/type-resolver/src/FqsenResolver.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Location' => $vendorDir . '/phpdocumentor/reflection-common/src/Location.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Project' => $vendorDir . '/phpdocumentor/reflection-common/src/Project.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\ProjectFactory' => $vendorDir . '/phpdocumentor/reflection-common/src/ProjectFactory.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\PseudoType' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoType.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\PseudoTypes\\CallableString' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/CallableString.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\PseudoTypes\\False_' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/False_.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\PseudoTypes\\HtmlEscapedString' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/HtmlEscapedString.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\PseudoTypes\\IntegerRange' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/IntegerRange.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\PseudoTypes\\List_' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/List_.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\PseudoTypes\\LiteralString' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/LiteralString.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\PseudoTypes\\LowercaseString' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/LowercaseString.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\PseudoTypes\\NegativeInteger' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/NegativeInteger.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\PseudoTypes\\NonEmptyLowercaseString' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/NonEmptyLowercaseString.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\PseudoTypes\\NonEmptyString' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/NonEmptyString.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\PseudoTypes\\NumericString' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/NumericString.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\PseudoTypes\\Numeric_' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/Numeric_.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\PseudoTypes\\PositiveInteger' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/PositiveInteger.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\PseudoTypes\\TraitString' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/TraitString.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\PseudoTypes\\True_' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/True_.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Type' => $vendorDir . '/phpdocumentor/type-resolver/src/Type.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\TypeResolver' => $vendorDir . '/phpdocumentor/type-resolver/src/TypeResolver.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\AbstractList' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/AbstractList.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\AggregatedType' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/AggregatedType.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\ArrayKey' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/ArrayKey.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\Array_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Array_.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\Boolean' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Boolean.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\Callable_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Callable_.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\ClassString' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/ClassString.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\Collection' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Collection.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\Compound' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Compound.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\Context' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Context.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\ContextFactory' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/ContextFactory.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\Expression' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Expression.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\Float_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Float_.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\Integer' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Integer.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\InterfaceString' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/InterfaceString.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\Intersection' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Intersection.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\Iterable_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Iterable_.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\Mixed_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Mixed_.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\Never_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Never_.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\Null_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Null_.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\Nullable' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Nullable.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\Object_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Object_.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\Parent_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Parent_.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\Resource_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Resource_.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\Scalar' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Scalar.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\Self_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Self_.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\Static_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Static_.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\String_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/String_.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\This' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/This.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\Void_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Void_.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Utils' => $vendorDir . '/phpdocumentor/reflection-docblock/src/Utils.php', ); array('name' => 'vimeo/psalm', 'pretty_version' => '5.6.0', 'version' => '5.6.0.0', 'reference' => 'e784128902dfe01d489c4123d69918a9f3c1eac5', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), 'dev' => \true), 'versions' => array('amphp/amp' => array('pretty_version' => 'v2.6.2', 'version' => '2.6.2.0', 'reference' => '9d5100cebffa729aaffecd3ad25dc5aeea4f13bb', 'type' => 'library', 'install_path' => __DIR__ . '/../amphp/amp', 'aliases' => array(), 'dev_requirement' => \false), 'amphp/byte-stream' => array('pretty_version' => 'v1.8.1', 'version' => '1.8.1.0', 'reference' => 'acbd8002b3536485c997c4e019206b3f10ca15bd', 'type' => 'library', 'install_path' => __DIR__ . '/../amphp/byte-stream', 'aliases' => array(), 'dev_requirement' => \false), 'bamarni/composer-bin-plugin' => array('pretty_version' => '1.8.2', 'version' => '1.8.2.0', 'reference' => '92fd7b1e6e9cdae19b0d57369d8ad31a37b6a880', 'type' => 'composer-plugin', 'install_path' => __DIR__ . '/../bamarni/composer-bin-plugin', 'aliases' => array(), 'dev_requirement' => \true), 'brianium/paratest' => array('pretty_version' => 'v6.8.1', 'version' => '6.8.1.0', 'reference' => '168c1cfdf79e5b19b57cb03060fc9a6a79c5f582', 'type' => 'library', 'install_path' => __DIR__ . '/../brianium/paratest', 'aliases' => array(), 'dev_requirement' => \true), 'composer/package-versions-deprecated' => array('pretty_version' => '1.11.99.5', 'version' => '1.11.99.5', 'reference' => 'b4f54f74ef3453349c24a845d22392cd31e65f1d', 'type' => 'composer-plugin', 'install_path' => __DIR__ . '/./package-versions-deprecated', 'aliases' => array(), 'dev_requirement' => \false), 'composer/pcre' => array('pretty_version' => '3.1.0', 'version' => '3.1.0.0', 'reference' => '4bff79ddd77851fe3cdd11616ed3f92841ba5bd2', 'type' => 'library', 'install_path' => __DIR__ . '/./pcre', 'aliases' => array(), 'dev_requirement' => \false), 'composer/semver' => array('pretty_version' => '3.3.2', 'version' => '3.3.2.0', 'reference' => '3953f23262f2bff1919fc82183ad9acb13ff62c9', 'type' => 'library', 'install_path' => __DIR__ . '/./semver', 'aliases' => array(), 'dev_requirement' => \false), 'composer/xdebug-handler' => array('pretty_version' => '3.0.3', 'version' => '3.0.3.0', 'reference' => 'ced299686f41dce890debac69273b47ffe98a40c', 'type' => 'library', 'install_path' => __DIR__ . '/./xdebug-handler', 'aliases' => array(), 'dev_requirement' => \false), 'cordoval/hamcrest-php' => array('dev_requirement' => \true, 'replaced' => array(0 => '*')), 'davedevelopment/hamcrest-php' => array('dev_requirement' => \true, 'replaced' => array(0 => '*')), 'dealerdirect/phpcodesniffer-composer-installer' => array('pretty_version' => 'v1.0.0', 'version' => '1.0.0.0', 'reference' => '4be43904336affa5c2f70744a348312336afd0da', 'type' => 'composer-plugin', 'install_path' => __DIR__ . '/../dealerdirect/phpcodesniffer-composer-installer', 'aliases' => array(), 'dev_requirement' => \true), 'dg/bypass-finals' => array('pretty_version' => 'v1.4.1', 'version' => '1.4.1.0', 'reference' => '4c424c3ed359220fce044f35cdf9f48b0089b2ca', 'type' => 'library', 'install_path' => __DIR__ . '/../dg/bypass-finals', 'aliases' => array(), 'dev_requirement' => \true), 'dnoegel/php-xdg-base-dir' => array('pretty_version' => 'v0.1.1', 'version' => '0.1.1.0', 'reference' => '8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd', 'type' => 'library', 'install_path' => __DIR__ . '/../dnoegel/php-xdg-base-dir', 'aliases' => array(), 'dev_requirement' => \false), 'doctrine/instantiator' => array('pretty_version' => '1.5.0', 'version' => '1.5.0.0', 'reference' => '0a0fa9780f5d4e507415a065172d26a98d02047b', 'type' => 'library', 'install_path' => __DIR__ . '/../doctrine/instantiator', 'aliases' => array(), 'dev_requirement' => \true), 'felixfbecker/advanced-json-rpc' => array('pretty_version' => 'v3.2.1', 'version' => '3.2.1.0', 'reference' => 'b5f37dbff9a8ad360ca341f3240dc1c168b45447', 'type' => 'library', 'install_path' => __DIR__ . '/../felixfbecker/advanced-json-rpc', 'aliases' => array(), 'dev_requirement' => \false), 'felixfbecker/language-server-protocol' => array('pretty_version' => 'v1.5.2', 'version' => '1.5.2.0', 'reference' => '6e82196ffd7c62f7794d778ca52b69feec9f2842', 'type' => 'library', 'install_path' => __DIR__ . '/../felixfbecker/language-server-protocol', 'aliases' => array(), 'dev_requirement' => \false), 'fidry/cpu-core-counter' => array('pretty_version' => '0.4.1', 'version' => '0.4.1.0', 'reference' => '79261cc280aded96d098e1b0e0ba0c4881b432c2', 'type' => 'library', 'install_path' => __DIR__ . '/../fidry/cpu-core-counter', 'aliases' => array(), 'dev_requirement' => \false), 'grogy/php-parallel-lint' => array('dev_requirement' => \true, 'replaced' => array(0 => '*')), 'hamcrest/hamcrest-php' => array('pretty_version' => 'v2.0.1', 'version' => '2.0.1.0', 'reference' => '8c3d0a3f6af734494ad8f6fbbee0ba92422859f3', 'type' => 'library', 'install_path' => __DIR__ . '/../hamcrest/hamcrest-php', 'aliases' => array(), 'dev_requirement' => \true), 'jakub-onderka/php-parallel-lint' => array('dev_requirement' => \true, 'replaced' => array(0 => '*')), 'jean85/pretty-package-versions' => array('pretty_version' => '2.0.5', 'version' => '2.0.5.0', 'reference' => 'ae547e455a3d8babd07b96966b17d7fd21d9c6af', 'type' => 'library', 'install_path' => __DIR__ . '/../jean85/pretty-package-versions', 'aliases' => array(), 'dev_requirement' => \true), 'kodova/hamcrest-php' => array('dev_requirement' => \true, 'replaced' => array(0 => '*')), 'mockery/mockery' => array('pretty_version' => '1.5.1', 'version' => '1.5.1.0', 'reference' => 'e92dcc83d5a51851baf5f5591d32cb2b16e3684e', 'type' => 'library', 'install_path' => __DIR__ . '/../mockery/mockery', 'aliases' => array(), 'dev_requirement' => \true), 'myclabs/deep-copy' => array('pretty_version' => '1.11.0', 'version' => '1.11.0.0', 'reference' => '14daed4296fae74d9e3201d2c4925d1acb7aa614', 'type' => 'library', 'install_path' => __DIR__ . '/../myclabs/deep-copy', 'aliases' => array(), 'dev_requirement' => \true), 'netresearch/jsonmapper' => array('pretty_version' => 'v4.1.0', 'version' => '4.1.0.0', 'reference' => 'cfa81ea1d35294d64adb9c68aa4cb9e92400e53f', 'type' => 'library', 'install_path' => __DIR__ . '/../netresearch/jsonmapper', 'aliases' => array(), 'dev_requirement' => \false), 'nikic/php-parser' => array('pretty_version' => 'v4.15.3', 'version' => '4.15.3.0', 'reference' => '570e980a201d8ed0236b0a62ddf2c9cbb2034039', 'type' => 'library', 'install_path' => __DIR__ . '/../nikic/php-parser', 'aliases' => array(), 'dev_requirement' => \false), 'nunomaduro/mock-final-classes' => array('pretty_version' => 'v1.1.0', 'version' => '1.1.0.0', 'reference' => '5d113210c085ac13a8e1225f8b6f390c797a98f0', 'type' => 'library', 'install_path' => __DIR__ . '/../nunomaduro/mock-final-classes', 'aliases' => array(), 'dev_requirement' => \true), 'ocramius/package-versions' => array('dev_requirement' => \false, 'replaced' => array(0 => '1.11.99')), 'phar-io/manifest' => array('pretty_version' => '2.0.3', 'version' => '2.0.3.0', 'reference' => '97803eca37d319dfa7826cc2437fc020857acb53', 'type' => 'library', 'install_path' => __DIR__ . '/../phar-io/manifest', 'aliases' => array(), 'dev_requirement' => \true), 'phar-io/version' => array('pretty_version' => '3.2.1', 'version' => '3.2.1.0', 'reference' => '4f7fd7836c6f332bb2933569e566a0d6c4cbed74', 'type' => 'library', 'install_path' => __DIR__ . '/../phar-io/version', 'aliases' => array(), 'dev_requirement' => \true), 'php-parallel-lint/php-parallel-lint' => array('pretty_version' => 'v1.3.2', 'version' => '1.3.2.0', 'reference' => '6483c9832e71973ed29cf71bd6b3f4fde438a9de', 'type' => 'library', 'install_path' => __DIR__ . '/../php-parallel-lint/php-parallel-lint', 'aliases' => array(), 'dev_requirement' => \true), 'phpdocumentor/reflection-common' => array('pretty_version' => '2.2.0', 'version' => '2.2.0.0', 'reference' => '1d01c49d4ed62f25aa84a747ad35d5a16924662b', 'type' => 'library', 'install_path' => __DIR__ . '/../phpdocumentor/reflection-common', 'aliases' => array(), 'dev_requirement' => \false), 'phpdocumentor/reflection-docblock' => array('pretty_version' => '5.3.0', 'version' => '5.3.0.0', 'reference' => '622548b623e81ca6d78b721c5e029f4ce664f170', 'type' => 'library', 'install_path' => __DIR__ . '/../phpdocumentor/reflection-docblock', 'aliases' => array(), 'dev_requirement' => \false), 'phpdocumentor/type-resolver' => array('pretty_version' => '1.6.2', 'version' => '1.6.2.0', 'reference' => '48f445a408c131e38cab1c235aa6d2bb7a0bb20d', 'type' => 'library', 'install_path' => __DIR__ . '/../phpdocumentor/type-resolver', 'aliases' => array(), 'dev_requirement' => \false), 'phpstan/phpdoc-parser' => array('pretty_version' => '1.15.3', 'version' => '1.15.3.0', 'reference' => '61800f71a5526081d1b5633766aa88341f1ade76', 'type' => 'library', 'install_path' => __DIR__ . '/../phpstan/phpdoc-parser', 'aliases' => array(), 'dev_requirement' => \true), 'phpunit/php-code-coverage' => array('pretty_version' => '9.2.23', 'version' => '9.2.23.0', 'reference' => '9f1f0f9a2fbb680b26d1cf9b61b6eac43a6e4e9c', 'type' => 'library', 'install_path' => __DIR__ . '/../phpunit/php-code-coverage', 'aliases' => array(), 'dev_requirement' => \true), 'phpunit/php-file-iterator' => array('pretty_version' => '3.0.6', 'version' => '3.0.6.0', 'reference' => 'cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf', 'type' => 'library', 'install_path' => __DIR__ . '/../phpunit/php-file-iterator', 'aliases' => array(), 'dev_requirement' => \true), 'phpunit/php-invoker' => array('pretty_version' => '3.1.1', 'version' => '3.1.1.0', 'reference' => '5a10147d0aaf65b58940a0b72f71c9ac0423cc67', 'type' => 'library', 'install_path' => __DIR__ . '/../phpunit/php-invoker', 'aliases' => array(), 'dev_requirement' => \true), 'phpunit/php-text-template' => array('pretty_version' => '2.0.4', 'version' => '2.0.4.0', 'reference' => '5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28', 'type' => 'library', 'install_path' => __DIR__ . '/../phpunit/php-text-template', 'aliases' => array(), 'dev_requirement' => \true), 'phpunit/php-timer' => array('pretty_version' => '5.0.3', 'version' => '5.0.3.0', 'reference' => '5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2', 'type' => 'library', 'install_path' => __DIR__ . '/../phpunit/php-timer', 'aliases' => array(), 'dev_requirement' => \true), 'phpunit/phpunit' => array('pretty_version' => '9.5.28', 'version' => '9.5.28.0', 'reference' => '954ca3113a03bf780d22f07bf055d883ee04b65e', 'type' => 'library', 'install_path' => __DIR__ . '/../phpunit/phpunit', 'aliases' => array(), 'dev_requirement' => \true), 'psalm/plugin-mockery' => array('pretty_version' => '1.1.0', 'version' => '1.1.0.0', 'reference' => '876247d15f91df08240d00dac69c5135b6689283', 'type' => 'psalm-plugin', 'install_path' => __DIR__ . '/../psalm/plugin-mockery', 'aliases' => array(), 'dev_requirement' => \true), 'psalm/plugin-phpunit' => array('pretty_version' => '0.18.4', 'version' => '0.18.4.0', 'reference' => 'e4ab3096653d9eb6f6d0ea5f4461898d59ae4dbc', 'type' => 'psalm-plugin', 'install_path' => __DIR__ . '/../psalm/plugin-phpunit', 'aliases' => array(), 'dev_requirement' => \true), 'psalm/psalm' => array('dev_requirement' => \false, 'provided' => array(0 => '5.6.0')), 'psr/container' => array('pretty_version' => '1.1.2', 'version' => '1.1.2.0', 'reference' => '513e0666f7216c7459170d56df27dfcefe1689ea', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/container', 'aliases' => array(), 'dev_requirement' => \false), 'psr/log' => array('pretty_version' => '1.1.4', 'version' => '1.1.4.0', 'reference' => 'd49695b909c3b7628b6289db5479a1c204601f11', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/log', 'aliases' => array(), 'dev_requirement' => \false), 'psr/log-implementation' => array('dev_requirement' => \false, 'provided' => array(0 => '1.0|2.0')), 'sebastian/cli-parser' => array('pretty_version' => '1.0.1', 'version' => '1.0.1.0', 'reference' => '442e7c7e687e42adc03470c7b668bc4b2402c0b2', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/cli-parser', 'aliases' => array(), 'dev_requirement' => \true), 'sebastian/code-unit' => array('pretty_version' => '1.0.8', 'version' => '1.0.8.0', 'reference' => '1fc9f64c0927627ef78ba436c9b17d967e68e120', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/code-unit', 'aliases' => array(), 'dev_requirement' => \true), 'sebastian/code-unit-reverse-lookup' => array('pretty_version' => '2.0.3', 'version' => '2.0.3.0', 'reference' => 'ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/code-unit-reverse-lookup', 'aliases' => array(), 'dev_requirement' => \true), 'sebastian/comparator' => array('pretty_version' => '4.0.8', 'version' => '4.0.8.0', 'reference' => 'fa0f136dd2334583309d32b62544682ee972b51a', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/comparator', 'aliases' => array(), 'dev_requirement' => \true), 'sebastian/complexity' => array('pretty_version' => '2.0.2', 'version' => '2.0.2.0', 'reference' => '739b35e53379900cc9ac327b2147867b8b6efd88', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/complexity', 'aliases' => array(), 'dev_requirement' => \true), 'sebastian/diff' => array('pretty_version' => '4.0.4', 'version' => '4.0.4.0', 'reference' => '3461e3fccc7cfdfc2720be910d3bd73c69be590d', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/diff', 'aliases' => array(), 'dev_requirement' => \false), 'sebastian/environment' => array('pretty_version' => '5.1.4', 'version' => '5.1.4.0', 'reference' => '1b5dff7bb151a4db11d49d90e5408e4e938270f7', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/environment', 'aliases' => array(), 'dev_requirement' => \true), 'sebastian/exporter' => array('pretty_version' => '4.0.5', 'version' => '4.0.5.0', 'reference' => 'ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/exporter', 'aliases' => array(), 'dev_requirement' => \true), 'sebastian/global-state' => array('pretty_version' => '5.0.5', 'version' => '5.0.5.0', 'reference' => '0ca8db5a5fc9c8646244e629625ac486fa286bf2', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/global-state', 'aliases' => array(), 'dev_requirement' => \true), 'sebastian/lines-of-code' => array('pretty_version' => '1.0.3', 'version' => '1.0.3.0', 'reference' => 'c1c2e997aa3146983ed888ad08b15470a2e22ecc', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/lines-of-code', 'aliases' => array(), 'dev_requirement' => \true), 'sebastian/object-enumerator' => array('pretty_version' => '4.0.4', 'version' => '4.0.4.0', 'reference' => '5c9eeac41b290a3712d88851518825ad78f45c71', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/object-enumerator', 'aliases' => array(), 'dev_requirement' => \true), 'sebastian/object-reflector' => array('pretty_version' => '2.0.4', 'version' => '2.0.4.0', 'reference' => 'b4f479ebdbf63ac605d183ece17d8d7fe49c15c7', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/object-reflector', 'aliases' => array(), 'dev_requirement' => \true), 'sebastian/recursion-context' => array('pretty_version' => '4.0.4', 'version' => '4.0.4.0', 'reference' => 'cd9d8cf3c5804de4341c283ed787f099f5506172', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/recursion-context', 'aliases' => array(), 'dev_requirement' => \true), 'sebastian/resource-operations' => array('pretty_version' => '3.0.3', 'version' => '3.0.3.0', 'reference' => '0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/resource-operations', 'aliases' => array(), 'dev_requirement' => \true), 'sebastian/type' => array('pretty_version' => '3.2.0', 'version' => '3.2.0.0', 'reference' => 'fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/type', 'aliases' => array(), 'dev_requirement' => \true), 'sebastian/version' => array('pretty_version' => '3.0.2', 'version' => '3.0.2.0', 'reference' => 'c6c1022351a901512170118436c764e473f6de8c', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/version', 'aliases' => array(), 'dev_requirement' => \true), 'slevomat/coding-standard' => array('pretty_version' => '8.8.0', 'version' => '8.8.0.0', 'reference' => '59e25146a4ef0a7b194c5bc55b32dd414345db89', 'type' => 'phpcodesniffer-standard', 'install_path' => __DIR__ . '/../slevomat/coding-standard', 'aliases' => array(), 'dev_requirement' => \true), 'spatie/array-to-xml' => array('pretty_version' => '2.17.1', 'version' => '2.17.1.0', 'reference' => '5cbec9c6ab17e320c58a259f0cebe88bde4a7c46', 'type' => 'library', 'install_path' => __DIR__ . '/../spatie/array-to-xml', 'aliases' => array(), 'dev_requirement' => \false), 'squizlabs/php_codesniffer' => array('pretty_version' => '3.7.1', 'version' => '3.7.1.0', 'reference' => '1359e176e9307e906dc3d890bcc9603ff6d90619', 'type' => 'library', 'install_path' => __DIR__ . '/../squizlabs/php_codesniffer', 'aliases' => array(), 'dev_requirement' => \true), 'symfony/console' => array('pretty_version' => 'v5.4.17', 'version' => '5.4.17.0', 'reference' => '58422fdcb0e715ed05b385f70d3e8b5ed4bbd45f', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/console', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/deprecation-contracts' => array('pretty_version' => 'v2.5.2', 'version' => '2.5.2.0', 'reference' => 'e8b495ea28c1d97b5e0c121748d6f9b53d075c66', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/deprecation-contracts', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/filesystem' => array('pretty_version' => 'v5.4.13', 'version' => '5.4.13.0', 'reference' => 'ac09569844a9109a5966b9438fc29113ce77cf51', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/filesystem', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/polyfill-ctype' => array('pretty_version' => 'v1.27.0', 'version' => '1.27.0.0', 'reference' => '5bbc823adecdae860bb64756d639ecfec17b050a', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-ctype', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/polyfill-intl-grapheme' => array('pretty_version' => 'v1.27.0', 'version' => '1.27.0.0', 'reference' => '511a08c03c1960e08a883f4cffcacd219b758354', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-intl-grapheme', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/polyfill-intl-normalizer' => array('pretty_version' => 'v1.27.0', 'version' => '1.27.0.0', 'reference' => '19bd1e4fcd5b91116f14d8533c57831ed00571b6', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-intl-normalizer', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/polyfill-mbstring' => array('pretty_version' => 'v1.27.0', 'version' => '1.27.0.0', 'reference' => '8ad114f6b39e2c98a8b0e3bd907732c207c2b534', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-mbstring', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/polyfill-php73' => array('pretty_version' => 'v1.27.0', 'version' => '1.27.0.0', 'reference' => '9e8ecb5f92152187c4799efd3c96b78ccab18ff9', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-php73', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/polyfill-php80' => array('pretty_version' => 'v1.27.0', 'version' => '1.27.0.0', 'reference' => '7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-php80', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/process' => array('pretty_version' => 'v5.4.11', 'version' => '5.4.11.0', 'reference' => '6e75fe6874cbc7e4773d049616ab450eff537bf1', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/process', 'aliases' => array(), 'dev_requirement' => \true), 'symfony/service-contracts' => array('pretty_version' => 'v2.5.2', 'version' => '2.5.2.0', 'reference' => '4b426aac47d6427cc1a1d0f7e2ac724627f5966c', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/service-contracts', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/string' => array('pretty_version' => 'v5.4.17', 'version' => '5.4.17.0', 'reference' => '55733a8664b8853b003e70251c58bc8cb2d82a6b', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/string', 'aliases' => array(), 'dev_requirement' => \false), 'theseer/tokenizer' => array('pretty_version' => '1.2.1', 'version' => '1.2.1.0', 'reference' => '34a41e998c2183e22995f158c581e7b5e755ab9e', 'type' => 'library', 'install_path' => __DIR__ . '/../theseer/tokenizer', 'aliases' => array(), 'dev_requirement' => \true), 'vimeo/psalm' => array('pretty_version' => '5.6.0', 'version' => '5.6.0.0', 'reference' => 'e784128902dfe01d489c4123d69918a9f3c1eac5', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), 'dev_requirement' => \false), 'webmozart/assert' => array('pretty_version' => '1.11.0', 'version' => '1.11.0.0', 'reference' => '11cb2199493b2f8a3b53e7f19068fc6aac760991', 'type' => 'library', 'install_path' => __DIR__ . '/../webmozart/assert', 'aliases' => array(), 'dev_requirement' => \false))); * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Composer\Pcre; final class ReplaceResult { /** * @readonly * @var string */ public $result; /** * @readonly * @var 0|positive-int */ public $count; /** * @readonly * @var bool */ public $matched; /** * @param 0|positive-int $count */ public function __construct(int $count, string $result) { $this->count = $count; $this->matched = (bool) $count; $this->result = $result; } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Composer\Pcre; class PcreException extends \RuntimeException { /** * @param string $function * @param string|string[] $pattern * @return self */ public static function fromFunction($function, $pattern) { $code = \preg_last_error(); if (\is_array($pattern)) { $pattern = \implode(', ', $pattern); } return new PcreException($function . '(): failed executing "' . $pattern . '": ' . self::pcreLastErrorMessage($code), $code); } /** * @param int $code * @return string */ private static function pcreLastErrorMessage($code) { if (\function_exists('preg_last_error_msg')) { return \preg_last_error_msg(); } // older php versions did not set the code properly in all cases if (\PHP_VERSION_ID < 70201 && $code === 0) { return 'UNDEFINED_ERROR'; } $constants = \get_defined_constants(\true); if (!isset($constants['pcre'])) { return 'UNDEFINED_ERROR'; } foreach ($constants['pcre'] as $const => $val) { if ($val === $code && \substr($const, -6) === '_ERROR') { return $const; } } return 'UNDEFINED_ERROR'; } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Composer\Pcre; class UnexpectedNullMatchException extends PcreException { public static function fromFunction($function, $pattern) { throw new \LogicException('fromFunction should not be called on ' . self::class . ', use ' . PcreException::class); } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Composer\Pcre; final class MatchStrictGroupsResult { /** * An array of match group => string matched * * @readonly * @var array */ public $matches; /** * @readonly * @var bool */ public $matched; /** * @param 0|positive-int $count * @param array $matches */ public function __construct(int $count, array $matches) { $this->matches = $matches; $this->matched = (bool) $count; } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Composer\Pcre; final class MatchAllWithOffsetsResult { /** * An array of match group => list of matches, every match being a pair of string matched + offset in bytes (or -1 if no match) * * @readonly * @var array> * @phpstan-var array}>> */ public $matches; /** * @readonly * @var 0|positive-int */ public $count; /** * @readonly * @var bool */ public $matched; /** * @param 0|positive-int $count * @param array> $matches * @phpstan-param array}>> $matches */ public function __construct(int $count, array $matches) { $this->matches = $matches; $this->matched = (bool) $count; $this->count = $count; } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Composer\Pcre; final class MatchResult { /** * An array of match group => string matched * * @readonly * @var array */ public $matches; /** * @readonly * @var bool */ public $matched; /** * @param 0|positive-int $count * @param array $matches */ public function __construct(int $count, array $matches) { $this->matches = $matches; $this->matched = (bool) $count; } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Composer\Pcre; final class MatchAllStrictGroupsResult { /** * An array of match group => list of matched strings * * @readonly * @var array> */ public $matches; /** * @readonly * @var 0|positive-int */ public $count; /** * @readonly * @var bool */ public $matched; /** * @param 0|positive-int $count * @param array> $matches */ public function __construct(int $count, array $matches) { $this->matches = $matches; $this->matched = (bool) $count; $this->count = $count; } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Composer\Pcre; class Regex { /** * @param non-empty-string $pattern */ public static function isMatch(string $pattern, string $subject, int $offset = 0) : bool { return (bool) Preg::match($pattern, $subject, $matches, 0, $offset); } /** * @param non-empty-string $pattern * @param int-mask $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported */ public static function match(string $pattern, string $subject, int $flags = 0, int $offset = 0) : MatchResult { self::checkOffsetCapture($flags, 'matchWithOffsets'); $count = Preg::match($pattern, $subject, $matches, $flags, $offset); return new MatchResult($count, $matches); } /** * Variant of `match()` which returns non-null matches (or throws) * * @param non-empty-string $pattern * @param int-mask $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported * @throws UnexpectedNullMatchException */ public static function matchStrictGroups(string $pattern, string $subject, int $flags = 0, int $offset = 0) : MatchStrictGroupsResult { $count = Preg::matchStrictGroups($pattern, $subject, $matches, $flags, $offset); return new MatchStrictGroupsResult($count, $matches); } /** * Runs preg_match with PREG_OFFSET_CAPTURE * * @param non-empty-string $pattern * @param int-mask $flags PREG_UNMATCHED_AS_NULL and PREG_MATCH_OFFSET are always set, no other flags are supported */ public static function matchWithOffsets(string $pattern, string $subject, int $flags = 0, int $offset = 0) : MatchWithOffsetsResult { $count = Preg::matchWithOffsets($pattern, $subject, $matches, $flags, $offset); return new MatchWithOffsetsResult($count, $matches); } /** * @param non-empty-string $pattern * @param int-mask $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported */ public static function matchAll(string $pattern, string $subject, int $flags = 0, int $offset = 0) : MatchAllResult { self::checkOffsetCapture($flags, 'matchAllWithOffsets'); self::checkSetOrder($flags); $count = Preg::matchAll($pattern, $subject, $matches, $flags, $offset); return new MatchAllResult($count, $matches); } /** * Variant of `matchAll()` which returns non-null matches (or throws) * * @param non-empty-string $pattern * @param int-mask $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported * @throws UnexpectedNullMatchException */ public static function matchAllStrictGroups(string $pattern, string $subject, int $flags = 0, int $offset = 0) : MatchAllStrictGroupsResult { self::checkOffsetCapture($flags, 'matchAllWithOffsets'); self::checkSetOrder($flags); $count = Preg::matchAllStrictGroups($pattern, $subject, $matches, $flags, $offset); return new MatchAllStrictGroupsResult($count, $matches); } /** * Runs preg_match_all with PREG_OFFSET_CAPTURE * * @param non-empty-string $pattern * @param int-mask $flags PREG_UNMATCHED_AS_NULL and PREG_MATCH_OFFSET are always set, no other flags are supported */ public static function matchAllWithOffsets(string $pattern, string $subject, int $flags = 0, int $offset = 0) : MatchAllWithOffsetsResult { self::checkSetOrder($flags); $count = Preg::matchAllWithOffsets($pattern, $subject, $matches, $flags, $offset); return new MatchAllWithOffsetsResult($count, $matches); } /** * @param string|string[] $pattern * @param string|string[] $replacement * @param string $subject */ public static function replace($pattern, $replacement, $subject, int $limit = -1) : ReplaceResult { $result = Preg::replace($pattern, $replacement, $subject, $limit, $count); return new ReplaceResult($count, $result); } /** * @param string|string[] $pattern * @param callable(array): string $replacement * @param string $subject * @param int-mask $flags PREG_OFFSET_CAPTURE is supported, PREG_UNMATCHED_AS_NULL is always set */ public static function replaceCallback($pattern, callable $replacement, $subject, int $limit = -1, int $flags = 0) : ReplaceResult { $result = Preg::replaceCallback($pattern, $replacement, $subject, $limit, $count, $flags); return new ReplaceResult($count, $result); } /** * Variant of `replaceCallback()` which outputs non-null matches (or throws) * * @param string $pattern * @param callable(array): string $replacement * @param string $subject * @param int-mask $flags PREG_OFFSET_CAPTURE or PREG_UNMATCHED_AS_NULL, only available on PHP 7.4+ */ public static function replaceCallbackStrictGroups($pattern, callable $replacement, $subject, int $limit = -1, int $flags = 0) : ReplaceResult { $result = Preg::replaceCallbackStrictGroups($pattern, $replacement, $subject, $limit, $count, $flags); return new ReplaceResult($count, $result); } /** * @param array): string> $pattern * @param string $subject * @param int-mask $flags PREG_OFFSET_CAPTURE is supported, PREG_UNMATCHED_AS_NULL is always set */ public static function replaceCallbackArray(array $pattern, $subject, int $limit = -1, int $flags = 0) : ReplaceResult { $result = Preg::replaceCallbackArray($pattern, $subject, $limit, $count, $flags); return new ReplaceResult($count, $result); } private static function checkOffsetCapture(int $flags, string $useFunctionName) : void { if (($flags & \PREG_OFFSET_CAPTURE) !== 0) { throw new \InvalidArgumentException('PREG_OFFSET_CAPTURE is not supported as it changes the return type, use ' . $useFunctionName . '() instead'); } } private static function checkSetOrder(int $flags) : void { if (($flags & \PREG_SET_ORDER) !== 0) { throw new \InvalidArgumentException('PREG_SET_ORDER is not supported as it changes the return type'); } } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Composer\Pcre; class Preg { /** @internal */ public const ARRAY_MSG = '$subject as an array is not supported. You can use \'foreach\' instead.'; /** @internal */ public const INVALID_TYPE_MSG = '$subject must be a string, %s given.'; /** * @param non-empty-string $pattern * @param array $matches Set by method * @param int-mask $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported * @return 0|1 * * @param-out array $matches */ public static function match(string $pattern, string $subject, ?array &$matches = null, int $flags = 0, int $offset = 0) : int { self::checkOffsetCapture($flags, 'matchWithOffsets'); $result = \preg_match($pattern, $subject, $matches, $flags | \PREG_UNMATCHED_AS_NULL, $offset); if ($result === \false) { throw PcreException::fromFunction('preg_match', $pattern); } return $result; } /** * Variant of `match()` which outputs non-null matches (or throws) * * @param non-empty-string $pattern * @param array $matches Set by method * @param int-mask $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported * @return 0|1 * @throws UnexpectedNullMatchException * * @param-out array $matches */ public static function matchStrictGroups(string $pattern, string $subject, ?array &$matches = null, int $flags = 0, int $offset = 0) : int { $result = self::match($pattern, $subject, $matchesInternal, $flags, $offset); $matches = self::enforceNonNullMatches($pattern, $matchesInternal, 'match'); return $result; } /** * Runs preg_match with PREG_OFFSET_CAPTURE * * @param non-empty-string $pattern * @param array $matches Set by method * @param int-mask $flags PREG_UNMATCHED_AS_NULL and PREG_OFFSET_CAPTURE are always set, no other flags are supported * @return 0|1 * * @param-out array}> $matches */ public static function matchWithOffsets(string $pattern, string $subject, ?array &$matches, int $flags = 0, int $offset = 0) : int { $result = \preg_match($pattern, $subject, $matches, $flags | \PREG_UNMATCHED_AS_NULL | \PREG_OFFSET_CAPTURE, $offset); if ($result === \false) { throw PcreException::fromFunction('preg_match', $pattern); } return $result; } /** * @param non-empty-string $pattern * @param array> $matches Set by method * @param int-mask $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported * @return 0|positive-int * * @param-out array> $matches */ public static function matchAll(string $pattern, string $subject, ?array &$matches = null, int $flags = 0, int $offset = 0) : int { self::checkOffsetCapture($flags, 'matchAllWithOffsets'); self::checkSetOrder($flags); $result = \preg_match_all($pattern, $subject, $matches, $flags | \PREG_UNMATCHED_AS_NULL, $offset); if (!\is_int($result)) { // PHP < 8 may return null, 8+ returns int|false throw PcreException::fromFunction('preg_match_all', $pattern); } return $result; } /** * Variant of `match()` which outputs non-null matches (or throws) * * @param non-empty-string $pattern * @param array> $matches Set by method * @param int-mask $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported * @return 0|positive-int * @throws UnexpectedNullMatchException * * @param-out array> $matches */ public static function matchAllStrictGroups(string $pattern, string $subject, ?array &$matches = null, int $flags = 0, int $offset = 0) : int { $result = self::matchAll($pattern, $subject, $matchesInternal, $flags, $offset); $matches = self::enforceNonNullMatchAll($pattern, $matchesInternal, 'matchAll'); return $result; } /** * Runs preg_match_all with PREG_OFFSET_CAPTURE * * @param non-empty-string $pattern * @param array> $matches Set by method * @param int-mask $flags PREG_UNMATCHED_AS_NULL and PREG_MATCH_OFFSET are always set, no other flags are supported * @return 0|positive-int * * @phpstan-param array}>> $matches */ public static function matchAllWithOffsets(string $pattern, string $subject, ?array &$matches, int $flags = 0, int $offset = 0) : int { self::checkSetOrder($flags); $result = \preg_match_all($pattern, $subject, $matches, $flags | \PREG_UNMATCHED_AS_NULL | \PREG_OFFSET_CAPTURE, $offset); if (!\is_int($result)) { // PHP < 8 may return null, 8+ returns int|false throw PcreException::fromFunction('preg_match_all', $pattern); } return $result; } /** * @param string|string[] $pattern * @param string|string[] $replacement * @param string $subject * @param int $count Set by method * * @param-out int<0, max> $count */ public static function replace($pattern, $replacement, $subject, int $limit = -1, int &$count = null) : string { if (!\is_scalar($subject)) { if (\is_array($subject)) { throw new \InvalidArgumentException(static::ARRAY_MSG); } throw new \TypeError(\sprintf(static::INVALID_TYPE_MSG, \gettype($subject))); } $result = \preg_replace($pattern, $replacement, $subject, $limit, $count); if ($result === null) { throw PcreException::fromFunction('preg_replace', $pattern); } return $result; } /** * @param string|string[] $pattern * @param callable(array): string $replacement * @param string $subject * @param int $count Set by method * @param int-mask $flags PREG_OFFSET_CAPTURE is supported, PREG_UNMATCHED_AS_NULL is always set * * @param-out int<0, max> $count */ public static function replaceCallback($pattern, callable $replacement, $subject, int $limit = -1, int &$count = null, int $flags = 0) : string { if (!\is_scalar($subject)) { if (\is_array($subject)) { throw new \InvalidArgumentException(static::ARRAY_MSG); } throw new \TypeError(\sprintf(static::INVALID_TYPE_MSG, \gettype($subject))); } $result = \preg_replace_callback($pattern, $replacement, $subject, $limit, $count, $flags | \PREG_UNMATCHED_AS_NULL); if ($result === null) { throw PcreException::fromFunction('preg_replace_callback', $pattern); } return $result; } /** * Variant of `replaceCallback()` which outputs non-null matches (or throws) * * @param string $pattern * @param callable(array): string $replacement * @param string $subject * @param int $count Set by method * @param int-mask $flags PREG_OFFSET_CAPTURE or PREG_UNMATCHED_AS_NULL, only available on PHP 7.4+ * * @param-out int<0, max> $count */ public static function replaceCallbackStrictGroups(string $pattern, callable $replacement, $subject, int $limit = -1, int &$count = null, int $flags = 0) : string { return self::replaceCallback($pattern, function (array $matches) use($pattern, $replacement) { return $replacement(self::enforceNonNullMatches($pattern, $matches, 'replaceCallback')); }, $subject, $limit, $count, $flags); } /** * @param array): string> $pattern * @param string $subject * @param int $count Set by method * @param int-mask $flags PREG_OFFSET_CAPTURE is supported, PREG_UNMATCHED_AS_NULL is always set * * @param-out int<0, max> $count */ public static function replaceCallbackArray(array $pattern, $subject, int $limit = -1, int &$count = null, int $flags = 0) : string { if (!\is_scalar($subject)) { if (\is_array($subject)) { throw new \InvalidArgumentException(static::ARRAY_MSG); } throw new \TypeError(\sprintf(static::INVALID_TYPE_MSG, \gettype($subject))); } $result = \preg_replace_callback_array($pattern, $subject, $limit, $count, $flags | \PREG_UNMATCHED_AS_NULL); if ($result === null) { $pattern = \array_keys($pattern); throw PcreException::fromFunction('preg_replace_callback_array', $pattern); } return $result; } /** * @param int-mask $flags PREG_SPLIT_NO_EMPTY or PREG_SPLIT_DELIM_CAPTURE * @return list */ public static function split(string $pattern, string $subject, int $limit = -1, int $flags = 0) : array { if (($flags & \PREG_SPLIT_OFFSET_CAPTURE) !== 0) { throw new \InvalidArgumentException('PREG_SPLIT_OFFSET_CAPTURE is not supported as it changes the type of $matches, use splitWithOffsets() instead'); } $result = \preg_split($pattern, $subject, $limit, $flags); if ($result === \false) { throw PcreException::fromFunction('preg_split', $pattern); } return $result; } /** * @param int-mask $flags PREG_SPLIT_NO_EMPTY or PREG_SPLIT_DELIM_CAPTURE, PREG_SPLIT_OFFSET_CAPTURE is always set * @return list * @phpstan-return list}> */ public static function splitWithOffsets(string $pattern, string $subject, int $limit = -1, int $flags = 0) : array { $result = \preg_split($pattern, $subject, $limit, $flags | \PREG_SPLIT_OFFSET_CAPTURE); if ($result === \false) { throw PcreException::fromFunction('preg_split', $pattern); } return $result; } /** * @template T of string|\Stringable * @param string $pattern * @param array $array * @param int-mask $flags PREG_GREP_INVERT * @return array */ public static function grep(string $pattern, array $array, int $flags = 0) : array { $result = \preg_grep($pattern, $array, $flags); if ($result === \false) { throw PcreException::fromFunction('preg_grep', $pattern); } return $result; } /** * Variant of match() which returns a bool instead of int * * @param non-empty-string $pattern * @param array $matches Set by method * @param int-mask $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported * * @param-out array $matches */ public static function isMatch(string $pattern, string $subject, ?array &$matches = null, int $flags = 0, int $offset = 0) : bool { return (bool) static::match($pattern, $subject, $matches, $flags, $offset); } /** * Variant of `isMatch()` which outputs non-null matches (or throws) * * @param non-empty-string $pattern * @param array $matches Set by method * @param int-mask $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported * @throws UnexpectedNullMatchException * * @param-out array $matches */ public static function isMatchStrictGroups(string $pattern, string $subject, ?array &$matches = null, int $flags = 0, int $offset = 0) : bool { return (bool) self::matchStrictGroups($pattern, $subject, $matches, $flags, $offset); } /** * Variant of matchAll() which returns a bool instead of int * * @param non-empty-string $pattern * @param array> $matches Set by method * @param int-mask $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported * * @param-out array> $matches */ public static function isMatchAll(string $pattern, string $subject, ?array &$matches = null, int $flags = 0, int $offset = 0) : bool { return (bool) static::matchAll($pattern, $subject, $matches, $flags, $offset); } /** * Variant of `isMatchAll()` which outputs non-null matches (or throws) * * @param non-empty-string $pattern * @param array> $matches Set by method * @param int-mask $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported * * @param-out array> $matches */ public static function isMatchAllStrictGroups(string $pattern, string $subject, ?array &$matches = null, int $flags = 0, int $offset = 0) : bool { return (bool) self::matchAllStrictGroups($pattern, $subject, $matches, $flags, $offset); } /** * Variant of matchWithOffsets() which returns a bool instead of int * * Runs preg_match with PREG_OFFSET_CAPTURE * * @param non-empty-string $pattern * @param array $matches Set by method * @param int-mask $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported * * @param-out array}> $matches */ public static function isMatchWithOffsets(string $pattern, string $subject, ?array &$matches, int $flags = 0, int $offset = 0) : bool { return (bool) static::matchWithOffsets($pattern, $subject, $matches, $flags, $offset); } /** * Variant of matchAllWithOffsets() which returns a bool instead of int * * Runs preg_match_all with PREG_OFFSET_CAPTURE * * @param non-empty-string $pattern * @param array> $matches Set by method * @param int-mask $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported * * @param-out array}>> $matches */ public static function isMatchAllWithOffsets(string $pattern, string $subject, ?array &$matches, int $flags = 0, int $offset = 0) : bool { return (bool) static::matchAllWithOffsets($pattern, $subject, $matches, $flags, $offset); } private static function checkOffsetCapture(int $flags, string $useFunctionName) : void { if (($flags & \PREG_OFFSET_CAPTURE) !== 0) { throw new \InvalidArgumentException('PREG_OFFSET_CAPTURE is not supported as it changes the type of $matches, use ' . $useFunctionName . '() instead'); } } private static function checkSetOrder(int $flags) : void { if (($flags & \PREG_SET_ORDER) !== 0) { throw new \InvalidArgumentException('PREG_SET_ORDER is not supported as it changes the type of $matches'); } } /** * @param array $matches * @return array * @throws UnexpectedNullMatchException */ private static function enforceNonNullMatches(string $pattern, array $matches, string $variantMethod) { foreach ($matches as $group => $match) { if (null === $match) { throw new UnexpectedNullMatchException('Pattern "' . $pattern . '" had an unexpected unmatched group "' . $group . '", make sure the pattern always matches or use ' . $variantMethod . '() instead.'); } } /** @var array */ return $matches; } /** * @param array> $matches * @return array> * @throws UnexpectedNullMatchException */ private static function enforceNonNullMatchAll(string $pattern, array $matches, string $variantMethod) { foreach ($matches as $group => $groupMatches) { foreach ($groupMatches as $match) { if (null === $match) { throw new UnexpectedNullMatchException('Pattern "' . $pattern . '" had an unexpected unmatched group "' . $group . '", make sure the pattern always matches or use ' . $variantMethod . '() instead.'); } } } /** @var array> */ return $matches; } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Composer\Pcre; final class MatchAllResult { /** * An array of match group => list of matched strings * * @readonly * @var array> */ public $matches; /** * @readonly * @var 0|positive-int */ public $count; /** * @readonly * @var bool */ public $matched; /** * @param 0|positive-int $count * @param array> $matches */ public function __construct(int $count, array $matches) { $this->matches = $matches; $this->matched = (bool) $count; $this->count = $count; } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Composer\Pcre; final class MatchWithOffsetsResult { /** * An array of match group => pair of string matched + offset in bytes (or -1 if no match) * * @readonly * @var array * @phpstan-var array}> */ public $matches; /** * @readonly * @var bool */ public $matched; /** * @param 0|positive-int $count * @param array $matches * @phpstan-param array}> $matches */ public function __construct(int $count, array $matches) { $this->matches = $matches; $this->matched = (bool) $count; } } Copyright (C) 2021 Composer 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. __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php', 'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php', '6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php', '320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php', '8825ede83f2f289127722d4e842cf7e8' => __DIR__ . '/..' . '/symfony/polyfill-intl-grapheme/bootstrap.php', 'e69f7f6ee287b969198c3c9d6777bd38' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/bootstrap.php', 'e8aa6e4b5a1db2f56ae794f1505391a8' => __DIR__ . '/..' . '/amphp/amp/lib/functions.php', '76cd0796156622033397994f25b0d8fc' => __DIR__ . '/..' . '/amphp/amp/lib/Internal/functions.php', '0d59ee240a4cd96ddbb4ff164fccea4d' => __DIR__ . '/..' . '/symfony/polyfill-php73/bootstrap.php', 'b6b991a57620e2fb6b2f66f03fe9ddc2' => __DIR__ . '/..' . '/symfony/string/Resources/functions.php', '6cd5651c4fef5ed6b63e8d8b8ffbf3cc' => __DIR__ . '/..' . '/amphp/byte-stream/lib/functions.php', ); public static $prefixLengthsPsr4 = array ( '_' => array ( '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\' => 48, '_HumbugBox1cb33d1f20f1\\XdgBaseDir\\' => 34, '_HumbugBox1cb33d1f20f1\\Webmozart\\Assert\\' => 40, '_HumbugBox1cb33d1f20f1\\Symfony\\Polyfill\\Php80\\' => 46, '_HumbugBox1cb33d1f20f1\\Symfony\\Polyfill\\Php73\\' => 46, '_HumbugBox1cb33d1f20f1\\Symfony\\Polyfill\\Mbstring\\' => 49, '_HumbugBox1cb33d1f20f1\\Symfony\\Polyfill\\Intl\\Normalizer\\' => 56, '_HumbugBox1cb33d1f20f1\\Symfony\\Polyfill\\Intl\\Grapheme\\' => 54, '_HumbugBox1cb33d1f20f1\\Symfony\\Polyfill\\Ctype\\' => 46, '_HumbugBox1cb33d1f20f1\\Symfony\\Contracts\\Service\\' => 49, '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\String\\' => 48, '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Filesystem\\' => 52, '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\' => 49, '_HumbugBox1cb33d1f20f1\\Spatie\\ArrayToXml\\' => 41, '_HumbugBox1cb33d1f20f1\\Psr\\Log\\' => 31, '_HumbugBox1cb33d1f20f1\\Psr\\Container\\' => 37, '_HumbugBox1cb33d1f20f1\\PhpParser\\' => 33, '_HumbugBox1cb33d1f20f1\\PackageVersions\\' => 39, '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\' => 46, '_HumbugBox1cb33d1f20f1\\JsonMapper\\' => 34, '_HumbugBox1cb33d1f20f1\\Fidry\\CpuCoreCounter\\' => 44, '_HumbugBox1cb33d1f20f1\\Composer\\XdebugHandler\\' => 46, '_HumbugBox1cb33d1f20f1\\Composer\\Semver\\' => 39, '_HumbugBox1cb33d1f20f1\\Composer\\Pcre\\' => 37, '_HumbugBox1cb33d1f20f1\\Amp\\ByteStream\\' => 38, '_HumbugBox1cb33d1f20f1\\Amp\\' => 27, '_HumbugBox1cb33d1f20f1\\AdvancedJsonRpc\\' => 39, ), 'P' => array ( 'Psalm\\' => 6, ), ); public static $prefixDirsPsr4 = array ( '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\' => array ( 0 => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src', 1 => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src', 2 => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src', ), '_HumbugBox1cb33d1f20f1\\XdgBaseDir\\' => array ( 0 => __DIR__ . '/..' . '/dnoegel/php-xdg-base-dir/src', ), '_HumbugBox1cb33d1f20f1\\Webmozart\\Assert\\' => array ( 0 => __DIR__ . '/..' . '/webmozart/assert/src', ), '_HumbugBox1cb33d1f20f1\\Symfony\\Polyfill\\Php80\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-php80', ), '_HumbugBox1cb33d1f20f1\\Symfony\\Polyfill\\Php73\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-php73', ), '_HumbugBox1cb33d1f20f1\\Symfony\\Polyfill\\Mbstring\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-mbstring', ), '_HumbugBox1cb33d1f20f1\\Symfony\\Polyfill\\Intl\\Normalizer\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer', ), '_HumbugBox1cb33d1f20f1\\Symfony\\Polyfill\\Intl\\Grapheme\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-intl-grapheme', ), '_HumbugBox1cb33d1f20f1\\Symfony\\Polyfill\\Ctype\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-ctype', ), '_HumbugBox1cb33d1f20f1\\Symfony\\Contracts\\Service\\' => array ( 0 => __DIR__ . '/..' . '/symfony/service-contracts', ), '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\String\\' => array ( 0 => __DIR__ . '/..' . '/symfony/string', ), '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Filesystem\\' => array ( 0 => __DIR__ . '/..' . '/symfony/filesystem', ), '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\' => array ( 0 => __DIR__ . '/..' . '/symfony/console', ), '_HumbugBox1cb33d1f20f1\\Spatie\\ArrayToXml\\' => array ( 0 => __DIR__ . '/..' . '/spatie/array-to-xml/src', ), '_HumbugBox1cb33d1f20f1\\Psr\\Log\\' => array ( 0 => __DIR__ . '/..' . '/psr/log/Psr/Log', ), '_HumbugBox1cb33d1f20f1\\Psr\\Container\\' => array ( 0 => __DIR__ . '/..' . '/psr/container/src', ), '_HumbugBox1cb33d1f20f1\\PhpParser\\' => array ( 0 => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser', ), '_HumbugBox1cb33d1f20f1\\PackageVersions\\' => array ( 0 => __DIR__ . '/..' . '/composer/package-versions-deprecated/src/PackageVersions', ), '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\' => array ( 0 => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src', ), '_HumbugBox1cb33d1f20f1\\JsonMapper\\' => array ( 0 => __DIR__ . '/..' . '/netresearch/jsonmapper/src/JsonMapper', ), '_HumbugBox1cb33d1f20f1\\Fidry\\CpuCoreCounter\\' => array ( 0 => __DIR__ . '/..' . '/fidry/cpu-core-counter/src', ), '_HumbugBox1cb33d1f20f1\\Composer\\XdebugHandler\\' => array ( 0 => __DIR__ . '/..' . '/composer/xdebug-handler/src', ), '_HumbugBox1cb33d1f20f1\\Composer\\Semver\\' => array ( 0 => __DIR__ . '/..' . '/composer/semver/src', ), '_HumbugBox1cb33d1f20f1\\Composer\\Pcre\\' => array ( 0 => __DIR__ . '/..' . '/composer/pcre/src', ), '_HumbugBox1cb33d1f20f1\\Amp\\ByteStream\\' => array ( 0 => __DIR__ . '/..' . '/amphp/byte-stream/lib', ), '_HumbugBox1cb33d1f20f1\\Amp\\' => array ( 0 => __DIR__ . '/..' . '/amphp/amp/lib', ), '_HumbugBox1cb33d1f20f1\\AdvancedJsonRpc\\' => array ( 0 => __DIR__ . '/..' . '/felixfbecker/advanced-json-rpc/lib', ), 'Psalm\\' => array ( 0 => __DIR__ . '/../..' . '/src/Psalm', ), ); public static $classMap = array ( 'Attribute' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Attribute.php', 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', 'PhpToken' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php', 'Psalm\\Aliases' => __DIR__ . '/../..' . '/src/Psalm/Aliases.php', 'Psalm\\CodeLocation' => __DIR__ . '/../..' . '/src/Psalm/CodeLocation.php', 'Psalm\\CodeLocation\\DocblockTypeLocation' => __DIR__ . '/../..' . '/src/Psalm/CodeLocation/DocblockTypeLocation.php', 'Psalm\\CodeLocation\\ParseErrorLocation' => __DIR__ . '/../..' . '/src/Psalm/CodeLocation/ParseErrorLocation.php', 'Psalm\\CodeLocation\\Raw' => __DIR__ . '/../..' . '/src/Psalm/CodeLocation/Raw.php', 'Psalm\\Codebase' => __DIR__ . '/../..' . '/src/Psalm/Codebase.php', 'Psalm\\Config' => __DIR__ . '/../..' . '/src/Psalm/Config.php', 'Psalm\\Config\\Creator' => __DIR__ . '/../..' . '/src/Psalm/Config/Creator.php', 'Psalm\\Config\\ErrorLevelFileFilter' => __DIR__ . '/../..' . '/src/Psalm/Config/ErrorLevelFileFilter.php', 'Psalm\\Config\\FileFilter' => __DIR__ . '/../..' . '/src/Psalm/Config/FileFilter.php', 'Psalm\\Config\\IssueHandler' => __DIR__ . '/../..' . '/src/Psalm/Config/IssueHandler.php', 'Psalm\\Config\\ProjectFileFilter' => __DIR__ . '/../..' . '/src/Psalm/Config/ProjectFileFilter.php', 'Psalm\\Config\\TaintAnalysisFileFilter' => __DIR__ . '/../..' . '/src/Psalm/Config/TaintAnalysisFileFilter.php', 'Psalm\\Context' => __DIR__ . '/../..' . '/src/Psalm/Context.php', 'Psalm\\DocComment' => __DIR__ . '/../..' . '/src/Psalm/DocComment.php', 'Psalm\\ErrorBaseline' => __DIR__ . '/../..' . '/src/Psalm/ErrorBaseline.php', 'Psalm\\Exception\\CircularReferenceException' => __DIR__ . '/../..' . '/src/Psalm/Exception/CircularReferenceException.php', 'Psalm\\Exception\\CodeException' => __DIR__ . '/../..' . '/src/Psalm/Exception/CodeException.php', 'Psalm\\Exception\\ComplicatedExpressionException' => __DIR__ . '/../..' . '/src/Psalm/Exception/ComplicatedExpressionException.php', 'Psalm\\Exception\\ConfigCreationException' => __DIR__ . '/../..' . '/src/Psalm/Exception/ConfigCreationException.php', 'Psalm\\Exception\\ConfigException' => __DIR__ . '/../..' . '/src/Psalm/Exception/ConfigException.php', 'Psalm\\Exception\\ConfigNotFoundException' => __DIR__ . '/../..' . '/src/Psalm/Exception/ConfigNotFoundException.php', 'Psalm\\Exception\\DocblockParseException' => __DIR__ . '/../..' . '/src/Psalm/Exception/DocblockParseException.php', 'Psalm\\Exception\\FileIncludeException' => __DIR__ . '/../..' . '/src/Psalm/Exception/FileIncludeException.php', 'Psalm\\Exception\\IncorrectDocblockException' => __DIR__ . '/../..' . '/src/Psalm/Exception/IncorrectDocblockException.php', 'Psalm\\Exception\\InvalidClasslikeOverrideException' => __DIR__ . '/../..' . '/src/Psalm/Exception/InvalidClasslikeOverrideException.php', 'Psalm\\Exception\\InvalidMethodOverrideException' => __DIR__ . '/../..' . '/src/Psalm/Exception/InvalidMethodOverrideException.php', 'Psalm\\Exception\\RefactorException' => __DIR__ . '/../..' . '/src/Psalm/Exception/RefactorException.php', 'Psalm\\Exception\\ScopeAnalysisException' => __DIR__ . '/../..' . '/src/Psalm/Exception/ScopeAnalysisException.php', 'Psalm\\Exception\\TypeParseTreeException' => __DIR__ . '/../..' . '/src/Psalm/Exception/TypeParseTreeException.php', 'Psalm\\Exception\\UnanalyzedFileException' => __DIR__ . '/../..' . '/src/Psalm/Exception/UnanalyzedFileException.php', 'Psalm\\Exception\\UnpopulatedClasslikeException' => __DIR__ . '/../..' . '/src/Psalm/Exception/UnpopulatedClasslikeException.php', 'Psalm\\Exception\\UnpreparedAnalysisException' => __DIR__ . '/../..' . '/src/Psalm/Exception/UnpreparedAnalysisException.php', 'Psalm\\Exception\\UnresolvableConstantException' => __DIR__ . '/../..' . '/src/Psalm/Exception/UnresolvableConstantException.php', 'Psalm\\Exception\\UnsupportedIssueToFixException' => __DIR__ . '/../..' . '/src/Psalm/Exception/UnsupportedIssueToFixException.php', 'Psalm\\FileBasedPluginAdapter' => __DIR__ . '/../..' . '/src/Psalm/FileBasedPluginAdapter.php', 'Psalm\\FileManipulation' => __DIR__ . '/../..' . '/src/Psalm/FileManipulation.php', 'Psalm\\FileSource' => __DIR__ . '/../..' . '/src/Psalm/FileSource.php', 'Psalm\\Internal\\Algebra' => __DIR__ . '/../..' . '/src/Psalm/Internal/Algebra.php', 'Psalm\\Internal\\Algebra\\FormulaGenerator' => __DIR__ . '/../..' . '/src/Psalm/Internal/Algebra/FormulaGenerator.php', 'Psalm\\Internal\\Analyzer\\AlgebraAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/AlgebraAnalyzer.php', 'Psalm\\Internal\\Analyzer\\AttributesAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/AttributesAnalyzer.php', 'Psalm\\Internal\\Analyzer\\CanAlias' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/CanAlias.php', 'Psalm\\Internal\\Analyzer\\ClassAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/ClassAnalyzer.php', 'Psalm\\Internal\\Analyzer\\ClassLikeAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/ClassLikeAnalyzer.php', 'Psalm\\Internal\\Analyzer\\ClassLikeNameOptions' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/ClassLikeNameOptions.php', 'Psalm\\Internal\\Analyzer\\ClosureAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/ClosureAnalyzer.php', 'Psalm\\Internal\\Analyzer\\CommentAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/CommentAnalyzer.php', 'Psalm\\Internal\\Analyzer\\DataFlowNodeData' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/DataFlowNodeData.php', 'Psalm\\Internal\\Analyzer\\FileAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/FileAnalyzer.php', 'Psalm\\Internal\\Analyzer\\FunctionAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/FunctionAnalyzer.php', 'Psalm\\Internal\\Analyzer\\FunctionLikeAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/FunctionLikeAnalyzer.php', 'Psalm\\Internal\\Analyzer\\FunctionLike\\ReturnTypeAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/FunctionLike/ReturnTypeAnalyzer.php', 'Psalm\\Internal\\Analyzer\\FunctionLike\\ReturnTypeCollector' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/FunctionLike/ReturnTypeCollector.php', 'Psalm\\Internal\\Analyzer\\InterfaceAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/InterfaceAnalyzer.php', 'Psalm\\Internal\\Analyzer\\IssueData' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/IssueData.php', 'Psalm\\Internal\\Analyzer\\MethodAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/MethodAnalyzer.php', 'Psalm\\Internal\\Analyzer\\MethodComparator' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/MethodComparator.php', 'Psalm\\Internal\\Analyzer\\NamespaceAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/NamespaceAnalyzer.php', 'Psalm\\Internal\\Analyzer\\ProjectAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/ProjectAnalyzer.php', 'Psalm\\Internal\\Analyzer\\ScopeAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/ScopeAnalyzer.php', 'Psalm\\Internal\\Analyzer\\SourceAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/SourceAnalyzer.php', 'Psalm\\Internal\\Analyzer\\StatementsAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/StatementsAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Block\\DoAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Block/DoAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Block\\ForAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Block/ForAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Block\\ForeachAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Block/ForeachAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Block\\IfConditionalAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Block/IfConditionalAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Block\\IfElseAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Block/IfElseAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Block\\IfElse\\ElseAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Block/IfElse/ElseAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Block\\IfElse\\ElseIfAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Block/IfElse/ElseIfAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Block\\IfElse\\IfAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Block/IfElse/IfAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Block\\LoopAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Block/LoopAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Block\\SwitchAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Block/SwitchAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Block\\SwitchCaseAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Block/SwitchCaseAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Block\\TryAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Block/TryAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Block\\WhileAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Block/WhileAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\BreakAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/BreakAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\ContinueAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/ContinueAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\EchoAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/EchoAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\ExpressionAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\ArrayAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/ArrayAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\ArrayCreationInfo' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/ArrayCreationInfo.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\AssertionFinder' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/AssertionFinder.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\AssignmentAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/AssignmentAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Assignment\\ArrayAssignmentAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/ArrayAssignmentAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Assignment\\AssignedProperty' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/AssignedProperty.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Assignment\\InstancePropertyAssignmentAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/InstancePropertyAssignmentAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Assignment\\StaticPropertyAssignmentAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/StaticPropertyAssignmentAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\BinaryOpAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOpAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\BinaryOp\\AndAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/AndAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\BinaryOp\\ArithmeticOpAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/ArithmeticOpAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\BinaryOp\\CoalesceAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/CoalesceAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\BinaryOp\\ConcatAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/ConcatAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\BinaryOp\\NonComparisonOpAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/NonComparisonOpAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\BinaryOp\\OrAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/OrAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\BitwiseNotAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/BitwiseNotAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\BooleanNotAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/BooleanNotAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\CallAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/CallAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\ArgumentAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\ArgumentMapPopulator' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentMapPopulator.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\ArgumentsAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentsAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\ArrayFunctionArgumentsAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArrayFunctionArgumentsAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\ClassTemplateParamCollector' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ClassTemplateParamCollector.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\FunctionCallAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/Call/FunctionCallAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\FunctionCallInfo' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/Call/FunctionCallInfo.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\FunctionCallReturnTypeFetcher' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/Call/FunctionCallReturnTypeFetcher.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\MethodCallAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/Call/MethodCallAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\Method\\AtomicCallContext' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/AtomicCallContext.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\Method\\AtomicMethodCallAnalysisResult' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/AtomicMethodCallAnalysisResult.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\Method\\AtomicMethodCallAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/AtomicMethodCallAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\Method\\ExistingAtomicMethodCallAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/ExistingAtomicMethodCallAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\Method\\MethodCallProhibitionAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodCallProhibitionAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\Method\\MethodCallPurityAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodCallPurityAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\Method\\MethodCallReturnTypeFetcher' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodCallReturnTypeFetcher.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\Method\\MethodVisibilityAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MethodVisibilityAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\Method\\MissingMethodCallHandler' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/MissingMethodCallHandler.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\NamedFunctionCallHandler' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/Call/NamedFunctionCallHandler.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\NewAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/Call/NewAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\StaticCallAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/Call/StaticCallAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\StaticMethod\\AtomicStaticCallAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/Call/StaticMethod/AtomicStaticCallAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Call\\StaticMethod\\ExistingAtomicStaticCallAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/Call/StaticMethod/ExistingAtomicStaticCallAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\CastAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/CastAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\ClassConstAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/ClassConstAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\CloneAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/CloneAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\EmptyAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/EmptyAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\EncapsulatedStringAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/EncapsulatedStringAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\EvalAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/EvalAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\ExitAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/ExitAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\ExpressionIdentifier' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/ExpressionIdentifier.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Fetch\\ArrayFetchAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/ArrayFetchAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Fetch\\AtomicPropertyFetchAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/AtomicPropertyFetchAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Fetch\\ConstFetchAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/ConstFetchAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Fetch\\InstancePropertyFetchAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/InstancePropertyFetchAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Fetch\\StaticPropertyFetchAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/StaticPropertyFetchAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\Fetch\\VariableFetchAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/VariableFetchAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\IncDecExpressionAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/IncDecExpressionAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\IncludeAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/IncludeAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\InstanceofAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/InstanceofAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\IssetAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/IssetAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\MagicConstAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/MagicConstAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\MatchAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/MatchAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\NullsafeAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/NullsafeAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\PrintAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/PrintAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\SimpleTypeInferer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/SimpleTypeInferer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\TernaryAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/TernaryAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\UnaryPlusMinusAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/UnaryPlusMinusAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\YieldAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/YieldAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\Expression\\YieldFromAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/Expression/YieldFromAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\GlobalAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/GlobalAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\ReturnAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/ReturnAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\StaticAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/StaticAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\ThrowAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/ThrowAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\UnsetAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/UnsetAnalyzer.php', 'Psalm\\Internal\\Analyzer\\Statements\\UnusedAssignmentRemover' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/Statements/UnusedAssignmentRemover.php', 'Psalm\\Internal\\Analyzer\\TraitAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/TraitAnalyzer.php', 'Psalm\\Internal\\Analyzer\\TypeAnalyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Analyzer/TypeAnalyzer.php', 'Psalm\\Internal\\Clause' => __DIR__ . '/../..' . '/src/Psalm/Internal/Clause.php', 'Psalm\\Internal\\CliUtils' => __DIR__ . '/../..' . '/src/Psalm/Internal/CliUtils.php', 'Psalm\\Internal\\Cli\\LanguageServer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Cli/LanguageServer.php', 'Psalm\\Internal\\Cli\\Plugin' => __DIR__ . '/../..' . '/src/Psalm/Internal/Cli/Plugin.php', 'Psalm\\Internal\\Cli\\Psalm' => __DIR__ . '/../..' . '/src/Psalm/Internal/Cli/Psalm.php', 'Psalm\\Internal\\Cli\\Psalter' => __DIR__ . '/../..' . '/src/Psalm/Internal/Cli/Psalter.php', 'Psalm\\Internal\\Cli\\Refactor' => __DIR__ . '/../..' . '/src/Psalm/Internal/Cli/Refactor.php', 'Psalm\\Internal\\Codebase\\Analyzer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Codebase/Analyzer.php', 'Psalm\\Internal\\Codebase\\ClassConstantByWildcardResolver' => __DIR__ . '/../..' . '/src/Psalm/Internal/Codebase/ClassConstantByWildcardResolver.php', 'Psalm\\Internal\\Codebase\\ClassLikes' => __DIR__ . '/../..' . '/src/Psalm/Internal/Codebase/ClassLikes.php', 'Psalm\\Internal\\Codebase\\ConstantTypeResolver' => __DIR__ . '/../..' . '/src/Psalm/Internal/Codebase/ConstantTypeResolver.php', 'Psalm\\Internal\\Codebase\\DataFlowGraph' => __DIR__ . '/../..' . '/src/Psalm/Internal/Codebase/DataFlowGraph.php', 'Psalm\\Internal\\Codebase\\Functions' => __DIR__ . '/../..' . '/src/Psalm/Internal/Codebase/Functions.php', 'Psalm\\Internal\\Codebase\\InternalCallMapHandler' => __DIR__ . '/../..' . '/src/Psalm/Internal/Codebase/InternalCallMapHandler.php', 'Psalm\\Internal\\Codebase\\Methods' => __DIR__ . '/../..' . '/src/Psalm/Internal/Codebase/Methods.php', 'Psalm\\Internal\\Codebase\\Populator' => __DIR__ . '/../..' . '/src/Psalm/Internal/Codebase/Populator.php', 'Psalm\\Internal\\Codebase\\Properties' => __DIR__ . '/../..' . '/src/Psalm/Internal/Codebase/Properties.php', 'Psalm\\Internal\\Codebase\\PropertyMap' => __DIR__ . '/../..' . '/src/Psalm/Internal/Codebase/PropertyMap.php', 'Psalm\\Internal\\Codebase\\ReferenceMapGenerator' => __DIR__ . '/../..' . '/src/Psalm/Internal/Codebase/ReferenceMapGenerator.php', 'Psalm\\Internal\\Codebase\\Reflection' => __DIR__ . '/../..' . '/src/Psalm/Internal/Codebase/Reflection.php', 'Psalm\\Internal\\Codebase\\Scanner' => __DIR__ . '/../..' . '/src/Psalm/Internal/Codebase/Scanner.php', 'Psalm\\Internal\\Codebase\\TaintFlowGraph' => __DIR__ . '/../..' . '/src/Psalm/Internal/Codebase/TaintFlowGraph.php', 'Psalm\\Internal\\Codebase\\VariableUseGraph' => __DIR__ . '/../..' . '/src/Psalm/Internal/Codebase/VariableUseGraph.php', 'Psalm\\Internal\\Composer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Composer.php', 'Psalm\\Internal\\DataFlow\\DataFlowNode' => __DIR__ . '/../..' . '/src/Psalm/Internal/DataFlow/DataFlowNode.php', 'Psalm\\Internal\\DataFlow\\Path' => __DIR__ . '/../..' . '/src/Psalm/Internal/DataFlow/Path.php', 'Psalm\\Internal\\DataFlow\\TaintSink' => __DIR__ . '/../..' . '/src/Psalm/Internal/DataFlow/TaintSink.php', 'Psalm\\Internal\\DataFlow\\TaintSource' => __DIR__ . '/../..' . '/src/Psalm/Internal/DataFlow/TaintSource.php', 'Psalm\\Internal\\Diff\\AstDiffer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Diff/AstDiffer.php', 'Psalm\\Internal\\Diff\\ClassStatementsDiffer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Diff/ClassStatementsDiffer.php', 'Psalm\\Internal\\Diff\\DiffElem' => __DIR__ . '/../..' . '/src/Psalm/Internal/Diff/DiffElem.php', 'Psalm\\Internal\\Diff\\FileDiffer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Diff/FileDiffer.php', 'Psalm\\Internal\\Diff\\FileStatementsDiffer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Diff/FileStatementsDiffer.php', 'Psalm\\Internal\\Diff\\NamespaceStatementsDiffer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Diff/NamespaceStatementsDiffer.php', 'Psalm\\Internal\\ErrorHandler' => __DIR__ . '/../..' . '/src/Psalm/Internal/ErrorHandler.php', 'Psalm\\Internal\\EventDispatcher' => __DIR__ . '/../..' . '/src/Psalm/Internal/EventDispatcher.php', 'Psalm\\Internal\\ExecutionEnvironment\\BuildInfoCollector' => __DIR__ . '/../..' . '/src/Psalm/Internal/ExecutionEnvironment/BuildInfoCollector.php', 'Psalm\\Internal\\ExecutionEnvironment\\GitInfoCollector' => __DIR__ . '/../..' . '/src/Psalm/Internal/ExecutionEnvironment/GitInfoCollector.php', 'Psalm\\Internal\\ExecutionEnvironment\\SystemCommandExecutor' => __DIR__ . '/../..' . '/src/Psalm/Internal/ExecutionEnvironment/SystemCommandExecutor.php', 'Psalm\\Internal\\FileManipulation\\ClassDocblockManipulator' => __DIR__ . '/../..' . '/src/Psalm/Internal/FileManipulation/ClassDocblockManipulator.php', 'Psalm\\Internal\\FileManipulation\\CodeMigration' => __DIR__ . '/../..' . '/src/Psalm/Internal/FileManipulation/CodeMigration.php', 'Psalm\\Internal\\FileManipulation\\FileManipulationBuffer' => __DIR__ . '/../..' . '/src/Psalm/Internal/FileManipulation/FileManipulationBuffer.php', 'Psalm\\Internal\\FileManipulation\\FunctionDocblockManipulator' => __DIR__ . '/../..' . '/src/Psalm/Internal/FileManipulation/FunctionDocblockManipulator.php', 'Psalm\\Internal\\FileManipulation\\PropertyDocblockManipulator' => __DIR__ . '/../..' . '/src/Psalm/Internal/FileManipulation/PropertyDocblockManipulator.php', 'Psalm\\Internal\\Fork\\ForkMessage' => __DIR__ . '/../..' . '/src/Psalm/Internal/Fork/ForkMessage.php', 'Psalm\\Internal\\Fork\\ForkProcessDoneMessage' => __DIR__ . '/../..' . '/src/Psalm/Internal/Fork/ForkProcessDoneMessage.php', 'Psalm\\Internal\\Fork\\ForkProcessErrorMessage' => __DIR__ . '/../..' . '/src/Psalm/Internal/Fork/ForkProcessErrorMessage.php', 'Psalm\\Internal\\Fork\\ForkTaskDoneMessage' => __DIR__ . '/../..' . '/src/Psalm/Internal/Fork/ForkTaskDoneMessage.php', 'Psalm\\Internal\\Fork\\Pool' => __DIR__ . '/../..' . '/src/Psalm/Internal/Fork/Pool.php', 'Psalm\\Internal\\Fork\\PsalmRestarter' => __DIR__ . '/../..' . '/src/Psalm/Internal/Fork/PsalmRestarter.php', 'Psalm\\Internal\\IncludeCollector' => __DIR__ . '/../..' . '/src/Psalm/Internal/IncludeCollector.php', 'Psalm\\Internal\\Json\\Json' => __DIR__ . '/../..' . '/src/Psalm/Internal/Json/Json.php', 'Psalm\\Internal\\LanguageServer\\ClientHandler' => __DIR__ . '/../..' . '/src/Psalm/Internal/LanguageServer/ClientHandler.php', 'Psalm\\Internal\\LanguageServer\\Client\\TextDocument' => __DIR__ . '/../..' . '/src/Psalm/Internal/LanguageServer/Client/TextDocument.php', 'Psalm\\Internal\\LanguageServer\\EmitterInterface' => __DIR__ . '/../..' . '/src/Psalm/Internal/LanguageServer/EmitterInterface.php', 'Psalm\\Internal\\LanguageServer\\EmitterTrait' => __DIR__ . '/../..' . '/src/Psalm/Internal/LanguageServer/EmitterTrait.php', 'Psalm\\Internal\\LanguageServer\\IdGenerator' => __DIR__ . '/../..' . '/src/Psalm/Internal/LanguageServer/IdGenerator.php', 'Psalm\\Internal\\LanguageServer\\LanguageClient' => __DIR__ . '/../..' . '/src/Psalm/Internal/LanguageServer/LanguageClient.php', 'Psalm\\Internal\\LanguageServer\\LanguageServer' => __DIR__ . '/../..' . '/src/Psalm/Internal/LanguageServer/LanguageServer.php', 'Psalm\\Internal\\LanguageServer\\Message' => __DIR__ . '/../..' . '/src/Psalm/Internal/LanguageServer/Message.php', 'Psalm\\Internal\\LanguageServer\\ProtocolReader' => __DIR__ . '/../..' . '/src/Psalm/Internal/LanguageServer/ProtocolReader.php', 'Psalm\\Internal\\LanguageServer\\ProtocolStreamReader' => __DIR__ . '/../..' . '/src/Psalm/Internal/LanguageServer/ProtocolStreamReader.php', 'Psalm\\Internal\\LanguageServer\\ProtocolStreamWriter' => __DIR__ . '/../..' . '/src/Psalm/Internal/LanguageServer/ProtocolStreamWriter.php', 'Psalm\\Internal\\LanguageServer\\ProtocolWriter' => __DIR__ . '/../..' . '/src/Psalm/Internal/LanguageServer/ProtocolWriter.php', 'Psalm\\Internal\\LanguageServer\\Server\\TextDocument' => __DIR__ . '/../..' . '/src/Psalm/Internal/LanguageServer/Server/TextDocument.php', 'Psalm\\Internal\\LanguageServer\\Server\\Workspace' => __DIR__ . '/../..' . '/src/Psalm/Internal/LanguageServer/Server/Workspace.php', 'Psalm\\Internal\\MethodIdentifier' => __DIR__ . '/../..' . '/src/Psalm/Internal/MethodIdentifier.php', 'Psalm\\Internal\\PhpTraverser\\CustomTraverser' => __DIR__ . '/../..' . '/src/Psalm/Internal/PhpTraverser/CustomTraverser.php', 'Psalm\\Internal\\PhpVisitor\\AssignmentMapVisitor' => __DIR__ . '/../..' . '/src/Psalm/Internal/PhpVisitor/AssignmentMapVisitor.php', 'Psalm\\Internal\\PhpVisitor\\CheckTrivialExprVisitor' => __DIR__ . '/../..' . '/src/Psalm/Internal/PhpVisitor/CheckTrivialExprVisitor.php', 'Psalm\\Internal\\PhpVisitor\\CloningVisitor' => __DIR__ . '/../..' . '/src/Psalm/Internal/PhpVisitor/CloningVisitor.php', 'Psalm\\Internal\\PhpVisitor\\ConditionCloningVisitor' => __DIR__ . '/../..' . '/src/Psalm/Internal/PhpVisitor/ConditionCloningVisitor.php', 'Psalm\\Internal\\PhpVisitor\\NodeCleanerVisitor' => __DIR__ . '/../..' . '/src/Psalm/Internal/PhpVisitor/NodeCleanerVisitor.php', 'Psalm\\Internal\\PhpVisitor\\NodeCounterVisitor' => __DIR__ . '/../..' . '/src/Psalm/Internal/PhpVisitor/NodeCounterVisitor.php', 'Psalm\\Internal\\PhpVisitor\\OffsetShifterVisitor' => __DIR__ . '/../..' . '/src/Psalm/Internal/PhpVisitor/OffsetShifterVisitor.php', 'Psalm\\Internal\\PhpVisitor\\ParamReplacementVisitor' => __DIR__ . '/../..' . '/src/Psalm/Internal/PhpVisitor/ParamReplacementVisitor.php', 'Psalm\\Internal\\PhpVisitor\\PartialParserVisitor' => __DIR__ . '/../..' . '/src/Psalm/Internal/PhpVisitor/PartialParserVisitor.php', 'Psalm\\Internal\\PhpVisitor\\ReflectorVisitor' => __DIR__ . '/../..' . '/src/Psalm/Internal/PhpVisitor/ReflectorVisitor.php', 'Psalm\\Internal\\PhpVisitor\\Reflector\\AttributeResolver' => __DIR__ . '/../..' . '/src/Psalm/Internal/PhpVisitor/Reflector/AttributeResolver.php', 'Psalm\\Internal\\PhpVisitor\\Reflector\\ClassLikeDocblockParser' => __DIR__ . '/../..' . '/src/Psalm/Internal/PhpVisitor/Reflector/ClassLikeDocblockParser.php', 'Psalm\\Internal\\PhpVisitor\\Reflector\\ClassLikeNodeScanner' => __DIR__ . '/../..' . '/src/Psalm/Internal/PhpVisitor/Reflector/ClassLikeNodeScanner.php', 'Psalm\\Internal\\PhpVisitor\\Reflector\\ExpressionResolver' => __DIR__ . '/../..' . '/src/Psalm/Internal/PhpVisitor/Reflector/ExpressionResolver.php', 'Psalm\\Internal\\PhpVisitor\\Reflector\\ExpressionScanner' => __DIR__ . '/../..' . '/src/Psalm/Internal/PhpVisitor/Reflector/ExpressionScanner.php', 'Psalm\\Internal\\PhpVisitor\\Reflector\\FunctionLikeDocblockParser' => __DIR__ . '/../..' . '/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeDocblockParser.php', 'Psalm\\Internal\\PhpVisitor\\Reflector\\FunctionLikeDocblockScanner' => __DIR__ . '/../..' . '/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeDocblockScanner.php', 'Psalm\\Internal\\PhpVisitor\\Reflector\\FunctionLikeNodeScanner' => __DIR__ . '/../..' . '/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeNodeScanner.php', 'Psalm\\Internal\\PhpVisitor\\Reflector\\TypeHintResolver' => __DIR__ . '/../..' . '/src/Psalm/Internal/PhpVisitor/Reflector/TypeHintResolver.php', 'Psalm\\Internal\\PhpVisitor\\ShortClosureVisitor' => __DIR__ . '/../..' . '/src/Psalm/Internal/PhpVisitor/ShortClosureVisitor.php', 'Psalm\\Internal\\PhpVisitor\\SimpleNameResolver' => __DIR__ . '/../..' . '/src/Psalm/Internal/PhpVisitor/SimpleNameResolver.php', 'Psalm\\Internal\\PhpVisitor\\TraitFinder' => __DIR__ . '/../..' . '/src/Psalm/Internal/PhpVisitor/TraitFinder.php', 'Psalm\\Internal\\PhpVisitor\\TypeMappingVisitor' => __DIR__ . '/../..' . '/src/Psalm/Internal/PhpVisitor/TypeMappingVisitor.php', 'Psalm\\Internal\\PhpVisitor\\YieldTypeCollector' => __DIR__ . '/../..' . '/src/Psalm/Internal/PhpVisitor/YieldTypeCollector.php', 'Psalm\\Internal\\PluginManager\\Command\\DisableCommand' => __DIR__ . '/../..' . '/src/Psalm/Internal/PluginManager/Command/DisableCommand.php', 'Psalm\\Internal\\PluginManager\\Command\\EnableCommand' => __DIR__ . '/../..' . '/src/Psalm/Internal/PluginManager/Command/EnableCommand.php', 'Psalm\\Internal\\PluginManager\\Command\\ShowCommand' => __DIR__ . '/../..' . '/src/Psalm/Internal/PluginManager/Command/ShowCommand.php', 'Psalm\\Internal\\PluginManager\\ComposerLock' => __DIR__ . '/../..' . '/src/Psalm/Internal/PluginManager/ComposerLock.php', 'Psalm\\Internal\\PluginManager\\ConfigFile' => __DIR__ . '/../..' . '/src/Psalm/Internal/PluginManager/ConfigFile.php', 'Psalm\\Internal\\PluginManager\\PluginList' => __DIR__ . '/../..' . '/src/Psalm/Internal/PluginManager/PluginList.php', 'Psalm\\Internal\\PluginManager\\PluginListFactory' => __DIR__ . '/../..' . '/src/Psalm/Internal/PluginManager/PluginListFactory.php', 'Psalm\\Internal\\Provider\\AddRemoveTaints\\HtmlFunctionTainter' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/AddRemoveTaints/HtmlFunctionTainter.php', 'Psalm\\Internal\\Provider\\ClassLikeStorageCacheProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/ClassLikeStorageCacheProvider.php', 'Psalm\\Internal\\Provider\\ClassLikeStorageProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/ClassLikeStorageProvider.php', 'Psalm\\Internal\\Provider\\DynamicFunctionStorageProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/DynamicFunctionStorageProvider.php', 'Psalm\\Internal\\Provider\\FakeFileProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/FakeFileProvider.php', 'Psalm\\Internal\\Provider\\FileProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/FileProvider.php', 'Psalm\\Internal\\Provider\\FileReferenceCacheProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/FileReferenceCacheProvider.php', 'Psalm\\Internal\\Provider\\FileReferenceProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/FileReferenceProvider.php', 'Psalm\\Internal\\Provider\\FileStorageCacheProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/FileStorageCacheProvider.php', 'Psalm\\Internal\\Provider\\FileStorageProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/FileStorageProvider.php', 'Psalm\\Internal\\Provider\\FunctionExistenceProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/FunctionExistenceProvider.php', 'Psalm\\Internal\\Provider\\FunctionParamsProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/FunctionParamsProvider.php', 'Psalm\\Internal\\Provider\\FunctionReturnTypeProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/FunctionReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\MethodExistenceProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/MethodExistenceProvider.php', 'Psalm\\Internal\\Provider\\MethodParamsProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/MethodParamsProvider.php', 'Psalm\\Internal\\Provider\\MethodReturnTypeProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/MethodReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\MethodVisibilityProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/MethodVisibilityProvider.php', 'Psalm\\Internal\\Provider\\NodeDataProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/NodeDataProvider.php', 'Psalm\\Internal\\Provider\\ParserCacheProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/ParserCacheProvider.php', 'Psalm\\Internal\\Provider\\ProjectCacheProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/ProjectCacheProvider.php', 'Psalm\\Internal\\Provider\\PropertyExistenceProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/PropertyExistenceProvider.php', 'Psalm\\Internal\\Provider\\PropertyTypeProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/PropertyTypeProvider.php', 'Psalm\\Internal\\Provider\\PropertyTypeProvider\\DomDocumentPropertyTypeProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/PropertyTypeProvider/DomDocumentPropertyTypeProvider.php', 'Psalm\\Internal\\Provider\\PropertyVisibilityProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/PropertyVisibilityProvider.php', 'Psalm\\Internal\\Provider\\Providers' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/Providers.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayChunkReturnTypeProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayChunkReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayColumnReturnTypeProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayColumnReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayCombineReturnTypeProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayCombineReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayFillKeysReturnTypeProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayFillKeysReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayFillReturnTypeProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayFillReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayFilterReturnTypeProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayFilterReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayMapReturnTypeProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayMapReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayMergeReturnTypeProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayMergeReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayPadReturnTypeProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayPadReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayPointerAdjustmentReturnTypeProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayPointerAdjustmentReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayPopReturnTypeProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayPopReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayRandReturnTypeProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayRandReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayReduceReturnTypeProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayReduceReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayReverseReturnTypeProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayReverseReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArraySliceReturnTypeProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/ReturnTypeProvider/ArraySliceReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArraySpliceReturnTypeProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/ReturnTypeProvider/ArraySpliceReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ArrayUniqueReturnTypeProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayUniqueReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\BasenameReturnTypeProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/ReturnTypeProvider/BasenameReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ClosureFromCallableReturnTypeProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/ReturnTypeProvider/ClosureFromCallableReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\DateTimeModifyReturnTypeProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/ReturnTypeProvider/DateTimeModifyReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\DirnameReturnTypeProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/ReturnTypeProvider/DirnameReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\DomNodeAppendChild' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/ReturnTypeProvider/DomNodeAppendChild.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\FilterVarReturnTypeProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/ReturnTypeProvider/FilterVarReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\FirstArgStringReturnTypeProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/ReturnTypeProvider/FirstArgStringReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\GetClassMethodsReturnTypeProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/ReturnTypeProvider/GetClassMethodsReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\GetObjectVarsReturnTypeProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/ReturnTypeProvider/GetObjectVarsReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\HexdecReturnTypeProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/ReturnTypeProvider/HexdecReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ImagickPixelColorReturnTypeProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/ReturnTypeProvider/ImagickPixelColorReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\InArrayReturnTypeProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/ReturnTypeProvider/InArrayReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\IteratorToArrayReturnTypeProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/ReturnTypeProvider/IteratorToArrayReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\MbInternalEncodingReturnTypeProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/ReturnTypeProvider/MbInternalEncodingReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\MinMaxReturnTypeProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/ReturnTypeProvider/MinMaxReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\MktimeReturnTypeProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/ReturnTypeProvider/MktimeReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\ParseUrlReturnTypeProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/ReturnTypeProvider/ParseUrlReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\PdoStatementReturnTypeProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/ReturnTypeProvider/PdoStatementReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\PdoStatementSetFetchMode' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/ReturnTypeProvider/PdoStatementSetFetchMode.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\RandReturnTypeProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/ReturnTypeProvider/RandReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\RoundReturnTypeProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/ReturnTypeProvider/RoundReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\SimpleXmlElementAsXml' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/ReturnTypeProvider/SimpleXmlElementAsXml.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\StrReplaceReturnTypeProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/ReturnTypeProvider/StrReplaceReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\StrTrReturnTypeProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/ReturnTypeProvider/StrTrReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\TriggerErrorReturnTypeProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/ReturnTypeProvider/TriggerErrorReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\ReturnTypeProvider\\VersionCompareReturnTypeProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/ReturnTypeProvider/VersionCompareReturnTypeProvider.php', 'Psalm\\Internal\\Provider\\StatementsProvider' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/StatementsProvider.php', 'Psalm\\Internal\\Provider\\StatementsVolatileCache' => __DIR__ . '/../..' . '/src/Psalm/Internal/Provider/StatementsVolatileCache.php', 'Psalm\\Internal\\ReferenceConstraint' => __DIR__ . '/../..' . '/src/Psalm/Internal/ReferenceConstraint.php', 'Psalm\\Internal\\RuntimeCaches' => __DIR__ . '/../..' . '/src/Psalm/Internal/RuntimeCaches.php', 'Psalm\\Internal\\Scanner\\ClassLikeDocblockComment' => __DIR__ . '/../..' . '/src/Psalm/Internal/Scanner/ClassLikeDocblockComment.php', 'Psalm\\Internal\\Scanner\\DocblockParser' => __DIR__ . '/../..' . '/src/Psalm/Internal/Scanner/DocblockParser.php', 'Psalm\\Internal\\Scanner\\FileScanner' => __DIR__ . '/../..' . '/src/Psalm/Internal/Scanner/FileScanner.php', 'Psalm\\Internal\\Scanner\\FunctionDocblockComment' => __DIR__ . '/../..' . '/src/Psalm/Internal/Scanner/FunctionDocblockComment.php', 'Psalm\\Internal\\Scanner\\ParsedDocblock' => __DIR__ . '/../..' . '/src/Psalm/Internal/Scanner/ParsedDocblock.php', 'Psalm\\Internal\\Scanner\\PhpStormMetaScanner' => __DIR__ . '/../..' . '/src/Psalm/Internal/Scanner/PhpStormMetaScanner.php', 'Psalm\\Internal\\Scanner\\UnresolvedConstantComponent' => __DIR__ . '/../..' . '/src/Psalm/Internal/Scanner/UnresolvedConstantComponent.php', 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\ArrayOffsetFetch' => __DIR__ . '/../..' . '/src/Psalm/Internal/Scanner/UnresolvedConstant/ArrayOffsetFetch.php', 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\ArraySpread' => __DIR__ . '/../..' . '/src/Psalm/Internal/Scanner/UnresolvedConstant/ArraySpread.php', 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\ArrayValue' => __DIR__ . '/../..' . '/src/Psalm/Internal/Scanner/UnresolvedConstant/ArrayValue.php', 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\ClassConstant' => __DIR__ . '/../..' . '/src/Psalm/Internal/Scanner/UnresolvedConstant/ClassConstant.php', 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\Constant' => __DIR__ . '/../..' . '/src/Psalm/Internal/Scanner/UnresolvedConstant/Constant.php', 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\KeyValuePair' => __DIR__ . '/../..' . '/src/Psalm/Internal/Scanner/UnresolvedConstant/KeyValuePair.php', 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\ScalarValue' => __DIR__ . '/../..' . '/src/Psalm/Internal/Scanner/UnresolvedConstant/ScalarValue.php', 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedAdditionOp' => __DIR__ . '/../..' . '/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedAdditionOp.php', 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedBinaryOp' => __DIR__ . '/../..' . '/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedBinaryOp.php', 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedBitwiseAnd' => __DIR__ . '/../..' . '/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedBitwiseAnd.php', 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedBitwiseOr' => __DIR__ . '/../..' . '/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedBitwiseOr.php', 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedBitwiseXor' => __DIR__ . '/../..' . '/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedBitwiseXor.php', 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedConcatOp' => __DIR__ . '/../..' . '/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedConcatOp.php', 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedDivisionOp' => __DIR__ . '/../..' . '/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedDivisionOp.php', 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedMultiplicationOp' => __DIR__ . '/../..' . '/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedMultiplicationOp.php', 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedSubtractionOp' => __DIR__ . '/../..' . '/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedSubtractionOp.php', 'Psalm\\Internal\\Scanner\\UnresolvedConstant\\UnresolvedTernary' => __DIR__ . '/../..' . '/src/Psalm/Internal/Scanner/UnresolvedConstant/UnresolvedTernary.php', 'Psalm\\Internal\\Scanner\\VarDocblockComment' => __DIR__ . '/../..' . '/src/Psalm/Internal/Scanner/VarDocblockComment.php', 'Psalm\\Internal\\Scope\\CaseScope' => __DIR__ . '/../..' . '/src/Psalm/Internal/Scope/CaseScope.php', 'Psalm\\Internal\\Scope\\FinallyScope' => __DIR__ . '/../..' . '/src/Psalm/Internal/Scope/FinallyScope.php', 'Psalm\\Internal\\Scope\\IfConditionalScope' => __DIR__ . '/../..' . '/src/Psalm/Internal/Scope/IfConditionalScope.php', 'Psalm\\Internal\\Scope\\IfScope' => __DIR__ . '/../..' . '/src/Psalm/Internal/Scope/IfScope.php', 'Psalm\\Internal\\Scope\\LoopScope' => __DIR__ . '/../..' . '/src/Psalm/Internal/Scope/LoopScope.php', 'Psalm\\Internal\\Scope\\SwitchScope' => __DIR__ . '/../..' . '/src/Psalm/Internal/Scope/SwitchScope.php', 'Psalm\\Internal\\Stubs\\Generator\\ClassLikeStubGenerator' => __DIR__ . '/../..' . '/src/Psalm/Internal/Stubs/Generator/ClassLikeStubGenerator.php', 'Psalm\\Internal\\Stubs\\Generator\\StubsGenerator' => __DIR__ . '/../..' . '/src/Psalm/Internal/Stubs/Generator/StubsGenerator.php', 'Psalm\\Internal\\TypeVisitor\\CanContainObjectTypeVisitor' => __DIR__ . '/../..' . '/src/Psalm/Internal/TypeVisitor/CanContainObjectTypeVisitor.php', 'Psalm\\Internal\\TypeVisitor\\ClasslikeReplacer' => __DIR__ . '/../..' . '/src/Psalm/Internal/TypeVisitor/ClasslikeReplacer.php', 'Psalm\\Internal\\TypeVisitor\\ContainsClassLikeVisitor' => __DIR__ . '/../..' . '/src/Psalm/Internal/TypeVisitor/ContainsClassLikeVisitor.php', 'Psalm\\Internal\\TypeVisitor\\ContainsLiteralVisitor' => __DIR__ . '/../..' . '/src/Psalm/Internal/TypeVisitor/ContainsLiteralVisitor.php', 'Psalm\\Internal\\TypeVisitor\\ContainsStaticVisitor' => __DIR__ . '/../..' . '/src/Psalm/Internal/TypeVisitor/ContainsStaticVisitor.php', 'Psalm\\Internal\\TypeVisitor\\FromDocblockSetter' => __DIR__ . '/../..' . '/src/Psalm/Internal/TypeVisitor/FromDocblockSetter.php', 'Psalm\\Internal\\TypeVisitor\\TemplateTypeCollector' => __DIR__ . '/../..' . '/src/Psalm/Internal/TypeVisitor/TemplateTypeCollector.php', 'Psalm\\Internal\\TypeVisitor\\TypeChecker' => __DIR__ . '/../..' . '/src/Psalm/Internal/TypeVisitor/TypeChecker.php', 'Psalm\\Internal\\TypeVisitor\\TypeLocalizer' => __DIR__ . '/../..' . '/src/Psalm/Internal/TypeVisitor/TypeLocalizer.php', 'Psalm\\Internal\\TypeVisitor\\TypeScanner' => __DIR__ . '/../..' . '/src/Psalm/Internal/TypeVisitor/TypeScanner.php', 'Psalm\\Internal\\Type\\ArrayType' => __DIR__ . '/../..' . '/src/Psalm/Internal/Type/ArrayType.php', 'Psalm\\Internal\\Type\\AssertionReconciler' => __DIR__ . '/../..' . '/src/Psalm/Internal/Type/AssertionReconciler.php', 'Psalm\\Internal\\Type\\Comparator\\ArrayTypeComparator' => __DIR__ . '/../..' . '/src/Psalm/Internal/Type/Comparator/ArrayTypeComparator.php', 'Psalm\\Internal\\Type\\Comparator\\AtomicTypeComparator' => __DIR__ . '/../..' . '/src/Psalm/Internal/Type/Comparator/AtomicTypeComparator.php', 'Psalm\\Internal\\Type\\Comparator\\CallableTypeComparator' => __DIR__ . '/../..' . '/src/Psalm/Internal/Type/Comparator/CallableTypeComparator.php', 'Psalm\\Internal\\Type\\Comparator\\ClassLikeStringComparator' => __DIR__ . '/../..' . '/src/Psalm/Internal/Type/Comparator/ClassLikeStringComparator.php', 'Psalm\\Internal\\Type\\Comparator\\GenericTypeComparator' => __DIR__ . '/../..' . '/src/Psalm/Internal/Type/Comparator/GenericTypeComparator.php', 'Psalm\\Internal\\Type\\Comparator\\IntegerRangeComparator' => __DIR__ . '/../..' . '/src/Psalm/Internal/Type/Comparator/IntegerRangeComparator.php', 'Psalm\\Internal\\Type\\Comparator\\KeyedArrayComparator' => __DIR__ . '/../..' . '/src/Psalm/Internal/Type/Comparator/KeyedArrayComparator.php', 'Psalm\\Internal\\Type\\Comparator\\ObjectComparator' => __DIR__ . '/../..' . '/src/Psalm/Internal/Type/Comparator/ObjectComparator.php', 'Psalm\\Internal\\Type\\Comparator\\ScalarTypeComparator' => __DIR__ . '/../..' . '/src/Psalm/Internal/Type/Comparator/ScalarTypeComparator.php', 'Psalm\\Internal\\Type\\Comparator\\TypeComparisonResult' => __DIR__ . '/../..' . '/src/Psalm/Internal/Type/Comparator/TypeComparisonResult.php', 'Psalm\\Internal\\Type\\Comparator\\UnionTypeComparator' => __DIR__ . '/../..' . '/src/Psalm/Internal/Type/Comparator/UnionTypeComparator.php', 'Psalm\\Internal\\Type\\NegatedAssertionReconciler' => __DIR__ . '/../..' . '/src/Psalm/Internal/Type/NegatedAssertionReconciler.php', 'Psalm\\Internal\\Type\\ParseTree' => __DIR__ . '/../..' . '/src/Psalm/Internal/Type/ParseTree.php', 'Psalm\\Internal\\Type\\ParseTreeCreator' => __DIR__ . '/../..' . '/src/Psalm/Internal/Type/ParseTreeCreator.php', 'Psalm\\Internal\\Type\\ParseTree\\CallableParamTree' => __DIR__ . '/../..' . '/src/Psalm/Internal/Type/ParseTree/CallableParamTree.php', 'Psalm\\Internal\\Type\\ParseTree\\CallableTree' => __DIR__ . '/../..' . '/src/Psalm/Internal/Type/ParseTree/CallableTree.php', 'Psalm\\Internal\\Type\\ParseTree\\CallableWithReturnTypeTree' => __DIR__ . '/../..' . '/src/Psalm/Internal/Type/ParseTree/CallableWithReturnTypeTree.php', 'Psalm\\Internal\\Type\\ParseTree\\ConditionalTree' => __DIR__ . '/../..' . '/src/Psalm/Internal/Type/ParseTree/ConditionalTree.php', 'Psalm\\Internal\\Type\\ParseTree\\EncapsulationTree' => __DIR__ . '/../..' . '/src/Psalm/Internal/Type/ParseTree/EncapsulationTree.php', 'Psalm\\Internal\\Type\\ParseTree\\FieldEllipsis' => __DIR__ . '/../..' . '/src/Psalm/Internal/Type/ParseTree/FieldEllipsis.php', 'Psalm\\Internal\\Type\\ParseTree\\GenericTree' => __DIR__ . '/../..' . '/src/Psalm/Internal/Type/ParseTree/GenericTree.php', 'Psalm\\Internal\\Type\\ParseTree\\IndexedAccessTree' => __DIR__ . '/../..' . '/src/Psalm/Internal/Type/ParseTree/IndexedAccessTree.php', 'Psalm\\Internal\\Type\\ParseTree\\IntersectionTree' => __DIR__ . '/../..' . '/src/Psalm/Internal/Type/ParseTree/IntersectionTree.php', 'Psalm\\Internal\\Type\\ParseTree\\KeyedArrayPropertyTree' => __DIR__ . '/../..' . '/src/Psalm/Internal/Type/ParseTree/KeyedArrayPropertyTree.php', 'Psalm\\Internal\\Type\\ParseTree\\KeyedArrayTree' => __DIR__ . '/../..' . '/src/Psalm/Internal/Type/ParseTree/KeyedArrayTree.php', 'Psalm\\Internal\\Type\\ParseTree\\MethodParamTree' => __DIR__ . '/../..' . '/src/Psalm/Internal/Type/ParseTree/MethodParamTree.php', 'Psalm\\Internal\\Type\\ParseTree\\MethodTree' => __DIR__ . '/../..' . '/src/Psalm/Internal/Type/ParseTree/MethodTree.php', 'Psalm\\Internal\\Type\\ParseTree\\MethodWithReturnTypeTree' => __DIR__ . '/../..' . '/src/Psalm/Internal/Type/ParseTree/MethodWithReturnTypeTree.php', 'Psalm\\Internal\\Type\\ParseTree\\NullableTree' => __DIR__ . '/../..' . '/src/Psalm/Internal/Type/ParseTree/NullableTree.php', 'Psalm\\Internal\\Type\\ParseTree\\Root' => __DIR__ . '/../..' . '/src/Psalm/Internal/Type/ParseTree/Root.php', 'Psalm\\Internal\\Type\\ParseTree\\TemplateAsTree' => __DIR__ . '/../..' . '/src/Psalm/Internal/Type/ParseTree/TemplateAsTree.php', 'Psalm\\Internal\\Type\\ParseTree\\TemplateIsTree' => __DIR__ . '/../..' . '/src/Psalm/Internal/Type/ParseTree/TemplateIsTree.php', 'Psalm\\Internal\\Type\\ParseTree\\UnionTree' => __DIR__ . '/../..' . '/src/Psalm/Internal/Type/ParseTree/UnionTree.php', 'Psalm\\Internal\\Type\\ParseTree\\Value' => __DIR__ . '/../..' . '/src/Psalm/Internal/Type/ParseTree/Value.php', 'Psalm\\Internal\\Type\\SimpleAssertionReconciler' => __DIR__ . '/../..' . '/src/Psalm/Internal/Type/SimpleAssertionReconciler.php', 'Psalm\\Internal\\Type\\SimpleNegatedAssertionReconciler' => __DIR__ . '/../..' . '/src/Psalm/Internal/Type/SimpleNegatedAssertionReconciler.php', 'Psalm\\Internal\\Type\\TemplateBound' => __DIR__ . '/../..' . '/src/Psalm/Internal/Type/TemplateBound.php', 'Psalm\\Internal\\Type\\TemplateInferredTypeReplacer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Type/TemplateInferredTypeReplacer.php', 'Psalm\\Internal\\Type\\TemplateResult' => __DIR__ . '/../..' . '/src/Psalm/Internal/Type/TemplateResult.php', 'Psalm\\Internal\\Type\\TemplateStandinTypeReplacer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Type/TemplateStandinTypeReplacer.php', 'Psalm\\Internal\\Type\\TypeAlias' => __DIR__ . '/../..' . '/src/Psalm/Internal/Type/TypeAlias.php', 'Psalm\\Internal\\Type\\TypeAlias\\ClassTypeAlias' => __DIR__ . '/../..' . '/src/Psalm/Internal/Type/TypeAlias/ClassTypeAlias.php', 'Psalm\\Internal\\Type\\TypeAlias\\InlineTypeAlias' => __DIR__ . '/../..' . '/src/Psalm/Internal/Type/TypeAlias/InlineTypeAlias.php', 'Psalm\\Internal\\Type\\TypeAlias\\LinkableTypeAlias' => __DIR__ . '/../..' . '/src/Psalm/Internal/Type/TypeAlias/LinkableTypeAlias.php', 'Psalm\\Internal\\Type\\TypeCombination' => __DIR__ . '/../..' . '/src/Psalm/Internal/Type/TypeCombination.php', 'Psalm\\Internal\\Type\\TypeCombiner' => __DIR__ . '/../..' . '/src/Psalm/Internal/Type/TypeCombiner.php', 'Psalm\\Internal\\Type\\TypeExpander' => __DIR__ . '/../..' . '/src/Psalm/Internal/Type/TypeExpander.php', 'Psalm\\Internal\\Type\\TypeParser' => __DIR__ . '/../..' . '/src/Psalm/Internal/Type/TypeParser.php', 'Psalm\\Internal\\Type\\TypeTokenizer' => __DIR__ . '/../..' . '/src/Psalm/Internal/Type/TypeTokenizer.php', 'Psalm\\Internal\\VersionUtils' => __DIR__ . '/../..' . '/src/Psalm/Internal/VersionUtils.php', 'Psalm\\IssueBuffer' => __DIR__ . '/../..' . '/src/Psalm/IssueBuffer.php', 'Psalm\\Issue\\AbstractInstantiation' => __DIR__ . '/../..' . '/src/Psalm/Issue/AbstractInstantiation.php', 'Psalm\\Issue\\AbstractMethodCall' => __DIR__ . '/../..' . '/src/Psalm/Issue/AbstractMethodCall.php', 'Psalm\\Issue\\AmbiguousConstantInheritance' => __DIR__ . '/../..' . '/src/Psalm/Issue/AmbiguousConstantInheritance.php', 'Psalm\\Issue\\ArgumentIssue' => __DIR__ . '/../..' . '/src/Psalm/Issue/ArgumentIssue.php', 'Psalm\\Issue\\ArgumentTypeCoercion' => __DIR__ . '/../..' . '/src/Psalm/Issue/ArgumentTypeCoercion.php', 'Psalm\\Issue\\AssignmentToVoid' => __DIR__ . '/../..' . '/src/Psalm/Issue/AssignmentToVoid.php', 'Psalm\\Issue\\CheckType' => __DIR__ . '/../..' . '/src/Psalm/Issue/CheckType.php', 'Psalm\\Issue\\CircularReference' => __DIR__ . '/../..' . '/src/Psalm/Issue/CircularReference.php', 'Psalm\\Issue\\ClassConstantIssue' => __DIR__ . '/../..' . '/src/Psalm/Issue/ClassConstantIssue.php', 'Psalm\\Issue\\ClassIssue' => __DIR__ . '/../..' . '/src/Psalm/Issue/ClassIssue.php', 'Psalm\\Issue\\CodeIssue' => __DIR__ . '/../..' . '/src/Psalm/Issue/CodeIssue.php', 'Psalm\\Issue\\ComplexFunction' => __DIR__ . '/../..' . '/src/Psalm/Issue/ComplexFunction.php', 'Psalm\\Issue\\ComplexMethod' => __DIR__ . '/../..' . '/src/Psalm/Issue/ComplexMethod.php', 'Psalm\\Issue\\ConfigIssue' => __DIR__ . '/../..' . '/src/Psalm/Issue/ConfigIssue.php', 'Psalm\\Issue\\ConflictingReferenceConstraint' => __DIR__ . '/../..' . '/src/Psalm/Issue/ConflictingReferenceConstraint.php', 'Psalm\\Issue\\ConstantDeclarationInTrait' => __DIR__ . '/../..' . '/src/Psalm/Issue/ConstantDeclarationInTrait.php', 'Psalm\\Issue\\ConstructorSignatureMismatch' => __DIR__ . '/../..' . '/src/Psalm/Issue/ConstructorSignatureMismatch.php', 'Psalm\\Issue\\ContinueOutsideLoop' => __DIR__ . '/../..' . '/src/Psalm/Issue/ContinueOutsideLoop.php', 'Psalm\\Issue\\DeprecatedClass' => __DIR__ . '/../..' . '/src/Psalm/Issue/DeprecatedClass.php', 'Psalm\\Issue\\DeprecatedConstant' => __DIR__ . '/../..' . '/src/Psalm/Issue/DeprecatedConstant.php', 'Psalm\\Issue\\DeprecatedFunction' => __DIR__ . '/../..' . '/src/Psalm/Issue/DeprecatedFunction.php', 'Psalm\\Issue\\DeprecatedInterface' => __DIR__ . '/../..' . '/src/Psalm/Issue/DeprecatedInterface.php', 'Psalm\\Issue\\DeprecatedMethod' => __DIR__ . '/../..' . '/src/Psalm/Issue/DeprecatedMethod.php', 'Psalm\\Issue\\DeprecatedProperty' => __DIR__ . '/../..' . '/src/Psalm/Issue/DeprecatedProperty.php', 'Psalm\\Issue\\DeprecatedTrait' => __DIR__ . '/../..' . '/src/Psalm/Issue/DeprecatedTrait.php', 'Psalm\\Issue\\DocblockTypeContradiction' => __DIR__ . '/../..' . '/src/Psalm/Issue/DocblockTypeContradiction.php', 'Psalm\\Issue\\DuplicateArrayKey' => __DIR__ . '/../..' . '/src/Psalm/Issue/DuplicateArrayKey.php', 'Psalm\\Issue\\DuplicateClass' => __DIR__ . '/../..' . '/src/Psalm/Issue/DuplicateClass.php', 'Psalm\\Issue\\DuplicateConstant' => __DIR__ . '/../..' . '/src/Psalm/Issue/DuplicateConstant.php', 'Psalm\\Issue\\DuplicateEnumCase' => __DIR__ . '/../..' . '/src/Psalm/Issue/DuplicateEnumCase.php', 'Psalm\\Issue\\DuplicateEnumCaseValue' => __DIR__ . '/../..' . '/src/Psalm/Issue/DuplicateEnumCaseValue.php', 'Psalm\\Issue\\DuplicateFunction' => __DIR__ . '/../..' . '/src/Psalm/Issue/DuplicateFunction.php', 'Psalm\\Issue\\DuplicateMethod' => __DIR__ . '/../..' . '/src/Psalm/Issue/DuplicateMethod.php', 'Psalm\\Issue\\DuplicateParam' => __DIR__ . '/../..' . '/src/Psalm/Issue/DuplicateParam.php', 'Psalm\\Issue\\EmptyArrayAccess' => __DIR__ . '/../..' . '/src/Psalm/Issue/EmptyArrayAccess.php', 'Psalm\\Issue\\ExtensionRequirementViolation' => __DIR__ . '/../..' . '/src/Psalm/Issue/ExtensionRequirementViolation.php', 'Psalm\\Issue\\FalsableReturnStatement' => __DIR__ . '/../..' . '/src/Psalm/Issue/FalsableReturnStatement.php', 'Psalm\\Issue\\FalseOperand' => __DIR__ . '/../..' . '/src/Psalm/Issue/FalseOperand.php', 'Psalm\\Issue\\ForbiddenCode' => __DIR__ . '/../..' . '/src/Psalm/Issue/ForbiddenCode.php', 'Psalm\\Issue\\FunctionIssue' => __DIR__ . '/../..' . '/src/Psalm/Issue/FunctionIssue.php', 'Psalm\\Issue\\IfThisIsMismatch' => __DIR__ . '/../..' . '/src/Psalm/Issue/IfThisIsMismatch.php', 'Psalm\\Issue\\ImplementationRequirementViolation' => __DIR__ . '/../..' . '/src/Psalm/Issue/ImplementationRequirementViolation.php', 'Psalm\\Issue\\ImplementedParamTypeMismatch' => __DIR__ . '/../..' . '/src/Psalm/Issue/ImplementedParamTypeMismatch.php', 'Psalm\\Issue\\ImplementedReturnTypeMismatch' => __DIR__ . '/../..' . '/src/Psalm/Issue/ImplementedReturnTypeMismatch.php', 'Psalm\\Issue\\ImplicitToStringCast' => __DIR__ . '/../..' . '/src/Psalm/Issue/ImplicitToStringCast.php', 'Psalm\\Issue\\ImpureByReferenceAssignment' => __DIR__ . '/../..' . '/src/Psalm/Issue/ImpureByReferenceAssignment.php', 'Psalm\\Issue\\ImpureFunctionCall' => __DIR__ . '/../..' . '/src/Psalm/Issue/ImpureFunctionCall.php', 'Psalm\\Issue\\ImpureMethodCall' => __DIR__ . '/../..' . '/src/Psalm/Issue/ImpureMethodCall.php', 'Psalm\\Issue\\ImpurePropertyAssignment' => __DIR__ . '/../..' . '/src/Psalm/Issue/ImpurePropertyAssignment.php', 'Psalm\\Issue\\ImpurePropertyFetch' => __DIR__ . '/../..' . '/src/Psalm/Issue/ImpurePropertyFetch.php', 'Psalm\\Issue\\ImpureStaticProperty' => __DIR__ . '/../..' . '/src/Psalm/Issue/ImpureStaticProperty.php', 'Psalm\\Issue\\ImpureStaticVariable' => __DIR__ . '/../..' . '/src/Psalm/Issue/ImpureStaticVariable.php', 'Psalm\\Issue\\ImpureVariable' => __DIR__ . '/../..' . '/src/Psalm/Issue/ImpureVariable.php', 'Psalm\\Issue\\InaccessibleClassConstant' => __DIR__ . '/../..' . '/src/Psalm/Issue/InaccessibleClassConstant.php', 'Psalm\\Issue\\InaccessibleMethod' => __DIR__ . '/../..' . '/src/Psalm/Issue/InaccessibleMethod.php', 'Psalm\\Issue\\InaccessibleProperty' => __DIR__ . '/../..' . '/src/Psalm/Issue/InaccessibleProperty.php', 'Psalm\\Issue\\InterfaceInstantiation' => __DIR__ . '/../..' . '/src/Psalm/Issue/InterfaceInstantiation.php', 'Psalm\\Issue\\InternalClass' => __DIR__ . '/../..' . '/src/Psalm/Issue/InternalClass.php', 'Psalm\\Issue\\InternalMethod' => __DIR__ . '/../..' . '/src/Psalm/Issue/InternalMethod.php', 'Psalm\\Issue\\InternalProperty' => __DIR__ . '/../..' . '/src/Psalm/Issue/InternalProperty.php', 'Psalm\\Issue\\InvalidArgument' => __DIR__ . '/../..' . '/src/Psalm/Issue/InvalidArgument.php', 'Psalm\\Issue\\InvalidArrayAccess' => __DIR__ . '/../..' . '/src/Psalm/Issue/InvalidArrayAccess.php', 'Psalm\\Issue\\InvalidArrayAssignment' => __DIR__ . '/../..' . '/src/Psalm/Issue/InvalidArrayAssignment.php', 'Psalm\\Issue\\InvalidArrayOffset' => __DIR__ . '/../..' . '/src/Psalm/Issue/InvalidArrayOffset.php', 'Psalm\\Issue\\InvalidAttribute' => __DIR__ . '/../..' . '/src/Psalm/Issue/InvalidAttribute.php', 'Psalm\\Issue\\InvalidCast' => __DIR__ . '/../..' . '/src/Psalm/Issue/InvalidCast.php', 'Psalm\\Issue\\InvalidCatch' => __DIR__ . '/../..' . '/src/Psalm/Issue/InvalidCatch.php', 'Psalm\\Issue\\InvalidClass' => __DIR__ . '/../..' . '/src/Psalm/Issue/InvalidClass.php', 'Psalm\\Issue\\InvalidClassConstantType' => __DIR__ . '/../..' . '/src/Psalm/Issue/InvalidClassConstantType.php', 'Psalm\\Issue\\InvalidClone' => __DIR__ . '/../..' . '/src/Psalm/Issue/InvalidClone.php', 'Psalm\\Issue\\InvalidConstantAssignmentValue' => __DIR__ . '/../..' . '/src/Psalm/Issue/InvalidConstantAssignmentValue.php', 'Psalm\\Issue\\InvalidDocblock' => __DIR__ . '/../..' . '/src/Psalm/Issue/InvalidDocblock.php', 'Psalm\\Issue\\InvalidDocblockParamName' => __DIR__ . '/../..' . '/src/Psalm/Issue/InvalidDocblockParamName.php', 'Psalm\\Issue\\InvalidEnumBackingType' => __DIR__ . '/../..' . '/src/Psalm/Issue/InvalidEnumBackingType.php', 'Psalm\\Issue\\InvalidEnumCaseValue' => __DIR__ . '/../..' . '/src/Psalm/Issue/InvalidEnumCaseValue.php', 'Psalm\\Issue\\InvalidEnumMethod' => __DIR__ . '/../..' . '/src/Psalm/Issue/InvalidEnumMethod.php', 'Psalm\\Issue\\InvalidExtendClass' => __DIR__ . '/../..' . '/src/Psalm/Issue/InvalidExtendClass.php', 'Psalm\\Issue\\InvalidFalsableReturnType' => __DIR__ . '/../..' . '/src/Psalm/Issue/InvalidFalsableReturnType.php', 'Psalm\\Issue\\InvalidFunctionCall' => __DIR__ . '/../..' . '/src/Psalm/Issue/InvalidFunctionCall.php', 'Psalm\\Issue\\InvalidGlobal' => __DIR__ . '/../..' . '/src/Psalm/Issue/InvalidGlobal.php', 'Psalm\\Issue\\InvalidIterator' => __DIR__ . '/../..' . '/src/Psalm/Issue/InvalidIterator.php', 'Psalm\\Issue\\InvalidLiteralArgument' => __DIR__ . '/../..' . '/src/Psalm/Issue/InvalidLiteralArgument.php', 'Psalm\\Issue\\InvalidMethodCall' => __DIR__ . '/../..' . '/src/Psalm/Issue/InvalidMethodCall.php', 'Psalm\\Issue\\InvalidNamedArgument' => __DIR__ . '/../..' . '/src/Psalm/Issue/InvalidNamedArgument.php', 'Psalm\\Issue\\InvalidNullableReturnType' => __DIR__ . '/../..' . '/src/Psalm/Issue/InvalidNullableReturnType.php', 'Psalm\\Issue\\InvalidOperand' => __DIR__ . '/../..' . '/src/Psalm/Issue/InvalidOperand.php', 'Psalm\\Issue\\InvalidParamDefault' => __DIR__ . '/../..' . '/src/Psalm/Issue/InvalidParamDefault.php', 'Psalm\\Issue\\InvalidParent' => __DIR__ . '/../..' . '/src/Psalm/Issue/InvalidParent.php', 'Psalm\\Issue\\InvalidPassByReference' => __DIR__ . '/../..' . '/src/Psalm/Issue/InvalidPassByReference.php', 'Psalm\\Issue\\InvalidPropertyAssignment' => __DIR__ . '/../..' . '/src/Psalm/Issue/InvalidPropertyAssignment.php', 'Psalm\\Issue\\InvalidPropertyAssignmentValue' => __DIR__ . '/../..' . '/src/Psalm/Issue/InvalidPropertyAssignmentValue.php', 'Psalm\\Issue\\InvalidPropertyFetch' => __DIR__ . '/../..' . '/src/Psalm/Issue/InvalidPropertyFetch.php', 'Psalm\\Issue\\InvalidReturnStatement' => __DIR__ . '/../..' . '/src/Psalm/Issue/InvalidReturnStatement.php', 'Psalm\\Issue\\InvalidReturnType' => __DIR__ . '/../..' . '/src/Psalm/Issue/InvalidReturnType.php', 'Psalm\\Issue\\InvalidScalarArgument' => __DIR__ . '/../..' . '/src/Psalm/Issue/InvalidScalarArgument.php', 'Psalm\\Issue\\InvalidScope' => __DIR__ . '/../..' . '/src/Psalm/Issue/InvalidScope.php', 'Psalm\\Issue\\InvalidStaticInvocation' => __DIR__ . '/../..' . '/src/Psalm/Issue/InvalidStaticInvocation.php', 'Psalm\\Issue\\InvalidStringClass' => __DIR__ . '/../..' . '/src/Psalm/Issue/InvalidStringClass.php', 'Psalm\\Issue\\InvalidTemplateParam' => __DIR__ . '/../..' . '/src/Psalm/Issue/InvalidTemplateParam.php', 'Psalm\\Issue\\InvalidThrow' => __DIR__ . '/../..' . '/src/Psalm/Issue/InvalidThrow.php', 'Psalm\\Issue\\InvalidToString' => __DIR__ . '/../..' . '/src/Psalm/Issue/InvalidToString.php', 'Psalm\\Issue\\InvalidTraversableImplementation' => __DIR__ . '/../..' . '/src/Psalm/Issue/InvalidTraversableImplementation.php', 'Psalm\\Issue\\InvalidTypeImport' => __DIR__ . '/../..' . '/src/Psalm/Issue/InvalidTypeImport.php', 'Psalm\\Issue\\LessSpecificClassConstantType' => __DIR__ . '/../..' . '/src/Psalm/Issue/LessSpecificClassConstantType.php', 'Psalm\\Issue\\LessSpecificImplementedReturnType' => __DIR__ . '/../..' . '/src/Psalm/Issue/LessSpecificImplementedReturnType.php', 'Psalm\\Issue\\LessSpecificReturnStatement' => __DIR__ . '/../..' . '/src/Psalm/Issue/LessSpecificReturnStatement.php', 'Psalm\\Issue\\LessSpecificReturnType' => __DIR__ . '/../..' . '/src/Psalm/Issue/LessSpecificReturnType.php', 'Psalm\\Issue\\LoopInvalidation' => __DIR__ . '/../..' . '/src/Psalm/Issue/LoopInvalidation.php', 'Psalm\\Issue\\MethodIssue' => __DIR__ . '/../..' . '/src/Psalm/Issue/MethodIssue.php', 'Psalm\\Issue\\MethodSignatureMismatch' => __DIR__ . '/../..' . '/src/Psalm/Issue/MethodSignatureMismatch.php', 'Psalm\\Issue\\MethodSignatureMustOmitReturnType' => __DIR__ . '/../..' . '/src/Psalm/Issue/MethodSignatureMustOmitReturnType.php', 'Psalm\\Issue\\MethodSignatureMustProvideReturnType' => __DIR__ . '/../..' . '/src/Psalm/Issue/MethodSignatureMustProvideReturnType.php', 'Psalm\\Issue\\MismatchingDocblockParamType' => __DIR__ . '/../..' . '/src/Psalm/Issue/MismatchingDocblockParamType.php', 'Psalm\\Issue\\MismatchingDocblockPropertyType' => __DIR__ . '/../..' . '/src/Psalm/Issue/MismatchingDocblockPropertyType.php', 'Psalm\\Issue\\MismatchingDocblockReturnType' => __DIR__ . '/../..' . '/src/Psalm/Issue/MismatchingDocblockReturnType.php', 'Psalm\\Issue\\MissingClosureParamType' => __DIR__ . '/../..' . '/src/Psalm/Issue/MissingClosureParamType.php', 'Psalm\\Issue\\MissingClosureReturnType' => __DIR__ . '/../..' . '/src/Psalm/Issue/MissingClosureReturnType.php', 'Psalm\\Issue\\MissingConstructor' => __DIR__ . '/../..' . '/src/Psalm/Issue/MissingConstructor.php', 'Psalm\\Issue\\MissingDependency' => __DIR__ . '/../..' . '/src/Psalm/Issue/MissingDependency.php', 'Psalm\\Issue\\MissingDocblockType' => __DIR__ . '/../..' . '/src/Psalm/Issue/MissingDocblockType.php', 'Psalm\\Issue\\MissingFile' => __DIR__ . '/../..' . '/src/Psalm/Issue/MissingFile.php', 'Psalm\\Issue\\MissingImmutableAnnotation' => __DIR__ . '/../..' . '/src/Psalm/Issue/MissingImmutableAnnotation.php', 'Psalm\\Issue\\MissingParamType' => __DIR__ . '/../..' . '/src/Psalm/Issue/MissingParamType.php', 'Psalm\\Issue\\MissingPropertyType' => __DIR__ . '/../..' . '/src/Psalm/Issue/MissingPropertyType.php', 'Psalm\\Issue\\MissingReturnType' => __DIR__ . '/../..' . '/src/Psalm/Issue/MissingReturnType.php', 'Psalm\\Issue\\MissingTemplateParam' => __DIR__ . '/../..' . '/src/Psalm/Issue/MissingTemplateParam.php', 'Psalm\\Issue\\MissingThrowsDocblock' => __DIR__ . '/../..' . '/src/Psalm/Issue/MissingThrowsDocblock.php', 'Psalm\\Issue\\MixedArgument' => __DIR__ . '/../..' . '/src/Psalm/Issue/MixedArgument.php', 'Psalm\\Issue\\MixedArgumentTypeCoercion' => __DIR__ . '/../..' . '/src/Psalm/Issue/MixedArgumentTypeCoercion.php', 'Psalm\\Issue\\MixedArrayAccess' => __DIR__ . '/../..' . '/src/Psalm/Issue/MixedArrayAccess.php', 'Psalm\\Issue\\MixedArrayAssignment' => __DIR__ . '/../..' . '/src/Psalm/Issue/MixedArrayAssignment.php', 'Psalm\\Issue\\MixedArrayOffset' => __DIR__ . '/../..' . '/src/Psalm/Issue/MixedArrayOffset.php', 'Psalm\\Issue\\MixedArrayTypeCoercion' => __DIR__ . '/../..' . '/src/Psalm/Issue/MixedArrayTypeCoercion.php', 'Psalm\\Issue\\MixedAssignment' => __DIR__ . '/../..' . '/src/Psalm/Issue/MixedAssignment.php', 'Psalm\\Issue\\MixedClone' => __DIR__ . '/../..' . '/src/Psalm/Issue/MixedClone.php', 'Psalm\\Issue\\MixedFunctionCall' => __DIR__ . '/../..' . '/src/Psalm/Issue/MixedFunctionCall.php', 'Psalm\\Issue\\MixedInferredReturnType' => __DIR__ . '/../..' . '/src/Psalm/Issue/MixedInferredReturnType.php', 'Psalm\\Issue\\MixedIssue' => __DIR__ . '/../..' . '/src/Psalm/Issue/MixedIssue.php', 'Psalm\\Issue\\MixedIssueTrait' => __DIR__ . '/../..' . '/src/Psalm/Issue/MixedIssueTrait.php', 'Psalm\\Issue\\MixedMethodCall' => __DIR__ . '/../..' . '/src/Psalm/Issue/MixedMethodCall.php', 'Psalm\\Issue\\MixedOperand' => __DIR__ . '/../..' . '/src/Psalm/Issue/MixedOperand.php', 'Psalm\\Issue\\MixedPropertyAssignment' => __DIR__ . '/../..' . '/src/Psalm/Issue/MixedPropertyAssignment.php', 'Psalm\\Issue\\MixedPropertyFetch' => __DIR__ . '/../..' . '/src/Psalm/Issue/MixedPropertyFetch.php', 'Psalm\\Issue\\MixedPropertyTypeCoercion' => __DIR__ . '/../..' . '/src/Psalm/Issue/MixedPropertyTypeCoercion.php', 'Psalm\\Issue\\MixedReturnStatement' => __DIR__ . '/../..' . '/src/Psalm/Issue/MixedReturnStatement.php', 'Psalm\\Issue\\MixedReturnTypeCoercion' => __DIR__ . '/../..' . '/src/Psalm/Issue/MixedReturnTypeCoercion.php', 'Psalm\\Issue\\MixedStringOffsetAssignment' => __DIR__ . '/../..' . '/src/Psalm/Issue/MixedStringOffsetAssignment.php', 'Psalm\\Issue\\MoreSpecificImplementedParamType' => __DIR__ . '/../..' . '/src/Psalm/Issue/MoreSpecificImplementedParamType.php', 'Psalm\\Issue\\MoreSpecificReturnType' => __DIR__ . '/../..' . '/src/Psalm/Issue/MoreSpecificReturnType.php', 'Psalm\\Issue\\MutableDependency' => __DIR__ . '/../..' . '/src/Psalm/Issue/MutableDependency.php', 'Psalm\\Issue\\NamedArgumentNotAllowed' => __DIR__ . '/../..' . '/src/Psalm/Issue/NamedArgumentNotAllowed.php', 'Psalm\\Issue\\NoEnumProperties' => __DIR__ . '/../..' . '/src/Psalm/Issue/NoEnumProperties.php', 'Psalm\\Issue\\NoInterfaceProperties' => __DIR__ . '/../..' . '/src/Psalm/Issue/NoInterfaceProperties.php', 'Psalm\\Issue\\NoValue' => __DIR__ . '/../..' . '/src/Psalm/Issue/NoValue.php', 'Psalm\\Issue\\NonInvariantDocblockPropertyType' => __DIR__ . '/../..' . '/src/Psalm/Issue/NonInvariantDocblockPropertyType.php', 'Psalm\\Issue\\NonInvariantPropertyType' => __DIR__ . '/../..' . '/src/Psalm/Issue/NonInvariantPropertyType.php', 'Psalm\\Issue\\NonStaticSelfCall' => __DIR__ . '/../..' . '/src/Psalm/Issue/NonStaticSelfCall.php', 'Psalm\\Issue\\NullArgument' => __DIR__ . '/../..' . '/src/Psalm/Issue/NullArgument.php', 'Psalm\\Issue\\NullArrayAccess' => __DIR__ . '/../..' . '/src/Psalm/Issue/NullArrayAccess.php', 'Psalm\\Issue\\NullArrayOffset' => __DIR__ . '/../..' . '/src/Psalm/Issue/NullArrayOffset.php', 'Psalm\\Issue\\NullFunctionCall' => __DIR__ . '/../..' . '/src/Psalm/Issue/NullFunctionCall.php', 'Psalm\\Issue\\NullIterator' => __DIR__ . '/../..' . '/src/Psalm/Issue/NullIterator.php', 'Psalm\\Issue\\NullOperand' => __DIR__ . '/../..' . '/src/Psalm/Issue/NullOperand.php', 'Psalm\\Issue\\NullPropertyAssignment' => __DIR__ . '/../..' . '/src/Psalm/Issue/NullPropertyAssignment.php', 'Psalm\\Issue\\NullPropertyFetch' => __DIR__ . '/../..' . '/src/Psalm/Issue/NullPropertyFetch.php', 'Psalm\\Issue\\NullReference' => __DIR__ . '/../..' . '/src/Psalm/Issue/NullReference.php', 'Psalm\\Issue\\NullableReturnStatement' => __DIR__ . '/../..' . '/src/Psalm/Issue/NullableReturnStatement.php', 'Psalm\\Issue\\OverriddenFinalConstant' => __DIR__ . '/../..' . '/src/Psalm/Issue/OverriddenFinalConstant.php', 'Psalm\\Issue\\OverriddenInterfaceConstant' => __DIR__ . '/../..' . '/src/Psalm/Issue/OverriddenInterfaceConstant.php', 'Psalm\\Issue\\OverriddenMethodAccess' => __DIR__ . '/../..' . '/src/Psalm/Issue/OverriddenMethodAccess.php', 'Psalm\\Issue\\OverriddenPropertyAccess' => __DIR__ . '/../..' . '/src/Psalm/Issue/OverriddenPropertyAccess.php', 'Psalm\\Issue\\ParadoxicalCondition' => __DIR__ . '/../..' . '/src/Psalm/Issue/ParadoxicalCondition.php', 'Psalm\\Issue\\ParamNameMismatch' => __DIR__ . '/../..' . '/src/Psalm/Issue/ParamNameMismatch.php', 'Psalm\\Issue\\ParentNotFound' => __DIR__ . '/../..' . '/src/Psalm/Issue/ParentNotFound.php', 'Psalm\\Issue\\ParseError' => __DIR__ . '/../..' . '/src/Psalm/Issue/ParseError.php', 'Psalm\\Issue\\PluginIssue' => __DIR__ . '/../..' . '/src/Psalm/Issue/PluginIssue.php', 'Psalm\\Issue\\PossibleRawObjectIteration' => __DIR__ . '/../..' . '/src/Psalm/Issue/PossibleRawObjectIteration.php', 'Psalm\\Issue\\PossiblyFalseArgument' => __DIR__ . '/../..' . '/src/Psalm/Issue/PossiblyFalseArgument.php', 'Psalm\\Issue\\PossiblyFalseIterator' => __DIR__ . '/../..' . '/src/Psalm/Issue/PossiblyFalseIterator.php', 'Psalm\\Issue\\PossiblyFalseOperand' => __DIR__ . '/../..' . '/src/Psalm/Issue/PossiblyFalseOperand.php', 'Psalm\\Issue\\PossiblyFalsePropertyAssignmentValue' => __DIR__ . '/../..' . '/src/Psalm/Issue/PossiblyFalsePropertyAssignmentValue.php', 'Psalm\\Issue\\PossiblyFalseReference' => __DIR__ . '/../..' . '/src/Psalm/Issue/PossiblyFalseReference.php', 'Psalm\\Issue\\PossiblyInvalidArgument' => __DIR__ . '/../..' . '/src/Psalm/Issue/PossiblyInvalidArgument.php', 'Psalm\\Issue\\PossiblyInvalidArrayAccess' => __DIR__ . '/../..' . '/src/Psalm/Issue/PossiblyInvalidArrayAccess.php', 'Psalm\\Issue\\PossiblyInvalidArrayAssignment' => __DIR__ . '/../..' . '/src/Psalm/Issue/PossiblyInvalidArrayAssignment.php', 'Psalm\\Issue\\PossiblyInvalidArrayOffset' => __DIR__ . '/../..' . '/src/Psalm/Issue/PossiblyInvalidArrayOffset.php', 'Psalm\\Issue\\PossiblyInvalidCast' => __DIR__ . '/../..' . '/src/Psalm/Issue/PossiblyInvalidCast.php', 'Psalm\\Issue\\PossiblyInvalidClone' => __DIR__ . '/../..' . '/src/Psalm/Issue/PossiblyInvalidClone.php', 'Psalm\\Issue\\PossiblyInvalidDocblockTag' => __DIR__ . '/../..' . '/src/Psalm/Issue/PossiblyInvalidDocblockTag.php', 'Psalm\\Issue\\PossiblyInvalidFunctionCall' => __DIR__ . '/../..' . '/src/Psalm/Issue/PossiblyInvalidFunctionCall.php', 'Psalm\\Issue\\PossiblyInvalidIterator' => __DIR__ . '/../..' . '/src/Psalm/Issue/PossiblyInvalidIterator.php', 'Psalm\\Issue\\PossiblyInvalidMethodCall' => __DIR__ . '/../..' . '/src/Psalm/Issue/PossiblyInvalidMethodCall.php', 'Psalm\\Issue\\PossiblyInvalidOperand' => __DIR__ . '/../..' . '/src/Psalm/Issue/PossiblyInvalidOperand.php', 'Psalm\\Issue\\PossiblyInvalidPropertyAssignment' => __DIR__ . '/../..' . '/src/Psalm/Issue/PossiblyInvalidPropertyAssignment.php', 'Psalm\\Issue\\PossiblyInvalidPropertyAssignmentValue' => __DIR__ . '/../..' . '/src/Psalm/Issue/PossiblyInvalidPropertyAssignmentValue.php', 'Psalm\\Issue\\PossiblyInvalidPropertyFetch' => __DIR__ . '/../..' . '/src/Psalm/Issue/PossiblyInvalidPropertyFetch.php', 'Psalm\\Issue\\PossiblyNullArgument' => __DIR__ . '/../..' . '/src/Psalm/Issue/PossiblyNullArgument.php', 'Psalm\\Issue\\PossiblyNullArrayAccess' => __DIR__ . '/../..' . '/src/Psalm/Issue/PossiblyNullArrayAccess.php', 'Psalm\\Issue\\PossiblyNullArrayAssignment' => __DIR__ . '/../..' . '/src/Psalm/Issue/PossiblyNullArrayAssignment.php', 'Psalm\\Issue\\PossiblyNullArrayOffset' => __DIR__ . '/../..' . '/src/Psalm/Issue/PossiblyNullArrayOffset.php', 'Psalm\\Issue\\PossiblyNullFunctionCall' => __DIR__ . '/../..' . '/src/Psalm/Issue/PossiblyNullFunctionCall.php', 'Psalm\\Issue\\PossiblyNullIterator' => __DIR__ . '/../..' . '/src/Psalm/Issue/PossiblyNullIterator.php', 'Psalm\\Issue\\PossiblyNullOperand' => __DIR__ . '/../..' . '/src/Psalm/Issue/PossiblyNullOperand.php', 'Psalm\\Issue\\PossiblyNullPropertyAssignment' => __DIR__ . '/../..' . '/src/Psalm/Issue/PossiblyNullPropertyAssignment.php', 'Psalm\\Issue\\PossiblyNullPropertyAssignmentValue' => __DIR__ . '/../..' . '/src/Psalm/Issue/PossiblyNullPropertyAssignmentValue.php', 'Psalm\\Issue\\PossiblyNullPropertyFetch' => __DIR__ . '/../..' . '/src/Psalm/Issue/PossiblyNullPropertyFetch.php', 'Psalm\\Issue\\PossiblyNullReference' => __DIR__ . '/../..' . '/src/Psalm/Issue/PossiblyNullReference.php', 'Psalm\\Issue\\PossiblyUndefinedArrayOffset' => __DIR__ . '/../..' . '/src/Psalm/Issue/PossiblyUndefinedArrayOffset.php', 'Psalm\\Issue\\PossiblyUndefinedGlobalVariable' => __DIR__ . '/../..' . '/src/Psalm/Issue/PossiblyUndefinedGlobalVariable.php', 'Psalm\\Issue\\PossiblyUndefinedIntArrayOffset' => __DIR__ . '/../..' . '/src/Psalm/Issue/PossiblyUndefinedIntArrayOffset.php', 'Psalm\\Issue\\PossiblyUndefinedMethod' => __DIR__ . '/../..' . '/src/Psalm/Issue/PossiblyUndefinedMethod.php', 'Psalm\\Issue\\PossiblyUndefinedStringArrayOffset' => __DIR__ . '/../..' . '/src/Psalm/Issue/PossiblyUndefinedStringArrayOffset.php', 'Psalm\\Issue\\PossiblyUndefinedVariable' => __DIR__ . '/../..' . '/src/Psalm/Issue/PossiblyUndefinedVariable.php', 'Psalm\\Issue\\PossiblyUnusedMethod' => __DIR__ . '/../..' . '/src/Psalm/Issue/PossiblyUnusedMethod.php', 'Psalm\\Issue\\PossiblyUnusedParam' => __DIR__ . '/../..' . '/src/Psalm/Issue/PossiblyUnusedParam.php', 'Psalm\\Issue\\PossiblyUnusedProperty' => __DIR__ . '/../..' . '/src/Psalm/Issue/PossiblyUnusedProperty.php', 'Psalm\\Issue\\PossiblyUnusedReturnValue' => __DIR__ . '/../..' . '/src/Psalm/Issue/PossiblyUnusedReturnValue.php', 'Psalm\\Issue\\PropertyIssue' => __DIR__ . '/../..' . '/src/Psalm/Issue/PropertyIssue.php', 'Psalm\\Issue\\PropertyNotSetInConstructor' => __DIR__ . '/../..' . '/src/Psalm/Issue/PropertyNotSetInConstructor.php', 'Psalm\\Issue\\PropertyTypeCoercion' => __DIR__ . '/../..' . '/src/Psalm/Issue/PropertyTypeCoercion.php', 'Psalm\\Issue\\PsalmInternalError' => __DIR__ . '/../..' . '/src/Psalm/Issue/PsalmInternalError.php', 'Psalm\\Issue\\RawObjectIteration' => __DIR__ . '/../..' . '/src/Psalm/Issue/RawObjectIteration.php', 'Psalm\\Issue\\RedundantCast' => __DIR__ . '/../..' . '/src/Psalm/Issue/RedundantCast.php', 'Psalm\\Issue\\RedundantCastGivenDocblockType' => __DIR__ . '/../..' . '/src/Psalm/Issue/RedundantCastGivenDocblockType.php', 'Psalm\\Issue\\RedundantCondition' => __DIR__ . '/../..' . '/src/Psalm/Issue/RedundantCondition.php', 'Psalm\\Issue\\RedundantConditionGivenDocblockType' => __DIR__ . '/../..' . '/src/Psalm/Issue/RedundantConditionGivenDocblockType.php', 'Psalm\\Issue\\RedundantFunctionCall' => __DIR__ . '/../..' . '/src/Psalm/Issue/RedundantFunctionCall.php', 'Psalm\\Issue\\RedundantFunctionCallGivenDocblockType' => __DIR__ . '/../..' . '/src/Psalm/Issue/RedundantFunctionCallGivenDocblockType.php', 'Psalm\\Issue\\RedundantIdentityWithTrue' => __DIR__ . '/../..' . '/src/Psalm/Issue/RedundantIdentityWithTrue.php', 'Psalm\\Issue\\RedundantPropertyInitializationCheck' => __DIR__ . '/../..' . '/src/Psalm/Issue/RedundantPropertyInitializationCheck.php', 'Psalm\\Issue\\ReferenceConstraintViolation' => __DIR__ . '/../..' . '/src/Psalm/Issue/ReferenceConstraintViolation.php', 'Psalm\\Issue\\ReferenceReusedFromConfusingScope' => __DIR__ . '/../..' . '/src/Psalm/Issue/ReferenceReusedFromConfusingScope.php', 'Psalm\\Issue\\ReservedWord' => __DIR__ . '/../..' . '/src/Psalm/Issue/ReservedWord.php', 'Psalm\\Issue\\RiskyCast' => __DIR__ . '/../..' . '/src/Psalm/Issue/RiskyCast.php', 'Psalm\\Issue\\StringIncrement' => __DIR__ . '/../..' . '/src/Psalm/Issue/StringIncrement.php', 'Psalm\\Issue\\TaintedCallable' => __DIR__ . '/../..' . '/src/Psalm/Issue/TaintedCallable.php', 'Psalm\\Issue\\TaintedCookie' => __DIR__ . '/../..' . '/src/Psalm/Issue/TaintedCookie.php', 'Psalm\\Issue\\TaintedCustom' => __DIR__ . '/../..' . '/src/Psalm/Issue/TaintedCustom.php', 'Psalm\\Issue\\TaintedEval' => __DIR__ . '/../..' . '/src/Psalm/Issue/TaintedEval.php', 'Psalm\\Issue\\TaintedFile' => __DIR__ . '/../..' . '/src/Psalm/Issue/TaintedFile.php', 'Psalm\\Issue\\TaintedHeader' => __DIR__ . '/../..' . '/src/Psalm/Issue/TaintedHeader.php', 'Psalm\\Issue\\TaintedHtml' => __DIR__ . '/../..' . '/src/Psalm/Issue/TaintedHtml.php', 'Psalm\\Issue\\TaintedInclude' => __DIR__ . '/../..' . '/src/Psalm/Issue/TaintedInclude.php', 'Psalm\\Issue\\TaintedInput' => __DIR__ . '/../..' . '/src/Psalm/Issue/TaintedInput.php', 'Psalm\\Issue\\TaintedLdap' => __DIR__ . '/../..' . '/src/Psalm/Issue/TaintedLdap.php', 'Psalm\\Issue\\TaintedSSRF' => __DIR__ . '/../..' . '/src/Psalm/Issue/TaintedSSRF.php', 'Psalm\\Issue\\TaintedShell' => __DIR__ . '/../..' . '/src/Psalm/Issue/TaintedShell.php', 'Psalm\\Issue\\TaintedSql' => __DIR__ . '/../..' . '/src/Psalm/Issue/TaintedSql.php', 'Psalm\\Issue\\TaintedSystemSecret' => __DIR__ . '/../..' . '/src/Psalm/Issue/TaintedSystemSecret.php', 'Psalm\\Issue\\TaintedTextWithQuotes' => __DIR__ . '/../..' . '/src/Psalm/Issue/TaintedTextWithQuotes.php', 'Psalm\\Issue\\TaintedUnserialize' => __DIR__ . '/../..' . '/src/Psalm/Issue/TaintedUnserialize.php', 'Psalm\\Issue\\TaintedUserSecret' => __DIR__ . '/../..' . '/src/Psalm/Issue/TaintedUserSecret.php', 'Psalm\\Issue\\TooFewArguments' => __DIR__ . '/../..' . '/src/Psalm/Issue/TooFewArguments.php', 'Psalm\\Issue\\TooManyArguments' => __DIR__ . '/../..' . '/src/Psalm/Issue/TooManyArguments.php', 'Psalm\\Issue\\TooManyTemplateParams' => __DIR__ . '/../..' . '/src/Psalm/Issue/TooManyTemplateParams.php', 'Psalm\\Issue\\Trace' => __DIR__ . '/../..' . '/src/Psalm/Issue/Trace.php', 'Psalm\\Issue\\TraitMethodSignatureMismatch' => __DIR__ . '/../..' . '/src/Psalm/Issue/TraitMethodSignatureMismatch.php', 'Psalm\\Issue\\TypeDoesNotContainNull' => __DIR__ . '/../..' . '/src/Psalm/Issue/TypeDoesNotContainNull.php', 'Psalm\\Issue\\TypeDoesNotContainType' => __DIR__ . '/../..' . '/src/Psalm/Issue/TypeDoesNotContainType.php', 'Psalm\\Issue\\UncaughtThrowInGlobalScope' => __DIR__ . '/../..' . '/src/Psalm/Issue/UncaughtThrowInGlobalScope.php', 'Psalm\\Issue\\UndefinedAttributeClass' => __DIR__ . '/../..' . '/src/Psalm/Issue/UndefinedAttributeClass.php', 'Psalm\\Issue\\UndefinedClass' => __DIR__ . '/../..' . '/src/Psalm/Issue/UndefinedClass.php', 'Psalm\\Issue\\UndefinedConstant' => __DIR__ . '/../..' . '/src/Psalm/Issue/UndefinedConstant.php', 'Psalm\\Issue\\UndefinedDocblockClass' => __DIR__ . '/../..' . '/src/Psalm/Issue/UndefinedDocblockClass.php', 'Psalm\\Issue\\UndefinedFunction' => __DIR__ . '/../..' . '/src/Psalm/Issue/UndefinedFunction.php', 'Psalm\\Issue\\UndefinedGlobalVariable' => __DIR__ . '/../..' . '/src/Psalm/Issue/UndefinedGlobalVariable.php', 'Psalm\\Issue\\UndefinedInterface' => __DIR__ . '/../..' . '/src/Psalm/Issue/UndefinedInterface.php', 'Psalm\\Issue\\UndefinedInterfaceMethod' => __DIR__ . '/../..' . '/src/Psalm/Issue/UndefinedInterfaceMethod.php', 'Psalm\\Issue\\UndefinedMagicMethod' => __DIR__ . '/../..' . '/src/Psalm/Issue/UndefinedMagicMethod.php', 'Psalm\\Issue\\UndefinedMagicPropertyAssignment' => __DIR__ . '/../..' . '/src/Psalm/Issue/UndefinedMagicPropertyAssignment.php', 'Psalm\\Issue\\UndefinedMagicPropertyFetch' => __DIR__ . '/../..' . '/src/Psalm/Issue/UndefinedMagicPropertyFetch.php', 'Psalm\\Issue\\UndefinedMethod' => __DIR__ . '/../..' . '/src/Psalm/Issue/UndefinedMethod.php', 'Psalm\\Issue\\UndefinedPropertyAssignment' => __DIR__ . '/../..' . '/src/Psalm/Issue/UndefinedPropertyAssignment.php', 'Psalm\\Issue\\UndefinedPropertyFetch' => __DIR__ . '/../..' . '/src/Psalm/Issue/UndefinedPropertyFetch.php', 'Psalm\\Issue\\UndefinedThisPropertyAssignment' => __DIR__ . '/../..' . '/src/Psalm/Issue/UndefinedThisPropertyAssignment.php', 'Psalm\\Issue\\UndefinedThisPropertyFetch' => __DIR__ . '/../..' . '/src/Psalm/Issue/UndefinedThisPropertyFetch.php', 'Psalm\\Issue\\UndefinedTrace' => __DIR__ . '/../..' . '/src/Psalm/Issue/UndefinedTrace.php', 'Psalm\\Issue\\UndefinedTrait' => __DIR__ . '/../..' . '/src/Psalm/Issue/UndefinedTrait.php', 'Psalm\\Issue\\UndefinedVariable' => __DIR__ . '/../..' . '/src/Psalm/Issue/UndefinedVariable.php', 'Psalm\\Issue\\UnevaluatedCode' => __DIR__ . '/../..' . '/src/Psalm/Issue/UnevaluatedCode.php', 'Psalm\\Issue\\UnhandledMatchCondition' => __DIR__ . '/../..' . '/src/Psalm/Issue/UnhandledMatchCondition.php', 'Psalm\\Issue\\UnimplementedAbstractMethod' => __DIR__ . '/../..' . '/src/Psalm/Issue/UnimplementedAbstractMethod.php', 'Psalm\\Issue\\UnimplementedInterfaceMethod' => __DIR__ . '/../..' . '/src/Psalm/Issue/UnimplementedInterfaceMethod.php', 'Psalm\\Issue\\UninitializedProperty' => __DIR__ . '/../..' . '/src/Psalm/Issue/UninitializedProperty.php', 'Psalm\\Issue\\UnnecessaryVarAnnotation' => __DIR__ . '/../..' . '/src/Psalm/Issue/UnnecessaryVarAnnotation.php', 'Psalm\\Issue\\UnrecognizedExpression' => __DIR__ . '/../..' . '/src/Psalm/Issue/UnrecognizedExpression.php', 'Psalm\\Issue\\UnrecognizedStatement' => __DIR__ . '/../..' . '/src/Psalm/Issue/UnrecognizedStatement.php', 'Psalm\\Issue\\UnresolvableConstant' => __DIR__ . '/../..' . '/src/Psalm/Issue/UnresolvableConstant.php', 'Psalm\\Issue\\UnresolvableInclude' => __DIR__ . '/../..' . '/src/Psalm/Issue/UnresolvableInclude.php', 'Psalm\\Issue\\UnsafeGenericInstantiation' => __DIR__ . '/../..' . '/src/Psalm/Issue/UnsafeGenericInstantiation.php', 'Psalm\\Issue\\UnsafeInstantiation' => __DIR__ . '/../..' . '/src/Psalm/Issue/UnsafeInstantiation.php', 'Psalm\\Issue\\UnsupportedReferenceUsage' => __DIR__ . '/../..' . '/src/Psalm/Issue/UnsupportedReferenceUsage.php', 'Psalm\\Issue\\UnusedBaselineEntry' => __DIR__ . '/../..' . '/src/Psalm/Issue/UnusedBaselineEntry.php', 'Psalm\\Issue\\UnusedClass' => __DIR__ . '/../..' . '/src/Psalm/Issue/UnusedClass.php', 'Psalm\\Issue\\UnusedClosureParam' => __DIR__ . '/../..' . '/src/Psalm/Issue/UnusedClosureParam.php', 'Psalm\\Issue\\UnusedConstructor' => __DIR__ . '/../..' . '/src/Psalm/Issue/UnusedConstructor.php', 'Psalm\\Issue\\UnusedForeachValue' => __DIR__ . '/../..' . '/src/Psalm/Issue/UnusedForeachValue.php', 'Psalm\\Issue\\UnusedFunctionCall' => __DIR__ . '/../..' . '/src/Psalm/Issue/UnusedFunctionCall.php', 'Psalm\\Issue\\UnusedMethod' => __DIR__ . '/../..' . '/src/Psalm/Issue/UnusedMethod.php', 'Psalm\\Issue\\UnusedMethodCall' => __DIR__ . '/../..' . '/src/Psalm/Issue/UnusedMethodCall.php', 'Psalm\\Issue\\UnusedParam' => __DIR__ . '/../..' . '/src/Psalm/Issue/UnusedParam.php', 'Psalm\\Issue\\UnusedProperty' => __DIR__ . '/../..' . '/src/Psalm/Issue/UnusedProperty.php', 'Psalm\\Issue\\UnusedPsalmSuppress' => __DIR__ . '/../..' . '/src/Psalm/Issue/UnusedPsalmSuppress.php', 'Psalm\\Issue\\UnusedReturnValue' => __DIR__ . '/../..' . '/src/Psalm/Issue/UnusedReturnValue.php', 'Psalm\\Issue\\UnusedVariable' => __DIR__ . '/../..' . '/src/Psalm/Issue/UnusedVariable.php', 'Psalm\\Issue\\VariableIssue' => __DIR__ . '/../..' . '/src/Psalm/Issue/VariableIssue.php', 'Psalm\\NodeTypeProvider' => __DIR__ . '/../..' . '/src/Psalm/NodeTypeProvider.php', 'Psalm\\Node\\Expr\\AssignOp\\VirtualBitwiseAnd' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/AssignOp/VirtualBitwiseAnd.php', 'Psalm\\Node\\Expr\\AssignOp\\VirtualBitwiseOr' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/AssignOp/VirtualBitwiseOr.php', 'Psalm\\Node\\Expr\\AssignOp\\VirtualBitwiseXor' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/AssignOp/VirtualBitwiseXor.php', 'Psalm\\Node\\Expr\\AssignOp\\VirtualCoalesce' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/AssignOp/VirtualCoalesce.php', 'Psalm\\Node\\Expr\\AssignOp\\VirtualConcat' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/AssignOp/VirtualConcat.php', 'Psalm\\Node\\Expr\\AssignOp\\VirtualDiv' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/AssignOp/VirtualDiv.php', 'Psalm\\Node\\Expr\\AssignOp\\VirtualMinus' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/AssignOp/VirtualMinus.php', 'Psalm\\Node\\Expr\\AssignOp\\VirtualMod' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/AssignOp/VirtualMod.php', 'Psalm\\Node\\Expr\\AssignOp\\VirtualMul' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/AssignOp/VirtualMul.php', 'Psalm\\Node\\Expr\\AssignOp\\VirtualPlus' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/AssignOp/VirtualPlus.php', 'Psalm\\Node\\Expr\\AssignOp\\VirtualPow' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/AssignOp/VirtualPow.php', 'Psalm\\Node\\Expr\\AssignOp\\VirtualShiftLeft' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/AssignOp/VirtualShiftLeft.php', 'Psalm\\Node\\Expr\\AssignOp\\VirtualShiftRight' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/AssignOp/VirtualShiftRight.php', 'Psalm\\Node\\Expr\\BinaryOp\\VirtualBitwiseAnd' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/BinaryOp/VirtualBitwiseAnd.php', 'Psalm\\Node\\Expr\\BinaryOp\\VirtualBitwiseOr' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/BinaryOp/VirtualBitwiseOr.php', 'Psalm\\Node\\Expr\\BinaryOp\\VirtualBitwiseXor' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/BinaryOp/VirtualBitwiseXor.php', 'Psalm\\Node\\Expr\\BinaryOp\\VirtualBooleanAnd' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/BinaryOp/VirtualBooleanAnd.php', 'Psalm\\Node\\Expr\\BinaryOp\\VirtualBooleanOr' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/BinaryOp/VirtualBooleanOr.php', 'Psalm\\Node\\Expr\\BinaryOp\\VirtualCoalesce' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/BinaryOp/VirtualCoalesce.php', 'Psalm\\Node\\Expr\\BinaryOp\\VirtualConcat' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/BinaryOp/VirtualConcat.php', 'Psalm\\Node\\Expr\\BinaryOp\\VirtualDiv' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/BinaryOp/VirtualDiv.php', 'Psalm\\Node\\Expr\\BinaryOp\\VirtualEqual' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/BinaryOp/VirtualEqual.php', 'Psalm\\Node\\Expr\\BinaryOp\\VirtualGreater' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/BinaryOp/VirtualGreater.php', 'Psalm\\Node\\Expr\\BinaryOp\\VirtualGreaterOrEqual' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/BinaryOp/VirtualGreaterOrEqual.php', 'Psalm\\Node\\Expr\\BinaryOp\\VirtualIdentical' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/BinaryOp/VirtualIdentical.php', 'Psalm\\Node\\Expr\\BinaryOp\\VirtualLogicalAnd' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/BinaryOp/VirtualLogicalAnd.php', 'Psalm\\Node\\Expr\\BinaryOp\\VirtualLogicalOr' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/BinaryOp/VirtualLogicalOr.php', 'Psalm\\Node\\Expr\\BinaryOp\\VirtualLogicalXor' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/BinaryOp/VirtualLogicalXor.php', 'Psalm\\Node\\Expr\\BinaryOp\\VirtualMinus' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/BinaryOp/VirtualMinus.php', 'Psalm\\Node\\Expr\\BinaryOp\\VirtualMod' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/BinaryOp/VirtualMod.php', 'Psalm\\Node\\Expr\\BinaryOp\\VirtualMul' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/BinaryOp/VirtualMul.php', 'Psalm\\Node\\Expr\\BinaryOp\\VirtualNotEqual' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/BinaryOp/VirtualNotEqual.php', 'Psalm\\Node\\Expr\\BinaryOp\\VirtualNotIdentical' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/BinaryOp/VirtualNotIdentical.php', 'Psalm\\Node\\Expr\\BinaryOp\\VirtualPlus' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/BinaryOp/VirtualPlus.php', 'Psalm\\Node\\Expr\\BinaryOp\\VirtualPow' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/BinaryOp/VirtualPow.php', 'Psalm\\Node\\Expr\\BinaryOp\\VirtualShiftLeft' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/BinaryOp/VirtualShiftLeft.php', 'Psalm\\Node\\Expr\\BinaryOp\\VirtualShiftRight' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/BinaryOp/VirtualShiftRight.php', 'Psalm\\Node\\Expr\\BinaryOp\\VirtualSmaller' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/BinaryOp/VirtualSmaller.php', 'Psalm\\Node\\Expr\\BinaryOp\\VirtualSmallerOrEqual' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/BinaryOp/VirtualSmallerOrEqual.php', 'Psalm\\Node\\Expr\\BinaryOp\\VirtualSpaceship' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/BinaryOp/VirtualSpaceship.php', 'Psalm\\Node\\Expr\\Cast\\VirtualArray' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/Cast/VirtualArray.php', 'Psalm\\Node\\Expr\\Cast\\VirtualBool' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/Cast/VirtualBool.php', 'Psalm\\Node\\Expr\\Cast\\VirtualDouble' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/Cast/VirtualDouble.php', 'Psalm\\Node\\Expr\\Cast\\VirtualInt' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/Cast/VirtualInt.php', 'Psalm\\Node\\Expr\\Cast\\VirtualObject' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/Cast/VirtualObject.php', 'Psalm\\Node\\Expr\\Cast\\VirtualString' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/Cast/VirtualString.php', 'Psalm\\Node\\Expr\\Cast\\VirtualUnset' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/Cast/VirtualUnset.php', 'Psalm\\Node\\Expr\\VirtualArray' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/VirtualArray.php', 'Psalm\\Node\\Expr\\VirtualArrayDimFetch' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/VirtualArrayDimFetch.php', 'Psalm\\Node\\Expr\\VirtualArrayItem' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/VirtualArrayItem.php', 'Psalm\\Node\\Expr\\VirtualArrowFunction' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/VirtualArrowFunction.php', 'Psalm\\Node\\Expr\\VirtualAssign' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/VirtualAssign.php', 'Psalm\\Node\\Expr\\VirtualAssignRef' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/VirtualAssignRef.php', 'Psalm\\Node\\Expr\\VirtualBitwiseNot' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/VirtualBitwiseNot.php', 'Psalm\\Node\\Expr\\VirtualBooleanNot' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/VirtualBooleanNot.php', 'Psalm\\Node\\Expr\\VirtualClassConstFetch' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/VirtualClassConstFetch.php', 'Psalm\\Node\\Expr\\VirtualClone' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/VirtualClone.php', 'Psalm\\Node\\Expr\\VirtualClosure' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/VirtualClosure.php', 'Psalm\\Node\\Expr\\VirtualClosureUse' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/VirtualClosureUse.php', 'Psalm\\Node\\Expr\\VirtualConstFetch' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/VirtualConstFetch.php', 'Psalm\\Node\\Expr\\VirtualEmpty' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/VirtualEmpty.php', 'Psalm\\Node\\Expr\\VirtualError' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/VirtualError.php', 'Psalm\\Node\\Expr\\VirtualErrorSuppress' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/VirtualErrorSuppress.php', 'Psalm\\Node\\Expr\\VirtualEval' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/VirtualEval.php', 'Psalm\\Node\\Expr\\VirtualExit' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/VirtualExit.php', 'Psalm\\Node\\Expr\\VirtualFuncCall' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/VirtualFuncCall.php', 'Psalm\\Node\\Expr\\VirtualInclude' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/VirtualInclude.php', 'Psalm\\Node\\Expr\\VirtualInstanceof' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/VirtualInstanceof.php', 'Psalm\\Node\\Expr\\VirtualIsset' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/VirtualIsset.php', 'Psalm\\Node\\Expr\\VirtualList' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/VirtualList.php', 'Psalm\\Node\\Expr\\VirtualMatch' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/VirtualMatch.php', 'Psalm\\Node\\Expr\\VirtualMethodCall' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/VirtualMethodCall.php', 'Psalm\\Node\\Expr\\VirtualNew' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/VirtualNew.php', 'Psalm\\Node\\Expr\\VirtualNullsafeMethodCall' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/VirtualNullsafeMethodCall.php', 'Psalm\\Node\\Expr\\VirtualNullsafePropertyFetch' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/VirtualNullsafePropertyFetch.php', 'Psalm\\Node\\Expr\\VirtualPostDec' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/VirtualPostDec.php', 'Psalm\\Node\\Expr\\VirtualPostInc' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/VirtualPostInc.php', 'Psalm\\Node\\Expr\\VirtualPreDec' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/VirtualPreDec.php', 'Psalm\\Node\\Expr\\VirtualPreInc' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/VirtualPreInc.php', 'Psalm\\Node\\Expr\\VirtualPrint' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/VirtualPrint.php', 'Psalm\\Node\\Expr\\VirtualPropertyFetch' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/VirtualPropertyFetch.php', 'Psalm\\Node\\Expr\\VirtualShellExec' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/VirtualShellExec.php', 'Psalm\\Node\\Expr\\VirtualStaticCall' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/VirtualStaticCall.php', 'Psalm\\Node\\Expr\\VirtualStaticPropertyFetch' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/VirtualStaticPropertyFetch.php', 'Psalm\\Node\\Expr\\VirtualTernary' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/VirtualTernary.php', 'Psalm\\Node\\Expr\\VirtualThrow' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/VirtualThrow.php', 'Psalm\\Node\\Expr\\VirtualUnaryMinus' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/VirtualUnaryMinus.php', 'Psalm\\Node\\Expr\\VirtualUnaryPlus' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/VirtualUnaryPlus.php', 'Psalm\\Node\\Expr\\VirtualVariable' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/VirtualVariable.php', 'Psalm\\Node\\Expr\\VirtualYield' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/VirtualYield.php', 'Psalm\\Node\\Expr\\VirtualYieldFrom' => __DIR__ . '/../..' . '/src/Psalm/Node/Expr/VirtualYieldFrom.php', 'Psalm\\Node\\Name\\VirtualFullyQualified' => __DIR__ . '/../..' . '/src/Psalm/Node/Name/VirtualFullyQualified.php', 'Psalm\\Node\\Name\\VirtualRelative' => __DIR__ . '/../..' . '/src/Psalm/Node/Name/VirtualRelative.php', 'Psalm\\Node\\Scalar\\MagicConst\\VirtualClass' => __DIR__ . '/../..' . '/src/Psalm/Node/Scalar/MagicConst/VirtualClass.php', 'Psalm\\Node\\Scalar\\MagicConst\\VirtualDir' => __DIR__ . '/../..' . '/src/Psalm/Node/Scalar/MagicConst/VirtualDir.php', 'Psalm\\Node\\Scalar\\MagicConst\\VirtualFile' => __DIR__ . '/../..' . '/src/Psalm/Node/Scalar/MagicConst/VirtualFile.php', 'Psalm\\Node\\Scalar\\MagicConst\\VirtualFunction' => __DIR__ . '/../..' . '/src/Psalm/Node/Scalar/MagicConst/VirtualFunction.php', 'Psalm\\Node\\Scalar\\MagicConst\\VirtualLine' => __DIR__ . '/../..' . '/src/Psalm/Node/Scalar/MagicConst/VirtualLine.php', 'Psalm\\Node\\Scalar\\MagicConst\\VirtualMethod' => __DIR__ . '/../..' . '/src/Psalm/Node/Scalar/MagicConst/VirtualMethod.php', 'Psalm\\Node\\Scalar\\MagicConst\\VirtualNamespace' => __DIR__ . '/../..' . '/src/Psalm/Node/Scalar/MagicConst/VirtualNamespace.php', 'Psalm\\Node\\Scalar\\MagicConst\\VirtualTrait' => __DIR__ . '/../..' . '/src/Psalm/Node/Scalar/MagicConst/VirtualTrait.php', 'Psalm\\Node\\Scalar\\VirtualDNumber' => __DIR__ . '/../..' . '/src/Psalm/Node/Scalar/VirtualDNumber.php', 'Psalm\\Node\\Scalar\\VirtualEncapsed' => __DIR__ . '/../..' . '/src/Psalm/Node/Scalar/VirtualEncapsed.php', 'Psalm\\Node\\Scalar\\VirtualEncapsedStringPart' => __DIR__ . '/../..' . '/src/Psalm/Node/Scalar/VirtualEncapsedStringPart.php', 'Psalm\\Node\\Scalar\\VirtualLNumber' => __DIR__ . '/../..' . '/src/Psalm/Node/Scalar/VirtualLNumber.php', 'Psalm\\Node\\Scalar\\VirtualString' => __DIR__ . '/../..' . '/src/Psalm/Node/Scalar/VirtualString.php', 'Psalm\\Node\\Stmt\\TraitUseAdaptation\\VirtualAlias' => __DIR__ . '/../..' . '/src/Psalm/Node/Stmt/TraitUseAdaptation/VirtualAlias.php', 'Psalm\\Node\\Stmt\\TraitUseAdaptation\\VirtualPrecedence' => __DIR__ . '/../..' . '/src/Psalm/Node/Stmt/TraitUseAdaptation/VirtualPrecedence.php', 'Psalm\\Node\\Stmt\\VirtualBreak' => __DIR__ . '/../..' . '/src/Psalm/Node/Stmt/VirtualBreak.php', 'Psalm\\Node\\Stmt\\VirtualCase' => __DIR__ . '/../..' . '/src/Psalm/Node/Stmt/VirtualCase.php', 'Psalm\\Node\\Stmt\\VirtualCatch' => __DIR__ . '/../..' . '/src/Psalm/Node/Stmt/VirtualCatch.php', 'Psalm\\Node\\Stmt\\VirtualClass' => __DIR__ . '/../..' . '/src/Psalm/Node/Stmt/VirtualClass.php', 'Psalm\\Node\\Stmt\\VirtualClassConst' => __DIR__ . '/../..' . '/src/Psalm/Node/Stmt/VirtualClassConst.php', 'Psalm\\Node\\Stmt\\VirtualClassMethod' => __DIR__ . '/../..' . '/src/Psalm/Node/Stmt/VirtualClassMethod.php', 'Psalm\\Node\\Stmt\\VirtualConst' => __DIR__ . '/../..' . '/src/Psalm/Node/Stmt/VirtualConst.php', 'Psalm\\Node\\Stmt\\VirtualContinue' => __DIR__ . '/../..' . '/src/Psalm/Node/Stmt/VirtualContinue.php', 'Psalm\\Node\\Stmt\\VirtualDeclare' => __DIR__ . '/../..' . '/src/Psalm/Node/Stmt/VirtualDeclare.php', 'Psalm\\Node\\Stmt\\VirtualDeclareDeclare' => __DIR__ . '/../..' . '/src/Psalm/Node/Stmt/VirtualDeclareDeclare.php', 'Psalm\\Node\\Stmt\\VirtualDo' => __DIR__ . '/../..' . '/src/Psalm/Node/Stmt/VirtualDo.php', 'Psalm\\Node\\Stmt\\VirtualEcho' => __DIR__ . '/../..' . '/src/Psalm/Node/Stmt/VirtualEcho.php', 'Psalm\\Node\\Stmt\\VirtualElse' => __DIR__ . '/../..' . '/src/Psalm/Node/Stmt/VirtualElse.php', 'Psalm\\Node\\Stmt\\VirtualElseIf' => __DIR__ . '/../..' . '/src/Psalm/Node/Stmt/VirtualElseIf.php', 'Psalm\\Node\\Stmt\\VirtualExpression' => __DIR__ . '/../..' . '/src/Psalm/Node/Stmt/VirtualExpression.php', 'Psalm\\Node\\Stmt\\VirtualFinally' => __DIR__ . '/../..' . '/src/Psalm/Node/Stmt/VirtualFinally.php', 'Psalm\\Node\\Stmt\\VirtualFor' => __DIR__ . '/../..' . '/src/Psalm/Node/Stmt/VirtualFor.php', 'Psalm\\Node\\Stmt\\VirtualForeach' => __DIR__ . '/../..' . '/src/Psalm/Node/Stmt/VirtualForeach.php', 'Psalm\\Node\\Stmt\\VirtualFunction' => __DIR__ . '/../..' . '/src/Psalm/Node/Stmt/VirtualFunction.php', 'Psalm\\Node\\Stmt\\VirtualGlobal' => __DIR__ . '/../..' . '/src/Psalm/Node/Stmt/VirtualGlobal.php', 'Psalm\\Node\\Stmt\\VirtualGoto' => __DIR__ . '/../..' . '/src/Psalm/Node/Stmt/VirtualGoto.php', 'Psalm\\Node\\Stmt\\VirtualGroupUse' => __DIR__ . '/../..' . '/src/Psalm/Node/Stmt/VirtualGroupUse.php', 'Psalm\\Node\\Stmt\\VirtualHaltCompiler' => __DIR__ . '/../..' . '/src/Psalm/Node/Stmt/VirtualHaltCompiler.php', 'Psalm\\Node\\Stmt\\VirtualIf' => __DIR__ . '/../..' . '/src/Psalm/Node/Stmt/VirtualIf.php', 'Psalm\\Node\\Stmt\\VirtualInlineHTML' => __DIR__ . '/../..' . '/src/Psalm/Node/Stmt/VirtualInlineHTML.php', 'Psalm\\Node\\Stmt\\VirtualInterface' => __DIR__ . '/../..' . '/src/Psalm/Node/Stmt/VirtualInterface.php', 'Psalm\\Node\\Stmt\\VirtualLabel' => __DIR__ . '/../..' . '/src/Psalm/Node/Stmt/VirtualLabel.php', 'Psalm\\Node\\Stmt\\VirtualNamespace' => __DIR__ . '/../..' . '/src/Psalm/Node/Stmt/VirtualNamespace.php', 'Psalm\\Node\\Stmt\\VirtualNop' => __DIR__ . '/../..' . '/src/Psalm/Node/Stmt/VirtualNop.php', 'Psalm\\Node\\Stmt\\VirtualProperty' => __DIR__ . '/../..' . '/src/Psalm/Node/Stmt/VirtualProperty.php', 'Psalm\\Node\\Stmt\\VirtualPropertyProperty' => __DIR__ . '/../..' . '/src/Psalm/Node/Stmt/VirtualPropertyProperty.php', 'Psalm\\Node\\Stmt\\VirtualReturn' => __DIR__ . '/../..' . '/src/Psalm/Node/Stmt/VirtualReturn.php', 'Psalm\\Node\\Stmt\\VirtualStatic' => __DIR__ . '/../..' . '/src/Psalm/Node/Stmt/VirtualStatic.php', 'Psalm\\Node\\Stmt\\VirtualStaticVar' => __DIR__ . '/../..' . '/src/Psalm/Node/Stmt/VirtualStaticVar.php', 'Psalm\\Node\\Stmt\\VirtualSwitch' => __DIR__ . '/../..' . '/src/Psalm/Node/Stmt/VirtualSwitch.php', 'Psalm\\Node\\Stmt\\VirtualThrow' => __DIR__ . '/../..' . '/src/Psalm/Node/Stmt/VirtualThrow.php', 'Psalm\\Node\\Stmt\\VirtualTrait' => __DIR__ . '/../..' . '/src/Psalm/Node/Stmt/VirtualTrait.php', 'Psalm\\Node\\Stmt\\VirtualTraitUse' => __DIR__ . '/../..' . '/src/Psalm/Node/Stmt/VirtualTraitUse.php', 'Psalm\\Node\\Stmt\\VirtualTryCatch' => __DIR__ . '/../..' . '/src/Psalm/Node/Stmt/VirtualTryCatch.php', 'Psalm\\Node\\Stmt\\VirtualUnset' => __DIR__ . '/../..' . '/src/Psalm/Node/Stmt/VirtualUnset.php', 'Psalm\\Node\\Stmt\\VirtualUse' => __DIR__ . '/../..' . '/src/Psalm/Node/Stmt/VirtualUse.php', 'Psalm\\Node\\Stmt\\VirtualUseUse' => __DIR__ . '/../..' . '/src/Psalm/Node/Stmt/VirtualUseUse.php', 'Psalm\\Node\\Stmt\\VirtualWhile' => __DIR__ . '/../..' . '/src/Psalm/Node/Stmt/VirtualWhile.php', 'Psalm\\Node\\VirtualArg' => __DIR__ . '/../..' . '/src/Psalm/Node/VirtualArg.php', 'Psalm\\Node\\VirtualAttribute' => __DIR__ . '/../..' . '/src/Psalm/Node/VirtualAttribute.php', 'Psalm\\Node\\VirtualAttributeGroup' => __DIR__ . '/../..' . '/src/Psalm/Node/VirtualAttributeGroup.php', 'Psalm\\Node\\VirtualConst' => __DIR__ . '/../..' . '/src/Psalm/Node/VirtualConst.php', 'Psalm\\Node\\VirtualIdentifier' => __DIR__ . '/../..' . '/src/Psalm/Node/VirtualIdentifier.php', 'Psalm\\Node\\VirtualMatchArm' => __DIR__ . '/../..' . '/src/Psalm/Node/VirtualMatchArm.php', 'Psalm\\Node\\VirtualName' => __DIR__ . '/../..' . '/src/Psalm/Node/VirtualName.php', 'Psalm\\Node\\VirtualNode' => __DIR__ . '/../..' . '/src/Psalm/Node/VirtualNode.php', 'Psalm\\Node\\VirtualNullableType' => __DIR__ . '/../..' . '/src/Psalm/Node/VirtualNullableType.php', 'Psalm\\Node\\VirtualParam' => __DIR__ . '/../..' . '/src/Psalm/Node/VirtualParam.php', 'Psalm\\Node\\VirtualUnionType' => __DIR__ . '/../..' . '/src/Psalm/Node/VirtualUnionType.php', 'Psalm\\Node\\VirtualVarLikeIdentifier' => __DIR__ . '/../..' . '/src/Psalm/Node/VirtualVarLikeIdentifier.php', 'Psalm\\PluginFileExtensionsSocket' => __DIR__ . '/../..' . '/src/Psalm/PluginFileExtensionsSocket.php', 'Psalm\\PluginRegistrationSocket' => __DIR__ . '/../..' . '/src/Psalm/PluginRegistrationSocket.php', 'Psalm\\Plugin\\ArgTypeInferer' => __DIR__ . '/../..' . '/src/Psalm/Plugin/ArgTypeInferer.php', 'Psalm\\Plugin\\DynamicFunctionStorage' => __DIR__ . '/../..' . '/src/Psalm/Plugin/DynamicFunctionStorage.php', 'Psalm\\Plugin\\DynamicTemplateProvider' => __DIR__ . '/../..' . '/src/Psalm/Plugin/DynamicTemplateProvider.php', 'Psalm\\Plugin\\EventHandler\\AddTaintsInterface' => __DIR__ . '/../..' . '/src/Psalm/Plugin/EventHandler/AddTaintsInterface.php', 'Psalm\\Plugin\\EventHandler\\AfterAnalysisInterface' => __DIR__ . '/../..' . '/src/Psalm/Plugin/EventHandler/AfterAnalysisInterface.php', 'Psalm\\Plugin\\EventHandler\\AfterClassLikeAnalysisInterface' => __DIR__ . '/../..' . '/src/Psalm/Plugin/EventHandler/AfterClassLikeAnalysisInterface.php', 'Psalm\\Plugin\\EventHandler\\AfterClassLikeExistenceCheckInterface' => __DIR__ . '/../..' . '/src/Psalm/Plugin/EventHandler/AfterClassLikeExistenceCheckInterface.php', 'Psalm\\Plugin\\EventHandler\\AfterClassLikeVisitInterface' => __DIR__ . '/../..' . '/src/Psalm/Plugin/EventHandler/AfterClassLikeVisitInterface.php', 'Psalm\\Plugin\\EventHandler\\AfterCodebasePopulatedInterface' => __DIR__ . '/../..' . '/src/Psalm/Plugin/EventHandler/AfterCodebasePopulatedInterface.php', 'Psalm\\Plugin\\EventHandler\\AfterEveryFunctionCallAnalysisInterface' => __DIR__ . '/../..' . '/src/Psalm/Plugin/EventHandler/AfterEveryFunctionCallAnalysisInterface.php', 'Psalm\\Plugin\\EventHandler\\AfterExpressionAnalysisInterface' => __DIR__ . '/../..' . '/src/Psalm/Plugin/EventHandler/AfterExpressionAnalysisInterface.php', 'Psalm\\Plugin\\EventHandler\\AfterFileAnalysisInterface' => __DIR__ . '/../..' . '/src/Psalm/Plugin/EventHandler/AfterFileAnalysisInterface.php', 'Psalm\\Plugin\\EventHandler\\AfterFunctionCallAnalysisInterface' => __DIR__ . '/../..' . '/src/Psalm/Plugin/EventHandler/AfterFunctionCallAnalysisInterface.php', 'Psalm\\Plugin\\EventHandler\\AfterFunctionLikeAnalysisInterface' => __DIR__ . '/../..' . '/src/Psalm/Plugin/EventHandler/AfterFunctionLikeAnalysisInterface.php', 'Psalm\\Plugin\\EventHandler\\AfterMethodCallAnalysisInterface' => __DIR__ . '/../..' . '/src/Psalm/Plugin/EventHandler/AfterMethodCallAnalysisInterface.php', 'Psalm\\Plugin\\EventHandler\\AfterStatementAnalysisInterface' => __DIR__ . '/../..' . '/src/Psalm/Plugin/EventHandler/AfterStatementAnalysisInterface.php', 'Psalm\\Plugin\\EventHandler\\BeforeAddIssueInterface' => __DIR__ . '/../..' . '/src/Psalm/Plugin/EventHandler/BeforeAddIssueInterface.php', 'Psalm\\Plugin\\EventHandler\\BeforeFileAnalysisInterface' => __DIR__ . '/../..' . '/src/Psalm/Plugin/EventHandler/BeforeFileAnalysisInterface.php', 'Psalm\\Plugin\\EventHandler\\BeforeStatementAnalysisInterface' => __DIR__ . '/../..' . '/src/Psalm/Plugin/EventHandler/BeforeStatementAnalysisInterface.php', 'Psalm\\Plugin\\EventHandler\\DynamicFunctionStorageProviderInterface' => __DIR__ . '/../..' . '/src/Psalm/Plugin/EventHandler/DynamicFunctionStorageProviderInterface.php', 'Psalm\\Plugin\\EventHandler\\Event\\AddRemoveTaintsEvent' => __DIR__ . '/../..' . '/src/Psalm/Plugin/EventHandler/Event/AddRemoveTaintsEvent.php', 'Psalm\\Plugin\\EventHandler\\Event\\AfterAnalysisEvent' => __DIR__ . '/../..' . '/src/Psalm/Plugin/EventHandler/Event/AfterAnalysisEvent.php', 'Psalm\\Plugin\\EventHandler\\Event\\AfterClassLikeAnalysisEvent' => __DIR__ . '/../..' . '/src/Psalm/Plugin/EventHandler/Event/AfterClassLikeAnalysisEvent.php', 'Psalm\\Plugin\\EventHandler\\Event\\AfterClassLikeExistenceCheckEvent' => __DIR__ . '/../..' . '/src/Psalm/Plugin/EventHandler/Event/AfterClassLikeExistenceCheckEvent.php', 'Psalm\\Plugin\\EventHandler\\Event\\AfterClassLikeVisitEvent' => __DIR__ . '/../..' . '/src/Psalm/Plugin/EventHandler/Event/AfterClassLikeVisitEvent.php', 'Psalm\\Plugin\\EventHandler\\Event\\AfterCodebasePopulatedEvent' => __DIR__ . '/../..' . '/src/Psalm/Plugin/EventHandler/Event/AfterCodebasePopulatedEvent.php', 'Psalm\\Plugin\\EventHandler\\Event\\AfterEveryFunctionCallAnalysisEvent' => __DIR__ . '/../..' . '/src/Psalm/Plugin/EventHandler/Event/AfterEveryFunctionCallAnalysisEvent.php', 'Psalm\\Plugin\\EventHandler\\Event\\AfterExpressionAnalysisEvent' => __DIR__ . '/../..' . '/src/Psalm/Plugin/EventHandler/Event/AfterExpressionAnalysisEvent.php', 'Psalm\\Plugin\\EventHandler\\Event\\AfterFileAnalysisEvent' => __DIR__ . '/../..' . '/src/Psalm/Plugin/EventHandler/Event/AfterFileAnalysisEvent.php', 'Psalm\\Plugin\\EventHandler\\Event\\AfterFunctionCallAnalysisEvent' => __DIR__ . '/../..' . '/src/Psalm/Plugin/EventHandler/Event/AfterFunctionCallAnalysisEvent.php', 'Psalm\\Plugin\\EventHandler\\Event\\AfterFunctionLikeAnalysisEvent' => __DIR__ . '/../..' . '/src/Psalm/Plugin/EventHandler/Event/AfterFunctionLikeAnalysisEvent.php', 'Psalm\\Plugin\\EventHandler\\Event\\AfterMethodCallAnalysisEvent' => __DIR__ . '/../..' . '/src/Psalm/Plugin/EventHandler/Event/AfterMethodCallAnalysisEvent.php', 'Psalm\\Plugin\\EventHandler\\Event\\AfterStatementAnalysisEvent' => __DIR__ . '/../..' . '/src/Psalm/Plugin/EventHandler/Event/AfterStatementAnalysisEvent.php', 'Psalm\\Plugin\\EventHandler\\Event\\BeforeAddIssueEvent' => __DIR__ . '/../..' . '/src/Psalm/Plugin/EventHandler/Event/BeforeAddIssueEvent.php', 'Psalm\\Plugin\\EventHandler\\Event\\BeforeFileAnalysisEvent' => __DIR__ . '/../..' . '/src/Psalm/Plugin/EventHandler/Event/BeforeFileAnalysisEvent.php', 'Psalm\\Plugin\\EventHandler\\Event\\BeforeStatementAnalysisEvent' => __DIR__ . '/../..' . '/src/Psalm/Plugin/EventHandler/Event/BeforeStatementAnalysisEvent.php', 'Psalm\\Plugin\\EventHandler\\Event\\DynamicFunctionStorageProviderEvent' => __DIR__ . '/../..' . '/src/Psalm/Plugin/EventHandler/Event/DynamicFunctionStorageProviderEvent.php', 'Psalm\\Plugin\\EventHandler\\Event\\FunctionExistenceProviderEvent' => __DIR__ . '/../..' . '/src/Psalm/Plugin/EventHandler/Event/FunctionExistenceProviderEvent.php', 'Psalm\\Plugin\\EventHandler\\Event\\FunctionParamsProviderEvent' => __DIR__ . '/../..' . '/src/Psalm/Plugin/EventHandler/Event/FunctionParamsProviderEvent.php', 'Psalm\\Plugin\\EventHandler\\Event\\FunctionReturnTypeProviderEvent' => __DIR__ . '/../..' . '/src/Psalm/Plugin/EventHandler/Event/FunctionReturnTypeProviderEvent.php', 'Psalm\\Plugin\\EventHandler\\Event\\MethodExistenceProviderEvent' => __DIR__ . '/../..' . '/src/Psalm/Plugin/EventHandler/Event/MethodExistenceProviderEvent.php', 'Psalm\\Plugin\\EventHandler\\Event\\MethodParamsProviderEvent' => __DIR__ . '/../..' . '/src/Psalm/Plugin/EventHandler/Event/MethodParamsProviderEvent.php', 'Psalm\\Plugin\\EventHandler\\Event\\MethodReturnTypeProviderEvent' => __DIR__ . '/../..' . '/src/Psalm/Plugin/EventHandler/Event/MethodReturnTypeProviderEvent.php', 'Psalm\\Plugin\\EventHandler\\Event\\MethodVisibilityProviderEvent' => __DIR__ . '/../..' . '/src/Psalm/Plugin/EventHandler/Event/MethodVisibilityProviderEvent.php', 'Psalm\\Plugin\\EventHandler\\Event\\PropertyExistenceProviderEvent' => __DIR__ . '/../..' . '/src/Psalm/Plugin/EventHandler/Event/PropertyExistenceProviderEvent.php', 'Psalm\\Plugin\\EventHandler\\Event\\PropertyTypeProviderEvent' => __DIR__ . '/../..' . '/src/Psalm/Plugin/EventHandler/Event/PropertyTypeProviderEvent.php', 'Psalm\\Plugin\\EventHandler\\Event\\PropertyVisibilityProviderEvent' => __DIR__ . '/../..' . '/src/Psalm/Plugin/EventHandler/Event/PropertyVisibilityProviderEvent.php', 'Psalm\\Plugin\\EventHandler\\Event\\StringInterpreterEvent' => __DIR__ . '/../..' . '/src/Psalm/Plugin/EventHandler/Event/StringInterpreterEvent.php', 'Psalm\\Plugin\\EventHandler\\FunctionExistenceProviderInterface' => __DIR__ . '/../..' . '/src/Psalm/Plugin/EventHandler/FunctionExistenceProviderInterface.php', 'Psalm\\Plugin\\EventHandler\\FunctionParamsProviderInterface' => __DIR__ . '/../..' . '/src/Psalm/Plugin/EventHandler/FunctionParamsProviderInterface.php', 'Psalm\\Plugin\\EventHandler\\FunctionReturnTypeProviderInterface' => __DIR__ . '/../..' . '/src/Psalm/Plugin/EventHandler/FunctionReturnTypeProviderInterface.php', 'Psalm\\Plugin\\EventHandler\\MethodExistenceProviderInterface' => __DIR__ . '/../..' . '/src/Psalm/Plugin/EventHandler/MethodExistenceProviderInterface.php', 'Psalm\\Plugin\\EventHandler\\MethodParamsProviderInterface' => __DIR__ . '/../..' . '/src/Psalm/Plugin/EventHandler/MethodParamsProviderInterface.php', 'Psalm\\Plugin\\EventHandler\\MethodReturnTypeProviderInterface' => __DIR__ . '/../..' . '/src/Psalm/Plugin/EventHandler/MethodReturnTypeProviderInterface.php', 'Psalm\\Plugin\\EventHandler\\MethodVisibilityProviderInterface' => __DIR__ . '/../..' . '/src/Psalm/Plugin/EventHandler/MethodVisibilityProviderInterface.php', 'Psalm\\Plugin\\EventHandler\\PropertyExistenceProviderInterface' => __DIR__ . '/../..' . '/src/Psalm/Plugin/EventHandler/PropertyExistenceProviderInterface.php', 'Psalm\\Plugin\\EventHandler\\PropertyTypeProviderInterface' => __DIR__ . '/../..' . '/src/Psalm/Plugin/EventHandler/PropertyTypeProviderInterface.php', 'Psalm\\Plugin\\EventHandler\\PropertyVisibilityProviderInterface' => __DIR__ . '/../..' . '/src/Psalm/Plugin/EventHandler/PropertyVisibilityProviderInterface.php', 'Psalm\\Plugin\\EventHandler\\RemoveTaintsInterface' => __DIR__ . '/../..' . '/src/Psalm/Plugin/EventHandler/RemoveTaintsInterface.php', 'Psalm\\Plugin\\EventHandler\\StringInterpreterInterface' => __DIR__ . '/../..' . '/src/Psalm/Plugin/EventHandler/StringInterpreterInterface.php', 'Psalm\\Plugin\\FileExtensionsInterface' => __DIR__ . '/../..' . '/src/Psalm/Plugin/FileExtensionsInterface.php', 'Psalm\\Plugin\\PluginEntryPointInterface' => __DIR__ . '/../..' . '/src/Psalm/Plugin/PluginEntryPointInterface.php', 'Psalm\\Plugin\\PluginFileExtensionsInterface' => __DIR__ . '/../..' . '/src/Psalm/Plugin/PluginFileExtensionsInterface.php', 'Psalm\\Plugin\\PluginInterface' => __DIR__ . '/../..' . '/src/Psalm/Plugin/PluginInterface.php', 'Psalm\\Plugin\\RegistrationInterface' => __DIR__ . '/../..' . '/src/Psalm/Plugin/RegistrationInterface.php', 'Psalm\\Plugin\\Shepherd' => __DIR__ . '/../..' . '/src/Psalm/Plugin/Shepherd.php', 'Psalm\\Progress\\DebugProgress' => __DIR__ . '/../..' . '/src/Psalm/Progress/DebugProgress.php', 'Psalm\\Progress\\DefaultProgress' => __DIR__ . '/../..' . '/src/Psalm/Progress/DefaultProgress.php', 'Psalm\\Progress\\LongProgress' => __DIR__ . '/../..' . '/src/Psalm/Progress/LongProgress.php', 'Psalm\\Progress\\Progress' => __DIR__ . '/../..' . '/src/Psalm/Progress/Progress.php', 'Psalm\\Progress\\VoidProgress' => __DIR__ . '/../..' . '/src/Psalm/Progress/VoidProgress.php', 'Psalm\\Report' => __DIR__ . '/../..' . '/src/Psalm/Report.php', 'Psalm\\Report\\ByIssueLevelAndTypeReport' => __DIR__ . '/../..' . '/src/Psalm/Report/ByIssueLevelAndTypeReport.php', 'Psalm\\Report\\CheckstyleReport' => __DIR__ . '/../..' . '/src/Psalm/Report/CheckstyleReport.php', 'Psalm\\Report\\CodeClimateReport' => __DIR__ . '/../..' . '/src/Psalm/Report/CodeClimateReport.php', 'Psalm\\Report\\CompactReport' => __DIR__ . '/../..' . '/src/Psalm/Report/CompactReport.php', 'Psalm\\Report\\ConsoleReport' => __DIR__ . '/../..' . '/src/Psalm/Report/ConsoleReport.php', 'Psalm\\Report\\CountReport' => __DIR__ . '/../..' . '/src/Psalm/Report/CountReport.php', 'Psalm\\Report\\EmacsReport' => __DIR__ . '/../..' . '/src/Psalm/Report/EmacsReport.php', 'Psalm\\Report\\GithubActionsReport' => __DIR__ . '/../..' . '/src/Psalm/Report/GithubActionsReport.php', 'Psalm\\Report\\JsonReport' => __DIR__ . '/../..' . '/src/Psalm/Report/JsonReport.php', 'Psalm\\Report\\JsonSummaryReport' => __DIR__ . '/../..' . '/src/Psalm/Report/JsonSummaryReport.php', 'Psalm\\Report\\JunitReport' => __DIR__ . '/../..' . '/src/Psalm/Report/JunitReport.php', 'Psalm\\Report\\PhpStormReport' => __DIR__ . '/../..' . '/src/Psalm/Report/PhpStormReport.php', 'Psalm\\Report\\PylintReport' => __DIR__ . '/../..' . '/src/Psalm/Report/PylintReport.php', 'Psalm\\Report\\ReportOptions' => __DIR__ . '/../..' . '/src/Psalm/Report/ReportOptions.php', 'Psalm\\Report\\SarifReport' => __DIR__ . '/../..' . '/src/Psalm/Report/SarifReport.php', 'Psalm\\Report\\SonarqubeReport' => __DIR__ . '/../..' . '/src/Psalm/Report/SonarqubeReport.php', 'Psalm\\Report\\TextReport' => __DIR__ . '/../..' . '/src/Psalm/Report/TextReport.php', 'Psalm\\Report\\XmlReport' => __DIR__ . '/../..' . '/src/Psalm/Report/XmlReport.php', 'Psalm\\SourceControl\\Git\\CommitInfo' => __DIR__ . '/../..' . '/src/Psalm/SourceControl/Git/CommitInfo.php', 'Psalm\\SourceControl\\Git\\GitInfo' => __DIR__ . '/../..' . '/src/Psalm/SourceControl/Git/GitInfo.php', 'Psalm\\SourceControl\\Git\\RemoteInfo' => __DIR__ . '/../..' . '/src/Psalm/SourceControl/Git/RemoteInfo.php', 'Psalm\\SourceControl\\SourceControlInfo' => __DIR__ . '/../..' . '/src/Psalm/SourceControl/SourceControlInfo.php', 'Psalm\\StatementsSource' => __DIR__ . '/../..' . '/src/Psalm/StatementsSource.php', 'Psalm\\Storage\\Assertion' => __DIR__ . '/../..' . '/src/Psalm/Storage/Assertion.php', 'Psalm\\Storage\\Assertion\\Any' => __DIR__ . '/../..' . '/src/Psalm/Storage/Assertion/Any.php', 'Psalm\\Storage\\Assertion\\ArrayKeyDoesNotExist' => __DIR__ . '/../..' . '/src/Psalm/Storage/Assertion/ArrayKeyDoesNotExist.php', 'Psalm\\Storage\\Assertion\\ArrayKeyExists' => __DIR__ . '/../..' . '/src/Psalm/Storage/Assertion/ArrayKeyExists.php', 'Psalm\\Storage\\Assertion\\DoesNotHaveAtLeastCount' => __DIR__ . '/../..' . '/src/Psalm/Storage/Assertion/DoesNotHaveAtLeastCount.php', 'Psalm\\Storage\\Assertion\\DoesNotHaveExactCount' => __DIR__ . '/../..' . '/src/Psalm/Storage/Assertion/DoesNotHaveExactCount.php', 'Psalm\\Storage\\Assertion\\DoesNotHaveMethod' => __DIR__ . '/../..' . '/src/Psalm/Storage/Assertion/DoesNotHaveMethod.php', 'Psalm\\Storage\\Assertion\\Empty_' => __DIR__ . '/../..' . '/src/Psalm/Storage/Assertion/Empty_.php', 'Psalm\\Storage\\Assertion\\Falsy' => __DIR__ . '/../..' . '/src/Psalm/Storage/Assertion/Falsy.php', 'Psalm\\Storage\\Assertion\\HasArrayKey' => __DIR__ . '/../..' . '/src/Psalm/Storage/Assertion/HasArrayKey.php', 'Psalm\\Storage\\Assertion\\HasAtLeastCount' => __DIR__ . '/../..' . '/src/Psalm/Storage/Assertion/HasAtLeastCount.php', 'Psalm\\Storage\\Assertion\\HasExactCount' => __DIR__ . '/../..' . '/src/Psalm/Storage/Assertion/HasExactCount.php', 'Psalm\\Storage\\Assertion\\HasIntOrStringArrayAccess' => __DIR__ . '/../..' . '/src/Psalm/Storage/Assertion/HasIntOrStringArrayAccess.php', 'Psalm\\Storage\\Assertion\\HasMethod' => __DIR__ . '/../..' . '/src/Psalm/Storage/Assertion/HasMethod.php', 'Psalm\\Storage\\Assertion\\HasStringArrayAccess' => __DIR__ . '/../..' . '/src/Psalm/Storage/Assertion/HasStringArrayAccess.php', 'Psalm\\Storage\\Assertion\\InArray' => __DIR__ . '/../..' . '/src/Psalm/Storage/Assertion/InArray.php', 'Psalm\\Storage\\Assertion\\IsAClass' => __DIR__ . '/../..' . '/src/Psalm/Storage/Assertion/IsAClass.php', 'Psalm\\Storage\\Assertion\\IsClassEqual' => __DIR__ . '/../..' . '/src/Psalm/Storage/Assertion/IsClassEqual.php', 'Psalm\\Storage\\Assertion\\IsClassNotEqual' => __DIR__ . '/../..' . '/src/Psalm/Storage/Assertion/IsClassNotEqual.php', 'Psalm\\Storage\\Assertion\\IsCountable' => __DIR__ . '/../..' . '/src/Psalm/Storage/Assertion/IsCountable.php', 'Psalm\\Storage\\Assertion\\IsEqualIsset' => __DIR__ . '/../..' . '/src/Psalm/Storage/Assertion/IsEqualIsset.php', 'Psalm\\Storage\\Assertion\\IsGreaterThan' => __DIR__ . '/../..' . '/src/Psalm/Storage/Assertion/IsGreaterThan.php', 'Psalm\\Storage\\Assertion\\IsGreaterThanOrEqualTo' => __DIR__ . '/../..' . '/src/Psalm/Storage/Assertion/IsGreaterThanOrEqualTo.php', 'Psalm\\Storage\\Assertion\\IsIdentical' => __DIR__ . '/../..' . '/src/Psalm/Storage/Assertion/IsIdentical.php', 'Psalm\\Storage\\Assertion\\IsIsset' => __DIR__ . '/../..' . '/src/Psalm/Storage/Assertion/IsIsset.php', 'Psalm\\Storage\\Assertion\\IsLessThan' => __DIR__ . '/../..' . '/src/Psalm/Storage/Assertion/IsLessThan.php', 'Psalm\\Storage\\Assertion\\IsLessThanOrEqualTo' => __DIR__ . '/../..' . '/src/Psalm/Storage/Assertion/IsLessThanOrEqualTo.php', 'Psalm\\Storage\\Assertion\\IsLooselyEqual' => __DIR__ . '/../..' . '/src/Psalm/Storage/Assertion/IsLooselyEqual.php', 'Psalm\\Storage\\Assertion\\IsNotAClass' => __DIR__ . '/../..' . '/src/Psalm/Storage/Assertion/IsNotAClass.php', 'Psalm\\Storage\\Assertion\\IsNotCountable' => __DIR__ . '/../..' . '/src/Psalm/Storage/Assertion/IsNotCountable.php', 'Psalm\\Storage\\Assertion\\IsNotIdentical' => __DIR__ . '/../..' . '/src/Psalm/Storage/Assertion/IsNotIdentical.php', 'Psalm\\Storage\\Assertion\\IsNotIsset' => __DIR__ . '/../..' . '/src/Psalm/Storage/Assertion/IsNotIsset.php', 'Psalm\\Storage\\Assertion\\IsNotLooselyEqual' => __DIR__ . '/../..' . '/src/Psalm/Storage/Assertion/IsNotLooselyEqual.php', 'Psalm\\Storage\\Assertion\\IsNotType' => __DIR__ . '/../..' . '/src/Psalm/Storage/Assertion/IsNotType.php', 'Psalm\\Storage\\Assertion\\IsType' => __DIR__ . '/../..' . '/src/Psalm/Storage/Assertion/IsType.php', 'Psalm\\Storage\\Assertion\\NestedAssertions' => __DIR__ . '/../..' . '/src/Psalm/Storage/Assertion/NestedAssertions.php', 'Psalm\\Storage\\Assertion\\NonEmpty' => __DIR__ . '/../..' . '/src/Psalm/Storage/Assertion/NonEmpty.php', 'Psalm\\Storage\\Assertion\\NonEmptyCountable' => __DIR__ . '/../..' . '/src/Psalm/Storage/Assertion/NonEmptyCountable.php', 'Psalm\\Storage\\Assertion\\NotInArray' => __DIR__ . '/../..' . '/src/Psalm/Storage/Assertion/NotInArray.php', 'Psalm\\Storage\\Assertion\\NotNestedAssertions' => __DIR__ . '/../..' . '/src/Psalm/Storage/Assertion/NotNestedAssertions.php', 'Psalm\\Storage\\Assertion\\NotNonEmptyCountable' => __DIR__ . '/../..' . '/src/Psalm/Storage/Assertion/NotNonEmptyCountable.php', 'Psalm\\Storage\\Assertion\\Truthy' => __DIR__ . '/../..' . '/src/Psalm/Storage/Assertion/Truthy.php', 'Psalm\\Storage\\AttributeArg' => __DIR__ . '/../..' . '/src/Psalm/Storage/AttributeArg.php', 'Psalm\\Storage\\AttributeStorage' => __DIR__ . '/../..' . '/src/Psalm/Storage/AttributeStorage.php', 'Psalm\\Storage\\ClassConstantStorage' => __DIR__ . '/../..' . '/src/Psalm/Storage/ClassConstantStorage.php', 'Psalm\\Storage\\ClassLikeStorage' => __DIR__ . '/../..' . '/src/Psalm/Storage/ClassLikeStorage.php', 'Psalm\\Storage\\CustomMetadataTrait' => __DIR__ . '/../..' . '/src/Psalm/Storage/CustomMetadataTrait.php', 'Psalm\\Storage\\EnumCaseStorage' => __DIR__ . '/../..' . '/src/Psalm/Storage/EnumCaseStorage.php', 'Psalm\\Storage\\FileStorage' => __DIR__ . '/../..' . '/src/Psalm/Storage/FileStorage.php', 'Psalm\\Storage\\FunctionLikeParameter' => __DIR__ . '/../..' . '/src/Psalm/Storage/FunctionLikeParameter.php', 'Psalm\\Storage\\FunctionLikeStorage' => __DIR__ . '/../..' . '/src/Psalm/Storage/FunctionLikeStorage.php', 'Psalm\\Storage\\FunctionStorage' => __DIR__ . '/../..' . '/src/Psalm/Storage/FunctionStorage.php', 'Psalm\\Storage\\HasAttributesInterface' => __DIR__ . '/../..' . '/src/Psalm/Storage/HasAttributesInterface.php', 'Psalm\\Storage\\ImmutableNonCloneableTrait' => __DIR__ . '/../..' . '/src/Psalm/Storage/ImmutableNonCloneableTrait.php', 'Psalm\\Storage\\MethodStorage' => __DIR__ . '/../..' . '/src/Psalm/Storage/MethodStorage.php', 'Psalm\\Storage\\Possibilities' => __DIR__ . '/../..' . '/src/Psalm/Storage/Possibilities.php', 'Psalm\\Storage\\PropertyStorage' => __DIR__ . '/../..' . '/src/Psalm/Storage/PropertyStorage.php', 'Psalm\\Type' => __DIR__ . '/../..' . '/src/Psalm/Type.php', 'Psalm\\Type\\Atomic' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic.php', 'Psalm\\Type\\Atomic\\CallableTrait' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/CallableTrait.php', 'Psalm\\Type\\Atomic\\DependentType' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/DependentType.php', 'Psalm\\Type\\Atomic\\GenericTrait' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/GenericTrait.php', 'Psalm\\Type\\Atomic\\HasIntersectionTrait' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/HasIntersectionTrait.php', 'Psalm\\Type\\Atomic\\Scalar' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/Scalar.php', 'Psalm\\Type\\Atomic\\TAnonymousClassInstance' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TAnonymousClassInstance.php', 'Psalm\\Type\\Atomic\\TArray' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TArray.php', 'Psalm\\Type\\Atomic\\TArrayKey' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TArrayKey.php', 'Psalm\\Type\\Atomic\\TBool' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TBool.php', 'Psalm\\Type\\Atomic\\TCallable' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TCallable.php', 'Psalm\\Type\\Atomic\\TCallableArray' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TCallableArray.php', 'Psalm\\Type\\Atomic\\TCallableKeyedArray' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TCallableKeyedArray.php', 'Psalm\\Type\\Atomic\\TCallableList' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TCallableList.php', 'Psalm\\Type\\Atomic\\TCallableObject' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TCallableObject.php', 'Psalm\\Type\\Atomic\\TCallableString' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TCallableString.php', 'Psalm\\Type\\Atomic\\TClassConstant' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TClassConstant.php', 'Psalm\\Type\\Atomic\\TClassString' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TClassString.php', 'Psalm\\Type\\Atomic\\TClassStringMap' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TClassStringMap.php', 'Psalm\\Type\\Atomic\\TClosedResource' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TClosedResource.php', 'Psalm\\Type\\Atomic\\TClosure' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TClosure.php', 'Psalm\\Type\\Atomic\\TConditional' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TConditional.php', 'Psalm\\Type\\Atomic\\TDependentGetClass' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TDependentGetClass.php', 'Psalm\\Type\\Atomic\\TDependentGetDebugType' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TDependentGetDebugType.php', 'Psalm\\Type\\Atomic\\TDependentGetType' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TDependentGetType.php', 'Psalm\\Type\\Atomic\\TDependentListKey' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TDependentListKey.php', 'Psalm\\Type\\Atomic\\TEmptyMixed' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TEmptyMixed.php', 'Psalm\\Type\\Atomic\\TEmptyNumeric' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TEmptyNumeric.php', 'Psalm\\Type\\Atomic\\TEmptyScalar' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TEmptyScalar.php', 'Psalm\\Type\\Atomic\\TEnumCase' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TEnumCase.php', 'Psalm\\Type\\Atomic\\TFalse' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TFalse.php', 'Psalm\\Type\\Atomic\\TFloat' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TFloat.php', 'Psalm\\Type\\Atomic\\TGenericObject' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TGenericObject.php', 'Psalm\\Type\\Atomic\\TInt' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TInt.php', 'Psalm\\Type\\Atomic\\TIntMask' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TIntMask.php', 'Psalm\\Type\\Atomic\\TIntMaskOf' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TIntMaskOf.php', 'Psalm\\Type\\Atomic\\TIntRange' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TIntRange.php', 'Psalm\\Type\\Atomic\\TIterable' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TIterable.php', 'Psalm\\Type\\Atomic\\TKeyOf' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TKeyOf.php', 'Psalm\\Type\\Atomic\\TKeyedArray' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TKeyedArray.php', 'Psalm\\Type\\Atomic\\TList' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TList.php', 'Psalm\\Type\\Atomic\\TLiteralClassString' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TLiteralClassString.php', 'Psalm\\Type\\Atomic\\TLiteralFloat' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TLiteralFloat.php', 'Psalm\\Type\\Atomic\\TLiteralInt' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TLiteralInt.php', 'Psalm\\Type\\Atomic\\TLiteralString' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TLiteralString.php', 'Psalm\\Type\\Atomic\\TLowercaseString' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TLowercaseString.php', 'Psalm\\Type\\Atomic\\TMixed' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TMixed.php', 'Psalm\\Type\\Atomic\\TNamedObject' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TNamedObject.php', 'Psalm\\Type\\Atomic\\TNever' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TNever.php', 'Psalm\\Type\\Atomic\\TNonEmptyArray' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TNonEmptyArray.php', 'Psalm\\Type\\Atomic\\TNonEmptyList' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TNonEmptyList.php', 'Psalm\\Type\\Atomic\\TNonEmptyLowercaseString' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TNonEmptyLowercaseString.php', 'Psalm\\Type\\Atomic\\TNonEmptyMixed' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TNonEmptyMixed.php', 'Psalm\\Type\\Atomic\\TNonEmptyNonspecificLiteralString' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TNonEmptyNonspecificLiteralString.php', 'Psalm\\Type\\Atomic\\TNonEmptyScalar' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TNonEmptyScalar.php', 'Psalm\\Type\\Atomic\\TNonEmptyString' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TNonEmptyString.php', 'Psalm\\Type\\Atomic\\TNonFalsyString' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TNonFalsyString.php', 'Psalm\\Type\\Atomic\\TNonspecificLiteralInt' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TNonspecificLiteralInt.php', 'Psalm\\Type\\Atomic\\TNonspecificLiteralString' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TNonspecificLiteralString.php', 'Psalm\\Type\\Atomic\\TNull' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TNull.php', 'Psalm\\Type\\Atomic\\TNumeric' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TNumeric.php', 'Psalm\\Type\\Atomic\\TNumericString' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TNumericString.php', 'Psalm\\Type\\Atomic\\TObject' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TObject.php', 'Psalm\\Type\\Atomic\\TObjectWithProperties' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TObjectWithProperties.php', 'Psalm\\Type\\Atomic\\TPropertiesOf' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TPropertiesOf.php', 'Psalm\\Type\\Atomic\\TResource' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TResource.php', 'Psalm\\Type\\Atomic\\TScalar' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TScalar.php', 'Psalm\\Type\\Atomic\\TSingleLetter' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TSingleLetter.php', 'Psalm\\Type\\Atomic\\TString' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TString.php', 'Psalm\\Type\\Atomic\\TTemplateIndexedAccess' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TTemplateIndexedAccess.php', 'Psalm\\Type\\Atomic\\TTemplateKeyOf' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TTemplateKeyOf.php', 'Psalm\\Type\\Atomic\\TTemplateParam' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TTemplateParam.php', 'Psalm\\Type\\Atomic\\TTemplateParamClass' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TTemplateParamClass.php', 'Psalm\\Type\\Atomic\\TTemplatePropertiesOf' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TTemplatePropertiesOf.php', 'Psalm\\Type\\Atomic\\TTemplateValueOf' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TTemplateValueOf.php', 'Psalm\\Type\\Atomic\\TTraitString' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TTraitString.php', 'Psalm\\Type\\Atomic\\TTrue' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TTrue.php', 'Psalm\\Type\\Atomic\\TTypeAlias' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TTypeAlias.php', 'Psalm\\Type\\Atomic\\TValueOf' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TValueOf.php', 'Psalm\\Type\\Atomic\\TVoid' => __DIR__ . '/../..' . '/src/Psalm/Type/Atomic/TVoid.php', 'Psalm\\Type\\MutableTypeVisitor' => __DIR__ . '/../..' . '/src/Psalm/Type/MutableTypeVisitor.php', 'Psalm\\Type\\MutableUnion' => __DIR__ . '/../..' . '/src/Psalm/Type/MutableUnion.php', 'Psalm\\Type\\Reconciler' => __DIR__ . '/../..' . '/src/Psalm/Type/Reconciler.php', 'Psalm\\Type\\TaintKind' => __DIR__ . '/../..' . '/src/Psalm/Type/TaintKind.php', 'Psalm\\Type\\TaintKindGroup' => __DIR__ . '/../..' . '/src/Psalm/Type/TaintKindGroup.php', 'Psalm\\Type\\TypeNode' => __DIR__ . '/../..' . '/src/Psalm/Type/TypeNode.php', 'Psalm\\Type\\TypeVisitor' => __DIR__ . '/../..' . '/src/Psalm/Type/TypeVisitor.php', 'Psalm\\Type\\Union' => __DIR__ . '/../..' . '/src/Psalm/Type/Union.php', 'Psalm\\Type\\UnionTrait' => __DIR__ . '/../..' . '/src/Psalm/Type/UnionTrait.php', 'Stringable' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Stringable.php', '_HumbugBox1cb33d1f20f1\\AdvancedJsonRpc\\Dispatcher' => __DIR__ . '/..' . '/felixfbecker/advanced-json-rpc/lib/Dispatcher.php', '_HumbugBox1cb33d1f20f1\\AdvancedJsonRpc\\Error' => __DIR__ . '/..' . '/felixfbecker/advanced-json-rpc/lib/Error.php', '_HumbugBox1cb33d1f20f1\\AdvancedJsonRpc\\ErrorCode' => __DIR__ . '/..' . '/felixfbecker/advanced-json-rpc/lib/ErrorCode.php', '_HumbugBox1cb33d1f20f1\\AdvancedJsonRpc\\ErrorResponse' => __DIR__ . '/..' . '/felixfbecker/advanced-json-rpc/lib/ErrorResponse.php', '_HumbugBox1cb33d1f20f1\\AdvancedJsonRpc\\Message' => __DIR__ . '/..' . '/felixfbecker/advanced-json-rpc/lib/Message.php', '_HumbugBox1cb33d1f20f1\\AdvancedJsonRpc\\Notification' => __DIR__ . '/..' . '/felixfbecker/advanced-json-rpc/lib/Notification.php', '_HumbugBox1cb33d1f20f1\\AdvancedJsonRpc\\Request' => __DIR__ . '/..' . '/felixfbecker/advanced-json-rpc/lib/Request.php', '_HumbugBox1cb33d1f20f1\\AdvancedJsonRpc\\Response' => __DIR__ . '/..' . '/felixfbecker/advanced-json-rpc/lib/Response.php', '_HumbugBox1cb33d1f20f1\\AdvancedJsonRpc\\SuccessResponse' => __DIR__ . '/..' . '/felixfbecker/advanced-json-rpc/lib/SuccessResponse.php', '_HumbugBox1cb33d1f20f1\\Amp\\ByteStream\\Base64\\Base64DecodingInputStream' => __DIR__ . '/..' . '/amphp/byte-stream/lib/Base64/Base64DecodingInputStream.php', '_HumbugBox1cb33d1f20f1\\Amp\\ByteStream\\Base64\\Base64DecodingOutputStream' => __DIR__ . '/..' . '/amphp/byte-stream/lib/Base64/Base64DecodingOutputStream.php', '_HumbugBox1cb33d1f20f1\\Amp\\ByteStream\\Base64\\Base64EncodingInputStream' => __DIR__ . '/..' . '/amphp/byte-stream/lib/Base64/Base64EncodingInputStream.php', '_HumbugBox1cb33d1f20f1\\Amp\\ByteStream\\Base64\\Base64EncodingOutputStream' => __DIR__ . '/..' . '/amphp/byte-stream/lib/Base64/Base64EncodingOutputStream.php', '_HumbugBox1cb33d1f20f1\\Amp\\ByteStream\\ClosedException' => __DIR__ . '/..' . '/amphp/byte-stream/lib/ClosedException.php', '_HumbugBox1cb33d1f20f1\\Amp\\ByteStream\\InMemoryStream' => __DIR__ . '/..' . '/amphp/byte-stream/lib/InMemoryStream.php', '_HumbugBox1cb33d1f20f1\\Amp\\ByteStream\\InputStream' => __DIR__ . '/..' . '/amphp/byte-stream/lib/InputStream.php', '_HumbugBox1cb33d1f20f1\\Amp\\ByteStream\\InputStreamChain' => __DIR__ . '/..' . '/amphp/byte-stream/lib/InputStreamChain.php', '_HumbugBox1cb33d1f20f1\\Amp\\ByteStream\\IteratorStream' => __DIR__ . '/..' . '/amphp/byte-stream/lib/IteratorStream.php', '_HumbugBox1cb33d1f20f1\\Amp\\ByteStream\\LineReader' => __DIR__ . '/..' . '/amphp/byte-stream/lib/LineReader.php', '_HumbugBox1cb33d1f20f1\\Amp\\ByteStream\\Message' => __DIR__ . '/..' . '/amphp/byte-stream/lib/Message.php', '_HumbugBox1cb33d1f20f1\\Amp\\ByteStream\\OutputBuffer' => __DIR__ . '/..' . '/amphp/byte-stream/lib/OutputBuffer.php', '_HumbugBox1cb33d1f20f1\\Amp\\ByteStream\\OutputStream' => __DIR__ . '/..' . '/amphp/byte-stream/lib/OutputStream.php', '_HumbugBox1cb33d1f20f1\\Amp\\ByteStream\\Payload' => __DIR__ . '/..' . '/amphp/byte-stream/lib/Payload.php', '_HumbugBox1cb33d1f20f1\\Amp\\ByteStream\\PendingReadError' => __DIR__ . '/..' . '/amphp/byte-stream/lib/PendingReadError.php', '_HumbugBox1cb33d1f20f1\\Amp\\ByteStream\\ResourceInputStream' => __DIR__ . '/..' . '/amphp/byte-stream/lib/ResourceInputStream.php', '_HumbugBox1cb33d1f20f1\\Amp\\ByteStream\\ResourceOutputStream' => __DIR__ . '/..' . '/amphp/byte-stream/lib/ResourceOutputStream.php', '_HumbugBox1cb33d1f20f1\\Amp\\ByteStream\\StreamException' => __DIR__ . '/..' . '/amphp/byte-stream/lib/StreamException.php', '_HumbugBox1cb33d1f20f1\\Amp\\ByteStream\\ZlibInputStream' => __DIR__ . '/..' . '/amphp/byte-stream/lib/ZlibInputStream.php', '_HumbugBox1cb33d1f20f1\\Amp\\ByteStream\\ZlibOutputStream' => __DIR__ . '/..' . '/amphp/byte-stream/lib/ZlibOutputStream.php', '_HumbugBox1cb33d1f20f1\\Amp\\CallableMaker' => __DIR__ . '/..' . '/amphp/amp/lib/CallableMaker.php', '_HumbugBox1cb33d1f20f1\\Amp\\CancellationToken' => __DIR__ . '/..' . '/amphp/amp/lib/CancellationToken.php', '_HumbugBox1cb33d1f20f1\\Amp\\CancellationTokenSource' => __DIR__ . '/..' . '/amphp/amp/lib/CancellationTokenSource.php', '_HumbugBox1cb33d1f20f1\\Amp\\CancelledException' => __DIR__ . '/..' . '/amphp/amp/lib/CancelledException.php', '_HumbugBox1cb33d1f20f1\\Amp\\CombinedCancellationToken' => __DIR__ . '/..' . '/amphp/amp/lib/CombinedCancellationToken.php', '_HumbugBox1cb33d1f20f1\\Amp\\Coroutine' => __DIR__ . '/..' . '/amphp/amp/lib/Coroutine.php', '_HumbugBox1cb33d1f20f1\\Amp\\Deferred' => __DIR__ . '/..' . '/amphp/amp/lib/Deferred.php', '_HumbugBox1cb33d1f20f1\\Amp\\Delayed' => __DIR__ . '/..' . '/amphp/amp/lib/Delayed.php', '_HumbugBox1cb33d1f20f1\\Amp\\Emitter' => __DIR__ . '/..' . '/amphp/amp/lib/Emitter.php', '_HumbugBox1cb33d1f20f1\\Amp\\Failure' => __DIR__ . '/..' . '/amphp/amp/lib/Failure.php', '_HumbugBox1cb33d1f20f1\\Amp\\Internal\\Placeholder' => __DIR__ . '/..' . '/amphp/amp/lib/Internal/Placeholder.php', '_HumbugBox1cb33d1f20f1\\Amp\\Internal\\PrivateIterator' => __DIR__ . '/..' . '/amphp/amp/lib/Internal/PrivateIterator.php', '_HumbugBox1cb33d1f20f1\\Amp\\Internal\\PrivatePromise' => __DIR__ . '/..' . '/amphp/amp/lib/Internal/PrivatePromise.php', '_HumbugBox1cb33d1f20f1\\Amp\\Internal\\Producer' => __DIR__ . '/..' . '/amphp/amp/lib/Internal/Producer.php', '_HumbugBox1cb33d1f20f1\\Amp\\Internal\\ResolutionQueue' => __DIR__ . '/..' . '/amphp/amp/lib/Internal/ResolutionQueue.php', '_HumbugBox1cb33d1f20f1\\Amp\\InvalidYieldError' => __DIR__ . '/..' . '/amphp/amp/lib/InvalidYieldError.php', '_HumbugBox1cb33d1f20f1\\Amp\\Iterator' => __DIR__ . '/..' . '/amphp/amp/lib/Iterator.php', '_HumbugBox1cb33d1f20f1\\Amp\\LazyPromise' => __DIR__ . '/..' . '/amphp/amp/lib/LazyPromise.php', '_HumbugBox1cb33d1f20f1\\Amp\\Loop' => __DIR__ . '/..' . '/amphp/amp/lib/Loop.php', '_HumbugBox1cb33d1f20f1\\Amp\\Loop\\Driver' => __DIR__ . '/..' . '/amphp/amp/lib/Loop/Driver.php', '_HumbugBox1cb33d1f20f1\\Amp\\Loop\\DriverFactory' => __DIR__ . '/..' . '/amphp/amp/lib/Loop/DriverFactory.php', '_HumbugBox1cb33d1f20f1\\Amp\\Loop\\EvDriver' => __DIR__ . '/..' . '/amphp/amp/lib/Loop/EvDriver.php', '_HumbugBox1cb33d1f20f1\\Amp\\Loop\\EventDriver' => __DIR__ . '/..' . '/amphp/amp/lib/Loop/EventDriver.php', '_HumbugBox1cb33d1f20f1\\Amp\\Loop\\Internal\\TimerQueue' => __DIR__ . '/..' . '/amphp/amp/lib/Loop/Internal/TimerQueue.php', '_HumbugBox1cb33d1f20f1\\Amp\\Loop\\InvalidWatcherError' => __DIR__ . '/..' . '/amphp/amp/lib/Loop/InvalidWatcherError.php', '_HumbugBox1cb33d1f20f1\\Amp\\Loop\\NativeDriver' => __DIR__ . '/..' . '/amphp/amp/lib/Loop/NativeDriver.php', '_HumbugBox1cb33d1f20f1\\Amp\\Loop\\TracingDriver' => __DIR__ . '/..' . '/amphp/amp/lib/Loop/TracingDriver.php', '_HumbugBox1cb33d1f20f1\\Amp\\Loop\\UnsupportedFeatureException' => __DIR__ . '/..' . '/amphp/amp/lib/Loop/UnsupportedFeatureException.php', '_HumbugBox1cb33d1f20f1\\Amp\\Loop\\UvDriver' => __DIR__ . '/..' . '/amphp/amp/lib/Loop/UvDriver.php', '_HumbugBox1cb33d1f20f1\\Amp\\Loop\\Watcher' => __DIR__ . '/..' . '/amphp/amp/lib/Loop/Watcher.php', '_HumbugBox1cb33d1f20f1\\Amp\\MultiReasonException' => __DIR__ . '/..' . '/amphp/amp/lib/MultiReasonException.php', '_HumbugBox1cb33d1f20f1\\Amp\\NullCancellationToken' => __DIR__ . '/..' . '/amphp/amp/lib/NullCancellationToken.php', '_HumbugBox1cb33d1f20f1\\Amp\\Producer' => __DIR__ . '/..' . '/amphp/amp/lib/Producer.php', '_HumbugBox1cb33d1f20f1\\Amp\\Promise' => __DIR__ . '/..' . '/amphp/amp/lib/Promise.php', '_HumbugBox1cb33d1f20f1\\Amp\\Struct' => __DIR__ . '/..' . '/amphp/amp/lib/Struct.php', '_HumbugBox1cb33d1f20f1\\Amp\\Success' => __DIR__ . '/..' . '/amphp/amp/lib/Success.php', '_HumbugBox1cb33d1f20f1\\Amp\\TimeoutCancellationToken' => __DIR__ . '/..' . '/amphp/amp/lib/TimeoutCancellationToken.php', '_HumbugBox1cb33d1f20f1\\Amp\\TimeoutException' => __DIR__ . '/..' . '/amphp/amp/lib/TimeoutException.php', '_HumbugBox1cb33d1f20f1\\Composer\\Pcre\\MatchAllResult' => __DIR__ . '/..' . '/composer/pcre/src/MatchAllResult.php', '_HumbugBox1cb33d1f20f1\\Composer\\Pcre\\MatchAllStrictGroupsResult' => __DIR__ . '/..' . '/composer/pcre/src/MatchAllStrictGroupsResult.php', '_HumbugBox1cb33d1f20f1\\Composer\\Pcre\\MatchAllWithOffsetsResult' => __DIR__ . '/..' . '/composer/pcre/src/MatchAllWithOffsetsResult.php', '_HumbugBox1cb33d1f20f1\\Composer\\Pcre\\MatchResult' => __DIR__ . '/..' . '/composer/pcre/src/MatchResult.php', '_HumbugBox1cb33d1f20f1\\Composer\\Pcre\\MatchStrictGroupsResult' => __DIR__ . '/..' . '/composer/pcre/src/MatchStrictGroupsResult.php', '_HumbugBox1cb33d1f20f1\\Composer\\Pcre\\MatchWithOffsetsResult' => __DIR__ . '/..' . '/composer/pcre/src/MatchWithOffsetsResult.php', '_HumbugBox1cb33d1f20f1\\Composer\\Pcre\\PcreException' => __DIR__ . '/..' . '/composer/pcre/src/PcreException.php', '_HumbugBox1cb33d1f20f1\\Composer\\Pcre\\Preg' => __DIR__ . '/..' . '/composer/pcre/src/Preg.php', '_HumbugBox1cb33d1f20f1\\Composer\\Pcre\\Regex' => __DIR__ . '/..' . '/composer/pcre/src/Regex.php', '_HumbugBox1cb33d1f20f1\\Composer\\Pcre\\ReplaceResult' => __DIR__ . '/..' . '/composer/pcre/src/ReplaceResult.php', '_HumbugBox1cb33d1f20f1\\Composer\\Pcre\\UnexpectedNullMatchException' => __DIR__ . '/..' . '/composer/pcre/src/UnexpectedNullMatchException.php', '_HumbugBox1cb33d1f20f1\\Composer\\Semver\\Comparator' => __DIR__ . '/..' . '/composer/semver/src/Comparator.php', '_HumbugBox1cb33d1f20f1\\Composer\\Semver\\CompilingMatcher' => __DIR__ . '/..' . '/composer/semver/src/CompilingMatcher.php', '_HumbugBox1cb33d1f20f1\\Composer\\Semver\\Constraint\\Bound' => __DIR__ . '/..' . '/composer/semver/src/Constraint/Bound.php', '_HumbugBox1cb33d1f20f1\\Composer\\Semver\\Constraint\\Constraint' => __DIR__ . '/..' . '/composer/semver/src/Constraint/Constraint.php', '_HumbugBox1cb33d1f20f1\\Composer\\Semver\\Constraint\\ConstraintInterface' => __DIR__ . '/..' . '/composer/semver/src/Constraint/ConstraintInterface.php', '_HumbugBox1cb33d1f20f1\\Composer\\Semver\\Constraint\\MatchAllConstraint' => __DIR__ . '/..' . '/composer/semver/src/Constraint/MatchAllConstraint.php', '_HumbugBox1cb33d1f20f1\\Composer\\Semver\\Constraint\\MatchNoneConstraint' => __DIR__ . '/..' . '/composer/semver/src/Constraint/MatchNoneConstraint.php', '_HumbugBox1cb33d1f20f1\\Composer\\Semver\\Constraint\\MultiConstraint' => __DIR__ . '/..' . '/composer/semver/src/Constraint/MultiConstraint.php', '_HumbugBox1cb33d1f20f1\\Composer\\Semver\\Interval' => __DIR__ . '/..' . '/composer/semver/src/Interval.php', '_HumbugBox1cb33d1f20f1\\Composer\\Semver\\Intervals' => __DIR__ . '/..' . '/composer/semver/src/Intervals.php', '_HumbugBox1cb33d1f20f1\\Composer\\Semver\\Semver' => __DIR__ . '/..' . '/composer/semver/src/Semver.php', '_HumbugBox1cb33d1f20f1\\Composer\\Semver\\VersionParser' => __DIR__ . '/..' . '/composer/semver/src/VersionParser.php', '_HumbugBox1cb33d1f20f1\\Composer\\XdebugHandler\\PhpConfig' => __DIR__ . '/..' . '/composer/xdebug-handler/src/PhpConfig.php', '_HumbugBox1cb33d1f20f1\\Composer\\XdebugHandler\\Process' => __DIR__ . '/..' . '/composer/xdebug-handler/src/Process.php', '_HumbugBox1cb33d1f20f1\\Composer\\XdebugHandler\\Status' => __DIR__ . '/..' . '/composer/xdebug-handler/src/Status.php', '_HumbugBox1cb33d1f20f1\\Composer\\XdebugHandler\\XdebugHandler' => __DIR__ . '/..' . '/composer/xdebug-handler/src/XdebugHandler.php', '_HumbugBox1cb33d1f20f1\\Fidry\\CpuCoreCounter\\CpuCoreCounter' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/CpuCoreCounter.php', '_HumbugBox1cb33d1f20f1\\Fidry\\CpuCoreCounter\\Diagnoser' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Diagnoser.php', '_HumbugBox1cb33d1f20f1\\Fidry\\CpuCoreCounter\\Exec\\ProcOpen' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Exec/ProcOpen.php', '_HumbugBox1cb33d1f20f1\\Fidry\\CpuCoreCounter\\Finder\\CpuCoreFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/CpuCoreFinder.php', '_HumbugBox1cb33d1f20f1\\Fidry\\CpuCoreCounter\\Finder\\CpuInfoFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/CpuInfoFinder.php', '_HumbugBox1cb33d1f20f1\\Fidry\\CpuCoreCounter\\Finder\\DummyCpuCoreFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/DummyCpuCoreFinder.php', '_HumbugBox1cb33d1f20f1\\Fidry\\CpuCoreCounter\\Finder\\FinderRegistry' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/FinderRegistry.php', '_HumbugBox1cb33d1f20f1\\Fidry\\CpuCoreCounter\\Finder\\HwLogicalFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/HwLogicalFinder.php', '_HumbugBox1cb33d1f20f1\\Fidry\\CpuCoreCounter\\Finder\\HwPhysicalFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/HwPhysicalFinder.php', '_HumbugBox1cb33d1f20f1\\Fidry\\CpuCoreCounter\\Finder\\NProcFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/NProcFinder.php', '_HumbugBox1cb33d1f20f1\\Fidry\\CpuCoreCounter\\Finder\\NProcessorFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/NProcessorFinder.php', '_HumbugBox1cb33d1f20f1\\Fidry\\CpuCoreCounter\\Finder\\NullCpuCoreFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/NullCpuCoreFinder.php', '_HumbugBox1cb33d1f20f1\\Fidry\\CpuCoreCounter\\Finder\\OnlyOnWindowsFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/OnlyOnWindowsFinder.php', '_HumbugBox1cb33d1f20f1\\Fidry\\CpuCoreCounter\\Finder\\ProcOpenBasedFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/ProcOpenBasedFinder.php', '_HumbugBox1cb33d1f20f1\\Fidry\\CpuCoreCounter\\Finder\\SkipOnWindowsFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/SkipOnWindowsFinder.php', '_HumbugBox1cb33d1f20f1\\Fidry\\CpuCoreCounter\\Finder\\WmicLogicalFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/WmicLogicalFinder.php', '_HumbugBox1cb33d1f20f1\\Fidry\\CpuCoreCounter\\Finder\\WmicPhysicalFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/WmicPhysicalFinder.php', '_HumbugBox1cb33d1f20f1\\Fidry\\CpuCoreCounter\\Finder\\_NProcessorFinder' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/Finder/_NProcessorFinder.php', '_HumbugBox1cb33d1f20f1\\Fidry\\CpuCoreCounter\\NumberOfCpuCoreNotFound' => __DIR__ . '/..' . '/fidry/cpu-core-counter/src/NumberOfCpuCoreNotFound.php', '_HumbugBox1cb33d1f20f1\\JsonException' => __DIR__ . '/..' . '/symfony/polyfill-php73/Resources/stubs/JsonException.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\CallHierarchyClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CallHierarchyClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\ChangeAnnotation' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ChangeAnnotation.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\ClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\ClientCapabilitiesGeneral' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ClientCapabilitiesGeneral.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\ClientCapabilitiesWindow' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ClientCapabilitiesWindow.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\ClientCapabilitiesWorkspace' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ClientCapabilitiesWorkspace.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\ClientCapabilitiesWorkspaceFileOperations' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ClientCapabilitiesWorkspaceFileOperations.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\ClientInfo' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ClientInfo.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\CodeAction' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CodeAction.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\CodeActionClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CodeActionClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\CodeActionClientCapabilitiesCodeActionLiteralSupport' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CodeActionClientCapabilitiesCodeActionLiteralSupport.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\CodeActionClientCapabilitiesCodeActionLiteralSupportcodeActionKind' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CodeActionClientCapabilitiesCodeActionLiteralSupportcodeActionKind.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\CodeActionClientCapabilitiesResolveSupport' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CodeActionClientCapabilitiesResolveSupport.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\CodeActionContext' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CodeActionContext.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\CodeActionDisabled' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CodeActionDisabled.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\CodeActionKind' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CodeActionKind.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\CodeActionTriggerKind' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CodeActionTriggerKind.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\CodeDescription' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CodeDescription.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\CodeLens' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CodeLens.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\CodeLensClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CodeLensClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\CodeLensOptions' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CodeLensOptions.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\CodeLensWorkspaceClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CodeLensWorkspaceClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\Command' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/Command.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\CompletionClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CompletionClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\CompletionClientCapabilitiesCompletionItem' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItem.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\CompletionClientCapabilitiesCompletionItemInsertTextModeSupport' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItemInsertTextModeSupport.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\CompletionClientCapabilitiesCompletionItemResolveSupport' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItemResolveSupport.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\CompletionClientCapabilitiesCompletionItemTagSupport' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionItemTagSupport.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\CompletionClientCapabilitiesCompletionList' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CompletionClientCapabilitiesCompletionList.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\CompletionContext' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CompletionContext.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\CompletionItem' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CompletionItem.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\CompletionItemKind' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CompletionItemKind.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\CompletionItemLabelDetails' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CompletionItemLabelDetails.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\CompletionItemTag' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CompletionItemTag.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\CompletionList' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CompletionList.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\CompletionOptions' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CompletionOptions.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\CompletionTriggerKind' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/CompletionTriggerKind.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\ContentChangeEvent' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ContentChangeEvent.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\DeclarationClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DeclarationClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\DefinitionClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DefinitionClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\DependencyReference' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DependencyReference.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\Diagnostic' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/Diagnostic.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\DiagnosticRelatedInformation' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DiagnosticRelatedInformation.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\DiagnosticSeverity' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DiagnosticSeverity.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\DiagnosticTag' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DiagnosticTag.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\DidChangeConfigurationClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DidChangeConfigurationClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\DidChangeWatchedFilesClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DidChangeWatchedFilesClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\DocumentColorClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DocumentColorClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\DocumentFormattingClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DocumentFormattingClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\DocumentHighlight' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DocumentHighlight.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\DocumentHighlightClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DocumentHighlightClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\DocumentHighlightKind' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DocumentHighlightKind.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\DocumentLinkClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DocumentLinkClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\DocumentOnTypeFormattingClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DocumentOnTypeFormattingClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\DocumentOnTypeFormattingOptions' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DocumentOnTypeFormattingOptions.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\DocumentRangeFormattingClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DocumentRangeFormattingClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\DocumentSymbolClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DocumentSymbolClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\DocumentSymbolClientCapabilitiesSymbolKind' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DocumentSymbolClientCapabilitiesSymbolKind.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\DocumentSymbolClientCapabilitiesTagSupport' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/DocumentSymbolClientCapabilitiesTagSupport.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\ErrorCode' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ErrorCode.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\ExecuteCommandClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ExecuteCommandClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\ExecuteCommandOptions' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ExecuteCommandOptions.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\FailureHandlingKind' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/FailureHandlingKind.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\FileChangeType' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/FileChangeType.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\FileEvent' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/FileEvent.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\FoldingRangeClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/FoldingRangeClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\FormattingOptions' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/FormattingOptions.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\Hover' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/Hover.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\HoverClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/HoverClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\ImplementationClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ImplementationClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\InitializeResult' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/InitializeResult.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\InitializeResultServerInfo' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/InitializeResultServerInfo.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\InsertTextFormat' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/InsertTextFormat.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\InsertTextMode' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/InsertTextMode.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\LinkedEditingRangeClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/LinkedEditingRangeClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\Location' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/Location.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\LogMessage' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/LogMessage.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\LogTrace' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/LogTrace.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\MarkdownClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/MarkdownClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\MarkedString' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/MarkedString.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\MarkupContent' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/MarkupContent.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\MarkupKind' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/MarkupKind.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\MessageActionItem' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/MessageActionItem.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\MessageType' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/MessageType.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\MonikerClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/MonikerClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\PackageDescriptor' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/PackageDescriptor.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\ParameterInformation' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ParameterInformation.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\Position' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/Position.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\PrepareSupportDefaultBehavior' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/PrepareSupportDefaultBehavior.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\PublishDiagnosticsClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/PublishDiagnosticsClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\PublishDiagnosticsClientCapabilitiesTagSupport' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/PublishDiagnosticsClientCapabilitiesTagSupport.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\Range' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/Range.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\ReferenceClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ReferenceClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\ReferenceContext' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ReferenceContext.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\ReferenceInformation' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ReferenceInformation.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\RegularExpressionsClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/RegularExpressionsClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\RenameClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/RenameClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\ResourceOperationKind' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ResourceOperationKind.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\SaveOptions' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/SaveOptions.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\SelectionRangeClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/SelectionRangeClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\SemanticTokensClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/SemanticTokensClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\SemanticTokensClientCapabilitiesRequests' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/SemanticTokensClientCapabilitiesRequests.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\SemanticTokensWorkspaceClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/SemanticTokensWorkspaceClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\ServerCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ServerCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\ShowDocumentClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ShowDocumentClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\ShowMessageRequestClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ShowMessageRequestClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\ShowMessageRequestClientCapabilitiesMessageActionItem' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/ShowMessageRequestClientCapabilitiesMessageActionItem.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\SignatureHelp' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/SignatureHelp.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\SignatureHelpClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/SignatureHelpClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\SignatureHelpClientCapabilitiesSignatureInformation' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/SignatureHelpClientCapabilitiesSignatureInformation.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\SignatureHelpClientCapabilitiesSignatureInformationParameterInformation' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/SignatureHelpClientCapabilitiesSignatureInformationParameterInformation.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\SignatureHelpOptions' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/SignatureHelpOptions.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\SignatureInformation' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/SignatureInformation.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\SymbolDescriptor' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/SymbolDescriptor.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\SymbolInformation' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/SymbolInformation.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\SymbolKind' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/SymbolKind.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\SymbolLocationInformation' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/SymbolLocationInformation.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\SymbolTag' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/SymbolTag.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\TextDocumentClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/TextDocumentClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\TextDocumentContentChangeEvent' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/TextDocumentContentChangeEvent.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\TextDocumentIdentifier' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/TextDocumentIdentifier.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\TextDocumentItem' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/TextDocumentItem.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\TextDocumentSyncClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/TextDocumentSyncClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\TextDocumentSyncKind' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/TextDocumentSyncKind.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\TextDocumentSyncOptions' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/TextDocumentSyncOptions.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\TextEdit' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/TextEdit.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\TokenFormat' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/TokenFormat.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\TypeDefinitionClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/TypeDefinitionClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\VersionedTextDocumentIdentifier' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/VersionedTextDocumentIdentifier.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\WorkspaceEdit' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/WorkspaceEdit.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\WorkspaceEditClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/WorkspaceEditClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\WorkspaceEditClientCapabilitiesChangeAnnotationSupport' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/WorkspaceEditClientCapabilitiesChangeAnnotationSupport.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\WorkspaceFolder' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/WorkspaceFolder.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\WorkspaceSymbolClientCapabilities' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilities.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\WorkspaceSymbolClientCapabilitiesResolveSupport' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilitiesResolveSupport.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\WorkspaceSymbolClientCapabilitiesSymbolKind' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilitiesSymbolKind.php', '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\WorkspaceSymbolClientCapabilitiesTagSupport' => __DIR__ . '/..' . '/felixfbecker/language-server-protocol/src/WorkspaceSymbolClientCapabilitiesTagSupport.php', '_HumbugBox1cb33d1f20f1\\Normalizer' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php', '_HumbugBox1cb33d1f20f1\\PackageVersions\\FallbackVersions' => __DIR__ . '/..' . '/composer/package-versions-deprecated/src/PackageVersions/FallbackVersions.php', '_HumbugBox1cb33d1f20f1\\PackageVersions\\Installer' => __DIR__ . '/..' . '/composer/package-versions-deprecated/src/PackageVersions/Installer.php', '_HumbugBox1cb33d1f20f1\\PackageVersions\\Versions' => __DIR__ . '/..' . '/composer/package-versions-deprecated/src/PackageVersions/Versions.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Builder' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\BuilderFactory' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/BuilderFactory.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\BuilderHelpers' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/BuilderHelpers.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Builder\\ClassConst' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/ClassConst.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Builder\\Class_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Class_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Builder\\Declaration' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Declaration.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Builder\\EnumCase' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/EnumCase.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Builder\\Enum_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Enum_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Builder\\FunctionLike' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/FunctionLike.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Builder\\Function_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Function_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Builder\\Interface_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Interface_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Builder\\Method' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Method.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Builder\\Namespace_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Namespace_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Builder\\Param' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Param.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Builder\\Property' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Property.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Builder\\TraitUse' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/TraitUse.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Builder\\TraitUseAdaptation' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/TraitUseAdaptation.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Builder\\Trait_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Trait_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Builder\\Use_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder/Use_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Comment' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Comment.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Comment\\Doc' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Comment/Doc.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\ConstExprEvaluationException' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ConstExprEvaluationException.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\ConstExprEvaluator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ConstExprEvaluator.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Error' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Error.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\ErrorHandler' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ErrorHandler.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\ErrorHandler\\Collecting' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ErrorHandler/Collecting.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\ErrorHandler\\Throwing' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ErrorHandler/Throwing.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Internal\\DiffElem' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Internal/DiffElem.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Internal\\Differ' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Internal/Differ.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Internal\\PrintableNewAnonClassNode' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Internal/PrintableNewAnonClassNode.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Internal\\TokenStream' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Internal/TokenStream.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\JsonDecoder' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/JsonDecoder.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Lexer' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Lexer\\Emulative' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/Emulative.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Lexer\\TokenEmulator\\AttributeEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/AttributeEmulator.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Lexer\\TokenEmulator\\CoaleseEqualTokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/CoaleseEqualTokenEmulator.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Lexer\\TokenEmulator\\EnumTokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/EnumTokenEmulator.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Lexer\\TokenEmulator\\ExplicitOctalEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ExplicitOctalEmulator.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Lexer\\TokenEmulator\\FlexibleDocStringEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FlexibleDocStringEmulator.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Lexer\\TokenEmulator\\FnTokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FnTokenEmulator.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Lexer\\TokenEmulator\\KeywordEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/KeywordEmulator.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Lexer\\TokenEmulator\\MatchTokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/MatchTokenEmulator.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Lexer\\TokenEmulator\\NullsafeTokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NullsafeTokenEmulator.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Lexer\\TokenEmulator\\NumericLiteralSeparatorEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NumericLiteralSeparatorEmulator.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Lexer\\TokenEmulator\\ReadonlyFunctionTokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyFunctionTokenEmulator.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Lexer\\TokenEmulator\\ReadonlyTokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyTokenEmulator.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Lexer\\TokenEmulator\\ReverseEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReverseEmulator.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Lexer\\TokenEmulator\\TokenEmulator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/TokenEmulator.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\NameContext' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NameContext.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\NodeAbstract' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeAbstract.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\NodeDumper' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeDumper.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\NodeFinder' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeFinder.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\NodeTraverser' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeTraverser.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\NodeTraverserInterface' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeTraverserInterface.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\NodeVisitor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\NodeVisitorAbstract' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitorAbstract.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\NodeVisitor\\CloningVisitor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor/CloningVisitor.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\NodeVisitor\\FindingVisitor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor/FindingVisitor.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\NodeVisitor\\FirstFindingVisitor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor/FirstFindingVisitor.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\NodeVisitor\\NameResolver' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor/NameResolver.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\NodeVisitor\\NodeConnectingVisitor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor/NodeConnectingVisitor.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\NodeVisitor\\ParentConnectingVisitor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/NodeVisitor/ParentConnectingVisitor.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Arg' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Arg.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Attribute' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Attribute.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\AttributeGroup' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/AttributeGroup.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\ComplexType' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/ComplexType.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Const_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Const_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\ArrayDimFetch' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayDimFetch.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\ArrayItem' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayItem.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\Array_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Array_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\ArrowFunction' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ArrowFunction.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\Assign' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Assign.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\AssignOp' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\AssignOp\\BitwiseAnd' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseAnd.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\AssignOp\\BitwiseOr' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseOr.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\AssignOp\\BitwiseXor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseXor.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\AssignOp\\Coalesce' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Coalesce.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\AssignOp\\Concat' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Concat.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\AssignOp\\Div' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Div.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\AssignOp\\Minus' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Minus.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\AssignOp\\Mod' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mod.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\AssignOp\\Mul' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mul.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\AssignOp\\Plus' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Plus.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\AssignOp\\Pow' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Pow.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\AssignOp\\ShiftLeft' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftLeft.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\AssignOp\\ShiftRight' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftRight.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\AssignRef' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/AssignRef.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BinaryOp' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BinaryOp\\BitwiseAnd' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseAnd.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BinaryOp\\BitwiseOr' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseOr.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BinaryOp\\BitwiseXor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseXor.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BinaryOp\\BooleanAnd' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanAnd.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BinaryOp\\BooleanOr' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanOr.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BinaryOp\\Coalesce' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Coalesce.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BinaryOp\\Concat' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Concat.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BinaryOp\\Div' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Div.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BinaryOp\\Equal' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Equal.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BinaryOp\\Greater' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Greater.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BinaryOp\\GreaterOrEqual' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/GreaterOrEqual.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BinaryOp\\Identical' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Identical.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BinaryOp\\LogicalAnd' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalAnd.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BinaryOp\\LogicalOr' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalOr.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BinaryOp\\LogicalXor' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalXor.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BinaryOp\\Minus' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Minus.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BinaryOp\\Mod' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mod.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BinaryOp\\Mul' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mul.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BinaryOp\\NotEqual' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotEqual.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BinaryOp\\NotIdentical' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotIdentical.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BinaryOp\\Plus' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Plus.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BinaryOp\\Pow' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Pow.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BinaryOp\\ShiftLeft' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftLeft.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BinaryOp\\ShiftRight' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftRight.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BinaryOp\\Smaller' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Smaller.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BinaryOp\\SmallerOrEqual' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/SmallerOrEqual.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BinaryOp\\Spaceship' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Spaceship.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BitwiseNot' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BitwiseNot.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\BooleanNot' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/BooleanNot.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\CallLike' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/CallLike.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\Cast' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\Cast\\Array_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Array_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\Cast\\Bool_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Bool_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\Cast\\Double' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Double.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\Cast\\Int_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Int_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\Cast\\Object_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Object_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\Cast\\String_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/String_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\Cast\\Unset_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Unset_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\ClassConstFetch' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ClassConstFetch.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\Clone_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Clone_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\Closure' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Closure.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\ClosureUse' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ClosureUse.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\ConstFetch' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ConstFetch.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\Empty_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Empty_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\Error' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Error.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\ErrorSuppress' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ErrorSuppress.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\Eval_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Eval_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\Exit_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Exit_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\FuncCall' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/FuncCall.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\Include_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Include_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\Instanceof_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Instanceof_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\Isset_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Isset_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\List_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/List_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\Match_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Match_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\MethodCall' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/MethodCall.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\New_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/New_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\NullsafeMethodCall' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafeMethodCall.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\NullsafePropertyFetch' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafePropertyFetch.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\PostDec' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/PostDec.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\PostInc' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/PostInc.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\PreDec' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/PreDec.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\PreInc' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/PreInc.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\Print_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Print_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\PropertyFetch' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/PropertyFetch.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\ShellExec' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/ShellExec.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\StaticCall' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/StaticCall.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\StaticPropertyFetch' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/StaticPropertyFetch.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\Ternary' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Ternary.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\Throw_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Throw_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\UnaryMinus' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryMinus.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\UnaryPlus' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryPlus.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\Variable' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Variable.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\YieldFrom' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/YieldFrom.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Expr\\Yield_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Expr/Yield_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\FunctionLike' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/FunctionLike.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Identifier' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Identifier.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\IntersectionType' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/IntersectionType.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\MatchArm' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/MatchArm.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Name' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Name.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Name\\FullyQualified' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Name/FullyQualified.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Name\\Relative' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Name/Relative.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\NullableType' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/NullableType.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Param' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Param.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Scalar' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Scalar\\DNumber' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Scalar\\Encapsed' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/Encapsed.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Scalar\\EncapsedStringPart' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/EncapsedStringPart.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Scalar\\LNumber' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Scalar\\MagicConst' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Scalar\\MagicConst\\Class_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Class_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Scalar\\MagicConst\\Dir' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Dir.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Scalar\\MagicConst\\File' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/File.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Scalar\\MagicConst\\Function_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Function_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Scalar\\MagicConst\\Line' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Line.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Scalar\\MagicConst\\Method' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Method.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Scalar\\MagicConst\\Namespace_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Namespace_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Scalar\\MagicConst\\Trait_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Trait_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Scalar\\String_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Scalar/String_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\Break_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Break_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\Case_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Case_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\Catch_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Catch_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\ClassConst' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassConst.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\ClassLike' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\ClassMethod' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassMethod.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\Class_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\Const_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Const_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\Continue_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Continue_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\DeclareDeclare' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/DeclareDeclare.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\Declare_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Declare_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\Do_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Do_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\Echo_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Echo_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\ElseIf_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/ElseIf_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\Else_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Else_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\EnumCase' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/EnumCase.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\Enum_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Enum_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\Expression' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Expression.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\Finally_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Finally_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\For_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/For_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\Foreach_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Foreach_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\Function_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\Global_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Global_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\Goto_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Goto_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\GroupUse' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/GroupUse.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\HaltCompiler' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/HaltCompiler.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\If_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/If_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\InlineHTML' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/InlineHTML.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\Interface_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Interface_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\Label' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Label.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\Namespace_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Namespace_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\Nop' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Nop.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\Property' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Property.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\PropertyProperty' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/PropertyProperty.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\Return_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Return_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\StaticVar' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/StaticVar.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\Static_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Static_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\Switch_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Switch_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\Throw_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Throw_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\TraitUse' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUse.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\TraitUseAdaptation' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\TraitUseAdaptation\\Alias' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Alias.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\TraitUseAdaptation\\Precedence' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Precedence.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\Trait_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Trait_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\TryCatch' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/TryCatch.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\Unset_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Unset_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\UseUse' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/UseUse.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\Use_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/Use_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\Stmt\\While_' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/Stmt/While_.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\UnionType' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/UnionType.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\VarLikeIdentifier' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/VarLikeIdentifier.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Node\\VariadicPlaceholder' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Node/VariadicPlaceholder.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Parser' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Parser.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\ParserAbstract' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ParserAbstract.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\ParserFactory' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ParserFactory.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Parser\\Multiple' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Parser/Multiple.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Parser\\Php5' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Parser/Php5.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Parser\\Php7' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Parser/Php7.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\Parser\\Tokens' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Parser/Tokens.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\PrettyPrinterAbstract' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php', '_HumbugBox1cb33d1f20f1\\PhpParser\\PrettyPrinter\\Standard' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/PrettyPrinter/Standard.php', '_HumbugBox1cb33d1f20f1\\Psr\\Container\\ContainerExceptionInterface' => __DIR__ . '/..' . '/psr/container/src/ContainerExceptionInterface.php', '_HumbugBox1cb33d1f20f1\\Psr\\Container\\ContainerInterface' => __DIR__ . '/..' . '/psr/container/src/ContainerInterface.php', '_HumbugBox1cb33d1f20f1\\Psr\\Container\\NotFoundExceptionInterface' => __DIR__ . '/..' . '/psr/container/src/NotFoundExceptionInterface.php', '_HumbugBox1cb33d1f20f1\\Psr\\Log\\AbstractLogger' => __DIR__ . '/..' . '/psr/log/Psr/Log/AbstractLogger.php', '_HumbugBox1cb33d1f20f1\\Psr\\Log\\InvalidArgumentException' => __DIR__ . '/..' . '/psr/log/Psr/Log/InvalidArgumentException.php', '_HumbugBox1cb33d1f20f1\\Psr\\Log\\LogLevel' => __DIR__ . '/..' . '/psr/log/Psr/Log/LogLevel.php', '_HumbugBox1cb33d1f20f1\\Psr\\Log\\LoggerAwareInterface' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerAwareInterface.php', '_HumbugBox1cb33d1f20f1\\Psr\\Log\\LoggerAwareTrait' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerAwareTrait.php', '_HumbugBox1cb33d1f20f1\\Psr\\Log\\LoggerInterface' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerInterface.php', '_HumbugBox1cb33d1f20f1\\Psr\\Log\\LoggerTrait' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerTrait.php', '_HumbugBox1cb33d1f20f1\\Psr\\Log\\NullLogger' => __DIR__ . '/..' . '/psr/log/Psr/Log/NullLogger.php', '_HumbugBox1cb33d1f20f1\\SebastianBergmann\\Diff\\Chunk' => __DIR__ . '/..' . '/sebastian/diff/src/Chunk.php', '_HumbugBox1cb33d1f20f1\\SebastianBergmann\\Diff\\ConfigurationException' => __DIR__ . '/..' . '/sebastian/diff/src/Exception/ConfigurationException.php', '_HumbugBox1cb33d1f20f1\\SebastianBergmann\\Diff\\Diff' => __DIR__ . '/..' . '/sebastian/diff/src/Diff.php', '_HumbugBox1cb33d1f20f1\\SebastianBergmann\\Diff\\Differ' => __DIR__ . '/..' . '/sebastian/diff/src/Differ.php', '_HumbugBox1cb33d1f20f1\\SebastianBergmann\\Diff\\Exception' => __DIR__ . '/..' . '/sebastian/diff/src/Exception/Exception.php', '_HumbugBox1cb33d1f20f1\\SebastianBergmann\\Diff\\InvalidArgumentException' => __DIR__ . '/..' . '/sebastian/diff/src/Exception/InvalidArgumentException.php', '_HumbugBox1cb33d1f20f1\\SebastianBergmann\\Diff\\Line' => __DIR__ . '/..' . '/sebastian/diff/src/Line.php', '_HumbugBox1cb33d1f20f1\\SebastianBergmann\\Diff\\LongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/sebastian/diff/src/LongestCommonSubsequenceCalculator.php', '_HumbugBox1cb33d1f20f1\\SebastianBergmann\\Diff\\MemoryEfficientLongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php', '_HumbugBox1cb33d1f20f1\\SebastianBergmann\\Diff\\Output\\AbstractChunkOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php', '_HumbugBox1cb33d1f20f1\\SebastianBergmann\\Diff\\Output\\DiffOnlyOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php', '_HumbugBox1cb33d1f20f1\\SebastianBergmann\\Diff\\Output\\DiffOutputBuilderInterface' => __DIR__ . '/..' . '/sebastian/diff/src/Output/DiffOutputBuilderInterface.php', '_HumbugBox1cb33d1f20f1\\SebastianBergmann\\Diff\\Output\\StrictUnifiedDiffOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php', '_HumbugBox1cb33d1f20f1\\SebastianBergmann\\Diff\\Output\\UnifiedDiffOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php', '_HumbugBox1cb33d1f20f1\\SebastianBergmann\\Diff\\Parser' => __DIR__ . '/..' . '/sebastian/diff/src/Parser.php', '_HumbugBox1cb33d1f20f1\\SebastianBergmann\\Diff\\TimeEfficientLongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php', '_HumbugBox1cb33d1f20f1\\Spatie\\ArrayToXml\\ArrayToXml' => __DIR__ . '/..' . '/spatie/array-to-xml/src/ArrayToXml.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Application' => __DIR__ . '/..' . '/symfony/console/Application.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Attribute\\AsCommand' => __DIR__ . '/..' . '/symfony/console/Attribute/AsCommand.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\CI\\GithubActionReporter' => __DIR__ . '/..' . '/symfony/console/CI/GithubActionReporter.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Color' => __DIR__ . '/..' . '/symfony/console/Color.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\CommandLoader\\CommandLoaderInterface' => __DIR__ . '/..' . '/symfony/console/CommandLoader/CommandLoaderInterface.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\CommandLoader\\ContainerCommandLoader' => __DIR__ . '/..' . '/symfony/console/CommandLoader/ContainerCommandLoader.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\CommandLoader\\FactoryCommandLoader' => __DIR__ . '/..' . '/symfony/console/CommandLoader/FactoryCommandLoader.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Command\\Command' => __DIR__ . '/..' . '/symfony/console/Command/Command.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Command\\CompleteCommand' => __DIR__ . '/..' . '/symfony/console/Command/CompleteCommand.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Command\\DumpCompletionCommand' => __DIR__ . '/..' . '/symfony/console/Command/DumpCompletionCommand.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Command\\HelpCommand' => __DIR__ . '/..' . '/symfony/console/Command/HelpCommand.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Command\\LazyCommand' => __DIR__ . '/..' . '/symfony/console/Command/LazyCommand.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Command\\ListCommand' => __DIR__ . '/..' . '/symfony/console/Command/ListCommand.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Command\\LockableTrait' => __DIR__ . '/..' . '/symfony/console/Command/LockableTrait.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Command\\SignalableCommandInterface' => __DIR__ . '/..' . '/symfony/console/Command/SignalableCommandInterface.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Completion\\CompletionInput' => __DIR__ . '/..' . '/symfony/console/Completion/CompletionInput.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Completion\\CompletionSuggestions' => __DIR__ . '/..' . '/symfony/console/Completion/CompletionSuggestions.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Completion\\Output\\BashCompletionOutput' => __DIR__ . '/..' . '/symfony/console/Completion/Output/BashCompletionOutput.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Completion\\Output\\CompletionOutputInterface' => __DIR__ . '/..' . '/symfony/console/Completion/Output/CompletionOutputInterface.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Completion\\Suggestion' => __DIR__ . '/..' . '/symfony/console/Completion/Suggestion.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\ConsoleEvents' => __DIR__ . '/..' . '/symfony/console/ConsoleEvents.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Cursor' => __DIR__ . '/..' . '/symfony/console/Cursor.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\DependencyInjection\\AddConsoleCommandPass' => __DIR__ . '/..' . '/symfony/console/DependencyInjection/AddConsoleCommandPass.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Descriptor\\ApplicationDescription' => __DIR__ . '/..' . '/symfony/console/Descriptor/ApplicationDescription.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Descriptor\\Descriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/Descriptor.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Descriptor\\DescriptorInterface' => __DIR__ . '/..' . '/symfony/console/Descriptor/DescriptorInterface.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Descriptor\\JsonDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/JsonDescriptor.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Descriptor\\MarkdownDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/MarkdownDescriptor.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Descriptor\\TextDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/TextDescriptor.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Descriptor\\XmlDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/XmlDescriptor.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\EventListener\\ErrorListener' => __DIR__ . '/..' . '/symfony/console/EventListener/ErrorListener.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Event\\ConsoleCommandEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleCommandEvent.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Event\\ConsoleErrorEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleErrorEvent.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Event\\ConsoleEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleEvent.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Event\\ConsoleSignalEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleSignalEvent.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Event\\ConsoleTerminateEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleTerminateEvent.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Exception\\CommandNotFoundException' => __DIR__ . '/..' . '/symfony/console/Exception/CommandNotFoundException.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/console/Exception/ExceptionInterface.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/console/Exception/InvalidArgumentException.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Exception\\InvalidOptionException' => __DIR__ . '/..' . '/symfony/console/Exception/InvalidOptionException.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Exception\\LogicException' => __DIR__ . '/..' . '/symfony/console/Exception/LogicException.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Exception\\MissingInputException' => __DIR__ . '/..' . '/symfony/console/Exception/MissingInputException.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Exception\\NamespaceNotFoundException' => __DIR__ . '/..' . '/symfony/console/Exception/NamespaceNotFoundException.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/console/Exception/RuntimeException.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Formatter\\NullOutputFormatter' => __DIR__ . '/..' . '/symfony/console/Formatter/NullOutputFormatter.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Formatter\\NullOutputFormatterStyle' => __DIR__ . '/..' . '/symfony/console/Formatter/NullOutputFormatterStyle.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Formatter\\OutputFormatter' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatter.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Formatter\\OutputFormatterInterface' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterInterface.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Formatter\\OutputFormatterStyle' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterStyle.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleInterface' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterStyleInterface.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleStack' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterStyleStack.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Formatter\\WrappableOutputFormatterInterface' => __DIR__ . '/..' . '/symfony/console/Formatter/WrappableOutputFormatterInterface.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Helper\\DebugFormatterHelper' => __DIR__ . '/..' . '/symfony/console/Helper/DebugFormatterHelper.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Helper\\DescriptorHelper' => __DIR__ . '/..' . '/symfony/console/Helper/DescriptorHelper.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Helper\\Dumper' => __DIR__ . '/..' . '/symfony/console/Helper/Dumper.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Helper\\FormatterHelper' => __DIR__ . '/..' . '/symfony/console/Helper/FormatterHelper.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Helper\\Helper' => __DIR__ . '/..' . '/symfony/console/Helper/Helper.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Helper\\HelperInterface' => __DIR__ . '/..' . '/symfony/console/Helper/HelperInterface.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Helper\\HelperSet' => __DIR__ . '/..' . '/symfony/console/Helper/HelperSet.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Helper\\InputAwareHelper' => __DIR__ . '/..' . '/symfony/console/Helper/InputAwareHelper.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Helper\\ProcessHelper' => __DIR__ . '/..' . '/symfony/console/Helper/ProcessHelper.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Helper\\ProgressBar' => __DIR__ . '/..' . '/symfony/console/Helper/ProgressBar.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Helper\\ProgressIndicator' => __DIR__ . '/..' . '/symfony/console/Helper/ProgressIndicator.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Helper\\QuestionHelper' => __DIR__ . '/..' . '/symfony/console/Helper/QuestionHelper.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Helper\\SymfonyQuestionHelper' => __DIR__ . '/..' . '/symfony/console/Helper/SymfonyQuestionHelper.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Helper\\Table' => __DIR__ . '/..' . '/symfony/console/Helper/Table.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Helper\\TableCell' => __DIR__ . '/..' . '/symfony/console/Helper/TableCell.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Helper\\TableCellStyle' => __DIR__ . '/..' . '/symfony/console/Helper/TableCellStyle.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Helper\\TableRows' => __DIR__ . '/..' . '/symfony/console/Helper/TableRows.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Helper\\TableSeparator' => __DIR__ . '/..' . '/symfony/console/Helper/TableSeparator.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Helper\\TableStyle' => __DIR__ . '/..' . '/symfony/console/Helper/TableStyle.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Input\\ArgvInput' => __DIR__ . '/..' . '/symfony/console/Input/ArgvInput.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Input\\ArrayInput' => __DIR__ . '/..' . '/symfony/console/Input/ArrayInput.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Input\\Input' => __DIR__ . '/..' . '/symfony/console/Input/Input.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Input\\InputArgument' => __DIR__ . '/..' . '/symfony/console/Input/InputArgument.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Input\\InputAwareInterface' => __DIR__ . '/..' . '/symfony/console/Input/InputAwareInterface.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Input\\InputDefinition' => __DIR__ . '/..' . '/symfony/console/Input/InputDefinition.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Input\\InputInterface' => __DIR__ . '/..' . '/symfony/console/Input/InputInterface.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Input\\InputOption' => __DIR__ . '/..' . '/symfony/console/Input/InputOption.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Input\\StreamableInputInterface' => __DIR__ . '/..' . '/symfony/console/Input/StreamableInputInterface.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Input\\StringInput' => __DIR__ . '/..' . '/symfony/console/Input/StringInput.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Logger\\ConsoleLogger' => __DIR__ . '/..' . '/symfony/console/Logger/ConsoleLogger.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Output\\BufferedOutput' => __DIR__ . '/..' . '/symfony/console/Output/BufferedOutput.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Output\\ConsoleOutput' => __DIR__ . '/..' . '/symfony/console/Output/ConsoleOutput.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Output\\ConsoleOutputInterface' => __DIR__ . '/..' . '/symfony/console/Output/ConsoleOutputInterface.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Output\\ConsoleSectionOutput' => __DIR__ . '/..' . '/symfony/console/Output/ConsoleSectionOutput.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Output\\NullOutput' => __DIR__ . '/..' . '/symfony/console/Output/NullOutput.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Output\\Output' => __DIR__ . '/..' . '/symfony/console/Output/Output.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Output\\OutputInterface' => __DIR__ . '/..' . '/symfony/console/Output/OutputInterface.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Output\\StreamOutput' => __DIR__ . '/..' . '/symfony/console/Output/StreamOutput.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Output\\TrimmedBufferOutput' => __DIR__ . '/..' . '/symfony/console/Output/TrimmedBufferOutput.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Question\\ChoiceQuestion' => __DIR__ . '/..' . '/symfony/console/Question/ChoiceQuestion.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Question\\ConfirmationQuestion' => __DIR__ . '/..' . '/symfony/console/Question/ConfirmationQuestion.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Question\\Question' => __DIR__ . '/..' . '/symfony/console/Question/Question.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\SignalRegistry\\SignalRegistry' => __DIR__ . '/..' . '/symfony/console/SignalRegistry/SignalRegistry.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\SingleCommandApplication' => __DIR__ . '/..' . '/symfony/console/SingleCommandApplication.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Style\\OutputStyle' => __DIR__ . '/..' . '/symfony/console/Style/OutputStyle.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Style\\StyleInterface' => __DIR__ . '/..' . '/symfony/console/Style/StyleInterface.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Style\\SymfonyStyle' => __DIR__ . '/..' . '/symfony/console/Style/SymfonyStyle.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Terminal' => __DIR__ . '/..' . '/symfony/console/Terminal.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Tester\\ApplicationTester' => __DIR__ . '/..' . '/symfony/console/Tester/ApplicationTester.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Tester\\CommandCompletionTester' => __DIR__ . '/..' . '/symfony/console/Tester/CommandCompletionTester.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Tester\\CommandTester' => __DIR__ . '/..' . '/symfony/console/Tester/CommandTester.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Tester\\Constraint\\CommandIsSuccessful' => __DIR__ . '/..' . '/symfony/console/Tester/Constraint/CommandIsSuccessful.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\Tester\\TesterTrait' => __DIR__ . '/..' . '/symfony/console/Tester/TesterTrait.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Filesystem\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/filesystem/Exception/ExceptionInterface.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Filesystem\\Exception\\FileNotFoundException' => __DIR__ . '/..' . '/symfony/filesystem/Exception/FileNotFoundException.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Filesystem\\Exception\\IOException' => __DIR__ . '/..' . '/symfony/filesystem/Exception/IOException.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Filesystem\\Exception\\IOExceptionInterface' => __DIR__ . '/..' . '/symfony/filesystem/Exception/IOExceptionInterface.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Filesystem\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/filesystem/Exception/InvalidArgumentException.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Filesystem\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/filesystem/Exception/RuntimeException.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Filesystem\\Filesystem' => __DIR__ . '/..' . '/symfony/filesystem/Filesystem.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Filesystem\\Path' => __DIR__ . '/..' . '/symfony/filesystem/Path.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\String\\AbstractString' => __DIR__ . '/..' . '/symfony/string/AbstractString.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\String\\AbstractUnicodeString' => __DIR__ . '/..' . '/symfony/string/AbstractUnicodeString.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\String\\ByteString' => __DIR__ . '/..' . '/symfony/string/ByteString.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\String\\CodePointString' => __DIR__ . '/..' . '/symfony/string/CodePointString.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\String\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/string/Exception/ExceptionInterface.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\String\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/string/Exception/InvalidArgumentException.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\String\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/string/Exception/RuntimeException.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\String\\Inflector\\EnglishInflector' => __DIR__ . '/..' . '/symfony/string/Inflector/EnglishInflector.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\String\\Inflector\\FrenchInflector' => __DIR__ . '/..' . '/symfony/string/Inflector/FrenchInflector.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\String\\Inflector\\InflectorInterface' => __DIR__ . '/..' . '/symfony/string/Inflector/InflectorInterface.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\String\\LazyString' => __DIR__ . '/..' . '/symfony/string/LazyString.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\String\\Slugger\\AsciiSlugger' => __DIR__ . '/..' . '/symfony/string/Slugger/AsciiSlugger.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\String\\Slugger\\SluggerInterface' => __DIR__ . '/..' . '/symfony/string/Slugger/SluggerInterface.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\String\\UnicodeString' => __DIR__ . '/..' . '/symfony/string/UnicodeString.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Contracts\\Service\\Attribute\\Required' => __DIR__ . '/..' . '/symfony/service-contracts/Attribute/Required.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Contracts\\Service\\Attribute\\SubscribedService' => __DIR__ . '/..' . '/symfony/service-contracts/Attribute/SubscribedService.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Contracts\\Service\\ResetInterface' => __DIR__ . '/..' . '/symfony/service-contracts/ResetInterface.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Contracts\\Service\\ServiceLocatorTrait' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceLocatorTrait.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Contracts\\Service\\ServiceProviderInterface' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceProviderInterface.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Contracts\\Service\\ServiceSubscriberInterface' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceSubscriberInterface.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Contracts\\Service\\ServiceSubscriberTrait' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceSubscriberTrait.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Polyfill\\Ctype\\Ctype' => __DIR__ . '/..' . '/symfony/polyfill-ctype/Ctype.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Polyfill\\Intl\\Grapheme\\Grapheme' => __DIR__ . '/..' . '/symfony/polyfill-intl-grapheme/Grapheme.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Polyfill\\Intl\\Normalizer\\Normalizer' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/Normalizer.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Polyfill\\Mbstring\\Mbstring' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/Mbstring.php', '_HumbugBox1cb33d1f20f1\\Symfony\\Polyfill\\Php73\\Php73' => __DIR__ . '/..' . '/symfony/polyfill-php73/Php73.php', '_HumbugBox1cb33d1f20f1\\UnhandledMatchError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php', '_HumbugBox1cb33d1f20f1\\ValueError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/ValueError.php', '_HumbugBox1cb33d1f20f1\\Webmozart\\Assert\\Assert' => __DIR__ . '/..' . '/webmozart/assert/src/Assert.php', '_HumbugBox1cb33d1f20f1\\Webmozart\\Assert\\InvalidArgumentException' => __DIR__ . '/..' . '/webmozart/assert/src/InvalidArgumentException.php', '_HumbugBox1cb33d1f20f1\\Webmozart\\Assert\\Mixin' => __DIR__ . '/..' . '/webmozart/assert/src/Mixin.php', '_HumbugBox1cb33d1f20f1\\XdgBaseDir\\Xdg' => __DIR__ . '/..' . '/dnoegel/php-xdg-base-dir/src/Xdg.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlockFactory' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlockFactory.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlockFactoryInterface' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlockFactoryInterface.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Description' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Description.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\DescriptionFactory' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\ExampleFinder' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Serializer' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\StandardTagFactory' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/StandardTagFactory.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tag' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tag.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\TagFactory' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/TagFactory.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Author' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Author.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tags\\BaseTag' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/BaseTag.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Covers' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Covers.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Deprecated' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Deprecated.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Example' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Example.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Factory\\StaticMethod' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/StaticMethod.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Formatter' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Formatter\\AlignFormatter' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/AlignFormatter.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Formatter\\PassthroughFormatter' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/PassthroughFormatter.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Generic' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Generic.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tags\\InvalidTag' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/InvalidTag.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Link' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Link.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Method' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Param' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Property' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tags\\PropertyRead' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tags\\PropertyWrite' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Reference\\Fqsen' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Fqsen.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Reference\\Reference' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Reference.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Reference\\Url' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Url.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Return_' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tags\\See' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/See.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Since' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Since.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Source' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Source.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tags\\TagWithType' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/TagWithType.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Throws' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Throws.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Uses' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Uses.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Var_' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Version' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Version.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Element' => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src/Element.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Exception\\PcreException' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/Exception/PcreException.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\File' => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src/File.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Fqsen' => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src/Fqsen.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\FqsenResolver' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/FqsenResolver.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Location' => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src/Location.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Project' => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src/Project.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\ProjectFactory' => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src/ProjectFactory.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\PseudoType' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoType.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\PseudoTypes\\CallableString' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/CallableString.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\PseudoTypes\\False_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/False_.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\PseudoTypes\\HtmlEscapedString' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/HtmlEscapedString.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\PseudoTypes\\IntegerRange' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/IntegerRange.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\PseudoTypes\\List_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/List_.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\PseudoTypes\\LiteralString' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/LiteralString.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\PseudoTypes\\LowercaseString' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/LowercaseString.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\PseudoTypes\\NegativeInteger' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/NegativeInteger.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\PseudoTypes\\NonEmptyLowercaseString' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/NonEmptyLowercaseString.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\PseudoTypes\\NonEmptyString' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/NonEmptyString.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\PseudoTypes\\NumericString' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/NumericString.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\PseudoTypes\\Numeric_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/Numeric_.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\PseudoTypes\\PositiveInteger' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/PositiveInteger.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\PseudoTypes\\TraitString' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/TraitString.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\PseudoTypes\\True_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/True_.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Type' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Type.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\TypeResolver' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/TypeResolver.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\AbstractList' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/AbstractList.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\AggregatedType' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/AggregatedType.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\ArrayKey' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/ArrayKey.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\Array_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Array_.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\Boolean' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Boolean.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\Callable_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Callable_.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\ClassString' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/ClassString.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\Collection' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Collection.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\Compound' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Compound.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\Context' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Context.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\ContextFactory' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/ContextFactory.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\Expression' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Expression.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\Float_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Float_.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\Integer' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Integer.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\InterfaceString' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/InterfaceString.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\Intersection' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Intersection.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\Iterable_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Iterable_.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\Mixed_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Mixed_.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\Never_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Never_.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\Null_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Null_.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\Nullable' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Nullable.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\Object_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Object_.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\Parent_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Parent_.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\Resource_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Resource_.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\Scalar' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Scalar.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\Self_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Self_.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\Static_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Static_.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\String_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/String_.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\This' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/This.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Types\\Void_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Void_.php', '_HumbugBox1cb33d1f20f1\\phpDocumentor\\Reflection\\Utils' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/Utils.php', ); public static function getInitializer(ClassLoader $loader) { return \Closure::bind(function () use ($loader) { $loader->prefixLengthsPsr4 = ComposerStaticInit7e022409458d7c6e0a17a3098ef276ac::$prefixLengthsPsr4; $loader->prefixDirsPsr4 = ComposerStaticInit7e022409458d7c6e0a17a3098ef276ac::$prefixDirsPsr4; $loader->classMap = ComposerStaticInit7e022409458d7c6e0a17a3098ef276ac::$classMap; }, null, ClassLoader::class); } } $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php', 'a4a119a56e50fbb293281d9a48007e0e' => $vendorDir . '/symfony/polyfill-php80/bootstrap.php', '6e3fae29631ef280660b3cdad06f25a8' => $vendorDir . '/symfony/deprecation-contracts/function.php', '320cde22f66dd4f5d3fd621d3e88b98f' => $vendorDir . '/symfony/polyfill-ctype/bootstrap.php', '8825ede83f2f289127722d4e842cf7e8' => $vendorDir . '/symfony/polyfill-intl-grapheme/bootstrap.php', 'e69f7f6ee287b969198c3c9d6777bd38' => $vendorDir . '/symfony/polyfill-intl-normalizer/bootstrap.php', 'e8aa6e4b5a1db2f56ae794f1505391a8' => $vendorDir . '/amphp/amp/lib/functions.php', '76cd0796156622033397994f25b0d8fc' => $vendorDir . '/amphp/amp/lib/Internal/functions.php', '0d59ee240a4cd96ddbb4ff164fccea4d' => $vendorDir . '/symfony/polyfill-php73/bootstrap.php', 'b6b991a57620e2fb6b2f66f03fe9ddc2' => $vendorDir . '/symfony/string/Resources/functions.php', '6cd5651c4fef5ed6b63e8d8b8ffbf3cc' => $vendorDir . '/amphp/byte-stream/lib/functions.php', ); setClassMapAuthoritative(true); $loader->register(true); $filesToLoad = \Composer\Autoload\ComposerStaticInit7e022409458d7c6e0a17a3098ef276ac::$files; $requireFile = static function ($fileIdentifier, $file) { if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; require $file; } }; foreach ($filesToLoad as $fileIdentifier => $file) { ($requireFile)($fileIdentifier, $file); } return $loader; } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ declare (strict_types=1); namespace _HumbugBox1cb33d1f20f1\Composer\XdebugHandler; use _HumbugBox1cb33d1f20f1\Psr\Log\LoggerInterface; use _HumbugBox1cb33d1f20f1\Psr\Log\LogLevel; /** * @author John Stevenson * @internal */ class Status { const ENV_RESTART = 'XDEBUG_HANDLER_RESTART'; const CHECK = 'Check'; const ERROR = 'Error'; const INFO = 'Info'; const NORESTART = 'NoRestart'; const RESTART = 'Restart'; const RESTARTING = 'Restarting'; const RESTARTED = 'Restarted'; /** @var bool */ private $debug; /** @var string */ private $envAllowXdebug; /** @var string|null */ private $loaded; /** @var LoggerInterface|null */ private $logger; /** @var bool */ private $modeOff; /** @var float */ private $time; /** * @param string $envAllowXdebug Prefixed _ALLOW_XDEBUG name * @param bool $debug Whether debug output is required */ public function __construct(string $envAllowXdebug, bool $debug) { $start = \getenv(self::ENV_RESTART); Process::setEnv(self::ENV_RESTART); $this->time = \is_numeric($start) ? \round((\microtime(\true) - $start) * 1000) : 0; $this->envAllowXdebug = $envAllowXdebug; $this->debug = $debug && \defined('STDERR'); $this->modeOff = \false; } /** * Activates status message output to a PSR3 logger * * @return void */ public function setLogger(LoggerInterface $logger) : void { $this->logger = $logger; } /** * Calls a handler method to report a message * * @throws \InvalidArgumentException If $op is not known */ public function report(string $op, ?string $data) : void { if ($this->logger !== null || $this->debug) { $callable = [$this, 'report' . $op]; if (!\is_callable($callable)) { throw new \InvalidArgumentException('Unknown op handler: ' . $op); } $params = $data !== null ? [$data] : []; \call_user_func_array($callable, $params); } } /** * Outputs a status message */ private function output(string $text, ?string $level = null) : void { if ($this->logger !== null) { $this->logger->log($level !== null ? $level : LogLevel::DEBUG, $text); } if ($this->debug) { \fwrite(\STDERR, \sprintf('xdebug-handler[%d] %s', \getmypid(), $text . \PHP_EOL)); } } /** * Checking status message */ private function reportCheck(string $loaded) : void { list($version, $mode) = \explode('|', $loaded); if ($version !== '') { $this->loaded = '(' . $version . ')' . ($mode !== '' ? ' xdebug.mode=' . $mode : ''); } $this->modeOff = $mode === 'off'; $this->output('Checking ' . $this->envAllowXdebug); } /** * Error status message */ private function reportError(string $error) : void { $this->output(\sprintf('No restart (%s)', $error), LogLevel::WARNING); } /** * Info status message */ private function reportInfo(string $info) : void { $this->output($info); } /** * No restart status message */ private function reportNoRestart() : void { $this->output($this->getLoadedMessage()); if ($this->loaded !== null) { $text = \sprintf('No restart (%s)', $this->getEnvAllow()); if (!(bool) \getenv($this->envAllowXdebug)) { $text .= ' Allowed by ' . ($this->modeOff ? 'xdebug.mode' : 'application'); } $this->output($text); } } /** * Restart status message */ private function reportRestart() : void { $this->output($this->getLoadedMessage()); Process::setEnv(self::ENV_RESTART, (string) \microtime(\true)); } /** * Restarted status message */ private function reportRestarted() : void { $loaded = $this->getLoadedMessage(); $text = \sprintf('Restarted (%d ms). %s', $this->time, $loaded); $level = $this->loaded !== null ? LogLevel::WARNING : null; $this->output($text, $level); } /** * Restarting status message */ private function reportRestarting(string $command) : void { $text = \sprintf('Process restarting (%s)', $this->getEnvAllow()); $this->output($text); $text = 'Running ' . $command; $this->output($text); } /** * Returns the _ALLOW_XDEBUG environment variable as name=value */ private function getEnvAllow() : string { return $this->envAllowXdebug . '=' . \getenv($this->envAllowXdebug); } /** * Returns the Xdebug status and version */ private function getLoadedMessage() : string { $loaded = $this->loaded !== null ? \sprintf('loaded %s', $this->loaded) : 'not loaded'; return 'The Xdebug extension is ' . $loaded; } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ declare (strict_types=1); namespace _HumbugBox1cb33d1f20f1\Composer\XdebugHandler; use _HumbugBox1cb33d1f20f1\Composer\Pcre\Preg; /** * Process utility functions * * @author John Stevenson */ class Process { /** * Escapes a string to be used as a shell argument. * * From https://github.com/johnstevenson/winbox-args * MIT Licensed (c) John Stevenson * * @param string $arg The argument to be escaped * @param bool $meta Additionally escape cmd.exe meta characters * @param bool $module The argument is the module to invoke */ public static function escape(string $arg, bool $meta = \true, bool $module = \false) : string { if (!\defined('PHP_WINDOWS_VERSION_BUILD')) { return "'" . \str_replace("'", "'\\''", $arg) . "'"; } $quote = \strpbrk($arg, " \t") !== \false || $arg === ''; $arg = Preg::replace('/(\\\\*)"/', '$1$1\\"', $arg, -1, $dquotes); if ($meta) { $meta = $dquotes || Preg::isMatch('/%[^%]+%/', $arg); if (!$meta) { $quote = $quote || \strpbrk($arg, '^&|<>()') !== \false; } elseif ($module && !$dquotes && $quote) { $meta = \false; } } if ($quote) { $arg = '"' . Preg::replace('/(\\\\*)$/', '$1$1', $arg) . '"'; } if ($meta) { $arg = Preg::replace('/(["^&|<>()%])/', '^$1', $arg); } return $arg; } /** * Escapes an array of arguments that make up a shell command * * @param string[] $args Argument list, with the module name first */ public static function escapeShellCommand(array $args) : string { $command = ''; $module = \array_shift($args); if ($module !== null) { $command = self::escape($module, \true, \true); foreach ($args as $arg) { $command .= ' ' . self::escape($arg); } } return $command; } /** * Makes putenv environment changes available in $_SERVER and $_ENV * * @param string $name * @param ?string $value A null value unsets the variable */ public static function setEnv(string $name, ?string $value = null) : bool { $unset = null === $value; if (!\putenv($unset ? $name : $name . '=' . $value)) { return \false; } if ($unset) { unset($_SERVER[$name]); } else { $_SERVER[$name] = $value; } // Update $_ENV if it is being used if (\false !== \stripos((string) \ini_get('variables_order'), 'E')) { if ($unset) { unset($_ENV[$name]); } else { $_ENV[$name] = $value; } } return \true; } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Composer\XdebugHandler; /** * @author John Stevenson * * @phpstan-type restartData array{tmpIni: string, scannedInis: bool, scanDir: false|string, phprc: false|string, inis: string[], skipped: string} */ class PhpConfig { /** * Use the original PHP configuration * * @return string[] Empty array of PHP cli options */ public function useOriginal() : array { $this->getDataAndReset(); return []; } /** * Use standard restart settings * * @return string[] PHP cli options */ public function useStandard() : array { $data = $this->getDataAndReset(); if ($data !== null) { return ['-n', '-c', $data['tmpIni']]; } return []; } /** * Use environment variables to persist settings * * @return string[] Empty array of PHP cli options */ public function usePersistent() : array { $data = $this->getDataAndReset(); if ($data !== null) { $this->updateEnv('PHPRC', $data['tmpIni']); $this->updateEnv('PHP_INI_SCAN_DIR', ''); } return []; } /** * Returns restart data if available and resets the environment * * @phpstan-return restartData|null */ private function getDataAndReset() : ?array { $data = XdebugHandler::getRestartSettings(); if ($data !== null) { $this->updateEnv('PHPRC', $data['phprc']); $this->updateEnv('PHP_INI_SCAN_DIR', $data['scanDir']); } return $data; } /** * Updates a restart settings value in the environment * * @param string $name * @param string|false $value */ private function updateEnv(string $name, $value) : void { Process::setEnv($name, \false !== $value ? $value : null); } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ declare (strict_types=1); namespace _HumbugBox1cb33d1f20f1\Composer\XdebugHandler; use _HumbugBox1cb33d1f20f1\Composer\Pcre\Preg; use _HumbugBox1cb33d1f20f1\Psr\Log\LoggerInterface; /** * @author John Stevenson * * @phpstan-import-type restartData from PhpConfig */ class XdebugHandler { const SUFFIX_ALLOW = '_ALLOW_XDEBUG'; const SUFFIX_INIS = '_ORIGINAL_INIS'; const RESTART_ID = 'internal'; const RESTART_SETTINGS = 'XDEBUG_HANDLER_SETTINGS'; const DEBUG = 'XDEBUG_HANDLER_DEBUG'; /** @var string|null */ protected $tmpIni; /** @var bool */ private static $inRestart; /** @var string */ private static $name; /** @var string|null */ private static $skipped; /** @var bool */ private static $xdebugActive; /** @var string|null */ private static $xdebugMode; /** @var string|null */ private static $xdebugVersion; /** @var bool */ private $cli; /** @var string|null */ private $debug; /** @var string */ private $envAllowXdebug; /** @var string */ private $envOriginalInis; /** @var bool */ private $persistent; /** @var string|null */ private $script; /** @var Status */ private $statusWriter; /** * Constructor * * The $envPrefix is used to create distinct environment variables. It is * uppercased and prepended to the default base values. For example 'myapp' * would result in MYAPP_ALLOW_XDEBUG and MYAPP_ORIGINAL_INIS. * * @param string $envPrefix Value used in environment variables * @throws \RuntimeException If the parameter is invalid */ public function __construct(string $envPrefix) { if ($envPrefix === '') { throw new \RuntimeException('Invalid constructor parameter'); } self::$name = \strtoupper($envPrefix); $this->envAllowXdebug = self::$name . self::SUFFIX_ALLOW; $this->envOriginalInis = self::$name . self::SUFFIX_INIS; self::setXdebugDetails(); self::$inRestart = \false; if ($this->cli = \PHP_SAPI === 'cli') { $this->debug = (string) \getenv(self::DEBUG); } $this->statusWriter = new Status($this->envAllowXdebug, (bool) $this->debug); } /** * Activates status message output to a PSR3 logger */ public function setLogger(LoggerInterface $logger) : self { $this->statusWriter->setLogger($logger); return $this; } /** * Sets the main script location if it cannot be called from argv */ public function setMainScript(string $script) : self { $this->script = $script; return $this; } /** * Persist the settings to keep Xdebug out of sub-processes */ public function setPersistent() : self { $this->persistent = \true; return $this; } /** * Checks if Xdebug is loaded and the process needs to be restarted * * This behaviour can be disabled by setting the MYAPP_ALLOW_XDEBUG * environment variable to 1. This variable is used internally so that * the restarted process is created only once. */ public function check() : void { $this->notify(Status::CHECK, self::$xdebugVersion . '|' . self::$xdebugMode); $envArgs = \explode('|', (string) \getenv($this->envAllowXdebug)); if (!(bool) $envArgs[0] && $this->requiresRestart(self::$xdebugActive)) { // Restart required $this->notify(Status::RESTART); if ($this->prepareRestart()) { $command = $this->getCommand(); $this->restart($command); } return; } if (self::RESTART_ID === $envArgs[0] && \count($envArgs) === 5) { // Restarted, so unset environment variable and use saved values $this->notify(Status::RESTARTED); Process::setEnv($this->envAllowXdebug); self::$inRestart = \true; if (self::$xdebugVersion === null) { // Skipped version is only set if Xdebug is not loaded self::$skipped = $envArgs[1]; } $this->tryEnableSignals(); // Put restart settings in the environment $this->setEnvRestartSettings($envArgs); return; } $this->notify(Status::NORESTART); $settings = self::getRestartSettings(); if ($settings !== null) { // Called with existing settings, so sync our settings $this->syncSettings($settings); } } /** * Returns an array of php.ini locations with at least one entry * * The equivalent of calling php_ini_loaded_file then php_ini_scanned_files. * The loaded ini location is the first entry and may be empty. * * @return string[] */ public static function getAllIniFiles() : array { if (self::$name !== null) { $env = \getenv(self::$name . self::SUFFIX_INIS); if (\false !== $env) { return \explode(\PATH_SEPARATOR, $env); } } $paths = [(string) \php_ini_loaded_file()]; $scanned = \php_ini_scanned_files(); if ($scanned !== \false) { $paths = \array_merge($paths, \array_map('trim', \explode(',', $scanned))); } return $paths; } /** * Returns an array of restart settings or null * * Settings will be available if the current process was restarted, or * called with the settings from an existing restart. * * @phpstan-return restartData|null */ public static function getRestartSettings() : ?array { $envArgs = \explode('|', (string) \getenv(self::RESTART_SETTINGS)); if (\count($envArgs) !== 6 || !self::$inRestart && \php_ini_loaded_file() !== $envArgs[0]) { return null; } return ['tmpIni' => $envArgs[0], 'scannedInis' => (bool) $envArgs[1], 'scanDir' => '*' === $envArgs[2] ? \false : $envArgs[2], 'phprc' => '*' === $envArgs[3] ? \false : $envArgs[3], 'inis' => \explode(\PATH_SEPARATOR, $envArgs[4]), 'skipped' => $envArgs[5]]; } /** * Returns the Xdebug version that triggered a successful restart */ public static function getSkippedVersion() : string { return (string) self::$skipped; } /** * Returns whether Xdebug is loaded and active * * true: if Xdebug is loaded and is running in an active mode. * false: if Xdebug is not loaded, or it is running with xdebug.mode=off. */ public static function isXdebugActive() : bool { self::setXdebugDetails(); return self::$xdebugActive; } /** * Allows an extending class to decide if there should be a restart * * The default is to restart if Xdebug is loaded and its mode is not "off". */ protected function requiresRestart(bool $default) : bool { return $default; } /** * Allows an extending class to access the tmpIni * * @param string[] $command * */ protected function restart(array $command) : void { $this->doRestart($command); } /** * Executes the restarted command then deletes the tmp ini * * @param string[] $command * @phpstan-return never */ private function doRestart(array $command) : void { $this->tryEnableSignals(); $this->notify(Status::RESTARTING, \implode(' ', $command)); if (\PHP_VERSION_ID >= 70400) { $cmd = $command; } else { $cmd = Process::escapeShellCommand($command); if (\defined('PHP_WINDOWS_VERSION_BUILD')) { // Outer quotes required on cmd string below PHP 8 $cmd = '"' . $cmd . '"'; } } $process = \proc_open($cmd, [], $pipes); if (\is_resource($process)) { $exitCode = \proc_close($process); } if (!isset($exitCode)) { // Unlikely that php or the default shell cannot be invoked $this->notify(Status::ERROR, 'Unable to restart process'); $exitCode = -1; } else { $this->notify(Status::INFO, 'Restarted process exited ' . $exitCode); } if ($this->debug === '2') { $this->notify(Status::INFO, 'Temp ini saved: ' . $this->tmpIni); } else { @\unlink((string) $this->tmpIni); } exit($exitCode); } /** * Returns true if everything was written for the restart * * If any of the following fails (however unlikely) we must return false to * stop potential recursion: * - tmp ini file creation * - environment variable creation */ private function prepareRestart() : bool { $error = null; $iniFiles = self::getAllIniFiles(); $scannedInis = \count($iniFiles) > 1; $tmpDir = \sys_get_temp_dir(); if (!$this->cli) { $error = 'Unsupported SAPI: ' . \PHP_SAPI; } elseif (!$this->checkConfiguration($info)) { $error = $info; } elseif (!$this->checkMainScript()) { $error = 'Unable to access main script: ' . $this->script; } elseif (!$this->writeTmpIni($iniFiles, $tmpDir, $error)) { $error = $error !== null ? $error : 'Unable to create temp ini file at: ' . $tmpDir; } elseif (!$this->setEnvironment($scannedInis, $iniFiles)) { $error = 'Unable to set environment variables'; } if ($error !== null) { $this->notify(Status::ERROR, $error); } return $error === null; } /** * Returns true if the tmp ini file was written * * @param string[] $iniFiles All ini files used in the current process */ private function writeTmpIni(array $iniFiles, string $tmpDir, ?string &$error) : bool { if (($tmpfile = @\tempnam($tmpDir, '')) === \false) { return \false; } $this->tmpIni = $tmpfile; // $iniFiles has at least one item and it may be empty if ($iniFiles[0] === '') { \array_shift($iniFiles); } $content = ''; $sectionRegex = '/^\\s*\\[(?:PATH|HOST)\\s*=/mi'; $xdebugRegex = '/^\\s*(zend_extension\\s*=.*xdebug.*)$/mi'; foreach ($iniFiles as $file) { // Check for inaccessible ini files if (($data = @\file_get_contents($file)) === \false) { $error = 'Unable to read ini: ' . $file; return \false; } // Check and remove directives after HOST and PATH sections if (Preg::isMatchWithOffsets($sectionRegex, $data, $matches, \PREG_OFFSET_CAPTURE)) { $data = \substr($data, 0, $matches[0][1]); } $content .= Preg::replace($xdebugRegex, ';$1', $data) . \PHP_EOL; } // Merge loaded settings into our ini content, if it is valid $config = \parse_ini_string($content); $loaded = \ini_get_all(null, \false); if (\false === $config || \false === $loaded) { $error = 'Unable to parse ini data'; return \false; } $content .= $this->mergeLoadedConfig($loaded, $config); // Work-around for https://bugs.php.net/bug.php?id=75932 $content .= 'opcache.enable_cli=0' . \PHP_EOL; return (bool) @\file_put_contents($this->tmpIni, $content); } /** * Returns the command line arguments for the restart * * @return string[] */ private function getCommand() : array { $php = [\PHP_BINARY]; $args = \array_slice($_SERVER['argv'], 1); if (!$this->persistent) { // Use command-line options \array_push($php, '-n', '-c', $this->tmpIni); } return \array_merge($php, [$this->script], $args); } /** * Returns true if the restart environment variables were set * * No need to update $_SERVER since this is set in the restarted process. * * @param string[] $iniFiles All ini files used in the current process */ private function setEnvironment(bool $scannedInis, array $iniFiles) : bool { $scanDir = \getenv('PHP_INI_SCAN_DIR'); $phprc = \getenv('PHPRC'); // Make original inis available to restarted process if (!\putenv($this->envOriginalInis . '=' . \implode(\PATH_SEPARATOR, $iniFiles))) { return \false; } if ($this->persistent) { // Use the environment to persist the settings if (!\putenv('PHP_INI_SCAN_DIR=') || !\putenv('PHPRC=' . $this->tmpIni)) { return \false; } } // Flag restarted process and save values for it to use $envArgs = [self::RESTART_ID, self::$xdebugVersion, (int) $scannedInis, \false === $scanDir ? '*' : $scanDir, \false === $phprc ? '*' : $phprc]; return \putenv($this->envAllowXdebug . '=' . \implode('|', $envArgs)); } /** * Logs status messages */ private function notify(string $op, ?string $data = null) : void { $this->statusWriter->report($op, $data); } /** * Returns default, changed and command-line ini settings * * @param mixed[] $loadedConfig All current ini settings * @param mixed[] $iniConfig Settings from user ini files * */ private function mergeLoadedConfig(array $loadedConfig, array $iniConfig) : string { $content = ''; foreach ($loadedConfig as $name => $value) { // Value will either be null, string or array (HHVM only) if (!\is_string($value) || \strpos($name, 'xdebug') === 0 || $name === 'apc.mmap_file_mask') { continue; } if (!isset($iniConfig[$name]) || $iniConfig[$name] !== $value) { // Double-quote escape each value $content .= $name . '="' . \addcslashes($value, '\\"') . '"' . \PHP_EOL; } } return $content; } /** * Returns true if the script name can be used */ private function checkMainScript() : bool { if ($this->script !== null) { // Allow an application to set -- for standard input return \file_exists($this->script) || '--' === $this->script; } if (\file_exists($this->script = $_SERVER['argv'][0])) { return \true; } // Use a backtrace to resolve Phar and chdir issues. $trace = \debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS); $main = \end($trace); if ($main !== \false && isset($main['file'])) { return \file_exists($this->script = $main['file']); } return \false; } /** * Adds restart settings to the environment * * @param string[] $envArgs */ private function setEnvRestartSettings(array $envArgs) : void { $settings = [\php_ini_loaded_file(), $envArgs[2], $envArgs[3], $envArgs[4], \getenv($this->envOriginalInis), self::$skipped]; Process::setEnv(self::RESTART_SETTINGS, \implode('|', $settings)); } /** * Syncs settings and the environment if called with existing settings * * @phpstan-param restartData $settings */ private function syncSettings(array $settings) : void { if (\false === \getenv($this->envOriginalInis)) { // Called by another app, so make original inis available Process::setEnv($this->envOriginalInis, \implode(\PATH_SEPARATOR, $settings['inis'])); } self::$skipped = $settings['skipped']; $this->notify(Status::INFO, 'Process called with existing restart settings'); } /** * Returns true if there are no known configuration issues */ private function checkConfiguration(?string &$info) : bool { if (!\function_exists('proc_open')) { $info = 'proc_open function is disabled'; return \false; } if (\extension_loaded('uopz') && !(bool) \ini_get('uopz.disable')) { // uopz works at opcode level and disables exit calls if (\function_exists('uopz_allow_exit')) { @\uopz_allow_exit(\true); } else { $info = 'uopz extension is not compatible'; return \false; } } // Check UNC paths when using cmd.exe if (\defined('PHP_WINDOWS_VERSION_BUILD') && \PHP_VERSION_ID < 70400) { $workingDir = \getcwd(); if ($workingDir === \false) { $info = 'unable to determine working directory'; return \false; } if (0 === \strpos($workingDir, '\\\\')) { $info = 'cmd.exe does not support UNC paths: ' . $workingDir; return \false; } } return \true; } /** * Enables async signals and control interrupts in the restarted process * * Available on Unix PHP 7.1+ with the pcntl extension and Windows PHP 7.4+. */ private function tryEnableSignals() : void { if (\function_exists('pcntl_async_signals') && \function_exists('pcntl_signal')) { \pcntl_async_signals(\true); $message = 'Async signals enabled'; if (!self::$inRestart) { // Restarting, so ignore SIGINT in parent \pcntl_signal(\SIGINT, \SIG_IGN); } elseif (\is_int(\pcntl_signal_get_handler(\SIGINT))) { // Restarted, no handler set so force default action \pcntl_signal(\SIGINT, \SIG_DFL); } } if (!self::$inRestart && \function_exists('sapi_windows_set_ctrl_handler')) { // Restarting, so set a handler to ignore CTRL events in the parent. // This ensures that CTRL+C events will be available in the child // process without having to enable them there, which is unreliable. \sapi_windows_set_ctrl_handler(function ($evt) { }); } } /** * Sets static properties $xdebugActive, $xdebugVersion and $xdebugMode */ private static function setXdebugDetails() : void { if (self::$xdebugActive !== null) { return; } self::$xdebugActive = \false; if (!\extension_loaded('xdebug')) { return; } $version = \phpversion('xdebug'); self::$xdebugVersion = $version !== \false ? $version : 'unknown'; if (\version_compare(self::$xdebugVersion, '3.1', '>=')) { $modes = \xdebug_info('mode'); self::$xdebugMode = \count($modes) === 0 ? 'off' : \implode(',', $modes); self::$xdebugActive = self::$xdebugMode !== 'off'; return; } // See if xdebug.mode is supported in this version $iniMode = \ini_get('xdebug.mode'); if ($iniMode === \false) { self::$xdebugActive = \true; return; } // Environment value wins but cannot be empty $envMode = (string) \getenv('XDEBUG_MODE'); if ($envMode !== '') { self::$xdebugMode = $envMode; } else { self::$xdebugMode = $iniMode !== '' ? $iniMode : 'off'; } // An empty comma-separated list is treated as mode 'off' if (Preg::isMatch('/^,+$/', \str_replace(' ', '', self::$xdebugMode))) { self::$xdebugMode = 'off'; } self::$xdebugActive = self::$xdebugMode !== 'off'; } } MIT License Copyright (c) 2017 Composer 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. Copyright (c) Nils Adermann, Jordi Boggiano 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. array($vendorDir . '/phpdocumentor/reflection-common/src', $vendorDir . '/phpdocumentor/reflection-docblock/src', $vendorDir . '/phpdocumentor/type-resolver/src'), '_HumbugBox1cb33d1f20f1\\XdgBaseDir\\' => array($vendorDir . '/dnoegel/php-xdg-base-dir/src'), '_HumbugBox1cb33d1f20f1\\Webmozart\\Assert\\' => array($vendorDir . '/webmozart/assert/src'), '_HumbugBox1cb33d1f20f1\\Symfony\\Polyfill\\Php80\\' => array($vendorDir . '/symfony/polyfill-php80'), '_HumbugBox1cb33d1f20f1\\Symfony\\Polyfill\\Php73\\' => array($vendorDir . '/symfony/polyfill-php73'), '_HumbugBox1cb33d1f20f1\\Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'), '_HumbugBox1cb33d1f20f1\\Symfony\\Polyfill\\Intl\\Normalizer\\' => array($vendorDir . '/symfony/polyfill-intl-normalizer'), '_HumbugBox1cb33d1f20f1\\Symfony\\Polyfill\\Intl\\Grapheme\\' => array($vendorDir . '/symfony/polyfill-intl-grapheme'), '_HumbugBox1cb33d1f20f1\\Symfony\\Polyfill\\Ctype\\' => array($vendorDir . '/symfony/polyfill-ctype'), '_HumbugBox1cb33d1f20f1\\Symfony\\Contracts\\Service\\' => array($vendorDir . '/symfony/service-contracts'), '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\String\\' => array($vendorDir . '/symfony/string'), '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Filesystem\\' => array($vendorDir . '/symfony/filesystem'), '_HumbugBox1cb33d1f20f1\\Symfony\\Component\\Console\\' => array($vendorDir . '/symfony/console'), '_HumbugBox1cb33d1f20f1\\Spatie\\ArrayToXml\\' => array($vendorDir . '/spatie/array-to-xml/src'), '_HumbugBox1cb33d1f20f1\\Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'), '_HumbugBox1cb33d1f20f1\\Psr\\Container\\' => array($vendorDir . '/psr/container/src'), '_HumbugBox1cb33d1f20f1\\PhpParser\\' => array($vendorDir . '/nikic/php-parser/lib/PhpParser'), '_HumbugBox1cb33d1f20f1\\PackageVersions\\' => array($vendorDir . '/composer/package-versions-deprecated/src/PackageVersions'), '_HumbugBox1cb33d1f20f1\\LanguageServerProtocol\\' => array($vendorDir . '/felixfbecker/language-server-protocol/src'), '_HumbugBox1cb33d1f20f1\\JsonMapper\\' => array($vendorDir . '/netresearch/jsonmapper/src/JsonMapper'), '_HumbugBox1cb33d1f20f1\\Fidry\\CpuCoreCounter\\' => array($vendorDir . '/fidry/cpu-core-counter/src'), '_HumbugBox1cb33d1f20f1\\Composer\\XdebugHandler\\' => array($vendorDir . '/composer/xdebug-handler/src'), '_HumbugBox1cb33d1f20f1\\Composer\\Semver\\' => array($vendorDir . '/composer/semver/src'), '_HumbugBox1cb33d1f20f1\\Composer\\Pcre\\' => array($vendorDir . '/composer/pcre/src'), '_HumbugBox1cb33d1f20f1\\Amp\\ByteStream\\' => array($vendorDir . '/amphp/byte-stream/lib'), '_HumbugBox1cb33d1f20f1\\Amp\\' => array($vendorDir . '/amphp/amp/lib'), '_HumbugBox1cb33d1f20f1\\AdvancedJsonRpc\\' => array($vendorDir . '/felixfbecker/advanced-json-rpc/lib'), 'Psalm\\' => array($baseDir . '/src/Psalm'), ); * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Composer\Semver; use _HumbugBox1cb33d1f20f1\Composer\Semver\Constraint\Constraint; use _HumbugBox1cb33d1f20f1\Composer\Semver\Constraint\ConstraintInterface; use _HumbugBox1cb33d1f20f1\Composer\Semver\Constraint\MatchAllConstraint; use _HumbugBox1cb33d1f20f1\Composer\Semver\Constraint\MatchNoneConstraint; use _HumbugBox1cb33d1f20f1\Composer\Semver\Constraint\MultiConstraint; /** * Helper class generating intervals from constraints * * This contains utilities for: * * - compacting an existing constraint which can be used to combine several into one * by creating a MultiConstraint out of the many constraints you have. * * - checking whether one subset is a subset of another. * * Note: You should call clear to free memoization memory usage when you are done using this class */ class Intervals { /** * @phpstan-var array */ private static $intervalsCache = array(); /** * @phpstan-var array */ private static $opSortOrder = array('>=' => -3, '<' => -2, '>' => 2, '<=' => 3); /** * Clears the memoization cache once you are done * * @return void */ public static function clear() { self::$intervalsCache = array(); } /** * Checks whether $candidate is a subset of $constraint * * @return bool */ public static function isSubsetOf(ConstraintInterface $candidate, ConstraintInterface $constraint) { if ($constraint instanceof MatchAllConstraint) { return \true; } if ($candidate instanceof MatchNoneConstraint || $constraint instanceof MatchNoneConstraint) { return \false; } $intersectionIntervals = self::get(new MultiConstraint(array($candidate, $constraint), \true)); $candidateIntervals = self::get($candidate); if (\count($intersectionIntervals['numeric']) !== \count($candidateIntervals['numeric'])) { return \false; } foreach ($intersectionIntervals['numeric'] as $index => $interval) { if (!isset($candidateIntervals['numeric'][$index])) { return \false; } if ((string) $candidateIntervals['numeric'][$index]->getStart() !== (string) $interval->getStart()) { return \false; } if ((string) $candidateIntervals['numeric'][$index]->getEnd() !== (string) $interval->getEnd()) { return \false; } } if ($intersectionIntervals['branches']['exclude'] !== $candidateIntervals['branches']['exclude']) { return \false; } if (\count($intersectionIntervals['branches']['names']) !== \count($candidateIntervals['branches']['names'])) { return \false; } foreach ($intersectionIntervals['branches']['names'] as $index => $name) { if ($name !== $candidateIntervals['branches']['names'][$index]) { return \false; } } return \true; } /** * Checks whether $a and $b have any intersection, equivalent to $a->matches($b) * * @return bool */ public static function haveIntersections(ConstraintInterface $a, ConstraintInterface $b) { if ($a instanceof MatchAllConstraint || $b instanceof MatchAllConstraint) { return \true; } if ($a instanceof MatchNoneConstraint || $b instanceof MatchNoneConstraint) { return \false; } $intersectionIntervals = self::generateIntervals(new MultiConstraint(array($a, $b), \true), \true); return \count($intersectionIntervals['numeric']) > 0 || $intersectionIntervals['branches']['exclude'] || \count($intersectionIntervals['branches']['names']) > 0; } /** * Attempts to optimize a MultiConstraint * * When merging MultiConstraints together they can get very large, this will * compact it by looking at the real intervals covered by all the constraints * and then creates a new constraint containing only the smallest amount of rules * to match the same intervals. * * @return ConstraintInterface */ public static function compactConstraint(ConstraintInterface $constraint) { if (!$constraint instanceof MultiConstraint) { return $constraint; } $intervals = self::generateIntervals($constraint); $constraints = array(); $hasNumericMatchAll = \false; if (\count($intervals['numeric']) === 1 && (string) $intervals['numeric'][0]->getStart() === (string) Interval::fromZero() && (string) $intervals['numeric'][0]->getEnd() === (string) Interval::untilPositiveInfinity()) { $constraints[] = $intervals['numeric'][0]->getStart(); $hasNumericMatchAll = \true; } else { $unEqualConstraints = array(); for ($i = 0, $count = \count($intervals['numeric']); $i < $count; $i++) { $interval = $intervals['numeric'][$i]; // if current interval ends with < N and next interval begins with > N we can swap this out for != N // but this needs to happen as a conjunctive expression together with the start of the current interval // and end of next interval, so [>=M, N, [>=M, !=N, getEnd()->getOperator() === '<' && $i + 1 < $count) { $nextInterval = $intervals['numeric'][$i + 1]; if ($interval->getEnd()->getVersion() === $nextInterval->getStart()->getVersion() && $nextInterval->getStart()->getOperator() === '>') { // only add a start if we didn't already do so, can be skipped if we're looking at second // interval in [>=M, N, P, =M, !=N] already and we only want to add !=P right now if (\count($unEqualConstraints) === 0 && (string) $interval->getStart() !== (string) Interval::fromZero()) { $unEqualConstraints[] = $interval->getStart(); } $unEqualConstraints[] = new Constraint('!=', $interval->getEnd()->getVersion()); continue; } } if (\count($unEqualConstraints) > 0) { // this is where the end of the following interval of a != constraint is added as explained above if ((string) $interval->getEnd() !== (string) Interval::untilPositiveInfinity()) { $unEqualConstraints[] = $interval->getEnd(); } // count is 1 if entire constraint is just one != expression if (\count($unEqualConstraints) > 1) { $constraints[] = new MultiConstraint($unEqualConstraints, \true); } else { $constraints[] = $unEqualConstraints[0]; } $unEqualConstraints = array(); continue; } // convert back >= x - <= x intervals to == x if ($interval->getStart()->getVersion() === $interval->getEnd()->getVersion() && $interval->getStart()->getOperator() === '>=' && $interval->getEnd()->getOperator() === '<=') { $constraints[] = new Constraint('==', $interval->getStart()->getVersion()); continue; } if ((string) $interval->getStart() === (string) Interval::fromZero()) { $constraints[] = $interval->getEnd(); } elseif ((string) $interval->getEnd() === (string) Interval::untilPositiveInfinity()) { $constraints[] = $interval->getStart(); } else { $constraints[] = new MultiConstraint(array($interval->getStart(), $interval->getEnd()), \true); } } } $devConstraints = array(); if (0 === \count($intervals['branches']['names'])) { if ($intervals['branches']['exclude']) { if ($hasNumericMatchAll) { return new MatchAllConstraint(); } // otherwise constraint should contain a != operator and already cover this } } else { foreach ($intervals['branches']['names'] as $branchName) { if ($intervals['branches']['exclude']) { $devConstraints[] = new Constraint('!=', $branchName); } else { $devConstraints[] = new Constraint('==', $branchName); } } // excluded branches, e.g. != dev-foo are conjunctive with the interval, so // > 2.0 != dev-foo must return a conjunctive constraint if ($intervals['branches']['exclude']) { if (\count($constraints) > 1) { return new MultiConstraint(\array_merge(array(new MultiConstraint($constraints, \false)), $devConstraints), \true); } if (\count($constraints) === 1 && (string) $constraints[0] === (string) Interval::fromZero()) { if (\count($devConstraints) > 1) { return new MultiConstraint($devConstraints, \true); } return $devConstraints[0]; } return new MultiConstraint(\array_merge($constraints, $devConstraints), \true); } // otherwise devConstraints contains a list of == operators for branches which are disjunctive with the // rest of the constraint $constraints = \array_merge($constraints, $devConstraints); } if (\count($constraints) > 1) { return new MultiConstraint($constraints, \false); } if (\count($constraints) === 1) { return $constraints[0]; } return new MatchNoneConstraint(); } /** * Creates an array of numeric intervals and branch constraints representing a given constraint * * if the returned numeric array is empty it means the constraint matches nothing in the numeric range (0 - +inf) * if the returned branches array is empty it means no dev-* versions are matched * if a constraint matches all possible dev-* versions, branches will contain Interval::anyDev() * * @return array * @phpstan-return array{'numeric': Interval[], 'branches': array{'names': string[], 'exclude': bool}} */ public static function get(ConstraintInterface $constraint) { $key = (string) $constraint; if (!isset(self::$intervalsCache[$key])) { self::$intervalsCache[$key] = self::generateIntervals($constraint); } return self::$intervalsCache[$key]; } /** * @param bool $stopOnFirstValidInterval * * @phpstan-return array{'numeric': Interval[], 'branches': array{'names': string[], 'exclude': bool}} */ private static function generateIntervals(ConstraintInterface $constraint, $stopOnFirstValidInterval = \false) { if ($constraint instanceof MatchAllConstraint) { return array('numeric' => array(new Interval(Interval::fromZero(), Interval::untilPositiveInfinity())), 'branches' => Interval::anyDev()); } if ($constraint instanceof MatchNoneConstraint) { return array('numeric' => array(), 'branches' => array('names' => array(), 'exclude' => \false)); } if ($constraint instanceof Constraint) { return self::generateSingleConstraintIntervals($constraint); } if (!$constraint instanceof MultiConstraint) { throw new \UnexpectedValueException('The constraint passed in should be an MatchAllConstraint, Constraint or MultiConstraint instance, got ' . \get_class($constraint) . '.'); } $constraints = $constraint->getConstraints(); $numericGroups = array(); $constraintBranches = array(); foreach ($constraints as $c) { $res = self::get($c); $numericGroups[] = $res['numeric']; $constraintBranches[] = $res['branches']; } if ($constraint->isDisjunctive()) { $branches = Interval::noDev(); foreach ($constraintBranches as $b) { if ($b['exclude']) { if ($branches['exclude']) { // disjunctive constraint, so only exclude what's excluded in all constraints // !=a,!=b || !=b,!=c => !=b $branches['names'] = \array_intersect($branches['names'], $b['names']); } else { // disjunctive constraint so exclude all names which are not explicitly included in the alternative // (==b || ==c) || !=a,!=b => !=a $branches['exclude'] = \true; $branches['names'] = \array_diff($b['names'], $branches['names']); } } else { if ($branches['exclude']) { // disjunctive constraint so exclude all names which are not explicitly included in the alternative // !=a,!=b || (==b || ==c) => !=a $branches['names'] = \array_diff($branches['names'], $b['names']); } else { // disjunctive constraint, so just add all the other branches // (==a || ==b) || ==c => ==a || ==b || ==c $branches['names'] = \array_merge($branches['names'], $b['names']); } } } } else { $branches = Interval::anyDev(); foreach ($constraintBranches as $b) { if ($b['exclude']) { if ($branches['exclude']) { // conjunctive, so just add all branch names to be excluded // !=a && !=b => !=a,!=b $branches['names'] = \array_merge($branches['names'], $b['names']); } else { // conjunctive, so only keep included names which are not excluded // (==a||==c) && !=a,!=b => ==c $branches['names'] = \array_diff($branches['names'], $b['names']); } } else { if ($branches['exclude']) { // conjunctive, so only keep included names which are not excluded // !=a,!=b && (==a||==c) => ==c $branches['names'] = \array_diff($b['names'], $branches['names']); $branches['exclude'] = \false; } else { // conjunctive, so only keep names that are included in both // (==a||==b) && (==a||==c) => ==a $branches['names'] = \array_intersect($branches['names'], $b['names']); } } } } $branches['names'] = \array_unique($branches['names']); if (\count($numericGroups) === 1) { return array('numeric' => $numericGroups[0], 'branches' => $branches); } $borders = array(); foreach ($numericGroups as $group) { foreach ($group as $interval) { $borders[] = array('version' => $interval->getStart()->getVersion(), 'operator' => $interval->getStart()->getOperator(), 'side' => 'start'); $borders[] = array('version' => $interval->getEnd()->getVersion(), 'operator' => $interval->getEnd()->getOperator(), 'side' => 'end'); } } $opSortOrder = self::$opSortOrder; \usort($borders, function ($a, $b) use($opSortOrder) { $order = \version_compare($a['version'], $b['version']); if ($order === 0) { return $opSortOrder[$a['operator']] - $opSortOrder[$b['operator']]; } return $order; }); $activeIntervals = 0; $intervals = array(); $index = 0; $activationThreshold = $constraint->isConjunctive() ? \count($numericGroups) : 1; $start = null; foreach ($borders as $border) { if ($border['side'] === 'start') { $activeIntervals++; } else { $activeIntervals--; } if (!$start && $activeIntervals >= $activationThreshold) { $start = new Constraint($border['operator'], $border['version']); } elseif ($start && $activeIntervals < $activationThreshold) { // filter out invalid intervals like > x - <= x, or >= x - < x if (\version_compare($start->getVersion(), $border['version'], '=') && ($start->getOperator() === '>' && $border['operator'] === '<=' || $start->getOperator() === '>=' && $border['operator'] === '<')) { unset($intervals[$index]); } else { $intervals[$index] = new Interval($start, new Constraint($border['operator'], $border['version'])); $index++; if ($stopOnFirstValidInterval) { break; } } $start = null; } } return array('numeric' => $intervals, 'branches' => $branches); } /** * @phpstan-return array{'numeric': Interval[], 'branches': array{'names': string[], 'exclude': bool}} */ private static function generateSingleConstraintIntervals(Constraint $constraint) { $op = $constraint->getOperator(); // handle branch constraints first if (\strpos($constraint->getVersion(), 'dev-') === 0) { $intervals = array(); $branches = array('names' => array(), 'exclude' => \false); // != dev-foo means any numeric version may match, we treat >/< like != they are not really defined for branches if ($op === '!=') { $intervals[] = new Interval(Interval::fromZero(), Interval::untilPositiveInfinity()); $branches = array('names' => array($constraint->getVersion()), 'exclude' => \true); } elseif ($op === '==') { $branches['names'][] = $constraint->getVersion(); } return array('numeric' => $intervals, 'branches' => $branches); } if ($op[0] === '>') { // > & >= return array('numeric' => array(new Interval($constraint, Interval::untilPositiveInfinity())), 'branches' => Interval::noDev()); } if ($op[0] === '<') { // < & <= return array('numeric' => array(new Interval(Interval::fromZero(), $constraint)), 'branches' => Interval::noDev()); } if ($op === '!=') { // convert !=x to intervals of 0 - x - +inf + dev* return array('numeric' => array(new Interval(Interval::fromZero(), new Constraint('<', $constraint->getVersion())), new Interval(new Constraint('>', $constraint->getVersion()), Interval::untilPositiveInfinity())), 'branches' => Interval::anyDev()); } // convert ==x to an interval of >=x - <=x return array('numeric' => array(new Interval(new Constraint('>=', $constraint->getVersion()), new Constraint('<=', $constraint->getVersion()))), 'branches' => Interval::noDev()); } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Composer\Semver; use _HumbugBox1cb33d1f20f1\Composer\Semver\Constraint\Constraint; class Semver { const SORT_ASC = 1; const SORT_DESC = -1; /** @var VersionParser */ private static $versionParser; /** * Determine if given version satisfies given constraints. * * @param string $version * @param string $constraints * * @return bool */ public static function satisfies($version, $constraints) { if (null === self::$versionParser) { self::$versionParser = new VersionParser(); } $versionParser = self::$versionParser; $provider = new Constraint('==', $versionParser->normalize($version)); $parsedConstraints = $versionParser->parseConstraints($constraints); return $parsedConstraints->matches($provider); } /** * Return all versions that satisfy given constraints. * * @param string[] $versions * @param string $constraints * * @return string[] */ public static function satisfiedBy(array $versions, $constraints) { $versions = \array_filter($versions, function ($version) use($constraints) { return Semver::satisfies($version, $constraints); }); return \array_values($versions); } /** * Sort given array of versions. * * @param string[] $versions * * @return string[] */ public static function sort(array $versions) { return self::usort($versions, self::SORT_ASC); } /** * Sort given array of versions in reverse. * * @param string[] $versions * * @return string[] */ public static function rsort(array $versions) { return self::usort($versions, self::SORT_DESC); } /** * @param string[] $versions * @param int $direction * * @return string[] */ private static function usort(array $versions, $direction) { if (null === self::$versionParser) { self::$versionParser = new VersionParser(); } $versionParser = self::$versionParser; $normalized = array(); // Normalize outside of usort() scope for minor performance increase. // Creates an array of arrays: [[normalized, key], ...] foreach ($versions as $key => $version) { $normalizedVersion = $versionParser->normalize($version); $normalizedVersion = $versionParser->normalizeDefaultBranch($normalizedVersion); $normalized[] = array($normalizedVersion, $key); } \usort($normalized, function (array $left, array $right) use($direction) { if ($left[0] === $right[0]) { return 0; } if (Comparator::lessThan($left[0], $right[0])) { return -$direction; } return $direction; }); // Recreate input array, using the original indexes which are now in sorted order. $sorted = array(); foreach ($normalized as $item) { $sorted[] = $versions[$item[1]]; } return $sorted; } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Composer\Semver; use _HumbugBox1cb33d1f20f1\Composer\Semver\Constraint\ConstraintInterface; use _HumbugBox1cb33d1f20f1\Composer\Semver\Constraint\MatchAllConstraint; use _HumbugBox1cb33d1f20f1\Composer\Semver\Constraint\MultiConstraint; use _HumbugBox1cb33d1f20f1\Composer\Semver\Constraint\Constraint; /** * Version parser. * * @author Jordi Boggiano */ class VersionParser { /** * Regex to match pre-release data (sort of). * * Due to backwards compatibility: * - Instead of enforcing hyphen, an underscore, dot or nothing at all are also accepted. * - Only stabilities as recognized by Composer are allowed to precede a numerical identifier. * - Numerical-only pre-release identifiers are not supported, see tests. * * |--------------| * [major].[minor].[patch] -[pre-release] +[build-metadata] * * @var string */ private static $modifierRegex = '[._-]?(?:(stable|beta|b|RC|alpha|a|patch|pl|p)((?:[.-]?\\d+)*+)?)?([.-]?dev)?'; /** @var string */ private static $stabilitiesRegex = 'stable|RC|beta|alpha|dev'; /** * Returns the stability of a version. * * @param string $version * * @return string * @phpstan-return 'stable'|'RC'|'beta'|'alpha'|'dev' */ public static function parseStability($version) { $version = (string) \preg_replace('{#.+$}', '', (string) $version); if (\strpos($version, 'dev-') === 0 || '-dev' === \substr($version, -4)) { return 'dev'; } \preg_match('{' . self::$modifierRegex . '(?:\\+.*)?$}i', \strtolower($version), $match); if (!empty($match[3])) { return 'dev'; } if (!empty($match[1])) { if ('beta' === $match[1] || 'b' === $match[1]) { return 'beta'; } if ('alpha' === $match[1] || 'a' === $match[1]) { return 'alpha'; } if ('rc' === $match[1]) { return 'RC'; } } return 'stable'; } /** * @param string $stability * * @return string */ public static function normalizeStability($stability) { $stability = \strtolower((string) $stability); return $stability === 'rc' ? 'RC' : $stability; } /** * Normalizes a version string to be able to perform comparisons on it. * * @param string $version * @param ?string $fullVersion optional complete version string to give more context * * @throws \UnexpectedValueException * * @return string */ public function normalize($version, $fullVersion = null) { $version = \trim((string) $version); $origVersion = $version; if (null === $fullVersion) { $fullVersion = $version; } // strip off aliasing if (\preg_match('{^([^,\\s]++) ++as ++([^,\\s]++)$}', $version, $match)) { $version = $match[1]; } // strip off stability flag if (\preg_match('{@(?:' . self::$stabilitiesRegex . ')$}i', $version, $match)) { $version = \substr($version, 0, \strlen($version) - \strlen($match[0])); } // normalize master/trunk/default branches to dev-name for BC with 1.x as these used to be valid constraints if (\in_array($version, array('master', 'trunk', 'default'), \true)) { $version = 'dev-' . $version; } // if requirement is branch-like, use full name if (\stripos($version, 'dev-') === 0) { return 'dev-' . \substr($version, 4); } // strip off build metadata if (\preg_match('{^([^,\\s+]++)\\+[^\\s]++$}', $version, $match)) { $version = $match[1]; } // match classical versioning if (\preg_match('{^v?(\\d{1,5})(\\.\\d++)?(\\.\\d++)?(\\.\\d++)?' . self::$modifierRegex . '$}i', $version, $matches)) { $version = $matches[1] . (!empty($matches[2]) ? $matches[2] : '.0') . (!empty($matches[3]) ? $matches[3] : '.0') . (!empty($matches[4]) ? $matches[4] : '.0'); $index = 5; // match date(time) based versioning } elseif (\preg_match('{^v?(\\d{4}(?:[.:-]?\\d{2}){1,6}(?:[.:-]?\\d{1,3})?)' . self::$modifierRegex . '$}i', $version, $matches)) { $version = \preg_replace('{\\D}', '.', $matches[1]); $index = 2; } // add version modifiers if a version was matched if (isset($index)) { if (!empty($matches[$index])) { if ('stable' === $matches[$index]) { return $version; } $version .= '-' . $this->expandStability($matches[$index]) . (isset($matches[$index + 1]) && '' !== $matches[$index + 1] ? \ltrim($matches[$index + 1], '.-') : ''); } if (!empty($matches[$index + 2])) { $version .= '-dev'; } return $version; } // match dev branches if (\preg_match('{(.*?)[.-]?dev$}i', $version, $match)) { try { $normalized = $this->normalizeBranch($match[1]); // a branch ending with -dev is only valid if it is numeric // if it gets prefixed with dev- it means the branch name should // have had a dev- prefix already when passed to normalize if (\strpos($normalized, 'dev-') === \false) { return $normalized; } } catch (\Exception $e) { } } $extraMessage = ''; if (\preg_match('{ +as +' . \preg_quote($version) . '(?:@(?:' . self::$stabilitiesRegex . '))?$}', $fullVersion)) { $extraMessage = ' in "' . $fullVersion . '", the alias must be an exact version'; } elseif (\preg_match('{^' . \preg_quote($version) . '(?:@(?:' . self::$stabilitiesRegex . '))? +as +}', $fullVersion)) { $extraMessage = ' in "' . $fullVersion . '", the alias source must be an exact version, if it is a branch name you should prefix it with dev-'; } throw new \UnexpectedValueException('Invalid version string "' . $origVersion . '"' . $extraMessage); } /** * Extract numeric prefix from alias, if it is in numeric format, suitable for version comparison. * * @param string $branch Branch name (e.g. 2.1.x-dev) * * @return string|false Numeric prefix if present (e.g. 2.1.) or false */ public function parseNumericAliasPrefix($branch) { if (\preg_match('{^(?P(\\d++\\.)*\\d++)(?:\\.x)?-dev$}i', (string) $branch, $matches)) { return $matches['version'] . '.'; } return \false; } /** * Normalizes a branch name to be able to perform comparisons on it. * * @param string $name * * @return string */ public function normalizeBranch($name) { $name = \trim((string) $name); if (\preg_match('{^v?(\\d++)(\\.(?:\\d++|[xX*]))?(\\.(?:\\d++|[xX*]))?(\\.(?:\\d++|[xX*]))?$}i', $name, $matches)) { $version = ''; for ($i = 1; $i < 5; ++$i) { $version .= isset($matches[$i]) ? \str_replace(array('*', 'X'), 'x', $matches[$i]) : '.x'; } return \str_replace('x', '9999999', $version) . '-dev'; } return 'dev-' . $name; } /** * Normalizes a default branch name (i.e. master on git) to 9999999-dev. * * @param string $name * * @return string * * @deprecated No need to use this anymore in theory, Composer 2 does not normalize any branch names to 9999999-dev anymore */ public function normalizeDefaultBranch($name) { if ($name === 'dev-master' || $name === 'dev-default' || $name === 'dev-trunk') { return '9999999-dev'; } return (string) $name; } /** * Parses a constraint string into MultiConstraint and/or Constraint objects. * * @param string $constraints * * @return ConstraintInterface */ public function parseConstraints($constraints) { $prettyConstraint = (string) $constraints; $orConstraints = \preg_split('{\\s*\\|\\|?\\s*}', \trim((string) $constraints)); if (\false === $orConstraints) { throw new \RuntimeException('Failed to preg_split string: ' . $constraints); } $orGroups = array(); foreach ($orConstraints as $constraints) { $andConstraints = \preg_split('{(?< ,]) *(? 1) { $constraintObjects = array(); foreach ($andConstraints as $constraint) { foreach ($this->parseConstraint($constraint) as $parsedConstraint) { $constraintObjects[] = $parsedConstraint; } } } else { $constraintObjects = $this->parseConstraint($andConstraints[0]); } if (1 === \count($constraintObjects)) { $constraint = $constraintObjects[0]; } else { $constraint = new MultiConstraint($constraintObjects); } $orGroups[] = $constraint; } $constraint = MultiConstraint::create($orGroups, \false); $constraint->setPrettyString($prettyConstraint); return $constraint; } /** * @param string $constraint * * @throws \UnexpectedValueException * * @return array * * @phpstan-return non-empty-array */ private function parseConstraint($constraint) { // strip off aliasing if (\preg_match('{^([^,\\s]++) ++as ++([^,\\s]++)$}', $constraint, $match)) { $constraint = $match[1]; } // strip @stability flags, and keep it for later use if (\preg_match('{^([^,\\s]*?)@(' . self::$stabilitiesRegex . ')$}i', $constraint, $match)) { $constraint = '' !== $match[1] ? $match[1] : '*'; if ($match[2] !== 'stable') { $stabilityModifier = $match[2]; } } // get rid of #refs as those are used by composer only if (\preg_match('{^(dev-[^,\\s@]+?|[^,\\s@]+?\\.x-dev)#.+$}i', $constraint, $match)) { $constraint = $match[1]; } if (\preg_match('{^(v)?[xX*](\\.[xX*])*$}i', $constraint, $match)) { if (!empty($match[1]) || !empty($match[2])) { return array(new Constraint('>=', '0.0.0.0-dev')); } return array(new MatchAllConstraint()); } $versionRegex = 'v?(\\d++)(?:\\.(\\d++))?(?:\\.(\\d++))?(?:\\.(\\d++))?(?:' . self::$modifierRegex . '|\\.([xX*][.-]?dev))(?:\\+[^\\s]+)?'; // Tilde Range // // Like wildcard constraints, unsuffixed tilde constraints say that they must be greater than the previous // version, to ensure that unstable instances of the current version are allowed. However, if a stability // suffix is added to the constraint, then a >= match on the current version is used instead. if (\preg_match('{^~>?' . $versionRegex . '$}i', $constraint, $matches)) { if (\strpos($constraint, '~>') === 0) { throw new \UnexpectedValueException('Could not parse version constraint ' . $constraint . ': ' . 'Invalid operator "~>", you probably meant to use the "~" operator'); } // Work out which position in the version we are operating at if (isset($matches[4]) && '' !== $matches[4] && null !== $matches[4]) { $position = 4; } elseif (isset($matches[3]) && '' !== $matches[3] && null !== $matches[3]) { $position = 3; } elseif (isset($matches[2]) && '' !== $matches[2] && null !== $matches[2]) { $position = 2; } else { $position = 1; } // when matching 2.x-dev or 3.0.x-dev we have to shift the second or third number, despite no second/third number matching above if (!empty($matches[8])) { $position++; } // Calculate the stability suffix $stabilitySuffix = ''; if (empty($matches[5]) && empty($matches[7]) && empty($matches[8])) { $stabilitySuffix .= '-dev'; } $lowVersion = $this->normalize(\substr($constraint . $stabilitySuffix, 1)); $lowerBound = new Constraint('>=', $lowVersion); // For upper bound, we increment the position of one more significance, // but highPosition = 0 would be illegal $highPosition = \max(1, $position - 1); $highVersion = $this->manipulateVersionString($matches, $highPosition, 1) . '-dev'; $upperBound = new Constraint('<', $highVersion); return array($lowerBound, $upperBound); } // Caret Range // // Allows changes that do not modify the left-most non-zero digit in the [major, minor, patch] tuple. // In other words, this allows patch and minor updates for versions 1.0.0 and above, patch updates for // versions 0.X >=0.1.0, and no updates for versions 0.0.X if (\preg_match('{^\\^' . $versionRegex . '($)}i', $constraint, $matches)) { // Work out which position in the version we are operating at if ('0' !== $matches[1] || '' === $matches[2] || null === $matches[2]) { $position = 1; } elseif ('0' !== $matches[2] || '' === $matches[3] || null === $matches[3]) { $position = 2; } else { $position = 3; } // Calculate the stability suffix $stabilitySuffix = ''; if (empty($matches[5]) && empty($matches[7]) && empty($matches[8])) { $stabilitySuffix .= '-dev'; } $lowVersion = $this->normalize(\substr($constraint . $stabilitySuffix, 1)); $lowerBound = new Constraint('>=', $lowVersion); // For upper bound, we increment the position of one more significance, // but highPosition = 0 would be illegal $highVersion = $this->manipulateVersionString($matches, $position, 1) . '-dev'; $upperBound = new Constraint('<', $highVersion); return array($lowerBound, $upperBound); } // X Range // // Any of X, x, or * may be used to "stand in" for one of the numeric values in the [major, minor, patch] tuple. // A partial version range is treated as an X-Range, so the special character is in fact optional. if (\preg_match('{^v?(\\d++)(?:\\.(\\d++))?(?:\\.(\\d++))?(?:\\.[xX*])++$}', $constraint, $matches)) { if (isset($matches[3]) && '' !== $matches[3] && null !== $matches[3]) { $position = 3; } elseif (isset($matches[2]) && '' !== $matches[2] && null !== $matches[2]) { $position = 2; } else { $position = 1; } $lowVersion = $this->manipulateVersionString($matches, $position) . '-dev'; $highVersion = $this->manipulateVersionString($matches, $position, 1) . '-dev'; if ($lowVersion === '0.0.0.0-dev') { return array(new Constraint('<', $highVersion)); } return array(new Constraint('>=', $lowVersion), new Constraint('<', $highVersion)); } // Hyphen Range // // Specifies an inclusive set. If a partial version is provided as the first version in the inclusive range, // then the missing pieces are replaced with zeroes. If a partial version is provided as the second version in // the inclusive range, then all versions that start with the supplied parts of the tuple are accepted, but // nothing that would be greater than the provided tuple parts. if (\preg_match('{^(?P' . $versionRegex . ') +- +(?P' . $versionRegex . ')($)}i', $constraint, $matches)) { // Calculate the stability suffix $lowStabilitySuffix = ''; if (empty($matches[6]) && empty($matches[8]) && empty($matches[9])) { $lowStabilitySuffix = '-dev'; } $lowVersion = $this->normalize($matches['from']); $lowerBound = new Constraint('>=', $lowVersion . $lowStabilitySuffix); $empty = function ($x) { return $x === 0 || $x === '0' ? \false : empty($x); }; if (!$empty($matches[12]) && !$empty($matches[13]) || !empty($matches[15]) || !empty($matches[17]) || !empty($matches[18])) { $highVersion = $this->normalize($matches['to']); $upperBound = new Constraint('<=', $highVersion); } else { $highMatch = array('', $matches[11], $matches[12], $matches[13], $matches[14]); // validate to version $this->normalize($matches['to']); $highVersion = $this->manipulateVersionString($highMatch, $empty($matches[12]) ? 1 : 2, 1) . '-dev'; $upperBound = new Constraint('<', $highVersion); } return array($lowerBound, $upperBound); } // Basic Comparators if (\preg_match('{^(<>|!=|>=?|<=?|==?)?\\s*(.*)}', $constraint, $matches)) { try { try { $version = $this->normalize($matches[2]); } catch (\UnexpectedValueException $e) { // recover from an invalid constraint like foobar-dev which should be dev-foobar // except if the constraint uses a known operator, in which case it must be a parse error if (\substr($matches[2], -4) === '-dev' && \preg_match('{^[0-9a-zA-Z-./]+$}', $matches[2])) { $version = $this->normalize('dev-' . \substr($matches[2], 0, -4)); } else { throw $e; } } $op = $matches[1] ?: '='; if ($op !== '==' && $op !== '=' && !empty($stabilityModifier) && self::parseStability($version) === 'stable') { $version .= '-' . $stabilityModifier; } elseif ('<' === $op || '>=' === $op) { if (!\preg_match('/-' . self::$modifierRegex . '$/', \strtolower($matches[2]))) { if (\strpos($matches[2], 'dev-') !== 0) { $version .= '-dev'; } } } return array(new Constraint($matches[1] ?: '=', $version)); } catch (\Exception $e) { } } $message = 'Could not parse version constraint ' . $constraint; if (isset($e)) { $message .= ': ' . $e->getMessage(); } throw new \UnexpectedValueException($message); } /** * Increment, decrement, or simply pad a version number. * * Support function for {@link parseConstraint()} * * @param array $matches Array with version parts in array indexes 1,2,3,4 * @param int $position 1,2,3,4 - which segment of the version to increment/decrement * @param int $increment * @param string $pad The string to pad version parts after $position * * @return string|null The new version * * @phpstan-param string[] $matches */ private function manipulateVersionString(array $matches, $position, $increment = 0, $pad = '0') { for ($i = 4; $i > 0; --$i) { if ($i > $position) { $matches[$i] = $pad; } elseif ($i === $position && $increment) { $matches[$i] += $increment; // If $matches[$i] was 0, carry the decrement if ($matches[$i] < 0) { $matches[$i] = $pad; --$position; // Return null on a carry overflow if ($i === 1) { return null; } } } } return $matches[1] . '.' . $matches[2] . '.' . $matches[3] . '.' . $matches[4]; } /** * Expand shorthand stability string to long version. * * @param string $stability * * @return string */ private function expandStability($stability) { $stability = \strtolower($stability); switch ($stability) { case 'a': return 'alpha'; case 'b': return 'beta'; case 'p': case 'pl': return 'patch'; case 'rc': return 'RC'; default: return $stability; } } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Composer\Semver\Constraint; /** * Blackhole of constraints, nothing escapes it */ class MatchNoneConstraint implements ConstraintInterface { /** @var string|null */ protected $prettyString; /** * @param ConstraintInterface $provider * * @return bool */ public function matches(ConstraintInterface $provider) { return \false; } /** * {@inheritDoc} */ public function compile($otherOperator) { return 'false'; } /** * {@inheritDoc} */ public function setPrettyString($prettyString) { $this->prettyString = $prettyString; } /** * {@inheritDoc} */ public function getPrettyString() { if ($this->prettyString) { return $this->prettyString; } return (string) $this; } /** * {@inheritDoc} */ public function __toString() { return '[]'; } /** * {@inheritDoc} */ public function getUpperBound() { return new Bound('0.0.0.0-dev', \false); } /** * {@inheritDoc} */ public function getLowerBound() { return new Bound('0.0.0.0-dev', \false); } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Composer\Semver\Constraint; /** * Defines the absence of a constraint. * * This constraint matches everything. */ class MatchAllConstraint implements ConstraintInterface { /** @var string|null */ protected $prettyString; /** * @param ConstraintInterface $provider * * @return bool */ public function matches(ConstraintInterface $provider) { return \true; } /** * {@inheritDoc} */ public function compile($otherOperator) { return 'true'; } /** * {@inheritDoc} */ public function setPrettyString($prettyString) { $this->prettyString = $prettyString; } /** * {@inheritDoc} */ public function getPrettyString() { if ($this->prettyString) { return $this->prettyString; } return (string) $this; } /** * {@inheritDoc} */ public function __toString() { return '*'; } /** * {@inheritDoc} */ public function getUpperBound() { return Bound::positiveInfinity(); } /** * {@inheritDoc} */ public function getLowerBound() { return Bound::zero(); } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Composer\Semver\Constraint; /** * Defines a constraint. */ class Constraint implements ConstraintInterface { /* operator integer values */ const OP_EQ = 0; const OP_LT = 1; const OP_LE = 2; const OP_GT = 3; const OP_GE = 4; const OP_NE = 5; /* operator string values */ const STR_OP_EQ = '=='; const STR_OP_EQ_ALT = '='; const STR_OP_LT = '<'; const STR_OP_LE = '<='; const STR_OP_GT = '>'; const STR_OP_GE = '>='; const STR_OP_NE = '!='; const STR_OP_NE_ALT = '<>'; /** * Operator to integer translation table. * * @var array * @phpstan-var array */ private static $transOpStr = array('=' => self::OP_EQ, '==' => self::OP_EQ, '<' => self::OP_LT, '<=' => self::OP_LE, '>' => self::OP_GT, '>=' => self::OP_GE, '<>' => self::OP_NE, '!=' => self::OP_NE); /** * Integer to operator translation table. * * @var array * @phpstan-var array */ private static $transOpInt = array(self::OP_EQ => '==', self::OP_LT => '<', self::OP_LE => '<=', self::OP_GT => '>', self::OP_GE => '>=', self::OP_NE => '!='); /** * @var int * @phpstan-var self::OP_* */ protected $operator; /** @var string */ protected $version; /** @var string|null */ protected $prettyString; /** @var Bound */ protected $lowerBound; /** @var Bound */ protected $upperBound; /** * Sets operator and version to compare with. * * @param string $operator * @param string $version * * @throws \InvalidArgumentException if invalid operator is given. * * @phpstan-param self::STR_OP_* $operator */ public function __construct($operator, $version) { if (!isset(self::$transOpStr[$operator])) { throw new \InvalidArgumentException(\sprintf('Invalid operator "%s" given, expected one of: %s', $operator, \implode(', ', self::getSupportedOperators()))); } $this->operator = self::$transOpStr[$operator]; $this->version = $version; } /** * @return string */ public function getVersion() { return $this->version; } /** * @return string * * @phpstan-return self::STR_OP_* */ public function getOperator() { return self::$transOpInt[$this->operator]; } /** * @param ConstraintInterface $provider * * @return bool */ public function matches(ConstraintInterface $provider) { if ($provider instanceof self) { return $this->matchSpecific($provider); } // turn matching around to find a match return $provider->matches($this); } /** * {@inheritDoc} */ public function setPrettyString($prettyString) { $this->prettyString = $prettyString; } /** * {@inheritDoc} */ public function getPrettyString() { if ($this->prettyString) { return $this->prettyString; } return $this->__toString(); } /** * Get all supported comparison operators. * * @return array * * @phpstan-return list */ public static function getSupportedOperators() { return \array_keys(self::$transOpStr); } /** * @param string $operator * @return int * * @phpstan-param self::STR_OP_* $operator * @phpstan-return self::OP_* */ public static function getOperatorConstant($operator) { return self::$transOpStr[$operator]; } /** * @param string $a * @param string $b * @param string $operator * @param bool $compareBranches * * @throws \InvalidArgumentException if invalid operator is given. * * @return bool * * @phpstan-param self::STR_OP_* $operator */ public function versionCompare($a, $b, $operator, $compareBranches = \false) { if (!isset(self::$transOpStr[$operator])) { throw new \InvalidArgumentException(\sprintf('Invalid operator "%s" given, expected one of: %s', $operator, \implode(', ', self::getSupportedOperators()))); } $aIsBranch = \strpos($a, 'dev-') === 0; $bIsBranch = \strpos($b, 'dev-') === 0; if ($operator === '!=' && ($aIsBranch || $bIsBranch)) { return $a !== $b; } if ($aIsBranch && $bIsBranch) { return $operator === '==' && $a === $b; } // when branches are not comparable, we make sure dev branches never match anything if (!$compareBranches && ($aIsBranch || $bIsBranch)) { return \false; } return \version_compare($a, $b, $operator); } /** * {@inheritDoc} */ public function compile($otherOperator) { if (\strpos($this->version, 'dev-') === 0) { if (self::OP_EQ === $this->operator) { if (self::OP_EQ === $otherOperator) { return \sprintf('$b && $v === %s', \var_export($this->version, \true)); } if (self::OP_NE === $otherOperator) { return \sprintf('!$b || $v !== %s', \var_export($this->version, \true)); } return 'false'; } if (self::OP_NE === $this->operator) { if (self::OP_EQ === $otherOperator) { return \sprintf('!$b || $v !== %s', \var_export($this->version, \true)); } if (self::OP_NE === $otherOperator) { return 'true'; } return '!$b'; } return 'false'; } if (self::OP_EQ === $this->operator) { if (self::OP_EQ === $otherOperator) { return \sprintf('\\version_compare($v, %s, \'==\')', \var_export($this->version, \true)); } if (self::OP_NE === $otherOperator) { return \sprintf('$b || \\version_compare($v, %s, \'!=\')', \var_export($this->version, \true)); } return \sprintf('!$b && \\version_compare(%s, $v, \'%s\')', \var_export($this->version, \true), self::$transOpInt[$otherOperator]); } if (self::OP_NE === $this->operator) { if (self::OP_EQ === $otherOperator) { return \sprintf('$b || (!$b && \\version_compare($v, %s, \'!=\'))', \var_export($this->version, \true)); } if (self::OP_NE === $otherOperator) { return 'true'; } return '!$b'; } if (self::OP_LT === $this->operator || self::OP_LE === $this->operator) { if (self::OP_LT === $otherOperator || self::OP_LE === $otherOperator) { return '!$b'; } } else { // $this->operator must be self::OP_GT || self::OP_GE here if (self::OP_GT === $otherOperator || self::OP_GE === $otherOperator) { return '!$b'; } } if (self::OP_NE === $otherOperator) { return 'true'; } $codeComparison = \sprintf('\\version_compare($v, %s, \'%s\')', \var_export($this->version, \true), self::$transOpInt[$this->operator]); if ($this->operator === self::OP_LE) { if ($otherOperator === self::OP_GT) { return \sprintf('!$b && \\version_compare($v, %s, \'!=\') && ', \var_export($this->version, \true)) . $codeComparison; } } elseif ($this->operator === self::OP_GE) { if ($otherOperator === self::OP_LT) { return \sprintf('!$b && \\version_compare($v, %s, \'!=\') && ', \var_export($this->version, \true)) . $codeComparison; } } return \sprintf('!$b && %s', $codeComparison); } /** * @param Constraint $provider * @param bool $compareBranches * * @return bool */ public function matchSpecific(Constraint $provider, $compareBranches = \false) { $noEqualOp = \str_replace('=', '', self::$transOpInt[$this->operator]); $providerNoEqualOp = \str_replace('=', '', self::$transOpInt[$provider->operator]); $isEqualOp = self::OP_EQ === $this->operator; $isNonEqualOp = self::OP_NE === $this->operator; $isProviderEqualOp = self::OP_EQ === $provider->operator; $isProviderNonEqualOp = self::OP_NE === $provider->operator; // '!=' operator is match when other operator is not '==' operator or version is not match // these kinds of comparisons always have a solution if ($isNonEqualOp || $isProviderNonEqualOp) { if ($isNonEqualOp && !$isProviderNonEqualOp && !$isProviderEqualOp && \strpos($provider->version, 'dev-') === 0) { return \false; } if ($isProviderNonEqualOp && !$isNonEqualOp && !$isEqualOp && \strpos($this->version, 'dev-') === 0) { return \false; } if (!$isEqualOp && !$isProviderEqualOp) { return \true; } return $this->versionCompare($provider->version, $this->version, '!=', $compareBranches); } // an example for the condition is <= 2.0 & < 1.0 // these kinds of comparisons always have a solution if ($this->operator !== self::OP_EQ && $noEqualOp === $providerNoEqualOp) { return !(\strpos($this->version, 'dev-') === 0 || \strpos($provider->version, 'dev-') === 0); } $version1 = $isEqualOp ? $this->version : $provider->version; $version2 = $isEqualOp ? $provider->version : $this->version; $operator = $isEqualOp ? $provider->operator : $this->operator; if ($this->versionCompare($version1, $version2, self::$transOpInt[$operator], $compareBranches)) { // special case, e.g. require >= 1.0 and provide < 1.0 // 1.0 >= 1.0 but 1.0 is outside of the provided interval return !(self::$transOpInt[$provider->operator] === $providerNoEqualOp && self::$transOpInt[$this->operator] !== $noEqualOp && \version_compare($provider->version, $this->version, '==')); } return \false; } /** * @return string */ public function __toString() { return self::$transOpInt[$this->operator] . ' ' . $this->version; } /** * {@inheritDoc} */ public function getLowerBound() { $this->extractBounds(); return $this->lowerBound; } /** * {@inheritDoc} */ public function getUpperBound() { $this->extractBounds(); return $this->upperBound; } /** * @return void */ private function extractBounds() { if (null !== $this->lowerBound) { return; } // Branches if (\strpos($this->version, 'dev-') === 0) { $this->lowerBound = Bound::zero(); $this->upperBound = Bound::positiveInfinity(); return; } switch ($this->operator) { case self::OP_EQ: $this->lowerBound = new Bound($this->version, \true); $this->upperBound = new Bound($this->version, \true); break; case self::OP_LT: $this->lowerBound = Bound::zero(); $this->upperBound = new Bound($this->version, \false); break; case self::OP_LE: $this->lowerBound = Bound::zero(); $this->upperBound = new Bound($this->version, \true); break; case self::OP_GT: $this->lowerBound = new Bound($this->version, \false); $this->upperBound = Bound::positiveInfinity(); break; case self::OP_GE: $this->lowerBound = new Bound($this->version, \true); $this->upperBound = Bound::positiveInfinity(); break; case self::OP_NE: $this->lowerBound = Bound::zero(); $this->upperBound = Bound::positiveInfinity(); break; } } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Composer\Semver\Constraint; /** * Defines a conjunctive or disjunctive set of constraints. */ class MultiConstraint implements ConstraintInterface { /** * @var ConstraintInterface[] * @phpstan-var non-empty-array */ protected $constraints; /** @var string|null */ protected $prettyString; /** @var string|null */ protected $string; /** @var bool */ protected $conjunctive; /** @var Bound|null */ protected $lowerBound; /** @var Bound|null */ protected $upperBound; /** * @param ConstraintInterface[] $constraints A set of constraints * @param bool $conjunctive Whether the constraints should be treated as conjunctive or disjunctive * * @throws \InvalidArgumentException If less than 2 constraints are passed */ public function __construct(array $constraints, $conjunctive = \true) { if (\count($constraints) < 2) { throw new \InvalidArgumentException('Must provide at least two constraints for a MultiConstraint. Use ' . 'the regular Constraint class for one constraint only or MatchAllConstraint for none. You may use ' . 'MultiConstraint::create() which optimizes and handles those cases automatically.'); } $this->constraints = $constraints; $this->conjunctive = $conjunctive; } /** * @return ConstraintInterface[] */ public function getConstraints() { return $this->constraints; } /** * @return bool */ public function isConjunctive() { return $this->conjunctive; } /** * @return bool */ public function isDisjunctive() { return !$this->conjunctive; } /** * {@inheritDoc} */ public function compile($otherOperator) { $parts = array(); foreach ($this->constraints as $constraint) { $code = $constraint->compile($otherOperator); if ($code === 'true') { if (!$this->conjunctive) { return 'true'; } } elseif ($code === 'false') { if ($this->conjunctive) { return 'false'; } } else { $parts[] = '(' . $code . ')'; } } if (!$parts) { return $this->conjunctive ? 'true' : 'false'; } return $this->conjunctive ? \implode('&&', $parts) : \implode('||', $parts); } /** * @param ConstraintInterface $provider * * @return bool */ public function matches(ConstraintInterface $provider) { if (\false === $this->conjunctive) { foreach ($this->constraints as $constraint) { if ($provider->matches($constraint)) { return \true; } } return \false; } // when matching a conjunctive and a disjunctive multi constraint we have to iterate over the disjunctive one // otherwise we'd return true if different parts of the disjunctive constraint match the conjunctive one // which would lead to incorrect results, e.g. [>1 and <2] would match [<1 or >2] although they do not intersect if ($provider instanceof MultiConstraint && $provider->isDisjunctive()) { return $provider->matches($this); } foreach ($this->constraints as $constraint) { if (!$provider->matches($constraint)) { return \false; } } return \true; } /** * {@inheritDoc} */ public function setPrettyString($prettyString) { $this->prettyString = $prettyString; } /** * {@inheritDoc} */ public function getPrettyString() { if ($this->prettyString) { return $this->prettyString; } return (string) $this; } /** * {@inheritDoc} */ public function __toString() { if ($this->string !== null) { return $this->string; } $constraints = array(); foreach ($this->constraints as $constraint) { $constraints[] = (string) $constraint; } return $this->string = '[' . \implode($this->conjunctive ? ' ' : ' || ', $constraints) . ']'; } /** * {@inheritDoc} */ public function getLowerBound() { $this->extractBounds(); if (null === $this->lowerBound) { throw new \LogicException('extractBounds should have populated the lowerBound property'); } return $this->lowerBound; } /** * {@inheritDoc} */ public function getUpperBound() { $this->extractBounds(); if (null === $this->upperBound) { throw new \LogicException('extractBounds should have populated the upperBound property'); } return $this->upperBound; } /** * Tries to optimize the constraints as much as possible, meaning * reducing/collapsing congruent constraints etc. * Does not necessarily return a MultiConstraint instance if * things can be reduced to a simple constraint * * @param ConstraintInterface[] $constraints A set of constraints * @param bool $conjunctive Whether the constraints should be treated as conjunctive or disjunctive * * @return ConstraintInterface */ public static function create(array $constraints, $conjunctive = \true) { if (0 === \count($constraints)) { return new MatchAllConstraint(); } if (1 === \count($constraints)) { return $constraints[0]; } $optimized = self::optimizeConstraints($constraints, $conjunctive); if ($optimized !== null) { list($constraints, $conjunctive) = $optimized; if (\count($constraints) === 1) { return $constraints[0]; } } return new self($constraints, $conjunctive); } /** * @param ConstraintInterface[] $constraints * @param bool $conjunctive * @return ?array * * @phpstan-return array{0: list, 1: bool}|null */ private static function optimizeConstraints(array $constraints, $conjunctive) { // parse the two OR groups and if they are contiguous we collapse // them into one constraint // [>= 1 < 2] || [>= 2 < 3] || [>= 3 < 4] => [>= 1 < 4] if (!$conjunctive) { $left = $constraints[0]; $mergedConstraints = array(); $optimized = \false; for ($i = 1, $l = \count($constraints); $i < $l; $i++) { $right = $constraints[$i]; if ($left instanceof self && $left->conjunctive && $right instanceof self && $right->conjunctive && \count($left->constraints) === 2 && \count($right->constraints) === 2 && ($left0 = (string) $left->constraints[0]) && $left0[0] === '>' && $left0[1] === '=' && ($left1 = (string) $left->constraints[1]) && $left1[0] === '<' && ($right0 = (string) $right->constraints[0]) && $right0[0] === '>' && $right0[1] === '=' && ($right1 = (string) $right->constraints[1]) && $right1[0] === '<' && \substr($left1, 2) === \substr($right0, 3)) { $optimized = \true; $left = new MultiConstraint(array($left->constraints[0], $right->constraints[1]), \true); } else { $mergedConstraints[] = $left; $left = $right; } } if ($optimized) { $mergedConstraints[] = $left; return array($mergedConstraints, \false); } } // TODO: Here's the place to put more optimizations return null; } /** * @return void */ private function extractBounds() { if (null !== $this->lowerBound) { return; } foreach ($this->constraints as $constraint) { if (null === $this->lowerBound || null === $this->upperBound) { $this->lowerBound = $constraint->getLowerBound(); $this->upperBound = $constraint->getUpperBound(); continue; } if ($constraint->getLowerBound()->compareTo($this->lowerBound, $this->isConjunctive() ? '>' : '<')) { $this->lowerBound = $constraint->getLowerBound(); } if ($constraint->getUpperBound()->compareTo($this->upperBound, $this->isConjunctive() ? '<' : '>')) { $this->upperBound = $constraint->getUpperBound(); } } } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Composer\Semver\Constraint; class Bound { /** * @var string */ private $version; /** * @var bool */ private $isInclusive; /** * @param string $version * @param bool $isInclusive */ public function __construct($version, $isInclusive) { $this->version = $version; $this->isInclusive = $isInclusive; } /** * @return string */ public function getVersion() { return $this->version; } /** * @return bool */ public function isInclusive() { return $this->isInclusive; } /** * @return bool */ public function isZero() { return $this->getVersion() === '0.0.0.0-dev' && $this->isInclusive(); } /** * @return bool */ public function isPositiveInfinity() { return $this->getVersion() === \PHP_INT_MAX . '.0.0.0' && !$this->isInclusive(); } /** * Compares a bound to another with a given operator. * * @param Bound $other * @param string $operator * * @return bool */ public function compareTo(Bound $other, $operator) { if (!\in_array($operator, array('<', '>'), \true)) { throw new \InvalidArgumentException('Does not support any other operator other than > or <.'); } // If they are the same it doesn't matter if ($this == $other) { return \false; } $compareResult = \version_compare($this->getVersion(), $other->getVersion()); // Not the same version means we don't need to check if the bounds are inclusive or not if (0 !== $compareResult) { return ('>' === $operator ? 1 : -1) === $compareResult; } // Question we're answering here is "am I higher than $other?" return '>' === $operator ? $other->isInclusive() : !$other->isInclusive(); } public function __toString() { return \sprintf('%s [%s]', $this->getVersion(), $this->isInclusive() ? 'inclusive' : 'exclusive'); } /** * @return self */ public static function zero() { return new Bound('0.0.0.0-dev', \true); } /** * @return self */ public static function positiveInfinity() { return new Bound(\PHP_INT_MAX . '.0.0.0', \false); } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Composer\Semver\Constraint; /** * DO NOT IMPLEMENT this interface. It is only meant for usage as a type hint * in libraries relying on composer/semver but creating your own constraint class * that implements this interface is not a supported use case and will cause the * composer/semver components to return unexpected results. */ interface ConstraintInterface { /** * Checks whether the given constraint intersects in any way with this constraint * * @param ConstraintInterface $provider * * @return bool */ public function matches(ConstraintInterface $provider); /** * Provides a compiled version of the constraint for the given operator * The compiled version must be a PHP expression. * Executor of compile version must provide 2 variables: * - $v = the string version to compare with * - $b = whether or not the version is a non-comparable branch (starts with "dev-") * * @see Constraint::OP_* for the list of available operators. * @example return '!$b && version_compare($v, '1.0', '>')'; * * @param int $otherOperator one Constraint::OP_* * * @return string * * @phpstan-param Constraint::OP_* $otherOperator */ public function compile($otherOperator); /** * @return Bound */ public function getUpperBound(); /** * @return Bound */ public function getLowerBound(); /** * @return string */ public function getPrettyString(); /** * @param string|null $prettyString * * @return void */ public function setPrettyString($prettyString); /** * @return string */ public function __toString(); } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Composer\Semver; use _HumbugBox1cb33d1f20f1\Composer\Semver\Constraint\Constraint; class Comparator { /** * Evaluates the expression: $version1 > $version2. * * @param string $version1 * @param string $version2 * * @return bool */ public static function greaterThan($version1, $version2) { return self::compare($version1, '>', $version2); } /** * Evaluates the expression: $version1 >= $version2. * * @param string $version1 * @param string $version2 * * @return bool */ public static function greaterThanOrEqualTo($version1, $version2) { return self::compare($version1, '>=', $version2); } /** * Evaluates the expression: $version1 < $version2. * * @param string $version1 * @param string $version2 * * @return bool */ public static function lessThan($version1, $version2) { return self::compare($version1, '<', $version2); } /** * Evaluates the expression: $version1 <= $version2. * * @param string $version1 * @param string $version2 * * @return bool */ public static function lessThanOrEqualTo($version1, $version2) { return self::compare($version1, '<=', $version2); } /** * Evaluates the expression: $version1 == $version2. * * @param string $version1 * @param string $version2 * * @return bool */ public static function equalTo($version1, $version2) { return self::compare($version1, '==', $version2); } /** * Evaluates the expression: $version1 != $version2. * * @param string $version1 * @param string $version2 * * @return bool */ public static function notEqualTo($version1, $version2) { return self::compare($version1, '!=', $version2); } /** * Evaluates the expression: $version1 $operator $version2. * * @param string $version1 * @param string $operator * @param string $version2 * * @return bool * * @phpstan-param Constraint::STR_OP_* $operator */ public static function compare($version1, $operator, $version2) { $constraint = new Constraint($operator, $version2); return $constraint->matchSpecific(new Constraint('==', $version1), \true); } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Composer\Semver; use _HumbugBox1cb33d1f20f1\Composer\Semver\Constraint\Constraint; use _HumbugBox1cb33d1f20f1\Composer\Semver\Constraint\ConstraintInterface; /** * Helper class to evaluate constraint by compiling and reusing the code to evaluate */ class CompilingMatcher { /** * @var array * @phpstan-var array */ private static $compiledCheckerCache = array(); /** * @var array * @phpstan-var array */ private static $resultCache = array(); /** @var bool */ private static $enabled; /** * @phpstan-var array */ private static $transOpInt = array(Constraint::OP_EQ => Constraint::STR_OP_EQ, Constraint::OP_LT => Constraint::STR_OP_LT, Constraint::OP_LE => Constraint::STR_OP_LE, Constraint::OP_GT => Constraint::STR_OP_GT, Constraint::OP_GE => Constraint::STR_OP_GE, Constraint::OP_NE => Constraint::STR_OP_NE); /** * Clears the memoization cache once you are done * * @return void */ public static function clear() { self::$resultCache = array(); self::$compiledCheckerCache = array(); } /** * Evaluates the expression: $constraint match $operator $version * * @param ConstraintInterface $constraint * @param int $operator * @phpstan-param Constraint::OP_* $operator * @param string $version * * @return mixed */ public static function match(ConstraintInterface $constraint, $operator, $version) { $resultCacheKey = $operator . $constraint . ';' . $version; if (isset(self::$resultCache[$resultCacheKey])) { return self::$resultCache[$resultCacheKey]; } if (self::$enabled === null) { self::$enabled = !\in_array('eval', \explode(',', (string) \ini_get('disable_functions')), \true); } if (!self::$enabled) { return self::$resultCache[$resultCacheKey] = $constraint->matches(new Constraint(self::$transOpInt[$operator], $version)); } $cacheKey = $operator . $constraint; if (!isset(self::$compiledCheckerCache[$cacheKey])) { $code = $constraint->compile($operator); self::$compiledCheckerCache[$cacheKey] = $function = eval('return function($v, $b){return ' . $code . ';};'); } else { $function = self::$compiledCheckerCache[$cacheKey]; } return self::$resultCache[$resultCacheKey] = $function($version, \strpos($version, 'dev-') === 0); } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Composer\Semver; use _HumbugBox1cb33d1f20f1\Composer\Semver\Constraint\Constraint; class Interval { /** @var Constraint */ private $start; /** @var Constraint */ private $end; public function __construct(Constraint $start, Constraint $end) { $this->start = $start; $this->end = $end; } /** * @return Constraint */ public function getStart() { return $this->start; } /** * @return Constraint */ public function getEnd() { return $this->end; } /** * @return Constraint */ public static function fromZero() { static $zero; if (null === $zero) { $zero = new Constraint('>=', '0.0.0.0-dev'); } return $zero; } /** * @return Constraint */ public static function untilPositiveInfinity() { static $positiveInfinity; if (null === $positiveInfinity) { $positiveInfinity = new Constraint('<', \PHP_INT_MAX . '.0.0.0'); } return $positiveInfinity; } /** * @return self */ public static function any() { return new self(self::fromZero(), self::untilPositiveInfinity()); } /** * @return array{'names': string[], 'exclude': bool} */ public static function anyDev() { // any == exclude nothing return array('names' => array(), 'exclude' => \true); } /** * @return array{'names': string[], 'exclude': bool} */ public static function noDev() { // nothing == no names included return array('names' => array(), 'exclude' => \false); } } Copyright (C) 2015 Composer 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. * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Composer; use Composer\Autoload\ClassLoader; use _HumbugBox1cb33d1f20f1\Composer\Semver\VersionParser; /** * This class is copied in every Composer installed project and available to all * * See also https://getcomposer.org/doc/07-runtime.md#installed-versions * * To require its presence, you can require `composer-runtime-api ^2.0` * * @final */ class InstalledVersions { /** * @var mixed[]|null * @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array}|array{}|null */ private static $installed; /** * @var bool|null */ private static $canGetVendors; /** * @var array[] * @psalm-var array}> */ private static $installedByVendor = array(); /** * Returns a list of all package names which are present, either by being installed, replaced or provided * * @return string[] * @psalm-return list */ public static function getInstalledPackages() { $packages = array(); foreach (self::getInstalled() as $installed) { $packages[] = \array_keys($installed['versions']); } if (1 === \count($packages)) { return $packages[0]; } return \array_keys(\array_flip(\call_user_func_array('array_merge', $packages))); } /** * Returns a list of all package names with a specific type e.g. 'library' * * @param string $type * @return string[] * @psalm-return list */ public static function getInstalledPackagesByType($type) { $packagesByType = array(); foreach (self::getInstalled() as $installed) { foreach ($installed['versions'] as $name => $package) { if (isset($package['type']) && $package['type'] === $type) { $packagesByType[] = $name; } } } return $packagesByType; } /** * Checks whether the given package is installed * * This also returns true if the package name is provided or replaced by another package * * @param string $packageName * @param bool $includeDevRequirements * @return bool */ public static function isInstalled($packageName, $includeDevRequirements = \true) { foreach (self::getInstalled() as $installed) { if (isset($installed['versions'][$packageName])) { return $includeDevRequirements || empty($installed['versions'][$packageName]['dev_requirement']); } } return \false; } /** * Checks whether the given package satisfies a version constraint * * e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call: * * Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3') * * @param VersionParser $parser Install composer/semver to have access to this class and functionality * @param string $packageName * @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package * @return bool */ public static function satisfies(VersionParser $parser, $packageName, $constraint) { $constraint = $parser->parseConstraints($constraint); $provided = $parser->parseConstraints(self::getVersionRanges($packageName)); return $provided->matches($constraint); } /** * Returns a version constraint representing all the range(s) which are installed for a given package * * It is easier to use this via isInstalled() with the $constraint argument if you need to check * whether a given version of a package is installed, and not just whether it exists * * @param string $packageName * @return string Version constraint usable with composer/semver */ public static function getVersionRanges($packageName) { foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) { continue; } $ranges = array(); if (isset($installed['versions'][$packageName]['pretty_version'])) { $ranges[] = $installed['versions'][$packageName]['pretty_version']; } if (\array_key_exists('aliases', $installed['versions'][$packageName])) { $ranges = \array_merge($ranges, $installed['versions'][$packageName]['aliases']); } if (\array_key_exists('replaced', $installed['versions'][$packageName])) { $ranges = \array_merge($ranges, $installed['versions'][$packageName]['replaced']); } if (\array_key_exists('provided', $installed['versions'][$packageName])) { $ranges = \array_merge($ranges, $installed['versions'][$packageName]['provided']); } return \implode(' || ', $ranges); } throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); } /** * @param string $packageName * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present */ public static function getVersion($packageName) { foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) { continue; } if (!isset($installed['versions'][$packageName]['version'])) { return null; } return $installed['versions'][$packageName]['version']; } throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); } /** * @param string $packageName * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present */ public static function getPrettyVersion($packageName) { foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) { continue; } if (!isset($installed['versions'][$packageName]['pretty_version'])) { return null; } return $installed['versions'][$packageName]['pretty_version']; } throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); } /** * @param string $packageName * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference */ public static function getReference($packageName) { foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) { continue; } if (!isset($installed['versions'][$packageName]['reference'])) { return null; } return $installed['versions'][$packageName]['reference']; } throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); } /** * @param string $packageName * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path. */ public static function getInstallPath($packageName) { foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) { continue; } return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null; } throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); } /** * @return array * @psalm-return array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool} */ public static function getRootPackage() { $installed = self::getInstalled(); return $installed[0]['root']; } /** * Returns the raw installed.php data for custom implementations * * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect. * @return array[] * @psalm-return array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} */ public static function getRawData() { @\trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', \E_USER_DEPRECATED); if (null === self::$installed) { // only require the installed.php file if this file is loaded from its dumped location, // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 if (\substr(__DIR__, -8, 1) !== 'C') { self::$installed = (include __DIR__ . '/installed.php'); } else { self::$installed = array(); } } return self::$installed; } /** * Returns the raw data of all installed.php which are currently loaded for custom implementations * * @return array[] * @psalm-return list}> */ public static function getAllRawData() { return self::getInstalled(); } /** * Lets you reload the static array from another file * * This is only useful for complex integrations in which a project needs to use * this class but then also needs to execute another project's autoloader in process, * and wants to ensure both projects have access to their version of installed.php. * * A typical case would be PHPUnit, where it would need to make sure it reads all * the data it needs from this class, then call reload() with * `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure * the project in which it runs can then also use this class safely, without * interference between PHPUnit's dependencies and the project's dependencies. * * @param array[] $data A vendor/composer/installed.php data set * @return void * * @psalm-param array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $data */ public static function reload($data) { self::$installed = $data; self::$installedByVendor = array(); } /** * @return array[] * @psalm-return list}> */ private static function getInstalled() { if (null === self::$canGetVendors) { self::$canGetVendors = \method_exists('_HumbugBox1cb33d1f20f1\\Composer\\Autoload\\ClassLoader', 'getRegisteredLoaders'); } $installed = array(); if (self::$canGetVendors) { foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { if (isset(self::$installedByVendor[$vendorDir])) { $installed[] = self::$installedByVendor[$vendorDir]; } elseif (\is_file($vendorDir . '/composer/installed.php')) { $installed[] = self::$installedByVendor[$vendorDir] = (require $vendorDir . '/composer/installed.php'); if (null === self::$installed && \strtr($vendorDir . '/composer', '\\', '/') === \strtr(__DIR__, '\\', '/')) { self::$installed = $installed[\count($installed) - 1]; } } } } if (null === self::$installed) { // only require the installed.php file if this file is loaded from its dumped location, // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 if (\substr(__DIR__, -8, 1) !== 'C') { self::$installed = (require __DIR__ . '/installed.php'); } else { self::$installed = array(); } } $installed[] = self::$installed; return $installed; } } = 70400)) { $issues[] = 'Your Composer dependencies require a PHP version ">= 7.4.0". You are running ' . PHP_VERSION . '.'; } $missingExtensions = array(); extension_loaded('dom') || $missingExtensions[] = 'dom'; extension_loaded('filter') || $missingExtensions[] = 'filter'; extension_loaded('json') || $missingExtensions[] = 'json'; extension_loaded('libxml') || $missingExtensions[] = 'libxml'; extension_loaded('pcre') || $missingExtensions[] = 'pcre'; extension_loaded('reflection') || $missingExtensions[] = 'reflection'; extension_loaded('simplexml') || $missingExtensions[] = 'simplexml'; extension_loaded('spl') || $missingExtensions[] = 'spl'; extension_loaded('tokenizer') || $missingExtensions[] = 'tokenizer'; if ($missingExtensions) { $issues[] = 'Your Composer dependencies require the following PHP extensions to be installed: ' . implode(', ', $missingExtensions) . '.'; } if ($issues) { if (!headers_sent()) { header('HTTP/1.1 500 Internal Server Error'); } if (!ini_get('display_errors')) { if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') { fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL); } elseif (!headers_sent()) { echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL; } } trigger_error( 'Composer detected issues in your platform: ' . implode(' ', $issues), E_USER_ERROR ); } $node stays as-is * * NodeTraverser::DONT_TRAVERSE_CHILDREN * => Children of $node are not traversed. $node stays as-is * * NodeTraverser::STOP_TRAVERSAL * => Traversal is aborted. $node stays as-is * * otherwise * => $node is set to the return value * * @param Node $node Node * * @return null|int|Node Replacement node (or special return value) */ public function enterNode(Node $node); /** * Called when leaving a node. * * Return value semantics: * * null * => $node stays as-is * * NodeTraverser::REMOVE_NODE * => $node is removed from the parent array * * NodeTraverser::STOP_TRAVERSAL * => Traversal is aborted. $node stays as-is * * array (of Nodes) * => The return value is merged into the parent array (at the position of the $node) * * otherwise * => $node is set to the return value * * @param Node $node Node * * @return null|int|Node|Node[] Replacement node (or special return value) */ public function leaveNode(Node $node); /** * Called once after traversal. * * Return value semantics: * * null: $nodes stays as-is * * otherwise: $nodes is set to the return value * * @param Node[] $nodes Array of nodes * * @return null|Node[] Array of nodes */ public function afterTraverse(array $nodes); } pAttrGroups($node->attrGroups, \true) . $this->pModifiers($node->flags) . ($node->type ? $this->p($node->type) . ' ' : '') . ($node->byRef ? '&' : '') . ($node->variadic ? '...' : '') . $this->p($node->var) . ($node->default ? ' = ' . $this->p($node->default) : ''); } protected function pArg(Node\Arg $node) { return ($node->name ? $node->name->toString() . ': ' : '') . ($node->byRef ? '&' : '') . ($node->unpack ? '...' : '') . $this->p($node->value); } protected function pVariadicPlaceholder(Node\VariadicPlaceholder $node) { return '...'; } protected function pConst(Node\Const_ $node) { return $node->name . ' = ' . $this->p($node->value); } protected function pNullableType(Node\NullableType $node) { return '?' . $this->p($node->type); } protected function pUnionType(Node\UnionType $node) { $types = []; foreach ($node->types as $typeNode) { if ($typeNode instanceof Node\IntersectionType) { $types[] = '(' . $this->p($typeNode) . ')'; continue; } $types[] = $this->p($typeNode); } return \implode('|', $types); } protected function pIntersectionType(Node\IntersectionType $node) { return $this->pImplode($node->types, '&'); } protected function pIdentifier(Node\Identifier $node) { return $node->name; } protected function pVarLikeIdentifier(Node\VarLikeIdentifier $node) { return '$' . $node->name; } protected function pAttribute(Node\Attribute $node) { return $this->p($node->name) . ($node->args ? '(' . $this->pCommaSeparated($node->args) . ')' : ''); } protected function pAttributeGroup(Node\AttributeGroup $node) { return '#[' . $this->pCommaSeparated($node->attrs) . ']'; } // Names protected function pName(Name $node) { return \implode('\\', $node->parts); } protected function pName_FullyQualified(Name\FullyQualified $node) { return '\\' . \implode('\\', $node->parts); } protected function pName_Relative(Name\Relative $node) { return 'namespace\\' . \implode('\\', $node->parts); } // Magic Constants protected function pScalar_MagicConst_Class(MagicConst\Class_ $node) { return '__CLASS__'; } protected function pScalar_MagicConst_Dir(MagicConst\Dir $node) { return '__DIR__'; } protected function pScalar_MagicConst_File(MagicConst\File $node) { return '__FILE__'; } protected function pScalar_MagicConst_Function(MagicConst\Function_ $node) { return '__FUNCTION__'; } protected function pScalar_MagicConst_Line(MagicConst\Line $node) { return '__LINE__'; } protected function pScalar_MagicConst_Method(MagicConst\Method $node) { return '__METHOD__'; } protected function pScalar_MagicConst_Namespace(MagicConst\Namespace_ $node) { return '__NAMESPACE__'; } protected function pScalar_MagicConst_Trait(MagicConst\Trait_ $node) { return '__TRAIT__'; } // Scalars protected function pScalar_String(Scalar\String_ $node) { $kind = $node->getAttribute('kind', Scalar\String_::KIND_SINGLE_QUOTED); switch ($kind) { case Scalar\String_::KIND_NOWDOC: $label = $node->getAttribute('docLabel'); if ($label && !$this->containsEndLabel($node->value, $label)) { if ($node->value === '') { return "<<<'{$label}'\n{$label}" . $this->docStringEndToken; } return "<<<'{$label}'\n{$node->value}\n{$label}" . $this->docStringEndToken; } /* break missing intentionally */ case Scalar\String_::KIND_SINGLE_QUOTED: return $this->pSingleQuotedString($node->value); case Scalar\String_::KIND_HEREDOC: $label = $node->getAttribute('docLabel'); if ($label && !$this->containsEndLabel($node->value, $label)) { if ($node->value === '') { return "<<<{$label}\n{$label}" . $this->docStringEndToken; } $escaped = $this->escapeString($node->value, null); return "<<<{$label}\n" . $escaped . "\n{$label}" . $this->docStringEndToken; } /* break missing intentionally */ case Scalar\String_::KIND_DOUBLE_QUOTED: return '"' . $this->escapeString($node->value, '"') . '"'; } throw new \Exception('Invalid string kind'); } protected function pScalar_Encapsed(Scalar\Encapsed $node) { if ($node->getAttribute('kind') === Scalar\String_::KIND_HEREDOC) { $label = $node->getAttribute('docLabel'); if ($label && !$this->encapsedContainsEndLabel($node->parts, $label)) { if (\count($node->parts) === 1 && $node->parts[0] instanceof Scalar\EncapsedStringPart && $node->parts[0]->value === '') { return "<<<{$label}\n{$label}" . $this->docStringEndToken; } return "<<<{$label}\n" . $this->pEncapsList($node->parts, null) . "\n{$label}" . $this->docStringEndToken; } } return '"' . $this->pEncapsList($node->parts, '"') . '"'; } protected function pScalar_LNumber(Scalar\LNumber $node) { if ($node->value === -\PHP_INT_MAX - 1) { // PHP_INT_MIN cannot be represented as a literal, // because the sign is not part of the literal return '(-' . \PHP_INT_MAX . '-1)'; } $kind = $node->getAttribute('kind', Scalar\LNumber::KIND_DEC); if (Scalar\LNumber::KIND_DEC === $kind) { return (string) $node->value; } if ($node->value < 0) { $sign = '-'; $str = (string) -$node->value; } else { $sign = ''; $str = (string) $node->value; } switch ($kind) { case Scalar\LNumber::KIND_BIN: return $sign . '0b' . \base_convert($str, 10, 2); case Scalar\LNumber::KIND_OCT: return $sign . '0' . \base_convert($str, 10, 8); case Scalar\LNumber::KIND_HEX: return $sign . '0x' . \base_convert($str, 10, 16); } throw new \Exception('Invalid number kind'); } protected function pScalar_DNumber(Scalar\DNumber $node) { if (!\is_finite($node->value)) { if ($node->value === \INF) { return '\\INF'; } elseif ($node->value === -\INF) { return '-\\INF'; } else { return '\\NAN'; } } // Try to find a short full-precision representation $stringValue = \sprintf('%.16G', $node->value); if ($node->value !== (double) $stringValue) { $stringValue = \sprintf('%.17G', $node->value); } // %G is locale dependent and there exists no locale-independent alternative. We don't want // mess with switching locales here, so let's assume that a comma is the only non-standard // decimal separator we may encounter... $stringValue = \str_replace(',', '.', $stringValue); // ensure that number is really printed as float return \preg_match('/^-?[0-9]+$/', $stringValue) ? $stringValue . '.0' : $stringValue; } protected function pScalar_EncapsedStringPart(Scalar\EncapsedStringPart $node) { throw new \LogicException('Cannot directly print EncapsedStringPart'); } // Assignments protected function pExpr_Assign(Expr\Assign $node) { return $this->pInfixOp(Expr\Assign::class, $node->var, ' = ', $node->expr); } protected function pExpr_AssignRef(Expr\AssignRef $node) { return $this->pInfixOp(Expr\AssignRef::class, $node->var, ' =& ', $node->expr); } protected function pExpr_AssignOp_Plus(AssignOp\Plus $node) { return $this->pInfixOp(AssignOp\Plus::class, $node->var, ' += ', $node->expr); } protected function pExpr_AssignOp_Minus(AssignOp\Minus $node) { return $this->pInfixOp(AssignOp\Minus::class, $node->var, ' -= ', $node->expr); } protected function pExpr_AssignOp_Mul(AssignOp\Mul $node) { return $this->pInfixOp(AssignOp\Mul::class, $node->var, ' *= ', $node->expr); } protected function pExpr_AssignOp_Div(AssignOp\Div $node) { return $this->pInfixOp(AssignOp\Div::class, $node->var, ' /= ', $node->expr); } protected function pExpr_AssignOp_Concat(AssignOp\Concat $node) { return $this->pInfixOp(AssignOp\Concat::class, $node->var, ' .= ', $node->expr); } protected function pExpr_AssignOp_Mod(AssignOp\Mod $node) { return $this->pInfixOp(AssignOp\Mod::class, $node->var, ' %= ', $node->expr); } protected function pExpr_AssignOp_BitwiseAnd(AssignOp\BitwiseAnd $node) { return $this->pInfixOp(AssignOp\BitwiseAnd::class, $node->var, ' &= ', $node->expr); } protected function pExpr_AssignOp_BitwiseOr(AssignOp\BitwiseOr $node) { return $this->pInfixOp(AssignOp\BitwiseOr::class, $node->var, ' |= ', $node->expr); } protected function pExpr_AssignOp_BitwiseXor(AssignOp\BitwiseXor $node) { return $this->pInfixOp(AssignOp\BitwiseXor::class, $node->var, ' ^= ', $node->expr); } protected function pExpr_AssignOp_ShiftLeft(AssignOp\ShiftLeft $node) { return $this->pInfixOp(AssignOp\ShiftLeft::class, $node->var, ' <<= ', $node->expr); } protected function pExpr_AssignOp_ShiftRight(AssignOp\ShiftRight $node) { return $this->pInfixOp(AssignOp\ShiftRight::class, $node->var, ' >>= ', $node->expr); } protected function pExpr_AssignOp_Pow(AssignOp\Pow $node) { return $this->pInfixOp(AssignOp\Pow::class, $node->var, ' **= ', $node->expr); } protected function pExpr_AssignOp_Coalesce(AssignOp\Coalesce $node) { return $this->pInfixOp(AssignOp\Coalesce::class, $node->var, ' ??= ', $node->expr); } // Binary expressions protected function pExpr_BinaryOp_Plus(BinaryOp\Plus $node) { return $this->pInfixOp(BinaryOp\Plus::class, $node->left, ' + ', $node->right); } protected function pExpr_BinaryOp_Minus(BinaryOp\Minus $node) { return $this->pInfixOp(BinaryOp\Minus::class, $node->left, ' - ', $node->right); } protected function pExpr_BinaryOp_Mul(BinaryOp\Mul $node) { return $this->pInfixOp(BinaryOp\Mul::class, $node->left, ' * ', $node->right); } protected function pExpr_BinaryOp_Div(BinaryOp\Div $node) { return $this->pInfixOp(BinaryOp\Div::class, $node->left, ' / ', $node->right); } protected function pExpr_BinaryOp_Concat(BinaryOp\Concat $node) { return $this->pInfixOp(BinaryOp\Concat::class, $node->left, ' . ', $node->right); } protected function pExpr_BinaryOp_Mod(BinaryOp\Mod $node) { return $this->pInfixOp(BinaryOp\Mod::class, $node->left, ' % ', $node->right); } protected function pExpr_BinaryOp_BooleanAnd(BinaryOp\BooleanAnd $node) { return $this->pInfixOp(BinaryOp\BooleanAnd::class, $node->left, ' && ', $node->right); } protected function pExpr_BinaryOp_BooleanOr(BinaryOp\BooleanOr $node) { return $this->pInfixOp(BinaryOp\BooleanOr::class, $node->left, ' || ', $node->right); } protected function pExpr_BinaryOp_BitwiseAnd(BinaryOp\BitwiseAnd $node) { return $this->pInfixOp(BinaryOp\BitwiseAnd::class, $node->left, ' & ', $node->right); } protected function pExpr_BinaryOp_BitwiseOr(BinaryOp\BitwiseOr $node) { return $this->pInfixOp(BinaryOp\BitwiseOr::class, $node->left, ' | ', $node->right); } protected function pExpr_BinaryOp_BitwiseXor(BinaryOp\BitwiseXor $node) { return $this->pInfixOp(BinaryOp\BitwiseXor::class, $node->left, ' ^ ', $node->right); } protected function pExpr_BinaryOp_ShiftLeft(BinaryOp\ShiftLeft $node) { return $this->pInfixOp(BinaryOp\ShiftLeft::class, $node->left, ' << ', $node->right); } protected function pExpr_BinaryOp_ShiftRight(BinaryOp\ShiftRight $node) { return $this->pInfixOp(BinaryOp\ShiftRight::class, $node->left, ' >> ', $node->right); } protected function pExpr_BinaryOp_Pow(BinaryOp\Pow $node) { return $this->pInfixOp(BinaryOp\Pow::class, $node->left, ' ** ', $node->right); } protected function pExpr_BinaryOp_LogicalAnd(BinaryOp\LogicalAnd $node) { return $this->pInfixOp(BinaryOp\LogicalAnd::class, $node->left, ' and ', $node->right); } protected function pExpr_BinaryOp_LogicalOr(BinaryOp\LogicalOr $node) { return $this->pInfixOp(BinaryOp\LogicalOr::class, $node->left, ' or ', $node->right); } protected function pExpr_BinaryOp_LogicalXor(BinaryOp\LogicalXor $node) { return $this->pInfixOp(BinaryOp\LogicalXor::class, $node->left, ' xor ', $node->right); } protected function pExpr_BinaryOp_Equal(BinaryOp\Equal $node) { return $this->pInfixOp(BinaryOp\Equal::class, $node->left, ' == ', $node->right); } protected function pExpr_BinaryOp_NotEqual(BinaryOp\NotEqual $node) { return $this->pInfixOp(BinaryOp\NotEqual::class, $node->left, ' != ', $node->right); } protected function pExpr_BinaryOp_Identical(BinaryOp\Identical $node) { return $this->pInfixOp(BinaryOp\Identical::class, $node->left, ' === ', $node->right); } protected function pExpr_BinaryOp_NotIdentical(BinaryOp\NotIdentical $node) { return $this->pInfixOp(BinaryOp\NotIdentical::class, $node->left, ' !== ', $node->right); } protected function pExpr_BinaryOp_Spaceship(BinaryOp\Spaceship $node) { return $this->pInfixOp(BinaryOp\Spaceship::class, $node->left, ' <=> ', $node->right); } protected function pExpr_BinaryOp_Greater(BinaryOp\Greater $node) { return $this->pInfixOp(BinaryOp\Greater::class, $node->left, ' > ', $node->right); } protected function pExpr_BinaryOp_GreaterOrEqual(BinaryOp\GreaterOrEqual $node) { return $this->pInfixOp(BinaryOp\GreaterOrEqual::class, $node->left, ' >= ', $node->right); } protected function pExpr_BinaryOp_Smaller(BinaryOp\Smaller $node) { return $this->pInfixOp(BinaryOp\Smaller::class, $node->left, ' < ', $node->right); } protected function pExpr_BinaryOp_SmallerOrEqual(BinaryOp\SmallerOrEqual $node) { return $this->pInfixOp(BinaryOp\SmallerOrEqual::class, $node->left, ' <= ', $node->right); } protected function pExpr_BinaryOp_Coalesce(BinaryOp\Coalesce $node) { return $this->pInfixOp(BinaryOp\Coalesce::class, $node->left, ' ?? ', $node->right); } protected function pExpr_Instanceof(Expr\Instanceof_ $node) { list($precedence, $associativity) = $this->precedenceMap[Expr\Instanceof_::class]; return $this->pPrec($node->expr, $precedence, $associativity, -1) . ' instanceof ' . $this->pNewVariable($node->class); } // Unary expressions protected function pExpr_BooleanNot(Expr\BooleanNot $node) { return $this->pPrefixOp(Expr\BooleanNot::class, '!', $node->expr); } protected function pExpr_BitwiseNot(Expr\BitwiseNot $node) { return $this->pPrefixOp(Expr\BitwiseNot::class, '~', $node->expr); } protected function pExpr_UnaryMinus(Expr\UnaryMinus $node) { if ($node->expr instanceof Expr\UnaryMinus || $node->expr instanceof Expr\PreDec) { // Enforce -(-$expr) instead of --$expr return '-(' . $this->p($node->expr) . ')'; } return $this->pPrefixOp(Expr\UnaryMinus::class, '-', $node->expr); } protected function pExpr_UnaryPlus(Expr\UnaryPlus $node) { if ($node->expr instanceof Expr\UnaryPlus || $node->expr instanceof Expr\PreInc) { // Enforce +(+$expr) instead of ++$expr return '+(' . $this->p($node->expr) . ')'; } return $this->pPrefixOp(Expr\UnaryPlus::class, '+', $node->expr); } protected function pExpr_PreInc(Expr\PreInc $node) { return $this->pPrefixOp(Expr\PreInc::class, '++', $node->var); } protected function pExpr_PreDec(Expr\PreDec $node) { return $this->pPrefixOp(Expr\PreDec::class, '--', $node->var); } protected function pExpr_PostInc(Expr\PostInc $node) { return $this->pPostfixOp(Expr\PostInc::class, $node->var, '++'); } protected function pExpr_PostDec(Expr\PostDec $node) { return $this->pPostfixOp(Expr\PostDec::class, $node->var, '--'); } protected function pExpr_ErrorSuppress(Expr\ErrorSuppress $node) { return $this->pPrefixOp(Expr\ErrorSuppress::class, '@', $node->expr); } protected function pExpr_YieldFrom(Expr\YieldFrom $node) { return $this->pPrefixOp(Expr\YieldFrom::class, 'yield from ', $node->expr); } protected function pExpr_Print(Expr\Print_ $node) { return $this->pPrefixOp(Expr\Print_::class, 'print ', $node->expr); } // Casts protected function pExpr_Cast_Int(Cast\Int_ $node) { return $this->pPrefixOp(Cast\Int_::class, '(int) ', $node->expr); } protected function pExpr_Cast_Double(Cast\Double $node) { $kind = $node->getAttribute('kind', Cast\Double::KIND_DOUBLE); if ($kind === Cast\Double::KIND_DOUBLE) { $cast = '(double)'; } elseif ($kind === Cast\Double::KIND_FLOAT) { $cast = '(float)'; } elseif ($kind === Cast\Double::KIND_REAL) { $cast = '(real)'; } return $this->pPrefixOp(Cast\Double::class, $cast . ' ', $node->expr); } protected function pExpr_Cast_String(Cast\String_ $node) { return $this->pPrefixOp(Cast\String_::class, '(string) ', $node->expr); } protected function pExpr_Cast_Array(Cast\Array_ $node) { return $this->pPrefixOp(Cast\Array_::class, '(array) ', $node->expr); } protected function pExpr_Cast_Object(Cast\Object_ $node) { return $this->pPrefixOp(Cast\Object_::class, '(object) ', $node->expr); } protected function pExpr_Cast_Bool(Cast\Bool_ $node) { return $this->pPrefixOp(Cast\Bool_::class, '(bool) ', $node->expr); } protected function pExpr_Cast_Unset(Cast\Unset_ $node) { return $this->pPrefixOp(Cast\Unset_::class, '(unset) ', $node->expr); } // Function calls and similar constructs protected function pExpr_FuncCall(Expr\FuncCall $node) { return $this->pCallLhs($node->name) . '(' . $this->pMaybeMultiline($node->args) . ')'; } protected function pExpr_MethodCall(Expr\MethodCall $node) { return $this->pDereferenceLhs($node->var) . '->' . $this->pObjectProperty($node->name) . '(' . $this->pMaybeMultiline($node->args) . ')'; } protected function pExpr_NullsafeMethodCall(Expr\NullsafeMethodCall $node) { return $this->pDereferenceLhs($node->var) . '?->' . $this->pObjectProperty($node->name) . '(' . $this->pMaybeMultiline($node->args) . ')'; } protected function pExpr_StaticCall(Expr\StaticCall $node) { return $this->pDereferenceLhs($node->class) . '::' . ($node->name instanceof Expr ? $node->name instanceof Expr\Variable ? $this->p($node->name) : '{' . $this->p($node->name) . '}' : $node->name) . '(' . $this->pMaybeMultiline($node->args) . ')'; } protected function pExpr_Empty(Expr\Empty_ $node) { return 'empty(' . $this->p($node->expr) . ')'; } protected function pExpr_Isset(Expr\Isset_ $node) { return 'isset(' . $this->pCommaSeparated($node->vars) . ')'; } protected function pExpr_Eval(Expr\Eval_ $node) { return 'eval(' . $this->p($node->expr) . ')'; } protected function pExpr_Include(Expr\Include_ $node) { static $map = [Expr\Include_::TYPE_INCLUDE => 'include', Expr\Include_::TYPE_INCLUDE_ONCE => 'include_once', Expr\Include_::TYPE_REQUIRE => 'require', Expr\Include_::TYPE_REQUIRE_ONCE => 'require_once']; return $map[$node->type] . ' ' . $this->p($node->expr); } protected function pExpr_List(Expr\List_ $node) { return 'list(' . $this->pCommaSeparated($node->items) . ')'; } // Other protected function pExpr_Error(Expr\Error $node) { throw new \LogicException('Cannot pretty-print AST with Error nodes'); } protected function pExpr_Variable(Expr\Variable $node) { if ($node->name instanceof Expr) { return '${' . $this->p($node->name) . '}'; } else { return '$' . $node->name; } } protected function pExpr_Array(Expr\Array_ $node) { $syntax = $node->getAttribute('kind', $this->options['shortArraySyntax'] ? Expr\Array_::KIND_SHORT : Expr\Array_::KIND_LONG); if ($syntax === Expr\Array_::KIND_SHORT) { return '[' . $this->pMaybeMultiline($node->items, \true) . ']'; } else { return 'array(' . $this->pMaybeMultiline($node->items, \true) . ')'; } } protected function pExpr_ArrayItem(Expr\ArrayItem $node) { return (null !== $node->key ? $this->p($node->key) . ' => ' : '') . ($node->byRef ? '&' : '') . ($node->unpack ? '...' : '') . $this->p($node->value); } protected function pExpr_ArrayDimFetch(Expr\ArrayDimFetch $node) { return $this->pDereferenceLhs($node->var) . '[' . (null !== $node->dim ? $this->p($node->dim) : '') . ']'; } protected function pExpr_ConstFetch(Expr\ConstFetch $node) { return $this->p($node->name); } protected function pExpr_ClassConstFetch(Expr\ClassConstFetch $node) { return $this->pDereferenceLhs($node->class) . '::' . $this->p($node->name); } protected function pExpr_PropertyFetch(Expr\PropertyFetch $node) { return $this->pDereferenceLhs($node->var) . '->' . $this->pObjectProperty($node->name); } protected function pExpr_NullsafePropertyFetch(Expr\NullsafePropertyFetch $node) { return $this->pDereferenceLhs($node->var) . '?->' . $this->pObjectProperty($node->name); } protected function pExpr_StaticPropertyFetch(Expr\StaticPropertyFetch $node) { return $this->pDereferenceLhs($node->class) . '::$' . $this->pObjectProperty($node->name); } protected function pExpr_ShellExec(Expr\ShellExec $node) { return '`' . $this->pEncapsList($node->parts, '`') . '`'; } protected function pExpr_Closure(Expr\Closure $node) { return $this->pAttrGroups($node->attrGroups, \true) . ($node->static ? 'static ' : '') . 'function ' . ($node->byRef ? '&' : '') . '(' . $this->pCommaSeparated($node->params) . ')' . (!empty($node->uses) ? ' use(' . $this->pCommaSeparated($node->uses) . ')' : '') . (null !== $node->returnType ? ' : ' . $this->p($node->returnType) : '') . ' {' . $this->pStmts($node->stmts) . $this->nl . '}'; } protected function pExpr_Match(Expr\Match_ $node) { return 'match (' . $this->p($node->cond) . ') {' . $this->pCommaSeparatedMultiline($node->arms, \true) . $this->nl . '}'; } protected function pMatchArm(Node\MatchArm $node) { return ($node->conds ? $this->pCommaSeparated($node->conds) : 'default') . ' => ' . $this->p($node->body); } protected function pExpr_ArrowFunction(Expr\ArrowFunction $node) { return $this->pAttrGroups($node->attrGroups, \true) . ($node->static ? 'static ' : '') . 'fn' . ($node->byRef ? '&' : '') . '(' . $this->pCommaSeparated($node->params) . ')' . (null !== $node->returnType ? ': ' . $this->p($node->returnType) : '') . ' => ' . $this->p($node->expr); } protected function pExpr_ClosureUse(Expr\ClosureUse $node) { return ($node->byRef ? '&' : '') . $this->p($node->var); } protected function pExpr_New(Expr\New_ $node) { if ($node->class instanceof Stmt\Class_) { $args = $node->args ? '(' . $this->pMaybeMultiline($node->args) . ')' : ''; return 'new ' . $this->pClassCommon($node->class, $args); } return 'new ' . $this->pNewVariable($node->class) . '(' . $this->pMaybeMultiline($node->args) . ')'; } protected function pExpr_Clone(Expr\Clone_ $node) { return 'clone ' . $this->p($node->expr); } protected function pExpr_Ternary(Expr\Ternary $node) { // a bit of cheating: we treat the ternary as a binary op where the ?...: part is the operator. // this is okay because the part between ? and : never needs parentheses. return $this->pInfixOp(Expr\Ternary::class, $node->cond, ' ?' . (null !== $node->if ? ' ' . $this->p($node->if) . ' ' : '') . ': ', $node->else); } protected function pExpr_Exit(Expr\Exit_ $node) { $kind = $node->getAttribute('kind', Expr\Exit_::KIND_DIE); return ($kind === Expr\Exit_::KIND_EXIT ? 'exit' : 'die') . (null !== $node->expr ? '(' . $this->p($node->expr) . ')' : ''); } protected function pExpr_Throw(Expr\Throw_ $node) { return 'throw ' . $this->p($node->expr); } protected function pExpr_Yield(Expr\Yield_ $node) { if ($node->value === null) { return 'yield'; } else { // this is a bit ugly, but currently there is no way to detect whether the parentheses are necessary return '(yield ' . ($node->key !== null ? $this->p($node->key) . ' => ' : '') . $this->p($node->value) . ')'; } } // Declarations protected function pStmt_Namespace(Stmt\Namespace_ $node) { if ($this->canUseSemicolonNamespaces) { return 'namespace ' . $this->p($node->name) . ';' . $this->nl . $this->pStmts($node->stmts, \false); } else { return 'namespace' . (null !== $node->name ? ' ' . $this->p($node->name) : '') . ' {' . $this->pStmts($node->stmts) . $this->nl . '}'; } } protected function pStmt_Use(Stmt\Use_ $node) { return 'use ' . $this->pUseType($node->type) . $this->pCommaSeparated($node->uses) . ';'; } protected function pStmt_GroupUse(Stmt\GroupUse $node) { return 'use ' . $this->pUseType($node->type) . $this->pName($node->prefix) . '\\{' . $this->pCommaSeparated($node->uses) . '};'; } protected function pStmt_UseUse(Stmt\UseUse $node) { return $this->pUseType($node->type) . $this->p($node->name) . (null !== $node->alias ? ' as ' . $node->alias : ''); } protected function pUseType($type) { return $type === Stmt\Use_::TYPE_FUNCTION ? 'function ' : ($type === Stmt\Use_::TYPE_CONSTANT ? 'const ' : ''); } protected function pStmt_Interface(Stmt\Interface_ $node) { return $this->pAttrGroups($node->attrGroups) . 'interface ' . $node->name . (!empty($node->extends) ? ' extends ' . $this->pCommaSeparated($node->extends) : '') . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}'; } protected function pStmt_Enum(Stmt\Enum_ $node) { return $this->pAttrGroups($node->attrGroups) . 'enum ' . $node->name . ($node->scalarType ? " : {$node->scalarType}" : '') . (!empty($node->implements) ? ' implements ' . $this->pCommaSeparated($node->implements) : '') . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}'; } protected function pStmt_Class(Stmt\Class_ $node) { return $this->pClassCommon($node, ' ' . $node->name); } protected function pStmt_Trait(Stmt\Trait_ $node) { return $this->pAttrGroups($node->attrGroups) . 'trait ' . $node->name . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}'; } protected function pStmt_EnumCase(Stmt\EnumCase $node) { return $this->pAttrGroups($node->attrGroups) . 'case ' . $node->name . ($node->expr ? ' = ' . $this->p($node->expr) : '') . ';'; } protected function pStmt_TraitUse(Stmt\TraitUse $node) { return 'use ' . $this->pCommaSeparated($node->traits) . (empty($node->adaptations) ? ';' : ' {' . $this->pStmts($node->adaptations) . $this->nl . '}'); } protected function pStmt_TraitUseAdaptation_Precedence(Stmt\TraitUseAdaptation\Precedence $node) { return $this->p($node->trait) . '::' . $node->method . ' insteadof ' . $this->pCommaSeparated($node->insteadof) . ';'; } protected function pStmt_TraitUseAdaptation_Alias(Stmt\TraitUseAdaptation\Alias $node) { return (null !== $node->trait ? $this->p($node->trait) . '::' : '') . $node->method . ' as' . (null !== $node->newModifier ? ' ' . \rtrim($this->pModifiers($node->newModifier), ' ') : '') . (null !== $node->newName ? ' ' . $node->newName : '') . ';'; } protected function pStmt_Property(Stmt\Property $node) { return $this->pAttrGroups($node->attrGroups) . (0 === $node->flags ? 'var ' : $this->pModifiers($node->flags)) . ($node->type ? $this->p($node->type) . ' ' : '') . $this->pCommaSeparated($node->props) . ';'; } protected function pStmt_PropertyProperty(Stmt\PropertyProperty $node) { return '$' . $node->name . (null !== $node->default ? ' = ' . $this->p($node->default) : ''); } protected function pStmt_ClassMethod(Stmt\ClassMethod $node) { return $this->pAttrGroups($node->attrGroups) . $this->pModifiers($node->flags) . 'function ' . ($node->byRef ? '&' : '') . $node->name . '(' . $this->pMaybeMultiline($node->params) . ')' . (null !== $node->returnType ? ' : ' . $this->p($node->returnType) : '') . (null !== $node->stmts ? $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}' : ';'); } protected function pStmt_ClassConst(Stmt\ClassConst $node) { return $this->pAttrGroups($node->attrGroups) . $this->pModifiers($node->flags) . 'const ' . $this->pCommaSeparated($node->consts) . ';'; } protected function pStmt_Function(Stmt\Function_ $node) { return $this->pAttrGroups($node->attrGroups) . 'function ' . ($node->byRef ? '&' : '') . $node->name . '(' . $this->pCommaSeparated($node->params) . ')' . (null !== $node->returnType ? ' : ' . $this->p($node->returnType) : '') . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}'; } protected function pStmt_Const(Stmt\Const_ $node) { return 'const ' . $this->pCommaSeparated($node->consts) . ';'; } protected function pStmt_Declare(Stmt\Declare_ $node) { return 'declare (' . $this->pCommaSeparated($node->declares) . ')' . (null !== $node->stmts ? ' {' . $this->pStmts($node->stmts) . $this->nl . '}' : ';'); } protected function pStmt_DeclareDeclare(Stmt\DeclareDeclare $node) { return $node->key . '=' . $this->p($node->value); } // Control flow protected function pStmt_If(Stmt\If_ $node) { return 'if (' . $this->p($node->cond) . ') {' . $this->pStmts($node->stmts) . $this->nl . '}' . ($node->elseifs ? ' ' . $this->pImplode($node->elseifs, ' ') : '') . (null !== $node->else ? ' ' . $this->p($node->else) : ''); } protected function pStmt_ElseIf(Stmt\ElseIf_ $node) { return 'elseif (' . $this->p($node->cond) . ') {' . $this->pStmts($node->stmts) . $this->nl . '}'; } protected function pStmt_Else(Stmt\Else_ $node) { return 'else {' . $this->pStmts($node->stmts) . $this->nl . '}'; } protected function pStmt_For(Stmt\For_ $node) { return 'for (' . $this->pCommaSeparated($node->init) . ';' . (!empty($node->cond) ? ' ' : '') . $this->pCommaSeparated($node->cond) . ';' . (!empty($node->loop) ? ' ' : '') . $this->pCommaSeparated($node->loop) . ') {' . $this->pStmts($node->stmts) . $this->nl . '}'; } protected function pStmt_Foreach(Stmt\Foreach_ $node) { return 'foreach (' . $this->p($node->expr) . ' as ' . (null !== $node->keyVar ? $this->p($node->keyVar) . ' => ' : '') . ($node->byRef ? '&' : '') . $this->p($node->valueVar) . ') {' . $this->pStmts($node->stmts) . $this->nl . '}'; } protected function pStmt_While(Stmt\While_ $node) { return 'while (' . $this->p($node->cond) . ') {' . $this->pStmts($node->stmts) . $this->nl . '}'; } protected function pStmt_Do(Stmt\Do_ $node) { return 'do {' . $this->pStmts($node->stmts) . $this->nl . '} while (' . $this->p($node->cond) . ');'; } protected function pStmt_Switch(Stmt\Switch_ $node) { return 'switch (' . $this->p($node->cond) . ') {' . $this->pStmts($node->cases) . $this->nl . '}'; } protected function pStmt_Case(Stmt\Case_ $node) { return (null !== $node->cond ? 'case ' . $this->p($node->cond) : 'default') . ':' . $this->pStmts($node->stmts); } protected function pStmt_TryCatch(Stmt\TryCatch $node) { return 'try {' . $this->pStmts($node->stmts) . $this->nl . '}' . ($node->catches ? ' ' . $this->pImplode($node->catches, ' ') : '') . ($node->finally !== null ? ' ' . $this->p($node->finally) : ''); } protected function pStmt_Catch(Stmt\Catch_ $node) { return 'catch (' . $this->pImplode($node->types, '|') . ($node->var !== null ? ' ' . $this->p($node->var) : '') . ') {' . $this->pStmts($node->stmts) . $this->nl . '}'; } protected function pStmt_Finally(Stmt\Finally_ $node) { return 'finally {' . $this->pStmts($node->stmts) . $this->nl . '}'; } protected function pStmt_Break(Stmt\Break_ $node) { return 'break' . ($node->num !== null ? ' ' . $this->p($node->num) : '') . ';'; } protected function pStmt_Continue(Stmt\Continue_ $node) { return 'continue' . ($node->num !== null ? ' ' . $this->p($node->num) : '') . ';'; } protected function pStmt_Return(Stmt\Return_ $node) { return 'return' . (null !== $node->expr ? ' ' . $this->p($node->expr) : '') . ';'; } protected function pStmt_Throw(Stmt\Throw_ $node) { return 'throw ' . $this->p($node->expr) . ';'; } protected function pStmt_Label(Stmt\Label $node) { return $node->name . ':'; } protected function pStmt_Goto(Stmt\Goto_ $node) { return 'goto ' . $node->name . ';'; } // Other protected function pStmt_Expression(Stmt\Expression $node) { return $this->p($node->expr) . ';'; } protected function pStmt_Echo(Stmt\Echo_ $node) { return 'echo ' . $this->pCommaSeparated($node->exprs) . ';'; } protected function pStmt_Static(Stmt\Static_ $node) { return 'static ' . $this->pCommaSeparated($node->vars) . ';'; } protected function pStmt_Global(Stmt\Global_ $node) { return 'global ' . $this->pCommaSeparated($node->vars) . ';'; } protected function pStmt_StaticVar(Stmt\StaticVar $node) { return $this->p($node->var) . (null !== $node->default ? ' = ' . $this->p($node->default) : ''); } protected function pStmt_Unset(Stmt\Unset_ $node) { return 'unset(' . $this->pCommaSeparated($node->vars) . ');'; } protected function pStmt_InlineHTML(Stmt\InlineHTML $node) { $newline = $node->getAttribute('hasLeadingNewline', \true) ? "\n" : ''; return '?>' . $newline . $node->value . 'remaining; } protected function pStmt_Nop(Stmt\Nop $node) { return ''; } // Helpers protected function pClassCommon(Stmt\Class_ $node, $afterClassToken) { return $this->pAttrGroups($node->attrGroups, $node->name === null) . $this->pModifiers($node->flags) . 'class' . $afterClassToken . (null !== $node->extends ? ' extends ' . $this->p($node->extends) : '') . (!empty($node->implements) ? ' implements ' . $this->pCommaSeparated($node->implements) : '') . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}'; } protected function pObjectProperty($node) { if ($node instanceof Expr) { return '{' . $this->p($node) . '}'; } else { return $node; } } protected function pEncapsList(array $encapsList, $quote) { $return = ''; foreach ($encapsList as $element) { if ($element instanceof Scalar\EncapsedStringPart) { $return .= $this->escapeString($element->value, $quote); } else { $return .= '{' . $this->p($element) . '}'; } } return $return; } protected function pSingleQuotedString(string $string) { return '\'' . \addcslashes($string, '\'\\') . '\''; } protected function escapeString($string, $quote) { if (null === $quote) { // For doc strings, don't escape newlines $escaped = \addcslashes($string, "\t\f\v\$\\"); } else { $escaped = \addcslashes($string, "\n\r\t\f\v\$" . $quote . "\\"); } // Escape control characters and non-UTF-8 characters. // Regex based on https://stackoverflow.com/a/11709412/385378. $regex = '/( [\\x00-\\x08\\x0E-\\x1F] # Control characters | [\\xC0-\\xC1] # Invalid UTF-8 Bytes | [\\xF5-\\xFF] # Invalid UTF-8 Bytes | \\xE0(?=[\\x80-\\x9F]) # Overlong encoding of prior code point | \\xF0(?=[\\x80-\\x8F]) # Overlong encoding of prior code point | [\\xC2-\\xDF](?![\\x80-\\xBF]) # Invalid UTF-8 Sequence Start | [\\xE0-\\xEF](?![\\x80-\\xBF]{2}) # Invalid UTF-8 Sequence Start | [\\xF0-\\xF4](?![\\x80-\\xBF]{3}) # Invalid UTF-8 Sequence Start | (?<=[\\x00-\\x7F\\xF5-\\xFF])[\\x80-\\xBF] # Invalid UTF-8 Sequence Middle | (? $part) { $atStart = $i === 0; $atEnd = $i === \count($parts) - 1; if ($part instanceof Scalar\EncapsedStringPart && $this->containsEndLabel($part->value, $label, $atStart, $atEnd)) { return \true; } } return \false; } protected function pDereferenceLhs(Node $node) { if (!$this->dereferenceLhsRequiresParens($node)) { return $this->p($node); } else { return '(' . $this->p($node) . ')'; } } protected function pCallLhs(Node $node) { if (!$this->callLhsRequiresParens($node)) { return $this->p($node); } else { return '(' . $this->p($node) . ')'; } } protected function pNewVariable(Node $node) { // TODO: This is not fully accurate. return $this->pDereferenceLhs($node); } /** * @param Node[] $nodes * @return bool */ protected function hasNodeWithComments(array $nodes) { foreach ($nodes as $node) { if ($node && $node->getComments()) { return \true; } } return \false; } protected function pMaybeMultiline(array $nodes, bool $trailingComma = \false) { if (!$this->hasNodeWithComments($nodes)) { return $this->pCommaSeparated($nodes); } else { return $this->pCommaSeparatedMultiline($nodes, $trailingComma) . $this->nl; } } protected function pAttrGroups(array $nodes, bool $inline = \false) : string { $result = ''; $sep = $inline ? ' ' : $this->nl; foreach ($nodes as $node) { $result .= $this->p($node) . $sep; } return $result; } } [aliasName => originalName]] */ protected $aliases = []; /** @var Name[][] Same as $aliases but preserving original case */ protected $origAliases = []; /** @var ErrorHandler Error handler */ protected $errorHandler; /** * Create a name context. * * @param ErrorHandler $errorHandler Error handling used to report errors */ public function __construct(ErrorHandler $errorHandler) { $this->errorHandler = $errorHandler; } /** * Start a new namespace. * * This also resets the alias table. * * @param Name|null $namespace Null is the global namespace */ public function startNamespace(Name $namespace = null) { $this->namespace = $namespace; $this->origAliases = $this->aliases = [Stmt\Use_::TYPE_NORMAL => [], Stmt\Use_::TYPE_FUNCTION => [], Stmt\Use_::TYPE_CONSTANT => []]; } /** * Add an alias / import. * * @param Name $name Original name * @param string $aliasName Aliased name * @param int $type One of Stmt\Use_::TYPE_* * @param array $errorAttrs Attributes to use to report an error */ public function addAlias(Name $name, string $aliasName, int $type, array $errorAttrs = []) { // Constant names are case sensitive, everything else case insensitive if ($type === Stmt\Use_::TYPE_CONSTANT) { $aliasLookupName = $aliasName; } else { $aliasLookupName = \strtolower($aliasName); } if (isset($this->aliases[$type][$aliasLookupName])) { $typeStringMap = [Stmt\Use_::TYPE_NORMAL => '', Stmt\Use_::TYPE_FUNCTION => 'function ', Stmt\Use_::TYPE_CONSTANT => 'const ']; $this->errorHandler->handleError(new Error(\sprintf('Cannot use %s%s as %s because the name is already in use', $typeStringMap[$type], $name, $aliasName), $errorAttrs)); return; } $this->aliases[$type][$aliasLookupName] = $name; $this->origAliases[$type][$aliasName] = $name; } /** * Get current namespace. * * @return null|Name Namespace (or null if global namespace) */ public function getNamespace() { return $this->namespace; } /** * Get resolved name. * * @param Name $name Name to resolve * @param int $type One of Stmt\Use_::TYPE_{FUNCTION|CONSTANT} * * @return null|Name Resolved name, or null if static resolution is not possible */ public function getResolvedName(Name $name, int $type) { // don't resolve special class names if ($type === Stmt\Use_::TYPE_NORMAL && $name->isSpecialClassName()) { if (!$name->isUnqualified()) { $this->errorHandler->handleError(new Error(\sprintf("'\\%s' is an invalid class name", $name->toString()), $name->getAttributes())); } return $name; } // fully qualified names are already resolved if ($name->isFullyQualified()) { return $name; } // Try to resolve aliases if (null !== ($resolvedName = $this->resolveAlias($name, $type))) { return $resolvedName; } if ($type !== Stmt\Use_::TYPE_NORMAL && $name->isUnqualified()) { if (null === $this->namespace) { // outside of a namespace unaliased unqualified is same as fully qualified return new FullyQualified($name, $name->getAttributes()); } // Cannot resolve statically return null; } // if no alias exists prepend current namespace return FullyQualified::concat($this->namespace, $name, $name->getAttributes()); } /** * Get resolved class name. * * @param Name $name Class ame to resolve * * @return Name Resolved name */ public function getResolvedClassName(Name $name) : Name { return $this->getResolvedName($name, Stmt\Use_::TYPE_NORMAL); } /** * Get possible ways of writing a fully qualified name (e.g., by making use of aliases). * * @param string $name Fully-qualified name (without leading namespace separator) * @param int $type One of Stmt\Use_::TYPE_* * * @return Name[] Possible representations of the name */ public function getPossibleNames(string $name, int $type) : array { $lcName = \strtolower($name); if ($type === Stmt\Use_::TYPE_NORMAL) { // self, parent and static must always be unqualified if ($lcName === "self" || $lcName === "parent" || $lcName === "static") { return [new Name($name)]; } } // Collect possible ways to write this name, starting with the fully-qualified name $possibleNames = [new FullyQualified($name)]; if (null !== ($nsRelativeName = $this->getNamespaceRelativeName($name, $lcName, $type))) { // Make sure there is no alias that makes the normally namespace-relative name // into something else if (null === $this->resolveAlias($nsRelativeName, $type)) { $possibleNames[] = $nsRelativeName; } } // Check for relevant namespace use statements foreach ($this->origAliases[Stmt\Use_::TYPE_NORMAL] as $alias => $orig) { $lcOrig = $orig->toLowerString(); if (0 === \strpos($lcName, $lcOrig . '\\')) { $possibleNames[] = new Name($alias . \substr($name, \strlen($lcOrig))); } } // Check for relevant type-specific use statements foreach ($this->origAliases[$type] as $alias => $orig) { if ($type === Stmt\Use_::TYPE_CONSTANT) { // Constants are are complicated-sensitive $normalizedOrig = $this->normalizeConstName($orig->toString()); if ($normalizedOrig === $this->normalizeConstName($name)) { $possibleNames[] = new Name($alias); } } else { // Everything else is case-insensitive if ($orig->toLowerString() === $lcName) { $possibleNames[] = new Name($alias); } } } return $possibleNames; } /** * Get shortest representation of this fully-qualified name. * * @param string $name Fully-qualified name (without leading namespace separator) * @param int $type One of Stmt\Use_::TYPE_* * * @return Name Shortest representation */ public function getShortName(string $name, int $type) : Name { $possibleNames = $this->getPossibleNames($name, $type); // Find shortest name $shortestName = null; $shortestLength = \INF; foreach ($possibleNames as $possibleName) { $length = \strlen($possibleName->toCodeString()); if ($length < $shortestLength) { $shortestName = $possibleName; $shortestLength = $length; } } return $shortestName; } private function resolveAlias(Name $name, $type) { $firstPart = $name->getFirst(); if ($name->isQualified()) { // resolve aliases for qualified names, always against class alias table $checkName = \strtolower($firstPart); if (isset($this->aliases[Stmt\Use_::TYPE_NORMAL][$checkName])) { $alias = $this->aliases[Stmt\Use_::TYPE_NORMAL][$checkName]; return FullyQualified::concat($alias, $name->slice(1), $name->getAttributes()); } } elseif ($name->isUnqualified()) { // constant aliases are case-sensitive, function aliases case-insensitive $checkName = $type === Stmt\Use_::TYPE_CONSTANT ? $firstPart : \strtolower($firstPart); if (isset($this->aliases[$type][$checkName])) { // resolve unqualified aliases return new FullyQualified($this->aliases[$type][$checkName], $name->getAttributes()); } } // No applicable aliases return null; } private function getNamespaceRelativeName(string $name, string $lcName, int $type) { if (null === $this->namespace) { return new Name($name); } if ($type === Stmt\Use_::TYPE_CONSTANT) { // The constants true/false/null always resolve to the global symbols, even inside a // namespace, so they may be used without qualification if ($lcName === "true" || $lcName === "false" || $lcName === "null") { return new Name($name); } } $namespacePrefix = \strtolower($this->namespace . '\\'); if (0 === \strpos($lcName, $namespacePrefix)) { return new Name(\substr($name, \strlen($namespacePrefix))); } return null; } private function normalizeConstName(string $name) { $nsSep = \strrpos($name, '\\'); if (\false === $nsSep) { return $name; } // Constants have case-insensitive namespace and case-sensitive short-name $ns = \substr($name, 0, $nsSep); $shortName = \substr($name, $nsSep + 1); return \strtolower($ns) . '\\' . $shortName; } } attrGroups = $attrGroups; $this->args = $args; $this->extends = $extends; $this->implements = $implements; $this->stmts = $stmts; } public static function fromNewNode(Expr\New_ $newNode) { $class = $newNode->class; \assert($class instanceof Node\Stmt\Class_); // We don't assert that $class->name is null here, to allow consumers to assign unique names // to anonymous classes for their own purposes. We simplify ignore the name here. return new self($class->attrGroups, $newNode->args, $class->extends, $class->implements, $class->stmts, $newNode->getAttributes()); } public function getType() : string { return 'Expr_PrintableNewAnonClass'; } public function getSubNodeNames() : array { return ['attrGroups', 'args', 'extends', 'implements', 'stmts']; } } tokens = $tokens; $this->indentMap = $this->calcIndentMap(); } /** * Whether the given position is immediately surrounded by parenthesis. * * @param int $startPos Start position * @param int $endPos End position * * @return bool */ public function haveParens(int $startPos, int $endPos) : bool { return $this->haveTokenImmediatelyBefore($startPos, '(') && $this->haveTokenImmediatelyAfter($endPos, ')'); } /** * Whether the given position is immediately surrounded by braces. * * @param int $startPos Start position * @param int $endPos End position * * @return bool */ public function haveBraces(int $startPos, int $endPos) : bool { return ($this->haveTokenImmediatelyBefore($startPos, '{') || $this->haveTokenImmediatelyBefore($startPos, \T_CURLY_OPEN)) && $this->haveTokenImmediatelyAfter($endPos, '}'); } /** * Check whether the position is directly preceded by a certain token type. * * During this check whitespace and comments are skipped. * * @param int $pos Position before which the token should occur * @param int|string $expectedTokenType Token to check for * * @return bool Whether the expected token was found */ public function haveTokenImmediatelyBefore(int $pos, $expectedTokenType) : bool { $tokens = $this->tokens; $pos--; for (; $pos >= 0; $pos--) { $tokenType = $tokens[$pos][0]; if ($tokenType === $expectedTokenType) { return \true; } if ($tokenType !== \T_WHITESPACE && $tokenType !== \T_COMMENT && $tokenType !== \T_DOC_COMMENT) { break; } } return \false; } /** * Check whether the position is directly followed by a certain token type. * * During this check whitespace and comments are skipped. * * @param int $pos Position after which the token should occur * @param int|string $expectedTokenType Token to check for * * @return bool Whether the expected token was found */ public function haveTokenImmediatelyAfter(int $pos, $expectedTokenType) : bool { $tokens = $this->tokens; $pos++; for (; $pos < \count($tokens); $pos++) { $tokenType = $tokens[$pos][0]; if ($tokenType === $expectedTokenType) { return \true; } if ($tokenType !== \T_WHITESPACE && $tokenType !== \T_COMMENT && $tokenType !== \T_DOC_COMMENT) { break; } } return \false; } public function skipLeft(int $pos, $skipTokenType) { $tokens = $this->tokens; $pos = $this->skipLeftWhitespace($pos); if ($skipTokenType === \T_WHITESPACE) { return $pos; } if ($tokens[$pos][0] !== $skipTokenType) { // Shouldn't happen. The skip token MUST be there throw new \Exception('Encountered unexpected token'); } $pos--; return $this->skipLeftWhitespace($pos); } public function skipRight(int $pos, $skipTokenType) { $tokens = $this->tokens; $pos = $this->skipRightWhitespace($pos); if ($skipTokenType === \T_WHITESPACE) { return $pos; } if ($tokens[$pos][0] !== $skipTokenType) { // Shouldn't happen. The skip token MUST be there throw new \Exception('Encountered unexpected token'); } $pos++; return $this->skipRightWhitespace($pos); } /** * Return first non-whitespace token position smaller or equal to passed position. * * @param int $pos Token position * @return int Non-whitespace token position */ public function skipLeftWhitespace(int $pos) { $tokens = $this->tokens; for (; $pos >= 0; $pos--) { $type = $tokens[$pos][0]; if ($type !== \T_WHITESPACE && $type !== \T_COMMENT && $type !== \T_DOC_COMMENT) { break; } } return $pos; } /** * Return first non-whitespace position greater or equal to passed position. * * @param int $pos Token position * @return int Non-whitespace token position */ public function skipRightWhitespace(int $pos) { $tokens = $this->tokens; for ($count = \count($tokens); $pos < $count; $pos++) { $type = $tokens[$pos][0]; if ($type !== \T_WHITESPACE && $type !== \T_COMMENT && $type !== \T_DOC_COMMENT) { break; } } return $pos; } public function findRight(int $pos, $findTokenType) { $tokens = $this->tokens; for ($count = \count($tokens); $pos < $count; $pos++) { $type = $tokens[$pos][0]; if ($type === $findTokenType) { return $pos; } } return -1; } /** * Whether the given position range contains a certain token type. * * @param int $startPos Starting position (inclusive) * @param int $endPos Ending position (exclusive) * @param int|string $tokenType Token type to look for * @return bool Whether the token occurs in the given range */ public function haveTokenInRange(int $startPos, int $endPos, $tokenType) { $tokens = $this->tokens; for ($pos = $startPos; $pos < $endPos; $pos++) { if ($tokens[$pos][0] === $tokenType) { return \true; } } return \false; } public function haveBracesInRange(int $startPos, int $endPos) { return $this->haveTokenInRange($startPos, $endPos, '{') || $this->haveTokenInRange($startPos, $endPos, \T_CURLY_OPEN) || $this->haveTokenInRange($startPos, $endPos, '}'); } public function haveTagInRange(int $startPos, int $endPos) : bool { return $this->haveTokenInRange($startPos, $endPos, \T_OPEN_TAG) || $this->haveTokenInRange($startPos, $endPos, \T_CLOSE_TAG); } /** * Get indentation before token position. * * @param int $pos Token position * * @return int Indentation depth (in spaces) */ public function getIndentationBefore(int $pos) : int { return $this->indentMap[$pos]; } /** * Get the code corresponding to a token offset range, optionally adjusted for indentation. * * @param int $from Token start position (inclusive) * @param int $to Token end position (exclusive) * @param int $indent By how much the code should be indented (can be negative as well) * * @return string Code corresponding to token range, adjusted for indentation */ public function getTokenCode(int $from, int $to, int $indent) : string { $tokens = $this->tokens; $result = ''; for ($pos = $from; $pos < $to; $pos++) { $token = $tokens[$pos]; if (\is_array($token)) { $type = $token[0]; $content = $token[1]; if ($type === \T_CONSTANT_ENCAPSED_STRING || $type === \T_ENCAPSED_AND_WHITESPACE) { $result .= $content; } else { // TODO Handle non-space indentation if ($indent < 0) { $result .= \str_replace("\n" . \str_repeat(" ", -$indent), "\n", $content); } elseif ($indent > 0) { $result .= \str_replace("\n", "\n" . \str_repeat(" ", $indent), $content); } else { $result .= $content; } } } else { $result .= $token; } } return $result; } /** * Precalculate the indentation at every token position. * * @return int[] Token position to indentation map */ private function calcIndentMap() { $indentMap = []; $indent = 0; foreach ($this->tokens as $token) { $indentMap[] = $indent; if ($token[0] === \T_WHITESPACE) { $content = $token[1]; $newlinePos = \strrpos($content, "\n"); if (\false !== $newlinePos) { $indent = \strlen($content) - $newlinePos - 1; } } } // Add a sentinel for one past end of the file $indentMap[] = $indent; return $indentMap; } } type = $type; $this->old = $old; $this->new = $new; } } isEqual = $isEqual; } /** * Calculate diff (edit script) from $old to $new. * * @param array $old Original array * @param array $new New array * * @return DiffElem[] Diff (edit script) */ public function diff(array $old, array $new) { list($trace, $x, $y) = $this->calculateTrace($old, $new); return $this->extractDiff($trace, $x, $y, $old, $new); } /** * Calculate diff, including "replace" operations. * * If a sequence of remove operations is followed by the same number of add operations, these * will be coalesced into replace operations. * * @param array $old Original array * @param array $new New array * * @return DiffElem[] Diff (edit script), including replace operations */ public function diffWithReplacements(array $old, array $new) { return $this->coalesceReplacements($this->diff($old, $new)); } private function calculateTrace(array $a, array $b) { $n = \count($a); $m = \count($b); $max = $n + $m; $v = [1 => 0]; $trace = []; for ($d = 0; $d <= $max; $d++) { $trace[] = $v; for ($k = -$d; $k <= $d; $k += 2) { if ($k === -$d || $k !== $d && $v[$k - 1] < $v[$k + 1]) { $x = $v[$k + 1]; } else { $x = $v[$k - 1] + 1; } $y = $x - $k; while ($x < $n && $y < $m && ($this->isEqual)($a[$x], $b[$y])) { $x++; $y++; } $v[$k] = $x; if ($x >= $n && $y >= $m) { return [$trace, $x, $y]; } } } throw new \Exception('Should not happen'); } private function extractDiff(array $trace, int $x, int $y, array $a, array $b) { $result = []; for ($d = \count($trace) - 1; $d >= 0; $d--) { $v = $trace[$d]; $k = $x - $y; if ($k === -$d || $k !== $d && $v[$k - 1] < $v[$k + 1]) { $prevK = $k + 1; } else { $prevK = $k - 1; } $prevX = $v[$prevK]; $prevY = $prevX - $prevK; while ($x > $prevX && $y > $prevY) { $result[] = new DiffElem(DiffElem::TYPE_KEEP, $a[$x - 1], $b[$y - 1]); $x--; $y--; } if ($d === 0) { break; } while ($x > $prevX) { $result[] = new DiffElem(DiffElem::TYPE_REMOVE, $a[$x - 1], null); $x--; } while ($y > $prevY) { $result[] = new DiffElem(DiffElem::TYPE_ADD, null, $b[$y - 1]); $y--; } } return \array_reverse($result); } /** * Coalesce equal-length sequences of remove+add into a replace operation. * * @param DiffElem[] $diff * @return DiffElem[] */ private function coalesceReplacements(array $diff) { $newDiff = []; $c = \count($diff); for ($i = 0; $i < $c; $i++) { $diffType = $diff[$i]->type; if ($diffType !== DiffElem::TYPE_REMOVE) { $newDiff[] = $diff[$i]; continue; } $j = $i; while ($j < $c && $diff[$j]->type === DiffElem::TYPE_REMOVE) { $j++; } $k = $j; while ($k < $c && $diff[$k]->type === DiffElem::TYPE_ADD) { $k++; } if ($j - $i === $k - $j) { $len = $j - $i; for ($n = 0; $n < $len; $n++) { $newDiff[] = new DiffElem(DiffElem::TYPE_REPLACE, $diff[$i + $n]->old, $diff[$j + $n]->new); } } else { for (; $i < $k; $i++) { $newDiff[] = $diff[$i]; } } $i = $k - 1; } return $newDiff; } } addVisitor($visitor); $traverser->traverse($nodes); return $visitor->getFoundNodes(); } /** * Find all nodes that are instances of a certain class. * * @param Node|Node[] $nodes Single node or array of nodes to search in * @param string $class Class name * * @return Node[] Found nodes (all instances of $class) */ public function findInstanceOf($nodes, string $class) : array { return $this->find($nodes, function ($node) use($class) { return $node instanceof $class; }); } /** * Find first node satisfying a filter callback. * * @param Node|Node[] $nodes Single node or array of nodes to search in * @param callable $filter Filter callback: function(Node $node) : bool * * @return null|Node Found node (or null if none found) */ public function findFirst($nodes, callable $filter) { if (!\is_array($nodes)) { $nodes = [$nodes]; } $visitor = new FirstFindingVisitor($filter); $traverser = new NodeTraverser(); $traverser->addVisitor($visitor); $traverser->traverse($nodes); return $visitor->getFoundNode(); } /** * Find first node that is an instance of a certain class. * * @param Node|Node[] $nodes Single node or array of nodes to search in * @param string $class Class name * * @return null|Node Found node, which is an instance of $class (or null if none found) */ public function findFirstInstanceOf($nodes, string $class) { return $this->findFirst($nodes, function ($node) use($class) { return $node instanceof $class; }); } } attributes = $attributes; } /** * Gets line the node started in (alias of getStartLine). * * @return int Start line (or -1 if not available) */ public function getLine() : int { return $this->attributes['startLine'] ?? -1; } /** * Gets line the node started in. * * Requires the 'startLine' attribute to be enabled in the lexer (enabled by default). * * @return int Start line (or -1 if not available) */ public function getStartLine() : int { return $this->attributes['startLine'] ?? -1; } /** * Gets the line the node ended in. * * Requires the 'endLine' attribute to be enabled in the lexer (enabled by default). * * @return int End line (or -1 if not available) */ public function getEndLine() : int { return $this->attributes['endLine'] ?? -1; } /** * Gets the token offset of the first token that is part of this node. * * The offset is an index into the array returned by Lexer::getTokens(). * * Requires the 'startTokenPos' attribute to be enabled in the lexer (DISABLED by default). * * @return int Token start position (or -1 if not available) */ public function getStartTokenPos() : int { return $this->attributes['startTokenPos'] ?? -1; } /** * Gets the token offset of the last token that is part of this node. * * The offset is an index into the array returned by Lexer::getTokens(). * * Requires the 'endTokenPos' attribute to be enabled in the lexer (DISABLED by default). * * @return int Token end position (or -1 if not available) */ public function getEndTokenPos() : int { return $this->attributes['endTokenPos'] ?? -1; } /** * Gets the file offset of the first character that is part of this node. * * Requires the 'startFilePos' attribute to be enabled in the lexer (DISABLED by default). * * @return int File start position (or -1 if not available) */ public function getStartFilePos() : int { return $this->attributes['startFilePos'] ?? -1; } /** * Gets the file offset of the last character that is part of this node. * * Requires the 'endFilePos' attribute to be enabled in the lexer (DISABLED by default). * * @return int File end position (or -1 if not available) */ public function getEndFilePos() : int { return $this->attributes['endFilePos'] ?? -1; } /** * Gets all comments directly preceding this node. * * The comments are also available through the "comments" attribute. * * @return Comment[] */ public function getComments() : array { return $this->attributes['comments'] ?? []; } /** * Gets the doc comment of the node. * * @return null|Comment\Doc Doc comment object or null */ public function getDocComment() { $comments = $this->getComments(); for ($i = \count($comments) - 1; $i >= 0; $i--) { $comment = $comments[$i]; if ($comment instanceof Comment\Doc) { return $comment; } } return null; } /** * Sets the doc comment of the node. * * This will either replace an existing doc comment or add it to the comments array. * * @param Comment\Doc $docComment Doc comment to set */ public function setDocComment(Comment\Doc $docComment) { $comments = $this->getComments(); for ($i = \count($comments) - 1; $i >= 0; $i--) { if ($comments[$i] instanceof Comment\Doc) { // Replace existing doc comment. $comments[$i] = $docComment; $this->setAttribute('comments', $comments); return; } } // Append new doc comment. $comments[] = $docComment; $this->setAttribute('comments', $comments); } public function setAttribute(string $key, $value) { $this->attributes[$key] = $value; } public function hasAttribute(string $key) : bool { return \array_key_exists($key, $this->attributes); } public function getAttribute(string $key, $default = null) { if (\array_key_exists($key, $this->attributes)) { return $this->attributes[$key]; } return $default; } public function getAttributes() : array { return $this->attributes; } public function setAttributes(array $attributes) { $this->attributes = $attributes; } /** * @return array */ public function jsonSerialize() : array { return ['nodeType' => $this->getType()] + \get_object_vars($this); } } defineCompatibilityTokens(); $this->tokenMap = $this->createTokenMap(); $this->identifierTokens = $this->createIdentifierTokenMap(); // map of tokens to drop while lexing (the map is only used for isset lookup, // that's why the value is simply set to 1; the value is never actually used.) $this->dropTokens = \array_fill_keys([\T_WHITESPACE, \T_OPEN_TAG, \T_COMMENT, \T_DOC_COMMENT, \T_BAD_CHARACTER], 1); $defaultAttributes = ['comments', 'startLine', 'endLine']; $usedAttributes = \array_fill_keys($options['usedAttributes'] ?? $defaultAttributes, \true); // Create individual boolean properties to make these checks faster. $this->attributeStartLineUsed = isset($usedAttributes['startLine']); $this->attributeEndLineUsed = isset($usedAttributes['endLine']); $this->attributeStartTokenPosUsed = isset($usedAttributes['startTokenPos']); $this->attributeEndTokenPosUsed = isset($usedAttributes['endTokenPos']); $this->attributeStartFilePosUsed = isset($usedAttributes['startFilePos']); $this->attributeEndFilePosUsed = isset($usedAttributes['endFilePos']); $this->attributeCommentsUsed = isset($usedAttributes['comments']); } /** * Initializes the lexer for lexing the provided source code. * * This function does not throw if lexing errors occur. Instead, errors may be retrieved using * the getErrors() method. * * @param string $code The source code to lex * @param ErrorHandler|null $errorHandler Error handler to use for lexing errors. Defaults to * ErrorHandler\Throwing */ public function startLexing(string $code, ErrorHandler $errorHandler = null) { if (null === $errorHandler) { $errorHandler = new ErrorHandler\Throwing(); } $this->code = $code; // keep the code around for __halt_compiler() handling $this->pos = -1; $this->line = 1; $this->filePos = 0; // If inline HTML occurs without preceding code, treat it as if it had a leading newline. // This ensures proper composability, because having a newline is the "safe" assumption. $this->prevCloseTagHasNewline = \true; $scream = \ini_set('xdebug.scream', '0'); $this->tokens = @\token_get_all($code); $this->postprocessTokens($errorHandler); if (\false !== $scream) { \ini_set('xdebug.scream', $scream); } } private function handleInvalidCharacterRange($start, $end, $line, ErrorHandler $errorHandler) { $tokens = []; for ($i = $start; $i < $end; $i++) { $chr = $this->code[$i]; if ($chr === "\x00") { // PHP cuts error message after null byte, so need special case $errorMsg = 'Unexpected null byte'; } else { $errorMsg = \sprintf('Unexpected character "%s" (ASCII %d)', $chr, \ord($chr)); } $tokens[] = [\T_BAD_CHARACTER, $chr, $line]; $errorHandler->handleError(new Error($errorMsg, ['startLine' => $line, 'endLine' => $line, 'startFilePos' => $i, 'endFilePos' => $i])); } return $tokens; } /** * Check whether comment token is unterminated. * * @return bool */ private function isUnterminatedComment($token) : bool { return ($token[0] === \T_COMMENT || $token[0] === \T_DOC_COMMENT) && \substr($token[1], 0, 2) === '/*' && \substr($token[1], -2) !== '*/'; } protected function postprocessTokens(ErrorHandler $errorHandler) { // PHP's error handling for token_get_all() is rather bad, so if we want detailed // error information we need to compute it ourselves. Invalid character errors are // detected by finding "gaps" in the token array. Unterminated comments are detected // by checking if a trailing comment has a "*/" at the end. // // Additionally, we perform a number of canonicalizations here: // * Use the PHP 8.0 comment format, which does not include trailing whitespace anymore. // * Use PHP 8.0 T_NAME_* tokens. // * Use PHP 8.1 T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG and // T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG tokens used to disambiguate intersection types. $filePos = 0; $line = 1; $numTokens = \count($this->tokens); for ($i = 0; $i < $numTokens; $i++) { $token = $this->tokens[$i]; // Since PHP 7.4 invalid characters are represented by a T_BAD_CHARACTER token. // In this case we only need to emit an error. if ($token[0] === \T_BAD_CHARACTER) { $this->handleInvalidCharacterRange($filePos, $filePos + 1, $line, $errorHandler); } if ($token[0] === \T_COMMENT && \substr($token[1], 0, 2) !== '/*' && \preg_match('/(\\r\\n|\\n|\\r)$/D', $token[1], $matches)) { $trailingNewline = $matches[0]; $token[1] = \substr($token[1], 0, -\strlen($trailingNewline)); $this->tokens[$i] = $token; if (isset($this->tokens[$i + 1]) && $this->tokens[$i + 1][0] === \T_WHITESPACE) { // Move trailing newline into following T_WHITESPACE token, if it already exists. $this->tokens[$i + 1][1] = $trailingNewline . $this->tokens[$i + 1][1]; $this->tokens[$i + 1][2]--; } else { // Otherwise, we need to create a new T_WHITESPACE token. \array_splice($this->tokens, $i + 1, 0, [[\T_WHITESPACE, $trailingNewline, $line]]); $numTokens++; } } // Emulate PHP 8 T_NAME_* tokens, by combining sequences of T_NS_SEPARATOR and T_STRING // into a single token. if (\is_array($token) && ($token[0] === \T_NS_SEPARATOR || isset($this->identifierTokens[$token[0]]))) { $lastWasSeparator = $token[0] === \T_NS_SEPARATOR; $text = $token[1]; for ($j = $i + 1; isset($this->tokens[$j]); $j++) { if ($lastWasSeparator) { if (!isset($this->identifierTokens[$this->tokens[$j][0]])) { break; } $lastWasSeparator = \false; } else { if ($this->tokens[$j][0] !== \T_NS_SEPARATOR) { break; } $lastWasSeparator = \true; } $text .= $this->tokens[$j][1]; } if ($lastWasSeparator) { // Trailing separator is not part of the name. $j--; $text = \substr($text, 0, -1); } if ($j > $i + 1) { if ($token[0] === \T_NS_SEPARATOR) { $type = \T_NAME_FULLY_QUALIFIED; } else { if ($token[0] === \T_NAMESPACE) { $type = \T_NAME_RELATIVE; } else { $type = \T_NAME_QUALIFIED; } } $token = [$type, $text, $line]; \array_splice($this->tokens, $i, $j - $i, [$token]); $numTokens -= $j - $i - 1; } } if ($token === '&') { $next = $i + 1; while (isset($this->tokens[$next]) && $this->tokens[$next][0] === \T_WHITESPACE) { $next++; } $followedByVarOrVarArg = isset($this->tokens[$next]) && ($this->tokens[$next][0] === \T_VARIABLE || $this->tokens[$next][0] === \T_ELLIPSIS); $this->tokens[$i] = $token = [$followedByVarOrVarArg ? \T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG : \T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG, '&', $line]; } $tokenValue = \is_string($token) ? $token : $token[1]; $tokenLen = \strlen($tokenValue); if (\substr($this->code, $filePos, $tokenLen) !== $tokenValue) { // Something is missing, must be an invalid character $nextFilePos = \strpos($this->code, $tokenValue, $filePos); $badCharTokens = $this->handleInvalidCharacterRange($filePos, $nextFilePos, $line, $errorHandler); $filePos = (int) $nextFilePos; \array_splice($this->tokens, $i, 0, $badCharTokens); $numTokens += \count($badCharTokens); $i += \count($badCharTokens); } $filePos += $tokenLen; $line += \substr_count($tokenValue, "\n"); } if ($filePos !== \strlen($this->code)) { if (\substr($this->code, $filePos, 2) === '/*') { // Unlike PHP, HHVM will drop unterminated comments entirely $comment = \substr($this->code, $filePos); $errorHandler->handleError(new Error('Unterminated comment', ['startLine' => $line, 'endLine' => $line + \substr_count($comment, "\n"), 'startFilePos' => $filePos, 'endFilePos' => $filePos + \strlen($comment)])); // Emulate the PHP behavior $isDocComment = isset($comment[3]) && $comment[3] === '*'; $this->tokens[] = [$isDocComment ? \T_DOC_COMMENT : \T_COMMENT, $comment, $line]; } else { // Invalid characters at the end of the input $badCharTokens = $this->handleInvalidCharacterRange($filePos, \strlen($this->code), $line, $errorHandler); $this->tokens = \array_merge($this->tokens, $badCharTokens); } return; } if (\count($this->tokens) > 0) { // Check for unterminated comment $lastToken = $this->tokens[\count($this->tokens) - 1]; if ($this->isUnterminatedComment($lastToken)) { $errorHandler->handleError(new Error('Unterminated comment', ['startLine' => $line - \substr_count($lastToken[1], "\n"), 'endLine' => $line, 'startFilePos' => $filePos - \strlen($lastToken[1]), 'endFilePos' => $filePos])); } } } /** * Fetches the next token. * * The available attributes are determined by the 'usedAttributes' option, which can * be specified in the constructor. The following attributes are supported: * * * 'comments' => Array of PhpParser\Comment or PhpParser\Comment\Doc instances, * representing all comments that occurred between the previous * non-discarded token and the current one. * * 'startLine' => Line in which the node starts. * * 'endLine' => Line in which the node ends. * * 'startTokenPos' => Offset into the token array of the first token in the node. * * 'endTokenPos' => Offset into the token array of the last token in the node. * * 'startFilePos' => Offset into the code string of the first character that is part of the node. * * 'endFilePos' => Offset into the code string of the last character that is part of the node. * * @param mixed $value Variable to store token content in * @param mixed $startAttributes Variable to store start attributes in * @param mixed $endAttributes Variable to store end attributes in * * @return int Token id */ public function getNextToken(&$value = null, &$startAttributes = null, &$endAttributes = null) : int { $startAttributes = []; $endAttributes = []; while (1) { if (isset($this->tokens[++$this->pos])) { $token = $this->tokens[$this->pos]; } else { // EOF token with ID 0 $token = "\x00"; } if ($this->attributeStartLineUsed) { $startAttributes['startLine'] = $this->line; } if ($this->attributeStartTokenPosUsed) { $startAttributes['startTokenPos'] = $this->pos; } if ($this->attributeStartFilePosUsed) { $startAttributes['startFilePos'] = $this->filePos; } if (\is_string($token)) { $value = $token; if (isset($token[1])) { // bug in token_get_all $this->filePos += 2; $id = \ord('"'); } else { $this->filePos += 1; $id = \ord($token); } } elseif (!isset($this->dropTokens[$token[0]])) { $value = $token[1]; $id = $this->tokenMap[$token[0]]; if (\T_CLOSE_TAG === $token[0]) { $this->prevCloseTagHasNewline = \false !== \strpos($token[1], "\n") || \false !== \strpos($token[1], "\r"); } elseif (\T_INLINE_HTML === $token[0]) { $startAttributes['hasLeadingNewline'] = $this->prevCloseTagHasNewline; } $this->line += \substr_count($value, "\n"); $this->filePos += \strlen($value); } else { $origLine = $this->line; $origFilePos = $this->filePos; $this->line += \substr_count($token[1], "\n"); $this->filePos += \strlen($token[1]); if (\T_COMMENT === $token[0] || \T_DOC_COMMENT === $token[0]) { if ($this->attributeCommentsUsed) { $comment = \T_DOC_COMMENT === $token[0] ? new Comment\Doc($token[1], $origLine, $origFilePos, $this->pos, $this->line, $this->filePos - 1, $this->pos) : new Comment($token[1], $origLine, $origFilePos, $this->pos, $this->line, $this->filePos - 1, $this->pos); $startAttributes['comments'][] = $comment; } } continue; } if ($this->attributeEndLineUsed) { $endAttributes['endLine'] = $this->line; } if ($this->attributeEndTokenPosUsed) { $endAttributes['endTokenPos'] = $this->pos; } if ($this->attributeEndFilePosUsed) { $endAttributes['endFilePos'] = $this->filePos - 1; } return $id; } throw new \RuntimeException('Reached end of lexer loop'); } /** * Returns the token array for current code. * * The token array is in the same format as provided by the * token_get_all() function and does not discard tokens (i.e. * whitespace and comments are included). The token position * attributes are against this token array. * * @return array Array of tokens in token_get_all() format */ public function getTokens() : array { return $this->tokens; } /** * Handles __halt_compiler() by returning the text after it. * * @return string Remaining text */ public function handleHaltCompiler() : string { // text after T_HALT_COMPILER, still including (); $textAfter = \substr($this->code, $this->filePos); // ensure that it is followed by (); // this simplifies the situation, by not allowing any comments // in between of the tokens. if (!\preg_match('~^\\s*\\(\\s*\\)\\s*(?:;|\\?>\\r?\\n?)~', $textAfter, $matches)) { throw new Error('__HALT_COMPILER must be followed by "();"'); } // prevent the lexer from returning any further tokens $this->pos = \count($this->tokens); // return with (); removed return \substr($textAfter, \strlen($matches[0])); } private function defineCompatibilityTokens() { static $compatTokensDefined = \false; if ($compatTokensDefined) { return; } $compatTokens = [ // PHP 7.4 'T_BAD_CHARACTER', 'T_FN', 'T_COALESCE_EQUAL', // PHP 8.0 'T_NAME_QUALIFIED', 'T_NAME_FULLY_QUALIFIED', 'T_NAME_RELATIVE', 'T_MATCH', 'T_NULLSAFE_OBJECT_OPERATOR', 'T_ATTRIBUTE', // PHP 8.1 'T_ENUM', 'T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG', 'T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG', 'T_READONLY', ]; // PHP-Parser might be used together with another library that also emulates some or all // of these tokens. Perform a sanity-check that all already defined tokens have been // assigned a unique ID. $usedTokenIds = []; foreach ($compatTokens as $token) { if (\defined($token)) { $tokenId = \constant($token); $clashingToken = $usedTokenIds[$tokenId] ?? null; if ($clashingToken !== null) { throw new \Error(\sprintf('Token %s has same ID as token %s, ' . 'you may be using a library with broken token emulation', $token, $clashingToken)); } $usedTokenIds[$tokenId] = $token; } } // Now define any tokens that have not yet been emulated. Try to assign IDs from -1 // downwards, but skip any IDs that may already be in use. $newTokenId = -1; foreach ($compatTokens as $token) { if (!\defined($token)) { while (isset($usedTokenIds[$newTokenId])) { $newTokenId--; } \define($token, $newTokenId); $newTokenId--; } } $compatTokensDefined = \true; } /** * Creates the token map. * * The token map maps the PHP internal token identifiers * to the identifiers used by the Parser. Additionally it * maps T_OPEN_TAG_WITH_ECHO to T_ECHO and T_CLOSE_TAG to ';'. * * @return array The token map */ protected function createTokenMap() : array { $tokenMap = []; // 256 is the minimum possible token number, as everything below // it is an ASCII value for ($i = 256; $i < 1000; ++$i) { if (\T_DOUBLE_COLON === $i) { // T_DOUBLE_COLON is equivalent to T_PAAMAYIM_NEKUDOTAYIM $tokenMap[$i] = Tokens::T_PAAMAYIM_NEKUDOTAYIM; } elseif (\T_OPEN_TAG_WITH_ECHO === $i) { // T_OPEN_TAG_WITH_ECHO with dropped T_OPEN_TAG results in T_ECHO $tokenMap[$i] = Tokens::T_ECHO; } elseif (\T_CLOSE_TAG === $i) { // T_CLOSE_TAG is equivalent to ';' $tokenMap[$i] = \ord(';'); } elseif ('UNKNOWN' !== ($name = \token_name($i))) { if ('T_HASHBANG' === $name) { // HHVM uses a special token for #! hashbang lines $tokenMap[$i] = Tokens::T_INLINE_HTML; } elseif (\defined($name = Tokens::class . '::' . $name)) { // Other tokens can be mapped directly $tokenMap[$i] = \constant($name); } } } // HHVM uses a special token for numbers that overflow to double if (\defined('_HumbugBox1cb33d1f20f1\\T_ONUMBER')) { $tokenMap[\_HumbugBox1cb33d1f20f1\T_ONUMBER] = Tokens::T_DNUMBER; } // HHVM also has a separate token for the __COMPILER_HALT_OFFSET__ constant if (\defined('_HumbugBox1cb33d1f20f1\\T_COMPILER_HALT_OFFSET')) { $tokenMap[\_HumbugBox1cb33d1f20f1\T_COMPILER_HALT_OFFSET] = Tokens::T_STRING; } // Assign tokens for which we define compatibility constants, as token_name() does not know them. $tokenMap[\T_FN] = Tokens::T_FN; $tokenMap[\T_COALESCE_EQUAL] = Tokens::T_COALESCE_EQUAL; $tokenMap[\T_NAME_QUALIFIED] = Tokens::T_NAME_QUALIFIED; $tokenMap[\T_NAME_FULLY_QUALIFIED] = Tokens::T_NAME_FULLY_QUALIFIED; $tokenMap[\T_NAME_RELATIVE] = Tokens::T_NAME_RELATIVE; $tokenMap[\T_MATCH] = Tokens::T_MATCH; $tokenMap[\T_NULLSAFE_OBJECT_OPERATOR] = Tokens::T_NULLSAFE_OBJECT_OPERATOR; $tokenMap[\T_ATTRIBUTE] = Tokens::T_ATTRIBUTE; $tokenMap[\T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG] = Tokens::T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG; $tokenMap[\T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG] = Tokens::T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG; $tokenMap[\T_ENUM] = Tokens::T_ENUM; $tokenMap[\T_READONLY] = Tokens::T_READONLY; return $tokenMap; } private function createIdentifierTokenMap() : array { // Based on semi_reserved production. return \array_fill_keys([\T_STRING, \T_STATIC, \T_ABSTRACT, \T_FINAL, \T_PRIVATE, \T_PROTECTED, \T_PUBLIC, \T_READONLY, \T_INCLUDE, \T_INCLUDE_ONCE, \T_EVAL, \T_REQUIRE, \T_REQUIRE_ONCE, \T_LOGICAL_OR, \T_LOGICAL_XOR, \T_LOGICAL_AND, \T_INSTANCEOF, \T_NEW, \T_CLONE, \T_EXIT, \T_IF, \T_ELSEIF, \T_ELSE, \T_ENDIF, \T_ECHO, \T_DO, \T_WHILE, \T_ENDWHILE, \T_FOR, \T_ENDFOR, \T_FOREACH, \T_ENDFOREACH, \T_DECLARE, \T_ENDDECLARE, \T_AS, \T_TRY, \T_CATCH, \T_FINALLY, \T_THROW, \T_USE, \T_INSTEADOF, \T_GLOBAL, \T_VAR, \T_UNSET, \T_ISSET, \T_EMPTY, \T_CONTINUE, \T_GOTO, \T_FUNCTION, \T_CONST, \T_RETURN, \T_PRINT, \T_YIELD, \T_LIST, \T_SWITCH, \T_ENDSWITCH, \T_CASE, \T_DEFAULT, \T_BREAK, \T_ARRAY, \T_CALLABLE, \T_EXTENDS, \T_IMPLEMENTS, \T_NAMESPACE, \T_TRAIT, \T_INTERFACE, \T_CLASS, \T_CLASS_C, \T_TRAIT_C, \T_FUNC_C, \T_METHOD_C, \T_LINE, \T_FILE, \T_DIR, \T_NS_C, \T_HALT_COMPILER, \T_FN, \T_MATCH], \true); } } targetPhpVersion = $options['phpVersion'] ?? Emulative::PHP_8_2; unset($options['phpVersion']); parent::__construct($options); $emulators = [new FlexibleDocStringEmulator(), new FnTokenEmulator(), new MatchTokenEmulator(), new CoaleseEqualTokenEmulator(), new NumericLiteralSeparatorEmulator(), new NullsafeTokenEmulator(), new AttributeEmulator(), new EnumTokenEmulator(), new ReadonlyTokenEmulator(), new ExplicitOctalEmulator(), new ReadonlyFunctionTokenEmulator()]; // Collect emulators that are relevant for the PHP version we're running // and the PHP version we're targeting for emulation. foreach ($emulators as $emulator) { $emulatorPhpVersion = $emulator->getPhpVersion(); if ($this->isForwardEmulationNeeded($emulatorPhpVersion)) { $this->emulators[] = $emulator; } else { if ($this->isReverseEmulationNeeded($emulatorPhpVersion)) { $this->emulators[] = new ReverseEmulator($emulator); } } } } public function startLexing(string $code, ErrorHandler $errorHandler = null) { $emulators = \array_filter($this->emulators, function ($emulator) use($code) { return $emulator->isEmulationNeeded($code); }); if (empty($emulators)) { // Nothing to emulate, yay parent::startLexing($code, $errorHandler); return; } $this->patches = []; foreach ($emulators as $emulator) { $code = $emulator->preprocessCode($code, $this->patches); } $collector = new ErrorHandler\Collecting(); parent::startLexing($code, $collector); $this->sortPatches(); $this->fixupTokens(); $errors = $collector->getErrors(); if (!empty($errors)) { $this->fixupErrors($errors); foreach ($errors as $error) { $errorHandler->handleError($error); } } foreach ($emulators as $emulator) { $this->tokens = $emulator->emulate($code, $this->tokens); } } private function isForwardEmulationNeeded(string $emulatorPhpVersion) : bool { return \version_compare(\PHP_VERSION, $emulatorPhpVersion, '<') && \version_compare($this->targetPhpVersion, $emulatorPhpVersion, '>='); } private function isReverseEmulationNeeded(string $emulatorPhpVersion) : bool { return \version_compare(\PHP_VERSION, $emulatorPhpVersion, '>=') && \version_compare($this->targetPhpVersion, $emulatorPhpVersion, '<'); } private function sortPatches() { // Patches may be contributed by different emulators. // Make sure they are sorted by increasing patch position. \usort($this->patches, function ($p1, $p2) { return $p1[0] <=> $p2[0]; }); } private function fixupTokens() { if (\count($this->patches) === 0) { return; } // Load first patch $patchIdx = 0; list($patchPos, $patchType, $patchText) = $this->patches[$patchIdx]; // We use a manual loop over the tokens, because we modify the array on the fly $pos = 0; for ($i = 0, $c = \count($this->tokens); $i < $c; $i++) { $token = $this->tokens[$i]; if (\is_string($token)) { if ($patchPos === $pos) { // Only support replacement for string tokens. \assert($patchType === 'replace'); $this->tokens[$i] = $patchText; // Fetch the next patch $patchIdx++; if ($patchIdx >= \count($this->patches)) { // No more patches, we're done return; } list($patchPos, $patchType, $patchText) = $this->patches[$patchIdx]; } $pos += \strlen($token); continue; } $len = \strlen($token[1]); $posDelta = 0; while ($patchPos >= $pos && $patchPos < $pos + $len) { $patchTextLen = \strlen($patchText); if ($patchType === 'remove') { if ($patchPos === $pos && $patchTextLen === $len) { // Remove token entirely \array_splice($this->tokens, $i, 1, []); $i--; $c--; } else { // Remove from token string $this->tokens[$i][1] = \substr_replace($token[1], '', $patchPos - $pos + $posDelta, $patchTextLen); $posDelta -= $patchTextLen; } } elseif ($patchType === 'add') { // Insert into the token string $this->tokens[$i][1] = \substr_replace($token[1], $patchText, $patchPos - $pos + $posDelta, 0); $posDelta += $patchTextLen; } else { if ($patchType === 'replace') { // Replace inside the token string $this->tokens[$i][1] = \substr_replace($token[1], $patchText, $patchPos - $pos + $posDelta, $patchTextLen); } else { \assert(\false); } } // Fetch the next patch $patchIdx++; if ($patchIdx >= \count($this->patches)) { // No more patches, we're done return; } list($patchPos, $patchType, $patchText) = $this->patches[$patchIdx]; // Multiple patches may apply to the same token. Reload the current one to check // If the new patch applies $token = $this->tokens[$i]; } $pos += $len; } // A patch did not apply \assert(\false); } /** * Fixup line and position information in errors. * * @param Error[] $errors */ private function fixupErrors(array $errors) { foreach ($errors as $error) { $attrs = $error->getAttributes(); $posDelta = 0; $lineDelta = 0; foreach ($this->patches as $patch) { list($patchPos, $patchType, $patchText) = $patch; if ($patchPos >= $attrs['startFilePos']) { // No longer relevant break; } if ($patchType === 'add') { $posDelta += \strlen($patchText); $lineDelta += \substr_count($patchText, "\n"); } else { if ($patchType === 'remove') { $posDelta -= \strlen($patchText); $lineDelta -= \substr_count($patchText, "\n"); } } } $attrs['startFilePos'] += $posDelta; $attrs['endFilePos'] += $posDelta; $attrs['startLine'] += $lineDelta; $attrs['endLine'] += $lineDelta; $error->setAttributes($attrs); } } } \h*)\2(?![a-zA-Z0-9_\x80-\xff])(?(?:;?[\r\n])?)/x REGEX; public function getPhpVersion() : string { return Emulative::PHP_7_3; } public function isEmulationNeeded(string $code) : bool { return \strpos($code, '<<<') !== \false; } public function emulate(string $code, array $tokens) : array { // Handled by preprocessing + fixup. return $tokens; } public function reverseEmulate(string $code, array $tokens) : array { // Not supported. return $tokens; } public function preprocessCode(string $code, array &$patches) : string { if (!\preg_match_all(self::FLEXIBLE_DOC_STRING_REGEX, $code, $matches, \PREG_SET_ORDER | \PREG_OFFSET_CAPTURE)) { // No heredoc/nowdoc found return $code; } // Keep track of how much we need to adjust string offsets due to the modifications we // already made $posDelta = 0; foreach ($matches as $match) { $indentation = $match['indentation'][0]; $indentationStart = $match['indentation'][1]; $separator = $match['separator'][0]; $separatorStart = $match['separator'][1]; if ($indentation === '' && $separator !== '') { // Ordinary heredoc/nowdoc continue; } if ($indentation !== '') { // Remove indentation $indentationLen = \strlen($indentation); $code = \substr_replace($code, '', $indentationStart + $posDelta, $indentationLen); $patches[] = [$indentationStart + $posDelta, 'add', $indentation]; $posDelta -= $indentationLen; } if ($separator === '') { // Insert newline as separator $code = \substr_replace($code, "\n", $separatorStart + $posDelta, 0); $patches[] = [$separatorStart + $posDelta, 'remove', "\n"]; $posDelta += 1; } } return $code; } } emulator = $emulator; } public function getPhpVersion() : string { return $this->emulator->getPhpVersion(); } public function isEmulationNeeded(string $code) : bool { return $this->emulator->isEmulationNeeded($code); } public function emulate(string $code, array $tokens) : array { return $this->emulator->reverseEmulate($code, $tokens); } public function reverseEmulate(string $code, array $tokens) : array { return $this->emulator->emulate($code, $tokens); } public function preprocessCode(string $code, array &$patches) : string { return $code; } } resolveIntegerOrFloatToken($tokens[$i + 1][1]); \array_splice($tokens, $i, 2, [[$tokenKind, '0' . $tokens[$i + 1][1], $tokens[$i][2]]]); $c--; } } return $tokens; } private function resolveIntegerOrFloatToken(string $str) : int { $str = \substr($str, 1); $str = \str_replace('_', '', $str); $num = \octdec($str); return \is_float($num) ? \T_DNUMBER : \T_LNUMBER; } public function reverseEmulate(string $code, array $tokens) : array { // Explicit octals were not legal code previously, don't bother. return $tokens; } } resolveIntegerOrFloatToken($match); $newTokens = [[$tokenKind, $match, $token[2]]]; $numTokens = 1; $len = $tokenLen; while ($matchLen > $len) { $nextToken = $tokens[$i + $numTokens]; $nextTokenText = \is_array($nextToken) ? $nextToken[1] : $nextToken; $nextTokenLen = \strlen($nextTokenText); $numTokens++; if ($matchLen < $len + $nextTokenLen) { // Split trailing characters into a partial token. \assert(\is_array($nextToken), "Partial token should be an array token"); $partialText = \substr($nextTokenText, $matchLen - $len); $newTokens[] = [$nextToken[0], $partialText, $nextToken[2]]; break; } $len += $nextTokenLen; } \array_splice($tokens, $i, $numTokens, $newTokens); $c -= $numTokens - \count($newTokens); $codeOffset += $matchLen; } return $tokens; } private function resolveIntegerOrFloatToken(string $str) : int { $str = \str_replace('_', '', $str); if (\stripos($str, '0b') === 0) { $num = \bindec($str); } elseif (\stripos($str, '0x') === 0) { $num = \hexdec($str); } elseif (\stripos($str, '0') === 0 && \ctype_digit($str)) { $num = \octdec($str); } else { $num = +$str; } return \is_float($num) ? \T_DNUMBER : \T_LNUMBER; } public function reverseEmulate(string $code, array $tokens) : array { // Numeric separators were not legal code previously, don't bother. return $tokens; } } getKeywordString()) !== \false; } protected function isKeywordContext(array $tokens, int $pos) : bool { $previousNonSpaceToken = $this->getPreviousNonSpaceToken($tokens, $pos); return $previousNonSpaceToken === null || $previousNonSpaceToken[0] !== \T_OBJECT_OPERATOR; } public function emulate(string $code, array $tokens) : array { $keywordString = $this->getKeywordString(); foreach ($tokens as $i => $token) { if ($token[0] === \T_STRING && \strtolower($token[1]) === $keywordString && $this->isKeywordContext($tokens, $i)) { $tokens[$i][0] = $this->getKeywordToken(); } } return $tokens; } /** * @param mixed[] $tokens * @return array|string|null */ private function getPreviousNonSpaceToken(array $tokens, int $start) { for ($i = $start - 1; $i >= 0; --$i) { if ($tokens[$i][0] === \T_WHITESPACE) { continue; } return $tokens[$i]; } return null; } public function reverseEmulate(string $code, array $tokens) : array { $keywordToken = $this->getKeywordToken(); foreach ($tokens as $i => $token) { if ($token[0] === $keywordToken) { $tokens[$i][0] = \T_STRING; } } return $tokens; } } ') !== \false; } public function emulate(string $code, array $tokens) : array { // We need to manually iterate and manage a count because we'll change // the tokens array on the way $line = 1; for ($i = 0, $c = \count($tokens); $i < $c; ++$i) { if ($tokens[$i] === '?' && isset($tokens[$i + 1]) && $tokens[$i + 1][0] === \T_OBJECT_OPERATOR) { \array_splice($tokens, $i, 2, [[\T_NULLSAFE_OBJECT_OPERATOR, '?->', $line]]); $c--; continue; } // Handle ?-> inside encapsed string. if ($tokens[$i][0] === \T_ENCAPSED_AND_WHITESPACE && isset($tokens[$i - 1]) && $tokens[$i - 1][0] === \T_VARIABLE && \preg_match('/^\\?->([a-zA-Z_\\x80-\\xff][a-zA-Z0-9_\\x80-\\xff]*)/', $tokens[$i][1], $matches)) { $replacement = [[\T_NULLSAFE_OBJECT_OPERATOR, '?->', $line], [\T_STRING, $matches[1], $line]]; if (\strlen($matches[0]) !== \strlen($tokens[$i][1])) { $replacement[] = [\T_ENCAPSED_AND_WHITESPACE, \substr($tokens[$i][1], \strlen($matches[0])), $line]; } \array_splice($tokens, $i, 1, $replacement); $c += \count($replacement) - 1; continue; } if (\is_array($tokens[$i])) { $line += \substr_count($tokens[$i][1], "\n"); } } return $tokens; } public function reverseEmulate(string $code, array $tokens) : array { // ?-> was not valid code previously, don't bother. return $tokens; } } dumpComments = !empty($options['dumpComments']); $this->dumpPositions = !empty($options['dumpPositions']); } /** * Dumps a node or array. * * @param array|Node $node Node or array to dump * @param string|null $code Code corresponding to dumped AST. This only needs to be passed if * the dumpPositions option is enabled and the dumping of node offsets * is desired. * * @return string Dumped value */ public function dump($node, string $code = null) : string { $this->code = $code; return $this->dumpRecursive($node); } protected function dumpRecursive($node) { if ($node instanceof Node) { $r = $node->getType(); if ($this->dumpPositions && null !== ($p = $this->dumpPosition($node))) { $r .= $p; } $r .= '('; foreach ($node->getSubNodeNames() as $key) { $r .= "\n " . $key . ': '; $value = $node->{$key}; if (null === $value) { $r .= 'null'; } elseif (\false === $value) { $r .= 'false'; } elseif (\true === $value) { $r .= 'true'; } elseif (\is_scalar($value)) { if ('flags' === $key || 'newModifier' === $key) { $r .= $this->dumpFlags($value); } elseif ('type' === $key && $node instanceof Include_) { $r .= $this->dumpIncludeType($value); } elseif ('type' === $key && ($node instanceof Use_ || $node instanceof UseUse || $node instanceof GroupUse)) { $r .= $this->dumpUseType($value); } else { $r .= $value; } } else { $r .= \str_replace("\n", "\n ", $this->dumpRecursive($value)); } } if ($this->dumpComments && ($comments = $node->getComments())) { $r .= "\n comments: " . \str_replace("\n", "\n ", $this->dumpRecursive($comments)); } } elseif (\is_array($node)) { $r = 'array('; foreach ($node as $key => $value) { $r .= "\n " . $key . ': '; if (null === $value) { $r .= 'null'; } elseif (\false === $value) { $r .= 'false'; } elseif (\true === $value) { $r .= 'true'; } elseif (\is_scalar($value)) { $r .= $value; } else { $r .= \str_replace("\n", "\n ", $this->dumpRecursive($value)); } } } elseif ($node instanceof Comment) { return $node->getReformattedText(); } else { throw new \InvalidArgumentException('Can only dump nodes and arrays.'); } return $r . "\n)"; } protected function dumpFlags($flags) { $strs = []; if ($flags & Class_::MODIFIER_PUBLIC) { $strs[] = 'MODIFIER_PUBLIC'; } if ($flags & Class_::MODIFIER_PROTECTED) { $strs[] = 'MODIFIER_PROTECTED'; } if ($flags & Class_::MODIFIER_PRIVATE) { $strs[] = 'MODIFIER_PRIVATE'; } if ($flags & Class_::MODIFIER_ABSTRACT) { $strs[] = 'MODIFIER_ABSTRACT'; } if ($flags & Class_::MODIFIER_STATIC) { $strs[] = 'MODIFIER_STATIC'; } if ($flags & Class_::MODIFIER_FINAL) { $strs[] = 'MODIFIER_FINAL'; } if ($flags & Class_::MODIFIER_READONLY) { $strs[] = 'MODIFIER_READONLY'; } if ($strs) { return \implode(' | ', $strs) . ' (' . $flags . ')'; } else { return $flags; } } protected function dumpIncludeType($type) { $map = [Include_::TYPE_INCLUDE => 'TYPE_INCLUDE', Include_::TYPE_INCLUDE_ONCE => 'TYPE_INCLUDE_ONCE', Include_::TYPE_REQUIRE => 'TYPE_REQUIRE', Include_::TYPE_REQUIRE_ONCE => 'TYPE_REQUIRE_ONCE']; if (!isset($map[$type])) { return $type; } return $map[$type] . ' (' . $type . ')'; } protected function dumpUseType($type) { $map = [Use_::TYPE_UNKNOWN => 'TYPE_UNKNOWN', Use_::TYPE_NORMAL => 'TYPE_NORMAL', Use_::TYPE_FUNCTION => 'TYPE_FUNCTION', Use_::TYPE_CONSTANT => 'TYPE_CONSTANT']; if (!isset($map[$type])) { return $type; } return $map[$type] . ' (' . $type . ')'; } /** * Dump node position, if possible. * * @param Node $node Node for which to dump position * * @return string|null Dump of position, or null if position information not available */ protected function dumpPosition(Node $node) { if (!$node->hasAttribute('startLine') || !$node->hasAttribute('endLine')) { return null; } $start = $node->getStartLine(); $end = $node->getEndLine(); if ($node->hasAttribute('startFilePos') && $node->hasAttribute('endFilePos') && null !== $this->code) { $start .= ':' . $this->toColumn($this->code, $node->getStartFilePos()); $end .= ':' . $this->toColumn($this->code, $node->getEndFilePos()); } return "[{$start} - {$end}]"; } // Copied from Error class private function toColumn($code, $pos) { if ($pos > \strlen($code)) { throw new \RuntimeException('Invalid position information'); } $lineStartPos = \strrpos($code, "\n", $pos - \strlen($code)); if (\false === $lineStartPos) { $lineStartPos = -1; } return $pos - $lineStartPos; } } args($args)); } /** * Creates a namespace builder. * * @param null|string|Node\Name $name Name of the namespace * * @return Builder\Namespace_ The created namespace builder */ public function namespace($name) : Builder\Namespace_ { return new Builder\Namespace_($name); } /** * Creates a class builder. * * @param string $name Name of the class * * @return Builder\Class_ The created class builder */ public function class(string $name) : Builder\Class_ { return new Builder\Class_($name); } /** * Creates an interface builder. * * @param string $name Name of the interface * * @return Builder\Interface_ The created interface builder */ public function interface(string $name) : Builder\Interface_ { return new Builder\Interface_($name); } /** * Creates a trait builder. * * @param string $name Name of the trait * * @return Builder\Trait_ The created trait builder */ public function trait(string $name) : Builder\Trait_ { return new Builder\Trait_($name); } /** * Creates an enum builder. * * @param string $name Name of the enum * * @return Builder\Enum_ The created enum builder */ public function enum(string $name) : Builder\Enum_ { return new Builder\Enum_($name); } /** * Creates a trait use builder. * * @param Node\Name|string ...$traits Trait names * * @return Builder\TraitUse The create trait use builder */ public function useTrait(...$traits) : Builder\TraitUse { return new Builder\TraitUse(...$traits); } /** * Creates a trait use adaptation builder. * * @param Node\Name|string|null $trait Trait name * @param Node\Identifier|string $method Method name * * @return Builder\TraitUseAdaptation The create trait use adaptation builder */ public function traitUseAdaptation($trait, $method = null) : Builder\TraitUseAdaptation { if ($method === null) { $method = $trait; $trait = null; } return new Builder\TraitUseAdaptation($trait, $method); } /** * Creates a method builder. * * @param string $name Name of the method * * @return Builder\Method The created method builder */ public function method(string $name) : Builder\Method { return new Builder\Method($name); } /** * Creates a parameter builder. * * @param string $name Name of the parameter * * @return Builder\Param The created parameter builder */ public function param(string $name) : Builder\Param { return new Builder\Param($name); } /** * Creates a property builder. * * @param string $name Name of the property * * @return Builder\Property The created property builder */ public function property(string $name) : Builder\Property { return new Builder\Property($name); } /** * Creates a function builder. * * @param string $name Name of the function * * @return Builder\Function_ The created function builder */ public function function(string $name) : Builder\Function_ { return new Builder\Function_($name); } /** * Creates a namespace/class use builder. * * @param Node\Name|string $name Name of the entity (namespace or class) to alias * * @return Builder\Use_ The created use builder */ public function use($name) : Builder\Use_ { return new Builder\Use_($name, Use_::TYPE_NORMAL); } /** * Creates a function use builder. * * @param Node\Name|string $name Name of the function to alias * * @return Builder\Use_ The created use function builder */ public function useFunction($name) : Builder\Use_ { return new Builder\Use_($name, Use_::TYPE_FUNCTION); } /** * Creates a constant use builder. * * @param Node\Name|string $name Name of the const to alias * * @return Builder\Use_ The created use const builder */ public function useConst($name) : Builder\Use_ { return new Builder\Use_($name, Use_::TYPE_CONSTANT); } /** * Creates a class constant builder. * * @param string|Identifier $name Name * @param Node\Expr|bool|null|int|float|string|array $value Value * * @return Builder\ClassConst The created use const builder */ public function classConst($name, $value) : Builder\ClassConst { return new Builder\ClassConst($name, $value); } /** * Creates an enum case builder. * * @param string|Identifier $name Name * * @return Builder\EnumCase The created use const builder */ public function enumCase($name) : Builder\EnumCase { return new Builder\EnumCase($name); } /** * Creates node a for a literal value. * * @param Expr|bool|null|int|float|string|array $value $value * * @return Expr */ public function val($value) : Expr { return BuilderHelpers::normalizeValue($value); } /** * Creates variable node. * * @param string|Expr $name Name * * @return Expr\Variable */ public function var($name) : Expr\Variable { if (!\is_string($name) && !$name instanceof Expr) { throw new \LogicException('Variable name must be string or Expr'); } return new Expr\Variable($name); } /** * Normalizes an argument list. * * Creates Arg nodes for all arguments and converts literal values to expressions. * * @param array $args List of arguments to normalize * * @return Arg[] */ public function args(array $args) : array { $normalizedArgs = []; foreach ($args as $key => $arg) { if (!$arg instanceof Arg) { $arg = new Arg(BuilderHelpers::normalizeValue($arg)); } if (\is_string($key)) { $arg->name = BuilderHelpers::normalizeIdentifier($key); } $normalizedArgs[] = $arg; } return $normalizedArgs; } /** * Creates a function call node. * * @param string|Name|Expr $name Function name * @param array $args Function arguments * * @return Expr\FuncCall */ public function funcCall($name, array $args = []) : Expr\FuncCall { return new Expr\FuncCall(BuilderHelpers::normalizeNameOrExpr($name), $this->args($args)); } /** * Creates a method call node. * * @param Expr $var Variable the method is called on * @param string|Identifier|Expr $name Method name * @param array $args Method arguments * * @return Expr\MethodCall */ public function methodCall(Expr $var, $name, array $args = []) : Expr\MethodCall { return new Expr\MethodCall($var, BuilderHelpers::normalizeIdentifierOrExpr($name), $this->args($args)); } /** * Creates a static method call node. * * @param string|Name|Expr $class Class name * @param string|Identifier|Expr $name Method name * @param array $args Method arguments * * @return Expr\StaticCall */ public function staticCall($class, $name, array $args = []) : Expr\StaticCall { return new Expr\StaticCall(BuilderHelpers::normalizeNameOrExpr($class), BuilderHelpers::normalizeIdentifierOrExpr($name), $this->args($args)); } /** * Creates an object creation node. * * @param string|Name|Expr $class Class name * @param array $args Constructor arguments * * @return Expr\New_ */ public function new($class, array $args = []) : Expr\New_ { return new Expr\New_(BuilderHelpers::normalizeNameOrExpr($class), $this->args($args)); } /** * Creates a constant fetch node. * * @param string|Name $name Constant name * * @return Expr\ConstFetch */ public function constFetch($name) : Expr\ConstFetch { return new Expr\ConstFetch(BuilderHelpers::normalizeName($name)); } /** * Creates a property fetch node. * * @param Expr $var Variable holding object * @param string|Identifier|Expr $name Property name * * @return Expr\PropertyFetch */ public function propertyFetch(Expr $var, $name) : Expr\PropertyFetch { return new Expr\PropertyFetch($var, BuilderHelpers::normalizeIdentifierOrExpr($name)); } /** * Creates a class constant fetch node. * * @param string|Name|Expr $class Class name * @param string|Identifier $name Constant name * * @return Expr\ClassConstFetch */ public function classConstFetch($class, $name) : Expr\ClassConstFetch { return new Expr\ClassConstFetch(BuilderHelpers::normalizeNameOrExpr($class), BuilderHelpers::normalizeIdentifier($name)); } /** * Creates nested Concat nodes from a list of expressions. * * @param Expr|string ...$exprs Expressions or literal strings * * @return Concat */ public function concat(...$exprs) : Concat { $numExprs = \count($exprs); if ($numExprs < 2) { throw new \LogicException('Expected at least two expressions'); } $lastConcat = $this->normalizeStringExpr($exprs[0]); for ($i = 1; $i < $numExprs; $i++) { $lastConcat = new Concat($lastConcat, $this->normalizeStringExpr($exprs[$i])); } return $lastConcat; } /** * @param string|Expr $expr * @return Expr */ private function normalizeStringExpr($expr) : Expr { if ($expr instanceof Expr) { return $expr; } if (\is_string($expr)) { return new String_($expr); } throw new \LogicException('Expected string or Expr'); } } name = $name; } /** * Extends a class. * * @param Name|string $class Name of class to extend * * @return $this The builder instance (for fluid interface) */ public function extend($class) { $this->extends = BuilderHelpers::normalizeName($class); return $this; } /** * Implements one or more interfaces. * * @param Name|string ...$interfaces Names of interfaces to implement * * @return $this The builder instance (for fluid interface) */ public function implement(...$interfaces) { foreach ($interfaces as $interface) { $this->implements[] = BuilderHelpers::normalizeName($interface); } return $this; } /** * Makes the class abstract. * * @return $this The builder instance (for fluid interface) */ public function makeAbstract() { $this->flags = BuilderHelpers::addClassModifier($this->flags, Stmt\Class_::MODIFIER_ABSTRACT); return $this; } /** * Makes the class final. * * @return $this The builder instance (for fluid interface) */ public function makeFinal() { $this->flags = BuilderHelpers::addClassModifier($this->flags, Stmt\Class_::MODIFIER_FINAL); return $this; } public function makeReadonly() { $this->flags = BuilderHelpers::addClassModifier($this->flags, Stmt\Class_::MODIFIER_READONLY); return $this; } /** * Adds a statement. * * @param Stmt|PhpParser\Builder $stmt The statement to add * * @return $this The builder instance (for fluid interface) */ public function addStmt($stmt) { $stmt = BuilderHelpers::normalizeNode($stmt); $targets = [Stmt\TraitUse::class => &$this->uses, Stmt\ClassConst::class => &$this->constants, Stmt\Property::class => &$this->properties, Stmt\ClassMethod::class => &$this->methods]; $class = \get_class($stmt); if (!isset($targets[$class])) { throw new \LogicException(\sprintf('Unexpected node of type "%s"', $stmt->getType())); } $targets[$class][] = $stmt; return $this; } /** * Adds an attribute group. * * @param Node\Attribute|Node\AttributeGroup $attribute * * @return $this The builder instance (for fluid interface) */ public function addAttribute($attribute) { $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); return $this; } /** * Returns the built class node. * * @return Stmt\Class_ The built class node */ public function getNode() : PhpParser\Node { return new Stmt\Class_($this->name, ['flags' => $this->flags, 'extends' => $this->extends, 'implements' => $this->implements, 'stmts' => \array_merge($this->uses, $this->constants, $this->properties, $this->methods), 'attrGroups' => $this->attributeGroups], $this->attributes); } } name = $name; } /** * Adds a statement. * * @param Stmt|PhpParser\Builder $stmt The statement to add * * @return $this The builder instance (for fluid interface) */ public function addStmt($stmt) { $stmt = BuilderHelpers::normalizeNode($stmt); if ($stmt instanceof Stmt\Property) { $this->properties[] = $stmt; } elseif ($stmt instanceof Stmt\ClassMethod) { $this->methods[] = $stmt; } elseif ($stmt instanceof Stmt\TraitUse) { $this->uses[] = $stmt; } else { throw new \LogicException(\sprintf('Unexpected node of type "%s"', $stmt->getType())); } return $this; } /** * Adds an attribute group. * * @param Node\Attribute|Node\AttributeGroup $attribute * * @return $this The builder instance (for fluid interface) */ public function addAttribute($attribute) { $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); return $this; } /** * Returns the built trait node. * * @return Stmt\Trait_ The built interface node */ public function getNode() : PhpParser\Node { return new Stmt\Trait_($this->name, ['stmts' => \array_merge($this->uses, $this->properties, $this->methods), 'attrGroups' => $this->attributeGroups], $this->attributes); } } name = BuilderHelpers::normalizeName($name); $this->type = $type; } /** * Sets alias for used name. * * @param string $alias Alias to use (last component of full name by default) * * @return $this The builder instance (for fluid interface) */ public function as(string $alias) { $this->alias = $alias; return $this; } /** * Returns the built node. * * @return Stmt\Use_ The built node */ public function getNode() : Node { return new Stmt\Use_([new Stmt\UseUse($this->name, $this->alias)], $this->type); } } name = $name; } /** * Sets the value. * * @param Node\Expr|string|int $value * * @return $this */ public function setValue($value) { $this->value = BuilderHelpers::normalizeValue($value); return $this; } /** * Sets doc comment for the constant. * * @param PhpParser\Comment\Doc|string $docComment Doc comment to set * * @return $this The builder instance (for fluid interface) */ public function setDocComment($docComment) { $this->attributes = ['comments' => [BuilderHelpers::normalizeDocComment($docComment)]]; return $this; } /** * Adds an attribute group. * * @param Node\Attribute|Node\AttributeGroup $attribute * * @return $this The builder instance (for fluid interface) */ public function addAttribute($attribute) { $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); return $this; } /** * Returns the built enum case node. * * @return Stmt\EnumCase The built constant node */ public function getNode() : PhpParser\Node { return new Stmt\EnumCase($this->name, $this->value, $this->attributeGroups, $this->attributes); } } name = $name; } /** * Extends one or more interfaces. * * @param Name|string ...$interfaces Names of interfaces to extend * * @return $this The builder instance (for fluid interface) */ public function extend(...$interfaces) { foreach ($interfaces as $interface) { $this->extends[] = BuilderHelpers::normalizeName($interface); } return $this; } /** * Adds a statement. * * @param Stmt|PhpParser\Builder $stmt The statement to add * * @return $this The builder instance (for fluid interface) */ public function addStmt($stmt) { $stmt = BuilderHelpers::normalizeNode($stmt); if ($stmt instanceof Stmt\ClassConst) { $this->constants[] = $stmt; } elseif ($stmt instanceof Stmt\ClassMethod) { // we erase all statements in the body of an interface method $stmt->stmts = null; $this->methods[] = $stmt; } else { throw new \LogicException(\sprintf('Unexpected node of type "%s"', $stmt->getType())); } return $this; } /** * Adds an attribute group. * * @param Node\Attribute|Node\AttributeGroup $attribute * * @return $this The builder instance (for fluid interface) */ public function addAttribute($attribute) { $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); return $this; } /** * Returns the built interface node. * * @return Stmt\Interface_ The built interface node */ public function getNode() : PhpParser\Node { return new Stmt\Interface_($this->name, ['extends' => $this->extends, 'stmts' => \array_merge($this->constants, $this->methods), 'attrGroups' => $this->attributeGroups], $this->attributes); } } and($trait); } } /** * Adds used trait. * * @param Node\Name|string $trait Trait name * * @return $this The builder instance (for fluid interface) */ public function and($trait) { $this->traits[] = BuilderHelpers::normalizeName($trait); return $this; } /** * Adds trait adaptation. * * @param Stmt\TraitUseAdaptation|Builder\TraitUseAdaptation $adaptation Trait adaptation * * @return $this The builder instance (for fluid interface) */ public function with($adaptation) { $adaptation = BuilderHelpers::normalizeNode($adaptation); if (!$adaptation instanceof Stmt\TraitUseAdaptation) { throw new \LogicException('Adaptation must have type TraitUseAdaptation'); } $this->adaptations[] = $adaptation; return $this; } /** * Returns the built node. * * @return Node The built node */ public function getNode() : Node { return new Stmt\TraitUse($this->traits, $this->adaptations); } } name = $name; } /** * Sets default value for the parameter. * * @param mixed $value Default value to use * * @return $this The builder instance (for fluid interface) */ public function setDefault($value) { $this->default = BuilderHelpers::normalizeValue($value); return $this; } /** * Sets type for the parameter. * * @param string|Node\Name|Node\Identifier|Node\ComplexType $type Parameter type * * @return $this The builder instance (for fluid interface) */ public function setType($type) { $this->type = BuilderHelpers::normalizeType($type); if ($this->type == 'void') { throw new \LogicException('Parameter type cannot be void'); } return $this; } /** * Sets type for the parameter. * * @param string|Node\Name|Node\Identifier|Node\ComplexType $type Parameter type * * @return $this The builder instance (for fluid interface) * * @deprecated Use setType() instead */ public function setTypeHint($type) { return $this->setType($type); } /** * Make the parameter accept the value by reference. * * @return $this The builder instance (for fluid interface) */ public function makeByRef() { $this->byRef = \true; return $this; } /** * Make the parameter variadic * * @return $this The builder instance (for fluid interface) */ public function makeVariadic() { $this->variadic = \true; return $this; } /** * Adds an attribute group. * * @param Node\Attribute|Node\AttributeGroup $attribute * * @return $this The builder instance (for fluid interface) */ public function addAttribute($attribute) { $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); return $this; } /** * Returns the built parameter node. * * @return Node\Param The built parameter node */ public function getNode() : Node { return new Node\Param(new Node\Expr\Variable($this->name), $this->default, $this->type, $this->byRef, $this->variadic, [], 0, $this->attributeGroups); } } name = $name; } /** * Adds a statement. * * @param Node|PhpParser\Builder $stmt The statement to add * * @return $this The builder instance (for fluid interface) */ public function addStmt($stmt) { $this->stmts[] = BuilderHelpers::normalizeStmt($stmt); return $this; } /** * Adds an attribute group. * * @param Node\Attribute|Node\AttributeGroup $attribute * * @return $this The builder instance (for fluid interface) */ public function addAttribute($attribute) { $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); return $this; } /** * Returns the built function node. * * @return Stmt\Function_ The built function node */ public function getNode() : Node { return new Stmt\Function_($this->name, ['byRef' => $this->returnByRef, 'params' => $this->params, 'returnType' => $this->returnType, 'stmts' => $this->stmts, 'attrGroups' => $this->attributeGroups], $this->attributes); } } name = $name; } /** * Makes the method public. * * @return $this The builder instance (for fluid interface) */ public function makePublic() { $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PUBLIC); return $this; } /** * Makes the method protected. * * @return $this The builder instance (for fluid interface) */ public function makeProtected() { $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PROTECTED); return $this; } /** * Makes the method private. * * @return $this The builder instance (for fluid interface) */ public function makePrivate() { $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PRIVATE); return $this; } /** * Makes the method static. * * @return $this The builder instance (for fluid interface) */ public function makeStatic() { $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_STATIC); return $this; } /** * Makes the method abstract. * * @return $this The builder instance (for fluid interface) */ public function makeAbstract() { if (!empty($this->stmts)) { throw new \LogicException('Cannot make method with statements abstract'); } $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_ABSTRACT); $this->stmts = null; // abstract methods don't have statements return $this; } /** * Makes the method final. * * @return $this The builder instance (for fluid interface) */ public function makeFinal() { $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_FINAL); return $this; } /** * Adds a statement. * * @param Node|PhpParser\Builder $stmt The statement to add * * @return $this The builder instance (for fluid interface) */ public function addStmt($stmt) { if (null === $this->stmts) { throw new \LogicException('Cannot add statements to an abstract method'); } $this->stmts[] = BuilderHelpers::normalizeStmt($stmt); return $this; } /** * Adds an attribute group. * * @param Node\Attribute|Node\AttributeGroup $attribute * * @return $this The builder instance (for fluid interface) */ public function addAttribute($attribute) { $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); return $this; } /** * Returns the built method node. * * @return Stmt\ClassMethod The built method node */ public function getNode() : Node { return new Stmt\ClassMethod($this->name, ['flags' => $this->flags, 'byRef' => $this->returnByRef, 'params' => $this->params, 'returnType' => $this->returnType, 'stmts' => $this->stmts, 'attrGroups' => $this->attributeGroups], $this->attributes); } } name = $name; } /** * Makes the property public. * * @return $this The builder instance (for fluid interface) */ public function makePublic() { $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PUBLIC); return $this; } /** * Makes the property protected. * * @return $this The builder instance (for fluid interface) */ public function makeProtected() { $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PROTECTED); return $this; } /** * Makes the property private. * * @return $this The builder instance (for fluid interface) */ public function makePrivate() { $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PRIVATE); return $this; } /** * Makes the property static. * * @return $this The builder instance (for fluid interface) */ public function makeStatic() { $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_STATIC); return $this; } /** * Makes the property readonly. * * @return $this The builder instance (for fluid interface) */ public function makeReadonly() { $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_READONLY); return $this; } /** * Sets default value for the property. * * @param mixed $value Default value to use * * @return $this The builder instance (for fluid interface) */ public function setDefault($value) { $this->default = BuilderHelpers::normalizeValue($value); return $this; } /** * Sets doc comment for the property. * * @param PhpParser\Comment\Doc|string $docComment Doc comment to set * * @return $this The builder instance (for fluid interface) */ public function setDocComment($docComment) { $this->attributes = ['comments' => [BuilderHelpers::normalizeDocComment($docComment)]]; return $this; } /** * Sets the property type for PHP 7.4+. * * @param string|Name|Identifier|ComplexType $type * * @return $this */ public function setType($type) { $this->type = BuilderHelpers::normalizeType($type); return $this; } /** * Adds an attribute group. * * @param Node\Attribute|Node\AttributeGroup $attribute * * @return $this The builder instance (for fluid interface) */ public function addAttribute($attribute) { $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); return $this; } /** * Returns the built class node. * * @return Stmt\Property The built property node */ public function getNode() : PhpParser\Node { return new Stmt\Property($this->flags !== 0 ? $this->flags : Stmt\Class_::MODIFIER_PUBLIC, [new Stmt\PropertyProperty($this->name, $this->default)], $this->attributes, $this->type, $this->attributeGroups); } } name = $name; } /** * Sets the scalar type. * * @param string|Identifier $type * * @return $this */ public function setScalarType($scalarType) { $this->scalarType = BuilderHelpers::normalizeType($scalarType); return $this; } /** * Implements one or more interfaces. * * @param Name|string ...$interfaces Names of interfaces to implement * * @return $this The builder instance (for fluid interface) */ public function implement(...$interfaces) { foreach ($interfaces as $interface) { $this->implements[] = BuilderHelpers::normalizeName($interface); } return $this; } /** * Adds a statement. * * @param Stmt|PhpParser\Builder $stmt The statement to add * * @return $this The builder instance (for fluid interface) */ public function addStmt($stmt) { $stmt = BuilderHelpers::normalizeNode($stmt); $targets = [Stmt\TraitUse::class => &$this->uses, Stmt\EnumCase::class => &$this->enumCases, Stmt\ClassConst::class => &$this->constants, Stmt\ClassMethod::class => &$this->methods]; $class = \get_class($stmt); if (!isset($targets[$class])) { throw new \LogicException(\sprintf('Unexpected node of type "%s"', $stmt->getType())); } $targets[$class][] = $stmt; return $this; } /** * Adds an attribute group. * * @param Node\Attribute|Node\AttributeGroup $attribute * * @return $this The builder instance (for fluid interface) */ public function addAttribute($attribute) { $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); return $this; } /** * Returns the built class node. * * @return Stmt\Enum_ The built enum node */ public function getNode() : PhpParser\Node { return new Stmt\Enum_($this->name, ['scalarType' => $this->scalarType, 'implements' => $this->implements, 'stmts' => \array_merge($this->uses, $this->enumCases, $this->constants, $this->methods), 'attrGroups' => $this->attributeGroups], $this->attributes); } } returnByRef = \true; return $this; } /** * Adds a parameter. * * @param Node\Param|Param $param The parameter to add * * @return $this The builder instance (for fluid interface) */ public function addParam($param) { $param = BuilderHelpers::normalizeNode($param); if (!$param instanceof Node\Param) { throw new \LogicException(\sprintf('Expected parameter node, got "%s"', $param->getType())); } $this->params[] = $param; return $this; } /** * Adds multiple parameters. * * @param array $params The parameters to add * * @return $this The builder instance (for fluid interface) */ public function addParams(array $params) { foreach ($params as $param) { $this->addParam($param); } return $this; } /** * Sets the return type for PHP 7. * * @param string|Node\Name|Node\Identifier|Node\ComplexType $type * * @return $this The builder instance (for fluid interface) */ public function setReturnType($type) { $this->returnType = BuilderHelpers::normalizeType($type); return $this; } } name = null !== $name ? BuilderHelpers::normalizeName($name) : null; } /** * Adds a statement. * * @param Node|PhpParser\Builder $stmt The statement to add * * @return $this The builder instance (for fluid interface) */ public function addStmt($stmt) { $this->stmts[] = BuilderHelpers::normalizeStmt($stmt); return $this; } /** * Returns the built node. * * @return Stmt\Namespace_ The built node */ public function getNode() : Node { return new Stmt\Namespace_($this->name, $this->stmts, $this->attributes); } } type = self::TYPE_UNDEFINED; $this->trait = \is_null($trait) ? null : BuilderHelpers::normalizeName($trait); $this->method = BuilderHelpers::normalizeIdentifier($method); } /** * Sets alias of method. * * @param Node\Identifier|string $alias Alias for adaptated method * * @return $this The builder instance (for fluid interface) */ public function as($alias) { if ($this->type === self::TYPE_UNDEFINED) { $this->type = self::TYPE_ALIAS; } if ($this->type !== self::TYPE_ALIAS) { throw new \LogicException('Cannot set alias for not alias adaptation buider'); } $this->alias = $alias; return $this; } /** * Sets adaptated method public. * * @return $this The builder instance (for fluid interface) */ public function makePublic() { $this->setModifier(Stmt\Class_::MODIFIER_PUBLIC); return $this; } /** * Sets adaptated method protected. * * @return $this The builder instance (for fluid interface) */ public function makeProtected() { $this->setModifier(Stmt\Class_::MODIFIER_PROTECTED); return $this; } /** * Sets adaptated method private. * * @return $this The builder instance (for fluid interface) */ public function makePrivate() { $this->setModifier(Stmt\Class_::MODIFIER_PRIVATE); return $this; } /** * Adds overwritten traits. * * @param Node\Name|string ...$traits Traits for overwrite * * @return $this The builder instance (for fluid interface) */ public function insteadof(...$traits) { if ($this->type === self::TYPE_UNDEFINED) { if (\is_null($this->trait)) { throw new \LogicException('Precedence adaptation must have trait'); } $this->type = self::TYPE_PRECEDENCE; } if ($this->type !== self::TYPE_PRECEDENCE) { throw new \LogicException('Cannot add overwritten traits for not precedence adaptation buider'); } foreach ($traits as $trait) { $this->insteadof[] = BuilderHelpers::normalizeName($trait); } return $this; } protected function setModifier(int $modifier) { if ($this->type === self::TYPE_UNDEFINED) { $this->type = self::TYPE_ALIAS; } if ($this->type !== self::TYPE_ALIAS) { throw new \LogicException('Cannot set access modifier for not alias adaptation buider'); } if (\is_null($this->modifier)) { $this->modifier = $modifier; } else { throw new \LogicException('Multiple access type modifiers are not allowed'); } } /** * Returns the built node. * * @return Node The built node */ public function getNode() : Node { switch ($this->type) { case self::TYPE_ALIAS: return new Stmt\TraitUseAdaptation\Alias($this->trait, $this->method, $this->modifier, $this->alias); case self::TYPE_PRECEDENCE: return new Stmt\TraitUseAdaptation\Precedence($this->trait, $this->method, $this->insteadof); default: throw new \LogicException('Type of adaptation is not defined'); } } } addStmt($stmt); } return $this; } /** * Sets doc comment for the declaration. * * @param PhpParser\Comment\Doc|string $docComment Doc comment to set * * @return $this The builder instance (for fluid interface) */ public function setDocComment($docComment) { $this->attributes['comments'] = [BuilderHelpers::normalizeDocComment($docComment)]; return $this; } } constants = [new Const_($name, BuilderHelpers::normalizeValue($value))]; } /** * Add another constant to const group * * @param string|Identifier $name Name * @param Node\Expr|bool|null|int|float|string|array $value Value * * @return $this The builder instance (for fluid interface) */ public function addConst($name, $value) { $this->constants[] = new Const_($name, BuilderHelpers::normalizeValue($value)); return $this; } /** * Makes the constant public. * * @return $this The builder instance (for fluid interface) */ public function makePublic() { $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PUBLIC); return $this; } /** * Makes the constant protected. * * @return $this The builder instance (for fluid interface) */ public function makeProtected() { $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PROTECTED); return $this; } /** * Makes the constant private. * * @return $this The builder instance (for fluid interface) */ public function makePrivate() { $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PRIVATE); return $this; } /** * Makes the constant final. * * @return $this The builder instance (for fluid interface) */ public function makeFinal() { $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_FINAL); return $this; } /** * Sets doc comment for the constant. * * @param PhpParser\Comment\Doc|string $docComment Doc comment to set * * @return $this The builder instance (for fluid interface) */ public function setDocComment($docComment) { $this->attributes = ['comments' => [BuilderHelpers::normalizeDocComment($docComment)]]; return $this; } /** * Adds an attribute group. * * @param Node\Attribute|Node\AttributeGroup $attribute * * @return $this The builder instance (for fluid interface) */ public function addAttribute($attribute) { $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); return $this; } /** * Returns the built class node. * * @return Stmt\ClassConst The built constant node */ public function getNode() : PhpParser\Node { return new Stmt\ClassConst($this->constants, $this->flags, $this->attributes, $this->attributeGroups); } } getNode(); } if ($node instanceof Node) { return $node; } throw new \LogicException('Expected node or builder object'); } /** * Normalizes a node to a statement. * * Expressions are wrapped in a Stmt\Expression node. * * @param Node|Builder $node The node to normalize * * @return Stmt The normalized statement node */ public static function normalizeStmt($node) : Stmt { $node = self::normalizeNode($node); if ($node instanceof Stmt) { return $node; } if ($node instanceof Expr) { return new Stmt\Expression($node); } throw new \LogicException('Expected statement or expression node'); } /** * Normalizes strings to Identifier. * * @param string|Identifier $name The identifier to normalize * * @return Identifier The normalized identifier */ public static function normalizeIdentifier($name) : Identifier { if ($name instanceof Identifier) { return $name; } if (\is_string($name)) { return new Identifier($name); } throw new \LogicException('_HumbugBox1cb33d1f20f1\\Expected string or instance of Node\\Identifier'); } /** * Normalizes strings to Identifier, also allowing expressions. * * @param string|Identifier|Expr $name The identifier to normalize * * @return Identifier|Expr The normalized identifier or expression */ public static function normalizeIdentifierOrExpr($name) { if ($name instanceof Identifier || $name instanceof Expr) { return $name; } if (\is_string($name)) { return new Identifier($name); } throw new \LogicException('_HumbugBox1cb33d1f20f1\\Expected string or instance of Node\\Identifier or Node\\Expr'); } /** * Normalizes a name: Converts string names to Name nodes. * * @param Name|string $name The name to normalize * * @return Name The normalized name */ public static function normalizeName($name) : Name { if ($name instanceof Name) { return $name; } if (\is_string($name)) { if (!$name) { throw new \LogicException('Name cannot be empty'); } if ($name[0] === '\\') { return new Name\FullyQualified(\substr($name, 1)); } if (0 === \strpos($name, 'namespace\\')) { return new Name\Relative(\substr($name, \strlen('namespace\\'))); } return new Name($name); } throw new \LogicException('_HumbugBox1cb33d1f20f1\\Name must be a string or an instance of Node\\Name'); } /** * Normalizes a name: Converts string names to Name nodes, while also allowing expressions. * * @param Expr|Name|string $name The name to normalize * * @return Name|Expr The normalized name or expression */ public static function normalizeNameOrExpr($name) { if ($name instanceof Expr) { return $name; } if (!\is_string($name) && !$name instanceof Name) { throw new \LogicException('_HumbugBox1cb33d1f20f1\\Name must be a string or an instance of Node\\Name or Node\\Expr'); } return self::normalizeName($name); } /** * Normalizes a type: Converts plain-text type names into proper AST representation. * * In particular, builtin types become Identifiers, custom types become Names and nullables * are wrapped in NullableType nodes. * * @param string|Name|Identifier|ComplexType $type The type to normalize * * @return Name|Identifier|ComplexType The normalized type */ public static function normalizeType($type) { if (!\is_string($type)) { if (!$type instanceof Name && !$type instanceof Identifier && !$type instanceof ComplexType) { throw new \LogicException('Type must be a string, or an instance of Name, Identifier or ComplexType'); } return $type; } $nullable = \false; if (\strlen($type) > 0 && $type[0] === '?') { $nullable = \true; $type = \substr($type, 1); } $builtinTypes = ['array', 'callable', 'bool', 'int', 'float', 'string', 'iterable', 'void', 'object', 'null', 'false', 'mixed', 'never', 'true']; $lowerType = \strtolower($type); if (\in_array($lowerType, $builtinTypes)) { $type = new Identifier($lowerType); } else { $type = self::normalizeName($type); } $notNullableTypes = ['void', 'mixed', 'never']; if ($nullable && \in_array((string) $type, $notNullableTypes)) { throw new \LogicException(\sprintf('%s type cannot be nullable', $type)); } return $nullable ? new NullableType($type) : $type; } /** * Normalizes a value: Converts nulls, booleans, integers, * floats, strings and arrays into their respective nodes * * @param Node\Expr|bool|null|int|float|string|array $value The value to normalize * * @return Expr The normalized value */ public static function normalizeValue($value) : Expr { if ($value instanceof Node\Expr) { return $value; } if (\is_null($value)) { return new Expr\ConstFetch(new Name('null')); } if (\is_bool($value)) { return new Expr\ConstFetch(new Name($value ? 'true' : 'false')); } if (\is_int($value)) { return new Scalar\LNumber($value); } if (\is_float($value)) { return new Scalar\DNumber($value); } if (\is_string($value)) { return new Scalar\String_($value); } if (\is_array($value)) { $items = []; $lastKey = -1; foreach ($value as $itemKey => $itemValue) { // for consecutive, numeric keys don't generate keys if (null !== $lastKey && ++$lastKey === $itemKey) { $items[] = new Expr\ArrayItem(self::normalizeValue($itemValue)); } else { $lastKey = null; $items[] = new Expr\ArrayItem(self::normalizeValue($itemValue), self::normalizeValue($itemKey)); } } return new Expr\Array_($items); } throw new \LogicException('Invalid value'); } /** * Normalizes a doc comment: Converts plain strings to PhpParser\Comment\Doc. * * @param Comment\Doc|string $docComment The doc comment to normalize * * @return Comment\Doc The normalized doc comment */ public static function normalizeDocComment($docComment) : Comment\Doc { if ($docComment instanceof Comment\Doc) { return $docComment; } if (\is_string($docComment)) { return new Comment\Doc($docComment); } throw new \LogicException('_HumbugBox1cb33d1f20f1\\Doc comment must be a string or an instance of PhpParser\\Comment\\Doc'); } /** * Normalizes a attribute: Converts attribute to the Attribute Group if needed. * * @param Node\Attribute|Node\AttributeGroup $attribute * * @return Node\AttributeGroup The Attribute Group */ public static function normalizeAttribute($attribute) : Node\AttributeGroup { if ($attribute instanceof Node\AttributeGroup) { return $attribute; } if (!$attribute instanceof Node\Attribute) { throw new \LogicException('_HumbugBox1cb33d1f20f1\\Attribute must be an instance of PhpParser\\Node\\Attribute or PhpParser\\Node\\AttributeGroup'); } return new Node\AttributeGroup([$attribute]); } /** * Adds a modifier and returns new modifier bitmask. * * @param int $modifiers Existing modifiers * @param int $modifier Modifier to set * * @return int New modifiers */ public static function addModifier(int $modifiers, int $modifier) : int { Stmt\Class_::verifyModifier($modifiers, $modifier); return $modifiers | $modifier; } /** * Adds a modifier and returns new modifier bitmask. * @return int New modifiers */ public static function addClassModifier(int $existingModifiers, int $modifierToSet) : int { Stmt\Class_::verifyClassModifier($existingModifiers, $modifierToSet); return $existingModifiers | $modifierToSet; } } lexer = $lexer; if (isset($options['throwOnError'])) { throw new \LogicException('"throwOnError" is no longer supported, use "errorHandler" instead'); } $this->initReduceCallbacks(); } /** * Parses PHP code into a node tree. * * If a non-throwing error handler is used, the parser will continue parsing after an error * occurred and attempt to build a partial AST. * * @param string $code The source code to parse * @param ErrorHandler|null $errorHandler Error handler to use for lexer/parser errors, defaults * to ErrorHandler\Throwing. * * @return Node\Stmt[]|null Array of statements (or null non-throwing error handler is used and * the parser was unable to recover from an error). */ public function parse(string $code, ErrorHandler $errorHandler = null) { $this->errorHandler = $errorHandler ?: new ErrorHandler\Throwing(); $this->lexer->startLexing($code, $this->errorHandler); $result = $this->doParse(); // Clear out some of the interior state, so we don't hold onto unnecessary // memory between uses of the parser $this->startAttributeStack = []; $this->endAttributeStack = []; $this->semStack = []; $this->semValue = null; return $result; } protected function doParse() { // We start off with no lookahead-token $symbol = self::SYMBOL_NONE; // The attributes for a node are taken from the first and last token of the node. // From the first token only the startAttributes are taken and from the last only // the endAttributes. Both are merged using the array union operator (+). $startAttributes = []; $endAttributes = []; $this->endAttributes = $endAttributes; // Keep stack of start and end attributes $this->startAttributeStack = []; $this->endAttributeStack = [$endAttributes]; // Start off in the initial state and keep a stack of previous states $state = 0; $stateStack = [$state]; // Semantic value stack (contains values of tokens and semantic action results) $this->semStack = []; // Current position in the stack(s) $stackPos = 0; $this->errorState = 0; for (;;) { //$this->traceNewState($state, $symbol); if ($this->actionBase[$state] === 0) { $rule = $this->actionDefault[$state]; } else { if ($symbol === self::SYMBOL_NONE) { // Fetch the next token id from the lexer and fetch additional info by-ref. // The end attributes are fetched into a temporary variable and only set once the token is really // shifted (not during read). Otherwise you would sometimes get off-by-one errors, when a rule is // reduced after a token was read but not yet shifted. $tokenId = $this->lexer->getNextToken($tokenValue, $startAttributes, $endAttributes); // map the lexer token id to the internally used symbols $symbol = $tokenId >= 0 && $tokenId < $this->tokenToSymbolMapSize ? $this->tokenToSymbol[$tokenId] : $this->invalidSymbol; if ($symbol === $this->invalidSymbol) { throw new \RangeException(\sprintf('The lexer returned an invalid token (id=%d, value=%s)', $tokenId, $tokenValue)); } // Allow productions to access the start attributes of the lookahead token. $this->lookaheadStartAttributes = $startAttributes; //$this->traceRead($symbol); } $idx = $this->actionBase[$state] + $symbol; if (($idx >= 0 && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $symbol || $state < $this->YY2TBLSTATE && ($idx = $this->actionBase[$state + $this->numNonLeafStates] + $symbol) >= 0 && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $symbol) && ($action = $this->action[$idx]) !== $this->defaultAction) { /* * >= numNonLeafStates: shift and reduce * > 0: shift * = 0: accept * < 0: reduce * = -YYUNEXPECTED: error */ if ($action > 0) { /* shift */ //$this->traceShift($symbol); ++$stackPos; $stateStack[$stackPos] = $state = $action; $this->semStack[$stackPos] = $tokenValue; $this->startAttributeStack[$stackPos] = $startAttributes; $this->endAttributeStack[$stackPos] = $endAttributes; $this->endAttributes = $endAttributes; $symbol = self::SYMBOL_NONE; if ($this->errorState) { --$this->errorState; } if ($action < $this->numNonLeafStates) { continue; } /* $yyn >= numNonLeafStates means shift-and-reduce */ $rule = $action - $this->numNonLeafStates; } else { $rule = -$action; } } else { $rule = $this->actionDefault[$state]; } } for (;;) { if ($rule === 0) { /* accept */ //$this->traceAccept(); return $this->semValue; } elseif ($rule !== $this->unexpectedTokenRule) { /* reduce */ //$this->traceReduce($rule); try { $this->reduceCallbacks[$rule]($stackPos); } catch (Error $e) { if (-1 === $e->getStartLine() && isset($startAttributes['startLine'])) { $e->setStartLine($startAttributes['startLine']); } $this->emitError($e); // Can't recover from this type of error return null; } /* Goto - shift nonterminal */ $lastEndAttributes = $this->endAttributeStack[$stackPos]; $ruleLength = $this->ruleToLength[$rule]; $stackPos -= $ruleLength; $nonTerminal = $this->ruleToNonTerminal[$rule]; $idx = $this->gotoBase[$nonTerminal] + $stateStack[$stackPos]; if ($idx >= 0 && $idx < $this->gotoTableSize && $this->gotoCheck[$idx] === $nonTerminal) { $state = $this->goto[$idx]; } else { $state = $this->gotoDefault[$nonTerminal]; } ++$stackPos; $stateStack[$stackPos] = $state; $this->semStack[$stackPos] = $this->semValue; $this->endAttributeStack[$stackPos] = $lastEndAttributes; if ($ruleLength === 0) { // Empty productions use the start attributes of the lookahead token. $this->startAttributeStack[$stackPos] = $this->lookaheadStartAttributes; } } else { /* error */ switch ($this->errorState) { case 0: $msg = $this->getErrorMessage($symbol, $state); $this->emitError(new Error($msg, $startAttributes + $endAttributes)); // Break missing intentionally case 1: case 2: $this->errorState = 3; // Pop until error-expecting state uncovered while (!(($idx = $this->actionBase[$state] + $this->errorSymbol) >= 0 && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $this->errorSymbol || $state < $this->YY2TBLSTATE && ($idx = $this->actionBase[$state + $this->numNonLeafStates] + $this->errorSymbol) >= 0 && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $this->errorSymbol) || ($action = $this->action[$idx]) === $this->defaultAction) { // Not totally sure about this if ($stackPos <= 0) { // Could not recover from error return null; } $state = $stateStack[--$stackPos]; //$this->tracePop($state); } //$this->traceShift($this->errorSymbol); ++$stackPos; $stateStack[$stackPos] = $state = $action; // We treat the error symbol as being empty, so we reset the end attributes // to the end attributes of the last non-error symbol $this->startAttributeStack[$stackPos] = $this->lookaheadStartAttributes; $this->endAttributeStack[$stackPos] = $this->endAttributeStack[$stackPos - 1]; $this->endAttributes = $this->endAttributeStack[$stackPos - 1]; break; case 3: if ($symbol === 0) { // Reached EOF without recovering from error return null; } //$this->traceDiscard($symbol); $symbol = self::SYMBOL_NONE; break 2; } } if ($state < $this->numNonLeafStates) { break; } /* >= numNonLeafStates means shift-and-reduce */ $rule = $state - $this->numNonLeafStates; } } throw new \RuntimeException('Reached end of parser loop'); } protected function emitError(Error $error) { $this->errorHandler->handleError($error); } /** * Format error message including expected tokens. * * @param int $symbol Unexpected symbol * @param int $state State at time of error * * @return string Formatted error message */ protected function getErrorMessage(int $symbol, int $state) : string { $expectedString = ''; if ($expected = $this->getExpectedTokens($state)) { $expectedString = ', expecting ' . \implode(' or ', $expected); } return 'Syntax error, unexpected ' . $this->symbolToName[$symbol] . $expectedString; } /** * Get limited number of expected tokens in given state. * * @param int $state State * * @return string[] Expected tokens. If too many, an empty array is returned. */ protected function getExpectedTokens(int $state) : array { $expected = []; $base = $this->actionBase[$state]; foreach ($this->symbolToName as $symbol => $name) { $idx = $base + $symbol; if ($idx >= 0 && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $symbol || $state < $this->YY2TBLSTATE && ($idx = $this->actionBase[$state + $this->numNonLeafStates] + $symbol) >= 0 && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $symbol) { if ($this->action[$idx] !== $this->unexpectedTokenRule && $this->action[$idx] !== $this->defaultAction && $symbol !== $this->errorSymbol) { if (\count($expected) === 4) { /* Too many expected tokens */ return []; } $expected[] = $name; } } } return $expected; } /* * Tracing functions used for debugging the parser. */ /* protected function traceNewState($state, $symbol) { echo '% State ' . $state . ', Lookahead ' . ($symbol == self::SYMBOL_NONE ? '--none--' : $this->symbolToName[$symbol]) . "\n"; } protected function traceRead($symbol) { echo '% Reading ' . $this->symbolToName[$symbol] . "\n"; } protected function traceShift($symbol) { echo '% Shift ' . $this->symbolToName[$symbol] . "\n"; } protected function traceAccept() { echo "% Accepted.\n"; } protected function traceReduce($n) { echo '% Reduce by (' . $n . ') ' . $this->productions[$n] . "\n"; } protected function tracePop($state) { echo '% Recovering, uncovered state ' . $state . "\n"; } protected function traceDiscard($symbol) { echo '% Discard ' . $this->symbolToName[$symbol] . "\n"; } */ /* * Helper functions invoked by semantic actions */ /** * Moves statements of semicolon-style namespaces into $ns->stmts and checks various error conditions. * * @param Node\Stmt[] $stmts * @return Node\Stmt[] */ protected function handleNamespaces(array $stmts) : array { $hasErrored = \false; $style = $this->getNamespacingStyle($stmts); if (null === $style) { // not namespaced, nothing to do return $stmts; } elseif ('brace' === $style) { // For braced namespaces we only have to check that there are no invalid statements between the namespaces $afterFirstNamespace = \false; foreach ($stmts as $stmt) { if ($stmt instanceof Node\Stmt\Namespace_) { $afterFirstNamespace = \true; } elseif (!$stmt instanceof Node\Stmt\HaltCompiler && !$stmt instanceof Node\Stmt\Nop && $afterFirstNamespace && !$hasErrored) { $this->emitError(new Error('No code may exist outside of namespace {}', $stmt->getAttributes())); $hasErrored = \true; // Avoid one error for every statement } } return $stmts; } else { // For semicolon namespaces we have to move the statements after a namespace declaration into ->stmts $resultStmts = []; $targetStmts =& $resultStmts; $lastNs = null; foreach ($stmts as $stmt) { if ($stmt instanceof Node\Stmt\Namespace_) { if ($lastNs !== null) { $this->fixupNamespaceAttributes($lastNs); } if ($stmt->stmts === null) { $stmt->stmts = []; $targetStmts =& $stmt->stmts; $resultStmts[] = $stmt; } else { // This handles the invalid case of mixed style namespaces $resultStmts[] = $stmt; $targetStmts =& $resultStmts; } $lastNs = $stmt; } elseif ($stmt instanceof Node\Stmt\HaltCompiler) { // __halt_compiler() is not moved into the namespace $resultStmts[] = $stmt; } else { $targetStmts[] = $stmt; } } if ($lastNs !== null) { $this->fixupNamespaceAttributes($lastNs); } return $resultStmts; } } private function fixupNamespaceAttributes(Node\Stmt\Namespace_ $stmt) { // We moved the statements into the namespace node, as such the end of the namespace node // needs to be extended to the end of the statements. if (empty($stmt->stmts)) { return; } // We only move the builtin end attributes here. This is the best we can do with the // knowledge we have. $endAttributes = ['endLine', 'endFilePos', 'endTokenPos']; $lastStmt = $stmt->stmts[\count($stmt->stmts) - 1]; foreach ($endAttributes as $endAttribute) { if ($lastStmt->hasAttribute($endAttribute)) { $stmt->setAttribute($endAttribute, $lastStmt->getAttribute($endAttribute)); } } } /** * Determine namespacing style (semicolon or brace) * * @param Node[] $stmts Top-level statements. * * @return null|string One of "semicolon", "brace" or null (no namespaces) */ private function getNamespacingStyle(array $stmts) { $style = null; $hasNotAllowedStmts = \false; foreach ($stmts as $i => $stmt) { if ($stmt instanceof Node\Stmt\Namespace_) { $currentStyle = null === $stmt->stmts ? 'semicolon' : 'brace'; if (null === $style) { $style = $currentStyle; if ($hasNotAllowedStmts) { $this->emitError(new Error('Namespace declaration statement has to be the very first statement in the script', $stmt->getLine())); } } elseif ($style !== $currentStyle) { $this->emitError(new Error('Cannot mix bracketed namespace declarations with unbracketed namespace declarations', $stmt->getLine())); // Treat like semicolon style for namespace normalization return 'semicolon'; } continue; } /* declare(), __halt_compiler() and nops can be used before a namespace declaration */ if ($stmt instanceof Node\Stmt\Declare_ || $stmt instanceof Node\Stmt\HaltCompiler || $stmt instanceof Node\Stmt\Nop) { continue; } /* There may be a hashbang line at the very start of the file */ if ($i === 0 && $stmt instanceof Node\Stmt\InlineHTML && \preg_match('/\\A#!.*\\r?\\n\\z/', $stmt->value)) { continue; } /* Everything else if forbidden before namespace declarations */ $hasNotAllowedStmts = \true; } return $style; } /** * Fix up parsing of static property calls in PHP 5. * * In PHP 5 A::$b[c][d] and A::$b[c][d]() have very different interpretation. The former is * interpreted as (A::$b)[c][d], while the latter is the same as A::{$b[c][d]}(). We parse the * latter as the former initially and this method fixes the AST into the correct form when we * encounter the "()". * * @param Node\Expr\StaticPropertyFetch|Node\Expr\ArrayDimFetch $prop * @param Node\Arg[] $args * @param array $attributes * * @return Expr\StaticCall */ protected function fixupPhp5StaticPropCall($prop, array $args, array $attributes) : Expr\StaticCall { if ($prop instanceof Node\Expr\StaticPropertyFetch) { $name = $prop->name instanceof VarLikeIdentifier ? $prop->name->toString() : $prop->name; $var = new Expr\Variable($name, $prop->name->getAttributes()); return new Expr\StaticCall($prop->class, $var, $args, $attributes); } elseif ($prop instanceof Node\Expr\ArrayDimFetch) { $tmp = $prop; while ($tmp->var instanceof Node\Expr\ArrayDimFetch) { $tmp = $tmp->var; } /** @var Expr\StaticPropertyFetch $staticProp */ $staticProp = $tmp->var; // Set start attributes to attributes of innermost node $tmp = $prop; $this->fixupStartAttributes($tmp, $staticProp->name); while ($tmp->var instanceof Node\Expr\ArrayDimFetch) { $tmp = $tmp->var; $this->fixupStartAttributes($tmp, $staticProp->name); } $name = $staticProp->name instanceof VarLikeIdentifier ? $staticProp->name->toString() : $staticProp->name; $tmp->var = new Expr\Variable($name, $staticProp->name->getAttributes()); return new Expr\StaticCall($staticProp->class, $prop, $args, $attributes); } else { throw new \Exception(); } } protected function fixupStartAttributes(Node $to, Node $from) { $startAttributes = ['startLine', 'startFilePos', 'startTokenPos']; foreach ($startAttributes as $startAttribute) { if ($from->hasAttribute($startAttribute)) { $to->setAttribute($startAttribute, $from->getAttribute($startAttribute)); } } } protected function handleBuiltinTypes(Name $name) { $builtinTypes = ['bool' => \true, 'int' => \true, 'float' => \true, 'string' => \true, 'iterable' => \true, 'void' => \true, 'object' => \true, 'null' => \true, 'false' => \true, 'mixed' => \true, 'never' => \true, 'true' => \true]; if (!$name->isUnqualified()) { return $name; } $lowerName = $name->toLowerString(); if (!isset($builtinTypes[$lowerName])) { return $name; } return new Node\Identifier($lowerName, $name->getAttributes()); } /** * Get combined start and end attributes at a stack location * * @param int $pos Stack location * * @return array Combined start and end attributes */ protected function getAttributesAt(int $pos) : array { return $this->startAttributeStack[$pos] + $this->endAttributeStack[$pos]; } protected function getFloatCastKind(string $cast) : int { $cast = \strtolower($cast); if (\strpos($cast, 'float') !== \false) { return Double::KIND_FLOAT; } if (\strpos($cast, 'real') !== \false) { return Double::KIND_REAL; } return Double::KIND_DOUBLE; } protected function parseLNumber($str, $attributes, $allowInvalidOctal = \false) { try { return LNumber::fromString($str, $attributes, $allowInvalidOctal); } catch (Error $error) { $this->emitError($error); // Use dummy value return new LNumber(0, $attributes); } } /** * Parse a T_NUM_STRING token into either an integer or string node. * * @param string $str Number string * @param array $attributes Attributes * * @return LNumber|String_ Integer or string node. */ protected function parseNumString(string $str, array $attributes) { if (!\preg_match('/^(?:0|-?[1-9][0-9]*)$/', $str)) { return new String_($str, $attributes); } $num = +$str; if (!\is_int($num)) { return new String_($str, $attributes); } return new LNumber($num, $attributes); } protected function stripIndentation(string $string, int $indentLen, string $indentChar, bool $newlineAtStart, bool $newlineAtEnd, array $attributes) { if ($indentLen === 0) { return $string; } $start = $newlineAtStart ? '(?:(?<=\\n)|\\A)' : '(?<=\\n)'; $end = $newlineAtEnd ? '(?:(?=[\\r\\n])|\\z)' : '(?=[\\r\\n])'; $regex = '/' . $start . '([ \\t]*)(' . $end . ')?/'; return \preg_replace_callback($regex, function ($matches) use($indentLen, $indentChar, $attributes) { $prefix = \substr($matches[1], 0, $indentLen); if (\false !== \strpos($prefix, $indentChar === " " ? "\t" : " ")) { $this->emitError(new Error('Invalid indentation - tabs and spaces cannot be mixed', $attributes)); } elseif (\strlen($prefix) < $indentLen && !isset($matches[2])) { $this->emitError(new Error('Invalid body indentation level ' . '(expecting an indentation level of at least ' . $indentLen . ')', $attributes)); } return \substr($matches[0], \strlen($prefix)); }, $string); } protected function parseDocString(string $startToken, $contents, string $endToken, array $attributes, array $endTokenAttributes, bool $parseUnicodeEscape) { $kind = \strpos($startToken, "'") === \false ? String_::KIND_HEREDOC : String_::KIND_NOWDOC; $regex = '/\\A[bB]?<<<[ \\t]*[\'"]?([a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*)[\'"]?(?:\\r\\n|\\n|\\r)\\z/'; $result = \preg_match($regex, $startToken, $matches); \assert($result === 1); $label = $matches[1]; $result = \preg_match('/\\A[ \\t]*/', $endToken, $matches); \assert($result === 1); $indentation = $matches[0]; $attributes['kind'] = $kind; $attributes['docLabel'] = $label; $attributes['docIndentation'] = $indentation; $indentHasSpaces = \false !== \strpos($indentation, " "); $indentHasTabs = \false !== \strpos($indentation, "\t"); if ($indentHasSpaces && $indentHasTabs) { $this->emitError(new Error('Invalid indentation - tabs and spaces cannot be mixed', $endTokenAttributes)); // Proceed processing as if this doc string is not indented $indentation = ''; } $indentLen = \strlen($indentation); $indentChar = $indentHasSpaces ? " " : "\t"; if (\is_string($contents)) { if ($contents === '') { return new String_('', $attributes); } $contents = $this->stripIndentation($contents, $indentLen, $indentChar, \true, \true, $attributes); $contents = \preg_replace('~(\\r\\n|\\n|\\r)\\z~', '', $contents); if ($kind === String_::KIND_HEREDOC) { $contents = String_::parseEscapeSequences($contents, null, $parseUnicodeEscape); } return new String_($contents, $attributes); } else { \assert(\count($contents) > 0); if (!$contents[0] instanceof Node\Scalar\EncapsedStringPart) { // If there is no leading encapsed string part, pretend there is an empty one $this->stripIndentation('', $indentLen, $indentChar, \true, \false, $contents[0]->getAttributes()); } $newContents = []; foreach ($contents as $i => $part) { if ($part instanceof Node\Scalar\EncapsedStringPart) { $isLast = $i === \count($contents) - 1; $part->value = $this->stripIndentation($part->value, $indentLen, $indentChar, $i === 0, $isLast, $part->getAttributes()); $part->value = String_::parseEscapeSequences($part->value, null, $parseUnicodeEscape); if ($isLast) { $part->value = \preg_replace('~(\\r\\n|\\n|\\r)\\z~', '', $part->value); } if ('' === $part->value) { continue; } } $newContents[] = $part; } return new Encapsed($newContents, $attributes); } } /** * Create attributes for a zero-length common-capturing nop. * * @param Comment[] $comments * @return array */ protected function createCommentNopAttributes(array $comments) { $comment = $comments[\count($comments) - 1]; $commentEndLine = $comment->getEndLine(); $commentEndFilePos = $comment->getEndFilePos(); $commentEndTokenPos = $comment->getEndTokenPos(); $attributes = ['comments' => $comments]; if (-1 !== $commentEndLine) { $attributes['startLine'] = $commentEndLine; $attributes['endLine'] = $commentEndLine; } if (-1 !== $commentEndFilePos) { $attributes['startFilePos'] = $commentEndFilePos + 1; $attributes['endFilePos'] = $commentEndFilePos; } if (-1 !== $commentEndTokenPos) { $attributes['startTokenPos'] = $commentEndTokenPos + 1; $attributes['endTokenPos'] = $commentEndTokenPos; } return $attributes; } protected function checkClassModifier($a, $b, $modifierPos) { try { Class_::verifyClassModifier($a, $b); } catch (Error $error) { $error->setAttributes($this->getAttributesAt($modifierPos)); $this->emitError($error); } } protected function checkModifier($a, $b, $modifierPos) { // Jumping through some hoops here because verifyModifier() is also used elsewhere try { Class_::verifyModifier($a, $b); } catch (Error $error) { $error->setAttributes($this->getAttributesAt($modifierPos)); $this->emitError($error); } } protected function checkParam(Param $node) { if ($node->variadic && null !== $node->default) { $this->emitError(new Error('Variadic parameter cannot have a default value', $node->default->getAttributes())); } } protected function checkTryCatch(TryCatch $node) { if (empty($node->catches) && null === $node->finally) { $this->emitError(new Error('Cannot use try without catch or finally', $node->getAttributes())); } } protected function checkNamespace(Namespace_ $node) { if (null !== $node->stmts) { foreach ($node->stmts as $stmt) { if ($stmt instanceof Namespace_) { $this->emitError(new Error('Namespace declarations cannot be nested', $stmt->getAttributes())); } } } } private function checkClassName($name, $namePos) { if (null !== $name && $name->isSpecialClassName()) { $this->emitError(new Error(\sprintf('Cannot use \'%s\' as class name as it is reserved', $name), $this->getAttributesAt($namePos))); } } private function checkImplementedInterfaces(array $interfaces) { foreach ($interfaces as $interface) { if ($interface->isSpecialClassName()) { $this->emitError(new Error(\sprintf('Cannot use \'%s\' as interface name as it is reserved', $interface), $interface->getAttributes())); } } } protected function checkClass(Class_ $node, $namePos) { $this->checkClassName($node->name, $namePos); if ($node->extends && $node->extends->isSpecialClassName()) { $this->emitError(new Error(\sprintf('Cannot use \'%s\' as class name as it is reserved', $node->extends), $node->extends->getAttributes())); } $this->checkImplementedInterfaces($node->implements); } protected function checkInterface(Interface_ $node, $namePos) { $this->checkClassName($node->name, $namePos); $this->checkImplementedInterfaces($node->extends); } protected function checkEnum(Enum_ $node, $namePos) { $this->checkClassName($node->name, $namePos); $this->checkImplementedInterfaces($node->implements); } protected function checkClassMethod(ClassMethod $node, $modifierPos) { if ($node->flags & Class_::MODIFIER_STATIC) { switch ($node->name->toLowerString()) { case '__construct': $this->emitError(new Error(\sprintf('Constructor %s() cannot be static', $node->name), $this->getAttributesAt($modifierPos))); break; case '__destruct': $this->emitError(new Error(\sprintf('Destructor %s() cannot be static', $node->name), $this->getAttributesAt($modifierPos))); break; case '__clone': $this->emitError(new Error(\sprintf('Clone method %s() cannot be static', $node->name), $this->getAttributesAt($modifierPos))); break; } } if ($node->flags & Class_::MODIFIER_READONLY) { $this->emitError(new Error(\sprintf('Method %s() cannot be readonly', $node->name), $this->getAttributesAt($modifierPos))); } } protected function checkClassConst(ClassConst $node, $modifierPos) { if ($node->flags & Class_::MODIFIER_STATIC) { $this->emitError(new Error("Cannot use 'static' as constant modifier", $this->getAttributesAt($modifierPos))); } if ($node->flags & Class_::MODIFIER_ABSTRACT) { $this->emitError(new Error("Cannot use 'abstract' as constant modifier", $this->getAttributesAt($modifierPos))); } if ($node->flags & Class_::MODIFIER_READONLY) { $this->emitError(new Error("Cannot use 'readonly' as constant modifier", $this->getAttributesAt($modifierPos))); } } protected function checkProperty(Property $node, $modifierPos) { if ($node->flags & Class_::MODIFIER_ABSTRACT) { $this->emitError(new Error('Properties cannot be declared abstract', $this->getAttributesAt($modifierPos))); } if ($node->flags & Class_::MODIFIER_FINAL) { $this->emitError(new Error('Properties cannot be declared final', $this->getAttributesAt($modifierPos))); } } protected function checkUseUse(UseUse $node, $namePos) { if ($node->alias && $node->alias->isSpecialClassName()) { $this->emitError(new Error(\sprintf('Cannot use %s as %s because \'%2$s\' is a special class name', $node->name, $node->alias), $this->getAttributesAt($namePos))); } } } [0, 1], Expr\BitwiseNot::class => [10, 1], Expr\PreInc::class => [10, 1], Expr\PreDec::class => [10, 1], Expr\PostInc::class => [10, -1], Expr\PostDec::class => [10, -1], Expr\UnaryPlus::class => [10, 1], Expr\UnaryMinus::class => [10, 1], Cast\Int_::class => [10, 1], Cast\Double::class => [10, 1], Cast\String_::class => [10, 1], Cast\Array_::class => [10, 1], Cast\Object_::class => [10, 1], Cast\Bool_::class => [10, 1], Cast\Unset_::class => [10, 1], Expr\ErrorSuppress::class => [10, 1], Expr\Instanceof_::class => [20, 0], Expr\BooleanNot::class => [30, 1], BinaryOp\Mul::class => [40, -1], BinaryOp\Div::class => [40, -1], BinaryOp\Mod::class => [40, -1], BinaryOp\Plus::class => [50, -1], BinaryOp\Minus::class => [50, -1], BinaryOp\Concat::class => [50, -1], BinaryOp\ShiftLeft::class => [60, -1], BinaryOp\ShiftRight::class => [60, -1], BinaryOp\Smaller::class => [70, 0], BinaryOp\SmallerOrEqual::class => [70, 0], BinaryOp\Greater::class => [70, 0], BinaryOp\GreaterOrEqual::class => [70, 0], BinaryOp\Equal::class => [80, 0], BinaryOp\NotEqual::class => [80, 0], BinaryOp\Identical::class => [80, 0], BinaryOp\NotIdentical::class => [80, 0], BinaryOp\Spaceship::class => [80, 0], BinaryOp\BitwiseAnd::class => [90, -1], BinaryOp\BitwiseXor::class => [100, -1], BinaryOp\BitwiseOr::class => [110, -1], BinaryOp\BooleanAnd::class => [120, -1], BinaryOp\BooleanOr::class => [130, -1], BinaryOp\Coalesce::class => [140, 1], Expr\Ternary::class => [150, 0], // parser uses %left for assignments, but they really behave as %right Expr\Assign::class => [160, 1], Expr\AssignRef::class => [160, 1], AssignOp\Plus::class => [160, 1], AssignOp\Minus::class => [160, 1], AssignOp\Mul::class => [160, 1], AssignOp\Div::class => [160, 1], AssignOp\Concat::class => [160, 1], AssignOp\Mod::class => [160, 1], AssignOp\BitwiseAnd::class => [160, 1], AssignOp\BitwiseOr::class => [160, 1], AssignOp\BitwiseXor::class => [160, 1], AssignOp\ShiftLeft::class => [160, 1], AssignOp\ShiftRight::class => [160, 1], AssignOp\Pow::class => [160, 1], AssignOp\Coalesce::class => [160, 1], Expr\YieldFrom::class => [165, 1], Expr\Print_::class => [168, 1], BinaryOp\LogicalAnd::class => [170, -1], BinaryOp\LogicalXor::class => [180, -1], BinaryOp\LogicalOr::class => [190, -1], Expr\Include_::class => [200, -1], ]; /** @var int Current indentation level. */ protected $indentLevel; /** @var string Newline including current indentation. */ protected $nl; /** @var string Token placed at end of doc string to ensure it is followed by a newline. */ protected $docStringEndToken; /** @var bool Whether semicolon namespaces can be used (i.e. no global namespace is used) */ protected $canUseSemicolonNamespaces; /** @var array Pretty printer options */ protected $options; /** @var TokenStream Original tokens for use in format-preserving pretty print */ protected $origTokens; /** @var Internal\Differ Differ for node lists */ protected $nodeListDiffer; /** @var bool[] Map determining whether a certain character is a label character */ protected $labelCharMap; /** * @var int[][] Map from token classes and subnode names to FIXUP_* constants. This is used * during format-preserving prints to place additional parens/braces if necessary. */ protected $fixupMap; /** * @var int[][] Map from "{$node->getType()}->{$subNode}" to ['left' => $l, 'right' => $r], * where $l and $r specify the token type that needs to be stripped when removing * this node. */ protected $removalMap; /** * @var mixed[] Map from "{$node->getType()}->{$subNode}" to [$find, $beforeToken, $extraLeft, $extraRight]. * $find is an optional token after which the insertion occurs. $extraLeft/Right * are optionally added before/after the main insertions. */ protected $insertionMap; /** * @var string[] Map From "{$node->getType()}->{$subNode}" to string that should be inserted * between elements of this list subnode. */ protected $listInsertionMap; protected $emptyListInsertionMap; /** @var int[] Map from "{$node->getType()}->{$subNode}" to token before which the modifiers * should be reprinted. */ protected $modifierChangeMap; /** * Creates a pretty printer instance using the given options. * * Supported options: * * bool $shortArraySyntax = false: Whether to use [] instead of array() as the default array * syntax, if the node does not specify a format. * * @param array $options Dictionary of formatting options */ public function __construct(array $options = []) { $this->docStringEndToken = '_DOC_STRING_END_' . \mt_rand(); $defaultOptions = ['shortArraySyntax' => \false]; $this->options = $options + $defaultOptions; } /** * Reset pretty printing state. */ protected function resetState() { $this->indentLevel = 0; $this->nl = "\n"; $this->origTokens = null; } /** * Set indentation level * * @param int $level Level in number of spaces */ protected function setIndentLevel(int $level) { $this->indentLevel = $level; $this->nl = "\n" . \str_repeat(' ', $level); } /** * Increase indentation level. */ protected function indent() { $this->indentLevel += 4; $this->nl .= ' '; } /** * Decrease indentation level. */ protected function outdent() { \assert($this->indentLevel >= 4); $this->indentLevel -= 4; $this->nl = "\n" . \str_repeat(' ', $this->indentLevel); } /** * Pretty prints an array of statements. * * @param Node[] $stmts Array of statements * * @return string Pretty printed statements */ public function prettyPrint(array $stmts) : string { $this->resetState(); $this->preprocessNodes($stmts); return \ltrim($this->handleMagicTokens($this->pStmts($stmts, \false))); } /** * Pretty prints an expression. * * @param Expr $node Expression node * * @return string Pretty printed node */ public function prettyPrintExpr(Expr $node) : string { $this->resetState(); return $this->handleMagicTokens($this->p($node)); } /** * Pretty prints a file of statements (includes the opening prettyPrint($stmts); if ($stmts[0] instanceof Stmt\InlineHTML) { $p = \preg_replace('/^<\\?php\\s+\\?>\\n?/', '', $p); } if ($stmts[\count($stmts) - 1] instanceof Stmt\InlineHTML) { $p = \preg_replace('/<\\?php$/', '', \rtrim($p)); } return $p; } /** * Preprocesses the top-level nodes to initialize pretty printer state. * * @param Node[] $nodes Array of nodes */ protected function preprocessNodes(array $nodes) { /* We can use semicolon-namespaces unless there is a global namespace declaration */ $this->canUseSemicolonNamespaces = \true; foreach ($nodes as $node) { if ($node instanceof Stmt\Namespace_ && null === $node->name) { $this->canUseSemicolonNamespaces = \false; break; } } } /** * Handles (and removes) no-indent and doc-string-end tokens. * * @param string $str * @return string */ protected function handleMagicTokens(string $str) : string { // Replace doc-string-end tokens with nothing or a newline $str = \str_replace($this->docStringEndToken . ";\n", ";\n", $str); $str = \str_replace($this->docStringEndToken, "\n", $str); return $str; } /** * Pretty prints an array of nodes (statements) and indents them optionally. * * @param Node[] $nodes Array of nodes * @param bool $indent Whether to indent the printed nodes * * @return string Pretty printed statements */ protected function pStmts(array $nodes, bool $indent = \true) : string { if ($indent) { $this->indent(); } $result = ''; foreach ($nodes as $node) { $comments = $node->getComments(); if ($comments) { $result .= $this->nl . $this->pComments($comments); if ($node instanceof Stmt\Nop) { continue; } } $result .= $this->nl . $this->p($node); } if ($indent) { $this->outdent(); } return $result; } /** * Pretty-print an infix operation while taking precedence into account. * * @param string $class Node class of operator * @param Node $leftNode Left-hand side node * @param string $operatorString String representation of the operator * @param Node $rightNode Right-hand side node * * @return string Pretty printed infix operation */ protected function pInfixOp(string $class, Node $leftNode, string $operatorString, Node $rightNode) : string { list($precedence, $associativity) = $this->precedenceMap[$class]; return $this->pPrec($leftNode, $precedence, $associativity, -1) . $operatorString . $this->pPrec($rightNode, $precedence, $associativity, 1); } /** * Pretty-print a prefix operation while taking precedence into account. * * @param string $class Node class of operator * @param string $operatorString String representation of the operator * @param Node $node Node * * @return string Pretty printed prefix operation */ protected function pPrefixOp(string $class, string $operatorString, Node $node) : string { list($precedence, $associativity) = $this->precedenceMap[$class]; return $operatorString . $this->pPrec($node, $precedence, $associativity, 1); } /** * Pretty-print a postfix operation while taking precedence into account. * * @param string $class Node class of operator * @param string $operatorString String representation of the operator * @param Node $node Node * * @return string Pretty printed postfix operation */ protected function pPostfixOp(string $class, Node $node, string $operatorString) : string { list($precedence, $associativity) = $this->precedenceMap[$class]; return $this->pPrec($node, $precedence, $associativity, -1) . $operatorString; } /** * Prints an expression node with the least amount of parentheses necessary to preserve the meaning. * * @param Node $node Node to pretty print * @param int $parentPrecedence Precedence of the parent operator * @param int $parentAssociativity Associativity of parent operator * (-1 is left, 0 is nonassoc, 1 is right) * @param int $childPosition Position of the node relative to the operator * (-1 is left, 1 is right) * * @return string The pretty printed node */ protected function pPrec(Node $node, int $parentPrecedence, int $parentAssociativity, int $childPosition) : string { $class = \get_class($node); if (isset($this->precedenceMap[$class])) { $childPrecedence = $this->precedenceMap[$class][0]; if ($childPrecedence > $parentPrecedence || $parentPrecedence === $childPrecedence && $parentAssociativity !== $childPosition) { return '(' . $this->p($node) . ')'; } } return $this->p($node); } /** * Pretty prints an array of nodes and implodes the printed values. * * @param Node[] $nodes Array of Nodes to be printed * @param string $glue Character to implode with * * @return string Imploded pretty printed nodes */ protected function pImplode(array $nodes, string $glue = '') : string { $pNodes = []; foreach ($nodes as $node) { if (null === $node) { $pNodes[] = ''; } else { $pNodes[] = $this->p($node); } } return \implode($glue, $pNodes); } /** * Pretty prints an array of nodes and implodes the printed values with commas. * * @param Node[] $nodes Array of Nodes to be printed * * @return string Comma separated pretty printed nodes */ protected function pCommaSeparated(array $nodes) : string { return $this->pImplode($nodes, ', '); } /** * Pretty prints a comma-separated list of nodes in multiline style, including comments. * * The result includes a leading newline and one level of indentation (same as pStmts). * * @param Node[] $nodes Array of Nodes to be printed * @param bool $trailingComma Whether to use a trailing comma * * @return string Comma separated pretty printed nodes in multiline style */ protected function pCommaSeparatedMultiline(array $nodes, bool $trailingComma) : string { $this->indent(); $result = ''; $lastIdx = \count($nodes) - 1; foreach ($nodes as $idx => $node) { if ($node !== null) { $comments = $node->getComments(); if ($comments) { $result .= $this->nl . $this->pComments($comments); } $result .= $this->nl . $this->p($node); } else { $result .= $this->nl; } if ($trailingComma || $idx !== $lastIdx) { $result .= ','; } } $this->outdent(); return $result; } /** * Prints reformatted text of the passed comments. * * @param Comment[] $comments List of comments * * @return string Reformatted text of comments */ protected function pComments(array $comments) : string { $formattedComments = []; foreach ($comments as $comment) { $formattedComments[] = \str_replace("\n", $this->nl, $comment->getReformattedText()); } return \implode($this->nl, $formattedComments); } /** * Perform a format-preserving pretty print of an AST. * * The format preservation is best effort. For some changes to the AST the formatting will not * be preserved (at least not locally). * * In order to use this method a number of prerequisites must be satisfied: * * The startTokenPos and endTokenPos attributes in the lexer must be enabled. * * The CloningVisitor must be run on the AST prior to modification. * * The original tokens must be provided, using the getTokens() method on the lexer. * * @param Node[] $stmts Modified AST with links to original AST * @param Node[] $origStmts Original AST with token offset information * @param array $origTokens Tokens of the original code * * @return string */ public function printFormatPreserving(array $stmts, array $origStmts, array $origTokens) : string { $this->initializeNodeListDiffer(); $this->initializeLabelCharMap(); $this->initializeFixupMap(); $this->initializeRemovalMap(); $this->initializeInsertionMap(); $this->initializeListInsertionMap(); $this->initializeEmptyListInsertionMap(); $this->initializeModifierChangeMap(); $this->resetState(); $this->origTokens = new TokenStream($origTokens); $this->preprocessNodes($stmts); $pos = 0; $result = $this->pArray($stmts, $origStmts, $pos, 0, 'File', 'stmts', null); if (null !== $result) { $result .= $this->origTokens->getTokenCode($pos, \count($origTokens), 0); } else { // Fallback // TODO Add pStmts($stmts, \false); } return \ltrim($this->handleMagicTokens($result)); } protected function pFallback(Node $node) { return $this->{'p' . $node->getType()}($node); } /** * Pretty prints a node. * * This method also handles formatting preservation for nodes. * * @param Node $node Node to be pretty printed * @param bool $parentFormatPreserved Whether parent node has preserved formatting * * @return string Pretty printed node */ protected function p(Node $node, $parentFormatPreserved = \false) : string { // No orig tokens means this is a normal pretty print without preservation of formatting if (!$this->origTokens) { return $this->{'p' . $node->getType()}($node); } /** @var Node $origNode */ $origNode = $node->getAttribute('origNode'); if (null === $origNode) { return $this->pFallback($node); } $class = \get_class($node); \assert($class === \get_class($origNode)); $startPos = $origNode->getStartTokenPos(); $endPos = $origNode->getEndTokenPos(); \assert($startPos >= 0 && $endPos >= 0); $fallbackNode = $node; if ($node instanceof Expr\New_ && $node->class instanceof Stmt\Class_) { // Normalize node structure of anonymous classes $node = PrintableNewAnonClassNode::fromNewNode($node); $origNode = PrintableNewAnonClassNode::fromNewNode($origNode); } // InlineHTML node does not contain closing and opening PHP tags. If the parent formatting // is not preserved, then we need to use the fallback code to make sure the tags are // printed. if ($node instanceof Stmt\InlineHTML && !$parentFormatPreserved) { return $this->pFallback($fallbackNode); } $indentAdjustment = $this->indentLevel - $this->origTokens->getIndentationBefore($startPos); $type = $node->getType(); $fixupInfo = $this->fixupMap[$class] ?? null; $result = ''; $pos = $startPos; foreach ($node->getSubNodeNames() as $subNodeName) { $subNode = $node->{$subNodeName}; $origSubNode = $origNode->{$subNodeName}; if (!$subNode instanceof Node && $subNode !== null || !$origSubNode instanceof Node && $origSubNode !== null) { if ($subNode === $origSubNode) { // Unchanged, can reuse old code continue; } if (\is_array($subNode) && \is_array($origSubNode)) { // Array subnode changed, we might be able to reconstruct it $listResult = $this->pArray($subNode, $origSubNode, $pos, $indentAdjustment, $type, $subNodeName, $fixupInfo[$subNodeName] ?? null); if (null === $listResult) { return $this->pFallback($fallbackNode); } $result .= $listResult; continue; } if (\is_int($subNode) && \is_int($origSubNode)) { // Check if this is a modifier change $key = $type . '->' . $subNodeName; if (!isset($this->modifierChangeMap[$key])) { return $this->pFallback($fallbackNode); } $findToken = $this->modifierChangeMap[$key]; $result .= $this->pModifiers($subNode); $pos = $this->origTokens->findRight($pos, $findToken); continue; } // If a non-node, non-array subnode changed, we don't be able to do a partial // reconstructions, as we don't have enough offset information. Pretty print the // whole node instead. return $this->pFallback($fallbackNode); } $extraLeft = ''; $extraRight = ''; if ($origSubNode !== null) { $subStartPos = $origSubNode->getStartTokenPos(); $subEndPos = $origSubNode->getEndTokenPos(); \assert($subStartPos >= 0 && $subEndPos >= 0); } else { if ($subNode === null) { // Both null, nothing to do continue; } // A node has been inserted, check if we have insertion information for it $key = $type . '->' . $subNodeName; if (!isset($this->insertionMap[$key])) { return $this->pFallback($fallbackNode); } list($findToken, $beforeToken, $extraLeft, $extraRight) = $this->insertionMap[$key]; if (null !== $findToken) { $subStartPos = $this->origTokens->findRight($pos, $findToken) + (int) (!$beforeToken); } else { $subStartPos = $pos; } if (null === $extraLeft && null !== $extraRight) { // If inserting on the right only, skipping whitespace looks better $subStartPos = $this->origTokens->skipRightWhitespace($subStartPos); } $subEndPos = $subStartPos - 1; } if (null === $subNode) { // A node has been removed, check if we have removal information for it $key = $type . '->' . $subNodeName; if (!isset($this->removalMap[$key])) { return $this->pFallback($fallbackNode); } // Adjust positions to account for additional tokens that must be skipped $removalInfo = $this->removalMap[$key]; if (isset($removalInfo['left'])) { $subStartPos = $this->origTokens->skipLeft($subStartPos - 1, $removalInfo['left']) + 1; } if (isset($removalInfo['right'])) { $subEndPos = $this->origTokens->skipRight($subEndPos + 1, $removalInfo['right']) - 1; } } $result .= $this->origTokens->getTokenCode($pos, $subStartPos, $indentAdjustment); if (null !== $subNode) { $result .= $extraLeft; $origIndentLevel = $this->indentLevel; $this->setIndentLevel($this->origTokens->getIndentationBefore($subStartPos) + $indentAdjustment); // If it's the same node that was previously in this position, it certainly doesn't // need fixup. It's important to check this here, because our fixup checks are more // conservative than strictly necessary. if (isset($fixupInfo[$subNodeName]) && $subNode->getAttribute('origNode') !== $origSubNode) { $fixup = $fixupInfo[$subNodeName]; $res = $this->pFixup($fixup, $subNode, $class, $subStartPos, $subEndPos); } else { $res = $this->p($subNode, \true); } $this->safeAppend($result, $res); $this->setIndentLevel($origIndentLevel); $result .= $extraRight; } $pos = $subEndPos + 1; } $result .= $this->origTokens->getTokenCode($pos, $endPos + 1, $indentAdjustment); return $result; } /** * Perform a format-preserving pretty print of an array. * * @param array $nodes New nodes * @param array $origNodes Original nodes * @param int $pos Current token position (updated by reference) * @param int $indentAdjustment Adjustment for indentation * @param string $parentNodeType Type of the containing node. * @param string $subNodeName Name of array subnode. * @param null|int $fixup Fixup information for array item nodes * * @return null|string Result of pretty print or null if cannot preserve formatting */ protected function pArray(array $nodes, array $origNodes, int &$pos, int $indentAdjustment, string $parentNodeType, string $subNodeName, $fixup) { $diff = $this->nodeListDiffer->diffWithReplacements($origNodes, $nodes); $mapKey = $parentNodeType . '->' . $subNodeName; $insertStr = $this->listInsertionMap[$mapKey] ?? null; $isStmtList = $subNodeName === 'stmts'; $beforeFirstKeepOrReplace = \true; $skipRemovedNode = \false; $delayedAdd = []; $lastElemIndentLevel = $this->indentLevel; $insertNewline = \false; if ($insertStr === "\n") { $insertStr = ''; $insertNewline = \true; } if ($isStmtList && \count($origNodes) === 1 && \count($nodes) !== 1) { $startPos = $origNodes[0]->getStartTokenPos(); $endPos = $origNodes[0]->getEndTokenPos(); \assert($startPos >= 0 && $endPos >= 0); if (!$this->origTokens->haveBraces($startPos, $endPos)) { // This was a single statement without braces, but either additional statements // have been added, or the single statement has been removed. This requires the // addition of braces. For now fall back. // TODO: Try to preserve formatting return null; } } $result = ''; foreach ($diff as $i => $diffElem) { $diffType = $diffElem->type; /** @var Node|null $arrItem */ $arrItem = $diffElem->new; /** @var Node|null $origArrItem */ $origArrItem = $diffElem->old; if ($diffType === DiffElem::TYPE_KEEP || $diffType === DiffElem::TYPE_REPLACE) { $beforeFirstKeepOrReplace = \false; if ($origArrItem === null || $arrItem === null) { // We can only handle the case where both are null if ($origArrItem === $arrItem) { continue; } return null; } if (!$arrItem instanceof Node || !$origArrItem instanceof Node) { // We can only deal with nodes. This can occur for Names, which use string arrays. return null; } $itemStartPos = $origArrItem->getStartTokenPos(); $itemEndPos = $origArrItem->getEndTokenPos(); \assert($itemStartPos >= 0 && $itemEndPos >= 0 && $itemStartPos >= $pos); $origIndentLevel = $this->indentLevel; $lastElemIndentLevel = $this->origTokens->getIndentationBefore($itemStartPos) + $indentAdjustment; $this->setIndentLevel($lastElemIndentLevel); $comments = $arrItem->getComments(); $origComments = $origArrItem->getComments(); $commentStartPos = $origComments ? $origComments[0]->getStartTokenPos() : $itemStartPos; \assert($commentStartPos >= 0); if ($commentStartPos < $pos) { // Comments may be assigned to multiple nodes if they start at the same position. // Make sure we don't try to print them multiple times. $commentStartPos = $itemStartPos; } if ($skipRemovedNode) { if ($isStmtList && ($this->origTokens->haveBracesInRange($pos, $itemStartPos) || $this->origTokens->haveTagInRange($pos, $itemStartPos))) { // We'd remove the brace of a code block. // TODO: Preserve formatting. $this->setIndentLevel($origIndentLevel); return null; } } else { $result .= $this->origTokens->getTokenCode($pos, $commentStartPos, $indentAdjustment); } if (!empty($delayedAdd)) { /** @var Node $delayedAddNode */ foreach ($delayedAdd as $delayedAddNode) { if ($insertNewline) { $delayedAddComments = $delayedAddNode->getComments(); if ($delayedAddComments) { $result .= $this->pComments($delayedAddComments) . $this->nl; } } $this->safeAppend($result, $this->p($delayedAddNode, \true)); if ($insertNewline) { $result .= $insertStr . $this->nl; } else { $result .= $insertStr; } } $delayedAdd = []; } if ($comments !== $origComments) { if ($comments) { $result .= $this->pComments($comments) . $this->nl; } } else { $result .= $this->origTokens->getTokenCode($commentStartPos, $itemStartPos, $indentAdjustment); } // If we had to remove anything, we have done so now. $skipRemovedNode = \false; } elseif ($diffType === DiffElem::TYPE_ADD) { if (null === $insertStr) { // We don't have insertion information for this list type return null; } // We go multiline if the original code was multiline, // or if it's an array item with a comment above it. if ($insertStr === ', ' && ($this->isMultiline($origNodes) || $arrItem->getComments())) { $insertStr = ','; $insertNewline = \true; } if ($beforeFirstKeepOrReplace) { // Will be inserted at the next "replace" or "keep" element $delayedAdd[] = $arrItem; continue; } $itemStartPos = $pos; $itemEndPos = $pos - 1; $origIndentLevel = $this->indentLevel; $this->setIndentLevel($lastElemIndentLevel); if ($insertNewline) { $result .= $insertStr . $this->nl; $comments = $arrItem->getComments(); if ($comments) { $result .= $this->pComments($comments) . $this->nl; } } else { $result .= $insertStr; } } elseif ($diffType === DiffElem::TYPE_REMOVE) { if (!$origArrItem instanceof Node) { // We only support removal for nodes return null; } $itemStartPos = $origArrItem->getStartTokenPos(); $itemEndPos = $origArrItem->getEndTokenPos(); \assert($itemStartPos >= 0 && $itemEndPos >= 0); // Consider comments part of the node. $origComments = $origArrItem->getComments(); if ($origComments) { $itemStartPos = $origComments[0]->getStartTokenPos(); } if ($i === 0) { // If we're removing from the start, keep the tokens before the node and drop those after it, // instead of the other way around. $result .= $this->origTokens->getTokenCode($pos, $itemStartPos, $indentAdjustment); $skipRemovedNode = \true; } else { if ($isStmtList && ($this->origTokens->haveBracesInRange($pos, $itemStartPos) || $this->origTokens->haveTagInRange($pos, $itemStartPos))) { // We'd remove the brace of a code block. // TODO: Preserve formatting. return null; } } $pos = $itemEndPos + 1; continue; } else { throw new \Exception("Shouldn't happen"); } if (null !== $fixup && $arrItem->getAttribute('origNode') !== $origArrItem) { $res = $this->pFixup($fixup, $arrItem, null, $itemStartPos, $itemEndPos); } else { $res = $this->p($arrItem, \true); } $this->safeAppend($result, $res); $this->setIndentLevel($origIndentLevel); $pos = $itemEndPos + 1; } if ($skipRemovedNode) { // TODO: Support removing single node. return null; } if (!empty($delayedAdd)) { if (!isset($this->emptyListInsertionMap[$mapKey])) { return null; } list($findToken, $extraLeft, $extraRight) = $this->emptyListInsertionMap[$mapKey]; if (null !== $findToken) { $insertPos = $this->origTokens->findRight($pos, $findToken) + 1; $result .= $this->origTokens->getTokenCode($pos, $insertPos, $indentAdjustment); $pos = $insertPos; } $first = \true; $result .= $extraLeft; foreach ($delayedAdd as $delayedAddNode) { if (!$first) { $result .= $insertStr; if ($insertNewline) { $result .= $this->nl; } } $result .= $this->p($delayedAddNode, \true); $first = \false; } $result .= $extraRight === "\n" ? $this->nl : $extraRight; } return $result; } /** * Print node with fixups. * * Fixups here refer to the addition of extra parentheses, braces or other characters, that * are required to preserve program semantics in a certain context (e.g. to maintain precedence * or because only certain expressions are allowed in certain places). * * @param int $fixup Fixup type * @param Node $subNode Subnode to print * @param string|null $parentClass Class of parent node * @param int $subStartPos Original start pos of subnode * @param int $subEndPos Original end pos of subnode * * @return string Result of fixed-up print of subnode */ protected function pFixup(int $fixup, Node $subNode, $parentClass, int $subStartPos, int $subEndPos) : string { switch ($fixup) { case self::FIXUP_PREC_LEFT: case self::FIXUP_PREC_RIGHT: if (!$this->origTokens->haveParens($subStartPos, $subEndPos)) { list($precedence, $associativity) = $this->precedenceMap[$parentClass]; return $this->pPrec($subNode, $precedence, $associativity, $fixup === self::FIXUP_PREC_LEFT ? -1 : 1); } break; case self::FIXUP_CALL_LHS: if ($this->callLhsRequiresParens($subNode) && !$this->origTokens->haveParens($subStartPos, $subEndPos)) { return '(' . $this->p($subNode) . ')'; } break; case self::FIXUP_DEREF_LHS: if ($this->dereferenceLhsRequiresParens($subNode) && !$this->origTokens->haveParens($subStartPos, $subEndPos)) { return '(' . $this->p($subNode) . ')'; } break; case self::FIXUP_BRACED_NAME: case self::FIXUP_VAR_BRACED_NAME: if ($subNode instanceof Expr && !$this->origTokens->haveBraces($subStartPos, $subEndPos)) { return ($fixup === self::FIXUP_VAR_BRACED_NAME ? '$' : '') . '{' . $this->p($subNode) . '}'; } break; case self::FIXUP_ENCAPSED: if (!$subNode instanceof Scalar\EncapsedStringPart && !$this->origTokens->haveBraces($subStartPos, $subEndPos)) { return '{' . $this->p($subNode) . '}'; } break; default: throw new \Exception('Cannot happen'); } // Nothing special to do return $this->p($subNode); } /** * Appends to a string, ensuring whitespace between label characters. * * Example: "echo" and "$x" result in "echo$x", but "echo" and "x" result in "echo x". * Without safeAppend the result would be "echox", which does not preserve semantics. * * @param string $str * @param string $append */ protected function safeAppend(string &$str, string $append) { if ($str === "") { $str = $append; return; } if ($append === "") { return; } if (!$this->labelCharMap[$append[0]] || !$this->labelCharMap[$str[\strlen($str) - 1]]) { $str .= $append; } else { $str .= " " . $append; } } /** * Determines whether the LHS of a call must be wrapped in parenthesis. * * @param Node $node LHS of a call * * @return bool Whether parentheses are required */ protected function callLhsRequiresParens(Node $node) : bool { return !($node instanceof Node\Name || $node instanceof Expr\Variable || $node instanceof Expr\ArrayDimFetch || $node instanceof Expr\FuncCall || $node instanceof Expr\MethodCall || $node instanceof Expr\NullsafeMethodCall || $node instanceof Expr\StaticCall || $node instanceof Expr\Array_); } /** * Determines whether the LHS of a dereferencing operation must be wrapped in parenthesis. * * @param Node $node LHS of dereferencing operation * * @return bool Whether parentheses are required */ protected function dereferenceLhsRequiresParens(Node $node) : bool { return !($node instanceof Expr\Variable || $node instanceof Node\Name || $node instanceof Expr\ArrayDimFetch || $node instanceof Expr\PropertyFetch || $node instanceof Expr\NullsafePropertyFetch || $node instanceof Expr\StaticPropertyFetch || $node instanceof Expr\FuncCall || $node instanceof Expr\MethodCall || $node instanceof Expr\NullsafeMethodCall || $node instanceof Expr\StaticCall || $node instanceof Expr\Array_ || $node instanceof Scalar\String_ || $node instanceof Expr\ConstFetch || $node instanceof Expr\ClassConstFetch); } /** * Print modifiers, including trailing whitespace. * * @param int $modifiers Modifier mask to print * * @return string Printed modifiers */ protected function pModifiers(int $modifiers) { return ($modifiers & Stmt\Class_::MODIFIER_PUBLIC ? 'public ' : '') . ($modifiers & Stmt\Class_::MODIFIER_PROTECTED ? 'protected ' : '') . ($modifiers & Stmt\Class_::MODIFIER_PRIVATE ? 'private ' : '') . ($modifiers & Stmt\Class_::MODIFIER_STATIC ? 'static ' : '') . ($modifiers & Stmt\Class_::MODIFIER_ABSTRACT ? 'abstract ' : '') . ($modifiers & Stmt\Class_::MODIFIER_FINAL ? 'final ' : '') . ($modifiers & Stmt\Class_::MODIFIER_READONLY ? 'readonly ' : ''); } /** * Determine whether a list of nodes uses multiline formatting. * * @param (Node|null)[] $nodes Node list * * @return bool Whether multiline formatting is used */ protected function isMultiline(array $nodes) : bool { if (\count($nodes) < 2) { return \false; } $pos = -1; foreach ($nodes as $node) { if (null === $node) { continue; } $endPos = $node->getEndTokenPos() + 1; if ($pos >= 0) { $text = $this->origTokens->getTokenCode($pos, $endPos, 0); if (\false === \strpos($text, "\n")) { // We require that a newline is present between *every* item. If the formatting // is inconsistent, with only some items having newlines, we don't consider it // as multiline return \false; } } $pos = $endPos; } return \true; } /** * Lazily initializes label char map. * * The label char map determines whether a certain character may occur in a label. */ protected function initializeLabelCharMap() { if ($this->labelCharMap) { return; } $this->labelCharMap = []; for ($i = 0; $i < 256; $i++) { // Since PHP 7.1 The lower range is 0x80. However, we also want to support code for // older versions. $chr = \chr($i); $this->labelCharMap[$chr] = $i >= 0x7f || \ctype_alnum($chr); } } /** * Lazily initializes node list differ. * * The node list differ is used to determine differences between two array subnodes. */ protected function initializeNodeListDiffer() { if ($this->nodeListDiffer) { return; } $this->nodeListDiffer = new Internal\Differ(function ($a, $b) { if ($a instanceof Node && $b instanceof Node) { return $a === $b->getAttribute('origNode'); } // Can happen for array destructuring return $a === null && $b === null; }); } /** * Lazily initializes fixup map. * * The fixup map is used to determine whether a certain subnode of a certain node may require * some kind of "fixup" operation, e.g. the addition of parenthesis or braces. */ protected function initializeFixupMap() { if ($this->fixupMap) { return; } $this->fixupMap = [ Expr\PreInc::class => ['var' => self::FIXUP_PREC_RIGHT], Expr\PreDec::class => ['var' => self::FIXUP_PREC_RIGHT], Expr\PostInc::class => ['var' => self::FIXUP_PREC_LEFT], Expr\PostDec::class => ['var' => self::FIXUP_PREC_LEFT], Expr\Instanceof_::class => ['expr' => self::FIXUP_PREC_LEFT, 'class' => self::FIXUP_PREC_RIGHT], Expr\Ternary::class => ['cond' => self::FIXUP_PREC_LEFT, 'else' => self::FIXUP_PREC_RIGHT], Expr\FuncCall::class => ['name' => self::FIXUP_CALL_LHS], Expr\StaticCall::class => ['class' => self::FIXUP_DEREF_LHS], Expr\ArrayDimFetch::class => ['var' => self::FIXUP_DEREF_LHS], Expr\ClassConstFetch::class => ['var' => self::FIXUP_DEREF_LHS], Expr\New_::class => ['class' => self::FIXUP_DEREF_LHS], // TODO: FIXUP_NEW_VARIABLE Expr\MethodCall::class => ['var' => self::FIXUP_DEREF_LHS, 'name' => self::FIXUP_BRACED_NAME], Expr\NullsafeMethodCall::class => ['var' => self::FIXUP_DEREF_LHS, 'name' => self::FIXUP_BRACED_NAME], Expr\StaticPropertyFetch::class => ['class' => self::FIXUP_DEREF_LHS, 'name' => self::FIXUP_VAR_BRACED_NAME], Expr\PropertyFetch::class => ['var' => self::FIXUP_DEREF_LHS, 'name' => self::FIXUP_BRACED_NAME], Expr\NullsafePropertyFetch::class => ['var' => self::FIXUP_DEREF_LHS, 'name' => self::FIXUP_BRACED_NAME], Scalar\Encapsed::class => ['parts' => self::FIXUP_ENCAPSED], ]; $binaryOps = [BinaryOp\Pow::class, BinaryOp\Mul::class, BinaryOp\Div::class, BinaryOp\Mod::class, BinaryOp\Plus::class, BinaryOp\Minus::class, BinaryOp\Concat::class, BinaryOp\ShiftLeft::class, BinaryOp\ShiftRight::class, BinaryOp\Smaller::class, BinaryOp\SmallerOrEqual::class, BinaryOp\Greater::class, BinaryOp\GreaterOrEqual::class, BinaryOp\Equal::class, BinaryOp\NotEqual::class, BinaryOp\Identical::class, BinaryOp\NotIdentical::class, BinaryOp\Spaceship::class, BinaryOp\BitwiseAnd::class, BinaryOp\BitwiseXor::class, BinaryOp\BitwiseOr::class, BinaryOp\BooleanAnd::class, BinaryOp\BooleanOr::class, BinaryOp\Coalesce::class, BinaryOp\LogicalAnd::class, BinaryOp\LogicalXor::class, BinaryOp\LogicalOr::class]; foreach ($binaryOps as $binaryOp) { $this->fixupMap[$binaryOp] = ['left' => self::FIXUP_PREC_LEFT, 'right' => self::FIXUP_PREC_RIGHT]; } $assignOps = [Expr\Assign::class, Expr\AssignRef::class, AssignOp\Plus::class, AssignOp\Minus::class, AssignOp\Mul::class, AssignOp\Div::class, AssignOp\Concat::class, AssignOp\Mod::class, AssignOp\BitwiseAnd::class, AssignOp\BitwiseOr::class, AssignOp\BitwiseXor::class, AssignOp\ShiftLeft::class, AssignOp\ShiftRight::class, AssignOp\Pow::class, AssignOp\Coalesce::class]; foreach ($assignOps as $assignOp) { $this->fixupMap[$assignOp] = ['var' => self::FIXUP_PREC_LEFT, 'expr' => self::FIXUP_PREC_RIGHT]; } $prefixOps = [Expr\BitwiseNot::class, Expr\BooleanNot::class, Expr\UnaryPlus::class, Expr\UnaryMinus::class, Cast\Int_::class, Cast\Double::class, Cast\String_::class, Cast\Array_::class, Cast\Object_::class, Cast\Bool_::class, Cast\Unset_::class, Expr\ErrorSuppress::class, Expr\YieldFrom::class, Expr\Print_::class, Expr\Include_::class]; foreach ($prefixOps as $prefixOp) { $this->fixupMap[$prefixOp] = ['expr' => self::FIXUP_PREC_RIGHT]; } } /** * Lazily initializes the removal map. * * The removal map is used to determine which additional tokens should be removed when a * certain node is replaced by null. */ protected function initializeRemovalMap() { if ($this->removalMap) { return; } $stripBoth = ['left' => \T_WHITESPACE, 'right' => \T_WHITESPACE]; $stripLeft = ['left' => \T_WHITESPACE]; $stripRight = ['right' => \T_WHITESPACE]; $stripDoubleArrow = ['right' => \T_DOUBLE_ARROW]; $stripColon = ['left' => ':']; $stripEquals = ['left' => '=']; $this->removalMap = ['Expr_ArrayDimFetch->dim' => $stripBoth, 'Expr_ArrayItem->key' => $stripDoubleArrow, 'Expr_ArrowFunction->returnType' => $stripColon, 'Expr_Closure->returnType' => $stripColon, 'Expr_Exit->expr' => $stripBoth, 'Expr_Ternary->if' => $stripBoth, 'Expr_Yield->key' => $stripDoubleArrow, 'Expr_Yield->value' => $stripBoth, 'Param->type' => $stripRight, 'Param->default' => $stripEquals, 'Stmt_Break->num' => $stripBoth, 'Stmt_Catch->var' => $stripLeft, 'Stmt_ClassMethod->returnType' => $stripColon, 'Stmt_Class->extends' => ['left' => \T_EXTENDS], 'Stmt_Enum->scalarType' => $stripColon, 'Stmt_EnumCase->expr' => $stripEquals, 'Expr_PrintableNewAnonClass->extends' => ['left' => \T_EXTENDS], 'Stmt_Continue->num' => $stripBoth, 'Stmt_Foreach->keyVar' => $stripDoubleArrow, 'Stmt_Function->returnType' => $stripColon, 'Stmt_If->else' => $stripLeft, 'Stmt_Namespace->name' => $stripLeft, 'Stmt_Property->type' => $stripRight, 'Stmt_PropertyProperty->default' => $stripEquals, 'Stmt_Return->expr' => $stripBoth, 'Stmt_StaticVar->default' => $stripEquals, 'Stmt_TraitUseAdaptation_Alias->newName' => $stripLeft, 'Stmt_TryCatch->finally' => $stripLeft]; } protected function initializeInsertionMap() { if ($this->insertionMap) { return; } // TODO: "yield" where both key and value are inserted doesn't work // [$find, $beforeToken, $extraLeft, $extraRight] $this->insertionMap = [ 'Expr_ArrayDimFetch->dim' => ['[', \false, null, null], 'Expr_ArrayItem->key' => [null, \false, null, ' => '], 'Expr_ArrowFunction->returnType' => [')', \false, ' : ', null], 'Expr_Closure->returnType' => [')', \false, ' : ', null], 'Expr_Ternary->if' => ['?', \false, ' ', ' '], 'Expr_Yield->key' => [\T_YIELD, \false, null, ' => '], 'Expr_Yield->value' => [\T_YIELD, \false, ' ', null], 'Param->type' => [null, \false, null, ' '], 'Param->default' => [null, \false, ' = ', null], 'Stmt_Break->num' => [\T_BREAK, \false, ' ', null], 'Stmt_Catch->var' => [null, \false, ' ', null], 'Stmt_ClassMethod->returnType' => [')', \false, ' : ', null], 'Stmt_Class->extends' => [null, \false, ' extends ', null], 'Stmt_Enum->scalarType' => [null, \false, ' : ', null], 'Stmt_EnumCase->expr' => [null, \false, ' = ', null], 'Expr_PrintableNewAnonClass->extends' => [null, ' extends ', null], 'Stmt_Continue->num' => [\T_CONTINUE, \false, ' ', null], 'Stmt_Foreach->keyVar' => [\T_AS, \false, null, ' => '], 'Stmt_Function->returnType' => [')', \false, ' : ', null], 'Stmt_If->else' => [null, \false, ' ', null], 'Stmt_Namespace->name' => [\T_NAMESPACE, \false, ' ', null], 'Stmt_Property->type' => [\T_VARIABLE, \true, null, ' '], 'Stmt_PropertyProperty->default' => [null, \false, ' = ', null], 'Stmt_Return->expr' => [\T_RETURN, \false, ' ', null], 'Stmt_StaticVar->default' => [null, \false, ' = ', null], //'Stmt_TraitUseAdaptation_Alias->newName' => [T_AS, false, ' ', null], // TODO 'Stmt_TryCatch->finally' => [null, \false, ' ', null], ]; } protected function initializeListInsertionMap() { if ($this->listInsertionMap) { return; } $this->listInsertionMap = [ // special //'Expr_ShellExec->parts' => '', // TODO These need to be treated more carefully //'Scalar_Encapsed->parts' => '', 'Stmt_Catch->types' => '|', 'UnionType->types' => '|', 'IntersectionType->types' => '&', 'Stmt_If->elseifs' => ' ', 'Stmt_TryCatch->catches' => ' ', // comma-separated lists 'Expr_Array->items' => ', ', 'Expr_ArrowFunction->params' => ', ', 'Expr_Closure->params' => ', ', 'Expr_Closure->uses' => ', ', 'Expr_FuncCall->args' => ', ', 'Expr_Isset->vars' => ', ', 'Expr_List->items' => ', ', 'Expr_MethodCall->args' => ', ', 'Expr_NullsafeMethodCall->args' => ', ', 'Expr_New->args' => ', ', 'Expr_PrintableNewAnonClass->args' => ', ', 'Expr_StaticCall->args' => ', ', 'Stmt_ClassConst->consts' => ', ', 'Stmt_ClassMethod->params' => ', ', 'Stmt_Class->implements' => ', ', 'Stmt_Enum->implements' => ', ', 'Expr_PrintableNewAnonClass->implements' => ', ', 'Stmt_Const->consts' => ', ', 'Stmt_Declare->declares' => ', ', 'Stmt_Echo->exprs' => ', ', 'Stmt_For->init' => ', ', 'Stmt_For->cond' => ', ', 'Stmt_For->loop' => ', ', 'Stmt_Function->params' => ', ', 'Stmt_Global->vars' => ', ', 'Stmt_GroupUse->uses' => ', ', 'Stmt_Interface->extends' => ', ', 'Stmt_Match->arms' => ', ', 'Stmt_Property->props' => ', ', 'Stmt_StaticVar->vars' => ', ', 'Stmt_TraitUse->traits' => ', ', 'Stmt_TraitUseAdaptation_Precedence->insteadof' => ', ', 'Stmt_Unset->vars' => ', ', 'Stmt_Use->uses' => ', ', 'MatchArm->conds' => ', ', 'AttributeGroup->attrs' => ', ', // statement lists 'Expr_Closure->stmts' => "\n", 'Stmt_Case->stmts' => "\n", 'Stmt_Catch->stmts' => "\n", 'Stmt_Class->stmts' => "\n", 'Stmt_Enum->stmts' => "\n", 'Expr_PrintableNewAnonClass->stmts' => "\n", 'Stmt_Interface->stmts' => "\n", 'Stmt_Trait->stmts' => "\n", 'Stmt_ClassMethod->stmts' => "\n", 'Stmt_Declare->stmts' => "\n", 'Stmt_Do->stmts' => "\n", 'Stmt_ElseIf->stmts' => "\n", 'Stmt_Else->stmts' => "\n", 'Stmt_Finally->stmts' => "\n", 'Stmt_Foreach->stmts' => "\n", 'Stmt_For->stmts' => "\n", 'Stmt_Function->stmts' => "\n", 'Stmt_If->stmts' => "\n", 'Stmt_Namespace->stmts' => "\n", 'Stmt_Class->attrGroups' => "\n", 'Stmt_Enum->attrGroups' => "\n", 'Stmt_EnumCase->attrGroups' => "\n", 'Stmt_Interface->attrGroups' => "\n", 'Stmt_Trait->attrGroups' => "\n", 'Stmt_Function->attrGroups' => "\n", 'Stmt_ClassMethod->attrGroups' => "\n", 'Stmt_ClassConst->attrGroups' => "\n", 'Stmt_Property->attrGroups' => "\n", 'Expr_PrintableNewAnonClass->attrGroups' => ' ', 'Expr_Closure->attrGroups' => ' ', 'Expr_ArrowFunction->attrGroups' => ' ', 'Param->attrGroups' => ' ', 'Stmt_Switch->cases' => "\n", 'Stmt_TraitUse->adaptations' => "\n", 'Stmt_TryCatch->stmts' => "\n", 'Stmt_While->stmts' => "\n", // dummy for top-level context 'File->stmts' => "\n", ]; } protected function initializeEmptyListInsertionMap() { if ($this->emptyListInsertionMap) { return; } // TODO Insertion into empty statement lists. // [$find, $extraLeft, $extraRight] $this->emptyListInsertionMap = ['Expr_ArrowFunction->params' => ['(', '', ''], 'Expr_Closure->uses' => [')', ' use(', ')'], 'Expr_Closure->params' => ['(', '', ''], 'Expr_FuncCall->args' => ['(', '', ''], 'Expr_MethodCall->args' => ['(', '', ''], 'Expr_NullsafeMethodCall->args' => ['(', '', ''], 'Expr_New->args' => ['(', '', ''], 'Expr_PrintableNewAnonClass->args' => ['(', '', ''], 'Expr_PrintableNewAnonClass->implements' => [null, ' implements ', ''], 'Expr_StaticCall->args' => ['(', '', ''], 'Stmt_Class->implements' => [null, ' implements ', ''], 'Stmt_Enum->implements' => [null, ' implements ', ''], 'Stmt_ClassMethod->params' => ['(', '', ''], 'Stmt_Interface->extends' => [null, ' extends ', ''], 'Stmt_Function->params' => ['(', '', ''], 'Stmt_Interface->attrGroups' => [null, '', "\n"], 'Stmt_Class->attrGroups' => [null, '', "\n"], 'Stmt_ClassConst->attrGroups' => [null, '', "\n"], 'Stmt_ClassMethod->attrGroups' => [null, '', "\n"], 'Stmt_Function->attrGroups' => [null, '', "\n"], 'Stmt_Property->attrGroups' => [null, '', "\n"], 'Stmt_Trait->attrGroups' => [null, '', "\n"], 'Expr_ArrowFunction->attrGroups' => [null, '', ' '], 'Expr_Closure->attrGroups' => [null, '', ' '], 'Expr_PrintableNewAnonClass->attrGroups' => [\T_NEW, ' ', '']]; } protected function initializeModifierChangeMap() { if ($this->modifierChangeMap) { return; } $this->modifierChangeMap = ['Stmt_ClassConst->flags' => \T_CONST, 'Stmt_ClassMethod->flags' => \T_FUNCTION, 'Stmt_Class->flags' => \T_CLASS, 'Stmt_Property->flags' => \T_VARIABLE, 'Param->flags' => \T_VARIABLE]; // List of integer subnodes that are not modifiers: // Expr_Include->type // Stmt_GroupUse->type // Stmt_Use->type // Stmt_UseUse->type } } text = $text; $this->startLine = $startLine; $this->startFilePos = $startFilePos; $this->startTokenPos = $startTokenPos; $this->endLine = $endLine; $this->endFilePos = $endFilePos; $this->endTokenPos = $endTokenPos; } /** * Gets the comment text. * * @return string The comment text (including comment delimiters like /*) */ public function getText() : string { return $this->text; } /** * Gets the line number the comment started on. * * @return int Line number (or -1 if not available) */ public function getStartLine() : int { return $this->startLine; } /** * Gets the file offset the comment started on. * * @return int File offset (or -1 if not available) */ public function getStartFilePos() : int { return $this->startFilePos; } /** * Gets the token offset the comment started on. * * @return int Token offset (or -1 if not available) */ public function getStartTokenPos() : int { return $this->startTokenPos; } /** * Gets the line number the comment ends on. * * @return int Line number (or -1 if not available) */ public function getEndLine() : int { return $this->endLine; } /** * Gets the file offset the comment ends on. * * @return int File offset (or -1 if not available) */ public function getEndFilePos() : int { return $this->endFilePos; } /** * Gets the token offset the comment ends on. * * @return int Token offset (or -1 if not available) */ public function getEndTokenPos() : int { return $this->endTokenPos; } /** * Gets the line number the comment started on. * * @deprecated Use getStartLine() instead * * @return int Line number */ public function getLine() : int { return $this->startLine; } /** * Gets the file offset the comment started on. * * @deprecated Use getStartFilePos() instead * * @return int File offset */ public function getFilePos() : int { return $this->startFilePos; } /** * Gets the token offset the comment started on. * * @deprecated Use getStartTokenPos() instead * * @return int Token offset */ public function getTokenPos() : int { return $this->startTokenPos; } /** * Gets the comment text. * * @return string The comment text (including comment delimiters like /*) */ public function __toString() : string { return $this->text; } /** * Gets the reformatted comment text. * * "Reformatted" here means that we try to clean up the whitespace at the * starts of the lines. This is necessary because we receive the comments * without trailing whitespace on the first line, but with trailing whitespace * on all subsequent lines. * * @return mixed|string */ public function getReformattedText() { $text = \trim($this->text); $newlinePos = \strpos($text, "\n"); if (\false === $newlinePos) { // Single line comments don't need further processing return $text; } elseif (\preg_match('((*BSR_ANYCRLF)(*ANYCRLF)^.*(?:\\R\\s+\\*.*)+$)', $text)) { // Multi line comment of the type // // /* // * Some text. // * Some more text. // */ // // is handled by replacing the whitespace sequences before the * by a single space return \preg_replace('(^\\s+\\*)m', ' *', $this->text); } elseif (\preg_match('(^/\\*\\*?\\s*[\\r\\n])', $text) && \preg_match('(\\n(\\s*)\\*/$)', $text, $matches)) { // Multi line comment of the type // // /* // Some text. // Some more text. // */ // // is handled by removing the whitespace sequence on the line before the closing // */ on all lines. So if the last line is " */", then " " is removed at the // start of all lines. return \preg_replace('(^' . \preg_quote($matches[1]) . ')m', '', $text); } elseif (\preg_match('(^/\\*\\*?\\s*(?!\\s))', $text, $matches)) { // Multi line comment of the type // // /* Some text. // Some more text. // Indented text. // Even more text. */ // // is handled by removing the difference between the shortest whitespace prefix on all // lines and the length of the "/* " opening sequence. $prefixLen = $this->getShortestWhitespacePrefixLen(\substr($text, $newlinePos + 1)); $removeLen = $prefixLen - \strlen($matches[0]); return \preg_replace('(^\\s{' . $removeLen . '})m', '', $text); } // No idea how to format this comment, so simply return as is return $text; } /** * Get length of shortest whitespace prefix (at the start of a line). * * If there is a line with no prefix whitespace, 0 is a valid return value. * * @param string $str String to check * @return int Length in characters. Tabs count as single characters. */ private function getShortestWhitespacePrefixLen(string $str) : int { $lines = \explode("\n", $str); $shortestPrefixLen = \INF; foreach ($lines as $line) { \preg_match('(^\\s*)', $line, $matches); $prefixLen = \strlen($matches[0]); if ($prefixLen < $shortestPrefixLen) { $shortestPrefixLen = $prefixLen; } } return $shortestPrefixLen; } /** * @return array * @psalm-return array{nodeType:string, text:mixed, line:mixed, filePos:mixed} */ public function jsonSerialize() : array { // Technically not a node, but we make it look like one anyway $type = $this instanceof Comment\Doc ? 'Comment_Doc' : 'Comment'; return [ 'nodeType' => $type, 'text' => $this->text, // TODO: Rename these to include "start". 'line' => $this->startLine, 'filePos' => $this->startFilePos, 'tokenPos' => $this->startTokenPos, 'endLine' => $this->endLine, 'endFilePos' => $this->endFilePos, 'endTokenPos' => $this->endTokenPos, ]; } } errors[] = $error; } /** * Get collected errors. * * @return Error[] */ public function getErrors() : array { return $this->errors; } /** * Check whether there are any errors. * * @return bool */ public function hasErrors() : bool { return !empty($this->errors); } /** * Reset/clear collected errors. */ public function clearErrors() { $this->errors = []; } } fallbackEvaluator = $fallbackEvaluator ?? function (Expr $expr) { throw new ConstExprEvaluationException("Expression of type {$expr->getType()} cannot be evaluated"); }; } /** * Silently evaluates a constant expression into a PHP value. * * Thrown Errors, warnings or notices will be converted into a ConstExprEvaluationException. * The original source of the exception is available through getPrevious(). * * If some part of the expression cannot be evaluated, the fallback evaluator passed to the * constructor will be invoked. By default, if no fallback is provided, an exception of type * ConstExprEvaluationException is thrown. * * See class doc comment for caveats and limitations. * * @param Expr $expr Constant expression to evaluate * @return mixed Result of evaluation * * @throws ConstExprEvaluationException if the expression cannot be evaluated or an error occurred */ public function evaluateSilently(Expr $expr) { \set_error_handler(function ($num, $str, $file, $line) { throw new \ErrorException($str, 0, $num, $file, $line); }); try { return $this->evaluate($expr); } catch (\Throwable $e) { if (!$e instanceof ConstExprEvaluationException) { $e = new ConstExprEvaluationException("An error occurred during constant expression evaluation", 0, $e); } throw $e; } finally { \restore_error_handler(); } } /** * Directly evaluates a constant expression into a PHP value. * * May generate Error exceptions, warnings or notices. Use evaluateSilently() to convert these * into a ConstExprEvaluationException. * * If some part of the expression cannot be evaluated, the fallback evaluator passed to the * constructor will be invoked. By default, if no fallback is provided, an exception of type * ConstExprEvaluationException is thrown. * * See class doc comment for caveats and limitations. * * @param Expr $expr Constant expression to evaluate * @return mixed Result of evaluation * * @throws ConstExprEvaluationException if the expression cannot be evaluated */ public function evaluateDirectly(Expr $expr) { return $this->evaluate($expr); } private function evaluate(Expr $expr) { if ($expr instanceof Scalar\LNumber || $expr instanceof Scalar\DNumber || $expr instanceof Scalar\String_) { return $expr->value; } if ($expr instanceof Expr\Array_) { return $this->evaluateArray($expr); } // Unary operators if ($expr instanceof Expr\UnaryPlus) { return +$this->evaluate($expr->expr); } if ($expr instanceof Expr\UnaryMinus) { return -$this->evaluate($expr->expr); } if ($expr instanceof Expr\BooleanNot) { return !$this->evaluate($expr->expr); } if ($expr instanceof Expr\BitwiseNot) { return ~$this->evaluate($expr->expr); } if ($expr instanceof Expr\BinaryOp) { return $this->evaluateBinaryOp($expr); } if ($expr instanceof Expr\Ternary) { return $this->evaluateTernary($expr); } if ($expr instanceof Expr\ArrayDimFetch && null !== $expr->dim) { return $this->evaluate($expr->var)[$this->evaluate($expr->dim)]; } if ($expr instanceof Expr\ConstFetch) { return $this->evaluateConstFetch($expr); } return ($this->fallbackEvaluator)($expr); } private function evaluateArray(Expr\Array_ $expr) { $array = []; foreach ($expr->items as $item) { if (null !== $item->key) { $array[$this->evaluate($item->key)] = $this->evaluate($item->value); } elseif ($item->unpack) { $array = array_merge($array, $this->evaluate($item->value)); } else { $array[] = $this->evaluate($item->value); } } return $array; } private function evaluateTernary(Expr\Ternary $expr) { if (null === $expr->if) { return $this->evaluate($expr->cond) ?: $this->evaluate($expr->else); } return $this->evaluate($expr->cond) ? $this->evaluate($expr->if) : $this->evaluate($expr->else); } private function evaluateBinaryOp(Expr\BinaryOp $expr) { if ($expr instanceof Expr\BinaryOp\Coalesce && $expr->left instanceof Expr\ArrayDimFetch) { // This needs to be special cased to respect BP_VAR_IS fetch semantics return $this->evaluate($expr->left->var)[$this->evaluate($expr->left->dim)] ?? $this->evaluate($expr->right); } // The evaluate() calls are repeated in each branch, because some of the operators are // short-circuiting and evaluating the RHS in advance may be illegal in that case $l = $expr->left; $r = $expr->right; switch ($expr->getOperatorSigil()) { case '&': return $this->evaluate($l) & $this->evaluate($r); case '|': return $this->evaluate($l) | $this->evaluate($r); case '^': return $this->evaluate($l) ^ $this->evaluate($r); case '&&': return $this->evaluate($l) && $this->evaluate($r); case '||': return $this->evaluate($l) || $this->evaluate($r); case '??': return $this->evaluate($l) ?? $this->evaluate($r); case '.': return $this->evaluate($l) . $this->evaluate($r); case '/': return $this->evaluate($l) / $this->evaluate($r); case '==': return $this->evaluate($l) == $this->evaluate($r); case '>': return $this->evaluate($l) > $this->evaluate($r); case '>=': return $this->evaluate($l) >= $this->evaluate($r); case '===': return $this->evaluate($l) === $this->evaluate($r); case 'and': return $this->evaluate($l) and $this->evaluate($r); case 'or': return $this->evaluate($l) or $this->evaluate($r); case 'xor': return $this->evaluate($l) xor $this->evaluate($r); case '-': return $this->evaluate($l) - $this->evaluate($r); case '%': return $this->evaluate($l) % $this->evaluate($r); case '*': return $this->evaluate($l) * $this->evaluate($r); case '!=': return $this->evaluate($l) != $this->evaluate($r); case '!==': return $this->evaluate($l) !== $this->evaluate($r); case '+': return $this->evaluate($l) + $this->evaluate($r); case '**': return $this->evaluate($l) ** $this->evaluate($r); case '<<': return $this->evaluate($l) << $this->evaluate($r); case '>>': return $this->evaluate($l) >> $this->evaluate($r); case '<': return $this->evaluate($l) < $this->evaluate($r); case '<=': return $this->evaluate($l) <= $this->evaluate($r); case '<=>': return $this->evaluate($l) <=> $this->evaluate($r); } throw new \Exception('Should not happen'); } private function evaluateConstFetch(Expr\ConstFetch $expr) { $name = $expr->name->toLowerString(); switch ($name) { case 'null': return null; case 'false': return \false; case 'true': return \true; } return ($this->fallbackEvaluator)($expr); } } decodeRecursive($value); } private function decodeRecursive($value) { if (\is_array($value)) { if (isset($value['nodeType'])) { if ($value['nodeType'] === 'Comment' || $value['nodeType'] === 'Comment_Doc') { return $this->decodeComment($value); } return $this->decodeNode($value); } return $this->decodeArray($value); } return $value; } private function decodeArray(array $array) : array { $decodedArray = []; foreach ($array as $key => $value) { $decodedArray[$key] = $this->decodeRecursive($value); } return $decodedArray; } private function decodeNode(array $value) : Node { $nodeType = $value['nodeType']; if (!\is_string($nodeType)) { throw new \RuntimeException('Node type must be a string'); } $reflectionClass = $this->reflectionClassFromNodeType($nodeType); /** @var Node $node */ $node = $reflectionClass->newInstanceWithoutConstructor(); if (isset($value['attributes'])) { if (!\is_array($value['attributes'])) { throw new \RuntimeException('Attributes must be an array'); } $node->setAttributes($this->decodeArray($value['attributes'])); } foreach ($value as $name => $subNode) { if ($name === 'nodeType' || $name === 'attributes') { continue; } $node->{$name} = $this->decodeRecursive($subNode); } return $node; } private function decodeComment(array $value) : Comment { $className = $value['nodeType'] === 'Comment' ? Comment::class : Comment\Doc::class; if (!isset($value['text'])) { throw new \RuntimeException('Comment must have text'); } return new $className($value['text'], $value['line'] ?? -1, $value['filePos'] ?? -1, $value['tokenPos'] ?? -1, $value['endLine'] ?? -1, $value['endFilePos'] ?? -1, $value['endTokenPos'] ?? -1); } private function reflectionClassFromNodeType(string $nodeType) : \ReflectionClass { if (!isset($this->reflectionClassCache[$nodeType])) { $className = $this->classNameFromNodeType($nodeType); $this->reflectionClassCache[$nodeType] = new \ReflectionClass($className); } return $this->reflectionClassCache[$nodeType]; } private function classNameFromNodeType(string $nodeType) : string { $className = 'PhpParser\\Node\\' . \strtr($nodeType, '_', '\\'); if (\class_exists($className)) { return $className; } $className .= '_'; if (\class_exists($className)) { return $className; } throw new \RuntimeException("Unknown node type \"{$nodeType}\""); } } visitors[] = $visitor; } /** * Removes an added visitor. * * @param NodeVisitor $visitor */ public function removeVisitor(NodeVisitor $visitor) { foreach ($this->visitors as $index => $storedVisitor) { if ($storedVisitor === $visitor) { unset($this->visitors[$index]); break; } } } /** * Traverses an array of nodes using the registered visitors. * * @param Node[] $nodes Array of nodes * * @return Node[] Traversed array of nodes */ public function traverse(array $nodes) : array { $this->stopTraversal = \false; foreach ($this->visitors as $visitor) { if (null !== ($return = $visitor->beforeTraverse($nodes))) { $nodes = $return; } } $nodes = $this->traverseArray($nodes); foreach ($this->visitors as $visitor) { if (null !== ($return = $visitor->afterTraverse($nodes))) { $nodes = $return; } } return $nodes; } /** * Recursively traverse a node. * * @param Node $node Node to traverse. * * @return Node Result of traversal (may be original node or new one) */ protected function traverseNode(Node $node) : Node { foreach ($node->getSubNodeNames() as $name) { $subNode =& $node->{$name}; if (\is_array($subNode)) { $subNode = $this->traverseArray($subNode); if ($this->stopTraversal) { break; } } elseif ($subNode instanceof Node) { $traverseChildren = \true; $breakVisitorIndex = null; foreach ($this->visitors as $visitorIndex => $visitor) { $return = $visitor->enterNode($subNode); if (null !== $return) { if ($return instanceof Node) { $this->ensureReplacementReasonable($subNode, $return); $subNode = $return; } elseif (self::DONT_TRAVERSE_CHILDREN === $return) { $traverseChildren = \false; } elseif (self::DONT_TRAVERSE_CURRENT_AND_CHILDREN === $return) { $traverseChildren = \false; $breakVisitorIndex = $visitorIndex; break; } elseif (self::STOP_TRAVERSAL === $return) { $this->stopTraversal = \true; break 2; } else { throw new \LogicException('enterNode() returned invalid value of type ' . \gettype($return)); } } } if ($traverseChildren) { $subNode = $this->traverseNode($subNode); if ($this->stopTraversal) { break; } } foreach ($this->visitors as $visitorIndex => $visitor) { $return = $visitor->leaveNode($subNode); if (null !== $return) { if ($return instanceof Node) { $this->ensureReplacementReasonable($subNode, $return); $subNode = $return; } elseif (self::STOP_TRAVERSAL === $return) { $this->stopTraversal = \true; break 2; } elseif (\is_array($return)) { throw new \LogicException('leaveNode() may only return an array ' . 'if the parent structure is an array'); } else { throw new \LogicException('leaveNode() returned invalid value of type ' . \gettype($return)); } } if ($breakVisitorIndex === $visitorIndex) { break; } } } } return $node; } /** * Recursively traverse array (usually of nodes). * * @param array $nodes Array to traverse * * @return array Result of traversal (may be original array or changed one) */ protected function traverseArray(array $nodes) : array { $doNodes = []; foreach ($nodes as $i => &$node) { if ($node instanceof Node) { $traverseChildren = \true; $breakVisitorIndex = null; foreach ($this->visitors as $visitorIndex => $visitor) { $return = $visitor->enterNode($node); if (null !== $return) { if ($return instanceof Node) { $this->ensureReplacementReasonable($node, $return); $node = $return; } elseif (self::DONT_TRAVERSE_CHILDREN === $return) { $traverseChildren = \false; } elseif (self::DONT_TRAVERSE_CURRENT_AND_CHILDREN === $return) { $traverseChildren = \false; $breakVisitorIndex = $visitorIndex; break; } elseif (self::STOP_TRAVERSAL === $return) { $this->stopTraversal = \true; break 2; } else { throw new \LogicException('enterNode() returned invalid value of type ' . \gettype($return)); } } } if ($traverseChildren) { $node = $this->traverseNode($node); if ($this->stopTraversal) { break; } } foreach ($this->visitors as $visitorIndex => $visitor) { $return = $visitor->leaveNode($node); if (null !== $return) { if ($return instanceof Node) { $this->ensureReplacementReasonable($node, $return); $node = $return; } elseif (\is_array($return)) { $doNodes[] = [$i, $return]; break; } elseif (self::REMOVE_NODE === $return) { $doNodes[] = [$i, []]; break; } elseif (self::STOP_TRAVERSAL === $return) { $this->stopTraversal = \true; break 2; } elseif (\false === $return) { throw new \LogicException('bool(false) return from leaveNode() no longer supported. ' . 'Return NodeTraverser::REMOVE_NODE instead'); } else { throw new \LogicException('leaveNode() returned invalid value of type ' . \gettype($return)); } } if ($breakVisitorIndex === $visitorIndex) { break; } } } elseif (\is_array($node)) { throw new \LogicException('Invalid node structure: Contains nested arrays'); } } if (!empty($doNodes)) { while (list($i, $replace) = \array_pop($doNodes)) { \array_splice($nodes, $i, 1, $replace); } } return $nodes; } private function ensureReplacementReasonable($old, $new) { if ($old instanceof Node\Stmt && $new instanceof Node\Expr) { throw new \LogicException("Trying to replace statement ({$old->getType()}) " . "with expression ({$new->getType()}). Are you missing a " . "Stmt_Expression wrapper?"); } if ($old instanceof Node\Expr && $new instanceof Node\Stmt) { throw new \LogicException("Trying to replace expression ({$old->getType()}) " . "with statement ({$new->getType()})"); } } } \true, 'parent' => \true, 'static' => \true]; /** * Constructs a name node. * * @param string|string[]|self $name Name as string, part array or Name instance (copy ctor) * @param array $attributes Additional attributes */ public function __construct($name, array $attributes = []) { $this->attributes = $attributes; $this->parts = self::prepareName($name); } public function getSubNodeNames() : array { return ['parts']; } /** * Gets the first part of the name, i.e. everything before the first namespace separator. * * @return string First part of the name */ public function getFirst() : string { return $this->parts[0]; } /** * Gets the last part of the name, i.e. everything after the last namespace separator. * * @return string Last part of the name */ public function getLast() : string { return $this->parts[\count($this->parts) - 1]; } /** * Checks whether the name is unqualified. (E.g. Name) * * @return bool Whether the name is unqualified */ public function isUnqualified() : bool { return 1 === \count($this->parts); } /** * Checks whether the name is qualified. (E.g. Name\Name) * * @return bool Whether the name is qualified */ public function isQualified() : bool { return 1 < \count($this->parts); } /** * Checks whether the name is fully qualified. (E.g. \Name) * * @return bool Whether the name is fully qualified */ public function isFullyQualified() : bool { return \false; } /** * Checks whether the name is explicitly relative to the current namespace. (E.g. namespace\Name) * * @return bool Whether the name is relative */ public function isRelative() : bool { return \false; } /** * Returns a string representation of the name itself, without taking the name type into * account (e.g., not including a leading backslash for fully qualified names). * * @return string String representation */ public function toString() : string { return \implode('\\', $this->parts); } /** * Returns a string representation of the name as it would occur in code (e.g., including * leading backslash for fully qualified names. * * @return string String representation */ public function toCodeString() : string { return $this->toString(); } /** * Returns lowercased string representation of the name, without taking the name type into * account (e.g., no leading backslash for fully qualified names). * * @return string Lowercased string representation */ public function toLowerString() : string { return \strtolower(\implode('\\', $this->parts)); } /** * Checks whether the identifier is a special class name (self, parent or static). * * @return bool Whether identifier is a special class name */ public function isSpecialClassName() : bool { return \count($this->parts) === 1 && isset(self::$specialClassNames[\strtolower($this->parts[0])]); } /** * Returns a string representation of the name by imploding the namespace parts with the * namespace separator. * * @return string String representation */ public function __toString() : string { return \implode('\\', $this->parts); } /** * Gets a slice of a name (similar to array_slice). * * This method returns a new instance of the same type as the original and with the same * attributes. * * If the slice is empty, null is returned. The null value will be correctly handled in * concatenations using concat(). * * Offset and length have the same meaning as in array_slice(). * * @param int $offset Offset to start the slice at (may be negative) * @param int|null $length Length of the slice (may be negative) * * @return static|null Sliced name */ public function slice(int $offset, int $length = null) { $numParts = \count($this->parts); $realOffset = $offset < 0 ? $offset + $numParts : $offset; if ($realOffset < 0 || $realOffset > $numParts) { throw new \OutOfBoundsException(\sprintf('Offset %d is out of bounds', $offset)); } if (null === $length) { $realLength = $numParts - $realOffset; } else { $realLength = $length < 0 ? $length + $numParts - $realOffset : $length; if ($realLength < 0 || $realLength > $numParts - $realOffset) { throw new \OutOfBoundsException(\sprintf('Length %d is out of bounds', $length)); } } if ($realLength === 0) { // Empty slice is represented as null return null; } return new static(\array_slice($this->parts, $realOffset, $realLength), $this->attributes); } /** * Concatenate two names, yielding a new Name instance. * * The type of the generated instance depends on which class this method is called on, for * example Name\FullyQualified::concat() will yield a Name\FullyQualified instance. * * If one of the arguments is null, a new instance of the other name will be returned. If both * arguments are null, null will be returned. As such, writing * Name::concat($namespace, $shortName) * where $namespace is a Name node or null will work as expected. * * @param string|string[]|self|null $name1 The first name * @param string|string[]|self|null $name2 The second name * @param array $attributes Attributes to assign to concatenated name * * @return static|null Concatenated name */ public static function concat($name1, $name2, array $attributes = []) { if (null === $name1 && null === $name2) { return null; } elseif (null === $name1) { return new static(self::prepareName($name2), $attributes); } elseif (null === $name2) { return new static(self::prepareName($name1), $attributes); } else { return new static(\array_merge(self::prepareName($name1), self::prepareName($name2)), $attributes); } } /** * Prepares a (string, array or Name node) name for use in name changing methods by converting * it to an array. * * @param string|string[]|self $name Name to prepare * * @return string[] Prepared name */ private static function prepareName($name) : array { if (\is_string($name)) { if ('' === $name) { throw new \InvalidArgumentException('Name cannot be empty'); } return \explode('\\', $name); } elseif (\is_array($name)) { if (empty($name)) { throw new \InvalidArgumentException('Name cannot be empty'); } return $name; } elseif ($name instanceof self) { return $name->parts; } throw new \InvalidArgumentException('Expected string, array of parts or Name instance'); } public function getType() : string { return 'Name'; } } attributes = $attributes; $this->types = $types; } public function getSubNodeNames() : array { return ['types']; } public function getType() : string { return 'IntersectionType'; } } attributes = $attributes; $this->name = $name; $this->args = $args; } public function getSubNodeNames() : array { return ['name', 'args']; } public function getType() : string { return 'Attribute'; } } attributes = $attributes; } public function getType() : string { return 'VariadicPlaceholder'; } public function getSubNodeNames() : array { return []; } } attributes = $attributes; $this->parts = $parts; } public function getSubNodeNames() : array { return ['parts']; } public function getType() : string { return 'Scalar_Encapsed'; } } '\\', '$' => '$', 'n' => "\n", 'r' => "\r", 't' => "\t", 'f' => "\f", 'v' => "\v", 'e' => "\x1b"]; /** * Constructs a string scalar node. * * @param string $value Value of the string * @param array $attributes Additional attributes */ public function __construct(string $value, array $attributes = []) { $this->attributes = $attributes; $this->value = $value; } public function getSubNodeNames() : array { return ['value']; } /** * @param bool $parseUnicodeEscape Whether to parse PHP 7 \u escapes */ public static function fromString(string $str, array $attributes = [], bool $parseUnicodeEscape = \true) : self { $attributes['kind'] = $str[0] === "'" || $str[1] === "'" && ($str[0] === 'b' || $str[0] === 'B') ? Scalar\String_::KIND_SINGLE_QUOTED : Scalar\String_::KIND_DOUBLE_QUOTED; $attributes['rawValue'] = $str; $string = self::parse($str, $parseUnicodeEscape); return new self($string, $attributes); } /** * @internal * * Parses a string token. * * @param string $str String token content * @param bool $parseUnicodeEscape Whether to parse PHP 7 \u escapes * * @return string The parsed string */ public static function parse(string $str, bool $parseUnicodeEscape = \true) : string { $bLength = 0; if ('b' === $str[0] || 'B' === $str[0]) { $bLength = 1; } if ('\'' === $str[$bLength]) { return \str_replace(['\\\\', '\\\''], ['\\', '\''], \substr($str, $bLength + 1, -1)); } else { return self::parseEscapeSequences(\substr($str, $bLength + 1, -1), '"', $parseUnicodeEscape); } } /** * @internal * * Parses escape sequences in strings (all string types apart from single quoted). * * @param string $str String without quotes * @param null|string $quote Quote type * @param bool $parseUnicodeEscape Whether to parse PHP 7 \u escapes * * @return string String with escape sequences parsed */ public static function parseEscapeSequences(string $str, $quote, bool $parseUnicodeEscape = \true) : string { if (null !== $quote) { $str = \str_replace('\\' . $quote, $quote, $str); } $extra = ''; if ($parseUnicodeEscape) { $extra = '|u\\{([0-9a-fA-F]+)\\}'; } return \preg_replace_callback('~\\\\([\\\\$nrtfve]|[xX][0-9a-fA-F]{1,2}|[0-7]{1,3}' . $extra . ')~', function ($matches) { $str = $matches[1]; if (isset(self::$replacements[$str])) { return self::$replacements[$str]; } elseif ('x' === $str[0] || 'X' === $str[0]) { return \chr(\hexdec(\substr($str, 1))); } elseif ('u' === $str[0]) { return self::codePointToUtf8(\hexdec($matches[2])); } else { return \chr(\octdec($str)); } }, $str); } /** * Converts a Unicode code point to its UTF-8 encoded representation. * * @param int $num Code point * * @return string UTF-8 representation of code point */ private static function codePointToUtf8(int $num) : string { if ($num <= 0x7f) { return \chr($num); } if ($num <= 0x7ff) { return \chr(($num >> 6) + 0xc0) . \chr(($num & 0x3f) + 0x80); } if ($num <= 0xffff) { return \chr(($num >> 12) + 0xe0) . \chr(($num >> 6 & 0x3f) + 0x80) . \chr(($num & 0x3f) + 0x80); } if ($num <= 0x1fffff) { return \chr(($num >> 18) + 0xf0) . \chr(($num >> 12 & 0x3f) + 0x80) . \chr(($num >> 6 & 0x3f) + 0x80) . \chr(($num & 0x3f) + 0x80); } throw new Error('Invalid UTF-8 codepoint escape sequence: Codepoint too large'); } public function getType() : string { return 'Scalar_String'; } } attributes = $attributes; $this->value = $value; } public function getSubNodeNames() : array { return ['value']; } public function getType() : string { return 'Scalar_EncapsedStringPart'; } } attributes = $attributes; $this->value = $value; } public function getSubNodeNames() : array { return ['value']; } /** * @param mixed[] $attributes */ public static function fromString(string $str, array $attributes = []) : DNumber { $attributes['rawValue'] = $str; $float = self::parse($str); return new DNumber($float, $attributes); } /** * @internal * * Parses a DNUMBER token like PHP would. * * @param string $str A string number * * @return float The parsed number */ public static function parse(string $str) : float { $str = \str_replace('_', '', $str); // Check whether this is one of the special integer notations. if ('0' === $str[0]) { // hex if ('x' === $str[1] || 'X' === $str[1]) { return \hexdec($str); } // bin if ('b' === $str[1] || 'B' === $str[1]) { return \bindec($str); } // oct, but only if the string does not contain any of '.eE'. if (\false === \strpbrk($str, '.eE')) { // substr($str, 0, strcspn($str, '89')) cuts the string at the first invalid digit // (8 or 9) so that only the digits before that are used. return \octdec(\substr($str, 0, \strcspn($str, '89'))); } } // dec return (float) $str; } public function getType() : string { return 'Scalar_DNumber'; } } attributes = $attributes; $this->value = $value; } public function getSubNodeNames() : array { return ['value']; } /** * Constructs an LNumber node from a string number literal. * * @param string $str String number literal (decimal, octal, hex or binary) * @param array $attributes Additional attributes * @param bool $allowInvalidOctal Whether to allow invalid octal numbers (PHP 5) * * @return LNumber The constructed LNumber, including kind attribute */ public static function fromString(string $str, array $attributes = [], bool $allowInvalidOctal = \false) : LNumber { $attributes['rawValue'] = $str; $str = \str_replace('_', '', $str); if ('0' !== $str[0] || '0' === $str) { $attributes['kind'] = LNumber::KIND_DEC; return new LNumber((int) $str, $attributes); } if ('x' === $str[1] || 'X' === $str[1]) { $attributes['kind'] = LNumber::KIND_HEX; return new LNumber(\hexdec($str), $attributes); } if ('b' === $str[1] || 'B' === $str[1]) { $attributes['kind'] = LNumber::KIND_BIN; return new LNumber(\bindec($str), $attributes); } if (!$allowInvalidOctal && \strpbrk($str, '89')) { throw new Error('Invalid numeric literal', $attributes); } // Strip optional explicit octal prefix. if ('o' === $str[1] || 'O' === $str[1]) { $str = \substr($str, 2); } // use intval instead of octdec to get proper cutting behavior with malformed numbers $attributes['kind'] = LNumber::KIND_OCT; return new LNumber(\intval($str, 8), $attributes); } public function getType() : string { return 'Scalar_LNumber'; } } attributes = $attributes; } public function getSubNodeNames() : array { return []; } /** * Get name of magic constant. * * @return string Name of magic constant */ public abstract function getName() : string; } attributes = $attributes; $this->name = $name; $this->value = $value; $this->byRef = $byRef; $this->unpack = $unpack; } public function getSubNodeNames() : array { return ['name', 'value', 'byRef', 'unpack']; } public function getType() : string { return 'Arg'; } } attributes = $attributes; $this->type = \is_string($type) ? new Identifier($type) : $type; $this->byRef = $byRef; $this->variadic = $variadic; $this->var = $var; $this->default = $default; $this->flags = $flags; $this->attrGroups = $attrGroups; } public function getSubNodeNames() : array { return ['attrGroups', 'flags', 'type', 'byRef', 'variadic', 'var', 'default']; } public function getType() : string { return 'Param'; } } conds = $conds; $this->body = $body; $this->attributes = $attributes; } public function getSubNodeNames() : array { return ['conds', 'body']; } public function getType() : string { return 'MatchArm'; } } attributes = $attributes; $this->attrs = $attrs; } public function getSubNodeNames() : array { return ['attrs']; } public function getType() : string { return 'AttributeGroup'; } } attributes = $attributes; $this->name = \is_string($name) ? new Identifier($name) : $name; $this->value = $value; } public function getSubNodeNames() : array { return ['name', 'value']; } public function getType() : string { return 'Const'; } } attributes = $attributes; $this->cond = $cond; $this->if = $if; $this->else = $else; } public function getSubNodeNames() : array { return ['cond', 'if', 'else']; } public function getType() : string { return 'Expr_Ternary'; } } attributes = $attributes; $this->key = $key; $this->value = $value; } public function getSubNodeNames() : array { return ['key', 'value']; } public function getType() : string { return 'Expr_Yield'; } } attributes = $attributes; $this->expr = $expr; } public function getSubNodeNames() : array { return ['expr']; } public function getType() : string { return 'Expr_BooleanNot'; } } false : Whether the closure is static * 'byRef' => false : Whether to return by reference * 'params' => array(): Parameters * 'uses' => array(): use()s * 'returnType' => null : Return type * 'stmts' => array(): Statements * 'attrGroups' => array(): PHP attributes groups * @param array $attributes Additional attributes */ public function __construct(array $subNodes = [], array $attributes = []) { $this->attributes = $attributes; $this->static = $subNodes['static'] ?? \false; $this->byRef = $subNodes['byRef'] ?? \false; $this->params = $subNodes['params'] ?? []; $this->uses = $subNodes['uses'] ?? []; $returnType = $subNodes['returnType'] ?? null; $this->returnType = \is_string($returnType) ? new Node\Identifier($returnType) : $returnType; $this->stmts = $subNodes['stmts'] ?? []; $this->attrGroups = $subNodes['attrGroups'] ?? []; } public function getSubNodeNames() : array { return ['attrGroups', 'static', 'byRef', 'params', 'uses', 'returnType', 'stmts']; } public function returnsByRef() : bool { return $this->byRef; } public function getParams() : array { return $this->params; } public function getReturnType() { return $this->returnType; } /** @return Node\Stmt[] */ public function getStmts() : array { return $this->stmts; } public function getAttrGroups() : array { return $this->attrGroups; } public function getType() : string { return 'Expr_Closure'; } } attributes = $attributes; $this->expr = $expr; } public function getSubNodeNames() : array { return ['expr']; } public function getType() : string { return 'Expr_YieldFrom'; } } attributes = $attributes; $this->var = $var; $this->name = \is_string($name) ? new Identifier($name) : $name; } public function getSubNodeNames() : array { return ['var', 'name']; } public function getType() : string { return 'Expr_NullsafePropertyFetch'; } } attributes = $attributes; $this->expr = $expr; } public function getSubNodeNames() : array { return ['expr']; } public function getType() : string { return 'Expr_Eval'; } } attributes = $attributes; $this->expr = $expr; $this->class = $class; } public function getSubNodeNames() : array { return ['expr', 'class']; } public function getType() : string { return 'Expr_Instanceof'; } } attributes = $attributes; $this->expr = $expr; } public function getSubNodeNames() : array { return ['expr']; } public function getType() : string { return 'Expr_UnaryMinus'; } } attributes = $attributes; $this->expr = $expr; } public function getSubNodeNames() : array { return ['expr']; } public function getType() : string { return 'Expr_Exit'; } } attributes = $attributes; $this->expr = $expr; } public function getSubNodeNames() : array { return ['expr']; } public function getType() : string { return 'Expr_ErrorSuppress'; } } attributes = $attributes; $this->var = $var; $this->name = \is_string($name) ? new Identifier($name) : $name; } public function getSubNodeNames() : array { return ['var', 'name']; } public function getType() : string { return 'Expr_PropertyFetch'; } } attributes = $attributes; $this->items = $items; } public function getSubNodeNames() : array { return ['items']; } public function getType() : string { return 'Expr_Array'; } } '; } public function getType() : string { return 'Expr_BinaryOp_Greater'; } } '; } public function getType() : string { return 'Expr_BinaryOp_Spaceship'; } } >'; } public function getType() : string { return 'Expr_BinaryOp_ShiftRight'; } } ='; } public function getType() : string { return 'Expr_BinaryOp_GreaterOrEqual'; } } attributes = $attributes; $this->class = $class; $this->name = \is_string($name) ? new VarLikeIdentifier($name) : $name; } public function getSubNodeNames() : array { return ['class', 'name']; } public function getType() : string { return 'Expr_StaticPropertyFetch'; } } attributes = $attributes; $this->expr = $expr; } public function getSubNodeNames() : array { return ['expr']; } public function getType() : string { return 'Expr_Print'; } } attributes = $attributes; $this->expr = $expr; $this->type = $type; } public function getSubNodeNames() : array { return ['expr', 'type']; } public function getType() : string { return 'Expr_Include'; } } attributes = $attributes; $this->expr = $expr; } public function getSubNodeNames() : array { return ['expr']; } public function getType() : string { return 'Expr_Clone'; } } attributes = $attributes; $this->name = $name; } public function getSubNodeNames() : array { return ['name']; } public function getType() : string { return 'Expr_Variable'; } } Arguments */ public $args; /** * Constructs a function call node. * * @param Node\Name|Expr $name Function name * @param array $args Arguments * @param array $attributes Additional attributes */ public function __construct($name, array $args = [], array $attributes = []) { $this->attributes = $attributes; $this->name = $name; $this->args = $args; } public function getSubNodeNames() : array { return ['name', 'args']; } public function getType() : string { return 'Expr_FuncCall'; } public function getRawArgs() : array { return $this->args; } } attributes = $attributes; $this->var = $var; $this->expr = $expr; } public function getSubNodeNames() : array { return ['var', 'expr']; } public function getType() : string { return 'Expr_AssignRef'; } } attributes = $attributes; $this->var = $var; $this->expr = $expr; } public function getSubNodeNames() : array { return ['var', 'expr']; } } attributes = $attributes; $this->expr = $expr; } public function getSubNodeNames() : array { return ['expr']; } } attributes = $attributes; $this->expr = $expr; } public function getSubNodeNames() : array { return ['expr']; } public function getType() : string { return 'Expr_BitwiseNot'; } } false : Whether the closure is static * 'byRef' => false : Whether to return by reference * 'params' => array() : Parameters * 'returnType' => null : Return type * 'expr' => Expr : Expression body * 'attrGroups' => array() : PHP attribute groups * @param array $attributes Additional attributes */ public function __construct(array $subNodes = [], array $attributes = []) { $this->attributes = $attributes; $this->static = $subNodes['static'] ?? \false; $this->byRef = $subNodes['byRef'] ?? \false; $this->params = $subNodes['params'] ?? []; $returnType = $subNodes['returnType'] ?? null; $this->returnType = \is_string($returnType) ? new Node\Identifier($returnType) : $returnType; $this->expr = $subNodes['expr']; $this->attrGroups = $subNodes['attrGroups'] ?? []; } public function getSubNodeNames() : array { return ['attrGroups', 'static', 'byRef', 'params', 'returnType', 'expr']; } public function returnsByRef() : bool { return $this->byRef; } public function getParams() : array { return $this->params; } public function getReturnType() { return $this->returnType; } public function getAttrGroups() : array { return $this->attrGroups; } /** * @return Node\Stmt\Return_[] */ public function getStmts() : array { return [new Node\Stmt\Return_($this->expr)]; } public function getType() : string { return 'Expr_ArrowFunction'; } } attributes = $attributes; $this->name = $name; } public function getSubNodeNames() : array { return ['name']; } public function getType() : string { return 'Expr_ConstFetch'; } } attributes = $attributes; $this->var = $var; } public function getSubNodeNames() : array { return ['var']; } public function getType() : string { return 'Expr_PostDec'; } } Arguments */ public $args; /** * Constructs a function call node. * * @param Node\Name|Expr|Node\Stmt\Class_ $class Class name (or class node for anonymous classes) * @param array $args Arguments * @param array $attributes Additional attributes */ public function __construct($class, array $args = [], array $attributes = []) { $this->attributes = $attributes; $this->class = $class; $this->args = $args; } public function getSubNodeNames() : array { return ['class', 'args']; } public function getType() : string { return 'Expr_New'; } public function getRawArgs() : array { return $this->args; } } attributes = $attributes; $this->var = $var; $this->byRef = $byRef; } public function getSubNodeNames() : array { return ['var', 'byRef']; } public function getType() : string { return 'Expr_ClosureUse'; } } attributes = $attributes; $this->var = $var; $this->dim = $dim; } public function getSubNodeNames() : array { return ['var', 'dim']; } public function getType() : string { return 'Expr_ArrayDimFetch'; } } attributes = $attributes; $this->expr = $expr; } public function getSubNodeNames() : array { return ['expr']; } public function getType() : string { return 'Expr_Throw'; } } attributes = $attributes; $this->var = $var; } public function getSubNodeNames() : array { return ['var']; } public function getType() : string { return 'Expr_PreDec'; } } Arguments */ public $args; /** * Constructs a nullsafe method call node. * * @param Expr $var Variable holding object * @param string|Identifier|Expr $name Method name * @param array $args Arguments * @param array $attributes Additional attributes */ public function __construct(Expr $var, $name, array $args = [], array $attributes = []) { $this->attributes = $attributes; $this->var = $var; $this->name = \is_string($name) ? new Identifier($name) : $name; $this->args = $args; } public function getSubNodeNames() : array { return ['var', 'name', 'args']; } public function getType() : string { return 'Expr_NullsafeMethodCall'; } public function getRawArgs() : array { return $this->args; } } attributes = $attributes; $this->vars = $vars; } public function getSubNodeNames() : array { return ['vars']; } public function getType() : string { return 'Expr_Isset'; } } attributes = $attributes; $this->expr = $expr; } public function getSubNodeNames() : array { return ['expr']; } public function getType() : string { return 'Expr_Empty'; } } attributes = $attributes; $this->items = $items; } public function getSubNodeNames() : array { return ['items']; } public function getType() : string { return 'Expr_List'; } } attributes = $attributes; $this->class = $class; $this->name = \is_string($name) ? new Identifier($name) : $name; } public function getSubNodeNames() : array { return ['class', 'name']; } public function getType() : string { return 'Expr_ClassConstFetch'; } } Arguments */ public $args; /** * Constructs a function call node. * * @param Expr $var Variable holding object * @param string|Identifier|Expr $name Method name * @param array $args Arguments * @param array $attributes Additional attributes */ public function __construct(Expr $var, $name, array $args = [], array $attributes = []) { $this->attributes = $attributes; $this->var = $var; $this->name = \is_string($name) ? new Identifier($name) : $name; $this->args = $args; } public function getSubNodeNames() : array { return ['var', 'name', 'args']; } public function getType() : string { return 'Expr_MethodCall'; } public function getRawArgs() : array { return $this->args; } } attributes = $attributes; $this->var = $var; $this->expr = $expr; } public function getSubNodeNames() : array { return ['var', 'expr']; } public function getType() : string { return 'Expr_Assign'; } } attributes = $attributes; $this->cond = $cond; $this->arms = $arms; } public function getSubNodeNames() : array { return ['cond', 'arms']; } public function getType() : string { return 'Expr_Match'; } } attributes = $attributes; $this->key = $key; $this->value = $value; $this->byRef = $byRef; $this->unpack = $unpack; } public function getSubNodeNames() : array { return ['key', 'value', 'byRef', 'unpack']; } public function getType() : string { return 'Expr_ArrayItem'; } } attributes = $attributes; $this->var = $var; } public function getSubNodeNames() : array { return ['var']; } public function getType() : string { return 'Expr_PreInc'; } } attributes = $attributes; $this->expr = $expr; } public function getSubNodeNames() : array { return ['expr']; } public function getType() : string { return 'Expr_UnaryPlus'; } } attributes = $attributes; $this->parts = $parts; } public function getSubNodeNames() : array { return ['parts']; } public function getType() : string { return 'Expr_ShellExec'; } } attributes = $attributes; } public function getSubNodeNames() : array { return []; } public function getType() : string { return 'Expr_Error'; } } */ public abstract function getRawArgs() : array; /** * Returns whether this call expression is actually a first class callable. */ public function isFirstClassCallable() : bool { foreach ($this->getRawArgs() as $arg) { if ($arg instanceof VariadicPlaceholder) { return \true; } } return \false; } /** * Assert that this is not a first-class callable and return only ordinary Args. * * @return Arg[] */ public function getArgs() : array { \assert(!$this->isFirstClassCallable()); return $this->getRawArgs(); } } attributes = $attributes; $this->var = $var; } public function getSubNodeNames() : array { return ['var']; } public function getType() : string { return 'Expr_PostInc'; } } Arguments */ public $args; /** * Constructs a static method call node. * * @param Node\Name|Expr $class Class name * @param string|Identifier|Expr $name Method name * @param array $args Arguments * @param array $attributes Additional attributes */ public function __construct($class, $name, array $args = [], array $attributes = []) { $this->attributes = $attributes; $this->class = $class; $this->name = \is_string($name) ? new Identifier($name) : $name; $this->args = $args; } public function getSubNodeNames() : array { return ['class', 'name', 'args']; } public function getType() : string { return 'Expr_StaticCall'; } public function getRawArgs() : array { return $this->args; } } attributes = $attributes; $this->left = $left; $this->right = $right; } public function getSubNodeNames() : array { return ['left', 'right']; } /** * Get the operator sigil for this binary operation. * * In the case there are multiple possible sigils for an operator, this method does not * necessarily return the one used in the parsed code. * * @return string */ public abstract function getOperatorSigil() : string; } toString(); } public function getType() : string { return 'Name_Relative'; } } toString(); } public function getType() : string { return 'Name_FullyQualified'; } } \true, 'parent' => \true, 'static' => \true]; /** * Constructs an identifier node. * * @param string $name Identifier as string * @param array $attributes Additional attributes */ public function __construct(string $name, array $attributes = []) { $this->attributes = $attributes; $this->name = $name; } public function getSubNodeNames() : array { return ['name']; } /** * Get identifier as string. * * @return string Identifier as string. */ public function toString() : string { return $this->name; } /** * Get lowercased identifier as string. * * @return string Lowercased identifier as string */ public function toLowerString() : string { return \strtolower($this->name); } /** * Checks whether the identifier is a special class name (self, parent or static). * * @return bool Whether identifier is a special class name */ public function isSpecialClassName() : bool { return isset(self::$specialClassNames[\strtolower($this->name)]); } /** * Get identifier as string. * * @return string Identifier as string */ public function __toString() : string { return $this->name; } public function getType() : string { return 'Identifier'; } } attributes = $attributes; $this->types = $types; } public function getSubNodeNames() : array { return ['types']; } public function getType() : string { return 'UnionType'; } } attributes = $attributes; $this->type = \is_string($type) ? new Identifier($type) : $type; } public function getSubNodeNames() : array { return ['type']; } public function getType() : string { return 'NullableType'; } } attributes = $attributes; $this->cond = $cond; $this->stmts = $stmts; } public function getSubNodeNames() : array { return ['stmts', 'cond']; } public function getType() : string { return 'Stmt_Do'; } } attributes = $attributes; $this->num = $num; } public function getSubNodeNames() : array { return ['num']; } public function getType() : string { return 'Stmt_Continue'; } } attributes = $attributes; $this->declares = $declares; $this->stmts = $stmts; } public function getSubNodeNames() : array { return ['declares', 'stmts']; } public function getType() : string { return 'Stmt_Declare'; } } attributes = $attributes; $this->stmts = $stmts; } public function getSubNodeNames() : array { return ['stmts']; } public function getType() : string { return 'Stmt_Else'; } } attributes = $attributes; $this->types = $types; $this->var = $var; $this->stmts = $stmts; } public function getSubNodeNames() : array { return ['types', 'var', 'stmts']; } public function getType() : string { return 'Stmt_Catch'; } } 0 : Flags * 'extends' => null : Name of extended class * 'implements' => array(): Names of implemented interfaces * 'stmts' => array(): Statements * 'attrGroups' => array(): PHP attribute groups * @param array $attributes Additional attributes */ public function __construct($name, array $subNodes = [], array $attributes = []) { $this->attributes = $attributes; $this->flags = $subNodes['flags'] ?? $subNodes['type'] ?? 0; $this->name = \is_string($name) ? new Node\Identifier($name) : $name; $this->extends = $subNodes['extends'] ?? null; $this->implements = $subNodes['implements'] ?? []; $this->stmts = $subNodes['stmts'] ?? []; $this->attrGroups = $subNodes['attrGroups'] ?? []; } public function getSubNodeNames() : array { return ['attrGroups', 'flags', 'name', 'extends', 'implements', 'stmts']; } /** * Whether the class is explicitly abstract. * * @return bool */ public function isAbstract() : bool { return (bool) ($this->flags & self::MODIFIER_ABSTRACT); } /** * Whether the class is final. * * @return bool */ public function isFinal() : bool { return (bool) ($this->flags & self::MODIFIER_FINAL); } public function isReadonly() : bool { return (bool) ($this->flags & self::MODIFIER_READONLY); } /** * Whether the class is anonymous. * * @return bool */ public function isAnonymous() : bool { return null === $this->name; } /** * @internal */ public static function verifyClassModifier($a, $b) { if ($a & self::MODIFIER_ABSTRACT && $b & self::MODIFIER_ABSTRACT) { throw new Error('Multiple abstract modifiers are not allowed'); } if ($a & self::MODIFIER_FINAL && $b & self::MODIFIER_FINAL) { throw new Error('Multiple final modifiers are not allowed'); } if ($a & self::MODIFIER_READONLY && $b & self::MODIFIER_READONLY) { throw new Error('Multiple readonly modifiers are not allowed'); } if ($a & 48 && $b & 48) { throw new Error('Cannot use the final modifier on an abstract class'); } } /** * @internal */ public static function verifyModifier($a, $b) { if ($a & self::VISIBILITY_MODIFIER_MASK && $b & self::VISIBILITY_MODIFIER_MASK) { throw new Error('Multiple access type modifiers are not allowed'); } if ($a & self::MODIFIER_ABSTRACT && $b & self::MODIFIER_ABSTRACT) { throw new Error('Multiple abstract modifiers are not allowed'); } if ($a & self::MODIFIER_STATIC && $b & self::MODIFIER_STATIC) { throw new Error('Multiple static modifiers are not allowed'); } if ($a & self::MODIFIER_FINAL && $b & self::MODIFIER_FINAL) { throw new Error('Multiple final modifiers are not allowed'); } if ($a & self::MODIFIER_READONLY && $b & self::MODIFIER_READONLY) { throw new Error('Multiple readonly modifiers are not allowed'); } if ($a & 48 && $b & 48) { throw new Error('Cannot use the final modifier on an abstract class member'); } } public function getType() : string { return 'Stmt_Class'; } } attributes = $attributes; $this->exprs = $exprs; } public function getSubNodeNames() : array { return ['exprs']; } public function getType() : string { return 'Stmt_Echo'; } } attributes = $attributes; $this->trait = $trait; $this->method = \is_string($method) ? new Node\Identifier($method) : $method; $this->insteadof = $insteadof; } public function getSubNodeNames() : array { return ['trait', 'method', 'insteadof']; } public function getType() : string { return 'Stmt_TraitUseAdaptation_Precedence'; } } attributes = $attributes; $this->trait = $trait; $this->method = \is_string($method) ? new Node\Identifier($method) : $method; $this->newModifier = $newModifier; $this->newName = \is_string($newName) ? new Node\Identifier($newName) : $newName; } public function getSubNodeNames() : array { return ['trait', 'method', 'newModifier', 'newName']; } public function getType() : string { return 'Stmt_TraitUseAdaptation_Alias'; } } array(): Statements * 'attrGroups' => array(): PHP attribute groups * @param array $attributes Additional attributes */ public function __construct($name, array $subNodes = [], array $attributes = []) { $this->attributes = $attributes; $this->name = \is_string($name) ? new Node\Identifier($name) : $name; $this->stmts = $subNodes['stmts'] ?? []; $this->attrGroups = $subNodes['attrGroups'] ?? []; } public function getSubNodeNames() : array { return ['attrGroups', 'name', 'stmts']; } public function getType() : string { return 'Stmt_Trait'; } } attributes = $attributes; $this->type = $type; $this->uses = $uses; } public function getSubNodeNames() : array { return ['type', 'uses']; } public function getType() : string { return 'Stmt_Use'; } } name = \is_string($name) ? new Node\Identifier($name) : $name; $this->expr = $expr; $this->attrGroups = $attrGroups; } public function getSubNodeNames() : array { return ['attrGroups', 'name', 'expr']; } public function getType() : string { return 'Stmt_EnumCase'; } } array(): Name of extended interfaces * 'stmts' => array(): Statements * 'attrGroups' => array(): PHP attribute groups * @param array $attributes Additional attributes */ public function __construct($name, array $subNodes = [], array $attributes = []) { $this->attributes = $attributes; $this->name = \is_string($name) ? new Node\Identifier($name) : $name; $this->extends = $subNodes['extends'] ?? []; $this->stmts = $subNodes['stmts'] ?? []; $this->attrGroups = $subNodes['attrGroups'] ?? []; } public function getSubNodeNames() : array { return ['attrGroups', 'name', 'extends', 'stmts']; } public function getType() : string { return 'Stmt_Interface'; } } attributes = $attributes; $this->traits = $traits; $this->adaptations = $adaptations; } public function getSubNodeNames() : array { return ['traits', 'adaptations']; } public function getType() : string { return 'Stmt_TraitUse'; } } false : Whether to return by reference * 'params' => array(): Parameters * 'returnType' => null : Return type * 'stmts' => array(): Statements * 'attrGroups' => array(): PHP attribute groups * @param array $attributes Additional attributes */ public function __construct($name, array $subNodes = [], array $attributes = []) { $this->attributes = $attributes; $this->byRef = $subNodes['byRef'] ?? \false; $this->name = \is_string($name) ? new Node\Identifier($name) : $name; $this->params = $subNodes['params'] ?? []; $returnType = $subNodes['returnType'] ?? null; $this->returnType = \is_string($returnType) ? new Node\Identifier($returnType) : $returnType; $this->stmts = $subNodes['stmts'] ?? []; $this->attrGroups = $subNodes['attrGroups'] ?? []; } public function getSubNodeNames() : array { return ['attrGroups', 'byRef', 'name', 'params', 'returnType', 'stmts']; } public function returnsByRef() : bool { return $this->byRef; } public function getParams() : array { return $this->params; } public function getReturnType() { return $this->returnType; } public function getAttrGroups() : array { return $this->attrGroups; } /** @return Node\Stmt[] */ public function getStmts() : array { return $this->stmts; } public function getType() : string { return 'Stmt_Function'; } } attributes = $attributes; $this->vars = $vars; } public function getSubNodeNames() : array { return ['vars']; } public function getType() : string { return 'Stmt_Static'; } } attributes = $attributes; $this->name = \is_string($name) ? new Identifier($name) : $name; } public function getSubNodeNames() : array { return ['name']; } public function getType() : string { return 'Stmt_Label'; } } stmts as $stmt) { if ($stmt instanceof TraitUse) { $traitUses[] = $stmt; } } return $traitUses; } /** * @return ClassConst[] */ public function getConstants() : array { $constants = []; foreach ($this->stmts as $stmt) { if ($stmt instanceof ClassConst) { $constants[] = $stmt; } } return $constants; } /** * @return Property[] */ public function getProperties() : array { $properties = []; foreach ($this->stmts as $stmt) { if ($stmt instanceof Property) { $properties[] = $stmt; } } return $properties; } /** * Gets property with the given name defined directly in this class/interface/trait. * * @param string $name Name of the property * * @return Property|null Property node or null if the property does not exist */ public function getProperty(string $name) { foreach ($this->stmts as $stmt) { if ($stmt instanceof Property) { foreach ($stmt->props as $prop) { if ($prop instanceof PropertyProperty && $name === $prop->name->toString()) { return $stmt; } } } } return null; } /** * Gets all methods defined directly in this class/interface/trait * * @return ClassMethod[] */ public function getMethods() : array { $methods = []; foreach ($this->stmts as $stmt) { if ($stmt instanceof ClassMethod) { $methods[] = $stmt; } } return $methods; } /** * Gets method with the given name defined directly in this class/interface/trait. * * @param string $name Name of the method (compared case-insensitively) * * @return ClassMethod|null Method node or null if the method does not exist */ public function getMethod(string $name) { $lowerName = \strtolower($name); foreach ($this->stmts as $stmt) { if ($stmt instanceof ClassMethod && $lowerName === $stmt->name->toLowerString()) { return $stmt; } } return null; } } attributes = $attributes; $this->flags = $flags; $this->props = $props; $this->type = \is_string($type) ? new Identifier($type) : $type; $this->attrGroups = $attrGroups; } public function getSubNodeNames() : array { return ['attrGroups', 'flags', 'type', 'props']; } /** * Whether the property is explicitly or implicitly public. * * @return bool */ public function isPublic() : bool { return ($this->flags & Class_::MODIFIER_PUBLIC) !== 0 || ($this->flags & Class_::VISIBILITY_MODIFIER_MASK) === 0; } /** * Whether the property is protected. * * @return bool */ public function isProtected() : bool { return (bool) ($this->flags & Class_::MODIFIER_PROTECTED); } /** * Whether the property is private. * * @return bool */ public function isPrivate() : bool { return (bool) ($this->flags & Class_::MODIFIER_PRIVATE); } /** * Whether the property is static. * * @return bool */ public function isStatic() : bool { return (bool) ($this->flags & Class_::MODIFIER_STATIC); } /** * Whether the property is readonly. * * @return bool */ public function isReadonly() : bool { return (bool) ($this->flags & Class_::MODIFIER_READONLY); } public function getType() : string { return 'Stmt_Property'; } } null : Scalar type * 'implements' => array() : Names of implemented interfaces * 'stmts' => array() : Statements * 'attrGroups' => array() : PHP attribute groups * @param array $attributes Additional attributes */ public function __construct($name, array $subNodes = [], array $attributes = []) { $this->name = \is_string($name) ? new Node\Identifier($name) : $name; $this->scalarType = $subNodes['scalarType'] ?? null; $this->implements = $subNodes['implements'] ?? []; $this->stmts = $subNodes['stmts'] ?? []; $this->attrGroups = $subNodes['attrGroups'] ?? []; parent::__construct($attributes); } public function getSubNodeNames() : array { return ['attrGroups', 'name', 'scalarType', 'implements', 'stmts']; } public function getType() : string { return 'Stmt_Enum'; } } attributes = $attributes; $this->consts = $consts; } public function getSubNodeNames() : array { return ['consts']; } public function getType() : string { return 'Stmt_Const'; } } attributes = $attributes; $this->cond = $cond; $this->cases = $cases; } public function getSubNodeNames() : array { return ['cond', 'cases']; } public function getType() : string { return 'Stmt_Switch'; } } value pair node. * * @param string|Node\Identifier $key Key * @param Node\Expr $value Value * @param array $attributes Additional attributes */ public function __construct($key, Node\Expr $value, array $attributes = []) { $this->attributes = $attributes; $this->key = \is_string($key) ? new Node\Identifier($key) : $key; $this->value = $value; } public function getSubNodeNames() : array { return ['key', 'value']; } public function getType() : string { return 'Stmt_DeclareDeclare'; } } attributes = $attributes; $this->name = \is_string($name) ? new Identifier($name) : $name; } public function getSubNodeNames() : array { return ['name']; } public function getType() : string { return 'Stmt_Goto'; } } attributes = $attributes; $this->expr = $expr; } public function getSubNodeNames() : array { return ['expr']; } public function getType() : string { return 'Stmt_Expression'; } } attributes = $attributes; $this->expr = $expr; } public function getSubNodeNames() : array { return ['expr']; } public function getType() : string { return 'Stmt_Throw'; } } attributes = $attributes; $this->cond = $cond; $this->stmts = $stmts; } public function getSubNodeNames() : array { return ['cond', 'stmts']; } public function getType() : string { return 'Stmt_While'; } } attributes = $attributes; $this->name = $name; $this->stmts = $stmts; } public function getSubNodeNames() : array { return ['name', 'stmts']; } public function getType() : string { return 'Stmt_Namespace'; } } attributes = $attributes; $this->num = $num; } public function getSubNodeNames() : array { return ['num']; } public function getType() : string { return 'Stmt_Break'; } } array(): Statements * 'elseifs' => array(): Elseif clauses * 'else' => null : Else clause * @param array $attributes Additional attributes */ public function __construct(Node\Expr $cond, array $subNodes = [], array $attributes = []) { $this->attributes = $attributes; $this->cond = $cond; $this->stmts = $subNodes['stmts'] ?? []; $this->elseifs = $subNodes['elseifs'] ?? []; $this->else = $subNodes['else'] ?? null; } public function getSubNodeNames() : array { return ['cond', 'stmts', 'elseifs', 'else']; } public function getType() : string { return 'Stmt_If'; } } attributes = $attributes; $this->remaining = $remaining; } public function getSubNodeNames() : array { return ['remaining']; } public function getType() : string { return 'Stmt_HaltCompiler'; } } array(): Init expressions * 'cond' => array(): Loop conditions * 'loop' => array(): Loop expressions * 'stmts' => array(): Statements * @param array $attributes Additional attributes */ public function __construct(array $subNodes = [], array $attributes = []) { $this->attributes = $attributes; $this->init = $subNodes['init'] ?? []; $this->cond = $subNodes['cond'] ?? []; $this->loop = $subNodes['loop'] ?? []; $this->stmts = $subNodes['stmts'] ?? []; } public function getSubNodeNames() : array { return ['init', 'cond', 'loop', 'stmts']; } public function getType() : string { return 'Stmt_For'; } } attributes = $attributes; $this->var = $var; $this->default = $default; } public function getSubNodeNames() : array { return ['var', 'default']; } public function getType() : string { return 'Stmt_StaticVar'; } } attributes = $attributes; $this->vars = $vars; } public function getSubNodeNames() : array { return ['vars']; } public function getType() : string { return 'Stmt_Global'; } } attributes = $attributes; $this->cond = $cond; $this->stmts = $stmts; } public function getSubNodeNames() : array { return ['cond', 'stmts']; } public function getType() : string { return 'Stmt_ElseIf'; } } attributes = $attributes; $this->expr = $expr; } public function getSubNodeNames() : array { return ['expr']; } public function getType() : string { return 'Stmt_Return'; } } null : Variable to assign key to * 'byRef' => false : Whether to assign value by reference * 'stmts' => array(): Statements * @param array $attributes Additional attributes */ public function __construct(Node\Expr $expr, Node\Expr $valueVar, array $subNodes = [], array $attributes = []) { $this->attributes = $attributes; $this->expr = $expr; $this->keyVar = $subNodes['keyVar'] ?? null; $this->byRef = $subNodes['byRef'] ?? \false; $this->valueVar = $valueVar; $this->stmts = $subNodes['stmts'] ?? []; } public function getSubNodeNames() : array { return ['expr', 'keyVar', 'byRef', 'valueVar', 'stmts']; } public function getType() : string { return 'Stmt_Foreach'; } } attributes = $attributes; $this->stmts = $stmts; $this->catches = $catches; $this->finally = $finally; } public function getSubNodeNames() : array { return ['stmts', 'catches', 'finally']; } public function getType() : string { return 'Stmt_TryCatch'; } } attributes = $attributes; $this->cond = $cond; $this->stmts = $stmts; } public function getSubNodeNames() : array { return ['cond', 'stmts']; } public function getType() : string { return 'Stmt_Case'; } } attributes = $attributes; $this->vars = $vars; } public function getSubNodeNames() : array { return ['vars']; } public function getType() : string { return 'Stmt_Unset'; } } attributes = $attributes; $this->type = $type; $this->name = $name; $this->alias = \is_string($alias) ? new Identifier($alias) : $alias; } public function getSubNodeNames() : array { return ['type', 'name', 'alias']; } /** * Get alias. If not explicitly given this is the last component of the used name. * * @return Identifier */ public function getAlias() : Identifier { if (null !== $this->alias) { return $this->alias; } return new Identifier($this->name->getLast()); } public function getType() : string { return 'Stmt_UseUse'; } } attributes = $attributes; $this->stmts = $stmts; } public function getSubNodeNames() : array { return ['stmts']; } public function getType() : string { return 'Stmt_Finally'; } } attributes = $attributes; $this->value = $value; } public function getSubNodeNames() : array { return ['value']; } public function getType() : string { return 'Stmt_InlineHTML'; } } attributes = $attributes; $this->type = $type; $this->prefix = $prefix; $this->uses = $uses; } public function getSubNodeNames() : array { return ['type', 'prefix', 'uses']; } public function getType() : string { return 'Stmt_GroupUse'; } } \true, '__destruct' => \true, '__call' => \true, '__callstatic' => \true, '__get' => \true, '__set' => \true, '__isset' => \true, '__unset' => \true, '__sleep' => \true, '__wakeup' => \true, '__tostring' => \true, '__set_state' => \true, '__clone' => \true, '__invoke' => \true, '__debuginfo' => \true, '__serialize' => \true, '__unserialize' => \true]; /** * Constructs a class method node. * * @param string|Node\Identifier $name Name * @param array $subNodes Array of the following optional subnodes: * 'flags => MODIFIER_PUBLIC: Flags * 'byRef' => false : Whether to return by reference * 'params' => array() : Parameters * 'returnType' => null : Return type * 'stmts' => array() : Statements * 'attrGroups' => array() : PHP attribute groups * @param array $attributes Additional attributes */ public function __construct($name, array $subNodes = [], array $attributes = []) { $this->attributes = $attributes; $this->flags = $subNodes['flags'] ?? $subNodes['type'] ?? 0; $this->byRef = $subNodes['byRef'] ?? \false; $this->name = \is_string($name) ? new Node\Identifier($name) : $name; $this->params = $subNodes['params'] ?? []; $returnType = $subNodes['returnType'] ?? null; $this->returnType = \is_string($returnType) ? new Node\Identifier($returnType) : $returnType; $this->stmts = \array_key_exists('stmts', $subNodes) ? $subNodes['stmts'] : []; $this->attrGroups = $subNodes['attrGroups'] ?? []; } public function getSubNodeNames() : array { return ['attrGroups', 'flags', 'byRef', 'name', 'params', 'returnType', 'stmts']; } public function returnsByRef() : bool { return $this->byRef; } public function getParams() : array { return $this->params; } public function getReturnType() { return $this->returnType; } public function getStmts() { return $this->stmts; } public function getAttrGroups() : array { return $this->attrGroups; } /** * Whether the method is explicitly or implicitly public. * * @return bool */ public function isPublic() : bool { return ($this->flags & Class_::MODIFIER_PUBLIC) !== 0 || ($this->flags & Class_::VISIBILITY_MODIFIER_MASK) === 0; } /** * Whether the method is protected. * * @return bool */ public function isProtected() : bool { return (bool) ($this->flags & Class_::MODIFIER_PROTECTED); } /** * Whether the method is private. * * @return bool */ public function isPrivate() : bool { return (bool) ($this->flags & Class_::MODIFIER_PRIVATE); } /** * Whether the method is abstract. * * @return bool */ public function isAbstract() : bool { return (bool) ($this->flags & Class_::MODIFIER_ABSTRACT); } /** * Whether the method is final. * * @return bool */ public function isFinal() : bool { return (bool) ($this->flags & Class_::MODIFIER_FINAL); } /** * Whether the method is static. * * @return bool */ public function isStatic() : bool { return (bool) ($this->flags & Class_::MODIFIER_STATIC); } /** * Whether the method is magic. * * @return bool */ public function isMagic() : bool { return isset(self::$magicNames[$this->name->toLowerString()]); } public function getType() : string { return 'Stmt_ClassMethod'; } } attributes = $attributes; $this->name = \is_string($name) ? new Node\VarLikeIdentifier($name) : $name; $this->default = $default; } public function getSubNodeNames() : array { return ['name', 'default']; } public function getType() : string { return 'Stmt_PropertyProperty'; } } attributes = $attributes; $this->flags = $flags; $this->consts = $consts; $this->attrGroups = $attrGroups; } public function getSubNodeNames() : array { return ['attrGroups', 'flags', 'consts']; } /** * Whether constant is explicitly or implicitly public. * * @return bool */ public function isPublic() : bool { return ($this->flags & Class_::MODIFIER_PUBLIC) !== 0 || ($this->flags & Class_::VISIBILITY_MODIFIER_MASK) === 0; } /** * Whether constant is protected. * * @return bool */ public function isProtected() : bool { return (bool) ($this->flags & Class_::MODIFIER_PROTECTED); } /** * Whether constant is private. * * @return bool */ public function isPrivate() : bool { return (bool) ($this->flags & Class_::MODIFIER_PRIVATE); } /** * Whether constant is final. * * @return bool */ public function isFinal() : bool { return (bool) ($this->flags & Class_::MODIFIER_FINAL); } public function getType() : string { return 'Stmt_ClassConst'; } } '", "T_IS_GREATER_OR_EQUAL", "T_SL", "T_SR", "'+'", "'-'", "'.'", "'*'", "'/'", "'%'", "'!'", "T_INSTANCEOF", "'~'", "T_INC", "T_DEC", "T_INT_CAST", "T_DOUBLE_CAST", "T_STRING_CAST", "T_ARRAY_CAST", "T_OBJECT_CAST", "T_BOOL_CAST", "T_UNSET_CAST", "'@'", "T_POW", "'['", "T_NEW", "T_CLONE", "T_EXIT", "T_IF", "T_ELSEIF", "T_ELSE", "T_ENDIF", "T_LNUMBER", "T_DNUMBER", "T_STRING", "T_STRING_VARNAME", "T_VARIABLE", "T_NUM_STRING", "T_INLINE_HTML", "T_ENCAPSED_AND_WHITESPACE", "T_CONSTANT_ENCAPSED_STRING", "T_ECHO", "T_DO", "T_WHILE", "T_ENDWHILE", "T_FOR", "T_ENDFOR", "T_FOREACH", "T_ENDFOREACH", "T_DECLARE", "T_ENDDECLARE", "T_AS", "T_SWITCH", "T_MATCH", "T_ENDSWITCH", "T_CASE", "T_DEFAULT", "T_BREAK", "T_CONTINUE", "T_GOTO", "T_FUNCTION", "T_FN", "T_CONST", "T_RETURN", "T_TRY", "T_CATCH", "T_FINALLY", "T_USE", "T_INSTEADOF", "T_GLOBAL", "T_STATIC", "T_ABSTRACT", "T_FINAL", "T_PRIVATE", "T_PROTECTED", "T_PUBLIC", "T_READONLY", "T_VAR", "T_UNSET", "T_ISSET", "T_EMPTY", "T_HALT_COMPILER", "T_CLASS", "T_TRAIT", "T_INTERFACE", "T_ENUM", "T_EXTENDS", "T_IMPLEMENTS", "T_OBJECT_OPERATOR", "T_NULLSAFE_OBJECT_OPERATOR", "T_LIST", "T_ARRAY", "T_CALLABLE", "T_CLASS_C", "T_TRAIT_C", "T_METHOD_C", "T_FUNC_C", "T_LINE", "T_FILE", "T_START_HEREDOC", "T_END_HEREDOC", "T_DOLLAR_OPEN_CURLY_BRACES", "T_CURLY_OPEN", "T_PAAMAYIM_NEKUDOTAYIM", "T_NAMESPACE", "T_NS_C", "T_DIR", "T_NS_SEPARATOR", "T_ELLIPSIS", "T_NAME_FULLY_QUALIFIED", "T_NAME_QUALIFIED", "T_NAME_RELATIVE", "T_ATTRIBUTE", "';'", "']'", "'{'", "'}'", "'('", "')'", "'`'", "'\"'", "'\$'"); protected $tokenToSymbol = array(0, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 56, 166, 168, 167, 55, 168, 168, 163, 164, 53, 50, 8, 51, 52, 54, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 31, 159, 44, 16, 46, 30, 68, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 70, 168, 160, 36, 168, 165, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 161, 35, 162, 58, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 32, 33, 34, 37, 38, 39, 40, 41, 42, 43, 45, 47, 48, 49, 57, 59, 60, 61, 62, 63, 64, 65, 66, 67, 69, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158); protected $action = array(132, 133, 134, 575, 135, 136, 0, 738, 739, 740, 137, 37, 850, 825, 851, 476, -32766, -32766, -32766, -32767, -32767, -32767, -32767, 101, 102, 103, 104, 105, 1097, 1098, 1099, 1096, 1095, 1094, 1100, 732, 731, -32766, 1289, -32766, -32766, -32766, -32766, -32766, -32766, -32766, -32767, -32767, -32767, -32767, -32767, 1022, 377, 376, 2, 741, -32766, -32766, -32766, -32766, -32766, 822, 417, -32766, -32766, -32766, -32766, -32766, -32766, 267, 138, 399, 745, 746, 747, 748, 287, -32766, 423, -32766, -32766, -32766, -32766, -32766, -32766, 749, 750, 751, 752, 753, 754, 755, 756, 757, 758, 759, 779, 576, 780, 781, 782, 783, 771, 772, 340, 341, 774, 775, 760, 761, 762, 764, 765, 766, 351, 806, 807, 808, 809, 810, 577, 767, 768, 578, 579, 800, 791, 789, 790, 803, 786, 787, -327, 423, 580, 581, 785, 582, 583, 584, 585, 586, 587, 605, -590, 477, -86, 814, 788, 588, 589, -590, 139, -32766, -32766, -32766, 132, 133, 134, 575, 135, 136, 1046, 738, 739, 740, 137, 37, 323, 1013, 823, 824, 1334, 1324, -32766, 1335, -32766, -32766, -32766, -32766, -32766, -32766, -32766, 1097, 1098, 1099, 1096, 1095, 1094, 1100, -587, 732, 731, -32766, -32766, -32766, 12, -587, 81, -32766, -32766, -32766, 945, 946, 322, 927, 34, 947, 1224, 1223, 1225, 741, -86, 942, -32766, 1075, -32766, -32766, -32766, -32766, -32766, 239, -32766, -32766, -32766, 267, 138, 399, 745, 746, 747, 748, 461, 462, 423, 35, 247, 103, 104, 105, 128, 749, 750, 751, 752, 753, 754, 755, 756, 757, 758, 759, 779, 576, 780, 781, 782, 783, 771, 772, 340, 341, 774, 775, 760, 761, 762, 764, 765, 766, 351, 806, 807, 808, 809, 810, 577, 767, 768, 578, 579, 800, 791, 789, 790, 803, 786, 787, -327, 144, 580, 581, 785, 582, 583, 584, 585, 586, 587, 1222, 82, 83, 84, -590, 788, 588, 589, -590, 148, 763, 733, 734, 735, 736, 737, 1309, 738, 739, 740, 776, 777, 36, 1308, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 288, 271, -587, -193, 375, 376, -587, 976, -32766, 1021, 453, 454, 455, 109, 417, 945, 946, 741, 712, 819, 947, -32766, -32766, -32766, -271, 1073, 941, 1224, 1223, 1225, 288, 742, 743, 744, 745, 746, 747, 748, -192, -365, 812, -365, -32766, 599, -32766, -32766, 549, 749, 750, 751, 752, 753, 754, 755, 756, 757, 758, 759, 779, 802, 780, 781, 782, 783, 771, 772, 773, 801, 774, 775, 760, 761, 762, 764, 765, 766, 805, 806, 807, 808, 809, 810, 811, 767, 768, 769, 770, 800, 791, 789, 790, 803, 786, 787, 251, 820, 778, 784, 785, 792, 793, 795, 794, 796, 797, 732, 731, 1261, 1022, 1019, 788, 799, 798, 49, 50, 51, 507, 52, 53, 1009, 1008, 1007, 1010, 54, 55, -111, 56, 816, 1045, 14, -111, 1022, -111, 287, 1305, 977, 306, 302, 1022, 238, -111, -111, -111, -111, -111, -111, -111, -111, 106, 107, 108, 1089, 271, -32766, -32766, -32766, 280, 284, 126, -193, 929, 57, 58, 287, 109, 1019, -541, 59, 308, 60, 244, 245, 61, 62, 63, 64, 65, 66, 67, 68, 1229, 27, 269, 69, 439, 508, -341, 1022, 929, 1255, 1256, 509, 907, 823, -192, 150, 907, 1253, 41, 24, 510, 352, 511, 818, 512, 386, 513, 11, 699, 514, 515, 648, 25, 814, 43, 44, 440, 372, 371, 907, 45, 516, 702, 1220, 667, 668, 363, 334, -540, 357, -541, -541, 320, 1215, 1249, 518, 519, 520, -581, 1074, 335, 724, -581, 1019, -32766, -541, 336, 521, 522, 703, 1243, 1244, 1245, 1246, 1240, 1241, 294, -541, 850, -547, 851, 823, 1247, 1242, 365, 1022, 1224, 1223, 1225, 295, -153, -153, -153, 369, 70, 897, 318, 319, 322, 897, 384, 149, 402, 373, 374, -153, 435, -153, 436, -153, 280, -153, -540, -540, 141, 1220, 378, 379, 639, 640, 322, 370, 897, 907, 437, 438, 829, -540, -88, 151, 732, 731, 945, 946, 153, 823, -32766, 517, -51, -540, 154, -546, 883, 941, -111, -111, -111, 31, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 155, 74, 27, 157, 32, 322, -85, 123, 124, 909, 129, 697, 130, 909, 823, 697, -153, 143, 1253, 158, -32766, -544, 1229, -542, 159, 160, 1222, 161, -79, 1134, 1136, -75, 285, -32766, -32766, -32766, 909, -32766, 697, -32766, -539, -32766, -301, -73, -32766, 897, -72, -71, 1220, -32766, -32766, -32766, -16, 140, 1215, -32766, -32766, 732, 731, 322, -70, -32766, 414, -69, -4, 907, -68, -67, 521, 522, -32766, 1243, 1244, 1245, 1246, 1240, 1241, -66, -47, -18, 147, 270, 281, 1247, 1242, -544, -544, -542, -542, 732, 731, 713, 716, 906, -32766, 72, 146, 907, 319, 322, 1222, -297, -542, 823, -539, -539, 276, -32766, -32766, -32766, 277, -32766, -544, -32766, -542, -32766, 282, 283, -32766, -539, 909, 328, 697, -32766, -32766, -32766, -32766, 704, 286, -32766, -32766, -539, 1222, 923, 289, -32766, 414, 1220, 290, -32766, -32766, -32766, 271, -32766, -32766, -32766, 47, -32766, 897, -111, -32766, 677, 109, 814, 145, -32766, -32766, -32766, -32766, 823, 131, -32766, -32766, 1336, -32766, 654, 670, -32766, 414, 1104, 370, 637, 430, 551, 73, 13, -32766, 293, 555, 295, 897, 945, 946, 649, 74, 434, 517, 458, 322, 487, 690, 842, 941, -111, -111, -111, 301, 1022, 561, 655, 671, 1260, 300, -32766, -539, -32766, 907, 603, 303, 1222, 296, 297, 39, 1262, 9, 40, -32766, -32766, -32766, 0, -32766, 907, -32766, 909, -32766, 697, -4, -32766, 0, 1229, 907, 0, -32766, -32766, -32766, -32766, 307, 125, -32766, -32766, 0, 1222, 907, 0, -32766, 414, 0, 0, -32766, -32766, -32766, 707, -32766, -32766, -32766, 962, -32766, 697, -505, -32766, 714, -495, 7, 482, -32766, -32766, -32766, -32766, -539, -539, -32766, -32766, 16, 1222, 567, 367, -32766, 414, 925, 295, -32766, -32766, -32766, -539, -32766, -32766, -32766, 822, -32766, 897, 721, -32766, 722, -575, 888, -539, -32766, -32766, -32766, 986, 963, 970, -32766, -32766, 897, -249, -249, -249, -32766, 414, 823, 370, 960, 897, 971, 886, 958, -32766, 1078, 1081, 718, 1082, 945, 946, 1079, 897, 1080, 517, 1086, 33, 1250, 834, 883, 941, -111, -111, -111, 27, 1275, 1293, 1327, -248, -248, -248, 1220, 642, 884, 370, 317, 823, 366, 698, 701, 1253, 1331, 705, -111, 706, 945, 946, 708, 709, 710, 517, 909, -32766, 697, -249, 883, 941, -111, -111, -111, 711, 715, 700, -509, 1333, 845, 909, 48, 697, -573, 1220, 844, 853, 295, 935, 909, 1215, 697, 74, 978, 852, 1332, 322, 934, 932, 933, 936, 909, 1206, 697, -248, 522, 916, 1243, 1244, 1245, 1246, 1240, 1241, 926, 914, 968, 969, 1330, 1287, 1247, 1242, 1276, 1294, -32766, 1300, 1303, 1191, -547, -546, 1222, -545, 72, -489, 1, 319, 322, -32766, -32766, -32766, 28, -32766, 29, -32766, 38, -32766, 298, 299, -32766, 42, 46, 71, 75, -32766, -32766, -32766, 76, 77, 78, -32766, -32766, 368, 79, 80, 142, -32766, 414, 152, 156, 243, 324, 352, 353, 127, -32766, -274, 354, 355, 356, 357, 358, 359, 360, 361, 362, 364, 431, 0, -272, -271, 18, 19, 20, 21, 23, 401, 478, 479, 486, 489, 490, 491, 492, 496, 497, 498, 505, 684, 1233, 1174, 1251, 1048, 1047, 1028, 0, 1210, 1024, -276, -103, 17, 22, 26, 292, 400, 596, 600, 628, 689, 1178, 1228, 1175, 1306, 0, 0, 1254, 0, 322); protected $actionCheck = array(2, 3, 4, 5, 6, 7, 0, 9, 10, 11, 12, 13, 106, 1, 108, 31, 9, 10, 11, 44, 45, 46, 47, 48, 49, 50, 51, 52, 116, 117, 118, 119, 120, 121, 122, 37, 38, 30, 1, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 138, 106, 107, 8, 57, 9, 10, 11, 9, 10, 155, 116, 9, 10, 11, 9, 10, 11, 71, 72, 73, 74, 75, 76, 77, 163, 30, 80, 32, 33, 34, 35, 36, 30, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 8, 80, 136, 137, 138, 139, 140, 141, 142, 143, 144, 51, 1, 161, 31, 80, 150, 151, 152, 8, 154, 9, 10, 11, 2, 3, 4, 5, 6, 7, 164, 9, 10, 11, 12, 13, 70, 1, 82, 159, 80, 85, 30, 83, 32, 33, 34, 35, 36, 37, 38, 116, 117, 118, 119, 120, 121, 122, 1, 37, 38, 9, 10, 11, 8, 8, 161, 9, 10, 11, 117, 118, 167, 1, 8, 122, 155, 156, 157, 57, 97, 128, 30, 162, 32, 33, 34, 35, 30, 14, 32, 33, 34, 71, 72, 73, 74, 75, 76, 77, 134, 135, 80, 147, 148, 50, 51, 52, 8, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 164, 8, 136, 137, 138, 139, 140, 141, 142, 143, 144, 80, 9, 10, 11, 160, 150, 151, 152, 164, 154, 2, 3, 4, 5, 6, 7, 1, 9, 10, 11, 12, 13, 30, 8, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 30, 57, 160, 8, 106, 107, 164, 31, 9, 137, 129, 130, 131, 69, 116, 117, 118, 57, 161, 80, 122, 9, 10, 11, 164, 1, 128, 155, 156, 157, 30, 71, 72, 73, 74, 75, 76, 77, 8, 106, 80, 108, 30, 1, 32, 33, 85, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 8, 156, 136, 137, 138, 139, 140, 141, 142, 143, 144, 37, 38, 146, 138, 116, 150, 151, 152, 2, 3, 4, 5, 6, 7, 119, 120, 121, 122, 12, 13, 101, 15, 80, 1, 101, 106, 138, 108, 163, 1, 159, 8, 113, 138, 97, 116, 117, 118, 119, 120, 121, 122, 123, 53, 54, 55, 123, 57, 9, 10, 11, 163, 30, 14, 164, 122, 50, 51, 163, 69, 116, 70, 56, 8, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 1, 70, 71, 72, 73, 74, 162, 138, 122, 78, 79, 80, 1, 82, 164, 14, 1, 86, 87, 88, 89, 163, 91, 156, 93, 106, 95, 108, 161, 98, 99, 75, 76, 80, 103, 104, 105, 106, 107, 1, 109, 110, 31, 116, 75, 76, 115, 116, 70, 163, 134, 135, 8, 122, 1, 124, 125, 126, 160, 159, 8, 161, 164, 116, 137, 149, 8, 136, 137, 31, 139, 140, 141, 142, 143, 144, 145, 161, 106, 163, 108, 82, 151, 152, 8, 138, 155, 156, 157, 158, 75, 76, 77, 8, 163, 84, 165, 166, 167, 84, 8, 101, 102, 106, 107, 90, 8, 92, 8, 94, 163, 96, 134, 135, 161, 116, 106, 107, 111, 112, 167, 106, 84, 1, 8, 8, 8, 149, 31, 14, 37, 38, 117, 118, 14, 82, 137, 122, 31, 161, 14, 163, 127, 128, 129, 130, 131, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 14, 163, 70, 14, 14, 167, 31, 16, 16, 159, 16, 161, 16, 159, 82, 161, 162, 16, 86, 16, 74, 70, 1, 70, 16, 16, 80, 16, 31, 59, 60, 31, 37, 87, 88, 89, 159, 91, 161, 93, 70, 95, 35, 31, 98, 84, 31, 31, 116, 103, 104, 105, 31, 161, 122, 109, 110, 37, 38, 167, 31, 115, 116, 31, 0, 1, 31, 31, 136, 137, 124, 139, 140, 141, 142, 143, 144, 31, 31, 31, 31, 31, 31, 151, 152, 134, 135, 134, 135, 37, 38, 31, 31, 31, 74, 163, 31, 1, 166, 167, 80, 35, 149, 82, 134, 135, 35, 87, 88, 89, 35, 91, 161, 93, 161, 95, 35, 35, 98, 149, 159, 35, 161, 103, 104, 105, 74, 31, 37, 109, 110, 161, 80, 38, 37, 115, 116, 116, 37, 87, 88, 89, 57, 91, 124, 93, 70, 95, 84, 128, 98, 77, 69, 80, 70, 103, 104, 105, 137, 82, 31, 109, 110, 83, 85, 96, 94, 115, 116, 82, 106, 113, 108, 85, 154, 97, 124, 113, 89, 158, 84, 117, 118, 90, 163, 128, 122, 97, 167, 97, 92, 127, 128, 129, 130, 131, 133, 138, 153, 100, 100, 146, 132, 74, 70, 137, 1, 153, 114, 80, 134, 135, 159, 146, 150, 159, 87, 88, 89, -1, 91, 1, 93, 159, 95, 161, 162, 98, -1, 1, 1, -1, 103, 104, 105, 74, 132, 161, 109, 110, -1, 80, 1, -1, 115, 116, -1, -1, 87, 88, 89, 31, 91, 124, 93, 159, 95, 161, 149, 98, 31, 149, 149, 102, 103, 104, 105, 74, 134, 135, 109, 110, 149, 80, 81, 149, 115, 116, 154, 158, 87, 88, 89, 149, 91, 124, 93, 155, 95, 84, 159, 98, 159, 163, 159, 161, 103, 104, 105, 159, 159, 159, 109, 110, 84, 100, 101, 102, 115, 116, 82, 106, 159, 84, 159, 159, 159, 124, 159, 159, 162, 159, 117, 118, 159, 84, 159, 122, 159, 161, 160, 160, 127, 128, 129, 130, 131, 70, 160, 160, 160, 100, 101, 102, 116, 160, 162, 106, 161, 82, 161, 161, 161, 86, 162, 161, 128, 161, 117, 118, 161, 161, 161, 122, 159, 137, 161, 162, 127, 128, 129, 130, 131, 161, 161, 161, 165, 162, 162, 159, 70, 161, 163, 116, 162, 162, 158, 162, 159, 122, 161, 163, 162, 162, 162, 167, 162, 162, 162, 162, 159, 162, 161, 162, 137, 162, 139, 140, 141, 142, 143, 144, 162, 162, 162, 162, 162, 162, 151, 152, 162, 162, 74, 162, 162, 165, 163, 163, 80, 163, 163, 163, 163, 166, 167, 87, 88, 89, 163, 91, 163, 93, 163, 95, 134, 135, 98, 163, 163, 163, 163, 103, 104, 105, 163, 163, 163, 109, 110, 149, 163, 163, 163, 115, 116, 163, 163, 163, 163, 163, 163, 161, 124, 164, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, -1, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, -1, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, -1, -1, 166, -1, 167); protected $actionBase = array(0, -2, 154, 542, 752, 893, 929, 580, 53, 394, 855, 307, 307, 67, 307, 307, 307, 565, 908, 908, 917, 908, 538, 784, 649, 649, 649, 708, 708, 708, 708, 740, 740, 849, 849, 881, 817, 634, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 12, 323, 389, 678, 1044, 1050, 1046, 1051, 1042, 1041, 1045, 1047, 1052, 942, 943, 753, 946, 947, 949, 950, 1048, 873, 1043, 1049, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 346, 491, 50, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 54, 54, 54, 620, 620, 359, 190, 184, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 658, 47, 144, 144, 7, 7, 7, 7, 7, 371, -25, -25, -25, -25, 709, 347, 916, 474, 526, 375, 280, 317, 245, 340, 340, 187, 187, 396, 396, -87, -87, 396, 396, 396, 747, 747, 747, 747, 443, 505, -94, 308, 454, 480, 480, 480, 480, 454, 454, 454, 454, 755, 1054, 454, 454, 454, 641, 822, 822, 998, 442, 442, 442, 822, 499, 776, 88, 499, 88, 37, 92, 756, 85, -54, 425, 756, 639, 764, 189, 143, 820, 524, 820, 1040, 385, 767, 413, 735, 688, 857, 902, 1053, 787, 940, 788, 941, 228, 98, 685, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1055, 415, 1040, 286, 1055, 1055, 1055, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 534, 286, 483, 496, 286, 774, 415, 12, 800, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 736, -16, 12, 323, 204, 204, 427, 168, 204, 204, 204, 204, 12, 12, 12, 524, 773, 733, 537, 742, 377, 773, 773, 773, 115, 124, 207, 342, 695, 754, 446, 761, 761, 775, 957, 957, 761, 765, 761, 775, 973, 761, 761, 957, 957, 809, 232, 625, 579, 612, 627, 957, 475, 761, 761, 761, 761, 792, 643, 761, 433, 281, 761, 761, 792, 758, 739, 46, 751, 957, 957, 957, 792, 603, 751, 751, 751, 819, 821, 746, 738, 571, 507, 645, 198, 783, 738, 738, 761, 619, 746, 738, 746, 738, 812, 738, 738, 738, 746, 738, 765, 585, 738, 691, 644, 188, 738, 6, 974, 975, 624, 979, 967, 980, 1009, 981, 985, 878, 956, 992, 972, 986, 965, 963, 750, 679, 680, 801, 797, 954, 771, 771, 771, 951, 771, 771, 771, 771, 771, 771, 771, 771, 679, 858, 814, 745, 777, 995, 682, 684, 743, 872, 899, 948, 994, 1030, 987, 741, 689, 1016, 999, 846, 875, 1000, 1001, 1017, 1031, 1032, 880, 772, 903, 904, 859, 1003, 879, 771, 974, 985, 663, 972, 986, 965, 963, 734, 724, 720, 723, 717, 704, 700, 703, 737, 1033, 907, 818, 866, 1002, 952, 679, 867, 1012, 856, 1018, 1019, 877, 778, 768, 868, 910, 1004, 1005, 1006, 882, 1034, 884, 744, 1013, 997, 1020, 780, 911, 1021, 1022, 1023, 1024, 887, 913, 888, 889, 823, 781, 1010, 757, 918, 528, 769, 770, 789, 1008, 642, 993, 900, 919, 920, 1025, 1026, 1027, 922, 923, 990, 828, 1014, 760, 1015, 1011, 829, 830, 647, 785, 1035, 759, 763, 779, 653, 674, 924, 925, 927, 991, 748, 762, 841, 843, 1037, 683, 1038, 931, 677, 844, 696, 938, 1029, 697, 699, 786, 901, 811, 782, 766, 1007, 749, 845, 939, 847, 848, 850, 1028, 853, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 458, 458, 458, 458, 458, 458, 307, 307, 307, 307, 0, 0, 307, 0, 0, 0, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 219, 219, 291, 291, 291, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 0, 291, 291, 291, 291, 291, 291, 291, 291, 809, 442, 442, 442, 442, 219, 219, 219, 219, 219, -88, -88, 219, 809, 219, 219, 442, 442, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 0, 0, 286, 88, 219, 765, 765, 765, 765, 219, 219, 219, 219, 88, 88, 219, 219, 219, 0, 0, 0, 0, 0, 0, 0, 0, 286, 88, 0, 286, 0, 765, 765, 219, 0, 809, 314, 219, 0, 0, 0, 0, 286, 765, 286, 415, 761, 88, 761, 415, 415, 204, 12, 314, 527, 527, 527, 527, 0, 0, 524, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 765, 0, 809, 0, 765, 765, 765, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 765, 0, 0, 957, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 973, 0, 0, 0, 0, 0, 0, 765, 0, 0, 0, 0, 0, 0, 0, 0, 771, 778, 0, 778, 0, 771, 771, 771, 0, 0, 0, 0, 785, 683); protected $actionDefault = array(3, 32767, 103, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 101, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 593, 593, 593, 593, 32767, 32767, 253, 103, 32767, 32767, 467, 385, 385, 385, 32767, 32767, 537, 537, 537, 537, 537, 537, 32767, 32767, 32767, 32767, 32767, 32767, 467, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 101, 32767, 32767, 32767, 37, 7, 8, 10, 11, 50, 17, 323, 32767, 32767, 32767, 32767, 103, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 586, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 471, 450, 451, 453, 454, 384, 538, 592, 326, 589, 383, 146, 338, 328, 241, 329, 257, 472, 258, 473, 476, 477, 214, 286, 380, 150, 414, 468, 416, 466, 470, 415, 390, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 388, 389, 469, 447, 446, 445, 32767, 32767, 412, 413, 417, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 103, 32767, 387, 420, 418, 419, 436, 437, 434, 435, 438, 32767, 439, 440, 441, 442, 32767, 315, 32767, 32767, 32767, 364, 362, 315, 112, 32767, 32767, 427, 428, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 531, 444, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 103, 32767, 101, 533, 409, 411, 501, 422, 423, 421, 391, 32767, 508, 32767, 103, 510, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 532, 32767, 539, 539, 32767, 494, 101, 194, 32767, 32767, 32767, 194, 194, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 600, 494, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 32767, 194, 111, 32767, 32767, 32767, 101, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 189, 32767, 267, 269, 103, 554, 194, 32767, 513, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 506, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 494, 432, 139, 32767, 139, 539, 424, 425, 426, 496, 539, 539, 539, 311, 288, 32767, 32767, 32767, 32767, 511, 511, 101, 101, 101, 101, 506, 32767, 32767, 32767, 32767, 112, 100, 100, 100, 100, 100, 104, 102, 32767, 32767, 32767, 32767, 222, 100, 32767, 102, 102, 32767, 32767, 222, 224, 211, 102, 226, 32767, 558, 559, 222, 102, 226, 226, 226, 246, 246, 483, 317, 102, 100, 102, 102, 196, 317, 317, 32767, 102, 483, 317, 483, 317, 198, 317, 317, 317, 483, 317, 32767, 102, 317, 213, 100, 100, 317, 32767, 32767, 32767, 496, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 221, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 526, 32767, 543, 556, 430, 431, 433, 541, 455, 456, 457, 458, 459, 460, 461, 463, 588, 32767, 500, 32767, 32767, 32767, 32767, 337, 598, 32767, 598, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 599, 32767, 539, 32767, 32767, 32767, 32767, 429, 9, 76, 489, 43, 44, 52, 58, 517, 518, 519, 520, 514, 515, 521, 516, 32767, 32767, 522, 564, 32767, 32767, 540, 591, 32767, 32767, 32767, 32767, 32767, 32767, 139, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 526, 32767, 137, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 539, 32767, 32767, 32767, 32767, 313, 310, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 539, 32767, 32767, 32767, 32767, 32767, 290, 32767, 307, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 285, 32767, 32767, 379, 32767, 32767, 32767, 32767, 358, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 152, 152, 3, 3, 340, 152, 152, 152, 340, 340, 152, 340, 340, 340, 152, 152, 152, 152, 152, 152, 279, 184, 261, 264, 246, 246, 152, 350, 152); protected $goto = array(194, 194, 685, 425, 653, 346, 614, 650, 419, 310, 311, 331, 569, 316, 424, 332, 426, 630, 1200, 930, 693, 1051, 1201, 1204, 931, 1205, 165, 165, 165, 165, 218, 195, 191, 191, 175, 177, 213, 191, 191, 191, 191, 191, 192, 192, 192, 192, 192, 192, 186, 187, 188, 189, 190, 215, 213, 216, 529, 530, 415, 531, 533, 534, 535, 536, 537, 538, 539, 540, 1120, 166, 167, 168, 193, 169, 170, 171, 164, 172, 173, 174, 176, 212, 214, 217, 235, 240, 241, 242, 254, 255, 256, 257, 258, 259, 260, 261, 263, 264, 265, 266, 278, 279, 313, 314, 315, 420, 421, 422, 574, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 178, 234, 179, 196, 197, 198, 236, 186, 187, 188, 189, 190, 215, 1120, 199, 180, 181, 182, 200, 196, 183, 237, 201, 199, 163, 202, 203, 184, 204, 205, 206, 185, 207, 208, 209, 210, 211, 275, 275, 275, 275, 843, 593, 646, 647, 560, 664, 665, 666, 720, 629, 631, 840, 418, 651, 604, 841, 350, 675, 679, 996, 683, 691, 992, 616, 616, 817, 350, 350, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1092, 1093, 350, 350, 874, 350, 848, 1337, 896, 891, 892, 905, 849, 893, 846, 894, 895, 847, 548, 900, 899, 901, 350, 391, 394, 554, 594, 598, 1270, 1270, 1072, 1068, 1069, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1268, 1268, 815, 347, 348, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1221, 1020, 1221, 1020, 1221, 836, 5, 1020, 6, 1020, 1020, 1281, 961, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 349, 349, 349, 349, 1221, 460, 460, 566, 678, 1221, 1221, 1221, 1221, 344, 460, 1221, 1221, 1221, 1302, 1302, 1302, 1302, 602, 617, 620, 621, 622, 623, 643, 644, 645, 695, 836, 912, 553, 546, 1310, 913, 548, 532, 532, 821, 856, 982, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 543, 473, 543, 868, 543, 928, 855, 928, 389, 475, 337, 546, 553, 562, 563, 339, 572, 595, 609, 610, 1320, 1320, 249, 249, 1026, 1025, 15, 821, 450, 821, 494, 565, 495, 955, 955, 955, 955, 1320, 501, 450, 949, 956, 839, 652, 1321, 1321, 1169, 1214, 246, 246, 246, 246, 248, 250, 1323, 985, 959, 959, 957, 959, 719, 1321, 545, 994, 989, 470, 1295, 1296, 953, 405, 692, 917, 1108, 432, 541, 541, 541, 541, 612, 597, 452, 444, 1029, 1030, 1001, 658, 444, 1292, 444, 1292, 674, 1292, 860, 833, 656, 980, 836, 861, 547, 557, 854, 321, 305, 547, 333, 557, 1297, 1298, 392, 456, 570, 607, 1211, 944, 398, 858, 1304, 1304, 1304, 1304, 463, 573, 464, 465, 608, 1004, 866, 403, 404, 1328, 1329, 1057, 662, 1212, 663, 471, 407, 408, 409, 723, 676, 870, 1288, 410, 624, 626, 627, 342, 427, 1216, 869, 857, 1056, 1060, 427, 864, 1061, 1103, 966, 0, 0, 964, 1027, 1027, 0, 0, 0, 657, 1038, 1034, 1035, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 0, 1059, 444, 954, 0, 1290, 1290, 1059, 592, 1085, 0, 696, 682, 682, 0, 502, 688, 1083, 0, 0, 0, 1217, 1218, 272, 428, 1101, 873, 0, 544, 831, 544, 0, 0, 0, 673, 938, 0, 0, 1015, 1031, 1032, 0, 0, 0, 0, 0, 0, 1219, 1278, 1279, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 252, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 999, 999); protected $gotoCheck = array(42, 42, 72, 65, 65, 96, 55, 55, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 78, 78, 9, 126, 78, 78, 78, 78, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 23, 23, 23, 23, 15, 129, 85, 85, 48, 85, 85, 85, 48, 48, 48, 26, 13, 48, 13, 27, 14, 48, 48, 48, 48, 48, 48, 107, 107, 7, 14, 14, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 143, 143, 14, 14, 45, 14, 15, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 64, 15, 64, 14, 58, 58, 58, 58, 58, 168, 168, 15, 15, 15, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 169, 169, 6, 96, 96, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 72, 72, 72, 72, 72, 22, 46, 72, 46, 72, 72, 14, 49, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 24, 24, 24, 24, 72, 148, 148, 170, 14, 72, 72, 72, 72, 177, 148, 72, 72, 72, 9, 9, 9, 9, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 22, 72, 75, 75, 179, 72, 14, 171, 171, 12, 35, 102, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 19, 83, 19, 35, 19, 9, 35, 9, 61, 83, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 180, 180, 5, 5, 117, 117, 75, 12, 19, 12, 154, 103, 154, 19, 19, 19, 19, 180, 154, 19, 19, 19, 25, 63, 181, 181, 150, 14, 5, 5, 5, 5, 5, 5, 180, 25, 25, 25, 25, 25, 25, 181, 25, 25, 25, 174, 174, 174, 92, 92, 92, 17, 17, 112, 106, 106, 106, 106, 17, 106, 82, 23, 118, 118, 17, 119, 23, 129, 23, 129, 115, 129, 17, 18, 17, 17, 22, 39, 9, 9, 17, 167, 167, 9, 29, 9, 176, 176, 9, 9, 2, 2, 17, 91, 28, 37, 129, 129, 129, 129, 9, 9, 9, 9, 79, 109, 9, 81, 81, 9, 9, 128, 81, 159, 81, 156, 81, 81, 81, 98, 81, 41, 129, 81, 84, 84, 84, 81, 116, 20, 16, 16, 16, 16, 116, 9, 131, 146, 95, -1, -1, 16, 116, 116, -1, -1, -1, 116, 116, 116, 116, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, 129, 23, 16, -1, 129, 129, 129, 8, 8, -1, 8, 8, 8, -1, 8, 8, 8, -1, -1, -1, 20, 20, 24, 88, 16, 16, -1, 24, 20, 24, -1, -1, -1, 88, 88, -1, -1, 88, 88, 88, -1, -1, -1, -1, -1, -1, 20, 20, 20, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 106, 106); protected $gotoBase = array(0, 0, -250, 0, 0, 360, 235, 181, 522, 7, 0, 0, 33, -156, -113, -178, 43, -49, 126, 72, 100, 0, -9, 158, 282, 377, 172, 176, 120, 150, 0, 0, 0, 0, 0, -39, 0, 119, 0, 116, 0, 45, -1, 0, 0, 195, -456, 0, -529, 250, 0, 0, 0, 0, 0, -33, 0, 0, 182, 0, 0, 306, 0, 143, 203, -235, 0, 0, 0, 0, 0, 0, -6, 0, 0, -21, 0, 0, -385, 124, -46, -19, 144, -123, 10, -538, 0, 0, 275, 0, 0, 127, 106, 0, 0, 60, -472, 0, 76, 0, 0, 0, 294, 328, 0, 0, 386, -50, 0, 99, 0, 0, 138, 0, 0, 149, 219, 87, 139, 137, 0, 0, 0, 0, 0, 0, 19, 0, 101, 159, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -69, 0, 0, 58, 0, 257, 0, 114, 0, 0, 0, -120, 0, 40, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 122, -7, 8, 264, 86, 0, 0, 107, 0, 78, 269, 0, 291, 55, 79, 0, 0); protected $gotoDefault = array(-32768, 506, 727, 4, 728, 921, 804, 813, 590, 523, 694, 343, 618, 416, 1286, 898, 1107, 571, 832, 1230, 1238, 451, 835, 326, 717, 880, 881, 882, 395, 381, 387, 393, 641, 619, 488, 867, 447, 859, 480, 862, 446, 871, 162, 413, 504, 875, 3, 877, 550, 908, 382, 885, 383, 669, 887, 556, 889, 890, 390, 396, 397, 1112, 564, 615, 902, 253, 558, 903, 380, 904, 911, 385, 388, 680, 459, 499, 493, 406, 1087, 559, 601, 638, 441, 467, 613, 625, 611, 474, 1023, 411, 325, 943, 951, 481, 457, 965, 345, 973, 725, 1119, 632, 483, 981, 633, 988, 991, 524, 525, 472, 1003, 268, 1006, 484, 1044, 659, 1017, 1018, 660, 634, 1040, 635, 661, 636, 1042, 466, 591, 1050, 448, 1058, 1274, 449, 1062, 262, 1065, 274, 412, 429, 1070, 1071, 8, 1077, 686, 687, 10, 273, 503, 1102, 681, 445, 1118, 433, 1188, 1190, 552, 485, 1208, 1207, 672, 500, 1213, 442, 1277, 443, 526, 468, 312, 527, 304, 329, 309, 542, 291, 330, 528, 469, 1283, 1291, 327, 30, 1311, 1322, 338, 568, 606); protected $ruleToNonTerminal = array(0, 1, 3, 3, 2, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 9, 10, 11, 11, 11, 12, 12, 13, 13, 14, 15, 15, 16, 16, 17, 17, 18, 18, 21, 21, 22, 23, 23, 24, 24, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 29, 29, 30, 30, 32, 34, 34, 28, 36, 36, 33, 38, 38, 35, 35, 37, 37, 39, 39, 31, 40, 40, 41, 43, 44, 44, 45, 46, 46, 48, 47, 47, 47, 47, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 25, 25, 68, 68, 71, 71, 70, 69, 69, 62, 74, 74, 75, 75, 76, 76, 77, 77, 78, 78, 79, 79, 26, 26, 27, 27, 27, 27, 27, 87, 87, 89, 89, 82, 82, 90, 90, 91, 91, 91, 83, 83, 86, 86, 84, 84, 92, 93, 93, 56, 56, 64, 64, 67, 67, 67, 66, 94, 94, 95, 57, 57, 57, 57, 96, 96, 97, 97, 98, 98, 99, 100, 100, 101, 101, 102, 102, 54, 54, 50, 50, 104, 52, 52, 105, 51, 51, 53, 53, 63, 63, 63, 63, 80, 80, 108, 108, 110, 110, 111, 111, 111, 111, 109, 109, 109, 113, 113, 113, 113, 88, 88, 116, 116, 116, 117, 117, 114, 114, 118, 118, 120, 120, 121, 121, 115, 122, 122, 119, 123, 123, 123, 123, 112, 112, 81, 81, 81, 20, 20, 20, 125, 124, 124, 126, 126, 126, 126, 59, 127, 127, 128, 60, 130, 130, 131, 131, 132, 132, 85, 133, 133, 133, 133, 133, 133, 138, 138, 139, 139, 140, 140, 140, 140, 140, 141, 142, 142, 137, 137, 134, 134, 136, 136, 144, 144, 143, 143, 143, 143, 143, 143, 143, 135, 145, 145, 147, 146, 146, 61, 103, 148, 148, 55, 55, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 155, 149, 149, 154, 154, 157, 158, 158, 159, 160, 161, 161, 161, 161, 19, 19, 72, 72, 72, 72, 150, 150, 150, 150, 163, 163, 151, 151, 153, 153, 153, 156, 156, 168, 168, 168, 168, 168, 168, 168, 168, 168, 169, 169, 107, 171, 171, 171, 171, 152, 152, 152, 152, 152, 152, 152, 152, 58, 58, 166, 166, 166, 166, 172, 172, 162, 162, 162, 173, 173, 173, 173, 173, 173, 73, 73, 65, 65, 65, 65, 129, 129, 129, 129, 176, 175, 165, 165, 165, 165, 165, 165, 165, 164, 164, 164, 174, 174, 174, 174, 106, 170, 178, 178, 177, 177, 179, 179, 179, 179, 179, 179, 179, 179, 167, 167, 167, 167, 181, 182, 180, 180, 180, 180, 180, 180, 180, 180, 183, 183, 183, 183); protected $ruleToLength = array(1, 1, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 2, 1, 3, 4, 1, 2, 0, 1, 1, 1, 1, 1, 3, 5, 4, 3, 4, 2, 3, 1, 1, 7, 6, 2, 3, 1, 2, 3, 1, 2, 3, 1, 1, 3, 1, 3, 1, 2, 2, 3, 1, 3, 2, 3, 1, 3, 2, 0, 1, 1, 1, 1, 1, 3, 7, 10, 5, 7, 9, 5, 3, 3, 3, 3, 3, 3, 1, 2, 5, 7, 9, 6, 5, 6, 3, 2, 1, 1, 1, 0, 2, 1, 3, 8, 0, 4, 2, 1, 3, 0, 1, 0, 1, 0, 1, 3, 1, 1, 1, 8, 9, 7, 8, 7, 6, 8, 0, 2, 0, 2, 1, 2, 1, 2, 1, 1, 1, 0, 2, 0, 2, 0, 2, 2, 1, 3, 1, 4, 1, 4, 1, 1, 4, 2, 1, 3, 3, 3, 4, 4, 5, 0, 2, 4, 3, 1, 1, 7, 0, 2, 1, 3, 3, 4, 1, 4, 0, 2, 5, 0, 2, 6, 0, 2, 0, 3, 1, 2, 1, 1, 2, 0, 1, 3, 0, 2, 1, 1, 1, 1, 6, 8, 6, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 1, 3, 3, 3, 3, 3, 1, 3, 3, 1, 1, 2, 1, 1, 0, 1, 0, 2, 2, 2, 4, 3, 1, 1, 3, 1, 2, 2, 3, 2, 3, 1, 1, 2, 3, 1, 1, 3, 2, 0, 1, 5, 5, 10, 3, 5, 1, 1, 3, 0, 2, 4, 5, 4, 4, 4, 3, 1, 1, 1, 1, 1, 1, 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 3, 1, 1, 3, 2, 2, 3, 1, 0, 1, 1, 3, 3, 3, 4, 1, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 4, 3, 4, 4, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 3, 2, 1, 2, 4, 2, 2, 8, 9, 8, 9, 9, 10, 9, 10, 8, 3, 2, 0, 4, 2, 1, 3, 2, 1, 2, 2, 2, 4, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 0, 3, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 4, 1, 1, 3, 1, 1, 1, 1, 1, 3, 2, 3, 0, 1, 1, 3, 1, 1, 1, 1, 1, 3, 1, 1, 4, 4, 1, 4, 4, 0, 1, 1, 1, 3, 3, 1, 4, 2, 2, 1, 3, 1, 4, 4, 3, 3, 3, 3, 1, 3, 1, 1, 3, 1, 1, 4, 1, 1, 1, 3, 1, 1, 2, 1, 3, 4, 3, 2, 0, 2, 2, 1, 2, 1, 1, 1, 4, 3, 3, 3, 3, 6, 3, 1, 1, 2, 1); protected function initReduceCallbacks() { $this->reduceCallbacks = [0 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 1 => function ($stackPos) { $this->semValue = $this->handleNamespaces($this->semStack[$stackPos - (1 - 1)]); }, 2 => function ($stackPos) { if (\is_array($this->semStack[$stackPos - (2 - 2)])) { $this->semValue = \array_merge($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)]); } else { $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; $this->semValue = $this->semStack[$stackPos - (2 - 1)]; } }, 3 => function ($stackPos) { $this->semValue = array(); }, 4 => function ($stackPos) { $startAttributes = $this->lookaheadStartAttributes; if (isset($startAttributes['comments'])) { $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); } else { $nop = null; } if ($nop !== null) { $this->semStack[$stackPos - (1 - 1)][] = $nop; } $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 5 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 6 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 7 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 8 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 9 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 10 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 11 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 12 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 13 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 14 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 15 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 16 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 17 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 18 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 19 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 20 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 21 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 22 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 23 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 24 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 25 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 26 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 27 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 28 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 29 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 30 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 31 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 32 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 33 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 34 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 35 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 36 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 37 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 38 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 39 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 40 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 41 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 42 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 43 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 44 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 45 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 46 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 47 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 48 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 49 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 50 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 51 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 52 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 53 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 54 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 55 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 56 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 57 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 58 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 59 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 60 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 61 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 62 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 63 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 64 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 65 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 66 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 67 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 68 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 69 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 70 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 71 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 72 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 73 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 74 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 75 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 76 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 77 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 78 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 79 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 80 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 81 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 82 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 83 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 84 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 85 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 86 => function ($stackPos) { $this->semValue = new Node\Identifier($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 87 => function ($stackPos) { $this->semValue = new Node\Identifier($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 88 => function ($stackPos) { $this->semValue = new Node\Identifier($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 89 => function ($stackPos) { $this->semValue = new Node\Identifier($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 90 => function ($stackPos) { $this->semValue = new Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 91 => function ($stackPos) { $this->semValue = new Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 92 => function ($stackPos) { $this->semValue = new Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 93 => function ($stackPos) { $this->semValue = new Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 94 => function ($stackPos) { $this->semValue = new Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 95 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 96 => function ($stackPos) { $this->semValue = new Name(\substr($this->semStack[$stackPos - (1 - 1)], 1), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 97 => function ($stackPos) { $this->semValue = new Expr\Variable(\substr($this->semStack[$stackPos - (1 - 1)], 1), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 98 => function ($stackPos) { /* nothing */ }, 99 => function ($stackPos) { /* nothing */ }, 100 => function ($stackPos) { /* nothing */ }, 101 => function ($stackPos) { $this->emitError(new Error('A trailing comma is not allowed here', $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes)); }, 102 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 103 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 104 => function ($stackPos) { $this->semValue = new Node\Attribute($this->semStack[$stackPos - (1 - 1)], [], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 105 => function ($stackPos) { $this->semValue = new Node\Attribute($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 106 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); }, 107 => function ($stackPos) { $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; $this->semValue = $this->semStack[$stackPos - (3 - 1)]; }, 108 => function ($stackPos) { $this->semValue = new Node\AttributeGroup($this->semStack[$stackPos - (4 - 2)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 109 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); }, 110 => function ($stackPos) { $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; $this->semValue = $this->semStack[$stackPos - (2 - 1)]; }, 111 => function ($stackPos) { $this->semValue = []; }, 112 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 113 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 114 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 115 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 116 => function ($stackPos) { $this->semValue = new Stmt\HaltCompiler($this->lexer->handleHaltCompiler(), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 117 => function ($stackPos) { $this->semValue = new Stmt\Namespace_($this->semStack[$stackPos - (3 - 2)], null, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_SEMICOLON); $this->checkNamespace($this->semValue); }, 118 => function ($stackPos) { $this->semValue = new Stmt\Namespace_($this->semStack[$stackPos - (5 - 2)], $this->semStack[$stackPos - (5 - 4)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); $this->checkNamespace($this->semValue); }, 119 => function ($stackPos) { $this->semValue = new Stmt\Namespace_(null, $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); $this->checkNamespace($this->semValue); }, 120 => function ($stackPos) { $this->semValue = new Stmt\Use_($this->semStack[$stackPos - (3 - 2)], Stmt\Use_::TYPE_NORMAL, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 121 => function ($stackPos) { $this->semValue = new Stmt\Use_($this->semStack[$stackPos - (4 - 3)], $this->semStack[$stackPos - (4 - 2)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 122 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (2 - 1)]; }, 123 => function ($stackPos) { $this->semValue = new Stmt\Const_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 124 => function ($stackPos) { $this->semValue = Stmt\Use_::TYPE_FUNCTION; }, 125 => function ($stackPos) { $this->semValue = Stmt\Use_::TYPE_CONSTANT; }, 126 => function ($stackPos) { $this->semValue = new Stmt\GroupUse($this->semStack[$stackPos - (7 - 3)], $this->semStack[$stackPos - (7 - 6)], $this->semStack[$stackPos - (7 - 2)], $this->startAttributeStack[$stackPos - (7 - 1)] + $this->endAttributes); }, 127 => function ($stackPos) { $this->semValue = new Stmt\GroupUse($this->semStack[$stackPos - (6 - 2)], $this->semStack[$stackPos - (6 - 5)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes); }, 128 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (2 - 1)]; }, 129 => function ($stackPos) { $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; $this->semValue = $this->semStack[$stackPos - (3 - 1)]; }, 130 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); }, 131 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (2 - 1)]; }, 132 => function ($stackPos) { $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; $this->semValue = $this->semStack[$stackPos - (3 - 1)]; }, 133 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); }, 134 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (2 - 1)]; }, 135 => function ($stackPos) { $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; $this->semValue = $this->semStack[$stackPos - (3 - 1)]; }, 136 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); }, 137 => function ($stackPos) { $this->semValue = new Stmt\UseUse($this->semStack[$stackPos - (1 - 1)], null, Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); $this->checkUseUse($this->semValue, $stackPos - (1 - 1)); }, 138 => function ($stackPos) { $this->semValue = new Stmt\UseUse($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); $this->checkUseUse($this->semValue, $stackPos - (3 - 3)); }, 139 => function ($stackPos) { $this->semValue = new Stmt\UseUse($this->semStack[$stackPos - (1 - 1)], null, Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); $this->checkUseUse($this->semValue, $stackPos - (1 - 1)); }, 140 => function ($stackPos) { $this->semValue = new Stmt\UseUse($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); $this->checkUseUse($this->semValue, $stackPos - (3 - 3)); }, 141 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; $this->semValue->type = Stmt\Use_::TYPE_NORMAL; }, 142 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (2 - 2)]; $this->semValue->type = $this->semStack[$stackPos - (2 - 1)]; }, 143 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (2 - 1)]; }, 144 => function ($stackPos) { $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; $this->semValue = $this->semStack[$stackPos - (3 - 1)]; }, 145 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); }, 146 => function ($stackPos) { $this->semValue = new Node\Const_($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 147 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (2 - 1)]; }, 148 => function ($stackPos) { $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; $this->semValue = $this->semStack[$stackPos - (3 - 1)]; }, 149 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); }, 150 => function ($stackPos) { $this->semValue = new Node\Const_($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 151 => function ($stackPos) { if (\is_array($this->semStack[$stackPos - (2 - 2)])) { $this->semValue = \array_merge($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)]); } else { $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; $this->semValue = $this->semStack[$stackPos - (2 - 1)]; } }, 152 => function ($stackPos) { $this->semValue = array(); }, 153 => function ($stackPos) { $startAttributes = $this->lookaheadStartAttributes; if (isset($startAttributes['comments'])) { $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); } else { $nop = null; } if ($nop !== null) { $this->semStack[$stackPos - (1 - 1)][] = $nop; } $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 154 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 155 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 156 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 157 => function ($stackPos) { throw new Error('__HALT_COMPILER() can only be used from the outermost scope', $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 158 => function ($stackPos) { if ($this->semStack[$stackPos - (3 - 2)]) { $this->semValue = $this->semStack[$stackPos - (3 - 2)]; $attrs = $this->startAttributeStack[$stackPos - (3 - 1)]; $stmts = $this->semValue; if (!empty($attrs['comments'])) { $stmts[0]->setAttribute('comments', \array_merge($attrs['comments'], $stmts[0]->getAttribute('comments', []))); } } else { $startAttributes = $this->startAttributeStack[$stackPos - (3 - 1)]; if (isset($startAttributes['comments'])) { $this->semValue = new Stmt\Nop($startAttributes + $this->endAttributes); } else { $this->semValue = null; } if (null === $this->semValue) { $this->semValue = array(); } } }, 159 => function ($stackPos) { $this->semValue = new Stmt\If_($this->semStack[$stackPos - (7 - 3)], ['stmts' => \is_array($this->semStack[$stackPos - (7 - 5)]) ? $this->semStack[$stackPos - (7 - 5)] : array($this->semStack[$stackPos - (7 - 5)]), 'elseifs' => $this->semStack[$stackPos - (7 - 6)], 'else' => $this->semStack[$stackPos - (7 - 7)]], $this->startAttributeStack[$stackPos - (7 - 1)] + $this->endAttributes); }, 160 => function ($stackPos) { $this->semValue = new Stmt\If_($this->semStack[$stackPos - (10 - 3)], ['stmts' => $this->semStack[$stackPos - (10 - 6)], 'elseifs' => $this->semStack[$stackPos - (10 - 7)], 'else' => $this->semStack[$stackPos - (10 - 8)]], $this->startAttributeStack[$stackPos - (10 - 1)] + $this->endAttributes); }, 161 => function ($stackPos) { $this->semValue = new Stmt\While_($this->semStack[$stackPos - (5 - 3)], $this->semStack[$stackPos - (5 - 5)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); }, 162 => function ($stackPos) { $this->semValue = new Stmt\Do_($this->semStack[$stackPos - (7 - 5)], \is_array($this->semStack[$stackPos - (7 - 2)]) ? $this->semStack[$stackPos - (7 - 2)] : array($this->semStack[$stackPos - (7 - 2)]), $this->startAttributeStack[$stackPos - (7 - 1)] + $this->endAttributes); }, 163 => function ($stackPos) { $this->semValue = new Stmt\For_(['init' => $this->semStack[$stackPos - (9 - 3)], 'cond' => $this->semStack[$stackPos - (9 - 5)], 'loop' => $this->semStack[$stackPos - (9 - 7)], 'stmts' => $this->semStack[$stackPos - (9 - 9)]], $this->startAttributeStack[$stackPos - (9 - 1)] + $this->endAttributes); }, 164 => function ($stackPos) { $this->semValue = new Stmt\Switch_($this->semStack[$stackPos - (5 - 3)], $this->semStack[$stackPos - (5 - 5)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); }, 165 => function ($stackPos) { $this->semValue = new Stmt\Break_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 166 => function ($stackPos) { $this->semValue = new Stmt\Continue_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 167 => function ($stackPos) { $this->semValue = new Stmt\Return_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 168 => function ($stackPos) { $this->semValue = new Stmt\Global_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 169 => function ($stackPos) { $this->semValue = new Stmt\Static_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 170 => function ($stackPos) { $this->semValue = new Stmt\Echo_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 171 => function ($stackPos) { $this->semValue = new Stmt\InlineHTML($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 172 => function ($stackPos) { $e = $this->semStack[$stackPos - (2 - 1)]; if ($e instanceof Expr\Throw_) { // For backwards-compatibility reasons, convert throw in statement position into // Stmt\Throw_ rather than Stmt\Expression(Expr\Throw_). $this->semValue = new Stmt\Throw_($e->expr, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); } else { $this->semValue = new Stmt\Expression($e, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); } }, 173 => function ($stackPos) { $this->semValue = new Stmt\Unset_($this->semStack[$stackPos - (5 - 3)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); }, 174 => function ($stackPos) { $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos - (7 - 3)], $this->semStack[$stackPos - (7 - 5)][0], ['keyVar' => null, 'byRef' => $this->semStack[$stackPos - (7 - 5)][1], 'stmts' => $this->semStack[$stackPos - (7 - 7)]], $this->startAttributeStack[$stackPos - (7 - 1)] + $this->endAttributes); }, 175 => function ($stackPos) { $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos - (9 - 3)], $this->semStack[$stackPos - (9 - 7)][0], ['keyVar' => $this->semStack[$stackPos - (9 - 5)], 'byRef' => $this->semStack[$stackPos - (9 - 7)][1], 'stmts' => $this->semStack[$stackPos - (9 - 9)]], $this->startAttributeStack[$stackPos - (9 - 1)] + $this->endAttributes); }, 176 => function ($stackPos) { $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos - (6 - 3)], new Expr\Error($this->startAttributeStack[$stackPos - (6 - 4)] + $this->endAttributeStack[$stackPos - (6 - 4)]), ['stmts' => $this->semStack[$stackPos - (6 - 6)]], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes); }, 177 => function ($stackPos) { $this->semValue = new Stmt\Declare_($this->semStack[$stackPos - (5 - 3)], $this->semStack[$stackPos - (5 - 5)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); }, 178 => function ($stackPos) { $this->semValue = new Stmt\TryCatch($this->semStack[$stackPos - (6 - 3)], $this->semStack[$stackPos - (6 - 5)], $this->semStack[$stackPos - (6 - 6)], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes); $this->checkTryCatch($this->semValue); }, 179 => function ($stackPos) { $this->semValue = new Stmt\Goto_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 180 => function ($stackPos) { $this->semValue = new Stmt\Label($this->semStack[$stackPos - (2 - 1)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 181 => function ($stackPos) { $this->semValue = array(); /* means: no statement */ }, 182 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 183 => function ($stackPos) { $startAttributes = $this->startAttributeStack[$stackPos - (1 - 1)]; if (isset($startAttributes['comments'])) { $this->semValue = new Stmt\Nop($startAttributes + $this->endAttributes); } else { $this->semValue = null; } if ($this->semValue === null) { $this->semValue = array(); } /* means: no statement */ }, 184 => function ($stackPos) { $this->semValue = array(); }, 185 => function ($stackPos) { $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; $this->semValue = $this->semStack[$stackPos - (2 - 1)]; }, 186 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); }, 187 => function ($stackPos) { $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; $this->semValue = $this->semStack[$stackPos - (3 - 1)]; }, 188 => function ($stackPos) { $this->semValue = new Stmt\Catch_($this->semStack[$stackPos - (8 - 3)], $this->semStack[$stackPos - (8 - 4)], $this->semStack[$stackPos - (8 - 7)], $this->startAttributeStack[$stackPos - (8 - 1)] + $this->endAttributes); }, 189 => function ($stackPos) { $this->semValue = null; }, 190 => function ($stackPos) { $this->semValue = new Stmt\Finally_($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 191 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (2 - 1)]; }, 192 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); }, 193 => function ($stackPos) { $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; $this->semValue = $this->semStack[$stackPos - (3 - 1)]; }, 194 => function ($stackPos) { $this->semValue = \false; }, 195 => function ($stackPos) { $this->semValue = \true; }, 196 => function ($stackPos) { $this->semValue = \false; }, 197 => function ($stackPos) { $this->semValue = \true; }, 198 => function ($stackPos) { $this->semValue = \false; }, 199 => function ($stackPos) { $this->semValue = \true; }, 200 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (3 - 2)]; }, 201 => function ($stackPos) { $this->semValue = []; }, 202 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 203 => function ($stackPos) { $this->semValue = new Node\Identifier($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 204 => function ($stackPos) { $this->semValue = new Stmt\Function_($this->semStack[$stackPos - (8 - 3)], ['byRef' => $this->semStack[$stackPos - (8 - 2)], 'params' => $this->semStack[$stackPos - (8 - 5)], 'returnType' => $this->semStack[$stackPos - (8 - 7)], 'stmts' => $this->semStack[$stackPos - (8 - 8)], 'attrGroups' => []], $this->startAttributeStack[$stackPos - (8 - 1)] + $this->endAttributes); }, 205 => function ($stackPos) { $this->semValue = new Stmt\Function_($this->semStack[$stackPos - (9 - 4)], ['byRef' => $this->semStack[$stackPos - (9 - 3)], 'params' => $this->semStack[$stackPos - (9 - 6)], 'returnType' => $this->semStack[$stackPos - (9 - 8)], 'stmts' => $this->semStack[$stackPos - (9 - 9)], 'attrGroups' => $this->semStack[$stackPos - (9 - 1)]], $this->startAttributeStack[$stackPos - (9 - 1)] + $this->endAttributes); }, 206 => function ($stackPos) { $this->semValue = new Stmt\Class_($this->semStack[$stackPos - (7 - 2)], ['type' => $this->semStack[$stackPos - (7 - 1)], 'extends' => $this->semStack[$stackPos - (7 - 3)], 'implements' => $this->semStack[$stackPos - (7 - 4)], 'stmts' => $this->semStack[$stackPos - (7 - 6)], 'attrGroups' => []], $this->startAttributeStack[$stackPos - (7 - 1)] + $this->endAttributes); $this->checkClass($this->semValue, $stackPos - (7 - 2)); }, 207 => function ($stackPos) { $this->semValue = new Stmt\Class_($this->semStack[$stackPos - (8 - 3)], ['type' => $this->semStack[$stackPos - (8 - 2)], 'extends' => $this->semStack[$stackPos - (8 - 4)], 'implements' => $this->semStack[$stackPos - (8 - 5)], 'stmts' => $this->semStack[$stackPos - (8 - 7)], 'attrGroups' => $this->semStack[$stackPos - (8 - 1)]], $this->startAttributeStack[$stackPos - (8 - 1)] + $this->endAttributes); $this->checkClass($this->semValue, $stackPos - (8 - 3)); }, 208 => function ($stackPos) { $this->semValue = new Stmt\Interface_($this->semStack[$stackPos - (7 - 3)], ['extends' => $this->semStack[$stackPos - (7 - 4)], 'stmts' => $this->semStack[$stackPos - (7 - 6)], 'attrGroups' => $this->semStack[$stackPos - (7 - 1)]], $this->startAttributeStack[$stackPos - (7 - 1)] + $this->endAttributes); $this->checkInterface($this->semValue, $stackPos - (7 - 3)); }, 209 => function ($stackPos) { $this->semValue = new Stmt\Trait_($this->semStack[$stackPos - (6 - 3)], ['stmts' => $this->semStack[$stackPos - (6 - 5)], 'attrGroups' => $this->semStack[$stackPos - (6 - 1)]], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes); }, 210 => function ($stackPos) { $this->semValue = new Stmt\Enum_($this->semStack[$stackPos - (8 - 3)], ['scalarType' => $this->semStack[$stackPos - (8 - 4)], 'implements' => $this->semStack[$stackPos - (8 - 5)], 'stmts' => $this->semStack[$stackPos - (8 - 7)], 'attrGroups' => $this->semStack[$stackPos - (8 - 1)]], $this->startAttributeStack[$stackPos - (8 - 1)] + $this->endAttributes); $this->checkEnum($this->semValue, $stackPos - (8 - 3)); }, 211 => function ($stackPos) { $this->semValue = null; }, 212 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (2 - 2)]; }, 213 => function ($stackPos) { $this->semValue = null; }, 214 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (2 - 2)]; }, 215 => function ($stackPos) { $this->semValue = 0; }, 216 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (2 - 1)]; }, 217 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 218 => function ($stackPos) { $this->checkClassModifier($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)], $stackPos - (2 - 2)); $this->semValue = $this->semStack[$stackPos - (2 - 1)] | $this->semStack[$stackPos - (2 - 2)]; }, 219 => function ($stackPos) { $this->semValue = Stmt\Class_::MODIFIER_ABSTRACT; }, 220 => function ($stackPos) { $this->semValue = Stmt\Class_::MODIFIER_FINAL; }, 221 => function ($stackPos) { $this->semValue = Stmt\Class_::MODIFIER_READONLY; }, 222 => function ($stackPos) { $this->semValue = null; }, 223 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (2 - 2)]; }, 224 => function ($stackPos) { $this->semValue = array(); }, 225 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (2 - 2)]; }, 226 => function ($stackPos) { $this->semValue = array(); }, 227 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (2 - 2)]; }, 228 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (2 - 1)]; }, 229 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); }, 230 => function ($stackPos) { $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; $this->semValue = $this->semStack[$stackPos - (3 - 1)]; }, 231 => function ($stackPos) { $this->semValue = \is_array($this->semStack[$stackPos - (1 - 1)]) ? $this->semStack[$stackPos - (1 - 1)] : array($this->semStack[$stackPos - (1 - 1)]); }, 232 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (4 - 2)]; }, 233 => function ($stackPos) { $this->semValue = \is_array($this->semStack[$stackPos - (1 - 1)]) ? $this->semStack[$stackPos - (1 - 1)] : array($this->semStack[$stackPos - (1 - 1)]); }, 234 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (4 - 2)]; }, 235 => function ($stackPos) { $this->semValue = \is_array($this->semStack[$stackPos - (1 - 1)]) ? $this->semStack[$stackPos - (1 - 1)] : array($this->semStack[$stackPos - (1 - 1)]); }, 236 => function ($stackPos) { $this->semValue = null; }, 237 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (4 - 2)]; }, 238 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (2 - 1)]; }, 239 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); }, 240 => function ($stackPos) { $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; $this->semValue = $this->semStack[$stackPos - (3 - 1)]; }, 241 => function ($stackPos) { $this->semValue = new Stmt\DeclareDeclare($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 242 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (3 - 2)]; }, 243 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (4 - 3)]; }, 244 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (4 - 2)]; }, 245 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (5 - 3)]; }, 246 => function ($stackPos) { $this->semValue = array(); }, 247 => function ($stackPos) { $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; $this->semValue = $this->semStack[$stackPos - (2 - 1)]; }, 248 => function ($stackPos) { $this->semValue = new Stmt\Case_($this->semStack[$stackPos - (4 - 2)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 249 => function ($stackPos) { $this->semValue = new Stmt\Case_(null, $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 250 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 251 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 252 => function ($stackPos) { $this->semValue = new Expr\Match_($this->semStack[$stackPos - (7 - 3)], $this->semStack[$stackPos - (7 - 6)], $this->startAttributeStack[$stackPos - (7 - 1)] + $this->endAttributes); }, 253 => function ($stackPos) { $this->semValue = []; }, 254 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (2 - 1)]; }, 255 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); }, 256 => function ($stackPos) { $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; $this->semValue = $this->semStack[$stackPos - (3 - 1)]; }, 257 => function ($stackPos) { $this->semValue = new Node\MatchArm($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 258 => function ($stackPos) { $this->semValue = new Node\MatchArm(null, $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 259 => function ($stackPos) { $this->semValue = \is_array($this->semStack[$stackPos - (1 - 1)]) ? $this->semStack[$stackPos - (1 - 1)] : array($this->semStack[$stackPos - (1 - 1)]); }, 260 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (4 - 2)]; }, 261 => function ($stackPos) { $this->semValue = array(); }, 262 => function ($stackPos) { $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; $this->semValue = $this->semStack[$stackPos - (2 - 1)]; }, 263 => function ($stackPos) { $this->semValue = new Stmt\ElseIf_($this->semStack[$stackPos - (5 - 3)], \is_array($this->semStack[$stackPos - (5 - 5)]) ? $this->semStack[$stackPos - (5 - 5)] : array($this->semStack[$stackPos - (5 - 5)]), $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); }, 264 => function ($stackPos) { $this->semValue = array(); }, 265 => function ($stackPos) { $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; $this->semValue = $this->semStack[$stackPos - (2 - 1)]; }, 266 => function ($stackPos) { $this->semValue = new Stmt\ElseIf_($this->semStack[$stackPos - (6 - 3)], $this->semStack[$stackPos - (6 - 6)], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes); }, 267 => function ($stackPos) { $this->semValue = null; }, 268 => function ($stackPos) { $this->semValue = new Stmt\Else_(\is_array($this->semStack[$stackPos - (2 - 2)]) ? $this->semStack[$stackPos - (2 - 2)] : array($this->semStack[$stackPos - (2 - 2)]), $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 269 => function ($stackPos) { $this->semValue = null; }, 270 => function ($stackPos) { $this->semValue = new Stmt\Else_($this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 271 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos - (1 - 1)], \false); }, 272 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos - (2 - 2)], \true); }, 273 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos - (1 - 1)], \false); }, 274 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos - (1 - 1)], \false); }, 275 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (2 - 1)]; }, 276 => function ($stackPos) { $this->semValue = array(); }, 277 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); }, 278 => function ($stackPos) { $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; $this->semValue = $this->semStack[$stackPos - (3 - 1)]; }, 279 => function ($stackPos) { $this->semValue = 0; }, 280 => function ($stackPos) { $this->checkModifier($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)], $stackPos - (2 - 2)); $this->semValue = $this->semStack[$stackPos - (2 - 1)] | $this->semStack[$stackPos - (2 - 2)]; }, 281 => function ($stackPos) { $this->semValue = Stmt\Class_::MODIFIER_PUBLIC; }, 282 => function ($stackPos) { $this->semValue = Stmt\Class_::MODIFIER_PROTECTED; }, 283 => function ($stackPos) { $this->semValue = Stmt\Class_::MODIFIER_PRIVATE; }, 284 => function ($stackPos) { $this->semValue = Stmt\Class_::MODIFIER_READONLY; }, 285 => function ($stackPos) { $this->semValue = new Node\Param($this->semStack[$stackPos - (6 - 6)], null, $this->semStack[$stackPos - (6 - 3)], $this->semStack[$stackPos - (6 - 4)], $this->semStack[$stackPos - (6 - 5)], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes, $this->semStack[$stackPos - (6 - 2)], $this->semStack[$stackPos - (6 - 1)]); $this->checkParam($this->semValue); }, 286 => function ($stackPos) { $this->semValue = new Node\Param($this->semStack[$stackPos - (8 - 6)], $this->semStack[$stackPos - (8 - 8)], $this->semStack[$stackPos - (8 - 3)], $this->semStack[$stackPos - (8 - 4)], $this->semStack[$stackPos - (8 - 5)], $this->startAttributeStack[$stackPos - (8 - 1)] + $this->endAttributes, $this->semStack[$stackPos - (8 - 2)], $this->semStack[$stackPos - (8 - 1)]); $this->checkParam($this->semValue); }, 287 => function ($stackPos) { $this->semValue = new Node\Param(new Expr\Error($this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes), null, $this->semStack[$stackPos - (6 - 3)], $this->semStack[$stackPos - (6 - 4)], $this->semStack[$stackPos - (6 - 5)], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes, $this->semStack[$stackPos - (6 - 2)], $this->semStack[$stackPos - (6 - 1)]); }, 288 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 289 => function ($stackPos) { $this->semValue = new Node\NullableType($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 290 => function ($stackPos) { $this->semValue = new Node\UnionType($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 291 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 292 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 293 => function ($stackPos) { $this->semValue = new Node\Name('static', $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 294 => function ($stackPos) { $this->semValue = $this->handleBuiltinTypes($this->semStack[$stackPos - (1 - 1)]); }, 295 => function ($stackPos) { $this->semValue = new Node\Identifier('array', $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 296 => function ($stackPos) { $this->semValue = new Node\Identifier('callable', $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 297 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 298 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (3 - 2)]; }, 299 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)]); }, 300 => function ($stackPos) { $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; $this->semValue = $this->semStack[$stackPos - (3 - 1)]; }, 301 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 302 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (3 - 2)]; }, 303 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)]); }, 304 => function ($stackPos) { $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; $this->semValue = $this->semStack[$stackPos - (3 - 1)]; }, 305 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)]); }, 306 => function ($stackPos) { $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; $this->semValue = $this->semStack[$stackPos - (3 - 1)]; }, 307 => function ($stackPos) { $this->semValue = new Node\IntersectionType($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 308 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)]); }, 309 => function ($stackPos) { $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; $this->semValue = $this->semStack[$stackPos - (3 - 1)]; }, 310 => function ($stackPos) { $this->semValue = new Node\IntersectionType($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 311 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 312 => function ($stackPos) { $this->semValue = new Node\NullableType($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 313 => function ($stackPos) { $this->semValue = new Node\UnionType($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 314 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 315 => function ($stackPos) { $this->semValue = null; }, 316 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 317 => function ($stackPos) { $this->semValue = null; }, 318 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (2 - 2)]; }, 319 => function ($stackPos) { $this->semValue = null; }, 320 => function ($stackPos) { $this->semValue = array(); }, 321 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (4 - 2)]; }, 322 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos - (3 - 2)]); }, 323 => function ($stackPos) { $this->semValue = new Node\VariadicPlaceholder($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 324 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); }, 325 => function ($stackPos) { $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; $this->semValue = $this->semStack[$stackPos - (3 - 1)]; }, 326 => function ($stackPos) { $this->semValue = new Node\Arg($this->semStack[$stackPos - (1 - 1)], \false, \false, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 327 => function ($stackPos) { $this->semValue = new Node\Arg($this->semStack[$stackPos - (2 - 2)], \true, \false, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 328 => function ($stackPos) { $this->semValue = new Node\Arg($this->semStack[$stackPos - (2 - 2)], \false, \true, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 329 => function ($stackPos) { $this->semValue = new Node\Arg($this->semStack[$stackPos - (3 - 3)], \false, \false, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes, $this->semStack[$stackPos - (3 - 1)]); }, 330 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (2 - 1)]; }, 331 => function ($stackPos) { $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; $this->semValue = $this->semStack[$stackPos - (3 - 1)]; }, 332 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); }, 333 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 334 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (2 - 1)]; }, 335 => function ($stackPos) { $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; $this->semValue = $this->semStack[$stackPos - (3 - 1)]; }, 336 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); }, 337 => function ($stackPos) { $this->semValue = new Stmt\StaticVar($this->semStack[$stackPos - (1 - 1)], null, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 338 => function ($stackPos) { $this->semValue = new Stmt\StaticVar($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 339 => function ($stackPos) { if ($this->semStack[$stackPos - (2 - 2)] !== null) { $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; $this->semValue = $this->semStack[$stackPos - (2 - 1)]; } }, 340 => function ($stackPos) { $this->semValue = array(); }, 341 => function ($stackPos) { $startAttributes = $this->lookaheadStartAttributes; if (isset($startAttributes['comments'])) { $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); } else { $nop = null; } if ($nop !== null) { $this->semStack[$stackPos - (1 - 1)][] = $nop; } $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 342 => function ($stackPos) { $this->semValue = new Stmt\Property($this->semStack[$stackPos - (5 - 2)], $this->semStack[$stackPos - (5 - 4)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes, $this->semStack[$stackPos - (5 - 3)], $this->semStack[$stackPos - (5 - 1)]); $this->checkProperty($this->semValue, $stackPos - (5 - 2)); }, 343 => function ($stackPos) { $this->semValue = new Stmt\ClassConst($this->semStack[$stackPos - (5 - 4)], $this->semStack[$stackPos - (5 - 2)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes, $this->semStack[$stackPos - (5 - 1)]); $this->checkClassConst($this->semValue, $stackPos - (5 - 2)); }, 344 => function ($stackPos) { $this->semValue = new Stmt\ClassMethod($this->semStack[$stackPos - (10 - 5)], ['type' => $this->semStack[$stackPos - (10 - 2)], 'byRef' => $this->semStack[$stackPos - (10 - 4)], 'params' => $this->semStack[$stackPos - (10 - 7)], 'returnType' => $this->semStack[$stackPos - (10 - 9)], 'stmts' => $this->semStack[$stackPos - (10 - 10)], 'attrGroups' => $this->semStack[$stackPos - (10 - 1)]], $this->startAttributeStack[$stackPos - (10 - 1)] + $this->endAttributes); $this->checkClassMethod($this->semValue, $stackPos - (10 - 2)); }, 345 => function ($stackPos) { $this->semValue = new Stmt\TraitUse($this->semStack[$stackPos - (3 - 2)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 346 => function ($stackPos) { $this->semValue = new Stmt\EnumCase($this->semStack[$stackPos - (5 - 3)], $this->semStack[$stackPos - (5 - 4)], $this->semStack[$stackPos - (5 - 1)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); }, 347 => function ($stackPos) { $this->semValue = null; /* will be skipped */ }, 348 => function ($stackPos) { $this->semValue = array(); }, 349 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (3 - 2)]; }, 350 => function ($stackPos) { $this->semValue = array(); }, 351 => function ($stackPos) { $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; $this->semValue = $this->semStack[$stackPos - (2 - 1)]; }, 352 => function ($stackPos) { $this->semValue = new Stmt\TraitUseAdaptation\Precedence($this->semStack[$stackPos - (4 - 1)][0], $this->semStack[$stackPos - (4 - 1)][1], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 353 => function ($stackPos) { $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos - (5 - 1)][0], $this->semStack[$stackPos - (5 - 1)][1], $this->semStack[$stackPos - (5 - 3)], $this->semStack[$stackPos - (5 - 4)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); }, 354 => function ($stackPos) { $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos - (4 - 1)][0], $this->semStack[$stackPos - (4 - 1)][1], $this->semStack[$stackPos - (4 - 3)], null, $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 355 => function ($stackPos) { $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos - (4 - 1)][0], $this->semStack[$stackPos - (4 - 1)][1], null, $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 356 => function ($stackPos) { $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos - (4 - 1)][0], $this->semStack[$stackPos - (4 - 1)][1], null, $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 357 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)]); }, 358 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 359 => function ($stackPos) { $this->semValue = array(null, $this->semStack[$stackPos - (1 - 1)]); }, 360 => function ($stackPos) { $this->semValue = null; }, 361 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 362 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 363 => function ($stackPos) { $this->semValue = 0; }, 364 => function ($stackPos) { $this->semValue = 0; }, 365 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 366 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 367 => function ($stackPos) { $this->checkModifier($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)], $stackPos - (2 - 2)); $this->semValue = $this->semStack[$stackPos - (2 - 1)] | $this->semStack[$stackPos - (2 - 2)]; }, 368 => function ($stackPos) { $this->semValue = Stmt\Class_::MODIFIER_PUBLIC; }, 369 => function ($stackPos) { $this->semValue = Stmt\Class_::MODIFIER_PROTECTED; }, 370 => function ($stackPos) { $this->semValue = Stmt\Class_::MODIFIER_PRIVATE; }, 371 => function ($stackPos) { $this->semValue = Stmt\Class_::MODIFIER_STATIC; }, 372 => function ($stackPos) { $this->semValue = Stmt\Class_::MODIFIER_ABSTRACT; }, 373 => function ($stackPos) { $this->semValue = Stmt\Class_::MODIFIER_FINAL; }, 374 => function ($stackPos) { $this->semValue = Stmt\Class_::MODIFIER_READONLY; }, 375 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (2 - 1)]; }, 376 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); }, 377 => function ($stackPos) { $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; $this->semValue = $this->semStack[$stackPos - (3 - 1)]; }, 378 => function ($stackPos) { $this->semValue = new Node\VarLikeIdentifier(\substr($this->semStack[$stackPos - (1 - 1)], 1), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 379 => function ($stackPos) { $this->semValue = new Stmt\PropertyProperty($this->semStack[$stackPos - (1 - 1)], null, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 380 => function ($stackPos) { $this->semValue = new Stmt\PropertyProperty($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 381 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (2 - 1)]; }, 382 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (2 - 1)]; }, 383 => function ($stackPos) { $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; $this->semValue = $this->semStack[$stackPos - (3 - 1)]; }, 384 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); }, 385 => function ($stackPos) { $this->semValue = array(); }, 386 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 387 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 388 => function ($stackPos) { $this->semValue = new Expr\Assign($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 389 => function ($stackPos) { $this->semValue = new Expr\Assign($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 390 => function ($stackPos) { $this->semValue = new Expr\Assign($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 391 => function ($stackPos) { $this->semValue = new Expr\AssignRef($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 392 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 393 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 394 => function ($stackPos) { $this->semValue = new Expr\Clone_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 395 => function ($stackPos) { $this->semValue = new Expr\AssignOp\Plus($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 396 => function ($stackPos) { $this->semValue = new Expr\AssignOp\Minus($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 397 => function ($stackPos) { $this->semValue = new Expr\AssignOp\Mul($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 398 => function ($stackPos) { $this->semValue = new Expr\AssignOp\Div($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 399 => function ($stackPos) { $this->semValue = new Expr\AssignOp\Concat($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 400 => function ($stackPos) { $this->semValue = new Expr\AssignOp\Mod($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 401 => function ($stackPos) { $this->semValue = new Expr\AssignOp\BitwiseAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 402 => function ($stackPos) { $this->semValue = new Expr\AssignOp\BitwiseOr($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 403 => function ($stackPos) { $this->semValue = new Expr\AssignOp\BitwiseXor($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 404 => function ($stackPos) { $this->semValue = new Expr\AssignOp\ShiftLeft($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 405 => function ($stackPos) { $this->semValue = new Expr\AssignOp\ShiftRight($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 406 => function ($stackPos) { $this->semValue = new Expr\AssignOp\Pow($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 407 => function ($stackPos) { $this->semValue = new Expr\AssignOp\Coalesce($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 408 => function ($stackPos) { $this->semValue = new Expr\PostInc($this->semStack[$stackPos - (2 - 1)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 409 => function ($stackPos) { $this->semValue = new Expr\PreInc($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 410 => function ($stackPos) { $this->semValue = new Expr\PostDec($this->semStack[$stackPos - (2 - 1)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 411 => function ($stackPos) { $this->semValue = new Expr\PreDec($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 412 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\BooleanOr($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 413 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\BooleanAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 414 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\LogicalOr($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 415 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\LogicalAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 416 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\LogicalXor($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 417 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\BitwiseOr($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 418 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 419 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 420 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\BitwiseXor($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 421 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Concat($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 422 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Plus($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 423 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Minus($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 424 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Mul($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 425 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Div($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 426 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Mod($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 427 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\ShiftLeft($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 428 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\ShiftRight($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 429 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Pow($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 430 => function ($stackPos) { $this->semValue = new Expr\UnaryPlus($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 431 => function ($stackPos) { $this->semValue = new Expr\UnaryMinus($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 432 => function ($stackPos) { $this->semValue = new Expr\BooleanNot($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 433 => function ($stackPos) { $this->semValue = new Expr\BitwiseNot($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 434 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Identical($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 435 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\NotIdentical($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 436 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Equal($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 437 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\NotEqual($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 438 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Spaceship($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 439 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Smaller($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 440 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\SmallerOrEqual($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 441 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Greater($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 442 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\GreaterOrEqual($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 443 => function ($stackPos) { $this->semValue = new Expr\Instanceof_($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 444 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (3 - 2)]; }, 445 => function ($stackPos) { $this->semValue = new Expr\Ternary($this->semStack[$stackPos - (5 - 1)], $this->semStack[$stackPos - (5 - 3)], $this->semStack[$stackPos - (5 - 5)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); }, 446 => function ($stackPos) { $this->semValue = new Expr\Ternary($this->semStack[$stackPos - (4 - 1)], null, $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 447 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Coalesce($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 448 => function ($stackPos) { $this->semValue = new Expr\Isset_($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 449 => function ($stackPos) { $this->semValue = new Expr\Empty_($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 450 => function ($stackPos) { $this->semValue = new Expr\Include_($this->semStack[$stackPos - (2 - 2)], Expr\Include_::TYPE_INCLUDE, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 451 => function ($stackPos) { $this->semValue = new Expr\Include_($this->semStack[$stackPos - (2 - 2)], Expr\Include_::TYPE_INCLUDE_ONCE, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 452 => function ($stackPos) { $this->semValue = new Expr\Eval_($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 453 => function ($stackPos) { $this->semValue = new Expr\Include_($this->semStack[$stackPos - (2 - 2)], Expr\Include_::TYPE_REQUIRE, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 454 => function ($stackPos) { $this->semValue = new Expr\Include_($this->semStack[$stackPos - (2 - 2)], Expr\Include_::TYPE_REQUIRE_ONCE, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 455 => function ($stackPos) { $this->semValue = new Expr\Cast\Int_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 456 => function ($stackPos) { $attrs = $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes; $attrs['kind'] = $this->getFloatCastKind($this->semStack[$stackPos - (2 - 1)]); $this->semValue = new Expr\Cast\Double($this->semStack[$stackPos - (2 - 2)], $attrs); }, 457 => function ($stackPos) { $this->semValue = new Expr\Cast\String_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 458 => function ($stackPos) { $this->semValue = new Expr\Cast\Array_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 459 => function ($stackPos) { $this->semValue = new Expr\Cast\Object_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 460 => function ($stackPos) { $this->semValue = new Expr\Cast\Bool_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 461 => function ($stackPos) { $this->semValue = new Expr\Cast\Unset_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 462 => function ($stackPos) { $attrs = $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes; $attrs['kind'] = \strtolower($this->semStack[$stackPos - (2 - 1)]) === 'exit' ? Expr\Exit_::KIND_EXIT : Expr\Exit_::KIND_DIE; $this->semValue = new Expr\Exit_($this->semStack[$stackPos - (2 - 2)], $attrs); }, 463 => function ($stackPos) { $this->semValue = new Expr\ErrorSuppress($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 464 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 465 => function ($stackPos) { $this->semValue = new Expr\ShellExec($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 466 => function ($stackPos) { $this->semValue = new Expr\Print_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 467 => function ($stackPos) { $this->semValue = new Expr\Yield_(null, null, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 468 => function ($stackPos) { $this->semValue = new Expr\Yield_($this->semStack[$stackPos - (2 - 2)], null, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 469 => function ($stackPos) { $this->semValue = new Expr\Yield_($this->semStack[$stackPos - (4 - 4)], $this->semStack[$stackPos - (4 - 2)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 470 => function ($stackPos) { $this->semValue = new Expr\YieldFrom($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 471 => function ($stackPos) { $this->semValue = new Expr\Throw_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 472 => function ($stackPos) { $this->semValue = new Expr\ArrowFunction(['static' => \false, 'byRef' => $this->semStack[$stackPos - (8 - 2)], 'params' => $this->semStack[$stackPos - (8 - 4)], 'returnType' => $this->semStack[$stackPos - (8 - 6)], 'expr' => $this->semStack[$stackPos - (8 - 8)], 'attrGroups' => []], $this->startAttributeStack[$stackPos - (8 - 1)] + $this->endAttributes); }, 473 => function ($stackPos) { $this->semValue = new Expr\ArrowFunction(['static' => \true, 'byRef' => $this->semStack[$stackPos - (9 - 3)], 'params' => $this->semStack[$stackPos - (9 - 5)], 'returnType' => $this->semStack[$stackPos - (9 - 7)], 'expr' => $this->semStack[$stackPos - (9 - 9)], 'attrGroups' => []], $this->startAttributeStack[$stackPos - (9 - 1)] + $this->endAttributes); }, 474 => function ($stackPos) { $this->semValue = new Expr\Closure(['static' => \false, 'byRef' => $this->semStack[$stackPos - (8 - 2)], 'params' => $this->semStack[$stackPos - (8 - 4)], 'uses' => $this->semStack[$stackPos - (8 - 6)], 'returnType' => $this->semStack[$stackPos - (8 - 7)], 'stmts' => $this->semStack[$stackPos - (8 - 8)], 'attrGroups' => []], $this->startAttributeStack[$stackPos - (8 - 1)] + $this->endAttributes); }, 475 => function ($stackPos) { $this->semValue = new Expr\Closure(['static' => \true, 'byRef' => $this->semStack[$stackPos - (9 - 3)], 'params' => $this->semStack[$stackPos - (9 - 5)], 'uses' => $this->semStack[$stackPos - (9 - 7)], 'returnType' => $this->semStack[$stackPos - (9 - 8)], 'stmts' => $this->semStack[$stackPos - (9 - 9)], 'attrGroups' => []], $this->startAttributeStack[$stackPos - (9 - 1)] + $this->endAttributes); }, 476 => function ($stackPos) { $this->semValue = new Expr\ArrowFunction(['static' => \false, 'byRef' => $this->semStack[$stackPos - (9 - 3)], 'params' => $this->semStack[$stackPos - (9 - 5)], 'returnType' => $this->semStack[$stackPos - (9 - 7)], 'expr' => $this->semStack[$stackPos - (9 - 9)], 'attrGroups' => $this->semStack[$stackPos - (9 - 1)]], $this->startAttributeStack[$stackPos - (9 - 1)] + $this->endAttributes); }, 477 => function ($stackPos) { $this->semValue = new Expr\ArrowFunction(['static' => \true, 'byRef' => $this->semStack[$stackPos - (10 - 4)], 'params' => $this->semStack[$stackPos - (10 - 6)], 'returnType' => $this->semStack[$stackPos - (10 - 8)], 'expr' => $this->semStack[$stackPos - (10 - 10)], 'attrGroups' => $this->semStack[$stackPos - (10 - 1)]], $this->startAttributeStack[$stackPos - (10 - 1)] + $this->endAttributes); }, 478 => function ($stackPos) { $this->semValue = new Expr\Closure(['static' => \false, 'byRef' => $this->semStack[$stackPos - (9 - 3)], 'params' => $this->semStack[$stackPos - (9 - 5)], 'uses' => $this->semStack[$stackPos - (9 - 7)], 'returnType' => $this->semStack[$stackPos - (9 - 8)], 'stmts' => $this->semStack[$stackPos - (9 - 9)], 'attrGroups' => $this->semStack[$stackPos - (9 - 1)]], $this->startAttributeStack[$stackPos - (9 - 1)] + $this->endAttributes); }, 479 => function ($stackPos) { $this->semValue = new Expr\Closure(['static' => \true, 'byRef' => $this->semStack[$stackPos - (10 - 4)], 'params' => $this->semStack[$stackPos - (10 - 6)], 'uses' => $this->semStack[$stackPos - (10 - 8)], 'returnType' => $this->semStack[$stackPos - (10 - 9)], 'stmts' => $this->semStack[$stackPos - (10 - 10)], 'attrGroups' => $this->semStack[$stackPos - (10 - 1)]], $this->startAttributeStack[$stackPos - (10 - 1)] + $this->endAttributes); }, 480 => function ($stackPos) { $this->semValue = array(new Stmt\Class_(null, ['type' => 0, 'extends' => $this->semStack[$stackPos - (8 - 4)], 'implements' => $this->semStack[$stackPos - (8 - 5)], 'stmts' => $this->semStack[$stackPos - (8 - 7)], 'attrGroups' => $this->semStack[$stackPos - (8 - 1)]], $this->startAttributeStack[$stackPos - (8 - 1)] + $this->endAttributes), $this->semStack[$stackPos - (8 - 3)]); $this->checkClass($this->semValue[0], -1); }, 481 => function ($stackPos) { $this->semValue = new Expr\New_($this->semStack[$stackPos - (3 - 2)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 482 => function ($stackPos) { list($class, $ctorArgs) = $this->semStack[$stackPos - (2 - 2)]; $this->semValue = new Expr\New_($class, $ctorArgs, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 483 => function ($stackPos) { $this->semValue = array(); }, 484 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (4 - 3)]; }, 485 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (2 - 1)]; }, 486 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); }, 487 => function ($stackPos) { $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; $this->semValue = $this->semStack[$stackPos - (3 - 1)]; }, 488 => function ($stackPos) { $this->semValue = new Expr\ClosureUse($this->semStack[$stackPos - (2 - 2)], $this->semStack[$stackPos - (2 - 1)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 489 => function ($stackPos) { $this->semValue = new Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 490 => function ($stackPos) { $this->semValue = new Expr\FuncCall($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 491 => function ($stackPos) { $this->semValue = new Expr\FuncCall($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 492 => function ($stackPos) { $this->semValue = new Expr\FuncCall($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 493 => function ($stackPos) { $this->semValue = new Expr\StaticCall($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 494 => function ($stackPos) { $this->semValue = new Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 495 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 496 => function ($stackPos) { $this->semValue = new Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 497 => function ($stackPos) { $this->semValue = new Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 498 => function ($stackPos) { $this->semValue = new Name\FullyQualified(\substr($this->semStack[$stackPos - (1 - 1)], 1), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 499 => function ($stackPos) { $this->semValue = new Name\Relative(\substr($this->semStack[$stackPos - (1 - 1)], 10), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 500 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 501 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 502 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (3 - 2)]; }, 503 => function ($stackPos) { $this->semValue = new Expr\Error($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); $this->errorState = 2; }, 504 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 505 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 506 => function ($stackPos) { $this->semValue = null; }, 507 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (3 - 2)]; }, 508 => function ($stackPos) { $this->semValue = array(); }, 509 => function ($stackPos) { $this->semValue = array(new Scalar\EncapsedStringPart(Scalar\String_::parseEscapeSequences($this->semStack[$stackPos - (1 - 1)], '`'), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes)); }, 510 => function ($stackPos) { foreach ($this->semStack[$stackPos - (1 - 1)] as $s) { if ($s instanceof Node\Scalar\EncapsedStringPart) { $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '`', \true); } } $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 511 => function ($stackPos) { $this->semValue = array(); }, 512 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 513 => function ($stackPos) { $this->semValue = new Expr\ConstFetch($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 514 => function ($stackPos) { $this->semValue = new Scalar\MagicConst\Line($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 515 => function ($stackPos) { $this->semValue = new Scalar\MagicConst\File($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 516 => function ($stackPos) { $this->semValue = new Scalar\MagicConst\Dir($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 517 => function ($stackPos) { $this->semValue = new Scalar\MagicConst\Class_($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 518 => function ($stackPos) { $this->semValue = new Scalar\MagicConst\Trait_($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 519 => function ($stackPos) { $this->semValue = new Scalar\MagicConst\Method($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 520 => function ($stackPos) { $this->semValue = new Scalar\MagicConst\Function_($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 521 => function ($stackPos) { $this->semValue = new Scalar\MagicConst\Namespace_($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 522 => function ($stackPos) { $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 523 => function ($stackPos) { $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos - (3 - 1)], new Expr\Error($this->startAttributeStack[$stackPos - (3 - 3)] + $this->endAttributeStack[$stackPos - (3 - 3)]), $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); $this->errorState = 2; }, 524 => function ($stackPos) { $attrs = $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes; $attrs['kind'] = Expr\Array_::KIND_SHORT; $this->semValue = new Expr\Array_($this->semStack[$stackPos - (3 - 2)], $attrs); }, 525 => function ($stackPos) { $attrs = $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes; $attrs['kind'] = Expr\Array_::KIND_LONG; $this->semValue = new Expr\Array_($this->semStack[$stackPos - (4 - 3)], $attrs); }, 526 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 527 => function ($stackPos) { $this->semValue = Scalar\String_::fromString($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 528 => function ($stackPos) { $attrs = $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes; $attrs['kind'] = Scalar\String_::KIND_DOUBLE_QUOTED; foreach ($this->semStack[$stackPos - (3 - 2)] as $s) { if ($s instanceof Node\Scalar\EncapsedStringPart) { $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '"', \true); } } $this->semValue = new Scalar\Encapsed($this->semStack[$stackPos - (3 - 2)], $attrs); }, 529 => function ($stackPos) { $this->semValue = $this->parseLNumber($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 530 => function ($stackPos) { $this->semValue = Scalar\DNumber::fromString($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 531 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 532 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 533 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 534 => function ($stackPos) { $this->semValue = $this->parseDocString($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 2)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes, $this->startAttributeStack[$stackPos - (3 - 3)] + $this->endAttributeStack[$stackPos - (3 - 3)], \true); }, 535 => function ($stackPos) { $this->semValue = $this->parseDocString($this->semStack[$stackPos - (2 - 1)], '', $this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes, $this->startAttributeStack[$stackPos - (2 - 2)] + $this->endAttributeStack[$stackPos - (2 - 2)], \true); }, 536 => function ($stackPos) { $this->semValue = $this->parseDocString($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 2)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes, $this->startAttributeStack[$stackPos - (3 - 3)] + $this->endAttributeStack[$stackPos - (3 - 3)], \true); }, 537 => function ($stackPos) { $this->semValue = null; }, 538 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 539 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 540 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (3 - 2)]; }, 541 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 542 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 543 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 544 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 545 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 546 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (3 - 2)]; }, 547 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 548 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 549 => function ($stackPos) { $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 550 => function ($stackPos) { $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 551 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 552 => function ($stackPos) { $this->semValue = new Expr\MethodCall($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 553 => function ($stackPos) { $this->semValue = new Expr\NullsafeMethodCall($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 554 => function ($stackPos) { $this->semValue = null; }, 555 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 556 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 557 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 558 => function ($stackPos) { $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 559 => function ($stackPos) { $this->semValue = new Expr\NullsafePropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 560 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 561 => function ($stackPos) { $this->semValue = new Expr\Variable($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 562 => function ($stackPos) { $this->semValue = new Expr\Variable($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 563 => function ($stackPos) { $this->semValue = new Expr\Variable(new Expr\Error($this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes), $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); $this->errorState = 2; }, 564 => function ($stackPos) { $var = $this->semStack[$stackPos - (1 - 1)]->name; $this->semValue = \is_string($var) ? new Node\VarLikeIdentifier($var, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes) : $var; }, 565 => function ($stackPos) { $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 566 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 567 => function ($stackPos) { $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 568 => function ($stackPos) { $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 569 => function ($stackPos) { $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 570 => function ($stackPos) { $this->semValue = new Expr\NullsafePropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 571 => function ($stackPos) { $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 572 => function ($stackPos) { $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 573 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 574 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (3 - 2)]; }, 575 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 576 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 577 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (3 - 2)]; }, 578 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 579 => function ($stackPos) { $this->semValue = new Expr\Error($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); $this->errorState = 2; }, 580 => function ($stackPos) { $this->semValue = new Expr\List_($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 581 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; $end = \count($this->semValue) - 1; if ($this->semValue[$end] === null) { \array_pop($this->semValue); } }, 582 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 583 => function ($stackPos) { /* do nothing -- prevent default action of $$=$this->semStack[$1]. See $551. */ }, 584 => function ($stackPos) { $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; $this->semValue = $this->semStack[$stackPos - (3 - 1)]; }, 585 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); }, 586 => function ($stackPos) { $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (1 - 1)], null, \false, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 587 => function ($stackPos) { $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (2 - 2)], null, \true, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 588 => function ($stackPos) { $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (1 - 1)], null, \false, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 589 => function ($stackPos) { $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (3 - 3)], $this->semStack[$stackPos - (3 - 1)], \false, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 590 => function ($stackPos) { $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (4 - 4)], $this->semStack[$stackPos - (4 - 1)], \true, $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 591 => function ($stackPos) { $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (3 - 3)], $this->semStack[$stackPos - (3 - 1)], \false, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 592 => function ($stackPos) { $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (2 - 2)], null, \false, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes, \true, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 593 => function ($stackPos) { $this->semValue = null; }, 594 => function ($stackPos) { $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; $this->semValue = $this->semStack[$stackPos - (2 - 1)]; }, 595 => function ($stackPos) { $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; $this->semValue = $this->semStack[$stackPos - (2 - 1)]; }, 596 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); }, 597 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)]); }, 598 => function ($stackPos) { $this->semValue = new Scalar\EncapsedStringPart($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 599 => function ($stackPos) { $this->semValue = new Expr\Variable($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 600 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 601 => function ($stackPos) { $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 602 => function ($stackPos) { $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 603 => function ($stackPos) { $this->semValue = new Expr\NullsafePropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 604 => function ($stackPos) { $this->semValue = new Expr\Variable($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 605 => function ($stackPos) { $this->semValue = new Expr\Variable($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 606 => function ($stackPos) { $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (6 - 2)], $this->semStack[$stackPos - (6 - 4)], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes); }, 607 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (3 - 2)]; }, 608 => function ($stackPos) { $this->semValue = new Scalar\String_($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 609 => function ($stackPos) { $this->semValue = $this->parseNumString($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 610 => function ($stackPos) { $this->semValue = $this->parseNumString('-' . $this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 611 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }]; } } '", "T_IS_GREATER_OR_EQUAL", "T_SL", "T_SR", "'+'", "'-'", "'.'", "'*'", "'/'", "'%'", "'!'", "T_INSTANCEOF", "'~'", "T_INC", "T_DEC", "T_INT_CAST", "T_DOUBLE_CAST", "T_STRING_CAST", "T_ARRAY_CAST", "T_OBJECT_CAST", "T_BOOL_CAST", "T_UNSET_CAST", "'@'", "T_POW", "'['", "T_NEW", "T_CLONE", "T_EXIT", "T_IF", "T_ELSEIF", "T_ELSE", "T_ENDIF", "T_LNUMBER", "T_DNUMBER", "T_STRING", "T_STRING_VARNAME", "T_VARIABLE", "T_NUM_STRING", "T_INLINE_HTML", "T_ENCAPSED_AND_WHITESPACE", "T_CONSTANT_ENCAPSED_STRING", "T_ECHO", "T_DO", "T_WHILE", "T_ENDWHILE", "T_FOR", "T_ENDFOR", "T_FOREACH", "T_ENDFOREACH", "T_DECLARE", "T_ENDDECLARE", "T_AS", "T_SWITCH", "T_MATCH", "T_ENDSWITCH", "T_CASE", "T_DEFAULT", "T_BREAK", "T_CONTINUE", "T_GOTO", "T_FUNCTION", "T_FN", "T_CONST", "T_RETURN", "T_TRY", "T_CATCH", "T_FINALLY", "T_USE", "T_INSTEADOF", "T_GLOBAL", "T_STATIC", "T_ABSTRACT", "T_FINAL", "T_PRIVATE", "T_PROTECTED", "T_PUBLIC", "T_READONLY", "T_VAR", "T_UNSET", "T_ISSET", "T_EMPTY", "T_HALT_COMPILER", "T_CLASS", "T_TRAIT", "T_INTERFACE", "T_EXTENDS", "T_IMPLEMENTS", "T_OBJECT_OPERATOR", "T_LIST", "T_ARRAY", "T_CALLABLE", "T_CLASS_C", "T_TRAIT_C", "T_METHOD_C", "T_FUNC_C", "T_LINE", "T_FILE", "T_START_HEREDOC", "T_END_HEREDOC", "T_DOLLAR_OPEN_CURLY_BRACES", "T_CURLY_OPEN", "T_PAAMAYIM_NEKUDOTAYIM", "T_NAMESPACE", "T_NS_C", "T_DIR", "T_NS_SEPARATOR", "T_ELLIPSIS", "T_NAME_FULLY_QUALIFIED", "T_NAME_QUALIFIED", "T_NAME_RELATIVE", "';'", "'{'", "'}'", "'('", "')'", "'\$'", "'`'", "']'", "'\"'", "T_ENUM", "T_NULLSAFE_OBJECT_OPERATOR", "T_ATTRIBUTE"); protected $tokenToSymbol = array(0, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 56, 164, 168, 161, 55, 168, 168, 159, 160, 53, 50, 8, 51, 52, 54, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 31, 156, 44, 16, 46, 30, 68, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 70, 168, 163, 36, 168, 162, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 157, 35, 158, 58, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 32, 33, 34, 37, 38, 39, 40, 41, 42, 43, 45, 47, 48, 49, 57, 59, 60, 61, 62, 63, 64, 65, 66, 67, 69, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 165, 131, 132, 133, 166, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 167); protected $action = array(700, 670, 671, 672, 673, 674, 286, 675, 676, 677, 713, 714, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 0, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, -32766, -32766, -32766, -32766, -32766, -32766, -32766, -32766, -32766, -32767, -32767, -32767, -32767, 245, 246, 242, 243, 244, -32766, -32766, 678, -32766, -32766, -32766, -32766, -32766, -32766, -32766, -32766, -32766, 1229, 245, 246, 1230, 679, 680, 681, 682, 683, 684, 685, 899, 900, 747, -32766, -32766, -32766, -32766, -32766, -32766, 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, 716, 739, 717, 718, 719, 720, 708, 709, 710, 738, 711, 712, 697, 698, 699, 701, 702, 703, 741, 742, 743, 744, 745, 746, 875, 704, 705, 706, 707, 737, 728, 726, 727, 723, 724, 1046, 715, 721, 722, 729, 730, 732, 731, 733, 734, 55, 56, 425, 57, 58, 725, 736, 735, 755, 59, 60, -226, 61, -32766, -32766, -32766, -32766, -32766, -32766, -32766, -32766, -32766, -32766, 337, -32767, -32767, -32767, -32767, 29, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 620, -32766, -32766, -32766, -32766, 62, 63, 1046, -32766, -32766, -32766, 64, 419, 65, 294, 295, 66, 67, 68, 69, 70, 71, 72, 73, 823, 25, 302, 74, 418, 984, 986, 669, 668, 1100, 1101, 1078, 755, 755, 767, 1220, 768, 470, -32766, -32766, -32766, 341, 749, 824, 54, -32767, -32767, -32767, -32767, 98, 99, 100, 101, 102, 220, 221, 222, 362, 876, -32766, 27, -32766, -32766, -32766, -32766, -32766, 1046, 493, 126, 1080, 1079, 1081, 370, 1068, 930, 207, 478, 479, 952, 953, 954, 951, 950, 949, 128, 480, 481, 803, 1106, 1107, 1108, 1109, 1103, 1104, 319, 32, 297, 10, 211, -515, 1110, 1105, 669, 668, 1080, 1079, 1081, 220, 221, 222, 41, 364, 341, 334, 421, 336, 426, -128, -128, -128, 313, 1046, 469, -4, 824, 54, 812, 770, 207, 40, 21, 427, -128, 471, -128, 472, -128, 473, -128, 1046, 428, 220, 221, 222, -32766, 33, 34, 429, 361, 327, 52, 35, 474, -32766, -32766, -32766, 342, 357, 358, 475, 476, 48, 207, 249, 669, 668, 477, 443, 300, 795, 846, 430, 431, 28, -32766, 814, -32766, -32766, -32766, -32766, -32766, -32766, -32766, -32767, -32767, -32767, -32767, -32767, 952, 953, 954, 951, 950, 949, 422, 755, 424, 426, 826, 634, -128, -32766, -32766, 469, 824, 54, 288, 812, 1151, 755, 40, 21, 427, 317, 471, 345, 472, 129, 473, 9, 1186, 428, 769, 360, 324, 905, 33, 34, 429, 361, 1046, 415, 35, 474, 944, 1068, 315, 125, 357, 358, 475, 476, -32766, -32766, -32766, 926, 302, 477, 121, 1068, 759, 846, 430, 431, 669, 668, 423, 755, 1152, 809, 1046, 480, 766, -32766, 805, -32766, -32766, -32766, -32766, -261, 127, 347, 436, 841, 341, 1078, 1200, 426, 446, 826, 634, -4, 807, 469, 824, 54, 436, 812, 341, 755, 40, 21, 427, 444, 471, 130, 472, 1068, 473, 346, 767, 428, 768, -211, -211, -211, 33, 34, 429, 361, 308, 1076, 35, 474, -32766, -32766, -32766, 1046, 357, 358, 475, 476, -32766, -32766, -32766, 906, 120, 477, 539, 1068, 795, 846, 430, 431, 436, -32766, 341, -32766, -32766, -32766, 1046, 480, 810, -32766, 925, -32766, -32766, 754, 1080, 1079, 1081, 49, -32766, -32766, -32766, 749, 751, 426, 1201, 826, 634, -211, 30, 469, 669, 668, 436, 812, 341, 75, 40, 21, 427, -32766, 471, 1064, 472, 124, 473, 669, 668, 428, 212, -210, -210, -210, 33, 34, 429, 361, 51, 1186, 35, 474, 755, -32766, -32766, -32766, 357, 358, 475, 476, 213, 824, 54, 221, 222, 477, 20, 581, 795, 846, 430, 431, 220, 221, 222, 755, 222, 247, 78, 79, 80, 81, 341, 207, 517, 103, 104, 105, 752, 307, 131, 637, 1068, 207, 341, 207, 122, 826, 634, -210, 36, 106, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 1112, 307, 346, 436, 214, 341, 824, 54, 426, 123, 250, 129, 134, 106, 469, -32766, 572, 1112, 812, 245, 246, 40, 21, 427, 251, 471, 252, 472, 341, 473, 453, 22, 428, 207, 899, 900, 638, 33, 34, 429, 824, 54, -86, 35, 474, 220, 221, 222, 314, 357, 358, 100, 101, 102, 239, 240, 241, 645, 477, -230, 458, 589, 135, 374, 596, 597, 207, 760, 640, 648, 642, 941, 654, 929, 662, 822, 133, 307, 837, 426, -32766, 106, 749, 43, 44, 469, 45, 442, 46, 812, 826, 634, 40, 21, 427, 47, 471, 50, 472, 53, 473, 132, 608, 428, 302, 604, -280, -32766, 33, 34, 429, 824, 54, 426, 35, 474, 755, 957, -84, 469, 357, 358, 521, 812, 628, 363, 40, 21, 427, 477, 471, 575, 472, -515, 473, 847, 616, 428, -423, -32766, 11, 646, 33, 34, 429, 824, 54, 445, 35, 474, 462, 285, 578, 1111, 357, 358, 593, 369, 848, 594, 290, 826, 634, 477, 0, 0, 532, 0, 0, 325, 0, 0, 0, 0, 0, 651, 0, 0, 0, 322, 326, 0, 0, 0, 426, 0, 0, 0, 0, 323, 469, 316, 318, -516, 812, 862, 634, 40, 21, 427, 0, 471, 0, 472, 0, 473, 1158, 0, 428, 0, -414, 6, 7, 33, 34, 429, 824, 54, 426, 35, 474, 12, 14, 373, 469, 357, 358, -424, 812, 563, 754, 40, 21, 427, 477, 471, 248, 472, 839, 473, 38, 39, 428, 657, 658, 765, 813, 33, 34, 429, 821, 800, 815, 35, 474, 215, 216, 878, 869, 357, 358, 217, 870, 218, 798, 863, 826, 634, 477, 860, 858, 936, 937, 934, 820, 209, 804, 806, 808, 811, 933, 763, 764, 1100, 1101, 935, 659, 78, 335, 426, 359, 1102, 635, 639, 641, 469, 643, 644, 647, 812, 826, 634, 40, 21, 427, 649, 471, 650, 472, 652, 473, 653, 636, 428, 796, 1226, 1228, 762, 33, 34, 429, 215, 216, 845, 35, 474, 761, 217, 844, 218, 357, 358, 1227, 843, 1060, 831, 1048, 842, 1049, 477, 559, 209, 1106, 1107, 1108, 1109, 1103, 1104, 398, 1100, 1101, 829, 942, 867, 1110, 1105, 868, 1102, 457, 1225, 1194, 1192, 1177, 1157, 219, 1190, 1091, 917, 1198, 1188, 0, 826, 634, 24, -433, 26, 31, 37, 42, 76, 77, 210, 287, 292, 293, 308, 309, 310, 311, 339, 356, 416, 0, -227, -226, 16, 17, 18, 393, 454, 461, 463, 467, 553, 625, 1051, 559, 1054, 1106, 1107, 1108, 1109, 1103, 1104, 398, 907, 1116, 1050, 1026, 564, 1110, 1105, 1025, 1093, 1055, 0, 1044, 0, 1057, 1056, 219, 1059, 1058, 1075, 0, 1191, 1176, 1172, 1189, 1090, 1223, 1117, 1171, 600); protected $actionCheck = array(2, 3, 4, 5, 6, 7, 14, 9, 10, 11, 12, 13, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 0, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 9, 10, 11, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 69, 70, 53, 54, 55, 9, 10, 57, 30, 116, 32, 33, 34, 35, 36, 37, 38, 80, 69, 70, 83, 71, 72, 73, 74, 75, 76, 77, 135, 136, 80, 33, 34, 35, 36, 37, 38, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 31, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 13, 134, 135, 136, 137, 138, 139, 140, 141, 142, 3, 4, 5, 6, 7, 148, 149, 150, 82, 12, 13, 160, 15, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 8, 44, 45, 46, 47, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 80, 33, 34, 35, 36, 50, 51, 13, 9, 10, 11, 56, 128, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 1, 70, 71, 72, 73, 59, 60, 37, 38, 78, 79, 80, 82, 82, 106, 85, 108, 86, 9, 10, 11, 161, 80, 1, 2, 44, 45, 46, 47, 48, 49, 50, 51, 52, 9, 10, 11, 106, 156, 30, 8, 32, 33, 34, 35, 36, 13, 116, 8, 153, 154, 155, 8, 122, 158, 30, 125, 126, 116, 117, 118, 119, 120, 121, 31, 134, 135, 156, 137, 138, 139, 140, 141, 142, 143, 145, 146, 8, 8, 133, 149, 150, 37, 38, 153, 154, 155, 9, 10, 11, 159, 8, 161, 162, 8, 164, 74, 75, 76, 77, 8, 13, 80, 0, 1, 2, 84, 158, 30, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 13, 98, 9, 10, 11, 9, 103, 104, 105, 106, 8, 70, 109, 110, 9, 10, 11, 8, 115, 116, 117, 118, 70, 30, 31, 37, 38, 124, 31, 8, 127, 128, 129, 130, 8, 30, 156, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 116, 117, 118, 119, 120, 121, 8, 82, 8, 74, 156, 157, 158, 33, 34, 80, 1, 2, 8, 84, 163, 82, 87, 88, 89, 133, 91, 70, 93, 152, 95, 108, 82, 98, 158, 8, 113, 160, 103, 104, 105, 106, 13, 108, 109, 110, 123, 122, 113, 157, 115, 116, 117, 118, 9, 10, 11, 156, 71, 124, 157, 122, 127, 128, 129, 130, 37, 38, 8, 82, 160, 156, 13, 134, 156, 30, 156, 32, 33, 34, 35, 158, 157, 148, 159, 122, 161, 80, 1, 74, 133, 156, 157, 158, 156, 80, 1, 2, 159, 84, 161, 82, 87, 88, 89, 157, 91, 157, 93, 122, 95, 161, 106, 98, 108, 100, 101, 102, 103, 104, 105, 106, 159, 116, 109, 110, 9, 10, 11, 13, 115, 116, 117, 118, 9, 10, 11, 160, 16, 124, 81, 122, 127, 128, 129, 130, 159, 30, 161, 32, 33, 34, 13, 134, 156, 30, 156, 32, 33, 153, 153, 154, 155, 70, 9, 10, 11, 80, 80, 74, 160, 156, 157, 158, 14, 80, 37, 38, 159, 84, 161, 152, 87, 88, 89, 30, 91, 160, 93, 14, 95, 37, 38, 98, 16, 100, 101, 102, 103, 104, 105, 106, 70, 82, 109, 110, 82, 33, 34, 35, 115, 116, 117, 118, 16, 1, 2, 10, 11, 124, 160, 85, 127, 128, 129, 130, 9, 10, 11, 82, 11, 14, 157, 9, 10, 11, 161, 30, 85, 53, 54, 55, 154, 57, 157, 31, 122, 30, 161, 30, 157, 156, 157, 158, 30, 69, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 144, 57, 161, 159, 16, 161, 1, 2, 74, 157, 16, 152, 157, 69, 80, 116, 161, 144, 84, 69, 70, 87, 88, 89, 16, 91, 16, 93, 161, 95, 75, 76, 98, 30, 135, 136, 31, 103, 104, 105, 1, 2, 31, 109, 110, 9, 10, 11, 31, 115, 116, 50, 51, 52, 50, 51, 52, 31, 124, 160, 75, 76, 101, 102, 111, 112, 30, 156, 157, 31, 31, 156, 157, 156, 157, 31, 31, 57, 38, 74, 33, 69, 80, 70, 70, 80, 70, 89, 70, 84, 156, 157, 87, 88, 89, 70, 91, 70, 93, 70, 95, 70, 96, 98, 71, 77, 82, 85, 103, 104, 105, 1, 2, 74, 109, 110, 82, 82, 97, 80, 115, 116, 85, 84, 92, 106, 87, 88, 89, 124, 91, 90, 93, 133, 95, 128, 94, 98, 147, 116, 97, 31, 103, 104, 105, 1, 2, 97, 109, 110, 97, 97, 100, 144, 115, 116, 100, 106, 128, 113, 161, 156, 157, 124, -1, -1, 151, -1, -1, 114, -1, -1, -1, -1, -1, 31, -1, -1, -1, 131, 131, -1, -1, -1, 74, -1, -1, -1, -1, 132, 80, 133, 133, 133, 84, 156, 157, 87, 88, 89, -1, 91, -1, 93, -1, 95, 144, -1, 98, -1, 147, 147, 147, 103, 104, 105, 1, 2, 74, 109, 110, 147, 147, 147, 80, 115, 116, 147, 84, 151, 153, 87, 88, 89, 124, 91, 31, 93, 152, 95, 156, 156, 98, 156, 156, 156, 156, 103, 104, 105, 156, 156, 156, 109, 110, 50, 51, 156, 156, 115, 116, 56, 156, 58, 156, 156, 156, 157, 124, 156, 156, 156, 156, 156, 156, 70, 156, 156, 156, 156, 156, 156, 156, 78, 79, 156, 158, 157, 157, 74, 157, 86, 157, 157, 157, 80, 157, 157, 157, 84, 156, 157, 87, 88, 89, 157, 91, 157, 93, 157, 95, 157, 157, 98, 158, 158, 158, 158, 103, 104, 105, 50, 51, 158, 109, 110, 158, 56, 158, 58, 115, 116, 158, 158, 158, 158, 158, 158, 158, 124, 135, 70, 137, 138, 139, 140, 141, 142, 143, 78, 79, 158, 158, 158, 149, 150, 158, 86, 158, 158, 158, 158, 158, 164, 159, 158, 158, 158, 158, 158, -1, 156, 157, 159, 162, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, -1, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 135, 160, 137, 138, 139, 140, 141, 142, 143, 160, 160, 160, 160, 160, 149, 150, 160, 160, 163, -1, 162, -1, 163, 163, 159, 163, 163, 163, -1, 163, 163, 163, 163, 163, 163, 163, 163, 163); protected $actionBase = array(0, 229, 310, 390, 470, 103, 325, 325, 784, -2, -2, 149, -2, -2, -2, 660, 765, 799, 765, 589, 694, 870, 870, 870, 252, 404, 404, 404, 514, 177, 177, 918, 434, 118, 295, 313, 240, 491, 491, 491, 491, 138, 138, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 89, 206, 773, 550, 535, 775, 776, 777, 912, 709, 913, 856, 857, 700, 858, 859, 862, 863, 864, 855, 865, 935, 866, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 322, 592, 285, 319, 232, 44, 691, 691, 691, 691, 691, 691, 691, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 582, 530, 530, 530, 594, 860, 658, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 500, -21, -21, 492, 702, 420, 355, 216, 549, 151, 26, 26, 331, 331, 331, 331, 331, 46, 46, 5, 5, 5, 5, 153, 188, 188, 188, 188, 121, 121, 121, 121, 314, 314, 394, 394, 362, 300, 298, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 67, 656, 656, 659, 659, 522, 554, 554, 554, 554, 679, -59, -59, 381, 462, 462, 462, 528, 717, 854, 382, 382, 382, 382, 382, 382, 561, 561, 561, -3, -3, -3, 692, 115, 137, 115, 137, 678, 732, 450, 732, 338, 677, -15, 510, 810, 468, 707, 850, 711, 853, 572, 735, 267, 529, 654, 674, 463, 529, 529, 529, 529, 654, 610, 640, 608, 463, 529, 463, 718, 323, 496, 89, 570, 507, 675, 778, 293, 670, 780, 290, 373, 332, 566, 278, 435, 733, 781, 914, 917, 385, 715, 675, 675, 675, 352, 511, 278, -8, 605, 605, 605, 605, 156, 605, 605, 605, 605, 251, 276, 375, 402, 779, 657, 657, 690, 872, 869, 869, 657, 689, 657, 690, 874, 874, 874, 874, 657, 657, 657, 657, 869, 869, 869, 688, 869, 239, 703, 704, 704, 874, 742, 743, 657, 657, 712, 869, 869, 869, 712, 695, 874, 701, 741, 277, 869, 874, 672, 689, 672, 657, 701, 672, 689, 689, 672, 22, 666, 668, 873, 875, 887, 790, 662, 685, 879, 880, 876, 878, 871, 699, 744, 745, 497, 669, 671, 673, 680, 719, 682, 713, 674, 667, 667, 667, 655, 720, 655, 667, 667, 667, 667, 667, 667, 667, 667, 916, 646, 731, 714, 653, 749, 553, 573, 791, 664, 811, 900, 893, 867, 919, 881, 898, 655, 920, 739, 247, 643, 882, 783, 786, 655, 883, 655, 792, 655, 902, 812, 686, 813, 814, 667, 910, 921, 923, 924, 925, 927, 928, 929, 930, 684, 931, 750, 696, 894, 299, 877, 718, 729, 705, 788, 751, 820, 328, 932, 823, 655, 655, 794, 785, 655, 795, 756, 740, 890, 757, 895, 933, 664, 708, 896, 655, 706, 825, 934, 328, 681, 683, 888, 661, 761, 886, 911, 885, 796, 649, 663, 829, 830, 831, 693, 763, 891, 892, 889, 764, 803, 665, 805, 697, 832, 807, 884, 768, 833, 834, 899, 676, 730, 710, 698, 687, 809, 835, 897, 769, 770, 771, 848, 772, 849, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 138, 138, 138, 138, -2, -2, -2, -2, 0, 0, -2, 0, 0, 0, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 0, 0, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 599, -21, -21, -21, -21, 599, -21, -21, -21, -21, -21, -21, -21, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, -21, 599, 599, 599, -21, 382, -21, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 599, 0, 0, 599, -21, 599, -21, 599, -21, -21, 599, 599, 599, 599, 599, 599, 599, -21, -21, -21, -21, -21, -21, 0, 561, 561, 561, 561, -21, -21, -21, -21, 382, 382, 382, 382, 382, 382, 259, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 561, 561, -3, -3, 382, 382, 382, 382, 382, 259, 382, 382, 463, 689, 689, 689, 137, 137, 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 463, 0, 463, 0, 382, 463, 689, 463, 657, 137, 689, 689, 463, 869, 616, 616, 616, 616, 328, 278, 0, 0, 689, 689, 0, 0, 0, 0, 0, 689, 0, 0, 0, 0, 0, 0, 869, 0, 0, 0, 0, 0, 667, 247, 0, 705, 335, 0, 0, 0, 0, 0, 0, 705, 335, 347, 347, 0, 684, 667, 667, 667, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 328); protected $actionDefault = array(3, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 544, 544, 499, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 299, 299, 299, 32767, 32767, 32767, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 32767, 32767, 32767, 32767, 32767, 32767, 383, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 389, 549, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 364, 365, 367, 368, 298, 552, 533, 247, 390, 548, 297, 249, 327, 503, 32767, 32767, 32767, 329, 122, 258, 203, 502, 125, 296, 234, 382, 384, 328, 303, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 302, 458, 361, 360, 359, 460, 32767, 459, 496, 496, 499, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 325, 487, 486, 326, 456, 330, 457, 333, 461, 464, 331, 332, 349, 350, 347, 348, 351, 462, 463, 480, 481, 478, 479, 301, 352, 353, 354, 355, 482, 483, 484, 485, 32767, 32767, 543, 543, 32767, 32767, 282, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 340, 341, 471, 472, 32767, 238, 238, 238, 238, 283, 238, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 335, 336, 334, 466, 467, 465, 432, 32767, 32767, 32767, 434, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 504, 32767, 32767, 32767, 32767, 32767, 517, 421, 171, 32767, 413, 32767, 171, 171, 171, 171, 32767, 222, 224, 167, 32767, 171, 32767, 490, 32767, 32767, 32767, 32767, 522, 345, 32767, 32767, 116, 32767, 32767, 32767, 559, 32767, 517, 32767, 116, 32767, 32767, 32767, 32767, 358, 337, 338, 339, 32767, 32767, 521, 515, 474, 475, 476, 477, 32767, 468, 469, 470, 473, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 429, 435, 435, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 520, 519, 32767, 414, 498, 188, 186, 186, 32767, 208, 208, 32767, 32767, 190, 491, 510, 32767, 190, 173, 32767, 400, 175, 498, 32767, 32767, 240, 32767, 240, 32767, 400, 240, 32767, 32767, 240, 32767, 415, 439, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 379, 380, 493, 506, 32767, 507, 32767, 413, 343, 344, 346, 322, 32767, 324, 369, 370, 371, 372, 373, 374, 375, 377, 32767, 419, 32767, 422, 32767, 32767, 32767, 257, 32767, 557, 32767, 32767, 306, 557, 32767, 32767, 32767, 551, 32767, 32767, 300, 32767, 32767, 32767, 32767, 253, 32767, 169, 32767, 541, 32767, 558, 32767, 515, 32767, 342, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 516, 32767, 32767, 32767, 32767, 229, 32767, 452, 32767, 116, 32767, 32767, 32767, 189, 32767, 32767, 304, 248, 32767, 32767, 550, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 114, 32767, 170, 32767, 32767, 32767, 191, 32767, 32767, 515, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 295, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 515, 32767, 32767, 233, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 415, 32767, 276, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 127, 127, 3, 127, 127, 260, 3, 260, 127, 260, 260, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 216, 219, 208, 208, 164, 127, 127, 268); protected $goto = array(166, 140, 140, 140, 166, 187, 168, 144, 147, 141, 142, 143, 149, 163, 163, 163, 163, 144, 144, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 138, 159, 160, 161, 162, 184, 139, 185, 494, 495, 377, 496, 500, 501, 502, 503, 504, 505, 506, 507, 970, 164, 145, 146, 148, 171, 176, 186, 203, 253, 256, 258, 260, 263, 264, 265, 266, 267, 268, 269, 277, 278, 279, 280, 303, 304, 328, 329, 330, 394, 395, 396, 543, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 150, 151, 152, 167, 153, 169, 154, 204, 170, 155, 156, 157, 205, 158, 136, 621, 561, 757, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1113, 629, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 758, 520, 531, 509, 656, 556, 1183, 750, 509, 592, 786, 1183, 888, 612, 613, 884, 617, 618, 624, 626, 631, 633, 817, 855, 855, 855, 855, 850, 856, 174, 891, 891, 1205, 1205, 177, 178, 179, 401, 402, 403, 404, 173, 202, 206, 208, 257, 259, 261, 262, 270, 271, 272, 273, 274, 275, 281, 282, 283, 284, 305, 306, 331, 332, 333, 406, 407, 408, 409, 175, 180, 254, 255, 181, 182, 183, 498, 498, 498, 498, 498, 498, 861, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 510, 586, 538, 601, 602, 510, 545, 546, 547, 548, 549, 550, 551, 552, 554, 587, 1209, 560, 350, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 400, 607, 537, 537, 569, 533, 909, 535, 535, 497, 499, 525, 541, 570, 573, 584, 591, 298, 296, 296, 296, 298, 289, 299, 611, 378, 511, 614, 595, 947, 375, 511, 437, 437, 437, 437, 437, 437, 1163, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 1077, 948, 338, 1175, 321, 1077, 898, 898, 898, 898, 606, 898, 898, 1217, 1217, 1202, 753, 576, 605, 756, 1077, 1077, 1077, 1077, 1077, 1077, 1069, 384, 384, 384, 391, 1217, 877, 859, 857, 859, 655, 466, 512, 886, 881, 753, 384, 753, 384, 968, 384, 895, 385, 588, 353, 414, 384, 1231, 1019, 542, 1197, 1197, 1197, 568, 1094, 386, 386, 386, 904, 915, 515, 1029, 19, 15, 372, 389, 915, 940, 448, 450, 632, 340, 1216, 1216, 1114, 615, 938, 840, 555, 775, 386, 913, 1070, 1073, 1074, 399, 1069, 1182, 660, 23, 1216, 773, 1182, 544, 603, 1066, 1219, 1071, 1174, 1071, 519, 1199, 1199, 1199, 1089, 1088, 1072, 343, 523, 534, 519, 519, 772, 351, 352, 13, 579, 583, 627, 1061, 388, 782, 562, 771, 515, 783, 1181, 3, 4, 918, 956, 865, 451, 574, 1160, 464, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 514, 529, 0, 0, 0, 0, 514, 0, 529, 0, 0, 0, 0, 610, 513, 516, 439, 440, 1067, 619, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 780, 1224, 0, 0, 0, 0, 0, 524, 0, 0, 0, 0, 0, 0, 0, 0, 0, 778, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 301, 301); protected $gotoCheck = array(43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 57, 69, 15, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 128, 9, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 16, 102, 32, 69, 32, 32, 120, 6, 69, 32, 29, 120, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 50, 69, 69, 69, 69, 69, 69, 27, 77, 77, 77, 77, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 119, 119, 119, 119, 119, 119, 33, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 67, 110, 67, 67, 119, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 142, 57, 72, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 51, 51, 51, 51, 51, 51, 84, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 5, 5, 5, 5, 5, 5, 5, 63, 46, 124, 63, 129, 98, 63, 124, 57, 57, 57, 57, 57, 57, 133, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 98, 127, 82, 127, 57, 57, 57, 57, 57, 49, 57, 57, 144, 144, 140, 11, 40, 40, 14, 57, 57, 57, 57, 57, 57, 82, 13, 13, 13, 48, 144, 14, 14, 14, 14, 14, 57, 14, 14, 14, 11, 13, 11, 13, 102, 13, 79, 11, 70, 70, 70, 13, 13, 103, 2, 9, 9, 9, 2, 34, 125, 125, 125, 81, 13, 13, 34, 34, 34, 34, 17, 13, 8, 8, 8, 8, 18, 143, 143, 8, 8, 8, 9, 34, 25, 125, 85, 82, 82, 82, 125, 82, 121, 74, 34, 143, 24, 121, 47, 34, 116, 143, 82, 82, 82, 47, 121, 121, 121, 126, 126, 82, 58, 58, 58, 47, 47, 23, 72, 72, 58, 62, 62, 62, 114, 12, 23, 12, 23, 13, 26, 121, 30, 30, 86, 100, 71, 65, 66, 132, 109, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 9, 9, -1, -1, -1, -1, 9, -1, 9, -1, -1, -1, -1, 13, 9, 9, 9, 9, 13, 13, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 9, 9, -1, -1, -1, -1, -1, 102, -1, -1, -1, -1, -1, -1, -1, -1, -1, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5, 5); protected $gotoBase = array(0, 0, -172, 0, 0, 353, 201, 0, 477, 149, 0, 110, 195, 117, 426, 112, 203, 140, 171, 0, 0, 0, 0, 168, 164, 157, 119, 27, 0, 205, -118, 0, -428, 266, 51, 0, 0, 0, 0, 0, 388, 0, 0, -24, 0, 0, 345, 484, 146, 133, 209, 75, 0, 0, 0, 0, 0, 107, 161, 0, 0, 0, 222, -77, 0, 106, 97, -343, 0, -94, 135, 123, -129, 0, 129, 0, 0, -50, 0, 143, 0, 159, 64, 0, 338, 132, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 98, 0, 121, 0, 165, 156, 0, 0, 0, 0, 0, 87, 273, 259, 0, 0, 114, 0, 150, 0, 0, -5, -91, 200, 0, 0, 84, 154, 202, 77, -48, 178, 0, 0, 93, 187, 0, 0, 0, 0, 0, 0, 136, 0, 286, 167, 102, 0, 0); protected $gotoDefault = array(-32768, 468, 664, 2, 665, 835, 740, 748, 598, 482, 630, 582, 380, 1193, 792, 793, 794, 381, 368, 483, 379, 410, 405, 781, 774, 776, 784, 172, 411, 787, 1, 789, 518, 825, 1020, 365, 797, 366, 590, 799, 527, 801, 802, 137, 382, 383, 528, 484, 390, 577, 816, 276, 387, 818, 367, 819, 828, 371, 465, 455, 460, 530, 557, 609, 432, 447, 571, 565, 536, 1086, 566, 864, 349, 872, 661, 880, 883, 485, 558, 894, 452, 902, 1099, 397, 908, 914, 919, 291, 922, 417, 412, 585, 927, 928, 5, 932, 622, 623, 8, 312, 955, 599, 969, 420, 1039, 1041, 486, 487, 522, 459, 508, 526, 488, 1062, 441, 413, 1065, 433, 489, 490, 434, 435, 1083, 355, 1168, 354, 449, 320, 1155, 580, 1118, 456, 1208, 1164, 348, 491, 492, 376, 1187, 392, 1203, 438, 1210, 1218, 344, 540, 567); protected $ruleToNonTerminal = array(0, 1, 3, 3, 2, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 8, 8, 9, 10, 11, 11, 12, 12, 13, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 18, 18, 19, 19, 21, 21, 17, 17, 22, 22, 23, 23, 24, 24, 25, 25, 20, 20, 26, 28, 28, 29, 30, 30, 32, 31, 31, 31, 31, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 14, 14, 54, 54, 56, 55, 55, 48, 48, 58, 58, 59, 59, 60, 60, 61, 61, 15, 16, 16, 16, 64, 64, 64, 65, 65, 68, 68, 66, 66, 70, 70, 41, 41, 50, 50, 53, 53, 53, 52, 52, 71, 42, 42, 42, 42, 72, 72, 73, 73, 74, 74, 39, 39, 35, 35, 75, 37, 37, 76, 36, 36, 38, 38, 49, 49, 49, 62, 62, 78, 78, 79, 79, 81, 81, 81, 80, 80, 63, 63, 82, 82, 82, 83, 83, 84, 84, 84, 44, 44, 85, 85, 85, 45, 45, 86, 86, 87, 87, 67, 88, 88, 88, 88, 93, 93, 94, 94, 95, 95, 95, 95, 95, 96, 97, 97, 92, 92, 89, 89, 91, 91, 99, 99, 98, 98, 98, 98, 98, 98, 90, 90, 101, 100, 100, 46, 46, 40, 40, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 34, 34, 47, 47, 106, 106, 107, 107, 107, 107, 113, 102, 102, 109, 109, 115, 115, 116, 117, 118, 118, 118, 118, 118, 118, 118, 69, 69, 57, 57, 57, 57, 103, 103, 122, 122, 119, 119, 123, 123, 123, 123, 104, 104, 104, 108, 108, 108, 114, 114, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 27, 27, 27, 27, 27, 27, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 112, 112, 105, 105, 105, 105, 129, 129, 132, 132, 131, 131, 133, 133, 51, 51, 51, 51, 135, 135, 134, 134, 134, 134, 134, 136, 136, 121, 121, 124, 124, 120, 120, 138, 137, 137, 137, 137, 125, 125, 125, 125, 111, 111, 126, 126, 126, 126, 77, 139, 139, 140, 140, 140, 110, 110, 141, 141, 142, 142, 142, 142, 142, 127, 127, 127, 127, 144, 145, 143, 143, 143, 143, 143, 143, 143, 146, 146, 146); protected $ruleToLength = array(1, 1, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 5, 4, 3, 4, 2, 3, 1, 1, 7, 6, 3, 1, 3, 1, 3, 1, 1, 3, 1, 3, 1, 2, 3, 1, 3, 3, 1, 3, 2, 0, 1, 1, 1, 1, 1, 3, 5, 8, 3, 5, 9, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 1, 2, 2, 5, 7, 9, 5, 6, 3, 3, 2, 2, 1, 1, 1, 0, 2, 8, 0, 4, 1, 3, 0, 1, 0, 1, 0, 1, 1, 1, 10, 7, 6, 5, 1, 2, 2, 0, 2, 0, 2, 0, 2, 1, 3, 1, 4, 1, 4, 1, 1, 4, 1, 3, 3, 3, 4, 4, 5, 0, 2, 4, 3, 1, 1, 1, 4, 0, 2, 3, 0, 2, 4, 0, 2, 0, 3, 1, 2, 1, 1, 0, 1, 3, 4, 6, 1, 1, 1, 0, 1, 0, 2, 2, 3, 3, 1, 3, 1, 2, 2, 3, 1, 1, 2, 4, 3, 1, 1, 3, 2, 0, 1, 3, 3, 9, 3, 1, 3, 0, 2, 4, 5, 4, 4, 4, 3, 1, 1, 1, 3, 1, 1, 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 3, 3, 1, 0, 1, 1, 3, 3, 4, 4, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 3, 5, 4, 3, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 3, 2, 1, 2, 10, 11, 3, 3, 2, 4, 4, 3, 4, 4, 4, 4, 7, 3, 2, 0, 4, 1, 3, 2, 1, 2, 2, 4, 6, 2, 2, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 4, 4, 0, 2, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 1, 3, 1, 4, 3, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 5, 4, 4, 3, 1, 3, 1, 1, 3, 3, 0, 2, 0, 1, 3, 1, 3, 1, 1, 1, 1, 1, 6, 4, 3, 4, 2, 4, 4, 1, 3, 1, 2, 1, 1, 4, 1, 1, 3, 6, 4, 4, 4, 4, 1, 4, 0, 1, 1, 3, 1, 1, 4, 3, 1, 1, 1, 0, 0, 2, 3, 1, 3, 1, 4, 2, 2, 2, 2, 1, 2, 1, 1, 1, 4, 3, 3, 3, 6, 3, 1, 1, 1); protected function initReduceCallbacks() { $this->reduceCallbacks = [0 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 1 => function ($stackPos) { $this->semValue = $this->handleNamespaces($this->semStack[$stackPos - (1 - 1)]); }, 2 => function ($stackPos) { if (\is_array($this->semStack[$stackPos - (2 - 2)])) { $this->semValue = \array_merge($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)]); } else { $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; $this->semValue = $this->semStack[$stackPos - (2 - 1)]; } }, 3 => function ($stackPos) { $this->semValue = array(); }, 4 => function ($stackPos) { $startAttributes = $this->lookaheadStartAttributes; if (isset($startAttributes['comments'])) { $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); } else { $nop = null; } if ($nop !== null) { $this->semStack[$stackPos - (1 - 1)][] = $nop; } $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 5 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 6 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 7 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 8 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 9 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 10 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 11 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 12 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 13 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 14 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 15 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 16 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 17 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 18 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 19 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 20 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 21 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 22 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 23 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 24 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 25 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 26 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 27 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 28 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 29 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 30 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 31 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 32 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 33 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 34 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 35 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 36 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 37 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 38 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 39 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 40 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 41 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 42 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 43 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 44 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 45 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 46 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 47 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 48 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 49 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 50 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 51 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 52 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 53 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 54 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 55 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 56 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 57 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 58 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 59 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 60 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 61 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 62 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 63 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 64 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 65 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 66 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 67 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 68 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 69 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 70 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 71 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 72 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 73 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 74 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 75 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 76 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 77 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 78 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 79 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 80 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 81 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 82 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 83 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 84 => function ($stackPos) { $this->semValue = new Node\Identifier($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 85 => function ($stackPos) { $this->semValue = new Node\Identifier($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 86 => function ($stackPos) { $this->semValue = new Node\Identifier($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 87 => function ($stackPos) { $this->semValue = new Node\Identifier($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 88 => function ($stackPos) { $this->semValue = new Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 89 => function ($stackPos) { $this->semValue = new Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 90 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 91 => function ($stackPos) { $this->semValue = new Name(\substr($this->semStack[$stackPos - (1 - 1)], 1), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 92 => function ($stackPos) { $this->semValue = new Expr\Variable(\substr($this->semStack[$stackPos - (1 - 1)], 1), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 93 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 94 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 95 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 96 => function ($stackPos) { $this->semValue = new Stmt\HaltCompiler($this->lexer->handleHaltCompiler(), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 97 => function ($stackPos) { $this->semValue = new Stmt\Namespace_($this->semStack[$stackPos - (3 - 2)], null, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_SEMICOLON); $this->checkNamespace($this->semValue); }, 98 => function ($stackPos) { $this->semValue = new Stmt\Namespace_($this->semStack[$stackPos - (5 - 2)], $this->semStack[$stackPos - (5 - 4)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); $this->checkNamespace($this->semValue); }, 99 => function ($stackPos) { $this->semValue = new Stmt\Namespace_(null, $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); $this->checkNamespace($this->semValue); }, 100 => function ($stackPos) { $this->semValue = new Stmt\Use_($this->semStack[$stackPos - (3 - 2)], Stmt\Use_::TYPE_NORMAL, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 101 => function ($stackPos) { $this->semValue = new Stmt\Use_($this->semStack[$stackPos - (4 - 3)], $this->semStack[$stackPos - (4 - 2)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 102 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (2 - 1)]; }, 103 => function ($stackPos) { $this->semValue = new Stmt\Const_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 104 => function ($stackPos) { $this->semValue = Stmt\Use_::TYPE_FUNCTION; }, 105 => function ($stackPos) { $this->semValue = Stmt\Use_::TYPE_CONSTANT; }, 106 => function ($stackPos) { $this->semValue = new Stmt\GroupUse($this->semStack[$stackPos - (7 - 3)], $this->semStack[$stackPos - (7 - 6)], $this->semStack[$stackPos - (7 - 2)], $this->startAttributeStack[$stackPos - (7 - 1)] + $this->endAttributes); }, 107 => function ($stackPos) { $this->semValue = new Stmt\GroupUse($this->semStack[$stackPos - (6 - 2)], $this->semStack[$stackPos - (6 - 5)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes); }, 108 => function ($stackPos) { $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; $this->semValue = $this->semStack[$stackPos - (3 - 1)]; }, 109 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); }, 110 => function ($stackPos) { $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; $this->semValue = $this->semStack[$stackPos - (3 - 1)]; }, 111 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); }, 112 => function ($stackPos) { $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; $this->semValue = $this->semStack[$stackPos - (3 - 1)]; }, 113 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); }, 114 => function ($stackPos) { $this->semValue = new Stmt\UseUse($this->semStack[$stackPos - (1 - 1)], null, Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); $this->checkUseUse($this->semValue, $stackPos - (1 - 1)); }, 115 => function ($stackPos) { $this->semValue = new Stmt\UseUse($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); $this->checkUseUse($this->semValue, $stackPos - (3 - 3)); }, 116 => function ($stackPos) { $this->semValue = new Stmt\UseUse($this->semStack[$stackPos - (1 - 1)], null, Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); $this->checkUseUse($this->semValue, $stackPos - (1 - 1)); }, 117 => function ($stackPos) { $this->semValue = new Stmt\UseUse($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); $this->checkUseUse($this->semValue, $stackPos - (3 - 3)); }, 118 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; $this->semValue->type = Stmt\Use_::TYPE_NORMAL; }, 119 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (2 - 2)]; $this->semValue->type = $this->semStack[$stackPos - (2 - 1)]; }, 120 => function ($stackPos) { $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; $this->semValue = $this->semStack[$stackPos - (3 - 1)]; }, 121 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); }, 122 => function ($stackPos) { $this->semValue = new Node\Const_($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 123 => function ($stackPos) { $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; $this->semValue = $this->semStack[$stackPos - (3 - 1)]; }, 124 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); }, 125 => function ($stackPos) { $this->semValue = new Node\Const_($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 126 => function ($stackPos) { if (\is_array($this->semStack[$stackPos - (2 - 2)])) { $this->semValue = \array_merge($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)]); } else { $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; $this->semValue = $this->semStack[$stackPos - (2 - 1)]; } }, 127 => function ($stackPos) { $this->semValue = array(); }, 128 => function ($stackPos) { $startAttributes = $this->lookaheadStartAttributes; if (isset($startAttributes['comments'])) { $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); } else { $nop = null; } if ($nop !== null) { $this->semStack[$stackPos - (1 - 1)][] = $nop; } $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 129 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 130 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 131 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 132 => function ($stackPos) { throw new Error('__HALT_COMPILER() can only be used from the outermost scope', $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 133 => function ($stackPos) { if ($this->semStack[$stackPos - (3 - 2)]) { $this->semValue = $this->semStack[$stackPos - (3 - 2)]; $attrs = $this->startAttributeStack[$stackPos - (3 - 1)]; $stmts = $this->semValue; if (!empty($attrs['comments'])) { $stmts[0]->setAttribute('comments', \array_merge($attrs['comments'], $stmts[0]->getAttribute('comments', []))); } } else { $startAttributes = $this->startAttributeStack[$stackPos - (3 - 1)]; if (isset($startAttributes['comments'])) { $this->semValue = new Stmt\Nop($startAttributes + $this->endAttributes); } else { $this->semValue = null; } if (null === $this->semValue) { $this->semValue = array(); } } }, 134 => function ($stackPos) { $this->semValue = new Stmt\If_($this->semStack[$stackPos - (5 - 2)], ['stmts' => \is_array($this->semStack[$stackPos - (5 - 3)]) ? $this->semStack[$stackPos - (5 - 3)] : array($this->semStack[$stackPos - (5 - 3)]), 'elseifs' => $this->semStack[$stackPos - (5 - 4)], 'else' => $this->semStack[$stackPos - (5 - 5)]], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); }, 135 => function ($stackPos) { $this->semValue = new Stmt\If_($this->semStack[$stackPos - (8 - 2)], ['stmts' => $this->semStack[$stackPos - (8 - 4)], 'elseifs' => $this->semStack[$stackPos - (8 - 5)], 'else' => $this->semStack[$stackPos - (8 - 6)]], $this->startAttributeStack[$stackPos - (8 - 1)] + $this->endAttributes); }, 136 => function ($stackPos) { $this->semValue = new Stmt\While_($this->semStack[$stackPos - (3 - 2)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 137 => function ($stackPos) { $this->semValue = new Stmt\Do_($this->semStack[$stackPos - (5 - 4)], \is_array($this->semStack[$stackPos - (5 - 2)]) ? $this->semStack[$stackPos - (5 - 2)] : array($this->semStack[$stackPos - (5 - 2)]), $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); }, 138 => function ($stackPos) { $this->semValue = new Stmt\For_(['init' => $this->semStack[$stackPos - (9 - 3)], 'cond' => $this->semStack[$stackPos - (9 - 5)], 'loop' => $this->semStack[$stackPos - (9 - 7)], 'stmts' => $this->semStack[$stackPos - (9 - 9)]], $this->startAttributeStack[$stackPos - (9 - 1)] + $this->endAttributes); }, 139 => function ($stackPos) { $this->semValue = new Stmt\Switch_($this->semStack[$stackPos - (3 - 2)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 140 => function ($stackPos) { $this->semValue = new Stmt\Break_(null, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 141 => function ($stackPos) { $this->semValue = new Stmt\Break_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 142 => function ($stackPos) { $this->semValue = new Stmt\Continue_(null, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 143 => function ($stackPos) { $this->semValue = new Stmt\Continue_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 144 => function ($stackPos) { $this->semValue = new Stmt\Return_(null, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 145 => function ($stackPos) { $this->semValue = new Stmt\Return_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 146 => function ($stackPos) { $this->semValue = new Stmt\Global_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 147 => function ($stackPos) { $this->semValue = new Stmt\Static_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 148 => function ($stackPos) { $this->semValue = new Stmt\Echo_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 149 => function ($stackPos) { $this->semValue = new Stmt\InlineHTML($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 150 => function ($stackPos) { $this->semValue = new Stmt\Expression($this->semStack[$stackPos - (2 - 1)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 151 => function ($stackPos) { $this->semValue = new Stmt\Expression($this->semStack[$stackPos - (2 - 1)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 152 => function ($stackPos) { $this->semValue = new Stmt\Unset_($this->semStack[$stackPos - (5 - 3)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); }, 153 => function ($stackPos) { $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos - (7 - 3)], $this->semStack[$stackPos - (7 - 5)][0], ['keyVar' => null, 'byRef' => $this->semStack[$stackPos - (7 - 5)][1], 'stmts' => $this->semStack[$stackPos - (7 - 7)]], $this->startAttributeStack[$stackPos - (7 - 1)] + $this->endAttributes); }, 154 => function ($stackPos) { $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos - (9 - 3)], $this->semStack[$stackPos - (9 - 7)][0], ['keyVar' => $this->semStack[$stackPos - (9 - 5)], 'byRef' => $this->semStack[$stackPos - (9 - 7)][1], 'stmts' => $this->semStack[$stackPos - (9 - 9)]], $this->startAttributeStack[$stackPos - (9 - 1)] + $this->endAttributes); }, 155 => function ($stackPos) { $this->semValue = new Stmt\Declare_($this->semStack[$stackPos - (5 - 3)], $this->semStack[$stackPos - (5 - 5)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); }, 156 => function ($stackPos) { $this->semValue = new Stmt\TryCatch($this->semStack[$stackPos - (6 - 3)], $this->semStack[$stackPos - (6 - 5)], $this->semStack[$stackPos - (6 - 6)], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes); $this->checkTryCatch($this->semValue); }, 157 => function ($stackPos) { $this->semValue = new Stmt\Throw_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 158 => function ($stackPos) { $this->semValue = new Stmt\Goto_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 159 => function ($stackPos) { $this->semValue = new Stmt\Label($this->semStack[$stackPos - (2 - 1)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 160 => function ($stackPos) { $this->semValue = new Stmt\Expression($this->semStack[$stackPos - (2 - 1)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 161 => function ($stackPos) { $this->semValue = array(); /* means: no statement */ }, 162 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 163 => function ($stackPos) { $startAttributes = $this->startAttributeStack[$stackPos - (1 - 1)]; if (isset($startAttributes['comments'])) { $this->semValue = new Stmt\Nop($startAttributes + $this->endAttributes); } else { $this->semValue = null; } if ($this->semValue === null) { $this->semValue = array(); } /* means: no statement */ }, 164 => function ($stackPos) { $this->semValue = array(); }, 165 => function ($stackPos) { $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; $this->semValue = $this->semStack[$stackPos - (2 - 1)]; }, 166 => function ($stackPos) { $this->semValue = new Stmt\Catch_(array($this->semStack[$stackPos - (8 - 3)]), $this->semStack[$stackPos - (8 - 4)], $this->semStack[$stackPos - (8 - 7)], $this->startAttributeStack[$stackPos - (8 - 1)] + $this->endAttributes); }, 167 => function ($stackPos) { $this->semValue = null; }, 168 => function ($stackPos) { $this->semValue = new Stmt\Finally_($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 169 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); }, 170 => function ($stackPos) { $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; $this->semValue = $this->semStack[$stackPos - (3 - 1)]; }, 171 => function ($stackPos) { $this->semValue = \false; }, 172 => function ($stackPos) { $this->semValue = \true; }, 173 => function ($stackPos) { $this->semValue = \false; }, 174 => function ($stackPos) { $this->semValue = \true; }, 175 => function ($stackPos) { $this->semValue = \false; }, 176 => function ($stackPos) { $this->semValue = \true; }, 177 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 178 => function ($stackPos) { $this->semValue = new Node\Identifier($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 179 => function ($stackPos) { $this->semValue = new Stmt\Function_($this->semStack[$stackPos - (10 - 3)], ['byRef' => $this->semStack[$stackPos - (10 - 2)], 'params' => $this->semStack[$stackPos - (10 - 5)], 'returnType' => $this->semStack[$stackPos - (10 - 7)], 'stmts' => $this->semStack[$stackPos - (10 - 9)]], $this->startAttributeStack[$stackPos - (10 - 1)] + $this->endAttributes); }, 180 => function ($stackPos) { $this->semValue = new Stmt\Class_($this->semStack[$stackPos - (7 - 2)], ['type' => $this->semStack[$stackPos - (7 - 1)], 'extends' => $this->semStack[$stackPos - (7 - 3)], 'implements' => $this->semStack[$stackPos - (7 - 4)], 'stmts' => $this->semStack[$stackPos - (7 - 6)]], $this->startAttributeStack[$stackPos - (7 - 1)] + $this->endAttributes); $this->checkClass($this->semValue, $stackPos - (7 - 2)); }, 181 => function ($stackPos) { $this->semValue = new Stmt\Interface_($this->semStack[$stackPos - (6 - 2)], ['extends' => $this->semStack[$stackPos - (6 - 3)], 'stmts' => $this->semStack[$stackPos - (6 - 5)]], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes); $this->checkInterface($this->semValue, $stackPos - (6 - 2)); }, 182 => function ($stackPos) { $this->semValue = new Stmt\Trait_($this->semStack[$stackPos - (5 - 2)], ['stmts' => $this->semStack[$stackPos - (5 - 4)]], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); }, 183 => function ($stackPos) { $this->semValue = 0; }, 184 => function ($stackPos) { $this->semValue = Stmt\Class_::MODIFIER_ABSTRACT; }, 185 => function ($stackPos) { $this->semValue = Stmt\Class_::MODIFIER_FINAL; }, 186 => function ($stackPos) { $this->semValue = null; }, 187 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (2 - 2)]; }, 188 => function ($stackPos) { $this->semValue = array(); }, 189 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (2 - 2)]; }, 190 => function ($stackPos) { $this->semValue = array(); }, 191 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (2 - 2)]; }, 192 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); }, 193 => function ($stackPos) { $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; $this->semValue = $this->semStack[$stackPos - (3 - 1)]; }, 194 => function ($stackPos) { $this->semValue = \is_array($this->semStack[$stackPos - (1 - 1)]) ? $this->semStack[$stackPos - (1 - 1)] : array($this->semStack[$stackPos - (1 - 1)]); }, 195 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (4 - 2)]; }, 196 => function ($stackPos) { $this->semValue = \is_array($this->semStack[$stackPos - (1 - 1)]) ? $this->semStack[$stackPos - (1 - 1)] : array($this->semStack[$stackPos - (1 - 1)]); }, 197 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (4 - 2)]; }, 198 => function ($stackPos) { $this->semValue = \is_array($this->semStack[$stackPos - (1 - 1)]) ? $this->semStack[$stackPos - (1 - 1)] : array($this->semStack[$stackPos - (1 - 1)]); }, 199 => function ($stackPos) { $this->semValue = null; }, 200 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (4 - 2)]; }, 201 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); }, 202 => function ($stackPos) { $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; $this->semValue = $this->semStack[$stackPos - (3 - 1)]; }, 203 => function ($stackPos) { $this->semValue = new Stmt\DeclareDeclare($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 204 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (3 - 2)]; }, 205 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (4 - 3)]; }, 206 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (4 - 2)]; }, 207 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (5 - 3)]; }, 208 => function ($stackPos) { $this->semValue = array(); }, 209 => function ($stackPos) { $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; $this->semValue = $this->semStack[$stackPos - (2 - 1)]; }, 210 => function ($stackPos) { $this->semValue = new Stmt\Case_($this->semStack[$stackPos - (4 - 2)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 211 => function ($stackPos) { $this->semValue = new Stmt\Case_(null, $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 212 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 213 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 214 => function ($stackPos) { $this->semValue = \is_array($this->semStack[$stackPos - (1 - 1)]) ? $this->semStack[$stackPos - (1 - 1)] : array($this->semStack[$stackPos - (1 - 1)]); }, 215 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (4 - 2)]; }, 216 => function ($stackPos) { $this->semValue = array(); }, 217 => function ($stackPos) { $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; $this->semValue = $this->semStack[$stackPos - (2 - 1)]; }, 218 => function ($stackPos) { $this->semValue = new Stmt\ElseIf_($this->semStack[$stackPos - (3 - 2)], \is_array($this->semStack[$stackPos - (3 - 3)]) ? $this->semStack[$stackPos - (3 - 3)] : array($this->semStack[$stackPos - (3 - 3)]), $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 219 => function ($stackPos) { $this->semValue = array(); }, 220 => function ($stackPos) { $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; $this->semValue = $this->semStack[$stackPos - (2 - 1)]; }, 221 => function ($stackPos) { $this->semValue = new Stmt\ElseIf_($this->semStack[$stackPos - (4 - 2)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 222 => function ($stackPos) { $this->semValue = null; }, 223 => function ($stackPos) { $this->semValue = new Stmt\Else_(\is_array($this->semStack[$stackPos - (2 - 2)]) ? $this->semStack[$stackPos - (2 - 2)] : array($this->semStack[$stackPos - (2 - 2)]), $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 224 => function ($stackPos) { $this->semValue = null; }, 225 => function ($stackPos) { $this->semValue = new Stmt\Else_($this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 226 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos - (1 - 1)], \false); }, 227 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos - (2 - 2)], \true); }, 228 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos - (1 - 1)], \false); }, 229 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 230 => function ($stackPos) { $this->semValue = array(); }, 231 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); }, 232 => function ($stackPos) { $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; $this->semValue = $this->semStack[$stackPos - (3 - 1)]; }, 233 => function ($stackPos) { $this->semValue = new Node\Param($this->semStack[$stackPos - (4 - 4)], null, $this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 2)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); $this->checkParam($this->semValue); }, 234 => function ($stackPos) { $this->semValue = new Node\Param($this->semStack[$stackPos - (6 - 4)], $this->semStack[$stackPos - (6 - 6)], $this->semStack[$stackPos - (6 - 1)], $this->semStack[$stackPos - (6 - 2)], $this->semStack[$stackPos - (6 - 3)], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes); $this->checkParam($this->semValue); }, 235 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 236 => function ($stackPos) { $this->semValue = new Node\Identifier('array', $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 237 => function ($stackPos) { $this->semValue = new Node\Identifier('callable', $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 238 => function ($stackPos) { $this->semValue = null; }, 239 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 240 => function ($stackPos) { $this->semValue = null; }, 241 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (2 - 2)]; }, 242 => function ($stackPos) { $this->semValue = array(); }, 243 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (3 - 2)]; }, 244 => function ($stackPos) { $this->semValue = array(new Node\Arg($this->semStack[$stackPos - (3 - 2)], \false, \false, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes)); }, 245 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); }, 246 => function ($stackPos) { $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; $this->semValue = $this->semStack[$stackPos - (3 - 1)]; }, 247 => function ($stackPos) { $this->semValue = new Node\Arg($this->semStack[$stackPos - (1 - 1)], \false, \false, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 248 => function ($stackPos) { $this->semValue = new Node\Arg($this->semStack[$stackPos - (2 - 2)], \true, \false, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 249 => function ($stackPos) { $this->semValue = new Node\Arg($this->semStack[$stackPos - (2 - 2)], \false, \true, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 250 => function ($stackPos) { $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; $this->semValue = $this->semStack[$stackPos - (3 - 1)]; }, 251 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); }, 252 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 253 => function ($stackPos) { $this->semValue = new Expr\Variable($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 254 => function ($stackPos) { $this->semValue = new Expr\Variable($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 255 => function ($stackPos) { $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; $this->semValue = $this->semStack[$stackPos - (3 - 1)]; }, 256 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); }, 257 => function ($stackPos) { $this->semValue = new Stmt\StaticVar($this->semStack[$stackPos - (1 - 1)], null, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 258 => function ($stackPos) { $this->semValue = new Stmt\StaticVar($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 259 => function ($stackPos) { if ($this->semStack[$stackPos - (2 - 2)] !== null) { $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; $this->semValue = $this->semStack[$stackPos - (2 - 1)]; } }, 260 => function ($stackPos) { $this->semValue = array(); }, 261 => function ($stackPos) { $startAttributes = $this->lookaheadStartAttributes; if (isset($startAttributes['comments'])) { $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); } else { $nop = null; } if ($nop !== null) { $this->semStack[$stackPos - (1 - 1)][] = $nop; } $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 262 => function ($stackPos) { $this->semValue = new Stmt\Property($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); $this->checkProperty($this->semValue, $stackPos - (3 - 1)); }, 263 => function ($stackPos) { $this->semValue = new Stmt\ClassConst($this->semStack[$stackPos - (3 - 2)], 0, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 264 => function ($stackPos) { $this->semValue = new Stmt\ClassMethod($this->semStack[$stackPos - (9 - 4)], ['type' => $this->semStack[$stackPos - (9 - 1)], 'byRef' => $this->semStack[$stackPos - (9 - 3)], 'params' => $this->semStack[$stackPos - (9 - 6)], 'returnType' => $this->semStack[$stackPos - (9 - 8)], 'stmts' => $this->semStack[$stackPos - (9 - 9)]], $this->startAttributeStack[$stackPos - (9 - 1)] + $this->endAttributes); $this->checkClassMethod($this->semValue, $stackPos - (9 - 1)); }, 265 => function ($stackPos) { $this->semValue = new Stmt\TraitUse($this->semStack[$stackPos - (3 - 2)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 266 => function ($stackPos) { $this->semValue = array(); }, 267 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (3 - 2)]; }, 268 => function ($stackPos) { $this->semValue = array(); }, 269 => function ($stackPos) { $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; $this->semValue = $this->semStack[$stackPos - (2 - 1)]; }, 270 => function ($stackPos) { $this->semValue = new Stmt\TraitUseAdaptation\Precedence($this->semStack[$stackPos - (4 - 1)][0], $this->semStack[$stackPos - (4 - 1)][1], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 271 => function ($stackPos) { $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos - (5 - 1)][0], $this->semStack[$stackPos - (5 - 1)][1], $this->semStack[$stackPos - (5 - 3)], $this->semStack[$stackPos - (5 - 4)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); }, 272 => function ($stackPos) { $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos - (4 - 1)][0], $this->semStack[$stackPos - (4 - 1)][1], $this->semStack[$stackPos - (4 - 3)], null, $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 273 => function ($stackPos) { $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos - (4 - 1)][0], $this->semStack[$stackPos - (4 - 1)][1], null, $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 274 => function ($stackPos) { $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos - (4 - 1)][0], $this->semStack[$stackPos - (4 - 1)][1], null, $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 275 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)]); }, 276 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 277 => function ($stackPos) { $this->semValue = array(null, $this->semStack[$stackPos - (1 - 1)]); }, 278 => function ($stackPos) { $this->semValue = null; }, 279 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (3 - 2)]; }, 280 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 281 => function ($stackPos) { $this->semValue = 0; }, 282 => function ($stackPos) { $this->semValue = 0; }, 283 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 284 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 285 => function ($stackPos) { $this->checkModifier($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)], $stackPos - (2 - 2)); $this->semValue = $this->semStack[$stackPos - (2 - 1)] | $this->semStack[$stackPos - (2 - 2)]; }, 286 => function ($stackPos) { $this->semValue = Stmt\Class_::MODIFIER_PUBLIC; }, 287 => function ($stackPos) { $this->semValue = Stmt\Class_::MODIFIER_PROTECTED; }, 288 => function ($stackPos) { $this->semValue = Stmt\Class_::MODIFIER_PRIVATE; }, 289 => function ($stackPos) { $this->semValue = Stmt\Class_::MODIFIER_STATIC; }, 290 => function ($stackPos) { $this->semValue = Stmt\Class_::MODIFIER_ABSTRACT; }, 291 => function ($stackPos) { $this->semValue = Stmt\Class_::MODIFIER_FINAL; }, 292 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); }, 293 => function ($stackPos) { $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; $this->semValue = $this->semStack[$stackPos - (3 - 1)]; }, 294 => function ($stackPos) { $this->semValue = new Node\VarLikeIdentifier(\substr($this->semStack[$stackPos - (1 - 1)], 1), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 295 => function ($stackPos) { $this->semValue = new Stmt\PropertyProperty($this->semStack[$stackPos - (1 - 1)], null, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 296 => function ($stackPos) { $this->semValue = new Stmt\PropertyProperty($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 297 => function ($stackPos) { $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; $this->semValue = $this->semStack[$stackPos - (3 - 1)]; }, 298 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); }, 299 => function ($stackPos) { $this->semValue = array(); }, 300 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 301 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 302 => function ($stackPos) { $this->semValue = new Expr\Assign($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 303 => function ($stackPos) { $this->semValue = new Expr\Assign($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 304 => function ($stackPos) { $this->semValue = new Expr\AssignRef($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 305 => function ($stackPos) { $this->semValue = new Expr\AssignRef($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 306 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 307 => function ($stackPos) { $this->semValue = new Expr\Clone_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 308 => function ($stackPos) { $this->semValue = new Expr\AssignOp\Plus($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 309 => function ($stackPos) { $this->semValue = new Expr\AssignOp\Minus($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 310 => function ($stackPos) { $this->semValue = new Expr\AssignOp\Mul($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 311 => function ($stackPos) { $this->semValue = new Expr\AssignOp\Div($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 312 => function ($stackPos) { $this->semValue = new Expr\AssignOp\Concat($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 313 => function ($stackPos) { $this->semValue = new Expr\AssignOp\Mod($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 314 => function ($stackPos) { $this->semValue = new Expr\AssignOp\BitwiseAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 315 => function ($stackPos) { $this->semValue = new Expr\AssignOp\BitwiseOr($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 316 => function ($stackPos) { $this->semValue = new Expr\AssignOp\BitwiseXor($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 317 => function ($stackPos) { $this->semValue = new Expr\AssignOp\ShiftLeft($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 318 => function ($stackPos) { $this->semValue = new Expr\AssignOp\ShiftRight($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 319 => function ($stackPos) { $this->semValue = new Expr\AssignOp\Pow($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 320 => function ($stackPos) { $this->semValue = new Expr\AssignOp\Coalesce($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 321 => function ($stackPos) { $this->semValue = new Expr\PostInc($this->semStack[$stackPos - (2 - 1)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 322 => function ($stackPos) { $this->semValue = new Expr\PreInc($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 323 => function ($stackPos) { $this->semValue = new Expr\PostDec($this->semStack[$stackPos - (2 - 1)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 324 => function ($stackPos) { $this->semValue = new Expr\PreDec($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 325 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\BooleanOr($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 326 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\BooleanAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 327 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\LogicalOr($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 328 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\LogicalAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 329 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\LogicalXor($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 330 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\BitwiseOr($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 331 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 332 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 333 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\BitwiseXor($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 334 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Concat($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 335 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Plus($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 336 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Minus($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 337 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Mul($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 338 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Div($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 339 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Mod($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 340 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\ShiftLeft($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 341 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\ShiftRight($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 342 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Pow($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 343 => function ($stackPos) { $this->semValue = new Expr\UnaryPlus($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 344 => function ($stackPos) { $this->semValue = new Expr\UnaryMinus($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 345 => function ($stackPos) { $this->semValue = new Expr\BooleanNot($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 346 => function ($stackPos) { $this->semValue = new Expr\BitwiseNot($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 347 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Identical($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 348 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\NotIdentical($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 349 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Equal($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 350 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\NotEqual($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 351 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Spaceship($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 352 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Smaller($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 353 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\SmallerOrEqual($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 354 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Greater($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 355 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\GreaterOrEqual($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 356 => function ($stackPos) { $this->semValue = new Expr\Instanceof_($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 357 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 358 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (3 - 2)]; }, 359 => function ($stackPos) { $this->semValue = new Expr\Ternary($this->semStack[$stackPos - (5 - 1)], $this->semStack[$stackPos - (5 - 3)], $this->semStack[$stackPos - (5 - 5)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); }, 360 => function ($stackPos) { $this->semValue = new Expr\Ternary($this->semStack[$stackPos - (4 - 1)], null, $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 361 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Coalesce($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 362 => function ($stackPos) { $this->semValue = new Expr\Isset_($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 363 => function ($stackPos) { $this->semValue = new Expr\Empty_($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 364 => function ($stackPos) { $this->semValue = new Expr\Include_($this->semStack[$stackPos - (2 - 2)], Expr\Include_::TYPE_INCLUDE, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 365 => function ($stackPos) { $this->semValue = new Expr\Include_($this->semStack[$stackPos - (2 - 2)], Expr\Include_::TYPE_INCLUDE_ONCE, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 366 => function ($stackPos) { $this->semValue = new Expr\Eval_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 367 => function ($stackPos) { $this->semValue = new Expr\Include_($this->semStack[$stackPos - (2 - 2)], Expr\Include_::TYPE_REQUIRE, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 368 => function ($stackPos) { $this->semValue = new Expr\Include_($this->semStack[$stackPos - (2 - 2)], Expr\Include_::TYPE_REQUIRE_ONCE, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 369 => function ($stackPos) { $this->semValue = new Expr\Cast\Int_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 370 => function ($stackPos) { $attrs = $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes; $attrs['kind'] = $this->getFloatCastKind($this->semStack[$stackPos - (2 - 1)]); $this->semValue = new Expr\Cast\Double($this->semStack[$stackPos - (2 - 2)], $attrs); }, 371 => function ($stackPos) { $this->semValue = new Expr\Cast\String_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 372 => function ($stackPos) { $this->semValue = new Expr\Cast\Array_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 373 => function ($stackPos) { $this->semValue = new Expr\Cast\Object_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 374 => function ($stackPos) { $this->semValue = new Expr\Cast\Bool_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 375 => function ($stackPos) { $this->semValue = new Expr\Cast\Unset_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 376 => function ($stackPos) { $attrs = $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes; $attrs['kind'] = \strtolower($this->semStack[$stackPos - (2 - 1)]) === 'exit' ? Expr\Exit_::KIND_EXIT : Expr\Exit_::KIND_DIE; $this->semValue = new Expr\Exit_($this->semStack[$stackPos - (2 - 2)], $attrs); }, 377 => function ($stackPos) { $this->semValue = new Expr\ErrorSuppress($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 378 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 379 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 380 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 381 => function ($stackPos) { $this->semValue = new Expr\ShellExec($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 382 => function ($stackPos) { $this->semValue = new Expr\Print_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 383 => function ($stackPos) { $this->semValue = new Expr\Yield_(null, null, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 384 => function ($stackPos) { $this->semValue = new Expr\YieldFrom($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 385 => function ($stackPos) { $this->semValue = new Expr\Closure(['static' => \false, 'byRef' => $this->semStack[$stackPos - (10 - 2)], 'params' => $this->semStack[$stackPos - (10 - 4)], 'uses' => $this->semStack[$stackPos - (10 - 6)], 'returnType' => $this->semStack[$stackPos - (10 - 7)], 'stmts' => $this->semStack[$stackPos - (10 - 9)]], $this->startAttributeStack[$stackPos - (10 - 1)] + $this->endAttributes); }, 386 => function ($stackPos) { $this->semValue = new Expr\Closure(['static' => \true, 'byRef' => $this->semStack[$stackPos - (11 - 3)], 'params' => $this->semStack[$stackPos - (11 - 5)], 'uses' => $this->semStack[$stackPos - (11 - 7)], 'returnType' => $this->semStack[$stackPos - (11 - 8)], 'stmts' => $this->semStack[$stackPos - (11 - 10)]], $this->startAttributeStack[$stackPos - (11 - 1)] + $this->endAttributes); }, 387 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (3 - 2)]; }, 388 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (3 - 2)]; }, 389 => function ($stackPos) { $this->semValue = new Expr\Yield_($this->semStack[$stackPos - (2 - 2)], null, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 390 => function ($stackPos) { $this->semValue = new Expr\Yield_($this->semStack[$stackPos - (4 - 4)], $this->semStack[$stackPos - (4 - 2)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 391 => function ($stackPos) { $attrs = $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes; $attrs['kind'] = Expr\Array_::KIND_LONG; $this->semValue = new Expr\Array_($this->semStack[$stackPos - (4 - 3)], $attrs); }, 392 => function ($stackPos) { $attrs = $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes; $attrs['kind'] = Expr\Array_::KIND_SHORT; $this->semValue = new Expr\Array_($this->semStack[$stackPos - (3 - 2)], $attrs); }, 393 => function ($stackPos) { $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 394 => function ($stackPos) { $this->semValue = new Expr\ArrayDimFetch(Scalar\String_::fromString($this->semStack[$stackPos - (4 - 1)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes), $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 395 => function ($stackPos) { $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 396 => function ($stackPos) { $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 397 => function ($stackPos) { $this->semValue = array(new Stmt\Class_(null, ['type' => 0, 'extends' => $this->semStack[$stackPos - (7 - 3)], 'implements' => $this->semStack[$stackPos - (7 - 4)], 'stmts' => $this->semStack[$stackPos - (7 - 6)]], $this->startAttributeStack[$stackPos - (7 - 1)] + $this->endAttributes), $this->semStack[$stackPos - (7 - 2)]); $this->checkClass($this->semValue[0], -1); }, 398 => function ($stackPos) { $this->semValue = new Expr\New_($this->semStack[$stackPos - (3 - 2)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 399 => function ($stackPos) { list($class, $ctorArgs) = $this->semStack[$stackPos - (2 - 2)]; $this->semValue = new Expr\New_($class, $ctorArgs, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 400 => function ($stackPos) { $this->semValue = array(); }, 401 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (4 - 3)]; }, 402 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); }, 403 => function ($stackPos) { $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; $this->semValue = $this->semStack[$stackPos - (3 - 1)]; }, 404 => function ($stackPos) { $this->semValue = new Expr\ClosureUse($this->semStack[$stackPos - (2 - 2)], $this->semStack[$stackPos - (2 - 1)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 405 => function ($stackPos) { $this->semValue = new Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 406 => function ($stackPos) { $this->semValue = new Expr\FuncCall($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 407 => function ($stackPos) { $this->semValue = new Expr\FuncCall($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 408 => function ($stackPos) { $this->semValue = new Expr\StaticCall($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 409 => function ($stackPos) { $this->semValue = new Expr\StaticCall($this->semStack[$stackPos - (6 - 1)], $this->semStack[$stackPos - (6 - 4)], $this->semStack[$stackPos - (6 - 6)], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes); }, 410 => function ($stackPos) { $this->semValue = $this->fixupPhp5StaticPropCall($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 411 => function ($stackPos) { $this->semValue = new Expr\FuncCall($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 412 => function ($stackPos) { $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 413 => function ($stackPos) { $this->semValue = new Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 414 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 415 => function ($stackPos) { $this->semValue = new Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 416 => function ($stackPos) { $this->semValue = new Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 417 => function ($stackPos) { $this->semValue = new Name\FullyQualified(\substr($this->semStack[$stackPos - (1 - 1)], 1), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 418 => function ($stackPos) { $this->semValue = new Name\Relative(\substr($this->semStack[$stackPos - (1 - 1)], 10), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 419 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 420 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 421 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 422 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 423 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 424 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 425 => function ($stackPos) { $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 426 => function ($stackPos) { $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 427 => function ($stackPos) { $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 428 => function ($stackPos) { $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 429 => function ($stackPos) { $this->semValue = null; }, 430 => function ($stackPos) { $this->semValue = null; }, 431 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 432 => function ($stackPos) { $this->semValue = array(); }, 433 => function ($stackPos) { $this->semValue = array(new Scalar\EncapsedStringPart(Scalar\String_::parseEscapeSequences($this->semStack[$stackPos - (1 - 1)], '`', \false), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes)); }, 434 => function ($stackPos) { foreach ($this->semStack[$stackPos - (1 - 1)] as $s) { if ($s instanceof Node\Scalar\EncapsedStringPart) { $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '`', \false); } } $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 435 => function ($stackPos) { $this->semValue = array(); }, 436 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 437 => function ($stackPos) { $this->semValue = $this->parseLNumber($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes, \true); }, 438 => function ($stackPos) { $this->semValue = Scalar\DNumber::fromString($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 439 => function ($stackPos) { $this->semValue = Scalar\String_::fromString($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes, \false); }, 440 => function ($stackPos) { $this->semValue = new Scalar\MagicConst\Line($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 441 => function ($stackPos) { $this->semValue = new Scalar\MagicConst\File($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 442 => function ($stackPos) { $this->semValue = new Scalar\MagicConst\Dir($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 443 => function ($stackPos) { $this->semValue = new Scalar\MagicConst\Class_($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 444 => function ($stackPos) { $this->semValue = new Scalar\MagicConst\Trait_($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 445 => function ($stackPos) { $this->semValue = new Scalar\MagicConst\Method($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 446 => function ($stackPos) { $this->semValue = new Scalar\MagicConst\Function_($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 447 => function ($stackPos) { $this->semValue = new Scalar\MagicConst\Namespace_($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 448 => function ($stackPos) { $this->semValue = $this->parseDocString($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 2)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes, $this->startAttributeStack[$stackPos - (3 - 3)] + $this->endAttributeStack[$stackPos - (3 - 3)], \false); }, 449 => function ($stackPos) { $this->semValue = $this->parseDocString($this->semStack[$stackPos - (2 - 1)], '', $this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes, $this->startAttributeStack[$stackPos - (2 - 2)] + $this->endAttributeStack[$stackPos - (2 - 2)], \false); }, 450 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 451 => function ($stackPos) { $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 452 => function ($stackPos) { $this->semValue = new Expr\ConstFetch($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 453 => function ($stackPos) { $this->semValue = new Expr\Array_($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 454 => function ($stackPos) { $this->semValue = new Expr\Array_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 455 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 456 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\BooleanOr($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 457 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\BooleanAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 458 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\LogicalOr($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 459 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\LogicalAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 460 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\LogicalXor($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 461 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\BitwiseOr($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 462 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 463 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 464 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\BitwiseXor($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 465 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Concat($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 466 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Plus($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 467 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Minus($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 468 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Mul($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 469 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Div($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 470 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Mod($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 471 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\ShiftLeft($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 472 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\ShiftRight($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 473 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Pow($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 474 => function ($stackPos) { $this->semValue = new Expr\UnaryPlus($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 475 => function ($stackPos) { $this->semValue = new Expr\UnaryMinus($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 476 => function ($stackPos) { $this->semValue = new Expr\BooleanNot($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 477 => function ($stackPos) { $this->semValue = new Expr\BitwiseNot($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 478 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Identical($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 479 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\NotIdentical($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 480 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Equal($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 481 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\NotEqual($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 482 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Smaller($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 483 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\SmallerOrEqual($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 484 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\Greater($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 485 => function ($stackPos) { $this->semValue = new Expr\BinaryOp\GreaterOrEqual($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 486 => function ($stackPos) { $this->semValue = new Expr\Ternary($this->semStack[$stackPos - (5 - 1)], $this->semStack[$stackPos - (5 - 3)], $this->semStack[$stackPos - (5 - 5)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); }, 487 => function ($stackPos) { $this->semValue = new Expr\Ternary($this->semStack[$stackPos - (4 - 1)], null, $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 488 => function ($stackPos) { $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 489 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (3 - 2)]; }, 490 => function ($stackPos) { $this->semValue = new Expr\ConstFetch($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 491 => function ($stackPos) { $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 492 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 493 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 494 => function ($stackPos) { $attrs = $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes; $attrs['kind'] = Scalar\String_::KIND_DOUBLE_QUOTED; foreach ($this->semStack[$stackPos - (3 - 2)] as $s) { if ($s instanceof Node\Scalar\EncapsedStringPart) { $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '"', \true); } } $this->semValue = new Scalar\Encapsed($this->semStack[$stackPos - (3 - 2)], $attrs); }, 495 => function ($stackPos) { $this->semValue = $this->parseDocString($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 2)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes, $this->startAttributeStack[$stackPos - (3 - 3)] + $this->endAttributeStack[$stackPos - (3 - 3)], \true); }, 496 => function ($stackPos) { $this->semValue = array(); }, 497 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (2 - 1)]; }, 498 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 499 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 500 => function ($stackPos) { $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; $this->semValue = $this->semStack[$stackPos - (3 - 1)]; }, 501 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); }, 502 => function ($stackPos) { $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (3 - 3)], $this->semStack[$stackPos - (3 - 1)], \false, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 503 => function ($stackPos) { $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (1 - 1)], null, \false, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 504 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 505 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 506 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 507 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 508 => function ($stackPos) { $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (6 - 2)], $this->semStack[$stackPos - (6 - 5)], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes); }, 509 => function ($stackPos) { $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 510 => function ($stackPos) { $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 511 => function ($stackPos) { $this->semValue = new Expr\MethodCall($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 512 => function ($stackPos) { $this->semValue = new Expr\FuncCall($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 513 => function ($stackPos) { $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 514 => function ($stackPos) { $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 515 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 516 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (3 - 2)]; }, 517 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 518 => function ($stackPos) { $this->semValue = new Expr\Variable($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 519 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 520 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 521 => function ($stackPos) { $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 522 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 523 => function ($stackPos) { $var = \substr($this->semStack[$stackPos - (1 - 1)], 1); $this->semValue = \is_string($var) ? new Node\VarLikeIdentifier($var, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes) : $var; }, 524 => function ($stackPos) { $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 525 => function ($stackPos) { $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos - (6 - 1)], $this->semStack[$stackPos - (6 - 5)], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes); }, 526 => function ($stackPos) { $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 527 => function ($stackPos) { $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 528 => function ($stackPos) { $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 529 => function ($stackPos) { $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 530 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 531 => function ($stackPos) { $this->semValue = new Expr\Variable($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 532 => function ($stackPos) { $this->semValue = null; }, 533 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 534 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 535 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (3 - 2)]; }, 536 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 537 => function ($stackPos) { $this->semValue = new Expr\Error($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); $this->errorState = 2; }, 538 => function ($stackPos) { $this->semValue = new Expr\List_($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 539 => function ($stackPos) { $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; $this->semValue = $this->semStack[$stackPos - (3 - 1)]; }, 540 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); }, 541 => function ($stackPos) { $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (1 - 1)], null, \false, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 542 => function ($stackPos) { $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (1 - 1)], null, \false, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 543 => function ($stackPos) { $this->semValue = null; }, 544 => function ($stackPos) { $this->semValue = array(); }, 545 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (2 - 1)]; }, 546 => function ($stackPos) { $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; $this->semValue = $this->semStack[$stackPos - (3 - 1)]; }, 547 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); }, 548 => function ($stackPos) { $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (3 - 3)], $this->semStack[$stackPos - (3 - 1)], \false, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 549 => function ($stackPos) { $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (1 - 1)], null, \false, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 550 => function ($stackPos) { $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (4 - 4)], $this->semStack[$stackPos - (4 - 1)], \true, $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 551 => function ($stackPos) { $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (2 - 2)], null, \true, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 552 => function ($stackPos) { $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (2 - 2)], null, \false, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes, \true, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); }, 553 => function ($stackPos) { $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; $this->semValue = $this->semStack[$stackPos - (2 - 1)]; }, 554 => function ($stackPos) { $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; $this->semValue = $this->semStack[$stackPos - (2 - 1)]; }, 555 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); }, 556 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)]); }, 557 => function ($stackPos) { $this->semValue = new Scalar\EncapsedStringPart($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 558 => function ($stackPos) { $this->semValue = new Expr\Variable($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 559 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }, 560 => function ($stackPos) { $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); }, 561 => function ($stackPos) { $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 562 => function ($stackPos) { $this->semValue = new Expr\Variable($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 563 => function ($stackPos) { $this->semValue = new Expr\Variable($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); }, 564 => function ($stackPos) { $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (6 - 2)], $this->semStack[$stackPos - (6 - 4)], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes); }, 565 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (3 - 2)]; }, 566 => function ($stackPos) { $this->semValue = new Scalar\String_($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 567 => function ($stackPos) { $this->semValue = $this->parseNumString($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); }, 568 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos - (1 - 1)]; }]; } } parsers = $parsers; } public function parse(string $code, ErrorHandler $errorHandler = null) { if (null === $errorHandler) { $errorHandler = new ErrorHandler\Throwing(); } list($firstStmts, $firstError) = $this->tryParse($this->parsers[0], $errorHandler, $code); if ($firstError === null) { return $firstStmts; } for ($i = 1, $c = \count($this->parsers); $i < $c; ++$i) { list($stmts, $error) = $this->tryParse($this->parsers[$i], $errorHandler, $code); if ($error === null) { return $stmts; } } throw $firstError; } private function tryParse(Parser $parser, ErrorHandler $errorHandler, $code) { $stmts = null; $error = null; try { $stmts = $parser->parse($code, $errorHandler); } catch (Error $error) { } return [$stmts, $error]; } } rawMessage = $message; if (\is_array($attributes)) { $this->attributes = $attributes; } else { $this->attributes = ['startLine' => $attributes]; } $this->updateMessage(); } /** * Gets the error message * * @return string Error message */ public function getRawMessage() : string { return $this->rawMessage; } /** * Gets the line the error starts in. * * @return int Error start line */ public function getStartLine() : int { return $this->attributes['startLine'] ?? -1; } /** * Gets the line the error ends in. * * @return int Error end line */ public function getEndLine() : int { return $this->attributes['endLine'] ?? -1; } /** * Gets the attributes of the node/token the error occurred at. * * @return array */ public function getAttributes() : array { return $this->attributes; } /** * Sets the attributes of the node/token the error occurred at. * * @param array $attributes */ public function setAttributes(array $attributes) { $this->attributes = $attributes; $this->updateMessage(); } /** * Sets the line of the PHP file the error occurred in. * * @param string $message Error message */ public function setRawMessage(string $message) { $this->rawMessage = $message; $this->updateMessage(); } /** * Sets the line the error starts in. * * @param int $line Error start line */ public function setStartLine(int $line) { $this->attributes['startLine'] = $line; $this->updateMessage(); } /** * Returns whether the error has start and end column information. * * For column information enable the startFilePos and endFilePos in the lexer options. * * @return bool */ public function hasColumnInfo() : bool { return isset($this->attributes['startFilePos'], $this->attributes['endFilePos']); } /** * Gets the start column (1-based) into the line where the error started. * * @param string $code Source code of the file * @return int */ public function getStartColumn(string $code) : int { if (!$this->hasColumnInfo()) { throw new \RuntimeException('Error does not have column information'); } return $this->toColumn($code, $this->attributes['startFilePos']); } /** * Gets the end column (1-based) into the line where the error ended. * * @param string $code Source code of the file * @return int */ public function getEndColumn(string $code) : int { if (!$this->hasColumnInfo()) { throw new \RuntimeException('Error does not have column information'); } return $this->toColumn($code, $this->attributes['endFilePos']); } /** * Formats message including line and column information. * * @param string $code Source code associated with the error, for calculation of the columns * * @return string Formatted message */ public function getMessageWithColumnInfo(string $code) : string { return \sprintf('%s from %d:%d to %d:%d', $this->getRawMessage(), $this->getStartLine(), $this->getStartColumn($code), $this->getEndLine(), $this->getEndColumn($code)); } /** * Converts a file offset into a column. * * @param string $code Source code that $pos indexes into * @param int $pos 0-based position in $code * * @return int 1-based column (relative to start of line) */ private function toColumn(string $code, int $pos) : int { if ($pos > \strlen($code)) { throw new \RuntimeException('Invalid position information'); } $lineStartPos = \strrpos($code, "\n", $pos - \strlen($code)); if (\false === $lineStartPos) { $lineStartPos = -1; } return $pos - $lineStartPos; } /** * Updates the exception message after a change to rawMessage or rawLine. */ protected function updateMessage() { $this->message = $this->rawMessage; if (-1 === $this->getStartLine()) { $this->message .= ' on unknown line'; } else { $this->message .= ' on line ' . $this->getStartLine(); } } } $node->getAttribute('parent'). */ final class ParentConnectingVisitor extends NodeVisitorAbstract { /** * @var Node[] */ private $stack = []; public function beforeTraverse(array $nodes) { $this->stack = []; } public function enterNode(Node $node) { if (!empty($this->stack)) { $node->setAttribute('parent', $this->stack[count($this->stack) - 1]); } $this->stack[] = $node; } public function leaveNode(Node $node) { array_pop($this->stack); } } setAttribute('origNode', $origNode); return $node; } } $node->getAttribute('parent'), the previous * node can be accessed through $node->getAttribute('previous'), * and the next node can be accessed through $node->getAttribute('next'). */ final class NodeConnectingVisitor extends NodeVisitorAbstract { /** * @var Node[] */ private $stack = []; /** * @var ?Node */ private $previous; public function beforeTraverse(array $nodes) { $this->stack = []; $this->previous = null; } public function enterNode(Node $node) { if (!empty($this->stack)) { $node->setAttribute('parent', $this->stack[\count($this->stack) - 1]); } if ($this->previous !== null && $this->previous->getAttribute('parent') === $node->getAttribute('parent')) { $node->setAttribute('previous', $this->previous); $this->previous->setAttribute('next', $node); } $this->stack[] = $node; } public function leaveNode(Node $node) { $this->previous = $node; \array_pop($this->stack); } } filterCallback = $filterCallback; } /** * Get found node satisfying the filter callback. * * Returns null if no node satisfies the filter callback. * * @return null|Node Found node (or null if not found) */ public function getFoundNode() { return $this->foundNode; } public function beforeTraverse(array $nodes) { $this->foundNode = null; return null; } public function enterNode(Node $node) { $filterCallback = $this->filterCallback; if ($filterCallback($node)) { $this->foundNode = $node; return NodeTraverser::STOP_TRAVERSAL; } return null; } } filterCallback = $filterCallback; } /** * Get found nodes satisfying the filter callback. * * Nodes are returned in pre-order. * * @return Node[] Found nodes */ public function getFoundNodes() : array { return $this->foundNodes; } public function beforeTraverse(array $nodes) { $this->foundNodes = []; return null; } public function enterNode(Node $node) { $filterCallback = $this->filterCallback; if ($filterCallback($node)) { $this->foundNodes[] = $node; } return null; } } nameContext = new NameContext($errorHandler ?? new ErrorHandler\Throwing()); $this->preserveOriginalNames = $options['preserveOriginalNames'] ?? \false; $this->replaceNodes = $options['replaceNodes'] ?? \true; } /** * Get name resolution context. * * @return NameContext */ public function getNameContext() : NameContext { return $this->nameContext; } public function beforeTraverse(array $nodes) { $this->nameContext->startNamespace(); return null; } public function enterNode(Node $node) { if ($node instanceof Stmt\Namespace_) { $this->nameContext->startNamespace($node->name); } elseif ($node instanceof Stmt\Use_) { foreach ($node->uses as $use) { $this->addAlias($use, $node->type, null); } } elseif ($node instanceof Stmt\GroupUse) { foreach ($node->uses as $use) { $this->addAlias($use, $node->type, $node->prefix); } } elseif ($node instanceof Stmt\Class_) { if (null !== $node->extends) { $node->extends = $this->resolveClassName($node->extends); } foreach ($node->implements as &$interface) { $interface = $this->resolveClassName($interface); } $this->resolveAttrGroups($node); if (null !== $node->name) { $this->addNamespacedName($node); } } elseif ($node instanceof Stmt\Interface_) { foreach ($node->extends as &$interface) { $interface = $this->resolveClassName($interface); } $this->resolveAttrGroups($node); $this->addNamespacedName($node); } elseif ($node instanceof Stmt\Enum_) { foreach ($node->implements as &$interface) { $interface = $this->resolveClassName($interface); } $this->resolveAttrGroups($node); if (null !== $node->name) { $this->addNamespacedName($node); } } elseif ($node instanceof Stmt\Trait_) { $this->resolveAttrGroups($node); $this->addNamespacedName($node); } elseif ($node instanceof Stmt\Function_) { $this->resolveSignature($node); $this->resolveAttrGroups($node); $this->addNamespacedName($node); } elseif ($node instanceof Stmt\ClassMethod || $node instanceof Expr\Closure || $node instanceof Expr\ArrowFunction) { $this->resolveSignature($node); $this->resolveAttrGroups($node); } elseif ($node instanceof Stmt\Property) { if (null !== $node->type) { $node->type = $this->resolveType($node->type); } $this->resolveAttrGroups($node); } elseif ($node instanceof Stmt\Const_) { foreach ($node->consts as $const) { $this->addNamespacedName($const); } } else { if ($node instanceof Stmt\ClassConst) { $this->resolveAttrGroups($node); } else { if ($node instanceof Stmt\EnumCase) { $this->resolveAttrGroups($node); } elseif ($node instanceof Expr\StaticCall || $node instanceof Expr\StaticPropertyFetch || $node instanceof Expr\ClassConstFetch || $node instanceof Expr\New_ || $node instanceof Expr\Instanceof_) { if ($node->class instanceof Name) { $node->class = $this->resolveClassName($node->class); } } elseif ($node instanceof Stmt\Catch_) { foreach ($node->types as &$type) { $type = $this->resolveClassName($type); } } elseif ($node instanceof Expr\FuncCall) { if ($node->name instanceof Name) { $node->name = $this->resolveName($node->name, Stmt\Use_::TYPE_FUNCTION); } } elseif ($node instanceof Expr\ConstFetch) { $node->name = $this->resolveName($node->name, Stmt\Use_::TYPE_CONSTANT); } elseif ($node instanceof Stmt\TraitUse) { foreach ($node->traits as &$trait) { $trait = $this->resolveClassName($trait); } foreach ($node->adaptations as $adaptation) { if (null !== $adaptation->trait) { $adaptation->trait = $this->resolveClassName($adaptation->trait); } if ($adaptation instanceof Stmt\TraitUseAdaptation\Precedence) { foreach ($adaptation->insteadof as &$insteadof) { $insteadof = $this->resolveClassName($insteadof); } } } } } } return null; } private function addAlias(Stmt\UseUse $use, int $type, Name $prefix = null) { // Add prefix for group uses $name = $prefix ? Name::concat($prefix, $use->name) : $use->name; // Type is determined either by individual element or whole use declaration $type |= $use->type; $this->nameContext->addAlias($name, (string) $use->getAlias(), $type, $use->getAttributes()); } /** @param Stmt\Function_|Stmt\ClassMethod|Expr\Closure $node */ private function resolveSignature($node) { foreach ($node->params as $param) { $param->type = $this->resolveType($param->type); $this->resolveAttrGroups($param); } $node->returnType = $this->resolveType($node->returnType); } private function resolveType($node) { if ($node instanceof Name) { return $this->resolveClassName($node); } if ($node instanceof Node\NullableType) { $node->type = $this->resolveType($node->type); return $node; } if ($node instanceof Node\UnionType || $node instanceof Node\IntersectionType) { foreach ($node->types as &$type) { $type = $this->resolveType($type); } return $node; } return $node; } /** * Resolve name, according to name resolver options. * * @param Name $name Function or constant name to resolve * @param int $type One of Stmt\Use_::TYPE_* * * @return Name Resolved name, or original name with attribute */ protected function resolveName(Name $name, int $type) : Name { if (!$this->replaceNodes) { $resolvedName = $this->nameContext->getResolvedName($name, $type); if (null !== $resolvedName) { $name->setAttribute('resolvedName', $resolvedName); } else { $name->setAttribute('namespacedName', FullyQualified::concat($this->nameContext->getNamespace(), $name, $name->getAttributes())); } return $name; } if ($this->preserveOriginalNames) { // Save the original name $originalName = $name; $name = clone $originalName; $name->setAttribute('originalName', $originalName); } $resolvedName = $this->nameContext->getResolvedName($name, $type); if (null !== $resolvedName) { return $resolvedName; } // unqualified names inside a namespace cannot be resolved at compile-time // add the namespaced version of the name as an attribute $name->setAttribute('namespacedName', FullyQualified::concat($this->nameContext->getNamespace(), $name, $name->getAttributes())); return $name; } protected function resolveClassName(Name $name) { return $this->resolveName($name, Stmt\Use_::TYPE_NORMAL); } protected function addNamespacedName(Node $node) { $node->namespacedName = Name::concat($this->nameContext->getNamespace(), (string) $node->name); } protected function resolveAttrGroups(Node $node) { foreach ($node->attrGroups as $attrGroup) { foreach ($attrGroup->attrs as $attr) { $attr->name = $this->resolveClassName($attr->name); } } } } %pure_parser %expect 2 %tokens %% start: top_statement_list { $$ = $this->handleNamespaces($1); } ; top_statement_list_ex: top_statement_list_ex top_statement { pushNormalizing($1, $2); } | /* empty */ { init(); } ; top_statement_list: top_statement_list_ex { makeZeroLengthNop($nop, $this->lookaheadStartAttributes); if ($nop !== null) { $1[] = $nop; } $$ = $1; } ; ampersand: T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG | T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG ; reserved_non_modifiers: T_INCLUDE | T_INCLUDE_ONCE | T_EVAL | T_REQUIRE | T_REQUIRE_ONCE | T_LOGICAL_OR | T_LOGICAL_XOR | T_LOGICAL_AND | T_INSTANCEOF | T_NEW | T_CLONE | T_EXIT | T_IF | T_ELSEIF | T_ELSE | T_ENDIF | T_ECHO | T_DO | T_WHILE | T_ENDWHILE | T_FOR | T_ENDFOR | T_FOREACH | T_ENDFOREACH | T_DECLARE | T_ENDDECLARE | T_AS | T_TRY | T_CATCH | T_FINALLY | T_THROW | T_USE | T_INSTEADOF | T_GLOBAL | T_VAR | T_UNSET | T_ISSET | T_EMPTY | T_CONTINUE | T_GOTO | T_FUNCTION | T_CONST | T_RETURN | T_PRINT | T_YIELD | T_LIST | T_SWITCH | T_ENDSWITCH | T_CASE | T_DEFAULT | T_BREAK | T_ARRAY | T_CALLABLE | T_EXTENDS | T_IMPLEMENTS | T_NAMESPACE | T_TRAIT | T_INTERFACE | T_CLASS | T_CLASS_C | T_TRAIT_C | T_FUNC_C | T_METHOD_C | T_LINE | T_FILE | T_DIR | T_NS_C | T_HALT_COMPILER | T_FN | T_MATCH | T_ENUM ; semi_reserved: reserved_non_modifiers | T_STATIC | T_ABSTRACT | T_FINAL | T_PRIVATE | T_PROTECTED | T_PUBLIC | T_READONLY ; identifier_maybe_reserved: T_STRING { $$ = Node\Identifier[$1]; } | semi_reserved { $$ = Node\Identifier[$1]; } ; identifier_not_reserved: T_STRING { $$ = Node\Identifier[$1]; } ; reserved_non_modifiers_identifier: reserved_non_modifiers { $$ = Node\Identifier[$1]; } ; namespace_declaration_name: T_STRING { $$ = Name[$1]; } | semi_reserved { $$ = Name[$1]; } | T_NAME_QUALIFIED { $$ = Name[$1]; } ; namespace_name: T_STRING { $$ = Name[$1]; } | T_NAME_QUALIFIED { $$ = Name[$1]; } ; legacy_namespace_name: namespace_name { $$ = $1; } | T_NAME_FULLY_QUALIFIED { $$ = Name[substr($1, 1)]; } ; plain_variable: T_VARIABLE { $$ = Expr\Variable[parseVar($1)]; } ; semi: ';' { /* nothing */ } | error { /* nothing */ } ; no_comma: /* empty */ { /* nothing */ } | ',' { $this->emitError(new Error('A trailing comma is not allowed here', attributes())); } ; optional_comma: /* empty */ | ',' ; attribute_decl: class_name { $$ = Node\Attribute[$1, []]; } | class_name argument_list { $$ = Node\Attribute[$1, $2]; } ; attribute_group: attribute_decl { init($1); } | attribute_group ',' attribute_decl { push($1, $3); } ; attribute: T_ATTRIBUTE attribute_group optional_comma ']' { $$ = Node\AttributeGroup[$2]; } ; attributes: attribute { init($1); } | attributes attribute { push($1, $2); } ; optional_attributes: /* empty */ { $$ = []; } | attributes { $$ = $1; } ; top_statement: statement { $$ = $1; } | function_declaration_statement { $$ = $1; } | class_declaration_statement { $$ = $1; } | T_HALT_COMPILER { $$ = Stmt\HaltCompiler[$this->lexer->handleHaltCompiler()]; } | T_NAMESPACE namespace_declaration_name semi { $$ = Stmt\Namespace_[$2, null]; $$->setAttribute('kind', Stmt\Namespace_::KIND_SEMICOLON); $this->checkNamespace($$); } | T_NAMESPACE namespace_declaration_name '{' top_statement_list '}' { $$ = Stmt\Namespace_[$2, $4]; $$->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); $this->checkNamespace($$); } | T_NAMESPACE '{' top_statement_list '}' { $$ = Stmt\Namespace_[null, $3]; $$->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); $this->checkNamespace($$); } | T_USE use_declarations semi { $$ = Stmt\Use_[$2, Stmt\Use_::TYPE_NORMAL]; } | T_USE use_type use_declarations semi { $$ = Stmt\Use_[$3, $2]; } | group_use_declaration semi { $$ = $1; } | T_CONST constant_declaration_list semi { $$ = Stmt\Const_[$2]; } ; use_type: T_FUNCTION { $$ = Stmt\Use_::TYPE_FUNCTION; } | T_CONST { $$ = Stmt\Use_::TYPE_CONSTANT; } ; group_use_declaration: T_USE use_type legacy_namespace_name T_NS_SEPARATOR '{' unprefixed_use_declarations '}' { $$ = Stmt\GroupUse[$3, $6, $2]; } | T_USE legacy_namespace_name T_NS_SEPARATOR '{' inline_use_declarations '}' { $$ = Stmt\GroupUse[$2, $5, Stmt\Use_::TYPE_UNKNOWN]; } ; unprefixed_use_declarations: non_empty_unprefixed_use_declarations optional_comma { $$ = $1; } ; non_empty_unprefixed_use_declarations: non_empty_unprefixed_use_declarations ',' unprefixed_use_declaration { push($1, $3); } | unprefixed_use_declaration { init($1); } ; use_declarations: non_empty_use_declarations no_comma { $$ = $1; } ; non_empty_use_declarations: non_empty_use_declarations ',' use_declaration { push($1, $3); } | use_declaration { init($1); } ; inline_use_declarations: non_empty_inline_use_declarations optional_comma { $$ = $1; } ; non_empty_inline_use_declarations: non_empty_inline_use_declarations ',' inline_use_declaration { push($1, $3); } | inline_use_declaration { init($1); } ; unprefixed_use_declaration: namespace_name { $$ = Stmt\UseUse[$1, null, Stmt\Use_::TYPE_UNKNOWN]; $this->checkUseUse($$, #1); } | namespace_name T_AS identifier_not_reserved { $$ = Stmt\UseUse[$1, $3, Stmt\Use_::TYPE_UNKNOWN]; $this->checkUseUse($$, #3); } ; use_declaration: legacy_namespace_name { $$ = Stmt\UseUse[$1, null, Stmt\Use_::TYPE_UNKNOWN]; $this->checkUseUse($$, #1); } | legacy_namespace_name T_AS identifier_not_reserved { $$ = Stmt\UseUse[$1, $3, Stmt\Use_::TYPE_UNKNOWN]; $this->checkUseUse($$, #3); } ; inline_use_declaration: unprefixed_use_declaration { $$ = $1; $$->type = Stmt\Use_::TYPE_NORMAL; } | use_type unprefixed_use_declaration { $$ = $2; $$->type = $1; } ; constant_declaration_list: non_empty_constant_declaration_list no_comma { $$ = $1; } ; non_empty_constant_declaration_list: non_empty_constant_declaration_list ',' constant_declaration { push($1, $3); } | constant_declaration { init($1); } ; constant_declaration: identifier_not_reserved '=' expr { $$ = Node\Const_[$1, $3]; } ; class_const_list: non_empty_class_const_list no_comma { $$ = $1; } ; non_empty_class_const_list: non_empty_class_const_list ',' class_const { push($1, $3); } | class_const { init($1); } ; class_const: identifier_maybe_reserved '=' expr { $$ = Node\Const_[$1, $3]; } ; inner_statement_list_ex: inner_statement_list_ex inner_statement { pushNormalizing($1, $2); } | /* empty */ { init(); } ; inner_statement_list: inner_statement_list_ex { makeZeroLengthNop($nop, $this->lookaheadStartAttributes); if ($nop !== null) { $1[] = $nop; } $$ = $1; } ; inner_statement: statement { $$ = $1; } | function_declaration_statement { $$ = $1; } | class_declaration_statement { $$ = $1; } | T_HALT_COMPILER { throw new Error('__HALT_COMPILER() can only be used from the outermost scope', attributes()); } ; non_empty_statement: '{' inner_statement_list '}' { if ($2) { $$ = $2; prependLeadingComments($$); } else { makeNop($$, $this->startAttributeStack[#1], $this->endAttributes); if (null === $$) { $$ = array(); } } } | T_IF '(' expr ')' statement elseif_list else_single { $$ = Stmt\If_[$3, ['stmts' => toArray($5), 'elseifs' => $6, 'else' => $7]]; } | T_IF '(' expr ')' ':' inner_statement_list new_elseif_list new_else_single T_ENDIF ';' { $$ = Stmt\If_[$3, ['stmts' => $6, 'elseifs' => $7, 'else' => $8]]; } | T_WHILE '(' expr ')' while_statement { $$ = Stmt\While_[$3, $5]; } | T_DO statement T_WHILE '(' expr ')' ';' { $$ = Stmt\Do_ [$5, toArray($2)]; } | T_FOR '(' for_expr ';' for_expr ';' for_expr ')' for_statement { $$ = Stmt\For_[['init' => $3, 'cond' => $5, 'loop' => $7, 'stmts' => $9]]; } | T_SWITCH '(' expr ')' switch_case_list { $$ = Stmt\Switch_[$3, $5]; } | T_BREAK optional_expr semi { $$ = Stmt\Break_[$2]; } | T_CONTINUE optional_expr semi { $$ = Stmt\Continue_[$2]; } | T_RETURN optional_expr semi { $$ = Stmt\Return_[$2]; } | T_GLOBAL global_var_list semi { $$ = Stmt\Global_[$2]; } | T_STATIC static_var_list semi { $$ = Stmt\Static_[$2]; } | T_ECHO expr_list_forbid_comma semi { $$ = Stmt\Echo_[$2]; } | T_INLINE_HTML { $$ = Stmt\InlineHTML[$1]; } | expr semi { $e = $1; if ($e instanceof Expr\Throw_) { // For backwards-compatibility reasons, convert throw in statement position into // Stmt\Throw_ rather than Stmt\Expression(Expr\Throw_). $$ = Stmt\Throw_[$e->expr]; } else { $$ = Stmt\Expression[$e]; } } | T_UNSET '(' variables_list ')' semi { $$ = Stmt\Unset_[$3]; } | T_FOREACH '(' expr T_AS foreach_variable ')' foreach_statement { $$ = Stmt\Foreach_[$3, $5[0], ['keyVar' => null, 'byRef' => $5[1], 'stmts' => $7]]; } | T_FOREACH '(' expr T_AS variable T_DOUBLE_ARROW foreach_variable ')' foreach_statement { $$ = Stmt\Foreach_[$3, $7[0], ['keyVar' => $5, 'byRef' => $7[1], 'stmts' => $9]]; } | T_FOREACH '(' expr error ')' foreach_statement { $$ = Stmt\Foreach_[$3, new Expr\Error(stackAttributes(#4)), ['stmts' => $6]]; } | T_DECLARE '(' declare_list ')' declare_statement { $$ = Stmt\Declare_[$3, $5]; } | T_TRY '{' inner_statement_list '}' catches optional_finally { $$ = Stmt\TryCatch[$3, $5, $6]; $this->checkTryCatch($$); } | T_GOTO identifier_not_reserved semi { $$ = Stmt\Goto_[$2]; } | identifier_not_reserved ':' { $$ = Stmt\Label[$1]; } | error { $$ = array(); /* means: no statement */ } ; statement: non_empty_statement { $$ = $1; } | ';' { makeNop($$, $this->startAttributeStack[#1], $this->endAttributes); if ($$ === null) $$ = array(); /* means: no statement */ } ; catches: /* empty */ { init(); } | catches catch { push($1, $2); } ; name_union: name { init($1); } | name_union '|' name { push($1, $3); } ; catch: T_CATCH '(' name_union optional_plain_variable ')' '{' inner_statement_list '}' { $$ = Stmt\Catch_[$3, $4, $7]; } ; optional_finally: /* empty */ { $$ = null; } | T_FINALLY '{' inner_statement_list '}' { $$ = Stmt\Finally_[$3]; } ; variables_list: non_empty_variables_list optional_comma { $$ = $1; } ; non_empty_variables_list: variable { init($1); } | non_empty_variables_list ',' variable { push($1, $3); } ; optional_ref: /* empty */ { $$ = false; } | ampersand { $$ = true; } ; optional_arg_ref: /* empty */ { $$ = false; } | T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG { $$ = true; } ; optional_ellipsis: /* empty */ { $$ = false; } | T_ELLIPSIS { $$ = true; } ; block_or_error: '{' inner_statement_list '}' { $$ = $2; } | error { $$ = []; } ; identifier_maybe_readonly: identifier_not_reserved { $$ = $1; } | T_READONLY { $$ = Node\Identifier[$1]; } ; function_declaration_statement: T_FUNCTION optional_ref identifier_maybe_readonly '(' parameter_list ')' optional_return_type block_or_error { $$ = Stmt\Function_[$3, ['byRef' => $2, 'params' => $5, 'returnType' => $7, 'stmts' => $8, 'attrGroups' => []]]; } | attributes T_FUNCTION optional_ref identifier_maybe_readonly '(' parameter_list ')' optional_return_type block_or_error { $$ = Stmt\Function_[$4, ['byRef' => $3, 'params' => $6, 'returnType' => $8, 'stmts' => $9, 'attrGroups' => $1]]; } ; class_declaration_statement: class_entry_type identifier_not_reserved extends_from implements_list '{' class_statement_list '}' { $$ = Stmt\Class_[$2, ['type' => $1, 'extends' => $3, 'implements' => $4, 'stmts' => $6, 'attrGroups' => []]]; $this->checkClass($$, #2); } | attributes class_entry_type identifier_not_reserved extends_from implements_list '{' class_statement_list '}' { $$ = Stmt\Class_[$3, ['type' => $2, 'extends' => $4, 'implements' => $5, 'stmts' => $7, 'attrGroups' => $1]]; $this->checkClass($$, #3); } | optional_attributes T_INTERFACE identifier_not_reserved interface_extends_list '{' class_statement_list '}' { $$ = Stmt\Interface_[$3, ['extends' => $4, 'stmts' => $6, 'attrGroups' => $1]]; $this->checkInterface($$, #3); } | optional_attributes T_TRAIT identifier_not_reserved '{' class_statement_list '}' { $$ = Stmt\Trait_[$3, ['stmts' => $5, 'attrGroups' => $1]]; } | optional_attributes T_ENUM identifier_not_reserved enum_scalar_type implements_list '{' class_statement_list '}' { $$ = Stmt\Enum_[$3, ['scalarType' => $4, 'implements' => $5, 'stmts' => $7, 'attrGroups' => $1]]; $this->checkEnum($$, #3); } ; enum_scalar_type: /* empty */ { $$ = null; } | ':' type { $$ = $2; } enum_case_expr: /* empty */ { $$ = null; } | '=' expr { $$ = $2; } ; class_entry_type: T_CLASS { $$ = 0; } | class_modifiers T_CLASS { $$ = $1; } ; class_modifiers: class_modifier { $$ = $1; } | class_modifiers class_modifier { $this->checkClassModifier($1, $2, #2); $$ = $1 | $2; } ; class_modifier: T_ABSTRACT { $$ = Stmt\Class_::MODIFIER_ABSTRACT; } | T_FINAL { $$ = Stmt\Class_::MODIFIER_FINAL; } | T_READONLY { $$ = Stmt\Class_::MODIFIER_READONLY; } ; extends_from: /* empty */ { $$ = null; } | T_EXTENDS class_name { $$ = $2; } ; interface_extends_list: /* empty */ { $$ = array(); } | T_EXTENDS class_name_list { $$ = $2; } ; implements_list: /* empty */ { $$ = array(); } | T_IMPLEMENTS class_name_list { $$ = $2; } ; class_name_list: non_empty_class_name_list no_comma { $$ = $1; } ; non_empty_class_name_list: class_name { init($1); } | non_empty_class_name_list ',' class_name { push($1, $3); } ; for_statement: statement { $$ = toArray($1); } | ':' inner_statement_list T_ENDFOR ';' { $$ = $2; } ; foreach_statement: statement { $$ = toArray($1); } | ':' inner_statement_list T_ENDFOREACH ';' { $$ = $2; } ; declare_statement: non_empty_statement { $$ = toArray($1); } | ';' { $$ = null; } | ':' inner_statement_list T_ENDDECLARE ';' { $$ = $2; } ; declare_list: non_empty_declare_list no_comma { $$ = $1; } ; non_empty_declare_list: declare_list_element { init($1); } | non_empty_declare_list ',' declare_list_element { push($1, $3); } ; declare_list_element: identifier_not_reserved '=' expr { $$ = Stmt\DeclareDeclare[$1, $3]; } ; switch_case_list: '{' case_list '}' { $$ = $2; } | '{' ';' case_list '}' { $$ = $3; } | ':' case_list T_ENDSWITCH ';' { $$ = $2; } | ':' ';' case_list T_ENDSWITCH ';' { $$ = $3; } ; case_list: /* empty */ { init(); } | case_list case { push($1, $2); } ; case: T_CASE expr case_separator inner_statement_list_ex { $$ = Stmt\Case_[$2, $4]; } | T_DEFAULT case_separator inner_statement_list_ex { $$ = Stmt\Case_[null, $3]; } ; case_separator: ':' | ';' ; match: T_MATCH '(' expr ')' '{' match_arm_list '}' { $$ = Expr\Match_[$3, $6]; } ; match_arm_list: /* empty */ { $$ = []; } | non_empty_match_arm_list optional_comma { $$ = $1; } ; non_empty_match_arm_list: match_arm { init($1); } | non_empty_match_arm_list ',' match_arm { push($1, $3); } ; match_arm: expr_list_allow_comma T_DOUBLE_ARROW expr { $$ = Node\MatchArm[$1, $3]; } | T_DEFAULT optional_comma T_DOUBLE_ARROW expr { $$ = Node\MatchArm[null, $4]; } ; while_statement: statement { $$ = toArray($1); } | ':' inner_statement_list T_ENDWHILE ';' { $$ = $2; } ; elseif_list: /* empty */ { init(); } | elseif_list elseif { push($1, $2); } ; elseif: T_ELSEIF '(' expr ')' statement { $$ = Stmt\ElseIf_[$3, toArray($5)]; } ; new_elseif_list: /* empty */ { init(); } | new_elseif_list new_elseif { push($1, $2); } ; new_elseif: T_ELSEIF '(' expr ')' ':' inner_statement_list { $$ = Stmt\ElseIf_[$3, $6]; } ; else_single: /* empty */ { $$ = null; } | T_ELSE statement { $$ = Stmt\Else_[toArray($2)]; } ; new_else_single: /* empty */ { $$ = null; } | T_ELSE ':' inner_statement_list { $$ = Stmt\Else_[$3]; } ; foreach_variable: variable { $$ = array($1, false); } | ampersand variable { $$ = array($2, true); } | list_expr { $$ = array($1, false); } | array_short_syntax { $$ = array($1, false); } ; parameter_list: non_empty_parameter_list optional_comma { $$ = $1; } | /* empty */ { $$ = array(); } ; non_empty_parameter_list: parameter { init($1); } | non_empty_parameter_list ',' parameter { push($1, $3); } ; optional_property_modifiers: /* empty */ { $$ = 0; } | optional_property_modifiers property_modifier { $this->checkModifier($1, $2, #2); $$ = $1 | $2; } ; property_modifier: T_PUBLIC { $$ = Stmt\Class_::MODIFIER_PUBLIC; } | T_PROTECTED { $$ = Stmt\Class_::MODIFIER_PROTECTED; } | T_PRIVATE { $$ = Stmt\Class_::MODIFIER_PRIVATE; } | T_READONLY { $$ = Stmt\Class_::MODIFIER_READONLY; } ; parameter: optional_attributes optional_property_modifiers optional_type_without_static optional_arg_ref optional_ellipsis plain_variable { $$ = new Node\Param($6, null, $3, $4, $5, attributes(), $2, $1); $this->checkParam($$); } | optional_attributes optional_property_modifiers optional_type_without_static optional_arg_ref optional_ellipsis plain_variable '=' expr { $$ = new Node\Param($6, $8, $3, $4, $5, attributes(), $2, $1); $this->checkParam($$); } | optional_attributes optional_property_modifiers optional_type_without_static optional_arg_ref optional_ellipsis error { $$ = new Node\Param(Expr\Error[], null, $3, $4, $5, attributes(), $2, $1); } ; type_expr: type { $$ = $1; } | '?' type { $$ = Node\NullableType[$2]; } | union_type { $$ = Node\UnionType[$1]; } | intersection_type { $$ = $1; } ; type: type_without_static { $$ = $1; } | T_STATIC { $$ = Node\Name['static']; } ; type_without_static: name { $$ = $this->handleBuiltinTypes($1); } | T_ARRAY { $$ = Node\Identifier['array']; } | T_CALLABLE { $$ = Node\Identifier['callable']; } ; union_type_element: type { $$ = $1; } | '(' intersection_type ')' { $$ = $2; } ; union_type: union_type_element '|' union_type_element { init($1, $3); } | union_type '|' union_type_element { push($1, $3); } ; union_type_without_static_element: type_without_static { $$ = $1; } | '(' intersection_type_without_static ')' { $$ = $2; } ; union_type_without_static: union_type_without_static_element '|' union_type_without_static_element { init($1, $3); } | union_type_without_static '|' union_type_without_static_element { push($1, $3); } ; intersection_type_list: type T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG type { init($1, $3); } | intersection_type_list T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG type { push($1, $3); } ; intersection_type: intersection_type_list { $$ = Node\IntersectionType[$1]; } ; intersection_type_without_static_list: type_without_static T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG type_without_static { init($1, $3); } | intersection_type_without_static_list T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG type_without_static { push($1, $3); } ; intersection_type_without_static: intersection_type_without_static_list { $$ = Node\IntersectionType[$1]; } ; type_expr_without_static: type_without_static { $$ = $1; } | '?' type_without_static { $$ = Node\NullableType[$2]; } | union_type_without_static { $$ = Node\UnionType[$1]; } | intersection_type_without_static { $$ = $1; } ; optional_type_without_static: /* empty */ { $$ = null; } | type_expr_without_static { $$ = $1; } ; optional_return_type: /* empty */ { $$ = null; } | ':' type_expr { $$ = $2; } | ':' error { $$ = null; } ; argument_list: '(' ')' { $$ = array(); } | '(' non_empty_argument_list optional_comma ')' { $$ = $2; } | '(' variadic_placeholder ')' { init($2); } ; variadic_placeholder: T_ELLIPSIS { $$ = Node\VariadicPlaceholder[]; } ; non_empty_argument_list: argument { init($1); } | non_empty_argument_list ',' argument { push($1, $3); } ; argument: expr { $$ = Node\Arg[$1, false, false]; } | ampersand variable { $$ = Node\Arg[$2, true, false]; } | T_ELLIPSIS expr { $$ = Node\Arg[$2, false, true]; } | identifier_maybe_reserved ':' expr { $$ = new Node\Arg($3, false, false, attributes(), $1); } ; global_var_list: non_empty_global_var_list no_comma { $$ = $1; } ; non_empty_global_var_list: non_empty_global_var_list ',' global_var { push($1, $3); } | global_var { init($1); } ; global_var: simple_variable { $$ = $1; } ; static_var_list: non_empty_static_var_list no_comma { $$ = $1; } ; non_empty_static_var_list: non_empty_static_var_list ',' static_var { push($1, $3); } | static_var { init($1); } ; static_var: plain_variable { $$ = Stmt\StaticVar[$1, null]; } | plain_variable '=' expr { $$ = Stmt\StaticVar[$1, $3]; } ; class_statement_list_ex: class_statement_list_ex class_statement { if ($2 !== null) { push($1, $2); } } | /* empty */ { init(); } ; class_statement_list: class_statement_list_ex { makeZeroLengthNop($nop, $this->lookaheadStartAttributes); if ($nop !== null) { $1[] = $nop; } $$ = $1; } ; class_statement: optional_attributes variable_modifiers optional_type_without_static property_declaration_list semi { $$ = new Stmt\Property($2, $4, attributes(), $3, $1); $this->checkProperty($$, #2); } | optional_attributes method_modifiers T_CONST class_const_list semi { $$ = new Stmt\ClassConst($4, $2, attributes(), $1); $this->checkClassConst($$, #2); } | optional_attributes method_modifiers T_FUNCTION optional_ref identifier_maybe_reserved '(' parameter_list ')' optional_return_type method_body { $$ = Stmt\ClassMethod[$5, ['type' => $2, 'byRef' => $4, 'params' => $7, 'returnType' => $9, 'stmts' => $10, 'attrGroups' => $1]]; $this->checkClassMethod($$, #2); } | T_USE class_name_list trait_adaptations { $$ = Stmt\TraitUse[$2, $3]; } | optional_attributes T_CASE identifier_maybe_reserved enum_case_expr semi { $$ = Stmt\EnumCase[$3, $4, $1]; } | error { $$ = null; /* will be skipped */ } ; trait_adaptations: ';' { $$ = array(); } | '{' trait_adaptation_list '}' { $$ = $2; } ; trait_adaptation_list: /* empty */ { init(); } | trait_adaptation_list trait_adaptation { push($1, $2); } ; trait_adaptation: trait_method_reference_fully_qualified T_INSTEADOF class_name_list ';' { $$ = Stmt\TraitUseAdaptation\Precedence[$1[0], $1[1], $3]; } | trait_method_reference T_AS member_modifier identifier_maybe_reserved ';' { $$ = Stmt\TraitUseAdaptation\Alias[$1[0], $1[1], $3, $4]; } | trait_method_reference T_AS member_modifier ';' { $$ = Stmt\TraitUseAdaptation\Alias[$1[0], $1[1], $3, null]; } | trait_method_reference T_AS identifier_not_reserved ';' { $$ = Stmt\TraitUseAdaptation\Alias[$1[0], $1[1], null, $3]; } | trait_method_reference T_AS reserved_non_modifiers_identifier ';' { $$ = Stmt\TraitUseAdaptation\Alias[$1[0], $1[1], null, $3]; } ; trait_method_reference_fully_qualified: name T_PAAMAYIM_NEKUDOTAYIM identifier_maybe_reserved { $$ = array($1, $3); } ; trait_method_reference: trait_method_reference_fully_qualified { $$ = $1; } | identifier_maybe_reserved { $$ = array(null, $1); } ; method_body: ';' /* abstract method */ { $$ = null; } | block_or_error { $$ = $1; } ; variable_modifiers: non_empty_member_modifiers { $$ = $1; } | T_VAR { $$ = 0; } ; method_modifiers: /* empty */ { $$ = 0; } | non_empty_member_modifiers { $$ = $1; } ; non_empty_member_modifiers: member_modifier { $$ = $1; } | non_empty_member_modifiers member_modifier { $this->checkModifier($1, $2, #2); $$ = $1 | $2; } ; member_modifier: T_PUBLIC { $$ = Stmt\Class_::MODIFIER_PUBLIC; } | T_PROTECTED { $$ = Stmt\Class_::MODIFIER_PROTECTED; } | T_PRIVATE { $$ = Stmt\Class_::MODIFIER_PRIVATE; } | T_STATIC { $$ = Stmt\Class_::MODIFIER_STATIC; } | T_ABSTRACT { $$ = Stmt\Class_::MODIFIER_ABSTRACT; } | T_FINAL { $$ = Stmt\Class_::MODIFIER_FINAL; } | T_READONLY { $$ = Stmt\Class_::MODIFIER_READONLY; } ; property_declaration_list: non_empty_property_declaration_list no_comma { $$ = $1; } ; non_empty_property_declaration_list: property_declaration { init($1); } | non_empty_property_declaration_list ',' property_declaration { push($1, $3); } ; property_decl_name: T_VARIABLE { $$ = Node\VarLikeIdentifier[parseVar($1)]; } ; property_declaration: property_decl_name { $$ = Stmt\PropertyProperty[$1, null]; } | property_decl_name '=' expr { $$ = Stmt\PropertyProperty[$1, $3]; } ; expr_list_forbid_comma: non_empty_expr_list no_comma { $$ = $1; } ; expr_list_allow_comma: non_empty_expr_list optional_comma { $$ = $1; } ; non_empty_expr_list: non_empty_expr_list ',' expr { push($1, $3); } | expr { init($1); } ; for_expr: /* empty */ { $$ = array(); } | expr_list_forbid_comma { $$ = $1; } ; expr: variable { $$ = $1; } | list_expr '=' expr { $$ = Expr\Assign[$1, $3]; } | array_short_syntax '=' expr { $$ = Expr\Assign[$1, $3]; } | variable '=' expr { $$ = Expr\Assign[$1, $3]; } | variable '=' ampersand variable { $$ = Expr\AssignRef[$1, $4]; } | new_expr { $$ = $1; } | match { $$ = $1; } | T_CLONE expr { $$ = Expr\Clone_[$2]; } | variable T_PLUS_EQUAL expr { $$ = Expr\AssignOp\Plus [$1, $3]; } | variable T_MINUS_EQUAL expr { $$ = Expr\AssignOp\Minus [$1, $3]; } | variable T_MUL_EQUAL expr { $$ = Expr\AssignOp\Mul [$1, $3]; } | variable T_DIV_EQUAL expr { $$ = Expr\AssignOp\Div [$1, $3]; } | variable T_CONCAT_EQUAL expr { $$ = Expr\AssignOp\Concat [$1, $3]; } | variable T_MOD_EQUAL expr { $$ = Expr\AssignOp\Mod [$1, $3]; } | variable T_AND_EQUAL expr { $$ = Expr\AssignOp\BitwiseAnd[$1, $3]; } | variable T_OR_EQUAL expr { $$ = Expr\AssignOp\BitwiseOr [$1, $3]; } | variable T_XOR_EQUAL expr { $$ = Expr\AssignOp\BitwiseXor[$1, $3]; } | variable T_SL_EQUAL expr { $$ = Expr\AssignOp\ShiftLeft [$1, $3]; } | variable T_SR_EQUAL expr { $$ = Expr\AssignOp\ShiftRight[$1, $3]; } | variable T_POW_EQUAL expr { $$ = Expr\AssignOp\Pow [$1, $3]; } | variable T_COALESCE_EQUAL expr { $$ = Expr\AssignOp\Coalesce [$1, $3]; } | variable T_INC { $$ = Expr\PostInc[$1]; } | T_INC variable { $$ = Expr\PreInc [$2]; } | variable T_DEC { $$ = Expr\PostDec[$1]; } | T_DEC variable { $$ = Expr\PreDec [$2]; } | expr T_BOOLEAN_OR expr { $$ = Expr\BinaryOp\BooleanOr [$1, $3]; } | expr T_BOOLEAN_AND expr { $$ = Expr\BinaryOp\BooleanAnd[$1, $3]; } | expr T_LOGICAL_OR expr { $$ = Expr\BinaryOp\LogicalOr [$1, $3]; } | expr T_LOGICAL_AND expr { $$ = Expr\BinaryOp\LogicalAnd[$1, $3]; } | expr T_LOGICAL_XOR expr { $$ = Expr\BinaryOp\LogicalXor[$1, $3]; } | expr '|' expr { $$ = Expr\BinaryOp\BitwiseOr [$1, $3]; } | expr T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG expr { $$ = Expr\BinaryOp\BitwiseAnd[$1, $3]; } | expr T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG expr { $$ = Expr\BinaryOp\BitwiseAnd[$1, $3]; } | expr '^' expr { $$ = Expr\BinaryOp\BitwiseXor[$1, $3]; } | expr '.' expr { $$ = Expr\BinaryOp\Concat [$1, $3]; } | expr '+' expr { $$ = Expr\BinaryOp\Plus [$1, $3]; } | expr '-' expr { $$ = Expr\BinaryOp\Minus [$1, $3]; } | expr '*' expr { $$ = Expr\BinaryOp\Mul [$1, $3]; } | expr '/' expr { $$ = Expr\BinaryOp\Div [$1, $3]; } | expr '%' expr { $$ = Expr\BinaryOp\Mod [$1, $3]; } | expr T_SL expr { $$ = Expr\BinaryOp\ShiftLeft [$1, $3]; } | expr T_SR expr { $$ = Expr\BinaryOp\ShiftRight[$1, $3]; } | expr T_POW expr { $$ = Expr\BinaryOp\Pow [$1, $3]; } | '+' expr %prec T_INC { $$ = Expr\UnaryPlus [$2]; } | '-' expr %prec T_INC { $$ = Expr\UnaryMinus[$2]; } | '!' expr { $$ = Expr\BooleanNot[$2]; } | '~' expr { $$ = Expr\BitwiseNot[$2]; } | expr T_IS_IDENTICAL expr { $$ = Expr\BinaryOp\Identical [$1, $3]; } | expr T_IS_NOT_IDENTICAL expr { $$ = Expr\BinaryOp\NotIdentical [$1, $3]; } | expr T_IS_EQUAL expr { $$ = Expr\BinaryOp\Equal [$1, $3]; } | expr T_IS_NOT_EQUAL expr { $$ = Expr\BinaryOp\NotEqual [$1, $3]; } | expr T_SPACESHIP expr { $$ = Expr\BinaryOp\Spaceship [$1, $3]; } | expr '<' expr { $$ = Expr\BinaryOp\Smaller [$1, $3]; } | expr T_IS_SMALLER_OR_EQUAL expr { $$ = Expr\BinaryOp\SmallerOrEqual[$1, $3]; } | expr '>' expr { $$ = Expr\BinaryOp\Greater [$1, $3]; } | expr T_IS_GREATER_OR_EQUAL expr { $$ = Expr\BinaryOp\GreaterOrEqual[$1, $3]; } | expr T_INSTANCEOF class_name_reference { $$ = Expr\Instanceof_[$1, $3]; } | '(' expr ')' { $$ = $2; } | expr '?' expr ':' expr { $$ = Expr\Ternary[$1, $3, $5]; } | expr '?' ':' expr { $$ = Expr\Ternary[$1, null, $4]; } | expr T_COALESCE expr { $$ = Expr\BinaryOp\Coalesce[$1, $3]; } | T_ISSET '(' expr_list_allow_comma ')' { $$ = Expr\Isset_[$3]; } | T_EMPTY '(' expr ')' { $$ = Expr\Empty_[$3]; } | T_INCLUDE expr { $$ = Expr\Include_[$2, Expr\Include_::TYPE_INCLUDE]; } | T_INCLUDE_ONCE expr { $$ = Expr\Include_[$2, Expr\Include_::TYPE_INCLUDE_ONCE]; } | T_EVAL '(' expr ')' { $$ = Expr\Eval_[$3]; } | T_REQUIRE expr { $$ = Expr\Include_[$2, Expr\Include_::TYPE_REQUIRE]; } | T_REQUIRE_ONCE expr { $$ = Expr\Include_[$2, Expr\Include_::TYPE_REQUIRE_ONCE]; } | T_INT_CAST expr { $$ = Expr\Cast\Int_ [$2]; } | T_DOUBLE_CAST expr { $attrs = attributes(); $attrs['kind'] = $this->getFloatCastKind($1); $$ = new Expr\Cast\Double($2, $attrs); } | T_STRING_CAST expr { $$ = Expr\Cast\String_ [$2]; } | T_ARRAY_CAST expr { $$ = Expr\Cast\Array_ [$2]; } | T_OBJECT_CAST expr { $$ = Expr\Cast\Object_ [$2]; } | T_BOOL_CAST expr { $$ = Expr\Cast\Bool_ [$2]; } | T_UNSET_CAST expr { $$ = Expr\Cast\Unset_ [$2]; } | T_EXIT exit_expr { $attrs = attributes(); $attrs['kind'] = strtolower($1) === 'exit' ? Expr\Exit_::KIND_EXIT : Expr\Exit_::KIND_DIE; $$ = new Expr\Exit_($2, $attrs); } | '@' expr { $$ = Expr\ErrorSuppress[$2]; } | scalar { $$ = $1; } | '`' backticks_expr '`' { $$ = Expr\ShellExec[$2]; } | T_PRINT expr { $$ = Expr\Print_[$2]; } | T_YIELD { $$ = Expr\Yield_[null, null]; } | T_YIELD expr { $$ = Expr\Yield_[$2, null]; } | T_YIELD expr T_DOUBLE_ARROW expr { $$ = Expr\Yield_[$4, $2]; } | T_YIELD_FROM expr { $$ = Expr\YieldFrom[$2]; } | T_THROW expr { $$ = Expr\Throw_[$2]; } | T_FN optional_ref '(' parameter_list ')' optional_return_type T_DOUBLE_ARROW expr %prec T_THROW { $$ = Expr\ArrowFunction[['static' => false, 'byRef' => $2, 'params' => $4, 'returnType' => $6, 'expr' => $8, 'attrGroups' => []]]; } | T_STATIC T_FN optional_ref '(' parameter_list ')' optional_return_type T_DOUBLE_ARROW expr %prec T_THROW { $$ = Expr\ArrowFunction[['static' => true, 'byRef' => $3, 'params' => $5, 'returnType' => $7, 'expr' => $9, 'attrGroups' => []]]; } | T_FUNCTION optional_ref '(' parameter_list ')' lexical_vars optional_return_type block_or_error { $$ = Expr\Closure[['static' => false, 'byRef' => $2, 'params' => $4, 'uses' => $6, 'returnType' => $7, 'stmts' => $8, 'attrGroups' => []]]; } | T_STATIC T_FUNCTION optional_ref '(' parameter_list ')' lexical_vars optional_return_type block_or_error { $$ = Expr\Closure[['static' => true, 'byRef' => $3, 'params' => $5, 'uses' => $7, 'returnType' => $8, 'stmts' => $9, 'attrGroups' => []]]; } | attributes T_FN optional_ref '(' parameter_list ')' optional_return_type T_DOUBLE_ARROW expr %prec T_THROW { $$ = Expr\ArrowFunction[['static' => false, 'byRef' => $3, 'params' => $5, 'returnType' => $7, 'expr' => $9, 'attrGroups' => $1]]; } | attributes T_STATIC T_FN optional_ref '(' parameter_list ')' optional_return_type T_DOUBLE_ARROW expr %prec T_THROW { $$ = Expr\ArrowFunction[['static' => true, 'byRef' => $4, 'params' => $6, 'returnType' => $8, 'expr' => $10, 'attrGroups' => $1]]; } | attributes T_FUNCTION optional_ref '(' parameter_list ')' lexical_vars optional_return_type block_or_error { $$ = Expr\Closure[['static' => false, 'byRef' => $3, 'params' => $5, 'uses' => $7, 'returnType' => $8, 'stmts' => $9, 'attrGroups' => $1]]; } | attributes T_STATIC T_FUNCTION optional_ref '(' parameter_list ')' lexical_vars optional_return_type block_or_error { $$ = Expr\Closure[['static' => true, 'byRef' => $4, 'params' => $6, 'uses' => $8, 'returnType' => $9, 'stmts' => $10, 'attrGroups' => $1]]; } ; anonymous_class: optional_attributes T_CLASS ctor_arguments extends_from implements_list '{' class_statement_list '}' { $$ = array(Stmt\Class_[null, ['type' => 0, 'extends' => $4, 'implements' => $5, 'stmts' => $7, 'attrGroups' => $1]], $3); $this->checkClass($$[0], -1); } ; new_expr: T_NEW class_name_reference ctor_arguments { $$ = Expr\New_[$2, $3]; } | T_NEW anonymous_class { list($class, $ctorArgs) = $2; $$ = Expr\New_[$class, $ctorArgs]; } ; lexical_vars: /* empty */ { $$ = array(); } | T_USE '(' lexical_var_list ')' { $$ = $3; } ; lexical_var_list: non_empty_lexical_var_list optional_comma { $$ = $1; } ; non_empty_lexical_var_list: lexical_var { init($1); } | non_empty_lexical_var_list ',' lexical_var { push($1, $3); } ; lexical_var: optional_ref plain_variable { $$ = Expr\ClosureUse[$2, $1]; } ; name_readonly: T_READONLY { $$ = Name[$1]; } ; function_call: name argument_list { $$ = Expr\FuncCall[$1, $2]; } | name_readonly argument_list { $$ = Expr\FuncCall[$1, $2]; } | callable_expr argument_list { $$ = Expr\FuncCall[$1, $2]; } | class_name_or_var T_PAAMAYIM_NEKUDOTAYIM member_name argument_list { $$ = Expr\StaticCall[$1, $3, $4]; } ; class_name: T_STATIC { $$ = Name[$1]; } | name { $$ = $1; } ; name: T_STRING { $$ = Name[$1]; } | T_NAME_QUALIFIED { $$ = Name[$1]; } | T_NAME_FULLY_QUALIFIED { $$ = Name\FullyQualified[substr($1, 1)]; } | T_NAME_RELATIVE { $$ = Name\Relative[substr($1, 10)]; } ; class_name_reference: class_name { $$ = $1; } | new_variable { $$ = $1; } | '(' expr ')' { $$ = $2; } | error { $$ = Expr\Error[]; $this->errorState = 2; } ; class_name_or_var: class_name { $$ = $1; } | fully_dereferencable { $$ = $1; } ; exit_expr: /* empty */ { $$ = null; } | '(' optional_expr ')' { $$ = $2; } ; backticks_expr: /* empty */ { $$ = array(); } | T_ENCAPSED_AND_WHITESPACE { $$ = array(Scalar\EncapsedStringPart[Scalar\String_::parseEscapeSequences($1, '`')]); } | encaps_list { parseEncapsed($1, '`', true); $$ = $1; } ; ctor_arguments: /* empty */ { $$ = array(); } | argument_list { $$ = $1; } ; constant: name { $$ = Expr\ConstFetch[$1]; } | T_LINE { $$ = Scalar\MagicConst\Line[]; } | T_FILE { $$ = Scalar\MagicConst\File[]; } | T_DIR { $$ = Scalar\MagicConst\Dir[]; } | T_CLASS_C { $$ = Scalar\MagicConst\Class_[]; } | T_TRAIT_C { $$ = Scalar\MagicConst\Trait_[]; } | T_METHOD_C { $$ = Scalar\MagicConst\Method[]; } | T_FUNC_C { $$ = Scalar\MagicConst\Function_[]; } | T_NS_C { $$ = Scalar\MagicConst\Namespace_[]; } ; class_constant: class_name_or_var T_PAAMAYIM_NEKUDOTAYIM identifier_maybe_reserved { $$ = Expr\ClassConstFetch[$1, $3]; } /* We interpret an isolated FOO:: as an unfinished class constant fetch. It could also be an unfinished static property fetch or unfinished scoped call. */ | class_name_or_var T_PAAMAYIM_NEKUDOTAYIM error { $$ = Expr\ClassConstFetch[$1, new Expr\Error(stackAttributes(#3))]; $this->errorState = 2; } ; array_short_syntax: '[' array_pair_list ']' { $attrs = attributes(); $attrs['kind'] = Expr\Array_::KIND_SHORT; $$ = new Expr\Array_($2, $attrs); } ; dereferencable_scalar: T_ARRAY '(' array_pair_list ')' { $attrs = attributes(); $attrs['kind'] = Expr\Array_::KIND_LONG; $$ = new Expr\Array_($3, $attrs); } | array_short_syntax { $$ = $1; } | T_CONSTANT_ENCAPSED_STRING { $$ = Scalar\String_::fromString($1, attributes()); } | '"' encaps_list '"' { $attrs = attributes(); $attrs['kind'] = Scalar\String_::KIND_DOUBLE_QUOTED; parseEncapsed($2, '"', true); $$ = new Scalar\Encapsed($2, $attrs); } ; scalar: T_LNUMBER { $$ = $this->parseLNumber($1, attributes()); } | T_DNUMBER { $$ = Scalar\DNumber::fromString($1, attributes()); } | dereferencable_scalar { $$ = $1; } | constant { $$ = $1; } | class_constant { $$ = $1; } | T_START_HEREDOC T_ENCAPSED_AND_WHITESPACE T_END_HEREDOC { $$ = $this->parseDocString($1, $2, $3, attributes(), stackAttributes(#3), true); } | T_START_HEREDOC T_END_HEREDOC { $$ = $this->parseDocString($1, '', $2, attributes(), stackAttributes(#2), true); } | T_START_HEREDOC encaps_list T_END_HEREDOC { $$ = $this->parseDocString($1, $2, $3, attributes(), stackAttributes(#3), true); } ; optional_expr: /* empty */ { $$ = null; } | expr { $$ = $1; } ; fully_dereferencable: variable { $$ = $1; } | '(' expr ')' { $$ = $2; } | dereferencable_scalar { $$ = $1; } | class_constant { $$ = $1; } ; array_object_dereferencable: fully_dereferencable { $$ = $1; } | constant { $$ = $1; } ; callable_expr: callable_variable { $$ = $1; } | '(' expr ')' { $$ = $2; } | dereferencable_scalar { $$ = $1; } ; callable_variable: simple_variable { $$ = $1; } | array_object_dereferencable '[' optional_expr ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } | array_object_dereferencable '{' expr '}' { $$ = Expr\ArrayDimFetch[$1, $3]; } | function_call { $$ = $1; } | array_object_dereferencable T_OBJECT_OPERATOR property_name argument_list { $$ = Expr\MethodCall[$1, $3, $4]; } | array_object_dereferencable T_NULLSAFE_OBJECT_OPERATOR property_name argument_list { $$ = Expr\NullsafeMethodCall[$1, $3, $4]; } ; optional_plain_variable: /* empty */ { $$ = null; } | plain_variable { $$ = $1; } ; variable: callable_variable { $$ = $1; } | static_member { $$ = $1; } | array_object_dereferencable T_OBJECT_OPERATOR property_name { $$ = Expr\PropertyFetch[$1, $3]; } | array_object_dereferencable T_NULLSAFE_OBJECT_OPERATOR property_name { $$ = Expr\NullsafePropertyFetch[$1, $3]; } ; simple_variable: plain_variable { $$ = $1; } | '$' '{' expr '}' { $$ = Expr\Variable[$3]; } | '$' simple_variable { $$ = Expr\Variable[$2]; } | '$' error { $$ = Expr\Variable[Expr\Error[]]; $this->errorState = 2; } ; static_member_prop_name: simple_variable { $var = $1->name; $$ = \is_string($var) ? Node\VarLikeIdentifier[$var] : $var; } ; static_member: class_name_or_var T_PAAMAYIM_NEKUDOTAYIM static_member_prop_name { $$ = Expr\StaticPropertyFetch[$1, $3]; } ; new_variable: simple_variable { $$ = $1; } | new_variable '[' optional_expr ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } | new_variable '{' expr '}' { $$ = Expr\ArrayDimFetch[$1, $3]; } | new_variable T_OBJECT_OPERATOR property_name { $$ = Expr\PropertyFetch[$1, $3]; } | new_variable T_NULLSAFE_OBJECT_OPERATOR property_name { $$ = Expr\NullsafePropertyFetch[$1, $3]; } | class_name T_PAAMAYIM_NEKUDOTAYIM static_member_prop_name { $$ = Expr\StaticPropertyFetch[$1, $3]; } | new_variable T_PAAMAYIM_NEKUDOTAYIM static_member_prop_name { $$ = Expr\StaticPropertyFetch[$1, $3]; } ; member_name: identifier_maybe_reserved { $$ = $1; } | '{' expr '}' { $$ = $2; } | simple_variable { $$ = $1; } ; property_name: identifier_not_reserved { $$ = $1; } | '{' expr '}' { $$ = $2; } | simple_variable { $$ = $1; } | error { $$ = Expr\Error[]; $this->errorState = 2; } ; list_expr: T_LIST '(' inner_array_pair_list ')' { $$ = Expr\List_[$3]; } ; array_pair_list: inner_array_pair_list { $$ = $1; $end = count($$)-1; if ($$[$end] === null) array_pop($$); } ; comma_or_error: ',' | error { /* do nothing -- prevent default action of $$=$1. See #551. */ } ; inner_array_pair_list: inner_array_pair_list comma_or_error array_pair { push($1, $3); } | array_pair { init($1); } ; array_pair: expr { $$ = Expr\ArrayItem[$1, null, false]; } | ampersand variable { $$ = Expr\ArrayItem[$2, null, true]; } | list_expr { $$ = Expr\ArrayItem[$1, null, false]; } | expr T_DOUBLE_ARROW expr { $$ = Expr\ArrayItem[$3, $1, false]; } | expr T_DOUBLE_ARROW ampersand variable { $$ = Expr\ArrayItem[$4, $1, true]; } | expr T_DOUBLE_ARROW list_expr { $$ = Expr\ArrayItem[$3, $1, false]; } | T_ELLIPSIS expr { $$ = Expr\ArrayItem[$2, null, false, attributes(), true]; } | /* empty */ { $$ = null; } ; encaps_list: encaps_list encaps_var { push($1, $2); } | encaps_list encaps_string_part { push($1, $2); } | encaps_var { init($1); } | encaps_string_part encaps_var { init($1, $2); } ; encaps_string_part: T_ENCAPSED_AND_WHITESPACE { $$ = Scalar\EncapsedStringPart[$1]; } ; encaps_str_varname: T_STRING_VARNAME { $$ = Expr\Variable[$1]; } ; encaps_var: plain_variable { $$ = $1; } | plain_variable '[' encaps_var_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } | plain_variable T_OBJECT_OPERATOR identifier_not_reserved { $$ = Expr\PropertyFetch[$1, $3]; } | plain_variable T_NULLSAFE_OBJECT_OPERATOR identifier_not_reserved { $$ = Expr\NullsafePropertyFetch[$1, $3]; } | T_DOLLAR_OPEN_CURLY_BRACES expr '}' { $$ = Expr\Variable[$2]; } | T_DOLLAR_OPEN_CURLY_BRACES T_STRING_VARNAME '}' { $$ = Expr\Variable[$2]; } | T_DOLLAR_OPEN_CURLY_BRACES encaps_str_varname '[' expr ']' '}' { $$ = Expr\ArrayDimFetch[$2, $4]; } | T_CURLY_OPEN variable '}' { $$ = $2; } ; encaps_var_offset: T_STRING { $$ = Scalar\String_[$1]; } | T_NUM_STRING { $$ = $this->parseNumString($1, attributes()); } | '-' T_NUM_STRING { $$ = $this->parseNumString('-' . $2, attributes()); } | plain_variable { $$ = $1; } ; %% semValue #semval($,%t) $this->semValue #semval(%n) $stackPos-(%l-%n) #semval(%n,%t) $stackPos-(%l-%n) namespace PhpParser\Parser; use PhpParser\Error; use PhpParser\Node; use PhpParser\Node\Expr; use PhpParser\Node\Name; use PhpParser\Node\Scalar; use PhpParser\Node\Stmt; #include; /* This is an automatically GENERATED file, which should not be manually edited. * Instead edit one of the following: * * the grammar files grammar/php5.y or grammar/php7.y * * the skeleton file grammar/parser.template * * the preprocessing script grammar/rebuildParsers.php */ class #(-p) extends \PhpParser\ParserAbstract { protected $tokenToSymbolMapSize = #(YYMAXLEX); protected $actionTableSize = #(YYLAST); protected $gotoTableSize = #(YYGLAST); protected $invalidSymbol = #(YYBADCH); protected $errorSymbol = #(YYINTERRTOK); protected $defaultAction = #(YYDEFAULT); protected $unexpectedTokenRule = #(YYUNEXPECTED); protected $YY2TBLSTATE = #(YY2TBLSTATE); protected $numNonLeafStates = #(YYNLSTATES); protected $symbolToName = array( #listvar terminals ); protected $tokenToSymbol = array( #listvar yytranslate ); protected $action = array( #listvar yyaction ); protected $actionCheck = array( #listvar yycheck ); protected $actionBase = array( #listvar yybase ); protected $actionDefault = array( #listvar yydefault ); protected $goto = array( #listvar yygoto ); protected $gotoCheck = array( #listvar yygcheck ); protected $gotoBase = array( #listvar yygbase ); protected $gotoDefault = array( #listvar yygdefault ); protected $ruleToNonTerminal = array( #listvar yylhs ); protected $ruleToLength = array( #listvar yylen ); #if -t protected $productions = array( #production-strings; ); #endif protected function initReduceCallbacks() { $this->reduceCallbacks = [ #reduce %n => function ($stackPos) { %b }, #noact %n => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, #endreduce ]; } } #tailcode; %pure_parser %expect 6 %tokens %% start: top_statement_list { $$ = $this->handleNamespaces($1); } ; top_statement_list_ex: top_statement_list_ex top_statement { pushNormalizing($1, $2); } | /* empty */ { init(); } ; top_statement_list: top_statement_list_ex { makeZeroLengthNop($nop, $this->lookaheadStartAttributes); if ($nop !== null) { $1[] = $nop; } $$ = $1; } ; ampersand: T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG | T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG ; reserved_non_modifiers: T_INCLUDE | T_INCLUDE_ONCE | T_EVAL | T_REQUIRE | T_REQUIRE_ONCE | T_LOGICAL_OR | T_LOGICAL_XOR | T_LOGICAL_AND | T_INSTANCEOF | T_NEW | T_CLONE | T_EXIT | T_IF | T_ELSEIF | T_ELSE | T_ENDIF | T_ECHO | T_DO | T_WHILE | T_ENDWHILE | T_FOR | T_ENDFOR | T_FOREACH | T_ENDFOREACH | T_DECLARE | T_ENDDECLARE | T_AS | T_TRY | T_CATCH | T_FINALLY | T_THROW | T_USE | T_INSTEADOF | T_GLOBAL | T_VAR | T_UNSET | T_ISSET | T_EMPTY | T_CONTINUE | T_GOTO | T_FUNCTION | T_CONST | T_RETURN | T_PRINT | T_YIELD | T_LIST | T_SWITCH | T_ENDSWITCH | T_CASE | T_DEFAULT | T_BREAK | T_ARRAY | T_CALLABLE | T_EXTENDS | T_IMPLEMENTS | T_NAMESPACE | T_TRAIT | T_INTERFACE | T_CLASS | T_CLASS_C | T_TRAIT_C | T_FUNC_C | T_METHOD_C | T_LINE | T_FILE | T_DIR | T_NS_C | T_HALT_COMPILER | T_FN | T_MATCH ; semi_reserved: reserved_non_modifiers | T_STATIC | T_ABSTRACT | T_FINAL | T_PRIVATE | T_PROTECTED | T_PUBLIC ; identifier_ex: T_STRING { $$ = Node\Identifier[$1]; } | semi_reserved { $$ = Node\Identifier[$1]; } ; identifier: T_STRING { $$ = Node\Identifier[$1]; } ; reserved_non_modifiers_identifier: reserved_non_modifiers { $$ = Node\Identifier[$1]; } ; namespace_name: T_STRING { $$ = Name[$1]; } | T_NAME_QUALIFIED { $$ = Name[$1]; } ; legacy_namespace_name: namespace_name { $$ = $1; } | T_NAME_FULLY_QUALIFIED { $$ = Name[substr($1, 1)]; } ; plain_variable: T_VARIABLE { $$ = Expr\Variable[parseVar($1)]; } ; top_statement: statement { $$ = $1; } | function_declaration_statement { $$ = $1; } | class_declaration_statement { $$ = $1; } | T_HALT_COMPILER { $$ = Stmt\HaltCompiler[$this->lexer->handleHaltCompiler()]; } | T_NAMESPACE namespace_name ';' { $$ = Stmt\Namespace_[$2, null]; $$->setAttribute('kind', Stmt\Namespace_::KIND_SEMICOLON); $this->checkNamespace($$); } | T_NAMESPACE namespace_name '{' top_statement_list '}' { $$ = Stmt\Namespace_[$2, $4]; $$->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); $this->checkNamespace($$); } | T_NAMESPACE '{' top_statement_list '}' { $$ = Stmt\Namespace_[null, $3]; $$->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); $this->checkNamespace($$); } | T_USE use_declarations ';' { $$ = Stmt\Use_[$2, Stmt\Use_::TYPE_NORMAL]; } | T_USE use_type use_declarations ';' { $$ = Stmt\Use_[$3, $2]; } | group_use_declaration ';' { $$ = $1; } | T_CONST constant_declaration_list ';' { $$ = Stmt\Const_[$2]; } ; use_type: T_FUNCTION { $$ = Stmt\Use_::TYPE_FUNCTION; } | T_CONST { $$ = Stmt\Use_::TYPE_CONSTANT; } ; group_use_declaration: T_USE use_type legacy_namespace_name T_NS_SEPARATOR '{' unprefixed_use_declarations '}' { $$ = Stmt\GroupUse[$3, $6, $2]; } | T_USE legacy_namespace_name T_NS_SEPARATOR '{' inline_use_declarations '}' { $$ = Stmt\GroupUse[$2, $5, Stmt\Use_::TYPE_UNKNOWN]; } ; unprefixed_use_declarations: unprefixed_use_declarations ',' unprefixed_use_declaration { push($1, $3); } | unprefixed_use_declaration { init($1); } ; use_declarations: use_declarations ',' use_declaration { push($1, $3); } | use_declaration { init($1); } ; inline_use_declarations: inline_use_declarations ',' inline_use_declaration { push($1, $3); } | inline_use_declaration { init($1); } ; unprefixed_use_declaration: namespace_name { $$ = Stmt\UseUse[$1, null, Stmt\Use_::TYPE_UNKNOWN]; $this->checkUseUse($$, #1); } | namespace_name T_AS identifier { $$ = Stmt\UseUse[$1, $3, Stmt\Use_::TYPE_UNKNOWN]; $this->checkUseUse($$, #3); } ; use_declaration: legacy_namespace_name { $$ = Stmt\UseUse[$1, null, Stmt\Use_::TYPE_UNKNOWN]; $this->checkUseUse($$, #1); } | legacy_namespace_name T_AS identifier { $$ = Stmt\UseUse[$1, $3, Stmt\Use_::TYPE_UNKNOWN]; $this->checkUseUse($$, #3); } ; inline_use_declaration: unprefixed_use_declaration { $$ = $1; $$->type = Stmt\Use_::TYPE_NORMAL; } | use_type unprefixed_use_declaration { $$ = $2; $$->type = $1; } ; constant_declaration_list: constant_declaration_list ',' constant_declaration { push($1, $3); } | constant_declaration { init($1); } ; constant_declaration: identifier '=' static_scalar { $$ = Node\Const_[$1, $3]; } ; class_const_list: class_const_list ',' class_const { push($1, $3); } | class_const { init($1); } ; class_const: identifier_ex '=' static_scalar { $$ = Node\Const_[$1, $3]; } ; inner_statement_list_ex: inner_statement_list_ex inner_statement { pushNormalizing($1, $2); } | /* empty */ { init(); } ; inner_statement_list: inner_statement_list_ex { makeZeroLengthNop($nop, $this->lookaheadStartAttributes); if ($nop !== null) { $1[] = $nop; } $$ = $1; } ; inner_statement: statement { $$ = $1; } | function_declaration_statement { $$ = $1; } | class_declaration_statement { $$ = $1; } | T_HALT_COMPILER { throw new Error('__HALT_COMPILER() can only be used from the outermost scope', attributes()); } ; non_empty_statement: '{' inner_statement_list '}' { if ($2) { $$ = $2; prependLeadingComments($$); } else { makeNop($$, $this->startAttributeStack[#1], $this->endAttributes); if (null === $$) { $$ = array(); } } } | T_IF parentheses_expr statement elseif_list else_single { $$ = Stmt\If_[$2, ['stmts' => toArray($3), 'elseifs' => $4, 'else' => $5]]; } | T_IF parentheses_expr ':' inner_statement_list new_elseif_list new_else_single T_ENDIF ';' { $$ = Stmt\If_[$2, ['stmts' => $4, 'elseifs' => $5, 'else' => $6]]; } | T_WHILE parentheses_expr while_statement { $$ = Stmt\While_[$2, $3]; } | T_DO statement T_WHILE parentheses_expr ';' { $$ = Stmt\Do_ [$4, toArray($2)]; } | T_FOR '(' for_expr ';' for_expr ';' for_expr ')' for_statement { $$ = Stmt\For_[['init' => $3, 'cond' => $5, 'loop' => $7, 'stmts' => $9]]; } | T_SWITCH parentheses_expr switch_case_list { $$ = Stmt\Switch_[$2, $3]; } | T_BREAK ';' { $$ = Stmt\Break_[null]; } | T_BREAK expr ';' { $$ = Stmt\Break_[$2]; } | T_CONTINUE ';' { $$ = Stmt\Continue_[null]; } | T_CONTINUE expr ';' { $$ = Stmt\Continue_[$2]; } | T_RETURN ';' { $$ = Stmt\Return_[null]; } | T_RETURN expr ';' { $$ = Stmt\Return_[$2]; } | T_GLOBAL global_var_list ';' { $$ = Stmt\Global_[$2]; } | T_STATIC static_var_list ';' { $$ = Stmt\Static_[$2]; } | T_ECHO expr_list ';' { $$ = Stmt\Echo_[$2]; } | T_INLINE_HTML { $$ = Stmt\InlineHTML[$1]; } | yield_expr ';' { $$ = Stmt\Expression[$1]; } | expr ';' { $$ = Stmt\Expression[$1]; } | T_UNSET '(' variables_list ')' ';' { $$ = Stmt\Unset_[$3]; } | T_FOREACH '(' expr T_AS foreach_variable ')' foreach_statement { $$ = Stmt\Foreach_[$3, $5[0], ['keyVar' => null, 'byRef' => $5[1], 'stmts' => $7]]; } | T_FOREACH '(' expr T_AS variable T_DOUBLE_ARROW foreach_variable ')' foreach_statement { $$ = Stmt\Foreach_[$3, $7[0], ['keyVar' => $5, 'byRef' => $7[1], 'stmts' => $9]]; } | T_DECLARE '(' declare_list ')' declare_statement { $$ = Stmt\Declare_[$3, $5]; } | T_TRY '{' inner_statement_list '}' catches optional_finally { $$ = Stmt\TryCatch[$3, $5, $6]; $this->checkTryCatch($$); } | T_THROW expr ';' { $$ = Stmt\Throw_[$2]; } | T_GOTO identifier ';' { $$ = Stmt\Goto_[$2]; } | identifier ':' { $$ = Stmt\Label[$1]; } | expr error { $$ = Stmt\Expression[$1]; } | error { $$ = array(); /* means: no statement */ } ; statement: non_empty_statement { $$ = $1; } | ';' { makeNop($$, $this->startAttributeStack[#1], $this->endAttributes); if ($$ === null) $$ = array(); /* means: no statement */ } ; catches: /* empty */ { init(); } | catches catch { push($1, $2); } ; catch: T_CATCH '(' name plain_variable ')' '{' inner_statement_list '}' { $$ = Stmt\Catch_[array($3), $4, $7]; } ; optional_finally: /* empty */ { $$ = null; } | T_FINALLY '{' inner_statement_list '}' { $$ = Stmt\Finally_[$3]; } ; variables_list: variable { init($1); } | variables_list ',' variable { push($1, $3); } ; optional_ref: /* empty */ { $$ = false; } | ampersand { $$ = true; } ; optional_arg_ref: /* empty */ { $$ = false; } | T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG { $$ = true; } ; optional_ellipsis: /* empty */ { $$ = false; } | T_ELLIPSIS { $$ = true; } ; identifier_maybe_readonly: identifier { $$ = $1; } | T_READONLY { $$ = Node\Identifier[$1]; } ; function_declaration_statement: T_FUNCTION optional_ref identifier_maybe_readonly '(' parameter_list ')' optional_return_type '{' inner_statement_list '}' { $$ = Stmt\Function_[$3, ['byRef' => $2, 'params' => $5, 'returnType' => $7, 'stmts' => $9]]; } ; class_declaration_statement: class_entry_type identifier extends_from implements_list '{' class_statement_list '}' { $$ = Stmt\Class_[$2, ['type' => $1, 'extends' => $3, 'implements' => $4, 'stmts' => $6]]; $this->checkClass($$, #2); } | T_INTERFACE identifier interface_extends_list '{' class_statement_list '}' { $$ = Stmt\Interface_[$2, ['extends' => $3, 'stmts' => $5]]; $this->checkInterface($$, #2); } | T_TRAIT identifier '{' class_statement_list '}' { $$ = Stmt\Trait_[$2, ['stmts' => $4]]; } ; class_entry_type: T_CLASS { $$ = 0; } | T_ABSTRACT T_CLASS { $$ = Stmt\Class_::MODIFIER_ABSTRACT; } | T_FINAL T_CLASS { $$ = Stmt\Class_::MODIFIER_FINAL; } ; extends_from: /* empty */ { $$ = null; } | T_EXTENDS class_name { $$ = $2; } ; interface_extends_list: /* empty */ { $$ = array(); } | T_EXTENDS class_name_list { $$ = $2; } ; implements_list: /* empty */ { $$ = array(); } | T_IMPLEMENTS class_name_list { $$ = $2; } ; class_name_list: class_name { init($1); } | class_name_list ',' class_name { push($1, $3); } ; for_statement: statement { $$ = toArray($1); } | ':' inner_statement_list T_ENDFOR ';' { $$ = $2; } ; foreach_statement: statement { $$ = toArray($1); } | ':' inner_statement_list T_ENDFOREACH ';' { $$ = $2; } ; declare_statement: non_empty_statement { $$ = toArray($1); } | ';' { $$ = null; } | ':' inner_statement_list T_ENDDECLARE ';' { $$ = $2; } ; declare_list: declare_list_element { init($1); } | declare_list ',' declare_list_element { push($1, $3); } ; declare_list_element: identifier '=' static_scalar { $$ = Stmt\DeclareDeclare[$1, $3]; } ; switch_case_list: '{' case_list '}' { $$ = $2; } | '{' ';' case_list '}' { $$ = $3; } | ':' case_list T_ENDSWITCH ';' { $$ = $2; } | ':' ';' case_list T_ENDSWITCH ';' { $$ = $3; } ; case_list: /* empty */ { init(); } | case_list case { push($1, $2); } ; case: T_CASE expr case_separator inner_statement_list_ex { $$ = Stmt\Case_[$2, $4]; } | T_DEFAULT case_separator inner_statement_list_ex { $$ = Stmt\Case_[null, $3]; } ; case_separator: ':' | ';' ; while_statement: statement { $$ = toArray($1); } | ':' inner_statement_list T_ENDWHILE ';' { $$ = $2; } ; elseif_list: /* empty */ { init(); } | elseif_list elseif { push($1, $2); } ; elseif: T_ELSEIF parentheses_expr statement { $$ = Stmt\ElseIf_[$2, toArray($3)]; } ; new_elseif_list: /* empty */ { init(); } | new_elseif_list new_elseif { push($1, $2); } ; new_elseif: T_ELSEIF parentheses_expr ':' inner_statement_list { $$ = Stmt\ElseIf_[$2, $4]; } ; else_single: /* empty */ { $$ = null; } | T_ELSE statement { $$ = Stmt\Else_[toArray($2)]; } ; new_else_single: /* empty */ { $$ = null; } | T_ELSE ':' inner_statement_list { $$ = Stmt\Else_[$3]; } ; foreach_variable: variable { $$ = array($1, false); } | ampersand variable { $$ = array($2, true); } | list_expr { $$ = array($1, false); } ; parameter_list: non_empty_parameter_list { $$ = $1; } | /* empty */ { $$ = array(); } ; non_empty_parameter_list: parameter { init($1); } | non_empty_parameter_list ',' parameter { push($1, $3); } ; parameter: optional_param_type optional_arg_ref optional_ellipsis plain_variable { $$ = Node\Param[$4, null, $1, $2, $3]; $this->checkParam($$); } | optional_param_type optional_arg_ref optional_ellipsis plain_variable '=' static_scalar { $$ = Node\Param[$4, $6, $1, $2, $3]; $this->checkParam($$); } ; type: name { $$ = $1; } | T_ARRAY { $$ = Node\Identifier['array']; } | T_CALLABLE { $$ = Node\Identifier['callable']; } ; optional_param_type: /* empty */ { $$ = null; } | type { $$ = $1; } ; optional_return_type: /* empty */ { $$ = null; } | ':' type { $$ = $2; } ; argument_list: '(' ')' { $$ = array(); } | '(' non_empty_argument_list ')' { $$ = $2; } | '(' yield_expr ')' { $$ = array(Node\Arg[$2, false, false]); } ; non_empty_argument_list: argument { init($1); } | non_empty_argument_list ',' argument { push($1, $3); } ; argument: expr { $$ = Node\Arg[$1, false, false]; } | ampersand variable { $$ = Node\Arg[$2, true, false]; } | T_ELLIPSIS expr { $$ = Node\Arg[$2, false, true]; } ; global_var_list: global_var_list ',' global_var { push($1, $3); } | global_var { init($1); } ; global_var: plain_variable { $$ = $1; } | '$' variable { $$ = Expr\Variable[$2]; } | '$' '{' expr '}' { $$ = Expr\Variable[$3]; } ; static_var_list: static_var_list ',' static_var { push($1, $3); } | static_var { init($1); } ; static_var: plain_variable { $$ = Stmt\StaticVar[$1, null]; } | plain_variable '=' static_scalar { $$ = Stmt\StaticVar[$1, $3]; } ; class_statement_list_ex: class_statement_list_ex class_statement { if ($2 !== null) { push($1, $2); } } | /* empty */ { init(); } ; class_statement_list: class_statement_list_ex { makeZeroLengthNop($nop, $this->lookaheadStartAttributes); if ($nop !== null) { $1[] = $nop; } $$ = $1; } ; class_statement: variable_modifiers property_declaration_list ';' { $$ = Stmt\Property[$1, $2]; $this->checkProperty($$, #1); } | T_CONST class_const_list ';' { $$ = Stmt\ClassConst[$2, 0]; } | method_modifiers T_FUNCTION optional_ref identifier_ex '(' parameter_list ')' optional_return_type method_body { $$ = Stmt\ClassMethod[$4, ['type' => $1, 'byRef' => $3, 'params' => $6, 'returnType' => $8, 'stmts' => $9]]; $this->checkClassMethod($$, #1); } | T_USE class_name_list trait_adaptations { $$ = Stmt\TraitUse[$2, $3]; } ; trait_adaptations: ';' { $$ = array(); } | '{' trait_adaptation_list '}' { $$ = $2; } ; trait_adaptation_list: /* empty */ { init(); } | trait_adaptation_list trait_adaptation { push($1, $2); } ; trait_adaptation: trait_method_reference_fully_qualified T_INSTEADOF class_name_list ';' { $$ = Stmt\TraitUseAdaptation\Precedence[$1[0], $1[1], $3]; } | trait_method_reference T_AS member_modifier identifier_ex ';' { $$ = Stmt\TraitUseAdaptation\Alias[$1[0], $1[1], $3, $4]; } | trait_method_reference T_AS member_modifier ';' { $$ = Stmt\TraitUseAdaptation\Alias[$1[0], $1[1], $3, null]; } | trait_method_reference T_AS identifier ';' { $$ = Stmt\TraitUseAdaptation\Alias[$1[0], $1[1], null, $3]; } | trait_method_reference T_AS reserved_non_modifiers_identifier ';' { $$ = Stmt\TraitUseAdaptation\Alias[$1[0], $1[1], null, $3]; } ; trait_method_reference_fully_qualified: name T_PAAMAYIM_NEKUDOTAYIM identifier_ex { $$ = array($1, $3); } ; trait_method_reference: trait_method_reference_fully_qualified { $$ = $1; } | identifier_ex { $$ = array(null, $1); } ; method_body: ';' /* abstract method */ { $$ = null; } | '{' inner_statement_list '}' { $$ = $2; } ; variable_modifiers: non_empty_member_modifiers { $$ = $1; } | T_VAR { $$ = 0; } ; method_modifiers: /* empty */ { $$ = 0; } | non_empty_member_modifiers { $$ = $1; } ; non_empty_member_modifiers: member_modifier { $$ = $1; } | non_empty_member_modifiers member_modifier { $this->checkModifier($1, $2, #2); $$ = $1 | $2; } ; member_modifier: T_PUBLIC { $$ = Stmt\Class_::MODIFIER_PUBLIC; } | T_PROTECTED { $$ = Stmt\Class_::MODIFIER_PROTECTED; } | T_PRIVATE { $$ = Stmt\Class_::MODIFIER_PRIVATE; } | T_STATIC { $$ = Stmt\Class_::MODIFIER_STATIC; } | T_ABSTRACT { $$ = Stmt\Class_::MODIFIER_ABSTRACT; } | T_FINAL { $$ = Stmt\Class_::MODIFIER_FINAL; } ; property_declaration_list: property_declaration { init($1); } | property_declaration_list ',' property_declaration { push($1, $3); } ; property_decl_name: T_VARIABLE { $$ = Node\VarLikeIdentifier[parseVar($1)]; } ; property_declaration: property_decl_name { $$ = Stmt\PropertyProperty[$1, null]; } | property_decl_name '=' static_scalar { $$ = Stmt\PropertyProperty[$1, $3]; } ; expr_list: expr_list ',' expr { push($1, $3); } | expr { init($1); } ; for_expr: /* empty */ { $$ = array(); } | expr_list { $$ = $1; } ; expr: variable { $$ = $1; } | list_expr '=' expr { $$ = Expr\Assign[$1, $3]; } | variable '=' expr { $$ = Expr\Assign[$1, $3]; } | variable '=' ampersand variable { $$ = Expr\AssignRef[$1, $4]; } | variable '=' ampersand new_expr { $$ = Expr\AssignRef[$1, $4]; } | new_expr { $$ = $1; } | T_CLONE expr { $$ = Expr\Clone_[$2]; } | variable T_PLUS_EQUAL expr { $$ = Expr\AssignOp\Plus [$1, $3]; } | variable T_MINUS_EQUAL expr { $$ = Expr\AssignOp\Minus [$1, $3]; } | variable T_MUL_EQUAL expr { $$ = Expr\AssignOp\Mul [$1, $3]; } | variable T_DIV_EQUAL expr { $$ = Expr\AssignOp\Div [$1, $3]; } | variable T_CONCAT_EQUAL expr { $$ = Expr\AssignOp\Concat [$1, $3]; } | variable T_MOD_EQUAL expr { $$ = Expr\AssignOp\Mod [$1, $3]; } | variable T_AND_EQUAL expr { $$ = Expr\AssignOp\BitwiseAnd[$1, $3]; } | variable T_OR_EQUAL expr { $$ = Expr\AssignOp\BitwiseOr [$1, $3]; } | variable T_XOR_EQUAL expr { $$ = Expr\AssignOp\BitwiseXor[$1, $3]; } | variable T_SL_EQUAL expr { $$ = Expr\AssignOp\ShiftLeft [$1, $3]; } | variable T_SR_EQUAL expr { $$ = Expr\AssignOp\ShiftRight[$1, $3]; } | variable T_POW_EQUAL expr { $$ = Expr\AssignOp\Pow [$1, $3]; } | variable T_COALESCE_EQUAL expr { $$ = Expr\AssignOp\Coalesce [$1, $3]; } | variable T_INC { $$ = Expr\PostInc[$1]; } | T_INC variable { $$ = Expr\PreInc [$2]; } | variable T_DEC { $$ = Expr\PostDec[$1]; } | T_DEC variable { $$ = Expr\PreDec [$2]; } | expr T_BOOLEAN_OR expr { $$ = Expr\BinaryOp\BooleanOr [$1, $3]; } | expr T_BOOLEAN_AND expr { $$ = Expr\BinaryOp\BooleanAnd[$1, $3]; } | expr T_LOGICAL_OR expr { $$ = Expr\BinaryOp\LogicalOr [$1, $3]; } | expr T_LOGICAL_AND expr { $$ = Expr\BinaryOp\LogicalAnd[$1, $3]; } | expr T_LOGICAL_XOR expr { $$ = Expr\BinaryOp\LogicalXor[$1, $3]; } | expr '|' expr { $$ = Expr\BinaryOp\BitwiseOr [$1, $3]; } | expr T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG expr { $$ = Expr\BinaryOp\BitwiseAnd[$1, $3]; } | expr T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG expr { $$ = Expr\BinaryOp\BitwiseAnd[$1, $3]; } | expr '^' expr { $$ = Expr\BinaryOp\BitwiseXor[$1, $3]; } | expr '.' expr { $$ = Expr\BinaryOp\Concat [$1, $3]; } | expr '+' expr { $$ = Expr\BinaryOp\Plus [$1, $3]; } | expr '-' expr { $$ = Expr\BinaryOp\Minus [$1, $3]; } | expr '*' expr { $$ = Expr\BinaryOp\Mul [$1, $3]; } | expr '/' expr { $$ = Expr\BinaryOp\Div [$1, $3]; } | expr '%' expr { $$ = Expr\BinaryOp\Mod [$1, $3]; } | expr T_SL expr { $$ = Expr\BinaryOp\ShiftLeft [$1, $3]; } | expr T_SR expr { $$ = Expr\BinaryOp\ShiftRight[$1, $3]; } | expr T_POW expr { $$ = Expr\BinaryOp\Pow [$1, $3]; } | '+' expr %prec T_INC { $$ = Expr\UnaryPlus [$2]; } | '-' expr %prec T_INC { $$ = Expr\UnaryMinus[$2]; } | '!' expr { $$ = Expr\BooleanNot[$2]; } | '~' expr { $$ = Expr\BitwiseNot[$2]; } | expr T_IS_IDENTICAL expr { $$ = Expr\BinaryOp\Identical [$1, $3]; } | expr T_IS_NOT_IDENTICAL expr { $$ = Expr\BinaryOp\NotIdentical [$1, $3]; } | expr T_IS_EQUAL expr { $$ = Expr\BinaryOp\Equal [$1, $3]; } | expr T_IS_NOT_EQUAL expr { $$ = Expr\BinaryOp\NotEqual [$1, $3]; } | expr T_SPACESHIP expr { $$ = Expr\BinaryOp\Spaceship [$1, $3]; } | expr '<' expr { $$ = Expr\BinaryOp\Smaller [$1, $3]; } | expr T_IS_SMALLER_OR_EQUAL expr { $$ = Expr\BinaryOp\SmallerOrEqual[$1, $3]; } | expr '>' expr { $$ = Expr\BinaryOp\Greater [$1, $3]; } | expr T_IS_GREATER_OR_EQUAL expr { $$ = Expr\BinaryOp\GreaterOrEqual[$1, $3]; } | expr T_INSTANCEOF class_name_reference { $$ = Expr\Instanceof_[$1, $3]; } | parentheses_expr { $$ = $1; } /* we need a separate '(' new_expr ')' rule to avoid problems caused by a s/r conflict */ | '(' new_expr ')' { $$ = $2; } | expr '?' expr ':' expr { $$ = Expr\Ternary[$1, $3, $5]; } | expr '?' ':' expr { $$ = Expr\Ternary[$1, null, $4]; } | expr T_COALESCE expr { $$ = Expr\BinaryOp\Coalesce[$1, $3]; } | T_ISSET '(' variables_list ')' { $$ = Expr\Isset_[$3]; } | T_EMPTY '(' expr ')' { $$ = Expr\Empty_[$3]; } | T_INCLUDE expr { $$ = Expr\Include_[$2, Expr\Include_::TYPE_INCLUDE]; } | T_INCLUDE_ONCE expr { $$ = Expr\Include_[$2, Expr\Include_::TYPE_INCLUDE_ONCE]; } | T_EVAL parentheses_expr { $$ = Expr\Eval_[$2]; } | T_REQUIRE expr { $$ = Expr\Include_[$2, Expr\Include_::TYPE_REQUIRE]; } | T_REQUIRE_ONCE expr { $$ = Expr\Include_[$2, Expr\Include_::TYPE_REQUIRE_ONCE]; } | T_INT_CAST expr { $$ = Expr\Cast\Int_ [$2]; } | T_DOUBLE_CAST expr { $attrs = attributes(); $attrs['kind'] = $this->getFloatCastKind($1); $$ = new Expr\Cast\Double($2, $attrs); } | T_STRING_CAST expr { $$ = Expr\Cast\String_ [$2]; } | T_ARRAY_CAST expr { $$ = Expr\Cast\Array_ [$2]; } | T_OBJECT_CAST expr { $$ = Expr\Cast\Object_ [$2]; } | T_BOOL_CAST expr { $$ = Expr\Cast\Bool_ [$2]; } | T_UNSET_CAST expr { $$ = Expr\Cast\Unset_ [$2]; } | T_EXIT exit_expr { $attrs = attributes(); $attrs['kind'] = strtolower($1) === 'exit' ? Expr\Exit_::KIND_EXIT : Expr\Exit_::KIND_DIE; $$ = new Expr\Exit_($2, $attrs); } | '@' expr { $$ = Expr\ErrorSuppress[$2]; } | scalar { $$ = $1; } | array_expr { $$ = $1; } | scalar_dereference { $$ = $1; } | '`' backticks_expr '`' { $$ = Expr\ShellExec[$2]; } | T_PRINT expr { $$ = Expr\Print_[$2]; } | T_YIELD { $$ = Expr\Yield_[null, null]; } | T_YIELD_FROM expr { $$ = Expr\YieldFrom[$2]; } | T_FUNCTION optional_ref '(' parameter_list ')' lexical_vars optional_return_type '{' inner_statement_list '}' { $$ = Expr\Closure[['static' => false, 'byRef' => $2, 'params' => $4, 'uses' => $6, 'returnType' => $7, 'stmts' => $9]]; } | T_STATIC T_FUNCTION optional_ref '(' parameter_list ')' lexical_vars optional_return_type '{' inner_statement_list '}' { $$ = Expr\Closure[['static' => true, 'byRef' => $3, 'params' => $5, 'uses' => $7, 'returnType' => $8, 'stmts' => $10]]; } ; parentheses_expr: '(' expr ')' { $$ = $2; } | '(' yield_expr ')' { $$ = $2; } ; yield_expr: T_YIELD expr { $$ = Expr\Yield_[$2, null]; } | T_YIELD expr T_DOUBLE_ARROW expr { $$ = Expr\Yield_[$4, $2]; } ; array_expr: T_ARRAY '(' array_pair_list ')' { $attrs = attributes(); $attrs['kind'] = Expr\Array_::KIND_LONG; $$ = new Expr\Array_($3, $attrs); } | '[' array_pair_list ']' { $attrs = attributes(); $attrs['kind'] = Expr\Array_::KIND_SHORT; $$ = new Expr\Array_($2, $attrs); } ; scalar_dereference: array_expr '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } | T_CONSTANT_ENCAPSED_STRING '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[Scalar\String_::fromString($1, attributes()), $3]; } | constant '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } | scalar_dereference '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } /* alternative array syntax missing intentionally */ ; anonymous_class: T_CLASS ctor_arguments extends_from implements_list '{' class_statement_list '}' { $$ = array(Stmt\Class_[null, ['type' => 0, 'extends' => $3, 'implements' => $4, 'stmts' => $6]], $2); $this->checkClass($$[0], -1); } ; new_expr: T_NEW class_name_reference ctor_arguments { $$ = Expr\New_[$2, $3]; } | T_NEW anonymous_class { list($class, $ctorArgs) = $2; $$ = Expr\New_[$class, $ctorArgs]; } ; lexical_vars: /* empty */ { $$ = array(); } | T_USE '(' lexical_var_list ')' { $$ = $3; } ; lexical_var_list: lexical_var { init($1); } | lexical_var_list ',' lexical_var { push($1, $3); } ; lexical_var: optional_ref plain_variable { $$ = Expr\ClosureUse[$2, $1]; } ; name_readonly: T_READONLY { $$ = Name[$1]; } ; function_call: name argument_list { $$ = Expr\FuncCall[$1, $2]; } | name_readonly argument_list { $$ = Expr\FuncCall[$1, $2]; } | class_name_or_var T_PAAMAYIM_NEKUDOTAYIM identifier_ex argument_list { $$ = Expr\StaticCall[$1, $3, $4]; } | class_name_or_var T_PAAMAYIM_NEKUDOTAYIM '{' expr '}' argument_list { $$ = Expr\StaticCall[$1, $4, $6]; } | static_property argument_list { $$ = $this->fixupPhp5StaticPropCall($1, $2, attributes()); } | variable_without_objects argument_list { $$ = Expr\FuncCall[$1, $2]; } | function_call '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } /* alternative array syntax missing intentionally */ ; class_name: T_STATIC { $$ = Name[$1]; } | name { $$ = $1; } ; name: T_STRING { $$ = Name[$1]; } | T_NAME_QUALIFIED { $$ = Name[$1]; } | T_NAME_FULLY_QUALIFIED { $$ = Name\FullyQualified[substr($1, 1)]; } | T_NAME_RELATIVE { $$ = Name\Relative[substr($1, 10)]; } ; class_name_reference: class_name { $$ = $1; } | dynamic_class_name_reference { $$ = $1; } ; dynamic_class_name_reference: object_access_for_dcnr { $$ = $1; } | base_variable { $$ = $1; } ; class_name_or_var: class_name { $$ = $1; } | reference_variable { $$ = $1; } ; object_access_for_dcnr: base_variable T_OBJECT_OPERATOR object_property { $$ = Expr\PropertyFetch[$1, $3]; } | object_access_for_dcnr T_OBJECT_OPERATOR object_property { $$ = Expr\PropertyFetch[$1, $3]; } | object_access_for_dcnr '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } | object_access_for_dcnr '{' expr '}' { $$ = Expr\ArrayDimFetch[$1, $3]; } ; exit_expr: /* empty */ { $$ = null; } | '(' ')' { $$ = null; } | parentheses_expr { $$ = $1; } ; backticks_expr: /* empty */ { $$ = array(); } | T_ENCAPSED_AND_WHITESPACE { $$ = array(Scalar\EncapsedStringPart[Scalar\String_::parseEscapeSequences($1, '`', false)]); } | encaps_list { parseEncapsed($1, '`', false); $$ = $1; } ; ctor_arguments: /* empty */ { $$ = array(); } | argument_list { $$ = $1; } ; common_scalar: T_LNUMBER { $$ = $this->parseLNumber($1, attributes(), true); } | T_DNUMBER { $$ = Scalar\DNumber::fromString($1, attributes()); } | T_CONSTANT_ENCAPSED_STRING { $$ = Scalar\String_::fromString($1, attributes(), false); } | T_LINE { $$ = Scalar\MagicConst\Line[]; } | T_FILE { $$ = Scalar\MagicConst\File[]; } | T_DIR { $$ = Scalar\MagicConst\Dir[]; } | T_CLASS_C { $$ = Scalar\MagicConst\Class_[]; } | T_TRAIT_C { $$ = Scalar\MagicConst\Trait_[]; } | T_METHOD_C { $$ = Scalar\MagicConst\Method[]; } | T_FUNC_C { $$ = Scalar\MagicConst\Function_[]; } | T_NS_C { $$ = Scalar\MagicConst\Namespace_[]; } | T_START_HEREDOC T_ENCAPSED_AND_WHITESPACE T_END_HEREDOC { $$ = $this->parseDocString($1, $2, $3, attributes(), stackAttributes(#3), false); } | T_START_HEREDOC T_END_HEREDOC { $$ = $this->parseDocString($1, '', $2, attributes(), stackAttributes(#2), false); } ; static_scalar: common_scalar { $$ = $1; } | class_name T_PAAMAYIM_NEKUDOTAYIM identifier_ex { $$ = Expr\ClassConstFetch[$1, $3]; } | name { $$ = Expr\ConstFetch[$1]; } | T_ARRAY '(' static_array_pair_list ')' { $$ = Expr\Array_[$3]; } | '[' static_array_pair_list ']' { $$ = Expr\Array_[$2]; } | static_operation { $$ = $1; } ; static_operation: static_scalar T_BOOLEAN_OR static_scalar { $$ = Expr\BinaryOp\BooleanOr [$1, $3]; } | static_scalar T_BOOLEAN_AND static_scalar { $$ = Expr\BinaryOp\BooleanAnd[$1, $3]; } | static_scalar T_LOGICAL_OR static_scalar { $$ = Expr\BinaryOp\LogicalOr [$1, $3]; } | static_scalar T_LOGICAL_AND static_scalar { $$ = Expr\BinaryOp\LogicalAnd[$1, $3]; } | static_scalar T_LOGICAL_XOR static_scalar { $$ = Expr\BinaryOp\LogicalXor[$1, $3]; } | static_scalar '|' static_scalar { $$ = Expr\BinaryOp\BitwiseOr [$1, $3]; } | static_scalar T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG static_scalar { $$ = Expr\BinaryOp\BitwiseAnd[$1, $3]; } | static_scalar T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG static_scalar { $$ = Expr\BinaryOp\BitwiseAnd[$1, $3]; } | static_scalar '^' static_scalar { $$ = Expr\BinaryOp\BitwiseXor[$1, $3]; } | static_scalar '.' static_scalar { $$ = Expr\BinaryOp\Concat [$1, $3]; } | static_scalar '+' static_scalar { $$ = Expr\BinaryOp\Plus [$1, $3]; } | static_scalar '-' static_scalar { $$ = Expr\BinaryOp\Minus [$1, $3]; } | static_scalar '*' static_scalar { $$ = Expr\BinaryOp\Mul [$1, $3]; } | static_scalar '/' static_scalar { $$ = Expr\BinaryOp\Div [$1, $3]; } | static_scalar '%' static_scalar { $$ = Expr\BinaryOp\Mod [$1, $3]; } | static_scalar T_SL static_scalar { $$ = Expr\BinaryOp\ShiftLeft [$1, $3]; } | static_scalar T_SR static_scalar { $$ = Expr\BinaryOp\ShiftRight[$1, $3]; } | static_scalar T_POW static_scalar { $$ = Expr\BinaryOp\Pow [$1, $3]; } | '+' static_scalar %prec T_INC { $$ = Expr\UnaryPlus [$2]; } | '-' static_scalar %prec T_INC { $$ = Expr\UnaryMinus[$2]; } | '!' static_scalar { $$ = Expr\BooleanNot[$2]; } | '~' static_scalar { $$ = Expr\BitwiseNot[$2]; } | static_scalar T_IS_IDENTICAL static_scalar { $$ = Expr\BinaryOp\Identical [$1, $3]; } | static_scalar T_IS_NOT_IDENTICAL static_scalar { $$ = Expr\BinaryOp\NotIdentical [$1, $3]; } | static_scalar T_IS_EQUAL static_scalar { $$ = Expr\BinaryOp\Equal [$1, $3]; } | static_scalar T_IS_NOT_EQUAL static_scalar { $$ = Expr\BinaryOp\NotEqual [$1, $3]; } | static_scalar '<' static_scalar { $$ = Expr\BinaryOp\Smaller [$1, $3]; } | static_scalar T_IS_SMALLER_OR_EQUAL static_scalar { $$ = Expr\BinaryOp\SmallerOrEqual[$1, $3]; } | static_scalar '>' static_scalar { $$ = Expr\BinaryOp\Greater [$1, $3]; } | static_scalar T_IS_GREATER_OR_EQUAL static_scalar { $$ = Expr\BinaryOp\GreaterOrEqual[$1, $3]; } | static_scalar '?' static_scalar ':' static_scalar { $$ = Expr\Ternary[$1, $3, $5]; } | static_scalar '?' ':' static_scalar { $$ = Expr\Ternary[$1, null, $4]; } | static_scalar '[' static_scalar ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } | '(' static_scalar ')' { $$ = $2; } ; constant: name { $$ = Expr\ConstFetch[$1]; } | class_name_or_var T_PAAMAYIM_NEKUDOTAYIM identifier_ex { $$ = Expr\ClassConstFetch[$1, $3]; } ; scalar: common_scalar { $$ = $1; } | constant { $$ = $1; } | '"' encaps_list '"' { $attrs = attributes(); $attrs['kind'] = Scalar\String_::KIND_DOUBLE_QUOTED; parseEncapsed($2, '"', true); $$ = new Scalar\Encapsed($2, $attrs); } | T_START_HEREDOC encaps_list T_END_HEREDOC { $$ = $this->parseDocString($1, $2, $3, attributes(), stackAttributes(#3), true); } ; static_array_pair_list: /* empty */ { $$ = array(); } | non_empty_static_array_pair_list optional_comma { $$ = $1; } ; optional_comma: /* empty */ | ',' ; non_empty_static_array_pair_list: non_empty_static_array_pair_list ',' static_array_pair { push($1, $3); } | static_array_pair { init($1); } ; static_array_pair: static_scalar T_DOUBLE_ARROW static_scalar { $$ = Expr\ArrayItem[$3, $1, false]; } | static_scalar { $$ = Expr\ArrayItem[$1, null, false]; } ; variable: object_access { $$ = $1; } | base_variable { $$ = $1; } | function_call { $$ = $1; } | new_expr_array_deref { $$ = $1; } ; new_expr_array_deref: '(' new_expr ')' '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$2, $5]; } | new_expr_array_deref '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } /* alternative array syntax missing intentionally */ ; object_access: variable_or_new_expr T_OBJECT_OPERATOR object_property { $$ = Expr\PropertyFetch[$1, $3]; } | variable_or_new_expr T_OBJECT_OPERATOR object_property argument_list { $$ = Expr\MethodCall[$1, $3, $4]; } | object_access argument_list { $$ = Expr\FuncCall[$1, $2]; } | object_access '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } | object_access '{' expr '}' { $$ = Expr\ArrayDimFetch[$1, $3]; } ; variable_or_new_expr: variable { $$ = $1; } | '(' new_expr ')' { $$ = $2; } ; variable_without_objects: reference_variable { $$ = $1; } | '$' variable_without_objects { $$ = Expr\Variable[$2]; } ; base_variable: variable_without_objects { $$ = $1; } | static_property { $$ = $1; } ; static_property: class_name_or_var T_PAAMAYIM_NEKUDOTAYIM '$' reference_variable { $$ = Expr\StaticPropertyFetch[$1, $4]; } | static_property_with_arrays { $$ = $1; } ; static_property_simple_name: T_VARIABLE { $var = parseVar($1); $$ = \is_string($var) ? Node\VarLikeIdentifier[$var] : $var; } ; static_property_with_arrays: class_name_or_var T_PAAMAYIM_NEKUDOTAYIM static_property_simple_name { $$ = Expr\StaticPropertyFetch[$1, $3]; } | class_name_or_var T_PAAMAYIM_NEKUDOTAYIM '$' '{' expr '}' { $$ = Expr\StaticPropertyFetch[$1, $5]; } | static_property_with_arrays '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } | static_property_with_arrays '{' expr '}' { $$ = Expr\ArrayDimFetch[$1, $3]; } ; reference_variable: reference_variable '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } | reference_variable '{' expr '}' { $$ = Expr\ArrayDimFetch[$1, $3]; } | plain_variable { $$ = $1; } | '$' '{' expr '}' { $$ = Expr\Variable[$3]; } ; dim_offset: /* empty */ { $$ = null; } | expr { $$ = $1; } ; object_property: identifier { $$ = $1; } | '{' expr '}' { $$ = $2; } | variable_without_objects { $$ = $1; } | error { $$ = Expr\Error[]; $this->errorState = 2; } ; list_expr: T_LIST '(' list_expr_elements ')' { $$ = Expr\List_[$3]; } ; list_expr_elements: list_expr_elements ',' list_expr_element { push($1, $3); } | list_expr_element { init($1); } ; list_expr_element: variable { $$ = Expr\ArrayItem[$1, null, false]; } | list_expr { $$ = Expr\ArrayItem[$1, null, false]; } | /* empty */ { $$ = null; } ; array_pair_list: /* empty */ { $$ = array(); } | non_empty_array_pair_list optional_comma { $$ = $1; } ; non_empty_array_pair_list: non_empty_array_pair_list ',' array_pair { push($1, $3); } | array_pair { init($1); } ; array_pair: expr T_DOUBLE_ARROW expr { $$ = Expr\ArrayItem[$3, $1, false]; } | expr { $$ = Expr\ArrayItem[$1, null, false]; } | expr T_DOUBLE_ARROW ampersand variable { $$ = Expr\ArrayItem[$4, $1, true]; } | ampersand variable { $$ = Expr\ArrayItem[$2, null, true]; } | T_ELLIPSIS expr { $$ = Expr\ArrayItem[$2, null, false, attributes(), true]; } ; encaps_list: encaps_list encaps_var { push($1, $2); } | encaps_list encaps_string_part { push($1, $2); } | encaps_var { init($1); } | encaps_string_part encaps_var { init($1, $2); } ; encaps_string_part: T_ENCAPSED_AND_WHITESPACE { $$ = Scalar\EncapsedStringPart[$1]; } ; encaps_str_varname: T_STRING_VARNAME { $$ = Expr\Variable[$1]; } ; encaps_var: plain_variable { $$ = $1; } | plain_variable '[' encaps_var_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } | plain_variable T_OBJECT_OPERATOR identifier { $$ = Expr\PropertyFetch[$1, $3]; } | T_DOLLAR_OPEN_CURLY_BRACES expr '}' { $$ = Expr\Variable[$2]; } | T_DOLLAR_OPEN_CURLY_BRACES T_STRING_VARNAME '}' { $$ = Expr\Variable[$2]; } | T_DOLLAR_OPEN_CURLY_BRACES encaps_str_varname '[' expr ']' '}' { $$ = Expr\ArrayDimFetch[$2, $4]; } | T_CURLY_OPEN variable '}' { $$ = $2; } ; encaps_var_offset: T_STRING { $$ = Scalar\String_[$1]; } | T_NUM_STRING { $$ = $this->parseNumString($1, attributes()); } | plain_variable { $$ = $1; } ; %% semValue #semval($,%t) $this->semValue #semval(%n) $this->stackPos-(%l-%n) #semval(%n,%t) $this->stackPos-(%l-%n) namespace PhpParser\Parser; #include; /* GENERATED file based on grammar/tokens.y */ final class Tokens { #tokenval const %s = %n; #endtokenval } \'[^\\\\\']*+(?:\\\\.[^\\\\\']*+)*+\') (?"[^\\\\"]*+(?:\\\\.[^\\\\"]*+)*+") (?(?&singleQuotedString)|(?&doubleQuotedString)) (?/\\*[^*]*+(?:\\*(?!/)[^*]*+)*+\\*/) (?\\{[^\'"/{}]*+(?:(?:(?&string)|(?&comment)|(?&code)|/)[^\'"/{}]*+)*+}) )'; const PARAMS = '\\[(?[^[\\]]*+(?:\\[(?¶ms)\\][^[\\]]*+)*+)\\]'; const ARGS = '\\((?[^()]*+(?:\\((?&args)\\)[^()]*+)*+)\\)'; /////////////////////////////// /// Preprocessing functions /// /////////////////////////////// function preprocessGrammar($code) { $code = resolveNodes($code); $code = resolveMacros($code); $code = resolveStackAccess($code); return $code; } function resolveNodes($code) { return \preg_replace_callback('~\\b(?[A-Z][a-zA-Z_\\\\]++)\\s*' . \_HumbugBox1cb33d1f20f1\PARAMS . '~', function ($matches) { // recurse $matches['params'] = resolveNodes($matches['params']); $params = magicSplit('(?:' . \_HumbugBox1cb33d1f20f1\PARAMS . '|' . \_HumbugBox1cb33d1f20f1\ARGS . ')(*SKIP)(*FAIL)|,', $matches['params']); $paramCode = ''; foreach ($params as $param) { $paramCode .= $param . ', '; } return 'new ' . $matches['name'] . '(' . $paramCode . 'attributes())'; }, $code); } function resolveMacros($code) { return \preg_replace_callback('~\\b(?)(?!array\\()(?[a-z][A-Za-z]++)' . \_HumbugBox1cb33d1f20f1\ARGS . '~', function ($matches) { // recurse $matches['args'] = resolveMacros($matches['args']); $name = $matches['name']; $args = magicSplit('(?:' . \_HumbugBox1cb33d1f20f1\PARAMS . '|' . \_HumbugBox1cb33d1f20f1\ARGS . ')(*SKIP)(*FAIL)|,', $matches['args']); if ('attributes' === $name) { assertArgs(0, $args, $name); return '$this->startAttributeStack[#1] + $this->endAttributes'; } if ('stackAttributes' === $name) { assertArgs(1, $args, $name); return '$this->startAttributeStack[' . $args[0] . ']' . ' + $this->endAttributeStack[' . $args[0] . ']'; } if ('init' === $name) { return '$$ = array(' . \implode(', ', $args) . ')'; } if ('push' === $name) { assertArgs(2, $args, $name); return $args[0] . '[] = ' . $args[1] . '; $$ = ' . $args[0]; } if ('pushNormalizing' === $name) { assertArgs(2, $args, $name); return 'if (is_array(' . $args[1] . ')) { $$ = array_merge(' . $args[0] . ', ' . $args[1] . '); }' . ' else { ' . $args[0] . '[] = ' . $args[1] . '; $$ = ' . $args[0] . '; }'; } if ('toArray' == $name) { assertArgs(1, $args, $name); return 'is_array(' . $args[0] . ') ? ' . $args[0] . ' : array(' . $args[0] . ')'; } if ('parseVar' === $name) { assertArgs(1, $args, $name); return 'substr(' . $args[0] . ', 1)'; } if ('parseEncapsed' === $name) { assertArgs(3, $args, $name); return 'foreach (' . $args[0] . ' as $s) { if ($s instanceof Node\\Scalar\\EncapsedStringPart) {' . ' $s->value = Node\\Scalar\\String_::parseEscapeSequences($s->value, ' . $args[1] . ', ' . $args[2] . '); } }'; } if ('makeNop' === $name) { assertArgs(3, $args, $name); return '$startAttributes = ' . $args[1] . ';' . ' if (isset($startAttributes[\'comments\']))' . ' { ' . $args[0] . ' = new Stmt\\Nop($startAttributes + ' . $args[2] . '); }' . ' else { ' . $args[0] . ' = null; }'; } if ('makeZeroLengthNop' == $name) { assertArgs(2, $args, $name); return '$startAttributes = ' . $args[1] . ';' . ' if (isset($startAttributes[\'comments\']))' . ' { ' . $args[0] . ' = new Stmt\\Nop($this->createCommentNopAttributes($startAttributes[\'comments\'])); }' . ' else { ' . $args[0] . ' = null; }'; } if ('prependLeadingComments' === $name) { assertArgs(1, $args, $name); return '$attrs = $this->startAttributeStack[#1]; $stmts = ' . $args[0] . '; ' . 'if (!empty($attrs[\'comments\'])) {' . '$stmts[0]->setAttribute(\'comments\', ' . 'array_merge($attrs[\'comments\'], $stmts[0]->getAttribute(\'comments\', []))); }'; } return $matches[0]; }, $code); } function assertArgs($num, $args, $name) { if ($num != \count($args)) { die('Wrong argument count for ' . $name . '().'); } } function resolveStackAccess($code) { $code = \preg_replace('/\\$\\d+/', '$this->semStack[$0]', $code); $code = \preg_replace('/#(\\d+)/', '$$1', $code); return $code; } function removeTrailingWhitespace($code) { $lines = \explode("\n", $code); $lines = \array_map('rtrim', $lines); return \implode("\n", $lines); } ////////////////////////////// /// Regex helper functions /// ////////////////////////////// function regex($regex) { return '~' . \_HumbugBox1cb33d1f20f1\LIB . '(?:' . \str_replace('~', '\\~', $regex) . ')~'; } function magicSplit($regex, $string) { $pieces = \preg_split(regex('(?:(?&string)|(?&comment)|(?&code))(*SKIP)(*FAIL)|' . $regex), $string); foreach ($pieces as &$piece) { $piece = \trim($piece); } if ($pieces === ['']) { return []; } return $pieces; } 'Php5', __DIR__ . '/php7.y' => 'Php7']; $tokensFile = __DIR__ . '/tokens.y'; $tokensTemplate = __DIR__ . '/tokens.template'; $skeletonFile = __DIR__ . '/parser.template'; $tmpGrammarFile = __DIR__ . '/tmp_parser.phpy'; $tmpResultFile = __DIR__ . '/tmp_parser.php'; $resultDir = __DIR__ . '/../lib/PhpParser/Parser'; $tokensResultsFile = $resultDir . '/Tokens.php'; $kmyacc = \getenv('KMYACC'); if (!$kmyacc) { // Use phpyacc from dev dependencies by default. $kmyacc = __DIR__ . '/../vendor/bin/phpyacc'; } $options = \array_flip($argv); $optionDebug = isset($options['--debug']); $optionKeepTmpGrammar = isset($options['--keep-tmp-grammar']); /////////////////// /// Main script /// /////////////////// $tokens = \file_get_contents($tokensFile); foreach ($grammarFileToName as $grammarFile => $name) { echo "Building temporary {$name} grammar file.\n"; $grammarCode = \file_get_contents($grammarFile); $grammarCode = \str_replace('%tokens', $tokens, $grammarCode); $grammarCode = preprocessGrammar($grammarCode); \file_put_contents($tmpGrammarFile, $grammarCode); $additionalArgs = $optionDebug ? '-t -v' : ''; echo "Building {$name} parser.\n"; $output = execCmd("{$kmyacc} {$additionalArgs} -m {$skeletonFile} -p {$name} {$tmpGrammarFile}"); $resultCode = \file_get_contents($tmpResultFile); $resultCode = removeTrailingWhitespace($resultCode); ensureDirExists($resultDir); \file_put_contents("{$resultDir}/{$name}.php", $resultCode); \unlink($tmpResultFile); echo "Building token definition.\n"; $output = execCmd("{$kmyacc} -m {$tokensTemplate} {$tmpGrammarFile}"); \rename($tmpResultFile, $tokensResultsFile); if (!$optionKeepTmpGrammar) { \unlink($tmpGrammarFile); } } //////////////////////////////// /// Utility helper functions /// //////////////////////////////// function ensureDirExists($dir) { if (!\is_dir($dir)) { \mkdir($dir, 0777, \true); } } function execCmd($cmd) { $output = \trim(\shell_exec("{$cmd} 2>&1")); if ($output !== "") { echo "> " . $cmd . "\n"; echo $output; } return $output; } /* We currently rely on the token ID mapping to be the same between PHP 5 and PHP 7 - so the same lexer can be used for * both. This is enforced by sharing this token file. */ %right T_THROW %left T_INCLUDE T_INCLUDE_ONCE T_EVAL T_REQUIRE T_REQUIRE_ONCE %left ',' %left T_LOGICAL_OR %left T_LOGICAL_XOR %left T_LOGICAL_AND %right T_PRINT %right T_YIELD %right T_DOUBLE_ARROW %right T_YIELD_FROM %left '=' T_PLUS_EQUAL T_MINUS_EQUAL T_MUL_EQUAL T_DIV_EQUAL T_CONCAT_EQUAL T_MOD_EQUAL T_AND_EQUAL T_OR_EQUAL T_XOR_EQUAL T_SL_EQUAL T_SR_EQUAL T_POW_EQUAL T_COALESCE_EQUAL %left '?' ':' %right T_COALESCE %left T_BOOLEAN_OR %left T_BOOLEAN_AND %left '|' %left '^' %left T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG %nonassoc T_IS_EQUAL T_IS_NOT_EQUAL T_IS_IDENTICAL T_IS_NOT_IDENTICAL T_SPACESHIP %nonassoc '<' T_IS_SMALLER_OR_EQUAL '>' T_IS_GREATER_OR_EQUAL %left T_SL T_SR %left '+' '-' '.' %left '*' '/' '%' %right '!' %nonassoc T_INSTANCEOF %right '~' T_INC T_DEC T_INT_CAST T_DOUBLE_CAST T_STRING_CAST T_ARRAY_CAST T_OBJECT_CAST T_BOOL_CAST T_UNSET_CAST '@' %right T_POW %right '[' %nonassoc T_NEW T_CLONE %token T_EXIT %token T_IF %left T_ELSEIF %left T_ELSE %left T_ENDIF %token T_LNUMBER %token T_DNUMBER %token T_STRING %token T_STRING_VARNAME %token T_VARIABLE %token T_NUM_STRING %token T_INLINE_HTML %token T_ENCAPSED_AND_WHITESPACE %token T_CONSTANT_ENCAPSED_STRING %token T_ECHO %token T_DO %token T_WHILE %token T_ENDWHILE %token T_FOR %token T_ENDFOR %token T_FOREACH %token T_ENDFOREACH %token T_DECLARE %token T_ENDDECLARE %token T_AS %token T_SWITCH %token T_MATCH %token T_ENDSWITCH %token T_CASE %token T_DEFAULT %token T_BREAK %token T_CONTINUE %token T_GOTO %token T_FUNCTION %token T_FN %token T_CONST %token T_RETURN %token T_TRY %token T_CATCH %token T_FINALLY %token T_THROW %token T_USE %token T_INSTEADOF %token T_GLOBAL %right T_STATIC T_ABSTRACT T_FINAL T_PRIVATE T_PROTECTED T_PUBLIC T_READONLY %token T_VAR %token T_UNSET %token T_ISSET %token T_EMPTY %token T_HALT_COMPILER %token T_CLASS %token T_TRAIT %token T_INTERFACE %token T_ENUM %token T_EXTENDS %token T_IMPLEMENTS %token T_OBJECT_OPERATOR %token T_NULLSAFE_OBJECT_OPERATOR %token T_DOUBLE_ARROW %token T_LIST %token T_ARRAY %token T_CALLABLE %token T_CLASS_C %token T_TRAIT_C %token T_METHOD_C %token T_FUNC_C %token T_LINE %token T_FILE %token T_START_HEREDOC %token T_END_HEREDOC %token T_DOLLAR_OPEN_CURLY_BRACES %token T_CURLY_OPEN %token T_PAAMAYIM_NEKUDOTAYIM %token T_NAMESPACE %token T_NS_C %token T_DIR %token T_NS_SEPARATOR %token T_ELLIPSIS %token T_NAME_FULLY_QUALIFIED %token T_NAME_QUALIFIED %token T_NAME_RELATIVE %token T_ATTRIBUTE %token T_ENUM BSD 3-Clause License Copyright (c) 2011, Nikita Popov All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #!/usr/bin/env php ['startLine', 'endLine', 'startFilePos', 'endFilePos', 'comments']]); $parser = (new PhpParser\ParserFactory())->create(PhpParser\ParserFactory::PREFER_PHP7, $lexer); $dumper = new PhpParser\NodeDumper(['dumpComments' => \true, 'dumpPositions' => $attributes['with-positions']]); $prettyPrinter = new PhpParser\PrettyPrinter\Standard(); $traverser = new PhpParser\NodeTraverser(); $traverser->addVisitor(new PhpParser\NodeVisitor\NameResolver()); foreach ($files as $file) { if (\strpos($file, ' Code {$code}\n"); } else { if (!\file_exists($file)) { \fwrite(\STDERR, "File {$file} does not exist.\n"); exit(1); } $code = \file_get_contents($file); \fwrite(\STDERR, "====> File {$file}:\n"); } if ($attributes['with-recovery']) { $errorHandler = new PhpParser\ErrorHandler\Collecting(); $stmts = $parser->parse($code, $errorHandler); foreach ($errorHandler->getErrors() as $error) { $message = formatErrorMessage($error, $code, $attributes['with-column-info']); \fwrite(\STDERR, $message . "\n"); } if (null === $stmts) { continue; } } else { try { $stmts = $parser->parse($code); } catch (PhpParser\Error $error) { $message = formatErrorMessage($error, $code, $attributes['with-column-info']); \fwrite(\STDERR, $message . "\n"); exit(1); } } foreach ($operations as $operation) { if ('dump' === $operation) { \fwrite(\STDERR, "==> Node dump:\n"); echo $dumper->dump($stmts, $code), "\n"; } elseif ('pretty-print' === $operation) { \fwrite(\STDERR, "==> Pretty print:\n"); echo $prettyPrinter->prettyPrintFile($stmts), "\n"; } elseif ('json-dump' === $operation) { \fwrite(\STDERR, "==> JSON dump:\n"); echo \json_encode($stmts, \JSON_PRETTY_PRINT), "\n"; } elseif ('var-dump' === $operation) { \fwrite(\STDERR, "==> var_dump():\n"); \var_dump($stmts); } elseif ('resolve-names' === $operation) { \fwrite(\STDERR, "==> Resolved names.\n"); $stmts = $traverser->traverse($stmts); } } } function formatErrorMessage(PhpParser\Error $e, $code, $withColumnInfo) { if ($withColumnInfo && $e->hasColumnInfo()) { return $e->getMessageWithColumnInfo($code); } else { return $e->getMessage(); } } function showHelp($error = '') { if ($error) { \fwrite(\STDERR, $error . "\n\n"); } \fwrite($error ? \STDERR : \STDOUT, << \false, 'with-positions' => \false, 'with-recovery' => \false]; \array_shift($args); $parseOptions = \true; foreach ($args as $arg) { if (!$parseOptions) { $files[] = $arg; continue; } switch ($arg) { case '--dump': case '-d': $operations[] = 'dump'; break; case '--pretty-print': case '-p': $operations[] = 'pretty-print'; break; case '--json-dump': case '-j': $operations[] = 'json-dump'; break; case '--var-dump': $operations[] = 'var-dump'; break; case '--resolve-names': case '-N': $operations[] = 'resolve-names'; break; case '--with-column-info': case '-c': $attributes['with-column-info'] = \true; break; case '--with-positions': case '-P': $attributes['with-positions'] = \true; break; case '--with-recovery': case '-r': $attributes['with-recovery'] = \true; break; case '--help': case '-h': showHelp(); break; case '--': $parseOptions = \false; break; default: if ($arg[0] === '-') { showHelp("Invalid operation {$arg}."); } else { $files[] = $arg; } } } return [$operations, $files, $attributes]; } isFqsen($fqsen)) { return new Fqsen($fqsen); } return $this->resolvePartialStructuralElementName($fqsen, $context); } /** * Tests whether the given type is a Fully Qualified Structural Element Name. */ private function isFqsen(string $type) : bool { return strpos($type, self::OPERATOR_NAMESPACE) === 0; } /** * Resolves a partial Structural Element Name (i.e. `Reflection\DocBlock`) to its FQSEN representation * (i.e. `\phpDocumentor\Reflection\DocBlock`) based on the Namespace and aliases mentioned in the Context. * * @throws InvalidArgumentException When type is not a valid FQSEN. */ private function resolvePartialStructuralElementName(string $type, Context $context) : Fqsen { $typeParts = explode(self::OPERATOR_NAMESPACE, $type, 2); $namespaceAliases = $context->getNamespaceAliases(); // if the first segment is not an alias; prepend namespace name and return if (!isset($namespaceAliases[$typeParts[0]])) { $namespace = $context->getNamespace(); if ($namespace !== '') { $namespace .= self::OPERATOR_NAMESPACE; } return new Fqsen(self::OPERATOR_NAMESPACE . $namespace . $type); } $typeParts[0] = $namespaceAliases[$typeParts[0]]; return new Fqsen(self::OPERATOR_NAMESPACE . implode(self::OPERATOR_NAMESPACE, $typeParts)); } } $reflector */ return $this->createFromReflectionClass($reflector); } if ($reflector instanceof ReflectionParameter) { return $this->createFromReflectionParameter($reflector); } if ($reflector instanceof ReflectionMethod) { return $this->createFromReflectionMethod($reflector); } if ($reflector instanceof ReflectionProperty) { return $this->createFromReflectionProperty($reflector); } if ($reflector instanceof ReflectionClassConstant) { return $this->createFromReflectionClassConstant($reflector); } throw new UnexpectedValueException('Unhandled \\Reflector instance given: ' . get_class($reflector)); } private function createFromReflectionParameter(ReflectionParameter $parameter) : Context { $class = $parameter->getDeclaringClass(); if (!$class) { throw new InvalidArgumentException('Unable to get class of ' . $parameter->getName()); } return $this->createFromReflectionClass($class); } private function createFromReflectionMethod(ReflectionMethod $method) : Context { $class = $method->getDeclaringClass(); return $this->createFromReflectionClass($class); } private function createFromReflectionProperty(ReflectionProperty $property) : Context { $class = $property->getDeclaringClass(); return $this->createFromReflectionClass($class); } private function createFromReflectionClassConstant(ReflectionClassConstant $constant) : Context { //phpcs:ignore SlevomatCodingStandard.Commenting.InlineDocCommentDeclaration.MissingVariable /** @phpstan-var ReflectionClass $class */ $class = $constant->getDeclaringClass(); return $this->createFromReflectionClass($class); } /** * @phpstan-param ReflectionClass $class */ private function createFromReflectionClass(ReflectionClass $class) : Context { $fileName = $class->getFileName(); $namespace = $class->getNamespaceName(); if (is_string($fileName) && file_exists($fileName)) { $contents = file_get_contents($fileName); if ($contents === \false) { throw new RuntimeException('Unable to read file "' . $fileName . '"'); } return $this->createForNamespace($namespace, $contents); } return new Context($namespace, []); } /** * Build a Context for a namespace in the provided file contents. * * @see Context for more information on Contexts. * * @param string $namespace It does not matter if a `\` precedes the namespace name, * this method first normalizes. * @param string $fileContents The file's contents to retrieve the aliases from with the given namespace. */ public function createForNamespace(string $namespace, string $fileContents) : Context { $namespace = trim($namespace, '\\'); $useStatements = []; $currentNamespace = ''; $tokens = new ArrayIterator(token_get_all($fileContents)); while ($tokens->valid()) { $currentToken = $tokens->current(); switch ($currentToken[0]) { case T_NAMESPACE: $currentNamespace = $this->parseNamespace($tokens); break; case T_CLASS: // Fast-forward the iterator through the class so that any // T_USE tokens found within are skipped - these are not // valid namespace use statements so should be ignored. $braceLevel = 0; $firstBraceFound = \false; while ($tokens->valid() && ($braceLevel > 0 || !$firstBraceFound)) { $currentToken = $tokens->current(); if ($currentToken === '{' || in_array($currentToken[0], [T_CURLY_OPEN, T_DOLLAR_OPEN_CURLY_BRACES], \true)) { if (!$firstBraceFound) { $firstBraceFound = \true; } ++$braceLevel; } if ($currentToken === '}') { --$braceLevel; } $tokens->next(); } break; case T_USE: if ($currentNamespace === $namespace) { $useStatements += $this->parseUseStatement($tokens); } break; } $tokens->next(); } return new Context($namespace, $useStatements); } /** * Deduce the name from tokens when we are at the T_NAMESPACE token. * * @param ArrayIterator $tokens */ private function parseNamespace(ArrayIterator $tokens) : string { // skip to the first string or namespace separator $this->skipToNextStringOrNamespaceSeparator($tokens); $name = ''; $acceptedTokens = [T_STRING, T_NS_SEPARATOR, T_NAME_QUALIFIED]; while ($tokens->valid() && in_array($tokens->current()[0], $acceptedTokens, \true)) { $name .= $tokens->current()[1]; $tokens->next(); } return $name; } /** * Deduce the names of all imports when we are at the T_USE token. * * @param ArrayIterator $tokens * * @return string[] * @psalm-return array */ private function parseUseStatement(ArrayIterator $tokens) : array { $uses = []; while ($tokens->valid()) { $this->skipToNextStringOrNamespaceSeparator($tokens); $uses += $this->extractUseStatements($tokens); $currentToken = $tokens->current(); if ($currentToken[0] === self::T_LITERAL_END_OF_USE) { return $uses; } } return $uses; } /** * Fast-forwards the iterator as longs as we don't encounter a T_STRING or T_NS_SEPARATOR token. * * @param ArrayIterator $tokens */ private function skipToNextStringOrNamespaceSeparator(ArrayIterator $tokens) : void { while ($tokens->valid()) { $currentToken = $tokens->current(); if (in_array($currentToken[0], [T_STRING, T_NS_SEPARATOR], \true)) { break; } if ($currentToken[0] === T_NAME_QUALIFIED) { break; } if (defined('T_NAME_FULLY_QUALIFIED') && $currentToken[0] === T_NAME_FULLY_QUALIFIED) { break; } $tokens->next(); } } /** * Deduce the namespace name and alias of an import when we are at the T_USE token or have not reached the end of * a USE statement yet. This will return a key/value array of the alias => namespace. * * @param ArrayIterator $tokens * * @return string[] * @psalm-return array * * @psalm-suppress TypeDoesNotContainType */ private function extractUseStatements(ArrayIterator $tokens) : array { $extractedUseStatements = []; $groupedNs = ''; $currentNs = ''; $currentAlias = ''; $state = 'start'; while ($tokens->valid()) { $currentToken = $tokens->current(); $tokenId = is_string($currentToken) ? $currentToken : $currentToken[0]; $tokenValue = is_string($currentToken) ? null : $currentToken[1]; switch ($state) { case 'start': switch ($tokenId) { case T_STRING: case T_NS_SEPARATOR: $currentNs .= (string) $tokenValue; $currentAlias = $tokenValue; break; case T_NAME_QUALIFIED: case T_NAME_FULLY_QUALIFIED: $currentNs .= (string) $tokenValue; $currentAlias = substr((string) $tokenValue, (int) strrpos((string) $tokenValue, '\\') + 1); break; case T_CURLY_OPEN: case '{': $state = 'grouped'; $groupedNs = $currentNs; break; case T_AS: $state = 'start-alias'; break; case self::T_LITERAL_USE_SEPARATOR: case self::T_LITERAL_END_OF_USE: $state = 'end'; break; default: break; } break; case 'start-alias': switch ($tokenId) { case T_STRING: $currentAlias = $tokenValue; break; case self::T_LITERAL_USE_SEPARATOR: case self::T_LITERAL_END_OF_USE: $state = 'end'; break; default: break; } break; case 'grouped': switch ($tokenId) { case T_STRING: case T_NS_SEPARATOR: $currentNs .= (string) $tokenValue; $currentAlias = $tokenValue; break; case T_AS: $state = 'grouped-alias'; break; case self::T_LITERAL_USE_SEPARATOR: $state = 'grouped'; $extractedUseStatements[(string) $currentAlias] = $currentNs; $currentNs = $groupedNs; $currentAlias = ''; break; case self::T_LITERAL_END_OF_USE: $state = 'end'; break; default: break; } break; case 'grouped-alias': switch ($tokenId) { case T_STRING: $currentAlias = $tokenValue; break; case self::T_LITERAL_USE_SEPARATOR: $state = 'grouped'; $extractedUseStatements[(string) $currentAlias] = $currentNs; $currentNs = $groupedNs; $currentAlias = ''; break; case self::T_LITERAL_END_OF_USE: $state = 'end'; break; default: break; } } if ($state === 'end') { break; } $tokens->next(); } if ($groupedNs !== $currentNs) { $extractedUseStatements[(string) $currentAlias] = $currentNs; } return $extractedUseStatements; } } fqsen = $fqsen; } /** * Returns the FQSEN associated with this object. */ public function getFqsen() : ?Fqsen { return $this->fqsen; } /** * Returns a rendered output of the Type as it would be used in a DocBlock. */ public function __toString() : string { if ($this->fqsen === null) { return 'interface-string'; } return 'interface-string<' . (string) $this->fqsen . '>'; } } ` * 2. `ACollectionObject` * * - ACollectionObject can be 'array' or an object that can act as an array * - aValueType and aKeyType can be any type expression * * @psalm-immutable */ final class Collection extends AbstractList { private ?Fqsen $fqsen; /** * Initializes this representation of an array with the given Type or Fqsen. */ public function __construct(?Fqsen $fqsen, Type $valueType, ?Type $keyType = null) { parent::__construct($valueType, $keyType); $this->fqsen = $fqsen; } /** * Returns the FQSEN associated with this object. */ public function getFqsen() : ?Fqsen { return $this->fqsen; } /** * Returns a rendered output of the Type as it would be used in a DocBlock. */ public function __toString() : string { $objectType = (string) ($this->fqsen ?? 'object'); if ($this->keyType === null) { return $objectType . '<' . $this->valueType . '>'; } return $objectType . '<' . $this->keyType . ',' . $this->valueType . '>'; } } valueType = $valueType; $this->defaultKeyType = new Compound([new String_(), new Integer()]); $this->keyType = $keyType; } /** * Returns the type for the keys of this array. */ public function getKeyType() : Type { return $this->keyType ?? $this->defaultKeyType; } /** * Returns the type for the values of this array. */ public function getValueType() : Type { return $this->valueType; } /** * Returns a rendered output of the Type as it would be used in a DocBlock. */ public function __toString() : string { if ($this->keyType) { return 'array<' . $this->keyType . ',' . $this->valueType . '>'; } if ($this->valueType instanceof Mixed_) { return 'array'; } if ($this->valueType instanceof Compound) { return '(' . $this->valueType . ')[]'; } return $this->valueType . '[]'; } } */ abstract class AggregatedType implements Type, IteratorAggregate { /** * @psalm-allow-private-mutation * @var array */ private array $types = []; private string $token; /** * @param array $types */ public function __construct(array $types, string $token) { foreach ($types as $type) { $this->add($type); } $this->token = $token; } /** * Returns the type at the given index. */ public function get(int $index) : ?Type { if (!$this->has($index)) { return null; } return $this->types[$index]; } /** * Tests if this compound type has a type with the given index. */ public function has(int $index) : bool { return array_key_exists($index, $this->types); } /** * Tests if this compound type contains the given type. */ public function contains(Type $type) : bool { foreach ($this->types as $typePart) { // if the type is duplicate; do not add it if ((string) $typePart === (string) $type) { return \true; } } return \false; } /** * Returns a rendered output of the Type as it would be used in a DocBlock. */ public function __toString() : string { return implode($this->token, $this->types); } /** * @return ArrayIterator */ public function getIterator() : ArrayIterator { return new ArrayIterator($this->types); } /** * @psalm-suppress ImpureMethodCall */ private function add(Type $type) : void { if ($type instanceof self) { foreach ($type->getIterator() as $subType) { $this->add($subType); } return; } // if the type is duplicate; do not add it if ($this->contains($type)) { return; } $this->types[] = $type; } } $types */ public function __construct(array $types) { parent::__construct($types, '|'); } } $types */ public function __construct(array $types) { parent::__construct($types, '&'); } } valueType = $valueType; } /** * Returns the value for the keys of this array. */ public function getValueType() : Type { return $this->valueType; } /** * Returns a rendered output of the Type as it would be used in a DocBlock. */ public function __toString() : string { return '(' . $this->valueType . ')'; } } Fully Qualified Namespace. * @psalm-var array */ private array $namespaceAliases; /** * Initializes the new context and normalizes all passed namespaces to be in Qualified Namespace Name (QNN) * format (without a preceding `\`). * * @param string $namespace The namespace where this DocBlock resides in. * @param string[] $namespaceAliases List of namespace aliases => Fully Qualified Namespace. * @psalm-param array $namespaceAliases */ public function __construct(string $namespace, array $namespaceAliases = []) { $this->namespace = $namespace !== 'global' && $namespace !== 'default' ? trim($namespace, '\\') : ''; foreach ($namespaceAliases as $alias => $fqnn) { if ($fqnn[0] === '\\') { $fqnn = substr($fqnn, 1); } if ($fqnn[strlen($fqnn) - 1] === '\\') { $fqnn = substr($fqnn, 0, -1); } $namespaceAliases[$alias] = $fqnn; } $this->namespaceAliases = $namespaceAliases; } /** * Returns the Qualified Namespace Name (thus without `\` in front) where the associated element is in. */ public function getNamespace() : string { return $this->namespace; } /** * Returns a list of Qualified Namespace Names (thus without `\` in front) that are imported, the keys represent * the alias for the imported Namespace. * * @return string[] * @psalm-return array */ public function getNamespaceAliases() : array { return $this->namespaceAliases; } } fqsen = $fqsen; } public function underlyingType() : Type { return new String_(); } /** * Returns the FQSEN associated with this object. */ public function getFqsen() : ?Fqsen { return $this->fqsen; } /** * Returns a rendered output of the Type as it would be used in a DocBlock. */ public function __toString() : string { if ($this->fqsen === null) { return 'class-string'; } return 'class-string<' . (string) $this->fqsen . '>'; } } realType = $realType; } /** * Provide access to the actual type directly, if needed. */ public function getActualType() : Type { return $this->realType; } /** * Returns a rendered output of the Type as it would be used in a DocBlock. */ public function __toString() : string { return '?' . $this->realType->__toString(); } } fqsen = $fqsen; } /** * Returns the FQSEN associated with this object. */ public function getFqsen() : ?Fqsen { return $this->fqsen; } public function __toString() : string { if ($this->fqsen) { return (string) $this->fqsen; } return 'object'; } } keyType) { return 'iterable<' . $this->keyType . ',' . $this->valueType . '>'; } if ($this->valueType instanceof Mixed_) { return 'iterable'; } return 'iterable<' . $this->valueType . '>'; } } List of recognized keywords and unto which Value Object they map * @psalm-var array> */ private array $keywords = ['string' => String_::class, 'class-string' => ClassString::class, 'interface-string' => InterfaceString::class, 'html-escaped-string' => HtmlEscapedString::class, 'lowercase-string' => LowercaseString::class, 'non-empty-lowercase-string' => NonEmptyLowercaseString::class, 'non-empty-string' => NonEmptyString::class, 'numeric-string' => NumericString::class, 'numeric' => Numeric_::class, 'trait-string' => TraitString::class, 'int' => Integer::class, 'integer' => Integer::class, 'positive-int' => PositiveInteger::class, 'negative-int' => NegativeInteger::class, 'bool' => Boolean::class, 'boolean' => Boolean::class, 'real' => Float_::class, 'float' => Float_::class, 'double' => Float_::class, 'object' => Object_::class, 'mixed' => Mixed_::class, 'array' => Array_::class, 'array-key' => ArrayKey::class, 'resource' => Resource_::class, 'void' => Void_::class, 'null' => Null_::class, 'scalar' => Scalar::class, 'callback' => Callable_::class, 'callable' => Callable_::class, 'callable-string' => CallableString::class, 'false' => False_::class, 'true' => True_::class, 'literal-string' => LiteralString::class, 'self' => Self_::class, '$this' => This::class, 'static' => Static_::class, 'parent' => Parent_::class, 'iterable' => Iterable_::class, 'never' => Never_::class, 'list' => List_::class]; /** @psalm-readonly */ private FqsenResolver $fqsenResolver; /** * Initializes this TypeResolver with the means to create and resolve Fqsen objects. */ public function __construct(?FqsenResolver $fqsenResolver = null) { $this->fqsenResolver = $fqsenResolver ?: new FqsenResolver(); } /** * Analyzes the given type and returns the FQCN variant. * * When a type is provided this method checks whether it is not a keyword or * Fully Qualified Class Name. If so it will use the given namespace and * aliases to expand the type to a FQCN representation. * * This method only works as expected if the namespace and aliases are set; * no dynamic reflection is being performed here. * * @uses Context::getNamespaceAliases() to check whether the first part of the relative type name should not be * replaced with another namespace. * @uses Context::getNamespace() to determine with what to prefix the type name. * * @param string $type The relative or absolute type. */ public function resolve(string $type, ?Context $context = null) : Type { $type = trim($type); if (!$type) { throw new InvalidArgumentException('Attempted to resolve "' . $type . '" but it appears to be empty'); } if ($context === null) { $context = new Context(''); } // split the type string into tokens `|`, `?`, `<`, `>`, `,`, `(`, `)`, `[]`, '<', '>' and type names $tokens = preg_split('/(\\||\\?|<|>|&|, ?|\\(|\\)|\\[\\]+)/', $type, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); if ($tokens === \false) { throw new InvalidArgumentException('Unable to split the type string "' . $type . '" into tokens'); } /** @var ArrayIterator $tokenIterator */ $tokenIterator = new ArrayIterator($tokens); return $this->parseTypes($tokenIterator, $context, self::PARSER_IN_COMPOUND); } /** * Analyse each tokens and creates types * * @param ArrayIterator $tokens the iterator on tokens * @param int $parserContext on of self::PARSER_* constants, indicating * the context where we are in the parsing */ private function parseTypes(ArrayIterator $tokens, Context $context, int $parserContext) : Type { $types = []; $token = ''; $compoundToken = '|'; while ($tokens->valid()) { $token = $tokens->current(); if ($token === null) { throw new RuntimeException('Unexpected nullable character'); } if ($token === '|' || $token === '&') { if (count($types) === 0) { throw new RuntimeException('A type is missing before a type separator'); } if (!in_array($parserContext, [self::PARSER_IN_COMPOUND, self::PARSER_IN_ARRAY_EXPRESSION, self::PARSER_IN_COLLECTION_EXPRESSION, self::PARSER_IN_NULLABLE], \true)) { throw new RuntimeException('Unexpected type separator'); } $compoundToken = $token; $tokens->next(); } elseif ($token === '?') { if (!in_array($parserContext, [self::PARSER_IN_COMPOUND, self::PARSER_IN_ARRAY_EXPRESSION, self::PARSER_IN_COLLECTION_EXPRESSION, self::PARSER_IN_NULLABLE], \true)) { throw new RuntimeException('Unexpected nullable character'); } $tokens->next(); $type = $this->parseTypes($tokens, $context, self::PARSER_IN_NULLABLE); $types[] = new Nullable($type); } elseif ($token === '(') { $tokens->next(); $type = $this->parseTypes($tokens, $context, self::PARSER_IN_ARRAY_EXPRESSION); $token = $tokens->current(); if ($token === null) { // Someone did not properly close their array expression .. break; } $tokens->next(); $resolvedType = new Expression($type); $types[] = $resolvedType; } elseif ($parserContext === self::PARSER_IN_ARRAY_EXPRESSION && isset($token[0]) && $token[0] === ')') { break; } elseif ($token === '<') { if (count($types) === 0) { throw new RuntimeException('Unexpected collection operator "<", class name is missing'); } $classType = array_pop($types); if ($classType !== null) { if ((string) $classType === 'class-string') { $types[] = $this->resolveClassString($tokens, $context); } elseif ((string) $classType === 'int') { $types[] = $this->resolveIntRange($tokens); } elseif ((string) $classType === 'interface-string') { $types[] = $this->resolveInterfaceString($tokens, $context); } else { $types[] = $this->resolveCollection($tokens, $classType, $context); } } $tokens->next(); } elseif ($parserContext === self::PARSER_IN_COLLECTION_EXPRESSION && ($token === '>' || trim($token) === ',')) { break; } elseif ($token === self::OPERATOR_ARRAY) { $last = array_key_last($types); if ($last === null) { throw new InvalidArgumentException('Unexpected array operator'); } $lastItem = $types[$last]; if ($lastItem instanceof Expression) { $lastItem = $lastItem->getValueType(); } $types[$last] = new Array_($lastItem); $tokens->next(); } else { $types[] = $this->resolveSingleType($token, $context); $tokens->next(); } } if ($token === '|' || $token === '&') { throw new RuntimeException('A type is missing after a type separator'); } if (count($types) === 0) { if ($parserContext === self::PARSER_IN_NULLABLE) { throw new RuntimeException('A type is missing after a nullable character'); } if ($parserContext === self::PARSER_IN_ARRAY_EXPRESSION) { throw new RuntimeException('A type is missing in an array expression'); } if ($parserContext === self::PARSER_IN_COLLECTION_EXPRESSION) { throw new RuntimeException('A type is missing in a collection expression'); } } elseif (count($types) === 1) { return current($types); } if ($compoundToken === '|') { return new Compound(array_values($types)); } return new Intersection(array_values($types)); } /** * resolve the given type into a type object * * @param string $type the type string, representing a single type * * @return Type|Array_|Object_ * * @psalm-mutation-free */ private function resolveSingleType(string $type, Context $context) : object { switch (\true) { case $this->isKeyword($type): return $this->resolveKeyword($type); case $this->isFqsen($type): return $this->resolveTypedObject($type); case $this->isPartialStructuralElementName($type): return $this->resolveTypedObject($type, $context); // @codeCoverageIgnoreStart default: // I haven't got the foggiest how the logic would come here but added this as a defense. throw new RuntimeException('Unable to resolve type "' . $type . '", there is no known method to resolve it'); } // @codeCoverageIgnoreEnd } /** * Adds a keyword to the list of Keywords and associates it with a specific Value Object. * * @psalm-param class-string $typeClassName */ public function addKeyword(string $keyword, string $typeClassName) : void { if (!class_exists($typeClassName)) { throw new InvalidArgumentException('The Value Object that needs to be created with a keyword "' . $keyword . '" must be an existing class' . ' but we could not find the class ' . $typeClassName); } $interfaces = class_implements($typeClassName); if ($interfaces === \false) { throw new InvalidArgumentException('The Value Object that needs to be created with a keyword "' . $keyword . '" must be an existing class' . ' but we could not find the class ' . $typeClassName); } if (!in_array(Type::class, $interfaces, \true)) { throw new InvalidArgumentException('The class "' . $typeClassName . '" must implement the interface "phpDocumentor\\Reflection\\Type"'); } $this->keywords[$keyword] = $typeClassName; } /** * Detects whether the given type represents a PHPDoc keyword. * * @param string $type A relative or absolute type as defined in the phpDocumentor documentation. * * @psalm-mutation-free */ private function isKeyword(string $type) : bool { return array_key_exists(strtolower($type), $this->keywords); } /** * Detects whether the given type represents a relative structural element name. * * @param string $type A relative or absolute type as defined in the phpDocumentor documentation. * * @psalm-mutation-free */ private function isPartialStructuralElementName(string $type) : bool { return isset($type[0]) && $type[0] !== self::OPERATOR_NAMESPACE && !$this->isKeyword($type); } /** * Tests whether the given type is a Fully Qualified Structural Element Name. * * @psalm-mutation-free */ private function isFqsen(string $type) : bool { return strpos($type, self::OPERATOR_NAMESPACE) === 0; } /** * Resolves the given keyword (such as `string`) into a Type object representing that keyword. * * @psalm-mutation-free */ private function resolveKeyword(string $type) : Type { $className = $this->keywords[strtolower($type)]; return new $className(); } /** * Resolves the given FQSEN string into an FQSEN object. * * @psalm-mutation-free */ private function resolveTypedObject(string $type, ?Context $context = null) : Object_ { return new Object_($this->fqsenResolver->resolve($type, $context)); } /** * Resolves class string * * @param ArrayIterator $tokens */ private function resolveClassString(ArrayIterator $tokens, Context $context) : Type { $tokens->next(); $classType = $this->parseTypes($tokens, $context, self::PARSER_IN_COLLECTION_EXPRESSION); if (!$classType instanceof Object_ || $classType->getFqsen() === null) { throw new RuntimeException($classType . ' is not a class string'); } $token = $tokens->current(); if ($token !== '>') { if (empty($token)) { throw new RuntimeException('class-string: ">" is missing'); } throw new RuntimeException('Unexpected character "' . $token . '", ">" is missing'); } return new ClassString($classType->getFqsen()); } /** * Resolves integer ranges * * @param ArrayIterator $tokens */ private function resolveIntRange(ArrayIterator $tokens) : Type { $tokens->next(); $token = ''; $minValue = null; $maxValue = null; $commaFound = \false; $tokenCounter = 0; while ($tokens->valid()) { $tokenCounter++; $token = $tokens->current(); if ($token === null) { throw new RuntimeException('Unexpected nullable character'); } $token = trim($token); if ($token === '>') { break; } if ($token === ',') { $commaFound = \true; } if ($commaFound === \false && $minValue === null) { if (is_numeric($token) || $token === 'max' || $token === 'min') { $minValue = $token; } } if ($commaFound === \true && $maxValue === null) { if (is_numeric($token) || $token === 'max' || $token === 'min') { $maxValue = $token; } } $tokens->next(); } if ($token !== '>') { if (empty($token)) { throw new RuntimeException('interface-string: ">" is missing'); } throw new RuntimeException('Unexpected character "' . $token . '", ">" is missing'); } if ($minValue === null || $maxValue === null || $tokenCounter > 4) { throw new RuntimeException('int has not the correct format'); } return new IntegerRange($minValue, $maxValue); } /** * Resolves class string * * @param ArrayIterator $tokens */ private function resolveInterfaceString(ArrayIterator $tokens, Context $context) : Type { $tokens->next(); $classType = $this->parseTypes($tokens, $context, self::PARSER_IN_COLLECTION_EXPRESSION); if (!$classType instanceof Object_ || $classType->getFqsen() === null) { throw new RuntimeException($classType . ' is not a interface string'); } $token = $tokens->current(); if ($token !== '>') { if (empty($token)) { throw new RuntimeException('interface-string: ">" is missing'); } throw new RuntimeException('Unexpected character "' . $token . '", ">" is missing'); } return new InterfaceString($classType->getFqsen()); } /** * Resolves the collection values and keys * * @param ArrayIterator $tokens * * @return Array_|Iterable_|Collection */ private function resolveCollection(ArrayIterator $tokens, Type $classType, Context $context) : Type { $isArray = (string) $classType === 'array'; $isIterable = (string) $classType === 'iterable'; $isList = (string) $classType === 'list'; // allow only "array", "iterable" or class name before "<" if (!$isArray && !$isIterable && !$isList && (!$classType instanceof Object_ || $classType->getFqsen() === null)) { throw new RuntimeException($classType . ' is not a collection'); } $tokens->next(); $valueType = $this->parseTypes($tokens, $context, self::PARSER_IN_COLLECTION_EXPRESSION); $keyType = null; $token = $tokens->current(); if ($token !== null && trim($token) === ',' && !$isList) { // if we have a comma, then we just parsed the key type, not the value type $keyType = $valueType; if ($isArray) { // check the key type for an "array" collection. We allow only // strings or integers. if (!$keyType instanceof ArrayKey && !$keyType instanceof String_ && !$keyType instanceof Integer && !$keyType instanceof Compound) { throw new RuntimeException('An array can have only integers or strings as keys'); } if ($keyType instanceof Compound) { foreach ($keyType->getIterator() as $item) { if (!$item instanceof ArrayKey && !$item instanceof String_ && !$item instanceof Integer) { throw new RuntimeException('An array can have only integers or strings as keys'); } } } } $tokens->next(); // now let's parse the value type $valueType = $this->parseTypes($tokens, $context, self::PARSER_IN_COLLECTION_EXPRESSION); } $token = $tokens->current(); if ($token !== '>') { if (empty($token)) { throw new RuntimeException('Collection: ">" is missing'); } throw new RuntimeException('Unexpected character "' . $token . '", ">" is missing'); } if ($isArray) { return new Array_($valueType, $keyType); } if ($isIterable) { return new Iterable_($valueType, $keyType); } if ($isList) { return new List_($valueType); } if ($classType instanceof Object_) { return $this->makeCollectionFromObject($classType, $valueType, $keyType); } throw new RuntimeException('Invalid $classType provided'); } /** * @psalm-pure */ private function makeCollectionFromObject(Object_ $object, Type $valueType, ?Type $keyType = null) : Collection { return new Collection($object->getFqsen(), $valueType, $keyType); } } minValue = $minValue; $this->maxValue = $maxValue; } public function underlyingType() : Type { return new Integer(); } public function getMinValue() : string { return $this->minValue; } public function getMaxValue() : string { return $this->maxValue; } /** * Returns a rendered output of the Type as it would be used in a DocBlock. */ public function __toString() : string { return 'int<' . $this->minValue . ', ' . $this->maxValue . '>'; } } valueType instanceof Mixed_) { return 'list'; } return 'list<' . $this->valueType . '>'; } } paths([__DIR__ . '/src', __DIR__ . '/tests/unit']); // register a single rule $rectorConfig->rule(InlineConstructorDefaultToPropertyRector::class); $rectorConfig->rule(Rector\CodeQuality\Rector\Class_\CompleteDynamicPropertiesRector::class); $rectorConfig->rule(Rector\TypeDeclaration\Rector\Closure\AddClosureReturnTypeRector::class); $rectorConfig->rule(Rector\PHPUnit\Rector\Class_\AddProphecyTraitRector::class); $rectorConfig->importNames(); // define sets of rules $rectorConfig->sets([LevelSetList::UP_TO_PHP_74]); }; descriptionFactory = $descriptionFactory; $this->tagFactory = $tagFactory; } /** * Factory method for easy instantiation. * * @param array> $additionalTags */ public static function createInstance(array $additionalTags = []) : self { $fqsenResolver = new FqsenResolver(); $tagFactory = new StandardTagFactory($fqsenResolver); $descriptionFactory = new DescriptionFactory($tagFactory); $tagFactory->addService($descriptionFactory); $tagFactory->addService(new TypeResolver($fqsenResolver)); $docBlockFactory = new self($descriptionFactory, $tagFactory); foreach ($additionalTags as $tagName => $tagHandler) { $docBlockFactory->registerTagHandler($tagName, $tagHandler); } return $docBlockFactory; } /** * @param object|string $docblock A string containing the DocBlock to parse or an object supporting the * getDocComment method (such as a ReflectionClass object). */ public function create($docblock, ?Types\Context $context = null, ?Location $location = null) : DocBlock { if (is_object($docblock)) { if (!method_exists($docblock, 'getDocComment')) { $exceptionMessage = 'Invalid object passed; the given object must support the getDocComment method'; throw new InvalidArgumentException($exceptionMessage); } $docblock = $docblock->getDocComment(); Assert::string($docblock); } Assert::stringNotEmpty($docblock); if ($context === null) { $context = new Types\Context(''); } $parts = $this->splitDocBlock($this->stripDocComment($docblock)); [$templateMarker, $summary, $description, $tags] = $parts; return new DocBlock($summary, $description ? $this->descriptionFactory->create($description, $context) : null, $this->parseTagBlock($tags, $context), $context, $location, $templateMarker === '#@+', $templateMarker === '#@-'); } /** * @param class-string $handler */ public function registerTagHandler(string $tagName, string $handler) : void { $this->tagFactory->registerTagHandler($tagName, $handler); } /** * Strips the asterisks from the DocBlock comment. * * @param string $comment String containing the comment text. */ private function stripDocComment(string $comment) : string { $comment = preg_replace('#[ \\t]*(?:\\/\\*\\*|\\*\\/|\\*)?[ \\t]?(.*)?#u', '$1', $comment); Assert::string($comment); $comment = trim($comment); // reg ex above is not able to remove */ from a single line docblock if (substr($comment, -2) === '*/') { $comment = trim(substr($comment, 0, -2)); } return str_replace(["\r\n", "\r"], "\n", $comment); } // phpcs:disable /** * Splits the DocBlock into a template marker, summary, description and block of tags. * * @param string $comment Comment to split into the sub-parts. * * @return string[] containing the template marker (if any), summary, description and a string containing the tags. * * @author Mike van Riel for extending the regex with template marker support. * * @author Richard van Velzen (@_richardJ) Special thanks to Richard for the regex responsible for the split. */ private function splitDocBlock(string $comment) : array { // phpcs:enable // Performance improvement cheat: if the first character is an @ then only tags are in this DocBlock. This // method does not split tags so we return this verbatim as the fourth result (tags). This saves us the // performance impact of running a regular expression if (strpos($comment, '@') === 0) { return ['', '', '', $comment]; } // clears all extra horizontal whitespace from the line endings to prevent parsing issues $comment = preg_replace('/\\h*$/Sum', '', $comment); Assert::string($comment); /* * Splits the docblock into a template marker, summary, description and tags section. * * - The template marker is empty, #@+ or #@- if the DocBlock starts with either of those (a newline may * occur after it and will be stripped). * - The short description is started from the first character until a dot is encountered followed by a * newline OR two consecutive newlines (horizontal whitespace is taken into account to consider spacing * errors). This is optional. * - The long description, any character until a new line is encountered followed by an @ and word * characters (a tag). This is optional. * - Tags; the remaining characters * * Big thanks to RichardJ for contributing this Regular Expression */ preg_match('/ \\A # 1. Extract the template marker (?:(\\#\\@\\+|\\#\\@\\-)\\n?)? # 2. Extract the summary (?: (?! @\\pL ) # The summary may not start with an @ ( [^\\n.]+ (?: (?! \\. \\n | \\n{2} ) # End summary upon a dot followed by newline or two newlines [\\n.]* (?! [ \\t]* @\\pL ) # End summary when an @ is found as first character on a new line [^\\n.]+ # Include anything else )* \\.? )? ) # 3. Extract the description (?: \\s* # Some form of whitespace _must_ precede a description because a summary must be there (?! @\\pL ) # The description may not start with an @ ( [^\\n]+ (?: \\n+ (?! [ \\t]* @\\pL ) # End description when an @ is found as first character on a new line [^\\n]+ # Include anything else )* ) )? # 4. Extract the tags (anything that follows) (\\s+ [\\s\\S]*)? # everything that follows /ux', $comment, $matches); array_shift($matches); while (count($matches) < 4) { $matches[] = ''; } return $matches; } /** * Creates the tag objects. * * @param string $tags Tag block to parse. * @param Types\Context $context Context of the parsed Tag * * @return DocBlock\Tag[] */ private function parseTagBlock(string $tags, Types\Context $context) : array { $tags = $this->filterTagBlock($tags); if ($tags === null) { return []; } $result = []; $lines = $this->splitTagBlockIntoTagLines($tags); foreach ($lines as $key => $tagLine) { $result[$key] = $this->tagFactory->create(trim($tagLine), $context); } return $result; } /** * @return string[] */ private function splitTagBlockIntoTagLines(string $tags) : array { $result = []; foreach (explode("\n", $tags) as $tagLine) { if ($tagLine !== '' && strpos($tagLine, '@') === 0) { $result[] = $tagLine; } else { $result[count($result) - 1] .= "\n" . $tagLine; } } return $result; } private function filterTagBlock(string $tags) : ?string { $tags = trim($tags); if (!$tags) { return null; } if ($tags[0] !== '@') { // @codeCoverageIgnoreStart // Can't simulate this; this only happens if there is an error with the parsing of the DocBlock that // we didn't foresee. throw new LogicException('A tag block started with text instead of an at-sign(@): ' . $tags); // @codeCoverageIgnoreEnd } return $tags; } } > $additionalTags */ public static function createInstance(array $additionalTags = []) : DocBlockFactory; /** * @param string|object $docblock */ public function create($docblock, ?Types\Context $context = null, ?Location $location = null) : DocBlock; } tagFactory = $tagFactory; } /** * Returns the parsed text of this description. */ public function create(string $contents, ?TypeContext $context = null) : Description { $tokens = $this->lex($contents); $count = count($tokens); $tagCount = 0; $tags = []; for ($i = 1; $i < $count; $i += 2) { $tags[] = $this->tagFactory->create($tokens[$i], $context); $tokens[$i] = '%' . ++$tagCount . '$s'; } //In order to allow "literal" inline tags, the otherwise invalid //sequence "{@}" is changed to "@", and "{}" is changed to "}". //"%" is escaped to "%%" because of vsprintf. //See unit tests for examples. for ($i = 0; $i < $count; $i += 2) { $tokens[$i] = str_replace(['{@}', '{}', '%'], ['@', '}', '%%'], $tokens[$i]); } return new Description(implode('', $tokens), $tags); } /** * Strips the contents from superfluous whitespace and splits the description into a series of tokens. * * @return string[] A series of tokens of which the description text is composed. */ private function lex(string $contents) : array { $contents = $this->removeSuperfluousStartingWhitespace($contents); // performance optimalization; if there is no inline tag, don't bother splitting it up. if (strpos($contents, '{@') === \false) { return [$contents]; } return Utils::pregSplit('/\\{ # "{@}" is not a valid inline tag. This ensures that we do not treat it as one, but treat it literally. (?!@\\}) # We want to capture the whole tag line, but without the inline tag delimiters. (\\@ # Match everything up to the next delimiter. [^{}]* # Nested inline tag content should not be captured, or it will appear in the result separately. (?: # Match nested inline tags. (?: # Because we did not catch the tag delimiters earlier, we must be explicit with them here. # Notice that this also matches "{}", as a way to later introduce it as an escape sequence. \\{(?1)?\\} | # Make sure we match hanging "{". \\{ ) # Match content after the nested inline tag. [^{}]* )* # If there are more inline tags, match them as well. We use "*" since there may not be any # nested inline tags. ) \\}/Sux', $contents, 0, PREG_SPLIT_DELIM_CAPTURE); } /** * Removes the superfluous from a multi-line description. * * When a description has more than one line then it can happen that the second and subsequent lines have an * additional indentation. This is commonly in use with tags like this: * * {@}since 1.1.0 This is an example * description where we have an * indentation in the second and * subsequent lines. * * If we do not normalize the indentation then we have superfluous whitespace on the second and subsequent * lines and this may cause rendering issues when, for example, using a Markdown converter. */ private function removeSuperfluousStartingWhitespace(string $contents) : string { $lines = Utils::pregSplit("/\r\n?|\n/", $contents); // if there is only one line then we don't have lines with superfluous whitespace and // can use the contents as-is if (count($lines) <= 1) { return $contents; } // determine how many whitespace characters need to be stripped $startingSpaceCount = 9999999; for ($i = 1, $iMax = count($lines); $i < $iMax; ++$i) { // lines with a no length do not count as they are not indented at all if (trim($lines[$i]) === '') { continue; } // determine the number of prefixing spaces by checking the difference in line length before and after // an ltrim $startingSpaceCount = min($startingSpaceCount, strlen($lines[$i]) - strlen(ltrim($lines[$i]))); } // strip the number of spaces from each line if ($startingSpaceCount > 0) { for ($i = 1, $iMax = count($lines); $i < $iMax; ++$i) { $lines[$i] = substr($lines[$i], $startingSpaceCount); } } return implode("\n", $lines); } } indent = $indent; $this->indentString = $indentString; $this->isFirstLineIndented = $indentFirstLine; $this->lineLength = $lineLength; $this->tagFormatter = $tagFormatter ?: new PassthroughFormatter(); $this->lineEnding = $lineEnding; } /** * Generate a DocBlock comment. * * @param DocBlock $docblock The DocBlock to serialize. * * @return string The serialized doc block. */ public function getDocComment(DocBlock $docblock) : string { $indent = str_repeat($this->indentString, $this->indent); $firstIndent = $this->isFirstLineIndented ? $indent : ''; // 3 === strlen(' * ') $wrapLength = $this->lineLength ? $this->lineLength - strlen($indent) - 3 : null; $text = $this->removeTrailingSpaces($indent, $this->addAsterisksForEachLine($indent, $this->getSummaryAndDescriptionTextBlock($docblock, $wrapLength))); $comment = $firstIndent . "/**\n"; if ($text) { $comment .= $indent . ' * ' . $text . "\n"; $comment .= $indent . " *\n"; } $comment = $this->addTagBlock($docblock, $wrapLength, $indent, $comment); return str_replace("\n", $this->lineEnding, $comment . $indent . ' */'); } private function removeTrailingSpaces(string $indent, string $text) : string { return str_replace(sprintf("\n%s * \n", $indent), sprintf("\n%s *\n", $indent), $text); } private function addAsterisksForEachLine(string $indent, string $text) : string { return str_replace("\n", sprintf("\n%s * ", $indent), $text); } private function getSummaryAndDescriptionTextBlock(DocBlock $docblock, ?int $wrapLength) : string { $text = $docblock->getSummary() . ((string) $docblock->getDescription() ? "\n\n" . $docblock->getDescription() : ''); if ($wrapLength !== null) { $text = wordwrap($text, $wrapLength); return $text; } return $text; } private function addTagBlock(DocBlock $docblock, ?int $wrapLength, string $indent, string $comment) : string { foreach ($docblock->getTags() as $tag) { $tagText = $this->tagFormatter->format($tag); if ($wrapLength !== null) { $tagText = wordwrap($tagText, $wrapLength); } $tagText = str_replace("\n", sprintf("\n%s * ", $indent), $tagText); $comment .= sprintf("%s * %s\n", $indent, $tagText); } return $comment; } } Important: each parameter in addition to the body variable for the `create` method must default to null, otherwise * > it violates the constraint with the interface; it is recommended to use the {@see Assert::notNull()} method to * > verify that a dependency is actually passed. * * This Factory also features a Service Locator component that is used to pass the right dependencies to the * `create` method of a tag; each dependency should be registered as a service or as a parameter. * * When you want to use a Tag of your own with custom handling you need to call the `registerTagHandler` method, pass * the name of the tag and a Fully Qualified Class Name pointing to a class that implements the Tag interface. */ final class StandardTagFactory implements TagFactory { /** PCRE regular expression matching a tag name. */ public const REGEX_TAGNAME = '[\\w\\-\\_\\\\:]+'; /** * @var array> An array with a tag as a key, and an * FQCN to a class that handles it as an array value. */ private $tagHandlerMappings = [ 'author' => Author::class, 'covers' => Covers::class, 'deprecated' => Deprecated::class, // 'example' => '\phpDocumentor\Reflection\DocBlock\Tags\Example', 'link' => LinkTag::class, 'method' => Method::class, 'param' => Param::class, 'property-read' => PropertyRead::class, 'property' => Property::class, 'property-write' => PropertyWrite::class, 'return' => Return_::class, 'see' => SeeTag::class, 'since' => Since::class, 'source' => Source::class, 'throw' => Throws::class, 'throws' => Throws::class, 'uses' => Uses::class, 'var' => Var_::class, 'version' => Version::class, ]; /** * @var array> An array with a anotation s a key, and an * FQCN to a class that handles it as an array value. */ private $annotationMappings = []; /** * @var ReflectionParameter[][] a lazy-loading cache containing parameters * for each tagHandler that has been used. */ private $tagHandlerParameterCache = []; /** @var FqsenResolver */ private $fqsenResolver; /** * @var mixed[] an array representing a simple Service Locator where we can store parameters and * services that can be inserted into the Factory Methods of Tag Handlers. */ private $serviceLocator = []; /** * Initialize this tag factory with the means to resolve an FQSEN and optionally a list of tag handlers. * * If no tag handlers are provided than the default list in the {@see self::$tagHandlerMappings} property * is used. * * @see self::registerTagHandler() to add a new tag handler to the existing default list. * * @param array> $tagHandlers */ public function __construct(FqsenResolver $fqsenResolver, ?array $tagHandlers = null) { $this->fqsenResolver = $fqsenResolver; if ($tagHandlers !== null) { $this->tagHandlerMappings = $tagHandlers; } $this->addService($fqsenResolver, FqsenResolver::class); } public function create(string $tagLine, ?TypeContext $context = null) : Tag { if (!$context) { $context = new TypeContext(''); } [$tagName, $tagBody] = $this->extractTagParts($tagLine); return $this->createTag(trim($tagBody), $tagName, $context); } /** * @param mixed $value */ public function addParameter(string $name, $value) : void { $this->serviceLocator[$name] = $value; } public function addService(object $service, ?string $alias = null) : void { $this->serviceLocator[$alias ?: get_class($service)] = $service; } public function registerTagHandler(string $tagName, string $handler) : void { Assert::stringNotEmpty($tagName); Assert::classExists($handler); Assert::implementsInterface($handler, Tag::class); if (strpos($tagName, '\\') && $tagName[0] !== '\\') { throw new InvalidArgumentException('A namespaced tag must have a leading backslash as it must be fully qualified'); } $this->tagHandlerMappings[$tagName] = $handler; } /** * Extracts all components for a tag. * * @return string[] */ private function extractTagParts(string $tagLine) : array { $matches = []; if (!preg_match('/^@(' . self::REGEX_TAGNAME . ')((?:[\\s\\(\\{])\\s*([^\\s].*)|$)/us', $tagLine, $matches)) { throw new InvalidArgumentException('The tag "' . $tagLine . '" does not seem to be wellformed, please check it for errors'); } if (count($matches) < 3) { $matches[] = ''; } return array_slice($matches, 1); } /** * Creates a new tag object with the given name and body or returns null if the tag name was recognized but the * body was invalid. */ private function createTag(string $body, string $name, TypeContext $context) : Tag { $handlerClassName = $this->findHandlerClassName($name, $context); $arguments = $this->getArgumentsForParametersFromWiring($this->fetchParametersForHandlerFactoryMethod($handlerClassName), $this->getServiceLocatorWithDynamicParameters($context, $name, $body)); try { $callable = [$handlerClassName, 'create']; Assert::isCallable($callable); /** @phpstan-var callable(string): ?Tag $callable */ $tag = call_user_func_array($callable, $arguments); return $tag ?? InvalidTag::create($body, $name); } catch (InvalidArgumentException $e) { return InvalidTag::create($body, $name)->withError($e); } } /** * Determines the Fully Qualified Class Name of the Factory or Tag (containing a Factory Method `create`). * * @return class-string */ private function findHandlerClassName(string $tagName, TypeContext $context) : string { $handlerClassName = Generic::class; if (isset($this->tagHandlerMappings[$tagName])) { $handlerClassName = $this->tagHandlerMappings[$tagName]; } elseif ($this->isAnnotation($tagName)) { // TODO: Annotation support is planned for a later stage and as such is disabled for now $tagName = (string) $this->fqsenResolver->resolve($tagName, $context); if (isset($this->annotationMappings[$tagName])) { $handlerClassName = $this->annotationMappings[$tagName]; } } return $handlerClassName; } /** * Retrieves the arguments that need to be passed to the Factory Method with the given Parameters. * * @param ReflectionParameter[] $parameters * @param mixed[] $locator * * @return mixed[] A series of values that can be passed to the Factory Method of the tag whose parameters * is provided with this method. */ private function getArgumentsForParametersFromWiring(array $parameters, array $locator) : array { $arguments = []; foreach ($parameters as $parameter) { $type = $parameter->getType(); $typeHint = null; if ($type instanceof ReflectionNamedType) { $typeHint = $type->getName(); if ($typeHint === 'self') { $declaringClass = $parameter->getDeclaringClass(); if ($declaringClass !== null) { $typeHint = $declaringClass->getName(); } } } if (isset($locator[$typeHint])) { $arguments[] = $locator[$typeHint]; continue; } $parameterName = $parameter->getName(); if (isset($locator[$parameterName])) { $arguments[] = $locator[$parameterName]; continue; } $arguments[] = null; } return $arguments; } /** * Retrieves a series of ReflectionParameter objects for the static 'create' method of the given * tag handler class name. * * @param class-string $handlerClassName * * @return ReflectionParameter[] */ private function fetchParametersForHandlerFactoryMethod(string $handlerClassName) : array { if (!isset($this->tagHandlerParameterCache[$handlerClassName])) { $methodReflection = new ReflectionMethod($handlerClassName, 'create'); $this->tagHandlerParameterCache[$handlerClassName] = $methodReflection->getParameters(); } return $this->tagHandlerParameterCache[$handlerClassName]; } /** * Returns a copy of this class' Service Locator with added dynamic parameters, * such as the tag's name, body and Context. * * @param TypeContext $context The Context (namespace and aliasses) that may be * passed and is used to resolve FQSENs. * @param string $tagName The name of the tag that may be * passed onto the factory method of the Tag class. * @param string $tagBody The body of the tag that may be * passed onto the factory method of the Tag class. * * @return mixed[] */ private function getServiceLocatorWithDynamicParameters(TypeContext $context, string $tagName, string $tagBody) : array { return array_merge($this->serviceLocator, ['name' => $tagName, 'body' => $tagBody, TypeContext::class => $context]); } /** * Returns whether the given tag belongs to an annotation. * * @todo this method should be populated once we implement Annotation notation support. */ private function isAnnotation(string $tagContent) : bool { // 1. Contains a namespace separator // 2. Contains parenthesis // 3. Is present in a list of known annotations (make the algorithm smart by first checking is the last part // of the annotation class name matches the found tag name return \false; } } $handler FQCN of handler. * * @throws InvalidArgumentException If the tag name is not a string. * @throws InvalidArgumentException If the tag name is namespaced (contains backslashes) but * does not start with a backslash. * @throws InvalidArgumentException If the handler is not a string. * @throws InvalidArgumentException If the handler is not an existing class. * @throws InvalidArgumentException If the handler does not implement the {@see Tag} interface. */ public function registerTagHandler(string $tagName, string $handler) : void; } create('This is a {@see Description}', $context); * * The description factory will interpret the given body and create a body template and list of tags from them, and pass * that onto the constructor if this class. * * > The $context variable is a class of type {@see \phpDocumentor\Reflection\Types\Context} and contains the namespace * > and the namespace aliases that apply to this DocBlock. These are used by the Factory to resolve and expand partial * > type names and FQSENs. * * If you do not want to use the DescriptionFactory you can pass a body template and tag listing like this: * * $description = new Description( * 'This is a %1$s', * [ new See(new Fqsen('\phpDocumentor\Reflection\DocBlock\Description')) ] * ); * * It is generally recommended to use the Factory as that will also apply escaping rules, while the Description object * is mainly responsible for rendering. * * @see DescriptionFactory to create a new Description. * @see Description\Formatter for the formatting of the body and tags. */ class Description { /** @var string */ private $bodyTemplate; /** @var Tag[] */ private $tags; /** * Initializes a Description with its body (template) and a listing of the tags used in the body template. * * @param Tag[] $tags */ public function __construct(string $bodyTemplate, array $tags = []) { $this->bodyTemplate = $bodyTemplate; $this->tags = $tags; } /** * Returns the body template. */ public function getBodyTemplate() : string { return $this->bodyTemplate; } /** * Returns the tags for this DocBlock. * * @return Tag[] */ public function getTags() : array { return $this->tags; } /** * Renders this description as a string where the provided formatter will format the tags in the expected string * format. */ public function render(?Formatter $formatter = null) : string { if ($formatter === null) { $formatter = new PassthroughFormatter(); } $tags = []; foreach ($this->tags as $tag) { $tags[] = '{' . $formatter->format($tag) . '}'; } return vsprintf($this->bodyTemplate, $tags); } /** * Returns a plain string representation of this description. */ public function __toString() : string { return $this->render(); } } getFilePath(); $file = $this->getExampleFileContents($filename); if (!$file) { return sprintf('** File not found : %s **', $filename); } return implode('', array_slice($file, $example->getStartingLine() - 1, $example->getLineCount())); } /** * Registers the project's root directory where an 'examples' folder can be expected. */ public function setSourceDirectory(string $directory = '') : void { $this->sourceDirectory = $directory; } /** * Returns the project's root directory where an 'examples' folder can be expected. */ public function getSourceDirectory() : string { return $this->sourceDirectory; } /** * Registers a series of directories that may contain examples. * * @param string[] $directories */ public function setExampleDirectories(array $directories) : void { $this->exampleDirectories = $directories; } /** * Returns a series of directories that may contain examples. * * @return string[] */ public function getExampleDirectories() : array { return $this->exampleDirectories; } /** * Attempts to find the requested example file and returns its contents or null if no file was found. * * This method will try several methods in search of the given example file, the first one it encounters is * returned: * * 1. Iterates through all examples folders for the given filename * 2. Checks the source folder for the given filename * 3. Checks the 'examples' folder in the current working directory for examples * 4. Checks the path relative to the current working directory for the given filename * * @return string[] all lines of the example file */ private function getExampleFileContents(string $filename) : ?array { $normalizedPath = null; foreach ($this->exampleDirectories as $directory) { $exampleFileFromConfig = $this->constructExamplePath($directory, $filename); if (is_readable($exampleFileFromConfig)) { $normalizedPath = $exampleFileFromConfig; break; } } if (!$normalizedPath) { if (is_readable($this->getExamplePathFromSource($filename))) { $normalizedPath = $this->getExamplePathFromSource($filename); } elseif (is_readable($this->getExamplePathFromExampleDirectory($filename))) { $normalizedPath = $this->getExamplePathFromExampleDirectory($filename); } elseif (is_readable($filename)) { $normalizedPath = $filename; } } $lines = $normalizedPath && is_readable($normalizedPath) ? file($normalizedPath) : \false; return $lines !== \false ? $lines : null; } /** * Get example filepath based on the example directory inside your project. */ private function getExamplePathFromExampleDirectory(string $file) : string { return getcwd() . DIRECTORY_SEPARATOR . 'examples' . DIRECTORY_SEPARATOR . $file; } /** * Returns a path to the example file in the given directory.. */ private function constructExamplePath(string $directory, string $file) : string { return rtrim($directory, '\\/') . DIRECTORY_SEPARATOR . $file; } /** * Get example filepath based on sourcecode. */ private function getExamplePathFromSource(string $file) : string { return sprintf('%s%s%s', trim($this->getSourceDirectory(), '\\/'), DIRECTORY_SEPARATOR, trim($file, '"')); } } name = 'var'; $this->variableName = $variableName; $this->type = $type; $this->description = $description; } public static function create(string $body, ?TypeResolver $typeResolver = null, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : self { Assert::stringNotEmpty($body); Assert::notNull($typeResolver); Assert::notNull($descriptionFactory); [$firstPart, $body] = self::extractTypeFromBody($body); $parts = Utils::pregSplit('/(\\s+)/Su', $body, 2, PREG_SPLIT_DELIM_CAPTURE); $type = null; $variableName = ''; // if the first item that is encountered is not a variable; it is a type if ($firstPart && $firstPart[0] !== '$') { $type = $typeResolver->resolve($firstPart, $context); } else { // first part is not a type; we should prepend it to the parts array for further processing array_unshift($parts, $firstPart); } // if the next item starts with a $ it must be the variable name if (isset($parts[0]) && strpos($parts[0], '$') === 0) { $variableName = array_shift($parts); if ($type) { array_shift($parts); } Assert::notNull($variableName); $variableName = substr($variableName, 1); } $description = $descriptionFactory->create(implode('', $parts), $context); return new static($variableName, $type, $description); } /** * Returns the variable's name. */ public function getVariableName() : ?string { return $this->variableName; } /** * Returns a string representation for this tag. */ public function __toString() : string { if ($this->description) { $description = $this->description->render(); } else { $description = ''; } if ($this->variableName) { $variableName = '$' . $this->variableName; } else { $variableName = ''; } $type = (string) $this->type; return $type . ($variableName !== '' ? ($type !== '' ? ' ' : '') . $variableName : '') . ($description !== '' ? ($type !== '' || $variableName !== '' ? ' ' : '') . $description : ''); } } name; } public function getDescription() : ?Description { return $this->description; } public function render(?Formatter $formatter = null) : string { if ($formatter === null) { $formatter = new Formatter\PassthroughFormatter(); } return $formatter->format($this); } } version = $version; $this->description = $description; } /** * @return static */ public static function create(?string $body, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : self { if (empty($body)) { return new static(); } $matches = []; if (!preg_match('/^(' . self::REGEX_VECTOR . ')\\s*(.+)?$/sux', $body, $matches)) { return new static(null, $descriptionFactory !== null ? $descriptionFactory->create($body, $context) : null); } Assert::notNull($descriptionFactory); return new static($matches[1], $descriptionFactory->create($matches[2] ?? '', $context)); } /** * Gets the version section of the tag. */ public function getVersion() : ?string { return $this->version; } /** * Returns a string representation for this tag. */ public function __toString() : string { if ($this->description) { $description = $this->description->render(); } else { $description = ''; } $version = (string) $this->version; return $version . ($description !== '' ? ($version !== '' ? ' ' : '') . $description : ''); } } uri = $uri; } public function __toString() : string { return $this->uri; } } fqsen = $fqsen; } /** * @return string string representation of the referenced fqsen */ public function __toString() : string { return (string) $this->fqsen; } } link = $link; $this->description = $description; } public static function create(string $body, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : self { Assert::notNull($descriptionFactory); $parts = Utils::pregSplit('/\\s+/Su', $body, 2); $description = isset($parts[1]) ? $descriptionFactory->create($parts[1], $context) : null; return new static($parts[0], $description); } /** * Gets the link */ public function getLink() : string { return $this->link; } /** * Returns a string representation for this tag. */ public function __toString() : string { if ($this->description) { $description = $this->description->render(); } else { $description = ''; } $link = $this->link; return $link . ($description !== '' ? ($link !== '' ? ' ' : '') . $description : ''); } } name = 'param'; $this->variableName = $variableName; $this->type = $type; $this->isVariadic = $isVariadic; $this->description = $description; $this->isReference = $isReference; } public static function create(string $body, ?TypeResolver $typeResolver = null, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : self { Assert::stringNotEmpty($body); Assert::notNull($typeResolver); Assert::notNull($descriptionFactory); [$firstPart, $body] = self::extractTypeFromBody($body); $type = null; $parts = Utils::pregSplit('/(\\s+)/Su', $body, 2, PREG_SPLIT_DELIM_CAPTURE); $variableName = ''; $isVariadic = \false; $isReference = \false; // if the first item that is encountered is not a variable; it is a type if ($firstPart && !self::strStartsWithVariable($firstPart)) { $type = $typeResolver->resolve($firstPart, $context); } else { // first part is not a type; we should prepend it to the parts array for further processing array_unshift($parts, $firstPart); } // if the next item starts with a $ or ...$ or &$ or &...$ it must be the variable name if (isset($parts[0]) && self::strStartsWithVariable($parts[0])) { $variableName = array_shift($parts); if ($type) { array_shift($parts); } Assert::notNull($variableName); if (strpos($variableName, '$') === 0) { $variableName = substr($variableName, 1); } elseif (strpos($variableName, '&$') === 0) { $isReference = \true; $variableName = substr($variableName, 2); } elseif (strpos($variableName, '...$') === 0) { $isVariadic = \true; $variableName = substr($variableName, 4); } elseif (strpos($variableName, '&...$') === 0) { $isVariadic = \true; $isReference = \true; $variableName = substr($variableName, 5); } } $description = $descriptionFactory->create(implode('', $parts), $context); return new static($variableName, $type, $isVariadic, $description, $isReference); } /** * Returns the variable's name. */ public function getVariableName() : ?string { return $this->variableName; } /** * Returns whether this tag is variadic. */ public function isVariadic() : bool { return $this->isVariadic; } /** * Returns whether this tag is passed by reference. */ public function isReference() : bool { return $this->isReference; } /** * Returns a string representation for this tag. */ public function __toString() : string { if ($this->description) { $description = $this->description->render(); } else { $description = ''; } $variableName = ''; if ($this->variableName) { $variableName .= ($this->isReference ? '&' : '') . ($this->isVariadic ? '...' : ''); $variableName .= '$' . $this->variableName; } $type = (string) $this->type; return $type . ($variableName !== '' ? ($type !== '' ? ' ' : '') . $variableName : '') . ($description !== '' ? ($type !== '' || $variableName !== '' ? ' ' : '') . $description : ''); } private static function strStartsWithVariable(string $str) : bool { return strpos($str, '$') === 0 || strpos($str, '...$') === 0 || strpos($str, '&$') === 0 || strpos($str, '&...$') === 0; } } name = 'property-read'; $this->variableName = $variableName; $this->type = $type; $this->description = $description; } public static function create(string $body, ?TypeResolver $typeResolver = null, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : self { Assert::stringNotEmpty($body); Assert::notNull($typeResolver); Assert::notNull($descriptionFactory); [$firstPart, $body] = self::extractTypeFromBody($body); $type = null; $parts = Utils::pregSplit('/(\\s+)/Su', $body, 2, PREG_SPLIT_DELIM_CAPTURE); $variableName = ''; // if the first item that is encountered is not a variable; it is a type if ($firstPart && $firstPart[0] !== '$') { $type = $typeResolver->resolve($firstPart, $context); } else { // first part is not a type; we should prepend it to the parts array for further processing array_unshift($parts, $firstPart); } // if the next item starts with a $ it must be the variable name if (isset($parts[0]) && strpos($parts[0], '$') === 0) { $variableName = array_shift($parts); if ($type) { array_shift($parts); } Assert::notNull($variableName); $variableName = substr($variableName, 1); } $description = $descriptionFactory->create(implode('', $parts), $context); return new static($variableName, $type, $description); } /** * Returns the variable's name. */ public function getVariableName() : ?string { return $this->variableName; } /** * Returns a string representation for this tag. */ public function __toString() : string { if ($this->description) { $description = $this->description->render(); } else { $description = ''; } if ($this->variableName) { $variableName = '$' . $this->variableName; } else { $variableName = ''; } $type = (string) $this->type; return $type . ($variableName !== '' ? ($type !== '' ? ' ' : '') . $variableName : '') . ($description !== '' ? ($type !== '' || $variableName !== '' ? ' ' : '') . $description : ''); } } * @var array> */ private $arguments; /** @var bool */ private $isStatic; /** @var Type */ private $returnType; /** * @param array> $arguments * @phpstan-param array $arguments */ public function __construct(string $methodName, array $arguments = [], ?Type $returnType = null, bool $static = \false, ?Description $description = null) { Assert::stringNotEmpty($methodName); if ($returnType === null) { $returnType = new Void_(); } $this->methodName = $methodName; $this->arguments = $this->filterArguments($arguments); $this->returnType = $returnType; $this->isStatic = $static; $this->description = $description; } public static function create(string $body, ?TypeResolver $typeResolver = null, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : ?self { Assert::stringNotEmpty($body); Assert::notNull($typeResolver); Assert::notNull($descriptionFactory); // 1. none or more whitespace // 2. optionally the keyword "static" followed by whitespace // 3. optionally a word with underscores followed by whitespace : as // type for the return value // 4. then optionally a word with underscores followed by () and // whitespace : as method name as used by phpDocumentor // 5. then a word with underscores, followed by ( and any character // until a ) and whitespace : as method name with signature // 6. any remaining text : as description if (!preg_match('/^ # Static keyword # Declares a static method ONLY if type is also present (?: (static) \\s+ )? # Return type (?: ( (?:[\\w\\|_\\\\]*\\$this[\\w\\|_\\\\]*) | (?: (?:[\\w\\|_\\\\]+) # array notation (?:\\[\\])* )*+ ) \\s+ )? # Method name ([\\w_]+) # Arguments (?: \\(([^\\)]*)\\) )? \\s* # Description (.*) $/sux', $body, $matches)) { return null; } [, $static, $returnType, $methodName, $argumentLines, $description] = $matches; $static = $static === 'static'; if ($returnType === '') { $returnType = 'void'; } $returnType = $typeResolver->resolve($returnType, $context); $description = $descriptionFactory->create($description, $context); /** @phpstan-var array $arguments */ $arguments = []; if ($argumentLines !== '') { $argumentsExploded = explode(',', $argumentLines); foreach ($argumentsExploded as $argument) { $argument = explode(' ', self::stripRestArg(trim($argument)), 2); if (strpos($argument[0], '$') === 0) { $argumentName = substr($argument[0], 1); $argumentType = new Mixed_(); } else { $argumentType = $typeResolver->resolve($argument[0], $context); $argumentName = ''; if (isset($argument[1])) { $argument[1] = self::stripRestArg($argument[1]); $argumentName = substr($argument[1], 1); } } $arguments[] = ['name' => $argumentName, 'type' => $argumentType]; } } return new static($methodName, $arguments, $returnType, $static, $description); } /** * Retrieves the method name. */ public function getMethodName() : string { return $this->methodName; } /** * @return array> * @phpstan-return array */ public function getArguments() : array { return $this->arguments; } /** * Checks whether the method tag describes a static method or not. * * @return bool TRUE if the method declaration is for a static method, FALSE otherwise. */ public function isStatic() : bool { return $this->isStatic; } public function getReturnType() : Type { return $this->returnType; } public function __toString() : string { $arguments = []; foreach ($this->arguments as $argument) { $arguments[] = $argument['type'] . ' $' . $argument['name']; } $argumentStr = '(' . implode(', ', $arguments) . ')'; if ($this->description) { $description = $this->description->render(); } else { $description = ''; } $static = $this->isStatic ? 'static' : ''; $returnType = (string) $this->returnType; $methodName = $this->methodName; return $static . ($returnType !== '' ? ($static !== '' ? ' ' : '') . $returnType : '') . ($methodName !== '' ? ($static !== '' || $returnType !== '' ? ' ' : '') . $methodName : '') . $argumentStr . ($description !== '' ? ' ' . $description : ''); } /** * @param mixed[][]|string[] $arguments * @phpstan-param array $arguments * * @return mixed[][] * @phpstan-return array */ private function filterArguments(array $arguments = []) : array { $result = []; foreach ($arguments as $argument) { if (is_string($argument)) { $argument = ['name' => $argument]; } if (!isset($argument['type'])) { $argument['type'] = new Mixed_(); } $keys = array_keys($argument); sort($keys); if ($keys !== ['name', 'type']) { throw new InvalidArgumentException('Arguments can only have the "name" and "type" fields, found: ' . var_export($keys, \true)); } $result[] = $argument; } return $result; } private static function stripRestArg(string $argument) : string { if (strpos($argument, '...') === 0) { $argument = trim(substr($argument, 3)); } return $argument; } } name = 'property-write'; $this->variableName = $variableName; $this->type = $type; $this->description = $description; } public static function create(string $body, ?TypeResolver $typeResolver = null, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : self { Assert::stringNotEmpty($body); Assert::notNull($typeResolver); Assert::notNull($descriptionFactory); [$firstPart, $body] = self::extractTypeFromBody($body); $type = null; $parts = Utils::pregSplit('/(\\s+)/Su', $body, 2, PREG_SPLIT_DELIM_CAPTURE); $variableName = ''; // if the first item that is encountered is not a variable; it is a type if ($firstPart && $firstPart[0] !== '$') { $type = $typeResolver->resolve($firstPart, $context); } else { // first part is not a type; we should prepend it to the parts array for further processing array_unshift($parts, $firstPart); } // if the next item starts with a $ it must be the variable name if (isset($parts[0]) && strpos($parts[0], '$') === 0) { $variableName = array_shift($parts); if ($type) { array_shift($parts); } Assert::notNull($variableName); $variableName = substr($variableName, 1); } $description = $descriptionFactory->create(implode('', $parts), $context); return new static($variableName, $type, $description); } /** * Returns the variable's name. */ public function getVariableName() : ?string { return $this->variableName; } /** * Returns a string representation for this tag. */ public function __toString() : string { if ($this->description) { $description = $this->description->render(); } else { $description = ''; } if ($this->variableName) { $variableName = '$' . $this->variableName; } else { $variableName = ''; } $type = (string) $this->type; return $type . ($variableName !== '' ? ($type !== '' ? ' ' : '') . $variableName : '') . ($description !== '' ? ($type !== '' || $variableName !== '' ? ' ' : '') . $description : ''); } } refers = $refers; $this->description = $description; } public static function create(string $body, ?FqsenResolver $typeResolver = null, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : self { Assert::notNull($descriptionFactory); $parts = Utils::pregSplit('/\\s+/Su', $body, 2); $description = isset($parts[1]) ? $descriptionFactory->create($parts[1], $context) : null; // https://tools.ietf.org/html/rfc2396#section-3 if (preg_match('#\\w://\\w#', $parts[0])) { return new static(new Url($parts[0]), $description); } return new static(new FqsenRef(self::resolveFqsen($parts[0], $typeResolver, $context)), $description); } private static function resolveFqsen(string $parts, ?FqsenResolver $fqsenResolver, ?TypeContext $context) : Fqsen { Assert::notNull($fqsenResolver); $fqsenParts = explode('::', $parts); $resolved = $fqsenResolver->resolve($fqsenParts[0], $context); if (!array_key_exists(1, $fqsenParts)) { return $resolved; } return new Fqsen($resolved . '::' . $fqsenParts[1]); } /** * Returns the ref of this tag. */ public function getReference() : Reference { return $this->refers; } /** * Returns a string representation of this tag. */ public function __toString() : string { if ($this->description) { $description = $this->description->render(); } else { $description = ''; } $refers = (string) $this->refers; return $refers . ($description !== '' ? ($refers !== '' ? ' ' : '') . $description : ''); } } version = $version; $this->description = $description; } public static function create(?string $body, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : ?self { if (empty($body)) { return new static(); } $matches = []; if (!preg_match('/^(' . self::REGEX_VECTOR . ')\\s*(.+)?$/sux', $body, $matches)) { return null; } $description = null; if ($descriptionFactory !== null) { $description = $descriptionFactory->create($matches[2] ?? '', $context); } return new static($matches[1], $description); } /** * Gets the version section of the tag. */ public function getVersion() : ?string { return $this->version; } /** * Returns a string representation for this tag. */ public function __toString() : string { if ($this->description) { $description = $this->description->render(); } else { $description = ''; } $version = (string) $this->version; return $version . ($description !== '' ? ($version !== '' ? ' ' : '') . $description : ''); } } maxLen = max($this->maxLen, strlen($tag->getName())); } } /** * Formats the given tag to return a simple plain text version. */ public function format(Tag $tag) : string { return '@' . $tag->getName() . str_repeat(' ', $this->maxLen - strlen($tag->getName()) + 1) . $tag; } } getName() . ' ' . $tag); } } name = 'property'; $this->variableName = $variableName; $this->type = $type; $this->description = $description; } public static function create(string $body, ?TypeResolver $typeResolver = null, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : self { Assert::stringNotEmpty($body); Assert::notNull($typeResolver); Assert::notNull($descriptionFactory); [$firstPart, $body] = self::extractTypeFromBody($body); $type = null; $parts = Utils::pregSplit('/(\\s+)/Su', $body, 2, PREG_SPLIT_DELIM_CAPTURE); $variableName = ''; // if the first item that is encountered is not a variable; it is a type if ($firstPart && $firstPart[0] !== '$') { $type = $typeResolver->resolve($firstPart, $context); } else { // first part is not a type; we should prepend it to the parts array for further processing array_unshift($parts, $firstPart); } // if the next item starts with a $ it must be the variable name if (isset($parts[0]) && strpos($parts[0], '$') === 0) { $variableName = array_shift($parts); if ($type) { array_shift($parts); } Assert::notNull($variableName); $variableName = substr($variableName, 1); } $description = $descriptionFactory->create(implode('', $parts), $context); return new static($variableName, $type, $description); } /** * Returns the variable's name. */ public function getVariableName() : ?string { return $this->variableName; } /** * Returns a string representation for this tag. */ public function __toString() : string { if ($this->description) { $description = $this->description->render(); } else { $description = ''; } if ($this->variableName) { $variableName = '$' . $this->variableName; } else { $variableName = ''; } $type = (string) $this->type; return $type . ($variableName !== '' ? ($type !== '' ? ' ' : '') . $variableName : '') . ($description !== '' ? ($type !== '' || $variableName !== '' ? ' ' : '') . $description : ''); } } refers = $refers; $this->description = $description; } public static function create(string $body, ?DescriptionFactory $descriptionFactory = null, ?FqsenResolver $resolver = null, ?TypeContext $context = null) : self { Assert::stringNotEmpty($body); Assert::notNull($descriptionFactory); Assert::notNull($resolver); $parts = Utils::pregSplit('/\\s+/Su', $body, 2); return new static(self::resolveFqsen($parts[0], $resolver, $context), $descriptionFactory->create($parts[1] ?? '', $context)); } private static function resolveFqsen(string $parts, ?FqsenResolver $fqsenResolver, ?TypeContext $context) : Fqsen { Assert::notNull($fqsenResolver); $fqsenParts = explode('::', $parts); $resolved = $fqsenResolver->resolve($fqsenParts[0], $context); if (!array_key_exists(1, $fqsenParts)) { return $resolved; } return new Fqsen($resolved . '::' . $fqsenParts[1]); } /** * Returns the structural element this tag refers to. */ public function getReference() : Fqsen { return $this->refers; } /** * Returns a string representation of this tag. */ public function __toString() : string { if ($this->description) { $description = $this->description->render(); } else { $description = ''; } $refers = (string) $this->refers; return $refers . ($description !== '' ? ($refers !== '' ? ' ' : '') . $description : ''); } } version = $version; $this->description = $description; } public static function create(?string $body, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : ?self { if (empty($body)) { return new static(); } $matches = []; if (!preg_match('/^(' . self::REGEX_VECTOR . ')\\s*(.+)?$/sux', $body, $matches)) { return null; } Assert::notNull($descriptionFactory); return new static($matches[1], $descriptionFactory->create($matches[2] ?? '', $context)); } /** * Gets the version section of the tag. */ public function getVersion() : ?string { return $this->version; } /** * Returns a string representation for this tag. */ public function __toString() : string { if ($this->description) { $description = $this->description->render(); } else { $description = ''; } $version = (string) $this->version; return $version . ($description !== '' ? ($version !== '' ? ' ' : '') . $description : ''); } } name = 'throws'; $this->type = $type; $this->description = $description; } public static function create(string $body, ?TypeResolver $typeResolver = null, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : self { Assert::notNull($typeResolver); Assert::notNull($descriptionFactory); [$type, $description] = self::extractTypeFromBody($body); $type = $typeResolver->resolve($type, $context); $description = $descriptionFactory->create($description, $context); return new static($type, $description); } public function __toString() : string { if ($this->description) { $description = $this->description->render(); } else { $description = ''; } $type = (string) $this->type; return $type . ($description !== '' ? ($type !== '' ? ' ' : '') . $description : ''); } } refers = $refers; $this->description = $description; } public static function create(string $body, ?FqsenResolver $resolver = null, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : self { Assert::notNull($resolver); Assert::notNull($descriptionFactory); $parts = Utils::pregSplit('/\\s+/Su', $body, 2); return new static(self::resolveFqsen($parts[0], $resolver, $context), $descriptionFactory->create($parts[1] ?? '', $context)); } private static function resolveFqsen(string $parts, ?FqsenResolver $fqsenResolver, ?TypeContext $context) : Fqsen { Assert::notNull($fqsenResolver); $fqsenParts = explode('::', $parts); $resolved = $fqsenResolver->resolve($fqsenParts[0], $context); if (!array_key_exists(1, $fqsenParts)) { return $resolved; } return new Fqsen($resolved . '::' . $fqsenParts[1]); } /** * Returns the structural element this tag refers to. */ public function getReference() : Fqsen { return $this->refers; } /** * Returns a string representation of this tag. */ public function __toString() : string { if ($this->description) { $description = $this->description->render(); } else { $description = ''; } $refers = (string) $this->refers; return $refers . ($description !== '' ? ($refers !== '' ? ' ' : '') . $description : ''); } } type; } /** * @return string[] */ protected static function extractTypeFromBody(string $body) : array { $type = ''; $nestingLevel = 0; for ($i = 0, $iMax = strlen($body); $i < $iMax; $i++) { $character = $body[$i]; if ($nestingLevel === 0 && trim($character) === '') { break; } $type .= $character; if (in_array($character, ['<', '(', '[', '{'])) { $nestingLevel++; continue; } if (in_array($character, ['>', ')', ']', '}'])) { $nestingLevel--; continue; } } $description = trim(substr($body, strlen($type))); return [$type, $description]; } } filePath = $filePath; $this->startingLine = $startingLine; $this->lineCount = $lineCount; if ($content !== null) { $this->content = trim($content); } $this->isURI = $isURI; } public function getContent() : string { if ($this->content === null || $this->content === '') { $filePath = $this->filePath; if ($this->isURI) { $filePath = $this->isUriRelative($this->filePath) ? str_replace('%2F', '/', rawurlencode($this->filePath)) : $this->filePath; } return trim($filePath); } return $this->content; } public function getDescription() : ?string { return $this->content; } public static function create(string $body) : ?Tag { // File component: File path in quotes or File URI / Source information if (!preg_match('/^\\s*(?:(\\"[^\\"]+\\")|(\\S+))(?:\\s+(.*))?$/sux', $body, $matches)) { return null; } $filePath = null; $fileUri = null; if ($matches[1] !== '') { $filePath = $matches[1]; } else { $fileUri = $matches[2]; } $startingLine = 1; $lineCount = 0; $description = null; if (array_key_exists(3, $matches)) { $description = $matches[3]; // Starting line / Number of lines / Description if (preg_match('/^([1-9]\\d*)(?:\\s+((?1))\\s*)?(.*)$/sux', $matches[3], $contentMatches)) { $startingLine = (int) $contentMatches[1]; if (isset($contentMatches[2])) { $lineCount = (int) $contentMatches[2]; } if (array_key_exists(3, $contentMatches)) { $description = $contentMatches[3]; } } } return new static($filePath ?? $fileUri ?? '', $fileUri !== null, $startingLine, $lineCount, $description); } /** * Returns the file path. * * @return string Path to a file to use as an example. * May also be an absolute URI. */ public function getFilePath() : string { return trim($this->filePath, '"'); } /** * Returns a string representation for this tag. */ public function __toString() : string { $filePath = $this->filePath; $isDefaultLine = $this->startingLine === 1 && $this->lineCount === 0; $startingLine = !$isDefaultLine ? (string) $this->startingLine : ''; $lineCount = !$isDefaultLine ? (string) $this->lineCount : ''; $content = (string) $this->content; return $filePath . ($startingLine !== '' ? ($filePath !== '' ? ' ' : '') . $startingLine : '') . ($lineCount !== '' ? ($filePath !== '' || $startingLine !== '' ? ' ' : '') . $lineCount : '') . ($content !== '' ? ($filePath !== '' || $startingLine !== '' || $lineCount !== '' ? ' ' : '') . $content : ''); } /** * Returns true if the provided URI is relative or contains a complete scheme (and thus is absolute). */ private function isUriRelative(string $uri) : bool { return strpos($uri, ':') === \false; } public function getStartingLine() : int { return $this->startingLine; } public function getLineCount() : int { return $this->lineCount; } public function getName() : string { return 'example'; } public function render(?Formatter $formatter = null) : string { if ($formatter === null) { $formatter = new Formatter\PassthroughFormatter(); } return $formatter->format($this); } } name = $name; $this->body = $body; } public function getException() : ?Throwable { return $this->throwable; } public function getName() : string { return $this->name; } public static function create(string $body, string $name = '') : self { return new self($name, $body); } public function withError(Throwable $exception) : self { $this->flattenExceptionBacktrace($exception); $tag = new self($this->name, $this->body); $tag->throwable = $exception; return $tag; } /** * Removes all complex types from backtrace * * Not all objects are serializable. So we need to remove them from the * stored exception to be sure that we do not break existing library usage. */ private function flattenExceptionBacktrace(Throwable $exception) : void { $traceProperty = (new ReflectionClass(Exception::class))->getProperty('trace'); $traceProperty->setAccessible(\true); do { $trace = $exception->getTrace(); if (isset($trace[0]['args'])) { $trace = array_map(function (array $call) : array { $call['args'] = array_map([$this, 'flattenArguments'], $call['args'] ?? []); return $call; }, $trace); } $traceProperty->setValue($exception, $trace); $exception = $exception->getPrevious(); } while ($exception !== null); $traceProperty->setAccessible(\false); } /** * @param mixed $value * * @return mixed * * @throws ReflectionException */ private function flattenArguments($value) { if ($value instanceof Closure) { $closureReflection = new ReflectionFunction($value); $value = sprintf('(Closure at %s:%s)', $closureReflection->getFileName(), $closureReflection->getStartLine()); } elseif (is_object($value)) { $value = sprintf('object(%s)', get_class($value)); } elseif (is_resource($value)) { $value = sprintf('resource(%s)', get_resource_type($value)); } elseif (is_array($value)) { $value = array_map([$this, 'flattenArguments'], $value); } return $value; } public function render(?Formatter $formatter = null) : string { if ($formatter === null) { $formatter = new Formatter\PassthroughFormatter(); } return $formatter->format($this); } public function __toString() : string { return $this->body; } } authorName = $authorName; $this->authorEmail = $authorEmail; } /** * Gets the author's name. * * @return string The author's name. */ public function getAuthorName() : string { return $this->authorName; } /** * Returns the author's email. * * @return string The author's email. */ public function getEmail() : string { return $this->authorEmail; } /** * Returns this tag in string form. */ public function __toString() : string { if ($this->authorEmail) { $authorEmail = '<' . $this->authorEmail . '>'; } else { $authorEmail = ''; } $authorName = $this->authorName; return $authorName . ($authorEmail !== '' ? ($authorName !== '' ? ' ' : '') . $authorEmail : ''); } /** * Attempts to create a new Author object based on the tag body. */ public static function create(string $body) : ?self { $splitTagContent = preg_match('/^([^\\<]*)(?:\\<([^\\>]*)\\>)?$/u', $body, $matches); if (!$splitTagContent) { return null; } $authorName = trim($matches[1]); $email = isset($matches[2]) ? trim($matches[2]) : ''; return new static($authorName, $email); } } name = 'return'; $this->type = $type; $this->description = $description; } public static function create(string $body, ?TypeResolver $typeResolver = null, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : self { Assert::notNull($typeResolver); Assert::notNull($descriptionFactory); [$type, $description] = self::extractTypeFromBody($body); $type = $typeResolver->resolve($type, $context); $description = $descriptionFactory->create($description, $context); return new static($type, $description); } public function __toString() : string { if ($this->description) { $description = $this->description->render(); } else { $description = ''; } $type = $this->type ? '' . $this->type : 'mixed'; return $type . ($description !== '' ? ' ' . $description : ''); } } validateTagName($name); $this->name = $name; $this->description = $description; } /** * Creates a new tag that represents any unknown tag type. * * @return static */ public static function create(string $body, string $name = '', ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : self { Assert::stringNotEmpty($name); Assert::notNull($descriptionFactory); $description = $body !== '' ? $descriptionFactory->create($body, $context) : null; return new static($name, $description); } /** * Returns the tag as a serialized string */ public function __toString() : string { if ($this->description) { $description = $this->description->render(); } else { $description = ''; } return $description; } /** * Validates if the tag name matches the expected format, otherwise throws an exception. */ private function validateTagName(string $name) : void { if (!preg_match('/^' . StandardTagFactory::REGEX_TAGNAME . '$/u', $name)) { throw new InvalidArgumentException('The tag name "' . $name . '" is not wellformed. Tags may only consist of letters, underscores, ' . 'hyphens and backslashes.'); } } } startingLine = (int) $startingLine; $this->lineCount = $lineCount !== null ? (int) $lineCount : null; $this->description = $description; } public static function create(string $body, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : self { Assert::stringNotEmpty($body); Assert::notNull($descriptionFactory); $startingLine = 1; $lineCount = null; $description = null; // Starting line / Number of lines / Description if (preg_match('/^([1-9]\\d*)\\s*(?:((?1))\\s+)?(.*)$/sux', $body, $matches)) { $startingLine = (int) $matches[1]; if (isset($matches[2]) && $matches[2] !== '') { $lineCount = (int) $matches[2]; } $description = $matches[3]; } return new static($startingLine, $lineCount, $descriptionFactory->create($description ?? '', $context)); } /** * Gets the starting line. * * @return int The starting line, relative to the structural element's * location. */ public function getStartingLine() : int { return $this->startingLine; } /** * Returns the number of lines. * * @return int|null The number of lines, relative to the starting line. NULL * means "to the end". */ public function getLineCount() : ?int { return $this->lineCount; } public function __toString() : string { if ($this->description) { $description = $this->description->render(); } else { $description = ''; } $startingLine = (string) $this->startingLine; $lineCount = $this->lineCount !== null ? ' ' . $this->lineCount : ''; return $startingLine . $lineCount . ($description !== '' ? ' ' . $description : ''); } } summary = $summary; $this->description = $description ?: new DocBlock\Description(''); foreach ($tags as $tag) { $this->addTag($tag); } $this->context = $context; $this->location = $location; $this->isTemplateEnd = $isTemplateEnd; $this->isTemplateStart = $isTemplateStart; } public function getSummary() : string { return $this->summary; } public function getDescription() : DocBlock\Description { return $this->description; } /** * Returns the current context. */ public function getContext() : ?Types\Context { return $this->context; } /** * Returns the current location. */ public function getLocation() : ?Location { return $this->location; } /** * Returns whether this DocBlock is the start of a Template section. * * A Docblock may serve as template for a series of subsequent DocBlocks. This is indicated by a special marker * (`#@+`) that is appended directly after the opening `/**` of a DocBlock. * * An example of such an opening is: * * ``` * /**#@+ * * My DocBlock * * / * ``` * * The description and tags (not the summary!) are copied onto all subsequent DocBlocks and also applied to all * elements that follow until another DocBlock is found that contains the closing marker (`#@-`). * * @see self::isTemplateEnd() for the check whether a closing marker was provided. */ public function isTemplateStart() : bool { return $this->isTemplateStart; } /** * Returns whether this DocBlock is the end of a Template section. * * @see self::isTemplateStart() for a more complete description of the Docblock Template functionality. */ public function isTemplateEnd() : bool { return $this->isTemplateEnd; } /** * Returns the tags for this DocBlock. * * @return Tag[] */ public function getTags() : array { return $this->tags; } /** * Returns an array of tags matching the given name. If no tags are found * an empty array is returned. * * @param string $name String to search by. * * @return Tag[] */ public function getTagsByName(string $name) : array { $result = []; foreach ($this->getTags() as $tag) { if ($tag->getName() !== $name) { continue; } $result[] = $tag; } return $result; } /** * Returns an array of tags with type matching the given name. If no tags are found * an empty array is returned. * * @param string $name String to search by. * * @return TagWithType[] */ public function getTagsWithTypeByName(string $name) : array { $result = []; foreach ($this->getTagsByName($name) as $tag) { if (!$tag instanceof TagWithType) { continue; } $result[] = $tag; } return $result; } /** * Checks if a tag of a certain type is present in this DocBlock. * * @param string $name Tag name to check for. */ public function hasTag(string $name) : bool { foreach ($this->getTags() as $tag) { if ($tag->getName() === $name) { return \true; } } return \false; } /** * Remove a tag from this DocBlock. * * @param Tag $tagToRemove The tag to remove. */ public function removeTag(Tag $tagToRemove) : void { foreach ($this->tags as $key => $tag) { if ($tag === $tagToRemove) { unset($this->tags[$key]); break; } } } /** * Adds a tag to this DocBlock. * * @param Tag $tag The tag to add. */ private function addTag(Tag $tag) : void { $this->tags[] = $tag; } } The MIT License (MIT) Copyright (c) 2010 Mike van Riel 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. lineNumber = $lineNumber; $this->columnNumber = $columnNumber; } /** * Returns the line number that is covered by this location. */ public function getLineNumber() : int { return $this->lineNumber; } /** * Returns the column number (character position on a line) for this location object. */ public function getColumnNumber() : int { return $this->columnNumber; } } fqsen = $fqsen; if (isset($matches[2])) { $this->name = $matches[2]; } else { $matches = explode('\\', $fqsen); $name = end($matches); assert(is_string($name)); $this->name = trim($name, '()'); } } /** * converts this class to string. */ public function __toString() : string { return $this->fqsen; } /** * Returns the name of the element without path. */ public function getName() : string { return $this->name; } } reasons = $reasons; } /** * @return \Throwable[] */ public function getReasons() : array { return $this->reasons; } } , mixed, * mixed>|null) | callable(\Throwable|null, mixed): void> */ private $queue = []; /** * @param callable|null $callback Initial callback to add to queue. * * @psalm-param null|callable(\Throwable|null, mixed): (Promise|\React\Promise\PromiseInterface|\Generator, mixed, * mixed>|null) | callable(\Throwable|null, mixed): void $callback */ public function __construct(callable $callback = null) { if ($callback !== null) { $this->push($callback); } } /** * Unrolls instances of self to avoid blowing up the call stack on resolution. * * @param callable $callback * * @psalm-param callable(\Throwable|null, mixed): (Promise|\React\Promise\PromiseInterface|\Generator, mixed, * mixed>|null) | callable(\Throwable|null, mixed): void $callback * * @return void */ public function push(callable $callback) { if ($callback instanceof self) { $this->queue = \array_merge($this->queue, $callback->queue); return; } $this->queue[] = $callback; } /** * Calls each callback in the queue, passing the provided values to the function. * * @param \Throwable|null $exception * @param mixed $value * * @return void */ public function __invoke($exception, $value) { foreach ($this->queue as $callback) { try { $result = $callback($exception, $value); if ($result === null) { continue; } if ($result instanceof \Generator) { $result = new Coroutine($result); } if ($result instanceof Promise || $result instanceof ReactPromise) { Promise\rethrow($result); } } catch (\Throwable $exception) { Loop::defer(static function () use($exception) { throw $exception; }); } } } } promise = $promise; } public function onResolve(callable $onResolved) { $this->promise->onResolve($onResolved); } } */ final class PrivateIterator implements Iterator { /** @var Iterator */ private $iterator; /** * @param Iterator $iterator * * @psalm-param Iterator $iterator */ public function __construct(Iterator $iterator) { $this->iterator = $iterator; } /** * @return Promise */ public function advance() : Promise { return $this->iterator->advance(); } /** * @psalm-return TValue */ public function getCurrent() { return $this->iterator->getCurrent(); } } $trace Output of * `debug_backtrace()`. * * @return string Formatted stacktrace. * * @codeCoverageIgnore * @internal */ function formatStacktrace(array $trace) : string { return \implode("\n", \array_map(static function ($e, $i) { $line = "#{$i} "; if (isset($e["file"])) { $line .= "{$e['file']}:{$e['line']} "; } if (isset($e["type"])) { $line .= $e["class"] . $e["type"]; } return $line . $e["function"] . "()"; }, $trace, \array_keys($trace))); } /** * Creates a `TypeError` with a standardized error message. * * @param string[] $expected Expected types. * @param mixed $given Given value. * * @return \TypeError * * @internal */ function createTypeError(array $expected, $given) : \TypeError { $givenType = \is_object($given) ? \sprintf("instance of %s", \get_class($given)) : \gettype($given); if (\count($expected) === 1) { $expectedType = "Expected the following type: " . \array_pop($expected); } else { $expectedType = "Expected one of the following types: " . \implode(", ", $expected); } return new \TypeError("{$expectedType}; {$givenType} given"); } /** * Returns the current time relative to an arbitrary point in time. * * @return int Time in milliseconds. */ function getCurrentTime() : int { /** @var int|null $startTime */ static $startTime; /** @var int|null $nextWarning */ static $nextWarning; if (\PHP_INT_SIZE === 4) { // @codeCoverageIgnoreStart if ($startTime === null) { $startTime = \PHP_VERSION_ID >= 70300 ? \hrtime(\false)[0] : \time(); $nextWarning = \PHP_INT_MAX - 86400 * 7; } if (\PHP_VERSION_ID >= 70300) { list($seconds, $nanoseconds) = \hrtime(\false); $seconds -= $startTime; if ($seconds >= $nextWarning) { $timeToOverflow = (\PHP_INT_MAX - $seconds * 1000) / 1000; \trigger_error("getCurrentTime() will overflow in {$timeToOverflow} seconds, please restart the process before that. " . "You're using a 32 bit version of PHP, so time will overflow about every 24 days. Regular restarts are required.", \E_USER_WARNING); /** @psalm-suppress PossiblyNullOperand */ $nextWarning += 600; // every 10 minutes } return (int) ($seconds * 1000 + $nanoseconds / 1000000); } $seconds = \microtime(\true) - $startTime; if ($seconds >= $nextWarning) { $timeToOverflow = (\PHP_INT_MAX - $seconds * 1000) / 1000; \trigger_error("getCurrentTime() will overflow in {$timeToOverflow} seconds, please restart the process before that. " . "You're using a 32 bit version of PHP, so time will overflow about every 24 days. Regular restarts are required.", \E_USER_WARNING); /** @psalm-suppress PossiblyNullOperand */ $nextWarning += 600; // every 10 minutes } return (int) ($seconds * 1000); // @codeCoverageIgnoreEnd } if (\PHP_VERSION_ID >= 70300) { list($seconds, $nanoseconds) = \hrtime(\false); return (int) ($seconds * 1000 + $nanoseconds / 1000000); } return (int) (\microtime(\true) * 1000); } */ public function advance() : Promise { if ($this->waiting !== null) { throw new \Error("The prior promise returned must resolve before invoking this method again"); } unset($this->values[$this->consumePosition]); $position = ++$this->consumePosition; if (\array_key_exists($position, $this->values)) { \assert(isset($this->backPressure[$position])); $deferred = $this->backPressure[$position]; unset($this->backPressure[$position]); $deferred->resolve(); return new Success(\true); } if ($this->complete) { return $this->complete; } $this->waiting = new Deferred(); return $this->waiting->promise(); } /** * {@inheritdoc} * * @return TValue */ public function getCurrent() { if (empty($this->values) && $this->complete) { throw new \Error("The iterator has completed"); } if (!\array_key_exists($this->consumePosition, $this->values)) { throw new \Error("Promise returned from advance() must resolve before calling this method"); } return $this->values[$this->consumePosition]; } /** * Emits a value from the iterator. The returned promise is resolved once the emitted value has been consumed. * * @param mixed $value * * @return Promise * @psalm-return Promise * * @throws \Error If the iterator has completed. */ private function emit($value) : Promise { if ($this->complete) { throw new \Error("Iterators cannot emit values after calling complete"); } if ($value instanceof ReactPromise) { $value = Promise\adapt($value); } if ($value instanceof Promise) { $deferred = new Deferred(); $value->onResolve(function ($e, $v) use($deferred) { if ($this->complete) { $deferred->fail(new \Error("The iterator was completed before the promise result could be emitted")); return; } if ($e) { $this->fail($e); $deferred->fail($e); return; } $deferred->resolve($this->emit($v)); }); return $deferred->promise(); } $position = ++$this->emitPosition; $this->values[$position] = $value; if ($this->waiting !== null) { $waiting = $this->waiting; $this->waiting = null; $waiting->resolve(\true); return new Success(); // Consumer was already waiting for a new value, so back-pressure is unnecessary. } $this->backPressure[$position] = $pressure = new Deferred(); return $pressure->promise(); } /** * Completes the iterator. * * @return void * * @throws \Error If the iterator has already been completed. */ private function complete() { if ($this->complete) { $message = "Iterator has already been completed"; if (isset($this->resolutionTrace)) { $trace = formatStacktrace($this->resolutionTrace); $message .= ". Previous completion trace:\n\n{$trace}\n\n"; } else { // @codeCoverageIgnoreStart $message .= ", define environment variable AMP_DEBUG or const AMP_DEBUG = true and enable assertions " . "for a stacktrace of the previous resolution."; // @codeCoverageIgnoreEnd } throw new \Error($message); } \assert((function () { $env = \getenv("AMP_DEBUG") ?: "0"; if ($env !== "0" && $env !== "false" || \defined("_HumbugBox1cb33d1f20f1\\AMP_DEBUG") && \_HumbugBox1cb33d1f20f1\AMP_DEBUG) { $trace = \debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS); \array_shift($trace); // remove current closure $this->resolutionTrace = $trace; } return \true; })()); $this->complete = new Success(\false); if ($this->waiting !== null) { $waiting = $this->waiting; $this->waiting = null; $waiting->resolve($this->complete); } } /** * @param \Throwable $exception * * @return void */ private function fail(\Throwable $exception) { $this->complete = new Failure($exception); if ($this->waiting !== null) { $waiting = $this->waiting; $this->waiting = null; $waiting->resolve($this->complete); } } } , mixed, * mixed>|null)|callable(\Throwable|null, mixed): void */ private $onResolved; /** @var null|array */ private $resolutionTrace; /** * @inheritdoc */ public function onResolve(callable $onResolved) { if ($this->resolved) { if ($this->result instanceof Promise) { $this->result->onResolve($onResolved); return; } try { /** @var mixed $result */ $result = $onResolved(null, $this->result); if ($result === null) { return; } if ($result instanceof \Generator) { $result = new Coroutine($result); } if ($result instanceof Promise || $result instanceof ReactPromise) { Promise\rethrow($result); } } catch (\Throwable $exception) { Loop::defer(static function () use($exception) { throw $exception; }); } return; } if (null === $this->onResolved) { $this->onResolved = $onResolved; return; } if (!$this->onResolved instanceof ResolutionQueue) { /** @psalm-suppress InternalClass */ $this->onResolved = new ResolutionQueue($this->onResolved); } /** @psalm-suppress InternalMethod */ $this->onResolved->push($onResolved); } public function __destruct() { try { $this->result = null; } catch (\Throwable $e) { Loop::defer(static function () use($e) { throw $e; }); } } /** * @param mixed $value * * @return void * * @throws \Error Thrown if the promise has already been resolved. */ private function resolve($value = null) { if ($this->resolved) { $message = "Promise has already been resolved"; if (isset($this->resolutionTrace)) { $trace = formatStacktrace($this->resolutionTrace); $message .= ". Previous resolution trace:\n\n{$trace}\n\n"; } else { // @codeCoverageIgnoreStart $message .= ", define environment variable AMP_DEBUG or const AMP_DEBUG = true and enable assertions " . "for a stacktrace of the previous resolution."; // @codeCoverageIgnoreEnd } throw new \Error($message); } \assert((function () { $env = \getenv("AMP_DEBUG") ?: "0"; if ($env !== "0" && $env !== "false" || \defined("_HumbugBox1cb33d1f20f1\\AMP_DEBUG") && \_HumbugBox1cb33d1f20f1\AMP_DEBUG) { $trace = \debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS); \array_shift($trace); // remove current closure $this->resolutionTrace = $trace; } return \true; })()); if ($value instanceof ReactPromise) { $value = Promise\adapt($value); } $this->resolved = \true; $this->result = $value; if ($this->onResolved === null) { return; } $onResolved = $this->onResolved; $this->onResolved = null; if ($this->result instanceof Promise) { $this->result->onResolve($onResolved); return; } try { /** @var mixed $result */ $result = $onResolved(null, $this->result); $onResolved = null; // allow garbage collection of $onResolved, to catch any exceptions from destructors if ($result === null) { return; } if ($result instanceof \Generator) { $result = new Coroutine($result); } if ($result instanceof Promise || $result instanceof ReactPromise) { Promise\rethrow($result); } } catch (\Throwable $exception) { Loop::defer(static function () use($exception) { throw $exception; }); } } /** * @param \Throwable $reason Failure reason. * * @return void */ private function fail(\Throwable $reason) { $this->resolve(new Failure($reason)); } /** * @return bool True if the placeholder has been resolved. */ private function isResolved() : bool { return $this->resolved; } } token = $source->getToken(); $trace = \debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS); $this->watcher = Loop::delay($timeout, static function () use($source, $message, $trace) { $trace = formatStacktrace($trace); $source->cancel(new TimeoutException("{$message}\r\nTimeoutCancellationToken was created here:\r\n{$trace}")); }); Loop::unreference($this->watcher); } /** * Cancels the delay watcher. */ public function __destruct() { Loop::cancel($this->watcher); } /** * {@inheritdoc} */ public function subscribe(callable $callback) : string { return $this->token->subscribe($callback); } /** * {@inheritdoc} */ public function unsubscribe(string $id) { $this->token->unsubscribe($id); } /** * {@inheritdoc} */ public function isRequested() : bool { return $this->token->isRequested(); } /** * {@inheritdoc} */ public function throwIfRequested() { $this->token->throwIfRequested(); } } promisor = $promisor; } /** * {@inheritdoc} */ public function onResolve(callable $onResolved) { if ($this->promise === null) { \assert($this->promisor !== null); $provider = $this->promisor; $this->promisor = null; $this->promise = call($provider); } \assert($this->promise !== null); $this->promise->onResolve($onResolved); } } Has public emit, complete, and fail methods. */ private $emitter; /** @var Iterator Hides producer methods. */ private $iterator; public function __construct() { $this->emitter = new class implements Iterator { use Internal\Producer { emit as public; complete as public; fail as public; } }; $this->iterator = new Internal\PrivateIterator($this->emitter); } /** * @return Iterator * @psalm-return Iterator */ public function iterate() : Iterator { return $this->iterator; } /** * Emits a value to the iterator. * * @param mixed $value * * @psalm-param TValue $value * * @return Promise * @psalm-return Promise * @psalm-suppress MixedInferredReturnType * @psalm-suppress MixedReturnStatement */ public function emit($value) : Promise { /** @psalm-suppress UndefinedInterfaceMethod */ return $this->emitter->emit($value); } /** * Completes the iterator. * * @return void */ public function complete() { /** @psalm-suppress UndefinedInterfaceMethod */ $this->emitter->complete(); } /** * Fails the iterator with the given reason. * * @param \Throwable $reason * * @return void */ public function fail(\Throwable $reason) { /** @psalm-suppress UndefinedInterfaceMethod */ $this->emitter->fail($reason); } } * * @throws \Error If the prior promise returned from this method has not resolved. * @throws \Throwable The exception used to fail the iterator. */ public function advance() : Promise; /** * Gets the last emitted value or throws an exception if the iterator has completed. * * @return mixed Value emitted from the iterator. * @psalm-return TValue * * @throws \Error If the iterator has resolved or advance() was not called before calling this method. * @throws \Throwable The exception used to fail the iterator. */ public function getCurrent(); } defer($callback); } self::$driver->run(); } /** * Stop the event loop. * * When an event loop is stopped, it continues with its current tick and exits the loop afterwards. Multiple calls * to stop MUST be ignored and MUST NOT raise an exception. * * @return void */ public static function stop() { self::$driver->stop(); } /** * Defer the execution of a callback. * * The deferred callable MUST be executed before any other type of watcher in a tick. Order of enabling MUST be * preserved when executing the callbacks. * * The created watcher MUST immediately be marked as enabled, but only be activated (i.e. callback can be called) * right before the next tick. Callbacks of watchers MUST NOT be called in the tick they were enabled. * * @param callable(string $watcherId, mixed $data) $callback The callback to defer. The `$watcherId` will be * invalidated before the callback call. * @param mixed $data Arbitrary data given to the callback function as the `$data` parameter. * * @return string An unique identifier that can be used to cancel, enable or disable the watcher. */ public static function defer(callable $callback, $data = null) : string { return self::$driver->defer($callback, $data); } /** * Delay the execution of a callback. * * The delay is a minimum and approximate, accuracy is not guaranteed. Order of calls MUST be determined by which * timers expire first, but timers with the same expiration time MAY be executed in any order. * * The created watcher MUST immediately be marked as enabled, but only be activated (i.e. callback can be called) * right before the next tick. Callbacks of watchers MUST NOT be called in the tick they were enabled. * * @param int $delay The amount of time, in milliseconds, to delay the execution for. * @param callable(string $watcherId, mixed $data) $callback The callback to delay. The `$watcherId` will be * invalidated before the callback call. * @param mixed $data Arbitrary data given to the callback function as the `$data` parameter. * * @return string An unique identifier that can be used to cancel, enable or disable the watcher. */ public static function delay(int $delay, callable $callback, $data = null) : string { return self::$driver->delay($delay, $callback, $data); } /** * Repeatedly execute a callback. * * The interval between executions is a minimum and approximate, accuracy is not guaranteed. Order of calls MUST be * determined by which timers expire first, but timers with the same expiration time MAY be executed in any order. * The first execution is scheduled after the first interval period. * * The created watcher MUST immediately be marked as enabled, but only be activated (i.e. callback can be called) * right before the next tick. Callbacks of watchers MUST NOT be called in the tick they were enabled. * * @param int $interval The time interval, in milliseconds, to wait between executions. * @param callable(string $watcherId, mixed $data) $callback The callback to repeat. * @param mixed $data Arbitrary data given to the callback function as the `$data` parameter. * * @return string An unique identifier that can be used to cancel, enable or disable the watcher. */ public static function repeat(int $interval, callable $callback, $data = null) : string { return self::$driver->repeat($interval, $callback, $data); } /** * Execute a callback when a stream resource becomes readable or is closed for reading. * * Warning: Closing resources locally, e.g. with `fclose`, might not invoke the callback. Be sure to `cancel` the * watcher when closing the resource locally. Drivers MAY choose to notify the user if there are watchers on invalid * resources, but are not required to, due to the high performance impact. Watchers on closed resources are * therefore undefined behavior. * * Multiple watchers on the same stream MAY be executed in any order. * * The created watcher MUST immediately be marked as enabled, but only be activated (i.e. callback can be called) * right before the next tick. Callbacks of watchers MUST NOT be called in the tick they were enabled. * * @param resource $stream The stream to monitor. * @param callable(string $watcherId, resource $stream, mixed $data) $callback The callback to execute. * @param mixed $data Arbitrary data given to the callback function as the `$data` parameter. * * @return string An unique identifier that can be used to cancel, enable or disable the watcher. */ public static function onReadable($stream, callable $callback, $data = null) : string { return self::$driver->onReadable($stream, $callback, $data); } /** * Execute a callback when a stream resource becomes writable or is closed for writing. * * Warning: Closing resources locally, e.g. with `fclose`, might not invoke the callback. Be sure to `cancel` the * watcher when closing the resource locally. Drivers MAY choose to notify the user if there are watchers on invalid * resources, but are not required to, due to the high performance impact. Watchers on closed resources are * therefore undefined behavior. * * Multiple watchers on the same stream MAY be executed in any order. * * The created watcher MUST immediately be marked as enabled, but only be activated (i.e. callback can be called) * right before the next tick. Callbacks of watchers MUST NOT be called in the tick they were enabled. * * @param resource $stream The stream to monitor. * @param callable(string $watcherId, resource $stream, mixed $data) $callback The callback to execute. * @param mixed $data Arbitrary data given to the callback function as the `$data` parameter. * * @return string An unique identifier that can be used to cancel, enable or disable the watcher. */ public static function onWritable($stream, callable $callback, $data = null) : string { return self::$driver->onWritable($stream, $callback, $data); } /** * Execute a callback when a signal is received. * * Warning: Installing the same signal on different instances of this interface is deemed undefined behavior. * Implementations MAY try to detect this, if possible, but are not required to. This is due to technical * limitations of the signals being registered globally per process. * * Multiple watchers on the same signal MAY be executed in any order. * * The created watcher MUST immediately be marked as enabled, but only be activated (i.e. callback can be called) * right before the next tick. Callbacks of watchers MUST NOT be called in the tick they were enabled. * * @param int $signo The signal number to monitor. * @param callable(string $watcherId, int $signo, mixed $data) $callback The callback to execute. * @param mixed $data Arbitrary data given to the callback function as the $data parameter. * * @return string An unique identifier that can be used to cancel, enable or disable the watcher. * * @throws UnsupportedFeatureException If signal handling is not supported. */ public static function onSignal(int $signo, callable $callback, $data = null) : string { return self::$driver->onSignal($signo, $callback, $data); } /** * Enable a watcher to be active starting in the next tick. * * Watchers MUST immediately be marked as enabled, but only be activated (i.e. callbacks can be called) right before * the next tick. Callbacks of watchers MUST NOT be called in the tick they were enabled. * * @param string $watcherId The watcher identifier. * * @return void * * @throws InvalidWatcherError If the watcher identifier is invalid. */ public static function enable(string $watcherId) { self::$driver->enable($watcherId); } /** * Disable a watcher immediately. * * A watcher MUST be disabled immediately, e.g. if a defer watcher disables a later defer watcher, the second defer * watcher isn't executed in this tick. * * Disabling a watcher MUST NOT invalidate the watcher. Calling this function MUST NOT fail, even if passed an * invalid watcher. * * @param string $watcherId The watcher identifier. * * @return void */ public static function disable(string $watcherId) { if (\PHP_VERSION_ID < 70200 && !isset(self::$driver)) { // Prior to PHP 7.2, self::$driver may be unset during destruct. // See https://github.com/amphp/amp/issues/212. return; } self::$driver->disable($watcherId); } /** * Cancel a watcher. * * This will detatch the event loop from all resources that are associated to the watcher. After this operation the * watcher is permanently invalid. Calling this function MUST NOT fail, even if passed an invalid watcher. * * @param string $watcherId The watcher identifier. * * @return void */ public static function cancel(string $watcherId) { if (\PHP_VERSION_ID < 70200 && !isset(self::$driver)) { // Prior to PHP 7.2, self::$driver may be unset during destruct. // See https://github.com/amphp/amp/issues/212. return; } self::$driver->cancel($watcherId); } /** * Reference a watcher. * * This will keep the event loop alive whilst the watcher is still being monitored. Watchers have this state by * default. * * @param string $watcherId The watcher identifier. * * @return void * * @throws InvalidWatcherError If the watcher identifier is invalid. */ public static function reference(string $watcherId) { self::$driver->reference($watcherId); } /** * Unreference a watcher. * * The event loop should exit the run method when only unreferenced watchers are still being monitored. Watchers * are all referenced by default. * * @param string $watcherId The watcher identifier. * * @return void */ public static function unreference(string $watcherId) { if (\PHP_VERSION_ID < 70200 && !isset(self::$driver)) { // Prior to PHP 7.2, self::$driver may be unset during destruct. // See https://github.com/amphp/amp/issues/212. return; } self::$driver->unreference($watcherId); } /** * Returns the current loop time in millisecond increments. Note this value does not necessarily correlate to * wall-clock time, rather the value returned is meant to be used in relative comparisons to prior values returned * by this method (intervals, expiration calculations, etc.) and is only updated once per loop tick. * * @return int */ public static function now() : int { return self::$driver->now(); } /** * Stores information in the loop bound registry. * * Stored information is package private. Packages MUST NOT retrieve the stored state of other packages. Packages * MUST use their namespace as prefix for keys. They may do so by using `SomeClass::class` as key. * * If packages want to expose loop bound state to consumers other than the package, they SHOULD provide a dedicated * interface for that purpose instead of sharing the storage key. * * @param string $key The namespaced storage key. * @param mixed $value The value to be stored. * * @return void */ public static function setState(string $key, $value) { self::$driver->setState($key, $value); } /** * Gets information stored bound to the loop. * * Stored information is package private. Packages MUST NOT retrieve the stored state of other packages. Packages * MUST use their namespace as prefix for keys. They may do so by using `SomeClass::class` as key. * * If packages want to expose loop bound state to consumers other than the package, they SHOULD provide a dedicated * interface for that purpose instead of sharing the storage key. * * @param string $key The namespaced storage key. * * @return mixed The previously stored value or `null` if it doesn't exist. */ public static function getState(string $key) { return self::$driver->getState($key); } /** * Set a callback to be executed when an error occurs. * * The callback receives the error as the first and only parameter. The return value of the callback gets ignored. * If it can't handle the error, it MUST throw the error. Errors thrown by the callback or during its invocation * MUST be thrown into the `run` loop and stop the driver. * * Subsequent calls to this method will overwrite the previous handler. * * @param callable(\Throwable $error)|null $callback The callback to execute. `null` will clear the * current handler. * * @return callable(\Throwable $error)|null The previous handler, `null` if there was none. */ public static function setErrorHandler(callable $callback = null) { return self::$driver->setErrorHandler($callback); } /** * Retrieve an associative array of information about the event loop driver. * * The returned array MUST contain the following data describing the driver's currently registered watchers: * * [ * "defer" => ["enabled" => int, "disabled" => int], * "delay" => ["enabled" => int, "disabled" => int], * "repeat" => ["enabled" => int, "disabled" => int], * "on_readable" => ["enabled" => int, "disabled" => int], * "on_writable" => ["enabled" => int, "disabled" => int], * "on_signal" => ["enabled" => int, "disabled" => int], * "enabled_watchers" => ["referenced" => int, "unreferenced" => int], * "running" => bool * ]; * * Implementations MAY optionally add more information in the array but at minimum the above `key => value` format * MUST always be provided. * * @return array Statistics about the loop in the described format. */ public static function getInfo() : array { return self::$driver->getInfo(); } /** * Retrieve the event loop driver that is in scope. * * @return Driver */ public static function get() : Driver { return self::$driver; } } // Default factory, don't move this to a file loaded by the composer "files" autoload mechanism, otherwise custom // implementations might have issues setting a default loop, because it's overridden by us then. // @codeCoverageIgnoreStart Loop::set((new DriverFactory())->create()); // @codeCoverageIgnoreEnd throwIfRequested(); * } * ``` * * potentially multiple times, it allows writing * * ```php * $token = $token ?? new NullCancellationToken; * * // ... * * $token->throwIfRequested(); * ``` * * instead. */ final class NullCancellationToken implements CancellationToken { /** @inheritdoc */ public function subscribe(callable $callback) : string { return "null-token"; } /** @inheritdoc */ public function unsubscribe(string $id) { // nothing to do } /** @inheritdoc */ public function isRequested() : bool { return \false; } /** @inheritdoc */ public function throwIfRequested() { // nothing to do } } generateStructPropertyError($property)); } /** * @param string $property * @param mixed $value * * @psalm-return no-return */ public function __set(string $property, $value) { throw new \Error($this->generateStructPropertyError($property)); } private function generateStructPropertyError(string $property) : string { $suggestion = $this->suggestPropertyName($property); $suggestStr = $suggestion == "" ? "" : " ... did you mean \"{$suggestion}?\""; return \sprintf( "%s property \"%s\" does not exist%s", \str_replace("\x00", "@", \get_class($this)), // Handle anonymous class names. $property, $suggestStr ); } private function suggestPropertyName(string $badProperty) : string { $badProperty = \strtolower($badProperty); $bestMatch = ""; $bestMatchPercentage = 0; /** @psalm-suppress RawObjectIteration */ foreach ($this as $property => $value) { // Never suggest properties that begin with an underscore if ($property[0] === "_") { continue; } \similar_text($badProperty, \strtolower($property), $byRefPercentage); if ($byRefPercentage > $bestMatchPercentage) { $bestMatchPercentage = $byRefPercentage; $bestMatch = $property; } } return $bestMatchPercentage >= $this->__propertySuggestThreshold ? $bestMatch : ""; } } * @template T as TReturn|Promise|\Generator * * @formatter:off * * @param callable(...mixed): T $callback * * @return callable * @psalm-return (T is Promise ? (callable(mixed...): Promise) : (T is \Generator ? (TGenerator is Promise ? (callable(mixed...): Promise) : (callable(mixed...): Promise)) : (callable(mixed...): Promise))) * * @formatter:on * * @see asyncCoroutine() * * @psalm-suppress InvalidReturnType */ function coroutine(callable $callback) : callable { /** @psalm-suppress InvalidReturnStatement */ return static function (...$args) use($callback) : Promise { return call($callback, ...$args); }; } /** * Returns a new function that wraps $callback in a promise/coroutine-aware function that automatically runs * Generators as coroutines. The returned function always returns void when invoked. Errors are forwarded to the * loop's error handler using `Amp\Promise\rethrow()`. * * Use this function to create a coroutine-aware callable for a non-promise-aware callback caller. * * @param callable(...mixed): mixed $callback * * @return callable * @psalm-return callable(mixed...): void * * @see coroutine() */ function asyncCoroutine(callable $callback) : callable { return static function (...$args) use($callback) { Promise\rethrow(call($callback, ...$args)); }; } /** * Calls the given function, always returning a promise. If the function returns a Generator, it will be run as a * coroutine. If the function throws, a failed promise will be returned. * * @template TReturn * @template TPromise * @template TGeneratorReturn * @template TGeneratorPromise * * @template TGenerator as TGeneratorReturn|Promise * @template T as TReturn|Promise|\Generator * * @formatter:off * * @param callable(...mixed): T $callback * @param mixed ...$args Arguments to pass to the function. * * @return Promise * @psalm-return (T is Promise ? Promise : (T is \Generator ? (TGenerator is Promise ? Promise : Promise) : Promise)) * * @formatter:on */ function call(callable $callback, ...$args) : Promise { try { $result = $callback(...$args); } catch (\Throwable $exception) { return new Failure($exception); } if ($result instanceof \Generator) { return new Coroutine($result); } if ($result instanceof Promise) { return $result; } if ($result instanceof ReactPromise) { return Promise\adapt($result); } return new Success($result); } /** * Calls the given function. If the function returns a Generator, it will be run as a coroutine. If the function * throws or returns a failing promise, the failure is forwarded to the loop error handler. * * @param callable(...mixed): mixed $callback * @param mixed ...$args Arguments to pass to the function. * * @return void */ function asyncCall(callable $callback, ...$args) { Promise\rethrow(call($callback, ...$args)); } /** * Sleeps for the specified number of milliseconds. * * @param int $milliseconds * * @return Delayed */ function delay(int $milliseconds) : Delayed { return new Delayed($milliseconds); } /** * Returns the current time relative to an arbitrary point in time. * * @return int Time in milliseconds. */ function getCurrentTime() : int { return Internal\getCurrentTime(); } namespace _HumbugBox1cb33d1f20f1\Amp\Promise; use _HumbugBox1cb33d1f20f1\Amp\Deferred; use _HumbugBox1cb33d1f20f1\Amp\Loop; use _HumbugBox1cb33d1f20f1\Amp\MultiReasonException; use _HumbugBox1cb33d1f20f1\Amp\Promise; use _HumbugBox1cb33d1f20f1\Amp\Success; use _HumbugBox1cb33d1f20f1\Amp\TimeoutException; use _HumbugBox1cb33d1f20f1\React\Promise\PromiseInterface as ReactPromise; use function _HumbugBox1cb33d1f20f1\Amp\call; use function _HumbugBox1cb33d1f20f1\Amp\Internal\createTypeError; /** * Registers a callback that will forward the failure reason to the event loop's error handler if the promise fails. * * Use this function if you neither return the promise nor handle a possible error yourself to prevent errors from * going entirely unnoticed. * * @param Promise|ReactPromise $promise Promise to register the handler on. * * @return void * @throws \TypeError If $promise is not an instance of \Amp\Promise or \React\Promise\PromiseInterface. * */ function rethrow($promise) { if (!$promise instanceof Promise) { if ($promise instanceof ReactPromise) { $promise = adapt($promise); } else { throw createTypeError([Promise::class, ReactPromise::class], $promise); } } $promise->onResolve(static function ($exception) { if ($exception) { throw $exception; } }); } /** * Runs the event loop until the promise is resolved. Should not be called within a running event loop. * * Use this function only in synchronous contexts to wait for an asynchronous operation. Use coroutines and yield to * await promise resolution in a fully asynchronous application instead. * * @template TPromise * @template T as Promise|ReactPromise * * @param Promise|ReactPromise $promise Promise to wait for. * * @return mixed Promise success value. * * @psalm-param T $promise * @psalm-return (T is Promise ? TPromise : mixed) * * @throws \TypeError If $promise is not an instance of \Amp\Promise or \React\Promise\PromiseInterface. * @throws \Error If the event loop stopped without the $promise being resolved. * @throws \Throwable Promise failure reason. */ function wait($promise) { if (!$promise instanceof Promise) { if ($promise instanceof ReactPromise) { $promise = adapt($promise); } else { throw createTypeError([Promise::class, ReactPromise::class], $promise); } } $resolved = \false; try { Loop::run(function () use(&$resolved, &$value, &$exception, $promise) { $promise->onResolve(function ($e, $v) use(&$resolved, &$value, &$exception) { Loop::stop(); $resolved = \true; $exception = $e; $value = $v; }); }); } catch (\Throwable $throwable) { throw new \Error("Loop exceptionally stopped without resolving the promise", 0, $throwable); } if (!$resolved) { throw new \Error("Loop stopped without resolving the promise"); } if ($exception) { throw $exception; } return $value; } /** * Creates an artificial timeout for any `Promise`. * * If the timeout expires before the promise is resolved, the returned promise fails with an instance of * `Amp\TimeoutException`. * * @template TReturn * * @param Promise|ReactPromise $promise Promise to which the timeout is applied. * @param int $timeout Timeout in milliseconds. * * @return Promise * * @throws \TypeError If $promise is not an instance of \Amp\Promise or \React\Promise\PromiseInterface. */ function timeout($promise, int $timeout) : Promise { if (!$promise instanceof Promise) { if ($promise instanceof ReactPromise) { $promise = adapt($promise); } else { throw createTypeError([Promise::class, ReactPromise::class], $promise); } } $deferred = new Deferred(); $watcher = Loop::delay($timeout, static function () use(&$deferred) { $temp = $deferred; // prevent double resolve $deferred = null; $temp->fail(new TimeoutException()); }); Loop::unreference($watcher); $promise->onResolve(function () use(&$deferred, $promise, $watcher) { if ($deferred !== null) { Loop::cancel($watcher); $deferred->resolve($promise); } }); return $deferred->promise(); } /** * Creates an artificial timeout for any `Promise`. * * If the promise is resolved before the timeout expires, the result is returned * * If the timeout expires before the promise is resolved, a default value is returned * * @template TReturn * * @param Promise|ReactPromise $promise Promise to which the timeout is applied. * @param int $timeout Timeout in milliseconds. * @param TReturn $default * * @return Promise * * @throws \TypeError If $promise is not an instance of \Amp\Promise or \React\Promise\PromiseInterface. */ function timeoutWithDefault($promise, int $timeout, $default = null) : Promise { $promise = timeout($promise, $timeout); return call(static function () use($promise, $default) { try { return (yield $promise); } catch (TimeoutException $exception) { return $default; } }); } /** * Adapts any object with a done(callable $onFulfilled, callable $onRejected) or then(callable $onFulfilled, * callable $onRejected) method to a promise usable by components depending on placeholders implementing * \AsyncInterop\Promise. * * @param object $promise Object with a done() or then() method. * * @return Promise Promise resolved by the $thenable object. * * @throws \Error If the provided object does not have a then() method. */ function adapt($promise) : Promise { if (!\is_object($promise)) { throw new \Error("Object must be provided"); } $deferred = new Deferred(); if (\method_exists($promise, 'done')) { $promise->done([$deferred, 'resolve'], [$deferred, 'fail']); } elseif (\method_exists($promise, 'then')) { $promise->then([$deferred, 'resolve'], [$deferred, 'fail']); } else { throw new \Error("Object must have a 'then' or 'done' method"); } return $deferred->promise(); } /** * Returns a promise that is resolved when all promises are resolved. The returned promise will not fail. * Returned promise succeeds with a two-item array delineating successful and failed promise results, * with keys identical and corresponding to the original given array. * * This function is the same as some() with the notable exception that it will never fail even * if all promises in the array resolve unsuccessfully. * * @template TValue * * @param Promise[]|ReactPromise[] $promises * * @return Promise * * @throws \Error If a non-Promise is in the array. */ function any(array $promises) : Promise { return some($promises, 0); } /** * Returns a promise that succeeds when all promises succeed, and fails if any promise fails. Returned * promise succeeds with an array of values used to succeed each contained promise, with keys corresponding to * the array of promises. * * @param Promise[]|ReactPromise[] $promises Array of only promises. * * @return Promise * * @throws \Error If a non-Promise is in the array. * * @template TValue * * @psalm-param array|ReactPromise> $promises * @psalm-assert array|ReactPromise> $promises $promises * @psalm-return Promise> */ function all(array $promises) : Promise { if (empty($promises)) { return new Success([]); } $deferred = new Deferred(); $result = $deferred->promise(); $pending = \count($promises); $values = []; foreach ($promises as $key => $promise) { if ($promise instanceof ReactPromise) { $promise = adapt($promise); } elseif (!$promise instanceof Promise) { throw createTypeError([Promise::class, ReactPromise::class], $promise); } $values[$key] = null; // add entry to array to preserve order $promise->onResolve(function ($exception, $value) use(&$deferred, &$values, &$pending, $key) { if ($pending === 0) { return; } if ($exception) { $pending = 0; $deferred->fail($exception); $deferred = null; return; } $values[$key] = $value; if (0 === --$pending) { $deferred->resolve($values); } }); } return $result; } /** * Returns a promise that succeeds when the first promise succeeds, and fails only if all promises fail. * * @template TValue * * @param Promise[]|ReactPromise[] $promises Array of only promises. * * @return Promise * * @throws \Error If the array is empty or a non-Promise is in the array. */ function first(array $promises) : Promise { if (empty($promises)) { throw new \Error("No promises provided"); } $deferred = new Deferred(); $result = $deferred->promise(); $pending = \count($promises); $exceptions = []; foreach ($promises as $key => $promise) { if ($promise instanceof ReactPromise) { $promise = adapt($promise); } elseif (!$promise instanceof Promise) { throw createTypeError([Promise::class, ReactPromise::class], $promise); } $exceptions[$key] = null; // add entry to array to preserve order $promise->onResolve(function ($error, $value) use(&$deferred, &$exceptions, &$pending, $key) { if ($pending === 0) { return; } if (!$error) { $pending = 0; $deferred->resolve($value); $deferred = null; return; } $exceptions[$key] = $error; if (0 === --$pending) { $deferred->fail(new MultiReasonException($exceptions)); } }); } return $result; } /** * Resolves with a two-item array delineating successful and failed Promise results. * * The returned promise will only fail if the given number of required promises fail. * * @template TValue * * @param Promise[]|ReactPromise[] $promises Array of only promises. * @param int $required Number of promises that must succeed for the * returned promise to succeed. * * @return Promise * * @throws \Error If a non-Promise is in the array. */ function some(array $promises, int $required = 1) : Promise { if ($required < 0) { throw new \Error("Number of promises required must be non-negative"); } $pending = \count($promises); if ($required > $pending) { throw new \Error("Too few promises provided"); } if (empty($promises)) { return new Success([[], []]); } $deferred = new Deferred(); $result = $deferred->promise(); $values = []; $exceptions = []; foreach ($promises as $key => $promise) { if ($promise instanceof ReactPromise) { $promise = adapt($promise); } elseif (!$promise instanceof Promise) { throw createTypeError([Promise::class, ReactPromise::class], $promise); } $values[$key] = $exceptions[$key] = null; // add entry to arrays to preserve order $promise->onResolve(static function ($exception, $value) use(&$values, &$exceptions, &$pending, $key, $required, $deferred) { if ($exception) { $exceptions[$key] = $exception; unset($values[$key]); } else { $values[$key] = $value; unset($exceptions[$key]); } if (0 === --$pending) { if (\count($values) < $required) { $deferred->fail(new MultiReasonException($exceptions)); } else { $deferred->resolve([$exceptions, $values]); } } }); } return $result; } /** * Wraps a promise into another promise, altering the exception or result. * * @param Promise|ReactPromise $promise * @param callable $callback * * @return Promise */ function wrap($promise, callable $callback) : Promise { if ($promise instanceof ReactPromise) { $promise = adapt($promise); } elseif (!$promise instanceof Promise) { throw createTypeError([Promise::class, ReactPromise::class], $promise); } $deferred = new Deferred(); $promise->onResolve(static function (\Throwable $exception = null, $result) use($deferred, $callback) { try { $result = $callback($exception, $result); } catch (\Throwable $exception) { $deferred->fail($exception); return; } $deferred->resolve($result); }); return $deferred->promise(); } namespace _HumbugBox1cb33d1f20f1\Amp\Iterator; use _HumbugBox1cb33d1f20f1\Amp\Delayed; use _HumbugBox1cb33d1f20f1\Amp\Emitter; use _HumbugBox1cb33d1f20f1\Amp\Iterator; use _HumbugBox1cb33d1f20f1\Amp\Producer; use _HumbugBox1cb33d1f20f1\Amp\Promise; use function _HumbugBox1cb33d1f20f1\Amp\call; use function _HumbugBox1cb33d1f20f1\Amp\coroutine; use function _HumbugBox1cb33d1f20f1\Amp\Internal\createTypeError; /** * Creates an iterator from the given iterable, emitting the each value. The iterable may contain promises. If any * promise fails, the iterator will fail with the same reason. * * @param array|\Traversable $iterable Elements to emit. * @param int $delay Delay between element emissions in milliseconds. * * @return Iterator * * @throws \TypeError If the argument is not an array or instance of \Traversable. */ function fromIterable($iterable, int $delay = 0) : Iterator { if (!$iterable instanceof \Traversable && !\is_array($iterable)) { throw createTypeError(["array", "Traversable"], $iterable); } if ($delay) { return new Producer(static function (callable $emit) use($iterable, $delay) { foreach ($iterable as $value) { (yield new Delayed($delay)); (yield $emit($value)); } }); } return new Producer(static function (callable $emit) use($iterable) { foreach ($iterable as $value) { (yield $emit($value)); } }); } /** * @template TValue * @template TReturn * * @param Iterator $iterator * @param callable (TValue $value): TReturn $onEmit * * @return Iterator */ function map(Iterator $iterator, callable $onEmit) : Iterator { return new Producer(static function (callable $emit) use($iterator, $onEmit) { while ((yield $iterator->advance())) { (yield $emit($onEmit($iterator->getCurrent()))); } }); } /** * @template TValue * * @param Iterator $iterator * @param callable(TValue $value):bool $filter * * @return Iterator */ function filter(Iterator $iterator, callable $filter) : Iterator { return new Producer(static function (callable $emit) use($iterator, $filter) { while ((yield $iterator->advance())) { if ($filter($iterator->getCurrent())) { (yield $emit($iterator->getCurrent())); } } }); } /** * Creates an iterator that emits values emitted from any iterator in the array of iterators. * * @param Iterator[] $iterators * * @return Iterator */ function merge(array $iterators) : Iterator { $emitter = new Emitter(); $result = $emitter->iterate(); $coroutine = coroutine(static function (Iterator $iterator) use(&$emitter) { while ((yield $iterator->advance()) && $emitter !== null) { (yield $emitter->emit($iterator->getCurrent())); } }); $coroutines = []; foreach ($iterators as $iterator) { if (!$iterator instanceof Iterator) { throw createTypeError([Iterator::class], $iterator); } $coroutines[] = $coroutine($iterator); } Promise\all($coroutines)->onResolve(static function ($exception) use(&$emitter) { if ($exception) { $emitter->fail($exception); $emitter = null; } else { $emitter->complete(); } }); return $result; } /** * Concatenates the given iterators into a single iterator, emitting values from a single iterator at a time. The * prior iterator must complete before values are emitted from any subsequent iterators. Iterators are concatenated * in the order given (iteration order of the array). * * @param Iterator[] $iterators * * @return Iterator */ function concat(array $iterators) : Iterator { foreach ($iterators as $iterator) { if (!$iterator instanceof Iterator) { throw createTypeError([Iterator::class], $iterator); } } $emitter = new Emitter(); $previous = []; $promise = Promise\all($previous); $coroutine = coroutine(static function (Iterator $iterator, callable $emit) { while ((yield $iterator->advance())) { (yield $emit($iterator->getCurrent())); } }); foreach ($iterators as $iterator) { $emit = coroutine(static function ($value) use($emitter, $promise) { static $pending = \true, $failed = \false; if ($failed) { return; } if ($pending) { try { (yield $promise); $pending = \false; } catch (\Throwable $exception) { $failed = \true; return; // Prior iterator failed. } } (yield $emitter->emit($value)); }); $previous[] = $coroutine($iterator, $emit); $promise = Promise\all($previous); } $promise->onResolve(static function ($exception) use($emitter) { if ($exception) { $emitter->fail($exception); return; } $emitter->complete(); }); return $emitter->iterate(); } /** * Discards all remaining items and returns the number of discarded items. * * @template TValue * * @param Iterator $iterator * * @return Promise * * @psalm-param Iterator $iterator * @psalm-return Promise */ function discard(Iterator $iterator) : Promise { return call(static function () use($iterator) : \Generator { $count = 0; while ((yield $iterator->advance())) { $count++; } return $count; }); } /** * Collects all items from an iterator into an array. * * @template TValue * * @param Iterator $iterator * * @psalm-param Iterator $iterator * * @return Promise * @psalm-return Promise> */ function toArray(Iterator $iterator) : Promise { return call(static function () use($iterator) { /** @psalm-var list $array */ $array = []; while ((yield $iterator->advance())) { $array[] = $iterator->getCurrent(); } return $array; }); } */ final class Coroutine implements Promise { use Internal\Placeholder; /** * Attempts to transform the non-promise yielded from the generator into a promise, otherwise returns an instance * `Amp\Failure` failed with an instance of `Amp\InvalidYieldError`. * * @param mixed $yielded Non-promise yielded from generator. * @param \Generator $generator No type for performance, we already know the type. * * @return Promise */ private static function transform($yielded, $generator) : Promise { $exception = null; // initialize here, see https://github.com/vimeo/psalm/issues/2951 try { if (\is_array($yielded)) { return Promise\all($yielded); } if ($yielded instanceof ReactPromise) { return Promise\adapt($yielded); } // No match, continue to returning Failure below. } catch (\Throwable $exception) { // Conversion to promise failed, fall-through to returning Failure below. } return new Failure(new InvalidYieldError($generator, \sprintf("Unexpected yield; Expected an instance of %s or %s or an array of such instances", Promise::class, ReactPromise::class), $exception)); } /** * @param \Generator $generator * @psalm-param \Generator,mixed,Promise|ReactPromise|TReturn> $generator */ public function __construct(\Generator $generator) { try { $yielded = $generator->current(); if (!$yielded instanceof Promise) { if (!$generator->valid()) { $this->resolve($generator->getReturn()); return; } $yielded = self::transform($yielded, $generator); } } catch (\Throwable $exception) { $this->fail($exception); return; } /** * @param \Throwable|null $e Exception to be thrown into the generator. * @param mixed $v Value to be sent into the generator. * * @return void * * @psalm-suppress MissingClosureParamType * @psalm-suppress MissingClosureReturnType */ $onResolve = function (\Throwable $e = null, $v) use($generator, &$onResolve) { /** @var bool $immediate Used to control iterative coroutine continuation. */ static $immediate = \true; /** @var \Throwable|null $exception Promise failure reason when executing next coroutine step, null at all other times. */ static $exception; /** @var mixed $value Promise success value when executing next coroutine step, null at all other times. */ static $value; $exception = $e; /** @psalm-suppress MixedAssignment */ $value = $v; if (!$immediate) { $immediate = \true; return; } try { try { do { if ($exception) { // Throw exception at current execution point. $yielded = $generator->throw($exception); } else { // Send the new value and execute to next yield statement. $yielded = $generator->send($value); } if (!$yielded instanceof Promise) { if (!$generator->valid()) { $this->resolve($generator->getReturn()); $onResolve = null; return; } $yielded = self::transform($yielded, $generator); } $immediate = \false; $yielded->onResolve($onResolve); } while ($immediate); $immediate = \true; } catch (\Throwable $exception) { $this->fail($exception); $onResolve = null; } finally { $exception = null; $value = null; } } catch (\Throwable $e) { Loop::defer(static function () use($e) { throw $e; }); } }; try { $yielded->onResolve($onResolve); unset($generator, $yielded, $onResolve); } catch (\Throwable $e) { Loop::defer(static function () use($e) { throw $e; }); } } } exception; $thatCallbacks =& $this->callbacks; foreach ($tokens as $token) { $id = $token->subscribe(static function (CancelledException $exception) use(&$thatException, &$thatCallbacks) { $thatException = $exception; $callbacks = $thatCallbacks; $thatCallbacks = []; foreach ($callbacks as $callback) { asyncCall($callback, $thatException); } }); $this->tokens[] = [$token, $id]; } } public function __destruct() { foreach ($this->tokens as list($token, $id)) { /** @var CancellationToken $token */ $token->unsubscribe($id); } } /** @inheritdoc */ public function subscribe(callable $callback) : string { $id = $this->nextId++; if ($this->exception) { asyncCall($callback, $this->exception); } else { $this->callbacks[$id] = $callback; } return $id; } /** @inheritdoc */ public function unsubscribe(string $id) { unset($this->callbacks[$id]); } /** @inheritdoc */ public function isRequested() : bool { foreach ($this->tokens as list($token)) { if ($token->isRequested()) { return \true; } } return \false; } /** @inheritdoc */ public function throwIfRequested() { foreach ($this->tokens as list($token)) { $token->throwIfRequested(); } } } getToken(); * * $response = yield $httpClient->request("https://example.com/stream", $token); * $responseBody = $response->getBody(); * * while (($chunk = yield $response->read()) !== null) { * // consume $chunk * * if ($noLongerInterested) { * $cancellationTokenSource->cancel(); * break; * } * } * ``` * * @see CancellationToken * @see CancelledException */ final class CancellationTokenSource { /** @var CancellationToken */ private $token; /** @var callable|null */ private $onCancel; public function __construct() { $onCancel = null; $this->token = new class($onCancel) implements CancellationToken { /** @var string */ private $nextId = "a"; /** @var callable[] */ private $callbacks = []; /** @var \Throwable|null */ private $exception; /** * @param mixed $onCancel * @param-out callable $onCancel */ public function __construct(&$onCancel) { /** @psalm-suppress MissingClosureReturnType We still support PHP 7.0 */ $onCancel = function (\Throwable $exception) { $this->exception = $exception; $callbacks = $this->callbacks; $this->callbacks = []; foreach ($callbacks as $callback) { $this->invokeCallback($callback); } }; } /** * @param callable $callback * * @return void */ private function invokeCallback(callable $callback) { // No type declaration to prevent exception outside the try! try { /** @var mixed $result */ $result = $callback($this->exception); if ($result instanceof \Generator) { /** @psalm-var \Generator $result */ $result = new Coroutine($result); } if ($result instanceof Promise || $result instanceof ReactPromise) { rethrow($result); } } catch (\Throwable $exception) { Loop::defer(static function () use($exception) { throw $exception; }); } } public function subscribe(callable $callback) : string { $id = $this->nextId++; if ($this->exception) { $this->invokeCallback($callback); } else { $this->callbacks[$id] = $callback; } return $id; } public function unsubscribe(string $id) { unset($this->callbacks[$id]); } public function isRequested() : bool { return isset($this->exception); } public function throwIfRequested() { if (isset($this->exception)) { throw $this->exception; } } }; $this->onCancel = $onCancel; } public function getToken() : CancellationToken { return $this->token; } /** * @param \Throwable|null $previous Exception to be used as the previous exception to CancelledException. * * @return void */ public function cancel(\Throwable $previous = null) { if ($this->onCancel === null) { return; } $onCancel = $this->onCancel; $this->onCancel = null; $onCancel(new CancelledException($previous)); } } */ final class Failure implements Promise { /** @var \Throwable $exception */ private $exception; /** * @param \Throwable $exception Rejection reason. */ public function __construct(\Throwable $exception) { $this->exception = $exception; } /** * {@inheritdoc} */ public function onResolve(callable $onResolved) { try { /** @var mixed $result */ $result = $onResolved($this->exception, null); if ($result === null) { return; } if ($result instanceof \Generator) { $result = new Coroutine($result); } if ($result instanceof Promise || $result instanceof ReactPromise) { Promise\rethrow($result); } } catch (\Throwable $exception) { Loop::defer(static function () use($exception) { throw $exception; }); } } } */ final class Producer implements Iterator { /** * @use Internal\Producer */ use CallableMaker, Internal\Producer; /** * @param callable(callable(TValue):Promise):\Generator $producer * * @throws \Error Thrown if the callable does not return a Generator. */ public function __construct(callable $producer) { $result = $producer($this->callableFromInstanceMethod("emit")); if (!$result instanceof \Generator) { throw new \Error("The callable did not return a Generator"); } $coroutine = new Coroutine($result); $coroutine->onResolve(function ($exception) { if ($this->complete) { return; } if ($exception) { $this->fail($exception); return; } $this->complete(); }); } } */ final class Success implements Promise { /** @var mixed */ private $value; /** * @param mixed $value Anything other than a Promise object. * * @psalm-param TValue $value * * @throws \Error If a promise is given as the value. */ public function __construct($value = null) { if ($value instanceof Promise || $value instanceof ReactPromise) { throw new \Error("Cannot use a promise as success value"); } $this->value = $value; } /** * {@inheritdoc} */ public function onResolve(callable $onResolved) { try { $result = $onResolved(null, $this->value); if ($result === null) { return; } if ($result instanceof \Generator) { $result = new Coroutine($result); } if ($result instanceof Promise || $result instanceof ReactPromise) { Promise\rethrow($result); } } catch (\Throwable $exception) { Loop::defer(static function () use($exception) { throw $exception; }); } } } getMethod($method); } return self::$__reflectionMethods[$method]->getClosure($this); } /** * Creates a callable from a protected or private static method that may be invoked by methods requiring a * publicly invokable callback. * * @param string $method Static method name. * * @return callable * * @psalm-suppress MixedInferredReturnType */ private static function callableFromStaticMethod(string $method) : callable { if (!isset(self::$__reflectionMethods[$method])) { if (self::$__reflectionClass === null) { self::$__reflectionClass = new \ReflectionClass(self::class); } self::$__reflectionMethods[$method] = self::$__reflectionClass->getMethod($method); } return self::$__reflectionMethods[$method]->getClosure(); } } } else { /** @psalm-suppress DuplicateClass */ trait CallableMaker { /** * @deprecated Use \Closure::fromCallable() instead of this method in PHP 7.1. */ private function callableFromInstanceMethod(string $method) : callable { return \Closure::fromCallable([$this, $method]); } /** * @deprecated Use \Closure::fromCallable() instead of this method in PHP 7.1. */ private static function callableFromStaticMethod(string $method) : callable { return \Closure::fromCallable([self::class, $method]); } } } // @codeCoverageIgnoreEnd Has public resolve and fail methods. */ private $resolver; /** @var Promise Hides placeholder methods */ private $promise; public function __construct() { $this->resolver = new class implements Promise { use Internal\Placeholder { resolve as public; fail as public; isResolved as public; } }; $this->promise = new Internal\PrivatePromise($this->resolver); } /** * @return Promise */ public function promise() : Promise { return $this->promise; } /** * Fulfill the promise with the given value. * * @param mixed $value * * @psalm-param TValue|Promise $value * * @return void */ public function resolve($value = null) { /** @psalm-suppress UndefinedInterfaceMethod */ $this->resolver->resolve($value); } /** * Fails the promise the the given reason. * * @param \Throwable $reason * * @return void */ public function fail(\Throwable $reason) { /** @psalm-suppress UndefinedInterfaceMethod */ $this->resolver->fail($reason); } /** * @return bool True if the promise has been resolved. */ public function isResolved() : bool { return $this->resolver->isResolved(); } } driver = $driver; } public function run() { $this->driver->run(); } public function stop() { $this->driver->stop(); } public function defer(callable $callback, $data = null) : string { $id = $this->driver->defer(function (...$args) use($callback) { $this->cancel($args[0]); return $callback(...$args); }, $data); $this->creationTraces[$id] = formatStacktrace(\debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS)); $this->enabledWatchers[$id] = \true; return $id; } public function delay(int $delay, callable $callback, $data = null) : string { $id = $this->driver->delay($delay, function (...$args) use($callback) { $this->cancel($args[0]); return $callback(...$args); }, $data); $this->creationTraces[$id] = formatStacktrace(\debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS)); $this->enabledWatchers[$id] = \true; return $id; } public function repeat(int $interval, callable $callback, $data = null) : string { $id = $this->driver->repeat($interval, $callback, $data); $this->creationTraces[$id] = formatStacktrace(\debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS)); $this->enabledWatchers[$id] = \true; return $id; } public function onReadable($stream, callable $callback, $data = null) : string { $id = $this->driver->onReadable($stream, $callback, $data); $this->creationTraces[$id] = formatStacktrace(\debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS)); $this->enabledWatchers[$id] = \true; return $id; } public function onWritable($stream, callable $callback, $data = null) : string { $id = $this->driver->onWritable($stream, $callback, $data); $this->creationTraces[$id] = formatStacktrace(\debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS)); $this->enabledWatchers[$id] = \true; return $id; } public function onSignal(int $signo, callable $callback, $data = null) : string { $id = $this->driver->onSignal($signo, $callback, $data); $this->creationTraces[$id] = formatStacktrace(\debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS)); $this->enabledWatchers[$id] = \true; return $id; } public function enable(string $watcherId) { try { $this->driver->enable($watcherId); $this->enabledWatchers[$watcherId] = \true; } catch (InvalidWatcherError $e) { throw new InvalidWatcherError($watcherId, $e->getMessage() . "\r\n\r\n" . $this->getTraces($watcherId)); } } public function cancel(string $watcherId) { $this->driver->cancel($watcherId); if (!isset($this->cancelTraces[$watcherId])) { $this->cancelTraces[$watcherId] = formatStacktrace(\debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS)); } unset($this->enabledWatchers[$watcherId], $this->unreferencedWatchers[$watcherId]); } public function disable(string $watcherId) { $this->driver->disable($watcherId); unset($this->enabledWatchers[$watcherId]); } public function reference(string $watcherId) { try { $this->driver->reference($watcherId); unset($this->unreferencedWatchers[$watcherId]); } catch (InvalidWatcherError $e) { throw new InvalidWatcherError($watcherId, $e->getMessage() . "\r\n\r\n" . $this->getTraces($watcherId)); } } public function unreference(string $watcherId) { $this->driver->unreference($watcherId); $this->unreferencedWatchers[$watcherId] = \true; } public function setErrorHandler(callable $callback = null) { return $this->driver->setErrorHandler($callback); } /** @inheritdoc */ public function getHandle() { $this->driver->getHandle(); } public function dump() : string { $dump = "Enabled, referenced watchers keeping the loop running: "; foreach ($this->enabledWatchers as $watcher => $_) { if (isset($this->unreferencedWatchers[$watcher])) { continue; } $dump .= "Watcher ID: " . $watcher . "\r\n"; $dump .= $this->getCreationTrace($watcher); $dump .= "\r\n\r\n"; } return \rtrim($dump); } public function getInfo() : array { return $this->driver->getInfo(); } public function __debugInfo() { return $this->driver->__debugInfo(); } public function now() : int { return $this->driver->now(); } protected function error(\Throwable $exception) { $this->driver->error($exception); } /** * @inheritdoc * * @return void */ protected function activate(array $watchers) { // nothing to do in a decorator } /** * @inheritdoc * * @return void */ protected function dispatch(bool $blocking) { // nothing to do in a decorator } /** * @inheritdoc * * @return void */ protected function deactivate(Watcher $watcher) { // nothing to do in a decorator } private function getTraces(string $watcherId) : string { return "Creation Trace:\r\n" . $this->getCreationTrace($watcherId) . "\r\n\r\n" . "Cancellation Trace:\r\n" . $this->getCancelTrace($watcherId); } private function getCreationTrace(string $watcher) : string { if (!isset($this->creationTraces[$watcher])) { return 'No creation trace, yet.'; } return $this->creationTraces[$watcher]; } private function getCancelTrace(string $watcher) : string { if (!isset($this->cancelTraces[$watcher])) { return 'No cancellation trace, yet.'; } return $this->cancelTraces[$watcher]; } } timerQueue = new Internal\TimerQueue(); $this->signalHandling = \extension_loaded("pcntl"); $this->nowOffset = getCurrentTime(); $this->now = \random_int(0, $this->nowOffset); $this->nowOffset -= $this->now; $this->streamSelectErrorHandler = function ($errno, $message) { // Casing changed in PHP 8 from 'unable' to 'Unable' if (\stripos($message, "stream_select(): unable to select [4]: ") === 0) { // EINTR $this->streamSelectIgnoreResult = \true; return; } if (\strpos($message, 'FD_SETSIZE') !== \false) { $message = \str_replace(["\r\n", "\n", "\r"], " ", $message); $pattern = '(stream_select\\(\\): You MUST recompile PHP with a larger value of FD_SETSIZE. It is set to (\\d+), but you have descriptors numbered at least as high as (\\d+)\\.)'; if (\preg_match($pattern, $message, $match)) { $helpLink = 'https://amphp.org/amp/event-loop/#implementations'; $message = 'You have reached the limits of stream_select(). It has a FD_SETSIZE of ' . $match[1] . ', but you have file descriptors numbered at least as high as ' . $match[2] . '. ' . "You can install one of the extensions listed on {$helpLink} to support a higher number of " . "concurrent file descriptors. If a large number of open file descriptors is unexpected, you " . "might be leaking file descriptors that aren't closed correctly."; } } throw new \Exception($message, $errno); }; } /** * {@inheritdoc} * * @throws \Amp\Loop\UnsupportedFeatureException If the pcntl extension is not available. */ public function onSignal(int $signo, callable $callback, $data = null) : string { if (!$this->signalHandling) { throw new UnsupportedFeatureException("Signal handling requires the pcntl extension"); } return parent::onSignal($signo, $callback, $data); } /** * {@inheritdoc} */ public function now() : int { $this->now = getCurrentTime() - $this->nowOffset; return $this->now; } /** * {@inheritdoc} */ public function getHandle() { return null; } /** * @param bool $blocking * * @return void * * @throws \Throwable */ protected function dispatch(bool $blocking) { $this->selectStreams($this->readStreams, $this->writeStreams, $blocking ? $this->getTimeout() : 0); $now = $this->now(); while ($watcher = $this->timerQueue->extract($now)) { if ($watcher->type & Watcher::REPEAT) { $watcher->enabled = \false; // Trick base class into adding to enable queue when calling enable() $this->enable($watcher->id); } else { $this->cancel($watcher->id); } try { // Execute the timer. $result = ($watcher->callback)($watcher->id, $watcher->data); if ($result === null) { continue; } if ($result instanceof \Generator) { $result = new Coroutine($result); } if ($result instanceof Promise || $result instanceof ReactPromise) { rethrow($result); } } catch (\Throwable $exception) { $this->error($exception); } } if ($this->signalHandling) { \pcntl_signal_dispatch(); } } /** * {@inheritdoc} * * @return void */ protected function activate(array $watchers) { foreach ($watchers as $watcher) { switch ($watcher->type) { case Watcher::READABLE: \assert(\is_resource($watcher->value)); $streamId = (int) $watcher->value; $this->readWatchers[$streamId][$watcher->id] = $watcher; $this->readStreams[$streamId] = $watcher->value; break; case Watcher::WRITABLE: \assert(\is_resource($watcher->value)); $streamId = (int) $watcher->value; $this->writeWatchers[$streamId][$watcher->id] = $watcher; $this->writeStreams[$streamId] = $watcher->value; break; case Watcher::DELAY: case Watcher::REPEAT: \assert(\is_int($watcher->value)); $this->timerQueue->insert($watcher); break; case Watcher::SIGNAL: \assert(\is_int($watcher->value)); if (!isset($this->signalWatchers[$watcher->value])) { if (!@\pcntl_signal($watcher->value, $this->callableFromInstanceMethod('handleSignal'))) { $message = "Failed to register signal handler"; if ($error = \error_get_last()) { $message .= \sprintf("; Errno: %d; %s", $error["type"], $error["message"]); } throw new \Error($message); } } $this->signalWatchers[$watcher->value][$watcher->id] = $watcher; break; default: // @codeCoverageIgnoreStart throw new \Error("Unknown watcher type"); } } } /** * {@inheritdoc} * * @return void */ protected function deactivate(Watcher $watcher) { switch ($watcher->type) { case Watcher::READABLE: $streamId = (int) $watcher->value; unset($this->readWatchers[$streamId][$watcher->id]); if (empty($this->readWatchers[$streamId])) { unset($this->readWatchers[$streamId], $this->readStreams[$streamId]); } break; case Watcher::WRITABLE: $streamId = (int) $watcher->value; unset($this->writeWatchers[$streamId][$watcher->id]); if (empty($this->writeWatchers[$streamId])) { unset($this->writeWatchers[$streamId], $this->writeStreams[$streamId]); } break; case Watcher::DELAY: case Watcher::REPEAT: $this->timerQueue->remove($watcher); break; case Watcher::SIGNAL: \assert(\is_int($watcher->value)); if (isset($this->signalWatchers[$watcher->value])) { unset($this->signalWatchers[$watcher->value][$watcher->id]); if (empty($this->signalWatchers[$watcher->value])) { unset($this->signalWatchers[$watcher->value]); @\pcntl_signal($watcher->value, \SIG_DFL); } } break; default: // @codeCoverageIgnoreStart throw new \Error("Unknown watcher type"); } } /** * @param resource[] $read * @param resource[] $write * @param int $timeout * * @return void */ private function selectStreams(array $read, array $write, int $timeout) { $timeout /= self::MILLISEC_PER_SEC; if (!empty($read) || !empty($write)) { // Use stream_select() if there are any streams in the loop. if ($timeout >= 0) { $seconds = (int) $timeout; $microseconds = (int) (($timeout - $seconds) * self::MICROSEC_PER_SEC); } else { $seconds = null; $microseconds = null; } // Failed connection attempts are indicated via except on Windows // @link https://github.com/reactphp/event-loop/blob/8bd064ce23c26c4decf186c2a5a818c9a8209eb0/src/StreamSelectLoop.php#L279-L287 // @link https://docs.microsoft.com/de-de/windows/win32/api/winsock2/nf-winsock2-select $except = null; if (\DIRECTORY_SEPARATOR === '\\') { $except = $write; } \set_error_handler($this->streamSelectErrorHandler); try { $result = \stream_select($read, $write, $except, $seconds, $microseconds); } finally { \restore_error_handler(); } if ($this->streamSelectIgnoreResult || $result === 0) { $this->streamSelectIgnoreResult = \false; return; } if (!$result) { $this->error(new \Exception('Unknown error during stream_select')); return; } foreach ($read as $stream) { $streamId = (int) $stream; if (!isset($this->readWatchers[$streamId])) { continue; // All read watchers disabled. } foreach ($this->readWatchers[$streamId] as $watcher) { if (!isset($this->readWatchers[$streamId][$watcher->id])) { continue; // Watcher disabled by another IO watcher. } try { $result = ($watcher->callback)($watcher->id, $stream, $watcher->data); if ($result === null) { continue; } if ($result instanceof \Generator) { $result = new Coroutine($result); } if ($result instanceof Promise || $result instanceof ReactPromise) { rethrow($result); } } catch (\Throwable $exception) { $this->error($exception); } } } \assert(\is_array($write)); // See https://github.com/vimeo/psalm/issues/3036 if ($except) { foreach ($except as $key => $socket) { $write[$key] = $socket; } } foreach ($write as $stream) { $streamId = (int) $stream; if (!isset($this->writeWatchers[$streamId])) { continue; // All write watchers disabled. } foreach ($this->writeWatchers[$streamId] as $watcher) { if (!isset($this->writeWatchers[$streamId][$watcher->id])) { continue; // Watcher disabled by another IO watcher. } try { $result = ($watcher->callback)($watcher->id, $stream, $watcher->data); if ($result === null) { continue; } if ($result instanceof \Generator) { $result = new Coroutine($result); } if ($result instanceof Promise || $result instanceof ReactPromise) { rethrow($result); } } catch (\Throwable $exception) { $this->error($exception); } } } return; } if ($timeout < 0) { // Only signal watchers are enabled, so sleep indefinitely. \usleep(\PHP_INT_MAX); return; } if ($timeout > 0) { // Sleep until next timer expires. \usleep((int) ($timeout * self::MICROSEC_PER_SEC)); } } /** * @return int Milliseconds until next timer expires or -1 if there are no pending times. */ private function getTimeout() : int { $expiration = $this->timerQueue->peek(); if ($expiration === null) { return -1; } $expiration -= getCurrentTime() - $this->nowOffset; return $expiration > 0 ? $expiration : 0; } /** * @param int $signo * * @return void */ private function handleSignal(int $signo) { foreach ($this->signalWatchers[$signo] as $watcher) { if (!isset($this->signalWatchers[$signo][$watcher->id])) { continue; } try { $result = ($watcher->callback)($watcher->id, $signo, $watcher->data); if ($result === null) { continue; } if ($result instanceof \Generator) { $result = new Coroutine($result); } if ($result instanceof Promise || $result instanceof ReactPromise) { rethrow($result); } } catch (\Throwable $exception) { $this->error($exception); } } } } data[$node]; while ($node !== 0 && $entry->expiration < $this->data[$parent = $node - 1 >> 1]->expiration) { $this->swap($node, $parent); $node = $parent; } } /** * @param int $node Rebuild the data array from the given node downward. * * @return void */ private function heapifyDown(int $node) { $length = \count($this->data); while (($child = ($node << 1) + 1) < $length) { if ($this->data[$child]->expiration < $this->data[$node]->expiration && ($child + 1 >= $length || $this->data[$child]->expiration < $this->data[$child + 1]->expiration)) { // Left child is less than parent and right child. $swap = $child; } elseif ($child + 1 < $length && $this->data[$child + 1]->expiration < $this->data[$node]->expiration) { // Right child is less than parent and left child. $swap = $child + 1; } else { // Left and right child are greater than parent. break; } $this->swap($node, $swap); $node = $swap; } } private function swap(int $left, int $right) { $temp = $this->data[$left]; $this->data[$left] = $this->data[$right]; $this->pointers[$this->data[$right]->id] = $left; $this->data[$right] = $temp; $this->pointers[$temp->id] = $right; } /** * Inserts the watcher into the queue. Time complexity: O(log(n)). * * @param Watcher $watcher * * @psalm-param Watcher $watcher * * @return void */ public function insert(Watcher $watcher) { \assert($watcher->expiration !== null); \assert(!isset($this->pointers[$watcher->id])); $node = \count($this->data); $this->data[$node] = $watcher; $this->pointers[$watcher->id] = $node; $this->heapifyUp($node); } /** * Removes the given watcher from the queue. Time complexity: O(log(n)). * * @param Watcher $watcher * * @psalm-param Watcher $watcher * * @return void */ public function remove(Watcher $watcher) { $id = $watcher->id; if (!isset($this->pointers[$id])) { return; } $this->removeAndRebuild($this->pointers[$id]); } /** * Deletes and returns the Watcher on top of the heap if it has expired, otherwise null is returned. * Time complexity: O(log(n)). * * @param int $now Current loop time. * * @return Watcher|null Expired watcher at the top of the heap or null if the watcher has not expired. * * @psalm-return Watcher|null */ public function extract(int $now) { if (empty($this->data)) { return null; } $watcher = $this->data[0]; if ($watcher->expiration > $now) { return null; } $this->removeAndRebuild(0); return $watcher; } /** * Returns the expiration time value at the top of the heap. Time complexity: O(1). * * @return int|null Expiration time of the watcher at the top of the heap or null if the heap is empty. */ public function peek() { return isset($this->data[0]) ? $this->data[0]->expiration : null; } /** * @param int $node Remove the given node and then rebuild the data array. * * @return void */ private function removeAndRebuild(int $node) { $length = \count($this->data) - 1; $id = $this->data[$node]->id; $left = $this->data[$node] = $this->data[$length]; $this->pointers[$left->id] = $node; unset($this->data[$length], $this->pointers[$id]); if ($node < $length) { // don't need to do anything if we removed the last element $parent = $node - 1 >> 1; if ($parent >= 0 && $this->data[$node]->expiration < $this->data[$parent]->expiration) { $this->heapifyUp($node); } else { $this->heapifyDown($node); } } } } running = \true; try { while ($this->running) { if ($this->isEmpty()) { return; } $this->tick(); } } finally { $this->stop(); } } /** * @return bool True if no enabled and referenced watchers remain in the loop. */ private function isEmpty() : bool { foreach ($this->watchers as $watcher) { if ($watcher->enabled && $watcher->referenced) { return \false; } } return \true; } /** * Executes a single tick of the event loop. * * @return void */ private function tick() { if (empty($this->deferQueue)) { $this->deferQueue = $this->nextTickQueue; } else { $this->deferQueue = \array_merge($this->deferQueue, $this->nextTickQueue); } $this->nextTickQueue = []; $this->activate($this->enableQueue); $this->enableQueue = []; foreach ($this->deferQueue as $watcher) { if (!isset($this->deferQueue[$watcher->id])) { continue; // Watcher disabled by another defer watcher. } unset($this->watchers[$watcher->id], $this->deferQueue[$watcher->id]); try { /** @var mixed $result */ $result = ($watcher->callback)($watcher->id, $watcher->data); if ($result === null) { continue; } if ($result instanceof \Generator) { $result = new Coroutine($result); } if ($result instanceof Promise || $result instanceof ReactPromise) { rethrow($result); } } catch (\Throwable $exception) { $this->error($exception); } } /** @psalm-suppress RedundantCondition */ $this->dispatch(empty($this->nextTickQueue) && empty($this->enableQueue) && $this->running && !$this->isEmpty()); } /** * Activates (enables) all the given watchers. * * @param Watcher[] $watchers * * @return void */ protected abstract function activate(array $watchers); /** * Dispatches any pending read/write, timer, and signal events. * * @param bool $blocking * * @return void */ protected abstract function dispatch(bool $blocking); /** * Stop the event loop. * * When an event loop is stopped, it continues with its current tick and exits the loop afterwards. Multiple calls * to stop MUST be ignored and MUST NOT raise an exception. * * @return void */ public function stop() { $this->running = \false; } /** * Defer the execution of a callback. * * The deferred callable MUST be executed before any other type of watcher in a tick. Order of enabling MUST be * preserved when executing the callbacks. * * The created watcher MUST immediately be marked as enabled, but only be activated (i.e. callback can be called) * right before the next tick. Callbacks of watchers MUST NOT be called in the tick they were enabled. * * @param callable (string $watcherId, mixed $data) $callback The callback to defer. The `$watcherId` will be * invalidated before the callback call. * @param mixed $data Arbitrary data given to the callback function as the `$data` parameter. * * @return string An unique identifier that can be used to cancel, enable or disable the watcher. */ public function defer(callable $callback, $data = null) : string { /** @psalm-var Watcher $watcher */ $watcher = new Watcher(); $watcher->type = Watcher::DEFER; $watcher->id = $this->nextId++; $watcher->callback = $callback; $watcher->data = $data; $this->watchers[$watcher->id] = $watcher; $this->nextTickQueue[$watcher->id] = $watcher; return $watcher->id; } /** * Delay the execution of a callback. * * The delay is a minimum and approximate, accuracy is not guaranteed. Order of calls MUST be determined by which * timers expire first, but timers with the same expiration time MAY be executed in any order. * * The created watcher MUST immediately be marked as enabled, but only be activated (i.e. callback can be called) * right before the next tick. Callbacks of watchers MUST NOT be called in the tick they were enabled. * * @param int $delay The amount of time, in milliseconds, to delay the execution for. * @param callable (string $watcherId, mixed $data) $callback The callback to delay. The `$watcherId` will be * invalidated before the callback call. * @param mixed $data Arbitrary data given to the callback function as the `$data` parameter. * * @return string An unique identifier that can be used to cancel, enable or disable the watcher. */ public function delay(int $delay, callable $callback, $data = null) : string { if ($delay < 0) { throw new \Error("Delay must be greater than or equal to zero"); } /** @psalm-var Watcher $watcher */ $watcher = new Watcher(); $watcher->type = Watcher::DELAY; $watcher->id = $this->nextId++; $watcher->callback = $callback; $watcher->value = $delay; $watcher->expiration = $this->now() + $delay; $watcher->data = $data; $this->watchers[$watcher->id] = $watcher; $this->enableQueue[$watcher->id] = $watcher; return $watcher->id; } /** * Repeatedly execute a callback. * * The interval between executions is a minimum and approximate, accuracy is not guaranteed. Order of calls MUST be * determined by which timers expire first, but timers with the same expiration time MAY be executed in any order. * The first execution is scheduled after the first interval period. * * The created watcher MUST immediately be marked as enabled, but only be activated (i.e. callback can be called) * right before the next tick. Callbacks of watchers MUST NOT be called in the tick they were enabled. * * @param int $interval The time interval, in milliseconds, to wait between executions. * @param callable (string $watcherId, mixed $data) $callback The callback to repeat. * @param mixed $data Arbitrary data given to the callback function as the `$data` parameter. * * @return string An unique identifier that can be used to cancel, enable or disable the watcher. */ public function repeat(int $interval, callable $callback, $data = null) : string { if ($interval < 0) { throw new \Error("Interval must be greater than or equal to zero"); } /** @psalm-var Watcher $watcher */ $watcher = new Watcher(); $watcher->type = Watcher::REPEAT; $watcher->id = $this->nextId++; $watcher->callback = $callback; $watcher->value = $interval; $watcher->expiration = $this->now() + $interval; $watcher->data = $data; $this->watchers[$watcher->id] = $watcher; $this->enableQueue[$watcher->id] = $watcher; return $watcher->id; } /** * Execute a callback when a stream resource becomes readable or is closed for reading. * * Warning: Closing resources locally, e.g. with `fclose`, might not invoke the callback. Be sure to `cancel` the * watcher when closing the resource locally. Drivers MAY choose to notify the user if there are watchers on invalid * resources, but are not required to, due to the high performance impact. Watchers on closed resources are * therefore undefined behavior. * * Multiple watchers on the same stream MAY be executed in any order. * * The created watcher MUST immediately be marked as enabled, but only be activated (i.e. callback can be called) * right before the next tick. Callbacks of watchers MUST NOT be called in the tick they were enabled. * * @param resource $stream The stream to monitor. * @param callable (string $watcherId, resource $stream, mixed $data) $callback The callback to execute. * @param mixed $data Arbitrary data given to the callback function as the `$data` parameter. * * @return string An unique identifier that can be used to cancel, enable or disable the watcher. */ public function onReadable($stream, callable $callback, $data = null) : string { /** @psalm-var Watcher $watcher */ $watcher = new Watcher(); $watcher->type = Watcher::READABLE; $watcher->id = $this->nextId++; $watcher->callback = $callback; $watcher->value = $stream; $watcher->data = $data; $this->watchers[$watcher->id] = $watcher; $this->enableQueue[$watcher->id] = $watcher; return $watcher->id; } /** * Execute a callback when a stream resource becomes writable or is closed for writing. * * Warning: Closing resources locally, e.g. with `fclose`, might not invoke the callback. Be sure to `cancel` the * watcher when closing the resource locally. Drivers MAY choose to notify the user if there are watchers on invalid * resources, but are not required to, due to the high performance impact. Watchers on closed resources are * therefore undefined behavior. * * Multiple watchers on the same stream MAY be executed in any order. * * The created watcher MUST immediately be marked as enabled, but only be activated (i.e. callback can be called) * right before the next tick. Callbacks of watchers MUST NOT be called in the tick they were enabled. * * @param resource $stream The stream to monitor. * @param callable (string $watcherId, resource $stream, mixed $data) $callback The callback to execute. * @param mixed $data Arbitrary data given to the callback function as the `$data` parameter. * * @return string An unique identifier that can be used to cancel, enable or disable the watcher. */ public function onWritable($stream, callable $callback, $data = null) : string { /** @psalm-var Watcher $watcher */ $watcher = new Watcher(); $watcher->type = Watcher::WRITABLE; $watcher->id = $this->nextId++; $watcher->callback = $callback; $watcher->value = $stream; $watcher->data = $data; $this->watchers[$watcher->id] = $watcher; $this->enableQueue[$watcher->id] = $watcher; return $watcher->id; } /** * Execute a callback when a signal is received. * * Warning: Installing the same signal on different instances of this interface is deemed undefined behavior. * Implementations MAY try to detect this, if possible, but are not required to. This is due to technical * limitations of the signals being registered globally per process. * * Multiple watchers on the same signal MAY be executed in any order. * * The created watcher MUST immediately be marked as enabled, but only be activated (i.e. callback can be called) * right before the next tick. Callbacks of watchers MUST NOT be called in the tick they were enabled. * * @param int $signo The signal number to monitor. * @param callable (string $watcherId, int $signo, mixed $data) $callback The callback to execute. * @param mixed $data Arbitrary data given to the callback function as the $data parameter. * * @return string An unique identifier that can be used to cancel, enable or disable the watcher. * * @throws UnsupportedFeatureException If signal handling is not supported. */ public function onSignal(int $signo, callable $callback, $data = null) : string { /** @psalm-var Watcher $watcher */ $watcher = new Watcher(); $watcher->type = Watcher::SIGNAL; $watcher->id = $this->nextId++; $watcher->callback = $callback; $watcher->value = $signo; $watcher->data = $data; $this->watchers[$watcher->id] = $watcher; $this->enableQueue[$watcher->id] = $watcher; return $watcher->id; } /** * Enable a watcher to be active starting in the next tick. * * Watchers MUST immediately be marked as enabled, but only be activated (i.e. callbacks can be called) right before * the next tick. Callbacks of watchers MUST NOT be called in the tick they were enabled. * * @param string $watcherId The watcher identifier. * * @return void * * @throws InvalidWatcherError If the watcher identifier is invalid. */ public function enable(string $watcherId) { if (!isset($this->watchers[$watcherId])) { throw new InvalidWatcherError($watcherId, "Cannot enable an invalid watcher identifier: '{$watcherId}'"); } $watcher = $this->watchers[$watcherId]; if ($watcher->enabled) { return; // Watcher already enabled. } $watcher->enabled = \true; switch ($watcher->type) { case Watcher::DEFER: $this->nextTickQueue[$watcher->id] = $watcher; break; case Watcher::REPEAT: case Watcher::DELAY: \assert(\is_int($watcher->value)); $watcher->expiration = $this->now() + $watcher->value; $this->enableQueue[$watcher->id] = $watcher; break; default: $this->enableQueue[$watcher->id] = $watcher; break; } } /** * Cancel a watcher. * * This will detach the event loop from all resources that are associated to the watcher. After this operation the * watcher is permanently invalid. Calling this function MUST NOT fail, even if passed an invalid watcher. * * @param string $watcherId The watcher identifier. * * @return void */ public function cancel(string $watcherId) { $this->disable($watcherId); unset($this->watchers[$watcherId]); } /** * Disable a watcher immediately. * * A watcher MUST be disabled immediately, e.g. if a defer watcher disables a later defer watcher, the second defer * watcher isn't executed in this tick. * * Disabling a watcher MUST NOT invalidate the watcher. Calling this function MUST NOT fail, even if passed an * invalid watcher. * * @param string $watcherId The watcher identifier. * * @return void */ public function disable(string $watcherId) { if (!isset($this->watchers[$watcherId])) { return; } $watcher = $this->watchers[$watcherId]; if (!$watcher->enabled) { return; // Watcher already disabled. } $watcher->enabled = \false; $id = $watcher->id; switch ($watcher->type) { case Watcher::DEFER: if (isset($this->nextTickQueue[$id])) { // Watcher was only queued to be enabled. unset($this->nextTickQueue[$id]); } else { unset($this->deferQueue[$id]); } break; default: if (isset($this->enableQueue[$id])) { // Watcher was only queued to be enabled. unset($this->enableQueue[$id]); } else { $this->deactivate($watcher); } break; } } /** * Deactivates (disables) the given watcher. * * @param Watcher $watcher * * @return void */ protected abstract function deactivate(Watcher $watcher); /** * Reference a watcher. * * This will keep the event loop alive whilst the watcher is still being monitored. Watchers have this state by * default. * * @param string $watcherId The watcher identifier. * * @return void * * @throws InvalidWatcherError If the watcher identifier is invalid. */ public function reference(string $watcherId) { if (!isset($this->watchers[$watcherId])) { throw new InvalidWatcherError($watcherId, "Cannot reference an invalid watcher identifier: '{$watcherId}'"); } $this->watchers[$watcherId]->referenced = \true; } /** * Unreference a watcher. * * The event loop should exit the run method when only unreferenced watchers are still being monitored. Watchers * are all referenced by default. * * @param string $watcherId The watcher identifier. * * @return void */ public function unreference(string $watcherId) { if (!isset($this->watchers[$watcherId])) { return; } $this->watchers[$watcherId]->referenced = \false; } /** * Stores information in the loop bound registry. * * Stored information is package private. Packages MUST NOT retrieve the stored state of other packages. Packages * MUST use their namespace as prefix for keys. They may do so by using `SomeClass::class` as key. * * If packages want to expose loop bound state to consumers other than the package, they SHOULD provide a dedicated * interface for that purpose instead of sharing the storage key. * * @param string $key The namespaced storage key. * @param mixed $value The value to be stored. * * @return void */ public final function setState(string $key, $value) { if ($value === null) { unset($this->registry[$key]); } else { $this->registry[$key] = $value; } } /** * Gets information stored bound to the loop. * * Stored information is package private. Packages MUST NOT retrieve the stored state of other packages. Packages * MUST use their namespace as prefix for keys. They may do so by using `SomeClass::class` as key. * * If packages want to expose loop bound state to consumers other than the package, they SHOULD provide a dedicated * interface for that purpose instead of sharing the storage key. * * @param string $key The namespaced storage key. * * @return mixed The previously stored value or `null` if it doesn't exist. */ public final function getState(string $key) { return isset($this->registry[$key]) ? $this->registry[$key] : null; } /** * Set a callback to be executed when an error occurs. * * The callback receives the error as the first and only parameter. The return value of the callback gets ignored. * If it can't handle the error, it MUST throw the error. Errors thrown by the callback or during its invocation * MUST be thrown into the `run` loop and stop the driver. * * Subsequent calls to this method will overwrite the previous handler. * * @param callable(\Throwable $error):void|null $callback The callback to execute. `null` will clear the * current handler. * * @return callable(\Throwable $error):void|null The previous handler, `null` if there was none. */ public function setErrorHandler(callable $callback = null) { $previous = $this->errorHandler; $this->errorHandler = $callback; return $previous; } /** * Invokes the error handler with the given exception. * * @param \Throwable $exception The exception thrown from a watcher callback. * * @return void * @throws \Throwable If no error handler has been set. */ protected function error(\Throwable $exception) { if ($this->errorHandler === null) { throw $exception; } ($this->errorHandler)($exception); } /** * Returns the current loop time in millisecond increments. Note this value does not necessarily correlate to * wall-clock time, rather the value returned is meant to be used in relative comparisons to prior values returned * by this method (intervals, expiration calculations, etc.) and is only updated once per loop tick. * * Extending classes should override this function to return a value cached once per loop tick. * * @return int */ public function now() : int { return (int) (\microtime(\true) * self::MILLISEC_PER_SEC); } /** * Get the underlying loop handle. * * Example: the `uv_loop` resource for `libuv` or the `EvLoop` object for `libev` or `null` for a native driver. * * Note: This function is *not* exposed in the `Loop` class. Users shall access it directly on the respective loop * instance. * * @return null|object|resource The loop handle the event loop operates on. `null` if there is none. */ public abstract function getHandle(); /** * Returns the same array of data as getInfo(). * * @return array */ public function __debugInfo() { // @codeCoverageIgnoreStart return $this->getInfo(); // @codeCoverageIgnoreEnd } /** * Retrieve an associative array of information about the event loop driver. * * The returned array MUST contain the following data describing the driver's currently registered watchers: * * [ * "defer" => ["enabled" => int, "disabled" => int], * "delay" => ["enabled" => int, "disabled" => int], * "repeat" => ["enabled" => int, "disabled" => int], * "on_readable" => ["enabled" => int, "disabled" => int], * "on_writable" => ["enabled" => int, "disabled" => int], * "on_signal" => ["enabled" => int, "disabled" => int], * "enabled_watchers" => ["referenced" => int, "unreferenced" => int], * "running" => bool * ]; * * Implementations MAY optionally add more information in the array but at minimum the above `key => value` format * MUST always be provided. * * @return array Statistics about the loop in the described format. */ public function getInfo() : array { $watchers = ["referenced" => 0, "unreferenced" => 0]; $defer = $delay = $repeat = $onReadable = $onWritable = $onSignal = ["enabled" => 0, "disabled" => 0]; foreach ($this->watchers as $watcher) { switch ($watcher->type) { case Watcher::READABLE: $array =& $onReadable; break; case Watcher::WRITABLE: $array =& $onWritable; break; case Watcher::SIGNAL: $array =& $onSignal; break; case Watcher::DEFER: $array =& $defer; break; case Watcher::DELAY: $array =& $delay; break; case Watcher::REPEAT: $array =& $repeat; break; default: // @codeCoverageIgnoreStart throw new \Error("Unknown watcher type"); } if ($watcher->enabled) { ++$array["enabled"]; if ($watcher->referenced) { ++$watchers["referenced"]; } else { ++$watchers["unreferenced"]; } } else { ++$array["disabled"]; } } return ["enabled_watchers" => $watchers, "defer" => $defer, "delay" => $delay, "repeat" => $repeat, "on_readable" => $onReadable, "on_writable" => $onWritable, "on_signal" => $onSignal, "running" => (bool) $this->running]; } } handle = new \EvLoop(); $this->nowOffset = getCurrentTime(); $this->now = \random_int(0, $this->nowOffset); $this->nowOffset -= $this->now; if (self::$activeSignals === null) { self::$activeSignals =& $this->signals; } /** * @param \EvIO $event * * @return void */ $this->ioCallback = function (\EvIO $event) { /** @var Watcher $watcher */ $watcher = $event->data; try { $result = ($watcher->callback)($watcher->id, $watcher->value, $watcher->data); if ($result === null) { return; } if ($result instanceof \Generator) { $result = new Coroutine($result); } if ($result instanceof Promise || $result instanceof ReactPromise) { rethrow($result); } } catch (\Throwable $exception) { $this->error($exception); } }; /** * @param \EvTimer $event * * @return void */ $this->timerCallback = function (\EvTimer $event) { /** @var Watcher $watcher */ $watcher = $event->data; if ($watcher->type & Watcher::DELAY) { $this->cancel($watcher->id); } elseif ($watcher->value === 0) { // Disable and re-enable so it's not executed repeatedly in the same tick // See https://github.com/amphp/amp/issues/131 $this->disable($watcher->id); $this->enable($watcher->id); } try { $result = ($watcher->callback)($watcher->id, $watcher->data); if ($result === null) { return; } if ($result instanceof \Generator) { $result = new Coroutine($result); } if ($result instanceof Promise || $result instanceof ReactPromise) { rethrow($result); } } catch (\Throwable $exception) { $this->error($exception); } }; /** * @param \EvSignal $event * * @return void */ $this->signalCallback = function (\EvSignal $event) { /** @var Watcher $watcher */ $watcher = $event->data; try { $result = ($watcher->callback)($watcher->id, $watcher->value, $watcher->data); if ($result === null) { return; } if ($result instanceof \Generator) { $result = new Coroutine($result); } if ($result instanceof Promise || $result instanceof ReactPromise) { rethrow($result); } } catch (\Throwable $exception) { $this->error($exception); } }; } /** * {@inheritdoc} */ public function cancel(string $watcherId) { parent::cancel($watcherId); unset($this->events[$watcherId]); } public function __destruct() { foreach ($this->events as $event) { /** @psalm-suppress all */ if ($event !== null) { // Events may have been nulled in extension depending on destruct order. $event->stop(); } } // We need to clear all references to events manually, see // https://bitbucket.org/osmanov/pecl-ev/issues/31/segfault-in-ev_timer_stop $this->events = []; } /** * {@inheritdoc} */ public function run() { $active = self::$activeSignals; \assert($active !== null); foreach ($active as $event) { $event->stop(); } self::$activeSignals =& $this->signals; foreach ($this->signals as $event) { $event->start(); } try { parent::run(); } finally { foreach ($this->signals as $event) { $event->stop(); } self::$activeSignals =& $active; foreach ($active as $event) { $event->start(); } } } /** * {@inheritdoc} */ public function stop() { $this->handle->stop(); parent::stop(); } /** * {@inheritdoc} */ public function now() : int { $this->now = getCurrentTime() - $this->nowOffset; return $this->now; } /** * {@inheritdoc} */ public function getHandle() : \EvLoop { return $this->handle; } /** * {@inheritdoc} * * @return void */ protected function dispatch(bool $blocking) { $this->handle->run($blocking ? \Ev::RUN_ONCE : \Ev::RUN_ONCE | \Ev::RUN_NOWAIT); } /** * {@inheritdoc} * * @return void */ protected function activate(array $watchers) { $this->handle->nowUpdate(); $now = $this->now(); foreach ($watchers as $watcher) { if (!isset($this->events[$id = $watcher->id])) { switch ($watcher->type) { case Watcher::READABLE: \assert(\is_resource($watcher->value)); $this->events[$id] = $this->handle->io($watcher->value, \Ev::READ, $this->ioCallback, $watcher); break; case Watcher::WRITABLE: \assert(\is_resource($watcher->value)); $this->events[$id] = $this->handle->io($watcher->value, \Ev::WRITE, $this->ioCallback, $watcher); break; case Watcher::DELAY: case Watcher::REPEAT: \assert(\is_int($watcher->value)); $interval = $watcher->value / self::MILLISEC_PER_SEC; $this->events[$id] = $this->handle->timer(\max(0, ($watcher->expiration - $now) / self::MILLISEC_PER_SEC), $watcher->type & Watcher::REPEAT ? $interval : 0, $this->timerCallback, $watcher); break; case Watcher::SIGNAL: \assert(\is_int($watcher->value)); $this->events[$id] = $this->handle->signal($watcher->value, $this->signalCallback, $watcher); break; default: // @codeCoverageIgnoreStart throw new \Error("Unknown watcher type"); } } else { $this->events[$id]->start(); } if ($watcher->type === Watcher::SIGNAL) { /** @psalm-suppress PropertyTypeCoercion */ $this->signals[$id] = $this->events[$id]; } } } /** * {@inheritdoc} * * @return void */ protected function deactivate(Watcher $watcher) { if (isset($this->events[$id = $watcher->id])) { $this->events[$id]->stop(); if ($watcher->type === Watcher::SIGNAL) { unset($this->signals[$id]); } } } } watcherId = $watcherId; parent::__construct($message); } /** * @return string The watcher identifier. */ public function getWatcherId() { return $this->watcherId; } } requireFeatures(\EventConfig::FEATURE_FDS); } $this->handle = new \EventBase($config); $this->nowOffset = getCurrentTime(); $this->now = \random_int(0, $this->nowOffset); $this->nowOffset -= $this->now; if (self::$activeSignals === null) { self::$activeSignals =& $this->signals; } /** * @param $resource * @param $what * @param Watcher $watcher * * @return void */ $this->ioCallback = function ($resource, $what, Watcher $watcher) { \assert(\is_resource($watcher->value)); try { $result = ($watcher->callback)($watcher->id, $watcher->value, $watcher->data); if ($result === null) { return; } if ($result instanceof \Generator) { $result = new Coroutine($result); } if ($result instanceof Promise || $result instanceof ReactPromise) { rethrow($result); } } catch (\Throwable $exception) { $this->error($exception); } }; /** * @param $resource * @param $what * @param Watcher $watcher * * @return void */ $this->timerCallback = function ($resource, $what, Watcher $watcher) { \assert(\is_int($watcher->value)); if ($watcher->type & Watcher::DELAY) { $this->cancel($watcher->id); } else { $this->events[$watcher->id]->add($watcher->value / self::MILLISEC_PER_SEC); } try { $result = ($watcher->callback)($watcher->id, $watcher->data); if ($result === null) { return; } if ($result instanceof \Generator) { $result = new Coroutine($result); } if ($result instanceof Promise || $result instanceof ReactPromise) { rethrow($result); } } catch (\Throwable $exception) { $this->error($exception); } }; /** * @param $signum * @param $what * @param Watcher $watcher * * @return void */ $this->signalCallback = function ($signum, $what, Watcher $watcher) { try { $result = ($watcher->callback)($watcher->id, $watcher->value, $watcher->data); if ($result === null) { return; } if ($result instanceof \Generator) { $result = new Coroutine($result); } if ($result instanceof Promise || $result instanceof ReactPromise) { rethrow($result); } } catch (\Throwable $exception) { $this->error($exception); } }; } /** * {@inheritdoc} */ public function cancel(string $watcherId) { parent::cancel($watcherId); if (isset($this->events[$watcherId])) { $this->events[$watcherId]->free(); unset($this->events[$watcherId]); } } public static function isSupported() : bool { return \extension_loaded("event"); } /** * @codeCoverageIgnore */ public function __destruct() { // Unset here, otherwise $event->del() in the loop may fail with a warning, because __destruct order isn't defined. // Related https://github.com/amphp/amp/issues/159. $events = $this->events; $this->events = []; foreach ($events as $event) { if ($event !== null) { // Events may have been nulled in extension depending on destruct order. $event->free(); } } // Manually free the loop handle to fully release loop resources. // See https://github.com/amphp/amp/issues/177. if ($this->handle !== null) { $this->handle->free(); $this->handle = null; } } /** * {@inheritdoc} */ public function run() { $active = self::$activeSignals; \assert($active !== null); foreach ($active as $event) { $event->del(); } self::$activeSignals =& $this->signals; foreach ($this->signals as $event) { /** @psalm-suppress TooFewArguments https://github.com/JetBrains/phpstorm-stubs/pull/763 */ $event->add(); } try { parent::run(); } finally { foreach ($this->signals as $event) { $event->del(); } self::$activeSignals =& $active; foreach ($active as $event) { /** @psalm-suppress TooFewArguments https://github.com/JetBrains/phpstorm-stubs/pull/763 */ $event->add(); } } } /** * {@inheritdoc} */ public function stop() { $this->handle->stop(); parent::stop(); } /** * {@inheritdoc} */ public function now() : int { $this->now = getCurrentTime() - $this->nowOffset; return $this->now; } /** * {@inheritdoc} */ public function getHandle() : \EventBase { return $this->handle; } /** * {@inheritdoc} * * @return void */ protected function dispatch(bool $blocking) { $this->handle->loop($blocking ? \EventBase::LOOP_ONCE : \EventBase::LOOP_ONCE | \EventBase::LOOP_NONBLOCK); } /** * {@inheritdoc} * * @return void */ protected function activate(array $watchers) { $now = $this->now(); foreach ($watchers as $watcher) { if (!isset($this->events[$id = $watcher->id])) { switch ($watcher->type) { case Watcher::READABLE: \assert(\is_resource($watcher->value)); $this->events[$id] = new \Event($this->handle, $watcher->value, \Event::READ | \Event::PERSIST, $this->ioCallback, $watcher); break; case Watcher::WRITABLE: \assert(\is_resource($watcher->value)); $this->events[$id] = new \Event($this->handle, $watcher->value, \Event::WRITE | \Event::PERSIST, $this->ioCallback, $watcher); break; case Watcher::DELAY: case Watcher::REPEAT: \assert(\is_int($watcher->value)); $this->events[$id] = new \Event($this->handle, -1, \Event::TIMEOUT, $this->timerCallback, $watcher); break; case Watcher::SIGNAL: \assert(\is_int($watcher->value)); $this->events[$id] = new \Event($this->handle, $watcher->value, \Event::SIGNAL | \Event::PERSIST, $this->signalCallback, $watcher); break; default: // @codeCoverageIgnoreStart throw new \Error("Unknown watcher type"); } } switch ($watcher->type) { case Watcher::DELAY: case Watcher::REPEAT: \assert(\is_int($watcher->value)); $interval = \max(0, $watcher->expiration - $now); $this->events[$id]->add($interval > 0 ? $interval / self::MILLISEC_PER_SEC : 0); break; case Watcher::SIGNAL: $this->signals[$id] = $this->events[$id]; // no break default: /** @psalm-suppress TooFewArguments https://github.com/JetBrains/phpstorm-stubs/pull/763 */ $this->events[$id]->add(); break; } } } /** * {@inheritdoc} * * @return void */ protected function deactivate(Watcher $watcher) { if (isset($this->events[$id = $watcher->id])) { $this->events[$id]->del(); if ($watcher->type === Watcher::SIGNAL) { unset($this->signals[$id]); } } } } createDriverFromEnv()) { return $driver; } if (UvDriver::isSupported()) { return new UvDriver(); } if (EvDriver::isSupported()) { return new EvDriver(); } if (EventDriver::isSupported()) { return new EventDriver(); } return new NativeDriver(); })(); if (\getenv("AMP_DEBUG_TRACE_WATCHERS")) { return new TracingDriver($driver); } return $driver; } /** * @return Driver|null */ private function createDriverFromEnv() { $driver = \getenv("AMP_LOOP_DRIVER"); if (!$driver) { return null; } if (!\class_exists($driver)) { throw new \Error(\sprintf("Driver '%s' does not exist.", $driver)); } if (!\is_subclass_of($driver, Driver::class)) { throw new \Error(\sprintf("Driver '%s' is not a subclass of '%s'.", $driver, Driver::class)); } return new $driver(); } } // @codeCoverageIgnoreEnd handle = \uv_loop_new(); /** * @param $event * @param $status * @param $events * @param $resource * * @return void */ $this->ioCallback = function ($event, $status, $events, $resource) { $watchers = $this->watchers[(int) $event]; switch ($status) { case 0: // OK break; default: // Invoke the callback on errors, as this matches behavior with other loop back-ends. // Re-enable watcher as libuv disables the watcher on non-zero status. $flags = 0; foreach ($watchers as $watcher) { $flags |= $watcher->enabled ? $watcher->type : 0; } \uv_poll_start($event, $flags, $this->ioCallback); break; } foreach ($watchers as $watcher) { // $events is OR'ed with 4 to trigger watcher if no events are indicated (0) or on UV_DISCONNECT (4). // http://docs.libuv.org/en/v1.x/poll.html if (!($watcher->enabled && ($watcher->type & $events || ($events | 4) === 4))) { continue; } try { $result = ($watcher->callback)($watcher->id, $resource, $watcher->data); if ($result === null) { continue; } if ($result instanceof \Generator) { $result = new Coroutine($result); } if ($result instanceof Promise || $result instanceof ReactPromise) { rethrow($result); } } catch (\Throwable $exception) { $this->error($exception); } } }; /** * @param $event * * @return void */ $this->timerCallback = function ($event) { $watcher = $this->watchers[(int) $event][0]; if ($watcher->type & Watcher::DELAY) { unset($this->events[$watcher->id], $this->watchers[(int) $event]); // Avoid call to uv_is_active(). $this->cancel($watcher->id); // Remove reference to watcher in parent. } elseif ($watcher->value === 0) { // Disable and re-enable so it's not executed repeatedly in the same tick // See https://github.com/amphp/amp/issues/131 $this->disable($watcher->id); $this->enable($watcher->id); } try { $result = ($watcher->callback)($watcher->id, $watcher->data); if ($result === null) { return; } if ($result instanceof \Generator) { $result = new Coroutine($result); } if ($result instanceof Promise || $result instanceof ReactPromise) { rethrow($result); } } catch (\Throwable $exception) { $this->error($exception); } }; /** * @param $event * @param $signo * * @return void */ $this->signalCallback = function ($event, $signo) { $watcher = $this->watchers[(int) $event][0]; try { $result = ($watcher->callback)($watcher->id, $signo, $watcher->data); if ($result === null) { return; } if ($result instanceof \Generator) { $result = new Coroutine($result); } if ($result instanceof Promise || $result instanceof ReactPromise) { rethrow($result); } } catch (\Throwable $exception) { $this->error($exception); } }; } /** * {@inheritdoc} */ public function cancel(string $watcherId) { parent::cancel($watcherId); if (!isset($this->events[$watcherId])) { return; } $event = $this->events[$watcherId]; $eventId = (int) $event; if (isset($this->watchers[$eventId][0])) { // All except IO watchers. unset($this->watchers[$eventId]); } elseif (isset($this->watchers[$eventId][$watcherId])) { $watcher = $this->watchers[$eventId][$watcherId]; unset($this->watchers[$eventId][$watcherId]); if (empty($this->watchers[$eventId])) { unset($this->watchers[$eventId], $this->streams[(int) $watcher->value]); } } unset($this->events[$watcherId]); } public static function isSupported() : bool { return \extension_loaded("uv"); } /** * {@inheritdoc} */ public function now() : int { \uv_update_time($this->handle); /** @psalm-suppress TooManyArguments */ return \uv_now($this->handle); } /** * {@inheritdoc} */ public function getHandle() { return $this->handle; } /** * {@inheritdoc} * * @return void */ protected function dispatch(bool $blocking) { /** @psalm-suppress TooManyArguments */ \uv_run($this->handle, $blocking ? \UV::RUN_ONCE : \UV::RUN_NOWAIT); } /** * {@inheritdoc} * * @return void */ protected function activate(array $watchers) { $now = $this->now(); foreach ($watchers as $watcher) { $id = $watcher->id; switch ($watcher->type) { case Watcher::READABLE: case Watcher::WRITABLE: \assert(\is_resource($watcher->value)); $streamId = (int) $watcher->value; if (isset($this->streams[$streamId])) { $event = $this->streams[$streamId]; } elseif (isset($this->events[$id])) { $event = $this->streams[$streamId] = $this->events[$id]; } else { /** @psalm-suppress UndefinedFunction */ $event = $this->streams[$streamId] = \_HumbugBox1cb33d1f20f1\uv_poll_init_socket($this->handle, $watcher->value); } $eventId = (int) $event; $this->events[$id] = $event; $this->watchers[$eventId][$id] = $watcher; $flags = 0; foreach ($this->watchers[$eventId] as $w) { $flags |= $w->enabled ? $w->type : 0; } \uv_poll_start($event, $flags, $this->ioCallback); break; case Watcher::DELAY: case Watcher::REPEAT: \assert(\is_int($watcher->value)); if (isset($this->events[$id])) { $event = $this->events[$id]; } else { $event = $this->events[$id] = \uv_timer_init($this->handle); } $this->watchers[(int) $event] = [$watcher]; \uv_timer_start($event, \max(0, $watcher->expiration - $now), $watcher->type & Watcher::REPEAT ? $watcher->value : 0, $this->timerCallback); break; case Watcher::SIGNAL: \assert(\is_int($watcher->value)); if (isset($this->events[$id])) { $event = $this->events[$id]; } else { /** @psalm-suppress UndefinedFunction */ $event = $this->events[$id] = \_HumbugBox1cb33d1f20f1\uv_signal_init($this->handle); } $this->watchers[(int) $event] = [$watcher]; /** @psalm-suppress UndefinedFunction */ \_HumbugBox1cb33d1f20f1\uv_signal_start($event, $this->signalCallback, $watcher->value); break; default: // @codeCoverageIgnoreStart throw new \Error("Unknown watcher type"); } } } /** * {@inheritdoc} * * @return void */ protected function deactivate(Watcher $watcher) { $id = $watcher->id; if (!isset($this->events[$id])) { return; } $event = $this->events[$id]; if (!\uv_is_active($event)) { return; } switch ($watcher->type) { case Watcher::READABLE: case Watcher::WRITABLE: $flags = 0; foreach ($this->watchers[(int) $event] as $w) { $flags |= $w->enabled ? $w->type : 0; } if ($flags) { \uv_poll_start($event, $flags, $this->ioCallback); } else { \uv_poll_stop($event); } break; case Watcher::DELAY: case Watcher::REPEAT: \uv_timer_stop($event); break; case Watcher::SIGNAL: \uv_signal_stop($event); break; default: // @codeCoverageIgnoreStart throw new \Error("Unknown watcher type"); } } } current(); $prefix .= \sprintf("; %s yielded at key %s", \is_object($yielded) ? \get_class($yielded) : \gettype($yielded), \var_export($generator->key(), \true)); if (!$generator->valid()) { parent::__construct($prefix, 0, $previous); return; } $reflGen = new \ReflectionGenerator($generator); $exeGen = $reflGen->getExecutingGenerator(); if ($isSubgenerator = $exeGen !== $generator) { $reflGen = new \ReflectionGenerator($exeGen); } parent::__construct(\sprintf("%s on line %s in %s", $prefix, $reflGen->getExecutingLine(), $reflGen->getExecutingFile()), 0, $previous); } } */ final class Delayed implements Promise { use Internal\Placeholder; /** @var string|null Event loop watcher identifier. */ private $watcher; /** * @param int $time Milliseconds before succeeding the promise. * @param TReturn $value Succeed the promise with this value. */ public function __construct(int $time, $value = null) { $this->watcher = Loop::delay($time, function () use($value) { $this->watcher = null; $this->resolve($value); }); } /** * References the internal watcher in the event loop, keeping the loop running while this promise is pending. * * @return self */ public function reference() : self { if ($this->watcher !== null) { Loop::reference($this->watcher); } return $this; } /** * Unreferences the internal watcher in the event loop, allowing the loop to stop while this promise is pending if * no other events are pending in the loop. * * @return self */ public function unreference() : self { if ($this->watcher !== null) { Loop::unreference($this->watcher); } return $this; } } , mixed, * mixed>|null) | callable(\Throwable|null, mixed): void $onResolved * * @return void */ public function onResolve(callable $onResolved); } The MIT License (MIT) Copyright (c) 2015-2019 amphp Copyright (c) 2016 PHP Asynchronous Interoperability Group 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. useSingleRead = $useSingleRead; if (\strpos($meta["mode"], "r") === \false && \strpos($meta["mode"], "+") === \false) { throw new \Error("Expected a readable stream"); } \stream_set_blocking($stream, \false); \stream_set_read_buffer($stream, 0); $this->resource =& $stream; $this->chunkSize =& $chunkSize; $deferred =& $this->deferred; $readable =& $this->readable; $this->watcher = Loop::onReadable($this->resource, static function ($watcher) use(&$deferred, &$readable, &$stream, &$chunkSize, $useSingleRead) { if ($useSingleRead) { $data = @\fread($stream, $chunkSize); } else { $data = @\stream_get_contents($stream, $chunkSize); } \assert($data !== \false, "Trying to read from a previously fclose()'d resource. Do NOT manually fclose() resources the loop still has a reference to."); // Error suppression, because pthreads does crazy things with resources, // which might be closed during two operations. // See https://github.com/amphp/byte-stream/issues/32 if ($data === '' && @\feof($stream)) { $readable = \false; $stream = null; $data = null; // Stream closed, resolve read with null. Loop::cancel($watcher); } else { Loop::disable($watcher); } $temp = $deferred; $deferred = null; \assert($temp instanceof Deferred); $temp->resolve($data); }); $this->immediateCallable = static function ($watcherId, $data) use(&$deferred) { $temp = $deferred; $deferred = null; \assert($temp instanceof Deferred); $temp->resolve($data); }; Loop::disable($this->watcher); } /** @inheritdoc */ public function read() : Promise { if ($this->deferred !== null) { throw new PendingReadError(); } if (!$this->readable) { return new Success(); // Resolve with null on closed stream. } \assert($this->resource !== null); // Attempt a direct read, because Windows suffers from slow I/O on STDIN otherwise. if ($this->useSingleRead) { $data = @\fread($this->resource, $this->chunkSize); } else { $data = @\stream_get_contents($this->resource, $this->chunkSize); } \assert($data !== \false, "Trying to read from a previously fclose()'d resource. Do NOT manually fclose() resources the loop still has a reference to."); if ($data === '') { // Error suppression, because pthreads does crazy things with resources, // which might be closed during two operations. // See https://github.com/amphp/byte-stream/issues/32 if (@\feof($this->resource)) { $this->readable = \false; $this->resource = null; Loop::cancel($this->watcher); return new Success(); // Stream closed, resolve read with null. } $this->deferred = new Deferred(); Loop::enable($this->watcher); return $this->deferred->promise(); } // Prevent an immediate read → write loop from blocking everything // See e.g. examples/benchmark-throughput.php $this->deferred = new Deferred(); $this->immediateWatcher = Loop::defer($this->immediateCallable, $data); return $this->deferred->promise(); } /** * Closes the stream forcefully. Multiple `close()` calls are ignored. * * @return void */ public function close() { if (\is_resource($this->resource)) { // Error suppression, as resource might already be closed $meta = @\stream_get_meta_data($this->resource); if ($meta && \strpos($meta["mode"], "+") !== \false) { @\stream_socket_shutdown($this->resource, \STREAM_SHUT_RD); } else { /** @psalm-suppress InvalidPropertyAssignmentValue */ @\fclose($this->resource); } } $this->free(); } /** * Nulls reference to resource, marks stream unreadable, and succeeds any pending read with null. * * @return void */ private function free() { $this->readable = \false; $this->resource = null; if ($this->deferred !== null) { $deferred = $this->deferred; $this->deferred = null; $deferred->resolve(); } Loop::cancel($this->watcher); if ($this->immediateWatcher !== null) { Loop::cancel($this->immediateWatcher); } } /** * @return resource|null The stream resource or null if the stream has closed. */ public function getResource() { return $this->resource; } /** * @return void */ public function setChunkSize(int $chunkSize) { $this->chunkSize = $chunkSize; } /** * References the read watcher, so the loop keeps running in case there's an active read. * * @return void * * @see Loop::reference() */ public function reference() { if (!$this->resource) { throw new \Error("Resource has already been freed"); } Loop::reference($this->watcher); } /** * Unreferences the read watcher, so the loop doesn't keep running even if there are active reads. * * @return void * * @see Loop::unreference() */ public function unreference() { if (!$this->resource) { throw new \Error("Resource has already been freed"); } Loop::unreference($this->watcher); } public function __destruct() { if ($this->resource !== null) { $this->free(); } } } destination = $destination; } public function write(string $data) : Promise { $this->buffer .= $data; $length = \strlen($this->buffer); $chunk = \base64_decode(\substr($this->buffer, 0, $length - $length % 4), \true); if ($chunk === \false) { return new Failure(new StreamException('Invalid base64 near offset ' . $this->offset)); } $this->offset += $length - $length % 4; $this->buffer = \substr($this->buffer, $length - $length % 4); return $this->destination->write($chunk); } public function end(string $finalData = "") : Promise { $this->offset += \strlen($this->buffer); $chunk = \base64_decode($this->buffer . $finalData, \true); if ($chunk === \false) { return new Failure(new StreamException('Invalid base64 near offset ' . $this->offset)); } $this->buffer = ''; return $this->destination->end($chunk); } } source = $source; } public function read() : Promise { return call(function () { if ($this->source === null) { throw new StreamException('Failed to read stream chunk due to invalid base64 data'); } $chunk = (yield $this->source->read()); if ($chunk === null) { if ($this->buffer === null) { return null; } $chunk = \base64_decode($this->buffer, \true); if ($chunk === \false) { $this->source = null; $this->buffer = null; throw new StreamException('Failed to read stream chunk due to invalid base64 data'); } $this->buffer = null; return $chunk; } $this->buffer .= $chunk; $length = \strlen($this->buffer); $chunk = \base64_decode(\substr($this->buffer, 0, $length - $length % 4), \true); if ($chunk === \false) { $this->source = null; $this->buffer = null; throw new StreamException('Failed to read stream chunk due to invalid base64 data'); } $this->buffer = \substr($this->buffer, $length - $length % 4); return $chunk; }); } } source = $source; } public function read() : Promise { return call(function () { $chunk = (yield $this->source->read()); if ($chunk === null) { if ($this->buffer === null) { return null; } $chunk = \base64_encode($this->buffer); $this->buffer = null; return $chunk; } $this->buffer .= $chunk; $length = \strlen($this->buffer); $chunk = \base64_encode(\substr($this->buffer, 0, $length - $length % 3)); $this->buffer = \substr($this->buffer, $length - $length % 3); return $chunk; }); } } destination = $destination; } public function write(string $data) : Promise { $this->buffer .= $data; $length = \strlen($this->buffer); $chunk = \base64_encode(\substr($this->buffer, 0, $length - $length % 3)); $this->buffer = \substr($this->buffer, $length - $length % 3); return $this->destination->write($chunk); } public function end(string $finalData = "") : Promise { $chunk = \base64_encode($this->buffer . $finalData); $this->buffer = ''; return $this->destination->end($chunk); } } stream = $stream; } public function __destruct() { if (!$this->promise) { Promise\rethrow(new Coroutine($this->consume())); } } private function consume() : \Generator { try { if ($this->lastRead && null === (yield $this->lastRead)) { return; } while (null !== (yield $this->stream->read())) { // Discard unread bytes from message. } } catch (\Throwable $exception) { // If exception is thrown here the connection closed anyway. } } /** * @inheritdoc * * @throws \Error If a buffered message was requested by calling buffer(). */ public final function read() : Promise { if ($this->promise) { throw new \Error("Cannot stream message data once a buffered message has been requested"); } return $this->lastRead = $this->stream->read(); } /** * Buffers the entire message and resolves the returned promise then. * * @return Promise Resolves with the entire message contents. */ public final function buffer() : Promise { if ($this->promise) { return $this->promise; } return $this->promise = call(function () { $buffer = ''; if ($this->lastRead && null === (yield $this->lastRead)) { return $buffer; } while (null !== ($chunk = (yield $this->stream->read()))) { $buffer .= $chunk; } return $buffer; }); } } destination = $destination; $this->encoding = $encoding; $this->options = $options; $this->resource = @\deflate_init($encoding, $options); if ($this->resource === \false) { throw new StreamException("Failed initializing deflate context"); } } /** @inheritdoc */ public function write(string $data) : Promise { if ($this->resource === null) { throw new ClosedException("The stream has already been closed"); } \assert($this->destination !== null); $compressed = \deflate_add($this->resource, $data, \ZLIB_SYNC_FLUSH); if ($compressed === \false) { throw new StreamException("Failed adding data to deflate context"); } $promise = $this->destination->write($compressed); $promise->onResolve(function ($error) { if ($error) { $this->close(); } }); return $promise; } /** @inheritdoc */ public function end(string $finalData = "") : Promise { if ($this->resource === null) { throw new ClosedException("The stream has already been closed"); } \assert($this->destination !== null); $compressed = \deflate_add($this->resource, $finalData, \ZLIB_FINISH); if ($compressed === \false) { throw new StreamException("Failed adding data to deflate context"); } $promise = $this->destination->end($compressed); $promise->onResolve(function () { $this->close(); }); return $promise; } /** * @internal * @return void */ private function close() { $this->resource = null; $this->destination = null; } /** * Gets the used compression encoding. * * @return int Encoding specified on construction time. */ public function getEncoding() : int { return $this->encoding; } /** * Gets the used compression options. * * @return array Options array passed on construction time. */ public function getOptions() : array { return $this->options; } } read()) !== null) { * $buffer .= $chunk; * } * * return $buffer; * }); * } * ``` */ interface InputStream { /** * Reads data from the stream. * * @return Promise Resolves with a string when new data is available or `null` if the stream has closed. * * @psalm-return Promise * * @throws PendingReadError Thrown if another read operation is still pending. */ public function read() : Promise; } source = $inputStream; $this->delimiter = $delimiter === null ? "\n" : $delimiter; $this->lineMode = $delimiter === null; } /** * @return Promise */ public function readLine() : Promise { return call(function () { if (\false !== \strpos($this->buffer, $this->delimiter)) { list($line, $this->buffer) = \explode($this->delimiter, $this->buffer, 2); return $this->lineMode ? \rtrim($line, "\r") : $line; } while (null !== ($chunk = (yield $this->source->read()))) { $this->buffer .= $chunk; if (\false !== \strpos($this->buffer, $this->delimiter)) { list($line, $this->buffer) = \explode($this->delimiter, $this->buffer, 2); return $this->lineMode ? \rtrim($line, "\r") : $line; } } if ($this->buffer === "") { return null; } $line = $this->buffer; $this->buffer = ""; return $this->lineMode ? \rtrim($line, "\r") : $line; }); } public function getBuffer() : string { return $this->buffer; } /** * @return void */ public function clearBuffer() { $this->buffer = ""; } } read())) !== null) { $written += \strlen($chunk); $writePromise = $destination->write($chunk); $chunk = null; // free memory (yield $writePromise); } return $written; }); } /** * @param \Amp\ByteStream\InputStream $source * * @return \Amp\Promise */ function buffer(InputStream $source) : Promise { return call(function () use($source) : \Generator { $buffer = ""; while (($chunk = (yield $source->read())) !== null) { $buffer .= $chunk; $chunk = null; // free memory } return $buffer; }); } /** * The php://input input buffer stream for the process associated with the currently active event loop. * * @return ResourceInputStream */ function getInputBufferStream() : ResourceInputStream { static $key = InputStream::class . '\\input'; $stream = Loop::getState($key); if (!$stream) { $stream = new ResourceInputStream(\fopen('php://input', 'rb')); Loop::setState($key, $stream); } return $stream; } /** * The php://output output buffer stream for the process associated with the currently active event loop. * * @return ResourceOutputStream */ function getOutputBufferStream() : ResourceOutputStream { static $key = OutputStream::class . '\\output'; $stream = Loop::getState($key); if (!$stream) { $stream = new ResourceOutputStream(\fopen('php://output', 'wb')); Loop::setState($key, $stream); } return $stream; } /** * The STDIN stream for the process associated with the currently active event loop. * * @return ResourceInputStream */ function getStdin() : ResourceInputStream { static $key = InputStream::class . '\\stdin'; $stream = Loop::getState($key); if (!$stream) { $stream = new ResourceInputStream(\STDIN); Loop::setState($key, $stream); } return $stream; } /** * The STDOUT stream for the process associated with the currently active event loop. * * @return ResourceOutputStream */ function getStdout() : ResourceOutputStream { static $key = OutputStream::class . '\\stdout'; $stream = Loop::getState($key); if (!$stream) { $stream = new ResourceOutputStream(\STDOUT); Loop::setState($key, $stream); } return $stream; } /** * The STDERR stream for the process associated with the currently active event loop. * * @return ResourceOutputStream */ function getStderr() : ResourceOutputStream { static $key = OutputStream::class . '\\stderr'; $stream = Loop::getState($key); if (!$stream) { $stream = new ResourceOutputStream(\STDERR); Loop::setState($key, $stream); } return $stream; } function parseLineDelimitedJson(InputStream $stream, bool $assoc = \false, int $depth = 512, int $options = 0) : Iterator { return new Producer(static function (callable $emit) use($stream, $assoc, $depth, $options) { $reader = new LineReader($stream); while (null !== ($line = (yield $reader->readLine()))) { $line = \trim($line); if ($line === '') { continue; } /** @noinspection PhpComposerExtensionStubsInspection */ $data = \json_decode($line, $assoc, $depth, $options); /** @noinspection PhpComposerExtensionStubsInspection */ $error = \json_last_error(); /** @noinspection PhpComposerExtensionStubsInspection */ if ($error !== \JSON_ERROR_NONE) { /** @noinspection PhpComposerExtensionStubsInspection */ throw new StreamException('Failed to parse JSON: ' . \json_last_error_msg(), $error); } (yield $emit($data)); } }); } streams = $streams; } /** @inheritDoc */ public function read() : Promise { if ($this->reading) { throw new PendingReadError(); } if (!$this->streams) { return new Success(null); } return call(function () { $this->reading = \true; try { while ($this->streams) { $chunk = (yield $this->streams[0]->read()); if ($chunk === null) { \array_shift($this->streams); continue; } return $chunk; } return null; } finally { $this->reading = \false; } }); } } */ private $writes; /** @var bool */ private $writable = \true; /** @var int|null */ private $chunkSize; /** * @param resource $stream Stream resource. * @param int|null $chunkSize Chunk size per `fwrite()` operation. */ public function __construct($stream, int $chunkSize = null) { if (!\is_resource($stream) || \get_resource_type($stream) !== 'stream') { throw new \Error("Expected a valid stream"); } $meta = \stream_get_meta_data($stream); if (\strpos($meta["mode"], "r") !== \false && \strpos($meta["mode"], "+") === \false) { throw new \Error("Expected a writable stream"); } \stream_set_blocking($stream, \false); \stream_set_write_buffer($stream, 0); $this->resource = $stream; $this->chunkSize =& $chunkSize; $writes = $this->writes = new \SplQueue(); $writable =& $this->writable; $resource =& $this->resource; $this->watcher = Loop::onWritable($stream, static function ($watcher, $stream) use($writes, &$chunkSize, &$writable, &$resource) { static $emptyWrites = 0; try { while (!$writes->isEmpty()) { /** @var Deferred $deferred */ list($data, $previous, $deferred) = $writes->shift(); $length = \strlen($data); if ($length === 0) { $deferred->resolve(0); continue; } if (!\is_resource($stream) || ($metaData = @\stream_get_meta_data($stream)) && $metaData['eof']) { throw new ClosedException("The stream was closed by the peer"); } // Error reporting suppressed since fwrite() emits E_WARNING if the pipe is broken or the buffer is full. // Use conditional, because PHP doesn't like getting null passed if ($chunkSize) { $written = @\fwrite($stream, $data, $chunkSize); } else { $written = @\fwrite($stream, $data); } \assert( $written !== \false || \PHP_VERSION_ID >= 70400, // PHP 7.4+ returns false on EPIPE. "Trying to write on a previously fclose()'d resource. Do NOT manually fclose() resources the still referenced in the loop." ); // PHP 7.4.0 and 7.4.1 may return false on EAGAIN. if ($written === \false && \PHP_VERSION_ID >= 70402) { $message = "Failed to write to stream"; if ($error = \error_get_last()) { $message .= \sprintf("; %s", $error["message"]); } throw new StreamException($message); } // Broken pipes between processes on macOS/FreeBSD do not detect EOF properly. if ($written === 0 || $written === \false) { if ($emptyWrites++ > self::MAX_CONSECUTIVE_EMPTY_WRITES) { $message = "Failed to write to stream after multiple attempts"; if ($error = \error_get_last()) { $message .= \sprintf("; %s", $error["message"]); } throw new StreamException($message); } $writes->unshift([$data, $previous, $deferred]); return; } $emptyWrites = 0; if ($length > $written) { $data = \substr($data, $written); $writes->unshift([$data, $written + $previous, $deferred]); return; } $deferred->resolve($written + $previous); } } catch (\Throwable $exception) { $resource = null; $writable = \false; /** @psalm-suppress PossiblyUndefinedVariable */ $deferred->fail($exception); while (!$writes->isEmpty()) { list(, , $deferred) = $writes->shift(); $deferred->fail($exception); } Loop::cancel($watcher); } finally { if ($writes->isEmpty()) { Loop::disable($watcher); } } }); Loop::disable($this->watcher); } /** * Writes data to the stream. * * @param string $data Bytes to write. * * @return Promise Succeeds once the data has been successfully written to the stream. * * @throws ClosedException If the stream has already been closed. */ public function write(string $data) : Promise { return $this->send($data, \false); } /** * Closes the stream after all pending writes have been completed. Optionally writes a final data chunk before. * * @param string $finalData Bytes to write. * * @return Promise Succeeds once the data has been successfully written to the stream. * * @throws ClosedException If the stream has already been closed. */ public function end(string $finalData = "") : Promise { return $this->send($finalData, \true); } private function send(string $data, bool $end = \false) : Promise { if (!$this->writable) { return new Failure(new ClosedException("The stream is not writable")); } $length = \strlen($data); $written = 0; if ($end) { $this->writable = \false; } if ($this->writes->isEmpty()) { if ($length === 0) { if ($end) { $this->close(); } return new Success(0); } if (!\is_resource($this->resource) || ($metaData = @\stream_get_meta_data($this->resource)) && $metaData['eof']) { return new Failure(new ClosedException("The stream was closed by the peer")); } // Error reporting suppressed since fwrite() emits E_WARNING if the pipe is broken or the buffer is full. // Use conditional, because PHP doesn't like getting null passed. if ($this->chunkSize) { $written = @\fwrite($this->resource, $data, $this->chunkSize); } else { $written = @\fwrite($this->resource, $data); } \assert( $written !== \false || \PHP_VERSION_ID >= 70400, // PHP 7.4+ returns false on EPIPE. "Trying to write on a previously fclose()'d resource. Do NOT manually fclose() resources the still referenced in the loop." ); // PHP 7.4.0 and 7.4.1 may return false on EAGAIN. if ($written === \false && \PHP_VERSION_ID >= 70402) { $message = "Failed to write to stream"; if ($error = \error_get_last()) { $message .= \sprintf("; %s", $error["message"]); } return new Failure(new StreamException($message)); } $written = (int) $written; // Cast potential false to 0. if ($length === $written) { if ($end) { $this->close(); } return new Success($written); } $data = \substr($data, $written); } $deferred = new Deferred(); if ($length - $written > self::LARGE_CHUNK_SIZE) { $chunks = \str_split($data, self::LARGE_CHUNK_SIZE); $data = \array_pop($chunks); foreach ($chunks as $chunk) { $this->writes->push([$chunk, $written, new Deferred()]); $written += self::LARGE_CHUNK_SIZE; } } $this->writes->push([$data, $written, $deferred]); Loop::enable($this->watcher); $promise = $deferred->promise(); if ($end) { $promise->onResolve([$this, "close"]); } return $promise; } /** * Closes the stream forcefully. Multiple `close()` calls are ignored. * * @return void */ public function close() { if (\is_resource($this->resource)) { // Error suppression, as resource might already be closed $meta = @\stream_get_meta_data($this->resource); if ($meta && \strpos($meta["mode"], "+") !== \false) { @\stream_socket_shutdown($this->resource, \STREAM_SHUT_WR); } else { /** @psalm-suppress InvalidPropertyAssignmentValue psalm reports this as closed-resource */ @\fclose($this->resource); } } $this->free(); } /** * Nulls reference to resource, marks stream unwritable, and fails any pending write. * * @return void */ private function free() { $this->resource = null; $this->writable = \false; if (!$this->writes->isEmpty()) { $exception = new ClosedException("The socket was closed before writing completed"); do { /** @var Deferred $deferred */ list(, , $deferred) = $this->writes->shift(); $deferred->fail($exception); } while (!$this->writes->isEmpty()); } Loop::cancel($this->watcher); } /** * @return resource|null Stream resource or null if end() has been called or the stream closed. */ public function getResource() { return $this->resource; } /** * @return void */ public function setChunkSize(int $chunkSize) { $this->chunkSize = $chunkSize; } public function __destruct() { if ($this->resource !== null) { $this->free(); } } } contents = $contents; } /** * Reads data from the stream. * * @return Promise Resolves with the full contents or `null` if the stream has closed / already been consumed. */ public function read() : Promise { if ($this->contents === null) { return new Success(); } $promise = new Success($this->contents); $this->contents = null; return $promise; } } */ private $iterator; /** @var \Throwable|null */ private $exception; /** @var bool */ private $pending = \false; /** * @psam-param Iterator $iterator */ public function __construct(Iterator $iterator) { $this->iterator = $iterator; } /** @inheritdoc */ public function read() : Promise { if ($this->exception) { return new Failure($this->exception); } if ($this->pending) { throw new PendingReadError(); } $this->pending = \true; /** @var Deferred $deferred */ $deferred = new Deferred(); $this->iterator->advance()->onResolve(function ($error, $hasNextElement) use($deferred) { $this->pending = \false; if ($error) { $this->exception = $error; $deferred->fail($error); } elseif ($hasNextElement) { $chunk = $this->iterator->getCurrent(); if (!\is_string($chunk)) { $this->exception = new StreamException(\sprintf("Unexpected iterator value of type '%s', expected string", \is_object($chunk) ? \get_class($chunk) : \gettype($chunk))); $deferred->fail($this->exception); return; } $deferred->resolve($chunk); } else { $deferred->resolve(); } }); return $deferred->promise(); } } read()) !== null) { * // Immediately use $chunk, reducing memory consumption since the entire message is never buffered. * } * * @deprecated Use Amp\ByteStream\Payload instead. */ class Message implements InputStream, Promise { /** @var InputStream */ private $source; /** @var string */ private $buffer = ""; /** @var Deferred|null */ private $pendingRead; /** @var Coroutine|null */ private $coroutine; /** @var bool True if onResolve() has been called. */ private $buffering = \false; /** @var Deferred|null */ private $backpressure; /** @var bool True if the iterator has completed. */ private $complete = \false; /** @var \Throwable|null Used to fail future reads on failure. */ private $error; /** * @param InputStream $source An iterator that only emits strings. */ public function __construct(InputStream $source) { $this->source = $source; } private function consume() : \Generator { while (($chunk = (yield $this->source->read())) !== null) { $buffer = $this->buffer .= $chunk; if ($buffer === "") { continue; // Do not succeed reads with empty string. } elseif ($this->pendingRead) { $deferred = $this->pendingRead; $this->pendingRead = null; $this->buffer = ""; $deferred->resolve($buffer); $buffer = ""; // Destroy last emitted chunk to free memory. } elseif (!$this->buffering) { $buffer = ""; // Destroy last emitted chunk to free memory. $this->backpressure = new Deferred(); (yield $this->backpressure->promise()); } } $this->complete = \true; if ($this->pendingRead) { $deferred = $this->pendingRead; $this->pendingRead = null; $deferred->resolve($this->buffer !== "" ? $this->buffer : null); $this->buffer = ""; } return $this->buffer; } /** @inheritdoc */ public final function read() : Promise { if ($this->pendingRead) { throw new PendingReadError(); } if ($this->coroutine === null) { $this->coroutine = new Coroutine($this->consume()); $this->coroutine->onResolve(function ($error) { if ($error) { $this->error = $error; } if ($this->pendingRead) { $deferred = $this->pendingRead; $this->pendingRead = null; $deferred->fail($error); } }); } if ($this->error) { return new Failure($this->error); } if ($this->buffer !== "") { $buffer = $this->buffer; $this->buffer = ""; if ($this->backpressure) { $backpressure = $this->backpressure; $this->backpressure = null; $backpressure->resolve(); } return new Success($buffer); } if ($this->complete) { return new Success(); } $this->pendingRead = new Deferred(); return $this->pendingRead->promise(); } /** @inheritdoc */ public final function onResolve(callable $onResolved) { $this->buffering = \true; if ($this->coroutine === null) { $this->coroutine = new Coroutine($this->consume()); } if ($this->backpressure) { $backpressure = $this->backpressure; $this->backpressure = null; $backpressure->resolve(); } $this->coroutine->onResolve($onResolved); } /** * Exposes the source input stream. * * This might be required to resolve a promise with an InputStream, because promises in Amp can't be resolved with * other promises. * * @return InputStream */ public final function getInputStream() : InputStream { return $this->source; } } source = $source; $this->encoding = $encoding; $this->options = $options; $this->resource = @\inflate_init($encoding, $options); if ($this->resource === \false) { throw new StreamException("Failed initializing deflate context"); } } /** @inheritdoc */ public function read() : Promise { return call(function () { if ($this->resource === null) { return null; } \assert($this->source !== null); $data = (yield $this->source->read()); // Needs a double guard, as stream might have been closed while reading /** @psalm-suppress ParadoxicalCondition */ if ($this->resource === null) { return null; } if ($data === null) { $decompressed = @\inflate_add($this->resource, "", \ZLIB_FINISH); if ($decompressed === \false) { throw new StreamException("Failed adding data to deflate context"); } $this->close(); return $decompressed; } $decompressed = @\inflate_add($this->resource, $data, \ZLIB_SYNC_FLUSH); if ($decompressed === \false) { throw new StreamException("Failed adding data to deflate context"); } return $decompressed; }); } /** * @internal * @return void */ private function close() { $this->resource = null; $this->source = null; } /** * Gets the used compression encoding. * * @return int Encoding specified on construction time. */ public function getEncoding() : int { return $this->encoding; } /** * Gets the used compression options. * * @return array Options array passed on construction time. */ public function getOptions() : array { return $this->options; } } deferred = new Deferred(); } public function write(string $data) : Promise { if ($this->closed) { throw new ClosedException("The stream has already been closed."); } $this->contents .= $data; return new Success(\strlen($data)); } public function end(string $finalData = "") : Promise { if ($this->closed) { throw new ClosedException("The stream has already been closed."); } $this->contents .= $finalData; $this->closed = \true; $this->deferred->resolve($this->contents); $this->contents = ""; return new Success(\strlen($finalData)); } public function onResolve(callable $onResolved) { $this->deferred->promise()->onResolve($onResolved); } } The MIT License (MIT) Copyright (c) 2016-2021 amphp 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. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Polyfill\Mbstring; /** * Partial mbstring implementation in PHP, iconv based, UTF-8 centric. * * Implemented: * - mb_chr - Returns a specific character from its Unicode code point * - mb_convert_encoding - Convert character encoding * - mb_convert_variables - Convert character code in variable(s) * - mb_decode_mimeheader - Decode string in MIME header field * - mb_encode_mimeheader - Encode string for MIME header XXX NATIVE IMPLEMENTATION IS REALLY BUGGED * - mb_decode_numericentity - Decode HTML numeric string reference to character * - mb_encode_numericentity - Encode character to HTML numeric string reference * - mb_convert_case - Perform case folding on a string * - mb_detect_encoding - Detect character encoding * - mb_get_info - Get internal settings of mbstring * - mb_http_input - Detect HTTP input character encoding * - mb_http_output - Set/Get HTTP output character encoding * - mb_internal_encoding - Set/Get internal character encoding * - mb_list_encodings - Returns an array of all supported encodings * - mb_ord - Returns the Unicode code point of a character * - mb_output_handler - Callback function converts character encoding in output buffer * - mb_scrub - Replaces ill-formed byte sequences with substitute characters * - mb_strlen - Get string length * - mb_strpos - Find position of first occurrence of string in a string * - mb_strrpos - Find position of last occurrence of a string in a string * - mb_str_split - Convert a string to an array * - mb_strtolower - Make a string lowercase * - mb_strtoupper - Make a string uppercase * - mb_substitute_character - Set/Get substitution character * - mb_substr - Get part of string * - mb_stripos - Finds position of first occurrence of a string within another, case insensitive * - mb_stristr - Finds first occurrence of a string within another, case insensitive * - mb_strrchr - Finds the last occurrence of a character in a string within another * - mb_strrichr - Finds the last occurrence of a character in a string within another, case insensitive * - mb_strripos - Finds position of last occurrence of a string within another, case insensitive * - mb_strstr - Finds first occurrence of a string within another * - mb_strwidth - Return width of string * - mb_substr_count - Count the number of substring occurrences * * Not implemented: * - mb_convert_kana - Convert "kana" one from another ("zen-kaku", "han-kaku" and more) * - mb_ereg_* - Regular expression with multibyte support * - mb_parse_str - Parse GET/POST/COOKIE data and set global variable * - mb_preferred_mime_name - Get MIME charset string * - mb_regex_encoding - Returns current encoding for multibyte regex as string * - mb_regex_set_options - Set/Get the default options for mbregex functions * - mb_send_mail - Send encoded mail * - mb_split - Split multibyte string using regular expression * - mb_strcut - Get part of string * - mb_strimwidth - Get truncated string with specified width * * @author Nicolas Grekas * * @internal */ final class Mbstring { public const MB_CASE_FOLD = \PHP_INT_MAX; private const CASE_FOLD = [['µ', 'ſ', "ͅ", 'ς', "ϐ", "ϑ", "ϕ", "ϖ", "ϰ", "ϱ", "ϵ", "ẛ", "ι"], ['μ', 's', 'ι', 'σ', 'β', 'θ', 'φ', 'π', 'κ', 'ρ', 'ε', "ṡ", 'ι']]; private static $encodingList = ['ASCII', 'UTF-8']; private static $language = 'neutral'; private static $internalEncoding = 'UTF-8'; public static function mb_convert_encoding($s, $toEncoding, $fromEncoding = null) { if (\is_array($fromEncoding) || null !== $fromEncoding && \false !== \strpos($fromEncoding, ',')) { $fromEncoding = self::mb_detect_encoding($s, $fromEncoding); } else { $fromEncoding = self::getEncoding($fromEncoding); } $toEncoding = self::getEncoding($toEncoding); if ('BASE64' === $fromEncoding) { $s = \base64_decode($s); $fromEncoding = $toEncoding; } if ('BASE64' === $toEncoding) { return \base64_encode($s); } if ('HTML-ENTITIES' === $toEncoding || 'HTML' === $toEncoding) { if ('HTML-ENTITIES' === $fromEncoding || 'HTML' === $fromEncoding) { $fromEncoding = 'Windows-1252'; } if ('UTF-8' !== $fromEncoding) { $s = \iconv($fromEncoding, 'UTF-8//IGNORE', $s); } return \preg_replace_callback('/[\\x80-\\xFF]+/', [__CLASS__, 'html_encoding_callback'], $s); } if ('HTML-ENTITIES' === $fromEncoding) { $s = \html_entity_decode($s, \ENT_COMPAT, 'UTF-8'); $fromEncoding = 'UTF-8'; } return \iconv($fromEncoding, $toEncoding . '//IGNORE', $s); } public static function mb_convert_variables($toEncoding, $fromEncoding, &...$vars) { $ok = \true; \array_walk_recursive($vars, function (&$v) use(&$ok, $toEncoding, $fromEncoding) { if (\false === ($v = self::mb_convert_encoding($v, $toEncoding, $fromEncoding))) { $ok = \false; } }); return $ok ? $fromEncoding : \false; } public static function mb_decode_mimeheader($s) { return \iconv_mime_decode($s, 2, self::$internalEncoding); } public static function mb_encode_mimeheader($s, $charset = null, $transferEncoding = null, $linefeed = null, $indent = null) { \trigger_error('mb_encode_mimeheader() is bugged. Please use iconv_mime_encode() instead', \E_USER_WARNING); } public static function mb_decode_numericentity($s, $convmap, $encoding = null) { if (null !== $s && !\is_scalar($s) && !(\is_object($s) && \method_exists($s, '__toString'))) { \trigger_error('mb_decode_numericentity() expects parameter 1 to be string, ' . \gettype($s) . ' given', \E_USER_WARNING); return null; } if (!\is_array($convmap) || 80000 > \PHP_VERSION_ID && !$convmap) { return \false; } if (null !== $encoding && !\is_scalar($encoding)) { \trigger_error('mb_decode_numericentity() expects parameter 3 to be string, ' . \gettype($s) . ' given', \E_USER_WARNING); return ''; // Instead of null (cf. mb_encode_numericentity). } $s = (string) $s; if ('' === $s) { return ''; } $encoding = self::getEncoding($encoding); if ('UTF-8' === $encoding) { $encoding = null; if (!\preg_match('//u', $s)) { $s = @\iconv('UTF-8', 'UTF-8//IGNORE', $s); } } else { $s = \iconv($encoding, 'UTF-8//IGNORE', $s); } $cnt = \floor(\count($convmap) / 4) * 4; for ($i = 0; $i < $cnt; $i += 4) { // collector_decode_htmlnumericentity ignores $convmap[$i + 3] $convmap[$i] += $convmap[$i + 2]; $convmap[$i + 1] += $convmap[$i + 2]; } $s = \preg_replace_callback('/&#(?:0*([0-9]+)|x0*([0-9a-fA-F]+))(?!&);?/', function (array $m) use($cnt, $convmap) { $c = isset($m[2]) ? (int) \hexdec($m[2]) : $m[1]; for ($i = 0; $i < $cnt; $i += 4) { if ($c >= $convmap[$i] && $c <= $convmap[$i + 1]) { return self::mb_chr($c - $convmap[$i + 2]); } } return $m[0]; }, $s); if (null === $encoding) { return $s; } return \iconv('UTF-8', $encoding . '//IGNORE', $s); } public static function mb_encode_numericentity($s, $convmap, $encoding = null, $is_hex = \false) { if (null !== $s && !\is_scalar($s) && !(\is_object($s) && \method_exists($s, '__toString'))) { \trigger_error('mb_encode_numericentity() expects parameter 1 to be string, ' . \gettype($s) . ' given', \E_USER_WARNING); return null; } if (!\is_array($convmap) || 80000 > \PHP_VERSION_ID && !$convmap) { return \false; } if (null !== $encoding && !\is_scalar($encoding)) { \trigger_error('mb_encode_numericentity() expects parameter 3 to be string, ' . \gettype($s) . ' given', \E_USER_WARNING); return null; // Instead of '' (cf. mb_decode_numericentity). } if (null !== $is_hex && !\is_scalar($is_hex)) { \trigger_error('mb_encode_numericentity() expects parameter 4 to be boolean, ' . \gettype($s) . ' given', \E_USER_WARNING); return null; } $s = (string) $s; if ('' === $s) { return ''; } $encoding = self::getEncoding($encoding); if ('UTF-8' === $encoding) { $encoding = null; if (!\preg_match('//u', $s)) { $s = @\iconv('UTF-8', 'UTF-8//IGNORE', $s); } } else { $s = \iconv($encoding, 'UTF-8//IGNORE', $s); } static $ulenMask = ["\xc0" => 2, "\xd0" => 2, "\xe0" => 3, "\xf0" => 4]; $cnt = \floor(\count($convmap) / 4) * 4; $i = 0; $len = \strlen($s); $result = ''; while ($i < $len) { $ulen = $s[$i] < "\x80" ? 1 : $ulenMask[$s[$i] & "\xf0"]; $uchr = \substr($s, $i, $ulen); $i += $ulen; $c = self::mb_ord($uchr); for ($j = 0; $j < $cnt; $j += 4) { if ($c >= $convmap[$j] && $c <= $convmap[$j + 1]) { $cOffset = $c + $convmap[$j + 2] & $convmap[$j + 3]; $result .= $is_hex ? \sprintf('&#x%X;', $cOffset) : '&#' . $cOffset . ';'; continue 2; } } $result .= $uchr; } if (null === $encoding) { return $result; } return \iconv('UTF-8', $encoding . '//IGNORE', $result); } public static function mb_convert_case($s, $mode, $encoding = null) { $s = (string) $s; if ('' === $s) { return ''; } $encoding = self::getEncoding($encoding); if ('UTF-8' === $encoding) { $encoding = null; if (!\preg_match('//u', $s)) { $s = @\iconv('UTF-8', 'UTF-8//IGNORE', $s); } } else { $s = \iconv($encoding, 'UTF-8//IGNORE', $s); } if (\MB_CASE_TITLE == $mode) { static $titleRegexp = null; if (null === $titleRegexp) { $titleRegexp = self::getData('titleCaseRegexp'); } $s = \preg_replace_callback($titleRegexp, [__CLASS__, 'title_case'], $s); } else { if (\MB_CASE_UPPER == $mode) { static $upper = null; if (null === $upper) { $upper = self::getData('upperCase'); } $map = $upper; } else { if (self::MB_CASE_FOLD === $mode) { $s = \str_replace(self::CASE_FOLD[0], self::CASE_FOLD[1], $s); } static $lower = null; if (null === $lower) { $lower = self::getData('lowerCase'); } $map = $lower; } static $ulenMask = ["\xc0" => 2, "\xd0" => 2, "\xe0" => 3, "\xf0" => 4]; $i = 0; $len = \strlen($s); while ($i < $len) { $ulen = $s[$i] < "\x80" ? 1 : $ulenMask[$s[$i] & "\xf0"]; $uchr = \substr($s, $i, $ulen); $i += $ulen; if (isset($map[$uchr])) { $uchr = $map[$uchr]; $nlen = \strlen($uchr); if ($nlen == $ulen) { $nlen = $i; do { $s[--$nlen] = $uchr[--$ulen]; } while ($ulen); } else { $s = \substr_replace($s, $uchr, $i - $ulen, $ulen); $len += $nlen - $ulen; $i += $nlen - $ulen; } } } } if (null === $encoding) { return $s; } return \iconv('UTF-8', $encoding . '//IGNORE', $s); } public static function mb_internal_encoding($encoding = null) { if (null === $encoding) { return self::$internalEncoding; } $normalizedEncoding = self::getEncoding($encoding); if ('UTF-8' === $normalizedEncoding || \false !== @\iconv($normalizedEncoding, $normalizedEncoding, ' ')) { self::$internalEncoding = $normalizedEncoding; return \true; } if (80000 > \PHP_VERSION_ID) { return \false; } throw new \ValueError(\sprintf('Argument #1 ($encoding) must be a valid encoding, "%s" given', $encoding)); } public static function mb_language($lang = null) { if (null === $lang) { return self::$language; } switch ($normalizedLang = \strtolower($lang)) { case 'uni': case 'neutral': self::$language = $normalizedLang; return \true; } if (80000 > \PHP_VERSION_ID) { return \false; } throw new \ValueError(\sprintf('Argument #1 ($language) must be a valid language, "%s" given', $lang)); } public static function mb_list_encodings() { return ['UTF-8']; } public static function mb_encoding_aliases($encoding) { switch (\strtoupper($encoding)) { case 'UTF8': case 'UTF-8': return ['utf8']; } return \false; } public static function mb_check_encoding($var = null, $encoding = null) { if (null === $encoding) { if (null === $var) { return \false; } $encoding = self::$internalEncoding; } return self::mb_detect_encoding($var, [$encoding]) || \false !== @\iconv($encoding, $encoding, $var); } public static function mb_detect_encoding($str, $encodingList = null, $strict = \false) { if (null === $encodingList) { $encodingList = self::$encodingList; } else { if (!\is_array($encodingList)) { $encodingList = \array_map('trim', \explode(',', $encodingList)); } $encodingList = \array_map('strtoupper', $encodingList); } foreach ($encodingList as $enc) { switch ($enc) { case 'ASCII': if (!\preg_match('/[\\x80-\\xFF]/', $str)) { return $enc; } break; case 'UTF8': case 'UTF-8': if (\preg_match('//u', $str)) { return 'UTF-8'; } break; default: if (0 === \strncmp($enc, 'ISO-8859-', 9)) { return $enc; } } } return \false; } public static function mb_detect_order($encodingList = null) { if (null === $encodingList) { return self::$encodingList; } if (!\is_array($encodingList)) { $encodingList = \array_map('trim', \explode(',', $encodingList)); } $encodingList = \array_map('strtoupper', $encodingList); foreach ($encodingList as $enc) { switch ($enc) { default: if (\strncmp($enc, 'ISO-8859-', 9)) { return \false; } // no break case 'ASCII': case 'UTF8': case 'UTF-8': } } self::$encodingList = $encodingList; return \true; } public static function mb_strlen($s, $encoding = null) { $encoding = self::getEncoding($encoding); if ('CP850' === $encoding || 'ASCII' === $encoding) { return \strlen($s); } return @\iconv_strlen($s, $encoding); } public static function mb_strpos($haystack, $needle, $offset = 0, $encoding = null) { $encoding = self::getEncoding($encoding); if ('CP850' === $encoding || 'ASCII' === $encoding) { return \strpos($haystack, $needle, $offset); } $needle = (string) $needle; if ('' === $needle) { if (80000 > \PHP_VERSION_ID) { \trigger_error(__METHOD__ . ': Empty delimiter', \E_USER_WARNING); return \false; } return 0; } return \iconv_strpos($haystack, $needle, $offset, $encoding); } public static function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null) { $encoding = self::getEncoding($encoding); if ('CP850' === $encoding || 'ASCII' === $encoding) { return \strrpos($haystack, $needle, $offset); } if ($offset != (int) $offset) { $offset = 0; } elseif ($offset = (int) $offset) { if ($offset < 0) { if (0 > ($offset += self::mb_strlen($needle))) { $haystack = self::mb_substr($haystack, 0, $offset, $encoding); } $offset = 0; } else { $haystack = self::mb_substr($haystack, $offset, 2147483647, $encoding); } } $pos = '' !== $needle || 80000 > \PHP_VERSION_ID ? \iconv_strrpos($haystack, $needle, $encoding) : self::mb_strlen($haystack, $encoding); return \false !== $pos ? $offset + $pos : \false; } public static function mb_str_split($string, $split_length = 1, $encoding = null) { if (null !== $string && !\is_scalar($string) && !(\is_object($string) && \method_exists($string, '__toString'))) { \trigger_error('mb_str_split() expects parameter 1 to be string, ' . \gettype($string) . ' given', \E_USER_WARNING); return null; } if (1 > ($split_length = (int) $split_length)) { if (80000 > \PHP_VERSION_ID) { \trigger_error('The length of each segment must be greater than zero', \E_USER_WARNING); return \false; } throw new \ValueError('Argument #2 ($length) must be greater than 0'); } if (null === $encoding) { $encoding = \mb_internal_encoding(); } if ('UTF-8' === ($encoding = self::getEncoding($encoding))) { $rx = '/('; while (65535 < $split_length) { $rx .= '.{65535}'; $split_length -= 65535; } $rx .= '.{' . $split_length . '})/us'; return \preg_split($rx, $string, -1, \PREG_SPLIT_DELIM_CAPTURE | \PREG_SPLIT_NO_EMPTY); } $result = []; $length = \mb_strlen($string, $encoding); for ($i = 0; $i < $length; $i += $split_length) { $result[] = \mb_substr($string, $i, $split_length, $encoding); } return $result; } public static function mb_strtolower($s, $encoding = null) { return self::mb_convert_case($s, \MB_CASE_LOWER, $encoding); } public static function mb_strtoupper($s, $encoding = null) { return self::mb_convert_case($s, \MB_CASE_UPPER, $encoding); } public static function mb_substitute_character($c = null) { if (null === $c) { return 'none'; } if (0 === \strcasecmp($c, 'none')) { return \true; } if (80000 > \PHP_VERSION_ID) { return \false; } if (\is_int($c) || 'long' === $c || 'entity' === $c) { return \false; } throw new \ValueError('Argument #1 ($substitute_character) must be "none", "long", "entity" or a valid codepoint'); } public static function mb_substr($s, $start, $length = null, $encoding = null) { $encoding = self::getEncoding($encoding); if ('CP850' === $encoding || 'ASCII' === $encoding) { return (string) \substr($s, $start, null === $length ? 2147483647 : $length); } if ($start < 0) { $start = \iconv_strlen($s, $encoding) + $start; if ($start < 0) { $start = 0; } } if (null === $length) { $length = 2147483647; } elseif ($length < 0) { $length = \iconv_strlen($s, $encoding) + $length - $start; if ($length < 0) { return ''; } } return (string) \iconv_substr($s, $start, $length, $encoding); } public static function mb_stripos($haystack, $needle, $offset = 0, $encoding = null) { $haystack = self::mb_convert_case($haystack, self::MB_CASE_FOLD, $encoding); $needle = self::mb_convert_case($needle, self::MB_CASE_FOLD, $encoding); return self::mb_strpos($haystack, $needle, $offset, $encoding); } public static function mb_stristr($haystack, $needle, $part = \false, $encoding = null) { $pos = self::mb_stripos($haystack, $needle, 0, $encoding); return self::getSubpart($pos, $part, $haystack, $encoding); } public static function mb_strrchr($haystack, $needle, $part = \false, $encoding = null) { $encoding = self::getEncoding($encoding); if ('CP850' === $encoding || 'ASCII' === $encoding) { $pos = \strrpos($haystack, $needle); } else { $needle = self::mb_substr($needle, 0, 1, $encoding); $pos = \iconv_strrpos($haystack, $needle, $encoding); } return self::getSubpart($pos, $part, $haystack, $encoding); } public static function mb_strrichr($haystack, $needle, $part = \false, $encoding = null) { $needle = self::mb_substr($needle, 0, 1, $encoding); $pos = self::mb_strripos($haystack, $needle, $encoding); return self::getSubpart($pos, $part, $haystack, $encoding); } public static function mb_strripos($haystack, $needle, $offset = 0, $encoding = null) { $haystack = self::mb_convert_case($haystack, self::MB_CASE_FOLD, $encoding); $needle = self::mb_convert_case($needle, self::MB_CASE_FOLD, $encoding); return self::mb_strrpos($haystack, $needle, $offset, $encoding); } public static function mb_strstr($haystack, $needle, $part = \false, $encoding = null) { $pos = \strpos($haystack, $needle); if (\false === $pos) { return \false; } if ($part) { return \substr($haystack, 0, $pos); } return \substr($haystack, $pos); } public static function mb_get_info($type = 'all') { $info = ['internal_encoding' => self::$internalEncoding, 'http_output' => 'pass', 'http_output_conv_mimetypes' => '^(text/|application/xhtml\\+xml)', 'func_overload' => 0, 'func_overload_list' => 'no overload', 'mail_charset' => 'UTF-8', 'mail_header_encoding' => 'BASE64', 'mail_body_encoding' => 'BASE64', 'illegal_chars' => 0, 'encoding_translation' => 'Off', 'language' => self::$language, 'detect_order' => self::$encodingList, 'substitute_character' => 'none', 'strict_detection' => 'Off']; if ('all' === $type) { return $info; } if (isset($info[$type])) { return $info[$type]; } return \false; } public static function mb_http_input($type = '') { return \false; } public static function mb_http_output($encoding = null) { return null !== $encoding ? 'pass' === $encoding : 'pass'; } public static function mb_strwidth($s, $encoding = null) { $encoding = self::getEncoding($encoding); if ('UTF-8' !== $encoding) { $s = \iconv($encoding, 'UTF-8//IGNORE', $s); } $s = \preg_replace('/[\\x{1100}-\\x{115F}\\x{2329}\\x{232A}\\x{2E80}-\\x{303E}\\x{3040}-\\x{A4CF}\\x{AC00}-\\x{D7A3}\\x{F900}-\\x{FAFF}\\x{FE10}-\\x{FE19}\\x{FE30}-\\x{FE6F}\\x{FF00}-\\x{FF60}\\x{FFE0}-\\x{FFE6}\\x{20000}-\\x{2FFFD}\\x{30000}-\\x{3FFFD}]/u', '', $s, -1, $wide); return ($wide << 1) + \iconv_strlen($s, 'UTF-8'); } public static function mb_substr_count($haystack, $needle, $encoding = null) { return \substr_count($haystack, $needle); } public static function mb_output_handler($contents, $status) { return $contents; } public static function mb_chr($code, $encoding = null) { if (0x80 > ($code %= 0x200000)) { $s = \chr($code); } elseif (0x800 > $code) { $s = \chr(0xc0 | $code >> 6) . \chr(0x80 | $code & 0x3f); } elseif (0x10000 > $code) { $s = \chr(0xe0 | $code >> 12) . \chr(0x80 | $code >> 6 & 0x3f) . \chr(0x80 | $code & 0x3f); } else { $s = \chr(0xf0 | $code >> 18) . \chr(0x80 | $code >> 12 & 0x3f) . \chr(0x80 | $code >> 6 & 0x3f) . \chr(0x80 | $code & 0x3f); } if ('UTF-8' !== ($encoding = self::getEncoding($encoding))) { $s = \mb_convert_encoding($s, $encoding, 'UTF-8'); } return $s; } public static function mb_ord($s, $encoding = null) { if ('UTF-8' !== ($encoding = self::getEncoding($encoding))) { $s = \mb_convert_encoding($s, 'UTF-8', $encoding); } if (1 === \strlen($s)) { return \ord($s); } $code = ($s = \unpack('C*', \substr($s, 0, 4))) ? $s[1] : 0; if (0xf0 <= $code) { return ($code - 0xf0 << 18) + ($s[2] - 0x80 << 12) + ($s[3] - 0x80 << 6) + $s[4] - 0x80; } if (0xe0 <= $code) { return ($code - 0xe0 << 12) + ($s[2] - 0x80 << 6) + $s[3] - 0x80; } if (0xc0 <= $code) { return ($code - 0xc0 << 6) + $s[2] - 0x80; } return $code; } private static function getSubpart($pos, $part, $haystack, $encoding) { if (\false === $pos) { return \false; } if ($part) { return self::mb_substr($haystack, 0, $pos, $encoding); } return self::mb_substr($haystack, $pos, null, $encoding); } private static function html_encoding_callback(array $m) { $i = 1; $entities = ''; $m = \unpack('C*', \htmlentities($m[0], \ENT_COMPAT, 'UTF-8')); while (isset($m[$i])) { if (0x80 > $m[$i]) { $entities .= \chr($m[$i++]); continue; } if (0xf0 <= $m[$i]) { $c = ($m[$i++] - 0xf0 << 18) + ($m[$i++] - 0x80 << 12) + ($m[$i++] - 0x80 << 6) + $m[$i++] - 0x80; } elseif (0xe0 <= $m[$i]) { $c = ($m[$i++] - 0xe0 << 12) + ($m[$i++] - 0x80 << 6) + $m[$i++] - 0x80; } else { $c = ($m[$i++] - 0xc0 << 6) + $m[$i++] - 0x80; } $entities .= '&#' . $c . ';'; } return $entities; } private static function title_case(array $s) { return self::mb_convert_case($s[1], \MB_CASE_UPPER, 'UTF-8') . self::mb_convert_case($s[2], \MB_CASE_LOWER, 'UTF-8'); } private static function getData($file) { if (\file_exists($file = __DIR__ . '/Resources/unidata/' . $file . '.php')) { return require $file; } return \false; } private static function getEncoding($encoding) { if (null === $encoding) { return self::$internalEncoding; } if ('UTF-8' === $encoding) { return 'UTF-8'; } $encoding = \strtoupper($encoding); if ('8BIT' === $encoding || 'BINARY' === $encoding) { return 'CP850'; } if ('UTF8' === $encoding) { return 'UTF-8'; } return $encoding; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ use _HumbugBox1cb33d1f20f1\Symfony\Polyfill\Mbstring as p; if (\PHP_VERSION_ID >= 80000) { return require __DIR__ . '/bootstrap80.php'; } if (!\function_exists('mb_convert_encoding')) { function mb_convert_encoding($string, $to_encoding, $from_encoding = null) { return p\Mbstring::mb_convert_encoding($string, $to_encoding, $from_encoding); } } if (!\function_exists('mb_decode_mimeheader')) { function mb_decode_mimeheader($string) { return p\Mbstring::mb_decode_mimeheader($string); } } if (!\function_exists('mb_encode_mimeheader')) { function mb_encode_mimeheader($string, $charset = null, $transfer_encoding = null, $newline = "\r\n", $indent = 0) { return p\Mbstring::mb_encode_mimeheader($string, $charset, $transfer_encoding, $newline, $indent); } } if (!\function_exists('mb_decode_numericentity')) { function mb_decode_numericentity($string, $map, $encoding = null) { return p\Mbstring::mb_decode_numericentity($string, $map, $encoding); } } if (!\function_exists('mb_encode_numericentity')) { function mb_encode_numericentity($string, $map, $encoding = null, $hex = \false) { return p\Mbstring::mb_encode_numericentity($string, $map, $encoding, $hex); } } if (!\function_exists('mb_convert_case')) { function mb_convert_case($string, $mode, $encoding = null) { return p\Mbstring::mb_convert_case($string, $mode, $encoding); } } if (!\function_exists('mb_internal_encoding')) { function mb_internal_encoding($encoding = null) { return p\Mbstring::mb_internal_encoding($encoding); } } if (!\function_exists('mb_language')) { function mb_language($language = null) { return p\Mbstring::mb_language($language); } } if (!\function_exists('mb_list_encodings')) { function mb_list_encodings() { return p\Mbstring::mb_list_encodings(); } } if (!\function_exists('mb_encoding_aliases')) { function mb_encoding_aliases($encoding) { return p\Mbstring::mb_encoding_aliases($encoding); } } if (!\function_exists('mb_check_encoding')) { function mb_check_encoding($value = null, $encoding = null) { return p\Mbstring::mb_check_encoding($value, $encoding); } } if (!\function_exists('mb_detect_encoding')) { function mb_detect_encoding($string, $encodings = null, $strict = \false) { return p\Mbstring::mb_detect_encoding($string, $encodings, $strict); } } if (!\function_exists('mb_detect_order')) { function mb_detect_order($encoding = null) { return p\Mbstring::mb_detect_order($encoding); } } if (!\function_exists('mb_parse_str')) { function mb_parse_str($string, &$result = []) { \parse_str($string, $result); return (bool) $result; } } if (!\function_exists('mb_strlen')) { function mb_strlen($string, $encoding = null) { return p\Mbstring::mb_strlen($string, $encoding); } } if (!\function_exists('mb_strpos')) { function mb_strpos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_strpos($haystack, $needle, $offset, $encoding); } } if (!\function_exists('mb_strtolower')) { function mb_strtolower($string, $encoding = null) { return p\Mbstring::mb_strtolower($string, $encoding); } } if (!\function_exists('mb_strtoupper')) { function mb_strtoupper($string, $encoding = null) { return p\Mbstring::mb_strtoupper($string, $encoding); } } if (!\function_exists('mb_substitute_character')) { function mb_substitute_character($substitute_character = null) { return p\Mbstring::mb_substitute_character($substitute_character); } } if (!\function_exists('mb_substr')) { function mb_substr($string, $start, $length = 2147483647, $encoding = null) { return p\Mbstring::mb_substr($string, $start, $length, $encoding); } } if (!\function_exists('mb_stripos')) { function mb_stripos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_stripos($haystack, $needle, $offset, $encoding); } } if (!\function_exists('mb_stristr')) { function mb_stristr($haystack, $needle, $before_needle = \false, $encoding = null) { return p\Mbstring::mb_stristr($haystack, $needle, $before_needle, $encoding); } } if (!\function_exists('mb_strrchr')) { function mb_strrchr($haystack, $needle, $before_needle = \false, $encoding = null) { return p\Mbstring::mb_strrchr($haystack, $needle, $before_needle, $encoding); } } if (!\function_exists('mb_strrichr')) { function mb_strrichr($haystack, $needle, $before_needle = \false, $encoding = null) { return p\Mbstring::mb_strrichr($haystack, $needle, $before_needle, $encoding); } } if (!\function_exists('mb_strripos')) { function mb_strripos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_strripos($haystack, $needle, $offset, $encoding); } } if (!\function_exists('mb_strrpos')) { function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_strrpos($haystack, $needle, $offset, $encoding); } } if (!\function_exists('mb_strstr')) { function mb_strstr($haystack, $needle, $before_needle = \false, $encoding = null) { return p\Mbstring::mb_strstr($haystack, $needle, $before_needle, $encoding); } } if (!\function_exists('mb_get_info')) { function mb_get_info($type = 'all') { return p\Mbstring::mb_get_info($type); } } if (!\function_exists('mb_http_output')) { function mb_http_output($encoding = null) { return p\Mbstring::mb_http_output($encoding); } } if (!\function_exists('mb_strwidth')) { function mb_strwidth($string, $encoding = null) { return p\Mbstring::mb_strwidth($string, $encoding); } } if (!\function_exists('mb_substr_count')) { function mb_substr_count($haystack, $needle, $encoding = null) { return p\Mbstring::mb_substr_count($haystack, $needle, $encoding); } } if (!\function_exists('mb_output_handler')) { function mb_output_handler($string, $status) { return p\Mbstring::mb_output_handler($string, $status); } } if (!\function_exists('mb_http_input')) { function mb_http_input($type = null) { return p\Mbstring::mb_http_input($type); } } if (!\function_exists('mb_convert_variables')) { function mb_convert_variables($to_encoding, $from_encoding, &...$vars) { return p\Mbstring::mb_convert_variables($to_encoding, $from_encoding, ...$vars); } } if (!\function_exists('mb_ord')) { function mb_ord($string, $encoding = null) { return p\Mbstring::mb_ord($string, $encoding); } } if (!\function_exists('mb_chr')) { function mb_chr($codepoint, $encoding = null) { return p\Mbstring::mb_chr($codepoint, $encoding); } } if (!\function_exists('mb_scrub')) { function mb_scrub($string, $encoding = null) { $encoding = null === $encoding ? \mb_internal_encoding() : $encoding; return \mb_convert_encoding($string, $encoding, $encoding); } } if (!\function_exists('mb_str_split')) { function mb_str_split($string, $length = 1, $encoding = null) { return p\Mbstring::mb_str_split($string, $length, $encoding); } } if (\extension_loaded('mbstring')) { return; } if (!\defined('MB_CASE_UPPER')) { \define('MB_CASE_UPPER', 0); } if (!\defined('MB_CASE_LOWER')) { \define('MB_CASE_LOWER', 1); } if (!\defined('MB_CASE_TITLE')) { \define('MB_CASE_TITLE', 2); } Copyright (c) 2015-2019 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. 'a', 'B' => 'b', 'C' => 'c', 'D' => 'd', 'E' => 'e', 'F' => 'f', 'G' => 'g', 'H' => 'h', 'I' => 'i', 'J' => 'j', 'K' => 'k', 'L' => 'l', 'M' => 'm', 'N' => 'n', 'O' => 'o', 'P' => 'p', 'Q' => 'q', 'R' => 'r', 'S' => 's', 'T' => 't', 'U' => 'u', 'V' => 'v', 'W' => 'w', 'X' => 'x', 'Y' => 'y', 'Z' => 'z', 'À' => 'à', 'Á' => 'á', 'Â' => 'â', 'Ã' => 'ã', 'Ä' => 'ä', 'Å' => 'å', 'Æ' => 'æ', 'Ç' => 'ç', 'È' => 'è', 'É' => 'é', 'Ê' => 'ê', 'Ë' => 'ë', 'Ì' => 'ì', 'Í' => 'í', 'Î' => 'î', 'Ï' => 'ï', 'Ð' => 'ð', 'Ñ' => 'ñ', 'Ò' => 'ò', 'Ó' => 'ó', 'Ô' => 'ô', 'Õ' => 'õ', 'Ö' => 'ö', 'Ø' => 'ø', 'Ù' => 'ù', 'Ú' => 'ú', 'Û' => 'û', 'Ü' => 'ü', 'Ý' => 'ý', 'Þ' => 'þ', 'Ā' => 'ā', 'Ă' => 'ă', 'Ą' => 'ą', 'Ć' => 'ć', 'Ĉ' => 'ĉ', 'Ċ' => 'ċ', 'Č' => 'č', 'Ď' => 'ď', 'Đ' => 'đ', 'Ē' => 'ē', 'Ĕ' => 'ĕ', 'Ė' => 'ė', 'Ę' => 'ę', 'Ě' => 'ě', 'Ĝ' => 'ĝ', 'Ğ' => 'ğ', 'Ġ' => 'ġ', 'Ģ' => 'ģ', 'Ĥ' => 'ĥ', 'Ħ' => 'ħ', 'Ĩ' => 'ĩ', 'Ī' => 'ī', 'Ĭ' => 'ĭ', 'Į' => 'į', 'İ' => 'i̇', 'IJ' => 'ij', 'Ĵ' => 'ĵ', 'Ķ' => 'ķ', 'Ĺ' => 'ĺ', 'Ļ' => 'ļ', 'Ľ' => 'ľ', 'Ŀ' => 'ŀ', 'Ł' => 'ł', 'Ń' => 'ń', 'Ņ' => 'ņ', 'Ň' => 'ň', 'Ŋ' => 'ŋ', 'Ō' => 'ō', 'Ŏ' => 'ŏ', 'Ő' => 'ő', 'Œ' => 'œ', 'Ŕ' => 'ŕ', 'Ŗ' => 'ŗ', 'Ř' => 'ř', 'Ś' => 'ś', 'Ŝ' => 'ŝ', 'Ş' => 'ş', 'Š' => 'š', 'Ţ' => 'ţ', 'Ť' => 'ť', 'Ŧ' => 'ŧ', 'Ũ' => 'ũ', 'Ū' => 'ū', 'Ŭ' => 'ŭ', 'Ů' => 'ů', 'Ű' => 'ű', 'Ų' => 'ų', 'Ŵ' => 'ŵ', 'Ŷ' => 'ŷ', 'Ÿ' => 'ÿ', 'Ź' => 'ź', 'Ż' => 'ż', 'Ž' => 'ž', 'Ɓ' => 'ɓ', 'Ƃ' => 'ƃ', 'Ƅ' => 'ƅ', 'Ɔ' => 'ɔ', 'Ƈ' => 'ƈ', 'Ɖ' => 'ɖ', 'Ɗ' => 'ɗ', 'Ƌ' => 'ƌ', 'Ǝ' => 'ǝ', 'Ə' => 'ə', 'Ɛ' => 'ɛ', 'Ƒ' => 'ƒ', 'Ɠ' => 'ɠ', 'Ɣ' => 'ɣ', 'Ɩ' => 'ɩ', 'Ɨ' => 'ɨ', 'Ƙ' => 'ƙ', 'Ɯ' => 'ɯ', 'Ɲ' => 'ɲ', 'Ɵ' => 'ɵ', 'Ơ' => 'ơ', 'Ƣ' => 'ƣ', 'Ƥ' => 'ƥ', 'Ʀ' => 'ʀ', 'Ƨ' => 'ƨ', 'Ʃ' => 'ʃ', 'Ƭ' => 'ƭ', 'Ʈ' => 'ʈ', 'Ư' => 'ư', 'Ʊ' => 'ʊ', 'Ʋ' => 'ʋ', 'Ƴ' => 'ƴ', 'Ƶ' => 'ƶ', 'Ʒ' => 'ʒ', 'Ƹ' => 'ƹ', 'Ƽ' => 'ƽ', 'DŽ' => 'dž', 'Dž' => 'dž', 'LJ' => 'lj', 'Lj' => 'lj', 'NJ' => 'nj', 'Nj' => 'nj', 'Ǎ' => 'ǎ', 'Ǐ' => 'ǐ', 'Ǒ' => 'ǒ', 'Ǔ' => 'ǔ', 'Ǖ' => 'ǖ', 'Ǘ' => 'ǘ', 'Ǚ' => 'ǚ', 'Ǜ' => 'ǜ', 'Ǟ' => 'ǟ', 'Ǡ' => 'ǡ', 'Ǣ' => 'ǣ', 'Ǥ' => 'ǥ', 'Ǧ' => 'ǧ', 'Ǩ' => 'ǩ', 'Ǫ' => 'ǫ', 'Ǭ' => 'ǭ', 'Ǯ' => 'ǯ', 'DZ' => 'dz', 'Dz' => 'dz', 'Ǵ' => 'ǵ', 'Ƕ' => 'ƕ', 'Ƿ' => 'ƿ', 'Ǹ' => 'ǹ', 'Ǻ' => 'ǻ', 'Ǽ' => 'ǽ', 'Ǿ' => 'ǿ', 'Ȁ' => 'ȁ', 'Ȃ' => 'ȃ', 'Ȅ' => 'ȅ', 'Ȇ' => 'ȇ', 'Ȉ' => 'ȉ', 'Ȋ' => 'ȋ', 'Ȍ' => 'ȍ', 'Ȏ' => 'ȏ', 'Ȑ' => 'ȑ', 'Ȓ' => 'ȓ', 'Ȕ' => 'ȕ', 'Ȗ' => 'ȗ', 'Ș' => 'ș', 'Ț' => 'ț', 'Ȝ' => 'ȝ', 'Ȟ' => 'ȟ', 'Ƞ' => 'ƞ', 'Ȣ' => 'ȣ', 'Ȥ' => 'ȥ', 'Ȧ' => 'ȧ', 'Ȩ' => 'ȩ', 'Ȫ' => 'ȫ', 'Ȭ' => 'ȭ', 'Ȯ' => 'ȯ', 'Ȱ' => 'ȱ', 'Ȳ' => 'ȳ', 'Ⱥ' => 'ⱥ', 'Ȼ' => 'ȼ', 'Ƚ' => 'ƚ', 'Ⱦ' => 'ⱦ', 'Ɂ' => 'ɂ', 'Ƀ' => 'ƀ', 'Ʉ' => 'ʉ', 'Ʌ' => 'ʌ', 'Ɇ' => 'ɇ', 'Ɉ' => 'ɉ', 'Ɋ' => 'ɋ', 'Ɍ' => 'ɍ', 'Ɏ' => 'ɏ', 'Ͱ' => 'ͱ', 'Ͳ' => 'ͳ', 'Ͷ' => 'ͷ', 'Ϳ' => 'ϳ', 'Ά' => 'ά', 'Έ' => 'έ', 'Ή' => 'ή', 'Ί' => 'ί', 'Ό' => 'ό', 'Ύ' => 'ύ', 'Ώ' => 'ώ', 'Α' => 'α', 'Β' => 'β', 'Γ' => 'γ', 'Δ' => 'δ', 'Ε' => 'ε', 'Ζ' => 'ζ', 'Η' => 'η', 'Θ' => 'θ', 'Ι' => 'ι', 'Κ' => 'κ', 'Λ' => 'λ', 'Μ' => 'μ', 'Ν' => 'ν', 'Ξ' => 'ξ', 'Ο' => 'ο', 'Π' => 'π', 'Ρ' => 'ρ', 'Σ' => 'σ', 'Τ' => 'τ', 'Υ' => 'υ', 'Φ' => 'φ', 'Χ' => 'χ', 'Ψ' => 'ψ', 'Ω' => 'ω', 'Ϊ' => 'ϊ', 'Ϋ' => 'ϋ', 'Ϗ' => 'ϗ', 'Ϙ' => 'ϙ', 'Ϛ' => 'ϛ', 'Ϝ' => 'ϝ', 'Ϟ' => 'ϟ', 'Ϡ' => 'ϡ', 'Ϣ' => 'ϣ', 'Ϥ' => 'ϥ', 'Ϧ' => 'ϧ', 'Ϩ' => 'ϩ', 'Ϫ' => 'ϫ', 'Ϭ' => 'ϭ', 'Ϯ' => 'ϯ', 'ϴ' => 'θ', 'Ϸ' => 'ϸ', 'Ϲ' => 'ϲ', 'Ϻ' => 'ϻ', 'Ͻ' => 'ͻ', 'Ͼ' => 'ͼ', 'Ͽ' => 'ͽ', 'Ѐ' => 'ѐ', 'Ё' => 'ё', 'Ђ' => 'ђ', 'Ѓ' => 'ѓ', 'Є' => 'є', 'Ѕ' => 'ѕ', 'І' => 'і', 'Ї' => 'ї', 'Ј' => 'ј', 'Љ' => 'љ', 'Њ' => 'њ', 'Ћ' => 'ћ', 'Ќ' => 'ќ', 'Ѝ' => 'ѝ', 'Ў' => 'ў', 'Џ' => 'џ', 'А' => 'а', 'Б' => 'б', 'В' => 'в', 'Г' => 'г', 'Д' => 'д', 'Е' => 'е', 'Ж' => 'ж', 'З' => 'з', 'И' => 'и', 'Й' => 'й', 'К' => 'к', 'Л' => 'л', 'М' => 'м', 'Н' => 'н', 'О' => 'о', 'П' => 'п', 'Р' => 'р', 'С' => 'с', 'Т' => 'т', 'У' => 'у', 'Ф' => 'ф', 'Х' => 'х', 'Ц' => 'ц', 'Ч' => 'ч', 'Ш' => 'ш', 'Щ' => 'щ', 'Ъ' => 'ъ', 'Ы' => 'ы', 'Ь' => 'ь', 'Э' => 'э', 'Ю' => 'ю', 'Я' => 'я', 'Ѡ' => 'ѡ', 'Ѣ' => 'ѣ', 'Ѥ' => 'ѥ', 'Ѧ' => 'ѧ', 'Ѩ' => 'ѩ', 'Ѫ' => 'ѫ', 'Ѭ' => 'ѭ', 'Ѯ' => 'ѯ', 'Ѱ' => 'ѱ', 'Ѳ' => 'ѳ', 'Ѵ' => 'ѵ', 'Ѷ' => 'ѷ', 'Ѹ' => 'ѹ', 'Ѻ' => 'ѻ', 'Ѽ' => 'ѽ', 'Ѿ' => 'ѿ', 'Ҁ' => 'ҁ', 'Ҋ' => 'ҋ', 'Ҍ' => 'ҍ', 'Ҏ' => 'ҏ', 'Ґ' => 'ґ', 'Ғ' => 'ғ', 'Ҕ' => 'ҕ', 'Җ' => 'җ', 'Ҙ' => 'ҙ', 'Қ' => 'қ', 'Ҝ' => 'ҝ', 'Ҟ' => 'ҟ', 'Ҡ' => 'ҡ', 'Ң' => 'ң', 'Ҥ' => 'ҥ', 'Ҧ' => 'ҧ', 'Ҩ' => 'ҩ', 'Ҫ' => 'ҫ', 'Ҭ' => 'ҭ', 'Ү' => 'ү', 'Ұ' => 'ұ', 'Ҳ' => 'ҳ', 'Ҵ' => 'ҵ', 'Ҷ' => 'ҷ', 'Ҹ' => 'ҹ', 'Һ' => 'һ', 'Ҽ' => 'ҽ', 'Ҿ' => 'ҿ', 'Ӏ' => 'ӏ', 'Ӂ' => 'ӂ', 'Ӄ' => 'ӄ', 'Ӆ' => 'ӆ', 'Ӈ' => 'ӈ', 'Ӊ' => 'ӊ', 'Ӌ' => 'ӌ', 'Ӎ' => 'ӎ', 'Ӑ' => 'ӑ', 'Ӓ' => 'ӓ', 'Ӕ' => 'ӕ', 'Ӗ' => 'ӗ', 'Ә' => 'ә', 'Ӛ' => 'ӛ', 'Ӝ' => 'ӝ', 'Ӟ' => 'ӟ', 'Ӡ' => 'ӡ', 'Ӣ' => 'ӣ', 'Ӥ' => 'ӥ', 'Ӧ' => 'ӧ', 'Ө' => 'ө', 'Ӫ' => 'ӫ', 'Ӭ' => 'ӭ', 'Ӯ' => 'ӯ', 'Ӱ' => 'ӱ', 'Ӳ' => 'ӳ', 'Ӵ' => 'ӵ', 'Ӷ' => 'ӷ', 'Ӹ' => 'ӹ', 'Ӻ' => 'ӻ', 'Ӽ' => 'ӽ', 'Ӿ' => 'ӿ', 'Ԁ' => 'ԁ', 'Ԃ' => 'ԃ', 'Ԅ' => 'ԅ', 'Ԇ' => 'ԇ', 'Ԉ' => 'ԉ', 'Ԋ' => 'ԋ', 'Ԍ' => 'ԍ', 'Ԏ' => 'ԏ', 'Ԑ' => 'ԑ', 'Ԓ' => 'ԓ', 'Ԕ' => 'ԕ', 'Ԗ' => 'ԗ', 'Ԙ' => 'ԙ', 'Ԛ' => 'ԛ', 'Ԝ' => 'ԝ', 'Ԟ' => 'ԟ', 'Ԡ' => 'ԡ', 'Ԣ' => 'ԣ', 'Ԥ' => 'ԥ', 'Ԧ' => 'ԧ', 'Ԩ' => 'ԩ', 'Ԫ' => 'ԫ', 'Ԭ' => 'ԭ', 'Ԯ' => 'ԯ', 'Ա' => 'ա', 'Բ' => 'բ', 'Գ' => 'գ', 'Դ' => 'դ', 'Ե' => 'ե', 'Զ' => 'զ', 'Է' => 'է', 'Ը' => 'ը', 'Թ' => 'թ', 'Ժ' => 'ժ', 'Ի' => 'ի', 'Լ' => 'լ', 'Խ' => 'խ', 'Ծ' => 'ծ', 'Կ' => 'կ', 'Հ' => 'հ', 'Ձ' => 'ձ', 'Ղ' => 'ղ', 'Ճ' => 'ճ', 'Մ' => 'մ', 'Յ' => 'յ', 'Ն' => 'ն', 'Շ' => 'շ', 'Ո' => 'ո', 'Չ' => 'չ', 'Պ' => 'պ', 'Ջ' => 'ջ', 'Ռ' => 'ռ', 'Ս' => 'ս', 'Վ' => 'վ', 'Տ' => 'տ', 'Ր' => 'ր', 'Ց' => 'ց', 'Ւ' => 'ւ', 'Փ' => 'փ', 'Ք' => 'ք', 'Օ' => 'օ', 'Ֆ' => 'ֆ', 'Ⴀ' => 'ⴀ', 'Ⴁ' => 'ⴁ', 'Ⴂ' => 'ⴂ', 'Ⴃ' => 'ⴃ', 'Ⴄ' => 'ⴄ', 'Ⴅ' => 'ⴅ', 'Ⴆ' => 'ⴆ', 'Ⴇ' => 'ⴇ', 'Ⴈ' => 'ⴈ', 'Ⴉ' => 'ⴉ', 'Ⴊ' => 'ⴊ', 'Ⴋ' => 'ⴋ', 'Ⴌ' => 'ⴌ', 'Ⴍ' => 'ⴍ', 'Ⴎ' => 'ⴎ', 'Ⴏ' => 'ⴏ', 'Ⴐ' => 'ⴐ', 'Ⴑ' => 'ⴑ', 'Ⴒ' => 'ⴒ', 'Ⴓ' => 'ⴓ', 'Ⴔ' => 'ⴔ', 'Ⴕ' => 'ⴕ', 'Ⴖ' => 'ⴖ', 'Ⴗ' => 'ⴗ', 'Ⴘ' => 'ⴘ', 'Ⴙ' => 'ⴙ', 'Ⴚ' => 'ⴚ', 'Ⴛ' => 'ⴛ', 'Ⴜ' => 'ⴜ', 'Ⴝ' => 'ⴝ', 'Ⴞ' => 'ⴞ', 'Ⴟ' => 'ⴟ', 'Ⴠ' => 'ⴠ', 'Ⴡ' => 'ⴡ', 'Ⴢ' => 'ⴢ', 'Ⴣ' => 'ⴣ', 'Ⴤ' => 'ⴤ', 'Ⴥ' => 'ⴥ', 'Ⴧ' => 'ⴧ', 'Ⴭ' => 'ⴭ', 'Ꭰ' => 'ꭰ', 'Ꭱ' => 'ꭱ', 'Ꭲ' => 'ꭲ', 'Ꭳ' => 'ꭳ', 'Ꭴ' => 'ꭴ', 'Ꭵ' => 'ꭵ', 'Ꭶ' => 'ꭶ', 'Ꭷ' => 'ꭷ', 'Ꭸ' => 'ꭸ', 'Ꭹ' => 'ꭹ', 'Ꭺ' => 'ꭺ', 'Ꭻ' => 'ꭻ', 'Ꭼ' => 'ꭼ', 'Ꭽ' => 'ꭽ', 'Ꭾ' => 'ꭾ', 'Ꭿ' => 'ꭿ', 'Ꮀ' => 'ꮀ', 'Ꮁ' => 'ꮁ', 'Ꮂ' => 'ꮂ', 'Ꮃ' => 'ꮃ', 'Ꮄ' => 'ꮄ', 'Ꮅ' => 'ꮅ', 'Ꮆ' => 'ꮆ', 'Ꮇ' => 'ꮇ', 'Ꮈ' => 'ꮈ', 'Ꮉ' => 'ꮉ', 'Ꮊ' => 'ꮊ', 'Ꮋ' => 'ꮋ', 'Ꮌ' => 'ꮌ', 'Ꮍ' => 'ꮍ', 'Ꮎ' => 'ꮎ', 'Ꮏ' => 'ꮏ', 'Ꮐ' => 'ꮐ', 'Ꮑ' => 'ꮑ', 'Ꮒ' => 'ꮒ', 'Ꮓ' => 'ꮓ', 'Ꮔ' => 'ꮔ', 'Ꮕ' => 'ꮕ', 'Ꮖ' => 'ꮖ', 'Ꮗ' => 'ꮗ', 'Ꮘ' => 'ꮘ', 'Ꮙ' => 'ꮙ', 'Ꮚ' => 'ꮚ', 'Ꮛ' => 'ꮛ', 'Ꮜ' => 'ꮜ', 'Ꮝ' => 'ꮝ', 'Ꮞ' => 'ꮞ', 'Ꮟ' => 'ꮟ', 'Ꮠ' => 'ꮠ', 'Ꮡ' => 'ꮡ', 'Ꮢ' => 'ꮢ', 'Ꮣ' => 'ꮣ', 'Ꮤ' => 'ꮤ', 'Ꮥ' => 'ꮥ', 'Ꮦ' => 'ꮦ', 'Ꮧ' => 'ꮧ', 'Ꮨ' => 'ꮨ', 'Ꮩ' => 'ꮩ', 'Ꮪ' => 'ꮪ', 'Ꮫ' => 'ꮫ', 'Ꮬ' => 'ꮬ', 'Ꮭ' => 'ꮭ', 'Ꮮ' => 'ꮮ', 'Ꮯ' => 'ꮯ', 'Ꮰ' => 'ꮰ', 'Ꮱ' => 'ꮱ', 'Ꮲ' => 'ꮲ', 'Ꮳ' => 'ꮳ', 'Ꮴ' => 'ꮴ', 'Ꮵ' => 'ꮵ', 'Ꮶ' => 'ꮶ', 'Ꮷ' => 'ꮷ', 'Ꮸ' => 'ꮸ', 'Ꮹ' => 'ꮹ', 'Ꮺ' => 'ꮺ', 'Ꮻ' => 'ꮻ', 'Ꮼ' => 'ꮼ', 'Ꮽ' => 'ꮽ', 'Ꮾ' => 'ꮾ', 'Ꮿ' => 'ꮿ', 'Ᏸ' => 'ᏸ', 'Ᏹ' => 'ᏹ', 'Ᏺ' => 'ᏺ', 'Ᏻ' => 'ᏻ', 'Ᏼ' => 'ᏼ', 'Ᏽ' => 'ᏽ', 'Ა' => 'ა', 'Ბ' => 'ბ', 'Გ' => 'გ', 'Დ' => 'დ', 'Ე' => 'ე', 'Ვ' => 'ვ', 'Ზ' => 'ზ', 'Თ' => 'თ', 'Ი' => 'ი', 'Კ' => 'კ', 'Ლ' => 'ლ', 'Მ' => 'მ', 'Ნ' => 'ნ', 'Ო' => 'ო', 'Პ' => 'პ', 'Ჟ' => 'ჟ', 'Რ' => 'რ', 'Ს' => 'ს', 'Ტ' => 'ტ', 'Უ' => 'უ', 'Ფ' => 'ფ', 'Ქ' => 'ქ', 'Ღ' => 'ღ', 'Ყ' => 'ყ', 'Შ' => 'შ', 'Ჩ' => 'ჩ', 'Ც' => 'ც', 'Ძ' => 'ძ', 'Წ' => 'წ', 'Ჭ' => 'ჭ', 'Ხ' => 'ხ', 'Ჯ' => 'ჯ', 'Ჰ' => 'ჰ', 'Ჱ' => 'ჱ', 'Ჲ' => 'ჲ', 'Ჳ' => 'ჳ', 'Ჴ' => 'ჴ', 'Ჵ' => 'ჵ', 'Ჶ' => 'ჶ', 'Ჷ' => 'ჷ', 'Ჸ' => 'ჸ', 'Ჹ' => 'ჹ', 'Ჺ' => 'ჺ', 'Ჽ' => 'ჽ', 'Ჾ' => 'ჾ', 'Ჿ' => 'ჿ', 'Ḁ' => 'ḁ', 'Ḃ' => 'ḃ', 'Ḅ' => 'ḅ', 'Ḇ' => 'ḇ', 'Ḉ' => 'ḉ', 'Ḋ' => 'ḋ', 'Ḍ' => 'ḍ', 'Ḏ' => 'ḏ', 'Ḑ' => 'ḑ', 'Ḓ' => 'ḓ', 'Ḕ' => 'ḕ', 'Ḗ' => 'ḗ', 'Ḙ' => 'ḙ', 'Ḛ' => 'ḛ', 'Ḝ' => 'ḝ', 'Ḟ' => 'ḟ', 'Ḡ' => 'ḡ', 'Ḣ' => 'ḣ', 'Ḥ' => 'ḥ', 'Ḧ' => 'ḧ', 'Ḩ' => 'ḩ', 'Ḫ' => 'ḫ', 'Ḭ' => 'ḭ', 'Ḯ' => 'ḯ', 'Ḱ' => 'ḱ', 'Ḳ' => 'ḳ', 'Ḵ' => 'ḵ', 'Ḷ' => 'ḷ', 'Ḹ' => 'ḹ', 'Ḻ' => 'ḻ', 'Ḽ' => 'ḽ', 'Ḿ' => 'ḿ', 'Ṁ' => 'ṁ', 'Ṃ' => 'ṃ', 'Ṅ' => 'ṅ', 'Ṇ' => 'ṇ', 'Ṉ' => 'ṉ', 'Ṋ' => 'ṋ', 'Ṍ' => 'ṍ', 'Ṏ' => 'ṏ', 'Ṑ' => 'ṑ', 'Ṓ' => 'ṓ', 'Ṕ' => 'ṕ', 'Ṗ' => 'ṗ', 'Ṙ' => 'ṙ', 'Ṛ' => 'ṛ', 'Ṝ' => 'ṝ', 'Ṟ' => 'ṟ', 'Ṡ' => 'ṡ', 'Ṣ' => 'ṣ', 'Ṥ' => 'ṥ', 'Ṧ' => 'ṧ', 'Ṩ' => 'ṩ', 'Ṫ' => 'ṫ', 'Ṭ' => 'ṭ', 'Ṯ' => 'ṯ', 'Ṱ' => 'ṱ', 'Ṳ' => 'ṳ', 'Ṵ' => 'ṵ', 'Ṷ' => 'ṷ', 'Ṹ' => 'ṹ', 'Ṻ' => 'ṻ', 'Ṽ' => 'ṽ', 'Ṿ' => 'ṿ', 'Ẁ' => 'ẁ', 'Ẃ' => 'ẃ', 'Ẅ' => 'ẅ', 'Ẇ' => 'ẇ', 'Ẉ' => 'ẉ', 'Ẋ' => 'ẋ', 'Ẍ' => 'ẍ', 'Ẏ' => 'ẏ', 'Ẑ' => 'ẑ', 'Ẓ' => 'ẓ', 'Ẕ' => 'ẕ', 'ẞ' => 'ß', 'Ạ' => 'ạ', 'Ả' => 'ả', 'Ấ' => 'ấ', 'Ầ' => 'ầ', 'Ẩ' => 'ẩ', 'Ẫ' => 'ẫ', 'Ậ' => 'ậ', 'Ắ' => 'ắ', 'Ằ' => 'ằ', 'Ẳ' => 'ẳ', 'Ẵ' => 'ẵ', 'Ặ' => 'ặ', 'Ẹ' => 'ẹ', 'Ẻ' => 'ẻ', 'Ẽ' => 'ẽ', 'Ế' => 'ế', 'Ề' => 'ề', 'Ể' => 'ể', 'Ễ' => 'ễ', 'Ệ' => 'ệ', 'Ỉ' => 'ỉ', 'Ị' => 'ị', 'Ọ' => 'ọ', 'Ỏ' => 'ỏ', 'Ố' => 'ố', 'Ồ' => 'ồ', 'Ổ' => 'ổ', 'Ỗ' => 'ỗ', 'Ộ' => 'ộ', 'Ớ' => 'ớ', 'Ờ' => 'ờ', 'Ở' => 'ở', 'Ỡ' => 'ỡ', 'Ợ' => 'ợ', 'Ụ' => 'ụ', 'Ủ' => 'ủ', 'Ứ' => 'ứ', 'Ừ' => 'ừ', 'Ử' => 'ử', 'Ữ' => 'ữ', 'Ự' => 'ự', 'Ỳ' => 'ỳ', 'Ỵ' => 'ỵ', 'Ỷ' => 'ỷ', 'Ỹ' => 'ỹ', 'Ỻ' => 'ỻ', 'Ỽ' => 'ỽ', 'Ỿ' => 'ỿ', 'Ἀ' => 'ἀ', 'Ἁ' => 'ἁ', 'Ἂ' => 'ἂ', 'Ἃ' => 'ἃ', 'Ἄ' => 'ἄ', 'Ἅ' => 'ἅ', 'Ἆ' => 'ἆ', 'Ἇ' => 'ἇ', 'Ἐ' => 'ἐ', 'Ἑ' => 'ἑ', 'Ἒ' => 'ἒ', 'Ἓ' => 'ἓ', 'Ἔ' => 'ἔ', 'Ἕ' => 'ἕ', 'Ἠ' => 'ἠ', 'Ἡ' => 'ἡ', 'Ἢ' => 'ἢ', 'Ἣ' => 'ἣ', 'Ἤ' => 'ἤ', 'Ἥ' => 'ἥ', 'Ἦ' => 'ἦ', 'Ἧ' => 'ἧ', 'Ἰ' => 'ἰ', 'Ἱ' => 'ἱ', 'Ἲ' => 'ἲ', 'Ἳ' => 'ἳ', 'Ἴ' => 'ἴ', 'Ἵ' => 'ἵ', 'Ἶ' => 'ἶ', 'Ἷ' => 'ἷ', 'Ὀ' => 'ὀ', 'Ὁ' => 'ὁ', 'Ὂ' => 'ὂ', 'Ὃ' => 'ὃ', 'Ὄ' => 'ὄ', 'Ὅ' => 'ὅ', 'Ὑ' => 'ὑ', 'Ὓ' => 'ὓ', 'Ὕ' => 'ὕ', 'Ὗ' => 'ὗ', 'Ὠ' => 'ὠ', 'Ὡ' => 'ὡ', 'Ὢ' => 'ὢ', 'Ὣ' => 'ὣ', 'Ὤ' => 'ὤ', 'Ὥ' => 'ὥ', 'Ὦ' => 'ὦ', 'Ὧ' => 'ὧ', 'ᾈ' => 'ᾀ', 'ᾉ' => 'ᾁ', 'ᾊ' => 'ᾂ', 'ᾋ' => 'ᾃ', 'ᾌ' => 'ᾄ', 'ᾍ' => 'ᾅ', 'ᾎ' => 'ᾆ', 'ᾏ' => 'ᾇ', 'ᾘ' => 'ᾐ', 'ᾙ' => 'ᾑ', 'ᾚ' => 'ᾒ', 'ᾛ' => 'ᾓ', 'ᾜ' => 'ᾔ', 'ᾝ' => 'ᾕ', 'ᾞ' => 'ᾖ', 'ᾟ' => 'ᾗ', 'ᾨ' => 'ᾠ', 'ᾩ' => 'ᾡ', 'ᾪ' => 'ᾢ', 'ᾫ' => 'ᾣ', 'ᾬ' => 'ᾤ', 'ᾭ' => 'ᾥ', 'ᾮ' => 'ᾦ', 'ᾯ' => 'ᾧ', 'Ᾰ' => 'ᾰ', 'Ᾱ' => 'ᾱ', 'Ὰ' => 'ὰ', 'Ά' => 'ά', 'ᾼ' => 'ᾳ', 'Ὲ' => 'ὲ', 'Έ' => 'έ', 'Ὴ' => 'ὴ', 'Ή' => 'ή', 'ῌ' => 'ῃ', 'Ῐ' => 'ῐ', 'Ῑ' => 'ῑ', 'Ὶ' => 'ὶ', 'Ί' => 'ί', 'Ῠ' => 'ῠ', 'Ῡ' => 'ῡ', 'Ὺ' => 'ὺ', 'Ύ' => 'ύ', 'Ῥ' => 'ῥ', 'Ὸ' => 'ὸ', 'Ό' => 'ό', 'Ὼ' => 'ὼ', 'Ώ' => 'ώ', 'ῼ' => 'ῳ', 'Ω' => 'ω', 'K' => 'k', 'Å' => 'å', 'Ⅎ' => 'ⅎ', 'Ⅰ' => 'ⅰ', 'Ⅱ' => 'ⅱ', 'Ⅲ' => 'ⅲ', 'Ⅳ' => 'ⅳ', 'Ⅴ' => 'ⅴ', 'Ⅵ' => 'ⅵ', 'Ⅶ' => 'ⅶ', 'Ⅷ' => 'ⅷ', 'Ⅸ' => 'ⅸ', 'Ⅹ' => 'ⅹ', 'Ⅺ' => 'ⅺ', 'Ⅻ' => 'ⅻ', 'Ⅼ' => 'ⅼ', 'Ⅽ' => 'ⅽ', 'Ⅾ' => 'ⅾ', 'Ⅿ' => 'ⅿ', 'Ↄ' => 'ↄ', 'Ⓐ' => 'ⓐ', 'Ⓑ' => 'ⓑ', 'Ⓒ' => 'ⓒ', 'Ⓓ' => 'ⓓ', 'Ⓔ' => 'ⓔ', 'Ⓕ' => 'ⓕ', 'Ⓖ' => 'ⓖ', 'Ⓗ' => 'ⓗ', 'Ⓘ' => 'ⓘ', 'Ⓙ' => 'ⓙ', 'Ⓚ' => 'ⓚ', 'Ⓛ' => 'ⓛ', 'Ⓜ' => 'ⓜ', 'Ⓝ' => 'ⓝ', 'Ⓞ' => 'ⓞ', 'Ⓟ' => 'ⓟ', 'Ⓠ' => 'ⓠ', 'Ⓡ' => 'ⓡ', 'Ⓢ' => 'ⓢ', 'Ⓣ' => 'ⓣ', 'Ⓤ' => 'ⓤ', 'Ⓥ' => 'ⓥ', 'Ⓦ' => 'ⓦ', 'Ⓧ' => 'ⓧ', 'Ⓨ' => 'ⓨ', 'Ⓩ' => 'ⓩ', 'Ⰰ' => 'ⰰ', 'Ⰱ' => 'ⰱ', 'Ⰲ' => 'ⰲ', 'Ⰳ' => 'ⰳ', 'Ⰴ' => 'ⰴ', 'Ⰵ' => 'ⰵ', 'Ⰶ' => 'ⰶ', 'Ⰷ' => 'ⰷ', 'Ⰸ' => 'ⰸ', 'Ⰹ' => 'ⰹ', 'Ⰺ' => 'ⰺ', 'Ⰻ' => 'ⰻ', 'Ⰼ' => 'ⰼ', 'Ⰽ' => 'ⰽ', 'Ⰾ' => 'ⰾ', 'Ⰿ' => 'ⰿ', 'Ⱀ' => 'ⱀ', 'Ⱁ' => 'ⱁ', 'Ⱂ' => 'ⱂ', 'Ⱃ' => 'ⱃ', 'Ⱄ' => 'ⱄ', 'Ⱅ' => 'ⱅ', 'Ⱆ' => 'ⱆ', 'Ⱇ' => 'ⱇ', 'Ⱈ' => 'ⱈ', 'Ⱉ' => 'ⱉ', 'Ⱊ' => 'ⱊ', 'Ⱋ' => 'ⱋ', 'Ⱌ' => 'ⱌ', 'Ⱍ' => 'ⱍ', 'Ⱎ' => 'ⱎ', 'Ⱏ' => 'ⱏ', 'Ⱐ' => 'ⱐ', 'Ⱑ' => 'ⱑ', 'Ⱒ' => 'ⱒ', 'Ⱓ' => 'ⱓ', 'Ⱔ' => 'ⱔ', 'Ⱕ' => 'ⱕ', 'Ⱖ' => 'ⱖ', 'Ⱗ' => 'ⱗ', 'Ⱘ' => 'ⱘ', 'Ⱙ' => 'ⱙ', 'Ⱚ' => 'ⱚ', 'Ⱛ' => 'ⱛ', 'Ⱜ' => 'ⱜ', 'Ⱝ' => 'ⱝ', 'Ⱞ' => 'ⱞ', 'Ⱡ' => 'ⱡ', 'Ɫ' => 'ɫ', 'Ᵽ' => 'ᵽ', 'Ɽ' => 'ɽ', 'Ⱨ' => 'ⱨ', 'Ⱪ' => 'ⱪ', 'Ⱬ' => 'ⱬ', 'Ɑ' => 'ɑ', 'Ɱ' => 'ɱ', 'Ɐ' => 'ɐ', 'Ɒ' => 'ɒ', 'Ⱳ' => 'ⱳ', 'Ⱶ' => 'ⱶ', 'Ȿ' => 'ȿ', 'Ɀ' => 'ɀ', 'Ⲁ' => 'ⲁ', 'Ⲃ' => 'ⲃ', 'Ⲅ' => 'ⲅ', 'Ⲇ' => 'ⲇ', 'Ⲉ' => 'ⲉ', 'Ⲋ' => 'ⲋ', 'Ⲍ' => 'ⲍ', 'Ⲏ' => 'ⲏ', 'Ⲑ' => 'ⲑ', 'Ⲓ' => 'ⲓ', 'Ⲕ' => 'ⲕ', 'Ⲗ' => 'ⲗ', 'Ⲙ' => 'ⲙ', 'Ⲛ' => 'ⲛ', 'Ⲝ' => 'ⲝ', 'Ⲟ' => 'ⲟ', 'Ⲡ' => 'ⲡ', 'Ⲣ' => 'ⲣ', 'Ⲥ' => 'ⲥ', 'Ⲧ' => 'ⲧ', 'Ⲩ' => 'ⲩ', 'Ⲫ' => 'ⲫ', 'Ⲭ' => 'ⲭ', 'Ⲯ' => 'ⲯ', 'Ⲱ' => 'ⲱ', 'Ⲳ' => 'ⲳ', 'Ⲵ' => 'ⲵ', 'Ⲷ' => 'ⲷ', 'Ⲹ' => 'ⲹ', 'Ⲻ' => 'ⲻ', 'Ⲽ' => 'ⲽ', 'Ⲿ' => 'ⲿ', 'Ⳁ' => 'ⳁ', 'Ⳃ' => 'ⳃ', 'Ⳅ' => 'ⳅ', 'Ⳇ' => 'ⳇ', 'Ⳉ' => 'ⳉ', 'Ⳋ' => 'ⳋ', 'Ⳍ' => 'ⳍ', 'Ⳏ' => 'ⳏ', 'Ⳑ' => 'ⳑ', 'Ⳓ' => 'ⳓ', 'Ⳕ' => 'ⳕ', 'Ⳗ' => 'ⳗ', 'Ⳙ' => 'ⳙ', 'Ⳛ' => 'ⳛ', 'Ⳝ' => 'ⳝ', 'Ⳟ' => 'ⳟ', 'Ⳡ' => 'ⳡ', 'Ⳣ' => 'ⳣ', 'Ⳬ' => 'ⳬ', 'Ⳮ' => 'ⳮ', 'Ⳳ' => 'ⳳ', 'Ꙁ' => 'ꙁ', 'Ꙃ' => 'ꙃ', 'Ꙅ' => 'ꙅ', 'Ꙇ' => 'ꙇ', 'Ꙉ' => 'ꙉ', 'Ꙋ' => 'ꙋ', 'Ꙍ' => 'ꙍ', 'Ꙏ' => 'ꙏ', 'Ꙑ' => 'ꙑ', 'Ꙓ' => 'ꙓ', 'Ꙕ' => 'ꙕ', 'Ꙗ' => 'ꙗ', 'Ꙙ' => 'ꙙ', 'Ꙛ' => 'ꙛ', 'Ꙝ' => 'ꙝ', 'Ꙟ' => 'ꙟ', 'Ꙡ' => 'ꙡ', 'Ꙣ' => 'ꙣ', 'Ꙥ' => 'ꙥ', 'Ꙧ' => 'ꙧ', 'Ꙩ' => 'ꙩ', 'Ꙫ' => 'ꙫ', 'Ꙭ' => 'ꙭ', 'Ꚁ' => 'ꚁ', 'Ꚃ' => 'ꚃ', 'Ꚅ' => 'ꚅ', 'Ꚇ' => 'ꚇ', 'Ꚉ' => 'ꚉ', 'Ꚋ' => 'ꚋ', 'Ꚍ' => 'ꚍ', 'Ꚏ' => 'ꚏ', 'Ꚑ' => 'ꚑ', 'Ꚓ' => 'ꚓ', 'Ꚕ' => 'ꚕ', 'Ꚗ' => 'ꚗ', 'Ꚙ' => 'ꚙ', 'Ꚛ' => 'ꚛ', 'Ꜣ' => 'ꜣ', 'Ꜥ' => 'ꜥ', 'Ꜧ' => 'ꜧ', 'Ꜩ' => 'ꜩ', 'Ꜫ' => 'ꜫ', 'Ꜭ' => 'ꜭ', 'Ꜯ' => 'ꜯ', 'Ꜳ' => 'ꜳ', 'Ꜵ' => 'ꜵ', 'Ꜷ' => 'ꜷ', 'Ꜹ' => 'ꜹ', 'Ꜻ' => 'ꜻ', 'Ꜽ' => 'ꜽ', 'Ꜿ' => 'ꜿ', 'Ꝁ' => 'ꝁ', 'Ꝃ' => 'ꝃ', 'Ꝅ' => 'ꝅ', 'Ꝇ' => 'ꝇ', 'Ꝉ' => 'ꝉ', 'Ꝋ' => 'ꝋ', 'Ꝍ' => 'ꝍ', 'Ꝏ' => 'ꝏ', 'Ꝑ' => 'ꝑ', 'Ꝓ' => 'ꝓ', 'Ꝕ' => 'ꝕ', 'Ꝗ' => 'ꝗ', 'Ꝙ' => 'ꝙ', 'Ꝛ' => 'ꝛ', 'Ꝝ' => 'ꝝ', 'Ꝟ' => 'ꝟ', 'Ꝡ' => 'ꝡ', 'Ꝣ' => 'ꝣ', 'Ꝥ' => 'ꝥ', 'Ꝧ' => 'ꝧ', 'Ꝩ' => 'ꝩ', 'Ꝫ' => 'ꝫ', 'Ꝭ' => 'ꝭ', 'Ꝯ' => 'ꝯ', 'Ꝺ' => 'ꝺ', 'Ꝼ' => 'ꝼ', 'Ᵹ' => 'ᵹ', 'Ꝿ' => 'ꝿ', 'Ꞁ' => 'ꞁ', 'Ꞃ' => 'ꞃ', 'Ꞅ' => 'ꞅ', 'Ꞇ' => 'ꞇ', 'Ꞌ' => 'ꞌ', 'Ɥ' => 'ɥ', 'Ꞑ' => 'ꞑ', 'Ꞓ' => 'ꞓ', 'Ꞗ' => 'ꞗ', 'Ꞙ' => 'ꞙ', 'Ꞛ' => 'ꞛ', 'Ꞝ' => 'ꞝ', 'Ꞟ' => 'ꞟ', 'Ꞡ' => 'ꞡ', 'Ꞣ' => 'ꞣ', 'Ꞥ' => 'ꞥ', 'Ꞧ' => 'ꞧ', 'Ꞩ' => 'ꞩ', 'Ɦ' => 'ɦ', 'Ɜ' => 'ɜ', 'Ɡ' => 'ɡ', 'Ɬ' => 'ɬ', 'Ɪ' => 'ɪ', 'Ʞ' => 'ʞ', 'Ʇ' => 'ʇ', 'Ʝ' => 'ʝ', 'Ꭓ' => 'ꭓ', 'Ꞵ' => 'ꞵ', 'Ꞷ' => 'ꞷ', 'Ꞹ' => 'ꞹ', 'Ꞻ' => 'ꞻ', 'Ꞽ' => 'ꞽ', 'Ꞿ' => 'ꞿ', 'Ꟃ' => 'ꟃ', 'Ꞔ' => 'ꞔ', 'Ʂ' => 'ʂ', 'Ᶎ' => 'ᶎ', 'Ꟈ' => 'ꟈ', 'Ꟊ' => 'ꟊ', 'Ꟶ' => 'ꟶ', 'A' => 'a', 'B' => 'b', 'C' => 'c', 'D' => 'd', 'E' => 'e', 'F' => 'f', 'G' => 'g', 'H' => 'h', 'I' => 'i', 'J' => 'j', 'K' => 'k', 'L' => 'l', 'M' => 'm', 'N' => 'n', 'O' => 'o', 'P' => 'p', 'Q' => 'q', 'R' => 'r', 'S' => 's', 'T' => 't', 'U' => 'u', 'V' => 'v', 'W' => 'w', 'X' => 'x', 'Y' => 'y', 'Z' => 'z', '𐐀' => '𐐨', '𐐁' => '𐐩', '𐐂' => '𐐪', '𐐃' => '𐐫', '𐐄' => '𐐬', '𐐅' => '𐐭', '𐐆' => '𐐮', '𐐇' => '𐐯', '𐐈' => '𐐰', '𐐉' => '𐐱', '𐐊' => '𐐲', '𐐋' => '𐐳', '𐐌' => '𐐴', '𐐍' => '𐐵', '𐐎' => '𐐶', '𐐏' => '𐐷', '𐐐' => '𐐸', '𐐑' => '𐐹', '𐐒' => '𐐺', '𐐓' => '𐐻', '𐐔' => '𐐼', '𐐕' => '𐐽', '𐐖' => '𐐾', '𐐗' => '𐐿', '𐐘' => '𐑀', '𐐙' => '𐑁', '𐐚' => '𐑂', '𐐛' => '𐑃', '𐐜' => '𐑄', '𐐝' => '𐑅', '𐐞' => '𐑆', '𐐟' => '𐑇', '𐐠' => '𐑈', '𐐡' => '𐑉', '𐐢' => '𐑊', '𐐣' => '𐑋', '𐐤' => '𐑌', '𐐥' => '𐑍', '𐐦' => '𐑎', '𐐧' => '𐑏', '𐒰' => '𐓘', '𐒱' => '𐓙', '𐒲' => '𐓚', '𐒳' => '𐓛', '𐒴' => '𐓜', '𐒵' => '𐓝', '𐒶' => '𐓞', '𐒷' => '𐓟', '𐒸' => '𐓠', '𐒹' => '𐓡', '𐒺' => '𐓢', '𐒻' => '𐓣', '𐒼' => '𐓤', '𐒽' => '𐓥', '𐒾' => '𐓦', '𐒿' => '𐓧', '𐓀' => '𐓨', '𐓁' => '𐓩', '𐓂' => '𐓪', '𐓃' => '𐓫', '𐓄' => '𐓬', '𐓅' => '𐓭', '𐓆' => '𐓮', '𐓇' => '𐓯', '𐓈' => '𐓰', '𐓉' => '𐓱', '𐓊' => '𐓲', '𐓋' => '𐓳', '𐓌' => '𐓴', '𐓍' => '𐓵', '𐓎' => '𐓶', '𐓏' => '𐓷', '𐓐' => '𐓸', '𐓑' => '𐓹', '𐓒' => '𐓺', '𐓓' => '𐓻', '𐲀' => '𐳀', '𐲁' => '𐳁', '𐲂' => '𐳂', '𐲃' => '𐳃', '𐲄' => '𐳄', '𐲅' => '𐳅', '𐲆' => '𐳆', '𐲇' => '𐳇', '𐲈' => '𐳈', '𐲉' => '𐳉', '𐲊' => '𐳊', '𐲋' => '𐳋', '𐲌' => '𐳌', '𐲍' => '𐳍', '𐲎' => '𐳎', '𐲏' => '𐳏', '𐲐' => '𐳐', '𐲑' => '𐳑', '𐲒' => '𐳒', '𐲓' => '𐳓', '𐲔' => '𐳔', '𐲕' => '𐳕', '𐲖' => '𐳖', '𐲗' => '𐳗', '𐲘' => '𐳘', '𐲙' => '𐳙', '𐲚' => '𐳚', '𐲛' => '𐳛', '𐲜' => '𐳜', '𐲝' => '𐳝', '𐲞' => '𐳞', '𐲟' => '𐳟', '𐲠' => '𐳠', '𐲡' => '𐳡', '𐲢' => '𐳢', '𐲣' => '𐳣', '𐲤' => '𐳤', '𐲥' => '𐳥', '𐲦' => '𐳦', '𐲧' => '𐳧', '𐲨' => '𐳨', '𐲩' => '𐳩', '𐲪' => '𐳪', '𐲫' => '𐳫', '𐲬' => '𐳬', '𐲭' => '𐳭', '𐲮' => '𐳮', '𐲯' => '𐳯', '𐲰' => '𐳰', '𐲱' => '𐳱', '𐲲' => '𐳲', '𑢠' => '𑣀', '𑢡' => '𑣁', '𑢢' => '𑣂', '𑢣' => '𑣃', '𑢤' => '𑣄', '𑢥' => '𑣅', '𑢦' => '𑣆', '𑢧' => '𑣇', '𑢨' => '𑣈', '𑢩' => '𑣉', '𑢪' => '𑣊', '𑢫' => '𑣋', '𑢬' => '𑣌', '𑢭' => '𑣍', '𑢮' => '𑣎', '𑢯' => '𑣏', '𑢰' => '𑣐', '𑢱' => '𑣑', '𑢲' => '𑣒', '𑢳' => '𑣓', '𑢴' => '𑣔', '𑢵' => '𑣕', '𑢶' => '𑣖', '𑢷' => '𑣗', '𑢸' => '𑣘', '𑢹' => '𑣙', '𑢺' => '𑣚', '𑢻' => '𑣛', '𑢼' => '𑣜', '𑢽' => '𑣝', '𑢾' => '𑣞', '𑢿' => '𑣟', '𖹀' => '𖹠', '𖹁' => '𖹡', '𖹂' => '𖹢', '𖹃' => '𖹣', '𖹄' => '𖹤', '𖹅' => '𖹥', '𖹆' => '𖹦', '𖹇' => '𖹧', '𖹈' => '𖹨', '𖹉' => '𖹩', '𖹊' => '𖹪', '𖹋' => '𖹫', '𖹌' => '𖹬', '𖹍' => '𖹭', '𖹎' => '𖹮', '𖹏' => '𖹯', '𖹐' => '𖹰', '𖹑' => '𖹱', '𖹒' => '𖹲', '𖹓' => '𖹳', '𖹔' => '𖹴', '𖹕' => '𖹵', '𖹖' => '𖹶', '𖹗' => '𖹷', '𖹘' => '𖹸', '𖹙' => '𖹹', '𖹚' => '𖹺', '𖹛' => '𖹻', '𖹜' => '𖹼', '𖹝' => '𖹽', '𖹞' => '𖹾', '𖹟' => '𖹿', '𞤀' => '𞤢', '𞤁' => '𞤣', '𞤂' => '𞤤', '𞤃' => '𞤥', '𞤄' => '𞤦', '𞤅' => '𞤧', '𞤆' => '𞤨', '𞤇' => '𞤩', '𞤈' => '𞤪', '𞤉' => '𞤫', '𞤊' => '𞤬', '𞤋' => '𞤭', '𞤌' => '𞤮', '𞤍' => '𞤯', '𞤎' => '𞤰', '𞤏' => '𞤱', '𞤐' => '𞤲', '𞤑' => '𞤳', '𞤒' => '𞤴', '𞤓' => '𞤵', '𞤔' => '𞤶', '𞤕' => '𞤷', '𞤖' => '𞤸', '𞤗' => '𞤹', '𞤘' => '𞤺', '𞤙' => '𞤻', '𞤚' => '𞤼', '𞤛' => '𞤽', '𞤜' => '𞤾', '𞤝' => '𞤿', '𞤞' => '𞥀', '𞤟' => '𞥁', '𞤠' => '𞥂', '𞤡' => '𞥃'); 'A', 'b' => 'B', 'c' => 'C', 'd' => 'D', 'e' => 'E', 'f' => 'F', 'g' => 'G', 'h' => 'H', 'i' => 'I', 'j' => 'J', 'k' => 'K', 'l' => 'L', 'm' => 'M', 'n' => 'N', 'o' => 'O', 'p' => 'P', 'q' => 'Q', 'r' => 'R', 's' => 'S', 't' => 'T', 'u' => 'U', 'v' => 'V', 'w' => 'W', 'x' => 'X', 'y' => 'Y', 'z' => 'Z', 'µ' => 'Μ', 'à' => 'À', 'á' => 'Á', 'â' => 'Â', 'ã' => 'Ã', 'ä' => 'Ä', 'å' => 'Å', 'æ' => 'Æ', 'ç' => 'Ç', 'è' => 'È', 'é' => 'É', 'ê' => 'Ê', 'ë' => 'Ë', 'ì' => 'Ì', 'í' => 'Í', 'î' => 'Î', 'ï' => 'Ï', 'ð' => 'Ð', 'ñ' => 'Ñ', 'ò' => 'Ò', 'ó' => 'Ó', 'ô' => 'Ô', 'õ' => 'Õ', 'ö' => 'Ö', 'ø' => 'Ø', 'ù' => 'Ù', 'ú' => 'Ú', 'û' => 'Û', 'ü' => 'Ü', 'ý' => 'Ý', 'þ' => 'Þ', 'ÿ' => 'Ÿ', 'ā' => 'Ā', 'ă' => 'Ă', 'ą' => 'Ą', 'ć' => 'Ć', 'ĉ' => 'Ĉ', 'ċ' => 'Ċ', 'č' => 'Č', 'ď' => 'Ď', 'đ' => 'Đ', 'ē' => 'Ē', 'ĕ' => 'Ĕ', 'ė' => 'Ė', 'ę' => 'Ę', 'ě' => 'Ě', 'ĝ' => 'Ĝ', 'ğ' => 'Ğ', 'ġ' => 'Ġ', 'ģ' => 'Ģ', 'ĥ' => 'Ĥ', 'ħ' => 'Ħ', 'ĩ' => 'Ĩ', 'ī' => 'Ī', 'ĭ' => 'Ĭ', 'į' => 'Į', 'ı' => 'I', 'ij' => 'IJ', 'ĵ' => 'Ĵ', 'ķ' => 'Ķ', 'ĺ' => 'Ĺ', 'ļ' => 'Ļ', 'ľ' => 'Ľ', 'ŀ' => 'Ŀ', 'ł' => 'Ł', 'ń' => 'Ń', 'ņ' => 'Ņ', 'ň' => 'Ň', 'ŋ' => 'Ŋ', 'ō' => 'Ō', 'ŏ' => 'Ŏ', 'ő' => 'Ő', 'œ' => 'Œ', 'ŕ' => 'Ŕ', 'ŗ' => 'Ŗ', 'ř' => 'Ř', 'ś' => 'Ś', 'ŝ' => 'Ŝ', 'ş' => 'Ş', 'š' => 'Š', 'ţ' => 'Ţ', 'ť' => 'Ť', 'ŧ' => 'Ŧ', 'ũ' => 'Ũ', 'ū' => 'Ū', 'ŭ' => 'Ŭ', 'ů' => 'Ů', 'ű' => 'Ű', 'ų' => 'Ų', 'ŵ' => 'Ŵ', 'ŷ' => 'Ŷ', 'ź' => 'Ź', 'ż' => 'Ż', 'ž' => 'Ž', 'ſ' => 'S', 'ƀ' => 'Ƀ', 'ƃ' => 'Ƃ', 'ƅ' => 'Ƅ', 'ƈ' => 'Ƈ', 'ƌ' => 'Ƌ', 'ƒ' => 'Ƒ', 'ƕ' => 'Ƕ', 'ƙ' => 'Ƙ', 'ƚ' => 'Ƚ', 'ƞ' => 'Ƞ', 'ơ' => 'Ơ', 'ƣ' => 'Ƣ', 'ƥ' => 'Ƥ', 'ƨ' => 'Ƨ', 'ƭ' => 'Ƭ', 'ư' => 'Ư', 'ƴ' => 'Ƴ', 'ƶ' => 'Ƶ', 'ƹ' => 'Ƹ', 'ƽ' => 'Ƽ', 'ƿ' => 'Ƿ', 'Dž' => 'DŽ', 'dž' => 'DŽ', 'Lj' => 'LJ', 'lj' => 'LJ', 'Nj' => 'NJ', 'nj' => 'NJ', 'ǎ' => 'Ǎ', 'ǐ' => 'Ǐ', 'ǒ' => 'Ǒ', 'ǔ' => 'Ǔ', 'ǖ' => 'Ǖ', 'ǘ' => 'Ǘ', 'ǚ' => 'Ǚ', 'ǜ' => 'Ǜ', 'ǝ' => 'Ǝ', 'ǟ' => 'Ǟ', 'ǡ' => 'Ǡ', 'ǣ' => 'Ǣ', 'ǥ' => 'Ǥ', 'ǧ' => 'Ǧ', 'ǩ' => 'Ǩ', 'ǫ' => 'Ǫ', 'ǭ' => 'Ǭ', 'ǯ' => 'Ǯ', 'Dz' => 'DZ', 'dz' => 'DZ', 'ǵ' => 'Ǵ', 'ǹ' => 'Ǹ', 'ǻ' => 'Ǻ', 'ǽ' => 'Ǽ', 'ǿ' => 'Ǿ', 'ȁ' => 'Ȁ', 'ȃ' => 'Ȃ', 'ȅ' => 'Ȅ', 'ȇ' => 'Ȇ', 'ȉ' => 'Ȉ', 'ȋ' => 'Ȋ', 'ȍ' => 'Ȍ', 'ȏ' => 'Ȏ', 'ȑ' => 'Ȑ', 'ȓ' => 'Ȓ', 'ȕ' => 'Ȕ', 'ȗ' => 'Ȗ', 'ș' => 'Ș', 'ț' => 'Ț', 'ȝ' => 'Ȝ', 'ȟ' => 'Ȟ', 'ȣ' => 'Ȣ', 'ȥ' => 'Ȥ', 'ȧ' => 'Ȧ', 'ȩ' => 'Ȩ', 'ȫ' => 'Ȫ', 'ȭ' => 'Ȭ', 'ȯ' => 'Ȯ', 'ȱ' => 'Ȱ', 'ȳ' => 'Ȳ', 'ȼ' => 'Ȼ', 'ȿ' => 'Ȿ', 'ɀ' => 'Ɀ', 'ɂ' => 'Ɂ', 'ɇ' => 'Ɇ', 'ɉ' => 'Ɉ', 'ɋ' => 'Ɋ', 'ɍ' => 'Ɍ', 'ɏ' => 'Ɏ', 'ɐ' => 'Ɐ', 'ɑ' => 'Ɑ', 'ɒ' => 'Ɒ', 'ɓ' => 'Ɓ', 'ɔ' => 'Ɔ', 'ɖ' => 'Ɖ', 'ɗ' => 'Ɗ', 'ə' => 'Ə', 'ɛ' => 'Ɛ', 'ɜ' => 'Ɜ', 'ɠ' => 'Ɠ', 'ɡ' => 'Ɡ', 'ɣ' => 'Ɣ', 'ɥ' => 'Ɥ', 'ɦ' => 'Ɦ', 'ɨ' => 'Ɨ', 'ɩ' => 'Ɩ', 'ɪ' => 'Ɪ', 'ɫ' => 'Ɫ', 'ɬ' => 'Ɬ', 'ɯ' => 'Ɯ', 'ɱ' => 'Ɱ', 'ɲ' => 'Ɲ', 'ɵ' => 'Ɵ', 'ɽ' => 'Ɽ', 'ʀ' => 'Ʀ', 'ʂ' => 'Ʂ', 'ʃ' => 'Ʃ', 'ʇ' => 'Ʇ', 'ʈ' => 'Ʈ', 'ʉ' => 'Ʉ', 'ʊ' => 'Ʊ', 'ʋ' => 'Ʋ', 'ʌ' => 'Ʌ', 'ʒ' => 'Ʒ', 'ʝ' => 'Ʝ', 'ʞ' => 'Ʞ', 'ͅ' => 'Ι', 'ͱ' => 'Ͱ', 'ͳ' => 'Ͳ', 'ͷ' => 'Ͷ', 'ͻ' => 'Ͻ', 'ͼ' => 'Ͼ', 'ͽ' => 'Ͽ', 'ά' => 'Ά', 'έ' => 'Έ', 'ή' => 'Ή', 'ί' => 'Ί', 'α' => 'Α', 'β' => 'Β', 'γ' => 'Γ', 'δ' => 'Δ', 'ε' => 'Ε', 'ζ' => 'Ζ', 'η' => 'Η', 'θ' => 'Θ', 'ι' => 'Ι', 'κ' => 'Κ', 'λ' => 'Λ', 'μ' => 'Μ', 'ν' => 'Ν', 'ξ' => 'Ξ', 'ο' => 'Ο', 'π' => 'Π', 'ρ' => 'Ρ', 'ς' => 'Σ', 'σ' => 'Σ', 'τ' => 'Τ', 'υ' => 'Υ', 'φ' => 'Φ', 'χ' => 'Χ', 'ψ' => 'Ψ', 'ω' => 'Ω', 'ϊ' => 'Ϊ', 'ϋ' => 'Ϋ', 'ό' => 'Ό', 'ύ' => 'Ύ', 'ώ' => 'Ώ', 'ϐ' => 'Β', 'ϑ' => 'Θ', 'ϕ' => 'Φ', 'ϖ' => 'Π', 'ϗ' => 'Ϗ', 'ϙ' => 'Ϙ', 'ϛ' => 'Ϛ', 'ϝ' => 'Ϝ', 'ϟ' => 'Ϟ', 'ϡ' => 'Ϡ', 'ϣ' => 'Ϣ', 'ϥ' => 'Ϥ', 'ϧ' => 'Ϧ', 'ϩ' => 'Ϩ', 'ϫ' => 'Ϫ', 'ϭ' => 'Ϭ', 'ϯ' => 'Ϯ', 'ϰ' => 'Κ', 'ϱ' => 'Ρ', 'ϲ' => 'Ϲ', 'ϳ' => 'Ϳ', 'ϵ' => 'Ε', 'ϸ' => 'Ϸ', 'ϻ' => 'Ϻ', 'а' => 'А', 'б' => 'Б', 'в' => 'В', 'г' => 'Г', 'д' => 'Д', 'е' => 'Е', 'ж' => 'Ж', 'з' => 'З', 'и' => 'И', 'й' => 'Й', 'к' => 'К', 'л' => 'Л', 'м' => 'М', 'н' => 'Н', 'о' => 'О', 'п' => 'П', 'р' => 'Р', 'с' => 'С', 'т' => 'Т', 'у' => 'У', 'ф' => 'Ф', 'х' => 'Х', 'ц' => 'Ц', 'ч' => 'Ч', 'ш' => 'Ш', 'щ' => 'Щ', 'ъ' => 'Ъ', 'ы' => 'Ы', 'ь' => 'Ь', 'э' => 'Э', 'ю' => 'Ю', 'я' => 'Я', 'ѐ' => 'Ѐ', 'ё' => 'Ё', 'ђ' => 'Ђ', 'ѓ' => 'Ѓ', 'є' => 'Є', 'ѕ' => 'Ѕ', 'і' => 'І', 'ї' => 'Ї', 'ј' => 'Ј', 'љ' => 'Љ', 'њ' => 'Њ', 'ћ' => 'Ћ', 'ќ' => 'Ќ', 'ѝ' => 'Ѝ', 'ў' => 'Ў', 'џ' => 'Џ', 'ѡ' => 'Ѡ', 'ѣ' => 'Ѣ', 'ѥ' => 'Ѥ', 'ѧ' => 'Ѧ', 'ѩ' => 'Ѩ', 'ѫ' => 'Ѫ', 'ѭ' => 'Ѭ', 'ѯ' => 'Ѯ', 'ѱ' => 'Ѱ', 'ѳ' => 'Ѳ', 'ѵ' => 'Ѵ', 'ѷ' => 'Ѷ', 'ѹ' => 'Ѹ', 'ѻ' => 'Ѻ', 'ѽ' => 'Ѽ', 'ѿ' => 'Ѿ', 'ҁ' => 'Ҁ', 'ҋ' => 'Ҋ', 'ҍ' => 'Ҍ', 'ҏ' => 'Ҏ', 'ґ' => 'Ґ', 'ғ' => 'Ғ', 'ҕ' => 'Ҕ', 'җ' => 'Җ', 'ҙ' => 'Ҙ', 'қ' => 'Қ', 'ҝ' => 'Ҝ', 'ҟ' => 'Ҟ', 'ҡ' => 'Ҡ', 'ң' => 'Ң', 'ҥ' => 'Ҥ', 'ҧ' => 'Ҧ', 'ҩ' => 'Ҩ', 'ҫ' => 'Ҫ', 'ҭ' => 'Ҭ', 'ү' => 'Ү', 'ұ' => 'Ұ', 'ҳ' => 'Ҳ', 'ҵ' => 'Ҵ', 'ҷ' => 'Ҷ', 'ҹ' => 'Ҹ', 'һ' => 'Һ', 'ҽ' => 'Ҽ', 'ҿ' => 'Ҿ', 'ӂ' => 'Ӂ', 'ӄ' => 'Ӄ', 'ӆ' => 'Ӆ', 'ӈ' => 'Ӈ', 'ӊ' => 'Ӊ', 'ӌ' => 'Ӌ', 'ӎ' => 'Ӎ', 'ӏ' => 'Ӏ', 'ӑ' => 'Ӑ', 'ӓ' => 'Ӓ', 'ӕ' => 'Ӕ', 'ӗ' => 'Ӗ', 'ә' => 'Ә', 'ӛ' => 'Ӛ', 'ӝ' => 'Ӝ', 'ӟ' => 'Ӟ', 'ӡ' => 'Ӡ', 'ӣ' => 'Ӣ', 'ӥ' => 'Ӥ', 'ӧ' => 'Ӧ', 'ө' => 'Ө', 'ӫ' => 'Ӫ', 'ӭ' => 'Ӭ', 'ӯ' => 'Ӯ', 'ӱ' => 'Ӱ', 'ӳ' => 'Ӳ', 'ӵ' => 'Ӵ', 'ӷ' => 'Ӷ', 'ӹ' => 'Ӹ', 'ӻ' => 'Ӻ', 'ӽ' => 'Ӽ', 'ӿ' => 'Ӿ', 'ԁ' => 'Ԁ', 'ԃ' => 'Ԃ', 'ԅ' => 'Ԅ', 'ԇ' => 'Ԇ', 'ԉ' => 'Ԉ', 'ԋ' => 'Ԋ', 'ԍ' => 'Ԍ', 'ԏ' => 'Ԏ', 'ԑ' => 'Ԑ', 'ԓ' => 'Ԓ', 'ԕ' => 'Ԕ', 'ԗ' => 'Ԗ', 'ԙ' => 'Ԙ', 'ԛ' => 'Ԛ', 'ԝ' => 'Ԝ', 'ԟ' => 'Ԟ', 'ԡ' => 'Ԡ', 'ԣ' => 'Ԣ', 'ԥ' => 'Ԥ', 'ԧ' => 'Ԧ', 'ԩ' => 'Ԩ', 'ԫ' => 'Ԫ', 'ԭ' => 'Ԭ', 'ԯ' => 'Ԯ', 'ա' => 'Ա', 'բ' => 'Բ', 'գ' => 'Գ', 'դ' => 'Դ', 'ե' => 'Ե', 'զ' => 'Զ', 'է' => 'Է', 'ը' => 'Ը', 'թ' => 'Թ', 'ժ' => 'Ժ', 'ի' => 'Ի', 'լ' => 'Լ', 'խ' => 'Խ', 'ծ' => 'Ծ', 'կ' => 'Կ', 'հ' => 'Հ', 'ձ' => 'Ձ', 'ղ' => 'Ղ', 'ճ' => 'Ճ', 'մ' => 'Մ', 'յ' => 'Յ', 'ն' => 'Ն', 'շ' => 'Շ', 'ո' => 'Ո', 'չ' => 'Չ', 'պ' => 'Պ', 'ջ' => 'Ջ', 'ռ' => 'Ռ', 'ս' => 'Ս', 'վ' => 'Վ', 'տ' => 'Տ', 'ր' => 'Ր', 'ց' => 'Ց', 'ւ' => 'Ւ', 'փ' => 'Փ', 'ք' => 'Ք', 'օ' => 'Օ', 'ֆ' => 'Ֆ', 'ა' => 'Ა', 'ბ' => 'Ბ', 'გ' => 'Გ', 'დ' => 'Დ', 'ე' => 'Ე', 'ვ' => 'Ვ', 'ზ' => 'Ზ', 'თ' => 'Თ', 'ი' => 'Ი', 'კ' => 'Კ', 'ლ' => 'Ლ', 'მ' => 'Მ', 'ნ' => 'Ნ', 'ო' => 'Ო', 'პ' => 'Პ', 'ჟ' => 'Ჟ', 'რ' => 'Რ', 'ს' => 'Ს', 'ტ' => 'Ტ', 'უ' => 'Უ', 'ფ' => 'Ფ', 'ქ' => 'Ქ', 'ღ' => 'Ღ', 'ყ' => 'Ყ', 'შ' => 'Შ', 'ჩ' => 'Ჩ', 'ც' => 'Ც', 'ძ' => 'Ძ', 'წ' => 'Წ', 'ჭ' => 'Ჭ', 'ხ' => 'Ხ', 'ჯ' => 'Ჯ', 'ჰ' => 'Ჰ', 'ჱ' => 'Ჱ', 'ჲ' => 'Ჲ', 'ჳ' => 'Ჳ', 'ჴ' => 'Ჴ', 'ჵ' => 'Ჵ', 'ჶ' => 'Ჶ', 'ჷ' => 'Ჷ', 'ჸ' => 'Ჸ', 'ჹ' => 'Ჹ', 'ჺ' => 'Ჺ', 'ჽ' => 'Ჽ', 'ჾ' => 'Ჾ', 'ჿ' => 'Ჿ', 'ᏸ' => 'Ᏸ', 'ᏹ' => 'Ᏹ', 'ᏺ' => 'Ᏺ', 'ᏻ' => 'Ᏻ', 'ᏼ' => 'Ᏼ', 'ᏽ' => 'Ᏽ', 'ᲀ' => 'В', 'ᲁ' => 'Д', 'ᲂ' => 'О', 'ᲃ' => 'С', 'ᲄ' => 'Т', 'ᲅ' => 'Т', 'ᲆ' => 'Ъ', 'ᲇ' => 'Ѣ', 'ᲈ' => 'Ꙋ', 'ᵹ' => 'Ᵹ', 'ᵽ' => 'Ᵽ', 'ᶎ' => 'Ᶎ', 'ḁ' => 'Ḁ', 'ḃ' => 'Ḃ', 'ḅ' => 'Ḅ', 'ḇ' => 'Ḇ', 'ḉ' => 'Ḉ', 'ḋ' => 'Ḋ', 'ḍ' => 'Ḍ', 'ḏ' => 'Ḏ', 'ḑ' => 'Ḑ', 'ḓ' => 'Ḓ', 'ḕ' => 'Ḕ', 'ḗ' => 'Ḗ', 'ḙ' => 'Ḙ', 'ḛ' => 'Ḛ', 'ḝ' => 'Ḝ', 'ḟ' => 'Ḟ', 'ḡ' => 'Ḡ', 'ḣ' => 'Ḣ', 'ḥ' => 'Ḥ', 'ḧ' => 'Ḧ', 'ḩ' => 'Ḩ', 'ḫ' => 'Ḫ', 'ḭ' => 'Ḭ', 'ḯ' => 'Ḯ', 'ḱ' => 'Ḱ', 'ḳ' => 'Ḳ', 'ḵ' => 'Ḵ', 'ḷ' => 'Ḷ', 'ḹ' => 'Ḹ', 'ḻ' => 'Ḻ', 'ḽ' => 'Ḽ', 'ḿ' => 'Ḿ', 'ṁ' => 'Ṁ', 'ṃ' => 'Ṃ', 'ṅ' => 'Ṅ', 'ṇ' => 'Ṇ', 'ṉ' => 'Ṉ', 'ṋ' => 'Ṋ', 'ṍ' => 'Ṍ', 'ṏ' => 'Ṏ', 'ṑ' => 'Ṑ', 'ṓ' => 'Ṓ', 'ṕ' => 'Ṕ', 'ṗ' => 'Ṗ', 'ṙ' => 'Ṙ', 'ṛ' => 'Ṛ', 'ṝ' => 'Ṝ', 'ṟ' => 'Ṟ', 'ṡ' => 'Ṡ', 'ṣ' => 'Ṣ', 'ṥ' => 'Ṥ', 'ṧ' => 'Ṧ', 'ṩ' => 'Ṩ', 'ṫ' => 'Ṫ', 'ṭ' => 'Ṭ', 'ṯ' => 'Ṯ', 'ṱ' => 'Ṱ', 'ṳ' => 'Ṳ', 'ṵ' => 'Ṵ', 'ṷ' => 'Ṷ', 'ṹ' => 'Ṹ', 'ṻ' => 'Ṻ', 'ṽ' => 'Ṽ', 'ṿ' => 'Ṿ', 'ẁ' => 'Ẁ', 'ẃ' => 'Ẃ', 'ẅ' => 'Ẅ', 'ẇ' => 'Ẇ', 'ẉ' => 'Ẉ', 'ẋ' => 'Ẋ', 'ẍ' => 'Ẍ', 'ẏ' => 'Ẏ', 'ẑ' => 'Ẑ', 'ẓ' => 'Ẓ', 'ẕ' => 'Ẕ', 'ẛ' => 'Ṡ', 'ạ' => 'Ạ', 'ả' => 'Ả', 'ấ' => 'Ấ', 'ầ' => 'Ầ', 'ẩ' => 'Ẩ', 'ẫ' => 'Ẫ', 'ậ' => 'Ậ', 'ắ' => 'Ắ', 'ằ' => 'Ằ', 'ẳ' => 'Ẳ', 'ẵ' => 'Ẵ', 'ặ' => 'Ặ', 'ẹ' => 'Ẹ', 'ẻ' => 'Ẻ', 'ẽ' => 'Ẽ', 'ế' => 'Ế', 'ề' => 'Ề', 'ể' => 'Ể', 'ễ' => 'Ễ', 'ệ' => 'Ệ', 'ỉ' => 'Ỉ', 'ị' => 'Ị', 'ọ' => 'Ọ', 'ỏ' => 'Ỏ', 'ố' => 'Ố', 'ồ' => 'Ồ', 'ổ' => 'Ổ', 'ỗ' => 'Ỗ', 'ộ' => 'Ộ', 'ớ' => 'Ớ', 'ờ' => 'Ờ', 'ở' => 'Ở', 'ỡ' => 'Ỡ', 'ợ' => 'Ợ', 'ụ' => 'Ụ', 'ủ' => 'Ủ', 'ứ' => 'Ứ', 'ừ' => 'Ừ', 'ử' => 'Ử', 'ữ' => 'Ữ', 'ự' => 'Ự', 'ỳ' => 'Ỳ', 'ỵ' => 'Ỵ', 'ỷ' => 'Ỷ', 'ỹ' => 'Ỹ', 'ỻ' => 'Ỻ', 'ỽ' => 'Ỽ', 'ỿ' => 'Ỿ', 'ἀ' => 'Ἀ', 'ἁ' => 'Ἁ', 'ἂ' => 'Ἂ', 'ἃ' => 'Ἃ', 'ἄ' => 'Ἄ', 'ἅ' => 'Ἅ', 'ἆ' => 'Ἆ', 'ἇ' => 'Ἇ', 'ἐ' => 'Ἐ', 'ἑ' => 'Ἑ', 'ἒ' => 'Ἒ', 'ἓ' => 'Ἓ', 'ἔ' => 'Ἔ', 'ἕ' => 'Ἕ', 'ἠ' => 'Ἠ', 'ἡ' => 'Ἡ', 'ἢ' => 'Ἢ', 'ἣ' => 'Ἣ', 'ἤ' => 'Ἤ', 'ἥ' => 'Ἥ', 'ἦ' => 'Ἦ', 'ἧ' => 'Ἧ', 'ἰ' => 'Ἰ', 'ἱ' => 'Ἱ', 'ἲ' => 'Ἲ', 'ἳ' => 'Ἳ', 'ἴ' => 'Ἴ', 'ἵ' => 'Ἵ', 'ἶ' => 'Ἶ', 'ἷ' => 'Ἷ', 'ὀ' => 'Ὀ', 'ὁ' => 'Ὁ', 'ὂ' => 'Ὂ', 'ὃ' => 'Ὃ', 'ὄ' => 'Ὄ', 'ὅ' => 'Ὅ', 'ὑ' => 'Ὑ', 'ὓ' => 'Ὓ', 'ὕ' => 'Ὕ', 'ὗ' => 'Ὗ', 'ὠ' => 'Ὠ', 'ὡ' => 'Ὡ', 'ὢ' => 'Ὢ', 'ὣ' => 'Ὣ', 'ὤ' => 'Ὤ', 'ὥ' => 'Ὥ', 'ὦ' => 'Ὦ', 'ὧ' => 'Ὧ', 'ὰ' => 'Ὰ', 'ά' => 'Ά', 'ὲ' => 'Ὲ', 'έ' => 'Έ', 'ὴ' => 'Ὴ', 'ή' => 'Ή', 'ὶ' => 'Ὶ', 'ί' => 'Ί', 'ὸ' => 'Ὸ', 'ό' => 'Ό', 'ὺ' => 'Ὺ', 'ύ' => 'Ύ', 'ὼ' => 'Ὼ', 'ώ' => 'Ώ', 'ᾀ' => 'ἈΙ', 'ᾁ' => 'ἉΙ', 'ᾂ' => 'ἊΙ', 'ᾃ' => 'ἋΙ', 'ᾄ' => 'ἌΙ', 'ᾅ' => 'ἍΙ', 'ᾆ' => 'ἎΙ', 'ᾇ' => 'ἏΙ', 'ᾐ' => 'ἨΙ', 'ᾑ' => 'ἩΙ', 'ᾒ' => 'ἪΙ', 'ᾓ' => 'ἫΙ', 'ᾔ' => 'ἬΙ', 'ᾕ' => 'ἭΙ', 'ᾖ' => 'ἮΙ', 'ᾗ' => 'ἯΙ', 'ᾠ' => 'ὨΙ', 'ᾡ' => 'ὩΙ', 'ᾢ' => 'ὪΙ', 'ᾣ' => 'ὫΙ', 'ᾤ' => 'ὬΙ', 'ᾥ' => 'ὭΙ', 'ᾦ' => 'ὮΙ', 'ᾧ' => 'ὯΙ', 'ᾰ' => 'Ᾰ', 'ᾱ' => 'Ᾱ', 'ᾳ' => 'ΑΙ', 'ι' => 'Ι', 'ῃ' => 'ΗΙ', 'ῐ' => 'Ῐ', 'ῑ' => 'Ῑ', 'ῠ' => 'Ῠ', 'ῡ' => 'Ῡ', 'ῥ' => 'Ῥ', 'ῳ' => 'ΩΙ', 'ⅎ' => 'Ⅎ', 'ⅰ' => 'Ⅰ', 'ⅱ' => 'Ⅱ', 'ⅲ' => 'Ⅲ', 'ⅳ' => 'Ⅳ', 'ⅴ' => 'Ⅴ', 'ⅵ' => 'Ⅵ', 'ⅶ' => 'Ⅶ', 'ⅷ' => 'Ⅷ', 'ⅸ' => 'Ⅸ', 'ⅹ' => 'Ⅹ', 'ⅺ' => 'Ⅺ', 'ⅻ' => 'Ⅻ', 'ⅼ' => 'Ⅼ', 'ⅽ' => 'Ⅽ', 'ⅾ' => 'Ⅾ', 'ⅿ' => 'Ⅿ', 'ↄ' => 'Ↄ', 'ⓐ' => 'Ⓐ', 'ⓑ' => 'Ⓑ', 'ⓒ' => 'Ⓒ', 'ⓓ' => 'Ⓓ', 'ⓔ' => 'Ⓔ', 'ⓕ' => 'Ⓕ', 'ⓖ' => 'Ⓖ', 'ⓗ' => 'Ⓗ', 'ⓘ' => 'Ⓘ', 'ⓙ' => 'Ⓙ', 'ⓚ' => 'Ⓚ', 'ⓛ' => 'Ⓛ', 'ⓜ' => 'Ⓜ', 'ⓝ' => 'Ⓝ', 'ⓞ' => 'Ⓞ', 'ⓟ' => 'Ⓟ', 'ⓠ' => 'Ⓠ', 'ⓡ' => 'Ⓡ', 'ⓢ' => 'Ⓢ', 'ⓣ' => 'Ⓣ', 'ⓤ' => 'Ⓤ', 'ⓥ' => 'Ⓥ', 'ⓦ' => 'Ⓦ', 'ⓧ' => 'Ⓧ', 'ⓨ' => 'Ⓨ', 'ⓩ' => 'Ⓩ', 'ⰰ' => 'Ⰰ', 'ⰱ' => 'Ⰱ', 'ⰲ' => 'Ⰲ', 'ⰳ' => 'Ⰳ', 'ⰴ' => 'Ⰴ', 'ⰵ' => 'Ⰵ', 'ⰶ' => 'Ⰶ', 'ⰷ' => 'Ⰷ', 'ⰸ' => 'Ⰸ', 'ⰹ' => 'Ⰹ', 'ⰺ' => 'Ⰺ', 'ⰻ' => 'Ⰻ', 'ⰼ' => 'Ⰼ', 'ⰽ' => 'Ⰽ', 'ⰾ' => 'Ⰾ', 'ⰿ' => 'Ⰿ', 'ⱀ' => 'Ⱀ', 'ⱁ' => 'Ⱁ', 'ⱂ' => 'Ⱂ', 'ⱃ' => 'Ⱃ', 'ⱄ' => 'Ⱄ', 'ⱅ' => 'Ⱅ', 'ⱆ' => 'Ⱆ', 'ⱇ' => 'Ⱇ', 'ⱈ' => 'Ⱈ', 'ⱉ' => 'Ⱉ', 'ⱊ' => 'Ⱊ', 'ⱋ' => 'Ⱋ', 'ⱌ' => 'Ⱌ', 'ⱍ' => 'Ⱍ', 'ⱎ' => 'Ⱎ', 'ⱏ' => 'Ⱏ', 'ⱐ' => 'Ⱐ', 'ⱑ' => 'Ⱑ', 'ⱒ' => 'Ⱒ', 'ⱓ' => 'Ⱓ', 'ⱔ' => 'Ⱔ', 'ⱕ' => 'Ⱕ', 'ⱖ' => 'Ⱖ', 'ⱗ' => 'Ⱗ', 'ⱘ' => 'Ⱘ', 'ⱙ' => 'Ⱙ', 'ⱚ' => 'Ⱚ', 'ⱛ' => 'Ⱛ', 'ⱜ' => 'Ⱜ', 'ⱝ' => 'Ⱝ', 'ⱞ' => 'Ⱞ', 'ⱡ' => 'Ⱡ', 'ⱥ' => 'Ⱥ', 'ⱦ' => 'Ⱦ', 'ⱨ' => 'Ⱨ', 'ⱪ' => 'Ⱪ', 'ⱬ' => 'Ⱬ', 'ⱳ' => 'Ⱳ', 'ⱶ' => 'Ⱶ', 'ⲁ' => 'Ⲁ', 'ⲃ' => 'Ⲃ', 'ⲅ' => 'Ⲅ', 'ⲇ' => 'Ⲇ', 'ⲉ' => 'Ⲉ', 'ⲋ' => 'Ⲋ', 'ⲍ' => 'Ⲍ', 'ⲏ' => 'Ⲏ', 'ⲑ' => 'Ⲑ', 'ⲓ' => 'Ⲓ', 'ⲕ' => 'Ⲕ', 'ⲗ' => 'Ⲗ', 'ⲙ' => 'Ⲙ', 'ⲛ' => 'Ⲛ', 'ⲝ' => 'Ⲝ', 'ⲟ' => 'Ⲟ', 'ⲡ' => 'Ⲡ', 'ⲣ' => 'Ⲣ', 'ⲥ' => 'Ⲥ', 'ⲧ' => 'Ⲧ', 'ⲩ' => 'Ⲩ', 'ⲫ' => 'Ⲫ', 'ⲭ' => 'Ⲭ', 'ⲯ' => 'Ⲯ', 'ⲱ' => 'Ⲱ', 'ⲳ' => 'Ⲳ', 'ⲵ' => 'Ⲵ', 'ⲷ' => 'Ⲷ', 'ⲹ' => 'Ⲹ', 'ⲻ' => 'Ⲻ', 'ⲽ' => 'Ⲽ', 'ⲿ' => 'Ⲿ', 'ⳁ' => 'Ⳁ', 'ⳃ' => 'Ⳃ', 'ⳅ' => 'Ⳅ', 'ⳇ' => 'Ⳇ', 'ⳉ' => 'Ⳉ', 'ⳋ' => 'Ⳋ', 'ⳍ' => 'Ⳍ', 'ⳏ' => 'Ⳏ', 'ⳑ' => 'Ⳑ', 'ⳓ' => 'Ⳓ', 'ⳕ' => 'Ⳕ', 'ⳗ' => 'Ⳗ', 'ⳙ' => 'Ⳙ', 'ⳛ' => 'Ⳛ', 'ⳝ' => 'Ⳝ', 'ⳟ' => 'Ⳟ', 'ⳡ' => 'Ⳡ', 'ⳣ' => 'Ⳣ', 'ⳬ' => 'Ⳬ', 'ⳮ' => 'Ⳮ', 'ⳳ' => 'Ⳳ', 'ⴀ' => 'Ⴀ', 'ⴁ' => 'Ⴁ', 'ⴂ' => 'Ⴂ', 'ⴃ' => 'Ⴃ', 'ⴄ' => 'Ⴄ', 'ⴅ' => 'Ⴅ', 'ⴆ' => 'Ⴆ', 'ⴇ' => 'Ⴇ', 'ⴈ' => 'Ⴈ', 'ⴉ' => 'Ⴉ', 'ⴊ' => 'Ⴊ', 'ⴋ' => 'Ⴋ', 'ⴌ' => 'Ⴌ', 'ⴍ' => 'Ⴍ', 'ⴎ' => 'Ⴎ', 'ⴏ' => 'Ⴏ', 'ⴐ' => 'Ⴐ', 'ⴑ' => 'Ⴑ', 'ⴒ' => 'Ⴒ', 'ⴓ' => 'Ⴓ', 'ⴔ' => 'Ⴔ', 'ⴕ' => 'Ⴕ', 'ⴖ' => 'Ⴖ', 'ⴗ' => 'Ⴗ', 'ⴘ' => 'Ⴘ', 'ⴙ' => 'Ⴙ', 'ⴚ' => 'Ⴚ', 'ⴛ' => 'Ⴛ', 'ⴜ' => 'Ⴜ', 'ⴝ' => 'Ⴝ', 'ⴞ' => 'Ⴞ', 'ⴟ' => 'Ⴟ', 'ⴠ' => 'Ⴠ', 'ⴡ' => 'Ⴡ', 'ⴢ' => 'Ⴢ', 'ⴣ' => 'Ⴣ', 'ⴤ' => 'Ⴤ', 'ⴥ' => 'Ⴥ', 'ⴧ' => 'Ⴧ', 'ⴭ' => 'Ⴭ', 'ꙁ' => 'Ꙁ', 'ꙃ' => 'Ꙃ', 'ꙅ' => 'Ꙅ', 'ꙇ' => 'Ꙇ', 'ꙉ' => 'Ꙉ', 'ꙋ' => 'Ꙋ', 'ꙍ' => 'Ꙍ', 'ꙏ' => 'Ꙏ', 'ꙑ' => 'Ꙑ', 'ꙓ' => 'Ꙓ', 'ꙕ' => 'Ꙕ', 'ꙗ' => 'Ꙗ', 'ꙙ' => 'Ꙙ', 'ꙛ' => 'Ꙛ', 'ꙝ' => 'Ꙝ', 'ꙟ' => 'Ꙟ', 'ꙡ' => 'Ꙡ', 'ꙣ' => 'Ꙣ', 'ꙥ' => 'Ꙥ', 'ꙧ' => 'Ꙧ', 'ꙩ' => 'Ꙩ', 'ꙫ' => 'Ꙫ', 'ꙭ' => 'Ꙭ', 'ꚁ' => 'Ꚁ', 'ꚃ' => 'Ꚃ', 'ꚅ' => 'Ꚅ', 'ꚇ' => 'Ꚇ', 'ꚉ' => 'Ꚉ', 'ꚋ' => 'Ꚋ', 'ꚍ' => 'Ꚍ', 'ꚏ' => 'Ꚏ', 'ꚑ' => 'Ꚑ', 'ꚓ' => 'Ꚓ', 'ꚕ' => 'Ꚕ', 'ꚗ' => 'Ꚗ', 'ꚙ' => 'Ꚙ', 'ꚛ' => 'Ꚛ', 'ꜣ' => 'Ꜣ', 'ꜥ' => 'Ꜥ', 'ꜧ' => 'Ꜧ', 'ꜩ' => 'Ꜩ', 'ꜫ' => 'Ꜫ', 'ꜭ' => 'Ꜭ', 'ꜯ' => 'Ꜯ', 'ꜳ' => 'Ꜳ', 'ꜵ' => 'Ꜵ', 'ꜷ' => 'Ꜷ', 'ꜹ' => 'Ꜹ', 'ꜻ' => 'Ꜻ', 'ꜽ' => 'Ꜽ', 'ꜿ' => 'Ꜿ', 'ꝁ' => 'Ꝁ', 'ꝃ' => 'Ꝃ', 'ꝅ' => 'Ꝅ', 'ꝇ' => 'Ꝇ', 'ꝉ' => 'Ꝉ', 'ꝋ' => 'Ꝋ', 'ꝍ' => 'Ꝍ', 'ꝏ' => 'Ꝏ', 'ꝑ' => 'Ꝑ', 'ꝓ' => 'Ꝓ', 'ꝕ' => 'Ꝕ', 'ꝗ' => 'Ꝗ', 'ꝙ' => 'Ꝙ', 'ꝛ' => 'Ꝛ', 'ꝝ' => 'Ꝝ', 'ꝟ' => 'Ꝟ', 'ꝡ' => 'Ꝡ', 'ꝣ' => 'Ꝣ', 'ꝥ' => 'Ꝥ', 'ꝧ' => 'Ꝧ', 'ꝩ' => 'Ꝩ', 'ꝫ' => 'Ꝫ', 'ꝭ' => 'Ꝭ', 'ꝯ' => 'Ꝯ', 'ꝺ' => 'Ꝺ', 'ꝼ' => 'Ꝼ', 'ꝿ' => 'Ꝿ', 'ꞁ' => 'Ꞁ', 'ꞃ' => 'Ꞃ', 'ꞅ' => 'Ꞅ', 'ꞇ' => 'Ꞇ', 'ꞌ' => 'Ꞌ', 'ꞑ' => 'Ꞑ', 'ꞓ' => 'Ꞓ', 'ꞔ' => 'Ꞔ', 'ꞗ' => 'Ꞗ', 'ꞙ' => 'Ꞙ', 'ꞛ' => 'Ꞛ', 'ꞝ' => 'Ꞝ', 'ꞟ' => 'Ꞟ', 'ꞡ' => 'Ꞡ', 'ꞣ' => 'Ꞣ', 'ꞥ' => 'Ꞥ', 'ꞧ' => 'Ꞧ', 'ꞩ' => 'Ꞩ', 'ꞵ' => 'Ꞵ', 'ꞷ' => 'Ꞷ', 'ꞹ' => 'Ꞹ', 'ꞻ' => 'Ꞻ', 'ꞽ' => 'Ꞽ', 'ꞿ' => 'Ꞿ', 'ꟃ' => 'Ꟃ', 'ꟈ' => 'Ꟈ', 'ꟊ' => 'Ꟊ', 'ꟶ' => 'Ꟶ', 'ꭓ' => 'Ꭓ', 'ꭰ' => 'Ꭰ', 'ꭱ' => 'Ꭱ', 'ꭲ' => 'Ꭲ', 'ꭳ' => 'Ꭳ', 'ꭴ' => 'Ꭴ', 'ꭵ' => 'Ꭵ', 'ꭶ' => 'Ꭶ', 'ꭷ' => 'Ꭷ', 'ꭸ' => 'Ꭸ', 'ꭹ' => 'Ꭹ', 'ꭺ' => 'Ꭺ', 'ꭻ' => 'Ꭻ', 'ꭼ' => 'Ꭼ', 'ꭽ' => 'Ꭽ', 'ꭾ' => 'Ꭾ', 'ꭿ' => 'Ꭿ', 'ꮀ' => 'Ꮀ', 'ꮁ' => 'Ꮁ', 'ꮂ' => 'Ꮂ', 'ꮃ' => 'Ꮃ', 'ꮄ' => 'Ꮄ', 'ꮅ' => 'Ꮅ', 'ꮆ' => 'Ꮆ', 'ꮇ' => 'Ꮇ', 'ꮈ' => 'Ꮈ', 'ꮉ' => 'Ꮉ', 'ꮊ' => 'Ꮊ', 'ꮋ' => 'Ꮋ', 'ꮌ' => 'Ꮌ', 'ꮍ' => 'Ꮍ', 'ꮎ' => 'Ꮎ', 'ꮏ' => 'Ꮏ', 'ꮐ' => 'Ꮐ', 'ꮑ' => 'Ꮑ', 'ꮒ' => 'Ꮒ', 'ꮓ' => 'Ꮓ', 'ꮔ' => 'Ꮔ', 'ꮕ' => 'Ꮕ', 'ꮖ' => 'Ꮖ', 'ꮗ' => 'Ꮗ', 'ꮘ' => 'Ꮘ', 'ꮙ' => 'Ꮙ', 'ꮚ' => 'Ꮚ', 'ꮛ' => 'Ꮛ', 'ꮜ' => 'Ꮜ', 'ꮝ' => 'Ꮝ', 'ꮞ' => 'Ꮞ', 'ꮟ' => 'Ꮟ', 'ꮠ' => 'Ꮠ', 'ꮡ' => 'Ꮡ', 'ꮢ' => 'Ꮢ', 'ꮣ' => 'Ꮣ', 'ꮤ' => 'Ꮤ', 'ꮥ' => 'Ꮥ', 'ꮦ' => 'Ꮦ', 'ꮧ' => 'Ꮧ', 'ꮨ' => 'Ꮨ', 'ꮩ' => 'Ꮩ', 'ꮪ' => 'Ꮪ', 'ꮫ' => 'Ꮫ', 'ꮬ' => 'Ꮬ', 'ꮭ' => 'Ꮭ', 'ꮮ' => 'Ꮮ', 'ꮯ' => 'Ꮯ', 'ꮰ' => 'Ꮰ', 'ꮱ' => 'Ꮱ', 'ꮲ' => 'Ꮲ', 'ꮳ' => 'Ꮳ', 'ꮴ' => 'Ꮴ', 'ꮵ' => 'Ꮵ', 'ꮶ' => 'Ꮶ', 'ꮷ' => 'Ꮷ', 'ꮸ' => 'Ꮸ', 'ꮹ' => 'Ꮹ', 'ꮺ' => 'Ꮺ', 'ꮻ' => 'Ꮻ', 'ꮼ' => 'Ꮼ', 'ꮽ' => 'Ꮽ', 'ꮾ' => 'Ꮾ', 'ꮿ' => 'Ꮿ', 'a' => 'A', 'b' => 'B', 'c' => 'C', 'd' => 'D', 'e' => 'E', 'f' => 'F', 'g' => 'G', 'h' => 'H', 'i' => 'I', 'j' => 'J', 'k' => 'K', 'l' => 'L', 'm' => 'M', 'n' => 'N', 'o' => 'O', 'p' => 'P', 'q' => 'Q', 'r' => 'R', 's' => 'S', 't' => 'T', 'u' => 'U', 'v' => 'V', 'w' => 'W', 'x' => 'X', 'y' => 'Y', 'z' => 'Z', '𐐨' => '𐐀', '𐐩' => '𐐁', '𐐪' => '𐐂', '𐐫' => '𐐃', '𐐬' => '𐐄', '𐐭' => '𐐅', '𐐮' => '𐐆', '𐐯' => '𐐇', '𐐰' => '𐐈', '𐐱' => '𐐉', '𐐲' => '𐐊', '𐐳' => '𐐋', '𐐴' => '𐐌', '𐐵' => '𐐍', '𐐶' => '𐐎', '𐐷' => '𐐏', '𐐸' => '𐐐', '𐐹' => '𐐑', '𐐺' => '𐐒', '𐐻' => '𐐓', '𐐼' => '𐐔', '𐐽' => '𐐕', '𐐾' => '𐐖', '𐐿' => '𐐗', '𐑀' => '𐐘', '𐑁' => '𐐙', '𐑂' => '𐐚', '𐑃' => '𐐛', '𐑄' => '𐐜', '𐑅' => '𐐝', '𐑆' => '𐐞', '𐑇' => '𐐟', '𐑈' => '𐐠', '𐑉' => '𐐡', '𐑊' => '𐐢', '𐑋' => '𐐣', '𐑌' => '𐐤', '𐑍' => '𐐥', '𐑎' => '𐐦', '𐑏' => '𐐧', '𐓘' => '𐒰', '𐓙' => '𐒱', '𐓚' => '𐒲', '𐓛' => '𐒳', '𐓜' => '𐒴', '𐓝' => '𐒵', '𐓞' => '𐒶', '𐓟' => '𐒷', '𐓠' => '𐒸', '𐓡' => '𐒹', '𐓢' => '𐒺', '𐓣' => '𐒻', '𐓤' => '𐒼', '𐓥' => '𐒽', '𐓦' => '𐒾', '𐓧' => '𐒿', '𐓨' => '𐓀', '𐓩' => '𐓁', '𐓪' => '𐓂', '𐓫' => '𐓃', '𐓬' => '𐓄', '𐓭' => '𐓅', '𐓮' => '𐓆', '𐓯' => '𐓇', '𐓰' => '𐓈', '𐓱' => '𐓉', '𐓲' => '𐓊', '𐓳' => '𐓋', '𐓴' => '𐓌', '𐓵' => '𐓍', '𐓶' => '𐓎', '𐓷' => '𐓏', '𐓸' => '𐓐', '𐓹' => '𐓑', '𐓺' => '𐓒', '𐓻' => '𐓓', '𐳀' => '𐲀', '𐳁' => '𐲁', '𐳂' => '𐲂', '𐳃' => '𐲃', '𐳄' => '𐲄', '𐳅' => '𐲅', '𐳆' => '𐲆', '𐳇' => '𐲇', '𐳈' => '𐲈', '𐳉' => '𐲉', '𐳊' => '𐲊', '𐳋' => '𐲋', '𐳌' => '𐲌', '𐳍' => '𐲍', '𐳎' => '𐲎', '𐳏' => '𐲏', '𐳐' => '𐲐', '𐳑' => '𐲑', '𐳒' => '𐲒', '𐳓' => '𐲓', '𐳔' => '𐲔', '𐳕' => '𐲕', '𐳖' => '𐲖', '𐳗' => '𐲗', '𐳘' => '𐲘', '𐳙' => '𐲙', '𐳚' => '𐲚', '𐳛' => '𐲛', '𐳜' => '𐲜', '𐳝' => '𐲝', '𐳞' => '𐲞', '𐳟' => '𐲟', '𐳠' => '𐲠', '𐳡' => '𐲡', '𐳢' => '𐲢', '𐳣' => '𐲣', '𐳤' => '𐲤', '𐳥' => '𐲥', '𐳦' => '𐲦', '𐳧' => '𐲧', '𐳨' => '𐲨', '𐳩' => '𐲩', '𐳪' => '𐲪', '𐳫' => '𐲫', '𐳬' => '𐲬', '𐳭' => '𐲭', '𐳮' => '𐲮', '𐳯' => '𐲯', '𐳰' => '𐲰', '𐳱' => '𐲱', '𐳲' => '𐲲', '𑣀' => '𑢠', '𑣁' => '𑢡', '𑣂' => '𑢢', '𑣃' => '𑢣', '𑣄' => '𑢤', '𑣅' => '𑢥', '𑣆' => '𑢦', '𑣇' => '𑢧', '𑣈' => '𑢨', '𑣉' => '𑢩', '𑣊' => '𑢪', '𑣋' => '𑢫', '𑣌' => '𑢬', '𑣍' => '𑢭', '𑣎' => '𑢮', '𑣏' => '𑢯', '𑣐' => '𑢰', '𑣑' => '𑢱', '𑣒' => '𑢲', '𑣓' => '𑢳', '𑣔' => '𑢴', '𑣕' => '𑢵', '𑣖' => '𑢶', '𑣗' => '𑢷', '𑣘' => '𑢸', '𑣙' => '𑢹', '𑣚' => '𑢺', '𑣛' => '𑢻', '𑣜' => '𑢼', '𑣝' => '𑢽', '𑣞' => '𑢾', '𑣟' => '𑢿', '𖹠' => '𖹀', '𖹡' => '𖹁', '𖹢' => '𖹂', '𖹣' => '𖹃', '𖹤' => '𖹄', '𖹥' => '𖹅', '𖹦' => '𖹆', '𖹧' => '𖹇', '𖹨' => '𖹈', '𖹩' => '𖹉', '𖹪' => '𖹊', '𖹫' => '𖹋', '𖹬' => '𖹌', '𖹭' => '𖹍', '𖹮' => '𖹎', '𖹯' => '𖹏', '𖹰' => '𖹐', '𖹱' => '𖹑', '𖹲' => '𖹒', '𖹳' => '𖹓', '𖹴' => '𖹔', '𖹵' => '𖹕', '𖹶' => '𖹖', '𖹷' => '𖹗', '𖹸' => '𖹘', '𖹹' => '𖹙', '𖹺' => '𖹚', '𖹻' => '𖹛', '𖹼' => '𖹜', '𖹽' => '𖹝', '𖹾' => '𖹞', '𖹿' => '𖹟', '𞤢' => '𞤀', '𞤣' => '𞤁', '𞤤' => '𞤂', '𞤥' => '𞤃', '𞤦' => '𞤄', '𞤧' => '𞤅', '𞤨' => '𞤆', '𞤩' => '𞤇', '𞤪' => '𞤈', '𞤫' => '𞤉', '𞤬' => '𞤊', '𞤭' => '𞤋', '𞤮' => '𞤌', '𞤯' => '𞤍', '𞤰' => '𞤎', '𞤱' => '𞤏', '𞤲' => '𞤐', '𞤳' => '𞤑', '𞤴' => '𞤒', '𞤵' => '𞤓', '𞤶' => '𞤔', '𞤷' => '𞤕', '𞤸' => '𞤖', '𞤹' => '𞤗', '𞤺' => '𞤘', '𞤻' => '𞤙', '𞤼' => '𞤚', '𞤽' => '𞤛', '𞤾' => '𞤜', '𞤿' => '𞤝', '𞥀' => '𞤞', '𞥁' => '𞤟', '𞥂' => '𞤠', '𞥃' => '𞤡', 'ß' => 'SS', 'ff' => 'FF', 'fi' => 'FI', 'fl' => 'FL', 'ffi' => 'FFI', 'ffl' => 'FFL', 'ſt' => 'ST', 'st' => 'ST', 'և' => 'ԵՒ', 'ﬓ' => 'ՄՆ', 'ﬔ' => 'ՄԵ', 'ﬕ' => 'ՄԻ', 'ﬖ' => 'ՎՆ', 'ﬗ' => 'ՄԽ', 'ʼn' => 'ʼN', 'ΐ' => 'Ϊ́', 'ΰ' => 'Ϋ́', 'ǰ' => 'J̌', 'ẖ' => 'H̱', 'ẗ' => 'T̈', 'ẘ' => 'W̊', 'ẙ' => 'Y̊', 'ẚ' => 'Aʾ', 'ὐ' => 'Υ̓', 'ὒ' => 'Υ̓̀', 'ὔ' => 'Υ̓́', 'ὖ' => 'Υ̓͂', 'ᾶ' => 'Α͂', 'ῆ' => 'Η͂', 'ῒ' => 'Ϊ̀', 'ΐ' => 'Ϊ́', 'ῖ' => 'Ι͂', 'ῗ' => 'Ϊ͂', 'ῢ' => 'Ϋ̀', 'ΰ' => 'Ϋ́', 'ῤ' => 'Ρ̓', 'ῦ' => 'Υ͂', 'ῧ' => 'Ϋ͂', 'ῶ' => 'Ω͂', 'ᾈ' => 'ἈΙ', 'ᾉ' => 'ἉΙ', 'ᾊ' => 'ἊΙ', 'ᾋ' => 'ἋΙ', 'ᾌ' => 'ἌΙ', 'ᾍ' => 'ἍΙ', 'ᾎ' => 'ἎΙ', 'ᾏ' => 'ἏΙ', 'ᾘ' => 'ἨΙ', 'ᾙ' => 'ἩΙ', 'ᾚ' => 'ἪΙ', 'ᾛ' => 'ἫΙ', 'ᾜ' => 'ἬΙ', 'ᾝ' => 'ἭΙ', 'ᾞ' => 'ἮΙ', 'ᾟ' => 'ἯΙ', 'ᾨ' => 'ὨΙ', 'ᾩ' => 'ὩΙ', 'ᾪ' => 'ὪΙ', 'ᾫ' => 'ὫΙ', 'ᾬ' => 'ὬΙ', 'ᾭ' => 'ὭΙ', 'ᾮ' => 'ὮΙ', 'ᾯ' => 'ὯΙ', 'ᾼ' => 'ΑΙ', 'ῌ' => 'ΗΙ', 'ῼ' => 'ΩΙ', 'ᾲ' => 'ᾺΙ', 'ᾴ' => 'ΆΙ', 'ῂ' => 'ῊΙ', 'ῄ' => 'ΉΙ', 'ῲ' => 'ῺΙ', 'ῴ' => 'ΏΙ', 'ᾷ' => 'Α͂Ι', 'ῇ' => 'Η͂Ι', 'ῷ' => 'Ω͂Ι'); * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ use _HumbugBox1cb33d1f20f1\Symfony\Polyfill\Mbstring as p; if (!\function_exists('mb_convert_encoding')) { function mb_convert_encoding(array|string|null $string, ?string $to_encoding, array|string|null $from_encoding = null) : array|string|false { return p\Mbstring::mb_convert_encoding($string ?? '', (string) $to_encoding, $from_encoding); } } if (!\function_exists('mb_decode_mimeheader')) { function mb_decode_mimeheader(?string $string) : string { return p\Mbstring::mb_decode_mimeheader((string) $string); } } if (!\function_exists('mb_encode_mimeheader')) { function mb_encode_mimeheader(?string $string, ?string $charset = null, ?string $transfer_encoding = null, ?string $newline = "\r\n", ?int $indent = 0) : string { return p\Mbstring::mb_encode_mimeheader((string) $string, $charset, $transfer_encoding, (string) $newline, (int) $indent); } } if (!\function_exists('mb_decode_numericentity')) { function mb_decode_numericentity(?string $string, array $map, ?string $encoding = null) : string { return p\Mbstring::mb_decode_numericentity((string) $string, $map, $encoding); } } if (!\function_exists('mb_encode_numericentity')) { function mb_encode_numericentity(?string $string, array $map, ?string $encoding = null, ?bool $hex = \false) : string { return p\Mbstring::mb_encode_numericentity((string) $string, $map, $encoding, (bool) $hex); } } if (!\function_exists('mb_convert_case')) { function mb_convert_case(?string $string, ?int $mode, ?string $encoding = null) : string { return p\Mbstring::mb_convert_case((string) $string, (int) $mode, $encoding); } } if (!\function_exists('mb_internal_encoding')) { function mb_internal_encoding(?string $encoding = null) : string|bool { return p\Mbstring::mb_internal_encoding($encoding); } } if (!\function_exists('mb_language')) { function mb_language(?string $language = null) : string|bool { return p\Mbstring::mb_language($language); } } if (!\function_exists('mb_list_encodings')) { function mb_list_encodings() : array { return p\Mbstring::mb_list_encodings(); } } if (!\function_exists('mb_encoding_aliases')) { function mb_encoding_aliases(?string $encoding) : array { return p\Mbstring::mb_encoding_aliases((string) $encoding); } } if (!\function_exists('mb_check_encoding')) { function mb_check_encoding(array|string|null $value = null, ?string $encoding = null) : bool { return p\Mbstring::mb_check_encoding($value, $encoding); } } if (!\function_exists('mb_detect_encoding')) { function mb_detect_encoding(?string $string, array|string|null $encodings = null, ?bool $strict = \false) : string|false { return p\Mbstring::mb_detect_encoding((string) $string, $encodings, (bool) $strict); } } if (!\function_exists('mb_detect_order')) { function mb_detect_order(array|string|null $encoding = null) : array|bool { return p\Mbstring::mb_detect_order($encoding); } } if (!\function_exists('mb_parse_str')) { function mb_parse_str(?string $string, &$result = []) : bool { \parse_str((string) $string, $result); return (bool) $result; } } if (!\function_exists('mb_strlen')) { function mb_strlen(?string $string, ?string $encoding = null) : int { return p\Mbstring::mb_strlen((string) $string, $encoding); } } if (!\function_exists('mb_strpos')) { function mb_strpos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null) : int|false { return p\Mbstring::mb_strpos((string) $haystack, (string) $needle, (int) $offset, $encoding); } } if (!\function_exists('mb_strtolower')) { function mb_strtolower(?string $string, ?string $encoding = null) : string { return p\Mbstring::mb_strtolower((string) $string, $encoding); } } if (!\function_exists('mb_strtoupper')) { function mb_strtoupper(?string $string, ?string $encoding = null) : string { return p\Mbstring::mb_strtoupper((string) $string, $encoding); } } if (!\function_exists('mb_substitute_character')) { function mb_substitute_character(string|int|null $substitute_character = null) : string|int|bool { return p\Mbstring::mb_substitute_character($substitute_character); } } if (!\function_exists('mb_substr')) { function mb_substr(?string $string, ?int $start, ?int $length = null, ?string $encoding = null) : string { return p\Mbstring::mb_substr((string) $string, (int) $start, $length, $encoding); } } if (!\function_exists('mb_stripos')) { function mb_stripos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null) : int|false { return p\Mbstring::mb_stripos((string) $haystack, (string) $needle, (int) $offset, $encoding); } } if (!\function_exists('mb_stristr')) { function mb_stristr(?string $haystack, ?string $needle, ?bool $before_needle = \false, ?string $encoding = null) : string|false { return p\Mbstring::mb_stristr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); } } if (!\function_exists('mb_strrchr')) { function mb_strrchr(?string $haystack, ?string $needle, ?bool $before_needle = \false, ?string $encoding = null) : string|false { return p\Mbstring::mb_strrchr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); } } if (!\function_exists('mb_strrichr')) { function mb_strrichr(?string $haystack, ?string $needle, ?bool $before_needle = \false, ?string $encoding = null) : string|false { return p\Mbstring::mb_strrichr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); } } if (!\function_exists('mb_strripos')) { function mb_strripos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null) : int|false { return p\Mbstring::mb_strripos((string) $haystack, (string) $needle, (int) $offset, $encoding); } } if (!\function_exists('mb_strrpos')) { function mb_strrpos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null) : int|false { return p\Mbstring::mb_strrpos((string) $haystack, (string) $needle, (int) $offset, $encoding); } } if (!\function_exists('mb_strstr')) { function mb_strstr(?string $haystack, ?string $needle, ?bool $before_needle = \false, ?string $encoding = null) : string|false { return p\Mbstring::mb_strstr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); } } if (!\function_exists('mb_get_info')) { function mb_get_info(?string $type = 'all') : array|string|int|false { return p\Mbstring::mb_get_info((string) $type); } } if (!\function_exists('mb_http_output')) { function mb_http_output(?string $encoding = null) : string|bool { return p\Mbstring::mb_http_output($encoding); } } if (!\function_exists('mb_strwidth')) { function mb_strwidth(?string $string, ?string $encoding = null) : int { return p\Mbstring::mb_strwidth((string) $string, $encoding); } } if (!\function_exists('mb_substr_count')) { function mb_substr_count(?string $haystack, ?string $needle, ?string $encoding = null) : int { return p\Mbstring::mb_substr_count((string) $haystack, (string) $needle, $encoding); } } if (!\function_exists('mb_output_handler')) { function mb_output_handler(?string $string, ?int $status) : string { return p\Mbstring::mb_output_handler((string) $string, (int) $status); } } if (!\function_exists('mb_http_input')) { function mb_http_input(?string $type = null) : array|string|false { return p\Mbstring::mb_http_input($type); } } if (!\function_exists('mb_convert_variables')) { function mb_convert_variables(?string $to_encoding, array|string|null $from_encoding, mixed &$var, mixed &...$vars) : string|false { return p\Mbstring::mb_convert_variables((string) $to_encoding, $from_encoding ?? '', $var, ...$vars); } } if (!\function_exists('mb_ord')) { function mb_ord(?string $string, ?string $encoding = null) : int|false { return p\Mbstring::mb_ord((string) $string, $encoding); } } if (!\function_exists('mb_chr')) { function mb_chr(?int $codepoint, ?string $encoding = null) : string|false { return p\Mbstring::mb_chr((int) $codepoint, $encoding); } } if (!\function_exists('mb_scrub')) { function mb_scrub(?string $string, ?string $encoding = null) : string { $encoding ??= \mb_internal_encoding(); return \mb_convert_encoding((string) $string, $encoding, $encoding); } } if (!\function_exists('mb_str_split')) { function mb_str_split(?string $string, ?int $length = 1, ?string $encoding = null) : array { return p\Mbstring::mb_str_split((string) $string, (int) $length, $encoding); } } if (\extension_loaded('mbstring')) { return; } if (!\defined('MB_CASE_UPPER')) { \define('MB_CASE_UPPER', 0); } if (!\defined('MB_CASE_LOWER')) { \define('MB_CASE_LOWER', 1); } if (!\defined('MB_CASE_TITLE')) { \define('MB_CASE_TITLE', 2); } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ if (!\function_exists('_HumbugBox1cb33d1f20f1\\trigger_deprecation')) { /** * Triggers a silenced deprecation notice. * * @param string $package The name of the Composer package that is triggering the deprecation * @param string $version The version of the package that introduced the deprecation * @param string $message The message of the deprecation * @param mixed ...$args Values to insert in the message using printf() formatting * * @author Nicolas Grekas */ function trigger_deprecation(string $package, string $version, string $message, ...$args) : void { @\trigger_error(($package || $version ? "Since {$package} {$version}: " : '') . ($args ? \vsprintf($message, $args) : $message), \E_USER_DEPRECATED); } } Copyright (c) 2020-2022 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. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ use _HumbugBox1cb33d1f20f1\Symfony\Polyfill\Php80 as p; if (\PHP_VERSION_ID >= 80000) { return; } if (!\defined('FILTER_VALIDATE_BOOL') && \defined('FILTER_VALIDATE_BOOLEAN')) { \define('FILTER_VALIDATE_BOOL', \FILTER_VALIDATE_BOOLEAN); } if (!\function_exists('fdiv')) { function fdiv(float $num1, float $num2) : float { return p\Php80::fdiv($num1, $num2); } } if (!\function_exists('preg_last_error_msg')) { function preg_last_error_msg() : string { return p\Php80::preg_last_error_msg(); } } if (!\function_exists('str_contains')) { function str_contains(?string $haystack, ?string $needle) : bool { return p\Php80::str_contains($haystack ?? '', $needle ?? ''); } } if (!\function_exists('str_starts_with')) { function str_starts_with(?string $haystack, ?string $needle) : bool { return p\Php80::str_starts_with($haystack ?? '', $needle ?? ''); } } if (!\function_exists('str_ends_with')) { function str_ends_with(?string $haystack, ?string $needle) : bool { return p\Php80::str_ends_with($haystack ?? '', $needle ?? ''); } } if (!\function_exists('get_debug_type')) { function get_debug_type($value) : string { return p\Php80::get_debug_type($value); } } if (!\function_exists('get_resource_id')) { function get_resource_id($resource) : int { return p\Php80::get_resource_id($resource); } } Copyright (c) 2020 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. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ #[Attribute(Attribute::TARGET_CLASS)] final class Attribute { public const TARGET_CLASS = 1; public const TARGET_FUNCTION = 2; public const TARGET_METHOD = 4; public const TARGET_PROPERTY = 8; public const TARGET_CLASS_CONSTANT = 16; public const TARGET_PARAMETER = 32; public const TARGET_ALL = 63; public const IS_REPEATABLE = 64; /** @var int */ public $flags; public function __construct(int $flags = self::TARGET_ALL) { $this->flags = $flags; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ if (\PHP_VERSION_ID < 80000) { interface Stringable { /** * @return string */ public function __toString(); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ if (\PHP_VERSION_ID < 80000) { class UnhandledMatchError extends \Error { } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ if (\PHP_VERSION_ID < 80000) { class ValueError extends \Error { } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ if (\PHP_VERSION_ID < 80000 && extension_loaded('tokenizer')) { class PhpToken extends Symfony\Polyfill\Php80\PhpToken { } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Polyfill\Php80; /** * @author Ion Bazan * @author Nico Oelgart * @author Nicolas Grekas * * @internal */ final class Php80 { public static function fdiv(float $dividend, float $divisor): float { return @($dividend / $divisor); } public static function get_debug_type($value): string { switch (true) { case null === $value: return 'null'; case \is_bool($value): return 'bool'; case \is_string($value): return 'string'; case \is_array($value): return 'array'; case \is_int($value): return 'int'; case \is_float($value): return 'float'; case \is_object($value): break; case $value instanceof \__PHP_Incomplete_Class: return '__PHP_Incomplete_Class'; default: if (null === $type = @get_resource_type($value)) { return 'unknown'; } if ('Unknown' === $type) { $type = 'closed'; } return "resource ($type)"; } $class = \get_class($value); if (false === strpos($class, '@')) { return $class; } return (get_parent_class($class) ?: key(class_implements($class)) ?: 'class').'@anonymous'; } public static function get_resource_id($res): int { if (!\is_resource($res) && null === @get_resource_type($res)) { throw new \TypeError(sprintf('Argument 1 passed to get_resource_id() must be of the type resource, %s given', get_debug_type($res))); } return (int) $res; } public static function preg_last_error_msg(): string { switch (preg_last_error()) { case \PREG_INTERNAL_ERROR: return 'Internal error'; case \PREG_BAD_UTF8_ERROR: return 'Malformed UTF-8 characters, possibly incorrectly encoded'; case \PREG_BAD_UTF8_OFFSET_ERROR: return 'The offset did not correspond to the beginning of a valid UTF-8 code point'; case \PREG_BACKTRACK_LIMIT_ERROR: return 'Backtrack limit exhausted'; case \PREG_RECURSION_LIMIT_ERROR: return 'Recursion limit exhausted'; case \PREG_JIT_STACKLIMIT_ERROR: return 'JIT stack limit exhausted'; case \PREG_NO_ERROR: return 'No error'; default: return 'Unknown error'; } } public static function str_contains(string $haystack, string $needle): bool { return '' === $needle || false !== strpos($haystack, $needle); } public static function str_starts_with(string $haystack, string $needle): bool { return 0 === strncmp($haystack, $needle, \strlen($needle)); } public static function str_ends_with(string $haystack, string $needle): bool { if ('' === $needle || $needle === $haystack) { return true; } if ('' === $haystack) { return false; } $needleLength = \strlen($needle); return $needleLength <= \strlen($haystack) && 0 === substr_compare($haystack, $needle, -$needleLength); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Polyfill\Php80; /** * @author Fedonyuk Anton * * @internal */ class PhpToken implements \Stringable { /** * @var int */ public $id; /** * @var string */ public $text; /** * @var int */ public $line; /** * @var int */ public $pos; public function __construct(int $id, string $text, int $line = -1, int $position = -1) { $this->id = $id; $this->text = $text; $this->line = $line; $this->pos = $position; } public function getTokenName(): ?string { if ('UNKNOWN' === $name = token_name($this->id)) { $name = \strlen($this->text) > 1 || \ord($this->text) < 32 ? null : $this->text; } return $name; } /** * @param int|string|array $kind */ public function is($kind): bool { foreach ((array) $kind as $value) { if (\in_array($value, [$this->id, $this->text], true)) { return true; } } return false; } public function isIgnorable(): bool { return \in_array($this->id, [\T_WHITESPACE, \T_COMMENT, \T_DOC_COMMENT, \T_OPEN_TAG], true); } public function __toString(): string { return (string) $this->text; } /** * @return static[] */ public static function tokenize(string $code, int $flags = 0): array { $line = 1; $position = 0; $tokens = token_get_all($code, $flags); foreach ($tokens as $index => $token) { if (\is_string($token)) { $id = \ord($token); $text = $token; } else { [$id, $text, $line] = $token; } $tokens[$index] = new static($id, $text, $line, $position); $position += \strlen($text); } return $tokens; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Event\ConsoleCommandEvent; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Event\ConsoleErrorEvent; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Event\ConsoleSignalEvent; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Event\ConsoleTerminateEvent; /** * Contains all events dispatched by an Application. * * @author Francesco Levorato */ final class ConsoleEvents { /** * The COMMAND event allows you to attach listeners before any command is * executed by the console. It also allows you to modify the command, input and output * before they are handed to the command. * * @Event("Symfony\Component\Console\Event\ConsoleCommandEvent") */ public const COMMAND = 'console.command'; /** * The SIGNAL event allows you to perform some actions * after the command execution was interrupted. * * @Event("Symfony\Component\Console\Event\ConsoleSignalEvent") */ public const SIGNAL = 'console.signal'; /** * The TERMINATE event allows you to attach listeners after a command is * executed by the console. * * @Event("Symfony\Component\Console\Event\ConsoleTerminateEvent") */ public const TERMINATE = 'console.terminate'; /** * The ERROR event occurs when an uncaught exception or error appears. * * This event allows you to deal with the exception/error or * to modify the thrown exception. * * @Event("Symfony\Component\Console\Event\ConsoleErrorEvent") */ public const ERROR = 'console.error'; /** * Event aliases. * * These aliases can be consumed by RegisterListenersPass. */ public const ALIASES = [ConsoleCommandEvent::class => self::COMMAND, ConsoleErrorEvent::class => self::ERROR, ConsoleSignalEvent::class => self::SIGNAL, ConsoleTerminateEvent::class => self::TERMINATE]; } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception\RuntimeException; /** * ArgvInput represents an input coming from the CLI arguments. * * Usage: * * $input = new ArgvInput(); * * By default, the `$_SERVER['argv']` array is used for the input values. * * This can be overridden by explicitly passing the input values in the constructor: * * $input = new ArgvInput($_SERVER['argv']); * * If you pass it yourself, don't forget that the first element of the array * is the name of the running application. * * When passing an argument to the constructor, be sure that it respects * the same rules as the argv one. It's almost always better to use the * `StringInput` when you want to provide your own input. * * @author Fabien Potencier * * @see http://www.gnu.org/software/libc/manual/html_node/Argument-Syntax.html * @see http://www.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap12.html#tag_12_02 */ class ArgvInput extends Input { private $tokens; private $parsed; public function __construct(array $argv = null, InputDefinition $definition = null) { $argv = $argv ?? $_SERVER['argv'] ?? []; // strip the application name \array_shift($argv); $this->tokens = $argv; parent::__construct($definition); } protected function setTokens(array $tokens) { $this->tokens = $tokens; } /** * {@inheritdoc} */ protected function parse() { $parseOptions = \true; $this->parsed = $this->tokens; while (null !== ($token = \array_shift($this->parsed))) { $parseOptions = $this->parseToken($token, $parseOptions); } } protected function parseToken(string $token, bool $parseOptions) : bool { if ($parseOptions && '' == $token) { $this->parseArgument($token); } elseif ($parseOptions && '--' == $token) { return \false; } elseif ($parseOptions && \str_starts_with($token, '--')) { $this->parseLongOption($token); } elseif ($parseOptions && '-' === $token[0] && '-' !== $token) { $this->parseShortOption($token); } else { $this->parseArgument($token); } return $parseOptions; } /** * Parses a short option. */ private function parseShortOption(string $token) { $name = \substr($token, 1); if (\strlen($name) > 1) { if ($this->definition->hasShortcut($name[0]) && $this->definition->getOptionForShortcut($name[0])->acceptValue()) { // an option with a value (with no space) $this->addShortOption($name[0], \substr($name, 1)); } else { $this->parseShortOptionSet($name); } } else { $this->addShortOption($name, null); } } /** * Parses a short option set. * * @throws RuntimeException When option given doesn't exist */ private function parseShortOptionSet(string $name) { $len = \strlen($name); for ($i = 0; $i < $len; ++$i) { if (!$this->definition->hasShortcut($name[$i])) { $encoding = \mb_detect_encoding($name, null, \true); throw new RuntimeException(\sprintf('The "-%s" option does not exist.', \false === $encoding ? $name[$i] : \mb_substr($name, $i, 1, $encoding))); } $option = $this->definition->getOptionForShortcut($name[$i]); if ($option->acceptValue()) { $this->addLongOption($option->getName(), $i === $len - 1 ? null : \substr($name, $i + 1)); break; } else { $this->addLongOption($option->getName(), null); } } } /** * Parses a long option. */ private function parseLongOption(string $token) { $name = \substr($token, 2); if (\false !== ($pos = \strpos($name, '='))) { if ('' === ($value = \substr($name, $pos + 1))) { \array_unshift($this->parsed, $value); } $this->addLongOption(\substr($name, 0, $pos), $value); } else { $this->addLongOption($name, null); } } /** * Parses an argument. * * @throws RuntimeException When too many arguments are given */ private function parseArgument(string $token) { $c = \count($this->arguments); // if input is expecting another argument, add it if ($this->definition->hasArgument($c)) { $arg = $this->definition->getArgument($c); $this->arguments[$arg->getName()] = $arg->isArray() ? [$token] : $token; // if last argument isArray(), append token to last argument } elseif ($this->definition->hasArgument($c - 1) && $this->definition->getArgument($c - 1)->isArray()) { $arg = $this->definition->getArgument($c - 1); $this->arguments[$arg->getName()][] = $token; // unexpected argument } else { $all = $this->definition->getArguments(); $symfonyCommandName = null; if (($inputArgument = $all[$key = \array_key_first($all)] ?? null) && 'command' === $inputArgument->getName()) { $symfonyCommandName = $this->arguments['command'] ?? null; unset($all[$key]); } if (\count($all)) { if ($symfonyCommandName) { $message = \sprintf('Too many arguments to "%s" command, expected arguments "%s".', $symfonyCommandName, \implode('" "', \array_keys($all))); } else { $message = \sprintf('Too many arguments, expected arguments "%s".', \implode('" "', \array_keys($all))); } } elseif ($symfonyCommandName) { $message = \sprintf('No arguments expected for "%s" command, got "%s".', $symfonyCommandName, $token); } else { $message = \sprintf('No arguments expected, got "%s".', $token); } throw new RuntimeException($message); } } /** * Adds a short option value. * * @throws RuntimeException When option given doesn't exist */ private function addShortOption(string $shortcut, $value) { if (!$this->definition->hasShortcut($shortcut)) { throw new RuntimeException(\sprintf('The "-%s" option does not exist.', $shortcut)); } $this->addLongOption($this->definition->getOptionForShortcut($shortcut)->getName(), $value); } /** * Adds a long option value. * * @throws RuntimeException When option given doesn't exist */ private function addLongOption(string $name, $value) { if (!$this->definition->hasOption($name)) { if (!$this->definition->hasNegation($name)) { throw new RuntimeException(\sprintf('The "--%s" option does not exist.', $name)); } $optionName = $this->definition->negationToName($name); if (null !== $value) { throw new RuntimeException(\sprintf('The "--%s" option does not accept a value.', $name)); } $this->options[$optionName] = \false; return; } $option = $this->definition->getOption($name); if (null !== $value && !$option->acceptValue()) { throw new RuntimeException(\sprintf('The "--%s" option does not accept a value.', $name)); } if (\in_array($value, ['', null], \true) && $option->acceptValue() && \count($this->parsed)) { // if option accepts an optional or mandatory argument // let's see if there is one provided $next = \array_shift($this->parsed); if (isset($next[0]) && '-' !== $next[0] || \in_array($next, ['', null], \true)) { $value = $next; } else { \array_unshift($this->parsed, $next); } } if (null === $value) { if ($option->isValueRequired()) { throw new RuntimeException(\sprintf('The "--%s" option requires a value.', $name)); } if (!$option->isArray() && !$option->isValueOptional()) { $value = \true; } } if ($option->isArray()) { $this->options[$name][] = $value; } else { $this->options[$name] = $value; } } /** * {@inheritdoc} */ public function getFirstArgument() { $isOption = \false; foreach ($this->tokens as $i => $token) { if ($token && '-' === $token[0]) { if (\str_contains($token, '=') || !isset($this->tokens[$i + 1])) { continue; } // If it's a long option, consider that everything after "--" is the option name. // Otherwise, use the last char (if it's a short option set, only the last one can take a value with space separator) $name = '-' === $token[1] ? \substr($token, 2) : \substr($token, -1); if (!isset($this->options[$name]) && !$this->definition->hasShortcut($name)) { // noop } elseif ((isset($this->options[$name]) || isset($this->options[$name = $this->definition->shortcutToName($name)])) && $this->tokens[$i + 1] === $this->options[$name]) { $isOption = \true; } continue; } if ($isOption) { $isOption = \false; continue; } return $token; } return null; } /** * {@inheritdoc} */ public function hasParameterOption($values, bool $onlyParams = \false) { $values = (array) $values; foreach ($this->tokens as $token) { if ($onlyParams && '--' === $token) { return \false; } foreach ($values as $value) { // Options with values: // For long options, test for '--option=' at beginning // For short options, test for '-o' at beginning $leading = \str_starts_with($value, '--') ? $value . '=' : $value; if ($token === $value || '' !== $leading && \str_starts_with($token, $leading)) { return \true; } } } return \false; } /** * {@inheritdoc} */ public function getParameterOption($values, $default = \false, bool $onlyParams = \false) { $values = (array) $values; $tokens = $this->tokens; while (0 < \count($tokens)) { $token = \array_shift($tokens); if ($onlyParams && '--' === $token) { return $default; } foreach ($values as $value) { if ($token === $value) { return \array_shift($tokens); } // Options with values: // For long options, test for '--option=' at beginning // For short options, test for '-o' at beginning $leading = \str_starts_with($value, '--') ? $value . '=' : $value; if ('' !== $leading && \str_starts_with($token, $leading)) { return \substr($token, \strlen($leading)); } } } return $default; } /** * Returns a stringified representation of the args passed to the command. * * @return string */ public function __toString() { $tokens = \array_map(function ($token) { if (\preg_match('{^(-[^=]+=)(.+)}', $token, $match)) { return $match[1] . $this->escapeToken($match[2]); } if ($token && '-' !== $token[0]) { return $this->escapeToken($token); } return $token; }, $this->tokens); return \implode(' ', $tokens); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception\InvalidArgumentException; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception\RuntimeException; /** * InputInterface is the interface implemented by all input classes. * * @author Fabien Potencier */ interface InputInterface { /** * Returns the first argument from the raw parameters (not parsed). * * @return string|null */ public function getFirstArgument(); /** * Returns true if the raw parameters (not parsed) contain a value. * * This method is to be used to introspect the input parameters * before they have been validated. It must be used carefully. * Does not necessarily return the correct result for short options * when multiple flags are combined in the same option. * * @param string|array $values The values to look for in the raw parameters (can be an array) * @param bool $onlyParams Only check real parameters, skip those following an end of options (--) signal * * @return bool */ public function hasParameterOption($values, bool $onlyParams = \false); /** * Returns the value of a raw option (not parsed). * * This method is to be used to introspect the input parameters * before they have been validated. It must be used carefully. * Does not necessarily return the correct result for short options * when multiple flags are combined in the same option. * * @param string|array $values The value(s) to look for in the raw parameters (can be an array) * @param string|bool|int|float|array|null $default The default value to return if no result is found * @param bool $onlyParams Only check real parameters, skip those following an end of options (--) signal * * @return mixed */ public function getParameterOption($values, $default = \false, bool $onlyParams = \false); /** * Binds the current Input instance with the given arguments and options. * * @throws RuntimeException */ public function bind(InputDefinition $definition); /** * Validates the input. * * @throws RuntimeException When not enough arguments are given */ public function validate(); /** * Returns all the given arguments merged with the default values. * * @return array */ public function getArguments(); /** * Returns the argument value for a given argument name. * * @return mixed * * @throws InvalidArgumentException When argument given doesn't exist */ public function getArgument(string $name); /** * Sets an argument value by name. * * @param mixed $value The argument value * * @throws InvalidArgumentException When argument given doesn't exist */ public function setArgument(string $name, $value); /** * Returns true if an InputArgument object exists by name or position. * * @return bool */ public function hasArgument(string $name); /** * Returns all the given options merged with the default values. * * @return array */ public function getOptions(); /** * Returns the option value for a given option name. * * @return mixed * * @throws InvalidArgumentException When option given doesn't exist */ public function getOption(string $name); /** * Sets an option value by name. * * @param mixed $value The option value * * @throws InvalidArgumentException When option given doesn't exist */ public function setOption(string $name, $value); /** * Returns true if an InputOption object exists by name. * * @return bool */ public function hasOption(string $name); /** * Is this input means interactive? * * @return bool */ public function isInteractive(); /** * Sets the input interactivity. */ public function setInteractive(bool $interactive); } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception\InvalidArgumentException; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception\LogicException; /** * Represents a command line argument. * * @author Fabien Potencier */ class InputArgument { public const REQUIRED = 1; public const OPTIONAL = 2; public const IS_ARRAY = 4; private $name; private $mode; private $default; private $description; /** * @param string $name The argument name * @param int|null $mode The argument mode: self::REQUIRED or self::OPTIONAL * @param string $description A description text * @param string|bool|int|float|array|null $default The default value (for self::OPTIONAL mode only) * * @throws InvalidArgumentException When argument mode is not valid */ public function __construct(string $name, int $mode = null, string $description = '', $default = null) { if (null === $mode) { $mode = self::OPTIONAL; } elseif ($mode > 7 || $mode < 1) { throw new InvalidArgumentException(\sprintf('Argument mode "%s" is not valid.', $mode)); } $this->name = $name; $this->mode = $mode; $this->description = $description; $this->setDefault($default); } /** * Returns the argument name. * * @return string */ public function getName() { return $this->name; } /** * Returns true if the argument is required. * * @return bool true if parameter mode is self::REQUIRED, false otherwise */ public function isRequired() { return self::REQUIRED === (self::REQUIRED & $this->mode); } /** * Returns true if the argument can take multiple values. * * @return bool true if mode is self::IS_ARRAY, false otherwise */ public function isArray() { return self::IS_ARRAY === (self::IS_ARRAY & $this->mode); } /** * Sets the default value. * * @param string|bool|int|float|array|null $default * * @throws LogicException When incorrect default value is given */ public function setDefault($default = null) { if ($this->isRequired() && null !== $default) { throw new LogicException('Cannot set a default value except for InputArgument::OPTIONAL mode.'); } if ($this->isArray()) { if (null === $default) { $default = []; } elseif (!\is_array($default)) { throw new LogicException('A default value for an array argument must be an array.'); } } $this->default = $default; } /** * Returns the default value. * * @return string|bool|int|float|array|null */ public function getDefault() { return $this->default; } /** * Returns the description text. * * @return string */ public function getDescription() { return $this->description; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input; /** * InputAwareInterface should be implemented by classes that depends on the * Console Input. * * @author Wouter J */ interface InputAwareInterface { /** * Sets the Console Input. */ public function setInput(InputInterface $input); } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception\InvalidArgumentException; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception\LogicException; /** * A InputDefinition represents a set of valid command line arguments and options. * * Usage: * * $definition = new InputDefinition([ * new InputArgument('name', InputArgument::REQUIRED), * new InputOption('foo', 'f', InputOption::VALUE_REQUIRED), * ]); * * @author Fabien Potencier */ class InputDefinition { private $arguments; private $requiredCount; private $lastArrayArgument; private $lastOptionalArgument; private $options; private $negations; private $shortcuts; /** * @param array $definition An array of InputArgument and InputOption instance */ public function __construct(array $definition = []) { $this->setDefinition($definition); } /** * Sets the definition of the input. */ public function setDefinition(array $definition) { $arguments = []; $options = []; foreach ($definition as $item) { if ($item instanceof InputOption) { $options[] = $item; } else { $arguments[] = $item; } } $this->setArguments($arguments); $this->setOptions($options); } /** * Sets the InputArgument objects. * * @param InputArgument[] $arguments An array of InputArgument objects */ public function setArguments(array $arguments = []) { $this->arguments = []; $this->requiredCount = 0; $this->lastOptionalArgument = null; $this->lastArrayArgument = null; $this->addArguments($arguments); } /** * Adds an array of InputArgument objects. * * @param InputArgument[] $arguments An array of InputArgument objects */ public function addArguments(?array $arguments = []) { if (null !== $arguments) { foreach ($arguments as $argument) { $this->addArgument($argument); } } } /** * @throws LogicException When incorrect argument is given */ public function addArgument(InputArgument $argument) { if (isset($this->arguments[$argument->getName()])) { throw new LogicException(\sprintf('An argument with name "%s" already exists.', $argument->getName())); } if (null !== $this->lastArrayArgument) { throw new LogicException(\sprintf('Cannot add a required argument "%s" after an array argument "%s".', $argument->getName(), $this->lastArrayArgument->getName())); } if ($argument->isRequired() && null !== $this->lastOptionalArgument) { throw new LogicException(\sprintf('Cannot add a required argument "%s" after an optional one "%s".', $argument->getName(), $this->lastOptionalArgument->getName())); } if ($argument->isArray()) { $this->lastArrayArgument = $argument; } if ($argument->isRequired()) { ++$this->requiredCount; } else { $this->lastOptionalArgument = $argument; } $this->arguments[$argument->getName()] = $argument; } /** * Returns an InputArgument by name or by position. * * @param string|int $name The InputArgument name or position * * @return InputArgument * * @throws InvalidArgumentException When argument given doesn't exist */ public function getArgument($name) { if (!$this->hasArgument($name)) { throw new InvalidArgumentException(\sprintf('The "%s" argument does not exist.', $name)); } $arguments = \is_int($name) ? \array_values($this->arguments) : $this->arguments; return $arguments[$name]; } /** * Returns true if an InputArgument object exists by name or position. * * @param string|int $name The InputArgument name or position * * @return bool */ public function hasArgument($name) { $arguments = \is_int($name) ? \array_values($this->arguments) : $this->arguments; return isset($arguments[$name]); } /** * Gets the array of InputArgument objects. * * @return InputArgument[] */ public function getArguments() { return $this->arguments; } /** * Returns the number of InputArguments. * * @return int */ public function getArgumentCount() { return null !== $this->lastArrayArgument ? \PHP_INT_MAX : \count($this->arguments); } /** * Returns the number of required InputArguments. * * @return int */ public function getArgumentRequiredCount() { return $this->requiredCount; } /** * @return array */ public function getArgumentDefaults() { $values = []; foreach ($this->arguments as $argument) { $values[$argument->getName()] = $argument->getDefault(); } return $values; } /** * Sets the InputOption objects. * * @param InputOption[] $options An array of InputOption objects */ public function setOptions(array $options = []) { $this->options = []; $this->shortcuts = []; $this->negations = []; $this->addOptions($options); } /** * Adds an array of InputOption objects. * * @param InputOption[] $options An array of InputOption objects */ public function addOptions(array $options = []) { foreach ($options as $option) { $this->addOption($option); } } /** * @throws LogicException When option given already exist */ public function addOption(InputOption $option) { if (isset($this->options[$option->getName()]) && !$option->equals($this->options[$option->getName()])) { throw new LogicException(\sprintf('An option named "%s" already exists.', $option->getName())); } if (isset($this->negations[$option->getName()])) { throw new LogicException(\sprintf('An option named "%s" already exists.', $option->getName())); } if ($option->getShortcut()) { foreach (\explode('|', $option->getShortcut()) as $shortcut) { if (isset($this->shortcuts[$shortcut]) && !$option->equals($this->options[$this->shortcuts[$shortcut]])) { throw new LogicException(\sprintf('An option with shortcut "%s" already exists.', $shortcut)); } } } $this->options[$option->getName()] = $option; if ($option->getShortcut()) { foreach (\explode('|', $option->getShortcut()) as $shortcut) { $this->shortcuts[$shortcut] = $option->getName(); } } if ($option->isNegatable()) { $negatedName = 'no-' . $option->getName(); if (isset($this->options[$negatedName])) { throw new LogicException(\sprintf('An option named "%s" already exists.', $negatedName)); } $this->negations[$negatedName] = $option->getName(); } } /** * Returns an InputOption by name. * * @return InputOption * * @throws InvalidArgumentException When option given doesn't exist */ public function getOption(string $name) { if (!$this->hasOption($name)) { throw new InvalidArgumentException(\sprintf('The "--%s" option does not exist.', $name)); } return $this->options[$name]; } /** * Returns true if an InputOption object exists by name. * * This method can't be used to check if the user included the option when * executing the command (use getOption() instead). * * @return bool */ public function hasOption(string $name) { return isset($this->options[$name]); } /** * Gets the array of InputOption objects. * * @return InputOption[] */ public function getOptions() { return $this->options; } /** * Returns true if an InputOption object exists by shortcut. * * @return bool */ public function hasShortcut(string $name) { return isset($this->shortcuts[$name]); } /** * Returns true if an InputOption object exists by negated name. */ public function hasNegation(string $name) : bool { return isset($this->negations[$name]); } /** * Gets an InputOption by shortcut. * * @return InputOption */ public function getOptionForShortcut(string $shortcut) { return $this->getOption($this->shortcutToName($shortcut)); } /** * @return array */ public function getOptionDefaults() { $values = []; foreach ($this->options as $option) { $values[$option->getName()] = $option->getDefault(); } return $values; } /** * Returns the InputOption name given a shortcut. * * @throws InvalidArgumentException When option given does not exist * * @internal */ public function shortcutToName(string $shortcut) : string { if (!isset($this->shortcuts[$shortcut])) { throw new InvalidArgumentException(\sprintf('The "-%s" option does not exist.', $shortcut)); } return $this->shortcuts[$shortcut]; } /** * Returns the InputOption name given a negation. * * @throws InvalidArgumentException When option given does not exist * * @internal */ public function negationToName(string $negation) : string { if (!isset($this->negations[$negation])) { throw new InvalidArgumentException(\sprintf('The "--%s" option does not exist.', $negation)); } return $this->negations[$negation]; } /** * Gets the synopsis. * * @return string */ public function getSynopsis(bool $short = \false) { $elements = []; if ($short && $this->getOptions()) { $elements[] = '[options]'; } elseif (!$short) { foreach ($this->getOptions() as $option) { $value = ''; if ($option->acceptValue()) { $value = \sprintf(' %s%s%s', $option->isValueOptional() ? '[' : '', \strtoupper($option->getName()), $option->isValueOptional() ? ']' : ''); } $shortcut = $option->getShortcut() ? \sprintf('-%s|', $option->getShortcut()) : ''; $negation = $option->isNegatable() ? \sprintf('|--no-%s', $option->getName()) : ''; $elements[] = \sprintf('[%s--%s%s%s]', $shortcut, $option->getName(), $value, $negation); } } if (\count($elements) && $this->getArguments()) { $elements[] = '[--]'; } $tail = ''; foreach ($this->getArguments() as $argument) { $element = '<' . $argument->getName() . '>'; if ($argument->isArray()) { $element .= '...'; } if (!$argument->isRequired()) { $element = '[' . $element; $tail .= ']'; } $elements[] = $element; } return \implode(' ', $elements) . $tail; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception\InvalidArgumentException; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception\RuntimeException; /** * Input is the base class for all concrete Input classes. * * Three concrete classes are provided by default: * * * `ArgvInput`: The input comes from the CLI arguments (argv) * * `StringInput`: The input is provided as a string * * `ArrayInput`: The input is provided as an array * * @author Fabien Potencier */ abstract class Input implements InputInterface, StreamableInputInterface { protected $definition; protected $stream; protected $options = []; protected $arguments = []; protected $interactive = \true; public function __construct(InputDefinition $definition = null) { if (null === $definition) { $this->definition = new InputDefinition(); } else { $this->bind($definition); $this->validate(); } } /** * {@inheritdoc} */ public function bind(InputDefinition $definition) { $this->arguments = []; $this->options = []; $this->definition = $definition; $this->parse(); } /** * Processes command line arguments. */ protected abstract function parse(); /** * {@inheritdoc} */ public function validate() { $definition = $this->definition; $givenArguments = $this->arguments; $missingArguments = \array_filter(\array_keys($definition->getArguments()), function ($argument) use($definition, $givenArguments) { return !\array_key_exists($argument, $givenArguments) && $definition->getArgument($argument)->isRequired(); }); if (\count($missingArguments) > 0) { throw new RuntimeException(\sprintf('Not enough arguments (missing: "%s").', \implode(', ', $missingArguments))); } } /** * {@inheritdoc} */ public function isInteractive() { return $this->interactive; } /** * {@inheritdoc} */ public function setInteractive(bool $interactive) { $this->interactive = $interactive; } /** * {@inheritdoc} */ public function getArguments() { return \array_merge($this->definition->getArgumentDefaults(), $this->arguments); } /** * {@inheritdoc} */ public function getArgument(string $name) { if (!$this->definition->hasArgument($name)) { throw new InvalidArgumentException(\sprintf('The "%s" argument does not exist.', $name)); } return $this->arguments[$name] ?? $this->definition->getArgument($name)->getDefault(); } /** * {@inheritdoc} */ public function setArgument(string $name, $value) { if (!$this->definition->hasArgument($name)) { throw new InvalidArgumentException(\sprintf('The "%s" argument does not exist.', $name)); } $this->arguments[$name] = $value; } /** * {@inheritdoc} */ public function hasArgument(string $name) { return $this->definition->hasArgument($name); } /** * {@inheritdoc} */ public function getOptions() { return \array_merge($this->definition->getOptionDefaults(), $this->options); } /** * {@inheritdoc} */ public function getOption(string $name) { if ($this->definition->hasNegation($name)) { if (null === ($value = $this->getOption($this->definition->negationToName($name)))) { return $value; } return !$value; } if (!$this->definition->hasOption($name)) { throw new InvalidArgumentException(\sprintf('The "%s" option does not exist.', $name)); } return \array_key_exists($name, $this->options) ? $this->options[$name] : $this->definition->getOption($name)->getDefault(); } /** * {@inheritdoc} */ public function setOption(string $name, $value) { if ($this->definition->hasNegation($name)) { $this->options[$this->definition->negationToName($name)] = !$value; return; } elseif (!$this->definition->hasOption($name)) { throw new InvalidArgumentException(\sprintf('The "%s" option does not exist.', $name)); } $this->options[$name] = $value; } /** * {@inheritdoc} */ public function hasOption(string $name) { return $this->definition->hasOption($name) || $this->definition->hasNegation($name); } /** * Escapes a token through escapeshellarg if it contains unsafe chars. * * @return string */ public function escapeToken(string $token) { return \preg_match('{^[\\w-]+$}', $token) ? $token : \escapeshellarg($token); } /** * {@inheritdoc} */ public function setStream($stream) { $this->stream = $stream; } /** * {@inheritdoc} */ public function getStream() { return $this->stream; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception\InvalidArgumentException; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception\InvalidOptionException; /** * ArrayInput represents an input provided as an array. * * Usage: * * $input = new ArrayInput(['command' => 'foo:bar', 'foo' => 'bar', '--bar' => 'foobar']); * * @author Fabien Potencier */ class ArrayInput extends Input { private $parameters; public function __construct(array $parameters, InputDefinition $definition = null) { $this->parameters = $parameters; parent::__construct($definition); } /** * {@inheritdoc} */ public function getFirstArgument() { foreach ($this->parameters as $param => $value) { if ($param && \is_string($param) && '-' === $param[0]) { continue; } return $value; } return null; } /** * {@inheritdoc} */ public function hasParameterOption($values, bool $onlyParams = \false) { $values = (array) $values; foreach ($this->parameters as $k => $v) { if (!\is_int($k)) { $v = $k; } if ($onlyParams && '--' === $v) { return \false; } if (\in_array($v, $values)) { return \true; } } return \false; } /** * {@inheritdoc} */ public function getParameterOption($values, $default = \false, bool $onlyParams = \false) { $values = (array) $values; foreach ($this->parameters as $k => $v) { if ($onlyParams && ('--' === $k || \is_int($k) && '--' === $v)) { return $default; } if (\is_int($k)) { if (\in_array($v, $values)) { return \true; } } elseif (\in_array($k, $values)) { return $v; } } return $default; } /** * Returns a stringified representation of the args passed to the command. * * @return string */ public function __toString() { $params = []; foreach ($this->parameters as $param => $val) { if ($param && \is_string($param) && '-' === $param[0]) { $glue = '-' === $param[1] ? '=' : ' '; if (\is_array($val)) { foreach ($val as $v) { $params[] = $param . ('' != $v ? $glue . $this->escapeToken($v) : ''); } } else { $params[] = $param . ('' != $val ? $glue . $this->escapeToken($val) : ''); } } else { $params[] = \is_array($val) ? \implode(' ', \array_map([$this, 'escapeToken'], $val)) : $this->escapeToken($val); } } return \implode(' ', $params); } /** * {@inheritdoc} */ protected function parse() { foreach ($this->parameters as $key => $value) { if ('--' === $key) { return; } if (\str_starts_with($key, '--')) { $this->addLongOption(\substr($key, 2), $value); } elseif (\str_starts_with($key, '-')) { $this->addShortOption(\substr($key, 1), $value); } else { $this->addArgument($key, $value); } } } /** * Adds a short option value. * * @throws InvalidOptionException When option given doesn't exist */ private function addShortOption(string $shortcut, $value) { if (!$this->definition->hasShortcut($shortcut)) { throw new InvalidOptionException(\sprintf('The "-%s" option does not exist.', $shortcut)); } $this->addLongOption($this->definition->getOptionForShortcut($shortcut)->getName(), $value); } /** * Adds a long option value. * * @throws InvalidOptionException When option given doesn't exist * @throws InvalidOptionException When a required value is missing */ private function addLongOption(string $name, $value) { if (!$this->definition->hasOption($name)) { if (!$this->definition->hasNegation($name)) { throw new InvalidOptionException(\sprintf('The "--%s" option does not exist.', $name)); } $optionName = $this->definition->negationToName($name); $this->options[$optionName] = \false; return; } $option = $this->definition->getOption($name); if (null === $value) { if ($option->isValueRequired()) { throw new InvalidOptionException(\sprintf('The "--%s" option requires a value.', $name)); } if (!$option->isValueOptional()) { $value = \true; } } $this->options[$name] = $value; } /** * Adds an argument value. * * @param string|int $name The argument name * @param mixed $value The value for the argument * * @throws InvalidArgumentException When argument given doesn't exist */ private function addArgument($name, $value) { if (!$this->definition->hasArgument($name)) { throw new InvalidArgumentException(\sprintf('The "%s" argument does not exist.', $name)); } $this->arguments[$name] = $value; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception\InvalidArgumentException; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception\LogicException; /** * Represents a command line option. * * @author Fabien Potencier */ class InputOption { /** * Do not accept input for the option (e.g. --yell). This is the default behavior of options. */ public const VALUE_NONE = 1; /** * A value must be passed when the option is used (e.g. --iterations=5 or -i5). */ public const VALUE_REQUIRED = 2; /** * The option may or may not have a value (e.g. --yell or --yell=loud). */ public const VALUE_OPTIONAL = 4; /** * The option accepts multiple values (e.g. --dir=/foo --dir=/bar). */ public const VALUE_IS_ARRAY = 8; /** * The option may have either positive or negative value (e.g. --ansi or --no-ansi). */ public const VALUE_NEGATABLE = 16; private $name; private $shortcut; private $mode; private $default; private $description; /** * @param string|array|null $shortcut The shortcuts, can be null, a string of shortcuts delimited by | or an array of shortcuts * @param int|null $mode The option mode: One of the VALUE_* constants * @param string|bool|int|float|array|null $default The default value (must be null for self::VALUE_NONE) * * @throws InvalidArgumentException If option mode is invalid or incompatible */ public function __construct(string $name, $shortcut = null, int $mode = null, string $description = '', $default = null) { if (\str_starts_with($name, '--')) { $name = \substr($name, 2); } if (empty($name)) { throw new InvalidArgumentException('An option name cannot be empty.'); } if (empty($shortcut)) { $shortcut = null; } if (null !== $shortcut) { if (\is_array($shortcut)) { $shortcut = \implode('|', $shortcut); } $shortcuts = \preg_split('{(\\|)-?}', \ltrim($shortcut, '-')); $shortcuts = \array_filter($shortcuts); $shortcut = \implode('|', $shortcuts); if (empty($shortcut)) { throw new InvalidArgumentException('An option shortcut cannot be empty.'); } } if (null === $mode) { $mode = self::VALUE_NONE; } elseif ($mode >= self::VALUE_NEGATABLE << 1 || $mode < 1) { throw new InvalidArgumentException(\sprintf('Option mode "%s" is not valid.', $mode)); } $this->name = $name; $this->shortcut = $shortcut; $this->mode = $mode; $this->description = $description; if ($this->isArray() && !$this->acceptValue()) { throw new InvalidArgumentException('Impossible to have an option mode VALUE_IS_ARRAY if the option does not accept a value.'); } if ($this->isNegatable() && $this->acceptValue()) { throw new InvalidArgumentException('Impossible to have an option mode VALUE_NEGATABLE if the option also accepts a value.'); } $this->setDefault($default); } /** * Returns the option shortcut. * * @return string|null */ public function getShortcut() { return $this->shortcut; } /** * Returns the option name. * * @return string */ public function getName() { return $this->name; } /** * Returns true if the option accepts a value. * * @return bool true if value mode is not self::VALUE_NONE, false otherwise */ public function acceptValue() { return $this->isValueRequired() || $this->isValueOptional(); } /** * Returns true if the option requires a value. * * @return bool true if value mode is self::VALUE_REQUIRED, false otherwise */ public function isValueRequired() { return self::VALUE_REQUIRED === (self::VALUE_REQUIRED & $this->mode); } /** * Returns true if the option takes an optional value. * * @return bool true if value mode is self::VALUE_OPTIONAL, false otherwise */ public function isValueOptional() { return self::VALUE_OPTIONAL === (self::VALUE_OPTIONAL & $this->mode); } /** * Returns true if the option can take multiple values. * * @return bool true if mode is self::VALUE_IS_ARRAY, false otherwise */ public function isArray() { return self::VALUE_IS_ARRAY === (self::VALUE_IS_ARRAY & $this->mode); } public function isNegatable() : bool { return self::VALUE_NEGATABLE === (self::VALUE_NEGATABLE & $this->mode); } /** * @param string|bool|int|float|array|null $default */ public function setDefault($default = null) { if (self::VALUE_NONE === (self::VALUE_NONE & $this->mode) && null !== $default) { throw new LogicException('Cannot set a default value when using InputOption::VALUE_NONE mode.'); } if ($this->isArray()) { if (null === $default) { $default = []; } elseif (!\is_array($default)) { throw new LogicException('A default value for an array option must be an array.'); } } $this->default = $this->acceptValue() || $this->isNegatable() ? $default : \false; } /** * Returns the default value. * * @return string|bool|int|float|array|null */ public function getDefault() { return $this->default; } /** * Returns the description text. * * @return string */ public function getDescription() { return $this->description; } /** * Checks whether the given option equals this one. * * @return bool */ public function equals(self $option) { return $option->getName() === $this->getName() && $option->getShortcut() === $this->getShortcut() && $option->getDefault() === $this->getDefault() && $option->isNegatable() === $this->isNegatable() && $option->isArray() === $this->isArray() && $option->isValueRequired() === $this->isValueRequired() && $option->isValueOptional() === $this->isValueOptional(); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input; /** * StreamableInputInterface is the interface implemented by all input classes * that have an input stream. * * @author Robin Chalas */ interface StreamableInputInterface extends InputInterface { /** * Sets the input stream to read from when interacting with the user. * * This is mainly useful for testing purpose. * * @param resource $stream The input stream */ public function setStream($stream); /** * Returns the input stream. * * @return resource|null */ public function getStream(); } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception\InvalidArgumentException; /** * StringInput represents an input provided as a string. * * Usage: * * $input = new StringInput('foo --bar="foobar"'); * * @author Fabien Potencier */ class StringInput extends ArgvInput { public const REGEX_STRING = '([^\\s]+?)(?:\\s|(?setTokens($this->tokenize($input)); } /** * Tokenizes a string. * * @throws InvalidArgumentException When unable to parse input (should never happen) */ private function tokenize(string $input) : array { $tokens = []; $length = \strlen($input); $cursor = 0; $token = null; while ($cursor < $length) { if ('\\' === $input[$cursor]) { $token .= $input[++$cursor] ?? ''; ++$cursor; continue; } if (\preg_match('/\\s+/A', $input, $match, 0, $cursor)) { if (null !== $token) { $tokens[] = $token; $token = null; } } elseif (\preg_match('/([^="\'\\s]+?)(=?)(' . self::REGEX_QUOTED_STRING . '+)/A', $input, $match, 0, $cursor)) { $token .= $match[1] . $match[2] . \stripcslashes(\str_replace(['"\'', '\'"', '\'\'', '""'], '', \substr($match[3], 1, -1))); } elseif (\preg_match('/' . self::REGEX_QUOTED_STRING . '/A', $input, $match, 0, $cursor)) { $token .= \stripcslashes(\substr($match[0], 1, -1)); } elseif (\preg_match('/' . self::REGEX_UNQUOTED_STRING . '/A', $input, $match, 0, $cursor)) { $token .= $match[1]; } else { // should never happen throw new InvalidArgumentException(\sprintf('Unable to parse input near "... %s ...".', \substr($input, $cursor, 10))); } $cursor += \strlen($match[0]); } if (null !== $token) { $tokens[] = $token; } return $tokens; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Command; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception\LogicException; use _HumbugBox1cb33d1f20f1\Symfony\Component\Lock\LockFactory; use _HumbugBox1cb33d1f20f1\Symfony\Component\Lock\LockInterface; use _HumbugBox1cb33d1f20f1\Symfony\Component\Lock\Store\FlockStore; use _HumbugBox1cb33d1f20f1\Symfony\Component\Lock\Store\SemaphoreStore; /** * Basic lock feature for commands. * * @author Geoffrey Brier */ trait LockableTrait { /** @var LockInterface|null */ private $lock; /** * Locks a command. */ private function lock(string $name = null, bool $blocking = \false) : bool { if (!\class_exists(SemaphoreStore::class)) { throw new LogicException('To enable the locking feature you must install the symfony/lock component.'); } if (null !== $this->lock) { throw new LogicException('A lock is already in place.'); } if (SemaphoreStore::isSupported()) { $store = new SemaphoreStore(); } else { $store = new FlockStore(); } $this->lock = (new LockFactory($store))->createLock($name ?: $this->getName()); if (!$this->lock->acquire($blocking)) { $this->lock = null; return \false; } return \true; } /** * Releases the command lock if there is one. */ private function release() { if ($this->lock) { $this->lock->release(); $this->lock = null; } } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Command; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Completion\CompletionInput; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Completion\CompletionSuggestions; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input\InputArgument; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input\InputInterface; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input\InputOption; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Output\ConsoleOutputInterface; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Output\OutputInterface; use _HumbugBox1cb33d1f20f1\Symfony\Component\Process\Process; /** * Dumps the completion script for the current shell. * * @author Wouter de Jong */ final class DumpCompletionCommand extends Command { protected static $defaultName = 'completion'; protected static $defaultDescription = 'Dump the shell completion script'; public function complete(CompletionInput $input, CompletionSuggestions $suggestions) : void { if ($input->mustSuggestArgumentValuesFor('shell')) { $suggestions->suggestValues($this->getSupportedShells()); } } protected function configure() { $fullCommand = $_SERVER['PHP_SELF']; $commandName = \basename($fullCommand); $fullCommand = @\realpath($fullCommand) ?: $fullCommand; $this->setHelp(<<%command.name% command dumps the shell completion script required to use shell autocompletion (currently only bash completion is supported). Static installation ------------------- Dump the script to a global completion file and restart your shell: %command.full_name% bash | sudo tee /etc/bash_completion.d/{$commandName} Or dump the script to a local file and source it: %command.full_name% bash > completion.sh # source the file whenever you use the project source completion.sh # or add this line at the end of your "~/.bashrc" file: source /path/to/completion.sh Dynamic installation -------------------- Add this to the end of your shell configuration file (e.g. "~/.bashrc"): eval "\$({$fullCommand} completion bash)" EOH )->addArgument('shell', InputArgument::OPTIONAL, 'The shell type (e.g. "bash"), the value of the "$SHELL" env var will be used if this is not given')->addOption('debug', null, InputOption::VALUE_NONE, 'Tail the completion debug log'); } protected function execute(InputInterface $input, OutputInterface $output) : int { $commandName = \basename($_SERVER['argv'][0]); if ($input->getOption('debug')) { $this->tailDebugLog($commandName, $output); return self::SUCCESS; } $shell = $input->getArgument('shell') ?? self::guessShell(); $completionFile = __DIR__ . '/../Resources/completion.' . $shell; if (!\file_exists($completionFile)) { $supportedShells = $this->getSupportedShells(); if ($output instanceof ConsoleOutputInterface) { $output = $output->getErrorOutput(); } if ($shell) { $output->writeln(\sprintf('Detected shell "%s", which is not supported by Symfony shell completion (supported shells: "%s").', $shell, \implode('", "', $supportedShells))); } else { $output->writeln(\sprintf('Shell not detected, Symfony shell completion only supports "%s").', \implode('", "', $supportedShells))); } return self::INVALID; } $output->write(\str_replace(['{{ COMMAND_NAME }}', '{{ VERSION }}'], [$commandName, $this->getApplication()->getVersion()], \file_get_contents($completionFile))); return self::SUCCESS; } private static function guessShell() : string { return \basename($_SERVER['SHELL'] ?? ''); } private function tailDebugLog(string $commandName, OutputInterface $output) : void { $debugFile = \sys_get_temp_dir() . '/sf_' . $commandName . '.log'; if (!\file_exists($debugFile)) { \touch($debugFile); } $process = new Process(['tail', '-f', $debugFile], null, null, null, 0); $process->run(function (string $type, string $line) use($output) : void { $output->write($line); }); } /** * @return string[] */ private function getSupportedShells() : array { return \array_map(function ($f) { return \pathinfo($f, \PATHINFO_EXTENSION); }, \glob(__DIR__ . '/../Resources/completion.*')); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Command; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Completion\CompletionInput; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Completion\CompletionSuggestions; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Completion\Output\BashCompletionOutput; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Completion\Output\CompletionOutputInterface; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception\CommandNotFoundException; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception\ExceptionInterface; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input\InputInterface; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input\InputOption; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Output\OutputInterface; /** * Responsible for providing the values to the shell completion. * * @author Wouter de Jong */ final class CompleteCommand extends Command { protected static $defaultName = '|_complete'; protected static $defaultDescription = 'Internal command to provide shell completion suggestions'; private $completionOutputs; private $isDebug = \false; /** * @param array> $completionOutputs A list of additional completion outputs, with shell name as key and FQCN as value */ public function __construct(array $completionOutputs = []) { // must be set before the parent constructor, as the property value is used in configure() $this->completionOutputs = $completionOutputs + ['bash' => BashCompletionOutput::class]; parent::__construct(); } protected function configure() : void { $this->addOption('shell', 's', InputOption::VALUE_REQUIRED, 'The shell type ("' . \implode('", "', \array_keys($this->completionOutputs)) . '")')->addOption('input', 'i', InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'An array of input tokens (e.g. COMP_WORDS or argv)')->addOption('current', 'c', InputOption::VALUE_REQUIRED, 'The index of the "input" array that the cursor is in (e.g. COMP_CWORD)')->addOption('symfony', 'S', InputOption::VALUE_REQUIRED, 'The version of the completion script'); } protected function initialize(InputInterface $input, OutputInterface $output) { $this->isDebug = \filter_var(\getenv('SYMFONY_COMPLETION_DEBUG'), \FILTER_VALIDATE_BOOLEAN); } protected function execute(InputInterface $input, OutputInterface $output) : int { try { // uncomment when a bugfix or BC break has been introduced in the shell completion scripts // $version = $input->getOption('symfony'); // if ($version && version_compare($version, 'x.y', '>=')) { // $message = sprintf('Completion script version is not supported ("%s" given, ">=x.y" required).', $version); // $this->log($message); // $output->writeln($message.' Install the Symfony completion script again by using the "completion" command.'); // return 126; // } $shell = $input->getOption('shell'); if (!$shell) { throw new \RuntimeException('The "--shell" option must be set.'); } if (!($completionOutput = $this->completionOutputs[$shell] ?? \false)) { throw new \RuntimeException(\sprintf('Shell completion is not supported for your shell: "%s" (supported: "%s").', $shell, \implode('", "', \array_keys($this->completionOutputs)))); } $completionInput = $this->createCompletionInput($input); $suggestions = new CompletionSuggestions(); $this->log(['', '' . \date('Y-m-d H:i:s') . '', 'Input: ("|" indicates the cursor position)', ' ' . (string) $completionInput, 'Command:', ' ' . (string) \implode(' ', $_SERVER['argv']), 'Messages:']); $command = $this->findCommand($completionInput, $output); if (null === $command) { $this->log(' No command found, completing using the Application class.'); $this->getApplication()->complete($completionInput, $suggestions); } elseif ($completionInput->mustSuggestArgumentValuesFor('command') && $command->getName() !== $completionInput->getCompletionValue() && !\in_array($completionInput->getCompletionValue(), $command->getAliases(), \true)) { $this->log(' No command found, completing using the Application class.'); // expand shortcut names ("cache:cl") into their full name ("cache:clear") $suggestions->suggestValues(\array_filter(\array_merge([$command->getName()], $command->getAliases()))); } else { $command->mergeApplicationDefinition(); $completionInput->bind($command->getDefinition()); if (CompletionInput::TYPE_OPTION_NAME === $completionInput->getCompletionType()) { $this->log(' Completing option names for the ' . \get_class($command instanceof LazyCommand ? $command->getCommand() : $command) . ' command.'); $suggestions->suggestOptions($command->getDefinition()->getOptions()); } else { $this->log([' Completing using the ' . \get_class($command instanceof LazyCommand ? $command->getCommand() : $command) . ' class.', ' Completing ' . $completionInput->getCompletionType() . ' for ' . $completionInput->getCompletionName() . '']); if (null !== ($compval = $completionInput->getCompletionValue())) { $this->log(' Current value: ' . $compval . ''); } $command->complete($completionInput, $suggestions); } } /** @var CompletionOutputInterface $completionOutput */ $completionOutput = new $completionOutput(); $this->log('Suggestions:'); if ($options = $suggestions->getOptionSuggestions()) { $this->log(' --' . \implode(' --', \array_map(function ($o) { return $o->getName(); }, $options))); } elseif ($values = $suggestions->getValueSuggestions()) { $this->log(' ' . \implode(' ', $values)); } else { $this->log(' No suggestions were provided'); } $completionOutput->write($suggestions, $output); } catch (\Throwable $e) { $this->log(['Error!', (string) $e]); if ($output->isDebug()) { throw $e; } return self::FAILURE; } return self::SUCCESS; } private function createCompletionInput(InputInterface $input) : CompletionInput { $currentIndex = $input->getOption('current'); if (!$currentIndex || !\ctype_digit($currentIndex)) { throw new \RuntimeException('The "--current" option must be set and it must be an integer.'); } $completionInput = CompletionInput::fromTokens($input->getOption('input'), (int) $currentIndex); try { $completionInput->bind($this->getApplication()->getDefinition()); } catch (ExceptionInterface $e) { } return $completionInput; } private function findCommand(CompletionInput $completionInput, OutputInterface $output) : ?Command { try { $inputName = $completionInput->getFirstArgument(); if (null === $inputName) { return null; } return $this->getApplication()->find($inputName); } catch (CommandNotFoundException $e) { } return null; } private function log($messages) : void { if (!$this->isDebug) { return; } $commandName = \basename($_SERVER['argv'][0]); \file_put_contents(\sys_get_temp_dir() . '/sf_' . $commandName . '.log', \implode(\PHP_EOL, (array) $messages) . \PHP_EOL, \FILE_APPEND); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Command; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Completion\CompletionInput; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Completion\CompletionSuggestions; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Descriptor\ApplicationDescription; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Helper\DescriptorHelper; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input\InputArgument; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input\InputInterface; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input\InputOption; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Output\OutputInterface; /** * HelpCommand displays the help for a given command. * * @author Fabien Potencier */ class HelpCommand extends Command { private $command; /** * {@inheritdoc} */ protected function configure() { $this->ignoreValidationErrors(); $this->setName('help')->setDefinition([new InputArgument('command_name', InputArgument::OPTIONAL, 'The command name', 'help'), new InputOption('format', null, InputOption::VALUE_REQUIRED, 'The output format (txt, xml, json, or md)', 'txt'), new InputOption('raw', null, InputOption::VALUE_NONE, 'To output raw command help')])->setDescription('Display help for a command')->setHelp(<<<'EOF' The %command.name% command displays help for a given command: %command.full_name% list You can also output the help in other formats by using the --format option: %command.full_name% --format=xml list To display the list of available commands, please use the list command. EOF ); } public function setCommand(Command $command) { $this->command = $command; } /** * {@inheritdoc} */ protected function execute(InputInterface $input, OutputInterface $output) { if (null === $this->command) { $this->command = $this->getApplication()->find($input->getArgument('command_name')); } $helper = new DescriptorHelper(); $helper->describe($output, $this->command, ['format' => $input->getOption('format'), 'raw_text' => $input->getOption('raw')]); $this->command = null; return 0; } public function complete(CompletionInput $input, CompletionSuggestions $suggestions) : void { if ($input->mustSuggestArgumentValuesFor('command_name')) { $descriptor = new ApplicationDescription($this->getApplication()); $suggestions->suggestValues(\array_keys($descriptor->getCommands())); return; } if ($input->mustSuggestOptionValuesFor('format')) { $helper = new DescriptorHelper(); $suggestions->suggestValues($helper->getFormats()); } } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Command; /** * Interface for command reacting to signal. * * @author Grégoire Pineau */ interface SignalableCommandInterface { /** * Returns the list of signals to subscribe. */ public function getSubscribedSignals() : array; /** * The method will be called when the application is signaled. */ public function handleSignal(int $signal) : void; } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Command; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Application; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Attribute\AsCommand; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Completion\CompletionInput; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Completion\CompletionSuggestions; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception\ExceptionInterface; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception\InvalidArgumentException; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception\LogicException; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Helper\HelperSet; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input\InputArgument; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input\InputDefinition; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input\InputInterface; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input\InputOption; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Output\OutputInterface; /** * Base class for all commands. * * @author Fabien Potencier */ class Command { // see https://tldp.org/LDP/abs/html/exitcodes.html public const SUCCESS = 0; public const FAILURE = 1; public const INVALID = 2; /** * @var string|null The default command name */ protected static $defaultName; /** * @var string|null The default command description */ protected static $defaultDescription; private $application; private $name; private $processTitle; private $aliases = []; private $definition; private $hidden = \false; private $help = ''; private $description = ''; private $fullDefinition; private $ignoreValidationErrors = \false; private $code; private $synopsis = []; private $usages = []; private $helperSet; /** * @return string|null */ public static function getDefaultName() { $class = static::class; if (\PHP_VERSION_ID >= 80000 && ($attribute = (new \ReflectionClass($class))->getAttributes(AsCommand::class))) { return $attribute[0]->newInstance()->name; } $r = new \ReflectionProperty($class, 'defaultName'); return $class === $r->class ? static::$defaultName : null; } public static function getDefaultDescription() : ?string { $class = static::class; if (\PHP_VERSION_ID >= 80000 && ($attribute = (new \ReflectionClass($class))->getAttributes(AsCommand::class))) { return $attribute[0]->newInstance()->description; } $r = new \ReflectionProperty($class, 'defaultDescription'); return $class === $r->class ? static::$defaultDescription : null; } /** * @param string|null $name The name of the command; passing null means it must be set in configure() * * @throws LogicException When the command name is empty */ public function __construct(string $name = null) { $this->definition = new InputDefinition(); if (null === $name && null !== ($name = static::getDefaultName())) { $aliases = \explode('|', $name); if ('' === ($name = \array_shift($aliases))) { $this->setHidden(\true); $name = \array_shift($aliases); } $this->setAliases($aliases); } if (null !== $name) { $this->setName($name); } if ('' === $this->description) { $this->setDescription(static::getDefaultDescription() ?? ''); } $this->configure(); } /** * Ignores validation errors. * * This is mainly useful for the help command. */ public function ignoreValidationErrors() { $this->ignoreValidationErrors = \true; } public function setApplication(Application $application = null) { $this->application = $application; if ($application) { $this->setHelperSet($application->getHelperSet()); } else { $this->helperSet = null; } $this->fullDefinition = null; } public function setHelperSet(HelperSet $helperSet) { $this->helperSet = $helperSet; } /** * Gets the helper set. * * @return HelperSet|null */ public function getHelperSet() { return $this->helperSet; } /** * Gets the application instance for this command. * * @return Application|null */ public function getApplication() { return $this->application; } /** * Checks whether the command is enabled or not in the current environment. * * Override this to check for x or y and return false if the command cannot * run properly under the current conditions. * * @return bool */ public function isEnabled() { return \true; } /** * Configures the current command. */ protected function configure() { } /** * Executes the current command. * * This method is not abstract because you can use this class * as a concrete class. In this case, instead of defining the * execute() method, you set the code to execute by passing * a Closure to the setCode() method. * * @return int 0 if everything went fine, or an exit code * * @throws LogicException When this abstract method is not implemented * * @see setCode() */ protected function execute(InputInterface $input, OutputInterface $output) { throw new LogicException('You must override the execute() method in the concrete command class.'); } /** * Interacts with the user. * * This method is executed before the InputDefinition is validated. * This means that this is the only place where the command can * interactively ask for values of missing required arguments. */ protected function interact(InputInterface $input, OutputInterface $output) { } /** * Initializes the command after the input has been bound and before the input * is validated. * * This is mainly useful when a lot of commands extends one main command * where some things need to be initialized based on the input arguments and options. * * @see InputInterface::bind() * @see InputInterface::validate() */ protected function initialize(InputInterface $input, OutputInterface $output) { } /** * Runs the command. * * The code to execute is either defined directly with the * setCode() method or by overriding the execute() method * in a sub-class. * * @return int The command exit code * * @throws ExceptionInterface When input binding fails. Bypass this by calling {@link ignoreValidationErrors()}. * * @see setCode() * @see execute() */ public function run(InputInterface $input, OutputInterface $output) { // add the application arguments and options $this->mergeApplicationDefinition(); // bind the input against the command specific arguments/options try { $input->bind($this->getDefinition()); } catch (ExceptionInterface $e) { if (!$this->ignoreValidationErrors) { throw $e; } } $this->initialize($input, $output); if (null !== $this->processTitle) { if (\function_exists('cli_set_process_title')) { if (!@\cli_set_process_title($this->processTitle)) { if ('Darwin' === \PHP_OS) { $output->writeln('Running "cli_set_process_title" as an unprivileged user is not supported on MacOS.', OutputInterface::VERBOSITY_VERY_VERBOSE); } else { \cli_set_process_title($this->processTitle); } } } elseif (\function_exists('_HumbugBox1cb33d1f20f1\\setproctitle')) { setproctitle($this->processTitle); } elseif (OutputInterface::VERBOSITY_VERY_VERBOSE === $output->getVerbosity()) { $output->writeln('Install the proctitle PECL to be able to change the process title.'); } } if ($input->isInteractive()) { $this->interact($input, $output); } // The command name argument is often omitted when a command is executed directly with its run() method. // It would fail the validation if we didn't make sure the command argument is present, // since it's required by the application. if ($input->hasArgument('command') && null === $input->getArgument('command')) { $input->setArgument('command', $this->getName()); } $input->validate(); if ($this->code) { $statusCode = ($this->code)($input, $output); } else { $statusCode = $this->execute($input, $output); if (!\is_int($statusCode)) { throw new \TypeError(\sprintf('Return value of "%s::execute()" must be of the type int, "%s" returned.', static::class, \get_debug_type($statusCode))); } } return \is_numeric($statusCode) ? (int) $statusCode : 0; } /** * Adds suggestions to $suggestions for the current completion input (e.g. option or argument). */ public function complete(CompletionInput $input, CompletionSuggestions $suggestions) : void { } /** * Sets the code to execute when running this command. * * If this method is used, it overrides the code defined * in the execute() method. * * @param callable $code A callable(InputInterface $input, OutputInterface $output) * * @return $this * * @throws InvalidArgumentException * * @see execute() */ public function setCode(callable $code) { if ($code instanceof \Closure) { $r = new \ReflectionFunction($code); if (null === $r->getClosureThis()) { \set_error_handler(static function () { }); try { if ($c = \Closure::bind($code, $this)) { $code = $c; } } finally { \restore_error_handler(); } } } $this->code = $code; return $this; } /** * Merges the application definition with the command definition. * * This method is not part of public API and should not be used directly. * * @param bool $mergeArgs Whether to merge or not the Application definition arguments to Command definition arguments * * @internal */ public function mergeApplicationDefinition(bool $mergeArgs = \true) { if (null === $this->application) { return; } $this->fullDefinition = new InputDefinition(); $this->fullDefinition->setOptions($this->definition->getOptions()); $this->fullDefinition->addOptions($this->application->getDefinition()->getOptions()); if ($mergeArgs) { $this->fullDefinition->setArguments($this->application->getDefinition()->getArguments()); $this->fullDefinition->addArguments($this->definition->getArguments()); } else { $this->fullDefinition->setArguments($this->definition->getArguments()); } } /** * Sets an array of argument and option instances. * * @param array|InputDefinition $definition An array of argument and option instances or a definition instance * * @return $this */ public function setDefinition($definition) { if ($definition instanceof InputDefinition) { $this->definition = $definition; } else { $this->definition->setDefinition($definition); } $this->fullDefinition = null; return $this; } /** * Gets the InputDefinition attached to this Command. * * @return InputDefinition */ public function getDefinition() { return $this->fullDefinition ?? $this->getNativeDefinition(); } /** * Gets the InputDefinition to be used to create representations of this Command. * * Can be overridden to provide the original command representation when it would otherwise * be changed by merging with the application InputDefinition. * * This method is not part of public API and should not be used directly. * * @return InputDefinition */ public function getNativeDefinition() { if (null === $this->definition) { throw new LogicException(\sprintf('Command class "%s" is not correctly initialized. You probably forgot to call the parent constructor.', static::class)); } return $this->definition; } /** * Adds an argument. * * @param int|null $mode The argument mode: InputArgument::REQUIRED or InputArgument::OPTIONAL * @param mixed $default The default value (for InputArgument::OPTIONAL mode only) * * @throws InvalidArgumentException When argument mode is not valid * * @return $this */ public function addArgument(string $name, int $mode = null, string $description = '', $default = null) { $this->definition->addArgument(new InputArgument($name, $mode, $description, $default)); if (null !== $this->fullDefinition) { $this->fullDefinition->addArgument(new InputArgument($name, $mode, $description, $default)); } return $this; } /** * Adds an option. * * @param string|array|null $shortcut The shortcuts, can be null, a string of shortcuts delimited by | or an array of shortcuts * @param int|null $mode The option mode: One of the InputOption::VALUE_* constants * @param mixed $default The default value (must be null for InputOption::VALUE_NONE) * * @throws InvalidArgumentException If option mode is invalid or incompatible * * @return $this */ public function addOption(string $name, $shortcut = null, int $mode = null, string $description = '', $default = null) { $this->definition->addOption(new InputOption($name, $shortcut, $mode, $description, $default)); if (null !== $this->fullDefinition) { $this->fullDefinition->addOption(new InputOption($name, $shortcut, $mode, $description, $default)); } return $this; } /** * Sets the name of the command. * * This method can set both the namespace and the name if * you separate them by a colon (:) * * $command->setName('foo:bar'); * * @return $this * * @throws InvalidArgumentException When the name is invalid */ public function setName(string $name) { $this->validateName($name); $this->name = $name; return $this; } /** * Sets the process title of the command. * * This feature should be used only when creating a long process command, * like a daemon. * * @return $this */ public function setProcessTitle(string $title) { $this->processTitle = $title; return $this; } /** * Returns the command name. * * @return string|null */ public function getName() { return $this->name; } /** * @param bool $hidden Whether or not the command should be hidden from the list of commands * The default value will be true in Symfony 6.0 * * @return $this * * @final since Symfony 5.1 */ public function setHidden(bool $hidden) { $this->hidden = $hidden; return $this; } /** * @return bool whether the command should be publicly shown or not */ public function isHidden() { return $this->hidden; } /** * Sets the description for the command. * * @return $this */ public function setDescription(string $description) { $this->description = $description; return $this; } /** * Returns the description for the command. * * @return string */ public function getDescription() { return $this->description; } /** * Sets the help for the command. * * @return $this */ public function setHelp(string $help) { $this->help = $help; return $this; } /** * Returns the help for the command. * * @return string */ public function getHelp() { return $this->help; } /** * Returns the processed help for the command replacing the %command.name% and * %command.full_name% patterns with the real values dynamically. * * @return string */ public function getProcessedHelp() { $name = $this->name; $isSingleCommand = $this->application && $this->application->isSingleCommand(); $placeholders = ['%command.name%', '%command.full_name%']; $replacements = [$name, $isSingleCommand ? $_SERVER['PHP_SELF'] : $_SERVER['PHP_SELF'] . ' ' . $name]; return \str_replace($placeholders, $replacements, $this->getHelp() ?: $this->getDescription()); } /** * Sets the aliases for the command. * * @param string[] $aliases An array of aliases for the command * * @return $this * * @throws InvalidArgumentException When an alias is invalid */ public function setAliases(iterable $aliases) { $list = []; foreach ($aliases as $alias) { $this->validateName($alias); $list[] = $alias; } $this->aliases = \is_array($aliases) ? $aliases : $list; return $this; } /** * Returns the aliases for the command. * * @return array */ public function getAliases() { return $this->aliases; } /** * Returns the synopsis for the command. * * @param bool $short Whether to show the short version of the synopsis (with options folded) or not * * @return string */ public function getSynopsis(bool $short = \false) { $key = $short ? 'short' : 'long'; if (!isset($this->synopsis[$key])) { $this->synopsis[$key] = \trim(\sprintf('%s %s', $this->name, $this->definition->getSynopsis($short))); } return $this->synopsis[$key]; } /** * Add a command usage example, it'll be prefixed with the command name. * * @return $this */ public function addUsage(string $usage) { if (!\str_starts_with($usage, $this->name)) { $usage = \sprintf('%s %s', $this->name, $usage); } $this->usages[] = $usage; return $this; } /** * Returns alternative usages of the command. * * @return array */ public function getUsages() { return $this->usages; } /** * Gets a helper instance by name. * * @return mixed * * @throws LogicException if no HelperSet is defined * @throws InvalidArgumentException if the helper is not defined */ public function getHelper(string $name) { if (null === $this->helperSet) { throw new LogicException(\sprintf('Cannot retrieve helper "%s" because there is no HelperSet defined. Did you forget to add your command to the application or to set the application on the command using the setApplication() method? You can also set the HelperSet directly using the setHelperSet() method.', $name)); } return $this->helperSet->get($name); } /** * Validates a command name. * * It must be non-empty and parts can optionally be separated by ":". * * @throws InvalidArgumentException When the name is invalid */ private function validateName(string $name) { if (!\preg_match('/^[^\\:]++(\\:[^\\:]++)*$/', $name)) { throw new InvalidArgumentException(\sprintf('Command name "%s" is invalid.', $name)); } } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Command; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Application; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Completion\CompletionInput; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Completion\CompletionSuggestions; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Helper\HelperSet; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input\InputDefinition; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input\InputInterface; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Output\OutputInterface; /** * @author Nicolas Grekas */ final class LazyCommand extends Command { private $command; private $isEnabled; public function __construct(string $name, array $aliases, string $description, bool $isHidden, \Closure $commandFactory, ?bool $isEnabled = \true) { $this->setName($name)->setAliases($aliases)->setHidden($isHidden)->setDescription($description); $this->command = $commandFactory; $this->isEnabled = $isEnabled; } public function ignoreValidationErrors() : void { $this->getCommand()->ignoreValidationErrors(); } public function setApplication(Application $application = null) : void { if ($this->command instanceof parent) { $this->command->setApplication($application); } parent::setApplication($application); } public function setHelperSet(HelperSet $helperSet) : void { if ($this->command instanceof parent) { $this->command->setHelperSet($helperSet); } parent::setHelperSet($helperSet); } public function isEnabled() : bool { return $this->isEnabled ?? $this->getCommand()->isEnabled(); } public function run(InputInterface $input, OutputInterface $output) : int { return $this->getCommand()->run($input, $output); } public function complete(CompletionInput $input, CompletionSuggestions $suggestions) : void { $this->getCommand()->complete($input, $suggestions); } /** * @return $this */ public function setCode(callable $code) : self { $this->getCommand()->setCode($code); return $this; } /** * @internal */ public function mergeApplicationDefinition(bool $mergeArgs = \true) : void { $this->getCommand()->mergeApplicationDefinition($mergeArgs); } /** * @return $this */ public function setDefinition($definition) : self { $this->getCommand()->setDefinition($definition); return $this; } public function getDefinition() : InputDefinition { return $this->getCommand()->getDefinition(); } public function getNativeDefinition() : InputDefinition { return $this->getCommand()->getNativeDefinition(); } /** * @return $this */ public function addArgument(string $name, int $mode = null, string $description = '', $default = null) : self { $this->getCommand()->addArgument($name, $mode, $description, $default); return $this; } /** * @return $this */ public function addOption(string $name, $shortcut = null, int $mode = null, string $description = '', $default = null) : self { $this->getCommand()->addOption($name, $shortcut, $mode, $description, $default); return $this; } /** * @return $this */ public function setProcessTitle(string $title) : self { $this->getCommand()->setProcessTitle($title); return $this; } /** * @return $this */ public function setHelp(string $help) : self { $this->getCommand()->setHelp($help); return $this; } public function getHelp() : string { return $this->getCommand()->getHelp(); } public function getProcessedHelp() : string { return $this->getCommand()->getProcessedHelp(); } public function getSynopsis(bool $short = \false) : string { return $this->getCommand()->getSynopsis($short); } /** * @return $this */ public function addUsage(string $usage) : self { $this->getCommand()->addUsage($usage); return $this; } public function getUsages() : array { return $this->getCommand()->getUsages(); } /** * @return mixed */ public function getHelper(string $name) { return $this->getCommand()->getHelper($name); } public function getCommand() : parent { if (!$this->command instanceof \Closure) { return $this->command; } $command = $this->command = ($this->command)(); $command->setApplication($this->getApplication()); if (null !== $this->getHelperSet()) { $command->setHelperSet($this->getHelperSet()); } $command->setName($this->getName())->setAliases($this->getAliases())->setHidden($this->isHidden())->setDescription($this->getDescription()); // Will throw if the command is not correctly initialized. $command->getDefinition(); return $command; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Command; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Completion\CompletionInput; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Completion\CompletionSuggestions; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Descriptor\ApplicationDescription; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Helper\DescriptorHelper; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input\InputArgument; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input\InputInterface; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input\InputOption; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Output\OutputInterface; /** * ListCommand displays the list of all available commands for the application. * * @author Fabien Potencier */ class ListCommand extends Command { /** * {@inheritdoc} */ protected function configure() { $this->setName('list')->setDefinition([new InputArgument('namespace', InputArgument::OPTIONAL, 'The namespace name'), new InputOption('raw', null, InputOption::VALUE_NONE, 'To output raw command list'), new InputOption('format', null, InputOption::VALUE_REQUIRED, 'The output format (txt, xml, json, or md)', 'txt'), new InputOption('short', null, InputOption::VALUE_NONE, 'To skip describing commands\' arguments')])->setDescription('List commands')->setHelp(<<<'EOF' The %command.name% command lists all commands: %command.full_name% You can also display the commands for a specific namespace: %command.full_name% test You can also output the information in other formats by using the --format option: %command.full_name% --format=xml It's also possible to get raw list of commands (useful for embedding command runner): %command.full_name% --raw EOF ); } /** * {@inheritdoc} */ protected function execute(InputInterface $input, OutputInterface $output) { $helper = new DescriptorHelper(); $helper->describe($output, $this->getApplication(), ['format' => $input->getOption('format'), 'raw_text' => $input->getOption('raw'), 'namespace' => $input->getArgument('namespace'), 'short' => $input->getOption('short')]); return 0; } public function complete(CompletionInput $input, CompletionSuggestions $suggestions) : void { if ($input->mustSuggestArgumentValuesFor('namespace')) { $descriptor = new ApplicationDescription($this->getApplication()); $suggestions->suggestValues(\array_keys($descriptor->getNamespaces())); return; } if ($input->mustSuggestOptionValuesFor('format')) { $helper = new DescriptorHelper(); $suggestions->suggestValues($helper->getFormats()); } } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console; class Terminal { private static $width; private static $height; private static $stty; /** * Gets the terminal width. * * @return int */ public function getWidth() { $width = \getenv('COLUMNS'); if (\false !== $width) { return (int) \trim($width); } if (null === self::$width) { self::initDimensions(); } return self::$width ?: 80; } /** * Gets the terminal height. * * @return int */ public function getHeight() { $height = \getenv('LINES'); if (\false !== $height) { return (int) \trim($height); } if (null === self::$height) { self::initDimensions(); } return self::$height ?: 50; } /** * @internal */ public static function hasSttyAvailable() : bool { if (null !== self::$stty) { return self::$stty; } // skip check if exec function is disabled if (!\function_exists('exec')) { return \false; } \exec('stty 2>&1', $output, $exitcode); return self::$stty = 0 === $exitcode; } private static function initDimensions() { if ('\\' === \DIRECTORY_SEPARATOR) { if (\preg_match('/^(\\d+)x(\\d+)(?: \\((\\d+)x(\\d+)\\))?$/', \trim(\getenv('ANSICON')), $matches)) { // extract [w, H] from "wxh (WxH)" // or [w, h] from "wxh" self::$width = (int) $matches[1]; self::$height = isset($matches[4]) ? (int) $matches[4] : (int) $matches[2]; } elseif (!self::hasVt100Support() && self::hasSttyAvailable()) { // only use stty on Windows if the terminal does not support vt100 (e.g. Windows 7 + git-bash) // testing for stty in a Windows 10 vt100-enabled console will implicitly disable vt100 support on STDOUT self::initDimensionsUsingStty(); } elseif (null !== ($dimensions = self::getConsoleMode())) { // extract [w, h] from "wxh" self::$width = (int) $dimensions[0]; self::$height = (int) $dimensions[1]; } } else { self::initDimensionsUsingStty(); } } /** * Returns whether STDOUT has vt100 support (some Windows 10+ configurations). */ private static function hasVt100Support() : bool { return \function_exists('sapi_windows_vt100_support') && \sapi_windows_vt100_support(\fopen('php://stdout', 'w')); } /** * Initializes dimensions using the output of an stty columns line. */ private static function initDimensionsUsingStty() { if ($sttyString = self::getSttyColumns()) { if (\preg_match('/rows.(\\d+);.columns.(\\d+);/i', $sttyString, $matches)) { // extract [w, h] from "rows h; columns w;" self::$width = (int) $matches[2]; self::$height = (int) $matches[1]; } elseif (\preg_match('/;.(\\d+).rows;.(\\d+).columns/i', $sttyString, $matches)) { // extract [w, h] from "; h rows; w columns" self::$width = (int) $matches[2]; self::$height = (int) $matches[1]; } } } /** * Runs and parses mode CON if it's available, suppressing any error output. * * @return int[]|null An array composed of the width and the height or null if it could not be parsed */ private static function getConsoleMode() : ?array { $info = self::readFromProcess('mode CON'); if (null === $info || !\preg_match('/--------+\\r?\\n.+?(\\d+)\\r?\\n.+?(\\d+)\\r?\\n/', $info, $matches)) { return null; } return [(int) $matches[2], (int) $matches[1]]; } /** * Runs and parses stty -a if it's available, suppressing any error output. */ private static function getSttyColumns() : ?string { return self::readFromProcess('stty -a | grep columns'); } private static function readFromProcess(string $command) : ?string { if (!\function_exists('proc_open')) { return null; } $descriptorspec = [1 => ['pipe', 'w'], 2 => ['pipe', 'w']]; $process = \proc_open($command, $descriptorspec, $pipes, null, null, ['suppress_errors' => \true]); if (!\is_resource($process)) { return null; } $info = \stream_get_contents($pipes[1]); \fclose($pipes[1]); \fclose($pipes[2]); \proc_close($process); return $info; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Event; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Command\Command; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input\InputInterface; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Output\OutputInterface; /** * @author marie */ final class ConsoleSignalEvent extends ConsoleEvent { private $handlingSignal; public function __construct(Command $command, InputInterface $input, OutputInterface $output, int $handlingSignal) { parent::__construct($command, $input, $output); $this->handlingSignal = $handlingSignal; } public function getHandlingSignal() : int { return $this->handlingSignal; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Event; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Command\Command; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input\InputInterface; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Output\OutputInterface; /** * Allows to handle throwables thrown while running a command. * * @author Wouter de Jong */ final class ConsoleErrorEvent extends ConsoleEvent { private $error; private $exitCode; public function __construct(InputInterface $input, OutputInterface $output, \Throwable $error, Command $command = null) { parent::__construct($command, $input, $output); $this->error = $error; } public function getError() : \Throwable { return $this->error; } public function setError(\Throwable $error) : void { $this->error = $error; } public function setExitCode(int $exitCode) : void { $this->exitCode = $exitCode; $r = new \ReflectionProperty($this->error, 'code'); $r->setAccessible(\true); $r->setValue($this->error, $this->exitCode); } public function getExitCode() : int { return $this->exitCode ?? (\is_int($this->error->getCode()) && 0 !== $this->error->getCode() ? $this->error->getCode() : 1); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Event; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Command\Command; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input\InputInterface; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Output\OutputInterface; /** * Allows to manipulate the exit code of a command after its execution. * * @author Francesco Levorato */ final class ConsoleTerminateEvent extends ConsoleEvent { private $exitCode; public function __construct(Command $command, InputInterface $input, OutputInterface $output, int $exitCode) { parent::__construct($command, $input, $output); $this->setExitCode($exitCode); } public function setExitCode(int $exitCode) : void { $this->exitCode = $exitCode; } public function getExitCode() : int { return $this->exitCode; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Event; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Command\Command; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input\InputInterface; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Output\OutputInterface; use _HumbugBox1cb33d1f20f1\Symfony\Contracts\EventDispatcher\Event; /** * Allows to inspect input and output of a command. * * @author Francesco Levorato */ class ConsoleEvent extends Event { protected $command; private $input; private $output; public function __construct(?Command $command, InputInterface $input, OutputInterface $output) { $this->command = $command; $this->input = $input; $this->output = $output; } /** * Gets the command that is executed. * * @return Command|null */ public function getCommand() { return $this->command; } /** * Gets the input instance. * * @return InputInterface */ public function getInput() { return $this->input; } /** * Gets the output instance. * * @return OutputInterface */ public function getOutput() { return $this->output; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Event; /** * Allows to do things before the command is executed, like skipping the command or changing the input. * * @author Fabien Potencier */ final class ConsoleCommandEvent extends ConsoleEvent { /** * The return code for skipped commands, this will also be passed into the terminate event. */ public const RETURN_CODE_DISABLED = 113; /** * Indicates if the command should be run or skipped. */ private $commandShouldRun = \true; /** * Disables the command, so it won't be run. */ public function disableCommand() : bool { return $this->commandShouldRun = \false; } public function enableCommand() : bool { return $this->commandShouldRun = \true; } /** * Returns true if the command is runnable, false otherwise. */ public function commandShouldRun() : bool { return $this->commandShouldRun; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Style; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Formatter\OutputFormatterInterface; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Helper\ProgressBar; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Output\ConsoleOutputInterface; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Output\OutputInterface; /** * Decorates output to add console style guide helpers. * * @author Kevin Bond */ abstract class OutputStyle implements OutputInterface, StyleInterface { private $output; public function __construct(OutputInterface $output) { $this->output = $output; } /** * {@inheritdoc} */ public function newLine(int $count = 1) { $this->output->write(\str_repeat(\PHP_EOL, $count)); } /** * @return ProgressBar */ public function createProgressBar(int $max = 0) { return new ProgressBar($this->output, $max); } /** * {@inheritdoc} */ public function write($messages, bool $newline = \false, int $type = self::OUTPUT_NORMAL) { $this->output->write($messages, $newline, $type); } /** * {@inheritdoc} */ public function writeln($messages, int $type = self::OUTPUT_NORMAL) { $this->output->writeln($messages, $type); } /** * {@inheritdoc} */ public function setVerbosity(int $level) { $this->output->setVerbosity($level); } /** * {@inheritdoc} */ public function getVerbosity() { return $this->output->getVerbosity(); } /** * {@inheritdoc} */ public function setDecorated(bool $decorated) { $this->output->setDecorated($decorated); } /** * {@inheritdoc} */ public function isDecorated() { return $this->output->isDecorated(); } /** * {@inheritdoc} */ public function setFormatter(OutputFormatterInterface $formatter) { $this->output->setFormatter($formatter); } /** * {@inheritdoc} */ public function getFormatter() { return $this->output->getFormatter(); } /** * {@inheritdoc} */ public function isQuiet() { return $this->output->isQuiet(); } /** * {@inheritdoc} */ public function isVerbose() { return $this->output->isVerbose(); } /** * {@inheritdoc} */ public function isVeryVerbose() { return $this->output->isVeryVerbose(); } /** * {@inheritdoc} */ public function isDebug() { return $this->output->isDebug(); } protected function getErrorOutput() { if (!$this->output instanceof ConsoleOutputInterface) { return $this->output; } return $this->output->getErrorOutput(); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Style; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception\InvalidArgumentException; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception\RuntimeException; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Formatter\OutputFormatter; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Helper\Helper; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Helper\ProgressBar; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Helper\SymfonyQuestionHelper; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Helper\Table; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Helper\TableCell; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Helper\TableSeparator; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input\InputInterface; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Output\ConsoleOutputInterface; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Output\OutputInterface; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Output\TrimmedBufferOutput; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Question\ChoiceQuestion; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Question\ConfirmationQuestion; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Question\Question; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Terminal; /** * Output decorator helpers for the Symfony Style Guide. * * @author Kevin Bond */ class SymfonyStyle extends OutputStyle { public const MAX_LINE_LENGTH = 120; private $input; private $output; private $questionHelper; private $progressBar; private $lineLength; private $bufferedOutput; public function __construct(InputInterface $input, OutputInterface $output) { $this->input = $input; $this->bufferedOutput = new TrimmedBufferOutput(\DIRECTORY_SEPARATOR === '\\' ? 4 : 2, $output->getVerbosity(), \false, clone $output->getFormatter()); // Windows cmd wraps lines as soon as the terminal width is reached, whether there are following chars or not. $width = (new Terminal())->getWidth() ?: self::MAX_LINE_LENGTH; $this->lineLength = \min($width - (int) (\DIRECTORY_SEPARATOR === '\\'), self::MAX_LINE_LENGTH); parent::__construct($this->output = $output); } /** * Formats a message as a block of text. * * @param string|array $messages The message to write in the block */ public function block($messages, string $type = null, string $style = null, string $prefix = ' ', bool $padding = \false, bool $escape = \true) { $messages = \is_array($messages) ? \array_values($messages) : [$messages]; $this->autoPrependBlock(); $this->writeln($this->createBlock($messages, $type, $style, $prefix, $padding, $escape)); $this->newLine(); } /** * {@inheritdoc} */ public function title(string $message) { $this->autoPrependBlock(); $this->writeln([\sprintf('%s', OutputFormatter::escapeTrailingBackslash($message)), \sprintf('%s', \str_repeat('=', Helper::width(Helper::removeDecoration($this->getFormatter(), $message))))]); $this->newLine(); } /** * {@inheritdoc} */ public function section(string $message) { $this->autoPrependBlock(); $this->writeln([\sprintf('%s', OutputFormatter::escapeTrailingBackslash($message)), \sprintf('%s', \str_repeat('-', Helper::width(Helper::removeDecoration($this->getFormatter(), $message))))]); $this->newLine(); } /** * {@inheritdoc} */ public function listing(array $elements) { $this->autoPrependText(); $elements = \array_map(function ($element) { return \sprintf(' * %s', $element); }, $elements); $this->writeln($elements); $this->newLine(); } /** * {@inheritdoc} */ public function text($message) { $this->autoPrependText(); $messages = \is_array($message) ? \array_values($message) : [$message]; foreach ($messages as $message) { $this->writeln(\sprintf(' %s', $message)); } } /** * Formats a command comment. * * @param string|array $message */ public function comment($message) { $this->block($message, null, null, ' // ', \false, \false); } /** * {@inheritdoc} */ public function success($message) { $this->block($message, 'OK', 'fg=black;bg=green', ' ', \true); } /** * {@inheritdoc} */ public function error($message) { $this->block($message, 'ERROR', 'fg=white;bg=red', ' ', \true); } /** * {@inheritdoc} */ public function warning($message) { $this->block($message, 'WARNING', 'fg=black;bg=yellow', ' ', \true); } /** * {@inheritdoc} */ public function note($message) { $this->block($message, 'NOTE', 'fg=yellow', ' ! '); } /** * Formats an info message. * * @param string|array $message */ public function info($message) { $this->block($message, 'INFO', 'fg=green', ' ', \true); } /** * {@inheritdoc} */ public function caution($message) { $this->block($message, 'CAUTION', 'fg=white;bg=red', ' ! ', \true); } /** * {@inheritdoc} */ public function table(array $headers, array $rows) { $this->createTable()->setHeaders($headers)->setRows($rows)->render(); $this->newLine(); } /** * Formats a horizontal table. */ public function horizontalTable(array $headers, array $rows) { $this->createTable()->setHorizontal(\true)->setHeaders($headers)->setRows($rows)->render(); $this->newLine(); } /** * Formats a list of key/value horizontally. * * Each row can be one of: * * 'A title' * * ['key' => 'value'] * * new TableSeparator() * * @param string|array|TableSeparator ...$list */ public function definitionList(...$list) { $headers = []; $row = []; foreach ($list as $value) { if ($value instanceof TableSeparator) { $headers[] = $value; $row[] = $value; continue; } if (\is_string($value)) { $headers[] = new TableCell($value, ['colspan' => 2]); $row[] = null; continue; } if (!\is_array($value)) { throw new InvalidArgumentException('Value should be an array, string, or an instance of TableSeparator.'); } $headers[] = \key($value); $row[] = \current($value); } $this->horizontalTable($headers, [$row]); } /** * {@inheritdoc} */ public function ask(string $question, string $default = null, callable $validator = null) { $question = new Question($question, $default); $question->setValidator($validator); return $this->askQuestion($question); } /** * {@inheritdoc} */ public function askHidden(string $question, callable $validator = null) { $question = new Question($question); $question->setHidden(\true); $question->setValidator($validator); return $this->askQuestion($question); } /** * {@inheritdoc} */ public function confirm(string $question, bool $default = \true) { return $this->askQuestion(new ConfirmationQuestion($question, $default)); } /** * {@inheritdoc} */ public function choice(string $question, array $choices, $default = null) { if (null !== $default) { $values = \array_flip($choices); $default = $values[$default] ?? $default; } return $this->askQuestion(new ChoiceQuestion($question, $choices, $default)); } /** * {@inheritdoc} */ public function progressStart(int $max = 0) { $this->progressBar = $this->createProgressBar($max); $this->progressBar->start(); } /** * {@inheritdoc} */ public function progressAdvance(int $step = 1) { $this->getProgressBar()->advance($step); } /** * {@inheritdoc} */ public function progressFinish() { $this->getProgressBar()->finish(); $this->newLine(2); $this->progressBar = null; } /** * {@inheritdoc} */ public function createProgressBar(int $max = 0) { $progressBar = parent::createProgressBar($max); if ('\\' !== \DIRECTORY_SEPARATOR || 'Hyper' === \getenv('TERM_PROGRAM')) { $progressBar->setEmptyBarCharacter('░'); // light shade character \u2591 $progressBar->setProgressCharacter(''); $progressBar->setBarCharacter('▓'); // dark shade character \u2593 } return $progressBar; } /** * @see ProgressBar::iterate() */ public function progressIterate(iterable $iterable, int $max = null) : iterable { yield from $this->createProgressBar()->iterate($iterable, $max); $this->newLine(2); } /** * @return mixed */ public function askQuestion(Question $question) { if ($this->input->isInteractive()) { $this->autoPrependBlock(); } if (!$this->questionHelper) { $this->questionHelper = new SymfonyQuestionHelper(); } $answer = $this->questionHelper->ask($this->input, $this, $question); if ($this->input->isInteractive()) { $this->newLine(); $this->bufferedOutput->write("\n"); } return $answer; } /** * {@inheritdoc} */ public function writeln($messages, int $type = self::OUTPUT_NORMAL) { if (!\is_iterable($messages)) { $messages = [$messages]; } foreach ($messages as $message) { parent::writeln($message, $type); $this->writeBuffer($message, \true, $type); } } /** * {@inheritdoc} */ public function write($messages, bool $newline = \false, int $type = self::OUTPUT_NORMAL) { if (!\is_iterable($messages)) { $messages = [$messages]; } foreach ($messages as $message) { parent::write($message, $newline, $type); $this->writeBuffer($message, $newline, $type); } } /** * {@inheritdoc} */ public function newLine(int $count = 1) { parent::newLine($count); $this->bufferedOutput->write(\str_repeat("\n", $count)); } /** * Returns a new instance which makes use of stderr if available. * * @return self */ public function getErrorStyle() { return new self($this->input, $this->getErrorOutput()); } public function createTable() : Table { $output = $this->output instanceof ConsoleOutputInterface ? $this->output->section() : $this->output; $style = clone Table::getStyleDefinition('symfony-style-guide'); $style->setCellHeaderFormat('%s'); return (new Table($output))->setStyle($style); } private function getProgressBar() : ProgressBar { if (!$this->progressBar) { throw new RuntimeException('The ProgressBar is not started.'); } return $this->progressBar; } private function autoPrependBlock() : void { $chars = \substr(\str_replace(\PHP_EOL, "\n", $this->bufferedOutput->fetch()), -2); if (!isset($chars[0])) { $this->newLine(); // empty history, so we should start with a new line. return; } // Prepend new line for each non LF chars (This means no blank line was output before) $this->newLine(2 - \substr_count($chars, "\n")); } private function autoPrependText() : void { $fetched = $this->bufferedOutput->fetch(); // Prepend new line if last char isn't EOL: if (!\str_ends_with($fetched, "\n")) { $this->newLine(); } } private function writeBuffer(string $message, bool $newLine, int $type) : void { // We need to know if the last chars are PHP_EOL $this->bufferedOutput->write($message, $newLine, $type); } private function createBlock(iterable $messages, string $type = null, string $style = null, string $prefix = ' ', bool $padding = \false, bool $escape = \false) : array { $indentLength = 0; $prefixLength = Helper::width(Helper::removeDecoration($this->getFormatter(), $prefix)); $lines = []; if (null !== $type) { $type = \sprintf('[%s] ', $type); $indentLength = \strlen($type); $lineIndentation = \str_repeat(' ', $indentLength); } // wrap and add newlines for each element foreach ($messages as $key => $message) { if ($escape) { $message = OutputFormatter::escape($message); } $decorationLength = Helper::width($message) - Helper::width(Helper::removeDecoration($this->getFormatter(), $message)); $messageLineLength = \min($this->lineLength - $prefixLength - $indentLength + $decorationLength, $this->lineLength); $messageLines = \explode(\PHP_EOL, \wordwrap($message, $messageLineLength, \PHP_EOL, \true)); foreach ($messageLines as $messageLine) { $lines[] = $messageLine; } if (\count($messages) > 1 && $key < \count($messages) - 1) { $lines[] = ''; } } $firstLineIndex = 0; if ($padding && $this->isDecorated()) { $firstLineIndex = 1; \array_unshift($lines, ''); $lines[] = ''; } foreach ($lines as $i => &$line) { if (null !== $type) { $line = $firstLineIndex === $i ? $type . $line : $lineIndentation . $line; } $line = $prefix . $line; $line .= \str_repeat(' ', \max($this->lineLength - Helper::width(Helper::removeDecoration($this->getFormatter(), $line)), 0)); if ($style) { $line = \sprintf('<%s>%s', $style, $line); } } return $lines; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Style; /** * Output style helpers. * * @author Kevin Bond */ interface StyleInterface { /** * Formats a command title. */ public function title(string $message); /** * Formats a section title. */ public function section(string $message); /** * Formats a list. */ public function listing(array $elements); /** * Formats informational text. * * @param string|array $message */ public function text($message); /** * Formats a success result bar. * * @param string|array $message */ public function success($message); /** * Formats an error result bar. * * @param string|array $message */ public function error($message); /** * Formats an warning result bar. * * @param string|array $message */ public function warning($message); /** * Formats a note admonition. * * @param string|array $message */ public function note($message); /** * Formats a caution admonition. * * @param string|array $message */ public function caution($message); /** * Formats a table. */ public function table(array $headers, array $rows); /** * Asks a question. * * @return mixed */ public function ask(string $question, string $default = null, callable $validator = null); /** * Asks a question with the user input hidden. * * @return mixed */ public function askHidden(string $question, callable $validator = null); /** * Asks for confirmation. * * @return bool */ public function confirm(string $question, bool $default = \true); /** * Asks a choice question. * * @param string|int|null $default * * @return mixed */ public function choice(string $question, array $choices, $default = null); /** * Add newline(s). */ public function newLine(int $count = 1); /** * Starts the progress output. */ public function progressStart(int $max = 0); /** * Advances the progress output X steps. */ public function progressAdvance(int $step = 1); /** * Finishes the progress output. */ public function progressFinish(); } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Command\Command; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Command\CompleteCommand; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Command\DumpCompletionCommand; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Command\HelpCommand; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Command\LazyCommand; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Command\ListCommand; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Command\SignalableCommandInterface; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\CommandLoader\CommandLoaderInterface; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Completion\CompletionInput; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Completion\CompletionSuggestions; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Event\ConsoleCommandEvent; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Event\ConsoleErrorEvent; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Event\ConsoleSignalEvent; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Event\ConsoleTerminateEvent; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception\CommandNotFoundException; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception\ExceptionInterface; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception\LogicException; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception\NamespaceNotFoundException; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception\RuntimeException; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Formatter\OutputFormatter; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Helper\DebugFormatterHelper; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Helper\FormatterHelper; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Helper\Helper; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Helper\HelperSet; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Helper\ProcessHelper; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Helper\QuestionHelper; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input\ArgvInput; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input\ArrayInput; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input\InputArgument; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input\InputAwareInterface; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input\InputDefinition; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input\InputInterface; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input\InputOption; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Output\ConsoleOutput; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Output\ConsoleOutputInterface; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Output\OutputInterface; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\SignalRegistry\SignalRegistry; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Style\SymfonyStyle; use _HumbugBox1cb33d1f20f1\Symfony\Component\ErrorHandler\ErrorHandler; use _HumbugBox1cb33d1f20f1\Symfony\Contracts\EventDispatcher\EventDispatcherInterface; use _HumbugBox1cb33d1f20f1\Symfony\Contracts\Service\ResetInterface; /** * An Application is the container for a collection of commands. * * It is the main entry point of a Console application. * * This class is optimized for a standard CLI environment. * * Usage: * * $app = new Application('myapp', '1.0 (stable)'); * $app->add(new SimpleCommand()); * $app->run(); * * @author Fabien Potencier */ class Application implements ResetInterface { private $commands = []; private $wantHelps = \false; private $runningCommand; private $name; private $version; private $commandLoader; private $catchExceptions = \true; private $autoExit = \true; private $definition; private $helperSet; private $dispatcher; private $terminal; private $defaultCommand; private $singleCommand = \false; private $initialized; private $signalRegistry; private $signalsToDispatchEvent = []; public function __construct(string $name = 'UNKNOWN', string $version = 'UNKNOWN') { $this->name = $name; $this->version = $version; $this->terminal = new Terminal(); $this->defaultCommand = 'list'; if (\defined('SIGINT') && SignalRegistry::isSupported()) { $this->signalRegistry = new SignalRegistry(); $this->signalsToDispatchEvent = [\SIGINT, \SIGTERM, \SIGUSR1, \SIGUSR2]; } } /** * @final */ public function setDispatcher(EventDispatcherInterface $dispatcher) { $this->dispatcher = $dispatcher; } public function setCommandLoader(CommandLoaderInterface $commandLoader) { $this->commandLoader = $commandLoader; } public function getSignalRegistry() : SignalRegistry { if (!$this->signalRegistry) { throw new RuntimeException('Signals are not supported. Make sure that the `pcntl` extension is installed and that "pcntl_*" functions are not disabled by your php.ini\'s "disable_functions" directive.'); } return $this->signalRegistry; } public function setSignalsToDispatchEvent(int ...$signalsToDispatchEvent) { $this->signalsToDispatchEvent = $signalsToDispatchEvent; } /** * Runs the current application. * * @return int 0 if everything went fine, or an error code * * @throws \Exception When running fails. Bypass this when {@link setCatchExceptions()}. */ public function run(InputInterface $input = null, OutputInterface $output = null) { if (\function_exists('putenv')) { @\putenv('LINES=' . $this->terminal->getHeight()); @\putenv('COLUMNS=' . $this->terminal->getWidth()); } if (null === $input) { $input = new ArgvInput(); } if (null === $output) { $output = new ConsoleOutput(); } $renderException = function (\Throwable $e) use($output) { if ($output instanceof ConsoleOutputInterface) { $this->renderThrowable($e, $output->getErrorOutput()); } else { $this->renderThrowable($e, $output); } }; if ($phpHandler = \set_exception_handler($renderException)) { \restore_exception_handler(); if (!\is_array($phpHandler) || !$phpHandler[0] instanceof ErrorHandler) { $errorHandler = \true; } elseif ($errorHandler = $phpHandler[0]->setExceptionHandler($renderException)) { $phpHandler[0]->setExceptionHandler($errorHandler); } } $this->configureIO($input, $output); try { $exitCode = $this->doRun($input, $output); } catch (\Exception $e) { if (!$this->catchExceptions) { throw $e; } $renderException($e); $exitCode = $e->getCode(); if (\is_numeric($exitCode)) { $exitCode = (int) $exitCode; if ($exitCode <= 0) { $exitCode = 1; } } else { $exitCode = 1; } } finally { // if the exception handler changed, keep it // otherwise, unregister $renderException if (!$phpHandler) { if (\set_exception_handler($renderException) === $renderException) { \restore_exception_handler(); } \restore_exception_handler(); } elseif (!$errorHandler) { $finalHandler = $phpHandler[0]->setExceptionHandler(null); if ($finalHandler !== $renderException) { $phpHandler[0]->setExceptionHandler($finalHandler); } } } if ($this->autoExit) { if ($exitCode > 255) { $exitCode = 255; } exit($exitCode); } return $exitCode; } /** * Runs the current application. * * @return int 0 if everything went fine, or an error code */ public function doRun(InputInterface $input, OutputInterface $output) { if (\true === $input->hasParameterOption(['--version', '-V'], \true)) { $output->writeln($this->getLongVersion()); return 0; } try { // Makes ArgvInput::getFirstArgument() able to distinguish an option from an argument. $input->bind($this->getDefinition()); } catch (ExceptionInterface $e) { // Errors must be ignored, full binding/validation happens later when the command is known. } $name = $this->getCommandName($input); if (\true === $input->hasParameterOption(['--help', '-h'], \true)) { if (!$name) { $name = 'help'; $input = new ArrayInput(['command_name' => $this->defaultCommand]); } else { $this->wantHelps = \true; } } if (!$name) { $name = $this->defaultCommand; $definition = $this->getDefinition(); $definition->setArguments(\array_merge($definition->getArguments(), ['command' => new InputArgument('command', InputArgument::OPTIONAL, $definition->getArgument('command')->getDescription(), $name)])); } try { $this->runningCommand = null; // the command name MUST be the first element of the input $command = $this->find($name); } catch (\Throwable $e) { if (!($e instanceof CommandNotFoundException && !$e instanceof NamespaceNotFoundException) || 1 !== \count($alternatives = $e->getAlternatives()) || !$input->isInteractive()) { if (null !== $this->dispatcher) { $event = new ConsoleErrorEvent($input, $output, $e); $this->dispatcher->dispatch($event, ConsoleEvents::ERROR); if (0 === $event->getExitCode()) { return 0; } $e = $event->getError(); } throw $e; } $alternative = $alternatives[0]; $style = new SymfonyStyle($input, $output); $output->writeln(''); $formattedBlock = (new FormatterHelper())->formatBlock(\sprintf('Command "%s" is not defined.', $name), 'error', \true); $output->writeln($formattedBlock); if (!$style->confirm(\sprintf('Do you want to run "%s" instead? ', $alternative), \false)) { if (null !== $this->dispatcher) { $event = new ConsoleErrorEvent($input, $output, $e); $this->dispatcher->dispatch($event, ConsoleEvents::ERROR); return $event->getExitCode(); } return 1; } $command = $this->find($alternative); } if ($command instanceof LazyCommand) { $command = $command->getCommand(); } $this->runningCommand = $command; $exitCode = $this->doRunCommand($command, $input, $output); $this->runningCommand = null; return $exitCode; } /** * {@inheritdoc} */ public function reset() { } public function setHelperSet(HelperSet $helperSet) { $this->helperSet = $helperSet; } /** * Get the helper set associated with the command. * * @return HelperSet */ public function getHelperSet() { if (!$this->helperSet) { $this->helperSet = $this->getDefaultHelperSet(); } return $this->helperSet; } public function setDefinition(InputDefinition $definition) { $this->definition = $definition; } /** * Gets the InputDefinition related to this Application. * * @return InputDefinition */ public function getDefinition() { if (!$this->definition) { $this->definition = $this->getDefaultInputDefinition(); } if ($this->singleCommand) { $inputDefinition = $this->definition; $inputDefinition->setArguments(); return $inputDefinition; } return $this->definition; } /** * Adds suggestions to $suggestions for the current completion input (e.g. option or argument). */ public function complete(CompletionInput $input, CompletionSuggestions $suggestions) : void { if (CompletionInput::TYPE_ARGUMENT_VALUE === $input->getCompletionType() && 'command' === $input->getCompletionName()) { $commandNames = []; foreach ($this->all() as $name => $command) { // skip hidden commands and aliased commands as they already get added below if ($command->isHidden() || $command->getName() !== $name) { continue; } $commandNames[] = $command->getName(); foreach ($command->getAliases() as $name) { $commandNames[] = $name; } } $suggestions->suggestValues(\array_filter($commandNames)); return; } if (CompletionInput::TYPE_OPTION_NAME === $input->getCompletionType()) { $suggestions->suggestOptions($this->getDefinition()->getOptions()); return; } } /** * Gets the help message. * * @return string */ public function getHelp() { return $this->getLongVersion(); } /** * Gets whether to catch exceptions or not during commands execution. * * @return bool */ public function areExceptionsCaught() { return $this->catchExceptions; } /** * Sets whether to catch exceptions or not during commands execution. */ public function setCatchExceptions(bool $boolean) { $this->catchExceptions = $boolean; } /** * Gets whether to automatically exit after a command execution or not. * * @return bool */ public function isAutoExitEnabled() { return $this->autoExit; } /** * Sets whether to automatically exit after a command execution or not. */ public function setAutoExit(bool $boolean) { $this->autoExit = $boolean; } /** * Gets the name of the application. * * @return string */ public function getName() { return $this->name; } /** * Sets the application name. **/ public function setName(string $name) { $this->name = $name; } /** * Gets the application version. * * @return string */ public function getVersion() { return $this->version; } /** * Sets the application version. */ public function setVersion(string $version) { $this->version = $version; } /** * Returns the long version of the application. * * @return string */ public function getLongVersion() { if ('UNKNOWN' !== $this->getName()) { if ('UNKNOWN' !== $this->getVersion()) { return \sprintf('%s %s', $this->getName(), $this->getVersion()); } return $this->getName(); } return 'Console Tool'; } /** * Registers a new command. * * @return Command */ public function register(string $name) { return $this->add(new Command($name)); } /** * Adds an array of command objects. * * If a Command is not enabled it will not be added. * * @param Command[] $commands An array of commands */ public function addCommands(array $commands) { foreach ($commands as $command) { $this->add($command); } } /** * Adds a command object. * * If a command with the same name already exists, it will be overridden. * If the command is not enabled it will not be added. * * @return Command|null */ public function add(Command $command) { $this->init(); $command->setApplication($this); if (!$command->isEnabled()) { $command->setApplication(null); return null; } if (!$command instanceof LazyCommand) { // Will throw if the command is not correctly initialized. $command->getDefinition(); } if (!$command->getName()) { throw new LogicException(\sprintf('The command defined in "%s" cannot have an empty name.', \get_debug_type($command))); } $this->commands[$command->getName()] = $command; foreach ($command->getAliases() as $alias) { $this->commands[$alias] = $command; } return $command; } /** * Returns a registered command by name or alias. * * @return Command * * @throws CommandNotFoundException When given command name does not exist */ public function get(string $name) { $this->init(); if (!$this->has($name)) { throw new CommandNotFoundException(\sprintf('The command "%s" does not exist.', $name)); } // When the command has a different name than the one used at the command loader level if (!isset($this->commands[$name])) { throw new CommandNotFoundException(\sprintf('The "%s" command cannot be found because it is registered under multiple names. Make sure you don\'t set a different name via constructor or "setName()".', $name)); } $command = $this->commands[$name]; if ($this->wantHelps) { $this->wantHelps = \false; $helpCommand = $this->get('help'); $helpCommand->setCommand($command); return $helpCommand; } return $command; } /** * Returns true if the command exists, false otherwise. * * @return bool */ public function has(string $name) { $this->init(); return isset($this->commands[$name]) || $this->commandLoader && $this->commandLoader->has($name) && $this->add($this->commandLoader->get($name)); } /** * Returns an array of all unique namespaces used by currently registered commands. * * It does not return the global namespace which always exists. * * @return string[] */ public function getNamespaces() { $namespaces = []; foreach ($this->all() as $command) { if ($command->isHidden()) { continue; } $namespaces[] = $this->extractAllNamespaces($command->getName()); foreach ($command->getAliases() as $alias) { $namespaces[] = $this->extractAllNamespaces($alias); } } return \array_values(\array_unique(\array_filter(\array_merge([], ...$namespaces)))); } /** * Finds a registered namespace by a name or an abbreviation. * * @return string * * @throws NamespaceNotFoundException When namespace is incorrect or ambiguous */ public function findNamespace(string $namespace) { $allNamespaces = $this->getNamespaces(); $expr = \implode('[^:]*:', \array_map('preg_quote', \explode(':', $namespace))) . '[^:]*'; $namespaces = \preg_grep('{^' . $expr . '}', $allNamespaces); if (empty($namespaces)) { $message = \sprintf('There are no commands defined in the "%s" namespace.', $namespace); if ($alternatives = $this->findAlternatives($namespace, $allNamespaces)) { if (1 == \count($alternatives)) { $message .= "\n\nDid you mean this?\n "; } else { $message .= "\n\nDid you mean one of these?\n "; } $message .= \implode("\n ", $alternatives); } throw new NamespaceNotFoundException($message, $alternatives); } $exact = \in_array($namespace, $namespaces, \true); if (\count($namespaces) > 1 && !$exact) { throw new NamespaceNotFoundException(\sprintf("The namespace \"%s\" is ambiguous.\nDid you mean one of these?\n%s.", $namespace, $this->getAbbreviationSuggestions(\array_values($namespaces))), \array_values($namespaces)); } return $exact ? $namespace : \reset($namespaces); } /** * Finds a command by name or alias. * * Contrary to get, this command tries to find the best * match if you give it an abbreviation of a name or alias. * * @return Command * * @throws CommandNotFoundException When command name is incorrect or ambiguous */ public function find(string $name) { $this->init(); $aliases = []; foreach ($this->commands as $command) { foreach ($command->getAliases() as $alias) { if (!$this->has($alias)) { $this->commands[$alias] = $command; } } } if ($this->has($name)) { return $this->get($name); } $allCommands = $this->commandLoader ? \array_merge($this->commandLoader->getNames(), \array_keys($this->commands)) : \array_keys($this->commands); $expr = \implode('[^:]*:', \array_map('preg_quote', \explode(':', $name))) . '[^:]*'; $commands = \preg_grep('{^' . $expr . '}', $allCommands); if (empty($commands)) { $commands = \preg_grep('{^' . $expr . '}i', $allCommands); } // if no commands matched or we just matched namespaces if (empty($commands) || \count(\preg_grep('{^' . $expr . '$}i', $commands)) < 1) { if (\false !== ($pos = \strrpos($name, ':'))) { // check if a namespace exists and contains commands $this->findNamespace(\substr($name, 0, $pos)); } $message = \sprintf('Command "%s" is not defined.', $name); if ($alternatives = $this->findAlternatives($name, $allCommands)) { // remove hidden commands $alternatives = \array_filter($alternatives, function ($name) { return !$this->get($name)->isHidden(); }); if (1 == \count($alternatives)) { $message .= "\n\nDid you mean this?\n "; } else { $message .= "\n\nDid you mean one of these?\n "; } $message .= \implode("\n ", $alternatives); } throw new CommandNotFoundException($message, \array_values($alternatives)); } // filter out aliases for commands which are already on the list if (\count($commands) > 1) { $commandList = $this->commandLoader ? \array_merge(\array_flip($this->commandLoader->getNames()), $this->commands) : $this->commands; $commands = \array_unique(\array_filter($commands, function ($nameOrAlias) use(&$commandList, $commands, &$aliases) { if (!$commandList[$nameOrAlias] instanceof Command) { $commandList[$nameOrAlias] = $this->commandLoader->get($nameOrAlias); } $commandName = $commandList[$nameOrAlias]->getName(); $aliases[$nameOrAlias] = $commandName; return $commandName === $nameOrAlias || !\in_array($commandName, $commands); })); } if (\count($commands) > 1) { $usableWidth = $this->terminal->getWidth() - 10; $abbrevs = \array_values($commands); $maxLen = 0; foreach ($abbrevs as $abbrev) { $maxLen = \max(Helper::width($abbrev), $maxLen); } $abbrevs = \array_map(function ($cmd) use($commandList, $usableWidth, $maxLen, &$commands) { if ($commandList[$cmd]->isHidden()) { unset($commands[\array_search($cmd, $commands)]); return \false; } $abbrev = \str_pad($cmd, $maxLen, ' ') . ' ' . $commandList[$cmd]->getDescription(); return Helper::width($abbrev) > $usableWidth ? Helper::substr($abbrev, 0, $usableWidth - 3) . '...' : $abbrev; }, \array_values($commands)); if (\count($commands) > 1) { $suggestions = $this->getAbbreviationSuggestions(\array_filter($abbrevs)); throw new CommandNotFoundException(\sprintf("Command \"%s\" is ambiguous.\nDid you mean one of these?\n%s.", $name, $suggestions), \array_values($commands)); } } $command = $this->get(\reset($commands)); if ($command->isHidden()) { throw new CommandNotFoundException(\sprintf('The command "%s" does not exist.', $name)); } return $command; } /** * Gets the commands (registered in the given namespace if provided). * * The array keys are the full names and the values the command instances. * * @return Command[] */ public function all(string $namespace = null) { $this->init(); if (null === $namespace) { if (!$this->commandLoader) { return $this->commands; } $commands = $this->commands; foreach ($this->commandLoader->getNames() as $name) { if (!isset($commands[$name]) && $this->has($name)) { $commands[$name] = $this->get($name); } } return $commands; } $commands = []; foreach ($this->commands as $name => $command) { if ($namespace === $this->extractNamespace($name, \substr_count($namespace, ':') + 1)) { $commands[$name] = $command; } } if ($this->commandLoader) { foreach ($this->commandLoader->getNames() as $name) { if (!isset($commands[$name]) && $namespace === $this->extractNamespace($name, \substr_count($namespace, ':') + 1) && $this->has($name)) { $commands[$name] = $this->get($name); } } } return $commands; } /** * Returns an array of possible abbreviations given a set of names. * * @return string[][] */ public static function getAbbreviations(array $names) { $abbrevs = []; foreach ($names as $name) { for ($len = \strlen($name); $len > 0; --$len) { $abbrev = \substr($name, 0, $len); $abbrevs[$abbrev][] = $name; } } return $abbrevs; } public function renderThrowable(\Throwable $e, OutputInterface $output) : void { $output->writeln('', OutputInterface::VERBOSITY_QUIET); $this->doRenderThrowable($e, $output); if (null !== $this->runningCommand) { $output->writeln(\sprintf('%s', OutputFormatter::escape(\sprintf($this->runningCommand->getSynopsis(), $this->getName()))), OutputInterface::VERBOSITY_QUIET); $output->writeln('', OutputInterface::VERBOSITY_QUIET); } } protected function doRenderThrowable(\Throwable $e, OutputInterface $output) : void { do { $message = \trim($e->getMessage()); if ('' === $message || OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity()) { $class = \get_debug_type($e); $title = \sprintf(' [%s%s] ', $class, 0 !== ($code = $e->getCode()) ? ' (' . $code . ')' : ''); $len = Helper::width($title); } else { $len = 0; } if (\str_contains($message, "@anonymous\x00")) { $message = \preg_replace_callback('/[a-zA-Z_\\x7f-\\xff][\\\\a-zA-Z0-9_\\x7f-\\xff]*+@anonymous\\x00.*?\\.php(?:0x?|:[0-9]++\\$)[0-9a-fA-F]++/', function ($m) { return \class_exists($m[0], \false) ? ((\get_parent_class($m[0]) ?: \key(\class_implements($m[0]))) ?: 'class') . '@anonymous' : $m[0]; }, $message); } $width = $this->terminal->getWidth() ? $this->terminal->getWidth() - 1 : \PHP_INT_MAX; $lines = []; foreach ('' !== $message ? \preg_split('/\\r?\\n/', $message) : [] as $line) { foreach ($this->splitStringByWidth($line, $width - 4) as $line) { // pre-format lines to get the right string length $lineLength = Helper::width($line) + 4; $lines[] = [$line, $lineLength]; $len = \max($lineLength, $len); } } $messages = []; if (!$e instanceof ExceptionInterface || OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity()) { $messages[] = \sprintf('%s', OutputFormatter::escape(\sprintf('In %s line %s:', \basename($e->getFile()) ?: 'n/a', $e->getLine() ?: 'n/a'))); } $messages[] = $emptyLine = \sprintf('%s', \str_repeat(' ', $len)); if ('' === $message || OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity()) { $messages[] = \sprintf('%s%s', $title, \str_repeat(' ', \max(0, $len - Helper::width($title)))); } foreach ($lines as $line) { $messages[] = \sprintf(' %s %s', OutputFormatter::escape($line[0]), \str_repeat(' ', $len - $line[1])); } $messages[] = $emptyLine; $messages[] = ''; $output->writeln($messages, OutputInterface::VERBOSITY_QUIET); if (OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity()) { $output->writeln('Exception trace:', OutputInterface::VERBOSITY_QUIET); // exception related properties $trace = $e->getTrace(); \array_unshift($trace, ['function' => '', 'file' => $e->getFile() ?: 'n/a', 'line' => $e->getLine() ?: 'n/a', 'args' => []]); for ($i = 0, $count = \count($trace); $i < $count; ++$i) { $class = $trace[$i]['class'] ?? ''; $type = $trace[$i]['type'] ?? ''; $function = $trace[$i]['function'] ?? ''; $file = $trace[$i]['file'] ?? 'n/a'; $line = $trace[$i]['line'] ?? 'n/a'; $output->writeln(\sprintf(' %s%s at %s:%s', $class, $function ? $type . $function . '()' : '', $file, $line), OutputInterface::VERBOSITY_QUIET); } $output->writeln('', OutputInterface::VERBOSITY_QUIET); } } while ($e = $e->getPrevious()); } /** * Configures the input and output instances based on the user arguments and options. */ protected function configureIO(InputInterface $input, OutputInterface $output) { if (\true === $input->hasParameterOption(['--ansi'], \true)) { $output->setDecorated(\true); } elseif (\true === $input->hasParameterOption(['--no-ansi'], \true)) { $output->setDecorated(\false); } if (\true === $input->hasParameterOption(['--no-interaction', '-n'], \true)) { $input->setInteractive(\false); } switch ($shellVerbosity = (int) \getenv('SHELL_VERBOSITY')) { case -1: $output->setVerbosity(OutputInterface::VERBOSITY_QUIET); break; case 1: $output->setVerbosity(OutputInterface::VERBOSITY_VERBOSE); break; case 2: $output->setVerbosity(OutputInterface::VERBOSITY_VERY_VERBOSE); break; case 3: $output->setVerbosity(OutputInterface::VERBOSITY_DEBUG); break; default: $shellVerbosity = 0; break; } if (\true === $input->hasParameterOption(['--quiet', '-q'], \true)) { $output->setVerbosity(OutputInterface::VERBOSITY_QUIET); $shellVerbosity = -1; } else { if ($input->hasParameterOption('-vvv', \true) || $input->hasParameterOption('--verbose=3', \true) || 3 === $input->getParameterOption('--verbose', \false, \true)) { $output->setVerbosity(OutputInterface::VERBOSITY_DEBUG); $shellVerbosity = 3; } elseif ($input->hasParameterOption('-vv', \true) || $input->hasParameterOption('--verbose=2', \true) || 2 === $input->getParameterOption('--verbose', \false, \true)) { $output->setVerbosity(OutputInterface::VERBOSITY_VERY_VERBOSE); $shellVerbosity = 2; } elseif ($input->hasParameterOption('-v', \true) || $input->hasParameterOption('--verbose=1', \true) || $input->hasParameterOption('--verbose', \true) || $input->getParameterOption('--verbose', \false, \true)) { $output->setVerbosity(OutputInterface::VERBOSITY_VERBOSE); $shellVerbosity = 1; } } if (-1 === $shellVerbosity) { $input->setInteractive(\false); } if (\function_exists('putenv')) { @\putenv('SHELL_VERBOSITY=' . $shellVerbosity); } $_ENV['SHELL_VERBOSITY'] = $shellVerbosity; $_SERVER['SHELL_VERBOSITY'] = $shellVerbosity; } /** * Runs the current command. * * If an event dispatcher has been attached to the application, * events are also dispatched during the life-cycle of the command. * * @return int 0 if everything went fine, or an error code */ protected function doRunCommand(Command $command, InputInterface $input, OutputInterface $output) { foreach ($command->getHelperSet() as $helper) { if ($helper instanceof InputAwareInterface) { $helper->setInput($input); } } if ($this->signalsToDispatchEvent) { $commandSignals = $command instanceof SignalableCommandInterface ? $command->getSubscribedSignals() : []; if ($commandSignals || null !== $this->dispatcher) { if (!$this->signalRegistry) { throw new RuntimeException('Unable to subscribe to signal events. Make sure that the `pcntl` extension is installed and that "pcntl_*" functions are not disabled by your php.ini\'s "disable_functions" directive.'); } if (Terminal::hasSttyAvailable()) { $sttyMode = \shell_exec('stty -g'); foreach ([\SIGINT, \SIGTERM] as $signal) { $this->signalRegistry->register($signal, static function () use($sttyMode) { \shell_exec('stty ' . $sttyMode); }); } } } if (null !== $this->dispatcher) { foreach ($this->signalsToDispatchEvent as $signal) { $event = new ConsoleSignalEvent($command, $input, $output, $signal); $this->signalRegistry->register($signal, function ($signal, $hasNext) use($event) { $this->dispatcher->dispatch($event, ConsoleEvents::SIGNAL); // No more handlers, we try to simulate PHP default behavior if (!$hasNext) { if (!\in_array($signal, [\SIGUSR1, \SIGUSR2], \true)) { exit(0); } } }); } } foreach ($commandSignals as $signal) { $this->signalRegistry->register($signal, [$command, 'handleSignal']); } } if (null === $this->dispatcher) { return $command->run($input, $output); } // bind before the console.command event, so the listeners have access to input options/arguments try { $command->mergeApplicationDefinition(); $input->bind($command->getDefinition()); } catch (ExceptionInterface $e) { // ignore invalid options/arguments for now, to allow the event listeners to customize the InputDefinition } $event = new ConsoleCommandEvent($command, $input, $output); $e = null; try { $this->dispatcher->dispatch($event, ConsoleEvents::COMMAND); if ($event->commandShouldRun()) { $exitCode = $command->run($input, $output); } else { $exitCode = ConsoleCommandEvent::RETURN_CODE_DISABLED; } } catch (\Throwable $e) { $event = new ConsoleErrorEvent($input, $output, $e, $command); $this->dispatcher->dispatch($event, ConsoleEvents::ERROR); $e = $event->getError(); if (0 === ($exitCode = $event->getExitCode())) { $e = null; } } $event = new ConsoleTerminateEvent($command, $input, $output, $exitCode); $this->dispatcher->dispatch($event, ConsoleEvents::TERMINATE); if (null !== $e) { throw $e; } return $event->getExitCode(); } /** * Gets the name of the command based on input. * * @return string|null */ protected function getCommandName(InputInterface $input) { return $this->singleCommand ? $this->defaultCommand : $input->getFirstArgument(); } /** * Gets the default input definition. * * @return InputDefinition */ protected function getDefaultInputDefinition() { return new InputDefinition([new InputArgument('command', InputArgument::REQUIRED, 'The command to execute'), new InputOption('--help', '-h', InputOption::VALUE_NONE, 'Display help for the given command. When no command is given display help for the ' . $this->defaultCommand . ' command'), new InputOption('--quiet', '-q', InputOption::VALUE_NONE, 'Do not output any message'), new InputOption('--verbose', '-v|vv|vvv', InputOption::VALUE_NONE, 'Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug'), new InputOption('--version', '-V', InputOption::VALUE_NONE, 'Display this application version'), new InputOption('--ansi', '', InputOption::VALUE_NEGATABLE, 'Force (or disable --no-ansi) ANSI output', null), new InputOption('--no-interaction', '-n', InputOption::VALUE_NONE, 'Do not ask any interactive question')]); } /** * Gets the default commands that should always be available. * * @return Command[] */ protected function getDefaultCommands() { return [new HelpCommand(), new ListCommand(), new CompleteCommand(), new DumpCompletionCommand()]; } /** * Gets the default helper set with the helpers that should always be available. * * @return HelperSet */ protected function getDefaultHelperSet() { return new HelperSet([new FormatterHelper(), new DebugFormatterHelper(), new ProcessHelper(), new QuestionHelper()]); } /** * Returns abbreviated suggestions in string format. */ private function getAbbreviationSuggestions(array $abbrevs) : string { return ' ' . \implode("\n ", $abbrevs); } /** * Returns the namespace part of the command name. * * This method is not part of public API and should not be used directly. * * @return string */ public function extractNamespace(string $name, int $limit = null) { $parts = \explode(':', $name, -1); return \implode(':', null === $limit ? $parts : \array_slice($parts, 0, $limit)); } /** * Finds alternative of $name among $collection, * if nothing is found in $collection, try in $abbrevs. * * @return string[] */ private function findAlternatives(string $name, iterable $collection) : array { $threshold = 1000.0; $alternatives = []; $collectionParts = []; foreach ($collection as $item) { $collectionParts[$item] = \explode(':', $item); } foreach (\explode(':', $name) as $i => $subname) { foreach ($collectionParts as $collectionName => $parts) { $exists = isset($alternatives[$collectionName]); if (!isset($parts[$i]) && $exists) { $alternatives[$collectionName] += $threshold; continue; } elseif (!isset($parts[$i])) { continue; } $lev = \levenshtein($subname, $parts[$i]); if ($lev <= \strlen($subname) / 3 || '' !== $subname && \str_contains($parts[$i], $subname)) { $alternatives[$collectionName] = $exists ? $alternatives[$collectionName] + $lev : $lev; } elseif ($exists) { $alternatives[$collectionName] += $threshold; } } } foreach ($collection as $item) { $lev = \levenshtein($name, $item); if ($lev <= \strlen($name) / 3 || \str_contains($item, $name)) { $alternatives[$item] = isset($alternatives[$item]) ? $alternatives[$item] - $lev : $lev; } } $alternatives = \array_filter($alternatives, function ($lev) use($threshold) { return $lev < 2 * $threshold; }); \ksort($alternatives, \SORT_NATURAL | \SORT_FLAG_CASE); return \array_keys($alternatives); } /** * Sets the default Command name. * * @return $this */ public function setDefaultCommand(string $commandName, bool $isSingleCommand = \false) { $this->defaultCommand = \explode('|', \ltrim($commandName, '|'))[0]; if ($isSingleCommand) { // Ensure the command exist $this->find($commandName); $this->singleCommand = \true; } return $this; } /** * @internal */ public function isSingleCommand() : bool { return $this->singleCommand; } private function splitStringByWidth(string $string, int $width) : array { // str_split is not suitable for multi-byte characters, we should use preg_split to get char array properly. // additionally, array_slice() is not enough as some character has doubled width. // we need a function to split string not by character count but by string width if (\false === ($encoding = \mb_detect_encoding($string, null, \true))) { return \str_split($string, $width); } $utf8String = \mb_convert_encoding($string, 'utf8', $encoding); $lines = []; $line = ''; $offset = 0; while (\preg_match('/.{1,10000}/u', $utf8String, $m, 0, $offset)) { $offset += \strlen($m[0]); foreach (\preg_split('//u', $m[0]) as $char) { // test if $char could be appended to current line if (\mb_strwidth($line . $char, 'utf8') <= $width) { $line .= $char; continue; } // if not, push current line to array and make new line $lines[] = \str_pad($line, $width); $line = $char; } } $lines[] = \count($lines) ? \str_pad($line, $width) : $line; \mb_convert_variables($encoding, 'utf8', $lines); return $lines; } /** * Returns all namespaces of the command name. * * @return string[] */ private function extractAllNamespaces(string $name) : array { // -1 as third argument is needed to skip the command short name when exploding $parts = \explode(':', $name, -1); $namespaces = []; foreach ($parts as $part) { if (\count($namespaces)) { $namespaces[] = \end($namespaces) . ':' . $part; } else { $namespaces[] = $part; } } return $namespaces; } private function init() { if ($this->initialized) { return; } $this->initialized = \true; foreach ($this->getDefaultCommands() as $command) { $this->add($command); } } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Attribute; /** * Service tag to autoconfigure commands. */ #[\Attribute(\Attribute::TARGET_CLASS)] class AsCommand { public function __construct(public string $name, public ?string $description = null, array $aliases = [], bool $hidden = \false) { if (!$hidden && !$aliases) { return; } $name = \explode('|', $name); $name = \array_merge($name, $aliases); if ($hidden && '' !== $name[0]) { \array_unshift($name, ''); } $this->name = \implode('|', $name); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\SignalRegistry; final class SignalRegistry { private $signalHandlers = []; public function __construct() { if (\function_exists('pcntl_async_signals')) { \pcntl_async_signals(\true); } } public function register(int $signal, callable $signalHandler) : void { if (!isset($this->signalHandlers[$signal])) { $previousCallback = \pcntl_signal_get_handler($signal); if (\is_callable($previousCallback)) { $this->signalHandlers[$signal][] = $previousCallback; } } $this->signalHandlers[$signal][] = $signalHandler; \pcntl_signal($signal, [$this, 'handle']); } public static function isSupported() : bool { if (!\function_exists('pcntl_signal')) { return \false; } if (\in_array('pcntl_signal', \explode(',', \ini_get('disable_functions')))) { return \false; } return \true; } /** * @internal */ public function handle(int $signal) : void { $count = \count($this->signalHandlers[$signal]); foreach ($this->signalHandlers[$signal] as $i => $signalHandler) { $hasNext = $i !== $count - 1; $signalHandler($signal, $hasNext); } } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception; /** * @author Jérôme Tamarelle */ class LogicException extends \LogicException implements ExceptionInterface { } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception; /** * Represents an incorrect namespace typed in the console. * * @author Pierre du Plessis */ class NamespaceNotFoundException extends CommandNotFoundException { } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception; /** * ExceptionInterface. * * @author Jérôme Tamarelle */ interface ExceptionInterface extends \Throwable { } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception; /** * @author Jérôme Tamarelle */ class RuntimeException extends \RuntimeException implements ExceptionInterface { } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception; /** * Represents an incorrect command name typed in the console. * * @author Jérôme Tamarelle */ class CommandNotFoundException extends \InvalidArgumentException implements ExceptionInterface { private $alternatives; /** * @param string $message Exception message to throw * @param string[] $alternatives List of similar defined names * @param int $code Exception code * @param \Throwable|null $previous Previous exception used for the exception chaining */ public function __construct(string $message, array $alternatives = [], int $code = 0, \Throwable $previous = null) { parent::__construct($message, $code, $previous); $this->alternatives = $alternatives; } /** * @return string[] */ public function getAlternatives() { return $this->alternatives; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception; /** * Represents an incorrect option name or value typed in the console. * * @author Jérôme Tamarelle */ class InvalidOptionException extends \InvalidArgumentException implements ExceptionInterface { } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception; /** * Represents failure to read input from stdin. * * @author Gabriel Ostrolucký */ class MissingInputException extends RuntimeException implements ExceptionInterface { } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception; /** * @author Jérôme Tamarelle */ class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface { } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\CommandLoader; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Command\Command; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception\CommandNotFoundException; /** * @author Robin Chalas */ interface CommandLoaderInterface { /** * Loads a command. * * @return Command * * @throws CommandNotFoundException */ public function get(string $name); /** * Checks if a command exists. * * @return bool */ public function has(string $name); /** * @return string[] */ public function getNames(); } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\CommandLoader; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception\CommandNotFoundException; /** * A simple command loader using factories to instantiate commands lazily. * * @author Maxime Steinhausser */ class FactoryCommandLoader implements CommandLoaderInterface { private $factories; /** * @param callable[] $factories Indexed by command names */ public function __construct(array $factories) { $this->factories = $factories; } /** * {@inheritdoc} */ public function has(string $name) { return isset($this->factories[$name]); } /** * {@inheritdoc} */ public function get(string $name) { if (!isset($this->factories[$name])) { throw new CommandNotFoundException(\sprintf('Command "%s" does not exist.', $name)); } $factory = $this->factories[$name]; return $factory(); } /** * {@inheritdoc} */ public function getNames() { return \array_keys($this->factories); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\CommandLoader; use _HumbugBox1cb33d1f20f1\Psr\Container\ContainerInterface; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception\CommandNotFoundException; /** * Loads commands from a PSR-11 container. * * @author Robin Chalas */ class ContainerCommandLoader implements CommandLoaderInterface { private $container; private $commandMap; /** * @param array $commandMap An array with command names as keys and service ids as values */ public function __construct(ContainerInterface $container, array $commandMap) { $this->container = $container; $this->commandMap = $commandMap; } /** * {@inheritdoc} */ public function get(string $name) { if (!$this->has($name)) { throw new CommandNotFoundException(\sprintf('Command "%s" does not exist.', $name)); } return $this->container->get($this->commandMap[$name]); } /** * {@inheritdoc} */ public function has(string $name) { return isset($this->commandMap[$name]) && $this->container->has($this->commandMap[$name]); } /** * {@inheritdoc} */ public function getNames() { return \array_keys($this->commandMap); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Formatter; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception\InvalidArgumentException; use _HumbugBox1cb33d1f20f1\Symfony\Contracts\Service\ResetInterface; /** * @author Jean-François Simon */ class OutputFormatterStyleStack implements ResetInterface { /** * @var OutputFormatterStyleInterface[] */ private $styles; private $emptyStyle; public function __construct(OutputFormatterStyleInterface $emptyStyle = null) { $this->emptyStyle = $emptyStyle ?? new OutputFormatterStyle(); $this->reset(); } /** * Resets stack (ie. empty internal arrays). */ public function reset() { $this->styles = []; } /** * Pushes a style in the stack. */ public function push(OutputFormatterStyleInterface $style) { $this->styles[] = $style; } /** * Pops a style from the stack. * * @return OutputFormatterStyleInterface * * @throws InvalidArgumentException When style tags incorrectly nested */ public function pop(OutputFormatterStyleInterface $style = null) { if (empty($this->styles)) { return $this->emptyStyle; } if (null === $style) { return \array_pop($this->styles); } foreach (\array_reverse($this->styles, \true) as $index => $stackedStyle) { if ($style->apply('') === $stackedStyle->apply('')) { $this->styles = \array_slice($this->styles, 0, $index); return $stackedStyle; } } throw new InvalidArgumentException('Incorrectly nested style tag found.'); } /** * Computes current style with stacks top codes. * * @return OutputFormatterStyle */ public function getCurrent() { if (empty($this->styles)) { return $this->emptyStyle; } return $this->styles[\count($this->styles) - 1]; } /** * @return $this */ public function setEmptyStyle(OutputFormatterStyleInterface $emptyStyle) { $this->emptyStyle = $emptyStyle; return $this; } /** * @return OutputFormatterStyleInterface */ public function getEmptyStyle() { return $this->emptyStyle; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Formatter; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Color; /** * Formatter style class for defining styles. * * @author Konstantin Kudryashov */ class OutputFormatterStyle implements OutputFormatterStyleInterface { private $color; private $foreground; private $background; private $options; private $href; private $handlesHrefGracefully; /** * Initializes output formatter style. * * @param string|null $foreground The style foreground color name * @param string|null $background The style background color name */ public function __construct(string $foreground = null, string $background = null, array $options = []) { $this->color = new Color($this->foreground = $foreground ?: '', $this->background = $background ?: '', $this->options = $options); } /** * {@inheritdoc} */ public function setForeground(string $color = null) { $this->color = new Color($this->foreground = $color ?: '', $this->background, $this->options); } /** * {@inheritdoc} */ public function setBackground(string $color = null) { $this->color = new Color($this->foreground, $this->background = $color ?: '', $this->options); } public function setHref(string $url) : void { $this->href = $url; } /** * {@inheritdoc} */ public function setOption(string $option) { $this->options[] = $option; $this->color = new Color($this->foreground, $this->background, $this->options); } /** * {@inheritdoc} */ public function unsetOption(string $option) { $pos = \array_search($option, $this->options); if (\false !== $pos) { unset($this->options[$pos]); } $this->color = new Color($this->foreground, $this->background, $this->options); } /** * {@inheritdoc} */ public function setOptions(array $options) { $this->color = new Color($this->foreground, $this->background, $this->options = $options); } /** * {@inheritdoc} */ public function apply(string $text) { if (null === $this->handlesHrefGracefully) { $this->handlesHrefGracefully = 'JetBrains-JediTerm' !== \getenv('TERMINAL_EMULATOR') && (!\getenv('KONSOLE_VERSION') || (int) \getenv('KONSOLE_VERSION') > 201100); } if (null !== $this->href && $this->handlesHrefGracefully) { $text = "\x1b]8;;{$this->href}\x1b\\{$text}\x1b]8;;\x1b\\"; } return $this->color->apply($text); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Formatter; /** * Formatter interface for console output. * * @author Konstantin Kudryashov */ interface OutputFormatterInterface { /** * Sets the decorated flag. */ public function setDecorated(bool $decorated); /** * Whether the output will decorate messages. * * @return bool */ public function isDecorated(); /** * Sets a new style. */ public function setStyle(string $name, OutputFormatterStyleInterface $style); /** * Checks if output formatter has style with specified name. * * @return bool */ public function hasStyle(string $name); /** * Gets style options from style with specified name. * * @return OutputFormatterStyleInterface * * @throws \InvalidArgumentException When style isn't defined */ public function getStyle(string $name); /** * Formats a message according to the given styles. * * @return string|null */ public function format(?string $message); } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Formatter; /** * @author Tien Xuan Vo */ final class NullOutputFormatter implements OutputFormatterInterface { private $style; /** * {@inheritdoc} */ public function format(?string $message) : ?string { return null; } /** * {@inheritdoc} */ public function getStyle(string $name) : OutputFormatterStyleInterface { // to comply with the interface we must return a OutputFormatterStyleInterface return $this->style ?? ($this->style = new NullOutputFormatterStyle()); } /** * {@inheritdoc} */ public function hasStyle(string $name) : bool { return \false; } /** * {@inheritdoc} */ public function isDecorated() : bool { return \false; } /** * {@inheritdoc} */ public function setDecorated(bool $decorated) : void { // do nothing } /** * {@inheritdoc} */ public function setStyle(string $name, OutputFormatterStyleInterface $style) : void { // do nothing } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Formatter; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception\InvalidArgumentException; /** * Formatter class for console output. * * @author Konstantin Kudryashov * @author Roland Franssen */ class OutputFormatter implements WrappableOutputFormatterInterface { private $decorated; private $styles = []; private $styleStack; public function __clone() { $this->styleStack = clone $this->styleStack; foreach ($this->styles as $key => $value) { $this->styles[$key] = clone $value; } } /** * Escapes "<" and ">" special chars in given text. * * @return string */ public static function escape(string $text) { $text = \preg_replace('/([^\\\\]|^)([<>])/', '$1\\\\$2', $text); return self::escapeTrailingBackslash($text); } /** * Escapes trailing "\" in given text. * * @internal */ public static function escapeTrailingBackslash(string $text) : string { if (\str_ends_with($text, '\\')) { $len = \strlen($text); $text = \rtrim($text, '\\'); $text = \str_replace("\x00", '', $text); $text .= \str_repeat("\x00", $len - \strlen($text)); } return $text; } /** * Initializes console output formatter. * * @param OutputFormatterStyleInterface[] $styles Array of "name => FormatterStyle" instances */ public function __construct(bool $decorated = \false, array $styles = []) { $this->decorated = $decorated; $this->setStyle('error', new OutputFormatterStyle('white', 'red')); $this->setStyle('info', new OutputFormatterStyle('green')); $this->setStyle('comment', new OutputFormatterStyle('yellow')); $this->setStyle('question', new OutputFormatterStyle('black', 'cyan')); foreach ($styles as $name => $style) { $this->setStyle($name, $style); } $this->styleStack = new OutputFormatterStyleStack(); } /** * {@inheritdoc} */ public function setDecorated(bool $decorated) { $this->decorated = $decorated; } /** * {@inheritdoc} */ public function isDecorated() { return $this->decorated; } /** * {@inheritdoc} */ public function setStyle(string $name, OutputFormatterStyleInterface $style) { $this->styles[\strtolower($name)] = $style; } /** * {@inheritdoc} */ public function hasStyle(string $name) { return isset($this->styles[\strtolower($name)]); } /** * {@inheritdoc} */ public function getStyle(string $name) { if (!$this->hasStyle($name)) { throw new InvalidArgumentException(\sprintf('Undefined style: "%s".', $name)); } return $this->styles[\strtolower($name)]; } /** * {@inheritdoc} */ public function format(?string $message) { return $this->formatAndWrap($message, 0); } /** * {@inheritdoc} */ public function formatAndWrap(?string $message, int $width) { if (null === $message) { return ''; } $offset = 0; $output = ''; $openTagRegex = '[a-z](?:[^\\\\<>]*+ | \\\\.)*'; $closeTagRegex = '[a-z][^<>]*+'; $currentLineLength = 0; \preg_match_all("#<(({$openTagRegex}) | /({$closeTagRegex})?)>#ix", $message, $matches, \PREG_OFFSET_CAPTURE); foreach ($matches[0] as $i => $match) { $pos = $match[1]; $text = $match[0]; if (0 != $pos && '\\' == $message[$pos - 1]) { continue; } // add the text up to the next tag $output .= $this->applyCurrentStyle(\substr($message, $offset, $pos - $offset), $output, $width, $currentLineLength); $offset = $pos + \strlen($text); // opening tag? if ($open = '/' != $text[1]) { $tag = $matches[1][$i][0]; } else { $tag = $matches[3][$i][0] ?? ''; } if (!$open && !$tag) { // $this->styleStack->pop(); } elseif (null === ($style = $this->createStyleFromString($tag))) { $output .= $this->applyCurrentStyle($text, $output, $width, $currentLineLength); } elseif ($open) { $this->styleStack->push($style); } else { $this->styleStack->pop($style); } } $output .= $this->applyCurrentStyle(\substr($message, $offset), $output, $width, $currentLineLength); return \strtr($output, ["\x00" => '\\', '\\<' => '<', '\\>' => '>']); } /** * @return OutputFormatterStyleStack */ public function getStyleStack() { return $this->styleStack; } /** * Tries to create new style instance from string. */ private function createStyleFromString(string $string) : ?OutputFormatterStyleInterface { if (isset($this->styles[$string])) { return $this->styles[$string]; } if (!\preg_match_all('/([^=]+)=([^;]+)(;|$)/', $string, $matches, \PREG_SET_ORDER)) { return null; } $style = new OutputFormatterStyle(); foreach ($matches as $match) { \array_shift($match); $match[0] = \strtolower($match[0]); if ('fg' == $match[0]) { $style->setForeground(\strtolower($match[1])); } elseif ('bg' == $match[0]) { $style->setBackground(\strtolower($match[1])); } elseif ('href' === $match[0]) { $url = \preg_replace('{\\\\([<>])}', '$1', $match[1]); $style->setHref($url); } elseif ('options' === $match[0]) { \preg_match_all('([^,;]+)', \strtolower($match[1]), $options); $options = \array_shift($options); foreach ($options as $option) { $style->setOption($option); } } else { return null; } } return $style; } /** * Applies current style from stack to text, if must be applied. */ private function applyCurrentStyle(string $text, string $current, int $width, int &$currentLineLength) : string { if ('' === $text) { return ''; } if (!$width) { return $this->isDecorated() ? $this->styleStack->getCurrent()->apply($text) : $text; } if (!$currentLineLength && '' !== $current) { $text = \ltrim($text); } if ($currentLineLength) { $prefix = \substr($text, 0, $i = $width - $currentLineLength) . "\n"; $text = \substr($text, $i); } else { $prefix = ''; } \preg_match('~(\\n)$~', $text, $matches); $text = $prefix . \preg_replace('~([^\\n]{' . $width . '})\\ *~', "\$1\n", $text); $text = \rtrim($text, "\n") . ($matches[1] ?? ''); if (!$currentLineLength && '' !== $current && "\n" !== \substr($current, -1)) { $text = "\n" . $text; } $lines = \explode("\n", $text); foreach ($lines as $line) { $currentLineLength += \strlen($line); if ($width <= $currentLineLength) { $currentLineLength = 0; } } if ($this->isDecorated()) { foreach ($lines as $i => $line) { $lines[$i] = $this->styleStack->getCurrent()->apply($line); } } return \implode("\n", $lines); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Formatter; /** * Formatter interface for console output that supports word wrapping. * * @author Roland Franssen */ interface WrappableOutputFormatterInterface extends OutputFormatterInterface { /** * Formats a message according to the given styles, wrapping at `$width` (0 means no wrapping). */ public function formatAndWrap(?string $message, int $width); } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Formatter; /** * @author Tien Xuan Vo */ final class NullOutputFormatterStyle implements OutputFormatterStyleInterface { /** * {@inheritdoc} */ public function apply(string $text) : string { return $text; } /** * {@inheritdoc} */ public function setBackground(string $color = null) : void { // do nothing } /** * {@inheritdoc} */ public function setForeground(string $color = null) : void { // do nothing } /** * {@inheritdoc} */ public function setOption(string $option) : void { // do nothing } /** * {@inheritdoc} */ public function setOptions(array $options) : void { // do nothing } /** * {@inheritdoc} */ public function unsetOption(string $option) : void { // do nothing } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Formatter; /** * Formatter style interface for defining styles. * * @author Konstantin Kudryashov */ interface OutputFormatterStyleInterface { /** * Sets style foreground color. */ public function setForeground(string $color = null); /** * Sets style background color. */ public function setBackground(string $color = null); /** * Sets some specific style option. */ public function setOption(string $option); /** * Unsets some specific style option. */ public function unsetOption(string $option); /** * Sets multiple style options at once. */ public function setOptions(array $options); /** * Applies the style to a given text. * * @return string */ public function apply(string $text); } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Completion; /** * Represents a single suggested value. * * @author Wouter de Jong */ class Suggestion { private $value; public function __construct(string $value) { $this->value = $value; } public function getValue() : string { return $this->value; } public function __toString() : string { return $this->getValue(); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Completion; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input\InputOption; /** * Stores all completion suggestions for the current input. * * @author Wouter de Jong */ final class CompletionSuggestions { private $valueSuggestions = []; private $optionSuggestions = []; /** * Add a suggested value for an input option or argument. * * @param string|Suggestion $value * * @return $this */ public function suggestValue($value) : self { $this->valueSuggestions[] = !$value instanceof Suggestion ? new Suggestion($value) : $value; return $this; } /** * Add multiple suggested values at once for an input option or argument. * * @param list $values * * @return $this */ public function suggestValues(array $values) : self { foreach ($values as $value) { $this->suggestValue($value); } return $this; } /** * Add a suggestion for an input option name. * * @return $this */ public function suggestOption(InputOption $option) : self { $this->optionSuggestions[] = $option; return $this; } /** * Add multiple suggestions for input option names at once. * * @param InputOption[] $options * * @return $this */ public function suggestOptions(array $options) : self { foreach ($options as $option) { $this->suggestOption($option); } return $this; } /** * @return InputOption[] */ public function getOptionSuggestions() : array { return $this->optionSuggestions; } /** * @return Suggestion[] */ public function getValueSuggestions() : array { return $this->valueSuggestions; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Completion; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception\RuntimeException; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input\ArgvInput; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input\InputDefinition; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input\InputOption; /** * An input specialized for shell completion. * * This input allows unfinished option names or values and exposes what kind of * completion is expected. * * @author Wouter de Jong */ final class CompletionInput extends ArgvInput { public const TYPE_ARGUMENT_VALUE = 'argument_value'; public const TYPE_OPTION_VALUE = 'option_value'; public const TYPE_OPTION_NAME = 'option_name'; public const TYPE_NONE = 'none'; private $tokens; private $currentIndex; private $completionType; private $completionName = null; private $completionValue = ''; /** * Converts a terminal string into tokens. * * This is required for shell completions without COMP_WORDS support. */ public static function fromString(string $inputStr, int $currentIndex) : self { \preg_match_all('/(?<=^|\\s)([\'"]?)(.+?)(?tokens = $tokens; $input->currentIndex = $currentIndex; return $input; } /** * {@inheritdoc} */ public function bind(InputDefinition $definition) : void { parent::bind($definition); $relevantToken = $this->getRelevantToken(); if ('-' === $relevantToken[0]) { // the current token is an input option: complete either option name or option value [$optionToken, $optionValue] = \explode('=', $relevantToken, 2) + ['', '']; $option = $this->getOptionFromToken($optionToken); if (null === $option && !$this->isCursorFree()) { $this->completionType = self::TYPE_OPTION_NAME; $this->completionValue = $relevantToken; return; } if (null !== $option && $option->acceptValue()) { $this->completionType = self::TYPE_OPTION_VALUE; $this->completionName = $option->getName(); $this->completionValue = $optionValue ?: (!\str_starts_with($optionToken, '--') ? \substr($optionToken, 2) : ''); return; } } $previousToken = $this->tokens[$this->currentIndex - 1]; if ('-' === $previousToken[0] && '' !== \trim($previousToken, '-')) { // check if previous option accepted a value $previousOption = $this->getOptionFromToken($previousToken); if (null !== $previousOption && $previousOption->acceptValue()) { $this->completionType = self::TYPE_OPTION_VALUE; $this->completionName = $previousOption->getName(); $this->completionValue = $relevantToken; return; } } // complete argument value $this->completionType = self::TYPE_ARGUMENT_VALUE; foreach ($this->definition->getArguments() as $argumentName => $argument) { if (!isset($this->arguments[$argumentName])) { break; } $argumentValue = $this->arguments[$argumentName]; $this->completionName = $argumentName; if (\is_array($argumentValue)) { $this->completionValue = $argumentValue ? $argumentValue[\array_key_last($argumentValue)] : null; } else { $this->completionValue = $argumentValue; } } if ($this->currentIndex >= \count($this->tokens)) { if (!isset($this->arguments[$argumentName]) || $this->definition->getArgument($argumentName)->isArray()) { $this->completionName = $argumentName; $this->completionValue = ''; } else { // we've reached the end $this->completionType = self::TYPE_NONE; $this->completionName = null; $this->completionValue = ''; } } } /** * Returns the type of completion required. * * TYPE_ARGUMENT_VALUE when completing the value of an input argument * TYPE_OPTION_VALUE when completing the value of an input option * TYPE_OPTION_NAME when completing the name of an input option * TYPE_NONE when nothing should be completed * * @return string One of self::TYPE_* constants. TYPE_OPTION_NAME and TYPE_NONE are already implemented by the Console component */ public function getCompletionType() : string { return $this->completionType; } /** * The name of the input option or argument when completing a value. * * @return string|null returns null when completing an option name */ public function getCompletionName() : ?string { return $this->completionName; } /** * The value already typed by the user (or empty string). */ public function getCompletionValue() : string { return $this->completionValue; } public function mustSuggestOptionValuesFor(string $optionName) : bool { return self::TYPE_OPTION_VALUE === $this->getCompletionType() && $optionName === $this->getCompletionName(); } public function mustSuggestArgumentValuesFor(string $argumentName) : bool { return self::TYPE_ARGUMENT_VALUE === $this->getCompletionType() && $argumentName === $this->getCompletionName(); } protected function parseToken(string $token, bool $parseOptions) : bool { try { return parent::parseToken($token, $parseOptions); } catch (RuntimeException $e) { // suppress errors, completed input is almost never valid } return $parseOptions; } private function getOptionFromToken(string $optionToken) : ?InputOption { $optionName = \ltrim($optionToken, '-'); if (!$optionName) { return null; } if ('-' === ($optionToken[1] ?? ' ')) { // long option name return $this->definition->hasOption($optionName) ? $this->definition->getOption($optionName) : null; } // short option name return $this->definition->hasShortcut($optionName[0]) ? $this->definition->getOptionForShortcut($optionName[0]) : null; } /** * The token of the cursor, or the last token if the cursor is at the end of the input. */ private function getRelevantToken() : string { return $this->tokens[$this->isCursorFree() ? $this->currentIndex - 1 : $this->currentIndex]; } /** * Whether the cursor is "free" (i.e. at the end of the input preceded by a space). */ private function isCursorFree() : bool { $nrOfTokens = \count($this->tokens); if ($this->currentIndex > $nrOfTokens) { throw new \LogicException('Current index is invalid, it must be the number of input tokens or one more.'); } return $this->currentIndex >= $nrOfTokens; } public function __toString() { $str = ''; foreach ($this->tokens as $i => $token) { $str .= $token; if ($this->currentIndex === $i) { $str .= '|'; } $str .= ' '; } if ($this->currentIndex > $i) { $str .= '|'; } return \rtrim($str); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Completion\Output; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Completion\CompletionSuggestions; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Output\OutputInterface; /** * Transforms the {@see CompletionSuggestions} object into output readable by the shell completion. * * @author Wouter de Jong */ interface CompletionOutputInterface { public function write(CompletionSuggestions $suggestions, OutputInterface $output) : void; } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Completion\Output; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Completion\CompletionSuggestions; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Output\OutputInterface; /** * @author Wouter de Jong */ class BashCompletionOutput implements CompletionOutputInterface { public function write(CompletionSuggestions $suggestions, OutputInterface $output) : void { $values = $suggestions->getValueSuggestions(); foreach ($suggestions->getOptionSuggestions() as $option) { $values[] = '--' . $option->getName(); if ($option->isNegatable()) { $values[] = '--no-' . $option->getName(); } } $output->writeln(\implode("\n", $values)); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception\InvalidArgumentException; /** * @author Fabien Potencier */ final class Color { private const COLORS = ['black' => 0, 'red' => 1, 'green' => 2, 'yellow' => 3, 'blue' => 4, 'magenta' => 5, 'cyan' => 6, 'white' => 7, 'default' => 9]; private const BRIGHT_COLORS = ['gray' => 0, 'bright-red' => 1, 'bright-green' => 2, 'bright-yellow' => 3, 'bright-blue' => 4, 'bright-magenta' => 5, 'bright-cyan' => 6, 'bright-white' => 7]; private const AVAILABLE_OPTIONS = ['bold' => ['set' => 1, 'unset' => 22], 'underscore' => ['set' => 4, 'unset' => 24], 'blink' => ['set' => 5, 'unset' => 25], 'reverse' => ['set' => 7, 'unset' => 27], 'conceal' => ['set' => 8, 'unset' => 28]]; private $foreground; private $background; private $options = []; public function __construct(string $foreground = '', string $background = '', array $options = []) { $this->foreground = $this->parseColor($foreground); $this->background = $this->parseColor($background, \true); foreach ($options as $option) { if (!isset(self::AVAILABLE_OPTIONS[$option])) { throw new InvalidArgumentException(\sprintf('Invalid option specified: "%s". Expected one of (%s).', $option, \implode(', ', \array_keys(self::AVAILABLE_OPTIONS)))); } $this->options[$option] = self::AVAILABLE_OPTIONS[$option]; } } public function apply(string $text) : string { return $this->set() . $text . $this->unset(); } public function set() : string { $setCodes = []; if ('' !== $this->foreground) { $setCodes[] = $this->foreground; } if ('' !== $this->background) { $setCodes[] = $this->background; } foreach ($this->options as $option) { $setCodes[] = $option['set']; } if (0 === \count($setCodes)) { return ''; } return \sprintf("\x1b[%sm", \implode(';', $setCodes)); } public function unset() : string { $unsetCodes = []; if ('' !== $this->foreground) { $unsetCodes[] = 39; } if ('' !== $this->background) { $unsetCodes[] = 49; } foreach ($this->options as $option) { $unsetCodes[] = $option['unset']; } if (0 === \count($unsetCodes)) { return ''; } return \sprintf("\x1b[%sm", \implode(';', $unsetCodes)); } private function parseColor(string $color, bool $background = \false) : string { if ('' === $color) { return ''; } if ('#' === $color[0]) { $color = \substr($color, 1); if (3 === \strlen($color)) { $color = $color[0] . $color[0] . $color[1] . $color[1] . $color[2] . $color[2]; } if (6 !== \strlen($color)) { throw new InvalidArgumentException(\sprintf('Invalid "%s" color.', $color)); } return ($background ? '4' : '3') . $this->convertHexColorToAnsi(\hexdec($color)); } if (isset(self::COLORS[$color])) { return ($background ? '4' : '3') . self::COLORS[$color]; } if (isset(self::BRIGHT_COLORS[$color])) { return ($background ? '10' : '9') . self::BRIGHT_COLORS[$color]; } throw new InvalidArgumentException(\sprintf('Invalid "%s" color; expected one of (%s).', $color, \implode(', ', \array_merge(\array_keys(self::COLORS), \array_keys(self::BRIGHT_COLORS))))); } private function convertHexColorToAnsi(int $color) : string { $r = $color >> 16 & 255; $g = $color >> 8 & 255; $b = $color & 255; // see https://github.com/termstandard/colors/ for more information about true color support if ('truecolor' !== \getenv('COLORTERM')) { return (string) $this->degradeHexColorToAnsi($r, $g, $b); } return \sprintf('8;2;%d;%d;%d', $r, $g, $b); } private function degradeHexColorToAnsi(int $r, int $g, int $b) : int { if (0 === \round($this->getSaturation($r, $g, $b) / 50)) { return 0; } return \round($b / 255) << 2 | \round($g / 255) << 1 | \round($r / 255); } private function getSaturation(int $r, int $g, int $b) : int { $r = $r / 255; $g = $g / 255; $b = $b / 255; $v = \max($r, $g, $b); if (0 === ($diff = $v - \min($r, $g, $b))) { return 0; } return (int) $diff * 100 / $v; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\DependencyInjection; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Command\Command; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Command\LazyCommand; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\CommandLoader\ContainerCommandLoader; use _HumbugBox1cb33d1f20f1\Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument; use _HumbugBox1cb33d1f20f1\Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; use _HumbugBox1cb33d1f20f1\Symfony\Component\DependencyInjection\Compiler\ServiceLocatorTagPass; use _HumbugBox1cb33d1f20f1\Symfony\Component\DependencyInjection\ContainerBuilder; use _HumbugBox1cb33d1f20f1\Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; use _HumbugBox1cb33d1f20f1\Symfony\Component\DependencyInjection\Reference; use _HumbugBox1cb33d1f20f1\Symfony\Component\DependencyInjection\TypedReference; /** * Registers console commands. * * @author Grégoire Pineau */ class AddConsoleCommandPass implements CompilerPassInterface { private $commandLoaderServiceId; private $commandTag; private $noPreloadTag; private $privateTagName; public function __construct(string $commandLoaderServiceId = 'console.command_loader', string $commandTag = 'console.command', string $noPreloadTag = 'container.no_preload', string $privateTagName = 'container.private') { if (0 < \func_num_args()) { trigger_deprecation('symfony/console', '5.3', 'Configuring "%s" is deprecated.', __CLASS__); } $this->commandLoaderServiceId = $commandLoaderServiceId; $this->commandTag = $commandTag; $this->noPreloadTag = $noPreloadTag; $this->privateTagName = $privateTagName; } public function process(ContainerBuilder $container) { $commandServices = $container->findTaggedServiceIds($this->commandTag, \true); $lazyCommandMap = []; $lazyCommandRefs = []; $serviceIds = []; foreach ($commandServices as $id => $tags) { $definition = $container->getDefinition($id); $definition->addTag($this->noPreloadTag); $class = $container->getParameterBag()->resolveValue($definition->getClass()); if (isset($tags[0]['command'])) { $aliases = $tags[0]['command']; } else { if (!($r = $container->getReflectionClass($class))) { throw new InvalidArgumentException(\sprintf('Class "%s" used for service "%s" cannot be found.', $class, $id)); } if (!$r->isSubclassOf(Command::class)) { throw new InvalidArgumentException(\sprintf('The service "%s" tagged "%s" must be a subclass of "%s".', $id, $this->commandTag, Command::class)); } $aliases = \str_replace('%', '%%', $class::getDefaultName() ?? ''); } $aliases = \explode('|', $aliases ?? ''); $commandName = \array_shift($aliases); if ($isHidden = '' === $commandName) { $commandName = \array_shift($aliases); } if (null === $commandName) { if (!$definition->isPublic() || $definition->isPrivate() || $definition->hasTag($this->privateTagName)) { $commandId = 'console.command.public_alias.' . $id; $container->setAlias($commandId, $id)->setPublic(\true); $id = $commandId; } $serviceIds[] = $id; continue; } $description = $tags[0]['description'] ?? null; unset($tags[0]); $lazyCommandMap[$commandName] = $id; $lazyCommandRefs[$id] = new TypedReference($id, $class); foreach ($aliases as $alias) { $lazyCommandMap[$alias] = $id; } foreach ($tags as $tag) { if (isset($tag['command'])) { $aliases[] = $tag['command']; $lazyCommandMap[$tag['command']] = $id; } $description = $description ?? $tag['description'] ?? null; } $definition->addMethodCall('setName', [$commandName]); if ($aliases) { $definition->addMethodCall('setAliases', [$aliases]); } if ($isHidden) { $definition->addMethodCall('setHidden', [\true]); } if (!$description) { if (!($r = $container->getReflectionClass($class))) { throw new InvalidArgumentException(\sprintf('Class "%s" used for service "%s" cannot be found.', $class, $id)); } if (!$r->isSubclassOf(Command::class)) { throw new InvalidArgumentException(\sprintf('The service "%s" tagged "%s" must be a subclass of "%s".', $id, $this->commandTag, Command::class)); } $description = \str_replace('%', '%%', $class::getDefaultDescription() ?? ''); } if ($description) { $definition->addMethodCall('setDescription', [$description]); $container->register('.' . $id . '.lazy', LazyCommand::class)->setArguments([$commandName, $aliases, $description, $isHidden, new ServiceClosureArgument($lazyCommandRefs[$id])]); $lazyCommandRefs[$id] = new Reference('.' . $id . '.lazy'); } } $container->register($this->commandLoaderServiceId, ContainerCommandLoader::class)->setPublic(\true)->addTag($this->noPreloadTag)->setArguments([ServiceLocatorTagPass::register($container, $lazyCommandRefs), $lazyCommandMap]); $container->setParameter('console.command.ids', $serviceIds); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\CI; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Output\OutputInterface; /** * Utility class for Github actions. * * @author Maxime Steinhausser */ class GithubActionReporter { private $output; /** * @see https://github.com/actions/toolkit/blob/5e5e1b7aacba68a53836a34db4a288c3c1c1585b/packages/core/src/command.ts#L80-L85 */ private const ESCAPED_DATA = ['%' => '%25', "\r" => '%0D', "\n" => '%0A']; /** * @see https://github.com/actions/toolkit/blob/5e5e1b7aacba68a53836a34db4a288c3c1c1585b/packages/core/src/command.ts#L87-L94 */ private const ESCAPED_PROPERTIES = ['%' => '%25', "\r" => '%0D', "\n" => '%0A', ':' => '%3A', ',' => '%2C']; public function __construct(OutputInterface $output) { $this->output = $output; } public static function isGithubActionEnvironment() : bool { return \false !== \getenv('GITHUB_ACTIONS'); } /** * Output an error using the Github annotations format. * * @see https://docs.github.com/en/free-pro-team@latest/actions/reference/workflow-commands-for-github-actions#setting-an-error-message */ public function error(string $message, string $file = null, int $line = null, int $col = null) : void { $this->log('error', $message, $file, $line, $col); } /** * Output a warning using the Github annotations format. * * @see https://docs.github.com/en/free-pro-team@latest/actions/reference/workflow-commands-for-github-actions#setting-a-warning-message */ public function warning(string $message, string $file = null, int $line = null, int $col = null) : void { $this->log('warning', $message, $file, $line, $col); } /** * Output a debug log using the Github annotations format. * * @see https://docs.github.com/en/free-pro-team@latest/actions/reference/workflow-commands-for-github-actions#setting-a-debug-message */ public function debug(string $message, string $file = null, int $line = null, int $col = null) : void { $this->log('debug', $message, $file, $line, $col); } private function log(string $type, string $message, string $file = null, int $line = null, int $col = null) : void { // Some values must be encoded. $message = \strtr($message, self::ESCAPED_DATA); if (!$file) { // No file provided, output the message solely: $this->output->writeln(\sprintf('::%s::%s', $type, $message)); return; } $this->output->writeln(\sprintf('::%s file=%s,line=%s,col=%s::%s', $type, \strtr($file, self::ESCAPED_PROPERTIES), \strtr($line ?? 1, self::ESCAPED_PROPERTIES), \strtr($col ?? 0, self::ESCAPED_PROPERTIES), $message)); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\EventListener; use _HumbugBox1cb33d1f20f1\Psr\Log\LoggerInterface; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\ConsoleEvents; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Event\ConsoleErrorEvent; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Event\ConsoleEvent; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Event\ConsoleTerminateEvent; use _HumbugBox1cb33d1f20f1\Symfony\Component\EventDispatcher\EventSubscriberInterface; /** * @author James Halsall * @author Robin Chalas */ class ErrorListener implements EventSubscriberInterface { private $logger; public function __construct(LoggerInterface $logger = null) { $this->logger = $logger; } public function onConsoleError(ConsoleErrorEvent $event) { if (null === $this->logger) { return; } $error = $event->getError(); if (!($inputString = $this->getInputString($event))) { $this->logger->critical('An error occurred while using the console. Message: "{message}"', ['exception' => $error, 'message' => $error->getMessage()]); return; } $this->logger->critical('Error thrown while running command "{command}". Message: "{message}"', ['exception' => $error, 'command' => $inputString, 'message' => $error->getMessage()]); } public function onConsoleTerminate(ConsoleTerminateEvent $event) { if (null === $this->logger) { return; } $exitCode = $event->getExitCode(); if (0 === $exitCode) { return; } if (!($inputString = $this->getInputString($event))) { $this->logger->debug('The console exited with code "{code}"', ['code' => $exitCode]); return; } $this->logger->debug('Command "{command}" exited with code "{code}"', ['command' => $inputString, 'code' => $exitCode]); } public static function getSubscribedEvents() { return [ConsoleEvents::ERROR => ['onConsoleError', -128], ConsoleEvents::TERMINATE => ['onConsoleTerminate', -128]]; } private static function getInputString(ConsoleEvent $event) : ?string { $commandName = $event->getCommand() ? $event->getCommand()->getName() : null; $input = $event->getInput(); if (\method_exists($input, '__toString')) { if ($commandName) { return \str_replace(["'{$commandName}'", "\"{$commandName}\""], $commandName, (string) $input); } return (string) $input; } return $commandName; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Logger; use _HumbugBox1cb33d1f20f1\Psr\Log\AbstractLogger; use _HumbugBox1cb33d1f20f1\Psr\Log\InvalidArgumentException; use _HumbugBox1cb33d1f20f1\Psr\Log\LogLevel; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Output\ConsoleOutputInterface; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Output\OutputInterface; /** * PSR-3 compliant console logger. * * @author Kévin Dunglas * * @see https://www.php-fig.org/psr/psr-3/ */ class ConsoleLogger extends AbstractLogger { public const INFO = 'info'; public const ERROR = 'error'; private $output; private $verbosityLevelMap = [LogLevel::EMERGENCY => OutputInterface::VERBOSITY_NORMAL, LogLevel::ALERT => OutputInterface::VERBOSITY_NORMAL, LogLevel::CRITICAL => OutputInterface::VERBOSITY_NORMAL, LogLevel::ERROR => OutputInterface::VERBOSITY_NORMAL, LogLevel::WARNING => OutputInterface::VERBOSITY_NORMAL, LogLevel::NOTICE => OutputInterface::VERBOSITY_VERBOSE, LogLevel::INFO => OutputInterface::VERBOSITY_VERY_VERBOSE, LogLevel::DEBUG => OutputInterface::VERBOSITY_DEBUG]; private $formatLevelMap = [LogLevel::EMERGENCY => self::ERROR, LogLevel::ALERT => self::ERROR, LogLevel::CRITICAL => self::ERROR, LogLevel::ERROR => self::ERROR, LogLevel::WARNING => self::INFO, LogLevel::NOTICE => self::INFO, LogLevel::INFO => self::INFO, LogLevel::DEBUG => self::INFO]; private $errored = \false; public function __construct(OutputInterface $output, array $verbosityLevelMap = [], array $formatLevelMap = []) { $this->output = $output; $this->verbosityLevelMap = $verbosityLevelMap + $this->verbosityLevelMap; $this->formatLevelMap = $formatLevelMap + $this->formatLevelMap; } /** * {@inheritdoc} * * @return void */ public function log($level, $message, array $context = []) { if (!isset($this->verbosityLevelMap[$level])) { throw new InvalidArgumentException(\sprintf('The log level "%s" does not exist.', $level)); } $output = $this->output; // Write to the error output if necessary and available if (self::ERROR === $this->formatLevelMap[$level]) { if ($this->output instanceof ConsoleOutputInterface) { $output = $output->getErrorOutput(); } $this->errored = \true; } // the if condition check isn't necessary -- it's the same one that $output will do internally anyway. // We only do it for efficiency here as the message formatting is relatively expensive. if ($output->getVerbosity() >= $this->verbosityLevelMap[$level]) { $output->writeln(\sprintf('<%1$s>[%2$s] %3$s', $this->formatLevelMap[$level], $level, $this->interpolate($message, $context)), $this->verbosityLevelMap[$level]); } } /** * Returns true when any messages have been logged at error levels. * * @return bool */ public function hasErrored() { return $this->errored; } /** * Interpolates context values into the message placeholders. * * @author PHP Framework Interoperability Group */ private function interpolate(string $message, array $context) : string { if (!\str_contains($message, '{')) { return $message; } $replacements = []; foreach ($context as $key => $val) { if (null === $val || \is_scalar($val) || \is_object($val) && \method_exists($val, '__toString')) { $replacements["{{$key}}"] = $val; } elseif ($val instanceof \DateTimeInterface) { $replacements["{{$key}}"] = $val->format(\DateTime::RFC3339); } elseif (\is_object($val)) { $replacements["{{$key}}"] = '[object ' . \get_class($val) . ']'; } else { $replacements["{{$key}}"] = '[' . \gettype($val) . ']'; } } return \strtr($message, $replacements); } } Copyright (c) 2004-2022 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. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Question; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception\InvalidArgumentException; /** * Represents a choice question. * * @author Fabien Potencier */ class ChoiceQuestion extends Question { private $choices; private $multiselect = \false; private $prompt = ' > '; private $errorMessage = 'Value "%s" is invalid'; /** * @param string $question The question to ask to the user * @param array $choices The list of available choices * @param mixed $default The default answer to return */ public function __construct(string $question, array $choices, $default = null) { if (!$choices) { throw new \LogicException('Choice question must have at least 1 choice available.'); } parent::__construct($question, $default); $this->choices = $choices; $this->setValidator($this->getDefaultValidator()); $this->setAutocompleterValues($choices); } /** * Returns available choices. * * @return array */ public function getChoices() { return $this->choices; } /** * Sets multiselect option. * * When multiselect is set to true, multiple choices can be answered. * * @return $this */ public function setMultiselect(bool $multiselect) { $this->multiselect = $multiselect; $this->setValidator($this->getDefaultValidator()); return $this; } /** * Returns whether the choices are multiselect. * * @return bool */ public function isMultiselect() { return $this->multiselect; } /** * Gets the prompt for choices. * * @return string */ public function getPrompt() { return $this->prompt; } /** * Sets the prompt for choices. * * @return $this */ public function setPrompt(string $prompt) { $this->prompt = $prompt; return $this; } /** * Sets the error message for invalid values. * * The error message has a string placeholder (%s) for the invalid value. * * @return $this */ public function setErrorMessage(string $errorMessage) { $this->errorMessage = $errorMessage; $this->setValidator($this->getDefaultValidator()); return $this; } private function getDefaultValidator() : callable { $choices = $this->choices; $errorMessage = $this->errorMessage; $multiselect = $this->multiselect; $isAssoc = $this->isAssoc($choices); return function ($selected) use($choices, $errorMessage, $multiselect, $isAssoc) { if ($multiselect) { // Check for a separated comma values if (!\preg_match('/^[^,]+(?:,[^,]+)*$/', (string) $selected, $matches)) { throw new InvalidArgumentException(\sprintf($errorMessage, $selected)); } $selectedChoices = \explode(',', (string) $selected); } else { $selectedChoices = [$selected]; } if ($this->isTrimmable()) { foreach ($selectedChoices as $k => $v) { $selectedChoices[$k] = \trim((string) $v); } } $multiselectChoices = []; foreach ($selectedChoices as $value) { $results = []; foreach ($choices as $key => $choice) { if ($choice === $value) { $results[] = $key; } } if (\count($results) > 1) { throw new InvalidArgumentException(\sprintf('The provided answer is ambiguous. Value should be one of "%s".', \implode('" or "', $results))); } $result = \array_search($value, $choices); if (!$isAssoc) { if (\false !== $result) { $result = $choices[$result]; } elseif (isset($choices[$value])) { $result = $choices[$value]; } } elseif (\false === $result && isset($choices[$value])) { $result = $value; } if (\false === $result) { throw new InvalidArgumentException(\sprintf($errorMessage, $value)); } // For associative choices, consistently return the key as string: $multiselectChoices[] = $isAssoc ? (string) $result : $result; } if ($multiselect) { return $multiselectChoices; } return \current($multiselectChoices); }; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Question; /** * Represents a yes/no question. * * @author Fabien Potencier */ class ConfirmationQuestion extends Question { private $trueAnswerRegex; /** * @param string $question The question to ask to the user * @param bool $default The default answer to return, true or false * @param string $trueAnswerRegex A regex to match the "yes" answer */ public function __construct(string $question, bool $default = \true, string $trueAnswerRegex = '/^y/i') { parent::__construct($question, $default); $this->trueAnswerRegex = $trueAnswerRegex; $this->setNormalizer($this->getDefaultNormalizer()); } /** * Returns the default answer normalizer. */ private function getDefaultNormalizer() : callable { $default = $this->getDefault(); $regex = $this->trueAnswerRegex; return function ($answer) use($default, $regex) { if (\is_bool($answer)) { return $answer; } $answerIsTrue = (bool) \preg_match($regex, $answer); if (\false === $default) { return $answer && $answerIsTrue; } return '' === $answer || $answerIsTrue; }; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Question; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception\InvalidArgumentException; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception\LogicException; /** * Represents a Question. * * @author Fabien Potencier */ class Question { private $question; private $attempts; private $hidden = \false; private $hiddenFallback = \true; private $autocompleterCallback; private $validator; private $default; private $normalizer; private $trimmable = \true; private $multiline = \false; /** * @param string $question The question to ask to the user * @param string|bool|int|float|null $default The default answer to return if the user enters nothing */ public function __construct(string $question, $default = null) { $this->question = $question; $this->default = $default; } /** * Returns the question. * * @return string */ public function getQuestion() { return $this->question; } /** * Returns the default answer. * * @return string|bool|int|float|null */ public function getDefault() { return $this->default; } /** * Returns whether the user response accepts newline characters. */ public function isMultiline() : bool { return $this->multiline; } /** * Sets whether the user response should accept newline characters. * * @return $this */ public function setMultiline(bool $multiline) : self { $this->multiline = $multiline; return $this; } /** * Returns whether the user response must be hidden. * * @return bool */ public function isHidden() { return $this->hidden; } /** * Sets whether the user response must be hidden or not. * * @return $this * * @throws LogicException In case the autocompleter is also used */ public function setHidden(bool $hidden) { if ($this->autocompleterCallback) { throw new LogicException('A hidden question cannot use the autocompleter.'); } $this->hidden = $hidden; return $this; } /** * In case the response cannot be hidden, whether to fallback on non-hidden question or not. * * @return bool */ public function isHiddenFallback() { return $this->hiddenFallback; } /** * Sets whether to fallback on non-hidden question if the response cannot be hidden. * * @return $this */ public function setHiddenFallback(bool $fallback) { $this->hiddenFallback = $fallback; return $this; } /** * Gets values for the autocompleter. * * @return iterable|null */ public function getAutocompleterValues() { $callback = $this->getAutocompleterCallback(); return $callback ? $callback('') : null; } /** * Sets values for the autocompleter. * * @return $this * * @throws LogicException */ public function setAutocompleterValues(?iterable $values) { if (\is_array($values)) { $values = $this->isAssoc($values) ? \array_merge(\array_keys($values), \array_values($values)) : \array_values($values); $callback = static function () use($values) { return $values; }; } elseif ($values instanceof \Traversable) { $valueCache = null; $callback = static function () use($values, &$valueCache) { return $valueCache ?? ($valueCache = \iterator_to_array($values, \false)); }; } else { $callback = null; } return $this->setAutocompleterCallback($callback); } /** * Gets the callback function used for the autocompleter. */ public function getAutocompleterCallback() : ?callable { return $this->autocompleterCallback; } /** * Sets the callback function used for the autocompleter. * * The callback is passed the user input as argument and should return an iterable of corresponding suggestions. * * @return $this */ public function setAutocompleterCallback(callable $callback = null) : self { if ($this->hidden && null !== $callback) { throw new LogicException('A hidden question cannot use the autocompleter.'); } $this->autocompleterCallback = $callback; return $this; } /** * Sets a validator for the question. * * @return $this */ public function setValidator(callable $validator = null) { $this->validator = $validator; return $this; } /** * Gets the validator for the question. * * @return callable|null */ public function getValidator() { return $this->validator; } /** * Sets the maximum number of attempts. * * Null means an unlimited number of attempts. * * @return $this * * @throws InvalidArgumentException in case the number of attempts is invalid */ public function setMaxAttempts(?int $attempts) { if (null !== $attempts && $attempts < 1) { throw new InvalidArgumentException('Maximum number of attempts must be a positive value.'); } $this->attempts = $attempts; return $this; } /** * Gets the maximum number of attempts. * * Null means an unlimited number of attempts. * * @return int|null */ public function getMaxAttempts() { return $this->attempts; } /** * Sets a normalizer for the response. * * The normalizer can be a callable (a string), a closure or a class implementing __invoke. * * @return $this */ public function setNormalizer(callable $normalizer) { $this->normalizer = $normalizer; return $this; } /** * Gets the normalizer for the response. * * The normalizer can ba a callable (a string), a closure or a class implementing __invoke. * * @return callable|null */ public function getNormalizer() { return $this->normalizer; } protected function isAssoc(array $array) { return (bool) \count(\array_filter(\array_keys($array), 'is_string')); } public function isTrimmable() : bool { return $this->trimmable; } /** * @return $this */ public function setTrimmable(bool $trimmable) : self { $this->trimmable = $trimmable; return $this; } } MZ@ !L!This program cannot be run in DOS mode. $,;B;B;B2מ:B2-B2ƞ9B2ў?Ba98B;CB2Ȟ:B2֞:B2Ӟ:BRich;BPELMoO  8 @`?@"P@ Pp!8!@ .text   `.rdata @@.data0@.rsrc @@@.relocP"@Bj$@xj @eEPV @EЃPV @MX @eEP5H @L @YY5\ @EP5` @D @YYP @MMT @3H; 0@uh@l3@$40@5h3@40@h$0@h(0@h 0@ @00@}jYjh"@3ۉ]dp]俀3@SVW0 @;t;u3Fuh4 @3F|3@;u j\Y;|3@u,5|3@h @h @YYtE5<0@|3@;uh @h @lYY|3@9]uSW8 @93@th3@Yt SjS3@$0@ @5$0@5(0@5 0@ 80@9,0@u7P @E MPQYYËeE80@39,0@uPh @9<0@u @E80@øMZf9@t3M<@@8PEuH t uՃv39xtv39j,0@p @jl @YY3@3@ @ t3@ @ p3@ @x3@V=0@u h@ @Yg=0@u j @Y3{U(H1@ D1@@1@<1@581@=41@f`1@f T1@f01@f,1@f%(1@f-$1@X1@EL1@EP1@E\1@0@P1@L0@@0@ D0@0@0@ @0@j?Yj @h!@$ @=0@ujYh ( @P, @ËUE8csmu*xu$@= t=!t="t=@u3]hH@ @3% @jh("@b53@5 @YEu u @YgjYe53@։E53@YYEEPEPu5l @YPUEu֣3@uփ3@E EjYËUuNYH]ËV!@!@W;stЃ;r_^ËV"@"@W;stЃ;r_^% @̋UMMZf9t3]ËA<8PEu3ҹ f9H‹]̋UEH<ASVq3WDv} H ;r X;r B(;r3_^[]̋UjhH"@he@dPSVW0@1E3PEdeEh@*tUE-@Ph@Pt;@$ЃEMd Y_^[]ËE3=‹ËeE3Md Y_^[]% @% @he@d5D$l$l$+SVW0@1E3PeuEEEEdËMd Y__^[]QËUuuu uh@h0@]ËVhh3V t VVVVV^3ËU0@eeSWN@;t t У0@`VEP< @u3u @3 @3 @3EP @E3E3;uO@ u 50@։50@^_[%t @%x @%| @% @% @% @% @% @% @Pd5D$ +d$ SVW(0@3PEuEEdËMd Y__^[]QËM3M%T @T$B J3J3l"@s###)r)b)H)4))(((((()#$%%&d&&$('''''(((6('H(Z(t(('''''l'^'R'F'>'>(0'')@W@@MoOl!@0@0@bad allocationH0@!@RSDSьJ!LZc:\users\seld\documents\visual studio 2010\Projects\hiddeninp\Release\hiddeninp.pdbe@@:@@@@"d"@"# $#&D H#(h ###)r)b)H)4))(((((()#$%%&d&&$('''''(((6('H(Z(t(('''''l'^'R'F'>'>(0'')GetConsoleModeSetConsoleMode;GetStdHandleKERNEL32.dll??$?6DU?$char_traits@D@std@@V?$allocator@D@1@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@0@@Z?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@AJ?cin@std@@3V?$basic_istream@DU?$char_traits@D@std@@@1@A??$getline@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@YAAAV?$basic_istream@DU?$char_traits@D@std@@@0@AAV10@AAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@0@@Z??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z_??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ{??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ?endl@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@1@AAV21@@ZMSVCP90.dll_amsg_exit__getmainargs,_cexit|_exitf_XcptFilterexit__initenv_initterm_initterm_e<_configthreadlocale__setusermatherr _adjust_fdiv__p__commode__p__fmodej_encode_pointer__set_app_typeK_crt_debugger_hookC?terminate@@YAXXZMSVCR90.dll_unlock__dllonexitv_lock_onexit`_decode_pointers_except_handler4_common _invoke_watson?_controlfp_sInterlockedExchange!SleepInterlockedCompareExchange-TerminateProcessGetCurrentProcess>UnhandledExceptionFilterSetUnhandledExceptionFilterIsDebuggerPresentTQueryPerformanceCounterfGetTickCountGetCurrentThreadIdGetCurrentProcessIdOGetSystemTimeAsFileTimes__CxxFrameHandler3N@D$!@ 8Ph  @(CV(4VS_VERSION_INFOStringFileInfob040904b0QFileDescriptionReads from stdin without leaking info to the terminal and outputs back to stdout6 FileVersion1, 0, 0, 08 InternalNamehiddeninputPLegalCopyrightJordi Boggiano - 2012HOriginalFilenamehiddeninput.exe: ProductNameHidden Input: ProductVersion1, 0, 0, 0DVarFileInfo$Translation  PAPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDING@00!0/080F0L0T0^0d0n0{000000000000001#1-1@1J1O1T1v1{1111111111111112"2*23292A2M2_2j2p222222222222 333%303N3T3Z3`3f3l3s3z333333333333333334444%4;4B444444444445!5^5c5555H6M6_6}66677 7*7w7|777778 88=8E8P8V8\8b8h8n8t8z88889 $0001 1t1x12 2@2\2`2h2t20 0# This file is part of the Symfony package. # # (c) Fabien Potencier # # For the full copyright and license information, please view # https://symfony.com/doc/current/contributing/code/license.html _sf_{{ COMMAND_NAME }}() { # Use newline as only separator to allow space in completion values IFS=$'\n' local sf_cmd="${COMP_WORDS[0]}" # for an alias, get the real script behind it sf_cmd_type=$(type -t $sf_cmd) if [[ $sf_cmd_type == "alias" ]]; then sf_cmd=$(alias $sf_cmd | sed -E "s/alias $sf_cmd='(.*)'/\1/") elif [[ $sf_cmd_type == "file" ]]; then sf_cmd=$(type -p $sf_cmd) fi if [[ $sf_cmd_type != "function" && ! -x $sf_cmd ]]; then return 1 fi local cur prev words cword _get_comp_words_by_ref -n := cur prev words cword local completecmd=("$sf_cmd" "_complete" "--no-interaction" "-sbash" "-c$cword" "-S{{ VERSION }}") for w in ${words[@]}; do w=$(printf -- '%b' "$w") # remove quotes from typed values quote="${w:0:1}" if [ "$quote" == \' ]; then w="${w%\'}" w="${w#\'}" elif [ "$quote" == \" ]; then w="${w%\"}" w="${w#\"}" fi # empty values are ignored if [ ! -z "$w" ]; then completecmd+=("-i$w") fi done local sfcomplete if sfcomplete=$(${completecmd[@]} 2>&1); then local quote suggestions quote=${cur:0:1} # Use single quotes by default if suggestions contains backslash (FQCN) if [ "$quote" == '' ] && [[ "$sfcomplete" =~ \\ ]]; then quote=\' fi if [ "$quote" == \' ]; then # single quotes: no additional escaping (does not accept ' in values) suggestions=$(for s in $sfcomplete; do printf $'%q%q%q\n' "$quote" "$s" "$quote"; done) elif [ "$quote" == \" ]; then # double quotes: double escaping for \ $ ` " suggestions=$(for s in $sfcomplete; do s=${s//\\/\\\\} s=${s//\$/\\\$} s=${s//\`/\\\`} s=${s//\"/\\\"} printf $'%q%q%q\n' "$quote" "$s" "$quote"; done) else # no quotes: double escaping suggestions=$(for s in $sfcomplete; do printf $'%q\n' $(printf '%q' "$s"); done) fi COMPREPLY=($(IFS=$'\n' compgen -W "$suggestions" -- $(printf -- "%q" "$cur"))) __ltrim_colon_completions "$cur" else if [[ "$sfcomplete" != *"Command \"_complete\" is not defined."* ]]; then >&2 echo >&2 echo $sfcomplete fi return 1 fi } complete -F _sf_{{ COMMAND_NAME }} {{ COMMAND_NAME }} * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Helper; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Formatter\OutputFormatterInterface; use _HumbugBox1cb33d1f20f1\Symfony\Component\String\UnicodeString; /** * Helper is the base class for all helper classes. * * @author Fabien Potencier */ abstract class Helper implements HelperInterface { protected $helperSet = null; /** * {@inheritdoc} */ public function setHelperSet(HelperSet $helperSet = null) { $this->helperSet = $helperSet; } /** * {@inheritdoc} */ public function getHelperSet() { return $this->helperSet; } /** * Returns the length of a string, using mb_strwidth if it is available. * * @deprecated since Symfony 5.3 * * @return int */ public static function strlen(?string $string) { trigger_deprecation('symfony/console', '5.3', 'Method "%s()" is deprecated and will be removed in Symfony 6.0. Use Helper::width() or Helper::length() instead.', __METHOD__); return self::width($string); } /** * Returns the width of a string, using mb_strwidth if it is available. * The width is how many characters positions the string will use. */ public static function width(?string $string) : int { $string ?? ($string = ''); if (\preg_match('//u', $string)) { return (new UnicodeString($string))->width(\false); } if (\false === ($encoding = \mb_detect_encoding($string, null, \true))) { return \strlen($string); } return \mb_strwidth($string, $encoding); } /** * Returns the length of a string, using mb_strlen if it is available. * The length is related to how many bytes the string will use. */ public static function length(?string $string) : int { $string ?? ($string = ''); if (\preg_match('//u', $string)) { return (new UnicodeString($string))->length(); } if (\false === ($encoding = \mb_detect_encoding($string, null, \true))) { return \strlen($string); } return \mb_strlen($string, $encoding); } /** * Returns the subset of a string, using mb_substr if it is available. * * @return string */ public static function substr(?string $string, int $from, int $length = null) { $string ?? ($string = ''); if (\false === ($encoding = \mb_detect_encoding($string, null, \true))) { return \substr($string, $from, $length); } return \mb_substr($string, $from, $length, $encoding); } public static function formatTime($secs) { static $timeFormats = [[0, '< 1 sec'], [1, '1 sec'], [2, 'secs', 1], [60, '1 min'], [120, 'mins', 60], [3600, '1 hr'], [7200, 'hrs', 3600], [86400, '1 day'], [172800, 'days', 86400]]; foreach ($timeFormats as $index => $format) { if ($secs >= $format[0]) { if (isset($timeFormats[$index + 1]) && $secs < $timeFormats[$index + 1][0] || $index == \count($timeFormats) - 1) { if (2 == \count($format)) { return $format[1]; } return \floor($secs / $format[2]) . ' ' . $format[1]; } } } } public static function formatMemory(int $memory) { if ($memory >= 1024 * 1024 * 1024) { return \sprintf('%.1f GiB', $memory / 1024 / 1024 / 1024); } if ($memory >= 1024 * 1024) { return \sprintf('%.1f MiB', $memory / 1024 / 1024); } if ($memory >= 1024) { return \sprintf('%d KiB', $memory / 1024); } return \sprintf('%d B', $memory); } /** * @deprecated since Symfony 5.3 */ public static function strlenWithoutDecoration(OutputFormatterInterface $formatter, ?string $string) { trigger_deprecation('symfony/console', '5.3', 'Method "%s()" is deprecated and will be removed in Symfony 6.0. Use Helper::removeDecoration() instead.', __METHOD__); return self::width(self::removeDecoration($formatter, $string)); } public static function removeDecoration(OutputFormatterInterface $formatter, ?string $string) { $isDecorated = $formatter->isDecorated(); $formatter->setDecorated(\false); // remove <...> formatting $string = $formatter->format($string ?? ''); // remove already formatted characters $string = \preg_replace("/\x1b\\[[^m]*m/", '', $string ?? ''); // remove terminal hyperlinks $string = \preg_replace('/\\033]8;[^;]*;[^\\033]*\\033\\\\/', '', $string ?? ''); $formatter->setDecorated($isDecorated); return $string; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Helper; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Cursor; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception\MissingInputException; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception\RuntimeException; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Formatter\OutputFormatter; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Formatter\OutputFormatterStyle; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input\InputInterface; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input\StreamableInputInterface; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Output\ConsoleOutputInterface; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Output\ConsoleSectionOutput; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Output\OutputInterface; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Question\ChoiceQuestion; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Question\Question; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Terminal; use function _HumbugBox1cb33d1f20f1\Symfony\Component\String\s; /** * The QuestionHelper class provides helpers to interact with the user. * * @author Fabien Potencier */ class QuestionHelper extends Helper { /** * @var resource|null */ private $inputStream; private static $stty = \true; private static $stdinIsInteractive; /** * Asks a question to the user. * * @return mixed The user answer * * @throws RuntimeException If there is no data to read in the input stream */ public function ask(InputInterface $input, OutputInterface $output, Question $question) { if ($output instanceof ConsoleOutputInterface) { $output = $output->getErrorOutput(); } if (!$input->isInteractive()) { return $this->getDefaultAnswer($question); } if ($input instanceof StreamableInputInterface && ($stream = $input->getStream())) { $this->inputStream = $stream; } try { if (!$question->getValidator()) { return $this->doAsk($output, $question); } $interviewer = function () use($output, $question) { return $this->doAsk($output, $question); }; return $this->validateAttempts($interviewer, $output, $question); } catch (MissingInputException $exception) { $input->setInteractive(\false); if (null === ($fallbackOutput = $this->getDefaultAnswer($question))) { throw $exception; } return $fallbackOutput; } } /** * {@inheritdoc} */ public function getName() { return 'question'; } /** * Prevents usage of stty. */ public static function disableStty() { self::$stty = \false; } /** * Asks the question to the user. * * @return mixed * * @throws RuntimeException In case the fallback is deactivated and the response cannot be hidden */ private function doAsk(OutputInterface $output, Question $question) { $this->writePrompt($output, $question); $inputStream = $this->inputStream ?: \STDIN; $autocomplete = $question->getAutocompleterCallback(); if (null === $autocomplete || !self::$stty || !Terminal::hasSttyAvailable()) { $ret = \false; if ($question->isHidden()) { try { $hiddenResponse = $this->getHiddenResponse($output, $inputStream, $question->isTrimmable()); $ret = $question->isTrimmable() ? \trim($hiddenResponse) : $hiddenResponse; } catch (RuntimeException $e) { if (!$question->isHiddenFallback()) { throw $e; } } } if (\false === $ret) { $ret = $this->readInput($inputStream, $question); if (\false === $ret) { throw new MissingInputException('Aborted.'); } if ($question->isTrimmable()) { $ret = \trim($ret); } } } else { $autocomplete = $this->autocomplete($output, $question, $inputStream, $autocomplete); $ret = $question->isTrimmable() ? \trim($autocomplete) : $autocomplete; } if ($output instanceof ConsoleSectionOutput) { $output->addContent($ret); } $ret = \strlen($ret) > 0 ? $ret : $question->getDefault(); if ($normalizer = $question->getNormalizer()) { return $normalizer($ret); } return $ret; } /** * @return mixed */ private function getDefaultAnswer(Question $question) { $default = $question->getDefault(); if (null === $default) { return $default; } if ($validator = $question->getValidator()) { return \call_user_func($question->getValidator(), $default); } elseif ($question instanceof ChoiceQuestion) { $choices = $question->getChoices(); if (!$question->isMultiselect()) { return $choices[$default] ?? $default; } $default = \explode(',', $default); foreach ($default as $k => $v) { $v = $question->isTrimmable() ? \trim($v) : $v; $default[$k] = $choices[$v] ?? $v; } } return $default; } /** * Outputs the question prompt. */ protected function writePrompt(OutputInterface $output, Question $question) { $message = $question->getQuestion(); if ($question instanceof ChoiceQuestion) { $output->writeln(\array_merge([$question->getQuestion()], $this->formatChoiceQuestionChoices($question, 'info'))); $message = $question->getPrompt(); } $output->write($message); } /** * @return string[] */ protected function formatChoiceQuestionChoices(ChoiceQuestion $question, string $tag) { $messages = []; $maxWidth = \max(\array_map([__CLASS__, 'width'], \array_keys($choices = $question->getChoices()))); foreach ($choices as $key => $value) { $padding = \str_repeat(' ', $maxWidth - self::width($key)); $messages[] = \sprintf(" [<{$tag}>%s{$padding}] %s", $key, $value); } return $messages; } /** * Outputs an error message. */ protected function writeError(OutputInterface $output, \Exception $error) { if (null !== $this->getHelperSet() && $this->getHelperSet()->has('formatter')) { $message = $this->getHelperSet()->get('formatter')->formatBlock($error->getMessage(), 'error'); } else { $message = '' . $error->getMessage() . ''; } $output->writeln($message); } /** * Autocompletes a question. * * @param resource $inputStream */ private function autocomplete(OutputInterface $output, Question $question, $inputStream, callable $autocomplete) : string { $cursor = new Cursor($output, $inputStream); $fullChoice = ''; $ret = ''; $i = 0; $ofs = -1; $matches = $autocomplete($ret); $numMatches = \count($matches); $sttyMode = \shell_exec('stty -g'); $isStdin = 'php://stdin' === (\stream_get_meta_data($inputStream)['uri'] ?? null); $r = [$inputStream]; $w = []; // Disable icanon (so we can fread each keypress) and echo (we'll do echoing here instead) \shell_exec('stty -icanon -echo'); // Add highlighted text style $output->getFormatter()->setStyle('hl', new OutputFormatterStyle('black', 'white')); // Read a keypress while (!\feof($inputStream)) { while ($isStdin && 0 === @\stream_select($r, $w, $w, 0, 100)) { // Give signal handlers a chance to run $r = [$inputStream]; } $c = \fread($inputStream, 1); // as opposed to fgets(), fread() returns an empty string when the stream content is empty, not false. if (\false === $c || '' === $ret && '' === $c && null === $question->getDefault()) { \shell_exec('stty ' . $sttyMode); throw new MissingInputException('Aborted.'); } elseif ("" === $c) { // Backspace Character if (0 === $numMatches && 0 !== $i) { --$i; $cursor->moveLeft(s($fullChoice)->slice(-1)->width(\false)); $fullChoice = self::substr($fullChoice, 0, $i); } if (0 === $i) { $ofs = -1; $matches = $autocomplete($ret); $numMatches = \count($matches); } else { $numMatches = 0; } // Pop the last character off the end of our string $ret = self::substr($ret, 0, $i); } elseif ("\x1b" === $c) { // Did we read an escape sequence? $c .= \fread($inputStream, 2); // A = Up Arrow. B = Down Arrow if (isset($c[2]) && ('A' === $c[2] || 'B' === $c[2])) { if ('A' === $c[2] && -1 === $ofs) { $ofs = 0; } if (0 === $numMatches) { continue; } $ofs += 'A' === $c[2] ? -1 : 1; $ofs = ($numMatches + $ofs) % $numMatches; } } elseif (\ord($c) < 32) { if ("\t" === $c || "\n" === $c) { if ($numMatches > 0 && -1 !== $ofs) { $ret = (string) $matches[$ofs]; // Echo out remaining chars for current match $remainingCharacters = \substr($ret, \strlen(\trim($this->mostRecentlyEnteredValue($fullChoice)))); $output->write($remainingCharacters); $fullChoice .= $remainingCharacters; $i = \false === ($encoding = \mb_detect_encoding($fullChoice, null, \true)) ? \strlen($fullChoice) : \mb_strlen($fullChoice, $encoding); $matches = \array_filter($autocomplete($ret), function ($match) use($ret) { return '' === $ret || \str_starts_with($match, $ret); }); $numMatches = \count($matches); $ofs = -1; } if ("\n" === $c) { $output->write($c); break; } $numMatches = 0; } continue; } else { if ("\x80" <= $c) { $c .= \fread($inputStream, ["\xc0" => 1, "\xd0" => 1, "\xe0" => 2, "\xf0" => 3][$c & "\xf0"]); } $output->write($c); $ret .= $c; $fullChoice .= $c; ++$i; $tempRet = $ret; if ($question instanceof ChoiceQuestion && $question->isMultiselect()) { $tempRet = $this->mostRecentlyEnteredValue($fullChoice); } $numMatches = 0; $ofs = 0; foreach ($autocomplete($ret) as $value) { // If typed characters match the beginning chunk of value (e.g. [AcmeDe]moBundle) if (\str_starts_with($value, $tempRet)) { $matches[$numMatches++] = $value; } } } $cursor->clearLineAfter(); if ($numMatches > 0 && -1 !== $ofs) { $cursor->savePosition(); // Write highlighted text, complete the partially entered response $charactersEntered = \strlen(\trim($this->mostRecentlyEnteredValue($fullChoice))); $output->write('' . OutputFormatter::escapeTrailingBackslash(\substr($matches[$ofs], $charactersEntered)) . ''); $cursor->restorePosition(); } } // Reset stty so it behaves normally again \shell_exec('stty ' . $sttyMode); return $fullChoice; } private function mostRecentlyEnteredValue(string $entered) : string { // Determine the most recent value that the user entered if (!\str_contains($entered, ',')) { return $entered; } $choices = \explode(',', $entered); if ('' !== ($lastChoice = \trim($choices[\count($choices) - 1]))) { return $lastChoice; } return $entered; } /** * Gets a hidden response from user. * * @param resource $inputStream The handler resource * @param bool $trimmable Is the answer trimmable * * @throws RuntimeException In case the fallback is deactivated and the response cannot be hidden */ private function getHiddenResponse(OutputInterface $output, $inputStream, bool $trimmable = \true) : string { if ('\\' === \DIRECTORY_SEPARATOR) { $exe = __DIR__ . '/../Resources/bin/hiddeninput.exe'; // handle code running from a phar if ('phar:' === \substr(__FILE__, 0, 5)) { $tmpExe = \sys_get_temp_dir() . '/hiddeninput.exe'; \copy($exe, $tmpExe); $exe = $tmpExe; } $sExec = \shell_exec('"' . $exe . '"'); $value = $trimmable ? \rtrim($sExec) : $sExec; $output->writeln(''); if (isset($tmpExe)) { \unlink($tmpExe); } return $value; } if (self::$stty && Terminal::hasSttyAvailable()) { $sttyMode = \shell_exec('stty -g'); \shell_exec('stty -echo'); } elseif ($this->isInteractiveInput($inputStream)) { throw new RuntimeException('Unable to hide the response.'); } $value = \fgets($inputStream, 4096); if (self::$stty && Terminal::hasSttyAvailable()) { \shell_exec('stty ' . $sttyMode); } if (\false === $value) { throw new MissingInputException('Aborted.'); } if ($trimmable) { $value = \trim($value); } $output->writeln(''); return $value; } /** * Validates an attempt. * * @param callable $interviewer A callable that will ask for a question and return the result * * @return mixed The validated response * * @throws \Exception In case the max number of attempts has been reached and no valid response has been given */ private function validateAttempts(callable $interviewer, OutputInterface $output, Question $question) { $error = null; $attempts = $question->getMaxAttempts(); while (null === $attempts || $attempts--) { if (null !== $error) { $this->writeError($output, $error); } try { return $question->getValidator()($interviewer()); } catch (RuntimeException $e) { throw $e; } catch (\Exception $error) { } } throw $error; } private function isInteractiveInput($inputStream) : bool { if ('php://stdin' !== (\stream_get_meta_data($inputStream)['uri'] ?? null)) { return \false; } if (null !== self::$stdinIsInteractive) { return self::$stdinIsInteractive; } if (\function_exists('stream_isatty')) { return self::$stdinIsInteractive = @\stream_isatty(\fopen('php://stdin', 'r')); } if (\function_exists('posix_isatty')) { return self::$stdinIsInteractive = @\posix_isatty(\fopen('php://stdin', 'r')); } if (!\function_exists('exec')) { return self::$stdinIsInteractive = \true; } \exec('stty 2> /dev/null', $output, $status); return self::$stdinIsInteractive = 1 !== $status; } /** * Reads one or more lines of input and returns what is read. * * @param resource $inputStream The handler resource * @param Question $question The question being asked * * @return string|false The input received, false in case input could not be read */ private function readInput($inputStream, Question $question) { if (!$question->isMultiline()) { $cp = $this->setIOCodepage(); $ret = \fgets($inputStream, 4096); return $this->resetIOCodepage($cp, $ret); } $multiLineStreamReader = $this->cloneInputStream($inputStream); if (null === $multiLineStreamReader) { return \false; } $ret = ''; $cp = $this->setIOCodepage(); while (\false !== ($char = \fgetc($multiLineStreamReader))) { if (\PHP_EOL === "{$ret}{$char}") { break; } $ret .= $char; } return $this->resetIOCodepage($cp, $ret); } /** * Sets console I/O to the host code page. * * @return int Previous code page in IBM/EBCDIC format */ private function setIOCodepage() : int { if (\function_exists('sapi_windows_cp_set')) { $cp = \sapi_windows_cp_get(); \sapi_windows_cp_set(\sapi_windows_cp_get('oem')); return $cp; } return 0; } /** * Sets console I/O to the specified code page and converts the user input. * * @param string|false $input * * @return string|false */ private function resetIOCodepage(int $cp, $input) { if (0 !== $cp) { \sapi_windows_cp_set($cp); if (\false !== $input && '' !== $input) { $input = \sapi_windows_cp_conv(\sapi_windows_cp_get('oem'), $cp, $input); } } return $input; } /** * Clones an input stream in order to act on one instance of the same * stream without affecting the other instance. * * @param resource $inputStream The handler resource * * @return resource|null The cloned resource, null in case it could not be cloned */ private function cloneInputStream($inputStream) { $streamMetaData = \stream_get_meta_data($inputStream); $seekable = $streamMetaData['seekable'] ?? \false; $mode = $streamMetaData['mode'] ?? 'rb'; $uri = $streamMetaData['uri'] ?? null; if (null === $uri) { return null; } $cloneStream = \fopen($uri, $mode); // For seekable and writable streams, add all the same data to the // cloned stream and then seek to the same offset. if (\true === $seekable && !\in_array($mode, ['r', 'rb', 'rt'])) { $offset = \ftell($inputStream); \rewind($inputStream); \stream_copy_to_stream($inputStream, $cloneStream); \fseek($inputStream, $offset); \fseek($cloneStream, $offset); } return $cloneStream; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Helper; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception\InvalidArgumentException; /** * @author Abdellatif Ait boudad */ class TableCell { private $value; private $options = ['rowspan' => 1, 'colspan' => 1, 'style' => null]; public function __construct(string $value = '', array $options = []) { $this->value = $value; // check option names if ($diff = \array_diff(\array_keys($options), \array_keys($this->options))) { throw new InvalidArgumentException(\sprintf('The TableCell does not support the following options: \'%s\'.', \implode('\', \'', $diff))); } if (isset($options['style']) && !$options['style'] instanceof TableCellStyle) { throw new InvalidArgumentException('The style option must be an instance of "TableCellStyle".'); } $this->options = \array_merge($this->options, $options); } /** * Returns the cell value. * * @return string */ public function __toString() { return $this->value; } /** * Gets number of colspan. * * @return int */ public function getColspan() { return (int) $this->options['colspan']; } /** * Gets number of rowspan. * * @return int */ public function getRowspan() { return (int) $this->options['rowspan']; } public function getStyle() : ?TableCellStyle { return $this->options['style']; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Helper; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception\InvalidArgumentException; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception\LogicException; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Output\OutputInterface; /** * @author Kevin Bond */ class ProgressIndicator { private const FORMATS = ['normal' => ' %indicator% %message%', 'normal_no_ansi' => ' %message%', 'verbose' => ' %indicator% %message% (%elapsed:6s%)', 'verbose_no_ansi' => ' %message% (%elapsed:6s%)', 'very_verbose' => ' %indicator% %message% (%elapsed:6s%, %memory:6s%)', 'very_verbose_no_ansi' => ' %message% (%elapsed:6s%, %memory:6s%)']; private $output; private $startTime; private $format; private $message; private $indicatorValues; private $indicatorCurrent; private $indicatorChangeInterval; private $indicatorUpdateTime; private $started = \false; /** * @var array */ private static $formatters; /** * @param int $indicatorChangeInterval Change interval in milliseconds * @param array|null $indicatorValues Animated indicator characters */ public function __construct(OutputInterface $output, string $format = null, int $indicatorChangeInterval = 100, array $indicatorValues = null) { $this->output = $output; if (null === $format) { $format = $this->determineBestFormat(); } if (null === $indicatorValues) { $indicatorValues = ['-', '\\', '|', '/']; } $indicatorValues = \array_values($indicatorValues); if (2 > \count($indicatorValues)) { throw new InvalidArgumentException('Must have at least 2 indicator value characters.'); } $this->format = self::getFormatDefinition($format); $this->indicatorChangeInterval = $indicatorChangeInterval; $this->indicatorValues = $indicatorValues; $this->startTime = \time(); } /** * Sets the current indicator message. */ public function setMessage(?string $message) { $this->message = $message; $this->display(); } /** * Starts the indicator output. */ public function start(string $message) { if ($this->started) { throw new LogicException('Progress indicator already started.'); } $this->message = $message; $this->started = \true; $this->startTime = \time(); $this->indicatorUpdateTime = $this->getCurrentTimeInMilliseconds() + $this->indicatorChangeInterval; $this->indicatorCurrent = 0; $this->display(); } /** * Advances the indicator. */ public function advance() { if (!$this->started) { throw new LogicException('Progress indicator has not yet been started.'); } if (!$this->output->isDecorated()) { return; } $currentTime = $this->getCurrentTimeInMilliseconds(); if ($currentTime < $this->indicatorUpdateTime) { return; } $this->indicatorUpdateTime = $currentTime + $this->indicatorChangeInterval; ++$this->indicatorCurrent; $this->display(); } /** * Finish the indicator with message. * * @param $message */ public function finish(string $message) { if (!$this->started) { throw new LogicException('Progress indicator has not yet been started.'); } $this->message = $message; $this->display(); $this->output->writeln(''); $this->started = \false; } /** * Gets the format for a given name. * * @return string|null */ public static function getFormatDefinition(string $name) { return self::FORMATS[$name] ?? null; } /** * Sets a placeholder formatter for a given name. * * This method also allow you to override an existing placeholder. */ public static function setPlaceholderFormatterDefinition(string $name, callable $callable) { if (!self::$formatters) { self::$formatters = self::initPlaceholderFormatters(); } self::$formatters[$name] = $callable; } /** * Gets the placeholder formatter for a given name (including the delimiter char like %). * * @return callable|null */ public static function getPlaceholderFormatterDefinition(string $name) { if (!self::$formatters) { self::$formatters = self::initPlaceholderFormatters(); } return self::$formatters[$name] ?? null; } private function display() { if (OutputInterface::VERBOSITY_QUIET === $this->output->getVerbosity()) { return; } $this->overwrite(\preg_replace_callback("{%([a-z\\-_]+)(?:\\:([^%]+))?%}i", function ($matches) { if ($formatter = self::getPlaceholderFormatterDefinition($matches[1])) { return $formatter($this); } return $matches[0]; }, $this->format ?? '')); } private function determineBestFormat() : string { switch ($this->output->getVerbosity()) { // OutputInterface::VERBOSITY_QUIET: display is disabled anyway case OutputInterface::VERBOSITY_VERBOSE: return $this->output->isDecorated() ? 'verbose' : 'verbose_no_ansi'; case OutputInterface::VERBOSITY_VERY_VERBOSE: case OutputInterface::VERBOSITY_DEBUG: return $this->output->isDecorated() ? 'very_verbose' : 'very_verbose_no_ansi'; default: return $this->output->isDecorated() ? 'normal' : 'normal_no_ansi'; } } /** * Overwrites a previous message to the output. */ private function overwrite(string $message) { if ($this->output->isDecorated()) { $this->output->write("\r\x1b[2K"); $this->output->write($message); } else { $this->output->writeln($message); } } private function getCurrentTimeInMilliseconds() : float { return \round(\microtime(\true) * 1000); } private static function initPlaceholderFormatters() : array { return ['indicator' => function (self $indicator) { return $indicator->indicatorValues[$indicator->indicatorCurrent % \count($indicator->indicatorValues)]; }, 'message' => function (self $indicator) { return $indicator->message; }, 'elapsed' => function (self $indicator) { return Helper::formatTime(\time() - $indicator->startTime); }, 'memory' => function () { return Helper::formatMemory(\memory_get_usage(\true)); }]; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Helper; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Formatter\OutputFormatter; /** * The Formatter class provides helpers to format messages. * * @author Fabien Potencier */ class FormatterHelper extends Helper { /** * Formats a message within a section. * * @return string */ public function formatSection(string $section, string $message, string $style = 'info') { return \sprintf('<%s>[%s] %s', $style, $section, $style, $message); } /** * Formats a message as a block of text. * * @param string|array $messages The message to write in the block * * @return string */ public function formatBlock($messages, string $style, bool $large = \false) { if (!\is_array($messages)) { $messages = [$messages]; } $len = 0; $lines = []; foreach ($messages as $message) { $message = OutputFormatter::escape($message); $lines[] = \sprintf($large ? ' %s ' : ' %s ', $message); $len = \max(self::width($message) + ($large ? 4 : 2), $len); } $messages = $large ? [\str_repeat(' ', $len)] : []; for ($i = 0; isset($lines[$i]); ++$i) { $messages[] = $lines[$i] . \str_repeat(' ', $len - self::width($lines[$i])); } if ($large) { $messages[] = \str_repeat(' ', $len); } for ($i = 0; isset($messages[$i]); ++$i) { $messages[$i] = \sprintf('<%s>%s', $style, $messages[$i], $style); } return \implode("\n", $messages); } /** * Truncates a message to the given length. * * @return string */ public function truncate(string $message, int $length, string $suffix = '...') { $computedLength = $length - self::width($suffix); if ($computedLength > self::width($message)) { return $message; } return self::substr($message, 0, $length) . $suffix; } /** * {@inheritdoc} */ public function getName() { return 'formatter'; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Helper; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception\InvalidArgumentException; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception\LogicException; /** * Defines the styles for a Table. * * @author Fabien Potencier * @author Саша Стаменковић * @author Dany Maillard */ class TableStyle { private $paddingChar = ' '; private $horizontalOutsideBorderChar = '-'; private $horizontalInsideBorderChar = '-'; private $verticalOutsideBorderChar = '|'; private $verticalInsideBorderChar = '|'; private $crossingChar = '+'; private $crossingTopRightChar = '+'; private $crossingTopMidChar = '+'; private $crossingTopLeftChar = '+'; private $crossingMidRightChar = '+'; private $crossingBottomRightChar = '+'; private $crossingBottomMidChar = '+'; private $crossingBottomLeftChar = '+'; private $crossingMidLeftChar = '+'; private $crossingTopLeftBottomChar = '+'; private $crossingTopMidBottomChar = '+'; private $crossingTopRightBottomChar = '+'; private $headerTitleFormat = ' %s '; private $footerTitleFormat = ' %s '; private $cellHeaderFormat = '%s'; private $cellRowFormat = '%s'; private $cellRowContentFormat = ' %s '; private $borderFormat = '%s'; private $padType = \STR_PAD_RIGHT; /** * Sets padding character, used for cell padding. * * @return $this */ public function setPaddingChar(string $paddingChar) { if (!$paddingChar) { throw new LogicException('The padding char must not be empty.'); } $this->paddingChar = $paddingChar; return $this; } /** * Gets padding character, used for cell padding. * * @return string */ public function getPaddingChar() { return $this->paddingChar; } /** * Sets horizontal border characters. * * * ╔═══════════════╤══════════════════════════╤══════════════════╗ * 1 ISBN 2 Title │ Author ║ * ╠═══════════════╪══════════════════════════╪══════════════════╣ * ║ 99921-58-10-7 │ Divine Comedy │ Dante Alighieri ║ * ║ 9971-5-0210-0 │ A Tale of Two Cities │ Charles Dickens ║ * ║ 960-425-059-0 │ The Lord of the Rings │ J. R. R. Tolkien ║ * ║ 80-902734-1-6 │ And Then There Were None │ Agatha Christie ║ * ╚═══════════════╧══════════════════════════╧══════════════════╝ * * * @return $this */ public function setHorizontalBorderChars(string $outside, string $inside = null) : self { $this->horizontalOutsideBorderChar = $outside; $this->horizontalInsideBorderChar = $inside ?? $outside; return $this; } /** * Sets vertical border characters. * * * ╔═══════════════╤══════════════════════════╤══════════════════╗ * ║ ISBN │ Title │ Author ║ * ╠═══════1═══════╪══════════════════════════╪══════════════════╣ * ║ 99921-58-10-7 │ Divine Comedy │ Dante Alighieri ║ * ║ 9971-5-0210-0 │ A Tale of Two Cities │ Charles Dickens ║ * ╟───────2───────┼──────────────────────────┼──────────────────╢ * ║ 960-425-059-0 │ The Lord of the Rings │ J. R. R. Tolkien ║ * ║ 80-902734-1-6 │ And Then There Were None │ Agatha Christie ║ * ╚═══════════════╧══════════════════════════╧══════════════════╝ * * * @return $this */ public function setVerticalBorderChars(string $outside, string $inside = null) : self { $this->verticalOutsideBorderChar = $outside; $this->verticalInsideBorderChar = $inside ?? $outside; return $this; } /** * Gets border characters. * * @internal */ public function getBorderChars() : array { return [$this->horizontalOutsideBorderChar, $this->verticalOutsideBorderChar, $this->horizontalInsideBorderChar, $this->verticalInsideBorderChar]; } /** * Sets crossing characters. * * Example: * * 1═══════════════2══════════════════════════2══════════════════3 * ║ ISBN │ Title │ Author ║ * 8'══════════════0'═════════════════════════0'═════════════════4' * ║ 99921-58-10-7 │ Divine Comedy │ Dante Alighieri ║ * ║ 9971-5-0210-0 │ A Tale of Two Cities │ Charles Dickens ║ * 8───────────────0──────────────────────────0──────────────────4 * ║ 960-425-059-0 │ The Lord of the Rings │ J. R. R. Tolkien ║ * ║ 80-902734-1-6 │ And Then There Were None │ Agatha Christie ║ * 7═══════════════6══════════════════════════6══════════════════5 * * * @param string $cross Crossing char (see #0 of example) * @param string $topLeft Top left char (see #1 of example) * @param string $topMid Top mid char (see #2 of example) * @param string $topRight Top right char (see #3 of example) * @param string $midRight Mid right char (see #4 of example) * @param string $bottomRight Bottom right char (see #5 of example) * @param string $bottomMid Bottom mid char (see #6 of example) * @param string $bottomLeft Bottom left char (see #7 of example) * @param string $midLeft Mid left char (see #8 of example) * @param string|null $topLeftBottom Top left bottom char (see #8' of example), equals to $midLeft if null * @param string|null $topMidBottom Top mid bottom char (see #0' of example), equals to $cross if null * @param string|null $topRightBottom Top right bottom char (see #4' of example), equals to $midRight if null * * @return $this */ public function setCrossingChars(string $cross, string $topLeft, string $topMid, string $topRight, string $midRight, string $bottomRight, string $bottomMid, string $bottomLeft, string $midLeft, string $topLeftBottom = null, string $topMidBottom = null, string $topRightBottom = null) : self { $this->crossingChar = $cross; $this->crossingTopLeftChar = $topLeft; $this->crossingTopMidChar = $topMid; $this->crossingTopRightChar = $topRight; $this->crossingMidRightChar = $midRight; $this->crossingBottomRightChar = $bottomRight; $this->crossingBottomMidChar = $bottomMid; $this->crossingBottomLeftChar = $bottomLeft; $this->crossingMidLeftChar = $midLeft; $this->crossingTopLeftBottomChar = $topLeftBottom ?? $midLeft; $this->crossingTopMidBottomChar = $topMidBottom ?? $cross; $this->crossingTopRightBottomChar = $topRightBottom ?? $midRight; return $this; } /** * Sets default crossing character used for each cross. * * @see {@link setCrossingChars()} for setting each crossing individually. */ public function setDefaultCrossingChar(string $char) : self { return $this->setCrossingChars($char, $char, $char, $char, $char, $char, $char, $char, $char); } /** * Gets crossing character. * * @return string */ public function getCrossingChar() { return $this->crossingChar; } /** * Gets crossing characters. * * @internal */ public function getCrossingChars() : array { return [$this->crossingChar, $this->crossingTopLeftChar, $this->crossingTopMidChar, $this->crossingTopRightChar, $this->crossingMidRightChar, $this->crossingBottomRightChar, $this->crossingBottomMidChar, $this->crossingBottomLeftChar, $this->crossingMidLeftChar, $this->crossingTopLeftBottomChar, $this->crossingTopMidBottomChar, $this->crossingTopRightBottomChar]; } /** * Sets header cell format. * * @return $this */ public function setCellHeaderFormat(string $cellHeaderFormat) { $this->cellHeaderFormat = $cellHeaderFormat; return $this; } /** * Gets header cell format. * * @return string */ public function getCellHeaderFormat() { return $this->cellHeaderFormat; } /** * Sets row cell format. * * @return $this */ public function setCellRowFormat(string $cellRowFormat) { $this->cellRowFormat = $cellRowFormat; return $this; } /** * Gets row cell format. * * @return string */ public function getCellRowFormat() { return $this->cellRowFormat; } /** * Sets row cell content format. * * @return $this */ public function setCellRowContentFormat(string $cellRowContentFormat) { $this->cellRowContentFormat = $cellRowContentFormat; return $this; } /** * Gets row cell content format. * * @return string */ public function getCellRowContentFormat() { return $this->cellRowContentFormat; } /** * Sets table border format. * * @return $this */ public function setBorderFormat(string $borderFormat) { $this->borderFormat = $borderFormat; return $this; } /** * Gets table border format. * * @return string */ public function getBorderFormat() { return $this->borderFormat; } /** * Sets cell padding type. * * @return $this */ public function setPadType(int $padType) { if (!\in_array($padType, [\STR_PAD_LEFT, \STR_PAD_RIGHT, \STR_PAD_BOTH], \true)) { throw new InvalidArgumentException('Invalid padding type. Expected one of (STR_PAD_LEFT, STR_PAD_RIGHT, STR_PAD_BOTH).'); } $this->padType = $padType; return $this; } /** * Gets cell padding type. * * @return int */ public function getPadType() { return $this->padType; } public function getHeaderTitleFormat() : string { return $this->headerTitleFormat; } /** * @return $this */ public function setHeaderTitleFormat(string $format) : self { $this->headerTitleFormat = $format; return $this; } public function getFooterTitleFormat() : string { return $this->footerTitleFormat; } /** * @return $this */ public function setFooterTitleFormat(string $format) : self { $this->footerTitleFormat = $format; return $this; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Helper; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Descriptor\DescriptorInterface; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Descriptor\JsonDescriptor; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Descriptor\MarkdownDescriptor; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Descriptor\TextDescriptor; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Descriptor\XmlDescriptor; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception\InvalidArgumentException; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Output\OutputInterface; /** * This class adds helper method to describe objects in various formats. * * @author Jean-François Simon */ class DescriptorHelper extends Helper { /** * @var DescriptorInterface[] */ private $descriptors = []; public function __construct() { $this->register('txt', new TextDescriptor())->register('xml', new XmlDescriptor())->register('json', new JsonDescriptor())->register('md', new MarkdownDescriptor()); } /** * Describes an object if supported. * * Available options are: * * format: string, the output format name * * raw_text: boolean, sets output type as raw * * @throws InvalidArgumentException when the given format is not supported */ public function describe(OutputInterface $output, ?object $object, array $options = []) { $options = \array_merge(['raw_text' => \false, 'format' => 'txt'], $options); if (!isset($this->descriptors[$options['format']])) { throw new InvalidArgumentException(\sprintf('Unsupported format "%s".', $options['format'])); } $descriptor = $this->descriptors[$options['format']]; $descriptor->describe($output, $object, $options); } /** * Registers a descriptor. * * @return $this */ public function register(string $format, DescriptorInterface $descriptor) { $this->descriptors[$format] = $descriptor; return $this; } /** * {@inheritdoc} */ public function getName() { return 'descriptor'; } public function getFormats() : array { return \array_keys($this->descriptors); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Helper; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Formatter\OutputFormatter; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Output\OutputInterface; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Question\ChoiceQuestion; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Question\ConfirmationQuestion; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Question\Question; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Style\SymfonyStyle; /** * Symfony Style Guide compliant question helper. * * @author Kevin Bond */ class SymfonyQuestionHelper extends QuestionHelper { /** * {@inheritdoc} */ protected function writePrompt(OutputInterface $output, Question $question) { $text = OutputFormatter::escapeTrailingBackslash($question->getQuestion()); $default = $question->getDefault(); if ($question->isMultiline()) { $text .= \sprintf(' (press %s to continue)', $this->getEofShortcut()); } switch (\true) { case null === $default: $text = \sprintf(' %s:', $text); break; case $question instanceof ConfirmationQuestion: $text = \sprintf(' %s (yes/no) [%s]:', $text, $default ? 'yes' : 'no'); break; case $question instanceof ChoiceQuestion && $question->isMultiselect(): $choices = $question->getChoices(); $default = \explode(',', $default); foreach ($default as $key => $value) { $default[$key] = $choices[\trim($value)]; } $text = \sprintf(' %s [%s]:', $text, OutputFormatter::escape(\implode(', ', $default))); break; case $question instanceof ChoiceQuestion: $choices = $question->getChoices(); $text = \sprintf(' %s [%s]:', $text, OutputFormatter::escape($choices[$default] ?? $default)); break; default: $text = \sprintf(' %s [%s]:', $text, OutputFormatter::escape($default)); } $output->writeln($text); $prompt = ' > '; if ($question instanceof ChoiceQuestion) { $output->writeln($this->formatChoiceQuestionChoices($question, 'comment')); $prompt = $question->getPrompt(); } $output->write($prompt); } /** * {@inheritdoc} */ protected function writeError(OutputInterface $output, \Exception $error) { if ($output instanceof SymfonyStyle) { $output->newLine(); $output->error($error->getMessage()); return; } parent::writeError($output, $error); } private function getEofShortcut() : string { if ('Windows' === \PHP_OS_FAMILY) { return 'Ctrl+Z then Enter'; } return 'Ctrl+D'; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Helper; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception\InvalidArgumentException; /** * @author Yewhen Khoptynskyi */ class TableCellStyle { public const DEFAULT_ALIGN = 'left'; private const TAG_OPTIONS = ['fg', 'bg', 'options']; private const ALIGN_MAP = ['left' => \STR_PAD_RIGHT, 'center' => \STR_PAD_BOTH, 'right' => \STR_PAD_LEFT]; private $options = ['fg' => 'default', 'bg' => 'default', 'options' => null, 'align' => self::DEFAULT_ALIGN, 'cellFormat' => null]; public function __construct(array $options = []) { if ($diff = \array_diff(\array_keys($options), \array_keys($this->options))) { throw new InvalidArgumentException(\sprintf('The TableCellStyle does not support the following options: \'%s\'.', \implode('\', \'', $diff))); } if (isset($options['align']) && !\array_key_exists($options['align'], self::ALIGN_MAP)) { throw new InvalidArgumentException(\sprintf('Wrong align value. Value must be following: \'%s\'.', \implode('\', \'', \array_keys(self::ALIGN_MAP)))); } $this->options = \array_merge($this->options, $options); } public function getOptions() : array { return $this->options; } /** * Gets options we need for tag for example fg, bg. * * @return string[] */ public function getTagOptions() { return \array_filter($this->getOptions(), function ($key) { return \in_array($key, self::TAG_OPTIONS) && isset($this->options[$key]); }, \ARRAY_FILTER_USE_KEY); } /** * @return int */ public function getPadByAlign() { return self::ALIGN_MAP[$this->getOptions()['align']]; } public function getCellFormat() : ?string { return $this->getOptions()['cellFormat']; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Helper; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Command\Command; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception\InvalidArgumentException; /** * HelperSet represents a set of helpers to be used with a command. * * @author Fabien Potencier * * @implements \IteratorAggregate */ class HelperSet implements \IteratorAggregate { /** @var array */ private $helpers = []; private $command; /** * @param Helper[] $helpers An array of helper */ public function __construct(array $helpers = []) { foreach ($helpers as $alias => $helper) { $this->set($helper, \is_int($alias) ? null : $alias); } } public function set(HelperInterface $helper, string $alias = null) { $this->helpers[$helper->getName()] = $helper; if (null !== $alias) { $this->helpers[$alias] = $helper; } $helper->setHelperSet($this); } /** * Returns true if the helper if defined. * * @return bool */ public function has(string $name) { return isset($this->helpers[$name]); } /** * Gets a helper value. * * @return HelperInterface * * @throws InvalidArgumentException if the helper is not defined */ public function get(string $name) { if (!$this->has($name)) { throw new InvalidArgumentException(\sprintf('The helper "%s" is not defined.', $name)); } return $this->helpers[$name]; } /** * @deprecated since Symfony 5.4 */ public function setCommand(Command $command = null) { trigger_deprecation('symfony/console', '5.4', 'Method "%s()" is deprecated.', __METHOD__); $this->command = $command; } /** * Gets the command associated with this helper set. * * @return Command * * @deprecated since Symfony 5.4 */ public function getCommand() { trigger_deprecation('symfony/console', '5.4', 'Method "%s()" is deprecated.', __METHOD__); return $this->command; } /** * @return \Traversable */ #[\ReturnTypeWillChange] public function getIterator() { return new \ArrayIterator($this->helpers); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Helper; /** * Marks a row as being a separator. * * @author Fabien Potencier */ class TableSeparator extends TableCell { public function __construct(array $options = []) { parent::__construct('', $options); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Helper; /** * Helps outputting debug information when running an external program from a command. * * An external program can be a Process, an HTTP request, or anything else. * * @author Fabien Potencier */ class DebugFormatterHelper extends Helper { private const COLORS = ['black', 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white', 'default']; private $started = []; private $count = -1; /** * Starts a debug formatting session. * * @return string */ public function start(string $id, string $message, string $prefix = 'RUN') { $this->started[$id] = ['border' => ++$this->count % \count(self::COLORS)]; return \sprintf("%s %s %s\n", $this->getBorder($id), $prefix, $message); } /** * Adds progress to a formatting session. * * @return string */ public function progress(string $id, string $buffer, bool $error = \false, string $prefix = 'OUT', string $errorPrefix = 'ERR') { $message = ''; if ($error) { if (isset($this->started[$id]['out'])) { $message .= "\n"; unset($this->started[$id]['out']); } if (!isset($this->started[$id]['err'])) { $message .= \sprintf('%s %s ', $this->getBorder($id), $errorPrefix); $this->started[$id]['err'] = \true; } $message .= \str_replace("\n", \sprintf("\n%s %s ", $this->getBorder($id), $errorPrefix), $buffer); } else { if (isset($this->started[$id]['err'])) { $message .= "\n"; unset($this->started[$id]['err']); } if (!isset($this->started[$id]['out'])) { $message .= \sprintf('%s %s ', $this->getBorder($id), $prefix); $this->started[$id]['out'] = \true; } $message .= \str_replace("\n", \sprintf("\n%s %s ", $this->getBorder($id), $prefix), $buffer); } return $message; } /** * Stops a formatting session. * * @return string */ public function stop(string $id, string $message, bool $successful, string $prefix = 'RES') { $trailingEOL = isset($this->started[$id]['out']) || isset($this->started[$id]['err']) ? "\n" : ''; if ($successful) { return \sprintf("%s%s %s %s\n", $trailingEOL, $this->getBorder($id), $prefix, $message); } $message = \sprintf("%s%s %s %s\n", $trailingEOL, $this->getBorder($id), $prefix, $message); unset($this->started[$id]['out'], $this->started[$id]['err']); return $message; } private function getBorder(string $id) : string { return \sprintf(' ', self::COLORS[$this->started[$id]['border']]); } /** * {@inheritdoc} */ public function getName() { return 'debug_formatter'; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Helper; /** * HelperInterface is the interface all helpers must implement. * * @author Fabien Potencier */ interface HelperInterface { /** * Sets the helper set associated with this helper. */ public function setHelperSet(HelperSet $helperSet = null); /** * Gets the helper set associated with this helper. * * @return HelperSet|null */ public function getHelperSet(); /** * Returns the canonical name of this helper. * * @return string */ public function getName(); } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Helper; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Output\ConsoleOutputInterface; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Output\OutputInterface; use _HumbugBox1cb33d1f20f1\Symfony\Component\Process\Exception\ProcessFailedException; use _HumbugBox1cb33d1f20f1\Symfony\Component\Process\Process; /** * The ProcessHelper class provides helpers to run external processes. * * @author Fabien Potencier * * @final */ class ProcessHelper extends Helper { /** * Runs an external process. * * @param array|Process $cmd An instance of Process or an array of the command and arguments * @param callable|null $callback A PHP callback to run whenever there is some * output available on STDOUT or STDERR */ public function run(OutputInterface $output, $cmd, string $error = null, callable $callback = null, int $verbosity = OutputInterface::VERBOSITY_VERY_VERBOSE) : Process { if (!\class_exists(Process::class)) { throw new \LogicException('The ProcessHelper cannot be run as the Process component is not installed. Try running "compose require symfony/process".'); } if ($output instanceof ConsoleOutputInterface) { $output = $output->getErrorOutput(); } $formatter = $this->getHelperSet()->get('debug_formatter'); if ($cmd instanceof Process) { $cmd = [$cmd]; } if (!\is_array($cmd)) { throw new \TypeError(\sprintf('The "command" argument of "%s()" must be an array or a "%s" instance, "%s" given.', __METHOD__, Process::class, \get_debug_type($cmd))); } if (\is_string($cmd[0] ?? null)) { $process = new Process($cmd); $cmd = []; } elseif (($cmd[0] ?? null) instanceof Process) { $process = $cmd[0]; unset($cmd[0]); } else { throw new \InvalidArgumentException(\sprintf('Invalid command provided to "%s()": the command should be an array whose first element is either the path to the binary to run or a "Process" object.', __METHOD__)); } if ($verbosity <= $output->getVerbosity()) { $output->write($formatter->start(\spl_object_hash($process), $this->escapeString($process->getCommandLine()))); } if ($output->isDebug()) { $callback = $this->wrapCallback($output, $process, $callback); } $process->run($callback, $cmd); if ($verbosity <= $output->getVerbosity()) { $message = $process->isSuccessful() ? 'Command ran successfully' : \sprintf('%s Command did not run successfully', $process->getExitCode()); $output->write($formatter->stop(\spl_object_hash($process), $message, $process->isSuccessful())); } if (!$process->isSuccessful() && null !== $error) { $output->writeln(\sprintf('%s', $this->escapeString($error))); } return $process; } /** * Runs the process. * * This is identical to run() except that an exception is thrown if the process * exits with a non-zero exit code. * * @param array|Process $cmd An instance of Process or a command to run * @param callable|null $callback A PHP callback to run whenever there is some * output available on STDOUT or STDERR * * @throws ProcessFailedException * * @see run() */ public function mustRun(OutputInterface $output, $cmd, string $error = null, callable $callback = null) : Process { $process = $this->run($output, $cmd, $error, $callback); if (!$process->isSuccessful()) { throw new ProcessFailedException($process); } return $process; } /** * Wraps a Process callback to add debugging output. */ public function wrapCallback(OutputInterface $output, Process $process, callable $callback = null) : callable { if ($output instanceof ConsoleOutputInterface) { $output = $output->getErrorOutput(); } $formatter = $this->getHelperSet()->get('debug_formatter'); return function ($type, $buffer) use($output, $process, $callback, $formatter) { $output->write($formatter->progress(\spl_object_hash($process), $this->escapeString($buffer), Process::ERR === $type)); if (null !== $callback) { $callback($type, $buffer); } }; } private function escapeString(string $str) : string { return \str_replace('<', '\\<', $str); } /** * {@inheritdoc} */ public function getName() : string { return 'process'; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Helper; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception\InvalidArgumentException; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception\RuntimeException; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Formatter\OutputFormatter; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Formatter\WrappableOutputFormatterInterface; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Output\ConsoleSectionOutput; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Output\OutputInterface; /** * Provides helpers to display a table. * * @author Fabien Potencier * @author Саша Стаменковић * @author Abdellatif Ait boudad * @author Max Grigorian * @author Dany Maillard */ class Table { private const SEPARATOR_TOP = 0; private const SEPARATOR_TOP_BOTTOM = 1; private const SEPARATOR_MID = 2; private const SEPARATOR_BOTTOM = 3; private const BORDER_OUTSIDE = 0; private const BORDER_INSIDE = 1; private $headerTitle; private $footerTitle; /** * Table headers. */ private $headers = []; /** * Table rows. */ private $rows = []; private $horizontal = \false; /** * Column widths cache. */ private $effectiveColumnWidths = []; /** * Number of columns cache. * * @var int */ private $numberOfColumns; /** * @var OutputInterface */ private $output; /** * @var TableStyle */ private $style; /** * @var array */ private $columnStyles = []; /** * User set column widths. * * @var array */ private $columnWidths = []; private $columnMaxWidths = []; /** * @var array|null */ private static $styles; private $rendered = \false; public function __construct(OutputInterface $output) { $this->output = $output; if (!self::$styles) { self::$styles = self::initStyles(); } $this->setStyle('default'); } /** * Sets a style definition. */ public static function setStyleDefinition(string $name, TableStyle $style) { if (!self::$styles) { self::$styles = self::initStyles(); } self::$styles[$name] = $style; } /** * Gets a style definition by name. * * @return TableStyle */ public static function getStyleDefinition(string $name) { if (!self::$styles) { self::$styles = self::initStyles(); } if (isset(self::$styles[$name])) { return self::$styles[$name]; } throw new InvalidArgumentException(\sprintf('Style "%s" is not defined.', $name)); } /** * Sets table style. * * @param TableStyle|string $name The style name or a TableStyle instance * * @return $this */ public function setStyle($name) { $this->style = $this->resolveStyle($name); return $this; } /** * Gets the current table style. * * @return TableStyle */ public function getStyle() { return $this->style; } /** * Sets table column style. * * @param TableStyle|string $name The style name or a TableStyle instance * * @return $this */ public function setColumnStyle(int $columnIndex, $name) { $this->columnStyles[$columnIndex] = $this->resolveStyle($name); return $this; } /** * Gets the current style for a column. * * If style was not set, it returns the global table style. * * @return TableStyle */ public function getColumnStyle(int $columnIndex) { return $this->columnStyles[$columnIndex] ?? $this->getStyle(); } /** * Sets the minimum width of a column. * * @return $this */ public function setColumnWidth(int $columnIndex, int $width) { $this->columnWidths[$columnIndex] = $width; return $this; } /** * Sets the minimum width of all columns. * * @return $this */ public function setColumnWidths(array $widths) { $this->columnWidths = []; foreach ($widths as $index => $width) { $this->setColumnWidth($index, $width); } return $this; } /** * Sets the maximum width of a column. * * Any cell within this column which contents exceeds the specified width will be wrapped into multiple lines, while * formatted strings are preserved. * * @return $this */ public function setColumnMaxWidth(int $columnIndex, int $width) : self { if (!$this->output->getFormatter() instanceof WrappableOutputFormatterInterface) { throw new \LogicException(\sprintf('Setting a maximum column width is only supported when using a "%s" formatter, got "%s".', WrappableOutputFormatterInterface::class, \get_debug_type($this->output->getFormatter()))); } $this->columnMaxWidths[$columnIndex] = $width; return $this; } /** * @return $this */ public function setHeaders(array $headers) { $headers = \array_values($headers); if (!empty($headers) && !\is_array($headers[0])) { $headers = [$headers]; } $this->headers = $headers; return $this; } public function setRows(array $rows) { $this->rows = []; return $this->addRows($rows); } /** * @return $this */ public function addRows(array $rows) { foreach ($rows as $row) { $this->addRow($row); } return $this; } /** * @return $this */ public function addRow($row) { if ($row instanceof TableSeparator) { $this->rows[] = $row; return $this; } if (!\is_array($row)) { throw new InvalidArgumentException('A row must be an array or a TableSeparator instance.'); } $this->rows[] = \array_values($row); return $this; } /** * Adds a row to the table, and re-renders the table. * * @return $this */ public function appendRow($row) : self { if (!$this->output instanceof ConsoleSectionOutput) { throw new RuntimeException(\sprintf('Output should be an instance of "%s" when calling "%s".', ConsoleSectionOutput::class, __METHOD__)); } if ($this->rendered) { $this->output->clear($this->calculateRowCount()); } $this->addRow($row); $this->render(); return $this; } /** * @return $this */ public function setRow($column, array $row) { $this->rows[$column] = $row; return $this; } /** * @return $this */ public function setHeaderTitle(?string $title) : self { $this->headerTitle = $title; return $this; } /** * @return $this */ public function setFooterTitle(?string $title) : self { $this->footerTitle = $title; return $this; } /** * @return $this */ public function setHorizontal(bool $horizontal = \true) : self { $this->horizontal = $horizontal; return $this; } /** * Renders table to output. * * Example: * * +---------------+-----------------------+------------------+ * | ISBN | Title | Author | * +---------------+-----------------------+------------------+ * | 99921-58-10-7 | Divine Comedy | Dante Alighieri | * | 9971-5-0210-0 | A Tale of Two Cities | Charles Dickens | * | 960-425-059-0 | The Lord of the Rings | J. R. R. Tolkien | * +---------------+-----------------------+------------------+ */ public function render() { $divider = new TableSeparator(); if ($this->horizontal) { $rows = []; foreach ($this->headers[0] ?? [] as $i => $header) { $rows[$i] = [$header]; foreach ($this->rows as $row) { if ($row instanceof TableSeparator) { continue; } if (isset($row[$i])) { $rows[$i][] = $row[$i]; } elseif ($rows[$i][0] instanceof TableCell && $rows[$i][0]->getColspan() >= 2) { // Noop, there is a "title" } else { $rows[$i][] = null; } } } } else { $rows = \array_merge($this->headers, [$divider], $this->rows); } $this->calculateNumberOfColumns($rows); $rowGroups = $this->buildTableRows($rows); $this->calculateColumnsWidth($rowGroups); $isHeader = !$this->horizontal; $isFirstRow = $this->horizontal; $hasTitle = (bool) $this->headerTitle; foreach ($rowGroups as $rowGroup) { $isHeaderSeparatorRendered = \false; foreach ($rowGroup as $row) { if ($divider === $row) { $isHeader = \false; $isFirstRow = \true; continue; } if ($row instanceof TableSeparator) { $this->renderRowSeparator(); continue; } if (!$row) { continue; } if ($isHeader && !$isHeaderSeparatorRendered) { $this->renderRowSeparator($isHeader ? self::SEPARATOR_TOP : self::SEPARATOR_TOP_BOTTOM, $hasTitle ? $this->headerTitle : null, $hasTitle ? $this->style->getHeaderTitleFormat() : null); $hasTitle = \false; $isHeaderSeparatorRendered = \true; } if ($isFirstRow) { $this->renderRowSeparator($isHeader ? self::SEPARATOR_TOP : self::SEPARATOR_TOP_BOTTOM, $hasTitle ? $this->headerTitle : null, $hasTitle ? $this->style->getHeaderTitleFormat() : null); $isFirstRow = \false; $hasTitle = \false; } if ($this->horizontal) { $this->renderRow($row, $this->style->getCellRowFormat(), $this->style->getCellHeaderFormat()); } else { $this->renderRow($row, $isHeader ? $this->style->getCellHeaderFormat() : $this->style->getCellRowFormat()); } } } $this->renderRowSeparator(self::SEPARATOR_BOTTOM, $this->footerTitle, $this->style->getFooterTitleFormat()); $this->cleanup(); $this->rendered = \true; } /** * Renders horizontal header separator. * * Example: * * +-----+-----------+-------+ */ private function renderRowSeparator(int $type = self::SEPARATOR_MID, string $title = null, string $titleFormat = null) { if (0 === ($count = $this->numberOfColumns)) { return; } $borders = $this->style->getBorderChars(); if (!$borders[0] && !$borders[2] && !$this->style->getCrossingChar()) { return; } $crossings = $this->style->getCrossingChars(); if (self::SEPARATOR_MID === $type) { [$horizontal, $leftChar, $midChar, $rightChar] = [$borders[2], $crossings[8], $crossings[0], $crossings[4]]; } elseif (self::SEPARATOR_TOP === $type) { [$horizontal, $leftChar, $midChar, $rightChar] = [$borders[0], $crossings[1], $crossings[2], $crossings[3]]; } elseif (self::SEPARATOR_TOP_BOTTOM === $type) { [$horizontal, $leftChar, $midChar, $rightChar] = [$borders[0], $crossings[9], $crossings[10], $crossings[11]]; } else { [$horizontal, $leftChar, $midChar, $rightChar] = [$borders[0], $crossings[7], $crossings[6], $crossings[5]]; } $markup = $leftChar; for ($column = 0; $column < $count; ++$column) { $markup .= \str_repeat($horizontal, $this->effectiveColumnWidths[$column]); $markup .= $column === $count - 1 ? $rightChar : $midChar; } if (null !== $title) { $titleLength = Helper::width(Helper::removeDecoration($formatter = $this->output->getFormatter(), $formattedTitle = \sprintf($titleFormat, $title))); $markupLength = Helper::width($markup); if ($titleLength > ($limit = $markupLength - 4)) { $titleLength = $limit; $formatLength = Helper::width(Helper::removeDecoration($formatter, \sprintf($titleFormat, ''))); $formattedTitle = \sprintf($titleFormat, Helper::substr($title, 0, $limit - $formatLength - 3) . '...'); } $titleStart = \intdiv($markupLength - $titleLength, 2); if (\false === \mb_detect_encoding($markup, null, \true)) { $markup = \substr_replace($markup, $formattedTitle, $titleStart, $titleLength); } else { $markup = \mb_substr($markup, 0, $titleStart) . $formattedTitle . \mb_substr($markup, $titleStart + $titleLength); } } $this->output->writeln(\sprintf($this->style->getBorderFormat(), $markup)); } /** * Renders vertical column separator. */ private function renderColumnSeparator(int $type = self::BORDER_OUTSIDE) : string { $borders = $this->style->getBorderChars(); return \sprintf($this->style->getBorderFormat(), self::BORDER_OUTSIDE === $type ? $borders[1] : $borders[3]); } /** * Renders table row. * * Example: * * | 9971-5-0210-0 | A Tale of Two Cities | Charles Dickens | */ private function renderRow(array $row, string $cellFormat, string $firstCellFormat = null) { $rowContent = $this->renderColumnSeparator(self::BORDER_OUTSIDE); $columns = $this->getRowColumns($row); $last = \count($columns) - 1; foreach ($columns as $i => $column) { if ($firstCellFormat && 0 === $i) { $rowContent .= $this->renderCell($row, $column, $firstCellFormat); } else { $rowContent .= $this->renderCell($row, $column, $cellFormat); } $rowContent .= $this->renderColumnSeparator($last === $i ? self::BORDER_OUTSIDE : self::BORDER_INSIDE); } $this->output->writeln($rowContent); } /** * Renders table cell with padding. */ private function renderCell(array $row, int $column, string $cellFormat) : string { $cell = $row[$column] ?? ''; $width = $this->effectiveColumnWidths[$column]; if ($cell instanceof TableCell && $cell->getColspan() > 1) { // add the width of the following columns(numbers of colspan). foreach (\range($column + 1, $column + $cell->getColspan() - 1) as $nextColumn) { $width += $this->getColumnSeparatorWidth() + $this->effectiveColumnWidths[$nextColumn]; } } // str_pad won't work properly with multi-byte strings, we need to fix the padding if (\false !== ($encoding = \mb_detect_encoding($cell, null, \true))) { $width += \strlen($cell) - \mb_strwidth($cell, $encoding); } $style = $this->getColumnStyle($column); if ($cell instanceof TableSeparator) { return \sprintf($style->getBorderFormat(), \str_repeat($style->getBorderChars()[2], $width)); } $width += Helper::length($cell) - Helper::length(Helper::removeDecoration($this->output->getFormatter(), $cell)); $content = \sprintf($style->getCellRowContentFormat(), $cell); $padType = $style->getPadType(); if ($cell instanceof TableCell && $cell->getStyle() instanceof TableCellStyle) { $isNotStyledByTag = !\preg_match('/^<(\\w+|(\\w+=[\\w,]+;?)*)>.+<\\/(\\w+|(\\w+=\\w+;?)*)?>$/', $cell); if ($isNotStyledByTag) { $cellFormat = $cell->getStyle()->getCellFormat(); if (!\is_string($cellFormat)) { $tag = \http_build_query($cell->getStyle()->getTagOptions(), '', ';'); $cellFormat = '<' . $tag . '>%s'; } if (\strstr($content, '')) { $content = \str_replace('', '', $content); $width -= 3; } if (\strstr($content, '')) { $content = \str_replace('', '', $content); $width -= \strlen(''); } } $padType = $cell->getStyle()->getPadByAlign(); } return \sprintf($cellFormat, \str_pad($content, $width, $style->getPaddingChar(), $padType)); } /** * Calculate number of columns for this table. */ private function calculateNumberOfColumns(array $rows) { $columns = [0]; foreach ($rows as $row) { if ($row instanceof TableSeparator) { continue; } $columns[] = $this->getNumberOfColumns($row); } $this->numberOfColumns = \max($columns); } private function buildTableRows(array $rows) : TableRows { /** @var WrappableOutputFormatterInterface $formatter */ $formatter = $this->output->getFormatter(); $unmergedRows = []; for ($rowKey = 0; $rowKey < \count($rows); ++$rowKey) { $rows = $this->fillNextRows($rows, $rowKey); // Remove any new line breaks and replace it with a new line foreach ($rows[$rowKey] as $column => $cell) { $colspan = $cell instanceof TableCell ? $cell->getColspan() : 1; if (isset($this->columnMaxWidths[$column]) && Helper::width(Helper::removeDecoration($formatter, $cell)) > $this->columnMaxWidths[$column]) { $cell = $formatter->formatAndWrap($cell, $this->columnMaxWidths[$column] * $colspan); } if (!\strstr($cell ?? '', "\n")) { continue; } $escaped = \implode("\n", \array_map([OutputFormatter::class, 'escapeTrailingBackslash'], \explode("\n", $cell))); $cell = $cell instanceof TableCell ? new TableCell($escaped, ['colspan' => $cell->getColspan()]) : $escaped; $lines = \explode("\n", \str_replace("\n", "\n", $cell)); foreach ($lines as $lineKey => $line) { if ($colspan > 1) { $line = new TableCell($line, ['colspan' => $colspan]); } if (0 === $lineKey) { $rows[$rowKey][$column] = $line; } else { if (!\array_key_exists($rowKey, $unmergedRows) || !\array_key_exists($lineKey, $unmergedRows[$rowKey])) { $unmergedRows[$rowKey][$lineKey] = $this->copyRow($rows, $rowKey); } $unmergedRows[$rowKey][$lineKey][$column] = $line; } } } } return new TableRows(function () use($rows, $unmergedRows) : \Traversable { foreach ($rows as $rowKey => $row) { $rowGroup = [$row instanceof TableSeparator ? $row : $this->fillCells($row)]; if (isset($unmergedRows[$rowKey])) { foreach ($unmergedRows[$rowKey] as $row) { $rowGroup[] = $row instanceof TableSeparator ? $row : $this->fillCells($row); } } (yield $rowGroup); } }); } private function calculateRowCount() : int { $numberOfRows = \count(\iterator_to_array($this->buildTableRows(\array_merge($this->headers, [new TableSeparator()], $this->rows)))); if ($this->headers) { ++$numberOfRows; // Add row for header separator } if (\count($this->rows) > 0) { ++$numberOfRows; // Add row for footer separator } return $numberOfRows; } /** * fill rows that contains rowspan > 1. * * @throws InvalidArgumentException */ private function fillNextRows(array $rows, int $line) : array { $unmergedRows = []; foreach ($rows[$line] as $column => $cell) { if (null !== $cell && !$cell instanceof TableCell && !\is_scalar($cell) && !(\is_object($cell) && \method_exists($cell, '__toString'))) { throw new InvalidArgumentException(\sprintf('A cell must be a TableCell, a scalar or an object implementing "__toString()", "%s" given.', \get_debug_type($cell))); } if ($cell instanceof TableCell && $cell->getRowspan() > 1) { $nbLines = $cell->getRowspan() - 1; $lines = [$cell]; if (\strstr($cell, "\n")) { $lines = \explode("\n", \str_replace("\n", "\n", $cell)); $nbLines = \count($lines) > $nbLines ? \substr_count($cell, "\n") : $nbLines; $rows[$line][$column] = new TableCell($lines[0], ['colspan' => $cell->getColspan(), 'style' => $cell->getStyle()]); unset($lines[0]); } // create a two dimensional array (rowspan x colspan) $unmergedRows = \array_replace_recursive(\array_fill($line + 1, $nbLines, []), $unmergedRows); foreach ($unmergedRows as $unmergedRowKey => $unmergedRow) { $value = $lines[$unmergedRowKey - $line] ?? ''; $unmergedRows[$unmergedRowKey][$column] = new TableCell($value, ['colspan' => $cell->getColspan(), 'style' => $cell->getStyle()]); if ($nbLines === $unmergedRowKey - $line) { break; } } } } foreach ($unmergedRows as $unmergedRowKey => $unmergedRow) { // we need to know if $unmergedRow will be merged or inserted into $rows if (isset($rows[$unmergedRowKey]) && \is_array($rows[$unmergedRowKey]) && $this->getNumberOfColumns($rows[$unmergedRowKey]) + $this->getNumberOfColumns($unmergedRows[$unmergedRowKey]) <= $this->numberOfColumns) { foreach ($unmergedRow as $cellKey => $cell) { // insert cell into row at cellKey position \array_splice($rows[$unmergedRowKey], $cellKey, 0, [$cell]); } } else { $row = $this->copyRow($rows, $unmergedRowKey - 1); foreach ($unmergedRow as $column => $cell) { if (!empty($cell)) { $row[$column] = $unmergedRow[$column]; } } \array_splice($rows, $unmergedRowKey, 0, [$row]); } } return $rows; } /** * fill cells for a row that contains colspan > 1. */ private function fillCells(iterable $row) { $newRow = []; foreach ($row as $column => $cell) { $newRow[] = $cell; if ($cell instanceof TableCell && $cell->getColspan() > 1) { foreach (\range($column + 1, $column + $cell->getColspan() - 1) as $position) { // insert empty value at column position $newRow[] = ''; } } } return $newRow ?: $row; } private function copyRow(array $rows, int $line) : array { $row = $rows[$line]; foreach ($row as $cellKey => $cellValue) { $row[$cellKey] = ''; if ($cellValue instanceof TableCell) { $row[$cellKey] = new TableCell('', ['colspan' => $cellValue->getColspan()]); } } return $row; } /** * Gets number of columns by row. */ private function getNumberOfColumns(array $row) : int { $columns = \count($row); foreach ($row as $column) { $columns += $column instanceof TableCell ? $column->getColspan() - 1 : 0; } return $columns; } /** * Gets list of columns for the given row. */ private function getRowColumns(array $row) : array { $columns = \range(0, $this->numberOfColumns - 1); foreach ($row as $cellKey => $cell) { if ($cell instanceof TableCell && $cell->getColspan() > 1) { // exclude grouped columns. $columns = \array_diff($columns, \range($cellKey + 1, $cellKey + $cell->getColspan() - 1)); } } return $columns; } /** * Calculates columns widths. */ private function calculateColumnsWidth(iterable $groups) { for ($column = 0; $column < $this->numberOfColumns; ++$column) { $lengths = []; foreach ($groups as $group) { foreach ($group as $row) { if ($row instanceof TableSeparator) { continue; } foreach ($row as $i => $cell) { if ($cell instanceof TableCell) { $textContent = Helper::removeDecoration($this->output->getFormatter(), $cell); $textLength = Helper::width($textContent); if ($textLength > 0) { $contentColumns = \str_split($textContent, \ceil($textLength / $cell->getColspan())); foreach ($contentColumns as $position => $content) { $row[$i + $position] = $content; } } } } $lengths[] = $this->getCellWidth($row, $column); } } $this->effectiveColumnWidths[$column] = \max($lengths) + Helper::width($this->style->getCellRowContentFormat()) - 2; } } private function getColumnSeparatorWidth() : int { return Helper::width(\sprintf($this->style->getBorderFormat(), $this->style->getBorderChars()[3])); } private function getCellWidth(array $row, int $column) : int { $cellWidth = 0; if (isset($row[$column])) { $cell = $row[$column]; $cellWidth = Helper::width(Helper::removeDecoration($this->output->getFormatter(), $cell)); } $columnWidth = $this->columnWidths[$column] ?? 0; $cellWidth = \max($cellWidth, $columnWidth); return isset($this->columnMaxWidths[$column]) ? \min($this->columnMaxWidths[$column], $cellWidth) : $cellWidth; } /** * Called after rendering to cleanup cache data. */ private function cleanup() { $this->effectiveColumnWidths = []; $this->numberOfColumns = null; } /** * @return array */ private static function initStyles() : array { $borderless = new TableStyle(); $borderless->setHorizontalBorderChars('=')->setVerticalBorderChars(' ')->setDefaultCrossingChar(' '); $compact = new TableStyle(); $compact->setHorizontalBorderChars('')->setVerticalBorderChars('')->setDefaultCrossingChar('')->setCellRowContentFormat('%s '); $styleGuide = new TableStyle(); $styleGuide->setHorizontalBorderChars('-')->setVerticalBorderChars(' ')->setDefaultCrossingChar(' ')->setCellHeaderFormat('%s'); $box = (new TableStyle())->setHorizontalBorderChars('─')->setVerticalBorderChars('│')->setCrossingChars('┼', '┌', '┬', '┐', '┤', '┘', '┴', '└', '├'); $boxDouble = (new TableStyle())->setHorizontalBorderChars('═', '─')->setVerticalBorderChars('║', '│')->setCrossingChars('┼', '╔', '╤', '╗', '╢', '╝', '╧', '╚', '╟', '╠', '╪', '╣'); return ['default' => new TableStyle(), 'borderless' => $borderless, 'compact' => $compact, 'symfony-style-guide' => $styleGuide, 'box' => $box, 'box-double' => $boxDouble]; } private function resolveStyle($name) : TableStyle { if ($name instanceof TableStyle) { return $name; } if (isset(self::$styles[$name])) { return self::$styles[$name]; } throw new InvalidArgumentException(\sprintf('Style "%s" is not defined.', $name)); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Helper; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Cursor; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception\LogicException; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Output\ConsoleOutputInterface; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Output\ConsoleSectionOutput; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Output\OutputInterface; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Terminal; /** * The ProgressBar provides helpers to display progress output. * * @author Fabien Potencier * @author Chris Jones */ final class ProgressBar { public const FORMAT_VERBOSE = 'verbose'; public const FORMAT_VERY_VERBOSE = 'very_verbose'; public const FORMAT_DEBUG = 'debug'; public const FORMAT_NORMAL = 'normal'; private const FORMAT_VERBOSE_NOMAX = 'verbose_nomax'; private const FORMAT_VERY_VERBOSE_NOMAX = 'very_verbose_nomax'; private const FORMAT_DEBUG_NOMAX = 'debug_nomax'; private const FORMAT_NORMAL_NOMAX = 'normal_nomax'; private $barWidth = 28; private $barChar; private $emptyBarChar = '-'; private $progressChar = '>'; private $format; private $internalFormat; private $redrawFreq = 1; private $writeCount; private $lastWriteTime; private $minSecondsBetweenRedraws = 0; private $maxSecondsBetweenRedraws = 1; private $output; private $step = 0; private $max; private $startTime; private $stepWidth; private $percent = 0.0; private $messages = []; private $overwrite = \true; private $terminal; private $previousMessage; private $cursor; private static $formatters; private static $formats; /** * @param int $max Maximum steps (0 if unknown) */ public function __construct(OutputInterface $output, int $max = 0, float $minSecondsBetweenRedraws = 1 / 25) { if ($output instanceof ConsoleOutputInterface) { $output = $output->getErrorOutput(); } $this->output = $output; $this->setMaxSteps($max); $this->terminal = new Terminal(); if (0 < $minSecondsBetweenRedraws) { $this->redrawFreq = null; $this->minSecondsBetweenRedraws = $minSecondsBetweenRedraws; } if (!$this->output->isDecorated()) { // disable overwrite when output does not support ANSI codes. $this->overwrite = \false; // set a reasonable redraw frequency so output isn't flooded $this->redrawFreq = null; } $this->startTime = \time(); $this->cursor = new Cursor($output); } /** * Sets a placeholder formatter for a given name. * * This method also allow you to override an existing placeholder. * * @param string $name The placeholder name (including the delimiter char like %) * @param callable $callable A PHP callable */ public static function setPlaceholderFormatterDefinition(string $name, callable $callable) : void { if (!self::$formatters) { self::$formatters = self::initPlaceholderFormatters(); } self::$formatters[$name] = $callable; } /** * Gets the placeholder formatter for a given name. * * @param string $name The placeholder name (including the delimiter char like %) */ public static function getPlaceholderFormatterDefinition(string $name) : ?callable { if (!self::$formatters) { self::$formatters = self::initPlaceholderFormatters(); } return self::$formatters[$name] ?? null; } /** * Sets a format for a given name. * * This method also allow you to override an existing format. * * @param string $name The format name * @param string $format A format string */ public static function setFormatDefinition(string $name, string $format) : void { if (!self::$formats) { self::$formats = self::initFormats(); } self::$formats[$name] = $format; } /** * Gets the format for a given name. * * @param string $name The format name */ public static function getFormatDefinition(string $name) : ?string { if (!self::$formats) { self::$formats = self::initFormats(); } return self::$formats[$name] ?? null; } /** * Associates a text with a named placeholder. * * The text is displayed when the progress bar is rendered but only * when the corresponding placeholder is part of the custom format line * (by wrapping the name with %). * * @param string $message The text to associate with the placeholder * @param string $name The name of the placeholder */ public function setMessage(string $message, string $name = 'message') { $this->messages[$name] = $message; } public function getMessage(string $name = 'message') { return $this->messages[$name]; } public function getStartTime() : int { return $this->startTime; } public function getMaxSteps() : int { return $this->max; } public function getProgress() : int { return $this->step; } private function getStepWidth() : int { return $this->stepWidth; } public function getProgressPercent() : float { return $this->percent; } public function getBarOffset() : float { return \floor($this->max ? $this->percent * $this->barWidth : (null === $this->redrawFreq ? (int) (\min(5, $this->barWidth / 15) * $this->writeCount) : $this->step) % $this->barWidth); } public function getEstimated() : float { if (!$this->step) { return 0; } return \round((\time() - $this->startTime) / $this->step * $this->max); } public function getRemaining() : float { if (!$this->step) { return 0; } return \round((\time() - $this->startTime) / $this->step * ($this->max - $this->step)); } public function setBarWidth(int $size) { $this->barWidth = \max(1, $size); } public function getBarWidth() : int { return $this->barWidth; } public function setBarCharacter(string $char) { $this->barChar = $char; } public function getBarCharacter() : string { return $this->barChar ?? ($this->max ? '=' : $this->emptyBarChar); } public function setEmptyBarCharacter(string $char) { $this->emptyBarChar = $char; } public function getEmptyBarCharacter() : string { return $this->emptyBarChar; } public function setProgressCharacter(string $char) { $this->progressChar = $char; } public function getProgressCharacter() : string { return $this->progressChar; } public function setFormat(string $format) { $this->format = null; $this->internalFormat = $format; } /** * Sets the redraw frequency. * * @param int|null $freq The frequency in steps */ public function setRedrawFrequency(?int $freq) { $this->redrawFreq = null !== $freq ? \max(1, $freq) : null; } public function minSecondsBetweenRedraws(float $seconds) : void { $this->minSecondsBetweenRedraws = $seconds; } public function maxSecondsBetweenRedraws(float $seconds) : void { $this->maxSecondsBetweenRedraws = $seconds; } /** * Returns an iterator that will automatically update the progress bar when iterated. * * @param int|null $max Number of steps to complete the bar (0 if indeterminate), if null it will be inferred from $iterable */ public function iterate(iterable $iterable, int $max = null) : iterable { $this->start($max ?? (\is_countable($iterable) ? \count($iterable) : 0)); foreach ($iterable as $key => $value) { (yield $key => $value); $this->advance(); } $this->finish(); } /** * Starts the progress output. * * @param int|null $max Number of steps to complete the bar (0 if indeterminate), null to leave unchanged */ public function start(int $max = null) { $this->startTime = \time(); $this->step = 0; $this->percent = 0.0; if (null !== $max) { $this->setMaxSteps($max); } $this->display(); } /** * Advances the progress output X steps. * * @param int $step Number of steps to advance */ public function advance(int $step = 1) { $this->setProgress($this->step + $step); } /** * Sets whether to overwrite the progressbar, false for new line. */ public function setOverwrite(bool $overwrite) { $this->overwrite = $overwrite; } public function setProgress(int $step) { if ($this->max && $step > $this->max) { $this->max = $step; } elseif ($step < 0) { $step = 0; } $redrawFreq = $this->redrawFreq ?? ($this->max ?: 10) / 10; $prevPeriod = (int) ($this->step / $redrawFreq); $currPeriod = (int) ($step / $redrawFreq); $this->step = $step; $this->percent = $this->max ? (float) $this->step / $this->max : 0; $timeInterval = \microtime(\true) - $this->lastWriteTime; // Draw regardless of other limits if ($this->max === $step) { $this->display(); return; } // Throttling if ($timeInterval < $this->minSecondsBetweenRedraws) { return; } // Draw each step period, but not too late if ($prevPeriod !== $currPeriod || $timeInterval >= $this->maxSecondsBetweenRedraws) { $this->display(); } } public function setMaxSteps(int $max) { $this->format = null; $this->max = \max(0, $max); $this->stepWidth = $this->max ? Helper::width((string) $this->max) : 4; } /** * Finishes the progress output. */ public function finish() : void { if (!$this->max) { $this->max = $this->step; } if ($this->step === $this->max && !$this->overwrite) { // prevent double 100% output return; } $this->setProgress($this->max); } /** * Outputs the current progress string. */ public function display() : void { if (OutputInterface::VERBOSITY_QUIET === $this->output->getVerbosity()) { return; } if (null === $this->format) { $this->setRealFormat($this->internalFormat ?: $this->determineBestFormat()); } $this->overwrite($this->buildLine()); } /** * Removes the progress bar from the current line. * * This is useful if you wish to write some output * while a progress bar is running. * Call display() to show the progress bar again. */ public function clear() : void { if (!$this->overwrite) { return; } if (null === $this->format) { $this->setRealFormat($this->internalFormat ?: $this->determineBestFormat()); } $this->overwrite(''); } private function setRealFormat(string $format) { // try to use the _nomax variant if available if (!$this->max && null !== self::getFormatDefinition($format . '_nomax')) { $this->format = self::getFormatDefinition($format . '_nomax'); } elseif (null !== self::getFormatDefinition($format)) { $this->format = self::getFormatDefinition($format); } else { $this->format = $format; } } /** * Overwrites a previous message to the output. */ private function overwrite(string $message) : void { if ($this->previousMessage === $message) { return; } $originalMessage = $message; if ($this->overwrite) { if (null !== $this->previousMessage) { if ($this->output instanceof ConsoleSectionOutput) { $messageLines = \explode("\n", $this->previousMessage); $lineCount = \count($messageLines); foreach ($messageLines as $messageLine) { $messageLineLength = Helper::width(Helper::removeDecoration($this->output->getFormatter(), $messageLine)); if ($messageLineLength > $this->terminal->getWidth()) { $lineCount += \floor($messageLineLength / $this->terminal->getWidth()); } } $this->output->clear($lineCount); } else { $lineCount = \substr_count($this->previousMessage, "\n"); for ($i = 0; $i < $lineCount; ++$i) { $this->cursor->moveToColumn(1); $this->cursor->clearLine(); $this->cursor->moveUp(); } $this->cursor->moveToColumn(1); $this->cursor->clearLine(); } } } elseif ($this->step > 0) { $message = \PHP_EOL . $message; } $this->previousMessage = $originalMessage; $this->lastWriteTime = \microtime(\true); $this->output->write($message); ++$this->writeCount; } private function determineBestFormat() : string { switch ($this->output->getVerbosity()) { // OutputInterface::VERBOSITY_QUIET: display is disabled anyway case OutputInterface::VERBOSITY_VERBOSE: return $this->max ? self::FORMAT_VERBOSE : self::FORMAT_VERBOSE_NOMAX; case OutputInterface::VERBOSITY_VERY_VERBOSE: return $this->max ? self::FORMAT_VERY_VERBOSE : self::FORMAT_VERY_VERBOSE_NOMAX; case OutputInterface::VERBOSITY_DEBUG: return $this->max ? self::FORMAT_DEBUG : self::FORMAT_DEBUG_NOMAX; default: return $this->max ? self::FORMAT_NORMAL : self::FORMAT_NORMAL_NOMAX; } } private static function initPlaceholderFormatters() : array { return ['bar' => function (self $bar, OutputInterface $output) { $completeBars = $bar->getBarOffset(); $display = \str_repeat($bar->getBarCharacter(), $completeBars); if ($completeBars < $bar->getBarWidth()) { $emptyBars = $bar->getBarWidth() - $completeBars - Helper::length(Helper::removeDecoration($output->getFormatter(), $bar->getProgressCharacter())); $display .= $bar->getProgressCharacter() . \str_repeat($bar->getEmptyBarCharacter(), $emptyBars); } return $display; }, 'elapsed' => function (self $bar) { return Helper::formatTime(\time() - $bar->getStartTime()); }, 'remaining' => function (self $bar) { if (!$bar->getMaxSteps()) { throw new LogicException('Unable to display the remaining time if the maximum number of steps is not set.'); } return Helper::formatTime($bar->getRemaining()); }, 'estimated' => function (self $bar) { if (!$bar->getMaxSteps()) { throw new LogicException('Unable to display the estimated time if the maximum number of steps is not set.'); } return Helper::formatTime($bar->getEstimated()); }, 'memory' => function (self $bar) { return Helper::formatMemory(\memory_get_usage(\true)); }, 'current' => function (self $bar) { return \str_pad($bar->getProgress(), $bar->getStepWidth(), ' ', \STR_PAD_LEFT); }, 'max' => function (self $bar) { return $bar->getMaxSteps(); }, 'percent' => function (self $bar) { return \floor($bar->getProgressPercent() * 100); }]; } private static function initFormats() : array { return [self::FORMAT_NORMAL => ' %current%/%max% [%bar%] %percent:3s%%', self::FORMAT_NORMAL_NOMAX => ' %current% [%bar%]', self::FORMAT_VERBOSE => ' %current%/%max% [%bar%] %percent:3s%% %elapsed:6s%', self::FORMAT_VERBOSE_NOMAX => ' %current% [%bar%] %elapsed:6s%', self::FORMAT_VERY_VERBOSE => ' %current%/%max% [%bar%] %percent:3s%% %elapsed:6s%/%estimated:-6s%', self::FORMAT_VERY_VERBOSE_NOMAX => ' %current% [%bar%] %elapsed:6s%', self::FORMAT_DEBUG => ' %current%/%max% [%bar%] %percent:3s%% %elapsed:6s%/%estimated:-6s% %memory:6s%', self::FORMAT_DEBUG_NOMAX => ' %current% [%bar%] %elapsed:6s% %memory:6s%']; } private function buildLine() : string { $regex = "{%([a-z\\-_]+)(?:\\:([^%]+))?%}i"; $callback = function ($matches) { if ($formatter = $this::getPlaceholderFormatterDefinition($matches[1])) { $text = $formatter($this, $this->output); } elseif (isset($this->messages[$matches[1]])) { $text = $this->messages[$matches[1]]; } else { return $matches[0]; } if (isset($matches[2])) { $text = \sprintf('%' . $matches[2], $text); } return $text; }; $line = \preg_replace_callback($regex, $callback, $this->format); // gets string length for each sub line with multiline format $linesLength = \array_map(function ($subLine) { return Helper::width(Helper::removeDecoration($this->output->getFormatter(), \rtrim($subLine, "\r"))); }, \explode("\n", $line)); $linesWidth = \max($linesLength); $terminalWidth = $this->terminal->getWidth(); if ($linesWidth <= $terminalWidth) { return $line; } $this->setBarWidth($this->barWidth - $linesWidth + $terminalWidth); return \preg_replace_callback($regex, $callback, $this->format); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Helper; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input\InputAwareInterface; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input\InputInterface; /** * An implementation of InputAwareInterface for Helpers. * * @author Wouter J */ abstract class InputAwareHelper extends Helper implements InputAwareInterface { protected $input; /** * {@inheritdoc} */ public function setInput(InputInterface $input) { $this->input = $input; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Helper; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Output\OutputInterface; use _HumbugBox1cb33d1f20f1\Symfony\Component\VarDumper\Cloner\ClonerInterface; use _HumbugBox1cb33d1f20f1\Symfony\Component\VarDumper\Cloner\VarCloner; use _HumbugBox1cb33d1f20f1\Symfony\Component\VarDumper\Dumper\CliDumper; /** * @author Roland Franssen */ final class Dumper { private $output; private $dumper; private $cloner; private $handler; public function __construct(OutputInterface $output, CliDumper $dumper = null, ClonerInterface $cloner = null) { $this->output = $output; $this->dumper = $dumper; $this->cloner = $cloner; if (\class_exists(CliDumper::class)) { $this->handler = function ($var) : string { $dumper = $this->dumper ?? ($this->dumper = new CliDumper(null, null, CliDumper::DUMP_LIGHT_ARRAY | CliDumper::DUMP_COMMA_SEPARATOR)); $dumper->setColors($this->output->isDecorated()); return \rtrim($dumper->dump(($this->cloner ?? ($this->cloner = new VarCloner()))->cloneVar($var)->withRefHandles(\false), \true)); }; } else { $this->handler = function ($var) : string { switch (\true) { case null === $var: return 'null'; case \true === $var: return 'true'; case \false === $var: return 'false'; case \is_string($var): return '"' . $var . '"'; default: return \rtrim(\print_r($var, \true)); } }; } } public function __invoke($var) : string { return ($this->handler)($var); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Helper; /** * @internal */ class TableRows implements \IteratorAggregate { private $generator; public function __construct(\Closure $generator) { $this->generator = $generator; } public function getIterator() : \Traversable { return ($this->generator)(); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Output; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception\InvalidArgumentException; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Formatter\OutputFormatterInterface; /** * A BufferedOutput that keeps only the last N chars. * * @author Jérémy Derussé */ class TrimmedBufferOutput extends Output { private $maxLength; private $buffer = ''; public function __construct(int $maxLength, ?int $verbosity = self::VERBOSITY_NORMAL, bool $decorated = \false, OutputFormatterInterface $formatter = null) { if ($maxLength <= 0) { throw new InvalidArgumentException(\sprintf('"%s()" expects a strictly positive maxLength. Got %d.', __METHOD__, $maxLength)); } parent::__construct($verbosity, $decorated, $formatter); $this->maxLength = $maxLength; } /** * Empties buffer and returns its content. * * @return string */ public function fetch() { $content = $this->buffer; $this->buffer = ''; return $content; } /** * {@inheritdoc} */ protected function doWrite(string $message, bool $newline) { $this->buffer .= $message; if ($newline) { $this->buffer .= \PHP_EOL; } $this->buffer = \substr($this->buffer, 0 - $this->maxLength); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Output; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Formatter\OutputFormatterInterface; /** * ConsoleOutput is the default class for all CLI output. It uses STDOUT and STDERR. * * This class is a convenient wrapper around `StreamOutput` for both STDOUT and STDERR. * * $output = new ConsoleOutput(); * * This is equivalent to: * * $output = new StreamOutput(fopen('php://stdout', 'w')); * $stdErr = new StreamOutput(fopen('php://stderr', 'w')); * * @author Fabien Potencier */ class ConsoleOutput extends StreamOutput implements ConsoleOutputInterface { private $stderr; private $consoleSectionOutputs = []; /** * @param int $verbosity The verbosity level (one of the VERBOSITY constants in OutputInterface) * @param bool|null $decorated Whether to decorate messages (null for auto-guessing) * @param OutputFormatterInterface|null $formatter Output formatter instance (null to use default OutputFormatter) */ public function __construct(int $verbosity = self::VERBOSITY_NORMAL, bool $decorated = null, OutputFormatterInterface $formatter = null) { parent::__construct($this->openOutputStream(), $verbosity, $decorated, $formatter); if (null === $formatter) { // for BC reasons, stdErr has it own Formatter only when user don't inject a specific formatter. $this->stderr = new StreamOutput($this->openErrorStream(), $verbosity, $decorated); return; } $actualDecorated = $this->isDecorated(); $this->stderr = new StreamOutput($this->openErrorStream(), $verbosity, $decorated, $this->getFormatter()); if (null === $decorated) { $this->setDecorated($actualDecorated && $this->stderr->isDecorated()); } } /** * Creates a new output section. */ public function section() : ConsoleSectionOutput { return new ConsoleSectionOutput($this->getStream(), $this->consoleSectionOutputs, $this->getVerbosity(), $this->isDecorated(), $this->getFormatter()); } /** * {@inheritdoc} */ public function setDecorated(bool $decorated) { parent::setDecorated($decorated); $this->stderr->setDecorated($decorated); } /** * {@inheritdoc} */ public function setFormatter(OutputFormatterInterface $formatter) { parent::setFormatter($formatter); $this->stderr->setFormatter($formatter); } /** * {@inheritdoc} */ public function setVerbosity(int $level) { parent::setVerbosity($level); $this->stderr->setVerbosity($level); } /** * {@inheritdoc} */ public function getErrorOutput() { return $this->stderr; } /** * {@inheritdoc} */ public function setErrorOutput(OutputInterface $error) { $this->stderr = $error; } /** * Returns true if current environment supports writing console output to * STDOUT. * * @return bool */ protected function hasStdoutSupport() { return \false === $this->isRunningOS400(); } /** * Returns true if current environment supports writing console output to * STDERR. * * @return bool */ protected function hasStderrSupport() { return \false === $this->isRunningOS400(); } /** * Checks if current executing environment is IBM iSeries (OS400), which * doesn't properly convert character-encodings between ASCII to EBCDIC. */ private function isRunningOS400() : bool { $checks = [\function_exists('php_uname') ? \php_uname('s') : '', \getenv('OSTYPE'), \PHP_OS]; return \false !== \stripos(\implode(';', $checks), 'OS400'); } /** * @return resource */ private function openOutputStream() { if (!$this->hasStdoutSupport()) { return \fopen('php://output', 'w'); } // Use STDOUT when possible to prevent from opening too many file descriptors return \defined('STDOUT') ? \STDOUT : (@\fopen('php://stdout', 'w') ?: \fopen('php://output', 'w')); } /** * @return resource */ private function openErrorStream() { if (!$this->hasStderrSupport()) { return \fopen('php://output', 'w'); } // Use STDERR when possible to prevent from opening too many file descriptors return \defined('STDERR') ? \STDERR : (@\fopen('php://stderr', 'w') ?: \fopen('php://output', 'w')); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Output; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Formatter\OutputFormatterInterface; /** * OutputInterface is the interface implemented by all Output classes. * * @author Fabien Potencier */ interface OutputInterface { public const VERBOSITY_QUIET = 16; public const VERBOSITY_NORMAL = 32; public const VERBOSITY_VERBOSE = 64; public const VERBOSITY_VERY_VERBOSE = 128; public const VERBOSITY_DEBUG = 256; public const OUTPUT_NORMAL = 1; public const OUTPUT_RAW = 2; public const OUTPUT_PLAIN = 4; /** * Writes a message to the output. * * @param string|iterable $messages The message as an iterable of strings or a single string * @param bool $newline Whether to add a newline * @param int $options A bitmask of options (one of the OUTPUT or VERBOSITY constants), 0 is considered the same as self::OUTPUT_NORMAL | self::VERBOSITY_NORMAL */ public function write($messages, bool $newline = \false, int $options = 0); /** * Writes a message to the output and adds a newline at the end. * * @param string|iterable $messages The message as an iterable of strings or a single string * @param int $options A bitmask of options (one of the OUTPUT or VERBOSITY constants), 0 is considered the same as self::OUTPUT_NORMAL | self::VERBOSITY_NORMAL */ public function writeln($messages, int $options = 0); /** * Sets the verbosity of the output. */ public function setVerbosity(int $level); /** * Gets the current verbosity of the output. * * @return int */ public function getVerbosity(); /** * Returns whether verbosity is quiet (-q). * * @return bool */ public function isQuiet(); /** * Returns whether verbosity is verbose (-v). * * @return bool */ public function isVerbose(); /** * Returns whether verbosity is very verbose (-vv). * * @return bool */ public function isVeryVerbose(); /** * Returns whether verbosity is debug (-vvv). * * @return bool */ public function isDebug(); /** * Sets the decorated flag. */ public function setDecorated(bool $decorated); /** * Gets the decorated flag. * * @return bool */ public function isDecorated(); public function setFormatter(OutputFormatterInterface $formatter); /** * Returns current output formatter instance. * * @return OutputFormatterInterface */ public function getFormatter(); } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Output; /** * @author Jean-François Simon */ class BufferedOutput extends Output { private $buffer = ''; /** * Empties buffer and returns its content. * * @return string */ public function fetch() { $content = $this->buffer; $this->buffer = ''; return $content; } /** * {@inheritdoc} */ protected function doWrite(string $message, bool $newline) { $this->buffer .= $message; if ($newline) { $this->buffer .= \PHP_EOL; } } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Output; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception\InvalidArgumentException; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Formatter\OutputFormatterInterface; /** * StreamOutput writes the output to a given stream. * * Usage: * * $output = new StreamOutput(fopen('php://stdout', 'w')); * * As `StreamOutput` can use any stream, you can also use a file: * * $output = new StreamOutput(fopen('/path/to/output.log', 'a', false)); * * @author Fabien Potencier */ class StreamOutput extends Output { private $stream; /** * @param resource $stream A stream resource * @param int $verbosity The verbosity level (one of the VERBOSITY constants in OutputInterface) * @param bool|null $decorated Whether to decorate messages (null for auto-guessing) * @param OutputFormatterInterface|null $formatter Output formatter instance (null to use default OutputFormatter) * * @throws InvalidArgumentException When first argument is not a real stream */ public function __construct($stream, int $verbosity = self::VERBOSITY_NORMAL, bool $decorated = null, OutputFormatterInterface $formatter = null) { if (!\is_resource($stream) || 'stream' !== \get_resource_type($stream)) { throw new InvalidArgumentException('The StreamOutput class needs a stream as its first argument.'); } $this->stream = $stream; if (null === $decorated) { $decorated = $this->hasColorSupport(); } parent::__construct($verbosity, $decorated, $formatter); } /** * Gets the stream attached to this StreamOutput instance. * * @return resource */ public function getStream() { return $this->stream; } /** * {@inheritdoc} */ protected function doWrite(string $message, bool $newline) { if ($newline) { $message .= \PHP_EOL; } @\fwrite($this->stream, $message); \fflush($this->stream); } /** * Returns true if the stream supports colorization. * * Colorization is disabled if not supported by the stream: * * This is tricky on Windows, because Cygwin, Msys2 etc emulate pseudo * terminals via named pipes, so we can only check the environment. * * Reference: Composer\XdebugHandler\Process::supportsColor * https://github.com/composer/xdebug-handler * * @return bool true if the stream supports colorization, false otherwise */ protected function hasColorSupport() { // Follow https://no-color.org/ if (isset($_SERVER['NO_COLOR']) || \false !== \getenv('NO_COLOR')) { return \false; } if ('Hyper' === \getenv('TERM_PROGRAM')) { return \true; } if (\DIRECTORY_SEPARATOR === '\\') { return \function_exists('sapi_windows_vt100_support') && @\sapi_windows_vt100_support($this->stream) || \false !== \getenv('ANSICON') || 'ON' === \getenv('ConEmuANSI') || 'xterm' === \getenv('TERM'); } return \stream_isatty($this->stream); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Output; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Formatter\OutputFormatter; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Formatter\OutputFormatterInterface; /** * Base class for output classes. * * There are five levels of verbosity: * * * normal: no option passed (normal output) * * verbose: -v (more output) * * very verbose: -vv (highly extended output) * * debug: -vvv (all debug output) * * quiet: -q (no output) * * @author Fabien Potencier */ abstract class Output implements OutputInterface { private $verbosity; private $formatter; /** * @param int|null $verbosity The verbosity level (one of the VERBOSITY constants in OutputInterface) * @param bool $decorated Whether to decorate messages * @param OutputFormatterInterface|null $formatter Output formatter instance (null to use default OutputFormatter) */ public function __construct(?int $verbosity = self::VERBOSITY_NORMAL, bool $decorated = \false, OutputFormatterInterface $formatter = null) { $this->verbosity = $verbosity ?? self::VERBOSITY_NORMAL; $this->formatter = $formatter ?? new OutputFormatter(); $this->formatter->setDecorated($decorated); } /** * {@inheritdoc} */ public function setFormatter(OutputFormatterInterface $formatter) { $this->formatter = $formatter; } /** * {@inheritdoc} */ public function getFormatter() { return $this->formatter; } /** * {@inheritdoc} */ public function setDecorated(bool $decorated) { $this->formatter->setDecorated($decorated); } /** * {@inheritdoc} */ public function isDecorated() { return $this->formatter->isDecorated(); } /** * {@inheritdoc} */ public function setVerbosity(int $level) { $this->verbosity = $level; } /** * {@inheritdoc} */ public function getVerbosity() { return $this->verbosity; } /** * {@inheritdoc} */ public function isQuiet() { return self::VERBOSITY_QUIET === $this->verbosity; } /** * {@inheritdoc} */ public function isVerbose() { return self::VERBOSITY_VERBOSE <= $this->verbosity; } /** * {@inheritdoc} */ public function isVeryVerbose() { return self::VERBOSITY_VERY_VERBOSE <= $this->verbosity; } /** * {@inheritdoc} */ public function isDebug() { return self::VERBOSITY_DEBUG <= $this->verbosity; } /** * {@inheritdoc} */ public function writeln($messages, int $options = self::OUTPUT_NORMAL) { $this->write($messages, \true, $options); } /** * {@inheritdoc} */ public function write($messages, bool $newline = \false, int $options = self::OUTPUT_NORMAL) { if (!\is_iterable($messages)) { $messages = [$messages]; } $types = self::OUTPUT_NORMAL | self::OUTPUT_RAW | self::OUTPUT_PLAIN; $type = $types & $options ?: self::OUTPUT_NORMAL; $verbosities = self::VERBOSITY_QUIET | self::VERBOSITY_NORMAL | self::VERBOSITY_VERBOSE | self::VERBOSITY_VERY_VERBOSE | self::VERBOSITY_DEBUG; $verbosity = $verbosities & $options ?: self::VERBOSITY_NORMAL; if ($verbosity > $this->getVerbosity()) { return; } foreach ($messages as $message) { switch ($type) { case OutputInterface::OUTPUT_NORMAL: $message = $this->formatter->format($message); break; case OutputInterface::OUTPUT_RAW: break; case OutputInterface::OUTPUT_PLAIN: $message = \strip_tags($this->formatter->format($message)); break; } $this->doWrite($message ?? '', $newline); } } /** * Writes a message to the output. */ protected abstract function doWrite(string $message, bool $newline); } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Output; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Formatter\OutputFormatterInterface; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Helper\Helper; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Terminal; /** * @author Pierre du Plessis * @author Gabriel Ostrolucký */ class ConsoleSectionOutput extends StreamOutput { private $content = []; private $lines = 0; private $sections; private $terminal; /** * @param resource $stream * @param ConsoleSectionOutput[] $sections */ public function __construct($stream, array &$sections, int $verbosity, bool $decorated, OutputFormatterInterface $formatter) { parent::__construct($stream, $verbosity, $decorated, $formatter); \array_unshift($sections, $this); $this->sections =& $sections; $this->terminal = new Terminal(); } /** * Clears previous output for this section. * * @param int $lines Number of lines to clear. If null, then the entire output of this section is cleared */ public function clear(int $lines = null) { if (empty($this->content) || !$this->isDecorated()) { return; } if ($lines) { \array_splice($this->content, -($lines * 2)); // Multiply lines by 2 to cater for each new line added between content } else { $lines = $this->lines; $this->content = []; } $this->lines -= $lines; parent::doWrite($this->popStreamContentUntilCurrentSection($lines), \false); } /** * Overwrites the previous output with a new message. * * @param array|string $message */ public function overwrite($message) { $this->clear(); $this->writeln($message); } public function getContent() : string { return \implode('', $this->content); } /** * @internal */ public function addContent(string $input) { foreach (\explode(\PHP_EOL, $input) as $lineContent) { $this->lines += \ceil($this->getDisplayLength($lineContent) / $this->terminal->getWidth()) ?: 1; $this->content[] = $lineContent; $this->content[] = \PHP_EOL; } } /** * {@inheritdoc} */ protected function doWrite(string $message, bool $newline) { if (!$this->isDecorated()) { parent::doWrite($message, $newline); return; } $erasedContent = $this->popStreamContentUntilCurrentSection(); $this->addContent($message); parent::doWrite($message, \true); parent::doWrite($erasedContent, \false); } /** * At initial stage, cursor is at the end of stream output. This method makes cursor crawl upwards until it hits * current section. Then it erases content it crawled through. Optionally, it erases part of current section too. */ private function popStreamContentUntilCurrentSection(int $numberOfLinesToClearFromCurrentSection = 0) : string { $numberOfLinesToClear = $numberOfLinesToClearFromCurrentSection; $erasedContent = []; foreach ($this->sections as $section) { if ($section === $this) { break; } $numberOfLinesToClear += $section->lines; $erasedContent[] = $section->getContent(); } if ($numberOfLinesToClear > 0) { // move cursor up n lines parent::doWrite(\sprintf("\x1b[%dA", $numberOfLinesToClear), \false); // erase to end of screen parent::doWrite("\x1b[0J", \false); } return \implode('', \array_reverse($erasedContent)); } private function getDisplayLength(string $text) : int { return Helper::width(Helper::removeDecoration($this->getFormatter(), \str_replace("\t", ' ', $text))); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Output; /** * ConsoleOutputInterface is the interface implemented by ConsoleOutput class. * This adds information about stderr and section output stream. * * @author Dariusz Górecki */ interface ConsoleOutputInterface extends OutputInterface { /** * Gets the OutputInterface for errors. * * @return OutputInterface */ public function getErrorOutput(); public function setErrorOutput(OutputInterface $error); public function section() : ConsoleSectionOutput; } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Output; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Formatter\NullOutputFormatter; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Formatter\OutputFormatterInterface; /** * NullOutput suppresses all output. * * $output = new NullOutput(); * * @author Fabien Potencier * @author Tobias Schultze */ class NullOutput implements OutputInterface { private $formatter; /** * {@inheritdoc} */ public function setFormatter(OutputFormatterInterface $formatter) { // do nothing } /** * {@inheritdoc} */ public function getFormatter() { if ($this->formatter) { return $this->formatter; } // to comply with the interface we must return a OutputFormatterInterface return $this->formatter = new NullOutputFormatter(); } /** * {@inheritdoc} */ public function setDecorated(bool $decorated) { // do nothing } /** * {@inheritdoc} */ public function isDecorated() { return \false; } /** * {@inheritdoc} */ public function setVerbosity(int $level) { // do nothing } /** * {@inheritdoc} */ public function getVerbosity() { return self::VERBOSITY_QUIET; } /** * {@inheritdoc} */ public function isQuiet() { return \true; } /** * {@inheritdoc} */ public function isVerbose() { return \false; } /** * {@inheritdoc} */ public function isVeryVerbose() { return \false; } /** * {@inheritdoc} */ public function isDebug() { return \false; } /** * {@inheritdoc} */ public function writeln($messages, int $options = self::OUTPUT_NORMAL) { // do nothing } /** * {@inheritdoc} */ public function write($messages, bool $newline = \false, int $options = self::OUTPUT_NORMAL) { // do nothing } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Command\Command; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input\InputInterface; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Output\OutputInterface; /** * @author Grégoire Pineau */ class SingleCommandApplication extends Command { private $version = 'UNKNOWN'; private $autoExit = \true; private $running = \false; /** * @return $this */ public function setVersion(string $version) : self { $this->version = $version; return $this; } /** * @final * * @return $this */ public function setAutoExit(bool $autoExit) : self { $this->autoExit = $autoExit; return $this; } public function run(InputInterface $input = null, OutputInterface $output = null) : int { if ($this->running) { return parent::run($input, $output); } // We use the command name as the application name $application = new Application($this->getName() ?: 'UNKNOWN', $this->version); $application->setAutoExit($this->autoExit); // Fix the usage of the command displayed with "--help" $this->setName($_SERVER['argv'][0]); $application->add($this); $application->setDefaultCommand($this->getName(), \true); $this->running = \true; try { $ret = $application->run($input, $output); } finally { $this->running = \false; } return $ret ?? 1; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Tester; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Application; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input\ArrayInput; /** * Eases the testing of console applications. * * When testing an application, don't forget to disable the auto exit flag: * * $application = new Application(); * $application->setAutoExit(false); * * @author Fabien Potencier */ class ApplicationTester { use TesterTrait; private $application; public function __construct(Application $application) { $this->application = $application; } /** * Executes the application. * * Available options: * * * interactive: Sets the input interactive flag * * decorated: Sets the output decorated flag * * verbosity: Sets the output verbosity flag * * capture_stderr_separately: Make output of stdOut and stdErr separately available * * @return int The command exit code */ public function run(array $input, array $options = []) { $prevShellVerbosity = \getenv('SHELL_VERBOSITY'); try { $this->input = new ArrayInput($input); if (isset($options['interactive'])) { $this->input->setInteractive($options['interactive']); } if ($this->inputs) { $this->input->setStream(self::createStream($this->inputs)); } $this->initOutput($options); return $this->statusCode = $this->application->run($this->input, $this->output); } finally { // SHELL_VERBOSITY is set by Application::configureIO so we need to unset/reset it // to its previous value to avoid one test's verbosity to spread to the following tests if (\false === $prevShellVerbosity) { if (\function_exists('putenv')) { @\putenv('SHELL_VERBOSITY'); } unset($_ENV['SHELL_VERBOSITY']); unset($_SERVER['SHELL_VERBOSITY']); } else { if (\function_exists('putenv')) { @\putenv('SHELL_VERBOSITY=' . $prevShellVerbosity); } $_ENV['SHELL_VERBOSITY'] = $prevShellVerbosity; $_SERVER['SHELL_VERBOSITY'] = $prevShellVerbosity; } } } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Tester; use _HumbugBox1cb33d1f20f1\PHPUnit\Framework\Assert; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input\InputInterface; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Output\ConsoleOutput; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Output\OutputInterface; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Output\StreamOutput; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Tester\Constraint\CommandIsSuccessful; /** * @author Amrouche Hamza */ trait TesterTrait { /** @var StreamOutput */ private $output; private $inputs = []; private $captureStreamsIndependently = \false; /** @var InputInterface */ private $input; /** @var int */ private $statusCode; /** * Gets the display returned by the last execution of the command or application. * * @throws \RuntimeException If it's called before the execute method * * @return string */ public function getDisplay(bool $normalize = \false) { if (null === $this->output) { throw new \RuntimeException('Output not initialized, did you execute the command before requesting the display?'); } \rewind($this->output->getStream()); $display = \stream_get_contents($this->output->getStream()); if ($normalize) { $display = \str_replace(\PHP_EOL, "\n", $display); } return $display; } /** * Gets the output written to STDERR by the application. * * @param bool $normalize Whether to normalize end of lines to \n or not * * @return string */ public function getErrorOutput(bool $normalize = \false) { if (!$this->captureStreamsIndependently) { throw new \LogicException('The error output is not available when the tester is run without "capture_stderr_separately" option set.'); } \rewind($this->output->getErrorOutput()->getStream()); $display = \stream_get_contents($this->output->getErrorOutput()->getStream()); if ($normalize) { $display = \str_replace(\PHP_EOL, "\n", $display); } return $display; } /** * Gets the input instance used by the last execution of the command or application. * * @return InputInterface */ public function getInput() { return $this->input; } /** * Gets the output instance used by the last execution of the command or application. * * @return OutputInterface */ public function getOutput() { return $this->output; } /** * Gets the status code returned by the last execution of the command or application. * * @throws \RuntimeException If it's called before the execute method * * @return int */ public function getStatusCode() { if (null === $this->statusCode) { throw new \RuntimeException('Status code not initialized, did you execute the command before requesting the status code?'); } return $this->statusCode; } public function assertCommandIsSuccessful(string $message = '') : void { Assert::assertThat($this->statusCode, new CommandIsSuccessful(), $message); } /** * Sets the user inputs. * * @param array $inputs An array of strings representing each input * passed to the command input stream * * @return $this */ public function setInputs(array $inputs) { $this->inputs = $inputs; return $this; } /** * Initializes the output property. * * Available options: * * * decorated: Sets the output decorated flag * * verbosity: Sets the output verbosity flag * * capture_stderr_separately: Make output of stdOut and stdErr separately available */ private function initOutput(array $options) { $this->captureStreamsIndependently = \array_key_exists('capture_stderr_separately', $options) && $options['capture_stderr_separately']; if (!$this->captureStreamsIndependently) { $this->output = new StreamOutput(\fopen('php://memory', 'w', \false)); if (isset($options['decorated'])) { $this->output->setDecorated($options['decorated']); } if (isset($options['verbosity'])) { $this->output->setVerbosity($options['verbosity']); } } else { $this->output = new ConsoleOutput($options['verbosity'] ?? ConsoleOutput::VERBOSITY_NORMAL, $options['decorated'] ?? null); $errorOutput = new StreamOutput(\fopen('php://memory', 'w', \false)); $errorOutput->setFormatter($this->output->getFormatter()); $errorOutput->setVerbosity($this->output->getVerbosity()); $errorOutput->setDecorated($this->output->isDecorated()); $reflectedOutput = new \ReflectionObject($this->output); $strErrProperty = $reflectedOutput->getProperty('stderr'); $strErrProperty->setAccessible(\true); $strErrProperty->setValue($this->output, $errorOutput); $reflectedParent = $reflectedOutput->getParentClass(); $streamProperty = $reflectedParent->getProperty('stream'); $streamProperty->setAccessible(\true); $streamProperty->setValue($this->output, \fopen('php://memory', 'w', \false)); } } /** * @return resource */ private static function createStream(array $inputs) { $stream = \fopen('php://memory', 'r+', \false); foreach ($inputs as $input) { \fwrite($stream, $input . \PHP_EOL); } \rewind($stream); return $stream; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Tester; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Command\Command; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Completion\CompletionInput; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Completion\CompletionSuggestions; /** * Eases the testing of command completion. * * @author Jérôme Tamarelle */ class CommandCompletionTester { private $command; public function __construct(Command $command) { $this->command = $command; } /** * Create completion suggestions from input tokens. */ public function complete(array $input) : array { $currentIndex = \count($input); if ('' === \end($input)) { \array_pop($input); } \array_unshift($input, $this->command->getName()); $completionInput = CompletionInput::fromTokens($input, $currentIndex); $completionInput->bind($this->command->getDefinition()); $suggestions = new CompletionSuggestions(); $this->command->complete($completionInput, $suggestions); $options = []; foreach ($suggestions->getOptionSuggestions() as $option) { $options[] = '--' . $option->getName(); } return \array_map('strval', \array_merge($options, $suggestions->getValueSuggestions())); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Tester\Constraint; use _HumbugBox1cb33d1f20f1\PHPUnit\Framework\Constraint\Constraint; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Command\Command; final class CommandIsSuccessful extends Constraint { /** * {@inheritdoc} */ public function toString() : string { return 'is successful'; } /** * {@inheritdoc} */ protected function matches($other) : bool { return Command::SUCCESS === $other; } /** * {@inheritdoc} */ protected function failureDescription($other) : string { return 'the command ' . $this->toString(); } /** * {@inheritdoc} */ protected function additionalFailureDescription($other) : string { $mapping = [Command::FAILURE => 'Command failed.', Command::INVALID => 'Command was invalid.']; return $mapping[$other] ?? \sprintf('Command returned exit status %d.', $other); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Tester; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Command\Command; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input\ArrayInput; /** * Eases the testing of console commands. * * @author Fabien Potencier * @author Robin Chalas */ class CommandTester { use TesterTrait; private $command; public function __construct(Command $command) { $this->command = $command; } /** * Executes the command. * * Available execution options: * * * interactive: Sets the input interactive flag * * decorated: Sets the output decorated flag * * verbosity: Sets the output verbosity flag * * capture_stderr_separately: Make output of stdOut and stdErr separately available * * @param array $input An array of command arguments and options * @param array $options An array of execution options * * @return int The command exit code */ public function execute(array $input, array $options = []) { // set the command name automatically if the application requires // this argument and no command name was passed if (!isset($input['command']) && null !== ($application = $this->command->getApplication()) && $application->getDefinition()->hasArgument('command')) { $input = \array_merge(['command' => $this->command->getName()], $input); } $this->input = new ArrayInput($input); // Use an in-memory input stream even if no inputs are set so that QuestionHelper::ask() does not rely on the blocking STDIN. $this->input->setStream(self::createStream($this->inputs)); if (isset($options['interactive'])) { $this->input->setInteractive($options['interactive']); } if (!isset($options['decorated'])) { $options['decorated'] = \false; } $this->initOutput($options); return $this->statusCode = $this->command->run($this->input, $this->output); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Output\OutputInterface; /** * @author Pierre du Plessis */ final class Cursor { private $output; private $input; /** * @param resource|null $input */ public function __construct(OutputInterface $output, $input = null) { $this->output = $output; $this->input = $input ?? (\defined('STDIN') ? \STDIN : \fopen('php://input', 'r+')); } /** * @return $this */ public function moveUp(int $lines = 1) : self { $this->output->write(\sprintf("\x1b[%dA", $lines)); return $this; } /** * @return $this */ public function moveDown(int $lines = 1) : self { $this->output->write(\sprintf("\x1b[%dB", $lines)); return $this; } /** * @return $this */ public function moveRight(int $columns = 1) : self { $this->output->write(\sprintf("\x1b[%dC", $columns)); return $this; } /** * @return $this */ public function moveLeft(int $columns = 1) : self { $this->output->write(\sprintf("\x1b[%dD", $columns)); return $this; } /** * @return $this */ public function moveToColumn(int $column) : self { $this->output->write(\sprintf("\x1b[%dG", $column)); return $this; } /** * @return $this */ public function moveToPosition(int $column, int $row) : self { $this->output->write(\sprintf("\x1b[%d;%dH", $row + 1, $column)); return $this; } /** * @return $this */ public function savePosition() : self { $this->output->write("\x1b7"); return $this; } /** * @return $this */ public function restorePosition() : self { $this->output->write("\x1b8"); return $this; } /** * @return $this */ public function hide() : self { $this->output->write("\x1b[?25l"); return $this; } /** * @return $this */ public function show() : self { $this->output->write("\x1b[?25h\x1b[?0c"); return $this; } /** * Clears all the output from the current line. * * @return $this */ public function clearLine() : self { $this->output->write("\x1b[2K"); return $this; } /** * Clears all the output from the current line after the current position. */ public function clearLineAfter() : self { $this->output->write("\x1b[K"); return $this; } /** * Clears all the output from the cursors' current position to the end of the screen. * * @return $this */ public function clearOutput() : self { $this->output->write("\x1b[0J"); return $this; } /** * Clears the entire screen. * * @return $this */ public function clearScreen() : self { $this->output->write("\x1b[2J"); return $this; } /** * Returns the current cursor position as x,y coordinates. */ public function getCurrentPosition() : array { static $isTtySupported; if (null === $isTtySupported && \function_exists('proc_open')) { $isTtySupported = (bool) @\proc_open('echo 1 >/dev/null', [['file', '/dev/tty', 'r'], ['file', '/dev/tty', 'w'], ['file', '/dev/tty', 'w']], $pipes); } if (!$isTtySupported) { return [1, 1]; } $sttyMode = \shell_exec('stty -g'); \shell_exec('stty -icanon -echo'); @\fwrite($this->input, "\x1b[6n"); $code = \trim(\fread($this->input, 1024)); \shell_exec(\sprintf('stty %s', $sttyMode)); \sscanf($code, "\x1b[%d;%dR", $row, $col); return [$col, $row]; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Descriptor; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Application; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Command\Command; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input\InputArgument; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input\InputDefinition; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input\InputOption; /** * JSON descriptor. * * @author Jean-François Simon * * @internal */ class JsonDescriptor extends Descriptor { /** * {@inheritdoc} */ protected function describeInputArgument(InputArgument $argument, array $options = []) { $this->writeData($this->getInputArgumentData($argument), $options); } /** * {@inheritdoc} */ protected function describeInputOption(InputOption $option, array $options = []) { $this->writeData($this->getInputOptionData($option), $options); if ($option->isNegatable()) { $this->writeData($this->getInputOptionData($option, \true), $options); } } /** * {@inheritdoc} */ protected function describeInputDefinition(InputDefinition $definition, array $options = []) { $this->writeData($this->getInputDefinitionData($definition), $options); } /** * {@inheritdoc} */ protected function describeCommand(Command $command, array $options = []) { $this->writeData($this->getCommandData($command, $options['short'] ?? \false), $options); } /** * {@inheritdoc} */ protected function describeApplication(Application $application, array $options = []) { $describedNamespace = $options['namespace'] ?? null; $description = new ApplicationDescription($application, $describedNamespace, \true); $commands = []; foreach ($description->getCommands() as $command) { $commands[] = $this->getCommandData($command, $options['short'] ?? \false); } $data = []; if ('UNKNOWN' !== $application->getName()) { $data['application']['name'] = $application->getName(); if ('UNKNOWN' !== $application->getVersion()) { $data['application']['version'] = $application->getVersion(); } } $data['commands'] = $commands; if ($describedNamespace) { $data['namespace'] = $describedNamespace; } else { $data['namespaces'] = \array_values($description->getNamespaces()); } $this->writeData($data, $options); } /** * Writes data as json. */ private function writeData(array $data, array $options) { $flags = $options['json_encoding'] ?? 0; $this->write(\json_encode($data, $flags)); } private function getInputArgumentData(InputArgument $argument) : array { return ['name' => $argument->getName(), 'is_required' => $argument->isRequired(), 'is_array' => $argument->isArray(), 'description' => \preg_replace('/\\s*[\\r\\n]\\s*/', ' ', $argument->getDescription()), 'default' => \INF === $argument->getDefault() ? 'INF' : $argument->getDefault()]; } private function getInputOptionData(InputOption $option, bool $negated = \false) : array { return $negated ? ['name' => '--no-' . $option->getName(), 'shortcut' => '', 'accept_value' => \false, 'is_value_required' => \false, 'is_multiple' => \false, 'description' => 'Negate the "--' . $option->getName() . '" option', 'default' => \false] : ['name' => '--' . $option->getName(), 'shortcut' => $option->getShortcut() ? '-' . \str_replace('|', '|-', $option->getShortcut()) : '', 'accept_value' => $option->acceptValue(), 'is_value_required' => $option->isValueRequired(), 'is_multiple' => $option->isArray(), 'description' => \preg_replace('/\\s*[\\r\\n]\\s*/', ' ', $option->getDescription()), 'default' => \INF === $option->getDefault() ? 'INF' : $option->getDefault()]; } private function getInputDefinitionData(InputDefinition $definition) : array { $inputArguments = []; foreach ($definition->getArguments() as $name => $argument) { $inputArguments[$name] = $this->getInputArgumentData($argument); } $inputOptions = []; foreach ($definition->getOptions() as $name => $option) { $inputOptions[$name] = $this->getInputOptionData($option); if ($option->isNegatable()) { $inputOptions['no-' . $name] = $this->getInputOptionData($option, \true); } } return ['arguments' => $inputArguments, 'options' => $inputOptions]; } private function getCommandData(Command $command, bool $short = \false) : array { $data = ['name' => $command->getName(), 'description' => $command->getDescription()]; if ($short) { $data += ['usage' => $command->getAliases()]; } else { $command->mergeApplicationDefinition(\false); $data += ['usage' => \array_merge([$command->getSynopsis()], $command->getUsages(), $command->getAliases()), 'help' => $command->getProcessedHelp(), 'definition' => $this->getInputDefinitionData($command->getDefinition())]; } $data['hidden'] = $command->isHidden(); return $data; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Descriptor; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Application; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Command\Command; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception\CommandNotFoundException; /** * @author Jean-François Simon * * @internal */ class ApplicationDescription { public const GLOBAL_NAMESPACE = '_global'; private $application; private $namespace; private $showHidden; /** * @var array */ private $namespaces; /** * @var array */ private $commands; /** * @var array */ private $aliases; public function __construct(Application $application, string $namespace = null, bool $showHidden = \false) { $this->application = $application; $this->namespace = $namespace; $this->showHidden = $showHidden; } public function getNamespaces() : array { if (null === $this->namespaces) { $this->inspectApplication(); } return $this->namespaces; } /** * @return Command[] */ public function getCommands() : array { if (null === $this->commands) { $this->inspectApplication(); } return $this->commands; } /** * @throws CommandNotFoundException */ public function getCommand(string $name) : Command { if (!isset($this->commands[$name]) && !isset($this->aliases[$name])) { throw new CommandNotFoundException(\sprintf('Command "%s" does not exist.', $name)); } return $this->commands[$name] ?? $this->aliases[$name]; } private function inspectApplication() { $this->commands = []; $this->namespaces = []; $all = $this->application->all($this->namespace ? $this->application->findNamespace($this->namespace) : null); foreach ($this->sortCommands($all) as $namespace => $commands) { $names = []; /** @var Command $command */ foreach ($commands as $name => $command) { if (!$command->getName() || !$this->showHidden && $command->isHidden()) { continue; } if ($command->getName() === $name) { $this->commands[$name] = $command; } else { $this->aliases[$name] = $command; } $names[] = $name; } $this->namespaces[$namespace] = ['id' => $namespace, 'commands' => $names]; } } private function sortCommands(array $commands) : array { $namespacedCommands = []; $globalCommands = []; $sortedCommands = []; foreach ($commands as $name => $command) { $key = $this->application->extractNamespace($name, 1); if (\in_array($key, ['', self::GLOBAL_NAMESPACE], \true)) { $globalCommands[$name] = $command; } else { $namespacedCommands[$key][$name] = $command; } } if ($globalCommands) { \ksort($globalCommands); $sortedCommands[self::GLOBAL_NAMESPACE] = $globalCommands; } if ($namespacedCommands) { \ksort($namespacedCommands, \SORT_STRING); foreach ($namespacedCommands as $key => $commandsSet) { \ksort($commandsSet); $sortedCommands[$key] = $commandsSet; } } return $sortedCommands; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Descriptor; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Application; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Command\Command; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input\InputArgument; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input\InputDefinition; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input\InputOption; /** * XML descriptor. * * @author Jean-François Simon * * @internal */ class XmlDescriptor extends Descriptor { public function getInputDefinitionDocument(InputDefinition $definition) : \DOMDocument { $dom = new \DOMDocument('1.0', 'UTF-8'); $dom->appendChild($definitionXML = $dom->createElement('definition')); $definitionXML->appendChild($argumentsXML = $dom->createElement('arguments')); foreach ($definition->getArguments() as $argument) { $this->appendDocument($argumentsXML, $this->getInputArgumentDocument($argument)); } $definitionXML->appendChild($optionsXML = $dom->createElement('options')); foreach ($definition->getOptions() as $option) { $this->appendDocument($optionsXML, $this->getInputOptionDocument($option)); } return $dom; } public function getCommandDocument(Command $command, bool $short = \false) : \DOMDocument { $dom = new \DOMDocument('1.0', 'UTF-8'); $dom->appendChild($commandXML = $dom->createElement('command')); $commandXML->setAttribute('id', $command->getName()); $commandXML->setAttribute('name', $command->getName()); $commandXML->setAttribute('hidden', $command->isHidden() ? 1 : 0); $commandXML->appendChild($usagesXML = $dom->createElement('usages')); $commandXML->appendChild($descriptionXML = $dom->createElement('description')); $descriptionXML->appendChild($dom->createTextNode(\str_replace("\n", "\n ", $command->getDescription()))); if ($short) { foreach ($command->getAliases() as $usage) { $usagesXML->appendChild($dom->createElement('usage', $usage)); } } else { $command->mergeApplicationDefinition(\false); foreach (\array_merge([$command->getSynopsis()], $command->getAliases(), $command->getUsages()) as $usage) { $usagesXML->appendChild($dom->createElement('usage', $usage)); } $commandXML->appendChild($helpXML = $dom->createElement('help')); $helpXML->appendChild($dom->createTextNode(\str_replace("\n", "\n ", $command->getProcessedHelp()))); $definitionXML = $this->getInputDefinitionDocument($command->getDefinition()); $this->appendDocument($commandXML, $definitionXML->getElementsByTagName('definition')->item(0)); } return $dom; } public function getApplicationDocument(Application $application, string $namespace = null, bool $short = \false) : \DOMDocument { $dom = new \DOMDocument('1.0', 'UTF-8'); $dom->appendChild($rootXml = $dom->createElement('symfony')); if ('UNKNOWN' !== $application->getName()) { $rootXml->setAttribute('name', $application->getName()); if ('UNKNOWN' !== $application->getVersion()) { $rootXml->setAttribute('version', $application->getVersion()); } } $rootXml->appendChild($commandsXML = $dom->createElement('commands')); $description = new ApplicationDescription($application, $namespace, \true); if ($namespace) { $commandsXML->setAttribute('namespace', $namespace); } foreach ($description->getCommands() as $command) { $this->appendDocument($commandsXML, $this->getCommandDocument($command, $short)); } if (!$namespace) { $rootXml->appendChild($namespacesXML = $dom->createElement('namespaces')); foreach ($description->getNamespaces() as $namespaceDescription) { $namespacesXML->appendChild($namespaceArrayXML = $dom->createElement('namespace')); $namespaceArrayXML->setAttribute('id', $namespaceDescription['id']); foreach ($namespaceDescription['commands'] as $name) { $namespaceArrayXML->appendChild($commandXML = $dom->createElement('command')); $commandXML->appendChild($dom->createTextNode($name)); } } } return $dom; } /** * {@inheritdoc} */ protected function describeInputArgument(InputArgument $argument, array $options = []) { $this->writeDocument($this->getInputArgumentDocument($argument)); } /** * {@inheritdoc} */ protected function describeInputOption(InputOption $option, array $options = []) { $this->writeDocument($this->getInputOptionDocument($option)); } /** * {@inheritdoc} */ protected function describeInputDefinition(InputDefinition $definition, array $options = []) { $this->writeDocument($this->getInputDefinitionDocument($definition)); } /** * {@inheritdoc} */ protected function describeCommand(Command $command, array $options = []) { $this->writeDocument($this->getCommandDocument($command, $options['short'] ?? \false)); } /** * {@inheritdoc} */ protected function describeApplication(Application $application, array $options = []) { $this->writeDocument($this->getApplicationDocument($application, $options['namespace'] ?? null, $options['short'] ?? \false)); } /** * Appends document children to parent node. */ private function appendDocument(\DOMNode $parentNode, \DOMNode $importedParent) { foreach ($importedParent->childNodes as $childNode) { $parentNode->appendChild($parentNode->ownerDocument->importNode($childNode, \true)); } } /** * Writes DOM document. */ private function writeDocument(\DOMDocument $dom) { $dom->formatOutput = \true; $this->write($dom->saveXML()); } private function getInputArgumentDocument(InputArgument $argument) : \DOMDocument { $dom = new \DOMDocument('1.0', 'UTF-8'); $dom->appendChild($objectXML = $dom->createElement('argument')); $objectXML->setAttribute('name', $argument->getName()); $objectXML->setAttribute('is_required', $argument->isRequired() ? 1 : 0); $objectXML->setAttribute('is_array', $argument->isArray() ? 1 : 0); $objectXML->appendChild($descriptionXML = $dom->createElement('description')); $descriptionXML->appendChild($dom->createTextNode($argument->getDescription())); $objectXML->appendChild($defaultsXML = $dom->createElement('defaults')); $defaults = \is_array($argument->getDefault()) ? $argument->getDefault() : (\is_bool($argument->getDefault()) ? [\var_export($argument->getDefault(), \true)] : ($argument->getDefault() ? [$argument->getDefault()] : [])); foreach ($defaults as $default) { $defaultsXML->appendChild($defaultXML = $dom->createElement('default')); $defaultXML->appendChild($dom->createTextNode($default)); } return $dom; } private function getInputOptionDocument(InputOption $option) : \DOMDocument { $dom = new \DOMDocument('1.0', 'UTF-8'); $dom->appendChild($objectXML = $dom->createElement('option')); $objectXML->setAttribute('name', '--' . $option->getName()); $pos = \strpos($option->getShortcut() ?? '', '|'); if (\false !== $pos) { $objectXML->setAttribute('shortcut', '-' . \substr($option->getShortcut(), 0, $pos)); $objectXML->setAttribute('shortcuts', '-' . \str_replace('|', '|-', $option->getShortcut())); } else { $objectXML->setAttribute('shortcut', $option->getShortcut() ? '-' . $option->getShortcut() : ''); } $objectXML->setAttribute('accept_value', $option->acceptValue() ? 1 : 0); $objectXML->setAttribute('is_value_required', $option->isValueRequired() ? 1 : 0); $objectXML->setAttribute('is_multiple', $option->isArray() ? 1 : 0); $objectXML->appendChild($descriptionXML = $dom->createElement('description')); $descriptionXML->appendChild($dom->createTextNode($option->getDescription())); if ($option->acceptValue()) { $defaults = \is_array($option->getDefault()) ? $option->getDefault() : (\is_bool($option->getDefault()) ? [\var_export($option->getDefault(), \true)] : ($option->getDefault() ? [$option->getDefault()] : [])); $objectXML->appendChild($defaultsXML = $dom->createElement('defaults')); if (!empty($defaults)) { foreach ($defaults as $default) { $defaultsXML->appendChild($defaultXML = $dom->createElement('default')); $defaultXML->appendChild($dom->createTextNode($default)); } } } if ($option->isNegatable()) { $dom->appendChild($objectXML = $dom->createElement('option')); $objectXML->setAttribute('name', '--no-' . $option->getName()); $objectXML->setAttribute('shortcut', ''); $objectXML->setAttribute('accept_value', 0); $objectXML->setAttribute('is_value_required', 0); $objectXML->setAttribute('is_multiple', 0); $objectXML->appendChild($descriptionXML = $dom->createElement('description')); $descriptionXML->appendChild($dom->createTextNode('Negate the "--' . $option->getName() . '" option')); } return $dom; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Descriptor; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Application; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Command\Command; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Helper\Helper; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input\InputArgument; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input\InputDefinition; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input\InputOption; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Output\OutputInterface; /** * Markdown descriptor. * * @author Jean-François Simon * * @internal */ class MarkdownDescriptor extends Descriptor { /** * {@inheritdoc} */ public function describe(OutputInterface $output, object $object, array $options = []) { $decorated = $output->isDecorated(); $output->setDecorated(\false); parent::describe($output, $object, $options); $output->setDecorated($decorated); } /** * {@inheritdoc} */ protected function write(string $content, bool $decorated = \true) { parent::write($content, $decorated); } /** * {@inheritdoc} */ protected function describeInputArgument(InputArgument $argument, array $options = []) { $this->write('#### `' . ($argument->getName() ?: '') . "`\n\n" . ($argument->getDescription() ? \preg_replace('/\\s*[\\r\\n]\\s*/', "\n", $argument->getDescription()) . "\n\n" : '') . '* Is required: ' . ($argument->isRequired() ? 'yes' : 'no') . "\n" . '* Is array: ' . ($argument->isArray() ? 'yes' : 'no') . "\n" . '* Default: `' . \str_replace("\n", '', \var_export($argument->getDefault(), \true)) . '`'); } /** * {@inheritdoc} */ protected function describeInputOption(InputOption $option, array $options = []) { $name = '--' . $option->getName(); if ($option->isNegatable()) { $name .= '|--no-' . $option->getName(); } if ($option->getShortcut()) { $name .= '|-' . \str_replace('|', '|-', $option->getShortcut()) . ''; } $this->write('#### `' . $name . '`' . "\n\n" . ($option->getDescription() ? \preg_replace('/\\s*[\\r\\n]\\s*/', "\n", $option->getDescription()) . "\n\n" : '') . '* Accept value: ' . ($option->acceptValue() ? 'yes' : 'no') . "\n" . '* Is value required: ' . ($option->isValueRequired() ? 'yes' : 'no') . "\n" . '* Is multiple: ' . ($option->isArray() ? 'yes' : 'no') . "\n" . '* Is negatable: ' . ($option->isNegatable() ? 'yes' : 'no') . "\n" . '* Default: `' . \str_replace("\n", '', \var_export($option->getDefault(), \true)) . '`'); } /** * {@inheritdoc} */ protected function describeInputDefinition(InputDefinition $definition, array $options = []) { if ($showArguments = \count($definition->getArguments()) > 0) { $this->write('### Arguments'); foreach ($definition->getArguments() as $argument) { $this->write("\n\n"); if (null !== ($describeInputArgument = $this->describeInputArgument($argument))) { $this->write($describeInputArgument); } } } if (\count($definition->getOptions()) > 0) { if ($showArguments) { $this->write("\n\n"); } $this->write('### Options'); foreach ($definition->getOptions() as $option) { $this->write("\n\n"); if (null !== ($describeInputOption = $this->describeInputOption($option))) { $this->write($describeInputOption); } } } } /** * {@inheritdoc} */ protected function describeCommand(Command $command, array $options = []) { if ($options['short'] ?? \false) { $this->write('`' . $command->getName() . "`\n" . \str_repeat('-', Helper::width($command->getName()) + 2) . "\n\n" . ($command->getDescription() ? $command->getDescription() . "\n\n" : '') . '### Usage' . "\n\n" . \array_reduce($command->getAliases(), function ($carry, $usage) { return $carry . '* `' . $usage . '`' . "\n"; })); return; } $command->mergeApplicationDefinition(\false); $this->write('`' . $command->getName() . "`\n" . \str_repeat('-', Helper::width($command->getName()) + 2) . "\n\n" . ($command->getDescription() ? $command->getDescription() . "\n\n" : '') . '### Usage' . "\n\n" . \array_reduce(\array_merge([$command->getSynopsis()], $command->getAliases(), $command->getUsages()), function ($carry, $usage) { return $carry . '* `' . $usage . '`' . "\n"; })); if ($help = $command->getProcessedHelp()) { $this->write("\n"); $this->write($help); } $definition = $command->getDefinition(); if ($definition->getOptions() || $definition->getArguments()) { $this->write("\n\n"); $this->describeInputDefinition($definition); } } /** * {@inheritdoc} */ protected function describeApplication(Application $application, array $options = []) { $describedNamespace = $options['namespace'] ?? null; $description = new ApplicationDescription($application, $describedNamespace); $title = $this->getApplicationTitle($application); $this->write($title . "\n" . \str_repeat('=', Helper::width($title))); foreach ($description->getNamespaces() as $namespace) { if (ApplicationDescription::GLOBAL_NAMESPACE !== $namespace['id']) { $this->write("\n\n"); $this->write('**' . $namespace['id'] . ':**'); } $this->write("\n\n"); $this->write(\implode("\n", \array_map(function ($commandName) use($description) { return \sprintf('* [`%s`](#%s)', $commandName, \str_replace(':', '', $description->getCommand($commandName)->getName())); }, $namespace['commands']))); } foreach ($description->getCommands() as $command) { $this->write("\n\n"); if (null !== ($describeCommand = $this->describeCommand($command, $options))) { $this->write($describeCommand); } } } private function getApplicationTitle(Application $application) : string { if ('UNKNOWN' !== $application->getName()) { if ('UNKNOWN' !== $application->getVersion()) { return \sprintf('%s %s', $application->getName(), $application->getVersion()); } return $application->getName(); } return 'Console Tool'; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Descriptor; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Application; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Command\Command; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Formatter\OutputFormatter; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Helper\Helper; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input\InputArgument; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input\InputDefinition; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input\InputOption; /** * Text descriptor. * * @author Jean-François Simon * * @internal */ class TextDescriptor extends Descriptor { /** * {@inheritdoc} */ protected function describeInputArgument(InputArgument $argument, array $options = []) { if (null !== $argument->getDefault() && (!\is_array($argument->getDefault()) || \count($argument->getDefault()))) { $default = \sprintf(' [default: %s]', $this->formatDefaultValue($argument->getDefault())); } else { $default = ''; } $totalWidth = $options['total_width'] ?? Helper::width($argument->getName()); $spacingWidth = $totalWidth - \strlen($argument->getName()); $this->writeText(\sprintf( ' %s %s%s%s', $argument->getName(), \str_repeat(' ', $spacingWidth), // + 4 = 2 spaces before , 2 spaces after \preg_replace('/\\s*[\\r\\n]\\s*/', "\n" . \str_repeat(' ', $totalWidth + 4), $argument->getDescription()), $default ), $options); } /** * {@inheritdoc} */ protected function describeInputOption(InputOption $option, array $options = []) { if ($option->acceptValue() && null !== $option->getDefault() && (!\is_array($option->getDefault()) || \count($option->getDefault()))) { $default = \sprintf(' [default: %s]', $this->formatDefaultValue($option->getDefault())); } else { $default = ''; } $value = ''; if ($option->acceptValue()) { $value = '=' . \strtoupper($option->getName()); if ($option->isValueOptional()) { $value = '[' . $value . ']'; } } $totalWidth = $options['total_width'] ?? $this->calculateTotalWidthForOptions([$option]); $synopsis = \sprintf('%s%s', $option->getShortcut() ? \sprintf('-%s, ', $option->getShortcut()) : ' ', \sprintf($option->isNegatable() ? '--%1$s|--no-%1$s' : '--%1$s%2$s', $option->getName(), $value)); $spacingWidth = $totalWidth - Helper::width($synopsis); $this->writeText(\sprintf( ' %s %s%s%s%s', $synopsis, \str_repeat(' ', $spacingWidth), // + 4 = 2 spaces before , 2 spaces after \preg_replace('/\\s*[\\r\\n]\\s*/', "\n" . \str_repeat(' ', $totalWidth + 4), $option->getDescription()), $default, $option->isArray() ? ' (multiple values allowed)' : '' ), $options); } /** * {@inheritdoc} */ protected function describeInputDefinition(InputDefinition $definition, array $options = []) { $totalWidth = $this->calculateTotalWidthForOptions($definition->getOptions()); foreach ($definition->getArguments() as $argument) { $totalWidth = \max($totalWidth, Helper::width($argument->getName())); } if ($definition->getArguments()) { $this->writeText('Arguments:', $options); $this->writeText("\n"); foreach ($definition->getArguments() as $argument) { $this->describeInputArgument($argument, \array_merge($options, ['total_width' => $totalWidth])); $this->writeText("\n"); } } if ($definition->getArguments() && $definition->getOptions()) { $this->writeText("\n"); } if ($definition->getOptions()) { $laterOptions = []; $this->writeText('Options:', $options); foreach ($definition->getOptions() as $option) { if (\strlen($option->getShortcut() ?? '') > 1) { $laterOptions[] = $option; continue; } $this->writeText("\n"); $this->describeInputOption($option, \array_merge($options, ['total_width' => $totalWidth])); } foreach ($laterOptions as $option) { $this->writeText("\n"); $this->describeInputOption($option, \array_merge($options, ['total_width' => $totalWidth])); } } } /** * {@inheritdoc} */ protected function describeCommand(Command $command, array $options = []) { $command->mergeApplicationDefinition(\false); if ($description = $command->getDescription()) { $this->writeText('Description:', $options); $this->writeText("\n"); $this->writeText(' ' . $description); $this->writeText("\n\n"); } $this->writeText('Usage:', $options); foreach (\array_merge([$command->getSynopsis(\true)], $command->getAliases(), $command->getUsages()) as $usage) { $this->writeText("\n"); $this->writeText(' ' . OutputFormatter::escape($usage), $options); } $this->writeText("\n"); $definition = $command->getDefinition(); if ($definition->getOptions() || $definition->getArguments()) { $this->writeText("\n"); $this->describeInputDefinition($definition, $options); $this->writeText("\n"); } $help = $command->getProcessedHelp(); if ($help && $help !== $description) { $this->writeText("\n"); $this->writeText('Help:', $options); $this->writeText("\n"); $this->writeText(' ' . \str_replace("\n", "\n ", $help), $options); $this->writeText("\n"); } } /** * {@inheritdoc} */ protected function describeApplication(Application $application, array $options = []) { $describedNamespace = $options['namespace'] ?? null; $description = new ApplicationDescription($application, $describedNamespace); if (isset($options['raw_text']) && $options['raw_text']) { $width = $this->getColumnWidth($description->getCommands()); foreach ($description->getCommands() as $command) { $this->writeText(\sprintf("%-{$width}s %s", $command->getName(), $command->getDescription()), $options); $this->writeText("\n"); } } else { if ('' != ($help = $application->getHelp())) { $this->writeText("{$help}\n\n", $options); } $this->writeText("Usage:\n", $options); $this->writeText(" command [options] [arguments]\n\n", $options); $this->describeInputDefinition(new InputDefinition($application->getDefinition()->getOptions()), $options); $this->writeText("\n"); $this->writeText("\n"); $commands = $description->getCommands(); $namespaces = $description->getNamespaces(); if ($describedNamespace && $namespaces) { // make sure all alias commands are included when describing a specific namespace $describedNamespaceInfo = \reset($namespaces); foreach ($describedNamespaceInfo['commands'] as $name) { $commands[$name] = $description->getCommand($name); } } // calculate max. width based on available commands per namespace $width = $this->getColumnWidth(\array_merge(...\array_values(\array_map(function ($namespace) use($commands) { return \array_intersect($namespace['commands'], \array_keys($commands)); }, \array_values($namespaces))))); if ($describedNamespace) { $this->writeText(\sprintf('Available commands for the "%s" namespace:', $describedNamespace), $options); } else { $this->writeText('Available commands:', $options); } foreach ($namespaces as $namespace) { $namespace['commands'] = \array_filter($namespace['commands'], function ($name) use($commands) { return isset($commands[$name]); }); if (!$namespace['commands']) { continue; } if (!$describedNamespace && ApplicationDescription::GLOBAL_NAMESPACE !== $namespace['id']) { $this->writeText("\n"); $this->writeText(' ' . $namespace['id'] . '', $options); } foreach ($namespace['commands'] as $name) { $this->writeText("\n"); $spacingWidth = $width - Helper::width($name); $command = $commands[$name]; $commandAliases = $name === $command->getName() ? $this->getCommandAliasesText($command) : ''; $this->writeText(\sprintf(' %s%s%s', $name, \str_repeat(' ', $spacingWidth), $commandAliases . $command->getDescription()), $options); } } $this->writeText("\n"); } } /** * {@inheritdoc} */ private function writeText(string $content, array $options = []) { $this->write(isset($options['raw_text']) && $options['raw_text'] ? \strip_tags($content) : $content, isset($options['raw_output']) ? !$options['raw_output'] : \true); } /** * Formats command aliases to show them in the command description. */ private function getCommandAliasesText(Command $command) : string { $text = ''; $aliases = $command->getAliases(); if ($aliases) { $text = '[' . \implode('|', $aliases) . '] '; } return $text; } /** * Formats input option/argument default value. * * @param mixed $default */ private function formatDefaultValue($default) : string { if (\INF === $default) { return 'INF'; } if (\is_string($default)) { $default = OutputFormatter::escape($default); } elseif (\is_array($default)) { foreach ($default as $key => $value) { if (\is_string($value)) { $default[$key] = OutputFormatter::escape($value); } } } return \str_replace('\\\\', '\\', \json_encode($default, \JSON_UNESCAPED_SLASHES | \JSON_UNESCAPED_UNICODE)); } /** * @param array $commands */ private function getColumnWidth(array $commands) : int { $widths = []; foreach ($commands as $command) { if ($command instanceof Command) { $widths[] = Helper::width($command->getName()); foreach ($command->getAliases() as $alias) { $widths[] = Helper::width($alias); } } else { $widths[] = Helper::width($command); } } return $widths ? \max($widths) + 2 : 0; } /** * @param InputOption[] $options */ private function calculateTotalWidthForOptions(array $options) : int { $totalWidth = 0; foreach ($options as $option) { // "-" + shortcut + ", --" + name $nameLength = 1 + \max(Helper::width($option->getShortcut()), 1) + 4 + Helper::width($option->getName()); if ($option->isNegatable()) { $nameLength += 6 + Helper::width($option->getName()); // |--no- + name } elseif ($option->acceptValue()) { $valueLength = 1 + Helper::width($option->getName()); // = + value $valueLength += $option->isValueOptional() ? 2 : 0; // [ + ] $nameLength += $valueLength; } $totalWidth = \max($totalWidth, $nameLength); } return $totalWidth; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Descriptor; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Application; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Command\Command; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Exception\InvalidArgumentException; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input\InputArgument; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input\InputDefinition; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Input\InputOption; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Output\OutputInterface; /** * @author Jean-François Simon * * @internal */ abstract class Descriptor implements DescriptorInterface { /** * @var OutputInterface */ protected $output; /** * {@inheritdoc} */ public function describe(OutputInterface $output, object $object, array $options = []) { $this->output = $output; switch (\true) { case $object instanceof InputArgument: $this->describeInputArgument($object, $options); break; case $object instanceof InputOption: $this->describeInputOption($object, $options); break; case $object instanceof InputDefinition: $this->describeInputDefinition($object, $options); break; case $object instanceof Command: $this->describeCommand($object, $options); break; case $object instanceof Application: $this->describeApplication($object, $options); break; default: throw new InvalidArgumentException(\sprintf('Object of type "%s" is not describable.', \get_debug_type($object))); } } /** * Writes content to output. */ protected function write(string $content, bool $decorated = \false) { $this->output->write($content, \false, $decorated ? OutputInterface::OUTPUT_NORMAL : OutputInterface::OUTPUT_RAW); } /** * Describes an InputArgument instance. */ protected abstract function describeInputArgument(InputArgument $argument, array $options = []); /** * Describes an InputOption instance. */ protected abstract function describeInputOption(InputOption $option, array $options = []); /** * Describes an InputDefinition instance. */ protected abstract function describeInputDefinition(InputDefinition $definition, array $options = []); /** * Describes a Command instance. */ protected abstract function describeCommand(Command $command, array $options = []); /** * Describes an Application instance. */ protected abstract function describeApplication(Application $application, array $options = []); } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Descriptor; use _HumbugBox1cb33d1f20f1\Symfony\Component\Console\Output\OutputInterface; /** * Descriptor interface. * * @author Jean-François Simon */ interface DescriptorInterface { public function describe(OutputInterface $output, object $object, array $options = []); } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\String\Slugger; use _HumbugBox1cb33d1f20f1\Symfony\Component\String\AbstractUnicodeString; use _HumbugBox1cb33d1f20f1\Symfony\Component\String\UnicodeString; use _HumbugBox1cb33d1f20f1\Symfony\Contracts\Translation\LocaleAwareInterface; if (!\interface_exists(LocaleAwareInterface::class)) { throw new \LogicException('You cannot use the "Symfony\\Component\\String\\Slugger\\AsciiSlugger" as the "symfony/translation-contracts" package is not installed. Try running "composer require symfony/translation-contracts".'); } /** * @author Titouan Galopin */ class AsciiSlugger implements SluggerInterface, LocaleAwareInterface { private const LOCALE_TO_TRANSLITERATOR_ID = ['am' => 'Amharic-Latin', 'ar' => 'Arabic-Latin', 'az' => 'Azerbaijani-Latin', 'be' => 'Belarusian-Latin', 'bg' => 'Bulgarian-Latin', 'bn' => 'Bengali-Latin', 'de' => 'de-ASCII', 'el' => 'Greek-Latin', 'fa' => 'Persian-Latin', 'he' => 'Hebrew-Latin', 'hy' => 'Armenian-Latin', 'ka' => 'Georgian-Latin', 'kk' => 'Kazakh-Latin', 'ky' => 'Kirghiz-Latin', 'ko' => 'Korean-Latin', 'mk' => 'Macedonian-Latin', 'mn' => 'Mongolian-Latin', 'or' => 'Oriya-Latin', 'ps' => 'Pashto-Latin', 'ru' => 'Russian-Latin', 'sr' => 'Serbian-Latin', 'sr_Cyrl' => 'Serbian-Latin', 'th' => 'Thai-Latin', 'tk' => 'Turkmen-Latin', 'uk' => 'Ukrainian-Latin', 'uz' => 'Uzbek-Latin', 'zh' => 'Han-Latin']; private $defaultLocale; private $symbolsMap = ['en' => ['@' => 'at', '&' => 'and']]; /** * Cache of transliterators per locale. * * @var \Transliterator[] */ private $transliterators = []; /** * @param array|\Closure|null $symbolsMap */ public function __construct(string $defaultLocale = null, $symbolsMap = null) { if (null !== $symbolsMap && !\is_array($symbolsMap) && !$symbolsMap instanceof \Closure) { throw new \TypeError(\sprintf('Argument 2 passed to "%s()" must be array, Closure or null, "%s" given.', __METHOD__, \gettype($symbolsMap))); } $this->defaultLocale = $defaultLocale; $this->symbolsMap = $symbolsMap ?? $this->symbolsMap; } /** * {@inheritdoc} */ public function setLocale($locale) { $this->defaultLocale = $locale; } /** * {@inheritdoc} */ public function getLocale() { return $this->defaultLocale; } /** * {@inheritdoc} */ public function slug(string $string, string $separator = '-', string $locale = null) : AbstractUnicodeString { $locale = $locale ?? $this->defaultLocale; $transliterator = []; if ($locale && ('de' === $locale || 0 === \strpos($locale, 'de_'))) { // Use the shortcut for German in UnicodeString::ascii() if possible (faster and no requirement on intl) $transliterator = ['de-ASCII']; } elseif (\function_exists('transliterator_transliterate') && $locale) { $transliterator = (array) $this->createTransliterator($locale); } if ($this->symbolsMap instanceof \Closure) { // If the symbols map is passed as a closure, there is no need to fallback to the parent locale // as the closure can just provide substitutions for all locales of interest. $symbolsMap = $this->symbolsMap; \array_unshift($transliterator, static function ($s) use($symbolsMap, $locale) { return $symbolsMap($s, $locale); }); } $unicodeString = (new UnicodeString($string))->ascii($transliterator); if (\is_array($this->symbolsMap)) { $map = null; if (isset($this->symbolsMap[$locale])) { $map = $this->symbolsMap[$locale]; } else { $parent = self::getParentLocale($locale); if ($parent && isset($this->symbolsMap[$parent])) { $map = $this->symbolsMap[$parent]; } } if ($map) { foreach ($map as $char => $replace) { $unicodeString = $unicodeString->replace($char, ' ' . $replace . ' '); } } } return $unicodeString->replaceMatches('/[^A-Za-z0-9]++/', $separator)->trim($separator); } private function createTransliterator(string $locale) : ?\Transliterator { if (\array_key_exists($locale, $this->transliterators)) { return $this->transliterators[$locale]; } // Exact locale supported, cache and return if ($id = self::LOCALE_TO_TRANSLITERATOR_ID[$locale] ?? null) { return $this->transliterators[$locale] = \Transliterator::create($id . '/BGN') ?? \Transliterator::create($id); } // Locale not supported and no parent, fallback to any-latin if (!($parent = self::getParentLocale($locale))) { return $this->transliterators[$locale] = null; } // Try to use the parent locale (ie. try "de" for "de_AT") and cache both locales if ($id = self::LOCALE_TO_TRANSLITERATOR_ID[$parent] ?? null) { $transliterator = \Transliterator::create($id . '/BGN') ?? \Transliterator::create($id); } return $this->transliterators[$locale] = $this->transliterators[$parent] = $transliterator ?? null; } private static function getParentLocale(?string $locale) : ?string { if (!$locale) { return null; } if (\false === ($str = \strrchr($locale, '_'))) { // no parent locale return null; } return \substr($locale, 0, -\strlen($str)); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\String\Slugger; use _HumbugBox1cb33d1f20f1\Symfony\Component\String\AbstractUnicodeString; /** * Creates a URL-friendly slug from a given string. * * @author Titouan Galopin */ interface SluggerInterface { /** * Creates a slug for the given string and locale, using appropriate transliteration when needed. */ public function slug(string $string, string $separator = '-', string $locale = null) : AbstractUnicodeString; } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\String; /** * A string whose value is computed lazily by a callback. * * @author Nicolas Grekas */ class LazyString implements \Stringable, \JsonSerializable { private $value; /** * @param callable|array $callback A callable or a [Closure, method] lazy-callable * * @return static */ public static function fromCallable($callback, ...$arguments) : self { if (!\is_callable($callback) && !(\is_array($callback) && isset($callback[0]) && $callback[0] instanceof \Closure && 2 >= \count($callback))) { throw new \TypeError(\sprintf('Argument 1 passed to "%s()" must be a callable or a [Closure, method] lazy-callable, "%s" given.', __METHOD__, \get_debug_type($callback))); } $lazyString = new static(); $lazyString->value = static function () use(&$callback, &$arguments, &$value) : string { if (null !== $arguments) { if (!\is_callable($callback)) { $callback[0] = $callback[0](); $callback[1] = $callback[1] ?? '__invoke'; } $value = $callback(...$arguments); $callback = self::getPrettyName($callback); $arguments = null; } return $value ?? ''; }; return $lazyString; } /** * @param string|int|float|bool|\Stringable $value * * @return static */ public static function fromStringable($value) : self { if (!self::isStringable($value)) { throw new \TypeError(\sprintf('Argument 1 passed to "%s()" must be a scalar or a stringable object, "%s" given.', __METHOD__, \get_debug_type($value))); } if (\is_object($value)) { return static::fromCallable([$value, '__toString']); } $lazyString = new static(); $lazyString->value = (string) $value; return $lazyString; } /** * Tells whether the provided value can be cast to string. */ public static final function isStringable($value) : bool { return \is_string($value) || $value instanceof self || (\is_object($value) ? \method_exists($value, '__toString') : \is_scalar($value)); } /** * Casts scalars and stringable objects to strings. * * @param object|string|int|float|bool $value * * @throws \TypeError When the provided value is not stringable */ public static final function resolve($value) : string { return $value; } /** * @return string */ public function __toString() { if (\is_string($this->value)) { return $this->value; } try { return $this->value = ($this->value)(); } catch (\Throwable $e) { if (\TypeError::class === \get_class($e) && __FILE__ === $e->getFile()) { $type = \explode(', ', $e->getMessage()); $type = \substr(\array_pop($type), 0, -\strlen(' returned')); $r = new \ReflectionFunction($this->value); $callback = $r->getStaticVariables()['callback']; $e = new \TypeError(\sprintf('Return value of %s() passed to %s::fromCallable() must be of the type string, %s returned.', $callback, static::class, $type)); } if (\PHP_VERSION_ID < 70400) { // leverage the ErrorHandler component with graceful fallback when it's not available return \trigger_error($e, \E_USER_ERROR); } throw $e; } } public function __sleep() : array { $this->__toString(); return ['value']; } public function jsonSerialize() : string { return $this->__toString(); } private function __construct() { } private static function getPrettyName(callable $callback) : string { if (\is_string($callback)) { return $callback; } if (\is_array($callback)) { $class = \is_object($callback[0]) ? \get_debug_type($callback[0]) : $callback[0]; $method = $callback[1]; } elseif ($callback instanceof \Closure) { $r = new \ReflectionFunction($callback); if (\false !== \strpos($r->name, '{closure}') || !($class = \PHP_VERSION_ID >= 80111 ? $r->getClosureCalledClass() : $r->getClosureScopeClass())) { return $r->name; } $class = $class->name; $method = $r->name; } else { $class = \get_debug_type($callback); $method = '__invoke'; } return $class . '::' . $method; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\String\Inflector; /** * French inflector. * * This class does only inflect nouns; not adjectives nor composed words like "soixante-dix". */ final class FrenchInflector implements InflectorInterface { /** * A list of all rules for pluralise. * * @see https://la-conjugaison.nouvelobs.com/regles/grammaire/le-pluriel-des-noms-121.php */ private const PLURALIZE_REGEXP = [ // First entry: regexp // Second entry: replacement // Words finishing with "s", "x" or "z" are invariables // Les mots finissant par "s", "x" ou "z" sont invariables ['/(s|x|z)$/i', '\\1'], // Words finishing with "eau" are pluralized with a "x" // Les mots finissant par "eau" prennent tous un "x" au pluriel ['/(eau)$/i', '\\1x'], // Words finishing with "au" are pluralized with a "x" excepted "landau" // Les mots finissant par "au" prennent un "x" au pluriel sauf "landau" ['/^(landau)$/i', '\\1s'], ['/(au)$/i', '\\1x'], // Words finishing with "eu" are pluralized with a "x" excepted "pneu", "bleu", "émeu" // Les mots finissant en "eu" prennent un "x" au pluriel sauf "pneu", "bleu", "émeu" ['/^(pneu|bleu|émeu)$/i', '\\1s'], ['/(eu)$/i', '\\1x'], // Words finishing with "al" are pluralized with a "aux" excepted // Les mots finissant en "al" se terminent en "aux" sauf ['/^(bal|carnaval|caracal|chacal|choral|corral|étal|festival|récital|val)$/i', '\\1s'], ['/al$/i', '\\1aux'], // Aspirail, bail, corail, émail, fermail, soupirail, travail, vantail et vitrail font leur pluriel en -aux ['/^(aspir|b|cor|ém|ferm|soupir|trav|vant|vitr)ail$/i', '\\1aux'], // Bijou, caillou, chou, genou, hibou, joujou et pou qui prennent un x au pluriel ['/^(bij|caill|ch|gen|hib|jouj|p)ou$/i', '\\1oux'], // Invariable words ['/^(cinquante|soixante|mille)$/i', '\\1'], // French titles ['/^(mon|ma)(sieur|dame|demoiselle|seigneur)$/', '_HumbugBox1cb33d1f20f1\\mes\\2s'], ['/^(Mon|Ma)(sieur|dame|demoiselle|seigneur)$/', '_HumbugBox1cb33d1f20f1\\Mes\\2s'], ]; /** * A list of all rules for singularize. */ private const SINGULARIZE_REGEXP = [ // First entry: regexp // Second entry: replacement // Aspirail, bail, corail, émail, fermail, soupirail, travail, vantail et vitrail font leur pluriel en -aux ['/((aspir|b|cor|ém|ferm|soupir|trav|vant|vitr))aux$/i', '\\1ail'], // Words finishing with "eau" are pluralized with a "x" // Les mots finissant par "eau" prennent tous un "x" au pluriel ['/(eau)x$/i', '\\1'], // Words finishing with "al" are pluralized with a "aux" expected // Les mots finissant en "al" se terminent en "aux" sauf ['/(amir|anim|arsen|boc|can|capit|capor|chev|crist|génér|hopit|hôpit|idé|journ|littor|loc|m|mét|minér|princip|radic|termin)aux$/i', '\\1al'], // Words finishing with "au" are pluralized with a "x" excepted "landau" // Les mots finissant par "au" prennent un "x" au pluriel sauf "landau" ['/(au)x$/i', '\\1'], // Words finishing with "eu" are pluralized with a "x" excepted "pneu", "bleu", "émeu" // Les mots finissant en "eu" prennent un "x" au pluriel sauf "pneu", "bleu", "émeu" ['/(eu)x$/i', '\\1'], // Words finishing with "ou" are pluralized with a "s" excepted bijou, caillou, chou, genou, hibou, joujou, pou // Les mots finissant par "ou" prennent un "s" sauf bijou, caillou, chou, genou, hibou, joujou, pou ['/(bij|caill|ch|gen|hib|jouj|p)oux$/i', '\\1ou'], // French titles ['/^mes(dame|demoiselle)s$/', '_HumbugBox1cb33d1f20f1\\ma\\1'], ['/^Mes(dame|demoiselle)s$/', '_HumbugBox1cb33d1f20f1\\Ma\\1'], ['/^mes(sieur|seigneur)s$/', '_HumbugBox1cb33d1f20f1\\mon\\1'], ['/^Mes(sieur|seigneur)s$/', '_HumbugBox1cb33d1f20f1\\Mon\\1'], // Default rule ['/s$/i', ''], ]; /** * A list of words which should not be inflected. * This list is only used by singularize. */ private const UNINFLECTED = '/^(abcès|accès|abus|albatros|anchois|anglais|autobus|bois|brebis|carquois|cas|chas|colis|concours|corps|cours|cyprès|décès|devis|discours|dos|embarras|engrais|entrelacs|excès|fils|fois|gâchis|gars|glas|héros|intrus|jars|jus|kermès|lacis|legs|lilas|marais|mars|matelas|mépris|mets|mois|mors|obus|os|palais|paradis|parcours|pardessus|pays|plusieurs|poids|pois|pouls|printemps|processus|progrès|puits|pus|rabais|radis|recors|recours|refus|relais|remords|remous|rictus|rhinocéros|repas|rubis|sans|sas|secours|sens|souris|succès|talus|tapis|tas|taudis|temps|tiers|univers|velours|verglas|vernis|virus)$/i'; /** * {@inheritdoc} */ public function singularize(string $plural) : array { if ($this->isInflectedWord($plural)) { return [$plural]; } foreach (self::SINGULARIZE_REGEXP as $rule) { [$regexp, $replace] = $rule; if (1 === \preg_match($regexp, $plural)) { return [\preg_replace($regexp, $replace, $plural)]; } } return [$plural]; } /** * {@inheritdoc} */ public function pluralize(string $singular) : array { if ($this->isInflectedWord($singular)) { return [$singular]; } foreach (self::PLURALIZE_REGEXP as $rule) { [$regexp, $replace] = $rule; if (1 === \preg_match($regexp, $singular)) { return [\preg_replace($regexp, $replace, $singular)]; } } return [$singular . 's']; } private function isInflectedWord(string $word) : bool { return 1 === \preg_match(self::UNINFLECTED, $word); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\String\Inflector; interface InflectorInterface { /** * Returns the singular forms of a string. * * If the method can't determine the form with certainty, several possible singulars are returned. * * @return string[] */ public function singularize(string $plural) : array; /** * Returns the plural forms of a string. * * If the method can't determine the form with certainty, several possible plurals are returned. * * @return string[] */ public function pluralize(string $singular) : array; } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\String\Inflector; final class EnglishInflector implements InflectorInterface { /** * Map English plural to singular suffixes. * * @see http://english-zone.com/spelling/plurals.html */ private const PLURAL_MAP = [ // First entry: plural suffix, reversed // Second entry: length of plural suffix // Third entry: Whether the suffix may succeed a vocal // Fourth entry: Whether the suffix may succeed a consonant // Fifth entry: singular suffix, normal // bacteria (bacterium), criteria (criterion), phenomena (phenomenon) ['a', 1, \true, \true, ['on', 'um']], // nebulae (nebula) ['ea', 2, \true, \true, 'a'], // services (service) ['secivres', 8, \true, \true, 'service'], // mice (mouse), lice (louse) ['eci', 3, \false, \true, 'ouse'], // geese (goose) ['esee', 4, \false, \true, 'oose'], // fungi (fungus), alumni (alumnus), syllabi (syllabus), radii (radius) ['i', 1, \true, \true, 'us'], // men (man), women (woman) ['nem', 3, \true, \true, 'man'], // children (child) ['nerdlihc', 8, \true, \true, 'child'], // oxen (ox) ['nexo', 4, \false, \false, 'ox'], // indices (index), appendices (appendix), prices (price) ['seci', 4, \false, \true, ['ex', 'ix', 'ice']], // selfies (selfie) ['seifles', 7, \true, \true, 'selfie'], // zombies (zombie) ['seibmoz', 7, \true, \true, 'zombie'], // movies (movie) ['seivom', 6, \true, \true, 'movie'], // conspectuses (conspectus), prospectuses (prospectus) ['sesutcep', 8, \true, \true, 'pectus'], // feet (foot) ['teef', 4, \true, \true, 'foot'], // geese (goose) ['eseeg', 5, \true, \true, 'goose'], // teeth (tooth) ['hteet', 5, \true, \true, 'tooth'], // news (news) ['swen', 4, \true, \true, 'news'], // series (series) ['seires', 6, \true, \true, 'series'], // babies (baby) ['sei', 3, \false, \true, 'y'], // accesses (access), addresses (address), kisses (kiss) ['sess', 4, \true, \false, 'ss'], // analyses (analysis), ellipses (ellipsis), fungi (fungus), // neuroses (neurosis), theses (thesis), emphases (emphasis), // oases (oasis), crises (crisis), houses (house), bases (base), // atlases (atlas) ['ses', 3, \true, \true, ['s', 'se', 'sis']], // objectives (objective), alternative (alternatives) ['sevit', 5, \true, \true, 'tive'], // drives (drive) ['sevird', 6, \false, \true, 'drive'], // lives (life), wives (wife) ['sevi', 4, \false, \true, 'ife'], // moves (move) ['sevom', 5, \true, \true, 'move'], // hooves (hoof), dwarves (dwarf), elves (elf), leaves (leaf), caves (cave), staves (staff) ['sev', 3, \true, \true, ['f', 've', 'ff']], // axes (axis), axes (ax), axes (axe) ['sexa', 4, \false, \false, ['ax', 'axe', 'axis']], // indexes (index), matrixes (matrix) ['sex', 3, \true, \false, 'x'], // quizzes (quiz) ['sezz', 4, \true, \false, 'z'], // bureaus (bureau) ['suae', 4, \false, \true, 'eau'], // fees (fee), trees (tree), employees (employee) ['see', 3, \true, \true, 'ee'], // edges (edge) ['segd', 4, \true, \true, 'dge'], // roses (rose), garages (garage), cassettes (cassette), // waltzes (waltz), heroes (hero), bushes (bush), arches (arch), // shoes (shoe) ['se', 2, \true, \true, ['', 'e']], // tags (tag) ['s', 1, \true, \true, ''], // chateaux (chateau) ['xuae', 4, \false, \true, 'eau'], // people (person) ['elpoep', 6, \true, \true, 'person'], ]; /** * Map English singular to plural suffixes. * * @see http://english-zone.com/spelling/plurals.html */ private const SINGULAR_MAP = [ // First entry: singular suffix, reversed // Second entry: length of singular suffix // Third entry: Whether the suffix may succeed a vocal // Fourth entry: Whether the suffix may succeed a consonant // Fifth entry: plural suffix, normal // criterion (criteria) ['airetirc', 8, \false, \false, 'criterion'], // nebulae (nebula) ['aluben', 6, \false, \false, 'nebulae'], // children (child) ['dlihc', 5, \true, \true, 'children'], // prices (price) ['eci', 3, \false, \true, 'ices'], // services (service) ['ecivres', 7, \true, \true, 'services'], // lives (life), wives (wife) ['efi', 3, \false, \true, 'ives'], // selfies (selfie) ['eifles', 6, \true, \true, 'selfies'], // movies (movie) ['eivom', 5, \true, \true, 'movies'], // lice (louse) ['esuol', 5, \false, \true, 'lice'], // mice (mouse) ['esuom', 5, \false, \true, 'mice'], // geese (goose) ['esoo', 4, \false, \true, 'eese'], // houses (house), bases (base) ['es', 2, \true, \true, 'ses'], // geese (goose) ['esoog', 5, \true, \true, 'geese'], // caves (cave) ['ev', 2, \true, \true, 'ves'], // drives (drive) ['evird', 5, \false, \true, 'drives'], // objectives (objective), alternative (alternatives) ['evit', 4, \true, \true, 'tives'], // moves (move) ['evom', 4, \true, \true, 'moves'], // staves (staff) ['ffats', 5, \true, \true, 'staves'], // hooves (hoof), dwarves (dwarf), elves (elf), leaves (leaf) ['ff', 2, \true, \true, 'ffs'], // hooves (hoof), dwarves (dwarf), elves (elf), leaves (leaf) ['f', 1, \true, \true, ['fs', 'ves']], // arches (arch) ['hc', 2, \true, \true, 'ches'], // bushes (bush) ['hs', 2, \true, \true, 'shes'], // teeth (tooth) ['htoot', 5, \true, \true, 'teeth'], // bacteria (bacterium), criteria (criterion), phenomena (phenomenon) ['mu', 2, \true, \true, 'a'], // men (man), women (woman) ['nam', 3, \true, \true, 'men'], // people (person) ['nosrep', 6, \true, \true, ['persons', 'people']], // bacteria (bacterium), criteria (criterion), phenomena (phenomenon) ['noi', 3, \true, \true, 'ions'], // coupon (coupons) ['nop', 3, \true, \true, 'pons'], // seasons (season), treasons (treason), poisons (poison), lessons (lesson) ['nos', 3, \true, \true, 'sons'], // bacteria (bacterium), criteria (criterion), phenomena (phenomenon) ['no', 2, \true, \true, 'a'], // echoes (echo) ['ohce', 4, \true, \true, 'echoes'], // heroes (hero) ['oreh', 4, \true, \true, 'heroes'], // atlases (atlas) ['salta', 5, \true, \true, 'atlases'], // irises (iris) ['siri', 4, \true, \true, 'irises'], // analyses (analysis), ellipses (ellipsis), neuroses (neurosis) // theses (thesis), emphases (emphasis), oases (oasis), // crises (crisis) ['sis', 3, \true, \true, 'ses'], // accesses (access), addresses (address), kisses (kiss) ['ss', 2, \true, \false, 'sses'], // syllabi (syllabus) ['suballys', 8, \true, \true, 'syllabi'], // buses (bus) ['sub', 3, \true, \true, 'buses'], // circuses (circus) ['suc', 3, \true, \true, 'cuses'], // conspectuses (conspectus), prospectuses (prospectus) ['sutcep', 6, \true, \true, 'pectuses'], // fungi (fungus), alumni (alumnus), syllabi (syllabus), radii (radius) ['su', 2, \true, \true, 'i'], // news (news) ['swen', 4, \true, \true, 'news'], // feet (foot) ['toof', 4, \true, \true, 'feet'], // chateaux (chateau), bureaus (bureau) ['uae', 3, \false, \true, ['eaus', 'eaux']], // oxen (ox) ['xo', 2, \false, \false, 'oxen'], // hoaxes (hoax) ['xaoh', 4, \true, \false, 'hoaxes'], // indices (index) ['xedni', 5, \false, \true, ['indicies', 'indexes']], // boxes (box) ['xo', 2, \false, \true, 'oxes'], // indexes (index), matrixes (matrix) ['x', 1, \true, \false, ['cies', 'xes']], // appendices (appendix) ['xi', 2, \false, \true, 'ices'], // babies (baby) ['y', 1, \false, \true, 'ies'], // quizzes (quiz) ['ziuq', 4, \true, \false, 'quizzes'], // waltzes (waltz) ['z', 1, \true, \true, 'zes'], ]; /** * A list of words which should not be inflected, reversed. */ private const UNINFLECTED = [ '', // data 'atad', // deer 'reed', // feedback 'kcabdeef', // fish 'hsif', // info 'ofni', // moose 'esoom', // series 'seires', // sheep 'peehs', // species 'seiceps', ]; /** * {@inheritdoc} */ public function singularize(string $plural) : array { $pluralRev = \strrev($plural); $lowerPluralRev = \strtolower($pluralRev); $pluralLength = \strlen($lowerPluralRev); // Check if the word is one which is not inflected, return early if so if (\in_array($lowerPluralRev, self::UNINFLECTED, \true)) { return [$plural]; } // The outer loop iterates over the entries of the plural table // The inner loop $j iterates over the characters of the plural suffix // in the plural table to compare them with the characters of the actual // given plural suffix foreach (self::PLURAL_MAP as $map) { $suffix = $map[0]; $suffixLength = $map[1]; $j = 0; // Compare characters in the plural table and of the suffix of the // given plural one by one while ($suffix[$j] === $lowerPluralRev[$j]) { // Let $j point to the next character ++$j; // Successfully compared the last character // Add an entry with the singular suffix to the singular array if ($j === $suffixLength) { // Is there any character preceding the suffix in the plural string? if ($j < $pluralLength) { $nextIsVocal = \false !== \strpos('aeiou', $lowerPluralRev[$j]); if (!$map[2] && $nextIsVocal) { // suffix may not succeed a vocal but next char is one break; } if (!$map[3] && !$nextIsVocal) { // suffix may not succeed a consonant but next char is one break; } } $newBase = \substr($plural, 0, $pluralLength - $suffixLength); $newSuffix = $map[4]; // Check whether the first character in the plural suffix // is uppercased. If yes, uppercase the first character in // the singular suffix too $firstUpper = \ctype_upper($pluralRev[$j - 1]); if (\is_array($newSuffix)) { $singulars = []; foreach ($newSuffix as $newSuffixEntry) { $singulars[] = $newBase . ($firstUpper ? \ucfirst($newSuffixEntry) : $newSuffixEntry); } return $singulars; } return [$newBase . ($firstUpper ? \ucfirst($newSuffix) : $newSuffix)]; } // Suffix is longer than word if ($j === $pluralLength) { break; } } } // Assume that plural and singular is identical return [$plural]; } /** * {@inheritdoc} */ public function pluralize(string $singular) : array { $singularRev = \strrev($singular); $lowerSingularRev = \strtolower($singularRev); $singularLength = \strlen($lowerSingularRev); // Check if the word is one which is not inflected, return early if so if (\in_array($lowerSingularRev, self::UNINFLECTED, \true)) { return [$singular]; } // The outer loop iterates over the entries of the singular table // The inner loop $j iterates over the characters of the singular suffix // in the singular table to compare them with the characters of the actual // given singular suffix foreach (self::SINGULAR_MAP as $map) { $suffix = $map[0]; $suffixLength = $map[1]; $j = 0; // Compare characters in the singular table and of the suffix of the // given plural one by one while ($suffix[$j] === $lowerSingularRev[$j]) { // Let $j point to the next character ++$j; // Successfully compared the last character // Add an entry with the plural suffix to the plural array if ($j === $suffixLength) { // Is there any character preceding the suffix in the plural string? if ($j < $singularLength) { $nextIsVocal = \false !== \strpos('aeiou', $lowerSingularRev[$j]); if (!$map[2] && $nextIsVocal) { // suffix may not succeed a vocal but next char is one break; } if (!$map[3] && !$nextIsVocal) { // suffix may not succeed a consonant but next char is one break; } } $newBase = \substr($singular, 0, $singularLength - $suffixLength); $newSuffix = $map[4]; // Check whether the first character in the singular suffix // is uppercased. If yes, uppercase the first character in // the singular suffix too $firstUpper = \ctype_upper($singularRev[$j - 1]); if (\is_array($newSuffix)) { $plurals = []; foreach ($newSuffix as $newSuffixEntry) { $plurals[] = $newBase . ($firstUpper ? \ucfirst($newSuffixEntry) : $newSuffixEntry); } return $plurals; } return [$newBase . ($firstUpper ? \ucfirst($newSuffix) : $newSuffix)]; } // Suffix is longer than word if ($j === $singularLength) { break; } } } // Assume that plural is singular with a trailing `s` return [$singular . 's']; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\String\Exception; interface ExceptionInterface extends \Throwable { } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\String\Exception; class RuntimeException extends \RuntimeException implements ExceptionInterface { } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\String\Exception; class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface { } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\String; use _HumbugBox1cb33d1f20f1\Symfony\Component\String\Exception\ExceptionInterface; use _HumbugBox1cb33d1f20f1\Symfony\Component\String\Exception\InvalidArgumentException; /** * Represents a string of Unicode code points encoded as UTF-8. * * @author Nicolas Grekas * @author Hugo Hamon * * @throws ExceptionInterface */ class CodePointString extends AbstractUnicodeString { public function __construct(string $string = '') { if ('' !== $string && !\preg_match('//u', $string)) { throw new InvalidArgumentException('Invalid UTF-8 string.'); } $this->string = $string; } public function append(string ...$suffix) : AbstractString { $str = clone $this; $str->string .= 1 >= \count($suffix) ? $suffix[0] ?? '' : \implode('', $suffix); if (!\preg_match('//u', $str->string)) { throw new InvalidArgumentException('Invalid UTF-8 string.'); } return $str; } public function chunk(int $length = 1) : array { if (1 > $length) { throw new InvalidArgumentException('The chunk length must be greater than zero.'); } if ('' === $this->string) { return []; } $rx = '/('; while (65535 < $length) { $rx .= '.{65535}'; $length -= 65535; } $rx .= '.{' . $length . '})/us'; $str = clone $this; $chunks = []; foreach (\preg_split($rx, $this->string, -1, \PREG_SPLIT_DELIM_CAPTURE | \PREG_SPLIT_NO_EMPTY) as $chunk) { $str->string = $chunk; $chunks[] = clone $str; } return $chunks; } public function codePointsAt(int $offset) : array { $str = $offset ? $this->slice($offset, 1) : $this; return '' === $str->string ? [] : [\mb_ord($str->string, 'UTF-8')]; } public function endsWith($suffix) : bool { if ($suffix instanceof AbstractString) { $suffix = $suffix->string; } elseif (\is_array($suffix) || $suffix instanceof \Traversable) { return parent::endsWith($suffix); } else { $suffix = (string) $suffix; } if ('' === $suffix || !\preg_match('//u', $suffix)) { return \false; } if ($this->ignoreCase) { return \preg_match('{' . \preg_quote($suffix) . '$}iuD', $this->string); } return \strlen($this->string) >= \strlen($suffix) && 0 === \substr_compare($this->string, $suffix, -\strlen($suffix)); } public function equalsTo($string) : bool { if ($string instanceof AbstractString) { $string = $string->string; } elseif (\is_array($string) || $string instanceof \Traversable) { return parent::equalsTo($string); } else { $string = (string) $string; } if ('' !== $string && $this->ignoreCase) { return \strlen($string) === \strlen($this->string) && 0 === \mb_stripos($this->string, $string, 0, 'UTF-8'); } return $string === $this->string; } public function indexOf($needle, int $offset = 0) : ?int { if ($needle instanceof AbstractString) { $needle = $needle->string; } elseif (\is_array($needle) || $needle instanceof \Traversable) { return parent::indexOf($needle, $offset); } else { $needle = (string) $needle; } if ('' === $needle) { return null; } $i = $this->ignoreCase ? \mb_stripos($this->string, $needle, $offset, 'UTF-8') : \mb_strpos($this->string, $needle, $offset, 'UTF-8'); return \false === $i ? null : $i; } public function indexOfLast($needle, int $offset = 0) : ?int { if ($needle instanceof AbstractString) { $needle = $needle->string; } elseif (\is_array($needle) || $needle instanceof \Traversable) { return parent::indexOfLast($needle, $offset); } else { $needle = (string) $needle; } if ('' === $needle) { return null; } $i = $this->ignoreCase ? \mb_strripos($this->string, $needle, $offset, 'UTF-8') : \mb_strrpos($this->string, $needle, $offset, 'UTF-8'); return \false === $i ? null : $i; } public function length() : int { return \mb_strlen($this->string, 'UTF-8'); } public function prepend(string ...$prefix) : AbstractString { $str = clone $this; $str->string = (1 >= \count($prefix) ? $prefix[0] ?? '' : \implode('', $prefix)) . $this->string; if (!\preg_match('//u', $str->string)) { throw new InvalidArgumentException('Invalid UTF-8 string.'); } return $str; } public function replace(string $from, string $to) : AbstractString { $str = clone $this; if ('' === $from || !\preg_match('//u', $from)) { return $str; } if ('' !== $to && !\preg_match('//u', $to)) { throw new InvalidArgumentException('Invalid UTF-8 string.'); } if ($this->ignoreCase) { $str->string = \implode($to, \preg_split('{' . \preg_quote($from) . '}iuD', $this->string)); } else { $str->string = \str_replace($from, $to, $this->string); } return $str; } public function slice(int $start = 0, int $length = null) : AbstractString { $str = clone $this; $str->string = \mb_substr($this->string, $start, $length, 'UTF-8'); return $str; } public function splice(string $replacement, int $start = 0, int $length = null) : AbstractString { if (!\preg_match('//u', $replacement)) { throw new InvalidArgumentException('Invalid UTF-8 string.'); } $str = clone $this; $start = $start ? \strlen(\mb_substr($this->string, 0, $start, 'UTF-8')) : 0; $length = $length ? \strlen(\mb_substr($this->string, $start, $length, 'UTF-8')) : $length; $str->string = \substr_replace($this->string, $replacement, $start, $length ?? \PHP_INT_MAX); return $str; } public function split(string $delimiter, int $limit = null, int $flags = null) : array { if (1 > ($limit = $limit ?? \PHP_INT_MAX)) { throw new InvalidArgumentException('Split limit must be a positive integer.'); } if ('' === $delimiter) { throw new InvalidArgumentException('Split delimiter is empty.'); } if (null !== $flags) { return parent::split($delimiter . 'u', $limit, $flags); } if (!\preg_match('//u', $delimiter)) { throw new InvalidArgumentException('Split delimiter is not a valid UTF-8 string.'); } $str = clone $this; $chunks = $this->ignoreCase ? \preg_split('{' . \preg_quote($delimiter) . '}iuD', $this->string, $limit) : \explode($delimiter, $this->string, $limit); foreach ($chunks as &$chunk) { $str->string = $chunk; $chunk = clone $str; } return $chunks; } public function startsWith($prefix) : bool { if ($prefix instanceof AbstractString) { $prefix = $prefix->string; } elseif (\is_array($prefix) || $prefix instanceof \Traversable) { return parent::startsWith($prefix); } else { $prefix = (string) $prefix; } if ('' === $prefix || !\preg_match('//u', $prefix)) { return \false; } if ($this->ignoreCase) { return 0 === \mb_stripos($this->string, $prefix, 0, 'UTF-8'); } return 0 === \strncmp($this->string, $prefix, \strlen($prefix)); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\String; use _HumbugBox1cb33d1f20f1\Symfony\Component\String\Exception\ExceptionInterface; use _HumbugBox1cb33d1f20f1\Symfony\Component\String\Exception\InvalidArgumentException; /** * Represents a string of Unicode grapheme clusters encoded as UTF-8. * * A letter followed by combining characters (accents typically) form what Unicode defines * as a grapheme cluster: a character as humans mean it in written texts. This class knows * about the concept and won't split a letter apart from its combining accents. It also * ensures all string comparisons happen on their canonically-composed representation, * ignoring e.g. the order in which accents are listed when a letter has many of them. * * @see https://unicode.org/reports/tr15/ * * @author Nicolas Grekas * @author Hugo Hamon * * @throws ExceptionInterface */ class UnicodeString extends AbstractUnicodeString { public function __construct(string $string = '') { $this->string = \normalizer_is_normalized($string) ? $string : \normalizer_normalize($string); if (\false === $this->string) { throw new InvalidArgumentException('Invalid UTF-8 string.'); } } public function append(string ...$suffix) : AbstractString { $str = clone $this; $str->string = $this->string . (1 >= \count($suffix) ? $suffix[0] ?? '' : \implode('', $suffix)); \normalizer_is_normalized($str->string) ?: ($str->string = \normalizer_normalize($str->string)); if (\false === $str->string) { throw new InvalidArgumentException('Invalid UTF-8 string.'); } return $str; } public function chunk(int $length = 1) : array { if (1 > $length) { throw new InvalidArgumentException('The chunk length must be greater than zero.'); } if ('' === $this->string) { return []; } $rx = '/('; while (65535 < $length) { $rx .= '\\X{65535}'; $length -= 65535; } $rx .= '\\X{' . $length . '})/u'; $str = clone $this; $chunks = []; foreach (\preg_split($rx, $this->string, -1, \PREG_SPLIT_DELIM_CAPTURE | \PREG_SPLIT_NO_EMPTY) as $chunk) { $str->string = $chunk; $chunks[] = clone $str; } return $chunks; } public function endsWith($suffix) : bool { if ($suffix instanceof AbstractString) { $suffix = $suffix->string; } elseif (\is_array($suffix) || $suffix instanceof \Traversable) { return parent::endsWith($suffix); } else { $suffix = (string) $suffix; } $form = null === $this->ignoreCase ? \Normalizer::NFD : \Normalizer::NFC; \normalizer_is_normalized($suffix, $form) ?: ($suffix = \normalizer_normalize($suffix, $form)); if ('' === $suffix || \false === $suffix) { return \false; } if ($this->ignoreCase) { return 0 === \mb_stripos(\grapheme_extract($this->string, \strlen($suffix), \GRAPHEME_EXTR_MAXBYTES, \strlen($this->string) - \strlen($suffix)), $suffix, 0, 'UTF-8'); } return $suffix === \grapheme_extract($this->string, \strlen($suffix), \GRAPHEME_EXTR_MAXBYTES, \strlen($this->string) - \strlen($suffix)); } public function equalsTo($string) : bool { if ($string instanceof AbstractString) { $string = $string->string; } elseif (\is_array($string) || $string instanceof \Traversable) { return parent::equalsTo($string); } else { $string = (string) $string; } $form = null === $this->ignoreCase ? \Normalizer::NFD : \Normalizer::NFC; \normalizer_is_normalized($string, $form) ?: ($string = \normalizer_normalize($string, $form)); if ('' !== $string && \false !== $string && $this->ignoreCase) { return \strlen($string) === \strlen($this->string) && 0 === \mb_stripos($this->string, $string, 0, 'UTF-8'); } return $string === $this->string; } public function indexOf($needle, int $offset = 0) : ?int { if ($needle instanceof AbstractString) { $needle = $needle->string; } elseif (\is_array($needle) || $needle instanceof \Traversable) { return parent::indexOf($needle, $offset); } else { $needle = (string) $needle; } $form = null === $this->ignoreCase ? \Normalizer::NFD : \Normalizer::NFC; \normalizer_is_normalized($needle, $form) ?: ($needle = \normalizer_normalize($needle, $form)); if ('' === $needle || \false === $needle) { return null; } try { $i = $this->ignoreCase ? \grapheme_stripos($this->string, $needle, $offset) : \grapheme_strpos($this->string, $needle, $offset); } catch (\ValueError $e) { return null; } return \false === $i ? null : $i; } public function indexOfLast($needle, int $offset = 0) : ?int { if ($needle instanceof AbstractString) { $needle = $needle->string; } elseif (\is_array($needle) || $needle instanceof \Traversable) { return parent::indexOfLast($needle, $offset); } else { $needle = (string) $needle; } $form = null === $this->ignoreCase ? \Normalizer::NFD : \Normalizer::NFC; \normalizer_is_normalized($needle, $form) ?: ($needle = \normalizer_normalize($needle, $form)); if ('' === $needle || \false === $needle) { return null; } $string = $this->string; if (0 > $offset) { // workaround https://bugs.php.net/74264 if (0 > ($offset += \grapheme_strlen($needle))) { $string = \grapheme_substr($string, 0, $offset); } $offset = 0; } $i = $this->ignoreCase ? \grapheme_strripos($string, $needle, $offset) : \grapheme_strrpos($string, $needle, $offset); return \false === $i ? null : $i; } public function join(array $strings, string $lastGlue = null) : AbstractString { $str = parent::join($strings, $lastGlue); \normalizer_is_normalized($str->string) ?: ($str->string = \normalizer_normalize($str->string)); return $str; } public function length() : int { return \grapheme_strlen($this->string); } /** * @return static */ public function normalize(int $form = self::NFC) : parent { $str = clone $this; if (\in_array($form, [self::NFC, self::NFKC], \true)) { \normalizer_is_normalized($str->string, $form) ?: ($str->string = \normalizer_normalize($str->string, $form)); } elseif (!\in_array($form, [self::NFD, self::NFKD], \true)) { throw new InvalidArgumentException('Unsupported normalization form.'); } elseif (!\normalizer_is_normalized($str->string, $form)) { $str->string = \normalizer_normalize($str->string, $form); $str->ignoreCase = null; } return $str; } public function prepend(string ...$prefix) : AbstractString { $str = clone $this; $str->string = (1 >= \count($prefix) ? $prefix[0] ?? '' : \implode('', $prefix)) . $this->string; \normalizer_is_normalized($str->string) ?: ($str->string = \normalizer_normalize($str->string)); if (\false === $str->string) { throw new InvalidArgumentException('Invalid UTF-8 string.'); } return $str; } public function replace(string $from, string $to) : AbstractString { $str = clone $this; \normalizer_is_normalized($from) ?: ($from = \normalizer_normalize($from)); if ('' !== $from && \false !== $from) { $tail = $str->string; $result = ''; $indexOf = $this->ignoreCase ? 'grapheme_stripos' : 'grapheme_strpos'; while ('' !== $tail && \false !== ($i = $indexOf($tail, $from))) { $slice = \grapheme_substr($tail, 0, $i); $result .= $slice . $to; $tail = \substr($tail, \strlen($slice) + \strlen($from)); } $str->string = $result . $tail; \normalizer_is_normalized($str->string) ?: ($str->string = \normalizer_normalize($str->string)); if (\false === $str->string) { throw new InvalidArgumentException('Invalid UTF-8 string.'); } } return $str; } public function replaceMatches(string $fromRegexp, $to) : AbstractString { $str = parent::replaceMatches($fromRegexp, $to); \normalizer_is_normalized($str->string) ?: ($str->string = \normalizer_normalize($str->string)); return $str; } public function slice(int $start = 0, int $length = null) : AbstractString { $str = clone $this; if (\PHP_VERSION_ID < 80000 && 0 > $start && \grapheme_strlen($this->string) < -$start) { $start = 0; } $str->string = (string) \grapheme_substr($this->string, $start, $length ?? 2147483647); return $str; } public function splice(string $replacement, int $start = 0, int $length = null) : AbstractString { $str = clone $this; if (\PHP_VERSION_ID < 80000 && 0 > $start && \grapheme_strlen($this->string) < -$start) { $start = 0; } $start = $start ? \strlen(\grapheme_substr($this->string, 0, $start)) : 0; $length = $length ? \strlen(\grapheme_substr($this->string, $start, $length ?? 2147483647)) : $length; $str->string = \substr_replace($this->string, $replacement, $start, $length ?? 2147483647); \normalizer_is_normalized($str->string) ?: ($str->string = \normalizer_normalize($str->string)); if (\false === $str->string) { throw new InvalidArgumentException('Invalid UTF-8 string.'); } return $str; } public function split(string $delimiter, int $limit = null, int $flags = null) : array { if (1 > ($limit = $limit ?? 2147483647)) { throw new InvalidArgumentException('Split limit must be a positive integer.'); } if ('' === $delimiter) { throw new InvalidArgumentException('Split delimiter is empty.'); } if (null !== $flags) { return parent::split($delimiter . 'u', $limit, $flags); } \normalizer_is_normalized($delimiter) ?: ($delimiter = \normalizer_normalize($delimiter)); if (\false === $delimiter) { throw new InvalidArgumentException('Split delimiter is not a valid UTF-8 string.'); } $str = clone $this; $tail = $this->string; $chunks = []; $indexOf = $this->ignoreCase ? 'grapheme_stripos' : 'grapheme_strpos'; while (1 < $limit && \false !== ($i = $indexOf($tail, $delimiter))) { $str->string = \grapheme_substr($tail, 0, $i); $chunks[] = clone $str; $tail = \substr($tail, \strlen($str->string) + \strlen($delimiter)); --$limit; } $str->string = $tail; $chunks[] = clone $str; return $chunks; } public function startsWith($prefix) : bool { if ($prefix instanceof AbstractString) { $prefix = $prefix->string; } elseif (\is_array($prefix) || $prefix instanceof \Traversable) { return parent::startsWith($prefix); } else { $prefix = (string) $prefix; } $form = null === $this->ignoreCase ? \Normalizer::NFD : \Normalizer::NFC; \normalizer_is_normalized($prefix, $form) ?: ($prefix = \normalizer_normalize($prefix, $form)); if ('' === $prefix || \false === $prefix) { return \false; } if ($this->ignoreCase) { return 0 === \mb_stripos(\grapheme_extract($this->string, \strlen($prefix), \GRAPHEME_EXTR_MAXBYTES), $prefix, 0, 'UTF-8'); } return $prefix === \grapheme_extract($this->string, \strlen($prefix), \GRAPHEME_EXTR_MAXBYTES); } public function __wakeup() { if (!\is_string($this->string)) { throw new \BadMethodCallException('Cannot unserialize ' . __CLASS__); } \normalizer_is_normalized($this->string) ?: ($this->string = \normalizer_normalize($this->string)); } public function __clone() { if (null === $this->ignoreCase) { \normalizer_is_normalized($this->string) ?: ($this->string = \normalizer_normalize($this->string)); } $this->ignoreCase = \false; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\String; use _HumbugBox1cb33d1f20f1\Symfony\Component\String\Exception\ExceptionInterface; use _HumbugBox1cb33d1f20f1\Symfony\Component\String\Exception\InvalidArgumentException; use _HumbugBox1cb33d1f20f1\Symfony\Component\String\Exception\RuntimeException; /** * Represents a binary-safe string of bytes. * * @author Nicolas Grekas * @author Hugo Hamon * * @throws ExceptionInterface */ class ByteString extends AbstractString { private const ALPHABET_ALPHANUMERIC = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'; public function __construct(string $string = '') { $this->string = $string; } /* * The following method was derived from code of the Hack Standard Library (v4.40 - 2020-05-03) * * https://github.com/hhvm/hsl/blob/80a42c02f036f72a42f0415e80d6b847f4bf62d5/src/random/private.php#L16 * * Code subject to the MIT license (https://github.com/hhvm/hsl/blob/master/LICENSE). * * Copyright (c) 2004-2020, Facebook, Inc. (https://www.facebook.com/) */ public static function fromRandom(int $length = 16, string $alphabet = null) : self { if ($length <= 0) { throw new InvalidArgumentException(\sprintf('A strictly positive length is expected, "%d" given.', $length)); } $alphabet = $alphabet ?? self::ALPHABET_ALPHANUMERIC; $alphabetSize = \strlen($alphabet); $bits = (int) \ceil(\log($alphabetSize, 2.0)); if ($bits <= 0 || $bits > 56) { throw new InvalidArgumentException('The length of the alphabet must in the [2^1, 2^56] range.'); } $ret = ''; while ($length > 0) { $urandomLength = (int) \ceil(2 * $length * $bits / 8.0); $data = \random_bytes($urandomLength); $unpackedData = 0; $unpackedBits = 0; for ($i = 0; $i < $urandomLength && $length > 0; ++$i) { // Unpack 8 bits $unpackedData = $unpackedData << 8 | \ord($data[$i]); $unpackedBits += 8; // While we have enough bits to select a character from the alphabet, keep // consuming the random data for (; $unpackedBits >= $bits && $length > 0; $unpackedBits -= $bits) { $index = $unpackedData & (1 << $bits) - 1; $unpackedData >>= $bits; // Unfortunately, the alphabet size is not necessarily a power of two. // Worst case, it is 2^k + 1, which means we need (k+1) bits and we // have around a 50% chance of missing as k gets larger if ($index < $alphabetSize) { $ret .= $alphabet[$index]; --$length; } } } } return new static($ret); } public function bytesAt(int $offset) : array { $str = $this->string[$offset] ?? ''; return '' === $str ? [] : [\ord($str)]; } public function append(string ...$suffix) : parent { $str = clone $this; $str->string .= 1 >= \count($suffix) ? $suffix[0] ?? '' : \implode('', $suffix); return $str; } public function camel() : parent { $str = clone $this; $parts = \explode(' ', \trim(\ucwords(\preg_replace('/[^a-zA-Z0-9\\x7f-\\xff]++/', ' ', $this->string)))); $parts[0] = 1 !== \strlen($parts[0]) && \ctype_upper($parts[0]) ? $parts[0] : \lcfirst($parts[0]); $str->string = \implode('', $parts); return $str; } public function chunk(int $length = 1) : array { if (1 > $length) { throw new InvalidArgumentException('The chunk length must be greater than zero.'); } if ('' === $this->string) { return []; } $str = clone $this; $chunks = []; foreach (\str_split($this->string, $length) as $chunk) { $str->string = $chunk; $chunks[] = clone $str; } return $chunks; } public function endsWith($suffix) : bool { if ($suffix instanceof parent) { $suffix = $suffix->string; } elseif (\is_array($suffix) || $suffix instanceof \Traversable) { return parent::endsWith($suffix); } else { $suffix = (string) $suffix; } return '' !== $suffix && \strlen($this->string) >= \strlen($suffix) && 0 === \substr_compare($this->string, $suffix, -\strlen($suffix), null, $this->ignoreCase); } public function equalsTo($string) : bool { if ($string instanceof parent) { $string = $string->string; } elseif (\is_array($string) || $string instanceof \Traversable) { return parent::equalsTo($string); } else { $string = (string) $string; } if ('' !== $string && $this->ignoreCase) { return 0 === \strcasecmp($string, $this->string); } return $string === $this->string; } public function folded() : parent { $str = clone $this; $str->string = \strtolower($str->string); return $str; } public function indexOf($needle, int $offset = 0) : ?int { if ($needle instanceof parent) { $needle = $needle->string; } elseif (\is_array($needle) || $needle instanceof \Traversable) { return parent::indexOf($needle, $offset); } else { $needle = (string) $needle; } if ('' === $needle) { return null; } $i = $this->ignoreCase ? \stripos($this->string, $needle, $offset) : \strpos($this->string, $needle, $offset); return \false === $i ? null : $i; } public function indexOfLast($needle, int $offset = 0) : ?int { if ($needle instanceof parent) { $needle = $needle->string; } elseif (\is_array($needle) || $needle instanceof \Traversable) { return parent::indexOfLast($needle, $offset); } else { $needle = (string) $needle; } if ('' === $needle) { return null; } $i = $this->ignoreCase ? \strripos($this->string, $needle, $offset) : \strrpos($this->string, $needle, $offset); return \false === $i ? null : $i; } public function isUtf8() : bool { return '' === $this->string || \preg_match('//u', $this->string); } public function join(array $strings, string $lastGlue = null) : parent { $str = clone $this; $tail = null !== $lastGlue && 1 < \count($strings) ? $lastGlue . \array_pop($strings) : ''; $str->string = \implode($this->string, $strings) . $tail; return $str; } public function length() : int { return \strlen($this->string); } public function lower() : parent { $str = clone $this; $str->string = \strtolower($str->string); return $str; } public function match(string $regexp, int $flags = 0, int $offset = 0) : array { $match = (\PREG_PATTERN_ORDER | \PREG_SET_ORDER) & $flags ? 'preg_match_all' : 'preg_match'; if ($this->ignoreCase) { $regexp .= 'i'; } \set_error_handler(static function ($t, $m) { throw new InvalidArgumentException($m); }); try { if (\false === $match($regexp, $this->string, $matches, $flags | \PREG_UNMATCHED_AS_NULL, $offset)) { $lastError = \preg_last_error(); foreach (\get_defined_constants(\true)['pcre'] as $k => $v) { if ($lastError === $v && '_ERROR' === \substr($k, -6)) { throw new RuntimeException('Matching failed with ' . $k . '.'); } } throw new RuntimeException('Matching failed with unknown error code.'); } } finally { \restore_error_handler(); } return $matches; } public function padBoth(int $length, string $padStr = ' ') : parent { $str = clone $this; $str->string = \str_pad($this->string, $length, $padStr, \STR_PAD_BOTH); return $str; } public function padEnd(int $length, string $padStr = ' ') : parent { $str = clone $this; $str->string = \str_pad($this->string, $length, $padStr, \STR_PAD_RIGHT); return $str; } public function padStart(int $length, string $padStr = ' ') : parent { $str = clone $this; $str->string = \str_pad($this->string, $length, $padStr, \STR_PAD_LEFT); return $str; } public function prepend(string ...$prefix) : parent { $str = clone $this; $str->string = (1 >= \count($prefix) ? $prefix[0] ?? '' : \implode('', $prefix)) . $str->string; return $str; } public function replace(string $from, string $to) : parent { $str = clone $this; if ('' !== $from) { $str->string = $this->ignoreCase ? \str_ireplace($from, $to, $this->string) : \str_replace($from, $to, $this->string); } return $str; } public function replaceMatches(string $fromRegexp, $to) : parent { if ($this->ignoreCase) { $fromRegexp .= 'i'; } if (\is_array($to)) { if (!\is_callable($to)) { throw new \TypeError(\sprintf('Argument 2 passed to "%s::replaceMatches()" must be callable, array given.', static::class)); } $replace = 'preg_replace_callback'; } else { $replace = $to instanceof \Closure ? 'preg_replace_callback' : 'preg_replace'; } \set_error_handler(static function ($t, $m) { throw new InvalidArgumentException($m); }); try { if (null === ($string = $replace($fromRegexp, $to, $this->string))) { $lastError = \preg_last_error(); foreach (\get_defined_constants(\true)['pcre'] as $k => $v) { if ($lastError === $v && '_ERROR' === \substr($k, -6)) { throw new RuntimeException('Matching failed with ' . $k . '.'); } } throw new RuntimeException('Matching failed with unknown error code.'); } } finally { \restore_error_handler(); } $str = clone $this; $str->string = $string; return $str; } public function reverse() : parent { $str = clone $this; $str->string = \strrev($str->string); return $str; } public function slice(int $start = 0, int $length = null) : parent { $str = clone $this; $str->string = (string) \substr($this->string, $start, $length ?? \PHP_INT_MAX); return $str; } public function snake() : parent { $str = $this->camel(); $str->string = \strtolower(\preg_replace(['/([A-Z]+)([A-Z][a-z])/', '/([a-z\\d])([A-Z])/'], '_HumbugBox1cb33d1f20f1\\1_\\2', $str->string)); return $str; } public function splice(string $replacement, int $start = 0, int $length = null) : parent { $str = clone $this; $str->string = \substr_replace($this->string, $replacement, $start, $length ?? \PHP_INT_MAX); return $str; } public function split(string $delimiter, int $limit = null, int $flags = null) : array { if (1 > ($limit = $limit ?? \PHP_INT_MAX)) { throw new InvalidArgumentException('Split limit must be a positive integer.'); } if ('' === $delimiter) { throw new InvalidArgumentException('Split delimiter is empty.'); } if (null !== $flags) { return parent::split($delimiter, $limit, $flags); } $str = clone $this; $chunks = $this->ignoreCase ? \preg_split('{' . \preg_quote($delimiter) . '}iD', $this->string, $limit) : \explode($delimiter, $this->string, $limit); foreach ($chunks as &$chunk) { $str->string = $chunk; $chunk = clone $str; } return $chunks; } public function startsWith($prefix) : bool { if ($prefix instanceof parent) { $prefix = $prefix->string; } elseif (!\is_string($prefix)) { return parent::startsWith($prefix); } return '' !== $prefix && 0 === ($this->ignoreCase ? \strncasecmp($this->string, $prefix, \strlen($prefix)) : \strncmp($this->string, $prefix, \strlen($prefix))); } public function title(bool $allWords = \false) : parent { $str = clone $this; $str->string = $allWords ? \ucwords($str->string) : \ucfirst($str->string); return $str; } public function toUnicodeString(string $fromEncoding = null) : UnicodeString { return new UnicodeString($this->toCodePointString($fromEncoding)->string); } public function toCodePointString(string $fromEncoding = null) : CodePointString { $u = new CodePointString(); if (\in_array($fromEncoding, [null, 'utf8', 'utf-8', 'UTF8', 'UTF-8'], \true) && \preg_match('//u', $this->string)) { $u->string = $this->string; return $u; } \set_error_handler(static function ($t, $m) { throw new InvalidArgumentException($m); }); try { try { $validEncoding = \false !== \mb_detect_encoding($this->string, $fromEncoding ?? 'Windows-1252', \true); } catch (InvalidArgumentException $e) { if (!\function_exists('iconv')) { throw $e; } $u->string = \iconv($fromEncoding ?? 'Windows-1252', 'UTF-8', $this->string); return $u; } } finally { \restore_error_handler(); } if (!$validEncoding) { throw new InvalidArgumentException(\sprintf('Invalid "%s" string.', $fromEncoding ?? 'Windows-1252')); } $u->string = \mb_convert_encoding($this->string, 'UTF-8', $fromEncoding ?? 'Windows-1252'); return $u; } public function trim(string $chars = " \t\n\r\x00\v\f") : parent { $str = clone $this; $str->string = \trim($str->string, $chars); return $str; } public function trimEnd(string $chars = " \t\n\r\x00\v\f") : parent { $str = clone $this; $str->string = \rtrim($str->string, $chars); return $str; } public function trimStart(string $chars = " \t\n\r\x00\v\f") : parent { $str = clone $this; $str->string = \ltrim($str->string, $chars); return $str; } public function upper() : parent { $str = clone $this; $str->string = \strtoupper($str->string); return $str; } public function width(bool $ignoreAnsiDecoration = \true) : int { $string = \preg_match('//u', $this->string) ? $this->string : \preg_replace('/[\\x80-\\xFF]/', '?', $this->string); return (new CodePointString($string))->width($ignoreAnsiDecoration); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\String; use _HumbugBox1cb33d1f20f1\Symfony\Component\String\Exception\ExceptionInterface; use _HumbugBox1cb33d1f20f1\Symfony\Component\String\Exception\InvalidArgumentException; use _HumbugBox1cb33d1f20f1\Symfony\Component\String\Exception\RuntimeException; /** * Represents a string of abstract Unicode characters. * * Unicode defines 3 types of "characters" (bytes, code points and grapheme clusters). * This class is the abstract type to use as a type-hint when the logic you want to * implement is Unicode-aware but doesn't care about code points vs grapheme clusters. * * @author Nicolas Grekas * * @throws ExceptionInterface */ abstract class AbstractUnicodeString extends AbstractString { public const NFC = \Normalizer::NFC; public const NFD = \Normalizer::NFD; public const NFKC = \Normalizer::NFKC; public const NFKD = \Normalizer::NFKD; // all ASCII letters sorted by typical frequency of occurrence private const ASCII = " eiasntrolud][cmp'\ng|hv.fb,:=-q10C2*yx)(L9AS/P\"EjMIk3>5T>', '<', '>', '-', '-', '-', '-', '-', '-', '-', '-', '-', '||', '/', '[', ']', '*', ',', '.', '<', '>', '<<', '>>', '[', ']', '[', ']', '[', ']', ',', '.', '[', ']', '<<', '>>', '<', '>', ',', '[', ']', '((', '))', '.', ',', '*', '/', '-', '/', '\\', '|', '||', '<<', '>>', '((', '))']; private static $transliterators = []; private static $tableZero; private static $tableWide; /** * @return static */ public static function fromCodePoints(int ...$codes) : self { $string = ''; foreach ($codes as $code) { if (0x80 > ($code %= 0x200000)) { $string .= \chr($code); } elseif (0x800 > $code) { $string .= \chr(0xc0 | $code >> 6) . \chr(0x80 | $code & 0x3f); } elseif (0x10000 > $code) { $string .= \chr(0xe0 | $code >> 12) . \chr(0x80 | $code >> 6 & 0x3f) . \chr(0x80 | $code & 0x3f); } else { $string .= \chr(0xf0 | $code >> 18) . \chr(0x80 | $code >> 12 & 0x3f) . \chr(0x80 | $code >> 6 & 0x3f) . \chr(0x80 | $code & 0x3f); } } return new static($string); } /** * Generic UTF-8 to ASCII transliteration. * * Install the intl extension for best results. * * @param string[]|\Transliterator[]|\Closure[] $rules See "*-Latin" rules from Transliterator::listIDs() */ public function ascii(array $rules = []) : self { $str = clone $this; $s = $str->string; $str->string = ''; \array_unshift($rules, 'nfd'); $rules[] = 'latin-ascii'; if (\function_exists('transliterator_transliterate')) { $rules[] = 'any-latin/bgn'; } $rules[] = 'nfkd'; $rules[] = '[:nonspacing mark:] remove'; while (\strlen($s) - 1 > ($i = \strspn($s, self::ASCII))) { if (0 < --$i) { $str->string .= \substr($s, 0, $i); $s = \substr($s, $i); } if (!($rule = \array_shift($rules))) { $rules = []; // An empty rule interrupts the next ones } if ($rule instanceof \Transliterator) { $s = $rule->transliterate($s); } elseif ($rule instanceof \Closure) { $s = $rule($s); } elseif ($rule) { if ('nfd' === ($rule = \strtolower($rule))) { \normalizer_is_normalized($s, self::NFD) ?: ($s = \normalizer_normalize($s, self::NFD)); } elseif ('nfkd' === $rule) { \normalizer_is_normalized($s, self::NFKD) ?: ($s = \normalizer_normalize($s, self::NFKD)); } elseif ('[:nonspacing mark:] remove' === $rule) { $s = \preg_replace('/\\p{Mn}++/u', '', $s); } elseif ('latin-ascii' === $rule) { $s = \str_replace(self::TRANSLIT_FROM, self::TRANSLIT_TO, $s); } elseif ('de-ascii' === $rule) { $s = \preg_replace("/([AUO])̈(?=\\p{Ll})/u", '$1e', $s); $s = \str_replace(["ä", "ö", "ü", "Ä", "Ö", "Ü"], ['ae', 'oe', 'ue', 'AE', 'OE', 'UE'], $s); } elseif (\function_exists('transliterator_transliterate')) { if (null === ($transliterator = self::$transliterators[$rule] ?? (self::$transliterators[$rule] = \Transliterator::create($rule)))) { if ('any-latin/bgn' === $rule) { $rule = 'any-latin'; $transliterator = self::$transliterators[$rule] ?? (self::$transliterators[$rule] = \Transliterator::create($rule)); } if (null === $transliterator) { throw new InvalidArgumentException(\sprintf('Unknown transliteration rule "%s".', $rule)); } self::$transliterators['any-latin/bgn'] = $transliterator; } $s = $transliterator->transliterate($s); } } elseif (!\function_exists('iconv')) { $s = \preg_replace('/[^\\x00-\\x7F]/u', '?', $s); } else { $s = @\preg_replace_callback('/[^\\x00-\\x7F]/u', static function ($c) { $c = (string) \iconv('UTF-8', 'ASCII//TRANSLIT', $c[0]); if ('' === $c && '' === \iconv('UTF-8', 'ASCII//TRANSLIT', '²')) { throw new \LogicException(\sprintf('"%s" requires a translit-able iconv implementation, try installing "gnu-libiconv" if you\'re using Alpine Linux.', static::class)); } return 1 < \strlen($c) ? \ltrim($c, '\'`"^~') : ('' !== $c ? $c : '?'); }, $s); } } $str->string .= $s; return $str; } public function camel() : parent { $str = clone $this; $str->string = \str_replace(' ', '', \preg_replace_callback('/\\b.(?![A-Z]{2,})/u', static function ($m) use(&$i) { return 1 === ++$i ? 'İ' === $m[0] ? 'i̇' : \mb_strtolower($m[0], 'UTF-8') : \mb_convert_case($m[0], \MB_CASE_TITLE, 'UTF-8'); }, \preg_replace('/[^\\pL0-9]++/u', ' ', $this->string))); return $str; } /** * @return int[] */ public function codePointsAt(int $offset) : array { $str = $this->slice($offset, 1); if ('' === $str->string) { return []; } $codePoints = []; foreach (\preg_split('//u', $str->string, -1, \PREG_SPLIT_NO_EMPTY) as $c) { $codePoints[] = \mb_ord($c, 'UTF-8'); } return $codePoints; } public function folded(bool $compat = \true) : parent { $str = clone $this; if (!$compat || \PHP_VERSION_ID < 70300 || !\defined('Normalizer::NFKC_CF')) { $str->string = \normalizer_normalize($str->string, $compat ? \Normalizer::NFKC : \Normalizer::NFC); $str->string = \mb_strtolower(\str_replace(self::FOLD_FROM, self::FOLD_TO, $this->string), 'UTF-8'); } else { $str->string = \normalizer_normalize($str->string, \Normalizer::NFKC_CF); } return $str; } public function join(array $strings, string $lastGlue = null) : parent { $str = clone $this; $tail = null !== $lastGlue && 1 < \count($strings) ? $lastGlue . \array_pop($strings) : ''; $str->string = \implode($this->string, $strings) . $tail; if (!\preg_match('//u', $str->string)) { throw new InvalidArgumentException('Invalid UTF-8 string.'); } return $str; } public function lower() : parent { $str = clone $this; $str->string = \mb_strtolower(\str_replace('İ', 'i̇', $str->string), 'UTF-8'); return $str; } public function match(string $regexp, int $flags = 0, int $offset = 0) : array { $match = (\PREG_PATTERN_ORDER | \PREG_SET_ORDER) & $flags ? 'preg_match_all' : 'preg_match'; if ($this->ignoreCase) { $regexp .= 'i'; } \set_error_handler(static function ($t, $m) { throw new InvalidArgumentException($m); }); try { if (\false === $match($regexp . 'u', $this->string, $matches, $flags | \PREG_UNMATCHED_AS_NULL, $offset)) { $lastError = \preg_last_error(); foreach (\get_defined_constants(\true)['pcre'] as $k => $v) { if ($lastError === $v && '_ERROR' === \substr($k, -6)) { throw new RuntimeException('Matching failed with ' . $k . '.'); } } throw new RuntimeException('Matching failed with unknown error code.'); } } finally { \restore_error_handler(); } return $matches; } /** * @return static */ public function normalize(int $form = self::NFC) : self { if (!\in_array($form, [self::NFC, self::NFD, self::NFKC, self::NFKD])) { throw new InvalidArgumentException('Unsupported normalization form.'); } $str = clone $this; \normalizer_is_normalized($str->string, $form) ?: ($str->string = \normalizer_normalize($str->string, $form)); return $str; } public function padBoth(int $length, string $padStr = ' ') : parent { if ('' === $padStr || !\preg_match('//u', $padStr)) { throw new InvalidArgumentException('Invalid UTF-8 string.'); } $pad = clone $this; $pad->string = $padStr; return $this->pad($length, $pad, \STR_PAD_BOTH); } public function padEnd(int $length, string $padStr = ' ') : parent { if ('' === $padStr || !\preg_match('//u', $padStr)) { throw new InvalidArgumentException('Invalid UTF-8 string.'); } $pad = clone $this; $pad->string = $padStr; return $this->pad($length, $pad, \STR_PAD_RIGHT); } public function padStart(int $length, string $padStr = ' ') : parent { if ('' === $padStr || !\preg_match('//u', $padStr)) { throw new InvalidArgumentException('Invalid UTF-8 string.'); } $pad = clone $this; $pad->string = $padStr; return $this->pad($length, $pad, \STR_PAD_LEFT); } public function replaceMatches(string $fromRegexp, $to) : parent { if ($this->ignoreCase) { $fromRegexp .= 'i'; } if (\is_array($to) || $to instanceof \Closure) { if (!\is_callable($to)) { throw new \TypeError(\sprintf('Argument 2 passed to "%s::replaceMatches()" must be callable, array given.', static::class)); } $replace = 'preg_replace_callback'; $to = static function (array $m) use($to) : string { $to = $to($m); if ('' !== $to && (!\is_string($to) || !\preg_match('//u', $to))) { throw new InvalidArgumentException('Replace callback must return a valid UTF-8 string.'); } return $to; }; } elseif ('' !== $to && !\preg_match('//u', $to)) { throw new InvalidArgumentException('Invalid UTF-8 string.'); } else { $replace = 'preg_replace'; } \set_error_handler(static function ($t, $m) { throw new InvalidArgumentException($m); }); try { if (null === ($string = $replace($fromRegexp . 'u', $to, $this->string))) { $lastError = \preg_last_error(); foreach (\get_defined_constants(\true)['pcre'] as $k => $v) { if ($lastError === $v && '_ERROR' === \substr($k, -6)) { throw new RuntimeException('Matching failed with ' . $k . '.'); } } throw new RuntimeException('Matching failed with unknown error code.'); } } finally { \restore_error_handler(); } $str = clone $this; $str->string = $string; return $str; } public function reverse() : parent { $str = clone $this; $str->string = \implode('', \array_reverse(\preg_split('/(\\X)/u', $str->string, -1, \PREG_SPLIT_DELIM_CAPTURE | \PREG_SPLIT_NO_EMPTY))); return $str; } public function snake() : parent { $str = $this->camel(); $str->string = \mb_strtolower(\preg_replace(['/(\\p{Lu}+)(\\p{Lu}\\p{Ll})/u', '/([\\p{Ll}0-9])(\\p{Lu})/u'], '_HumbugBox1cb33d1f20f1\\1_\\2', $str->string), 'UTF-8'); return $str; } public function title(bool $allWords = \false) : parent { $str = clone $this; $limit = $allWords ? -1 : 1; $str->string = \preg_replace_callback('/\\b./u', static function (array $m) : string { return \mb_convert_case($m[0], \MB_CASE_TITLE, 'UTF-8'); }, $str->string, $limit); return $str; } public function trim(string $chars = " \t\n\r\x00\v\f ") : parent { if (" \t\n\r\x00\v\f " !== $chars && !\preg_match('//u', $chars)) { throw new InvalidArgumentException('Invalid UTF-8 chars.'); } $chars = \preg_quote($chars); $str = clone $this; $str->string = \preg_replace("{^[{$chars}]++|[{$chars}]++\$}uD", '', $str->string); return $str; } public function trimEnd(string $chars = " \t\n\r\x00\v\f ") : parent { if (" \t\n\r\x00\v\f " !== $chars && !\preg_match('//u', $chars)) { throw new InvalidArgumentException('Invalid UTF-8 chars.'); } $chars = \preg_quote($chars); $str = clone $this; $str->string = \preg_replace("{[{$chars}]++\$}uD", '', $str->string); return $str; } public function trimPrefix($prefix) : parent { if (!$this->ignoreCase) { return parent::trimPrefix($prefix); } $str = clone $this; if ($prefix instanceof \Traversable) { $prefix = \iterator_to_array($prefix, \false); } elseif ($prefix instanceof parent) { $prefix = $prefix->string; } $prefix = \implode('|', \array_map('preg_quote', (array) $prefix)); $str->string = \preg_replace("{^(?:{$prefix})}iuD", '', $this->string); return $str; } public function trimStart(string $chars = " \t\n\r\x00\v\f ") : parent { if (" \t\n\r\x00\v\f " !== $chars && !\preg_match('//u', $chars)) { throw new InvalidArgumentException('Invalid UTF-8 chars.'); } $chars = \preg_quote($chars); $str = clone $this; $str->string = \preg_replace("{^[{$chars}]++}uD", '', $str->string); return $str; } public function trimSuffix($suffix) : parent { if (!$this->ignoreCase) { return parent::trimSuffix($suffix); } $str = clone $this; if ($suffix instanceof \Traversable) { $suffix = \iterator_to_array($suffix, \false); } elseif ($suffix instanceof parent) { $suffix = $suffix->string; } $suffix = \implode('|', \array_map('preg_quote', (array) $suffix)); $str->string = \preg_replace("{(?:{$suffix})\$}iuD", '', $this->string); return $str; } public function upper() : parent { $str = clone $this; $str->string = \mb_strtoupper($str->string, 'UTF-8'); if (\PHP_VERSION_ID < 70300) { $str->string = \str_replace(self::UPPER_FROM, self::UPPER_TO, $str->string); } return $str; } public function width(bool $ignoreAnsiDecoration = \true) : int { $width = 0; $s = \str_replace(["\x00", "\x05", "\x07"], '', $this->string); if (\false !== \strpos($s, "\r")) { $s = \str_replace(["\r\n", "\r"], "\n", $s); } if (!$ignoreAnsiDecoration) { $s = \preg_replace('/[\\p{Cc}\\x7F]++/u', '', $s); } foreach (\explode("\n", $s) as $s) { if ($ignoreAnsiDecoration) { $s = \preg_replace('/(?:\\x1B(?: \\[ [\\x30-\\x3F]*+ [\\x20-\\x2F]*+ [\\x40-\\x7E] | [P\\]X^_] .*? \\x1B\\\\ | [\\x41-\\x7E] )|[\\p{Cc}\\x7F]++)/xu', '', $s); } $lineWidth = $this->wcswidth($s); if ($lineWidth > $width) { $width = $lineWidth; } } return $width; } /** * @return static */ private function pad(int $len, self $pad, int $type) : parent { $sLen = $this->length(); if ($len <= $sLen) { return clone $this; } $padLen = $pad->length(); $freeLen = $len - $sLen; $len = $freeLen % $padLen; switch ($type) { case \STR_PAD_RIGHT: return $this->append(\str_repeat($pad->string, \intdiv($freeLen, $padLen)) . ($len ? $pad->slice(0, $len) : '')); case \STR_PAD_LEFT: return $this->prepend(\str_repeat($pad->string, \intdiv($freeLen, $padLen)) . ($len ? $pad->slice(0, $len) : '')); case \STR_PAD_BOTH: $freeLen /= 2; $rightLen = \ceil($freeLen); $len = $rightLen % $padLen; $str = $this->append(\str_repeat($pad->string, \intdiv($rightLen, $padLen)) . ($len ? $pad->slice(0, $len) : '')); $leftLen = \floor($freeLen); $len = $leftLen % $padLen; return $str->prepend(\str_repeat($pad->string, \intdiv($leftLen, $padLen)) . ($len ? $pad->slice(0, $len) : '')); default: throw new InvalidArgumentException('Invalid padding type.'); } } /** * Based on https://github.com/jquast/wcwidth, a Python implementation of https://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c. */ private function wcswidth(string $string) : int { $width = 0; foreach (\preg_split('//u', $string, -1, \PREG_SPLIT_NO_EMPTY) as $c) { $codePoint = \mb_ord($c, 'UTF-8'); if (0 === $codePoint || 0x34f === $codePoint || 0x200b <= $codePoint && 0x200f >= $codePoint || 0x2028 === $codePoint || 0x2029 === $codePoint || 0x202a <= $codePoint && 0x202e >= $codePoint || 0x2060 <= $codePoint && 0x2063 >= $codePoint) { continue; } // Non printable characters if (32 > $codePoint || 0x7f <= $codePoint && 0xa0 > $codePoint) { return -1; } if (null === self::$tableZero) { self::$tableZero = (require __DIR__ . '/Resources/data/wcswidth_table_zero.php'); } if ($codePoint >= self::$tableZero[0][0] && $codePoint <= self::$tableZero[$ubound = \count(self::$tableZero) - 1][1]) { $lbound = 0; while ($ubound >= $lbound) { $mid = \floor(($lbound + $ubound) / 2); if ($codePoint > self::$tableZero[$mid][1]) { $lbound = $mid + 1; } elseif ($codePoint < self::$tableZero[$mid][0]) { $ubound = $mid - 1; } else { continue 2; } } } if (null === self::$tableWide) { self::$tableWide = (require __DIR__ . '/Resources/data/wcswidth_table_wide.php'); } if ($codePoint >= self::$tableWide[0][0] && $codePoint <= self::$tableWide[$ubound = \count(self::$tableWide) - 1][1]) { $lbound = 0; while ($ubound >= $lbound) { $mid = \floor(($lbound + $ubound) / 2); if ($codePoint > self::$tableWide[$mid][1]) { $lbound = $mid + 1; } elseif ($codePoint < self::$tableWide[$mid][0]) { $ubound = $mid - 1; } else { $width += 2; continue 2; } } } ++$width; } return $width; } } Copyright (c) 2019-2022 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. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\String; if (!\function_exists(u::class)) { function u(?string $string = '') : UnicodeString { return new UnicodeString($string ?? ''); } } if (!\function_exists(b::class)) { function b(?string $string = '') : ByteString { return new ByteString($string ?? ''); } } if (!\function_exists(s::class)) { /** * @return UnicodeString|ByteString */ function s(?string $string = '') : AbstractString { $string = $string ?? ''; return \preg_match('//u', $string) ? new UnicodeString($string) : new ByteString($string); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\String; use _HumbugBox1cb33d1f20f1\Symfony\Component\String\Exception\ExceptionInterface; use _HumbugBox1cb33d1f20f1\Symfony\Component\String\Exception\InvalidArgumentException; use _HumbugBox1cb33d1f20f1\Symfony\Component\String\Exception\RuntimeException; /** * Represents a string of abstract characters. * * Unicode defines 3 types of "characters" (bytes, code points and grapheme clusters). * This class is the abstract type to use as a type-hint when the logic you want to * implement doesn't care about the exact variant it deals with. * * @author Nicolas Grekas * @author Hugo Hamon * * @throws ExceptionInterface */ abstract class AbstractString implements \Stringable, \JsonSerializable { public const PREG_PATTERN_ORDER = \PREG_PATTERN_ORDER; public const PREG_SET_ORDER = \PREG_SET_ORDER; public const PREG_OFFSET_CAPTURE = \PREG_OFFSET_CAPTURE; public const PREG_UNMATCHED_AS_NULL = \PREG_UNMATCHED_AS_NULL; public const PREG_SPLIT = 0; public const PREG_SPLIT_NO_EMPTY = \PREG_SPLIT_NO_EMPTY; public const PREG_SPLIT_DELIM_CAPTURE = \PREG_SPLIT_DELIM_CAPTURE; public const PREG_SPLIT_OFFSET_CAPTURE = \PREG_SPLIT_OFFSET_CAPTURE; protected $string = ''; protected $ignoreCase = \false; public abstract function __construct(string $string = ''); /** * Unwraps instances of AbstractString back to strings. * * @return string[]|array */ public static function unwrap(array $values) : array { foreach ($values as $k => $v) { if ($v instanceof self) { $values[$k] = $v->__toString(); } elseif (\is_array($v) && $values[$k] !== ($v = static::unwrap($v))) { $values[$k] = $v; } } return $values; } /** * Wraps (and normalizes) strings in instances of AbstractString. * * @return static[]|array */ public static function wrap(array $values) : array { $i = 0; $keys = null; foreach ($values as $k => $v) { if (\is_string($k) && '' !== $k && $k !== ($j = (string) new static($k))) { $keys = $keys ?? \array_keys($values); $keys[$i] = $j; } if (\is_string($v)) { $values[$k] = new static($v); } elseif (\is_array($v) && $values[$k] !== ($v = static::wrap($v))) { $values[$k] = $v; } ++$i; } return null !== $keys ? \array_combine($keys, $values) : $values; } /** * @param string|string[] $needle * * @return static */ public function after($needle, bool $includeNeedle = \false, int $offset = 0) : self { $str = clone $this; $i = \PHP_INT_MAX; foreach ((array) $needle as $n) { $n = (string) $n; $j = $this->indexOf($n, $offset); if (null !== $j && $j < $i) { $i = $j; $str->string = $n; } } if (\PHP_INT_MAX === $i) { return $str; } if (!$includeNeedle) { $i += $str->length(); } return $this->slice($i); } /** * @param string|string[] $needle * * @return static */ public function afterLast($needle, bool $includeNeedle = \false, int $offset = 0) : self { $str = clone $this; $i = null; foreach ((array) $needle as $n) { $n = (string) $n; $j = $this->indexOfLast($n, $offset); if (null !== $j && $j >= $i) { $i = $offset = $j; $str->string = $n; } } if (null === $i) { return $str; } if (!$includeNeedle) { $i += $str->length(); } return $this->slice($i); } /** * @return static */ public abstract function append(string ...$suffix) : self; /** * @param string|string[] $needle * * @return static */ public function before($needle, bool $includeNeedle = \false, int $offset = 0) : self { $str = clone $this; $i = \PHP_INT_MAX; foreach ((array) $needle as $n) { $n = (string) $n; $j = $this->indexOf($n, $offset); if (null !== $j && $j < $i) { $i = $j; $str->string = $n; } } if (\PHP_INT_MAX === $i) { return $str; } if ($includeNeedle) { $i += $str->length(); } return $this->slice(0, $i); } /** * @param string|string[] $needle * * @return static */ public function beforeLast($needle, bool $includeNeedle = \false, int $offset = 0) : self { $str = clone $this; $i = null; foreach ((array) $needle as $n) { $n = (string) $n; $j = $this->indexOfLast($n, $offset); if (null !== $j && $j >= $i) { $i = $offset = $j; $str->string = $n; } } if (null === $i) { return $str; } if ($includeNeedle) { $i += $str->length(); } return $this->slice(0, $i); } /** * @return int[] */ public function bytesAt(int $offset) : array { $str = $this->slice($offset, 1); return '' === $str->string ? [] : \array_values(\unpack('C*', $str->string)); } /** * @return static */ public abstract function camel() : self; /** * @return static[] */ public abstract function chunk(int $length = 1) : array; /** * @return static */ public function collapseWhitespace() : self { $str = clone $this; $str->string = \trim(\preg_replace("/(?:[ \n\r\t\f]{2,}+|[\n\r\t\f])/", ' ', $str->string), " \n\r\t\f"); return $str; } /** * @param string|string[] $needle */ public function containsAny($needle) : bool { return null !== $this->indexOf($needle); } /** * @param string|string[] $suffix */ public function endsWith($suffix) : bool { if (!\is_array($suffix) && !$suffix instanceof \Traversable) { throw new \TypeError(\sprintf('Method "%s()" must be overridden by class "%s" to deal with non-iterable values.', __FUNCTION__, static::class)); } foreach ($suffix as $s) { if ($this->endsWith((string) $s)) { return \true; } } return \false; } /** * @return static */ public function ensureEnd(string $suffix) : self { if (!$this->endsWith($suffix)) { return $this->append($suffix); } $suffix = \preg_quote($suffix); $regex = '{(' . $suffix . ')(?:' . $suffix . ')++$}D'; return $this->replaceMatches($regex . ($this->ignoreCase ? 'i' : ''), '$1'); } /** * @return static */ public function ensureStart(string $prefix) : self { $prefix = new static($prefix); if (!$this->startsWith($prefix)) { return $this->prepend($prefix); } $str = clone $this; $i = $prefixLen = $prefix->length(); while ($this->indexOf($prefix, $i) === $i) { $str = $str->slice($prefixLen); $i += $prefixLen; } return $str; } /** * @param string|string[] $string */ public function equalsTo($string) : bool { if (!\is_array($string) && !$string instanceof \Traversable) { throw new \TypeError(\sprintf('Method "%s()" must be overridden by class "%s" to deal with non-iterable values.', __FUNCTION__, static::class)); } foreach ($string as $s) { if ($this->equalsTo((string) $s)) { return \true; } } return \false; } /** * @return static */ public abstract function folded() : self; /** * @return static */ public function ignoreCase() : self { $str = clone $this; $str->ignoreCase = \true; return $str; } /** * @param string|string[] $needle */ public function indexOf($needle, int $offset = 0) : ?int { if (!\is_array($needle) && !$needle instanceof \Traversable) { throw new \TypeError(\sprintf('Method "%s()" must be overridden by class "%s" to deal with non-iterable values.', __FUNCTION__, static::class)); } $i = \PHP_INT_MAX; foreach ($needle as $n) { $j = $this->indexOf((string) $n, $offset); if (null !== $j && $j < $i) { $i = $j; } } return \PHP_INT_MAX === $i ? null : $i; } /** * @param string|string[] $needle */ public function indexOfLast($needle, int $offset = 0) : ?int { if (!\is_array($needle) && !$needle instanceof \Traversable) { throw new \TypeError(\sprintf('Method "%s()" must be overridden by class "%s" to deal with non-iterable values.', __FUNCTION__, static::class)); } $i = null; foreach ($needle as $n) { $j = $this->indexOfLast((string) $n, $offset); if (null !== $j && $j >= $i) { $i = $offset = $j; } } return $i; } public function isEmpty() : bool { return '' === $this->string; } /** * @return static */ public abstract function join(array $strings, string $lastGlue = null) : self; public function jsonSerialize() : string { return $this->string; } public abstract function length() : int; /** * @return static */ public abstract function lower() : self; /** * Matches the string using a regular expression. * * Pass PREG_PATTERN_ORDER or PREG_SET_ORDER as $flags to get all occurrences matching the regular expression. * * @return array All matches in a multi-dimensional array ordered according to flags */ public abstract function match(string $regexp, int $flags = 0, int $offset = 0) : array; /** * @return static */ public abstract function padBoth(int $length, string $padStr = ' ') : self; /** * @return static */ public abstract function padEnd(int $length, string $padStr = ' ') : self; /** * @return static */ public abstract function padStart(int $length, string $padStr = ' ') : self; /** * @return static */ public abstract function prepend(string ...$prefix) : self; /** * @return static */ public function repeat(int $multiplier) : self { if (0 > $multiplier) { throw new InvalidArgumentException(\sprintf('Multiplier must be positive, %d given.', $multiplier)); } $str = clone $this; $str->string = \str_repeat($str->string, $multiplier); return $str; } /** * @return static */ public abstract function replace(string $from, string $to) : self; /** * @param string|callable $to * * @return static */ public abstract function replaceMatches(string $fromRegexp, $to) : self; /** * @return static */ public abstract function reverse() : self; /** * @return static */ public abstract function slice(int $start = 0, int $length = null) : self; /** * @return static */ public abstract function snake() : self; /** * @return static */ public abstract function splice(string $replacement, int $start = 0, int $length = null) : self; /** * @return static[] */ public function split(string $delimiter, int $limit = null, int $flags = null) : array { if (null === $flags) { throw new \TypeError('Split behavior when $flags is null must be implemented by child classes.'); } if ($this->ignoreCase) { $delimiter .= 'i'; } \set_error_handler(static function ($t, $m) { throw new InvalidArgumentException($m); }); try { if (\false === ($chunks = \preg_split($delimiter, $this->string, $limit, $flags))) { $lastError = \preg_last_error(); foreach (\get_defined_constants(\true)['pcre'] as $k => $v) { if ($lastError === $v && '_ERROR' === \substr($k, -6)) { throw new RuntimeException('Splitting failed with ' . $k . '.'); } } throw new RuntimeException('Splitting failed with unknown error code.'); } } finally { \restore_error_handler(); } $str = clone $this; if (self::PREG_SPLIT_OFFSET_CAPTURE & $flags) { foreach ($chunks as &$chunk) { $str->string = $chunk[0]; $chunk[0] = clone $str; } } else { foreach ($chunks as &$chunk) { $str->string = $chunk; $chunk = clone $str; } } return $chunks; } /** * @param string|string[] $prefix */ public function startsWith($prefix) : bool { if (!\is_array($prefix) && !$prefix instanceof \Traversable) { throw new \TypeError(\sprintf('Method "%s()" must be overridden by class "%s" to deal with non-iterable values.', __FUNCTION__, static::class)); } foreach ($prefix as $prefix) { if ($this->startsWith((string) $prefix)) { return \true; } } return \false; } /** * @return static */ public abstract function title(bool $allWords = \false) : self; public function toByteString(string $toEncoding = null) : ByteString { $b = new ByteString(); $toEncoding = \in_array($toEncoding, ['utf8', 'utf-8', 'UTF8'], \true) ? 'UTF-8' : $toEncoding; if (null === $toEncoding || $toEncoding === ($fromEncoding = $this instanceof AbstractUnicodeString || \preg_match('//u', $b->string) ? 'UTF-8' : 'Windows-1252')) { $b->string = $this->string; return $b; } \set_error_handler(static function ($t, $m) { throw new InvalidArgumentException($m); }); try { try { $b->string = \mb_convert_encoding($this->string, $toEncoding, 'UTF-8'); } catch (InvalidArgumentException $e) { if (!\function_exists('iconv')) { throw $e; } $b->string = \iconv('UTF-8', $toEncoding, $this->string); } } finally { \restore_error_handler(); } return $b; } public function toCodePointString() : CodePointString { return new CodePointString($this->string); } public function toString() : string { return $this->string; } public function toUnicodeString() : UnicodeString { return new UnicodeString($this->string); } /** * @return static */ public abstract function trim(string $chars = " \t\n\r\x00\v\f ") : self; /** * @return static */ public abstract function trimEnd(string $chars = " \t\n\r\x00\v\f ") : self; /** * @param string|string[] $prefix * * @return static */ public function trimPrefix($prefix) : self { if (\is_array($prefix) || $prefix instanceof \Traversable) { foreach ($prefix as $s) { $t = $this->trimPrefix($s); if ($t->string !== $this->string) { return $t; } } return clone $this; } $str = clone $this; if ($prefix instanceof self) { $prefix = $prefix->string; } else { $prefix = (string) $prefix; } if ('' !== $prefix && \strlen($this->string) >= \strlen($prefix) && 0 === \substr_compare($this->string, $prefix, 0, \strlen($prefix), $this->ignoreCase)) { $str->string = \substr($this->string, \strlen($prefix)); } return $str; } /** * @return static */ public abstract function trimStart(string $chars = " \t\n\r\x00\v\f ") : self; /** * @param string|string[] $suffix * * @return static */ public function trimSuffix($suffix) : self { if (\is_array($suffix) || $suffix instanceof \Traversable) { foreach ($suffix as $s) { $t = $this->trimSuffix($s); if ($t->string !== $this->string) { return $t; } } return clone $this; } $str = clone $this; if ($suffix instanceof self) { $suffix = $suffix->string; } else { $suffix = (string) $suffix; } if ('' !== $suffix && \strlen($this->string) >= \strlen($suffix) && 0 === \substr_compare($this->string, $suffix, -\strlen($suffix), null, $this->ignoreCase)) { $str->string = \substr($this->string, 0, -\strlen($suffix)); } return $str; } /** * @return static */ public function truncate(int $length, string $ellipsis = '', bool $cut = \true) : self { $stringLength = $this->length(); if ($stringLength <= $length) { return clone $this; } $ellipsisLength = '' !== $ellipsis ? (new static($ellipsis))->length() : 0; if ($length < $ellipsisLength) { $ellipsisLength = 0; } if (!$cut) { if (null === ($length = $this->indexOf([' ', "\r", "\n", "\t"], ($length ?: 1) - 1))) { return clone $this; } $length += $ellipsisLength; } $str = $this->slice(0, $length - $ellipsisLength); return $ellipsisLength ? $str->trimEnd()->append($ellipsis) : $str; } /** * @return static */ public abstract function upper() : self; /** * Returns the printable length on a terminal. */ public abstract function width(bool $ignoreAnsiDecoration = \true) : int; /** * @return static */ public function wordwrap(int $width = 75, string $break = "\n", bool $cut = \false) : self { $lines = '' !== $break ? $this->split($break) : [clone $this]; $chars = []; $mask = ''; if (1 === \count($lines) && '' === $lines[0]->string) { return $lines[0]; } foreach ($lines as $i => $line) { if ($i) { $chars[] = $break; $mask .= '#'; } foreach ($line->chunk() as $char) { $chars[] = $char->string; $mask .= ' ' === $char->string ? ' ' : '?'; } } $string = ''; $j = 0; $b = $i = -1; $mask = \wordwrap($mask, $width, '#', $cut); while (\false !== ($b = \strpos($mask, '#', $b + 1))) { for (++$i; $i < $b; ++$i) { $string .= $chars[$j]; unset($chars[$j++]); } if ($break === $chars[$j] || ' ' === $chars[$j]) { unset($chars[$j++]); } $string .= $break; } $str = clone $this; $str->string = $string . \implode('', $chars); return $str; } public function __sleep() : array { return ['string']; } public function __clone() { $this->ignoreCase = \false; } public function __toString() : string { return $this->string; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ use _HumbugBox1cb33d1f20f1\Symfony\Polyfill\Ctype as p; if (\PHP_VERSION_ID >= 80000) { return require __DIR__ . '/bootstrap80.php'; } if (!\function_exists('ctype_alnum')) { function ctype_alnum($text) { return p\Ctype::ctype_alnum($text); } } if (!\function_exists('ctype_alpha')) { function ctype_alpha($text) { return p\Ctype::ctype_alpha($text); } } if (!\function_exists('ctype_cntrl')) { function ctype_cntrl($text) { return p\Ctype::ctype_cntrl($text); } } if (!\function_exists('ctype_digit')) { function ctype_digit($text) { return p\Ctype::ctype_digit($text); } } if (!\function_exists('ctype_graph')) { function ctype_graph($text) { return p\Ctype::ctype_graph($text); } } if (!\function_exists('ctype_lower')) { function ctype_lower($text) { return p\Ctype::ctype_lower($text); } } if (!\function_exists('ctype_print')) { function ctype_print($text) { return p\Ctype::ctype_print($text); } } if (!\function_exists('ctype_punct')) { function ctype_punct($text) { return p\Ctype::ctype_punct($text); } } if (!\function_exists('ctype_space')) { function ctype_space($text) { return p\Ctype::ctype_space($text); } } if (!\function_exists('ctype_upper')) { function ctype_upper($text) { return p\Ctype::ctype_upper($text); } } if (!\function_exists('ctype_xdigit')) { function ctype_xdigit($text) { return p\Ctype::ctype_xdigit($text); } } Copyright (c) 2018-2019 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. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Polyfill\Ctype; /** * Ctype implementation through regex. * * @internal * * @author Gert de Pagter */ final class Ctype { /** * Returns TRUE if every character in text is either a letter or a digit, FALSE otherwise. * * @see https://php.net/ctype-alnum * * @param mixed $text * * @return bool */ public static function ctype_alnum($text) { $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); return \is_string($text) && '' !== $text && !\preg_match('/[^A-Za-z0-9]/', $text); } /** * Returns TRUE if every character in text is a letter, FALSE otherwise. * * @see https://php.net/ctype-alpha * * @param mixed $text * * @return bool */ public static function ctype_alpha($text) { $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); return \is_string($text) && '' !== $text && !\preg_match('/[^A-Za-z]/', $text); } /** * Returns TRUE if every character in text is a control character from the current locale, FALSE otherwise. * * @see https://php.net/ctype-cntrl * * @param mixed $text * * @return bool */ public static function ctype_cntrl($text) { $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); return \is_string($text) && '' !== $text && !\preg_match('/[^\\x00-\\x1f\\x7f]/', $text); } /** * Returns TRUE if every character in the string text is a decimal digit, FALSE otherwise. * * @see https://php.net/ctype-digit * * @param mixed $text * * @return bool */ public static function ctype_digit($text) { $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); return \is_string($text) && '' !== $text && !\preg_match('/[^0-9]/', $text); } /** * Returns TRUE if every character in text is printable and actually creates visible output (no white space), FALSE otherwise. * * @see https://php.net/ctype-graph * * @param mixed $text * * @return bool */ public static function ctype_graph($text) { $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); return \is_string($text) && '' !== $text && !\preg_match('/[^!-~]/', $text); } /** * Returns TRUE if every character in text is a lowercase letter. * * @see https://php.net/ctype-lower * * @param mixed $text * * @return bool */ public static function ctype_lower($text) { $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); return \is_string($text) && '' !== $text && !\preg_match('/[^a-z]/', $text); } /** * Returns TRUE if every character in text will actually create output (including blanks). Returns FALSE if text contains control characters or characters that do not have any output or control function at all. * * @see https://php.net/ctype-print * * @param mixed $text * * @return bool */ public static function ctype_print($text) { $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); return \is_string($text) && '' !== $text && !\preg_match('/[^ -~]/', $text); } /** * Returns TRUE if every character in text is printable, but neither letter, digit or blank, FALSE otherwise. * * @see https://php.net/ctype-punct * * @param mixed $text * * @return bool */ public static function ctype_punct($text) { $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); return \is_string($text) && '' !== $text && !\preg_match('/[^!-\\/\\:-@\\[-`\\{-~]/', $text); } /** * Returns TRUE if every character in text creates some sort of white space, FALSE otherwise. Besides the blank character this also includes tab, vertical tab, line feed, carriage return and form feed characters. * * @see https://php.net/ctype-space * * @param mixed $text * * @return bool */ public static function ctype_space($text) { $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); return \is_string($text) && '' !== $text && !\preg_match('/[^\\s]/', $text); } /** * Returns TRUE if every character in text is an uppercase letter. * * @see https://php.net/ctype-upper * * @param mixed $text * * @return bool */ public static function ctype_upper($text) { $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); return \is_string($text) && '' !== $text && !\preg_match('/[^A-Z]/', $text); } /** * Returns TRUE if every character in text is a hexadecimal 'digit', that is a decimal digit or a character from [A-Fa-f] , FALSE otherwise. * * @see https://php.net/ctype-xdigit * * @param mixed $text * * @return bool */ public static function ctype_xdigit($text) { $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); return \is_string($text) && '' !== $text && !\preg_match('/[^A-Fa-f0-9]/', $text); } /** * Converts integers to their char versions according to normal ctype behaviour, if needed. * * If an integer between -128 and 255 inclusive is provided, * it is interpreted as the ASCII value of a single character * (negative values have 256 added in order to allow characters in the Extended ASCII range). * Any other integer is interpreted as a string containing the decimal digits of the integer. * * @param mixed $int * @param string $function * * @return mixed */ private static function convert_int_to_char_for_ctype($int, $function) { if (!\is_int($int)) { return $int; } if ($int < -128 || $int > 255) { return (string) $int; } if (\PHP_VERSION_ID >= 80100) { @\trigger_error($function . '(): Argument of type int will be interpreted as string in the future', \E_USER_DEPRECATED); } if ($int < 0) { $int += 256; } return \chr($int); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ use _HumbugBox1cb33d1f20f1\Symfony\Polyfill\Ctype as p; if (!\function_exists('ctype_alnum')) { function ctype_alnum(mixed $text) : bool { return p\Ctype::ctype_alnum($text); } } if (!\function_exists('ctype_alpha')) { function ctype_alpha(mixed $text) : bool { return p\Ctype::ctype_alpha($text); } } if (!\function_exists('ctype_cntrl')) { function ctype_cntrl(mixed $text) : bool { return p\Ctype::ctype_cntrl($text); } } if (!\function_exists('ctype_digit')) { function ctype_digit(mixed $text) : bool { return p\Ctype::ctype_digit($text); } } if (!\function_exists('ctype_graph')) { function ctype_graph(mixed $text) : bool { return p\Ctype::ctype_graph($text); } } if (!\function_exists('ctype_lower')) { function ctype_lower(mixed $text) : bool { return p\Ctype::ctype_lower($text); } } if (!\function_exists('ctype_print')) { function ctype_print(mixed $text) : bool { return p\Ctype::ctype_print($text); } } if (!\function_exists('ctype_punct')) { function ctype_punct(mixed $text) : bool { return p\Ctype::ctype_punct($text); } } if (!\function_exists('ctype_space')) { function ctype_space(mixed $text) : bool { return p\Ctype::ctype_space($text); } } if (!\function_exists('ctype_upper')) { function ctype_upper(mixed $text) : bool { return p\Ctype::ctype_upper($text); } } if (!\function_exists('ctype_xdigit')) { function ctype_xdigit(mixed $text) : bool { return p\Ctype::ctype_xdigit($text); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Contracts\Service; use _HumbugBox1cb33d1f20f1\Psr\Container\ContainerExceptionInterface; use _HumbugBox1cb33d1f20f1\Psr\Container\NotFoundExceptionInterface; // Help opcache.preload discover always-needed symbols \class_exists(ContainerExceptionInterface::class); \class_exists(NotFoundExceptionInterface::class); /** * A trait to help implement ServiceProviderInterface. * * @author Robin Chalas * @author Nicolas Grekas */ trait ServiceLocatorTrait { private $factories; private $loading = []; private $providedTypes; /** * @param callable[] $factories */ public function __construct(array $factories) { $this->factories = $factories; } /** * {@inheritdoc} * * @return bool */ public function has(string $id) { return isset($this->factories[$id]); } /** * {@inheritdoc} * * @return mixed */ public function get(string $id) { if (!isset($this->factories[$id])) { throw $this->createNotFoundException($id); } if (isset($this->loading[$id])) { $ids = \array_values($this->loading); $ids = \array_slice($this->loading, \array_search($id, $ids)); $ids[] = $id; throw $this->createCircularReferenceException($id, $ids); } $this->loading[$id] = $id; try { return $this->factories[$id]($this); } finally { unset($this->loading[$id]); } } /** * {@inheritdoc} */ public function getProvidedServices() : array { if (null === $this->providedTypes) { $this->providedTypes = []; foreach ($this->factories as $name => $factory) { if (!\is_callable($factory)) { $this->providedTypes[$name] = '?'; } else { $type = (new \ReflectionFunction($factory))->getReturnType(); $this->providedTypes[$name] = $type ? ($type->allowsNull() ? '?' : '') . ($type instanceof \ReflectionNamedType ? $type->getName() : $type) : '?'; } } } return $this->providedTypes; } private function createNotFoundException(string $id) : NotFoundExceptionInterface { if (!($alternatives = \array_keys($this->factories))) { $message = 'is empty...'; } else { $last = \array_pop($alternatives); if ($alternatives) { $message = \sprintf('only knows about the "%s" and "%s" services.', \implode('", "', $alternatives), $last); } else { $message = \sprintf('only knows about the "%s" service.', $last); } } if ($this->loading) { $message = \sprintf('The service "%s" has a dependency on a non-existent service "%s". This locator %s', \end($this->loading), $id, $message); } else { $message = \sprintf('Service "%s" not found: the current service locator %s', $id, $message); } return new class($message) extends \InvalidArgumentException implements NotFoundExceptionInterface { }; } private function createCircularReferenceException(string $id, array $path) : ContainerExceptionInterface { return new class(\sprintf('Circular reference detected for service "%s", path: "%s".', $id, \implode(' -> ', $path))) extends \RuntimeException implements ContainerExceptionInterface { }; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Contracts\Service; use _HumbugBox1cb33d1f20f1\Psr\Container\ContainerInterface; use _HumbugBox1cb33d1f20f1\Symfony\Contracts\Service\Attribute\SubscribedService; /** * Implementation of ServiceSubscriberInterface that determines subscribed services from * method return types. Service ids are available as "ClassName::methodName". * * @author Kevin Bond */ trait ServiceSubscriberTrait { /** @var ContainerInterface */ protected $container; /** * {@inheritdoc} */ public static function getSubscribedServices() : array { $services = \method_exists(\get_parent_class(self::class) ?: '', __FUNCTION__) ? parent::getSubscribedServices() : []; $attributeOptIn = \false; if (\PHP_VERSION_ID >= 80000) { foreach ((new \ReflectionClass(self::class))->getMethods() as $method) { if (self::class !== $method->getDeclaringClass()->name) { continue; } if (!($attribute = $method->getAttributes(SubscribedService::class)[0] ?? null)) { continue; } if ($method->isStatic() || $method->isAbstract() || $method->isGenerator() || $method->isInternal() || $method->getNumberOfRequiredParameters()) { throw new \LogicException(\sprintf('Cannot use "%s" on method "%s::%s()" (can only be used on non-static, non-abstract methods with no parameters).', SubscribedService::class, self::class, $method->name)); } if (!($returnType = $method->getReturnType())) { throw new \LogicException(\sprintf('Cannot use "%s" on methods without a return type in "%s::%s()".', SubscribedService::class, $method->name, self::class)); } $serviceId = $returnType instanceof \ReflectionNamedType ? $returnType->getName() : (string) $returnType; if ($returnType->allowsNull()) { $serviceId = '?' . $serviceId; } $services[$attribute->newInstance()->key ?? self::class . '::' . $method->name] = $serviceId; $attributeOptIn = \true; } } if (!$attributeOptIn) { foreach ((new \ReflectionClass(self::class))->getMethods() as $method) { if ($method->isStatic() || $method->isAbstract() || $method->isGenerator() || $method->isInternal() || $method->getNumberOfRequiredParameters()) { continue; } if (self::class !== $method->getDeclaringClass()->name) { continue; } if (!($returnType = $method->getReturnType()) instanceof \ReflectionNamedType) { continue; } if ($returnType->isBuiltin()) { continue; } if (\PHP_VERSION_ID >= 80000) { trigger_deprecation('symfony/service-contracts', '2.5', 'Using "%s" in "%s" without using the "%s" attribute on any method is deprecated.', ServiceSubscriberTrait::class, self::class, SubscribedService::class); } $services[self::class . '::' . $method->name] = '?' . ($returnType instanceof \ReflectionNamedType ? $returnType->getName() : $returnType); } } return $services; } /** * @required * * @return ContainerInterface|null */ public function setContainer(ContainerInterface $container) { $this->container = $container; if (\method_exists(\get_parent_class(self::class) ?: '', __FUNCTION__)) { return parent::setContainer($container); } return null; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Contracts\Service\Attribute; use _HumbugBox1cb33d1f20f1\Symfony\Contracts\Service\ServiceSubscriberTrait; /** * Use with {@see ServiceSubscriberTrait} to mark a method's return type * as a subscribed service. * * @author Kevin Bond */ #[\Attribute(\Attribute::TARGET_METHOD)] final class SubscribedService { /** * @param string|null $key The key to use for the service * If null, use "ClassName::methodName" */ public function __construct(public ?string $key = null) { } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Contracts\Service\Attribute; /** * A required dependency. * * This attribute indicates that a property holds a required dependency. The annotated property or method should be * considered during the instantiation process of the containing class. * * @author Alexander M. Turek */ #[\Attribute(\Attribute::TARGET_METHOD | \Attribute::TARGET_PROPERTY)] final class Required { } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Contracts\Service; /** * Provides a way to reset an object to its initial state. * * When calling the "reset()" method on an object, it should be put back to its * initial state. This usually means clearing any internal buffers and forwarding * the call to internal dependencies. All properties of the object should be put * back to the same state it had when it was first ready to use. * * This method could be called, for example, to recycle objects that are used as * services, so that they can be used to handle several requests in the same * process loop (note that we advise making your services stateless instead of * implementing this interface when possible.) */ interface ResetInterface { public function reset(); } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Contracts\Service; /** * A ServiceSubscriber exposes its dependencies via the static {@link getSubscribedServices} method. * * The getSubscribedServices method returns an array of service types required by such instances, * optionally keyed by the service names used internally. Service types that start with an interrogation * mark "?" are optional, while the other ones are mandatory service dependencies. * * The injected service locators SHOULD NOT allow access to any other services not specified by the method. * * It is expected that ServiceSubscriber instances consume PSR-11-based service locators internally. * This interface does not dictate any injection method for these service locators, although constructor * injection is recommended. * * @author Nicolas Grekas */ interface ServiceSubscriberInterface { /** * Returns an array of service types required by such instances, optionally keyed by the service names used internally. * * For mandatory dependencies: * * * ['logger' => 'Psr\Log\LoggerInterface'] means the objects use the "logger" name * internally to fetch a service which must implement Psr\Log\LoggerInterface. * * ['loggers' => 'Psr\Log\LoggerInterface[]'] means the objects use the "loggers" name * internally to fetch an iterable of Psr\Log\LoggerInterface instances. * * ['Psr\Log\LoggerInterface'] is a shortcut for * * ['Psr\Log\LoggerInterface' => 'Psr\Log\LoggerInterface'] * * otherwise: * * * ['logger' => '?Psr\Log\LoggerInterface'] denotes an optional dependency * * ['loggers' => '?Psr\Log\LoggerInterface[]'] denotes an optional iterable dependency * * ['?Psr\Log\LoggerInterface'] is a shortcut for * * ['Psr\Log\LoggerInterface' => '?Psr\Log\LoggerInterface'] * * @return string[] The required service types, optionally keyed by service names */ public static function getSubscribedServices(); } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Contracts\Service; use _HumbugBox1cb33d1f20f1\Psr\Container\ContainerInterface; /** * A ServiceProviderInterface exposes the identifiers and the types of services provided by a container. * * @author Nicolas Grekas * @author Mateusz Sip */ interface ServiceProviderInterface extends ContainerInterface { /** * Returns an associative array of service types keyed by the identifiers provided by the current container. * * Examples: * * * ['logger' => 'Psr\Log\LoggerInterface'] means the object provides a service named "logger" that implements Psr\Log\LoggerInterface * * ['foo' => '?'] means the container provides service name "foo" of unspecified type * * ['bar' => '?Bar\Baz'] means the container provides a service "bar" of type Bar\Baz|null * * @return string[] The provided service types, keyed by service names */ public function getProvidedServices() : array; } Copyright (c) 2018-2022 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. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Filesystem; use _HumbugBox1cb33d1f20f1\Symfony\Component\Filesystem\Exception\InvalidArgumentException; use _HumbugBox1cb33d1f20f1\Symfony\Component\Filesystem\Exception\RuntimeException; /** * Contains utility methods for handling path strings. * * The methods in this class are able to deal with both UNIX and Windows paths * with both forward and backward slashes. All methods return normalized parts * containing only forward slashes and no excess "." and ".." segments. * * @author Bernhard Schussek * @author Thomas Schulz * @author Théo Fidry */ final class Path { /** * The number of buffer entries that triggers a cleanup operation. */ private const CLEANUP_THRESHOLD = 1250; /** * The buffer size after the cleanup operation. */ private const CLEANUP_SIZE = 1000; /** * Buffers input/output of {@link canonicalize()}. * * @var array */ private static $buffer = []; /** * @var int */ private static $bufferSize = 0; /** * Canonicalizes the given path. * * During normalization, all slashes are replaced by forward slashes ("/"). * Furthermore, all "." and ".." segments are removed as far as possible. * ".." segments at the beginning of relative paths are not removed. * * ```php * echo Path::canonicalize("\symfony\puli\..\css\style.css"); * // => /symfony/css/style.css * * echo Path::canonicalize("../css/./style.css"); * // => ../css/style.css * ``` * * This method is able to deal with both UNIX and Windows paths. */ public static function canonicalize(string $path) : string { if ('' === $path) { return ''; } // This method is called by many other methods in this class. Buffer // the canonicalized paths to make up for the severe performance // decrease. if (isset(self::$buffer[$path])) { return self::$buffer[$path]; } // Replace "~" with user's home directory. if ('~' === $path[0]) { $path = self::getHomeDirectory() . \substr($path, 1); } $path = self::normalize($path); [$root, $pathWithoutRoot] = self::split($path); $canonicalParts = self::findCanonicalParts($root, $pathWithoutRoot); // Add the root directory again self::$buffer[$path] = $canonicalPath = $root . \implode('/', $canonicalParts); ++self::$bufferSize; // Clean up regularly to prevent memory leaks if (self::$bufferSize > self::CLEANUP_THRESHOLD) { self::$buffer = \array_slice(self::$buffer, -self::CLEANUP_SIZE, null, \true); self::$bufferSize = self::CLEANUP_SIZE; } return $canonicalPath; } /** * Normalizes the given path. * * During normalization, all slashes are replaced by forward slashes ("/"). * Contrary to {@link canonicalize()}, this method does not remove invalid * or dot path segments. Consequently, it is much more efficient and should * be used whenever the given path is known to be a valid, absolute system * path. * * This method is able to deal with both UNIX and Windows paths. */ public static function normalize(string $path) : string { return \str_replace('\\', '/', $path); } /** * Returns the directory part of the path. * * This method is similar to PHP's dirname(), but handles various cases * where dirname() returns a weird result: * * - dirname() does not accept backslashes on UNIX * - dirname("C:/symfony") returns "C:", not "C:/" * - dirname("C:/") returns ".", not "C:/" * - dirname("C:") returns ".", not "C:/" * - dirname("symfony") returns ".", not "" * - dirname() does not canonicalize the result * * This method fixes these shortcomings and behaves like dirname() * otherwise. * * The result is a canonical path. * * @return string The canonical directory part. Returns the root directory * if the root directory is passed. Returns an empty string * if a relative path is passed that contains no slashes. * Returns an empty string if an empty string is passed. */ public static function getDirectory(string $path) : string { if ('' === $path) { return ''; } $path = self::canonicalize($path); // Maintain scheme if (\false !== ($schemeSeparatorPosition = \strpos($path, '://'))) { $scheme = \substr($path, 0, $schemeSeparatorPosition + 3); $path = \substr($path, $schemeSeparatorPosition + 3); } else { $scheme = ''; } if (\false === ($dirSeparatorPosition = \strrpos($path, '/'))) { return ''; } // Directory equals root directory "/" if (0 === $dirSeparatorPosition) { return $scheme . '/'; } // Directory equals Windows root "C:/" if (2 === $dirSeparatorPosition && \ctype_alpha($path[0]) && ':' === $path[1]) { return $scheme . \substr($path, 0, 3); } return $scheme . \substr($path, 0, $dirSeparatorPosition); } /** * Returns canonical path of the user's home directory. * * Supported operating systems: * * - UNIX * - Windows8 and upper * * If your operating system or environment isn't supported, an exception is thrown. * * The result is a canonical path. * * @throws RuntimeException If your operating system or environment isn't supported */ public static function getHomeDirectory() : string { // For UNIX support if (\getenv('HOME')) { return self::canonicalize(\getenv('HOME')); } // For >= Windows8 support if (\getenv('HOMEDRIVE') && \getenv('HOMEPATH')) { return self::canonicalize(\getenv('HOMEDRIVE') . \getenv('HOMEPATH')); } throw new RuntimeException("Cannot find the home directory path: Your environment or operating system isn't supported."); } /** * Returns the root directory of a path. * * The result is a canonical path. * * @return string The canonical root directory. Returns an empty string if * the given path is relative or empty. */ public static function getRoot(string $path) : string { if ('' === $path) { return ''; } // Maintain scheme if (\false !== ($schemeSeparatorPosition = \strpos($path, '://'))) { $scheme = \substr($path, 0, $schemeSeparatorPosition + 3); $path = \substr($path, $schemeSeparatorPosition + 3); } else { $scheme = ''; } $firstCharacter = $path[0]; // UNIX root "/" or "\" (Windows style) if ('/' === $firstCharacter || '\\' === $firstCharacter) { return $scheme . '/'; } $length = \strlen($path); // Windows root if ($length > 1 && ':' === $path[1] && \ctype_alpha($firstCharacter)) { // Special case: "C:" if (2 === $length) { return $scheme . $path . '/'; } // Normal case: "C:/ or "C:\" if ('/' === $path[2] || '\\' === $path[2]) { return $scheme . $firstCharacter . $path[1] . '/'; } } return ''; } /** * Returns the file name without the extension from a file path. * * @param string|null $extension if specified, only that extension is cut * off (may contain leading dot) */ public static function getFilenameWithoutExtension(string $path, string $extension = null) : string { if ('' === $path) { return ''; } if (null !== $extension) { // remove extension and trailing dot return \rtrim(\basename($path, $extension), '.'); } return \pathinfo($path, \PATHINFO_FILENAME); } /** * Returns the extension from a file path (without leading dot). * * @param bool $forceLowerCase forces the extension to be lower-case */ public static function getExtension(string $path, bool $forceLowerCase = \false) : string { if ('' === $path) { return ''; } $extension = \pathinfo($path, \PATHINFO_EXTENSION); if ($forceLowerCase) { $extension = self::toLower($extension); } return $extension; } /** * Returns whether the path has an (or the specified) extension. * * @param string $path the path string * @param string|string[]|null $extensions if null or not provided, checks if * an extension exists, otherwise * checks for the specified extension * or array of extensions (with or * without leading dot) * @param bool $ignoreCase whether to ignore case-sensitivity */ public static function hasExtension(string $path, $extensions = null, bool $ignoreCase = \false) : bool { if ('' === $path) { return \false; } $actualExtension = self::getExtension($path, $ignoreCase); // Only check if path has any extension if ([] === $extensions || null === $extensions) { return '' !== $actualExtension; } if (\is_string($extensions)) { $extensions = [$extensions]; } foreach ($extensions as $key => $extension) { if ($ignoreCase) { $extension = self::toLower($extension); } // remove leading '.' in extensions array $extensions[$key] = \ltrim($extension, '.'); } return \in_array($actualExtension, $extensions, \true); } /** * Changes the extension of a path string. * * @param string $path The path string with filename.ext to change. * @param string $extension new extension (with or without leading dot) * * @return string the path string with new file extension */ public static function changeExtension(string $path, string $extension) : string { if ('' === $path) { return ''; } $actualExtension = self::getExtension($path); $extension = \ltrim($extension, '.'); // No extension for paths if ('/' === \substr($path, -1)) { return $path; } // No actual extension in path if (empty($actualExtension)) { return $path . ('.' === \substr($path, -1) ? '' : '.') . $extension; } return \substr($path, 0, -\strlen($actualExtension)) . $extension; } public static function isAbsolute(string $path) : bool { if ('' === $path) { return \false; } // Strip scheme if (\false !== ($schemeSeparatorPosition = \strpos($path, '://'))) { $path = \substr($path, $schemeSeparatorPosition + 3); } $firstCharacter = $path[0]; // UNIX root "/" or "\" (Windows style) if ('/' === $firstCharacter || '\\' === $firstCharacter) { return \true; } // Windows root if (\strlen($path) > 1 && \ctype_alpha($firstCharacter) && ':' === $path[1]) { // Special case: "C:" if (2 === \strlen($path)) { return \true; } // Normal case: "C:/ or "C:\" if ('/' === $path[2] || '\\' === $path[2]) { return \true; } } return \false; } public static function isRelative(string $path) : bool { return !self::isAbsolute($path); } /** * Turns a relative path into an absolute path in canonical form. * * Usually, the relative path is appended to the given base path. Dot * segments ("." and "..") are removed/collapsed and all slashes turned * into forward slashes. * * ```php * echo Path::makeAbsolute("../style.css", "/symfony/puli/css"); * // => /symfony/puli/style.css * ``` * * If an absolute path is passed, that path is returned unless its root * directory is different than the one of the base path. In that case, an * exception is thrown. * * ```php * Path::makeAbsolute("/style.css", "/symfony/puli/css"); * // => /style.css * * Path::makeAbsolute("C:/style.css", "C:/symfony/puli/css"); * // => C:/style.css * * Path::makeAbsolute("C:/style.css", "/symfony/puli/css"); * // InvalidArgumentException * ``` * * If the base path is not an absolute path, an exception is thrown. * * The result is a canonical path. * * @param string $basePath an absolute base path * * @throws InvalidArgumentException if the base path is not absolute or if * the given path is an absolute path with * a different root than the base path */ public static function makeAbsolute(string $path, string $basePath) : string { if ('' === $basePath) { throw new InvalidArgumentException(\sprintf('The base path must be a non-empty string. Got: "%s".', $basePath)); } if (!self::isAbsolute($basePath)) { throw new InvalidArgumentException(\sprintf('The base path "%s" is not an absolute path.', $basePath)); } if (self::isAbsolute($path)) { return self::canonicalize($path); } if (\false !== ($schemeSeparatorPosition = \strpos($basePath, '://'))) { $scheme = \substr($basePath, 0, $schemeSeparatorPosition + 3); $basePath = \substr($basePath, $schemeSeparatorPosition + 3); } else { $scheme = ''; } return $scheme . self::canonicalize(\rtrim($basePath, '/\\') . '/' . $path); } /** * Turns a path into a relative path. * * The relative path is created relative to the given base path: * * ```php * echo Path::makeRelative("/symfony/style.css", "/symfony/puli"); * // => ../style.css * ``` * * If a relative path is passed and the base path is absolute, the relative * path is returned unchanged: * * ```php * Path::makeRelative("style.css", "/symfony/puli/css"); * // => style.css * ``` * * If both paths are relative, the relative path is created with the * assumption that both paths are relative to the same directory: * * ```php * Path::makeRelative("style.css", "symfony/puli/css"); * // => ../../../style.css * ``` * * If both paths are absolute, their root directory must be the same, * otherwise an exception is thrown: * * ```php * Path::makeRelative("C:/symfony/style.css", "/symfony/puli"); * // InvalidArgumentException * ``` * * If the passed path is absolute, but the base path is not, an exception * is thrown as well: * * ```php * Path::makeRelative("/symfony/style.css", "symfony/puli"); * // InvalidArgumentException * ``` * * If the base path is not an absolute path, an exception is thrown. * * The result is a canonical path. * * @throws InvalidArgumentException if the base path is not absolute or if * the given path has a different root * than the base path */ public static function makeRelative(string $path, string $basePath) : string { $path = self::canonicalize($path); $basePath = self::canonicalize($basePath); [$root, $relativePath] = self::split($path); [$baseRoot, $relativeBasePath] = self::split($basePath); // If the base path is given as absolute path and the path is already // relative, consider it to be relative to the given absolute path // already if ('' === $root && '' !== $baseRoot) { // If base path is already in its root if ('' === $relativeBasePath) { $relativePath = \ltrim($relativePath, './\\'); } return $relativePath; } // If the passed path is absolute, but the base path is not, we // cannot generate a relative path if ('' !== $root && '' === $baseRoot) { throw new InvalidArgumentException(\sprintf('The absolute path "%s" cannot be made relative to the relative path "%s". You should provide an absolute base path instead.', $path, $basePath)); } // Fail if the roots of the two paths are different if ($baseRoot && $root !== $baseRoot) { throw new InvalidArgumentException(\sprintf('The path "%s" cannot be made relative to "%s", because they have different roots ("%s" and "%s").', $path, $basePath, $root, $baseRoot)); } if ('' === $relativeBasePath) { return $relativePath; } // Build a "../../" prefix with as many "../" parts as necessary $parts = \explode('/', $relativePath); $baseParts = \explode('/', $relativeBasePath); $dotDotPrefix = ''; // Once we found a non-matching part in the prefix, we need to add // "../" parts for all remaining parts $match = \true; foreach ($baseParts as $index => $basePart) { if ($match && isset($parts[$index]) && $basePart === $parts[$index]) { unset($parts[$index]); continue; } $match = \false; $dotDotPrefix .= '../'; } return \rtrim($dotDotPrefix . \implode('/', $parts), '/'); } /** * Returns whether the given path is on the local filesystem. */ public static function isLocal(string $path) : bool { return '' !== $path && \false === \strpos($path, '://'); } /** * Returns the longest common base path in canonical form of a set of paths or * `null` if the paths are on different Windows partitions. * * Dot segments ("." and "..") are removed/collapsed and all slashes turned * into forward slashes. * * ```php * $basePath = Path::getLongestCommonBasePath( * '/symfony/css/style.css', * '/symfony/css/..' * ); * // => /symfony * ``` * * The root is returned if no common base path can be found: * * ```php * $basePath = Path::getLongestCommonBasePath( * '/symfony/css/style.css', * '/puli/css/..' * ); * // => / * ``` * * If the paths are located on different Windows partitions, `null` is * returned. * * ```php * $basePath = Path::getLongestCommonBasePath( * 'C:/symfony/css/style.css', * 'D:/symfony/css/..' * ); * // => null * ``` */ public static function getLongestCommonBasePath(string ...$paths) : ?string { [$bpRoot, $basePath] = self::split(self::canonicalize(\reset($paths))); for (\next($paths); null !== \key($paths) && '' !== $basePath; \next($paths)) { [$root, $path] = self::split(self::canonicalize(\current($paths))); // If we deal with different roots (e.g. C:/ vs. D:/), it's time // to quit if ($root !== $bpRoot) { return null; } // Make the base path shorter until it fits into path while (\true) { if ('.' === $basePath) { // No more base paths $basePath = ''; // next path continue 2; } // Prevent false positives for common prefixes // see isBasePath() if (0 === \strpos($path . '/', $basePath . '/')) { // next path continue 2; } $basePath = \dirname($basePath); } } return $bpRoot . $basePath; } /** * Joins two or more path strings into a canonical path. */ public static function join(string ...$paths) : string { $finalPath = null; $wasScheme = \false; foreach ($paths as $path) { if ('' === $path) { continue; } if (null === $finalPath) { // For first part we keep slashes, like '/top', 'C:\' or 'phar://' $finalPath = $path; $wasScheme = \false !== \strpos($path, '://'); continue; } // Only add slash if previous part didn't end with '/' or '\' if (!\in_array(\substr($finalPath, -1), ['/', '\\'])) { $finalPath .= '/'; } // If first part included a scheme like 'phar://' we allow \current part to start with '/', otherwise trim $finalPath .= $wasScheme ? $path : \ltrim($path, '/'); $wasScheme = \false; } if (null === $finalPath) { return ''; } return self::canonicalize($finalPath); } /** * Returns whether a path is a base path of another path. * * Dot segments ("." and "..") are removed/collapsed and all slashes turned * into forward slashes. * * ```php * Path::isBasePath('/symfony', '/symfony/css'); * // => true * * Path::isBasePath('/symfony', '/symfony'); * // => true * * Path::isBasePath('/symfony', '/symfony/..'); * // => false * * Path::isBasePath('/symfony', '/puli'); * // => false * ``` */ public static function isBasePath(string $basePath, string $ofPath) : bool { $basePath = self::canonicalize($basePath); $ofPath = self::canonicalize($ofPath); // Append slashes to prevent false positives when two paths have // a common prefix, for example /base/foo and /base/foobar. // Don't append a slash for the root "/", because then that root // won't be discovered as common prefix ("//" is not a prefix of // "/foobar/"). return 0 === \strpos($ofPath . '/', \rtrim($basePath, '/') . '/'); } /** * @return string[] */ private static function findCanonicalParts(string $root, string $pathWithoutRoot) : array { $parts = \explode('/', $pathWithoutRoot); $canonicalParts = []; // Collapse "." and "..", if possible foreach ($parts as $part) { if ('.' === $part || '' === $part) { continue; } // Collapse ".." with the previous part, if one exists // Don't collapse ".." if the previous part is also ".." if ('..' === $part && \count($canonicalParts) > 0 && '..' !== $canonicalParts[\count($canonicalParts) - 1]) { \array_pop($canonicalParts); continue; } // Only add ".." prefixes for relative paths if ('..' !== $part || '' === $root) { $canonicalParts[] = $part; } } return $canonicalParts; } /** * Splits a canonical path into its root directory and the remainder. * * If the path has no root directory, an empty root directory will be * returned. * * If the root directory is a Windows style partition, the resulting root * will always contain a trailing slash. * * list ($root, $path) = Path::split("C:/symfony") * // => ["C:/", "symfony"] * * list ($root, $path) = Path::split("C:") * // => ["C:/", ""] * * @return array{string, string} an array with the root directory and the remaining relative path */ private static function split(string $path) : array { if ('' === $path) { return ['', '']; } // Remember scheme as part of the root, if any if (\false !== ($schemeSeparatorPosition = \strpos($path, '://'))) { $root = \substr($path, 0, $schemeSeparatorPosition + 3); $path = \substr($path, $schemeSeparatorPosition + 3); } else { $root = ''; } $length = \strlen($path); // Remove and remember root directory if (0 === \strpos($path, '/')) { $root .= '/'; $path = $length > 1 ? \substr($path, 1) : ''; } elseif ($length > 1 && \ctype_alpha($path[0]) && ':' === $path[1]) { if (2 === $length) { // Windows special case: "C:" $root .= $path . '/'; $path = ''; } elseif ('/' === $path[2]) { // Windows normal case: "C:/".. $root .= \substr($path, 0, 3); $path = $length > 3 ? \substr($path, 3) : ''; } } return [$root, $path]; } private static function toLower(string $string) : string { if (\false !== ($encoding = \mb_detect_encoding($string, null, \true))) { return \mb_strtolower($string, $encoding); } return \strtolower($string); } private function __construct() { } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Filesystem\Exception; /** * Exception interface for all exceptions thrown by the component. * * @author Romain Neutron */ interface ExceptionInterface extends \Throwable { } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Filesystem\Exception; /** * Exception class thrown when a file couldn't be found. * * @author Fabien Potencier * @author Christian Gärtner */ class FileNotFoundException extends IOException { public function __construct(string $message = null, int $code = 0, \Throwable $previous = null, string $path = null) { if (null === $message) { if (null === $path) { $message = 'File could not be found.'; } else { $message = \sprintf('File "%s" could not be found.', $path); } } parent::__construct($message, $code, $previous, $path); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Filesystem\Exception; /** * @author Théo Fidry */ class RuntimeException extends \RuntimeException implements ExceptionInterface { } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Filesystem\Exception; /** * Exception class thrown when a filesystem operation failure happens. * * @author Romain Neutron * @author Christian Gärtner * @author Fabien Potencier */ class IOException extends \RuntimeException implements IOExceptionInterface { private $path; public function __construct(string $message, int $code = 0, \Throwable $previous = null, string $path = null) { $this->path = $path; parent::__construct($message, $code, $previous); } /** * {@inheritdoc} */ public function getPath() { return $this->path; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Filesystem\Exception; /** * IOException interface for file and input/output stream related exceptions thrown by the component. * * @author Christian Gärtner */ interface IOExceptionInterface extends ExceptionInterface { /** * Returns the associated path for the exception. * * @return string|null */ public function getPath(); } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Filesystem\Exception; /** * @author Christian Flothmann */ class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface { } Copyright (c) 2004-2022 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. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Component\Filesystem; use _HumbugBox1cb33d1f20f1\Symfony\Component\Filesystem\Exception\FileNotFoundException; use _HumbugBox1cb33d1f20f1\Symfony\Component\Filesystem\Exception\InvalidArgumentException; use _HumbugBox1cb33d1f20f1\Symfony\Component\Filesystem\Exception\IOException; /** * Provides basic utility to manipulate the file system. * * @author Fabien Potencier */ class Filesystem { private static $lastError; /** * Copies a file. * * If the target file is older than the origin file, it's always overwritten. * If the target file is newer, it is overwritten only when the * $overwriteNewerFiles option is set to true. * * @throws FileNotFoundException When originFile doesn't exist * @throws IOException When copy fails */ public function copy(string $originFile, string $targetFile, bool $overwriteNewerFiles = \false) { $originIsLocal = \stream_is_local($originFile) || 0 === \stripos($originFile, 'file://'); if ($originIsLocal && !\is_file($originFile)) { throw new FileNotFoundException(\sprintf('Failed to copy "%s" because file does not exist.', $originFile), 0, null, $originFile); } $this->mkdir(\dirname($targetFile)); $doCopy = \true; if (!$overwriteNewerFiles && null === \parse_url($originFile, \PHP_URL_HOST) && \is_file($targetFile)) { $doCopy = \filemtime($originFile) > \filemtime($targetFile); } if ($doCopy) { // https://bugs.php.net/64634 if (!($source = self::box('fopen', $originFile, 'r'))) { throw new IOException(\sprintf('Failed to copy "%s" to "%s" because source file could not be opened for reading: ', $originFile, $targetFile) . self::$lastError, 0, null, $originFile); } // Stream context created to allow files overwrite when using FTP stream wrapper - disabled by default if (!($target = self::box('fopen', $targetFile, 'w', \false, \stream_context_create(['ftp' => ['overwrite' => \true]])))) { throw new IOException(\sprintf('Failed to copy "%s" to "%s" because target file could not be opened for writing: ', $originFile, $targetFile) . self::$lastError, 0, null, $originFile); } $bytesCopied = \stream_copy_to_stream($source, $target); \fclose($source); \fclose($target); unset($source, $target); if (!\is_file($targetFile)) { throw new IOException(\sprintf('Failed to copy "%s" to "%s".', $originFile, $targetFile), 0, null, $originFile); } if ($originIsLocal) { // Like `cp`, preserve executable permission bits self::box('chmod', $targetFile, \fileperms($targetFile) | \fileperms($originFile) & 0111); if ($bytesCopied !== ($bytesOrigin = \filesize($originFile))) { throw new IOException(\sprintf('Failed to copy the whole content of "%s" to "%s" (%g of %g bytes copied).', $originFile, $targetFile, $bytesCopied, $bytesOrigin), 0, null, $originFile); } } } } /** * Creates a directory recursively. * * @param string|iterable $dirs The directory path * * @throws IOException On any directory creation failure */ public function mkdir($dirs, int $mode = 0777) { foreach ($this->toIterable($dirs) as $dir) { if (\is_dir($dir)) { continue; } if (!self::box('mkdir', $dir, $mode, \true) && !\is_dir($dir)) { throw new IOException(\sprintf('Failed to create "%s": ', $dir) . self::$lastError, 0, null, $dir); } } } /** * Checks the existence of files or directories. * * @param string|iterable $files A filename, an array of files, or a \Traversable instance to check * * @return bool */ public function exists($files) { $maxPathLength = \PHP_MAXPATHLEN - 2; foreach ($this->toIterable($files) as $file) { if (\strlen($file) > $maxPathLength) { throw new IOException(\sprintf('Could not check if file exist because path length exceeds %d characters.', $maxPathLength), 0, null, $file); } if (!\file_exists($file)) { return \false; } } return \true; } /** * Sets access and modification time of file. * * @param string|iterable $files A filename, an array of files, or a \Traversable instance to create * @param int|null $time The touch time as a Unix timestamp, if not supplied the current system time is used * @param int|null $atime The access time as a Unix timestamp, if not supplied the current system time is used * * @throws IOException When touch fails */ public function touch($files, int $time = null, int $atime = null) { foreach ($this->toIterable($files) as $file) { if (!($time ? self::box('touch', $file, $time, $atime) : self::box('touch', $file))) { throw new IOException(\sprintf('Failed to touch "%s": ', $file) . self::$lastError, 0, null, $file); } } } /** * Removes files or directories. * * @param string|iterable $files A filename, an array of files, or a \Traversable instance to remove * * @throws IOException When removal fails */ public function remove($files) { if ($files instanceof \Traversable) { $files = \iterator_to_array($files, \false); } elseif (!\is_array($files)) { $files = [$files]; } self::doRemove($files, \false); } private static function doRemove(array $files, bool $isRecursive) : void { $files = \array_reverse($files); foreach ($files as $file) { if (\is_link($file)) { // See https://bugs.php.net/52176 if (!(self::box('unlink', $file) || '\\' !== \DIRECTORY_SEPARATOR || self::box('rmdir', $file)) && \file_exists($file)) { throw new IOException(\sprintf('Failed to remove symlink "%s": ', $file) . self::$lastError); } } elseif (\is_dir($file)) { if (!$isRecursive) { $tmpName = \dirname(\realpath($file)) . '/.' . \strrev(\strtr(\base64_encode(\random_bytes(2)), '/=', '-.')); if (\file_exists($tmpName)) { try { self::doRemove([$tmpName], \true); } catch (IOException $e) { } } if (!\file_exists($tmpName) && self::box('rename', $file, $tmpName)) { $origFile = $file; $file = $tmpName; } else { $origFile = null; } } $files = new \FilesystemIterator($file, \FilesystemIterator::CURRENT_AS_PATHNAME | \FilesystemIterator::SKIP_DOTS); self::doRemove(\iterator_to_array($files, \true), \true); if (!self::box('rmdir', $file) && \file_exists($file) && !$isRecursive) { $lastError = self::$lastError; if (null !== $origFile && self::box('rename', $file, $origFile)) { $file = $origFile; } throw new IOException(\sprintf('Failed to remove directory "%s": ', $file) . $lastError); } } elseif (!self::box('unlink', $file) && (\str_contains(self::$lastError, 'Permission denied') || \file_exists($file))) { throw new IOException(\sprintf('Failed to remove file "%s": ', $file) . self::$lastError); } } } /** * Change mode for an array of files or directories. * * @param string|iterable $files A filename, an array of files, or a \Traversable instance to change mode * @param int $mode The new mode (octal) * @param int $umask The mode mask (octal) * @param bool $recursive Whether change the mod recursively or not * * @throws IOException When the change fails */ public function chmod($files, int $mode, int $umask = 00, bool $recursive = \false) { foreach ($this->toIterable($files) as $file) { if ((\PHP_VERSION_ID < 80000 || \is_int($mode)) && !self::box('chmod', $file, $mode & ~$umask)) { throw new IOException(\sprintf('Failed to chmod file "%s": ', $file) . self::$lastError, 0, null, $file); } if ($recursive && \is_dir($file) && !\is_link($file)) { $this->chmod(new \FilesystemIterator($file), $mode, $umask, \true); } } } /** * Change the owner of an array of files or directories. * * @param string|iterable $files A filename, an array of files, or a \Traversable instance to change owner * @param string|int $user A user name or number * @param bool $recursive Whether change the owner recursively or not * * @throws IOException When the change fails */ public function chown($files, $user, bool $recursive = \false) { foreach ($this->toIterable($files) as $file) { if ($recursive && \is_dir($file) && !\is_link($file)) { $this->chown(new \FilesystemIterator($file), $user, \true); } if (\is_link($file) && \function_exists('lchown')) { if (!self::box('lchown', $file, $user)) { throw new IOException(\sprintf('Failed to chown file "%s": ', $file) . self::$lastError, 0, null, $file); } } else { if (!self::box('chown', $file, $user)) { throw new IOException(\sprintf('Failed to chown file "%s": ', $file) . self::$lastError, 0, null, $file); } } } } /** * Change the group of an array of files or directories. * * @param string|iterable $files A filename, an array of files, or a \Traversable instance to change group * @param string|int $group A group name or number * @param bool $recursive Whether change the group recursively or not * * @throws IOException When the change fails */ public function chgrp($files, $group, bool $recursive = \false) { foreach ($this->toIterable($files) as $file) { if ($recursive && \is_dir($file) && !\is_link($file)) { $this->chgrp(new \FilesystemIterator($file), $group, \true); } if (\is_link($file) && \function_exists('lchgrp')) { if (!self::box('lchgrp', $file, $group)) { throw new IOException(\sprintf('Failed to chgrp file "%s": ', $file) . self::$lastError, 0, null, $file); } } else { if (!self::box('chgrp', $file, $group)) { throw new IOException(\sprintf('Failed to chgrp file "%s": ', $file) . self::$lastError, 0, null, $file); } } } } /** * Renames a file or a directory. * * @throws IOException When target file or directory already exists * @throws IOException When origin cannot be renamed */ public function rename(string $origin, string $target, bool $overwrite = \false) { // we check that target does not exist if (!$overwrite && $this->isReadable($target)) { throw new IOException(\sprintf('Cannot rename because the target "%s" already exists.', $target), 0, null, $target); } if (!self::box('rename', $origin, $target)) { if (\is_dir($origin)) { // See https://bugs.php.net/54097 & https://php.net/rename#113943 $this->mirror($origin, $target, null, ['override' => $overwrite, 'delete' => $overwrite]); $this->remove($origin); return; } throw new IOException(\sprintf('Cannot rename "%s" to "%s": ', $origin, $target) . self::$lastError, 0, null, $target); } } /** * Tells whether a file exists and is readable. * * @throws IOException When windows path is longer than 258 characters */ private function isReadable(string $filename) : bool { $maxPathLength = \PHP_MAXPATHLEN - 2; if (\strlen($filename) > $maxPathLength) { throw new IOException(\sprintf('Could not check if file is readable because path length exceeds %d characters.', $maxPathLength), 0, null, $filename); } return \is_readable($filename); } /** * Creates a symbolic link or copy a directory. * * @throws IOException When symlink fails */ public function symlink(string $originDir, string $targetDir, bool $copyOnWindows = \false) { self::assertFunctionExists('symlink'); if ('\\' === \DIRECTORY_SEPARATOR) { $originDir = \strtr($originDir, '/', '\\'); $targetDir = \strtr($targetDir, '/', '\\'); if ($copyOnWindows) { $this->mirror($originDir, $targetDir); return; } } $this->mkdir(\dirname($targetDir)); if (\is_link($targetDir)) { if (\readlink($targetDir) === $originDir) { return; } $this->remove($targetDir); } if (!self::box('symlink', $originDir, $targetDir)) { $this->linkException($originDir, $targetDir, 'symbolic'); } } /** * Creates a hard link, or several hard links to a file. * * @param string|string[] $targetFiles The target file(s) * * @throws FileNotFoundException When original file is missing or not a file * @throws IOException When link fails, including if link already exists */ public function hardlink(string $originFile, $targetFiles) { self::assertFunctionExists('link'); if (!$this->exists($originFile)) { throw new FileNotFoundException(null, 0, null, $originFile); } if (!\is_file($originFile)) { throw new FileNotFoundException(\sprintf('Origin file "%s" is not a file.', $originFile)); } foreach ($this->toIterable($targetFiles) as $targetFile) { if (\is_file($targetFile)) { if (\fileinode($originFile) === \fileinode($targetFile)) { continue; } $this->remove($targetFile); } if (!self::box('link', $originFile, $targetFile)) { $this->linkException($originFile, $targetFile, 'hard'); } } } /** * @param string $linkType Name of the link type, typically 'symbolic' or 'hard' */ private function linkException(string $origin, string $target, string $linkType) { if (self::$lastError) { if ('\\' === \DIRECTORY_SEPARATOR && \str_contains(self::$lastError, 'error code(1314)')) { throw new IOException(\sprintf('Unable to create "%s" link due to error code 1314: \'A required privilege is not held by the client\'. Do you have the required Administrator-rights?', $linkType), 0, null, $target); } } throw new IOException(\sprintf('Failed to create "%s" link from "%s" to "%s": ', $linkType, $origin, $target) . self::$lastError, 0, null, $target); } /** * Resolves links in paths. * * With $canonicalize = false (default) * - if $path does not exist or is not a link, returns null * - if $path is a link, returns the next direct target of the link without considering the existence of the target * * With $canonicalize = true * - if $path does not exist, returns null * - if $path exists, returns its absolute fully resolved final version * * @return string|null */ public function readlink(string $path, bool $canonicalize = \false) { if (!$canonicalize && !\is_link($path)) { return null; } if ($canonicalize) { if (!$this->exists($path)) { return null; } if ('\\' === \DIRECTORY_SEPARATOR && \PHP_VERSION_ID < 70410) { $path = \readlink($path); } return \realpath($path); } if ('\\' === \DIRECTORY_SEPARATOR && \PHP_VERSION_ID < 70400) { return \realpath($path); } return \readlink($path); } /** * Given an existing path, convert it to a path relative to a given starting path. * * @return string */ public function makePathRelative(string $endPath, string $startPath) { if (!$this->isAbsolutePath($startPath)) { throw new InvalidArgumentException(\sprintf('The start path "%s" is not absolute.', $startPath)); } if (!$this->isAbsolutePath($endPath)) { throw new InvalidArgumentException(\sprintf('The end path "%s" is not absolute.', $endPath)); } // Normalize separators on Windows if ('\\' === \DIRECTORY_SEPARATOR) { $endPath = \str_replace('\\', '/', $endPath); $startPath = \str_replace('\\', '/', $startPath); } $splitDriveLetter = function ($path) { return \strlen($path) > 2 && ':' === $path[1] && '/' === $path[2] && \ctype_alpha($path[0]) ? [\substr($path, 2), \strtoupper($path[0])] : [$path, null]; }; $splitPath = function ($path) { $result = []; foreach (\explode('/', \trim($path, '/')) as $segment) { if ('..' === $segment) { \array_pop($result); } elseif ('.' !== $segment && '' !== $segment) { $result[] = $segment; } } return $result; }; [$endPath, $endDriveLetter] = $splitDriveLetter($endPath); [$startPath, $startDriveLetter] = $splitDriveLetter($startPath); $startPathArr = $splitPath($startPath); $endPathArr = $splitPath($endPath); if ($endDriveLetter && $startDriveLetter && $endDriveLetter != $startDriveLetter) { // End path is on another drive, so no relative path exists return $endDriveLetter . ':/' . ($endPathArr ? \implode('/', $endPathArr) . '/' : ''); } // Find for which directory the common path stops $index = 0; while (isset($startPathArr[$index]) && isset($endPathArr[$index]) && $startPathArr[$index] === $endPathArr[$index]) { ++$index; } // Determine how deep the start path is relative to the common path (ie, "web/bundles" = 2 levels) if (1 === \count($startPathArr) && '' === $startPathArr[0]) { $depth = 0; } else { $depth = \count($startPathArr) - $index; } // Repeated "../" for each level need to reach the common path $traverser = \str_repeat('../', $depth); $endPathRemainder = \implode('/', \array_slice($endPathArr, $index)); // Construct $endPath from traversing to the common path, then to the remaining $endPath $relativePath = $traverser . ('' !== $endPathRemainder ? $endPathRemainder . '/' : ''); return '' === $relativePath ? './' : $relativePath; } /** * Mirrors a directory to another. * * Copies files and directories from the origin directory into the target directory. By default: * * - existing files in the target directory will be overwritten, except if they are newer (see the `override` option) * - files in the target directory that do not exist in the source directory will not be deleted (see the `delete` option) * * @param \Traversable|null $iterator Iterator that filters which files and directories to copy, if null a recursive iterator is created * @param array $options An array of boolean options * Valid options are: * - $options['override'] If true, target files newer than origin files are overwritten (see copy(), defaults to false) * - $options['copy_on_windows'] Whether to copy files instead of links on Windows (see symlink(), defaults to false) * - $options['delete'] Whether to delete files that are not in the source directory (defaults to false) * * @throws IOException When file type is unknown */ public function mirror(string $originDir, string $targetDir, \Traversable $iterator = null, array $options = []) { $targetDir = \rtrim($targetDir, '/\\'); $originDir = \rtrim($originDir, '/\\'); $originDirLen = \strlen($originDir); if (!$this->exists($originDir)) { throw new IOException(\sprintf('The origin directory specified "%s" was not found.', $originDir), 0, null, $originDir); } // Iterate in destination folder to remove obsolete entries if ($this->exists($targetDir) && isset($options['delete']) && $options['delete']) { $deleteIterator = $iterator; if (null === $deleteIterator) { $flags = \FilesystemIterator::SKIP_DOTS; $deleteIterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($targetDir, $flags), \RecursiveIteratorIterator::CHILD_FIRST); } $targetDirLen = \strlen($targetDir); foreach ($deleteIterator as $file) { $origin = $originDir . \substr($file->getPathname(), $targetDirLen); if (!$this->exists($origin)) { $this->remove($file); } } } $copyOnWindows = $options['copy_on_windows'] ?? \false; if (null === $iterator) { $flags = $copyOnWindows ? \FilesystemIterator::SKIP_DOTS | \FilesystemIterator::FOLLOW_SYMLINKS : \FilesystemIterator::SKIP_DOTS; $iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($originDir, $flags), \RecursiveIteratorIterator::SELF_FIRST); } $this->mkdir($targetDir); $filesCreatedWhileMirroring = []; foreach ($iterator as $file) { if ($file->getPathname() === $targetDir || $file->getRealPath() === $targetDir || isset($filesCreatedWhileMirroring[$file->getRealPath()])) { continue; } $target = $targetDir . \substr($file->getPathname(), $originDirLen); $filesCreatedWhileMirroring[$target] = \true; if (!$copyOnWindows && \is_link($file)) { $this->symlink($file->getLinkTarget(), $target); } elseif (\is_dir($file)) { $this->mkdir($target); } elseif (\is_file($file)) { $this->copy($file, $target, $options['override'] ?? \false); } else { throw new IOException(\sprintf('Unable to guess "%s" file type.', $file), 0, null, $file); } } } /** * Returns whether the file path is an absolute path. * * @return bool */ public function isAbsolutePath(string $file) { return '' !== $file && (\strspn($file, '/\\', 0, 1) || \strlen($file) > 3 && \ctype_alpha($file[0]) && ':' === $file[1] && \strspn($file, '/\\', 2, 1) || null !== \parse_url($file, \PHP_URL_SCHEME)); } /** * Creates a temporary file with support for custom stream wrappers. * * @param string $prefix The prefix of the generated temporary filename * Note: Windows uses only the first three characters of prefix * @param string $suffix The suffix of the generated temporary filename * * @return string The new temporary filename (with path), or throw an exception on failure */ public function tempnam(string $dir, string $prefix) { $suffix = \func_num_args() > 2 ? \func_get_arg(2) : ''; [$scheme, $hierarchy] = $this->getSchemeAndHierarchy($dir); // If no scheme or scheme is "file" or "gs" (Google Cloud) create temp file in local filesystem if ((null === $scheme || 'file' === $scheme || 'gs' === $scheme) && '' === $suffix) { // If tempnam failed or no scheme return the filename otherwise prepend the scheme if ($tmpFile = self::box('tempnam', $hierarchy, $prefix)) { if (null !== $scheme && 'gs' !== $scheme) { return $scheme . '://' . $tmpFile; } return $tmpFile; } throw new IOException('A temporary file could not be created: ' . self::$lastError); } // Loop until we create a valid temp file or have reached 10 attempts for ($i = 0; $i < 10; ++$i) { // Create a unique filename $tmpFile = $dir . '/' . $prefix . \uniqid(\mt_rand(), \true) . $suffix; // Use fopen instead of file_exists as some streams do not support stat // Use mode 'x+' to atomically check existence and create to avoid a TOCTOU vulnerability if (!($handle = self::box('fopen', $tmpFile, 'x+'))) { continue; } // Close the file if it was successfully opened self::box('fclose', $handle); return $tmpFile; } throw new IOException('A temporary file could not be created: ' . self::$lastError); } /** * Atomically dumps content into a file. * * @param string|resource $content The data to write into the file * * @throws IOException if the file cannot be written to */ public function dumpFile(string $filename, $content) { if (\is_array($content)) { throw new \TypeError(\sprintf('Argument 2 passed to "%s()" must be string or resource, array given.', __METHOD__)); } $dir = \dirname($filename); if (!\is_dir($dir)) { $this->mkdir($dir); } // Will create a temp file with 0600 access rights // when the filesystem supports chmod. $tmpFile = $this->tempnam($dir, \basename($filename)); try { if (\false === self::box('file_put_contents', $tmpFile, $content)) { throw new IOException(\sprintf('Failed to write file "%s": ', $filename) . self::$lastError, 0, null, $filename); } self::box('chmod', $tmpFile, \file_exists($filename) ? \fileperms($filename) : 0666 & ~\umask()); $this->rename($tmpFile, $filename, \true); } finally { if (\file_exists($tmpFile)) { self::box('unlink', $tmpFile); } } } /** * Appends content to an existing file. * * @param string|resource $content The content to append * @param bool $lock Whether the file should be locked when writing to it * * @throws IOException If the file is not writable */ public function appendToFile(string $filename, $content) { if (\is_array($content)) { throw new \TypeError(\sprintf('Argument 2 passed to "%s()" must be string or resource, array given.', __METHOD__)); } $dir = \dirname($filename); if (!\is_dir($dir)) { $this->mkdir($dir); } $lock = \func_num_args() > 2 && \func_get_arg(2); if (\false === self::box('file_put_contents', $filename, $content, \FILE_APPEND | ($lock ? \LOCK_EX : 0))) { throw new IOException(\sprintf('Failed to write file "%s": ', $filename) . self::$lastError, 0, null, $filename); } } private function toIterable($files) : iterable { return \is_iterable($files) ? $files : [$files]; } /** * Gets a 2-tuple of scheme (may be null) and hierarchical part of a filename (e.g. file:///tmp -> [file, tmp]). */ private function getSchemeAndHierarchy(string $filename) : array { $components = \explode('://', $filename, 2); return 2 === \count($components) ? [$components[0], $components[1]] : [null, $components[0]]; } private static function assertFunctionExists(string $func) : void { if (!\function_exists($func)) { throw new IOException(\sprintf('Unable to perform filesystem operation because the "%s()" function has been disabled.', $func)); } } /** * @param mixed ...$args * * @return mixed */ private static function box(string $func, ...$args) { self::assertFunctionExists($func); self::$lastError = null; \set_error_handler(__CLASS__ . '::handleError'); try { return $func(...$args); } finally { \restore_error_handler(); } } /** * @internal */ public static function handleError(int $type, string $msg) { self::$lastError = $msg; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Polyfill\Intl\Grapheme; \define('_HumbugBox1cb33d1f20f1\\SYMFONY_GRAPHEME_CLUSTER_RX', ((float) \PCRE_VERSION < 10 ? (float) \PCRE_VERSION >= 8.32 : (float) \PCRE_VERSION >= 10.39) ? '\\X' : Grapheme::GRAPHEME_CLUSTER_RX); /** * Partial intl implementation in pure PHP. * * Implemented: * - grapheme_extract - Extract a sequence of grapheme clusters from a text buffer, which must be encoded in UTF-8 * - grapheme_stripos - Find position (in grapheme units) of first occurrence of a case-insensitive string * - grapheme_stristr - Returns part of haystack string from the first occurrence of case-insensitive needle to the end of haystack * - grapheme_strlen - Get string length in grapheme units * - grapheme_strpos - Find position (in grapheme units) of first occurrence of a string * - grapheme_strripos - Find position (in grapheme units) of last occurrence of a case-insensitive string * - grapheme_strrpos - Find position (in grapheme units) of last occurrence of a string * - grapheme_strstr - Returns part of haystack string from the first occurrence of needle to the end of haystack * - grapheme_substr - Return part of a string * * @author Nicolas Grekas * * @internal */ final class Grapheme { // (CRLF|([ZWNJ-ZWJ]|T+|L*(LV?V+|LV|LVT)T*|L+|[^Control])[Extend]*|[Control]) // This regular expression is a work around for http://bugs.exim.org/1279 public const GRAPHEME_CLUSTER_RX = '(?:\\r\\n|(?:[ -~\\x{200C}\\x{200D}]|[ᆨ-ᇹ]+|[ᄀ-ᅟ]*(?:[가개갸걔거게겨계고과괘괴교구궈궤귀규그긔기까깨꺄꺠꺼께껴꼐꼬꽈꽤꾀꾜꾸꿔꿰뀌뀨끄끠끼나내냐냬너네녀녜노놔놰뇌뇨누눠눼뉘뉴느늬니다대댜댸더데뎌뎨도돠돼되됴두둬뒈뒤듀드듸디따때땨떄떠떼뗘뗴또똬뙈뙤뚀뚜뚸뛔뛰뜌뜨띄띠라래랴럐러레려례로롸뢔뢰료루뤄뤠뤼류르릐리마매먀먜머메며몌모뫄뫠뫼묘무뭐뭬뮈뮤므믜미바배뱌뱨버베벼볘보봐봬뵈뵤부붜붸뷔뷰브븨비빠빼뺘뺴뻐뻬뼈뼤뽀뽜뽸뾔뾰뿌뿨쀄쀠쀼쁘쁴삐사새샤섀서세셔셰소솨쇄쇠쇼수숴쉐쉬슈스싀시싸쌔쌰썌써쎄쎠쎼쏘쏴쐐쐬쑈쑤쒀쒜쒸쓔쓰씌씨아애야얘어에여예오와왜외요우워웨위유으의이자재쟈쟤저제져졔조좌좨죄죠주줘줴쥐쥬즈즤지짜째쨔쨰쩌쩨쪄쪠쪼쫘쫴쬐쬬쭈쭤쮀쮜쮸쯔쯰찌차채챠챼처체쳐쳬초촤쵀최쵸추춰췌취츄츠츼치카캐캬컈커케켜켸코콰쾌쾨쿄쿠쿼퀘퀴큐크킈키타태탸턔터테텨톄토톼퇘퇴툐투퉈퉤튀튜트틔티파패퍄퍠퍼페펴폐포퐈퐤푀표푸풔풰퓌퓨프픠피하해햐햬허헤혀혜호화홰회효후훠훼휘휴흐희히]?[ᅠ-ᆢ]+|[가-힣])[ᆨ-ᇹ]*|[ᄀ-ᅟ]+|[^\\p{Cc}\\p{Cf}\\p{Zl}\\p{Zp}])[\\p{Mn}\\p{Me}\\x{09BE}\\x{09D7}\\x{0B3E}\\x{0B57}\\x{0BBE}\\x{0BD7}\\x{0CC2}\\x{0CD5}\\x{0CD6}\\x{0D3E}\\x{0D57}\\x{0DCF}\\x{0DDF}\\x{200C}\\x{200D}\\x{1D165}\\x{1D16E}-\\x{1D172}]*|[\\p{Cc}\\p{Cf}\\p{Zl}\\p{Zp}])'; private const CASE_FOLD = [['µ', 'ſ', "ͅ", 'ς', "ϐ", "ϑ", "ϕ", "ϖ", "ϰ", "ϱ", "ϵ", "ẛ", "ι"], ['μ', 's', 'ι', 'σ', 'β', 'θ', 'φ', 'π', 'κ', 'ρ', 'ε', "ṡ", 'ι']]; public static function grapheme_extract($s, $size, $type = \GRAPHEME_EXTR_COUNT, $start = 0, &$next = 0) { if (0 > $start) { $start = \strlen($s) + $start; } if (!\is_scalar($s)) { $hasError = \false; \set_error_handler(function () use(&$hasError) { $hasError = \true; }); $next = \substr($s, $start); \restore_error_handler(); if ($hasError) { \substr($s, $start); $s = ''; } else { $s = $next; } } else { $s = \substr($s, $start); } $size = (int) $size; $type = (int) $type; $start = (int) $start; if (\GRAPHEME_EXTR_COUNT !== $type && \GRAPHEME_EXTR_MAXBYTES !== $type && \GRAPHEME_EXTR_MAXCHARS !== $type) { if (80000 > \PHP_VERSION_ID) { return \false; } throw new \ValueError('grapheme_extract(): Argument #3 ($type) must be one of GRAPHEME_EXTR_COUNT, GRAPHEME_EXTR_MAXBYTES, or GRAPHEME_EXTR_MAXCHARS'); } if (!isset($s[0]) || 0 > $size || 0 > $start) { return \false; } if (0 === $size) { return ''; } $next = $start; $s = \preg_split('/(' . SYMFONY_GRAPHEME_CLUSTER_RX . ')/u', "\r\n" . $s, $size + 1, \PREG_SPLIT_NO_EMPTY | \PREG_SPLIT_DELIM_CAPTURE); if (!isset($s[1])) { return \false; } $i = 1; $ret = ''; do { if (\GRAPHEME_EXTR_COUNT === $type) { --$size; } elseif (\GRAPHEME_EXTR_MAXBYTES === $type) { $size -= \strlen($s[$i]); } else { $size -= \iconv_strlen($s[$i], 'UTF-8//IGNORE'); } if ($size >= 0) { $ret .= $s[$i]; } } while (isset($s[++$i]) && $size > 0); $next += \strlen($ret); return $ret; } public static function grapheme_strlen($s) { \preg_replace('/' . SYMFONY_GRAPHEME_CLUSTER_RX . '/u', '', $s, -1, $len); return 0 === $len && '' !== $s ? null : $len; } public static function grapheme_substr($s, $start, $len = null) { if (null === $len) { $len = 2147483647; } \preg_match_all('/' . SYMFONY_GRAPHEME_CLUSTER_RX . '/u', $s, $s); $slen = \count($s[0]); $start = (int) $start; if (0 > $start) { $start += $slen; } if (0 > $start) { if (\PHP_VERSION_ID < 80000) { return \false; } $start = 0; } if ($start >= $slen) { return \PHP_VERSION_ID >= 80000 ? '' : \false; } $rem = $slen - $start; if (0 > $len) { $len += $rem; } if (0 === $len) { return ''; } if (0 > $len) { return \PHP_VERSION_ID >= 80000 ? '' : \false; } if ($len > $rem) { $len = $rem; } return \implode('', \array_slice($s[0], $start, $len)); } public static function grapheme_strpos($s, $needle, $offset = 0) { return self::grapheme_position($s, $needle, $offset, 0); } public static function grapheme_stripos($s, $needle, $offset = 0) { return self::grapheme_position($s, $needle, $offset, 1); } public static function grapheme_strrpos($s, $needle, $offset = 0) { return self::grapheme_position($s, $needle, $offset, 2); } public static function grapheme_strripos($s, $needle, $offset = 0) { return self::grapheme_position($s, $needle, $offset, 3); } public static function grapheme_stristr($s, $needle, $beforeNeedle = \false) { return \mb_stristr($s, $needle, $beforeNeedle, 'UTF-8'); } public static function grapheme_strstr($s, $needle, $beforeNeedle = \false) { return \mb_strstr($s, $needle, $beforeNeedle, 'UTF-8'); } private static function grapheme_position($s, $needle, $offset, $mode) { $needle = (string) $needle; if (80000 > \PHP_VERSION_ID && !\preg_match('/./us', $needle)) { return \false; } $s = (string) $s; if (!\preg_match('/./us', $s)) { return \false; } if ($offset > 0) { $s = self::grapheme_substr($s, $offset); } elseif ($offset < 0) { if (2 > $mode) { $offset += self::grapheme_strlen($s); $s = self::grapheme_substr($s, $offset); if (0 > $offset) { $offset = 0; } } elseif (0 > ($offset += self::grapheme_strlen($needle))) { $s = self::grapheme_substr($s, 0, $offset); $offset = 0; } else { $offset = 0; } } // As UTF-8 is self-synchronizing, and we have ensured the strings are valid UTF-8, // we can use normal binary string functions here. For case-insensitive searches, // case fold the strings first. $caseInsensitive = $mode & 1; $reverse = $mode & 2; if ($caseInsensitive) { // Use the same case folding mode as mbstring does for mb_stripos(). // Stick to SIMPLE case folding to avoid changing the length of the string, which // might result in offsets being shifted. $mode = \defined('MB_CASE_FOLD_SIMPLE') ? \MB_CASE_FOLD_SIMPLE : \MB_CASE_LOWER; $s = \mb_convert_case($s, $mode, 'UTF-8'); $needle = \mb_convert_case($needle, $mode, 'UTF-8'); if (!\defined('MB_CASE_FOLD_SIMPLE')) { $s = \str_replace(self::CASE_FOLD[0], self::CASE_FOLD[1], $s); $needle = \str_replace(self::CASE_FOLD[0], self::CASE_FOLD[1], $needle); } } if ($reverse) { $needlePos = \strrpos($s, $needle); } else { $needlePos = \strpos($s, $needle); } return \false !== $needlePos ? self::grapheme_strlen(\substr($s, 0, $needlePos)) + $offset : \false; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ use _HumbugBox1cb33d1f20f1\Symfony\Polyfill\Intl\Grapheme as p; if (\extension_loaded('intl')) { return; } if (\PHP_VERSION_ID >= 80000) { return require __DIR__ . '/bootstrap80.php'; } if (!\defined('GRAPHEME_EXTR_COUNT')) { \define('GRAPHEME_EXTR_COUNT', 0); } if (!\defined('GRAPHEME_EXTR_MAXBYTES')) { \define('GRAPHEME_EXTR_MAXBYTES', 1); } if (!\defined('GRAPHEME_EXTR_MAXCHARS')) { \define('GRAPHEME_EXTR_MAXCHARS', 2); } if (!\function_exists('grapheme_extract')) { function grapheme_extract($haystack, $size, $type = 0, $start = 0, &$next = 0) { return p\Grapheme::grapheme_extract($haystack, $size, $type, $start, $next); } } if (!\function_exists('grapheme_stripos')) { function grapheme_stripos($haystack, $needle, $offset = 0) { return p\Grapheme::grapheme_stripos($haystack, $needle, $offset); } } if (!\function_exists('grapheme_stristr')) { function grapheme_stristr($haystack, $needle, $beforeNeedle = \false) { return p\Grapheme::grapheme_stristr($haystack, $needle, $beforeNeedle); } } if (!\function_exists('grapheme_strlen')) { function grapheme_strlen($input) { return p\Grapheme::grapheme_strlen($input); } } if (!\function_exists('grapheme_strpos')) { function grapheme_strpos($haystack, $needle, $offset = 0) { return p\Grapheme::grapheme_strpos($haystack, $needle, $offset); } } if (!\function_exists('grapheme_strripos')) { function grapheme_strripos($haystack, $needle, $offset = 0) { return p\Grapheme::grapheme_strripos($haystack, $needle, $offset); } } if (!\function_exists('grapheme_strrpos')) { function grapheme_strrpos($haystack, $needle, $offset = 0) { return p\Grapheme::grapheme_strrpos($haystack, $needle, $offset); } } if (!\function_exists('grapheme_strstr')) { function grapheme_strstr($haystack, $needle, $beforeNeedle = \false) { return p\Grapheme::grapheme_strstr($haystack, $needle, $beforeNeedle); } } if (!\function_exists('grapheme_substr')) { function grapheme_substr($string, $offset, $length = null) { return p\Grapheme::grapheme_substr($string, $offset, $length); } } Copyright (c) 2015-2019 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. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ use _HumbugBox1cb33d1f20f1\Symfony\Polyfill\Intl\Grapheme as p; if (!\defined('GRAPHEME_EXTR_COUNT')) { \define('GRAPHEME_EXTR_COUNT', 0); } if (!\defined('GRAPHEME_EXTR_MAXBYTES')) { \define('GRAPHEME_EXTR_MAXBYTES', 1); } if (!\defined('GRAPHEME_EXTR_MAXCHARS')) { \define('GRAPHEME_EXTR_MAXCHARS', 2); } if (!\function_exists('grapheme_extract')) { function grapheme_extract(?string $haystack, ?int $size, ?int $type = \GRAPHEME_EXTR_COUNT, ?int $offset = 0, &$next = null) : string|false { return p\Grapheme::grapheme_extract((string) $haystack, (int) $size, (int) $type, (int) $offset, $next); } } if (!\function_exists('grapheme_stripos')) { function grapheme_stripos(?string $haystack, ?string $needle, ?int $offset = 0) : int|false { return p\Grapheme::grapheme_stripos((string) $haystack, (string) $needle, (int) $offset); } } if (!\function_exists('grapheme_stristr')) { function grapheme_stristr(?string $haystack, ?string $needle, ?bool $beforeNeedle = \false) : string|false { return p\Grapheme::grapheme_stristr((string) $haystack, (string) $needle, (bool) $beforeNeedle); } } if (!\function_exists('grapheme_strlen')) { function grapheme_strlen(?string $string) : int|false|null { return p\Grapheme::grapheme_strlen((string) $string); } } if (!\function_exists('grapheme_strpos')) { function grapheme_strpos(?string $haystack, ?string $needle, ?int $offset = 0) : int|false { return p\Grapheme::grapheme_strpos((string) $haystack, (string) $needle, (int) $offset); } } if (!\function_exists('grapheme_strripos')) { function grapheme_strripos(?string $haystack, ?string $needle, ?int $offset = 0) : int|false { return p\Grapheme::grapheme_strripos((string) $haystack, (string) $needle, (int) $offset); } } if (!\function_exists('grapheme_strrpos')) { function grapheme_strrpos(?string $haystack, ?string $needle, ?int $offset = 0) : int|false { return p\Grapheme::grapheme_strrpos((string) $haystack, (string) $needle, (int) $offset); } } if (!\function_exists('grapheme_strstr')) { function grapheme_strstr(?string $haystack, ?string $needle, ?bool $beforeNeedle = \false) : string|false { return p\Grapheme::grapheme_strstr((string) $haystack, (string) $needle, (bool) $beforeNeedle); } } if (!\function_exists('grapheme_substr')) { function grapheme_substr(?string $string, ?int $offset, ?int $length = null) : string|false { return p\Grapheme::grapheme_substr((string) $string, (int) $offset, $length); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ use _HumbugBox1cb33d1f20f1\Symfony\Polyfill\Intl\Normalizer as p; if (\PHP_VERSION_ID >= 80000) { return require __DIR__ . '/bootstrap80.php'; } if (!\function_exists('normalizer_is_normalized')) { function normalizer_is_normalized($string, $form = p\Normalizer::FORM_C) { return p\Normalizer::isNormalized($string, $form); } } if (!\function_exists('normalizer_normalize')) { function normalizer_normalize($string, $form = p\Normalizer::FORM_C) { return p\Normalizer::normalize($string, $form); } } Copyright (c) 2015-2019 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. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Polyfill\Intl\Normalizer; /** * Normalizer is a PHP fallback implementation of the Normalizer class provided by the intl extension. * * It has been validated with Unicode 6.3 Normalization Conformance Test. * See http://www.unicode.org/reports/tr15/ for detailed info about Unicode normalizations. * * @author Nicolas Grekas * * @internal */ class Normalizer { public const FORM_D = \Normalizer::FORM_D; public const FORM_KD = \Normalizer::FORM_KD; public const FORM_C = \Normalizer::FORM_C; public const FORM_KC = \Normalizer::FORM_KC; public const NFD = \Normalizer::NFD; public const NFKD = \Normalizer::NFKD; public const NFC = \Normalizer::NFC; public const NFKC = \Normalizer::NFKC; private static $C; private static $D; private static $KD; private static $cC; private static $ulenMask = ["\xc0" => 2, "\xd0" => 2, "\xe0" => 3, "\xf0" => 4]; private static $ASCII = " eiasntrolud][cmp'\ng|hv.fb,:=-q10C2*yx)(L9AS/P\"EjMIk3>5T \PHP_VERSION_ID) { return \false; } throw new \ValueError('normalizer_normalize(): Argument #2 ($form) must be a a valid normalization form'); } if ('' === $s) { return ''; } if ($K && null === self::$KD) { self::$KD = self::getData('compatibilityDecomposition'); } if (null === self::$D) { self::$D = self::getData('canonicalDecomposition'); self::$cC = self::getData('combiningClass'); } if (null !== ($mbEncoding = 2 & (int) \ini_get('mbstring.func_overload') ? \mb_internal_encoding() : null)) { \mb_internal_encoding('8bit'); } $r = self::decompose($s, $K); if ($C) { if (null === self::$C) { self::$C = self::getData('canonicalComposition'); } $r = self::recompose($r); } if (null !== $mbEncoding) { \mb_internal_encoding($mbEncoding); } return $r; } private static function recompose($s) { $ASCII = self::$ASCII; $compMap = self::$C; $combClass = self::$cC; $ulenMask = self::$ulenMask; $result = $tail = ''; $i = $s[0] < "\x80" ? 1 : $ulenMask[$s[0] & "\xf0"]; $len = \strlen($s); $lastUchr = \substr($s, 0, $i); $lastUcls = isset($combClass[$lastUchr]) ? 256 : 0; while ($i < $len) { if ($s[$i] < "\x80") { // ASCII chars if ($tail) { $lastUchr .= $tail; $tail = ''; } if ($j = \strspn($s, $ASCII, $i + 1)) { $lastUchr .= \substr($s, $i, $j); $i += $j; } $result .= $lastUchr; $lastUchr = $s[$i]; $lastUcls = 0; ++$i; continue; } $ulen = $ulenMask[$s[$i] & "\xf0"]; $uchr = \substr($s, $i, $ulen); if ($lastUchr < "ᄀ" || "ᄒ" < $lastUchr || $uchr < "ᅡ" || "ᅵ" < $uchr || $lastUcls) { // Table lookup and combining chars composition $ucls = $combClass[$uchr] ?? 0; if (isset($compMap[$lastUchr . $uchr]) && (!$lastUcls || $lastUcls < $ucls)) { $lastUchr = $compMap[$lastUchr . $uchr]; } elseif ($lastUcls = $ucls) { $tail .= $uchr; } else { if ($tail) { $lastUchr .= $tail; $tail = ''; } $result .= $lastUchr; $lastUchr = $uchr; } } else { // Hangul chars $L = \ord($lastUchr[2]) - 0x80; $V = \ord($uchr[2]) - 0xa1; $T = 0; $uchr = \substr($s, $i + $ulen, 3); if ("ᆧ" <= $uchr && $uchr <= "ᇂ") { $T = \ord($uchr[2]) - 0xa7; 0 > $T && ($T += 0x40); $ulen += 3; } $L = 0xac00 + ($L * 21 + $V) * 28 + $T; $lastUchr = \chr(0xe0 | $L >> 12) . \chr(0x80 | $L >> 6 & 0x3f) . \chr(0x80 | $L & 0x3f); } $i += $ulen; } return $result . $lastUchr . $tail; } private static function decompose($s, $c) { $result = ''; $ASCII = self::$ASCII; $decompMap = self::$D; $combClass = self::$cC; $ulenMask = self::$ulenMask; if ($c) { $compatMap = self::$KD; } $c = []; $i = 0; $len = \strlen($s); while ($i < $len) { if ($s[$i] < "\x80") { // ASCII chars if ($c) { \ksort($c); $result .= \implode('', $c); $c = []; } $j = 1 + \strspn($s, $ASCII, $i + 1); $result .= \substr($s, $i, $j); $i += $j; continue; } $ulen = $ulenMask[$s[$i] & "\xf0"]; $uchr = \substr($s, $i, $ulen); $i += $ulen; if ($uchr < "가" || "힣" < $uchr) { // Table lookup if ($uchr !== ($j = $compatMap[$uchr] ?? $decompMap[$uchr] ?? $uchr)) { $uchr = $j; $j = \strlen($uchr); $ulen = $uchr[0] < "\x80" ? 1 : $ulenMask[$uchr[0] & "\xf0"]; if ($ulen != $j) { // Put trailing chars in $s $j -= $ulen; $i -= $j; if (0 > $i) { $s = \str_repeat(' ', -$i) . $s; $len -= $i; $i = 0; } while ($j--) { $s[$i + $j] = $uchr[$ulen + $j]; } $uchr = \substr($uchr, 0, $ulen); } } if (isset($combClass[$uchr])) { // Combining chars, for sorting if (!isset($c[$combClass[$uchr]])) { $c[$combClass[$uchr]] = ''; } $c[$combClass[$uchr]] .= $uchr; continue; } } else { // Hangul chars $uchr = \unpack('C*', $uchr); $j = ($uchr[1] - 224 << 12) + ($uchr[2] - 128 << 6) + $uchr[3] - 0xac80; $uchr = "\xe1\x84" . \chr(0x80 + (int) ($j / 588)) . "\xe1\x85" . \chr(0xa1 + (int) ($j % 588 / 28)); if ($j %= 28) { $uchr .= $j < 25 ? "\xe1\x86" . \chr(0xa7 + $j) : "\xe1\x87" . \chr(0x67 + $j); } } if ($c) { \ksort($c); $result .= \implode('', $c); $c = []; } $result .= $uchr; } if ($c) { \ksort($c); $result .= \implode('', $c); } return $result; } private static function getData($file) { if (\file_exists($file = __DIR__ . '/Resources/unidata/' . $file . '.php')) { return require $file; } return \false; } } ' ', '¨' => ' ̈', 'ª' => 'a', '¯' => ' ̄', '²' => '2', '³' => '3', '´' => ' ́', 'µ' => 'μ', '¸' => ' ̧', '¹' => '1', 'º' => 'o', '¼' => '1⁄4', '½' => '1⁄2', '¾' => '3⁄4', 'IJ' => 'IJ', 'ij' => 'ij', 'Ŀ' => 'L·', 'ŀ' => 'l·', 'ʼn' => 'ʼn', 'ſ' => 's', 'DŽ' => 'DŽ', 'Dž' => 'Dž', 'dž' => 'dž', 'LJ' => 'LJ', 'Lj' => 'Lj', 'lj' => 'lj', 'NJ' => 'NJ', 'Nj' => 'Nj', 'nj' => 'nj', 'DZ' => 'DZ', 'Dz' => 'Dz', 'dz' => 'dz', 'ʰ' => 'h', 'ʱ' => 'ɦ', 'ʲ' => 'j', 'ʳ' => 'r', 'ʴ' => 'ɹ', 'ʵ' => 'ɻ', 'ʶ' => 'ʁ', 'ʷ' => 'w', 'ʸ' => 'y', '˘' => ' ̆', '˙' => ' ̇', '˚' => ' ̊', '˛' => ' ̨', '˜' => ' ̃', '˝' => ' ̋', 'ˠ' => 'ɣ', 'ˡ' => 'l', 'ˢ' => 's', 'ˣ' => 'x', 'ˤ' => 'ʕ', 'ͺ' => ' ͅ', '΄' => ' ́', '΅' => ' ̈́', 'ϐ' => 'β', 'ϑ' => 'θ', 'ϒ' => 'Υ', 'ϓ' => 'Ύ', 'ϔ' => 'Ϋ', 'ϕ' => 'φ', 'ϖ' => 'π', 'ϰ' => 'κ', 'ϱ' => 'ρ', 'ϲ' => 'ς', 'ϴ' => 'Θ', 'ϵ' => 'ε', 'Ϲ' => 'Σ', 'և' => 'եւ', 'ٵ' => 'اٴ', 'ٶ' => 'وٴ', 'ٷ' => 'ۇٴ', 'ٸ' => 'يٴ', 'ำ' => 'ํา', 'ຳ' => 'ໍາ', 'ໜ' => 'ຫນ', 'ໝ' => 'ຫມ', '༌' => '་', 'ཷ' => 'ྲཱྀ', 'ཹ' => 'ླཱྀ', 'ჼ' => 'ნ', 'ᴬ' => 'A', 'ᴭ' => 'Æ', 'ᴮ' => 'B', 'ᴰ' => 'D', 'ᴱ' => 'E', 'ᴲ' => 'Ǝ', 'ᴳ' => 'G', 'ᴴ' => 'H', 'ᴵ' => 'I', 'ᴶ' => 'J', 'ᴷ' => 'K', 'ᴸ' => 'L', 'ᴹ' => 'M', 'ᴺ' => 'N', 'ᴼ' => 'O', 'ᴽ' => 'Ȣ', 'ᴾ' => 'P', 'ᴿ' => 'R', 'ᵀ' => 'T', 'ᵁ' => 'U', 'ᵂ' => 'W', 'ᵃ' => 'a', 'ᵄ' => 'ɐ', 'ᵅ' => 'ɑ', 'ᵆ' => 'ᴂ', 'ᵇ' => 'b', 'ᵈ' => 'd', 'ᵉ' => 'e', 'ᵊ' => 'ə', 'ᵋ' => 'ɛ', 'ᵌ' => 'ɜ', 'ᵍ' => 'g', 'ᵏ' => 'k', 'ᵐ' => 'm', 'ᵑ' => 'ŋ', 'ᵒ' => 'o', 'ᵓ' => 'ɔ', 'ᵔ' => 'ᴖ', 'ᵕ' => 'ᴗ', 'ᵖ' => 'p', 'ᵗ' => 't', 'ᵘ' => 'u', 'ᵙ' => 'ᴝ', 'ᵚ' => 'ɯ', 'ᵛ' => 'v', 'ᵜ' => 'ᴥ', 'ᵝ' => 'β', 'ᵞ' => 'γ', 'ᵟ' => 'δ', 'ᵠ' => 'φ', 'ᵡ' => 'χ', 'ᵢ' => 'i', 'ᵣ' => 'r', 'ᵤ' => 'u', 'ᵥ' => 'v', 'ᵦ' => 'β', 'ᵧ' => 'γ', 'ᵨ' => 'ρ', 'ᵩ' => 'φ', 'ᵪ' => 'χ', 'ᵸ' => 'н', 'ᶛ' => 'ɒ', 'ᶜ' => 'c', 'ᶝ' => 'ɕ', 'ᶞ' => 'ð', 'ᶟ' => 'ɜ', 'ᶠ' => 'f', 'ᶡ' => 'ɟ', 'ᶢ' => 'ɡ', 'ᶣ' => 'ɥ', 'ᶤ' => 'ɨ', 'ᶥ' => 'ɩ', 'ᶦ' => 'ɪ', 'ᶧ' => 'ᵻ', 'ᶨ' => 'ʝ', 'ᶩ' => 'ɭ', 'ᶪ' => 'ᶅ', 'ᶫ' => 'ʟ', 'ᶬ' => 'ɱ', 'ᶭ' => 'ɰ', 'ᶮ' => 'ɲ', 'ᶯ' => 'ɳ', 'ᶰ' => 'ɴ', 'ᶱ' => 'ɵ', 'ᶲ' => 'ɸ', 'ᶳ' => 'ʂ', 'ᶴ' => 'ʃ', 'ᶵ' => 'ƫ', 'ᶶ' => 'ʉ', 'ᶷ' => 'ʊ', 'ᶸ' => 'ᴜ', 'ᶹ' => 'ʋ', 'ᶺ' => 'ʌ', 'ᶻ' => 'z', 'ᶼ' => 'ʐ', 'ᶽ' => 'ʑ', 'ᶾ' => 'ʒ', 'ᶿ' => 'θ', 'ẚ' => 'aʾ', 'ẛ' => 'ṡ', '᾽' => ' ̓', '᾿' => ' ̓', '῀' => ' ͂', '῁' => ' ̈͂', '῍' => ' ̓̀', '῎' => ' ̓́', '῏' => ' ̓͂', '῝' => ' ̔̀', '῞' => ' ̔́', '῟' => ' ̔͂', '῭' => ' ̈̀', '΅' => ' ̈́', '´' => ' ́', '῾' => ' ̔', ' ' => ' ', ' ' => ' ', ' ' => ' ', ' ' => ' ', ' ' => ' ', ' ' => ' ', ' ' => ' ', ' ' => ' ', ' ' => ' ', ' ' => ' ', ' ' => ' ', '‑' => '‐', '‗' => ' ̳', '․' => '.', '‥' => '..', '…' => '...', ' ' => ' ', '″' => '′′', '‴' => '′′′', '‶' => '‵‵', '‷' => '‵‵‵', '‼' => '!!', '‾' => ' ̅', '⁇' => '??', '⁈' => '?!', '⁉' => '!?', '⁗' => '′′′′', ' ' => ' ', '⁰' => '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', '₨' => 'Rs', '℀' => 'a/c', '℁' => 'a/s', 'ℂ' => 'C', '℃' => '°C', '℅' => 'c/o', '℆' => 'c/u', 'ℇ' => 'Ɛ', '℉' => '°F', 'ℊ' => 'g', 'ℋ' => 'H', 'ℌ' => 'H', 'ℍ' => 'H', 'ℎ' => 'h', 'ℏ' => 'ħ', 'ℐ' => 'I', 'ℑ' => 'I', 'ℒ' => 'L', 'ℓ' => 'l', 'ℕ' => 'N', '№' => 'No', 'ℙ' => 'P', 'ℚ' => 'Q', 'ℛ' => 'R', 'ℜ' => 'R', 'ℝ' => 'R', '℠' => 'SM', '℡' => 'TEL', '™' => 'TM', 'ℤ' => 'Z', 'ℨ' => 'Z', 'ℬ' => 'B', 'ℭ' => 'C', 'ℯ' => 'e', 'ℰ' => 'E', 'ℱ' => 'F', 'ℳ' => 'M', 'ℴ' => 'o', 'ℵ' => 'א', 'ℶ' => 'ב', 'ℷ' => 'ג', 'ℸ' => 'ד', 'ℹ' => 'i', '℻' => 'FAX', 'ℼ' => 'π', 'ℽ' => 'γ', 'ℾ' => 'Γ', 'ℿ' => 'Π', '⅀' => '∑', 'ⅅ' => 'D', 'ⅆ' => 'd', 'ⅇ' => 'e', 'ⅈ' => 'i', 'ⅉ' => 'j', '⅐' => '1⁄7', '⅑' => '1⁄9', '⅒' => '1⁄10', '⅓' => '1⁄3', '⅔' => '2⁄3', '⅕' => '1⁄5', '⅖' => '2⁄5', '⅗' => '3⁄5', '⅘' => '4⁄5', '⅙' => '1⁄6', '⅚' => '5⁄6', '⅛' => '1⁄8', '⅜' => '3⁄8', '⅝' => '5⁄8', '⅞' => '7⁄8', '⅟' => '1⁄', 'Ⅰ' => 'I', 'Ⅱ' => 'II', 'Ⅲ' => 'III', 'Ⅳ' => 'IV', 'Ⅴ' => 'V', 'Ⅵ' => 'VI', 'Ⅶ' => 'VII', 'Ⅷ' => 'VIII', 'Ⅸ' => 'IX', 'Ⅹ' => 'X', 'Ⅺ' => 'XI', 'Ⅻ' => 'XII', 'Ⅼ' => 'L', 'Ⅽ' => 'C', 'Ⅾ' => 'D', 'Ⅿ' => 'M', 'ⅰ' => 'i', 'ⅱ' => 'ii', 'ⅲ' => 'iii', 'ⅳ' => 'iv', 'ⅴ' => 'v', 'ⅵ' => 'vi', 'ⅶ' => 'vii', 'ⅷ' => 'viii', 'ⅸ' => 'ix', 'ⅹ' => 'x', 'ⅺ' => 'xi', 'ⅻ' => 'xii', 'ⅼ' => 'l', 'ⅽ' => 'c', 'ⅾ' => 'd', 'ⅿ' => 'm', '↉' => '0⁄3', '∬' => '∫∫', '∭' => '∫∫∫', '∯' => '∮∮', '∰' => '∮∮∮', '①' => '1', '②' => '2', '③' => '3', '④' => '4', '⑤' => '5', '⑥' => '6', '⑦' => '7', '⑧' => '8', '⑨' => '9', '⑩' => '10', '⑪' => '11', '⑫' => '12', '⑬' => '13', '⑭' => '14', '⑮' => '15', '⑯' => '16', '⑰' => '17', '⑱' => '18', '⑲' => '19', '⑳' => '20', '⑴' => '(1)', '⑵' => '(2)', '⑶' => '(3)', '⑷' => '(4)', '⑸' => '(5)', '⑹' => '(6)', '⑺' => '(7)', '⑻' => '(8)', '⑼' => '(9)', '⑽' => '(10)', '⑾' => '(11)', '⑿' => '(12)', '⒀' => '(13)', '⒁' => '(14)', '⒂' => '(15)', '⒃' => '(16)', '⒄' => '(17)', '⒅' => '(18)', '⒆' => '(19)', '⒇' => '(20)', '⒈' => '1.', '⒉' => '2.', '⒊' => '3.', '⒋' => '4.', '⒌' => '5.', '⒍' => '6.', '⒎' => '7.', '⒏' => '8.', '⒐' => '9.', '⒑' => '10.', '⒒' => '11.', '⒓' => '12.', '⒔' => '13.', '⒕' => '14.', '⒖' => '15.', '⒗' => '16.', '⒘' => '17.', '⒙' => '18.', '⒚' => '19.', '⒛' => '20.', '⒜' => '(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', 'ⓐ' => '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', '⓪' => '0', '⨌' => '∫∫∫∫', '⩴' => '::=', '⩵' => '==', '⩶' => '===', 'ⱼ' => 'j', 'ⱽ' => 'V', 'ⵯ' => 'ⵡ', '⺟' => '母', '⻳' => '龟', '⼀' => '一', '⼁' => '丨', '⼂' => '丶', '⼃' => '丿', '⼄' => '乙', '⼅' => '亅', '⼆' => '二', '⼇' => '亠', '⼈' => '人', '⼉' => '儿', '⼊' => '入', '⼋' => '八', '⼌' => '冂', '⼍' => '冖', '⼎' => '冫', '⼏' => '几', '⼐' => '凵', '⼑' => '刀', '⼒' => '力', '⼓' => '勹', '⼔' => '匕', '⼕' => '匚', '⼖' => '匸', '⼗' => '十', '⼘' => '卜', '⼙' => '卩', '⼚' => '厂', '⼛' => '厶', '⼜' => '又', '⼝' => '口', '⼞' => '囗', '⼟' => '土', '⼠' => '士', '⼡' => '夂', '⼢' => '夊', '⼣' => '夕', '⼤' => '大', '⼥' => '女', '⼦' => '子', '⼧' => '宀', '⼨' => '寸', '⼩' => '小', '⼪' => '尢', '⼫' => '尸', '⼬' => '屮', '⼭' => '山', '⼮' => '巛', '⼯' => '工', '⼰' => '己', '⼱' => '巾', '⼲' => '干', '⼳' => '幺', '⼴' => '广', '⼵' => '廴', '⼶' => '廾', '⼷' => '弋', '⼸' => '弓', '⼹' => '彐', '⼺' => '彡', '⼻' => '彳', '⼼' => '心', '⼽' => '戈', '⼾' => '戶', '⼿' => '手', '⽀' => '支', '⽁' => '攴', '⽂' => '文', '⽃' => '斗', '⽄' => '斤', '⽅' => '方', '⽆' => '无', '⽇' => '日', '⽈' => '曰', '⽉' => '月', '⽊' => '木', '⽋' => '欠', '⽌' => '止', '⽍' => '歹', '⽎' => '殳', '⽏' => '毋', '⽐' => '比', '⽑' => '毛', '⽒' => '氏', '⽓' => '气', '⽔' => '水', '⽕' => '火', '⽖' => '爪', '⽗' => '父', '⽘' => '爻', '⽙' => '爿', '⽚' => '片', '⽛' => '牙', '⽜' => '牛', '⽝' => '犬', '⽞' => '玄', '⽟' => '玉', '⽠' => '瓜', '⽡' => '瓦', '⽢' => '甘', '⽣' => '生', '⽤' => '用', '⽥' => '田', '⽦' => '疋', '⽧' => '疒', '⽨' => '癶', '⽩' => '白', '⽪' => '皮', '⽫' => '皿', '⽬' => '目', '⽭' => '矛', '⽮' => '矢', '⽯' => '石', '⽰' => '示', '⽱' => '禸', '⽲' => '禾', '⽳' => '穴', '⽴' => '立', '⽵' => '竹', '⽶' => '米', '⽷' => '糸', '⽸' => '缶', '⽹' => '网', '⽺' => '羊', '⽻' => '羽', '⽼' => '老', '⽽' => '而', '⽾' => '耒', '⽿' => '耳', '⾀' => '聿', '⾁' => '肉', '⾂' => '臣', '⾃' => '自', '⾄' => '至', '⾅' => '臼', '⾆' => '舌', '⾇' => '舛', '⾈' => '舟', '⾉' => '艮', '⾊' => '色', '⾋' => '艸', '⾌' => '虍', '⾍' => '虫', '⾎' => '血', '⾏' => '行', '⾐' => '衣', '⾑' => '襾', '⾒' => '見', '⾓' => '角', '⾔' => '言', '⾕' => '谷', '⾖' => '豆', '⾗' => '豕', '⾘' => '豸', '⾙' => '貝', '⾚' => '赤', '⾛' => '走', '⾜' => '足', '⾝' => '身', '⾞' => '車', '⾟' => '辛', '⾠' => '辰', '⾡' => '辵', '⾢' => '邑', '⾣' => '酉', '⾤' => '釆', '⾥' => '里', '⾦' => '金', '⾧' => '長', '⾨' => '門', '⾩' => '阜', '⾪' => '隶', '⾫' => '隹', '⾬' => '雨', '⾭' => '靑', '⾮' => '非', '⾯' => '面', '⾰' => '革', '⾱' => '韋', '⾲' => '韭', '⾳' => '音', '⾴' => '頁', '⾵' => '風', '⾶' => '飛', '⾷' => '食', '⾸' => '首', '⾹' => '香', '⾺' => '馬', '⾻' => '骨', '⾼' => '高', '⾽' => '髟', '⾾' => '鬥', '⾿' => '鬯', '⿀' => '鬲', '⿁' => '鬼', '⿂' => '魚', '⿃' => '鳥', '⿄' => '鹵', '⿅' => '鹿', '⿆' => '麥', '⿇' => '麻', '⿈' => '黃', '⿉' => '黍', '⿊' => '黑', '⿋' => '黹', '⿌' => '黽', '⿍' => '鼎', '⿎' => '鼓', '⿏' => '鼠', '⿐' => '鼻', '⿑' => '齊', '⿒' => '齒', '⿓' => '龍', '⿔' => '龜', '⿕' => '龠', ' ' => ' ', '〶' => '〒', '〸' => '十', '〹' => '卄', '〺' => '卅', '゛' => ' ゙', '゜' => ' ゚', 'ゟ' => 'より', 'ヿ' => 'コト', 'ㄱ' => 'ᄀ', 'ㄲ' => 'ᄁ', 'ㄳ' => 'ᆪ', 'ㄴ' => 'ᄂ', 'ㄵ' => 'ᆬ', 'ㄶ' => 'ᆭ', 'ㄷ' => 'ᄃ', 'ㄸ' => 'ᄄ', 'ㄹ' => 'ᄅ', 'ㄺ' => 'ᆰ', 'ㄻ' => 'ᆱ', 'ㄼ' => 'ᆲ', 'ㄽ' => 'ᆳ', 'ㄾ' => 'ᆴ', 'ㄿ' => 'ᆵ', 'ㅀ' => 'ᄚ', 'ㅁ' => 'ᄆ', 'ㅂ' => 'ᄇ', 'ㅃ' => 'ᄈ', 'ㅄ' => 'ᄡ', 'ㅅ' => 'ᄉ', 'ㅆ' => 'ᄊ', 'ㅇ' => 'ᄋ', 'ㅈ' => 'ᄌ', 'ㅉ' => 'ᄍ', 'ㅊ' => 'ᄎ', 'ㅋ' => 'ᄏ', 'ㅌ' => 'ᄐ', 'ㅍ' => 'ᄑ', 'ㅎ' => 'ᄒ', 'ㅏ' => 'ᅡ', 'ㅐ' => 'ᅢ', 'ㅑ' => 'ᅣ', 'ㅒ' => 'ᅤ', 'ㅓ' => 'ᅥ', 'ㅔ' => 'ᅦ', 'ㅕ' => 'ᅧ', 'ㅖ' => 'ᅨ', 'ㅗ' => 'ᅩ', 'ㅘ' => 'ᅪ', 'ㅙ' => 'ᅫ', 'ㅚ' => 'ᅬ', 'ㅛ' => 'ᅭ', 'ㅜ' => 'ᅮ', 'ㅝ' => 'ᅯ', 'ㅞ' => 'ᅰ', 'ㅟ' => 'ᅱ', 'ㅠ' => 'ᅲ', 'ㅡ' => 'ᅳ', 'ㅢ' => 'ᅴ', 'ㅣ' => 'ᅵ', 'ㅤ' => 'ᅠ', 'ㅥ' => 'ᄔ', 'ㅦ' => 'ᄕ', 'ㅧ' => 'ᇇ', 'ㅨ' => 'ᇈ', 'ㅩ' => 'ᇌ', 'ㅪ' => 'ᇎ', 'ㅫ' => 'ᇓ', 'ㅬ' => 'ᇗ', 'ㅭ' => 'ᇙ', 'ㅮ' => 'ᄜ', 'ㅯ' => 'ᇝ', 'ㅰ' => 'ᇟ', 'ㅱ' => 'ᄝ', 'ㅲ' => 'ᄞ', 'ㅳ' => 'ᄠ', 'ㅴ' => 'ᄢ', 'ㅵ' => 'ᄣ', 'ㅶ' => 'ᄧ', 'ㅷ' => 'ᄩ', 'ㅸ' => 'ᄫ', 'ㅹ' => 'ᄬ', 'ㅺ' => 'ᄭ', 'ㅻ' => 'ᄮ', 'ㅼ' => 'ᄯ', 'ㅽ' => 'ᄲ', 'ㅾ' => 'ᄶ', 'ㅿ' => 'ᅀ', 'ㆀ' => 'ᅇ', 'ㆁ' => 'ᅌ', 'ㆂ' => 'ᇱ', 'ㆃ' => 'ᇲ', 'ㆄ' => 'ᅗ', 'ㆅ' => 'ᅘ', 'ㆆ' => 'ᅙ', 'ㆇ' => 'ᆄ', 'ㆈ' => 'ᆅ', 'ㆉ' => 'ᆈ', 'ㆊ' => 'ᆑ', 'ㆋ' => 'ᆒ', 'ㆌ' => 'ᆔ', 'ㆍ' => 'ᆞ', 'ㆎ' => 'ᆡ', '㆒' => '一', '㆓' => '二', '㆔' => '三', '㆕' => '四', '㆖' => '上', '㆗' => '中', '㆘' => '下', '㆙' => '甲', '㆚' => '乙', '㆛' => '丙', '㆜' => '丁', '㆝' => '天', '㆞' => '地', '㆟' => '人', '㈀' => '(ᄀ)', '㈁' => '(ᄂ)', '㈂' => '(ᄃ)', '㈃' => '(ᄅ)', '㈄' => '(ᄆ)', '㈅' => '(ᄇ)', '㈆' => '(ᄉ)', '㈇' => '(ᄋ)', '㈈' => '(ᄌ)', '㈉' => '(ᄎ)', '㈊' => '(ᄏ)', '㈋' => '(ᄐ)', '㈌' => '(ᄑ)', '㈍' => '(ᄒ)', '㈎' => '(가)', '㈏' => '(나)', '㈐' => '(다)', '㈑' => '(라)', '㈒' => '(마)', '㈓' => '(바)', '㈔' => '(사)', '㈕' => '(아)', '㈖' => '(자)', '㈗' => '(차)', '㈘' => '(카)', '㈙' => '(타)', '㈚' => '(파)', '㈛' => '(하)', '㈜' => '(주)', '㈝' => '(오전)', '㈞' => '(오후)', '㈠' => '(一)', '㈡' => '(二)', '㈢' => '(三)', '㈣' => '(四)', '㈤' => '(五)', '㈥' => '(六)', '㈦' => '(七)', '㈧' => '(八)', '㈨' => '(九)', '㈩' => '(十)', '㈪' => '(月)', '㈫' => '(火)', '㈬' => '(水)', '㈭' => '(木)', '㈮' => '(金)', '㈯' => '(土)', '㈰' => '(日)', '㈱' => '(株)', '㈲' => '(有)', '㈳' => '(社)', '㈴' => '(名)', '㈵' => '(特)', '㈶' => '(財)', '㈷' => '(祝)', '㈸' => '(労)', '㈹' => '(代)', '㈺' => '(呼)', '㈻' => '(学)', '㈼' => '(監)', '㈽' => '(企)', '㈾' => '(資)', '㈿' => '(協)', '㉀' => '(祭)', '㉁' => '(休)', '㉂' => '(自)', '㉃' => '(至)', '㉄' => '問', '㉅' => '幼', '㉆' => '文', '㉇' => '箏', '㉐' => 'PTE', '㉑' => '21', '㉒' => '22', '㉓' => '23', '㉔' => '24', '㉕' => '25', '㉖' => '26', '㉗' => '27', '㉘' => '28', '㉙' => '29', '㉚' => '30', '㉛' => '31', '㉜' => '32', '㉝' => '33', '㉞' => '34', '㉟' => '35', '㉠' => 'ᄀ', '㉡' => 'ᄂ', '㉢' => 'ᄃ', '㉣' => 'ᄅ', '㉤' => 'ᄆ', '㉥' => 'ᄇ', '㉦' => 'ᄉ', '㉧' => 'ᄋ', '㉨' => 'ᄌ', '㉩' => 'ᄎ', '㉪' => 'ᄏ', '㉫' => 'ᄐ', '㉬' => 'ᄑ', '㉭' => 'ᄒ', '㉮' => '가', '㉯' => '나', '㉰' => '다', '㉱' => '라', '㉲' => '마', '㉳' => '바', '㉴' => '사', '㉵' => '아', '㉶' => '자', '㉷' => '차', '㉸' => '카', '㉹' => '타', '㉺' => '파', '㉻' => '하', '㉼' => '참고', '㉽' => '주의', '㉾' => '우', '㊀' => '一', '㊁' => '二', '㊂' => '三', '㊃' => '四', '㊄' => '五', '㊅' => '六', '㊆' => '七', '㊇' => '八', '㊈' => '九', '㊉' => '十', '㊊' => '月', '㊋' => '火', '㊌' => '水', '㊍' => '木', '㊎' => '金', '㊏' => '土', '㊐' => '日', '㊑' => '株', '㊒' => '有', '㊓' => '社', '㊔' => '名', '㊕' => '特', '㊖' => '財', '㊗' => '祝', '㊘' => '労', '㊙' => '秘', '㊚' => '男', '㊛' => '女', '㊜' => '適', '㊝' => '優', '㊞' => '印', '㊟' => '注', '㊠' => '項', '㊡' => '休', '㊢' => '写', '㊣' => '正', '㊤' => '上', '㊥' => '中', '㊦' => '下', '㊧' => '左', '㊨' => '右', '㊩' => '医', '㊪' => '宗', '㊫' => '学', '㊬' => '監', '㊭' => '企', '㊮' => '資', '㊯' => '協', '㊰' => '夜', '㊱' => '36', '㊲' => '37', '㊳' => '38', '㊴' => '39', '㊵' => '40', '㊶' => '41', '㊷' => '42', '㊸' => '43', '㊹' => '44', '㊺' => '45', '㊻' => '46', '㊼' => '47', '㊽' => '48', '㊾' => '49', '㊿' => '50', '㋀' => '1月', '㋁' => '2月', '㋂' => '3月', '㋃' => '4月', '㋄' => '5月', '㋅' => '6月', '㋆' => '7月', '㋇' => '8月', '㋈' => '9月', '㋉' => '10月', '㋊' => '11月', '㋋' => '12月', '㋌' => 'Hg', '㋍' => 'erg', '㋎' => 'eV', '㋏' => 'LTD', '㋐' => 'ア', '㋑' => 'イ', '㋒' => 'ウ', '㋓' => 'エ', '㋔' => 'オ', '㋕' => 'カ', '㋖' => 'キ', '㋗' => 'ク', '㋘' => 'ケ', '㋙' => 'コ', '㋚' => 'サ', '㋛' => 'シ', '㋜' => 'ス', '㋝' => 'セ', '㋞' => 'ソ', '㋟' => 'タ', '㋠' => 'チ', '㋡' => 'ツ', '㋢' => 'テ', '㋣' => 'ト', '㋤' => 'ナ', '㋥' => 'ニ', '㋦' => 'ヌ', '㋧' => 'ネ', '㋨' => 'ノ', '㋩' => 'ハ', '㋪' => 'ヒ', '㋫' => 'フ', '㋬' => 'ヘ', '㋭' => 'ホ', '㋮' => 'マ', '㋯' => 'ミ', '㋰' => 'ム', '㋱' => 'メ', '㋲' => 'モ', '㋳' => 'ヤ', '㋴' => 'ユ', '㋵' => 'ヨ', '㋶' => 'ラ', '㋷' => 'リ', '㋸' => 'ル', '㋹' => 'レ', '㋺' => 'ロ', '㋻' => 'ワ', '㋼' => 'ヰ', '㋽' => 'ヱ', '㋾' => 'ヲ', '㋿' => '令和', '㌀' => 'アパート', '㌁' => 'アルファ', '㌂' => 'アンペア', '㌃' => 'アール', '㌄' => 'イニング', '㌅' => 'インチ', '㌆' => 'ウォン', '㌇' => 'エスクード', '㌈' => 'エーカー', '㌉' => 'オンス', '㌊' => 'オーム', '㌋' => 'カイリ', '㌌' => 'カラット', '㌍' => 'カロリー', '㌎' => 'ガロン', '㌏' => 'ガンマ', '㌐' => 'ギガ', '㌑' => 'ギニー', '㌒' => 'キュリー', '㌓' => 'ギルダー', '㌔' => 'キロ', '㌕' => 'キログラム', '㌖' => 'キロメートル', '㌗' => 'キロワット', '㌘' => 'グラム', '㌙' => 'グラムトン', '㌚' => 'クルゼイロ', '㌛' => 'クローネ', '㌜' => 'ケース', '㌝' => 'コルナ', '㌞' => 'コーポ', '㌟' => 'サイクル', '㌠' => 'サンチーム', '㌡' => 'シリング', '㌢' => 'センチ', '㌣' => 'セント', '㌤' => 'ダース', '㌥' => 'デシ', '㌦' => 'ドル', '㌧' => 'トン', '㌨' => 'ナノ', '㌩' => 'ノット', '㌪' => 'ハイツ', '㌫' => 'パーセント', '㌬' => 'パーツ', '㌭' => 'バーレル', '㌮' => 'ピアストル', '㌯' => 'ピクル', '㌰' => 'ピコ', '㌱' => 'ビル', '㌲' => 'ファラッド', '㌳' => 'フィート', '㌴' => 'ブッシェル', '㌵' => 'フラン', '㌶' => 'ヘクタール', '㌷' => 'ペソ', '㌸' => 'ペニヒ', '㌹' => 'ヘルツ', '㌺' => 'ペンス', '㌻' => 'ページ', '㌼' => 'ベータ', '㌽' => 'ポイント', '㌾' => 'ボルト', '㌿' => 'ホン', '㍀' => 'ポンド', '㍁' => 'ホール', '㍂' => 'ホーン', '㍃' => 'マイクロ', '㍄' => 'マイル', '㍅' => 'マッハ', '㍆' => 'マルク', '㍇' => 'マンション', '㍈' => 'ミクロン', '㍉' => 'ミリ', '㍊' => 'ミリバール', '㍋' => 'メガ', '㍌' => 'メガトン', '㍍' => 'メートル', '㍎' => 'ヤード', '㍏' => 'ヤール', '㍐' => 'ユアン', '㍑' => 'リットル', '㍒' => 'リラ', '㍓' => 'ルピー', '㍔' => 'ルーブル', '㍕' => 'レム', '㍖' => 'レントゲン', '㍗' => 'ワット', '㍘' => '0点', '㍙' => '1点', '㍚' => '2点', '㍛' => '3点', '㍜' => '4点', '㍝' => '5点', '㍞' => '6点', '㍟' => '7点', '㍠' => '8点', '㍡' => '9点', '㍢' => '10点', '㍣' => '11点', '㍤' => '12点', '㍥' => '13点', '㍦' => '14点', '㍧' => '15点', '㍨' => '16点', '㍩' => '17点', '㍪' => '18点', '㍫' => '19点', '㍬' => '20点', '㍭' => '21点', '㍮' => '22点', '㍯' => '23点', '㍰' => '24点', '㍱' => 'hPa', '㍲' => 'da', '㍳' => 'AU', '㍴' => 'bar', '㍵' => 'oV', '㍶' => 'pc', '㍷' => 'dm', '㍸' => 'dm2', '㍹' => 'dm3', '㍺' => 'IU', '㍻' => '平成', '㍼' => '昭和', '㍽' => '大正', '㍾' => '明治', '㍿' => '株式会社', '㎀' => 'pA', '㎁' => 'nA', '㎂' => 'μA', '㎃' => 'mA', '㎄' => 'kA', '㎅' => 'KB', '㎆' => 'MB', '㎇' => 'GB', '㎈' => 'cal', '㎉' => 'kcal', '㎊' => 'pF', '㎋' => 'nF', '㎌' => 'μF', '㎍' => 'μg', '㎎' => 'mg', '㎏' => 'kg', '㎐' => 'Hz', '㎑' => 'kHz', '㎒' => 'MHz', '㎓' => 'GHz', '㎔' => 'THz', '㎕' => 'μl', '㎖' => 'ml', '㎗' => 'dl', '㎘' => 'kl', '㎙' => 'fm', '㎚' => 'nm', '㎛' => 'μm', '㎜' => 'mm', '㎝' => 'cm', '㎞' => 'km', '㎟' => 'mm2', '㎠' => 'cm2', '㎡' => 'm2', '㎢' => 'km2', '㎣' => 'mm3', '㎤' => 'cm3', '㎥' => 'm3', '㎦' => 'km3', '㎧' => 'm∕s', '㎨' => 'm∕s2', '㎩' => 'Pa', '㎪' => 'kPa', '㎫' => 'MPa', '㎬' => 'GPa', '㎭' => 'rad', '㎮' => 'rad∕s', '㎯' => 'rad∕s2', '㎰' => 'ps', '㎱' => 'ns', '㎲' => 'μs', '㎳' => 'ms', '㎴' => 'pV', '㎵' => 'nV', '㎶' => 'μV', '㎷' => 'mV', '㎸' => 'kV', '㎹' => 'MV', '㎺' => 'pW', '㎻' => 'nW', '㎼' => 'μW', '㎽' => 'mW', '㎾' => 'kW', '㎿' => 'MW', '㏀' => 'kΩ', '㏁' => 'MΩ', '㏂' => 'a.m.', '㏃' => 'Bq', '㏄' => 'cc', '㏅' => 'cd', '㏆' => 'C∕kg', '㏇' => 'Co.', '㏈' => 'dB', '㏉' => 'Gy', '㏊' => 'ha', '㏋' => 'HP', '㏌' => 'in', '㏍' => 'KK', '㏎' => 'KM', '㏏' => 'kt', '㏐' => 'lm', '㏑' => 'ln', '㏒' => 'log', '㏓' => 'lx', '㏔' => 'mb', '㏕' => 'mil', '㏖' => 'mol', '㏗' => 'PH', '㏘' => 'p.m.', '㏙' => 'PPM', '㏚' => 'PR', '㏛' => 'sr', '㏜' => 'Sv', '㏝' => 'Wb', '㏞' => 'V∕m', '㏟' => 'A∕m', '㏠' => '1日', '㏡' => '2日', '㏢' => '3日', '㏣' => '4日', '㏤' => '5日', '㏥' => '6日', '㏦' => '7日', '㏧' => '8日', '㏨' => '9日', '㏩' => '10日', '㏪' => '11日', '㏫' => '12日', '㏬' => '13日', '㏭' => '14日', '㏮' => '15日', '㏯' => '16日', '㏰' => '17日', '㏱' => '18日', '㏲' => '19日', '㏳' => '20日', '㏴' => '21日', '㏵' => '22日', '㏶' => '23日', '㏷' => '24日', '㏸' => '25日', '㏹' => '26日', '㏺' => '27日', '㏻' => '28日', '㏼' => '29日', '㏽' => '30日', '㏾' => '31日', '㏿' => 'gal', 'ꚜ' => 'ъ', 'ꚝ' => 'ь', 'ꝰ' => 'ꝯ', 'ꟸ' => 'Ħ', 'ꟹ' => 'œ', 'ꭜ' => 'ꜧ', 'ꭝ' => 'ꬷ', 'ꭞ' => 'ɫ', 'ꭟ' => 'ꭒ', 'ꭩ' => 'ʍ', 'ff' => 'ff', 'fi' => 'fi', 'fl' => 'fl', 'ffi' => 'ffi', 'ffl' => 'ffl', 'ſt' => 'st', 'st' => 'st', 'ﬓ' => 'մն', 'ﬔ' => 'մե', 'ﬕ' => 'մի', 'ﬖ' => 'վն', 'ﬗ' => 'մխ', 'ﬠ' => 'ע', 'ﬡ' => 'א', 'ﬢ' => 'ד', 'ﬣ' => 'ה', 'ﬤ' => 'כ', 'ﬥ' => 'ל', 'ﬦ' => 'ם', 'ﬧ' => 'ר', 'ﬨ' => 'ת', '﬩' => '+', 'ﭏ' => 'אל', 'ﭐ' => 'ٱ', 'ﭑ' => 'ٱ', 'ﭒ' => 'ٻ', 'ﭓ' => 'ٻ', 'ﭔ' => 'ٻ', 'ﭕ' => 'ٻ', 'ﭖ' => 'پ', 'ﭗ' => 'پ', 'ﭘ' => 'پ', 'ﭙ' => 'پ', 'ﭚ' => 'ڀ', 'ﭛ' => 'ڀ', 'ﭜ' => 'ڀ', 'ﭝ' => 'ڀ', 'ﭞ' => 'ٺ', 'ﭟ' => 'ٺ', 'ﭠ' => 'ٺ', 'ﭡ' => 'ٺ', 'ﭢ' => 'ٿ', 'ﭣ' => 'ٿ', 'ﭤ' => 'ٿ', 'ﭥ' => 'ٿ', 'ﭦ' => 'ٹ', 'ﭧ' => 'ٹ', 'ﭨ' => 'ٹ', 'ﭩ' => 'ٹ', 'ﭪ' => 'ڤ', 'ﭫ' => 'ڤ', 'ﭬ' => 'ڤ', 'ﭭ' => 'ڤ', 'ﭮ' => 'ڦ', 'ﭯ' => 'ڦ', 'ﭰ' => 'ڦ', 'ﭱ' => 'ڦ', 'ﭲ' => 'ڄ', 'ﭳ' => 'ڄ', 'ﭴ' => 'ڄ', 'ﭵ' => 'ڄ', 'ﭶ' => 'ڃ', 'ﭷ' => 'ڃ', 'ﭸ' => 'ڃ', 'ﭹ' => 'ڃ', 'ﭺ' => 'چ', 'ﭻ' => 'چ', 'ﭼ' => 'چ', 'ﭽ' => 'چ', 'ﭾ' => 'ڇ', 'ﭿ' => 'ڇ', 'ﮀ' => 'ڇ', 'ﮁ' => 'ڇ', 'ﮂ' => 'ڍ', 'ﮃ' => 'ڍ', 'ﮄ' => 'ڌ', 'ﮅ' => 'ڌ', 'ﮆ' => 'ڎ', 'ﮇ' => 'ڎ', 'ﮈ' => 'ڈ', 'ﮉ' => 'ڈ', 'ﮊ' => 'ژ', 'ﮋ' => 'ژ', 'ﮌ' => 'ڑ', 'ﮍ' => 'ڑ', 'ﮎ' => 'ک', 'ﮏ' => 'ک', 'ﮐ' => 'ک', 'ﮑ' => 'ک', 'ﮒ' => 'گ', 'ﮓ' => 'گ', 'ﮔ' => 'گ', 'ﮕ' => 'گ', 'ﮖ' => 'ڳ', 'ﮗ' => 'ڳ', 'ﮘ' => 'ڳ', 'ﮙ' => 'ڳ', 'ﮚ' => 'ڱ', 'ﮛ' => 'ڱ', 'ﮜ' => 'ڱ', 'ﮝ' => 'ڱ', 'ﮞ' => 'ں', 'ﮟ' => 'ں', 'ﮠ' => 'ڻ', 'ﮡ' => 'ڻ', 'ﮢ' => 'ڻ', 'ﮣ' => 'ڻ', 'ﮤ' => 'ۀ', 'ﮥ' => 'ۀ', 'ﮦ' => 'ہ', 'ﮧ' => 'ہ', 'ﮨ' => 'ہ', 'ﮩ' => 'ہ', 'ﮪ' => 'ھ', 'ﮫ' => 'ھ', 'ﮬ' => 'ھ', 'ﮭ' => 'ھ', 'ﮮ' => 'ے', 'ﮯ' => 'ے', 'ﮰ' => 'ۓ', 'ﮱ' => 'ۓ', 'ﯓ' => 'ڭ', 'ﯔ' => 'ڭ', 'ﯕ' => 'ڭ', 'ﯖ' => 'ڭ', 'ﯗ' => 'ۇ', 'ﯘ' => 'ۇ', 'ﯙ' => 'ۆ', 'ﯚ' => 'ۆ', 'ﯛ' => 'ۈ', 'ﯜ' => 'ۈ', 'ﯝ' => 'ۇٴ', 'ﯞ' => 'ۋ', 'ﯟ' => 'ۋ', 'ﯠ' => 'ۅ', 'ﯡ' => 'ۅ', 'ﯢ' => 'ۉ', 'ﯣ' => 'ۉ', 'ﯤ' => 'ې', 'ﯥ' => 'ې', 'ﯦ' => 'ې', 'ﯧ' => 'ې', 'ﯨ' => 'ى', 'ﯩ' => 'ى', 'ﯪ' => 'ئا', 'ﯫ' => 'ئا', 'ﯬ' => 'ئە', 'ﯭ' => 'ئە', 'ﯮ' => 'ئو', 'ﯯ' => 'ئو', 'ﯰ' => 'ئۇ', 'ﯱ' => 'ئۇ', 'ﯲ' => 'ئۆ', 'ﯳ' => 'ئۆ', 'ﯴ' => 'ئۈ', 'ﯵ' => 'ئۈ', 'ﯶ' => 'ئې', 'ﯷ' => 'ئې', 'ﯸ' => 'ئې', 'ﯹ' => 'ئى', 'ﯺ' => 'ئى', 'ﯻ' => 'ئى', 'ﯼ' => 'ی', 'ﯽ' => 'ی', 'ﯾ' => 'ی', 'ﯿ' => 'ی', 'ﰀ' => 'ئج', 'ﰁ' => 'ئح', 'ﰂ' => 'ئم', 'ﰃ' => 'ئى', 'ﰄ' => 'ئي', 'ﰅ' => 'بج', 'ﰆ' => 'بح', 'ﰇ' => 'بخ', 'ﰈ' => 'بم', 'ﰉ' => 'بى', 'ﰊ' => 'بي', 'ﰋ' => 'تج', 'ﰌ' => 'تح', 'ﰍ' => 'تخ', 'ﰎ' => 'تم', 'ﰏ' => 'تى', 'ﰐ' => 'تي', 'ﰑ' => 'ثج', 'ﰒ' => 'ثم', 'ﰓ' => 'ثى', 'ﰔ' => 'ثي', 'ﰕ' => 'جح', 'ﰖ' => 'جم', 'ﰗ' => 'حج', 'ﰘ' => 'حم', 'ﰙ' => 'خج', 'ﰚ' => 'خح', 'ﰛ' => 'خم', 'ﰜ' => 'سج', 'ﰝ' => 'سح', 'ﰞ' => 'سخ', 'ﰟ' => 'سم', 'ﰠ' => 'صح', 'ﰡ' => 'صم', 'ﰢ' => 'ضج', 'ﰣ' => 'ضح', 'ﰤ' => 'ضخ', 'ﰥ' => 'ضم', 'ﰦ' => 'طح', 'ﰧ' => 'طم', 'ﰨ' => 'ظم', 'ﰩ' => 'عج', 'ﰪ' => 'عم', 'ﰫ' => 'غج', 'ﰬ' => 'غم', 'ﰭ' => 'فج', 'ﰮ' => 'فح', 'ﰯ' => 'فخ', 'ﰰ' => 'فم', 'ﰱ' => 'فى', 'ﰲ' => 'في', 'ﰳ' => 'قح', 'ﰴ' => 'قم', 'ﰵ' => 'قى', 'ﰶ' => 'قي', 'ﰷ' => 'كا', 'ﰸ' => 'كج', 'ﰹ' => 'كح', 'ﰺ' => 'كخ', 'ﰻ' => 'كل', 'ﰼ' => 'كم', 'ﰽ' => 'كى', 'ﰾ' => 'كي', 'ﰿ' => 'لج', 'ﱀ' => 'لح', 'ﱁ' => 'لخ', 'ﱂ' => 'لم', 'ﱃ' => 'لى', 'ﱄ' => 'لي', 'ﱅ' => 'مج', 'ﱆ' => 'مح', 'ﱇ' => 'مخ', 'ﱈ' => 'مم', 'ﱉ' => 'مى', 'ﱊ' => 'مي', 'ﱋ' => 'نج', 'ﱌ' => 'نح', 'ﱍ' => 'نخ', 'ﱎ' => 'نم', 'ﱏ' => 'نى', 'ﱐ' => 'ني', 'ﱑ' => 'هج', 'ﱒ' => 'هم', 'ﱓ' => 'هى', 'ﱔ' => 'هي', 'ﱕ' => 'يج', 'ﱖ' => 'يح', 'ﱗ' => 'يخ', 'ﱘ' => 'يم', 'ﱙ' => 'يى', 'ﱚ' => 'يي', 'ﱛ' => 'ذٰ', 'ﱜ' => 'رٰ', 'ﱝ' => 'ىٰ', 'ﱞ' => ' ٌّ', 'ﱟ' => ' ٍّ', 'ﱠ' => ' َّ', 'ﱡ' => ' ُّ', 'ﱢ' => ' ِّ', 'ﱣ' => ' ّٰ', 'ﱤ' => 'ئر', 'ﱥ' => 'ئز', 'ﱦ' => 'ئم', 'ﱧ' => 'ئن', 'ﱨ' => 'ئى', 'ﱩ' => 'ئي', 'ﱪ' => 'بر', 'ﱫ' => 'بز', 'ﱬ' => 'بم', 'ﱭ' => 'بن', 'ﱮ' => 'بى', 'ﱯ' => 'بي', 'ﱰ' => 'تر', 'ﱱ' => 'تز', 'ﱲ' => 'تم', 'ﱳ' => 'تن', 'ﱴ' => 'تى', 'ﱵ' => 'تي', 'ﱶ' => 'ثر', 'ﱷ' => 'ثز', 'ﱸ' => 'ثم', 'ﱹ' => 'ثن', 'ﱺ' => 'ثى', 'ﱻ' => 'ثي', 'ﱼ' => 'فى', 'ﱽ' => 'في', 'ﱾ' => 'قى', 'ﱿ' => 'قي', 'ﲀ' => 'كا', 'ﲁ' => 'كل', 'ﲂ' => 'كم', 'ﲃ' => 'كى', 'ﲄ' => 'كي', 'ﲅ' => 'لم', 'ﲆ' => 'لى', 'ﲇ' => 'لي', 'ﲈ' => 'ما', 'ﲉ' => 'مم', 'ﲊ' => 'نر', 'ﲋ' => 'نز', 'ﲌ' => 'نم', 'ﲍ' => 'نن', 'ﲎ' => 'نى', 'ﲏ' => 'ني', 'ﲐ' => 'ىٰ', 'ﲑ' => 'ير', 'ﲒ' => 'يز', 'ﲓ' => 'يم', 'ﲔ' => 'ين', 'ﲕ' => 'يى', 'ﲖ' => 'يي', 'ﲗ' => 'ئج', 'ﲘ' => 'ئح', 'ﲙ' => 'ئخ', 'ﲚ' => 'ئم', 'ﲛ' => 'ئه', 'ﲜ' => 'بج', 'ﲝ' => 'بح', 'ﲞ' => 'بخ', 'ﲟ' => 'بم', 'ﲠ' => 'به', 'ﲡ' => 'تج', 'ﲢ' => 'تح', 'ﲣ' => 'تخ', 'ﲤ' => 'تم', 'ﲥ' => 'ته', 'ﲦ' => 'ثم', 'ﲧ' => 'جح', 'ﲨ' => 'جم', 'ﲩ' => 'حج', 'ﲪ' => 'حم', 'ﲫ' => 'خج', 'ﲬ' => 'خم', 'ﲭ' => 'سج', 'ﲮ' => 'سح', 'ﲯ' => 'سخ', 'ﲰ' => 'سم', 'ﲱ' => 'صح', 'ﲲ' => 'صخ', 'ﲳ' => 'صم', 'ﲴ' => 'ضج', 'ﲵ' => 'ضح', 'ﲶ' => 'ضخ', 'ﲷ' => 'ضم', 'ﲸ' => 'طح', 'ﲹ' => 'ظم', 'ﲺ' => 'عج', 'ﲻ' => 'عم', 'ﲼ' => 'غج', 'ﲽ' => 'غم', 'ﲾ' => 'فج', 'ﲿ' => 'فح', 'ﳀ' => 'فخ', 'ﳁ' => 'فم', 'ﳂ' => 'قح', 'ﳃ' => 'قم', 'ﳄ' => 'كج', 'ﳅ' => 'كح', 'ﳆ' => 'كخ', 'ﳇ' => 'كل', 'ﳈ' => 'كم', 'ﳉ' => 'لج', 'ﳊ' => 'لح', 'ﳋ' => 'لخ', 'ﳌ' => 'لم', 'ﳍ' => 'له', 'ﳎ' => 'مج', 'ﳏ' => 'مح', 'ﳐ' => 'مخ', 'ﳑ' => 'مم', 'ﳒ' => 'نج', 'ﳓ' => 'نح', 'ﳔ' => 'نخ', 'ﳕ' => 'نم', 'ﳖ' => 'نه', 'ﳗ' => 'هج', 'ﳘ' => 'هم', 'ﳙ' => 'هٰ', 'ﳚ' => 'يج', 'ﳛ' => 'يح', 'ﳜ' => 'يخ', 'ﳝ' => 'يم', 'ﳞ' => 'يه', 'ﳟ' => 'ئم', 'ﳠ' => 'ئه', 'ﳡ' => 'بم', 'ﳢ' => 'به', 'ﳣ' => 'تم', 'ﳤ' => 'ته', 'ﳥ' => 'ثم', 'ﳦ' => 'ثه', 'ﳧ' => 'سم', 'ﳨ' => 'سه', 'ﳩ' => 'شم', 'ﳪ' => 'شه', 'ﳫ' => 'كل', 'ﳬ' => 'كم', 'ﳭ' => 'لم', 'ﳮ' => 'نم', 'ﳯ' => 'نه', 'ﳰ' => 'يم', 'ﳱ' => 'يه', 'ﳲ' => 'ـَّ', 'ﳳ' => 'ـُّ', 'ﳴ' => 'ـِّ', 'ﳵ' => 'طى', 'ﳶ' => 'طي', 'ﳷ' => 'عى', 'ﳸ' => 'عي', 'ﳹ' => 'غى', 'ﳺ' => 'غي', 'ﳻ' => 'سى', 'ﳼ' => 'سي', 'ﳽ' => 'شى', 'ﳾ' => 'شي', 'ﳿ' => 'حى', 'ﴀ' => 'حي', 'ﴁ' => 'جى', 'ﴂ' => 'جي', 'ﴃ' => 'خى', 'ﴄ' => 'خي', 'ﴅ' => 'صى', 'ﴆ' => 'صي', 'ﴇ' => 'ضى', 'ﴈ' => 'ضي', 'ﴉ' => 'شج', 'ﴊ' => 'شح', 'ﴋ' => 'شخ', 'ﴌ' => 'شم', 'ﴍ' => 'شر', 'ﴎ' => 'سر', 'ﴏ' => 'صر', 'ﴐ' => 'ضر', 'ﴑ' => 'طى', 'ﴒ' => 'طي', 'ﴓ' => 'عى', 'ﴔ' => 'عي', 'ﴕ' => 'غى', 'ﴖ' => 'غي', 'ﴗ' => 'سى', 'ﴘ' => 'سي', 'ﴙ' => 'شى', 'ﴚ' => 'شي', 'ﴛ' => 'حى', 'ﴜ' => 'حي', 'ﴝ' => 'جى', 'ﴞ' => 'جي', 'ﴟ' => 'خى', 'ﴠ' => 'خي', 'ﴡ' => 'صى', 'ﴢ' => 'صي', 'ﴣ' => 'ضى', 'ﴤ' => 'ضي', 'ﴥ' => 'شج', 'ﴦ' => 'شح', 'ﴧ' => 'شخ', 'ﴨ' => 'شم', 'ﴩ' => 'شر', 'ﴪ' => 'سر', 'ﴫ' => 'صر', 'ﴬ' => 'ضر', 'ﴭ' => 'شج', 'ﴮ' => 'شح', 'ﴯ' => 'شخ', 'ﴰ' => 'شم', 'ﴱ' => 'سه', 'ﴲ' => 'شه', 'ﴳ' => 'طم', 'ﴴ' => 'سج', 'ﴵ' => 'سح', 'ﴶ' => 'سخ', 'ﴷ' => 'شج', 'ﴸ' => 'شح', 'ﴹ' => 'شخ', 'ﴺ' => 'طم', 'ﴻ' => 'ظم', 'ﴼ' => 'اً', 'ﴽ' => 'اً', 'ﵐ' => 'تجم', 'ﵑ' => 'تحج', 'ﵒ' => 'تحج', 'ﵓ' => 'تحم', 'ﵔ' => 'تخم', 'ﵕ' => 'تمج', 'ﵖ' => 'تمح', 'ﵗ' => 'تمخ', 'ﵘ' => 'جمح', 'ﵙ' => 'جمح', 'ﵚ' => 'حمي', 'ﵛ' => 'حمى', 'ﵜ' => 'سحج', 'ﵝ' => 'سجح', 'ﵞ' => 'سجى', 'ﵟ' => 'سمح', 'ﵠ' => 'سمح', 'ﵡ' => 'سمج', 'ﵢ' => 'سمم', 'ﵣ' => 'سمم', 'ﵤ' => 'صحح', 'ﵥ' => 'صحح', 'ﵦ' => 'صمم', 'ﵧ' => 'شحم', 'ﵨ' => 'شحم', 'ﵩ' => 'شجي', 'ﵪ' => 'شمخ', 'ﵫ' => 'شمخ', 'ﵬ' => 'شمم', 'ﵭ' => 'شمم', 'ﵮ' => 'ضحى', 'ﵯ' => 'ضخم', 'ﵰ' => 'ضخم', 'ﵱ' => 'طمح', 'ﵲ' => 'طمح', 'ﵳ' => 'طمم', 'ﵴ' => 'طمي', 'ﵵ' => 'عجم', 'ﵶ' => 'عمم', 'ﵷ' => 'عمم', 'ﵸ' => 'عمى', 'ﵹ' => 'غمم', 'ﵺ' => 'غمي', 'ﵻ' => 'غمى', 'ﵼ' => 'فخم', 'ﵽ' => 'فخم', 'ﵾ' => 'قمح', 'ﵿ' => 'قمم', 'ﶀ' => 'لحم', 'ﶁ' => 'لحي', 'ﶂ' => 'لحى', 'ﶃ' => 'لجج', 'ﶄ' => 'لجج', 'ﶅ' => 'لخم', 'ﶆ' => 'لخم', 'ﶇ' => 'لمح', 'ﶈ' => 'لمح', 'ﶉ' => 'محج', 'ﶊ' => 'محم', 'ﶋ' => 'محي', 'ﶌ' => 'مجح', 'ﶍ' => 'مجم', 'ﶎ' => 'مخج', 'ﶏ' => 'مخم', 'ﶒ' => 'مجخ', 'ﶓ' => 'همج', 'ﶔ' => 'همم', 'ﶕ' => 'نحم', 'ﶖ' => 'نحى', 'ﶗ' => 'نجم', 'ﶘ' => 'نجم', 'ﶙ' => 'نجى', 'ﶚ' => 'نمي', 'ﶛ' => 'نمى', 'ﶜ' => 'يمم', 'ﶝ' => 'يمم', 'ﶞ' => 'بخي', 'ﶟ' => 'تجي', 'ﶠ' => 'تجى', 'ﶡ' => 'تخي', 'ﶢ' => 'تخى', 'ﶣ' => 'تمي', 'ﶤ' => 'تمى', 'ﶥ' => 'جمي', 'ﶦ' => 'جحى', 'ﶧ' => 'جمى', 'ﶨ' => 'سخى', 'ﶩ' => 'صحي', 'ﶪ' => 'شحي', 'ﶫ' => 'ضحي', 'ﶬ' => 'لجي', 'ﶭ' => 'لمي', 'ﶮ' => 'يحي', 'ﶯ' => 'يجي', 'ﶰ' => 'يمي', 'ﶱ' => 'ممي', 'ﶲ' => 'قمي', 'ﶳ' => 'نحي', 'ﶴ' => 'قمح', 'ﶵ' => 'لحم', 'ﶶ' => 'عمي', 'ﶷ' => 'كمي', 'ﶸ' => 'نجح', 'ﶹ' => 'مخي', 'ﶺ' => 'لجم', 'ﶻ' => 'كمم', 'ﶼ' => 'لجم', 'ﶽ' => 'نجح', 'ﶾ' => 'جحي', 'ﶿ' => 'حجي', 'ﷀ' => 'مجي', 'ﷁ' => 'فمي', 'ﷂ' => 'بحي', 'ﷃ' => 'كمم', 'ﷄ' => 'عجم', 'ﷅ' => 'صمم', 'ﷆ' => 'سخي', 'ﷇ' => 'نجي', 'ﷰ' => 'صلے', 'ﷱ' => 'قلے', 'ﷲ' => 'الله', 'ﷳ' => 'اكبر', 'ﷴ' => 'محمد', 'ﷵ' => 'صلعم', 'ﷶ' => 'رسول', 'ﷷ' => 'عليه', 'ﷸ' => 'وسلم', 'ﷹ' => 'صلى', 'ﷺ' => 'صلى الله عليه وسلم', 'ﷻ' => 'جل جلاله', '﷼' => 'ریال', '︐' => ',', '︑' => '、', '︒' => '。', '︓' => ':', '︔' => ';', '︕' => '!', '︖' => '?', '︗' => '〖', '︘' => '〗', '︙' => '...', '︰' => '..', '︱' => '—', '︲' => '–', '︳' => '_', '︴' => '_', '︵' => '(', '︶' => ')', '︷' => '{', '︸' => '}', '︹' => '〔', '︺' => '〕', '︻' => '【', '︼' => '】', '︽' => '《', '︾' => '》', '︿' => '〈', '﹀' => '〉', '﹁' => '「', '﹂' => '」', '﹃' => '『', '﹄' => '』', '﹇' => '[', '﹈' => ']', '﹉' => ' ̅', '﹊' => ' ̅', '﹋' => ' ̅', '﹌' => ' ̅', '﹍' => '_', '﹎' => '_', '﹏' => '_', '﹐' => ',', '﹑' => '、', '﹒' => '.', '﹔' => ';', '﹕' => ':', '﹖' => '?', '﹗' => '!', '﹘' => '—', '﹙' => '(', '﹚' => ')', '﹛' => '{', '﹜' => '}', '﹝' => '〔', '﹞' => '〕', '﹟' => '#', '﹠' => '&', '﹡' => '*', '﹢' => '+', '﹣' => '-', '﹤' => '<', '﹥' => '>', '﹦' => '=', '﹨' => '\\', '﹩' => '$', '﹪' => '%', '﹫' => '@', 'ﹰ' => ' ً', 'ﹱ' => 'ـً', 'ﹲ' => ' ٌ', 'ﹴ' => ' ٍ', 'ﹶ' => ' َ', 'ﹷ' => 'ـَ', 'ﹸ' => ' ُ', 'ﹹ' => 'ـُ', 'ﹺ' => ' ِ', 'ﹻ' => 'ـِ', 'ﹼ' => ' ّ', 'ﹽ' => 'ـّ', 'ﹾ' => ' ْ', 'ﹿ' => 'ـْ', 'ﺀ' => 'ء', 'ﺁ' => 'آ', 'ﺂ' => 'آ', 'ﺃ' => 'أ', 'ﺄ' => 'أ', 'ﺅ' => 'ؤ', 'ﺆ' => 'ؤ', 'ﺇ' => 'إ', 'ﺈ' => 'إ', 'ﺉ' => 'ئ', 'ﺊ' => 'ئ', 'ﺋ' => 'ئ', 'ﺌ' => 'ئ', 'ﺍ' => 'ا', 'ﺎ' => 'ا', 'ﺏ' => 'ب', 'ﺐ' => 'ب', 'ﺑ' => 'ب', 'ﺒ' => 'ب', 'ﺓ' => 'ة', 'ﺔ' => 'ة', 'ﺕ' => 'ت', 'ﺖ' => 'ت', 'ﺗ' => 'ت', 'ﺘ' => 'ت', 'ﺙ' => 'ث', 'ﺚ' => 'ث', 'ﺛ' => 'ث', 'ﺜ' => 'ث', 'ﺝ' => 'ج', 'ﺞ' => 'ج', 'ﺟ' => 'ج', 'ﺠ' => 'ج', 'ﺡ' => 'ح', 'ﺢ' => 'ح', 'ﺣ' => 'ح', 'ﺤ' => 'ح', 'ﺥ' => 'خ', 'ﺦ' => 'خ', 'ﺧ' => 'خ', 'ﺨ' => 'خ', 'ﺩ' => 'د', 'ﺪ' => 'د', 'ﺫ' => 'ذ', 'ﺬ' => 'ذ', 'ﺭ' => 'ر', 'ﺮ' => 'ر', 'ﺯ' => 'ز', 'ﺰ' => 'ز', 'ﺱ' => 'س', 'ﺲ' => 'س', 'ﺳ' => 'س', 'ﺴ' => 'س', 'ﺵ' => 'ش', 'ﺶ' => 'ش', 'ﺷ' => 'ش', 'ﺸ' => 'ش', 'ﺹ' => 'ص', 'ﺺ' => 'ص', 'ﺻ' => 'ص', 'ﺼ' => 'ص', 'ﺽ' => 'ض', 'ﺾ' => 'ض', 'ﺿ' => 'ض', 'ﻀ' => 'ض', 'ﻁ' => 'ط', 'ﻂ' => 'ط', 'ﻃ' => 'ط', 'ﻄ' => 'ط', 'ﻅ' => 'ظ', 'ﻆ' => 'ظ', 'ﻇ' => 'ظ', 'ﻈ' => 'ظ', 'ﻉ' => 'ع', 'ﻊ' => 'ع', 'ﻋ' => 'ع', 'ﻌ' => 'ع', 'ﻍ' => 'غ', 'ﻎ' => 'غ', 'ﻏ' => 'غ', 'ﻐ' => 'غ', 'ﻑ' => 'ف', 'ﻒ' => 'ف', 'ﻓ' => 'ف', 'ﻔ' => 'ف', 'ﻕ' => 'ق', 'ﻖ' => 'ق', 'ﻗ' => 'ق', 'ﻘ' => 'ق', 'ﻙ' => 'ك', 'ﻚ' => 'ك', 'ﻛ' => 'ك', 'ﻜ' => 'ك', 'ﻝ' => 'ل', 'ﻞ' => 'ل', 'ﻟ' => 'ل', 'ﻠ' => 'ل', 'ﻡ' => 'م', 'ﻢ' => 'م', 'ﻣ' => 'م', 'ﻤ' => 'م', 'ﻥ' => 'ن', 'ﻦ' => 'ن', 'ﻧ' => 'ن', 'ﻨ' => 'ن', 'ﻩ' => 'ه', 'ﻪ' => 'ه', 'ﻫ' => 'ه', 'ﻬ' => 'ه', 'ﻭ' => 'و', 'ﻮ' => 'و', 'ﻯ' => 'ى', 'ﻰ' => 'ى', 'ﻱ' => 'ي', 'ﻲ' => 'ي', 'ﻳ' => 'ي', 'ﻴ' => 'ي', 'ﻵ' => 'لآ', 'ﻶ' => 'لآ', 'ﻷ' => 'لأ', 'ﻸ' => 'لأ', 'ﻹ' => 'لإ', 'ﻺ' => 'لإ', 'ﻻ' => 'لا', 'ﻼ' => 'لا', '!' => '!', '"' => '"', '#' => '#', '$' => '$', '%' => '%', '&' => '&', ''' => '\'', '(' => '(', ')' => ')', '*' => '*', '+' => '+', ',' => ',', '-' => '-', '.' => '.', '/' => '/', '0' => '0', '1' => '1', '2' => '2', '3' => '3', '4' => '4', '5' => '5', '6' => '6', '7' => '7', '8' => '8', '9' => '9', ':' => ':', ';' => ';', '<' => '<', '=' => '=', '>' => '>', '?' => '?', '@' => '@', 'A' => 'A', 'B' => 'B', 'C' => 'C', 'D' => 'D', 'E' => 'E', 'F' => 'F', 'G' => 'G', 'H' => 'H', 'I' => 'I', 'J' => 'J', 'K' => 'K', 'L' => 'L', 'M' => 'M', 'N' => 'N', 'O' => 'O', 'P' => 'P', 'Q' => 'Q', 'R' => 'R', 'S' => 'S', 'T' => 'T', 'U' => 'U', 'V' => 'V', 'W' => 'W', 'X' => 'X', 'Y' => 'Y', 'Z' => 'Z', '[' => '[', '\' => '\\', ']' => ']', '^' => '^', '_' => '_', '`' => '`', 'a' => 'a', 'b' => 'b', 'c' => 'c', 'd' => 'd', 'e' => 'e', 'f' => 'f', 'g' => 'g', 'h' => 'h', 'i' => 'i', 'j' => 'j', 'k' => 'k', 'l' => 'l', 'm' => 'm', 'n' => 'n', 'o' => 'o', 'p' => 'p', 'q' => 'q', 'r' => 'r', 's' => 's', 't' => 't', 'u' => 'u', 'v' => 'v', 'w' => 'w', 'x' => 'x', 'y' => 'y', 'z' => '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', '𝐚' => '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', '𝑎' => 'a', '𝑏' => 'b', '𝑐' => 'c', '𝑑' => 'd', '𝑒' => 'e', '𝑓' => 'f', '𝑔' => 'g', '𝑖' => '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', '𝒂' => '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', '𝒞' => 'C', '𝒟' => 'D', '𝒢' => 'G', '𝒥' => 'J', '𝒦' => 'K', '𝒩' => 'N', '𝒪' => 'O', '𝒫' => 'P', '𝒬' => 'Q', '𝒮' => 'S', '𝒯' => 'T', '𝒰' => 'U', '𝒱' => 'V', '𝒲' => 'W', '𝒳' => 'X', '𝒴' => 'Y', '𝒵' => 'Z', '𝒶' => 'a', '𝒷' => 'b', '𝒸' => 'c', '𝒹' => 'd', '𝒻' => 'f', '𝒽' => 'h', '𝒾' => 'i', '𝒿' => 'j', '𝓀' => 'k', '𝓁' => 'l', '𝓂' => 'm', '𝓃' => 'n', '𝓅' => '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', '𝓪' => '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', '𝔇' => 'D', '𝔈' => 'E', '𝔉' => 'F', '𝔊' => 'G', '𝔍' => 'J', '𝔎' => 'K', '𝔏' => 'L', '𝔐' => 'M', '𝔑' => 'N', '𝔒' => 'O', '𝔓' => 'P', '𝔔' => 'Q', '𝔖' => 'S', '𝔗' => 'T', '𝔘' => 'U', '𝔙' => 'V', '𝔚' => 'W', '𝔛' => 'X', '𝔜' => 'Y', '𝔞' => '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', '𝔻' => 'D', '𝔼' => 'E', '𝔽' => 'F', '𝔾' => 'G', '𝕀' => 'I', '𝕁' => 'J', '𝕂' => 'K', '𝕃' => 'L', '𝕄' => 'M', '𝕆' => 'O', '𝕊' => 'S', '𝕋' => 'T', '𝕌' => 'U', '𝕍' => 'V', '𝕎' => 'W', '𝕏' => 'X', '𝕐' => 'Y', '𝕒' => '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', '𝖆' => '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', '𝖺' => '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', '𝗮' => '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', '𝘢' => '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', '𝙖' => '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', '𝚊' => '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', '𝚤' => 'ı', '𝚥' => 'ȷ', '𝚨' => 'Α', '𝚩' => 'Β', '𝚪' => 'Γ', '𝚫' => 'Δ', '𝚬' => 'Ε', '𝚭' => 'Ζ', '𝚮' => 'Η', '𝚯' => 'Θ', '𝚰' => 'Ι', '𝚱' => 'Κ', '𝚲' => 'Λ', '𝚳' => 'Μ', '𝚴' => 'Ν', '𝚵' => 'Ξ', '𝚶' => 'Ο', '𝚷' => 'Π', '𝚸' => 'Ρ', '𝚹' => 'Θ', '𝚺' => 'Σ', '𝚻' => 'Τ', '𝚼' => 'Υ', '𝚽' => 'Φ', '𝚾' => 'Χ', '𝚿' => 'Ψ', '𝛀' => 'Ω', '𝛁' => '∇', '𝛂' => 'α', '𝛃' => 'β', '𝛄' => 'γ', '𝛅' => 'δ', '𝛆' => 'ε', '𝛇' => 'ζ', '𝛈' => 'η', '𝛉' => 'θ', '𝛊' => 'ι', '𝛋' => 'κ', '𝛌' => 'λ', '𝛍' => 'μ', '𝛎' => 'ν', '𝛏' => 'ξ', '𝛐' => 'ο', '𝛑' => 'π', '𝛒' => 'ρ', '𝛓' => 'ς', '𝛔' => 'σ', '𝛕' => 'τ', '𝛖' => 'υ', '𝛗' => 'φ', '𝛘' => 'χ', '𝛙' => 'ψ', '𝛚' => 'ω', '𝛛' => '∂', '𝛜' => 'ε', '𝛝' => 'θ', '𝛞' => 'κ', '𝛟' => 'φ', '𝛠' => 'ρ', '𝛡' => 'π', '𝛢' => 'Α', '𝛣' => 'Β', '𝛤' => 'Γ', '𝛥' => 'Δ', '𝛦' => 'Ε', '𝛧' => 'Ζ', '𝛨' => 'Η', '𝛩' => 'Θ', '𝛪' => 'Ι', '𝛫' => 'Κ', '𝛬' => 'Λ', '𝛭' => 'Μ', '𝛮' => 'Ν', '𝛯' => 'Ξ', '𝛰' => 'Ο', '𝛱' => 'Π', '𝛲' => 'Ρ', '𝛳' => 'Θ', '𝛴' => 'Σ', '𝛵' => 'Τ', '𝛶' => 'Υ', '𝛷' => 'Φ', '𝛸' => 'Χ', '𝛹' => 'Ψ', '𝛺' => 'Ω', '𝛻' => '∇', '𝛼' => 'α', '𝛽' => 'β', '𝛾' => 'γ', '𝛿' => 'δ', '𝜀' => 'ε', '𝜁' => 'ζ', '𝜂' => 'η', '𝜃' => 'θ', '𝜄' => 'ι', '𝜅' => 'κ', '𝜆' => 'λ', '𝜇' => 'μ', '𝜈' => 'ν', '𝜉' => 'ξ', '𝜊' => 'ο', '𝜋' => 'π', '𝜌' => 'ρ', '𝜍' => 'ς', '𝜎' => 'σ', '𝜏' => 'τ', '𝜐' => 'υ', '𝜑' => 'φ', '𝜒' => 'χ', '𝜓' => 'ψ', '𝜔' => 'ω', '𝜕' => '∂', '𝜖' => 'ε', '𝜗' => 'θ', '𝜘' => 'κ', '𝜙' => 'φ', '𝜚' => 'ρ', '𝜛' => 'π', '𝜜' => 'Α', '𝜝' => 'Β', '𝜞' => 'Γ', '𝜟' => 'Δ', '𝜠' => 'Ε', '𝜡' => 'Ζ', '𝜢' => 'Η', '𝜣' => 'Θ', '𝜤' => 'Ι', '𝜥' => 'Κ', '𝜦' => 'Λ', '𝜧' => 'Μ', '𝜨' => 'Ν', '𝜩' => 'Ξ', '𝜪' => 'Ο', '𝜫' => 'Π', '𝜬' => 'Ρ', '𝜭' => 'Θ', '𝜮' => 'Σ', '𝜯' => 'Τ', '𝜰' => 'Υ', '𝜱' => 'Φ', '𝜲' => 'Χ', '𝜳' => 'Ψ', '𝜴' => 'Ω', '𝜵' => '∇', '𝜶' => 'α', '𝜷' => 'β', '𝜸' => 'γ', '𝜹' => 'δ', '𝜺' => 'ε', '𝜻' => 'ζ', '𝜼' => 'η', '𝜽' => 'θ', '𝜾' => 'ι', '𝜿' => 'κ', '𝝀' => 'λ', '𝝁' => 'μ', '𝝂' => 'ν', '𝝃' => 'ξ', '𝝄' => 'ο', '𝝅' => 'π', '𝝆' => 'ρ', '𝝇' => 'ς', '𝝈' => 'σ', '𝝉' => 'τ', '𝝊' => 'υ', '𝝋' => 'φ', '𝝌' => 'χ', '𝝍' => 'ψ', '𝝎' => 'ω', '𝝏' => '∂', '𝝐' => 'ε', '𝝑' => 'θ', '𝝒' => 'κ', '𝝓' => 'φ', '𝝔' => 'ρ', '𝝕' => 'π', '𝝖' => 'Α', '𝝗' => 'Β', '𝝘' => 'Γ', '𝝙' => 'Δ', '𝝚' => 'Ε', '𝝛' => 'Ζ', '𝝜' => 'Η', '𝝝' => 'Θ', '𝝞' => 'Ι', '𝝟' => 'Κ', '𝝠' => 'Λ', '𝝡' => 'Μ', '𝝢' => 'Ν', '𝝣' => 'Ξ', '𝝤' => 'Ο', '𝝥' => 'Π', '𝝦' => 'Ρ', '𝝧' => 'Θ', '𝝨' => 'Σ', '𝝩' => 'Τ', '𝝪' => 'Υ', '𝝫' => 'Φ', '𝝬' => 'Χ', '𝝭' => 'Ψ', '𝝮' => 'Ω', '𝝯' => '∇', '𝝰' => 'α', '𝝱' => 'β', '𝝲' => 'γ', '𝝳' => 'δ', '𝝴' => 'ε', '𝝵' => 'ζ', '𝝶' => 'η', '𝝷' => 'θ', '𝝸' => 'ι', '𝝹' => 'κ', '𝝺' => 'λ', '𝝻' => 'μ', '𝝼' => 'ν', '𝝽' => 'ξ', '𝝾' => 'ο', '𝝿' => 'π', '𝞀' => 'ρ', '𝞁' => 'ς', '𝞂' => 'σ', '𝞃' => 'τ', '𝞄' => 'υ', '𝞅' => 'φ', '𝞆' => 'χ', '𝞇' => 'ψ', '𝞈' => 'ω', '𝞉' => '∂', '𝞊' => 'ε', '𝞋' => 'θ', '𝞌' => 'κ', '𝞍' => 'φ', '𝞎' => 'ρ', '𝞏' => 'π', '𝞐' => 'Α', '𝞑' => 'Β', '𝞒' => 'Γ', '𝞓' => 'Δ', '𝞔' => 'Ε', '𝞕' => 'Ζ', '𝞖' => 'Η', '𝞗' => 'Θ', '𝞘' => 'Ι', '𝞙' => 'Κ', '𝞚' => 'Λ', '𝞛' => 'Μ', '𝞜' => 'Ν', '𝞝' => 'Ξ', '𝞞' => 'Ο', '𝞟' => 'Π', '𝞠' => 'Ρ', '𝞡' => 'Θ', '𝞢' => 'Σ', '𝞣' => 'Τ', '𝞤' => 'Υ', '𝞥' => 'Φ', '𝞦' => 'Χ', '𝞧' => 'Ψ', '𝞨' => 'Ω', '𝞩' => '∇', '𝞪' => 'α', '𝞫' => 'β', '𝞬' => 'γ', '𝞭' => 'δ', '𝞮' => 'ε', '𝞯' => 'ζ', '𝞰' => 'η', '𝞱' => 'θ', '𝞲' => 'ι', '𝞳' => 'κ', '𝞴' => 'λ', '𝞵' => 'μ', '𝞶' => 'ν', '𝞷' => 'ξ', '𝞸' => 'ο', '𝞹' => 'π', '𝞺' => 'ρ', '𝞻' => 'ς', '𝞼' => 'σ', '𝞽' => 'τ', '𝞾' => 'υ', '𝞿' => 'φ', '𝟀' => 'χ', '𝟁' => 'ψ', '𝟂' => 'ω', '𝟃' => '∂', '𝟄' => 'ε', '𝟅' => 'θ', '𝟆' => 'κ', '𝟇' => 'φ', '𝟈' => 'ρ', '𝟉' => 'π', '𝟊' => 'Ϝ', '𝟋' => 'ϝ', '𝟎' => '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', '𝟬' => '0', '𝟭' => '1', '𝟮' => '2', '𝟯' => '3', '𝟰' => '4', '𝟱' => '5', '𝟲' => '6', '𝟳' => '7', '𝟴' => '8', '𝟵' => '9', '𝟶' => '0', '𝟷' => '1', '𝟸' => '2', '𝟹' => '3', '𝟺' => '4', '𝟻' => '5', '𝟼' => '6', '𝟽' => '7', '𝟾' => '8', '𝟿' => '9', '𞸀' => 'ا', '𞸁' => 'ب', '𞸂' => 'ج', '𞸃' => 'د', '𞸅' => 'و', '𞸆' => 'ز', '𞸇' => 'ح', '𞸈' => 'ط', '𞸉' => 'ي', '𞸊' => 'ك', '𞸋' => 'ل', '𞸌' => 'م', '𞸍' => 'ن', '𞸎' => 'س', '𞸏' => 'ع', '𞸐' => 'ف', '𞸑' => 'ص', '𞸒' => 'ق', '𞸓' => 'ر', '𞸔' => 'ش', '𞸕' => 'ت', '𞸖' => 'ث', '𞸗' => 'خ', '𞸘' => 'ذ', '𞸙' => 'ض', '𞸚' => 'ظ', '𞸛' => 'غ', '𞸜' => 'ٮ', '𞸝' => 'ں', '𞸞' => 'ڡ', '𞸟' => 'ٯ', '𞸡' => 'ب', '𞸢' => 'ج', '𞸤' => 'ه', '𞸧' => 'ح', '𞸩' => 'ي', '𞸪' => 'ك', '𞸫' => 'ل', '𞸬' => 'م', '𞸭' => 'ن', '𞸮' => 'س', '𞸯' => 'ع', '𞸰' => 'ف', '𞸱' => 'ص', '𞸲' => 'ق', '𞸴' => 'ش', '𞸵' => 'ت', '𞸶' => 'ث', '𞸷' => 'خ', '𞸹' => 'ض', '𞸻' => 'غ', '𞹂' => 'ج', '𞹇' => 'ح', '𞹉' => 'ي', '𞹋' => 'ل', '𞹍' => 'ن', '𞹎' => 'س', '𞹏' => 'ع', '𞹑' => 'ص', '𞹒' => 'ق', '𞹔' => 'ش', '𞹗' => 'خ', '𞹙' => 'ض', '𞹛' => 'غ', '𞹝' => 'ں', '𞹟' => 'ٯ', '𞹡' => 'ب', '𞹢' => 'ج', '𞹤' => 'ه', '𞹧' => 'ح', '𞹨' => 'ط', '𞹩' => 'ي', '𞹪' => 'ك', '𞹬' => 'م', '𞹭' => 'ن', '𞹮' => 'س', '𞹯' => 'ع', '𞹰' => 'ف', '𞹱' => 'ص', '𞹲' => 'ق', '𞹴' => 'ش', '𞹵' => 'ت', '𞹶' => 'ث', '𞹷' => 'خ', '𞹹' => 'ض', '𞹺' => 'ظ', '𞹻' => 'غ', '𞹼' => 'ٮ', '𞹾' => 'ڡ', '𞺀' => 'ا', '𞺁' => 'ب', '𞺂' => 'ج', '𞺃' => 'د', '𞺄' => 'ه', '𞺅' => 'و', '𞺆' => 'ز', '𞺇' => 'ح', '𞺈' => 'ط', '𞺉' => 'ي', '𞺋' => 'ل', '𞺌' => 'م', '𞺍' => 'ن', '𞺎' => 'س', '𞺏' => 'ع', '𞺐' => 'ف', '𞺑' => 'ص', '𞺒' => 'ق', '𞺓' => 'ر', '𞺔' => 'ش', '𞺕' => 'ت', '𞺖' => 'ث', '𞺗' => 'خ', '𞺘' => 'ذ', '𞺙' => 'ض', '𞺚' => 'ظ', '𞺛' => 'غ', '𞺡' => 'ب', '𞺢' => 'ج', '𞺣' => 'د', '𞺥' => 'و', '𞺦' => 'ز', '𞺧' => 'ح', '𞺨' => 'ط', '𞺩' => 'ي', '𞺫' => 'ل', '𞺬' => 'م', '𞺭' => 'ن', '𞺮' => 'س', '𞺯' => 'ع', '𞺰' => 'ف', '𞺱' => 'ص', '𞺲' => 'ق', '𞺳' => 'ر', '𞺴' => 'ش', '𞺵' => 'ت', '𞺶' => 'ث', '𞺷' => 'خ', '𞺸' => 'ذ', '𞺹' => 'ض', '𞺺' => 'ظ', '𞺻' => 'غ', '🄀' => '0.', '🄁' => '0,', '🄂' => '1,', '🄃' => '2,', '🄄' => '3,', '🄅' => '4,', '🄆' => '5,', '🄇' => '6,', '🄈' => '7,', '🄉' => '8,', '🄊' => '9,', '🄐' => '(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)', '🄪' => '〔S〕', '🄫' => 'C', '🄬' => 'R', '🄭' => 'CD', '🄮' => 'WZ', '🄰' => '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', '🅊' => 'HV', '🅋' => 'MV', '🅌' => 'SD', '🅍' => 'SS', '🅎' => 'PPV', '🅏' => 'WC', '🅪' => 'MC', '🅫' => 'MD', '🅬' => 'MR', '🆐' => 'DJ', '🈀' => 'ほか', '🈁' => 'ココ', '🈂' => 'サ', '🈐' => '手', '🈑' => '字', '🈒' => '双', '🈓' => 'デ', '🈔' => '二', '🈕' => '多', '🈖' => '解', '🈗' => '天', '🈘' => '交', '🈙' => '映', '🈚' => '無', '🈛' => '料', '🈜' => '前', '🈝' => '後', '🈞' => '再', '🈟' => '新', '🈠' => '初', '🈡' => '終', '🈢' => '生', '🈣' => '販', '🈤' => '声', '🈥' => '吹', '🈦' => '演', '🈧' => '投', '🈨' => '捕', '🈩' => '一', '🈪' => '三', '🈫' => '遊', '🈬' => '左', '🈭' => '中', '🈮' => '右', '🈯' => '指', '🈰' => '走', '🈱' => '打', '🈲' => '禁', '🈳' => '空', '🈴' => '合', '🈵' => '満', '🈶' => '有', '🈷' => '月', '🈸' => '申', '🈹' => '割', '🈺' => '営', '🈻' => '配', '🉀' => '〔本〕', '🉁' => '〔三〕', '🉂' => '〔二〕', '🉃' => '〔安〕', '🉄' => '〔点〕', '🉅' => '〔打〕', '🉆' => '〔盗〕', '🉇' => '〔勝〕', '🉈' => '〔敗〕', '🉐' => '得', '🉑' => '可', '🯰' => '0', '🯱' => '1', '🯲' => '2', '🯳' => '3', '🯴' => '4', '🯵' => '5', '🯶' => '6', '🯷' => '7', '🯸' => '8', '🯹' => '9'); 'À', 'Á' => 'Á', 'Â' => 'Â', 'Ã' => 'Ã', 'Ä' => 'Ä', 'Å' => 'Å', 'Ç' => 'Ç', 'È' => 'È', 'É' => 'É', 'Ê' => 'Ê', 'Ë' => 'Ë', 'Ì' => 'Ì', 'Í' => 'Í', 'Î' => 'Î', 'Ï' => 'Ï', 'Ñ' => 'Ñ', 'Ò' => 'Ò', 'Ó' => 'Ó', 'Ô' => 'Ô', 'Õ' => 'Õ', 'Ö' => 'Ö', 'Ù' => 'Ù', 'Ú' => 'Ú', 'Û' => 'Û', 'Ü' => 'Ü', 'Ý' => 'Ý', 'à' => 'à', 'á' => 'á', 'â' => 'â', 'ã' => 'ã', 'ä' => 'ä', 'å' => 'å', 'ç' => 'ç', 'è' => 'è', 'é' => 'é', 'ê' => 'ê', 'ë' => 'ë', 'ì' => 'ì', 'í' => 'í', 'î' => 'î', 'ï' => 'ï', 'ñ' => 'ñ', 'ò' => 'ò', 'ó' => 'ó', 'ô' => 'ô', 'õ' => 'õ', 'ö' => 'ö', 'ù' => 'ù', 'ú' => 'ú', 'û' => 'û', 'ü' => 'ü', 'ý' => 'ý', 'ÿ' => 'ÿ', 'Ā' => 'Ā', 'ā' => 'ā', 'Ă' => 'Ă', 'ă' => 'ă', 'Ą' => 'Ą', 'ą' => 'ą', 'Ć' => 'Ć', 'ć' => 'ć', 'Ĉ' => 'Ĉ', 'ĉ' => 'ĉ', 'Ċ' => 'Ċ', 'ċ' => 'ċ', 'Č' => 'Č', 'č' => 'č', 'Ď' => 'Ď', 'ď' => 'ď', 'Ē' => 'Ē', 'ē' => 'ē', 'Ĕ' => 'Ĕ', 'ĕ' => 'ĕ', 'Ė' => 'Ė', 'ė' => 'ė', 'Ę' => 'Ę', 'ę' => 'ę', 'Ě' => 'Ě', 'ě' => 'ě', 'Ĝ' => 'Ĝ', 'ĝ' => 'ĝ', 'Ğ' => 'Ğ', 'ğ' => 'ğ', 'Ġ' => 'Ġ', 'ġ' => 'ġ', 'Ģ' => 'Ģ', 'ģ' => 'ģ', 'Ĥ' => 'Ĥ', 'ĥ' => 'ĥ', 'Ĩ' => 'Ĩ', 'ĩ' => 'ĩ', 'Ī' => 'Ī', 'ī' => 'ī', 'Ĭ' => 'Ĭ', 'ĭ' => 'ĭ', 'Į' => 'Į', 'į' => 'į', 'İ' => 'İ', 'Ĵ' => 'Ĵ', 'ĵ' => 'ĵ', 'Ķ' => 'Ķ', 'ķ' => 'ķ', 'Ĺ' => 'Ĺ', 'ĺ' => 'ĺ', 'Ļ' => 'Ļ', 'ļ' => 'ļ', 'Ľ' => 'Ľ', 'ľ' => 'ľ', 'Ń' => 'Ń', 'ń' => 'ń', 'Ņ' => 'Ņ', 'ņ' => 'ņ', 'Ň' => 'Ň', 'ň' => 'ň', 'Ō' => 'Ō', 'ō' => 'ō', 'Ŏ' => 'Ŏ', 'ŏ' => 'ŏ', 'Ő' => 'Ő', 'ő' => 'ő', 'Ŕ' => 'Ŕ', 'ŕ' => 'ŕ', 'Ŗ' => 'Ŗ', 'ŗ' => 'ŗ', 'Ř' => 'Ř', 'ř' => 'ř', 'Ś' => 'Ś', 'ś' => 'ś', 'Ŝ' => 'Ŝ', 'ŝ' => 'ŝ', 'Ş' => 'Ş', 'ş' => 'ş', 'Š' => 'Š', 'š' => 'š', 'Ţ' => 'Ţ', 'ţ' => 'ţ', 'Ť' => 'Ť', 'ť' => 'ť', 'Ũ' => 'Ũ', 'ũ' => 'ũ', 'Ū' => 'Ū', 'ū' => 'ū', 'Ŭ' => 'Ŭ', 'ŭ' => 'ŭ', 'Ů' => 'Ů', 'ů' => 'ů', 'Ű' => 'Ű', 'ű' => 'ű', 'Ų' => 'Ų', 'ų' => 'ų', 'Ŵ' => 'Ŵ', 'ŵ' => 'ŵ', 'Ŷ' => 'Ŷ', 'ŷ' => 'ŷ', 'Ÿ' => 'Ÿ', 'Ź' => 'Ź', 'ź' => 'ź', 'Ż' => 'Ż', 'ż' => 'ż', 'Ž' => 'Ž', 'ž' => 'ž', 'Ơ' => 'Ơ', 'ơ' => 'ơ', 'Ư' => 'Ư', 'ư' => 'ư', 'Ǎ' => 'Ǎ', 'ǎ' => 'ǎ', 'Ǐ' => 'Ǐ', 'ǐ' => 'ǐ', 'Ǒ' => 'Ǒ', 'ǒ' => 'ǒ', 'Ǔ' => 'Ǔ', 'ǔ' => 'ǔ', 'Ǖ' => 'Ǖ', 'ǖ' => 'ǖ', 'Ǘ' => 'Ǘ', 'ǘ' => 'ǘ', 'Ǚ' => 'Ǚ', 'ǚ' => 'ǚ', 'Ǜ' => 'Ǜ', 'ǜ' => 'ǜ', 'Ǟ' => 'Ǟ', 'ǟ' => 'ǟ', 'Ǡ' => 'Ǡ', 'ǡ' => 'ǡ', 'Ǣ' => 'Ǣ', 'ǣ' => 'ǣ', 'Ǧ' => 'Ǧ', 'ǧ' => 'ǧ', 'Ǩ' => 'Ǩ', 'ǩ' => 'ǩ', 'Ǫ' => 'Ǫ', 'ǫ' => 'ǫ', 'Ǭ' => 'Ǭ', 'ǭ' => 'ǭ', 'Ǯ' => 'Ǯ', 'ǯ' => 'ǯ', 'ǰ' => 'ǰ', 'Ǵ' => 'Ǵ', 'ǵ' => 'ǵ', 'Ǹ' => 'Ǹ', 'ǹ' => 'ǹ', 'Ǻ' => 'Ǻ', 'ǻ' => 'ǻ', 'Ǽ' => 'Ǽ', 'ǽ' => 'ǽ', 'Ǿ' => 'Ǿ', 'ǿ' => 'ǿ', 'Ȁ' => 'Ȁ', 'ȁ' => 'ȁ', 'Ȃ' => 'Ȃ', 'ȃ' => 'ȃ', 'Ȅ' => 'Ȅ', 'ȅ' => 'ȅ', 'Ȇ' => 'Ȇ', 'ȇ' => 'ȇ', 'Ȉ' => 'Ȉ', 'ȉ' => 'ȉ', 'Ȋ' => 'Ȋ', 'ȋ' => 'ȋ', 'Ȍ' => 'Ȍ', 'ȍ' => 'ȍ', 'Ȏ' => 'Ȏ', 'ȏ' => 'ȏ', 'Ȑ' => 'Ȑ', 'ȑ' => 'ȑ', 'Ȓ' => 'Ȓ', 'ȓ' => 'ȓ', 'Ȕ' => 'Ȕ', 'ȕ' => 'ȕ', 'Ȗ' => 'Ȗ', 'ȗ' => 'ȗ', 'Ș' => 'Ș', 'ș' => 'ș', 'Ț' => 'Ț', 'ț' => 'ț', 'Ȟ' => 'Ȟ', 'ȟ' => 'ȟ', 'Ȧ' => 'Ȧ', 'ȧ' => 'ȧ', 'Ȩ' => 'Ȩ', 'ȩ' => 'ȩ', 'Ȫ' => 'Ȫ', 'ȫ' => 'ȫ', 'Ȭ' => 'Ȭ', 'ȭ' => 'ȭ', 'Ȯ' => 'Ȯ', 'ȯ' => 'ȯ', 'Ȱ' => 'Ȱ', 'ȱ' => 'ȱ', 'Ȳ' => 'Ȳ', 'ȳ' => 'ȳ', '΅' => '΅', 'Ά' => 'Ά', 'Έ' => 'Έ', 'Ή' => 'Ή', 'Ί' => 'Ί', 'Ό' => 'Ό', 'Ύ' => 'Ύ', 'Ώ' => 'Ώ', 'ΐ' => 'ΐ', 'Ϊ' => 'Ϊ', 'Ϋ' => 'Ϋ', 'ά' => 'ά', 'έ' => 'έ', 'ή' => 'ή', 'ί' => 'ί', 'ΰ' => 'ΰ', 'ϊ' => 'ϊ', 'ϋ' => 'ϋ', 'ό' => 'ό', 'ύ' => 'ύ', 'ώ' => 'ώ', 'ϓ' => 'ϓ', 'ϔ' => 'ϔ', 'Ѐ' => 'Ѐ', 'Ё' => 'Ё', 'Ѓ' => 'Ѓ', 'Ї' => 'Ї', 'Ќ' => 'Ќ', 'Ѝ' => 'Ѝ', 'Ў' => 'Ў', 'Й' => 'Й', 'й' => 'й', 'ѐ' => 'ѐ', 'ё' => 'ё', 'ѓ' => 'ѓ', 'ї' => 'ї', 'ќ' => 'ќ', 'ѝ' => 'ѝ', 'ў' => 'ў', 'Ѷ' => 'Ѷ', 'ѷ' => 'ѷ', 'Ӂ' => 'Ӂ', 'ӂ' => 'ӂ', 'Ӑ' => 'Ӑ', 'ӑ' => 'ӑ', 'Ӓ' => 'Ӓ', 'ӓ' => 'ӓ', 'Ӗ' => 'Ӗ', 'ӗ' => 'ӗ', 'Ӛ' => 'Ӛ', 'ӛ' => 'ӛ', 'Ӝ' => 'Ӝ', 'ӝ' => 'ӝ', 'Ӟ' => 'Ӟ', 'ӟ' => 'ӟ', 'Ӣ' => 'Ӣ', 'ӣ' => 'ӣ', 'Ӥ' => 'Ӥ', 'ӥ' => 'ӥ', 'Ӧ' => 'Ӧ', 'ӧ' => 'ӧ', 'Ӫ' => 'Ӫ', 'ӫ' => 'ӫ', 'Ӭ' => 'Ӭ', 'ӭ' => 'ӭ', 'Ӯ' => 'Ӯ', 'ӯ' => 'ӯ', 'Ӱ' => 'Ӱ', 'ӱ' => 'ӱ', 'Ӳ' => 'Ӳ', 'ӳ' => 'ӳ', 'Ӵ' => 'Ӵ', 'ӵ' => 'ӵ', 'Ӹ' => 'Ӹ', 'ӹ' => 'ӹ', 'آ' => 'آ', 'أ' => 'أ', 'ؤ' => 'ؤ', 'إ' => 'إ', 'ئ' => 'ئ', 'ۀ' => 'ۀ', 'ۂ' => 'ۂ', 'ۓ' => 'ۓ', 'ऩ' => 'ऩ', 'ऱ' => 'ऱ', 'ऴ' => 'ऴ', 'ো' => 'ো', 'ৌ' => 'ৌ', 'ୈ' => 'ୈ', 'ୋ' => 'ୋ', 'ୌ' => 'ୌ', 'ஔ' => 'ஔ', 'ொ' => 'ொ', 'ோ' => 'ோ', 'ௌ' => 'ௌ', 'ై' => 'ై', 'ೀ' => 'ೀ', 'ೇ' => 'ೇ', 'ೈ' => 'ೈ', 'ೊ' => 'ೊ', 'ೋ' => 'ೋ', 'ൊ' => 'ൊ', 'ോ' => 'ോ', 'ൌ' => 'ൌ', 'ේ' => 'ේ', 'ො' => 'ො', 'ෝ' => 'ෝ', 'ෞ' => 'ෞ', 'ဦ' => 'ဦ', 'ᬆ' => 'ᬆ', 'ᬈ' => 'ᬈ', 'ᬊ' => 'ᬊ', 'ᬌ' => 'ᬌ', 'ᬎ' => 'ᬎ', 'ᬒ' => 'ᬒ', 'ᬻ' => 'ᬻ', 'ᬽ' => 'ᬽ', 'ᭀ' => 'ᭀ', 'ᭁ' => 'ᭁ', 'ᭃ' => 'ᭃ', 'Ḁ' => 'Ḁ', 'ḁ' => 'ḁ', 'Ḃ' => 'Ḃ', 'ḃ' => 'ḃ', 'Ḅ' => 'Ḅ', 'ḅ' => 'ḅ', 'Ḇ' => 'Ḇ', 'ḇ' => 'ḇ', 'Ḉ' => 'Ḉ', 'ḉ' => 'ḉ', 'Ḋ' => 'Ḋ', 'ḋ' => 'ḋ', 'Ḍ' => 'Ḍ', 'ḍ' => 'ḍ', 'Ḏ' => 'Ḏ', 'ḏ' => 'ḏ', 'Ḑ' => 'Ḑ', 'ḑ' => 'ḑ', 'Ḓ' => 'Ḓ', 'ḓ' => 'ḓ', 'Ḕ' => 'Ḕ', 'ḕ' => 'ḕ', 'Ḗ' => 'Ḗ', 'ḗ' => 'ḗ', 'Ḙ' => 'Ḙ', 'ḙ' => 'ḙ', 'Ḛ' => 'Ḛ', 'ḛ' => 'ḛ', 'Ḝ' => 'Ḝ', 'ḝ' => 'ḝ', 'Ḟ' => 'Ḟ', 'ḟ' => 'ḟ', 'Ḡ' => 'Ḡ', 'ḡ' => 'ḡ', 'Ḣ' => 'Ḣ', 'ḣ' => 'ḣ', 'Ḥ' => 'Ḥ', 'ḥ' => 'ḥ', 'Ḧ' => 'Ḧ', 'ḧ' => 'ḧ', 'Ḩ' => 'Ḩ', 'ḩ' => 'ḩ', 'Ḫ' => 'Ḫ', 'ḫ' => 'ḫ', 'Ḭ' => 'Ḭ', 'ḭ' => 'ḭ', 'Ḯ' => 'Ḯ', 'ḯ' => 'ḯ', 'Ḱ' => 'Ḱ', 'ḱ' => 'ḱ', 'Ḳ' => 'Ḳ', 'ḳ' => 'ḳ', 'Ḵ' => 'Ḵ', 'ḵ' => 'ḵ', 'Ḷ' => 'Ḷ', 'ḷ' => 'ḷ', 'Ḹ' => 'Ḹ', 'ḹ' => 'ḹ', 'Ḻ' => 'Ḻ', 'ḻ' => 'ḻ', 'Ḽ' => 'Ḽ', 'ḽ' => 'ḽ', 'Ḿ' => 'Ḿ', 'ḿ' => 'ḿ', 'Ṁ' => 'Ṁ', 'ṁ' => 'ṁ', 'Ṃ' => 'Ṃ', 'ṃ' => 'ṃ', 'Ṅ' => 'Ṅ', 'ṅ' => 'ṅ', 'Ṇ' => 'Ṇ', 'ṇ' => 'ṇ', 'Ṉ' => 'Ṉ', 'ṉ' => 'ṉ', 'Ṋ' => 'Ṋ', 'ṋ' => 'ṋ', 'Ṍ' => 'Ṍ', 'ṍ' => 'ṍ', 'Ṏ' => 'Ṏ', 'ṏ' => 'ṏ', 'Ṑ' => 'Ṑ', 'ṑ' => 'ṑ', 'Ṓ' => 'Ṓ', 'ṓ' => 'ṓ', 'Ṕ' => 'Ṕ', 'ṕ' => 'ṕ', 'Ṗ' => 'Ṗ', 'ṗ' => 'ṗ', 'Ṙ' => 'Ṙ', 'ṙ' => 'ṙ', 'Ṛ' => 'Ṛ', 'ṛ' => 'ṛ', 'Ṝ' => 'Ṝ', 'ṝ' => 'ṝ', 'Ṟ' => 'Ṟ', 'ṟ' => 'ṟ', 'Ṡ' => 'Ṡ', 'ṡ' => 'ṡ', 'Ṣ' => 'Ṣ', 'ṣ' => 'ṣ', 'Ṥ' => 'Ṥ', 'ṥ' => 'ṥ', 'Ṧ' => 'Ṧ', 'ṧ' => 'ṧ', 'Ṩ' => 'Ṩ', 'ṩ' => 'ṩ', 'Ṫ' => 'Ṫ', 'ṫ' => 'ṫ', 'Ṭ' => 'Ṭ', 'ṭ' => 'ṭ', 'Ṯ' => 'Ṯ', 'ṯ' => 'ṯ', 'Ṱ' => 'Ṱ', 'ṱ' => 'ṱ', 'Ṳ' => 'Ṳ', 'ṳ' => 'ṳ', 'Ṵ' => 'Ṵ', 'ṵ' => 'ṵ', 'Ṷ' => 'Ṷ', 'ṷ' => 'ṷ', 'Ṹ' => 'Ṹ', 'ṹ' => 'ṹ', 'Ṻ' => 'Ṻ', 'ṻ' => 'ṻ', 'Ṽ' => 'Ṽ', 'ṽ' => 'ṽ', 'Ṿ' => 'Ṿ', 'ṿ' => 'ṿ', 'Ẁ' => 'Ẁ', 'ẁ' => 'ẁ', 'Ẃ' => 'Ẃ', 'ẃ' => 'ẃ', 'Ẅ' => 'Ẅ', 'ẅ' => 'ẅ', 'Ẇ' => 'Ẇ', 'ẇ' => 'ẇ', 'Ẉ' => 'Ẉ', 'ẉ' => 'ẉ', 'Ẋ' => 'Ẋ', 'ẋ' => 'ẋ', 'Ẍ' => 'Ẍ', 'ẍ' => 'ẍ', 'Ẏ' => 'Ẏ', 'ẏ' => 'ẏ', 'Ẑ' => 'Ẑ', 'ẑ' => 'ẑ', 'Ẓ' => 'Ẓ', 'ẓ' => 'ẓ', 'Ẕ' => 'Ẕ', 'ẕ' => 'ẕ', 'ẖ' => 'ẖ', 'ẗ' => 'ẗ', 'ẘ' => 'ẘ', 'ẙ' => 'ẙ', 'ẛ' => 'ẛ', 'Ạ' => 'Ạ', 'ạ' => 'ạ', 'Ả' => 'Ả', 'ả' => 'ả', 'Ấ' => 'Ấ', 'ấ' => 'ấ', 'Ầ' => 'Ầ', 'ầ' => 'ầ', 'Ẩ' => 'Ẩ', 'ẩ' => 'ẩ', 'Ẫ' => 'Ẫ', 'ẫ' => 'ẫ', 'Ậ' => 'Ậ', 'ậ' => 'ậ', 'Ắ' => 'Ắ', 'ắ' => 'ắ', 'Ằ' => 'Ằ', 'ằ' => 'ằ', 'Ẳ' => 'Ẳ', 'ẳ' => 'ẳ', 'Ẵ' => 'Ẵ', 'ẵ' => 'ẵ', 'Ặ' => 'Ặ', 'ặ' => 'ặ', 'Ẹ' => 'Ẹ', 'ẹ' => 'ẹ', 'Ẻ' => 'Ẻ', 'ẻ' => 'ẻ', 'Ẽ' => 'Ẽ', 'ẽ' => 'ẽ', 'Ế' => 'Ế', 'ế' => 'ế', 'Ề' => 'Ề', 'ề' => 'ề', 'Ể' => 'Ể', 'ể' => 'ể', 'Ễ' => 'Ễ', 'ễ' => 'ễ', 'Ệ' => 'Ệ', 'ệ' => 'ệ', 'Ỉ' => 'Ỉ', 'ỉ' => 'ỉ', 'Ị' => 'Ị', 'ị' => 'ị', 'Ọ' => 'Ọ', 'ọ' => 'ọ', 'Ỏ' => 'Ỏ', 'ỏ' => 'ỏ', 'Ố' => 'Ố', 'ố' => 'ố', 'Ồ' => 'Ồ', 'ồ' => 'ồ', 'Ổ' => 'Ổ', 'ổ' => 'ổ', 'Ỗ' => 'Ỗ', 'ỗ' => 'ỗ', 'Ộ' => 'Ộ', 'ộ' => 'ộ', 'Ớ' => 'Ớ', 'ớ' => 'ớ', 'Ờ' => 'Ờ', 'ờ' => 'ờ', 'Ở' => 'Ở', 'ở' => 'ở', 'Ỡ' => 'Ỡ', 'ỡ' => 'ỡ', 'Ợ' => 'Ợ', 'ợ' => 'ợ', 'Ụ' => 'Ụ', 'ụ' => 'ụ', 'Ủ' => 'Ủ', 'ủ' => 'ủ', 'Ứ' => 'Ứ', 'ứ' => 'ứ', 'Ừ' => 'Ừ', 'ừ' => 'ừ', 'Ử' => 'Ử', 'ử' => 'ử', 'Ữ' => 'Ữ', 'ữ' => 'ữ', 'Ự' => 'Ự', 'ự' => 'ự', 'Ỳ' => 'Ỳ', 'ỳ' => 'ỳ', 'Ỵ' => 'Ỵ', 'ỵ' => 'ỵ', 'Ỷ' => 'Ỷ', 'ỷ' => 'ỷ', 'Ỹ' => 'Ỹ', 'ỹ' => 'ỹ', 'ἀ' => 'ἀ', 'ἁ' => 'ἁ', 'ἂ' => 'ἂ', 'ἃ' => 'ἃ', 'ἄ' => 'ἄ', 'ἅ' => 'ἅ', 'ἆ' => 'ἆ', 'ἇ' => 'ἇ', 'Ἀ' => 'Ἀ', 'Ἁ' => 'Ἁ', 'Ἂ' => 'Ἂ', 'Ἃ' => 'Ἃ', 'Ἄ' => 'Ἄ', 'Ἅ' => 'Ἅ', 'Ἆ' => 'Ἆ', 'Ἇ' => 'Ἇ', 'ἐ' => 'ἐ', 'ἑ' => 'ἑ', 'ἒ' => 'ἒ', 'ἓ' => 'ἓ', 'ἔ' => 'ἔ', 'ἕ' => 'ἕ', 'Ἐ' => 'Ἐ', 'Ἑ' => 'Ἑ', 'Ἒ' => 'Ἒ', 'Ἓ' => 'Ἓ', 'Ἔ' => 'Ἔ', 'Ἕ' => 'Ἕ', 'ἠ' => 'ἠ', 'ἡ' => 'ἡ', 'ἢ' => 'ἢ', 'ἣ' => 'ἣ', 'ἤ' => 'ἤ', 'ἥ' => 'ἥ', 'ἦ' => 'ἦ', 'ἧ' => 'ἧ', 'Ἠ' => 'Ἠ', 'Ἡ' => 'Ἡ', 'Ἢ' => 'Ἢ', 'Ἣ' => 'Ἣ', 'Ἤ' => 'Ἤ', 'Ἥ' => 'Ἥ', 'Ἦ' => 'Ἦ', 'Ἧ' => 'Ἧ', 'ἰ' => 'ἰ', 'ἱ' => 'ἱ', 'ἲ' => 'ἲ', 'ἳ' => 'ἳ', 'ἴ' => 'ἴ', 'ἵ' => 'ἵ', 'ἶ' => 'ἶ', 'ἷ' => 'ἷ', 'Ἰ' => 'Ἰ', 'Ἱ' => 'Ἱ', 'Ἲ' => 'Ἲ', 'Ἳ' => 'Ἳ', 'Ἴ' => 'Ἴ', 'Ἵ' => 'Ἵ', 'Ἶ' => 'Ἶ', 'Ἷ' => 'Ἷ', 'ὀ' => 'ὀ', 'ὁ' => 'ὁ', 'ὂ' => 'ὂ', 'ὃ' => 'ὃ', 'ὄ' => 'ὄ', 'ὅ' => 'ὅ', 'Ὀ' => 'Ὀ', 'Ὁ' => 'Ὁ', 'Ὂ' => 'Ὂ', 'Ὃ' => 'Ὃ', 'Ὄ' => 'Ὄ', 'Ὅ' => 'Ὅ', 'ὐ' => 'ὐ', 'ὑ' => 'ὑ', 'ὒ' => 'ὒ', 'ὓ' => 'ὓ', 'ὔ' => 'ὔ', 'ὕ' => 'ὕ', 'ὖ' => 'ὖ', 'ὗ' => 'ὗ', 'Ὑ' => 'Ὑ', 'Ὓ' => 'Ὓ', 'Ὕ' => 'Ὕ', 'Ὗ' => 'Ὗ', 'ὠ' => 'ὠ', 'ὡ' => 'ὡ', 'ὢ' => 'ὢ', 'ὣ' => 'ὣ', 'ὤ' => 'ὤ', 'ὥ' => 'ὥ', 'ὦ' => 'ὦ', 'ὧ' => 'ὧ', 'Ὠ' => 'Ὠ', 'Ὡ' => 'Ὡ', 'Ὢ' => 'Ὢ', 'Ὣ' => 'Ὣ', 'Ὤ' => 'Ὤ', 'Ὥ' => 'Ὥ', 'Ὦ' => 'Ὦ', 'Ὧ' => 'Ὧ', 'ὰ' => 'ὰ', 'ὲ' => 'ὲ', 'ὴ' => 'ὴ', 'ὶ' => 'ὶ', 'ὸ' => 'ὸ', 'ὺ' => 'ὺ', 'ὼ' => 'ὼ', 'ᾀ' => 'ᾀ', 'ᾁ' => 'ᾁ', 'ᾂ' => 'ᾂ', 'ᾃ' => 'ᾃ', 'ᾄ' => 'ᾄ', 'ᾅ' => 'ᾅ', 'ᾆ' => 'ᾆ', 'ᾇ' => 'ᾇ', 'ᾈ' => 'ᾈ', 'ᾉ' => 'ᾉ', 'ᾊ' => 'ᾊ', 'ᾋ' => 'ᾋ', 'ᾌ' => 'ᾌ', 'ᾍ' => 'ᾍ', 'ᾎ' => 'ᾎ', 'ᾏ' => 'ᾏ', 'ᾐ' => 'ᾐ', 'ᾑ' => 'ᾑ', 'ᾒ' => 'ᾒ', 'ᾓ' => 'ᾓ', 'ᾔ' => 'ᾔ', 'ᾕ' => 'ᾕ', 'ᾖ' => 'ᾖ', 'ᾗ' => 'ᾗ', 'ᾘ' => 'ᾘ', 'ᾙ' => 'ᾙ', 'ᾚ' => 'ᾚ', 'ᾛ' => 'ᾛ', 'ᾜ' => 'ᾜ', 'ᾝ' => 'ᾝ', 'ᾞ' => 'ᾞ', 'ᾟ' => 'ᾟ', 'ᾠ' => 'ᾠ', 'ᾡ' => 'ᾡ', 'ᾢ' => 'ᾢ', 'ᾣ' => 'ᾣ', 'ᾤ' => 'ᾤ', 'ᾥ' => 'ᾥ', 'ᾦ' => 'ᾦ', 'ᾧ' => 'ᾧ', 'ᾨ' => 'ᾨ', 'ᾩ' => 'ᾩ', 'ᾪ' => 'ᾪ', 'ᾫ' => 'ᾫ', 'ᾬ' => 'ᾬ', 'ᾭ' => 'ᾭ', 'ᾮ' => 'ᾮ', 'ᾯ' => 'ᾯ', 'ᾰ' => 'ᾰ', 'ᾱ' => 'ᾱ', 'ᾲ' => 'ᾲ', 'ᾳ' => 'ᾳ', 'ᾴ' => 'ᾴ', 'ᾶ' => 'ᾶ', 'ᾷ' => 'ᾷ', 'Ᾰ' => 'Ᾰ', 'Ᾱ' => 'Ᾱ', 'Ὰ' => 'Ὰ', 'ᾼ' => 'ᾼ', '῁' => '῁', 'ῂ' => 'ῂ', 'ῃ' => 'ῃ', 'ῄ' => 'ῄ', 'ῆ' => 'ῆ', 'ῇ' => 'ῇ', 'Ὲ' => 'Ὲ', 'Ὴ' => 'Ὴ', 'ῌ' => 'ῌ', '῍' => '῍', '῎' => '῎', '῏' => '῏', 'ῐ' => 'ῐ', 'ῑ' => 'ῑ', 'ῒ' => 'ῒ', 'ῖ' => 'ῖ', 'ῗ' => 'ῗ', 'Ῐ' => 'Ῐ', 'Ῑ' => 'Ῑ', 'Ὶ' => 'Ὶ', '῝' => '῝', '῞' => '῞', '῟' => '῟', 'ῠ' => 'ῠ', 'ῡ' => 'ῡ', 'ῢ' => 'ῢ', 'ῤ' => 'ῤ', 'ῥ' => 'ῥ', 'ῦ' => 'ῦ', 'ῧ' => 'ῧ', 'Ῠ' => 'Ῠ', 'Ῡ' => 'Ῡ', 'Ὺ' => 'Ὺ', 'Ῥ' => 'Ῥ', '῭' => '῭', 'ῲ' => 'ῲ', 'ῳ' => 'ῳ', 'ῴ' => 'ῴ', 'ῶ' => 'ῶ', 'ῷ' => 'ῷ', 'Ὸ' => 'Ὸ', 'Ὼ' => 'Ὼ', 'ῼ' => 'ῼ', '↚' => '↚', '↛' => '↛', '↮' => '↮', '⇍' => '⇍', '⇎' => '⇎', '⇏' => '⇏', '∄' => '∄', '∉' => '∉', '∌' => '∌', '∤' => '∤', '∦' => '∦', '≁' => '≁', '≄' => '≄', '≇' => '≇', '≉' => '≉', '≠' => '≠', '≢' => '≢', '≭' => '≭', '≮' => '≮', '≯' => '≯', '≰' => '≰', '≱' => '≱', '≴' => '≴', '≵' => '≵', '≸' => '≸', '≹' => '≹', '⊀' => '⊀', '⊁' => '⊁', '⊄' => '⊄', '⊅' => '⊅', '⊈' => '⊈', '⊉' => '⊉', '⊬' => '⊬', '⊭' => '⊭', '⊮' => '⊮', '⊯' => '⊯', '⋠' => '⋠', '⋡' => '⋡', '⋢' => '⋢', '⋣' => '⋣', '⋪' => '⋪', '⋫' => '⋫', '⋬' => '⋬', '⋭' => '⋭', 'が' => 'が', 'ぎ' => 'ぎ', 'ぐ' => 'ぐ', 'げ' => 'げ', 'ご' => 'ご', 'ざ' => 'ざ', 'じ' => 'じ', 'ず' => 'ず', 'ぜ' => 'ぜ', 'ぞ' => 'ぞ', 'だ' => 'だ', 'ぢ' => 'ぢ', 'づ' => 'づ', 'で' => 'で', 'ど' => 'ど', 'ば' => 'ば', 'ぱ' => 'ぱ', 'び' => 'び', 'ぴ' => 'ぴ', 'ぶ' => 'ぶ', 'ぷ' => 'ぷ', 'べ' => 'べ', 'ぺ' => 'ぺ', 'ぼ' => 'ぼ', 'ぽ' => 'ぽ', 'ゔ' => 'ゔ', 'ゞ' => 'ゞ', 'ガ' => 'ガ', 'ギ' => 'ギ', 'グ' => 'グ', 'ゲ' => 'ゲ', 'ゴ' => 'ゴ', 'ザ' => 'ザ', 'ジ' => 'ジ', 'ズ' => 'ズ', 'ゼ' => 'ゼ', 'ゾ' => 'ゾ', 'ダ' => 'ダ', 'ヂ' => 'ヂ', 'ヅ' => 'ヅ', 'デ' => 'デ', 'ド' => 'ド', 'バ' => 'バ', 'パ' => 'パ', 'ビ' => 'ビ', 'ピ' => 'ピ', 'ブ' => 'ブ', 'プ' => 'プ', 'ベ' => 'ベ', 'ペ' => 'ペ', 'ボ' => 'ボ', 'ポ' => 'ポ', 'ヴ' => 'ヴ', 'ヷ' => 'ヷ', 'ヸ' => 'ヸ', 'ヹ' => 'ヹ', 'ヺ' => 'ヺ', 'ヾ' => 'ヾ', '𑂚' => '𑂚', '𑂜' => '𑂜', '𑂫' => '𑂫', '𑄮' => '𑄮', '𑄯' => '𑄯', '𑍋' => '𑍋', '𑍌' => '𑍌', '𑒻' => '𑒻', '𑒼' => '𑒼', '𑒾' => '𑒾', '𑖺' => '𑖺', '𑖻' => '𑖻', '𑤸' => '𑤸'); 'À', 'Á' => 'Á', 'Â' => 'Â', 'Ã' => 'Ã', 'Ä' => 'Ä', 'Å' => 'Å', 'Ç' => 'Ç', 'È' => 'È', 'É' => 'É', 'Ê' => 'Ê', 'Ë' => 'Ë', 'Ì' => 'Ì', 'Í' => 'Í', 'Î' => 'Î', 'Ï' => 'Ï', 'Ñ' => 'Ñ', 'Ò' => 'Ò', 'Ó' => 'Ó', 'Ô' => 'Ô', 'Õ' => 'Õ', 'Ö' => 'Ö', 'Ù' => 'Ù', 'Ú' => 'Ú', 'Û' => 'Û', 'Ü' => 'Ü', 'Ý' => 'Ý', 'à' => 'à', 'á' => 'á', 'â' => 'â', 'ã' => 'ã', 'ä' => 'ä', 'å' => 'å', 'ç' => 'ç', 'è' => 'è', 'é' => 'é', 'ê' => 'ê', 'ë' => 'ë', 'ì' => 'ì', 'í' => 'í', 'î' => 'î', 'ï' => 'ï', 'ñ' => 'ñ', 'ò' => 'ò', 'ó' => 'ó', 'ô' => 'ô', 'õ' => 'õ', 'ö' => 'ö', 'ù' => 'ù', 'ú' => 'ú', 'û' => 'û', 'ü' => 'ü', 'ý' => 'ý', 'ÿ' => 'ÿ', 'Ā' => 'Ā', 'ā' => 'ā', 'Ă' => 'Ă', 'ă' => 'ă', 'Ą' => 'Ą', 'ą' => 'ą', 'Ć' => 'Ć', 'ć' => 'ć', 'Ĉ' => 'Ĉ', 'ĉ' => 'ĉ', 'Ċ' => 'Ċ', 'ċ' => 'ċ', 'Č' => 'Č', 'č' => 'č', 'Ď' => 'Ď', 'ď' => 'ď', 'Ē' => 'Ē', 'ē' => 'ē', 'Ĕ' => 'Ĕ', 'ĕ' => 'ĕ', 'Ė' => 'Ė', 'ė' => 'ė', 'Ę' => 'Ę', 'ę' => 'ę', 'Ě' => 'Ě', 'ě' => 'ě', 'Ĝ' => 'Ĝ', 'ĝ' => 'ĝ', 'Ğ' => 'Ğ', 'ğ' => 'ğ', 'Ġ' => 'Ġ', 'ġ' => 'ġ', 'Ģ' => 'Ģ', 'ģ' => 'ģ', 'Ĥ' => 'Ĥ', 'ĥ' => 'ĥ', 'Ĩ' => 'Ĩ', 'ĩ' => 'ĩ', 'Ī' => 'Ī', 'ī' => 'ī', 'Ĭ' => 'Ĭ', 'ĭ' => 'ĭ', 'Į' => 'Į', 'į' => 'į', 'İ' => 'İ', 'Ĵ' => 'Ĵ', 'ĵ' => 'ĵ', 'Ķ' => 'Ķ', 'ķ' => 'ķ', 'Ĺ' => 'Ĺ', 'ĺ' => 'ĺ', 'Ļ' => 'Ļ', 'ļ' => 'ļ', 'Ľ' => 'Ľ', 'ľ' => 'ľ', 'Ń' => 'Ń', 'ń' => 'ń', 'Ņ' => 'Ņ', 'ņ' => 'ņ', 'Ň' => 'Ň', 'ň' => 'ň', 'Ō' => 'Ō', 'ō' => 'ō', 'Ŏ' => 'Ŏ', 'ŏ' => 'ŏ', 'Ő' => 'Ő', 'ő' => 'ő', 'Ŕ' => 'Ŕ', 'ŕ' => 'ŕ', 'Ŗ' => 'Ŗ', 'ŗ' => 'ŗ', 'Ř' => 'Ř', 'ř' => 'ř', 'Ś' => 'Ś', 'ś' => 'ś', 'Ŝ' => 'Ŝ', 'ŝ' => 'ŝ', 'Ş' => 'Ş', 'ş' => 'ş', 'Š' => 'Š', 'š' => 'š', 'Ţ' => 'Ţ', 'ţ' => 'ţ', 'Ť' => 'Ť', 'ť' => 'ť', 'Ũ' => 'Ũ', 'ũ' => 'ũ', 'Ū' => 'Ū', 'ū' => 'ū', 'Ŭ' => 'Ŭ', 'ŭ' => 'ŭ', 'Ů' => 'Ů', 'ů' => 'ů', 'Ű' => 'Ű', 'ű' => 'ű', 'Ų' => 'Ų', 'ų' => 'ų', 'Ŵ' => 'Ŵ', 'ŵ' => 'ŵ', 'Ŷ' => 'Ŷ', 'ŷ' => 'ŷ', 'Ÿ' => 'Ÿ', 'Ź' => 'Ź', 'ź' => 'ź', 'Ż' => 'Ż', 'ż' => 'ż', 'Ž' => 'Ž', 'ž' => 'ž', 'Ơ' => 'Ơ', 'ơ' => 'ơ', 'Ư' => 'Ư', 'ư' => 'ư', 'Ǎ' => 'Ǎ', 'ǎ' => 'ǎ', 'Ǐ' => 'Ǐ', 'ǐ' => 'ǐ', 'Ǒ' => 'Ǒ', 'ǒ' => 'ǒ', 'Ǔ' => 'Ǔ', 'ǔ' => 'ǔ', 'Ǖ' => 'Ǖ', 'ǖ' => 'ǖ', 'Ǘ' => 'Ǘ', 'ǘ' => 'ǘ', 'Ǚ' => 'Ǚ', 'ǚ' => 'ǚ', 'Ǜ' => 'Ǜ', 'ǜ' => 'ǜ', 'Ǟ' => 'Ǟ', 'ǟ' => 'ǟ', 'Ǡ' => 'Ǡ', 'ǡ' => 'ǡ', 'Ǣ' => 'Ǣ', 'ǣ' => 'ǣ', 'Ǧ' => 'Ǧ', 'ǧ' => 'ǧ', 'Ǩ' => 'Ǩ', 'ǩ' => 'ǩ', 'Ǫ' => 'Ǫ', 'ǫ' => 'ǫ', 'Ǭ' => 'Ǭ', 'ǭ' => 'ǭ', 'Ǯ' => 'Ǯ', 'ǯ' => 'ǯ', 'ǰ' => 'ǰ', 'Ǵ' => 'Ǵ', 'ǵ' => 'ǵ', 'Ǹ' => 'Ǹ', 'ǹ' => 'ǹ', 'Ǻ' => 'Ǻ', 'ǻ' => 'ǻ', 'Ǽ' => 'Ǽ', 'ǽ' => 'ǽ', 'Ǿ' => 'Ǿ', 'ǿ' => 'ǿ', 'Ȁ' => 'Ȁ', 'ȁ' => 'ȁ', 'Ȃ' => 'Ȃ', 'ȃ' => 'ȃ', 'Ȅ' => 'Ȅ', 'ȅ' => 'ȅ', 'Ȇ' => 'Ȇ', 'ȇ' => 'ȇ', 'Ȉ' => 'Ȉ', 'ȉ' => 'ȉ', 'Ȋ' => 'Ȋ', 'ȋ' => 'ȋ', 'Ȍ' => 'Ȍ', 'ȍ' => 'ȍ', 'Ȏ' => 'Ȏ', 'ȏ' => 'ȏ', 'Ȑ' => 'Ȑ', 'ȑ' => 'ȑ', 'Ȓ' => 'Ȓ', 'ȓ' => 'ȓ', 'Ȕ' => 'Ȕ', 'ȕ' => 'ȕ', 'Ȗ' => 'Ȗ', 'ȗ' => 'ȗ', 'Ș' => 'Ș', 'ș' => 'ș', 'Ț' => 'Ț', 'ț' => 'ț', 'Ȟ' => 'Ȟ', 'ȟ' => 'ȟ', 'Ȧ' => 'Ȧ', 'ȧ' => 'ȧ', 'Ȩ' => 'Ȩ', 'ȩ' => 'ȩ', 'Ȫ' => 'Ȫ', 'ȫ' => 'ȫ', 'Ȭ' => 'Ȭ', 'ȭ' => 'ȭ', 'Ȯ' => 'Ȯ', 'ȯ' => 'ȯ', 'Ȱ' => 'Ȱ', 'ȱ' => 'ȱ', 'Ȳ' => 'Ȳ', 'ȳ' => 'ȳ', '̀' => '̀', '́' => '́', '̓' => '̓', '̈́' => '̈́', 'ʹ' => 'ʹ', ';' => ';', '΅' => '΅', 'Ά' => 'Ά', '·' => '·', 'Έ' => 'Έ', 'Ή' => 'Ή', 'Ί' => 'Ί', 'Ό' => 'Ό', 'Ύ' => 'Ύ', 'Ώ' => 'Ώ', 'ΐ' => 'ΐ', 'Ϊ' => 'Ϊ', 'Ϋ' => 'Ϋ', 'ά' => 'ά', 'έ' => 'έ', 'ή' => 'ή', 'ί' => 'ί', 'ΰ' => 'ΰ', 'ϊ' => 'ϊ', 'ϋ' => 'ϋ', 'ό' => 'ό', 'ύ' => 'ύ', 'ώ' => 'ώ', 'ϓ' => 'ϓ', 'ϔ' => 'ϔ', 'Ѐ' => 'Ѐ', 'Ё' => 'Ё', 'Ѓ' => 'Ѓ', 'Ї' => 'Ї', 'Ќ' => 'Ќ', 'Ѝ' => 'Ѝ', 'Ў' => 'Ў', 'Й' => 'Й', 'й' => 'й', 'ѐ' => 'ѐ', 'ё' => 'ё', 'ѓ' => 'ѓ', 'ї' => 'ї', 'ќ' => 'ќ', 'ѝ' => 'ѝ', 'ў' => 'ў', 'Ѷ' => 'Ѷ', 'ѷ' => 'ѷ', 'Ӂ' => 'Ӂ', 'ӂ' => 'ӂ', 'Ӑ' => 'Ӑ', 'ӑ' => 'ӑ', 'Ӓ' => 'Ӓ', 'ӓ' => 'ӓ', 'Ӗ' => 'Ӗ', 'ӗ' => 'ӗ', 'Ӛ' => 'Ӛ', 'ӛ' => 'ӛ', 'Ӝ' => 'Ӝ', 'ӝ' => 'ӝ', 'Ӟ' => 'Ӟ', 'ӟ' => 'ӟ', 'Ӣ' => 'Ӣ', 'ӣ' => 'ӣ', 'Ӥ' => 'Ӥ', 'ӥ' => 'ӥ', 'Ӧ' => 'Ӧ', 'ӧ' => 'ӧ', 'Ӫ' => 'Ӫ', 'ӫ' => 'ӫ', 'Ӭ' => 'Ӭ', 'ӭ' => 'ӭ', 'Ӯ' => 'Ӯ', 'ӯ' => 'ӯ', 'Ӱ' => 'Ӱ', 'ӱ' => 'ӱ', 'Ӳ' => 'Ӳ', 'ӳ' => 'ӳ', 'Ӵ' => 'Ӵ', 'ӵ' => 'ӵ', 'Ӹ' => 'Ӹ', 'ӹ' => 'ӹ', 'آ' => 'آ', 'أ' => 'أ', 'ؤ' => 'ؤ', 'إ' => 'إ', 'ئ' => 'ئ', 'ۀ' => 'ۀ', 'ۂ' => 'ۂ', 'ۓ' => 'ۓ', 'ऩ' => 'ऩ', 'ऱ' => 'ऱ', 'ऴ' => 'ऴ', 'क़' => 'क़', 'ख़' => 'ख़', 'ग़' => 'ग़', 'ज़' => 'ज़', 'ड़' => 'ड़', 'ढ़' => 'ढ़', 'फ़' => 'फ़', 'य़' => 'य़', 'ো' => 'ো', 'ৌ' => 'ৌ', 'ড়' => 'ড়', 'ঢ়' => 'ঢ়', 'য়' => 'য়', 'ਲ਼' => 'ਲ਼', 'ਸ਼' => 'ਸ਼', 'ਖ਼' => 'ਖ਼', 'ਗ਼' => 'ਗ਼', 'ਜ਼' => 'ਜ਼', 'ਫ਼' => 'ਫ਼', 'ୈ' => 'ୈ', 'ୋ' => 'ୋ', 'ୌ' => 'ୌ', 'ଡ଼' => 'ଡ଼', 'ଢ଼' => 'ଢ଼', 'ஔ' => 'ஔ', 'ொ' => 'ொ', 'ோ' => 'ோ', 'ௌ' => 'ௌ', 'ై' => 'ై', 'ೀ' => 'ೀ', 'ೇ' => 'ೇ', 'ೈ' => 'ೈ', 'ೊ' => 'ೊ', 'ೋ' => 'ೋ', 'ൊ' => 'ൊ', 'ോ' => 'ോ', 'ൌ' => 'ൌ', 'ේ' => 'ේ', 'ො' => 'ො', 'ෝ' => 'ෝ', 'ෞ' => 'ෞ', 'གྷ' => 'གྷ', 'ཌྷ' => 'ཌྷ', 'དྷ' => 'དྷ', 'བྷ' => 'བྷ', 'ཛྷ' => 'ཛྷ', 'ཀྵ' => 'ཀྵ', 'ཱི' => 'ཱི', 'ཱུ' => 'ཱུ', 'ྲྀ' => 'ྲྀ', 'ླྀ' => 'ླྀ', 'ཱྀ' => 'ཱྀ', 'ྒྷ' => 'ྒྷ', 'ྜྷ' => 'ྜྷ', 'ྡྷ' => 'ྡྷ', 'ྦྷ' => 'ྦྷ', 'ྫྷ' => 'ྫྷ', 'ྐྵ' => 'ྐྵ', 'ဦ' => 'ဦ', 'ᬆ' => 'ᬆ', 'ᬈ' => 'ᬈ', 'ᬊ' => 'ᬊ', 'ᬌ' => 'ᬌ', 'ᬎ' => 'ᬎ', 'ᬒ' => 'ᬒ', 'ᬻ' => 'ᬻ', 'ᬽ' => 'ᬽ', 'ᭀ' => 'ᭀ', 'ᭁ' => 'ᭁ', 'ᭃ' => 'ᭃ', 'Ḁ' => 'Ḁ', 'ḁ' => 'ḁ', 'Ḃ' => 'Ḃ', 'ḃ' => 'ḃ', 'Ḅ' => 'Ḅ', 'ḅ' => 'ḅ', 'Ḇ' => 'Ḇ', 'ḇ' => 'ḇ', 'Ḉ' => 'Ḉ', 'ḉ' => 'ḉ', 'Ḋ' => 'Ḋ', 'ḋ' => 'ḋ', 'Ḍ' => 'Ḍ', 'ḍ' => 'ḍ', 'Ḏ' => 'Ḏ', 'ḏ' => 'ḏ', 'Ḑ' => 'Ḑ', 'ḑ' => 'ḑ', 'Ḓ' => 'Ḓ', 'ḓ' => 'ḓ', 'Ḕ' => 'Ḕ', 'ḕ' => 'ḕ', 'Ḗ' => 'Ḗ', 'ḗ' => 'ḗ', 'Ḙ' => 'Ḙ', 'ḙ' => 'ḙ', 'Ḛ' => 'Ḛ', 'ḛ' => 'ḛ', 'Ḝ' => 'Ḝ', 'ḝ' => 'ḝ', 'Ḟ' => 'Ḟ', 'ḟ' => 'ḟ', 'Ḡ' => 'Ḡ', 'ḡ' => 'ḡ', 'Ḣ' => 'Ḣ', 'ḣ' => 'ḣ', 'Ḥ' => 'Ḥ', 'ḥ' => 'ḥ', 'Ḧ' => 'Ḧ', 'ḧ' => 'ḧ', 'Ḩ' => 'Ḩ', 'ḩ' => 'ḩ', 'Ḫ' => 'Ḫ', 'ḫ' => 'ḫ', 'Ḭ' => 'Ḭ', 'ḭ' => 'ḭ', 'Ḯ' => 'Ḯ', 'ḯ' => 'ḯ', 'Ḱ' => 'Ḱ', 'ḱ' => 'ḱ', 'Ḳ' => 'Ḳ', 'ḳ' => 'ḳ', 'Ḵ' => 'Ḵ', 'ḵ' => 'ḵ', 'Ḷ' => 'Ḷ', 'ḷ' => 'ḷ', 'Ḹ' => 'Ḹ', 'ḹ' => 'ḹ', 'Ḻ' => 'Ḻ', 'ḻ' => 'ḻ', 'Ḽ' => 'Ḽ', 'ḽ' => 'ḽ', 'Ḿ' => 'Ḿ', 'ḿ' => 'ḿ', 'Ṁ' => 'Ṁ', 'ṁ' => 'ṁ', 'Ṃ' => 'Ṃ', 'ṃ' => 'ṃ', 'Ṅ' => 'Ṅ', 'ṅ' => 'ṅ', 'Ṇ' => 'Ṇ', 'ṇ' => 'ṇ', 'Ṉ' => 'Ṉ', 'ṉ' => 'ṉ', 'Ṋ' => 'Ṋ', 'ṋ' => 'ṋ', 'Ṍ' => 'Ṍ', 'ṍ' => 'ṍ', 'Ṏ' => 'Ṏ', 'ṏ' => 'ṏ', 'Ṑ' => 'Ṑ', 'ṑ' => 'ṑ', 'Ṓ' => 'Ṓ', 'ṓ' => 'ṓ', 'Ṕ' => 'Ṕ', 'ṕ' => 'ṕ', 'Ṗ' => 'Ṗ', 'ṗ' => 'ṗ', 'Ṙ' => 'Ṙ', 'ṙ' => 'ṙ', 'Ṛ' => 'Ṛ', 'ṛ' => 'ṛ', 'Ṝ' => 'Ṝ', 'ṝ' => 'ṝ', 'Ṟ' => 'Ṟ', 'ṟ' => 'ṟ', 'Ṡ' => 'Ṡ', 'ṡ' => 'ṡ', 'Ṣ' => 'Ṣ', 'ṣ' => 'ṣ', 'Ṥ' => 'Ṥ', 'ṥ' => 'ṥ', 'Ṧ' => 'Ṧ', 'ṧ' => 'ṧ', 'Ṩ' => 'Ṩ', 'ṩ' => 'ṩ', 'Ṫ' => 'Ṫ', 'ṫ' => 'ṫ', 'Ṭ' => 'Ṭ', 'ṭ' => 'ṭ', 'Ṯ' => 'Ṯ', 'ṯ' => 'ṯ', 'Ṱ' => 'Ṱ', 'ṱ' => 'ṱ', 'Ṳ' => 'Ṳ', 'ṳ' => 'ṳ', 'Ṵ' => 'Ṵ', 'ṵ' => 'ṵ', 'Ṷ' => 'Ṷ', 'ṷ' => 'ṷ', 'Ṹ' => 'Ṹ', 'ṹ' => 'ṹ', 'Ṻ' => 'Ṻ', 'ṻ' => 'ṻ', 'Ṽ' => 'Ṽ', 'ṽ' => 'ṽ', 'Ṿ' => 'Ṿ', 'ṿ' => 'ṿ', 'Ẁ' => 'Ẁ', 'ẁ' => 'ẁ', 'Ẃ' => 'Ẃ', 'ẃ' => 'ẃ', 'Ẅ' => 'Ẅ', 'ẅ' => 'ẅ', 'Ẇ' => 'Ẇ', 'ẇ' => 'ẇ', 'Ẉ' => 'Ẉ', 'ẉ' => 'ẉ', 'Ẋ' => 'Ẋ', 'ẋ' => 'ẋ', 'Ẍ' => 'Ẍ', 'ẍ' => 'ẍ', 'Ẏ' => 'Ẏ', 'ẏ' => 'ẏ', 'Ẑ' => 'Ẑ', 'ẑ' => 'ẑ', 'Ẓ' => 'Ẓ', 'ẓ' => 'ẓ', 'Ẕ' => 'Ẕ', 'ẕ' => 'ẕ', 'ẖ' => 'ẖ', 'ẗ' => 'ẗ', 'ẘ' => 'ẘ', 'ẙ' => 'ẙ', 'ẛ' => 'ẛ', 'Ạ' => 'Ạ', 'ạ' => 'ạ', 'Ả' => 'Ả', 'ả' => 'ả', 'Ấ' => 'Ấ', 'ấ' => 'ấ', 'Ầ' => 'Ầ', 'ầ' => 'ầ', 'Ẩ' => 'Ẩ', 'ẩ' => 'ẩ', 'Ẫ' => 'Ẫ', 'ẫ' => 'ẫ', 'Ậ' => 'Ậ', 'ậ' => 'ậ', 'Ắ' => 'Ắ', 'ắ' => 'ắ', 'Ằ' => 'Ằ', 'ằ' => 'ằ', 'Ẳ' => 'Ẳ', 'ẳ' => 'ẳ', 'Ẵ' => 'Ẵ', 'ẵ' => 'ẵ', 'Ặ' => 'Ặ', 'ặ' => 'ặ', 'Ẹ' => 'Ẹ', 'ẹ' => 'ẹ', 'Ẻ' => 'Ẻ', 'ẻ' => 'ẻ', 'Ẽ' => 'Ẽ', 'ẽ' => 'ẽ', 'Ế' => 'Ế', 'ế' => 'ế', 'Ề' => 'Ề', 'ề' => 'ề', 'Ể' => 'Ể', 'ể' => 'ể', 'Ễ' => 'Ễ', 'ễ' => 'ễ', 'Ệ' => 'Ệ', 'ệ' => 'ệ', 'Ỉ' => 'Ỉ', 'ỉ' => 'ỉ', 'Ị' => 'Ị', 'ị' => 'ị', 'Ọ' => 'Ọ', 'ọ' => 'ọ', 'Ỏ' => 'Ỏ', 'ỏ' => 'ỏ', 'Ố' => 'Ố', 'ố' => 'ố', 'Ồ' => 'Ồ', 'ồ' => 'ồ', 'Ổ' => 'Ổ', 'ổ' => 'ổ', 'Ỗ' => 'Ỗ', 'ỗ' => 'ỗ', 'Ộ' => 'Ộ', 'ộ' => 'ộ', 'Ớ' => 'Ớ', 'ớ' => 'ớ', 'Ờ' => 'Ờ', 'ờ' => 'ờ', 'Ở' => 'Ở', 'ở' => 'ở', 'Ỡ' => 'Ỡ', 'ỡ' => 'ỡ', 'Ợ' => 'Ợ', 'ợ' => 'ợ', 'Ụ' => 'Ụ', 'ụ' => 'ụ', 'Ủ' => 'Ủ', 'ủ' => 'ủ', 'Ứ' => 'Ứ', 'ứ' => 'ứ', 'Ừ' => 'Ừ', 'ừ' => 'ừ', 'Ử' => 'Ử', 'ử' => 'ử', 'Ữ' => 'Ữ', 'ữ' => 'ữ', 'Ự' => 'Ự', 'ự' => 'ự', 'Ỳ' => 'Ỳ', 'ỳ' => 'ỳ', 'Ỵ' => 'Ỵ', 'ỵ' => 'ỵ', 'Ỷ' => 'Ỷ', 'ỷ' => 'ỷ', 'Ỹ' => 'Ỹ', 'ỹ' => 'ỹ', 'ἀ' => 'ἀ', 'ἁ' => 'ἁ', 'ἂ' => 'ἂ', 'ἃ' => 'ἃ', 'ἄ' => 'ἄ', 'ἅ' => 'ἅ', 'ἆ' => 'ἆ', 'ἇ' => 'ἇ', 'Ἀ' => 'Ἀ', 'Ἁ' => 'Ἁ', 'Ἂ' => 'Ἂ', 'Ἃ' => 'Ἃ', 'Ἄ' => 'Ἄ', 'Ἅ' => 'Ἅ', 'Ἆ' => 'Ἆ', 'Ἇ' => 'Ἇ', 'ἐ' => 'ἐ', 'ἑ' => 'ἑ', 'ἒ' => 'ἒ', 'ἓ' => 'ἓ', 'ἔ' => 'ἔ', 'ἕ' => 'ἕ', 'Ἐ' => 'Ἐ', 'Ἑ' => 'Ἑ', 'Ἒ' => 'Ἒ', 'Ἓ' => 'Ἓ', 'Ἔ' => 'Ἔ', 'Ἕ' => 'Ἕ', 'ἠ' => 'ἠ', 'ἡ' => 'ἡ', 'ἢ' => 'ἢ', 'ἣ' => 'ἣ', 'ἤ' => 'ἤ', 'ἥ' => 'ἥ', 'ἦ' => 'ἦ', 'ἧ' => 'ἧ', 'Ἠ' => 'Ἠ', 'Ἡ' => 'Ἡ', 'Ἢ' => 'Ἢ', 'Ἣ' => 'Ἣ', 'Ἤ' => 'Ἤ', 'Ἥ' => 'Ἥ', 'Ἦ' => 'Ἦ', 'Ἧ' => 'Ἧ', 'ἰ' => 'ἰ', 'ἱ' => 'ἱ', 'ἲ' => 'ἲ', 'ἳ' => 'ἳ', 'ἴ' => 'ἴ', 'ἵ' => 'ἵ', 'ἶ' => 'ἶ', 'ἷ' => 'ἷ', 'Ἰ' => 'Ἰ', 'Ἱ' => 'Ἱ', 'Ἲ' => 'Ἲ', 'Ἳ' => 'Ἳ', 'Ἴ' => 'Ἴ', 'Ἵ' => 'Ἵ', 'Ἶ' => 'Ἶ', 'Ἷ' => 'Ἷ', 'ὀ' => 'ὀ', 'ὁ' => 'ὁ', 'ὂ' => 'ὂ', 'ὃ' => 'ὃ', 'ὄ' => 'ὄ', 'ὅ' => 'ὅ', 'Ὀ' => 'Ὀ', 'Ὁ' => 'Ὁ', 'Ὂ' => 'Ὂ', 'Ὃ' => 'Ὃ', 'Ὄ' => 'Ὄ', 'Ὅ' => 'Ὅ', 'ὐ' => 'ὐ', 'ὑ' => 'ὑ', 'ὒ' => 'ὒ', 'ὓ' => 'ὓ', 'ὔ' => 'ὔ', 'ὕ' => 'ὕ', 'ὖ' => 'ὖ', 'ὗ' => 'ὗ', 'Ὑ' => 'Ὑ', 'Ὓ' => 'Ὓ', 'Ὕ' => 'Ὕ', 'Ὗ' => 'Ὗ', 'ὠ' => 'ὠ', 'ὡ' => 'ὡ', 'ὢ' => 'ὢ', 'ὣ' => 'ὣ', 'ὤ' => 'ὤ', 'ὥ' => 'ὥ', 'ὦ' => 'ὦ', 'ὧ' => 'ὧ', 'Ὠ' => 'Ὠ', 'Ὡ' => 'Ὡ', 'Ὢ' => 'Ὢ', 'Ὣ' => 'Ὣ', 'Ὤ' => 'Ὤ', 'Ὥ' => 'Ὥ', 'Ὦ' => 'Ὦ', 'Ὧ' => 'Ὧ', 'ὰ' => 'ὰ', 'ά' => 'ά', 'ὲ' => 'ὲ', 'έ' => 'έ', 'ὴ' => 'ὴ', 'ή' => 'ή', 'ὶ' => 'ὶ', 'ί' => 'ί', 'ὸ' => 'ὸ', 'ό' => 'ό', 'ὺ' => 'ὺ', 'ύ' => 'ύ', 'ὼ' => 'ὼ', 'ώ' => 'ώ', 'ᾀ' => 'ᾀ', 'ᾁ' => 'ᾁ', 'ᾂ' => 'ᾂ', 'ᾃ' => 'ᾃ', 'ᾄ' => 'ᾄ', 'ᾅ' => 'ᾅ', 'ᾆ' => 'ᾆ', 'ᾇ' => 'ᾇ', 'ᾈ' => 'ᾈ', 'ᾉ' => 'ᾉ', 'ᾊ' => 'ᾊ', 'ᾋ' => 'ᾋ', 'ᾌ' => 'ᾌ', 'ᾍ' => 'ᾍ', 'ᾎ' => 'ᾎ', 'ᾏ' => 'ᾏ', 'ᾐ' => 'ᾐ', 'ᾑ' => 'ᾑ', 'ᾒ' => 'ᾒ', 'ᾓ' => 'ᾓ', 'ᾔ' => 'ᾔ', 'ᾕ' => 'ᾕ', 'ᾖ' => 'ᾖ', 'ᾗ' => 'ᾗ', 'ᾘ' => 'ᾘ', 'ᾙ' => 'ᾙ', 'ᾚ' => 'ᾚ', 'ᾛ' => 'ᾛ', 'ᾜ' => 'ᾜ', 'ᾝ' => 'ᾝ', 'ᾞ' => 'ᾞ', 'ᾟ' => 'ᾟ', 'ᾠ' => 'ᾠ', 'ᾡ' => 'ᾡ', 'ᾢ' => 'ᾢ', 'ᾣ' => 'ᾣ', 'ᾤ' => 'ᾤ', 'ᾥ' => 'ᾥ', 'ᾦ' => 'ᾦ', 'ᾧ' => 'ᾧ', 'ᾨ' => 'ᾨ', 'ᾩ' => 'ᾩ', 'ᾪ' => 'ᾪ', 'ᾫ' => 'ᾫ', 'ᾬ' => 'ᾬ', 'ᾭ' => 'ᾭ', 'ᾮ' => 'ᾮ', 'ᾯ' => 'ᾯ', 'ᾰ' => 'ᾰ', 'ᾱ' => 'ᾱ', 'ᾲ' => 'ᾲ', 'ᾳ' => 'ᾳ', 'ᾴ' => 'ᾴ', 'ᾶ' => 'ᾶ', 'ᾷ' => 'ᾷ', 'Ᾰ' => 'Ᾰ', 'Ᾱ' => 'Ᾱ', 'Ὰ' => 'Ὰ', 'Ά' => 'Ά', 'ᾼ' => 'ᾼ', 'ι' => 'ι', '῁' => '῁', 'ῂ' => 'ῂ', 'ῃ' => 'ῃ', 'ῄ' => 'ῄ', 'ῆ' => 'ῆ', 'ῇ' => 'ῇ', 'Ὲ' => 'Ὲ', 'Έ' => 'Έ', 'Ὴ' => 'Ὴ', 'Ή' => 'Ή', 'ῌ' => 'ῌ', '῍' => '῍', '῎' => '῎', '῏' => '῏', 'ῐ' => 'ῐ', 'ῑ' => 'ῑ', 'ῒ' => 'ῒ', 'ΐ' => 'ΐ', 'ῖ' => 'ῖ', 'ῗ' => 'ῗ', 'Ῐ' => 'Ῐ', 'Ῑ' => 'Ῑ', 'Ὶ' => 'Ὶ', 'Ί' => 'Ί', '῝' => '῝', '῞' => '῞', '῟' => '῟', 'ῠ' => 'ῠ', 'ῡ' => 'ῡ', 'ῢ' => 'ῢ', 'ΰ' => 'ΰ', 'ῤ' => 'ῤ', 'ῥ' => 'ῥ', 'ῦ' => 'ῦ', 'ῧ' => 'ῧ', 'Ῠ' => 'Ῠ', 'Ῡ' => 'Ῡ', 'Ὺ' => 'Ὺ', 'Ύ' => 'Ύ', 'Ῥ' => 'Ῥ', '῭' => '῭', '΅' => '΅', '`' => '`', 'ῲ' => 'ῲ', 'ῳ' => 'ῳ', 'ῴ' => 'ῴ', 'ῶ' => 'ῶ', 'ῷ' => 'ῷ', 'Ὸ' => 'Ὸ', 'Ό' => 'Ό', 'Ὼ' => 'Ὼ', 'Ώ' => 'Ώ', 'ῼ' => 'ῼ', '´' => '´', ' ' => ' ', ' ' => ' ', 'Ω' => 'Ω', 'K' => 'K', 'Å' => 'Å', '↚' => '↚', '↛' => '↛', '↮' => '↮', '⇍' => '⇍', '⇎' => '⇎', '⇏' => '⇏', '∄' => '∄', '∉' => '∉', '∌' => '∌', '∤' => '∤', '∦' => '∦', '≁' => '≁', '≄' => '≄', '≇' => '≇', '≉' => '≉', '≠' => '≠', '≢' => '≢', '≭' => '≭', '≮' => '≮', '≯' => '≯', '≰' => '≰', '≱' => '≱', '≴' => '≴', '≵' => '≵', '≸' => '≸', '≹' => '≹', '⊀' => '⊀', '⊁' => '⊁', '⊄' => '⊄', '⊅' => '⊅', '⊈' => '⊈', '⊉' => '⊉', '⊬' => '⊬', '⊭' => '⊭', '⊮' => '⊮', '⊯' => '⊯', '⋠' => '⋠', '⋡' => '⋡', '⋢' => '⋢', '⋣' => '⋣', '⋪' => '⋪', '⋫' => '⋫', '⋬' => '⋬', '⋭' => '⋭', '〈' => '〈', '〉' => '〉', '⫝̸' => '⫝̸', 'が' => 'が', 'ぎ' => 'ぎ', 'ぐ' => 'ぐ', 'げ' => 'げ', 'ご' => 'ご', 'ざ' => 'ざ', 'じ' => 'じ', 'ず' => 'ず', 'ぜ' => 'ぜ', 'ぞ' => 'ぞ', 'だ' => 'だ', 'ぢ' => 'ぢ', 'づ' => 'づ', 'で' => 'で', 'ど' => 'ど', 'ば' => 'ば', 'ぱ' => 'ぱ', 'び' => 'び', 'ぴ' => 'ぴ', 'ぶ' => 'ぶ', 'ぷ' => 'ぷ', 'べ' => 'べ', 'ぺ' => 'ぺ', 'ぼ' => 'ぼ', 'ぽ' => 'ぽ', 'ゔ' => 'ゔ', 'ゞ' => 'ゞ', 'ガ' => 'ガ', 'ギ' => 'ギ', 'グ' => 'グ', 'ゲ' => 'ゲ', 'ゴ' => 'ゴ', 'ザ' => 'ザ', 'ジ' => 'ジ', 'ズ' => 'ズ', 'ゼ' => 'ゼ', 'ゾ' => 'ゾ', 'ダ' => 'ダ', 'ヂ' => 'ヂ', 'ヅ' => 'ヅ', 'デ' => 'デ', 'ド' => 'ド', 'バ' => 'バ', 'パ' => 'パ', 'ビ' => 'ビ', 'ピ' => 'ピ', 'ブ' => 'ブ', 'プ' => 'プ', 'ベ' => 'ベ', 'ペ' => 'ペ', 'ボ' => 'ボ', 'ポ' => 'ポ', 'ヴ' => 'ヴ', 'ヷ' => 'ヷ', 'ヸ' => 'ヸ', 'ヹ' => 'ヹ', 'ヺ' => 'ヺ', 'ヾ' => 'ヾ', '豈' => '豈', '更' => '更', '車' => '車', '賈' => '賈', '滑' => '滑', '串' => '串', '句' => '句', '龜' => '龜', '龜' => '龜', '契' => '契', '金' => '金', '喇' => '喇', '奈' => '奈', '懶' => '懶', '癩' => '癩', '羅' => '羅', '蘿' => '蘿', '螺' => '螺', '裸' => '裸', '邏' => '邏', '樂' => '樂', '洛' => '洛', '烙' => '烙', '珞' => '珞', '落' => '落', '酪' => '酪', '駱' => '駱', '亂' => '亂', '卵' => '卵', '欄' => '欄', '爛' => '爛', '蘭' => '蘭', '鸞' => '鸞', '嵐' => '嵐', '濫' => '濫', '藍' => '藍', '襤' => '襤', '拉' => '拉', '臘' => '臘', '蠟' => '蠟', '廊' => '廊', '朗' => '朗', '浪' => '浪', '狼' => '狼', '郎' => '郎', '來' => '來', '冷' => '冷', '勞' => '勞', '擄' => '擄', '櫓' => '櫓', '爐' => '爐', '盧' => '盧', '老' => '老', '蘆' => '蘆', '虜' => '虜', '路' => '路', '露' => '露', '魯' => '魯', '鷺' => '鷺', '碌' => '碌', '祿' => '祿', '綠' => '綠', '菉' => '菉', '錄' => '錄', '鹿' => '鹿', '論' => '論', '壟' => '壟', '弄' => '弄', '籠' => '籠', '聾' => '聾', '牢' => '牢', '磊' => '磊', '賂' => '賂', '雷' => '雷', '壘' => '壘', '屢' => '屢', '樓' => '樓', '淚' => '淚', '漏' => '漏', '累' => '累', '縷' => '縷', '陋' => '陋', '勒' => '勒', '肋' => '肋', '凜' => '凜', '凌' => '凌', '稜' => '稜', '綾' => '綾', '菱' => '菱', '陵' => '陵', '讀' => '讀', '拏' => '拏', '樂' => '樂', '諾' => '諾', '丹' => '丹', '寧' => '寧', '怒' => '怒', '率' => '率', '異' => '異', '北' => '北', '磻' => '磻', '便' => '便', '復' => '復', '不' => '不', '泌' => '泌', '數' => '數', '索' => '索', '參' => '參', '塞' => '塞', '省' => '省', '葉' => '葉', '說' => '說', '殺' => '殺', '辰' => '辰', '沈' => '沈', '拾' => '拾', '若' => '若', '掠' => '掠', '略' => '略', '亮' => '亮', '兩' => '兩', '凉' => '凉', '梁' => '梁', '糧' => '糧', '良' => '良', '諒' => '諒', '量' => '量', '勵' => '勵', '呂' => '呂', '女' => '女', '廬' => '廬', '旅' => '旅', '濾' => '濾', '礪' => '礪', '閭' => '閭', '驪' => '驪', '麗' => '麗', '黎' => '黎', '力' => '力', '曆' => '曆', '歷' => '歷', '轢' => '轢', '年' => '年', '憐' => '憐', '戀' => '戀', '撚' => '撚', '漣' => '漣', '煉' => '煉', '璉' => '璉', '秊' => '秊', '練' => '練', '聯' => '聯', '輦' => '輦', '蓮' => '蓮', '連' => '連', '鍊' => '鍊', '列' => '列', '劣' => '劣', '咽' => '咽', '烈' => '烈', '裂' => '裂', '說' => '說', '廉' => '廉', '念' => '念', '捻' => '捻', '殮' => '殮', '簾' => '簾', '獵' => '獵', '令' => '令', '囹' => '囹', '寧' => '寧', '嶺' => '嶺', '怜' => '怜', '玲' => '玲', '瑩' => '瑩', '羚' => '羚', '聆' => '聆', '鈴' => '鈴', '零' => '零', '靈' => '靈', '領' => '領', '例' => '例', '禮' => '禮', '醴' => '醴', '隸' => '隸', '惡' => '惡', '了' => '了', '僚' => '僚', '寮' => '寮', '尿' => '尿', '料' => '料', '樂' => '樂', '燎' => '燎', '療' => '療', '蓼' => '蓼', '遼' => '遼', '龍' => '龍', '暈' => '暈', '阮' => '阮', '劉' => '劉', '杻' => '杻', '柳' => '柳', '流' => '流', '溜' => '溜', '琉' => '琉', '留' => '留', '硫' => '硫', '紐' => '紐', '類' => '類', '六' => '六', '戮' => '戮', '陸' => '陸', '倫' => '倫', '崙' => '崙', '淪' => '淪', '輪' => '輪', '律' => '律', '慄' => '慄', '栗' => '栗', '率' => '率', '隆' => '隆', '利' => '利', '吏' => '吏', '履' => '履', '易' => '易', '李' => '李', '梨' => '梨', '泥' => '泥', '理' => '理', '痢' => '痢', '罹' => '罹', '裏' => '裏', '裡' => '裡', '里' => '里', '離' => '離', '匿' => '匿', '溺' => '溺', '吝' => '吝', '燐' => '燐', '璘' => '璘', '藺' => '藺', '隣' => '隣', '鱗' => '鱗', '麟' => '麟', '林' => '林', '淋' => '淋', '臨' => '臨', '立' => '立', '笠' => '笠', '粒' => '粒', '狀' => '狀', '炙' => '炙', '識' => '識', '什' => '什', '茶' => '茶', '刺' => '刺', '切' => '切', '度' => '度', '拓' => '拓', '糖' => '糖', '宅' => '宅', '洞' => '洞', '暴' => '暴', '輻' => '輻', '行' => '行', '降' => '降', '見' => '見', '廓' => '廓', '兀' => '兀', '嗀' => '嗀', '塚' => '塚', '晴' => '晴', '凞' => '凞', '猪' => '猪', '益' => '益', '礼' => '礼', '神' => '神', '祥' => '祥', '福' => '福', '靖' => '靖', '精' => '精', '羽' => '羽', '蘒' => '蘒', '諸' => '諸', '逸' => '逸', '都' => '都', '飯' => '飯', '飼' => '飼', '館' => '館', '鶴' => '鶴', '郞' => '郞', '隷' => '隷', '侮' => '侮', '僧' => '僧', '免' => '免', '勉' => '勉', '勤' => '勤', '卑' => '卑', '喝' => '喝', '嘆' => '嘆', '器' => '器', '塀' => '塀', '墨' => '墨', '層' => '層', '屮' => '屮', '悔' => '悔', '慨' => '慨', '憎' => '憎', '懲' => '懲', '敏' => '敏', '既' => '既', '暑' => '暑', '梅' => '梅', '海' => '海', '渚' => '渚', '漢' => '漢', '煮' => '煮', '爫' => '爫', '琢' => '琢', '碑' => '碑', '社' => '社', '祉' => '祉', '祈' => '祈', '祐' => '祐', '祖' => '祖', '祝' => '祝', '禍' => '禍', '禎' => '禎', '穀' => '穀', '突' => '突', '節' => '節', '練' => '練', '縉' => '縉', '繁' => '繁', '署' => '署', '者' => '者', '臭' => '臭', '艹' => '艹', '艹' => '艹', '著' => '著', '褐' => '褐', '視' => '視', '謁' => '謁', '謹' => '謹', '賓' => '賓', '贈' => '贈', '辶' => '辶', '逸' => '逸', '難' => '難', '響' => '響', '頻' => '頻', '恵' => '恵', '𤋮' => '𤋮', '舘' => '舘', '並' => '並', '况' => '况', '全' => '全', '侀' => '侀', '充' => '充', '冀' => '冀', '勇' => '勇', '勺' => '勺', '喝' => '喝', '啕' => '啕', '喙' => '喙', '嗢' => '嗢', '塚' => '塚', '墳' => '墳', '奄' => '奄', '奔' => '奔', '婢' => '婢', '嬨' => '嬨', '廒' => '廒', '廙' => '廙', '彩' => '彩', '徭' => '徭', '惘' => '惘', '慎' => '慎', '愈' => '愈', '憎' => '憎', '慠' => '慠', '懲' => '懲', '戴' => '戴', '揄' => '揄', '搜' => '搜', '摒' => '摒', '敖' => '敖', '晴' => '晴', '朗' => '朗', '望' => '望', '杖' => '杖', '歹' => '歹', '殺' => '殺', '流' => '流', '滛' => '滛', '滋' => '滋', '漢' => '漢', '瀞' => '瀞', '煮' => '煮', '瞧' => '瞧', '爵' => '爵', '犯' => '犯', '猪' => '猪', '瑱' => '瑱', '甆' => '甆', '画' => '画', '瘝' => '瘝', '瘟' => '瘟', '益' => '益', '盛' => '盛', '直' => '直', '睊' => '睊', '着' => '着', '磌' => '磌', '窱' => '窱', '節' => '節', '类' => '类', '絛' => '絛', '練' => '練', '缾' => '缾', '者' => '者', '荒' => '荒', '華' => '華', '蝹' => '蝹', '襁' => '襁', '覆' => '覆', '視' => '視', '調' => '調', '諸' => '諸', '請' => '請', '謁' => '謁', '諾' => '諾', '諭' => '諭', '謹' => '謹', '變' => '變', '贈' => '贈', '輸' => '輸', '遲' => '遲', '醙' => '醙', '鉶' => '鉶', '陼' => '陼', '難' => '難', '靖' => '靖', '韛' => '韛', '響' => '響', '頋' => '頋', '頻' => '頻', '鬒' => '鬒', '龜' => '龜', '𢡊' => '𢡊', '𢡄' => '𢡄', '𣏕' => '𣏕', '㮝' => '㮝', '䀘' => '䀘', '䀹' => '䀹', '𥉉' => '𥉉', '𥳐' => '𥳐', '𧻓' => '𧻓', '齃' => '齃', '龎' => '龎', 'יִ' => 'יִ', 'ײַ' => 'ײַ', 'שׁ' => 'שׁ', 'שׂ' => 'שׂ', 'שּׁ' => 'שּׁ', 'שּׂ' => 'שּׂ', 'אַ' => 'אַ', 'אָ' => 'אָ', 'אּ' => 'אּ', 'בּ' => 'בּ', 'גּ' => 'גּ', 'דּ' => 'דּ', 'הּ' => 'הּ', 'וּ' => 'וּ', 'זּ' => 'זּ', 'טּ' => 'טּ', 'יּ' => 'יּ', 'ךּ' => 'ךּ', 'כּ' => 'כּ', 'לּ' => 'לּ', 'מּ' => 'מּ', 'נּ' => 'נּ', 'סּ' => 'סּ', 'ףּ' => 'ףּ', 'פּ' => 'פּ', 'צּ' => 'צּ', 'קּ' => 'קּ', 'רּ' => 'רּ', 'שּ' => 'שּ', 'תּ' => 'תּ', 'וֹ' => 'וֹ', 'בֿ' => 'בֿ', 'כֿ' => 'כֿ', 'פֿ' => 'פֿ', '𑂚' => '𑂚', '𑂜' => '𑂜', '𑂫' => '𑂫', '𑄮' => '𑄮', '𑄯' => '𑄯', '𑍋' => '𑍋', '𑍌' => '𑍌', '𑒻' => '𑒻', '𑒼' => '𑒼', '𑒾' => '𑒾', '𑖺' => '𑖺', '𑖻' => '𑖻', '𑤸' => '𑤸', '𝅗𝅥' => '𝅗𝅥', '𝅘𝅥' => '𝅘𝅥', '𝅘𝅥𝅮' => '𝅘𝅥𝅮', '𝅘𝅥𝅯' => '𝅘𝅥𝅯', '𝅘𝅥𝅰' => '𝅘𝅥𝅰', '𝅘𝅥𝅱' => '𝅘𝅥𝅱', '𝅘𝅥𝅲' => '𝅘𝅥𝅲', '𝆹𝅥' => '𝆹𝅥', '𝆺𝅥' => '𝆺𝅥', '𝆹𝅥𝅮' => '𝆹𝅥𝅮', '𝆺𝅥𝅮' => '𝆺𝅥𝅮', '𝆹𝅥𝅯' => '𝆹𝅥𝅯', '𝆺𝅥𝅯' => '𝆺𝅥𝅯', '丽' => '丽', '丸' => '丸', '乁' => '乁', '𠄢' => '𠄢', '你' => '你', '侮' => '侮', '侻' => '侻', '倂' => '倂', '偺' => '偺', '備' => '備', '僧' => '僧', '像' => '像', '㒞' => '㒞', '𠘺' => '𠘺', '免' => '免', '兔' => '兔', '兤' => '兤', '具' => '具', '𠔜' => '𠔜', '㒹' => '㒹', '內' => '內', '再' => '再', '𠕋' => '𠕋', '冗' => '冗', '冤' => '冤', '仌' => '仌', '冬' => '冬', '况' => '况', '𩇟' => '𩇟', '凵' => '凵', '刃' => '刃', '㓟' => '㓟', '刻' => '刻', '剆' => '剆', '割' => '割', '剷' => '剷', '㔕' => '㔕', '勇' => '勇', '勉' => '勉', '勤' => '勤', '勺' => '勺', '包' => '包', '匆' => '匆', '北' => '北', '卉' => '卉', '卑' => '卑', '博' => '博', '即' => '即', '卽' => '卽', '卿' => '卿', '卿' => '卿', '卿' => '卿', '𠨬' => '𠨬', '灰' => '灰', '及' => '及', '叟' => '叟', '𠭣' => '𠭣', '叫' => '叫', '叱' => '叱', '吆' => '吆', '咞' => '咞', '吸' => '吸', '呈' => '呈', '周' => '周', '咢' => '咢', '哶' => '哶', '唐' => '唐', '啓' => '啓', '啣' => '啣', '善' => '善', '善' => '善', '喙' => '喙', '喫' => '喫', '喳' => '喳', '嗂' => '嗂', '圖' => '圖', '嘆' => '嘆', '圗' => '圗', '噑' => '噑', '噴' => '噴', '切' => '切', '壮' => '壮', '城' => '城', '埴' => '埴', '堍' => '堍', '型' => '型', '堲' => '堲', '報' => '報', '墬' => '墬', '𡓤' => '𡓤', '売' => '売', '壷' => '壷', '夆' => '夆', '多' => '多', '夢' => '夢', '奢' => '奢', '𡚨' => '𡚨', '𡛪' => '𡛪', '姬' => '姬', '娛' => '娛', '娧' => '娧', '姘' => '姘', '婦' => '婦', '㛮' => '㛮', '㛼' => '㛼', '嬈' => '嬈', '嬾' => '嬾', '嬾' => '嬾', '𡧈' => '𡧈', '寃' => '寃', '寘' => '寘', '寧' => '寧', '寳' => '寳', '𡬘' => '𡬘', '寿' => '寿', '将' => '将', '当' => '当', '尢' => '尢', '㞁' => '㞁', '屠' => '屠', '屮' => '屮', '峀' => '峀', '岍' => '岍', '𡷤' => '𡷤', '嵃' => '嵃', '𡷦' => '𡷦', '嵮' => '嵮', '嵫' => '嵫', '嵼' => '嵼', '巡' => '巡', '巢' => '巢', '㠯' => '㠯', '巽' => '巽', '帨' => '帨', '帽' => '帽', '幩' => '幩', '㡢' => '㡢', '𢆃' => '𢆃', '㡼' => '㡼', '庰' => '庰', '庳' => '庳', '庶' => '庶', '廊' => '廊', '𪎒' => '𪎒', '廾' => '廾', '𢌱' => '𢌱', '𢌱' => '𢌱', '舁' => '舁', '弢' => '弢', '弢' => '弢', '㣇' => '㣇', '𣊸' => '𣊸', '𦇚' => '𦇚', '形' => '形', '彫' => '彫', '㣣' => '㣣', '徚' => '徚', '忍' => '忍', '志' => '志', '忹' => '忹', '悁' => '悁', '㤺' => '㤺', '㤜' => '㤜', '悔' => '悔', '𢛔' => '𢛔', '惇' => '惇', '慈' => '慈', '慌' => '慌', '慎' => '慎', '慌' => '慌', '慺' => '慺', '憎' => '憎', '憲' => '憲', '憤' => '憤', '憯' => '憯', '懞' => '懞', '懲' => '懲', '懶' => '懶', '成' => '成', '戛' => '戛', '扝' => '扝', '抱' => '抱', '拔' => '拔', '捐' => '捐', '𢬌' => '𢬌', '挽' => '挽', '拼' => '拼', '捨' => '捨', '掃' => '掃', '揤' => '揤', '𢯱' => '𢯱', '搢' => '搢', '揅' => '揅', '掩' => '掩', '㨮' => '㨮', '摩' => '摩', '摾' => '摾', '撝' => '撝', '摷' => '摷', '㩬' => '㩬', '敏' => '敏', '敬' => '敬', '𣀊' => '𣀊', '旣' => '旣', '書' => '書', '晉' => '晉', '㬙' => '㬙', '暑' => '暑', '㬈' => '㬈', '㫤' => '㫤', '冒' => '冒', '冕' => '冕', '最' => '最', '暜' => '暜', '肭' => '肭', '䏙' => '䏙', '朗' => '朗', '望' => '望', '朡' => '朡', '杞' => '杞', '杓' => '杓', '𣏃' => '𣏃', '㭉' => '㭉', '柺' => '柺', '枅' => '枅', '桒' => '桒', '梅' => '梅', '𣑭' => '𣑭', '梎' => '梎', '栟' => '栟', '椔' => '椔', '㮝' => '㮝', '楂' => '楂', '榣' => '榣', '槪' => '槪', '檨' => '檨', '𣚣' => '𣚣', '櫛' => '櫛', '㰘' => '㰘', '次' => '次', '𣢧' => '𣢧', '歔' => '歔', '㱎' => '㱎', '歲' => '歲', '殟' => '殟', '殺' => '殺', '殻' => '殻', '𣪍' => '𣪍', '𡴋' => '𡴋', '𣫺' => '𣫺', '汎' => '汎', '𣲼' => '𣲼', '沿' => '沿', '泍' => '泍', '汧' => '汧', '洖' => '洖', '派' => '派', '海' => '海', '流' => '流', '浩' => '浩', '浸' => '浸', '涅' => '涅', '𣴞' => '𣴞', '洴' => '洴', '港' => '港', '湮' => '湮', '㴳' => '㴳', '滋' => '滋', '滇' => '滇', '𣻑' => '𣻑', '淹' => '淹', '潮' => '潮', '𣽞' => '𣽞', '𣾎' => '𣾎', '濆' => '濆', '瀹' => '瀹', '瀞' => '瀞', '瀛' => '瀛', '㶖' => '㶖', '灊' => '灊', '災' => '災', '灷' => '灷', '炭' => '炭', '𠔥' => '𠔥', '煅' => '煅', '𤉣' => '𤉣', '熜' => '熜', '𤎫' => '𤎫', '爨' => '爨', '爵' => '爵', '牐' => '牐', '𤘈' => '𤘈', '犀' => '犀', '犕' => '犕', '𤜵' => '𤜵', '𤠔' => '𤠔', '獺' => '獺', '王' => '王', '㺬' => '㺬', '玥' => '玥', '㺸' => '㺸', '㺸' => '㺸', '瑇' => '瑇', '瑜' => '瑜', '瑱' => '瑱', '璅' => '璅', '瓊' => '瓊', '㼛' => '㼛', '甤' => '甤', '𤰶' => '𤰶', '甾' => '甾', '𤲒' => '𤲒', '異' => '異', '𢆟' => '𢆟', '瘐' => '瘐', '𤾡' => '𤾡', '𤾸' => '𤾸', '𥁄' => '𥁄', '㿼' => '㿼', '䀈' => '䀈', '直' => '直', '𥃳' => '𥃳', '𥃲' => '𥃲', '𥄙' => '𥄙', '𥄳' => '𥄳', '眞' => '眞', '真' => '真', '真' => '真', '睊' => '睊', '䀹' => '䀹', '瞋' => '瞋', '䁆' => '䁆', '䂖' => '䂖', '𥐝' => '𥐝', '硎' => '硎', '碌' => '碌', '磌' => '磌', '䃣' => '䃣', '𥘦' => '𥘦', '祖' => '祖', '𥚚' => '𥚚', '𥛅' => '𥛅', '福' => '福', '秫' => '秫', '䄯' => '䄯', '穀' => '穀', '穊' => '穊', '穏' => '穏', '𥥼' => '𥥼', '𥪧' => '𥪧', '𥪧' => '𥪧', '竮' => '竮', '䈂' => '䈂', '𥮫' => '𥮫', '篆' => '篆', '築' => '築', '䈧' => '䈧', '𥲀' => '𥲀', '糒' => '糒', '䊠' => '䊠', '糨' => '糨', '糣' => '糣', '紀' => '紀', '𥾆' => '𥾆', '絣' => '絣', '䌁' => '䌁', '緇' => '緇', '縂' => '縂', '繅' => '繅', '䌴' => '䌴', '𦈨' => '𦈨', '𦉇' => '𦉇', '䍙' => '䍙', '𦋙' => '𦋙', '罺' => '罺', '𦌾' => '𦌾', '羕' => '羕', '翺' => '翺', '者' => '者', '𦓚' => '𦓚', '𦔣' => '𦔣', '聠' => '聠', '𦖨' => '𦖨', '聰' => '聰', '𣍟' => '𣍟', '䏕' => '䏕', '育' => '育', '脃' => '脃', '䐋' => '䐋', '脾' => '脾', '媵' => '媵', '𦞧' => '𦞧', '𦞵' => '𦞵', '𣎓' => '𣎓', '𣎜' => '𣎜', '舁' => '舁', '舄' => '舄', '辞' => '辞', '䑫' => '䑫', '芑' => '芑', '芋' => '芋', '芝' => '芝', '劳' => '劳', '花' => '花', '芳' => '芳', '芽' => '芽', '苦' => '苦', '𦬼' => '𦬼', '若' => '若', '茝' => '茝', '荣' => '荣', '莭' => '莭', '茣' => '茣', '莽' => '莽', '菧' => '菧', '著' => '著', '荓' => '荓', '菊' => '菊', '菌' => '菌', '菜' => '菜', '𦰶' => '𦰶', '𦵫' => '𦵫', '𦳕' => '𦳕', '䔫' => '䔫', '蓱' => '蓱', '蓳' => '蓳', '蔖' => '蔖', '𧏊' => '𧏊', '蕤' => '蕤', '𦼬' => '𦼬', '䕝' => '䕝', '䕡' => '䕡', '𦾱' => '𦾱', '𧃒' => '𧃒', '䕫' => '䕫', '虐' => '虐', '虜' => '虜', '虧' => '虧', '虩' => '虩', '蚩' => '蚩', '蚈' => '蚈', '蜎' => '蜎', '蛢' => '蛢', '蝹' => '蝹', '蜨' => '蜨', '蝫' => '蝫', '螆' => '螆', '䗗' => '䗗', '蟡' => '蟡', '蠁' => '蠁', '䗹' => '䗹', '衠' => '衠', '衣' => '衣', '𧙧' => '𧙧', '裗' => '裗', '裞' => '裞', '䘵' => '䘵', '裺' => '裺', '㒻' => '㒻', '𧢮' => '𧢮', '𧥦' => '𧥦', '䚾' => '䚾', '䛇' => '䛇', '誠' => '誠', '諭' => '諭', '變' => '變', '豕' => '豕', '𧲨' => '𧲨', '貫' => '貫', '賁' => '賁', '贛' => '贛', '起' => '起', '𧼯' => '𧼯', '𠠄' => '𠠄', '跋' => '跋', '趼' => '趼', '跰' => '跰', '𠣞' => '𠣞', '軔' => '軔', '輸' => '輸', '𨗒' => '𨗒', '𨗭' => '𨗭', '邔' => '邔', '郱' => '郱', '鄑' => '鄑', '𨜮' => '𨜮', '鄛' => '鄛', '鈸' => '鈸', '鋗' => '鋗', '鋘' => '鋘', '鉼' => '鉼', '鏹' => '鏹', '鐕' => '鐕', '𨯺' => '𨯺', '開' => '開', '䦕' => '䦕', '閷' => '閷', '𨵷' => '𨵷', '䧦' => '䧦', '雃' => '雃', '嶲' => '嶲', '霣' => '霣', '𩅅' => '𩅅', '𩈚' => '𩈚', '䩮' => '䩮', '䩶' => '䩶', '韠' => '韠', '𩐊' => '𩐊', '䪲' => '䪲', '𩒖' => '𩒖', '頋' => '頋', '頋' => '頋', '頩' => '頩', '𩖶' => '𩖶', '飢' => '飢', '䬳' => '䬳', '餩' => '餩', '馧' => '馧', '駂' => '駂', '駾' => '駾', '䯎' => '䯎', '𩬰' => '𩬰', '鬒' => '鬒', '鱀' => '鱀', '鳽' => '鳽', '䳎' => '䳎', '䳭' => '䳭', '鵧' => '鵧', '𪃎' => '𪃎', '䳸' => '䳸', '𪄅' => '𪄅', '𪈎' => '𪈎', '𪊑' => '𪊑', '麻' => '麻', '䵖' => '䵖', '黹' => '黹', '黾' => '黾', '鼅' => '鼅', '鼏' => '鼏', '鼖' => '鼖', '鼻' => '鼻', '𪘀' => '𪘀'); 230, '́' => 230, '̂' => 230, '̃' => 230, '̄' => 230, '̅' => 230, '̆' => 230, '̇' => 230, '̈' => 230, '̉' => 230, '̊' => 230, '̋' => 230, '̌' => 230, '̍' => 230, '̎' => 230, '̏' => 230, '̐' => 230, '̑' => 230, '̒' => 230, '̓' => 230, '̔' => 230, '̕' => 232, '̖' => 220, '̗' => 220, '̘' => 220, '̙' => 220, '̚' => 232, '̛' => 216, '̜' => 220, '̝' => 220, '̞' => 220, '̟' => 220, '̠' => 220, '̡' => 202, '̢' => 202, '̣' => 220, '̤' => 220, '̥' => 220, '̦' => 220, '̧' => 202, '̨' => 202, '̩' => 220, '̪' => 220, '̫' => 220, '̬' => 220, '̭' => 220, '̮' => 220, '̯' => 220, '̰' => 220, '̱' => 220, '̲' => 220, '̳' => 220, '̴' => 1, '̵' => 1, '̶' => 1, '̷' => 1, '̸' => 1, '̹' => 220, '̺' => 220, '̻' => 220, '̼' => 220, '̽' => 230, '̾' => 230, '̿' => 230, '̀' => 230, '́' => 230, '͂' => 230, '̓' => 230, '̈́' => 230, 'ͅ' => 240, '͆' => 230, '͇' => 220, '͈' => 220, '͉' => 220, '͊' => 230, '͋' => 230, '͌' => 230, '͍' => 220, '͎' => 220, '͐' => 230, '͑' => 230, '͒' => 230, '͓' => 220, '͔' => 220, '͕' => 220, '͖' => 220, '͗' => 230, '͘' => 232, '͙' => 220, '͚' => 220, '͛' => 230, '͜' => 233, '͝' => 234, '͞' => 234, '͟' => 233, '͠' => 234, '͡' => 234, '͢' => 233, 'ͣ' => 230, 'ͤ' => 230, 'ͥ' => 230, 'ͦ' => 230, 'ͧ' => 230, 'ͨ' => 230, 'ͩ' => 230, 'ͪ' => 230, 'ͫ' => 230, 'ͬ' => 230, 'ͭ' => 230, 'ͮ' => 230, 'ͯ' => 230, '҃' => 230, '҄' => 230, '҅' => 230, '҆' => 230, '҇' => 230, '֑' => 220, '֒' => 230, '֓' => 230, '֔' => 230, '֕' => 230, '֖' => 220, '֗' => 230, '֘' => 230, '֙' => 230, '֚' => 222, '֛' => 220, '֜' => 230, '֝' => 230, '֞' => 230, '֟' => 230, '֠' => 230, '֡' => 230, '֢' => 220, '֣' => 220, '֤' => 220, '֥' => 220, '֦' => 220, '֧' => 220, '֨' => 230, '֩' => 230, '֪' => 220, '֫' => 230, '֬' => 230, '֭' => 222, '֮' => 228, '֯' => 230, 'ְ' => 10, 'ֱ' => 11, 'ֲ' => 12, 'ֳ' => 13, 'ִ' => 14, 'ֵ' => 15, 'ֶ' => 16, 'ַ' => 17, 'ָ' => 18, 'ֹ' => 19, 'ֺ' => 19, 'ֻ' => 20, 'ּ' => 21, 'ֽ' => 22, 'ֿ' => 23, 'ׁ' => 24, 'ׂ' => 25, 'ׄ' => 230, 'ׅ' => 220, 'ׇ' => 18, 'ؐ' => 230, 'ؑ' => 230, 'ؒ' => 230, 'ؓ' => 230, 'ؔ' => 230, 'ؕ' => 230, 'ؖ' => 230, 'ؗ' => 230, 'ؘ' => 30, 'ؙ' => 31, 'ؚ' => 32, 'ً' => 27, 'ٌ' => 28, 'ٍ' => 29, 'َ' => 30, 'ُ' => 31, 'ِ' => 32, 'ّ' => 33, 'ْ' => 34, 'ٓ' => 230, 'ٔ' => 230, 'ٕ' => 220, 'ٖ' => 220, 'ٗ' => 230, '٘' => 230, 'ٙ' => 230, 'ٚ' => 230, 'ٛ' => 230, 'ٜ' => 220, 'ٝ' => 230, 'ٞ' => 230, 'ٟ' => 220, 'ٰ' => 35, 'ۖ' => 230, 'ۗ' => 230, 'ۘ' => 230, 'ۙ' => 230, 'ۚ' => 230, 'ۛ' => 230, 'ۜ' => 230, '۟' => 230, '۠' => 230, 'ۡ' => 230, 'ۢ' => 230, 'ۣ' => 220, 'ۤ' => 230, 'ۧ' => 230, 'ۨ' => 230, '۪' => 220, '۫' => 230, '۬' => 230, 'ۭ' => 220, 'ܑ' => 36, 'ܰ' => 230, 'ܱ' => 220, 'ܲ' => 230, 'ܳ' => 230, 'ܴ' => 220, 'ܵ' => 230, 'ܶ' => 230, 'ܷ' => 220, 'ܸ' => 220, 'ܹ' => 220, 'ܺ' => 230, 'ܻ' => 220, 'ܼ' => 220, 'ܽ' => 230, 'ܾ' => 220, 'ܿ' => 230, '݀' => 230, '݁' => 230, '݂' => 220, '݃' => 230, '݄' => 220, '݅' => 230, '݆' => 220, '݇' => 230, '݈' => 220, '݉' => 230, '݊' => 230, '߫' => 230, '߬' => 230, '߭' => 230, '߮' => 230, '߯' => 230, '߰' => 230, '߱' => 230, '߲' => 220, '߳' => 230, '߽' => 220, 'ࠖ' => 230, 'ࠗ' => 230, '࠘' => 230, '࠙' => 230, 'ࠛ' => 230, 'ࠜ' => 230, 'ࠝ' => 230, 'ࠞ' => 230, 'ࠟ' => 230, 'ࠠ' => 230, 'ࠡ' => 230, 'ࠢ' => 230, 'ࠣ' => 230, 'ࠥ' => 230, 'ࠦ' => 230, 'ࠧ' => 230, 'ࠩ' => 230, 'ࠪ' => 230, 'ࠫ' => 230, 'ࠬ' => 230, '࠭' => 230, '࡙' => 220, '࡚' => 220, '࡛' => 220, '࣓' => 220, 'ࣔ' => 230, 'ࣕ' => 230, 'ࣖ' => 230, 'ࣗ' => 230, 'ࣘ' => 230, 'ࣙ' => 230, 'ࣚ' => 230, 'ࣛ' => 230, 'ࣜ' => 230, 'ࣝ' => 230, 'ࣞ' => 230, 'ࣟ' => 230, '࣠' => 230, '࣡' => 230, 'ࣣ' => 220, 'ࣤ' => 230, 'ࣥ' => 230, 'ࣦ' => 220, 'ࣧ' => 230, 'ࣨ' => 230, 'ࣩ' => 220, '࣪' => 230, '࣫' => 230, '࣬' => 230, '࣭' => 220, '࣮' => 220, '࣯' => 220, 'ࣰ' => 27, 'ࣱ' => 28, 'ࣲ' => 29, 'ࣳ' => 230, 'ࣴ' => 230, 'ࣵ' => 230, 'ࣶ' => 220, 'ࣷ' => 230, 'ࣸ' => 230, 'ࣹ' => 220, 'ࣺ' => 220, 'ࣻ' => 230, 'ࣼ' => 230, 'ࣽ' => 230, 'ࣾ' => 230, 'ࣿ' => 230, '़' => 7, '्' => 9, '॑' => 230, '॒' => 220, '॓' => 230, '॔' => 230, '়' => 7, '্' => 9, '৾' => 230, '਼' => 7, '੍' => 9, '઼' => 7, '્' => 9, '଼' => 7, '୍' => 9, '்' => 9, '్' => 9, 'ౕ' => 84, 'ౖ' => 91, '಼' => 7, '್' => 9, '഻' => 9, '഼' => 9, '്' => 9, '්' => 9, 'ุ' => 103, 'ู' => 103, 'ฺ' => 9, '่' => 107, '้' => 107, '๊' => 107, '๋' => 107, 'ຸ' => 118, 'ູ' => 118, '຺' => 9, '່' => 122, '້' => 122, '໊' => 122, '໋' => 122, '༘' => 220, '༙' => 220, '༵' => 220, '༷' => 220, '༹' => 216, 'ཱ' => 129, 'ི' => 130, 'ུ' => 132, 'ེ' => 130, 'ཻ' => 130, 'ོ' => 130, 'ཽ' => 130, 'ྀ' => 130, 'ྂ' => 230, 'ྃ' => 230, '྄' => 9, '྆' => 230, '྇' => 230, '࿆' => 220, '့' => 7, '္' => 9, '်' => 9, 'ႍ' => 220, '፝' => 230, '፞' => 230, '፟' => 230, '᜔' => 9, '᜴' => 9, '្' => 9, '៝' => 230, 'ᢩ' => 228, '᤹' => 222, '᤺' => 230, '᤻' => 220, 'ᨗ' => 230, 'ᨘ' => 220, '᩠' => 9, '᩵' => 230, '᩶' => 230, '᩷' => 230, '᩸' => 230, '᩹' => 230, '᩺' => 230, '᩻' => 230, '᩼' => 230, '᩿' => 220, '᪰' => 230, '᪱' => 230, '᪲' => 230, '᪳' => 230, '᪴' => 230, '᪵' => 220, '᪶' => 220, '᪷' => 220, '᪸' => 220, '᪹' => 220, '᪺' => 220, '᪻' => 230, '᪼' => 230, '᪽' => 220, 'ᪿ' => 220, 'ᫀ' => 220, '᬴' => 7, '᭄' => 9, '᭫' => 230, '᭬' => 220, '᭭' => 230, '᭮' => 230, '᭯' => 230, '᭰' => 230, '᭱' => 230, '᭲' => 230, '᭳' => 230, '᮪' => 9, '᮫' => 9, '᯦' => 7, '᯲' => 9, '᯳' => 9, '᰷' => 7, '᳐' => 230, '᳑' => 230, '᳒' => 230, '᳔' => 1, '᳕' => 220, '᳖' => 220, '᳗' => 220, '᳘' => 220, '᳙' => 220, '᳚' => 230, '᳛' => 230, '᳜' => 220, '᳝' => 220, '᳞' => 220, '᳟' => 220, '᳠' => 230, '᳢' => 1, '᳣' => 1, '᳤' => 1, '᳥' => 1, '᳦' => 1, '᳧' => 1, '᳨' => 1, '᳭' => 220, '᳴' => 230, '᳸' => 230, '᳹' => 230, '᷀' => 230, '᷁' => 230, '᷂' => 220, '᷃' => 230, '᷄' => 230, '᷅' => 230, '᷆' => 230, '᷇' => 230, '᷈' => 230, '᷉' => 230, '᷊' => 220, '᷋' => 230, '᷌' => 230, '᷍' => 234, '᷎' => 214, '᷏' => 220, '᷐' => 202, '᷑' => 230, '᷒' => 230, 'ᷓ' => 230, 'ᷔ' => 230, 'ᷕ' => 230, 'ᷖ' => 230, 'ᷗ' => 230, 'ᷘ' => 230, 'ᷙ' => 230, 'ᷚ' => 230, 'ᷛ' => 230, 'ᷜ' => 230, 'ᷝ' => 230, 'ᷞ' => 230, 'ᷟ' => 230, 'ᷠ' => 230, 'ᷡ' => 230, 'ᷢ' => 230, 'ᷣ' => 230, 'ᷤ' => 230, 'ᷥ' => 230, 'ᷦ' => 230, 'ᷧ' => 230, 'ᷨ' => 230, 'ᷩ' => 230, 'ᷪ' => 230, 'ᷫ' => 230, 'ᷬ' => 230, 'ᷭ' => 230, 'ᷮ' => 230, 'ᷯ' => 230, 'ᷰ' => 230, 'ᷱ' => 230, 'ᷲ' => 230, 'ᷳ' => 230, 'ᷴ' => 230, '᷵' => 230, '᷶' => 232, '᷷' => 228, '᷸' => 228, '᷹' => 220, '᷻' => 230, '᷼' => 233, '᷽' => 220, '᷾' => 230, '᷿' => 220, '⃐' => 230, '⃑' => 230, '⃒' => 1, '⃓' => 1, '⃔' => 230, '⃕' => 230, '⃖' => 230, '⃗' => 230, '⃘' => 1, '⃙' => 1, '⃚' => 1, '⃛' => 230, '⃜' => 230, '⃡' => 230, '⃥' => 1, '⃦' => 1, '⃧' => 230, '⃨' => 220, '⃩' => 230, '⃪' => 1, '⃫' => 1, '⃬' => 220, '⃭' => 220, '⃮' => 220, '⃯' => 220, '⃰' => 230, '⳯' => 230, '⳰' => 230, '⳱' => 230, '⵿' => 9, 'ⷠ' => 230, 'ⷡ' => 230, 'ⷢ' => 230, 'ⷣ' => 230, 'ⷤ' => 230, 'ⷥ' => 230, 'ⷦ' => 230, 'ⷧ' => 230, 'ⷨ' => 230, 'ⷩ' => 230, 'ⷪ' => 230, 'ⷫ' => 230, 'ⷬ' => 230, 'ⷭ' => 230, 'ⷮ' => 230, 'ⷯ' => 230, 'ⷰ' => 230, 'ⷱ' => 230, 'ⷲ' => 230, 'ⷳ' => 230, 'ⷴ' => 230, 'ⷵ' => 230, 'ⷶ' => 230, 'ⷷ' => 230, 'ⷸ' => 230, 'ⷹ' => 230, 'ⷺ' => 230, 'ⷻ' => 230, 'ⷼ' => 230, 'ⷽ' => 230, 'ⷾ' => 230, 'ⷿ' => 230, '〪' => 218, '〫' => 228, '〬' => 232, '〭' => 222, '〮' => 224, '〯' => 224, '゙' => 8, '゚' => 8, '꙯' => 230, 'ꙴ' => 230, 'ꙵ' => 230, 'ꙶ' => 230, 'ꙷ' => 230, 'ꙸ' => 230, 'ꙹ' => 230, 'ꙺ' => 230, 'ꙻ' => 230, '꙼' => 230, '꙽' => 230, 'ꚞ' => 230, 'ꚟ' => 230, '꛰' => 230, '꛱' => 230, '꠆' => 9, '꠬' => 9, '꣄' => 9, '꣠' => 230, '꣡' => 230, '꣢' => 230, '꣣' => 230, '꣤' => 230, '꣥' => 230, '꣦' => 230, '꣧' => 230, '꣨' => 230, '꣩' => 230, '꣪' => 230, '꣫' => 230, '꣬' => 230, '꣭' => 230, '꣮' => 230, '꣯' => 230, '꣰' => 230, '꣱' => 230, '꤫' => 220, '꤬' => 220, '꤭' => 220, '꥓' => 9, '꦳' => 7, '꧀' => 9, 'ꪰ' => 230, 'ꪲ' => 230, 'ꪳ' => 230, 'ꪴ' => 220, 'ꪷ' => 230, 'ꪸ' => 230, 'ꪾ' => 230, '꪿' => 230, '꫁' => 230, '꫶' => 9, '꯭' => 9, 'ﬞ' => 26, '︠' => 230, '︡' => 230, '︢' => 230, '︣' => 230, '︤' => 230, '︥' => 230, '︦' => 230, '︧' => 220, '︨' => 220, '︩' => 220, '︪' => 220, '︫' => 220, '︬' => 220, '︭' => 220, '︮' => 230, '︯' => 230, '𐇽' => 220, '𐋠' => 220, '𐍶' => 230, '𐍷' => 230, '𐍸' => 230, '𐍹' => 230, '𐍺' => 230, '𐨍' => 220, '𐨏' => 230, '𐨸' => 230, '𐨹' => 1, '𐨺' => 220, '𐨿' => 9, '𐫥' => 230, '𐫦' => 220, '𐴤' => 230, '𐴥' => 230, '𐴦' => 230, '𐴧' => 230, '𐺫' => 230, '𐺬' => 230, '𐽆' => 220, '𐽇' => 220, '𐽈' => 230, '𐽉' => 230, '𐽊' => 230, '𐽋' => 220, '𐽌' => 230, '𐽍' => 220, '𐽎' => 220, '𐽏' => 220, '𐽐' => 220, '𑁆' => 9, '𑁿' => 9, '𑂹' => 9, '𑂺' => 7, '𑄀' => 230, '𑄁' => 230, '𑄂' => 230, '𑄳' => 9, '𑄴' => 9, '𑅳' => 7, '𑇀' => 9, '𑇊' => 7, '𑈵' => 9, '𑈶' => 7, '𑋩' => 7, '𑋪' => 9, '𑌻' => 7, '𑌼' => 7, '𑍍' => 9, '𑍦' => 230, '𑍧' => 230, '𑍨' => 230, '𑍩' => 230, '𑍪' => 230, '𑍫' => 230, '𑍬' => 230, '𑍰' => 230, '𑍱' => 230, '𑍲' => 230, '𑍳' => 230, '𑍴' => 230, '𑑂' => 9, '𑑆' => 7, '𑑞' => 230, '𑓂' => 9, '𑓃' => 7, '𑖿' => 9, '𑗀' => 7, '𑘿' => 9, '𑚶' => 9, '𑚷' => 7, '𑜫' => 9, '𑠹' => 9, '𑠺' => 7, '𑤽' => 9, '𑤾' => 9, '𑥃' => 7, '𑧠' => 9, '𑨴' => 9, '𑩇' => 9, '𑪙' => 9, '𑰿' => 9, '𑵂' => 7, '𑵄' => 9, '𑵅' => 9, '𑶗' => 9, '𖫰' => 1, '𖫱' => 1, '𖫲' => 1, '𖫳' => 1, '𖫴' => 1, '𖬰' => 230, '𖬱' => 230, '𖬲' => 230, '𖬳' => 230, '𖬴' => 230, '𖬵' => 230, '𖬶' => 230, '𖿰' => 6, '𖿱' => 6, '𛲞' => 1, '𝅥' => 216, '𝅦' => 216, '𝅧' => 1, '𝅨' => 1, '𝅩' => 1, '𝅭' => 226, '𝅮' => 216, '𝅯' => 216, '𝅰' => 216, '𝅱' => 216, '𝅲' => 216, '𝅻' => 220, '𝅼' => 220, '𝅽' => 220, '𝅾' => 220, '𝅿' => 220, '𝆀' => 220, '𝆁' => 220, '𝆂' => 220, '𝆅' => 230, '𝆆' => 230, '𝆇' => 230, '𝆈' => 230, '𝆉' => 230, '𝆊' => 220, '𝆋' => 220, '𝆪' => 230, '𝆫' => 230, '𝆬' => 230, '𝆭' => 230, '𝉂' => 230, '𝉃' => 230, '𝉄' => 230, '𞀀' => 230, '𞀁' => 230, '𞀂' => 230, '𞀃' => 230, '𞀄' => 230, '𞀅' => 230, '𞀆' => 230, '𞀈' => 230, '𞀉' => 230, '𞀊' => 230, '𞀋' => 230, '𞀌' => 230, '𞀍' => 230, '𞀎' => 230, '𞀏' => 230, '𞀐' => 230, '𞀑' => 230, '𞀒' => 230, '𞀓' => 230, '𞀔' => 230, '𞀕' => 230, '𞀖' => 230, '𞀗' => 230, '𞀘' => 230, '𞀛' => 230, '𞀜' => 230, '𞀝' => 230, '𞀞' => 230, '𞀟' => 230, '𞀠' => 230, '𞀡' => 230, '𞀣' => 230, '𞀤' => 230, '𞀦' => 230, '𞀧' => 230, '𞀨' => 230, '𞀩' => 230, '𞀪' => 230, '𞄰' => 230, '𞄱' => 230, '𞄲' => 230, '𞄳' => 230, '𞄴' => 230, '𞄵' => 230, '𞄶' => 230, '𞋬' => 230, '𞋭' => 230, '𞋮' => 230, '𞋯' => 230, '𞣐' => 220, '𞣑' => 220, '𞣒' => 220, '𞣓' => 220, '𞣔' => 220, '𞣕' => 220, '𞣖' => 220, '𞥄' => 230, '𞥅' => 230, '𞥆' => 230, '𞥇' => 230, '𞥈' => 230, '𞥉' => 230, '𞥊' => 7); * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ use _HumbugBox1cb33d1f20f1\Symfony\Polyfill\Intl\Normalizer as p; if (!\function_exists('normalizer_is_normalized')) { function normalizer_is_normalized(?string $string, ?int $form = p\Normalizer::FORM_C) : bool { return p\Normalizer::isNormalized((string) $string, (int) $form); } } if (!\function_exists('normalizer_normalize')) { function normalizer_normalize(?string $string, ?int $form = p\Normalizer::FORM_C) : string|false { return p\Normalizer::normalize((string) $string, (int) $form); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ use _HumbugBox1cb33d1f20f1\Symfony\Polyfill\Php73 as p; if (\PHP_VERSION_ID >= 70300) { return; } if (!\function_exists('is_countable')) { function is_countable($value) { return \is_array($value) || $value instanceof \Countable || $value instanceof \ResourceBundle || $value instanceof \SimpleXmlElement; } } if (!\function_exists('hrtime')) { require_once __DIR__ . '/Php73.php'; p\Php73::$startAt = (int) \microtime(\true); function hrtime($as_number = \false) { return p\Php73::hrtime($as_number); } } if (!\function_exists('array_key_first')) { function array_key_first(array $array) { foreach ($array as $key => $value) { return $key; } } } if (!\function_exists('array_key_last')) { function array_key_last(array $array) { return \key(\array_slice($array, -1, 1, \true)); } } Copyright (c) 2018-2019 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. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ if (\PHP_VERSION_ID < 70300) { class JsonException extends \Exception { } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Symfony\Polyfill\Php73; /** * @author Gabriel Caruso * @author Ion Bazan * * @internal */ final class Php73 { public static $startAt = 1533462603; /** * @param bool $asNum * * @return array|float|int */ public static function hrtime($asNum = \false) { $ns = \microtime(\false); $s = \substr($ns, 11) - self::$startAt; $ns = 1000000000.0 * (float) $ns; if ($asNum) { $ns += $s * 1000000000.0; return \PHP_INT_SIZE === 4 ? $ns : (int) $ns; } return [$s, (int) $ns]; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Webmozart\Assert; use ArrayAccess; use BadMethodCallException; use Closure; use Countable; use DateTime; use DateTimeImmutable; use Exception; use ResourceBundle; use SimpleXMLElement; use Throwable; use Traversable; /** * Efficient assertions to validate the input/output of your methods. * * @since 1.0 * * @author Bernhard Schussek */ class Assert { use Mixin; /** * @psalm-pure * @psalm-assert string $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function string($value, $message = '') { if (!\is_string($value)) { static::reportInvalidArgument(\sprintf($message ?: 'Expected a string. Got: %s', static::typeToString($value))); } } /** * @psalm-pure * @psalm-assert non-empty-string $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function stringNotEmpty($value, $message = '') { static::string($value, $message); static::notEq($value, '', $message); } /** * @psalm-pure * @psalm-assert int $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function integer($value, $message = '') { if (!\is_int($value)) { static::reportInvalidArgument(\sprintf($message ?: 'Expected an integer. Got: %s', static::typeToString($value))); } } /** * @psalm-pure * @psalm-assert numeric $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function integerish($value, $message = '') { if (!\is_numeric($value) || $value != (int) $value) { static::reportInvalidArgument(\sprintf($message ?: 'Expected an integerish value. Got: %s', static::typeToString($value))); } } /** * @psalm-pure * @psalm-assert positive-int $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function positiveInteger($value, $message = '') { if (!(\is_int($value) && $value > 0)) { static::reportInvalidArgument(\sprintf($message ?: 'Expected a positive integer. Got: %s', static::valueToString($value))); } } /** * @psalm-pure * @psalm-assert float $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function float($value, $message = '') { if (!\is_float($value)) { static::reportInvalidArgument(\sprintf($message ?: 'Expected a float. Got: %s', static::typeToString($value))); } } /** * @psalm-pure * @psalm-assert numeric $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function numeric($value, $message = '') { if (!\is_numeric($value)) { static::reportInvalidArgument(\sprintf($message ?: 'Expected a numeric. Got: %s', static::typeToString($value))); } } /** * @psalm-pure * @psalm-assert positive-int|0 $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function natural($value, $message = '') { if (!\is_int($value) || $value < 0) { static::reportInvalidArgument(\sprintf($message ?: 'Expected a non-negative integer. Got: %s', static::valueToString($value))); } } /** * @psalm-pure * @psalm-assert bool $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function boolean($value, $message = '') { if (!\is_bool($value)) { static::reportInvalidArgument(\sprintf($message ?: 'Expected a boolean. Got: %s', static::typeToString($value))); } } /** * @psalm-pure * @psalm-assert scalar $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function scalar($value, $message = '') { if (!\is_scalar($value)) { static::reportInvalidArgument(\sprintf($message ?: 'Expected a scalar. Got: %s', static::typeToString($value))); } } /** * @psalm-pure * @psalm-assert object $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function object($value, $message = '') { if (!\is_object($value)) { static::reportInvalidArgument(\sprintf($message ?: 'Expected an object. Got: %s', static::typeToString($value))); } } /** * @psalm-pure * @psalm-assert resource $value * * @param mixed $value * @param string|null $type type of resource this should be. @see https://www.php.net/manual/en/function.get-resource-type.php * @param string $message * * @throws InvalidArgumentException */ public static function resource($value, $type = null, $message = '') { if (!\is_resource($value)) { static::reportInvalidArgument(\sprintf($message ?: 'Expected a resource. Got: %s', static::typeToString($value))); } if ($type && $type !== \get_resource_type($value)) { static::reportInvalidArgument(\sprintf($message ?: 'Expected a resource of type %2$s. Got: %s', static::typeToString($value), $type)); } } /** * @psalm-pure * @psalm-assert callable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function isCallable($value, $message = '') { if (!\is_callable($value)) { static::reportInvalidArgument(\sprintf($message ?: 'Expected a callable. Got: %s', static::typeToString($value))); } } /** * @psalm-pure * @psalm-assert array $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function isArray($value, $message = '') { if (!\is_array($value)) { static::reportInvalidArgument(\sprintf($message ?: 'Expected an array. Got: %s', static::typeToString($value))); } } /** * @psalm-pure * @psalm-assert iterable $value * * @deprecated use "isIterable" or "isInstanceOf" instead * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function isTraversable($value, $message = '') { @\trigger_error(\sprintf('The "%s" assertion is deprecated. You should stop using it, as it will soon be removed in 2.0 version. Use "isIterable" or "isInstanceOf" instead.', __METHOD__), \E_USER_DEPRECATED); if (!\is_array($value) && !$value instanceof Traversable) { static::reportInvalidArgument(\sprintf($message ?: 'Expected a traversable. Got: %s', static::typeToString($value))); } } /** * @psalm-pure * @psalm-assert array|ArrayAccess $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function isArrayAccessible($value, $message = '') { if (!\is_array($value) && !$value instanceof ArrayAccess) { static::reportInvalidArgument(\sprintf($message ?: 'Expected an array accessible. Got: %s', static::typeToString($value))); } } /** * @psalm-pure * @psalm-assert countable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function isCountable($value, $message = '') { if (!\is_array($value) && !$value instanceof Countable && !$value instanceof ResourceBundle && !$value instanceof SimpleXMLElement) { static::reportInvalidArgument(\sprintf($message ?: 'Expected a countable. Got: %s', static::typeToString($value))); } } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function isIterable($value, $message = '') { if (!\is_array($value) && !$value instanceof Traversable) { static::reportInvalidArgument(\sprintf($message ?: 'Expected an iterable. Got: %s', static::typeToString($value))); } } /** * @psalm-pure * @psalm-template ExpectedType of object * @psalm-param class-string $class * @psalm-assert ExpectedType $value * * @param mixed $value * @param string|object $class * @param string $message * * @throws InvalidArgumentException */ public static function isInstanceOf($value, $class, $message = '') { if (!$value instanceof $class) { static::reportInvalidArgument(\sprintf($message ?: 'Expected an instance of %2$s. Got: %s', static::typeToString($value), $class)); } } /** * @psalm-pure * @psalm-template ExpectedType of object * @psalm-param class-string $class * @psalm-assert !ExpectedType $value * * @param mixed $value * @param string|object $class * @param string $message * * @throws InvalidArgumentException */ public static function notInstanceOf($value, $class, $message = '') { if ($value instanceof $class) { static::reportInvalidArgument(\sprintf($message ?: 'Expected an instance other than %2$s. Got: %s', static::typeToString($value), $class)); } } /** * @psalm-pure * @psalm-param array $classes * * @param mixed $value * @param array $classes * @param string $message * * @throws InvalidArgumentException */ public static function isInstanceOfAny($value, array $classes, $message = '') { foreach ($classes as $class) { if ($value instanceof $class) { return; } } static::reportInvalidArgument(\sprintf($message ?: 'Expected an instance of any of %2$s. Got: %s', static::typeToString($value), \implode(', ', \array_map(array(static::class, 'valueToString'), $classes)))); } /** * @psalm-pure * @psalm-template ExpectedType of object * @psalm-param class-string $class * @psalm-assert ExpectedType|class-string $value * * @param object|string $value * @param string $class * @param string $message * * @throws InvalidArgumentException */ public static function isAOf($value, $class, $message = '') { static::string($class, 'Expected class as a string. Got: %s'); if (!\is_a($value, $class, \is_string($value))) { static::reportInvalidArgument(\sprintf($message ?: 'Expected an instance of this class or to this class among its parents "%2$s". Got: %s', static::valueToString($value), $class)); } } /** * @psalm-pure * @psalm-template UnexpectedType of object * @psalm-param class-string $class * @psalm-assert !UnexpectedType $value * @psalm-assert !class-string $value * * @param object|string $value * @param string $class * @param string $message * * @throws InvalidArgumentException */ public static function isNotA($value, $class, $message = '') { static::string($class, 'Expected class as a string. Got: %s'); if (\is_a($value, $class, \is_string($value))) { static::reportInvalidArgument(\sprintf($message ?: 'Expected an instance of this class or to this class among its parents other than "%2$s". Got: %s', static::valueToString($value), $class)); } } /** * @psalm-pure * @psalm-param array $classes * * @param object|string $value * @param string[] $classes * @param string $message * * @throws InvalidArgumentException */ public static function isAnyOf($value, array $classes, $message = '') { foreach ($classes as $class) { static::string($class, 'Expected class as a string. Got: %s'); if (\is_a($value, $class, \is_string($value))) { return; } } static::reportInvalidArgument(\sprintf($message ?: 'Expected an instance of any of this classes or any of those classes among their parents "%2$s". Got: %s', static::valueToString($value), \implode(', ', $classes))); } /** * @psalm-pure * @psalm-assert empty $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function isEmpty($value, $message = '') { if (!empty($value)) { static::reportInvalidArgument(\sprintf($message ?: 'Expected an empty value. Got: %s', static::valueToString($value))); } } /** * @psalm-pure * @psalm-assert !empty $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function notEmpty($value, $message = '') { if (empty($value)) { static::reportInvalidArgument(\sprintf($message ?: 'Expected a non-empty value. Got: %s', static::valueToString($value))); } } /** * @psalm-pure * @psalm-assert null $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function null($value, $message = '') { if (null !== $value) { static::reportInvalidArgument(\sprintf($message ?: 'Expected null. Got: %s', static::valueToString($value))); } } /** * @psalm-pure * @psalm-assert !null $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function notNull($value, $message = '') { if (null === $value) { static::reportInvalidArgument($message ?: 'Expected a value other than null.'); } } /** * @psalm-pure * @psalm-assert true $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function true($value, $message = '') { if (\true !== $value) { static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to be true. Got: %s', static::valueToString($value))); } } /** * @psalm-pure * @psalm-assert false $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function false($value, $message = '') { if (\false !== $value) { static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to be false. Got: %s', static::valueToString($value))); } } /** * @psalm-pure * @psalm-assert !false $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function notFalse($value, $message = '') { if (\false === $value) { static::reportInvalidArgument($message ?: 'Expected a value other than false.'); } } /** * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function ip($value, $message = '') { if (\false === \filter_var($value, \FILTER_VALIDATE_IP)) { static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to be an IP. Got: %s', static::valueToString($value))); } } /** * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function ipv4($value, $message = '') { if (\false === \filter_var($value, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV4)) { static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to be an IPv4. Got: %s', static::valueToString($value))); } } /** * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function ipv6($value, $message = '') { if (\false === \filter_var($value, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV6)) { static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to be an IPv6. Got: %s', static::valueToString($value))); } } /** * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function email($value, $message = '') { if (\false === \filter_var($value, \FILTER_VALIDATE_EMAIL)) { static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to be a valid e-mail address. Got: %s', static::valueToString($value))); } } /** * Does non strict comparisons on the items, so ['3', 3] will not pass the assertion. * * @param array $values * @param string $message * * @throws InvalidArgumentException */ public static function uniqueValues(array $values, $message = '') { $allValues = \count($values); $uniqueValues = \count(\array_unique($values)); if ($allValues !== $uniqueValues) { $difference = $allValues - $uniqueValues; static::reportInvalidArgument(\sprintf($message ?: 'Expected an array of unique values, but %s of them %s duplicated', $difference, 1 === $difference ? 'is' : 'are')); } } /** * @param mixed $value * @param mixed $expect * @param string $message * * @throws InvalidArgumentException */ public static function eq($value, $expect, $message = '') { if ($expect != $value) { static::reportInvalidArgument(\sprintf($message ?: 'Expected a value equal to %2$s. Got: %s', static::valueToString($value), static::valueToString($expect))); } } /** * @param mixed $value * @param mixed $expect * @param string $message * * @throws InvalidArgumentException */ public static function notEq($value, $expect, $message = '') { if ($expect == $value) { static::reportInvalidArgument(\sprintf($message ?: 'Expected a different value than %s.', static::valueToString($expect))); } } /** * @psalm-pure * * @param mixed $value * @param mixed $expect * @param string $message * * @throws InvalidArgumentException */ public static function same($value, $expect, $message = '') { if ($expect !== $value) { static::reportInvalidArgument(\sprintf($message ?: 'Expected a value identical to %2$s. Got: %s', static::valueToString($value), static::valueToString($expect))); } } /** * @psalm-pure * * @param mixed $value * @param mixed $expect * @param string $message * * @throws InvalidArgumentException */ public static function notSame($value, $expect, $message = '') { if ($expect === $value) { static::reportInvalidArgument(\sprintf($message ?: 'Expected a value not identical to %s.', static::valueToString($expect))); } } /** * @psalm-pure * * @param mixed $value * @param mixed $limit * @param string $message * * @throws InvalidArgumentException */ public static function greaterThan($value, $limit, $message = '') { if ($value <= $limit) { static::reportInvalidArgument(\sprintf($message ?: 'Expected a value greater than %2$s. Got: %s', static::valueToString($value), static::valueToString($limit))); } } /** * @psalm-pure * * @param mixed $value * @param mixed $limit * @param string $message * * @throws InvalidArgumentException */ public static function greaterThanEq($value, $limit, $message = '') { if ($value < $limit) { static::reportInvalidArgument(\sprintf($message ?: 'Expected a value greater than or equal to %2$s. Got: %s', static::valueToString($value), static::valueToString($limit))); } } /** * @psalm-pure * * @param mixed $value * @param mixed $limit * @param string $message * * @throws InvalidArgumentException */ public static function lessThan($value, $limit, $message = '') { if ($value >= $limit) { static::reportInvalidArgument(\sprintf($message ?: 'Expected a value less than %2$s. Got: %s', static::valueToString($value), static::valueToString($limit))); } } /** * @psalm-pure * * @param mixed $value * @param mixed $limit * @param string $message * * @throws InvalidArgumentException */ public static function lessThanEq($value, $limit, $message = '') { if ($value > $limit) { static::reportInvalidArgument(\sprintf($message ?: 'Expected a value less than or equal to %2$s. Got: %s', static::valueToString($value), static::valueToString($limit))); } } /** * Inclusive range, so Assert::(3, 3, 5) passes. * * @psalm-pure * * @param mixed $value * @param mixed $min * @param mixed $max * @param string $message * * @throws InvalidArgumentException */ public static function range($value, $min, $max, $message = '') { if ($value < $min || $value > $max) { static::reportInvalidArgument(\sprintf($message ?: 'Expected a value between %2$s and %3$s. Got: %s', static::valueToString($value), static::valueToString($min), static::valueToString($max))); } } /** * A more human-readable alias of Assert::inArray(). * * @psalm-pure * * @param mixed $value * @param array $values * @param string $message * * @throws InvalidArgumentException */ public static function oneOf($value, array $values, $message = '') { static::inArray($value, $values, $message); } /** * Does strict comparison, so Assert::inArray(3, ['3']) does not pass the assertion. * * @psalm-pure * * @param mixed $value * @param array $values * @param string $message * * @throws InvalidArgumentException */ public static function inArray($value, array $values, $message = '') { if (!\in_array($value, $values, \true)) { static::reportInvalidArgument(\sprintf($message ?: 'Expected one of: %2$s. Got: %s', static::valueToString($value), \implode(', ', \array_map(array(static::class, 'valueToString'), $values)))); } } /** * @psalm-pure * * @param string $value * @param string $subString * @param string $message * * @throws InvalidArgumentException */ public static function contains($value, $subString, $message = '') { if (\false === \strpos($value, $subString)) { static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to contain %2$s. Got: %s', static::valueToString($value), static::valueToString($subString))); } } /** * @psalm-pure * * @param string $value * @param string $subString * @param string $message * * @throws InvalidArgumentException */ public static function notContains($value, $subString, $message = '') { if (\false !== \strpos($value, $subString)) { static::reportInvalidArgument(\sprintf($message ?: '%2$s was not expected to be contained in a value. Got: %s', static::valueToString($value), static::valueToString($subString))); } } /** * @psalm-pure * * @param string $value * @param string $message * * @throws InvalidArgumentException */ public static function notWhitespaceOnly($value, $message = '') { if (\preg_match('/^\\s*$/', $value)) { static::reportInvalidArgument(\sprintf($message ?: 'Expected a non-whitespace string. Got: %s', static::valueToString($value))); } } /** * @psalm-pure * * @param string $value * @param string $prefix * @param string $message * * @throws InvalidArgumentException */ public static function startsWith($value, $prefix, $message = '') { if (0 !== \strpos($value, $prefix)) { static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to start with %2$s. Got: %s', static::valueToString($value), static::valueToString($prefix))); } } /** * @psalm-pure * * @param string $value * @param string $prefix * @param string $message * * @throws InvalidArgumentException */ public static function notStartsWith($value, $prefix, $message = '') { if (0 === \strpos($value, $prefix)) { static::reportInvalidArgument(\sprintf($message ?: 'Expected a value not to start with %2$s. Got: %s', static::valueToString($value), static::valueToString($prefix))); } } /** * @psalm-pure * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function startsWithLetter($value, $message = '') { static::string($value); $valid = isset($value[0]); if ($valid) { $locale = \setlocale(\LC_CTYPE, 0); \setlocale(\LC_CTYPE, 'C'); $valid = \ctype_alpha($value[0]); \setlocale(\LC_CTYPE, $locale); } if (!$valid) { static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to start with a letter. Got: %s', static::valueToString($value))); } } /** * @psalm-pure * * @param string $value * @param string $suffix * @param string $message * * @throws InvalidArgumentException */ public static function endsWith($value, $suffix, $message = '') { if ($suffix !== \substr($value, -\strlen($suffix))) { static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to end with %2$s. Got: %s', static::valueToString($value), static::valueToString($suffix))); } } /** * @psalm-pure * * @param string $value * @param string $suffix * @param string $message * * @throws InvalidArgumentException */ public static function notEndsWith($value, $suffix, $message = '') { if ($suffix === \substr($value, -\strlen($suffix))) { static::reportInvalidArgument(\sprintf($message ?: 'Expected a value not to end with %2$s. Got: %s', static::valueToString($value), static::valueToString($suffix))); } } /** * @psalm-pure * * @param string $value * @param string $pattern * @param string $message * * @throws InvalidArgumentException */ public static function regex($value, $pattern, $message = '') { if (!\preg_match($pattern, $value)) { static::reportInvalidArgument(\sprintf($message ?: 'The value %s does not match the expected pattern.', static::valueToString($value))); } } /** * @psalm-pure * * @param string $value * @param string $pattern * @param string $message * * @throws InvalidArgumentException */ public static function notRegex($value, $pattern, $message = '') { if (\preg_match($pattern, $value, $matches, \PREG_OFFSET_CAPTURE)) { static::reportInvalidArgument(\sprintf($message ?: 'The value %s matches the pattern %s (at offset %d).', static::valueToString($value), static::valueToString($pattern), $matches[0][1])); } } /** * @psalm-pure * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function unicodeLetters($value, $message = '') { static::string($value); if (!\preg_match('/^\\p{L}+$/u', $value)) { static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to contain only Unicode letters. Got: %s', static::valueToString($value))); } } /** * @psalm-pure * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function alpha($value, $message = '') { static::string($value); $locale = \setlocale(\LC_CTYPE, 0); \setlocale(\LC_CTYPE, 'C'); $valid = !\ctype_alpha($value); \setlocale(\LC_CTYPE, $locale); if ($valid) { static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to contain only letters. Got: %s', static::valueToString($value))); } } /** * @psalm-pure * * @param string $value * @param string $message * * @throws InvalidArgumentException */ public static function digits($value, $message = '') { $locale = \setlocale(\LC_CTYPE, 0); \setlocale(\LC_CTYPE, 'C'); $valid = !\ctype_digit($value); \setlocale(\LC_CTYPE, $locale); if ($valid) { static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to contain digits only. Got: %s', static::valueToString($value))); } } /** * @psalm-pure * * @param string $value * @param string $message * * @throws InvalidArgumentException */ public static function alnum($value, $message = '') { $locale = \setlocale(\LC_CTYPE, 0); \setlocale(\LC_CTYPE, 'C'); $valid = !\ctype_alnum($value); \setlocale(\LC_CTYPE, $locale); if ($valid) { static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to contain letters and digits only. Got: %s', static::valueToString($value))); } } /** * @psalm-pure * @psalm-assert lowercase-string $value * * @param string $value * @param string $message * * @throws InvalidArgumentException */ public static function lower($value, $message = '') { $locale = \setlocale(\LC_CTYPE, 0); \setlocale(\LC_CTYPE, 'C'); $valid = !\ctype_lower($value); \setlocale(\LC_CTYPE, $locale); if ($valid) { static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to contain lowercase characters only. Got: %s', static::valueToString($value))); } } /** * @psalm-pure * @psalm-assert !lowercase-string $value * * @param string $value * @param string $message * * @throws InvalidArgumentException */ public static function upper($value, $message = '') { $locale = \setlocale(\LC_CTYPE, 0); \setlocale(\LC_CTYPE, 'C'); $valid = !\ctype_upper($value); \setlocale(\LC_CTYPE, $locale); if ($valid) { static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to contain uppercase characters only. Got: %s', static::valueToString($value))); } } /** * @psalm-pure * * @param string $value * @param int $length * @param string $message * * @throws InvalidArgumentException */ public static function length($value, $length, $message = '') { if ($length !== static::strlen($value)) { static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to contain %2$s characters. Got: %s', static::valueToString($value), $length)); } } /** * Inclusive min. * * @psalm-pure * * @param string $value * @param int|float $min * @param string $message * * @throws InvalidArgumentException */ public static function minLength($value, $min, $message = '') { if (static::strlen($value) < $min) { static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to contain at least %2$s characters. Got: %s', static::valueToString($value), $min)); } } /** * Inclusive max. * * @psalm-pure * * @param string $value * @param int|float $max * @param string $message * * @throws InvalidArgumentException */ public static function maxLength($value, $max, $message = '') { if (static::strlen($value) > $max) { static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to contain at most %2$s characters. Got: %s', static::valueToString($value), $max)); } } /** * Inclusive , so Assert::lengthBetween('asd', 3, 5); passes the assertion. * * @psalm-pure * * @param string $value * @param int|float $min * @param int|float $max * @param string $message * * @throws InvalidArgumentException */ public static function lengthBetween($value, $min, $max, $message = '') { $length = static::strlen($value); if ($length < $min || $length > $max) { static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to contain between %2$s and %3$s characters. Got: %s', static::valueToString($value), $min, $max)); } } /** * Will also pass if $value is a directory, use Assert::file() instead if you need to be sure it is a file. * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function fileExists($value, $message = '') { static::string($value); if (!\file_exists($value)) { static::reportInvalidArgument(\sprintf($message ?: 'The file %s does not exist.', static::valueToString($value))); } } /** * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function file($value, $message = '') { static::fileExists($value, $message); if (!\is_file($value)) { static::reportInvalidArgument(\sprintf($message ?: 'The path %s is not a file.', static::valueToString($value))); } } /** * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function directory($value, $message = '') { static::fileExists($value, $message); if (!\is_dir($value)) { static::reportInvalidArgument(\sprintf($message ?: 'The path %s is no directory.', static::valueToString($value))); } } /** * @param string $value * @param string $message * * @throws InvalidArgumentException */ public static function readable($value, $message = '') { if (!\is_readable($value)) { static::reportInvalidArgument(\sprintf($message ?: 'The path %s is not readable.', static::valueToString($value))); } } /** * @param string $value * @param string $message * * @throws InvalidArgumentException */ public static function writable($value, $message = '') { if (!\is_writable($value)) { static::reportInvalidArgument(\sprintf($message ?: 'The path %s is not writable.', static::valueToString($value))); } } /** * @psalm-assert class-string $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function classExists($value, $message = '') { if (!\class_exists($value)) { static::reportInvalidArgument(\sprintf($message ?: 'Expected an existing class name. Got: %s', static::valueToString($value))); } } /** * @psalm-pure * @psalm-template ExpectedType of object * @psalm-param class-string $class * @psalm-assert class-string|ExpectedType $value * * @param mixed $value * @param string|object $class * @param string $message * * @throws InvalidArgumentException */ public static function subclassOf($value, $class, $message = '') { if (!\is_subclass_of($value, $class)) { static::reportInvalidArgument(\sprintf($message ?: 'Expected a sub-class of %2$s. Got: %s', static::valueToString($value), static::valueToString($class))); } } /** * @psalm-assert class-string $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function interfaceExists($value, $message = '') { if (!\interface_exists($value)) { static::reportInvalidArgument(\sprintf($message ?: 'Expected an existing interface name. got %s', static::valueToString($value))); } } /** * @psalm-pure * @psalm-template ExpectedType of object * @psalm-param class-string $interface * @psalm-assert class-string $value * * @param mixed $value * @param mixed $interface * @param string $message * * @throws InvalidArgumentException */ public static function implementsInterface($value, $interface, $message = '') { if (!\in_array($interface, \class_implements($value))) { static::reportInvalidArgument(\sprintf($message ?: 'Expected an implementation of %2$s. Got: %s', static::valueToString($value), static::valueToString($interface))); } } /** * @psalm-pure * @psalm-param class-string|object $classOrObject * * @param string|object $classOrObject * @param mixed $property * @param string $message * * @throws InvalidArgumentException */ public static function propertyExists($classOrObject, $property, $message = '') { if (!\property_exists($classOrObject, $property)) { static::reportInvalidArgument(\sprintf($message ?: 'Expected the property %s to exist.', static::valueToString($property))); } } /** * @psalm-pure * @psalm-param class-string|object $classOrObject * * @param string|object $classOrObject * @param mixed $property * @param string $message * * @throws InvalidArgumentException */ public static function propertyNotExists($classOrObject, $property, $message = '') { if (\property_exists($classOrObject, $property)) { static::reportInvalidArgument(\sprintf($message ?: 'Expected the property %s to not exist.', static::valueToString($property))); } } /** * @psalm-pure * @psalm-param class-string|object $classOrObject * * @param string|object $classOrObject * @param mixed $method * @param string $message * * @throws InvalidArgumentException */ public static function methodExists($classOrObject, $method, $message = '') { if (!(\is_string($classOrObject) || \is_object($classOrObject)) || !\method_exists($classOrObject, $method)) { static::reportInvalidArgument(\sprintf($message ?: 'Expected the method %s to exist.', static::valueToString($method))); } } /** * @psalm-pure * @psalm-param class-string|object $classOrObject * * @param string|object $classOrObject * @param mixed $method * @param string $message * * @throws InvalidArgumentException */ public static function methodNotExists($classOrObject, $method, $message = '') { if ((\is_string($classOrObject) || \is_object($classOrObject)) && \method_exists($classOrObject, $method)) { static::reportInvalidArgument(\sprintf($message ?: 'Expected the method %s to not exist.', static::valueToString($method))); } } /** * @psalm-pure * * @param array $array * @param string|int $key * @param string $message * * @throws InvalidArgumentException */ public static function keyExists($array, $key, $message = '') { if (!(isset($array[$key]) || \array_key_exists($key, $array))) { static::reportInvalidArgument(\sprintf($message ?: 'Expected the key %s to exist.', static::valueToString($key))); } } /** * @psalm-pure * * @param array $array * @param string|int $key * @param string $message * * @throws InvalidArgumentException */ public static function keyNotExists($array, $key, $message = '') { if (isset($array[$key]) || \array_key_exists($key, $array)) { static::reportInvalidArgument(\sprintf($message ?: 'Expected the key %s to not exist.', static::valueToString($key))); } } /** * Checks if a value is a valid array key (int or string). * * @psalm-pure * @psalm-assert array-key $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException */ public static function validArrayKey($value, $message = '') { if (!(\is_int($value) || \is_string($value))) { static::reportInvalidArgument(\sprintf($message ?: 'Expected string or integer. Got: %s', static::typeToString($value))); } } /** * Does not check if $array is countable, this can generate a warning on php versions after 7.2. * * @param Countable|array $array * @param int $number * @param string $message * * @throws InvalidArgumentException */ public static function count($array, $number, $message = '') { static::eq(\count($array), $number, \sprintf($message ?: 'Expected an array to contain %d elements. Got: %d.', $number, \count($array))); } /** * Does not check if $array is countable, this can generate a warning on php versions after 7.2. * * @param Countable|array $array * @param int|float $min * @param string $message * * @throws InvalidArgumentException */ public static function minCount($array, $min, $message = '') { if (\count($array) < $min) { static::reportInvalidArgument(\sprintf($message ?: 'Expected an array to contain at least %2$d elements. Got: %d', \count($array), $min)); } } /** * Does not check if $array is countable, this can generate a warning on php versions after 7.2. * * @param Countable|array $array * @param int|float $max * @param string $message * * @throws InvalidArgumentException */ public static function maxCount($array, $max, $message = '') { if (\count($array) > $max) { static::reportInvalidArgument(\sprintf($message ?: 'Expected an array to contain at most %2$d elements. Got: %d', \count($array), $max)); } } /** * Does not check if $array is countable, this can generate a warning on php versions after 7.2. * * @param Countable|array $array * @param int|float $min * @param int|float $max * @param string $message * * @throws InvalidArgumentException */ public static function countBetween($array, $min, $max, $message = '') { $count = \count($array); if ($count < $min || $count > $max) { static::reportInvalidArgument(\sprintf($message ?: 'Expected an array to contain between %2$d and %3$d elements. Got: %d', $count, $min, $max)); } } /** * @psalm-pure * @psalm-assert list $array * * @param mixed $array * @param string $message * * @throws InvalidArgumentException */ public static function isList($array, $message = '') { if (!\is_array($array)) { static::reportInvalidArgument($message ?: 'Expected list - non-associative array.'); } if ($array === \array_values($array)) { return; } $nextKey = -1; foreach ($array as $k => $v) { if ($k !== ++$nextKey) { static::reportInvalidArgument($message ?: 'Expected list - non-associative array.'); } } } /** * @psalm-pure * @psalm-assert non-empty-list $array * * @param mixed $array * @param string $message * * @throws InvalidArgumentException */ public static function isNonEmptyList($array, $message = '') { static::isList($array, $message); static::notEmpty($array, $message); } /** * @psalm-pure * @psalm-template T * @psalm-param mixed|array $array * @psalm-assert array $array * * @param mixed $array * @param string $message * * @throws InvalidArgumentException */ public static function isMap($array, $message = '') { if (!\is_array($array) || \array_keys($array) !== \array_filter(\array_keys($array), '\\is_string')) { static::reportInvalidArgument($message ?: 'Expected map - associative array with string keys.'); } } /** * @psalm-pure * @psalm-template T * @psalm-param mixed|array $array * @psalm-assert array $array * @psalm-assert !empty $array * * @param mixed $array * @param string $message * * @throws InvalidArgumentException */ public static function isNonEmptyMap($array, $message = '') { static::isMap($array, $message); static::notEmpty($array, $message); } /** * @psalm-pure * * @param string $value * @param string $message * * @throws InvalidArgumentException */ public static function uuid($value, $message = '') { $value = \str_replace(array('urn:', 'uuid:', '{', '}'), '', $value); // The nil UUID is special form of UUID that is specified to have all // 128 bits set to zero. if ('00000000-0000-0000-0000-000000000000' === $value) { return; } if (!\preg_match('/^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$/', $value)) { static::reportInvalidArgument(\sprintf($message ?: 'Value %s is not a valid UUID.', static::valueToString($value))); } } /** * @psalm-param class-string $class * * @param Closure $expression * @param string $class * @param string $message * * @throws InvalidArgumentException */ public static function throws(Closure $expression, $class = 'Exception', $message = '') { static::string($class); $actual = 'none'; try { $expression(); } catch (Exception $e) { $actual = \get_class($e); if ($e instanceof $class) { return; } } catch (Throwable $e) { $actual = \get_class($e); if ($e instanceof $class) { return; } } static::reportInvalidArgument($message ?: \sprintf('Expected to throw "%s", got "%s"', $class, $actual)); } /** * @throws BadMethodCallException */ public static function __callStatic($name, $arguments) { if ('nullOr' === \substr($name, 0, 6)) { if (null !== $arguments[0]) { $method = \lcfirst(\substr($name, 6)); \call_user_func_array(array(static::class, $method), $arguments); } return; } if ('all' === \substr($name, 0, 3)) { static::isIterable($arguments[0]); $method = \lcfirst(\substr($name, 3)); $args = $arguments; foreach ($arguments[0] as $entry) { $args[0] = $entry; \call_user_func_array(array(static::class, $method), $args); } return; } throw new BadMethodCallException('No such method: ' . $name); } /** * @param mixed $value * * @return string */ protected static function valueToString($value) { if (null === $value) { return 'null'; } if (\true === $value) { return 'true'; } if (\false === $value) { return 'false'; } if (\is_array($value)) { return 'array'; } if (\is_object($value)) { if (\method_exists($value, '__toString')) { return \get_class($value) . ': ' . self::valueToString($value->__toString()); } if ($value instanceof DateTime || $value instanceof DateTimeImmutable) { return \get_class($value) . ': ' . self::valueToString($value->format('c')); } return \get_class($value); } if (\is_resource($value)) { return 'resource'; } if (\is_string($value)) { return '"' . $value . '"'; } return (string) $value; } /** * @param mixed $value * * @return string */ protected static function typeToString($value) { return \is_object($value) ? \get_class($value) : \gettype($value); } protected static function strlen($value) { if (!\function_exists('mb_detect_encoding')) { return \strlen($value); } if (\false === ($encoding = \mb_detect_encoding($value))) { return \strlen($value); } return \mb_strlen($value, $encoding); } /** * @param string $message * * @throws InvalidArgumentException * * @psalm-pure this method is not supposed to perform side-effects * @psalm-return never */ protected static function reportInvalidArgument($message) { throw new InvalidArgumentException($message); } private function __construct() { } } $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allString($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::string($entry, $message); } } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrString($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::string($entry, $message); } } /** * @psalm-pure * @psalm-assert non-empty-string|null $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrStringNotEmpty($value, $message = '') { null === $value || static::stringNotEmpty($value, $message); } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allStringNotEmpty($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::stringNotEmpty($entry, $message); } } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrStringNotEmpty($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::stringNotEmpty($entry, $message); } } /** * @psalm-pure * @psalm-assert int|null $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrInteger($value, $message = '') { null === $value || static::integer($value, $message); } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allInteger($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::integer($entry, $message); } } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrInteger($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::integer($entry, $message); } } /** * @psalm-pure * @psalm-assert numeric|null $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrIntegerish($value, $message = '') { null === $value || static::integerish($value, $message); } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allIntegerish($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::integerish($entry, $message); } } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrIntegerish($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::integerish($entry, $message); } } /** * @psalm-pure * @psalm-assert positive-int|null $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrPositiveInteger($value, $message = '') { null === $value || static::positiveInteger($value, $message); } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allPositiveInteger($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::positiveInteger($entry, $message); } } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrPositiveInteger($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::positiveInteger($entry, $message); } } /** * @psalm-pure * @psalm-assert float|null $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrFloat($value, $message = '') { null === $value || static::float($value, $message); } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allFloat($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::float($entry, $message); } } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrFloat($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::float($entry, $message); } } /** * @psalm-pure * @psalm-assert numeric|null $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrNumeric($value, $message = '') { null === $value || static::numeric($value, $message); } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNumeric($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::numeric($entry, $message); } } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrNumeric($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::numeric($entry, $message); } } /** * @psalm-pure * @psalm-assert positive-int|0|null $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrNatural($value, $message = '') { null === $value || static::natural($value, $message); } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNatural($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::natural($entry, $message); } } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrNatural($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::natural($entry, $message); } } /** * @psalm-pure * @psalm-assert bool|null $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrBoolean($value, $message = '') { null === $value || static::boolean($value, $message); } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allBoolean($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::boolean($entry, $message); } } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrBoolean($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::boolean($entry, $message); } } /** * @psalm-pure * @psalm-assert scalar|null $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrScalar($value, $message = '') { null === $value || static::scalar($value, $message); } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allScalar($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::scalar($entry, $message); } } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrScalar($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::scalar($entry, $message); } } /** * @psalm-pure * @psalm-assert object|null $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrObject($value, $message = '') { null === $value || static::object($value, $message); } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allObject($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::object($entry, $message); } } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrObject($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::object($entry, $message); } } /** * @psalm-pure * @psalm-assert resource|null $value * * @param mixed $value * @param string|null $type type of resource this should be. @see https://www.php.net/manual/en/function.get-resource-type.php * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrResource($value, $type = null, $message = '') { null === $value || static::resource($value, $type, $message); } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string|null $type type of resource this should be. @see https://www.php.net/manual/en/function.get-resource-type.php * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allResource($value, $type = null, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::resource($entry, $type, $message); } } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string|null $type type of resource this should be. @see https://www.php.net/manual/en/function.get-resource-type.php * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrResource($value, $type = null, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::resource($entry, $type, $message); } } /** * @psalm-pure * @psalm-assert callable|null $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrIsCallable($value, $message = '') { null === $value || static::isCallable($value, $message); } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allIsCallable($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::isCallable($entry, $message); } } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrIsCallable($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::isCallable($entry, $message); } } /** * @psalm-pure * @psalm-assert array|null $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrIsArray($value, $message = '') { null === $value || static::isArray($value, $message); } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allIsArray($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::isArray($entry, $message); } } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrIsArray($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::isArray($entry, $message); } } /** * @psalm-pure * @psalm-assert iterable|null $value * * @deprecated use "isIterable" or "isInstanceOf" instead * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrIsTraversable($value, $message = '') { null === $value || static::isTraversable($value, $message); } /** * @psalm-pure * @psalm-assert iterable $value * * @deprecated use "isIterable" or "isInstanceOf" instead * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allIsTraversable($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::isTraversable($entry, $message); } } /** * @psalm-pure * @psalm-assert iterable $value * * @deprecated use "isIterable" or "isInstanceOf" instead * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrIsTraversable($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::isTraversable($entry, $message); } } /** * @psalm-pure * @psalm-assert array|ArrayAccess|null $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrIsArrayAccessible($value, $message = '') { null === $value || static::isArrayAccessible($value, $message); } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allIsArrayAccessible($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::isArrayAccessible($entry, $message); } } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrIsArrayAccessible($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::isArrayAccessible($entry, $message); } } /** * @psalm-pure * @psalm-assert countable|null $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrIsCountable($value, $message = '') { null === $value || static::isCountable($value, $message); } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allIsCountable($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::isCountable($entry, $message); } } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrIsCountable($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::isCountable($entry, $message); } } /** * @psalm-pure * @psalm-assert iterable|null $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrIsIterable($value, $message = '') { null === $value || static::isIterable($value, $message); } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allIsIterable($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::isIterable($entry, $message); } } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrIsIterable($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::isIterable($entry, $message); } } /** * @psalm-pure * @psalm-template ExpectedType of object * @psalm-param class-string $class * @psalm-assert ExpectedType|null $value * * @param mixed $value * @param string|object $class * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrIsInstanceOf($value, $class, $message = '') { null === $value || static::isInstanceOf($value, $class, $message); } /** * @psalm-pure * @psalm-template ExpectedType of object * @psalm-param class-string $class * @psalm-assert iterable $value * * @param mixed $value * @param string|object $class * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allIsInstanceOf($value, $class, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::isInstanceOf($entry, $class, $message); } } /** * @psalm-pure * @psalm-template ExpectedType of object * @psalm-param class-string $class * @psalm-assert iterable $value * * @param mixed $value * @param string|object $class * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrIsInstanceOf($value, $class, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::isInstanceOf($entry, $class, $message); } } /** * @psalm-pure * @psalm-template ExpectedType of object * @psalm-param class-string $class * * @param mixed $value * @param string|object $class * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrNotInstanceOf($value, $class, $message = '') { null === $value || static::notInstanceOf($value, $class, $message); } /** * @psalm-pure * @psalm-template ExpectedType of object * @psalm-param class-string $class * * @param mixed $value * @param string|object $class * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNotInstanceOf($value, $class, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::notInstanceOf($entry, $class, $message); } } /** * @psalm-pure * @psalm-template ExpectedType of object * @psalm-param class-string $class * @psalm-assert iterable $value * * @param mixed $value * @param string|object $class * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrNotInstanceOf($value, $class, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::notInstanceOf($entry, $class, $message); } } /** * @psalm-pure * @psalm-param array $classes * * @param mixed $value * @param array $classes * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrIsInstanceOfAny($value, $classes, $message = '') { null === $value || static::isInstanceOfAny($value, $classes, $message); } /** * @psalm-pure * @psalm-param array $classes * * @param mixed $value * @param array $classes * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allIsInstanceOfAny($value, $classes, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::isInstanceOfAny($entry, $classes, $message); } } /** * @psalm-pure * @psalm-param array $classes * * @param mixed $value * @param array $classes * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrIsInstanceOfAny($value, $classes, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::isInstanceOfAny($entry, $classes, $message); } } /** * @psalm-pure * @psalm-template ExpectedType of object * @psalm-param class-string $class * @psalm-assert ExpectedType|class-string|null $value * * @param object|string|null $value * @param string $class * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrIsAOf($value, $class, $message = '') { null === $value || static::isAOf($value, $class, $message); } /** * @psalm-pure * @psalm-template ExpectedType of object * @psalm-param class-string $class * @psalm-assert iterable> $value * * @param iterable $value * @param string $class * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allIsAOf($value, $class, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::isAOf($entry, $class, $message); } } /** * @psalm-pure * @psalm-template ExpectedType of object * @psalm-param class-string $class * @psalm-assert iterable|null> $value * * @param iterable $value * @param string $class * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrIsAOf($value, $class, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::isAOf($entry, $class, $message); } } /** * @psalm-pure * @psalm-template UnexpectedType of object * @psalm-param class-string $class * * @param object|string|null $value * @param string $class * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrIsNotA($value, $class, $message = '') { null === $value || static::isNotA($value, $class, $message); } /** * @psalm-pure * @psalm-template UnexpectedType of object * @psalm-param class-string $class * * @param iterable $value * @param string $class * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allIsNotA($value, $class, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::isNotA($entry, $class, $message); } } /** * @psalm-pure * @psalm-template UnexpectedType of object * @psalm-param class-string $class * @psalm-assert iterable $value * @psalm-assert iterable|null> $value * * @param iterable $value * @param string $class * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrIsNotA($value, $class, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::isNotA($entry, $class, $message); } } /** * @psalm-pure * @psalm-param array $classes * * @param object|string|null $value * @param string[] $classes * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrIsAnyOf($value, $classes, $message = '') { null === $value || static::isAnyOf($value, $classes, $message); } /** * @psalm-pure * @psalm-param array $classes * * @param iterable $value * @param string[] $classes * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allIsAnyOf($value, $classes, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::isAnyOf($entry, $classes, $message); } } /** * @psalm-pure * @psalm-param array $classes * * @param iterable $value * @param string[] $classes * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrIsAnyOf($value, $classes, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::isAnyOf($entry, $classes, $message); } } /** * @psalm-pure * @psalm-assert empty $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrIsEmpty($value, $message = '') { null === $value || static::isEmpty($value, $message); } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allIsEmpty($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::isEmpty($entry, $message); } } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrIsEmpty($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::isEmpty($entry, $message); } } /** * @psalm-pure * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrNotEmpty($value, $message = '') { null === $value || static::notEmpty($value, $message); } /** * @psalm-pure * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNotEmpty($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::notEmpty($entry, $message); } } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrNotEmpty($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::notEmpty($entry, $message); } } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNull($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::null($entry, $message); } } /** * @psalm-pure * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNotNull($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::notNull($entry, $message); } } /** * @psalm-pure * @psalm-assert true|null $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrTrue($value, $message = '') { null === $value || static::true($value, $message); } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allTrue($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::true($entry, $message); } } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrTrue($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::true($entry, $message); } } /** * @psalm-pure * @psalm-assert false|null $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrFalse($value, $message = '') { null === $value || static::false($value, $message); } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allFalse($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::false($entry, $message); } } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrFalse($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::false($entry, $message); } } /** * @psalm-pure * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrNotFalse($value, $message = '') { null === $value || static::notFalse($value, $message); } /** * @psalm-pure * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNotFalse($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::notFalse($entry, $message); } } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrNotFalse($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::notFalse($entry, $message); } } /** * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrIp($value, $message = '') { null === $value || static::ip($value, $message); } /** * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allIp($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::ip($entry, $message); } } /** * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrIp($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::ip($entry, $message); } } /** * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrIpv4($value, $message = '') { null === $value || static::ipv4($value, $message); } /** * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allIpv4($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::ipv4($entry, $message); } } /** * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrIpv4($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::ipv4($entry, $message); } } /** * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrIpv6($value, $message = '') { null === $value || static::ipv6($value, $message); } /** * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allIpv6($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::ipv6($entry, $message); } } /** * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrIpv6($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::ipv6($entry, $message); } } /** * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrEmail($value, $message = '') { null === $value || static::email($value, $message); } /** * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allEmail($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::email($entry, $message); } } /** * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrEmail($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::email($entry, $message); } } /** * @param array|null $values * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrUniqueValues($values, $message = '') { null === $values || static::uniqueValues($values, $message); } /** * @param iterable $values * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allUniqueValues($values, $message = '') { static::isIterable($values); foreach ($values as $entry) { static::uniqueValues($entry, $message); } } /** * @param iterable $values * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrUniqueValues($values, $message = '') { static::isIterable($values); foreach ($values as $entry) { null === $entry || static::uniqueValues($entry, $message); } } /** * @param mixed $value * @param mixed $expect * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrEq($value, $expect, $message = '') { null === $value || static::eq($value, $expect, $message); } /** * @param mixed $value * @param mixed $expect * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allEq($value, $expect, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::eq($entry, $expect, $message); } } /** * @param mixed $value * @param mixed $expect * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrEq($value, $expect, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::eq($entry, $expect, $message); } } /** * @param mixed $value * @param mixed $expect * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrNotEq($value, $expect, $message = '') { null === $value || static::notEq($value, $expect, $message); } /** * @param mixed $value * @param mixed $expect * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNotEq($value, $expect, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::notEq($entry, $expect, $message); } } /** * @param mixed $value * @param mixed $expect * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrNotEq($value, $expect, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::notEq($entry, $expect, $message); } } /** * @psalm-pure * * @param mixed $value * @param mixed $expect * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrSame($value, $expect, $message = '') { null === $value || static::same($value, $expect, $message); } /** * @psalm-pure * * @param mixed $value * @param mixed $expect * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allSame($value, $expect, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::same($entry, $expect, $message); } } /** * @psalm-pure * * @param mixed $value * @param mixed $expect * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrSame($value, $expect, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::same($entry, $expect, $message); } } /** * @psalm-pure * * @param mixed $value * @param mixed $expect * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrNotSame($value, $expect, $message = '') { null === $value || static::notSame($value, $expect, $message); } /** * @psalm-pure * * @param mixed $value * @param mixed $expect * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNotSame($value, $expect, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::notSame($entry, $expect, $message); } } /** * @psalm-pure * * @param mixed $value * @param mixed $expect * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrNotSame($value, $expect, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::notSame($entry, $expect, $message); } } /** * @psalm-pure * * @param mixed $value * @param mixed $limit * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrGreaterThan($value, $limit, $message = '') { null === $value || static::greaterThan($value, $limit, $message); } /** * @psalm-pure * * @param mixed $value * @param mixed $limit * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allGreaterThan($value, $limit, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::greaterThan($entry, $limit, $message); } } /** * @psalm-pure * * @param mixed $value * @param mixed $limit * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrGreaterThan($value, $limit, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::greaterThan($entry, $limit, $message); } } /** * @psalm-pure * * @param mixed $value * @param mixed $limit * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrGreaterThanEq($value, $limit, $message = '') { null === $value || static::greaterThanEq($value, $limit, $message); } /** * @psalm-pure * * @param mixed $value * @param mixed $limit * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allGreaterThanEq($value, $limit, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::greaterThanEq($entry, $limit, $message); } } /** * @psalm-pure * * @param mixed $value * @param mixed $limit * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrGreaterThanEq($value, $limit, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::greaterThanEq($entry, $limit, $message); } } /** * @psalm-pure * * @param mixed $value * @param mixed $limit * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrLessThan($value, $limit, $message = '') { null === $value || static::lessThan($value, $limit, $message); } /** * @psalm-pure * * @param mixed $value * @param mixed $limit * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allLessThan($value, $limit, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::lessThan($entry, $limit, $message); } } /** * @psalm-pure * * @param mixed $value * @param mixed $limit * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrLessThan($value, $limit, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::lessThan($entry, $limit, $message); } } /** * @psalm-pure * * @param mixed $value * @param mixed $limit * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrLessThanEq($value, $limit, $message = '') { null === $value || static::lessThanEq($value, $limit, $message); } /** * @psalm-pure * * @param mixed $value * @param mixed $limit * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allLessThanEq($value, $limit, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::lessThanEq($entry, $limit, $message); } } /** * @psalm-pure * * @param mixed $value * @param mixed $limit * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrLessThanEq($value, $limit, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::lessThanEq($entry, $limit, $message); } } /** * @psalm-pure * * @param mixed $value * @param mixed $min * @param mixed $max * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrRange($value, $min, $max, $message = '') { null === $value || static::range($value, $min, $max, $message); } /** * @psalm-pure * * @param mixed $value * @param mixed $min * @param mixed $max * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allRange($value, $min, $max, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::range($entry, $min, $max, $message); } } /** * @psalm-pure * * @param mixed $value * @param mixed $min * @param mixed $max * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrRange($value, $min, $max, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::range($entry, $min, $max, $message); } } /** * @psalm-pure * * @param mixed $value * @param array $values * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrOneOf($value, $values, $message = '') { null === $value || static::oneOf($value, $values, $message); } /** * @psalm-pure * * @param mixed $value * @param array $values * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allOneOf($value, $values, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::oneOf($entry, $values, $message); } } /** * @psalm-pure * * @param mixed $value * @param array $values * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrOneOf($value, $values, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::oneOf($entry, $values, $message); } } /** * @psalm-pure * * @param mixed $value * @param array $values * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrInArray($value, $values, $message = '') { null === $value || static::inArray($value, $values, $message); } /** * @psalm-pure * * @param mixed $value * @param array $values * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allInArray($value, $values, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::inArray($entry, $values, $message); } } /** * @psalm-pure * * @param mixed $value * @param array $values * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrInArray($value, $values, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::inArray($entry, $values, $message); } } /** * @psalm-pure * * @param string|null $value * @param string $subString * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrContains($value, $subString, $message = '') { null === $value || static::contains($value, $subString, $message); } /** * @psalm-pure * * @param iterable $value * @param string $subString * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allContains($value, $subString, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::contains($entry, $subString, $message); } } /** * @psalm-pure * * @param iterable $value * @param string $subString * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrContains($value, $subString, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::contains($entry, $subString, $message); } } /** * @psalm-pure * * @param string|null $value * @param string $subString * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrNotContains($value, $subString, $message = '') { null === $value || static::notContains($value, $subString, $message); } /** * @psalm-pure * * @param iterable $value * @param string $subString * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNotContains($value, $subString, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::notContains($entry, $subString, $message); } } /** * @psalm-pure * * @param iterable $value * @param string $subString * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrNotContains($value, $subString, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::notContains($entry, $subString, $message); } } /** * @psalm-pure * * @param string|null $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrNotWhitespaceOnly($value, $message = '') { null === $value || static::notWhitespaceOnly($value, $message); } /** * @psalm-pure * * @param iterable $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNotWhitespaceOnly($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::notWhitespaceOnly($entry, $message); } } /** * @psalm-pure * * @param iterable $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrNotWhitespaceOnly($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::notWhitespaceOnly($entry, $message); } } /** * @psalm-pure * * @param string|null $value * @param string $prefix * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrStartsWith($value, $prefix, $message = '') { null === $value || static::startsWith($value, $prefix, $message); } /** * @psalm-pure * * @param iterable $value * @param string $prefix * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allStartsWith($value, $prefix, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::startsWith($entry, $prefix, $message); } } /** * @psalm-pure * * @param iterable $value * @param string $prefix * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrStartsWith($value, $prefix, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::startsWith($entry, $prefix, $message); } } /** * @psalm-pure * * @param string|null $value * @param string $prefix * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrNotStartsWith($value, $prefix, $message = '') { null === $value || static::notStartsWith($value, $prefix, $message); } /** * @psalm-pure * * @param iterable $value * @param string $prefix * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNotStartsWith($value, $prefix, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::notStartsWith($entry, $prefix, $message); } } /** * @psalm-pure * * @param iterable $value * @param string $prefix * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrNotStartsWith($value, $prefix, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::notStartsWith($entry, $prefix, $message); } } /** * @psalm-pure * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrStartsWithLetter($value, $message = '') { null === $value || static::startsWithLetter($value, $message); } /** * @psalm-pure * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allStartsWithLetter($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::startsWithLetter($entry, $message); } } /** * @psalm-pure * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrStartsWithLetter($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::startsWithLetter($entry, $message); } } /** * @psalm-pure * * @param string|null $value * @param string $suffix * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrEndsWith($value, $suffix, $message = '') { null === $value || static::endsWith($value, $suffix, $message); } /** * @psalm-pure * * @param iterable $value * @param string $suffix * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allEndsWith($value, $suffix, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::endsWith($entry, $suffix, $message); } } /** * @psalm-pure * * @param iterable $value * @param string $suffix * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrEndsWith($value, $suffix, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::endsWith($entry, $suffix, $message); } } /** * @psalm-pure * * @param string|null $value * @param string $suffix * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrNotEndsWith($value, $suffix, $message = '') { null === $value || static::notEndsWith($value, $suffix, $message); } /** * @psalm-pure * * @param iterable $value * @param string $suffix * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNotEndsWith($value, $suffix, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::notEndsWith($entry, $suffix, $message); } } /** * @psalm-pure * * @param iterable $value * @param string $suffix * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrNotEndsWith($value, $suffix, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::notEndsWith($entry, $suffix, $message); } } /** * @psalm-pure * * @param string|null $value * @param string $pattern * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrRegex($value, $pattern, $message = '') { null === $value || static::regex($value, $pattern, $message); } /** * @psalm-pure * * @param iterable $value * @param string $pattern * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allRegex($value, $pattern, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::regex($entry, $pattern, $message); } } /** * @psalm-pure * * @param iterable $value * @param string $pattern * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrRegex($value, $pattern, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::regex($entry, $pattern, $message); } } /** * @psalm-pure * * @param string|null $value * @param string $pattern * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrNotRegex($value, $pattern, $message = '') { null === $value || static::notRegex($value, $pattern, $message); } /** * @psalm-pure * * @param iterable $value * @param string $pattern * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNotRegex($value, $pattern, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::notRegex($entry, $pattern, $message); } } /** * @psalm-pure * * @param iterable $value * @param string $pattern * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrNotRegex($value, $pattern, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::notRegex($entry, $pattern, $message); } } /** * @psalm-pure * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrUnicodeLetters($value, $message = '') { null === $value || static::unicodeLetters($value, $message); } /** * @psalm-pure * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allUnicodeLetters($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::unicodeLetters($entry, $message); } } /** * @psalm-pure * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrUnicodeLetters($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::unicodeLetters($entry, $message); } } /** * @psalm-pure * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrAlpha($value, $message = '') { null === $value || static::alpha($value, $message); } /** * @psalm-pure * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allAlpha($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::alpha($entry, $message); } } /** * @psalm-pure * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrAlpha($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::alpha($entry, $message); } } /** * @psalm-pure * * @param string|null $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrDigits($value, $message = '') { null === $value || static::digits($value, $message); } /** * @psalm-pure * * @param iterable $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allDigits($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::digits($entry, $message); } } /** * @psalm-pure * * @param iterable $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrDigits($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::digits($entry, $message); } } /** * @psalm-pure * * @param string|null $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrAlnum($value, $message = '') { null === $value || static::alnum($value, $message); } /** * @psalm-pure * * @param iterable $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allAlnum($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::alnum($entry, $message); } } /** * @psalm-pure * * @param iterable $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrAlnum($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::alnum($entry, $message); } } /** * @psalm-pure * @psalm-assert lowercase-string|null $value * * @param string|null $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrLower($value, $message = '') { null === $value || static::lower($value, $message); } /** * @psalm-pure * @psalm-assert iterable $value * * @param iterable $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allLower($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::lower($entry, $message); } } /** * @psalm-pure * @psalm-assert iterable $value * * @param iterable $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrLower($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::lower($entry, $message); } } /** * @psalm-pure * * @param string|null $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrUpper($value, $message = '') { null === $value || static::upper($value, $message); } /** * @psalm-pure * * @param iterable $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allUpper($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::upper($entry, $message); } } /** * @psalm-pure * @psalm-assert iterable $value * * @param iterable $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrUpper($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::upper($entry, $message); } } /** * @psalm-pure * * @param string|null $value * @param int $length * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrLength($value, $length, $message = '') { null === $value || static::length($value, $length, $message); } /** * @psalm-pure * * @param iterable $value * @param int $length * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allLength($value, $length, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::length($entry, $length, $message); } } /** * @psalm-pure * * @param iterable $value * @param int $length * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrLength($value, $length, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::length($entry, $length, $message); } } /** * @psalm-pure * * @param string|null $value * @param int|float $min * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrMinLength($value, $min, $message = '') { null === $value || static::minLength($value, $min, $message); } /** * @psalm-pure * * @param iterable $value * @param int|float $min * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allMinLength($value, $min, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::minLength($entry, $min, $message); } } /** * @psalm-pure * * @param iterable $value * @param int|float $min * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrMinLength($value, $min, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::minLength($entry, $min, $message); } } /** * @psalm-pure * * @param string|null $value * @param int|float $max * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrMaxLength($value, $max, $message = '') { null === $value || static::maxLength($value, $max, $message); } /** * @psalm-pure * * @param iterable $value * @param int|float $max * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allMaxLength($value, $max, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::maxLength($entry, $max, $message); } } /** * @psalm-pure * * @param iterable $value * @param int|float $max * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrMaxLength($value, $max, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::maxLength($entry, $max, $message); } } /** * @psalm-pure * * @param string|null $value * @param int|float $min * @param int|float $max * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrLengthBetween($value, $min, $max, $message = '') { null === $value || static::lengthBetween($value, $min, $max, $message); } /** * @psalm-pure * * @param iterable $value * @param int|float $min * @param int|float $max * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allLengthBetween($value, $min, $max, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::lengthBetween($entry, $min, $max, $message); } } /** * @psalm-pure * * @param iterable $value * @param int|float $min * @param int|float $max * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrLengthBetween($value, $min, $max, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::lengthBetween($entry, $min, $max, $message); } } /** * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrFileExists($value, $message = '') { null === $value || static::fileExists($value, $message); } /** * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allFileExists($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::fileExists($entry, $message); } } /** * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrFileExists($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::fileExists($entry, $message); } } /** * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrFile($value, $message = '') { null === $value || static::file($value, $message); } /** * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allFile($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::file($entry, $message); } } /** * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrFile($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::file($entry, $message); } } /** * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrDirectory($value, $message = '') { null === $value || static::directory($value, $message); } /** * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allDirectory($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::directory($entry, $message); } } /** * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrDirectory($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::directory($entry, $message); } } /** * @param string|null $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrReadable($value, $message = '') { null === $value || static::readable($value, $message); } /** * @param iterable $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allReadable($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::readable($entry, $message); } } /** * @param iterable $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrReadable($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::readable($entry, $message); } } /** * @param string|null $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrWritable($value, $message = '') { null === $value || static::writable($value, $message); } /** * @param iterable $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allWritable($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::writable($entry, $message); } } /** * @param iterable $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrWritable($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::writable($entry, $message); } } /** * @psalm-assert class-string|null $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrClassExists($value, $message = '') { null === $value || static::classExists($value, $message); } /** * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allClassExists($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::classExists($entry, $message); } } /** * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrClassExists($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::classExists($entry, $message); } } /** * @psalm-pure * @psalm-template ExpectedType of object * @psalm-param class-string $class * @psalm-assert class-string|ExpectedType|null $value * * @param mixed $value * @param string|object $class * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrSubclassOf($value, $class, $message = '') { null === $value || static::subclassOf($value, $class, $message); } /** * @psalm-pure * @psalm-template ExpectedType of object * @psalm-param class-string $class * @psalm-assert iterable|ExpectedType> $value * * @param mixed $value * @param string|object $class * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allSubclassOf($value, $class, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::subclassOf($entry, $class, $message); } } /** * @psalm-pure * @psalm-template ExpectedType of object * @psalm-param class-string $class * @psalm-assert iterable|ExpectedType|null> $value * * @param mixed $value * @param string|object $class * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrSubclassOf($value, $class, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::subclassOf($entry, $class, $message); } } /** * @psalm-assert class-string|null $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrInterfaceExists($value, $message = '') { null === $value || static::interfaceExists($value, $message); } /** * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allInterfaceExists($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::interfaceExists($entry, $message); } } /** * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrInterfaceExists($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::interfaceExists($entry, $message); } } /** * @psalm-pure * @psalm-template ExpectedType of object * @psalm-param class-string $interface * @psalm-assert class-string|null $value * * @param mixed $value * @param mixed $interface * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrImplementsInterface($value, $interface, $message = '') { null === $value || static::implementsInterface($value, $interface, $message); } /** * @psalm-pure * @psalm-template ExpectedType of object * @psalm-param class-string $interface * @psalm-assert iterable> $value * * @param mixed $value * @param mixed $interface * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allImplementsInterface($value, $interface, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::implementsInterface($entry, $interface, $message); } } /** * @psalm-pure * @psalm-template ExpectedType of object * @psalm-param class-string $interface * @psalm-assert iterable|null> $value * * @param mixed $value * @param mixed $interface * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrImplementsInterface($value, $interface, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::implementsInterface($entry, $interface, $message); } } /** * @psalm-pure * @psalm-param class-string|object|null $classOrObject * * @param string|object|null $classOrObject * @param mixed $property * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrPropertyExists($classOrObject, $property, $message = '') { null === $classOrObject || static::propertyExists($classOrObject, $property, $message); } /** * @psalm-pure * @psalm-param iterable $classOrObject * * @param iterable $classOrObject * @param mixed $property * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allPropertyExists($classOrObject, $property, $message = '') { static::isIterable($classOrObject); foreach ($classOrObject as $entry) { static::propertyExists($entry, $property, $message); } } /** * @psalm-pure * @psalm-param iterable $classOrObject * * @param iterable $classOrObject * @param mixed $property * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrPropertyExists($classOrObject, $property, $message = '') { static::isIterable($classOrObject); foreach ($classOrObject as $entry) { null === $entry || static::propertyExists($entry, $property, $message); } } /** * @psalm-pure * @psalm-param class-string|object|null $classOrObject * * @param string|object|null $classOrObject * @param mixed $property * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrPropertyNotExists($classOrObject, $property, $message = '') { null === $classOrObject || static::propertyNotExists($classOrObject, $property, $message); } /** * @psalm-pure * @psalm-param iterable $classOrObject * * @param iterable $classOrObject * @param mixed $property * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allPropertyNotExists($classOrObject, $property, $message = '') { static::isIterable($classOrObject); foreach ($classOrObject as $entry) { static::propertyNotExists($entry, $property, $message); } } /** * @psalm-pure * @psalm-param iterable $classOrObject * * @param iterable $classOrObject * @param mixed $property * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrPropertyNotExists($classOrObject, $property, $message = '') { static::isIterable($classOrObject); foreach ($classOrObject as $entry) { null === $entry || static::propertyNotExists($entry, $property, $message); } } /** * @psalm-pure * @psalm-param class-string|object|null $classOrObject * * @param string|object|null $classOrObject * @param mixed $method * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrMethodExists($classOrObject, $method, $message = '') { null === $classOrObject || static::methodExists($classOrObject, $method, $message); } /** * @psalm-pure * @psalm-param iterable $classOrObject * * @param iterable $classOrObject * @param mixed $method * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allMethodExists($classOrObject, $method, $message = '') { static::isIterable($classOrObject); foreach ($classOrObject as $entry) { static::methodExists($entry, $method, $message); } } /** * @psalm-pure * @psalm-param iterable $classOrObject * * @param iterable $classOrObject * @param mixed $method * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrMethodExists($classOrObject, $method, $message = '') { static::isIterable($classOrObject); foreach ($classOrObject as $entry) { null === $entry || static::methodExists($entry, $method, $message); } } /** * @psalm-pure * @psalm-param class-string|object|null $classOrObject * * @param string|object|null $classOrObject * @param mixed $method * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrMethodNotExists($classOrObject, $method, $message = '') { null === $classOrObject || static::methodNotExists($classOrObject, $method, $message); } /** * @psalm-pure * @psalm-param iterable $classOrObject * * @param iterable $classOrObject * @param mixed $method * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allMethodNotExists($classOrObject, $method, $message = '') { static::isIterable($classOrObject); foreach ($classOrObject as $entry) { static::methodNotExists($entry, $method, $message); } } /** * @psalm-pure * @psalm-param iterable $classOrObject * * @param iterable $classOrObject * @param mixed $method * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrMethodNotExists($classOrObject, $method, $message = '') { static::isIterable($classOrObject); foreach ($classOrObject as $entry) { null === $entry || static::methodNotExists($entry, $method, $message); } } /** * @psalm-pure * * @param array|null $array * @param string|int $key * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrKeyExists($array, $key, $message = '') { null === $array || static::keyExists($array, $key, $message); } /** * @psalm-pure * * @param iterable $array * @param string|int $key * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allKeyExists($array, $key, $message = '') { static::isIterable($array); foreach ($array as $entry) { static::keyExists($entry, $key, $message); } } /** * @psalm-pure * * @param iterable $array * @param string|int $key * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrKeyExists($array, $key, $message = '') { static::isIterable($array); foreach ($array as $entry) { null === $entry || static::keyExists($entry, $key, $message); } } /** * @psalm-pure * * @param array|null $array * @param string|int $key * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrKeyNotExists($array, $key, $message = '') { null === $array || static::keyNotExists($array, $key, $message); } /** * @psalm-pure * * @param iterable $array * @param string|int $key * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allKeyNotExists($array, $key, $message = '') { static::isIterable($array); foreach ($array as $entry) { static::keyNotExists($entry, $key, $message); } } /** * @psalm-pure * * @param iterable $array * @param string|int $key * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrKeyNotExists($array, $key, $message = '') { static::isIterable($array); foreach ($array as $entry) { null === $entry || static::keyNotExists($entry, $key, $message); } } /** * @psalm-pure * @psalm-assert array-key|null $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrValidArrayKey($value, $message = '') { null === $value || static::validArrayKey($value, $message); } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allValidArrayKey($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::validArrayKey($entry, $message); } } /** * @psalm-pure * @psalm-assert iterable $value * * @param mixed $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrValidArrayKey($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::validArrayKey($entry, $message); } } /** * @param Countable|array|null $array * @param int $number * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrCount($array, $number, $message = '') { null === $array || static::count($array, $number, $message); } /** * @param iterable $array * @param int $number * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allCount($array, $number, $message = '') { static::isIterable($array); foreach ($array as $entry) { static::count($entry, $number, $message); } } /** * @param iterable $array * @param int $number * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrCount($array, $number, $message = '') { static::isIterable($array); foreach ($array as $entry) { null === $entry || static::count($entry, $number, $message); } } /** * @param Countable|array|null $array * @param int|float $min * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrMinCount($array, $min, $message = '') { null === $array || static::minCount($array, $min, $message); } /** * @param iterable $array * @param int|float $min * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allMinCount($array, $min, $message = '') { static::isIterable($array); foreach ($array as $entry) { static::minCount($entry, $min, $message); } } /** * @param iterable $array * @param int|float $min * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrMinCount($array, $min, $message = '') { static::isIterable($array); foreach ($array as $entry) { null === $entry || static::minCount($entry, $min, $message); } } /** * @param Countable|array|null $array * @param int|float $max * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrMaxCount($array, $max, $message = '') { null === $array || static::maxCount($array, $max, $message); } /** * @param iterable $array * @param int|float $max * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allMaxCount($array, $max, $message = '') { static::isIterable($array); foreach ($array as $entry) { static::maxCount($entry, $max, $message); } } /** * @param iterable $array * @param int|float $max * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrMaxCount($array, $max, $message = '') { static::isIterable($array); foreach ($array as $entry) { null === $entry || static::maxCount($entry, $max, $message); } } /** * @param Countable|array|null $array * @param int|float $min * @param int|float $max * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrCountBetween($array, $min, $max, $message = '') { null === $array || static::countBetween($array, $min, $max, $message); } /** * @param iterable $array * @param int|float $min * @param int|float $max * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allCountBetween($array, $min, $max, $message = '') { static::isIterable($array); foreach ($array as $entry) { static::countBetween($entry, $min, $max, $message); } } /** * @param iterable $array * @param int|float $min * @param int|float $max * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrCountBetween($array, $min, $max, $message = '') { static::isIterable($array); foreach ($array as $entry) { null === $entry || static::countBetween($entry, $min, $max, $message); } } /** * @psalm-pure * @psalm-assert list|null $array * * @param mixed $array * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrIsList($array, $message = '') { null === $array || static::isList($array, $message); } /** * @psalm-pure * @psalm-assert iterable $array * * @param mixed $array * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allIsList($array, $message = '') { static::isIterable($array); foreach ($array as $entry) { static::isList($entry, $message); } } /** * @psalm-pure * @psalm-assert iterable $array * * @param mixed $array * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrIsList($array, $message = '') { static::isIterable($array); foreach ($array as $entry) { null === $entry || static::isList($entry, $message); } } /** * @psalm-pure * @psalm-assert non-empty-list|null $array * * @param mixed $array * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrIsNonEmptyList($array, $message = '') { null === $array || static::isNonEmptyList($array, $message); } /** * @psalm-pure * @psalm-assert iterable $array * * @param mixed $array * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allIsNonEmptyList($array, $message = '') { static::isIterable($array); foreach ($array as $entry) { static::isNonEmptyList($entry, $message); } } /** * @psalm-pure * @psalm-assert iterable $array * * @param mixed $array * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrIsNonEmptyList($array, $message = '') { static::isIterable($array); foreach ($array as $entry) { null === $entry || static::isNonEmptyList($entry, $message); } } /** * @psalm-pure * @psalm-template T * @psalm-param mixed|array|null $array * @psalm-assert array|null $array * * @param mixed $array * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrIsMap($array, $message = '') { null === $array || static::isMap($array, $message); } /** * @psalm-pure * @psalm-template T * @psalm-param iterable> $array * @psalm-assert iterable> $array * * @param mixed $array * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allIsMap($array, $message = '') { static::isIterable($array); foreach ($array as $entry) { static::isMap($entry, $message); } } /** * @psalm-pure * @psalm-template T * @psalm-param iterable|null> $array * @psalm-assert iterable|null> $array * * @param mixed $array * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrIsMap($array, $message = '') { static::isIterable($array); foreach ($array as $entry) { null === $entry || static::isMap($entry, $message); } } /** * @psalm-pure * @psalm-template T * @psalm-param mixed|array|null $array * * @param mixed $array * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrIsNonEmptyMap($array, $message = '') { null === $array || static::isNonEmptyMap($array, $message); } /** * @psalm-pure * @psalm-template T * @psalm-param iterable> $array * * @param mixed $array * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allIsNonEmptyMap($array, $message = '') { static::isIterable($array); foreach ($array as $entry) { static::isNonEmptyMap($entry, $message); } } /** * @psalm-pure * @psalm-template T * @psalm-param iterable|null> $array * @psalm-assert iterable|null> $array * @psalm-assert iterable $array * * @param mixed $array * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrIsNonEmptyMap($array, $message = '') { static::isIterable($array); foreach ($array as $entry) { null === $entry || static::isNonEmptyMap($entry, $message); } } /** * @psalm-pure * * @param string|null $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrUuid($value, $message = '') { null === $value || static::uuid($value, $message); } /** * @psalm-pure * * @param iterable $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allUuid($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { static::uuid($entry, $message); } } /** * @psalm-pure * * @param iterable $value * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrUuid($value, $message = '') { static::isIterable($value); foreach ($value as $entry) { null === $entry || static::uuid($entry, $message); } } /** * @psalm-param class-string $class * * @param Closure|null $expression * @param string $class * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function nullOrThrows($expression, $class = 'Exception', $message = '') { null === $expression || static::throws($expression, $class, $message); } /** * @psalm-param class-string $class * * @param iterable $expression * @param string $class * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allThrows($expression, $class = 'Exception', $message = '') { static::isIterable($expression); foreach ($expression as $entry) { static::throws($entry, $class, $message); } } /** * @psalm-param class-string $class * * @param iterable $expression * @param string $class * @param string $message * * @throws InvalidArgumentException * * @return void */ public static function allNullOrThrows($expression, $class = 'Exception', $message = '') { static::isIterable($expression); foreach ($expression as $entry) { null === $entry || static::throws($entry, $class, $message); } } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\Webmozart\Assert; class InvalidArgumentException extends \InvalidArgumentException { } The MIT License (MIT) Copyright (c) 2014 Bernhard Schussek 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. log(LogLevel::EMERGENCY, $message, $context); } /** * Action must be taken immediately. * * Example: Entire website down, database unavailable, etc. This should * trigger the SMS alerts and wake you up. * * @param string $message * @param mixed[] $context * * @return void */ public function alert($message, array $context = array()) { $this->log(LogLevel::ALERT, $message, $context); } /** * Critical conditions. * * Example: Application component unavailable, unexpected exception. * * @param string $message * @param mixed[] $context * * @return void */ public function critical($message, array $context = array()) { $this->log(LogLevel::CRITICAL, $message, $context); } /** * Runtime errors that do not require immediate action but should typically * be logged and monitored. * * @param string $message * @param mixed[] $context * * @return void */ public function error($message, array $context = array()) { $this->log(LogLevel::ERROR, $message, $context); } /** * Exceptional occurrences that are not errors. * * Example: Use of deprecated APIs, poor use of an API, undesirable things * that are not necessarily wrong. * * @param string $message * @param mixed[] $context * * @return void */ public function warning($message, array $context = array()) { $this->log(LogLevel::WARNING, $message, $context); } /** * Normal but significant events. * * @param string $message * @param mixed[] $context * * @return void */ public function notice($message, array $context = array()) { $this->log(LogLevel::NOTICE, $message, $context); } /** * Interesting events. * * Example: User logs in, SQL logs. * * @param string $message * @param mixed[] $context * * @return void */ public function info($message, array $context = array()) { $this->log(LogLevel::INFO, $message, $context); } /** * Detailed debug information. * * @param string $message * @param mixed[] $context * * @return void */ public function debug($message, array $context = array()) { $this->log(LogLevel::DEBUG, $message, $context); } } log(LogLevel::EMERGENCY, $message, $context); } /** * Action must be taken immediately. * * Example: Entire website down, database unavailable, etc. This should * trigger the SMS alerts and wake you up. * * @param string $message * @param array $context * * @return void */ public function alert($message, array $context = array()) { $this->log(LogLevel::ALERT, $message, $context); } /** * Critical conditions. * * Example: Application component unavailable, unexpected exception. * * @param string $message * @param array $context * * @return void */ public function critical($message, array $context = array()) { $this->log(LogLevel::CRITICAL, $message, $context); } /** * Runtime errors that do not require immediate action but should typically * be logged and monitored. * * @param string $message * @param array $context * * @return void */ public function error($message, array $context = array()) { $this->log(LogLevel::ERROR, $message, $context); } /** * Exceptional occurrences that are not errors. * * Example: Use of deprecated APIs, poor use of an API, undesirable things * that are not necessarily wrong. * * @param string $message * @param array $context * * @return void */ public function warning($message, array $context = array()) { $this->log(LogLevel::WARNING, $message, $context); } /** * Normal but significant events. * * @param string $message * @param array $context * * @return void */ public function notice($message, array $context = array()) { $this->log(LogLevel::NOTICE, $message, $context); } /** * Interesting events. * * Example: User logs in, SQL logs. * * @param string $message * @param array $context * * @return void */ public function info($message, array $context = array()) { $this->log(LogLevel::INFO, $message, $context); } /** * Detailed debug information. * * @param string $message * @param array $context * * @return void */ public function debug($message, array $context = array()) { $this->log(LogLevel::DEBUG, $message, $context); } /** * Logs with an arbitrary level. * * @param mixed $level * @param string $message * @param array $context * * @return void * * @throws \Psr\Log\InvalidArgumentException */ public abstract function log($level, $message, array $context = array()); } logger) { }` * blocks. */ class NullLogger extends AbstractLogger { /** * Logs with an arbitrary level. * * @param mixed $level * @param string $message * @param array $context * * @return void * * @throws \Psr\Log\InvalidArgumentException */ public function log($level, $message, array $context = array()) { // noop } } logger = $logger; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\SebastianBergmann\Diff; final class Line { public const ADDED = 1; public const REMOVED = 2; public const UNCHANGED = 3; /** * @var int */ private $type; /** * @var string */ private $content; public function __construct(int $type = self::UNCHANGED, string $content = '') { $this->type = $type; $this->content = $content; } public function getContent() : string { return $this->content; } public function getType() : int { return $this->type; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\SebastianBergmann\Diff; interface LongestCommonSubsequenceCalculator { /** * Calculates the longest common subsequence of two arrays. */ public function calculate(array $from, array $to) : array; } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\SebastianBergmann\Diff; use function get_class; use function gettype; use function is_object; use function sprintf; use Exception; final class ConfigurationException extends InvalidArgumentException { public function __construct(string $option, string $expected, $value, int $code = 0, Exception $previous = null) { parent::__construct(sprintf('Option "%s" must be %s, got "%s".', $option, $expected, is_object($value) ? get_class($value) : (null === $value ? '' : gettype($value) . '#' . $value)), $code, $previous); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\SebastianBergmann\Diff; use Throwable; interface Exception extends Throwable { } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\SebastianBergmann\Diff; class InvalidArgumentException extends \InvalidArgumentException implements Exception { } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\SebastianBergmann\Diff; final class Chunk { /** * @var int */ private $start; /** * @var int */ private $startRange; /** * @var int */ private $end; /** * @var int */ private $endRange; /** * @var Line[] */ private $lines; public function __construct(int $start = 0, int $startRange = 1, int $end = 0, int $endRange = 1, array $lines = []) { $this->start = $start; $this->startRange = $startRange; $this->end = $end; $this->endRange = $endRange; $this->lines = $lines; } public function getStart() : int { return $this->start; } public function getStartRange() : int { return $this->startRange; } public function getEnd() : int { return $this->end; } public function getEndRange() : int { return $this->endRange; } /** * @return Line[] */ public function getLines() : array { return $this->lines; } /** * @param Line[] $lines */ public function setLines(array $lines) : void { foreach ($lines as $line) { if (!$line instanceof Line) { throw new InvalidArgumentException(); } } $this->lines = $lines; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\SebastianBergmann\Diff; use function array_fill; use function array_merge; use function array_reverse; use function array_slice; use function count; use function in_array; use function max; final class MemoryEfficientLongestCommonSubsequenceCalculator implements LongestCommonSubsequenceCalculator { /** * {@inheritdoc} */ public function calculate(array $from, array $to) : array { $cFrom = count($from); $cTo = count($to); if ($cFrom === 0) { return []; } if ($cFrom === 1) { if (in_array($from[0], $to, \true)) { return [$from[0]]; } return []; } $i = (int) ($cFrom / 2); $fromStart = array_slice($from, 0, $i); $fromEnd = array_slice($from, $i); $llB = $this->length($fromStart, $to); $llE = $this->length(array_reverse($fromEnd), array_reverse($to)); $jMax = 0; $max = 0; for ($j = 0; $j <= $cTo; $j++) { $m = $llB[$j] + $llE[$cTo - $j]; if ($m >= $max) { $max = $m; $jMax = $j; } } $toStart = array_slice($to, 0, $jMax); $toEnd = array_slice($to, $jMax); return array_merge($this->calculate($fromStart, $toStart), $this->calculate($fromEnd, $toEnd)); } private function length(array $from, array $to) : array { $current = array_fill(0, count($to) + 1, 0); $cFrom = count($from); $cTo = count($to); for ($i = 0; $i < $cFrom; $i++) { $prev = $current; for ($j = 0; $j < $cTo; $j++) { if ($from[$i] === $to[$j]) { $current[$j + 1] = $prev[$j] + 1; } else { $current[$j + 1] = max($current[$j], $prev[$j + 1]); } } } return $current; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\SebastianBergmann\Diff; final class Diff { /** * @var string */ private $from; /** * @var string */ private $to; /** * @var Chunk[] */ private $chunks; /** * @param Chunk[] $chunks */ public function __construct(string $from, string $to, array $chunks = []) { $this->from = $from; $this->to = $to; $this->chunks = $chunks; } public function getFrom() : string { return $this->from; } public function getTo() : string { return $this->to; } /** * @return Chunk[] */ public function getChunks() : array { return $this->chunks; } /** * @param Chunk[] $chunks */ public function setChunks(array $chunks) : void { $this->chunks = $chunks; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\SebastianBergmann\Diff; use const PHP_INT_SIZE; use const PREG_SPLIT_DELIM_CAPTURE; use const PREG_SPLIT_NO_EMPTY; use function array_shift; use function array_unshift; use function array_values; use function count; use function current; use function end; use function get_class; use function gettype; use function is_array; use function is_object; use function is_string; use function key; use function min; use function preg_split; use function prev; use function reset; use function sprintf; use function substr; use _HumbugBox1cb33d1f20f1\SebastianBergmann\Diff\Output\DiffOutputBuilderInterface; use _HumbugBox1cb33d1f20f1\SebastianBergmann\Diff\Output\UnifiedDiffOutputBuilder; final class Differ { public const OLD = 0; public const ADDED = 1; public const REMOVED = 2; public const DIFF_LINE_END_WARNING = 3; public const NO_LINE_END_EOF_WARNING = 4; /** * @var DiffOutputBuilderInterface */ private $outputBuilder; /** * @param DiffOutputBuilderInterface $outputBuilder * * @throws InvalidArgumentException */ public function __construct($outputBuilder = null) { if ($outputBuilder instanceof DiffOutputBuilderInterface) { $this->outputBuilder = $outputBuilder; } elseif (null === $outputBuilder) { $this->outputBuilder = new UnifiedDiffOutputBuilder(); } elseif (is_string($outputBuilder)) { // PHPUnit 6.1.4, 6.2.0, 6.2.1, 6.2.2, and 6.2.3 support // @see https://github.com/sebastianbergmann/phpunit/issues/2734#issuecomment-314514056 // @deprecated $this->outputBuilder = new UnifiedDiffOutputBuilder($outputBuilder); } else { throw new InvalidArgumentException(sprintf('Expected builder to be an instance of DiffOutputBuilderInterface, or a string, got %s.', is_object($outputBuilder) ? 'instance of "' . get_class($outputBuilder) . '"' : gettype($outputBuilder) . ' "' . $outputBuilder . '"')); } } /** * Returns the diff between two arrays or strings as string. * * @param array|string $from * @param array|string $to */ public function diff($from, $to, LongestCommonSubsequenceCalculator $lcs = null) : string { $diff = $this->diffToArray($this->normalizeDiffInput($from), $this->normalizeDiffInput($to), $lcs); return $this->outputBuilder->getDiff($diff); } /** * Returns the diff between two arrays or strings as array. * * Each array element contains two elements: * - [0] => mixed $token * - [1] => 2|1|0 * * - 2: REMOVED: $token was removed from $from * - 1: ADDED: $token was added to $from * - 0: OLD: $token is not changed in $to * * @param array|string $from * @param array|string $to * @param LongestCommonSubsequenceCalculator $lcs */ public function diffToArray($from, $to, LongestCommonSubsequenceCalculator $lcs = null) : array { if (is_string($from)) { $from = $this->splitStringByLines($from); } elseif (!is_array($from)) { throw new InvalidArgumentException('"from" must be an array or string.'); } if (is_string($to)) { $to = $this->splitStringByLines($to); } elseif (!is_array($to)) { throw new InvalidArgumentException('"to" must be an array or string.'); } [$from, $to, $start, $end] = self::getArrayDiffParted($from, $to); if ($lcs === null) { $lcs = $this->selectLcsImplementation($from, $to); } $common = $lcs->calculate(array_values($from), array_values($to)); $diff = []; foreach ($start as $token) { $diff[] = [$token, self::OLD]; } reset($from); reset($to); foreach ($common as $token) { while (($fromToken = reset($from)) !== $token) { $diff[] = [array_shift($from), self::REMOVED]; } while (($toToken = reset($to)) !== $token) { $diff[] = [array_shift($to), self::ADDED]; } $diff[] = [$token, self::OLD]; array_shift($from); array_shift($to); } while (($token = array_shift($from)) !== null) { $diff[] = [$token, self::REMOVED]; } while (($token = array_shift($to)) !== null) { $diff[] = [$token, self::ADDED]; } foreach ($end as $token) { $diff[] = [$token, self::OLD]; } if ($this->detectUnmatchedLineEndings($diff)) { array_unshift($diff, ["#Warning: Strings contain different line endings!\n", self::DIFF_LINE_END_WARNING]); } return $diff; } /** * Casts variable to string if it is not a string or array. * * @return array|string */ private function normalizeDiffInput($input) { if (!is_array($input) && !is_string($input)) { return (string) $input; } return $input; } /** * Checks if input is string, if so it will split it line-by-line. */ private function splitStringByLines(string $input) : array { return preg_split('/(.*\\R)/', $input, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); } private function selectLcsImplementation(array $from, array $to) : LongestCommonSubsequenceCalculator { // We do not want to use the time-efficient implementation if its memory // footprint will probably exceed this value. Note that the footprint // calculation is only an estimation for the matrix and the LCS method // will typically allocate a bit more memory than this. $memoryLimit = 100 * 1024 * 1024; if ($this->calculateEstimatedFootprint($from, $to) > $memoryLimit) { return new MemoryEfficientLongestCommonSubsequenceCalculator(); } return new TimeEfficientLongestCommonSubsequenceCalculator(); } /** * Calculates the estimated memory footprint for the DP-based method. * * @return float|int */ private function calculateEstimatedFootprint(array $from, array $to) { $itemSize = PHP_INT_SIZE === 4 ? 76 : 144; return $itemSize * min(count($from), count($to)) ** 2; } /** * Returns true if line ends don't match in a diff. */ private function detectUnmatchedLineEndings(array $diff) : bool { $newLineBreaks = ['' => \true]; $oldLineBreaks = ['' => \true]; foreach ($diff as $entry) { if (self::OLD === $entry[1]) { $ln = $this->getLinebreak($entry[0]); $oldLineBreaks[$ln] = \true; $newLineBreaks[$ln] = \true; } elseif (self::ADDED === $entry[1]) { $newLineBreaks[$this->getLinebreak($entry[0])] = \true; } elseif (self::REMOVED === $entry[1]) { $oldLineBreaks[$this->getLinebreak($entry[0])] = \true; } } // if either input or output is a single line without breaks than no warning should be raised if (['' => \true] === $newLineBreaks || ['' => \true] === $oldLineBreaks) { return \false; } // two way compare foreach ($newLineBreaks as $break => $set) { if (!isset($oldLineBreaks[$break])) { return \true; } } foreach ($oldLineBreaks as $break => $set) { if (!isset($newLineBreaks[$break])) { return \true; } } return \false; } private function getLinebreak($line) : string { if (!is_string($line)) { return ''; } $lc = substr($line, -1); if ("\r" === $lc) { return "\r"; } if ("\n" !== $lc) { return ''; } if ("\r\n" === substr($line, -2)) { return "\r\n"; } return "\n"; } private static function getArrayDiffParted(array &$from, array &$to) : array { $start = []; $end = []; reset($to); foreach ($from as $k => $v) { $toK = key($to); if ($toK === $k && $v === $to[$k]) { $start[$k] = $v; unset($from[$k], $to[$k]); } else { break; } } end($from); end($to); do { $fromK = key($from); $toK = key($to); if (null === $fromK || null === $toK || current($from) !== current($to)) { break; } prev($from); prev($to); $end = [$fromK => $from[$fromK]] + $end; unset($from[$fromK], $to[$toK]); } while (\true); return [$from, $to, $start, $end]; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\SebastianBergmann\Diff; use function array_pop; use function count; use function max; use function preg_match; use function preg_split; /** * Unified diff parser. */ final class Parser { /** * @return Diff[] */ public function parse(string $string) : array { $lines = preg_split('(\\r\\n|\\r|\\n)', $string); if (!empty($lines) && $lines[count($lines) - 1] === '') { array_pop($lines); } $lineCount = count($lines); $diffs = []; $diff = null; $collected = []; for ($i = 0; $i < $lineCount; ++$i) { if (preg_match('#^---\\h+"?(?P[^\\v\\t"]+)#', $lines[$i], $fromMatch) && preg_match('#^\\+\\+\\+\\h+"?(?P[^\\v\\t"]+)#', $lines[$i + 1], $toMatch)) { if ($diff !== null) { $this->parseFileDiff($diff, $collected); $diffs[] = $diff; $collected = []; } $diff = new Diff($fromMatch['file'], $toMatch['file']); ++$i; } else { if (preg_match('/^(?:diff --git |index [\\da-f\\.]+|[+-]{3} [ab])/', $lines[$i])) { continue; } $collected[] = $lines[$i]; } } if ($diff !== null && count($collected)) { $this->parseFileDiff($diff, $collected); $diffs[] = $diff; } return $diffs; } private function parseFileDiff(Diff $diff, array $lines) : void { $chunks = []; $chunk = null; $diffLines = []; foreach ($lines as $line) { if (preg_match('/^@@\\s+-(?P\\d+)(?:,\\s*(?P\\d+))?\\s+\\+(?P\\d+)(?:,\\s*(?P\\d+))?\\s+@@/', $line, $match)) { $chunk = new Chunk((int) $match['start'], isset($match['startrange']) ? max(1, (int) $match['startrange']) : 1, (int) $match['end'], isset($match['endrange']) ? max(1, (int) $match['endrange']) : 1); $chunks[] = $chunk; $diffLines = []; continue; } if (preg_match('/^(?P[+ -])?(?P.*)/', $line, $match)) { $type = Line::UNCHANGED; if ($match['type'] === '+') { $type = Line::ADDED; } elseif ($match['type'] === '-') { $type = Line::REMOVED; } $diffLines[] = new Line($type, $match['line']); if (null !== $chunk) { $chunk->setLines($diffLines); } } } $diff->setChunks($chunks); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\SebastianBergmann\Diff\Output; use function count; abstract class AbstractChunkOutputBuilder implements DiffOutputBuilderInterface { /** * Takes input of the diff array and returns the common parts. * Iterates through diff line by line. */ protected function getCommonChunks(array $diff, int $lineThreshold = 5) : array { $diffSize = count($diff); $capturing = \false; $chunkStart = 0; $chunkSize = 0; $commonChunks = []; for ($i = 0; $i < $diffSize; ++$i) { if ($diff[$i][1] === 0) { if ($capturing === \false) { $capturing = \true; $chunkStart = $i; $chunkSize = 0; } else { ++$chunkSize; } } elseif ($capturing !== \false) { if ($chunkSize >= $lineThreshold) { $commonChunks[$chunkStart] = $chunkStart + $chunkSize; } $capturing = \false; } } if ($capturing !== \false && $chunkSize >= $lineThreshold) { $commonChunks[$chunkStart] = $chunkStart + $chunkSize; } return $commonChunks; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\SebastianBergmann\Diff\Output; use function fclose; use function fopen; use function fwrite; use function stream_get_contents; use function substr; use _HumbugBox1cb33d1f20f1\SebastianBergmann\Diff\Differ; /** * Builds a diff string representation in a loose unified diff format * listing only changes lines. Does not include line numbers. */ final class DiffOnlyOutputBuilder implements DiffOutputBuilderInterface { /** * @var string */ private $header; public function __construct(string $header = "--- Original\n+++ New\n") { $this->header = $header; } public function getDiff(array $diff) : string { $buffer = fopen('php://memory', 'r+b'); if ('' !== $this->header) { fwrite($buffer, $this->header); if ("\n" !== substr($this->header, -1, 1)) { fwrite($buffer, "\n"); } } foreach ($diff as $diffEntry) { if ($diffEntry[1] === Differ::ADDED) { fwrite($buffer, '+' . $diffEntry[0]); } elseif ($diffEntry[1] === Differ::REMOVED) { fwrite($buffer, '-' . $diffEntry[0]); } elseif ($diffEntry[1] === Differ::DIFF_LINE_END_WARNING) { fwrite($buffer, ' ' . $diffEntry[0]); continue; // Warnings should not be tested for line break, it will always be there } else { /* Not changed (old) 0 */ continue; // we didn't write the non changs line, so do not add a line break either } $lc = substr($diffEntry[0], -1); if ($lc !== "\n" && $lc !== "\r") { fwrite($buffer, "\n"); // \No newline at end of file } } $diff = stream_get_contents($buffer, -1, 0); fclose($buffer); return $diff; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\SebastianBergmann\Diff\Output; use function array_splice; use function count; use function fclose; use function fopen; use function fwrite; use function max; use function min; use function stream_get_contents; use function strlen; use function substr; use _HumbugBox1cb33d1f20f1\SebastianBergmann\Diff\Differ; /** * Builds a diff string representation in unified diff format in chunks. */ final class UnifiedDiffOutputBuilder extends AbstractChunkOutputBuilder { /** * @var bool */ private $collapseRanges = \true; /** * @var int >= 0 */ private $commonLineThreshold = 6; /** * @var int >= 0 */ private $contextLines = 3; /** * @var string */ private $header; /** * @var bool */ private $addLineNumbers; public function __construct(string $header = "--- Original\n+++ New\n", bool $addLineNumbers = \false) { $this->header = $header; $this->addLineNumbers = $addLineNumbers; } public function getDiff(array $diff) : string { $buffer = fopen('php://memory', 'r+b'); if ('' !== $this->header) { fwrite($buffer, $this->header); if ("\n" !== substr($this->header, -1, 1)) { fwrite($buffer, "\n"); } } if (0 !== count($diff)) { $this->writeDiffHunks($buffer, $diff); } $diff = stream_get_contents($buffer, -1, 0); fclose($buffer); // If the diff is non-empty and last char is not a linebreak: add it. // This might happen when both the `from` and `to` do not have a trailing linebreak $last = substr($diff, -1); return 0 !== strlen($diff) && "\n" !== $last && "\r" !== $last ? $diff . "\n" : $diff; } private function writeDiffHunks($output, array $diff) : void { // detect "No newline at end of file" and insert into `$diff` if needed $upperLimit = count($diff); if (0 === $diff[$upperLimit - 1][1]) { $lc = substr($diff[$upperLimit - 1][0], -1); if ("\n" !== $lc) { array_splice($diff, $upperLimit, 0, [["\n\\ No newline at end of file\n", Differ::NO_LINE_END_EOF_WARNING]]); } } else { // search back for the last `+` and `-` line, // check if has trailing linebreak, else add under it warning under it $toFind = [1 => \true, 2 => \true]; for ($i = $upperLimit - 1; $i >= 0; --$i) { if (isset($toFind[$diff[$i][1]])) { unset($toFind[$diff[$i][1]]); $lc = substr($diff[$i][0], -1); if ("\n" !== $lc) { array_splice($diff, $i + 1, 0, [["\n\\ No newline at end of file\n", Differ::NO_LINE_END_EOF_WARNING]]); } if (!count($toFind)) { break; } } } } // write hunks to output buffer $cutOff = max($this->commonLineThreshold, $this->contextLines); $hunkCapture = \false; $sameCount = $toRange = $fromRange = 0; $toStart = $fromStart = 1; $i = 0; /** @var int $i */ foreach ($diff as $i => $entry) { if (0 === $entry[1]) { // same if (\false === $hunkCapture) { ++$fromStart; ++$toStart; continue; } ++$sameCount; ++$toRange; ++$fromRange; if ($sameCount === $cutOff) { $contextStartOffset = $hunkCapture - $this->contextLines < 0 ? $hunkCapture : $this->contextLines; // note: $contextEndOffset = $this->contextLines; // // because we never go beyond the end of the diff. // with the cutoff/contextlines here the follow is never true; // // if ($i - $cutOff + $this->contextLines + 1 > \count($diff)) { // $contextEndOffset = count($diff) - 1; // } // // ; that would be true for a trailing incomplete hunk case which is dealt with after this loop $this->writeHunk($diff, $hunkCapture - $contextStartOffset, $i - $cutOff + $this->contextLines + 1, $fromStart - $contextStartOffset, $fromRange - $cutOff + $contextStartOffset + $this->contextLines, $toStart - $contextStartOffset, $toRange - $cutOff + $contextStartOffset + $this->contextLines, $output); $fromStart += $fromRange; $toStart += $toRange; $hunkCapture = \false; $sameCount = $toRange = $fromRange = 0; } continue; } $sameCount = 0; if ($entry[1] === Differ::NO_LINE_END_EOF_WARNING) { continue; } if (\false === $hunkCapture) { $hunkCapture = $i; } if (Differ::ADDED === $entry[1]) { ++$toRange; } if (Differ::REMOVED === $entry[1]) { ++$fromRange; } } if (\false === $hunkCapture) { return; } // we end here when cutoff (commonLineThreshold) was not reached, but we where capturing a hunk, // do not render hunk till end automatically because the number of context lines might be less than the commonLineThreshold $contextStartOffset = $hunkCapture - $this->contextLines < 0 ? $hunkCapture : $this->contextLines; // prevent trying to write out more common lines than there are in the diff _and_ // do not write more than configured through the context lines $contextEndOffset = min($sameCount, $this->contextLines); $fromRange -= $sameCount; $toRange -= $sameCount; $this->writeHunk($diff, $hunkCapture - $contextStartOffset, $i - $sameCount + $contextEndOffset + 1, $fromStart - $contextStartOffset, $fromRange + $contextStartOffset + $contextEndOffset, $toStart - $contextStartOffset, $toRange + $contextStartOffset + $contextEndOffset, $output); } private function writeHunk(array $diff, int $diffStartIndex, int $diffEndIndex, int $fromStart, int $fromRange, int $toStart, int $toRange, $output) : void { if ($this->addLineNumbers) { fwrite($output, '@@ -' . $fromStart); if (!$this->collapseRanges || 1 !== $fromRange) { fwrite($output, ',' . $fromRange); } fwrite($output, ' +' . $toStart); if (!$this->collapseRanges || 1 !== $toRange) { fwrite($output, ',' . $toRange); } fwrite($output, " @@\n"); } else { fwrite($output, "@@ @@\n"); } for ($i = $diffStartIndex; $i < $diffEndIndex; ++$i) { if ($diff[$i][1] === Differ::ADDED) { fwrite($output, '+' . $diff[$i][0]); } elseif ($diff[$i][1] === Differ::REMOVED) { fwrite($output, '-' . $diff[$i][0]); } elseif ($diff[$i][1] === Differ::OLD) { fwrite($output, ' ' . $diff[$i][0]); } elseif ($diff[$i][1] === Differ::NO_LINE_END_EOF_WARNING) { fwrite($output, "\n"); // $diff[$i][0] } else { /* Not changed (old) Differ::OLD or Warning Differ::DIFF_LINE_END_WARNING */ fwrite($output, ' ' . $diff[$i][0]); } } } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\SebastianBergmann\Diff\Output; use function array_merge; use function array_splice; use function count; use function fclose; use function fopen; use function fwrite; use function is_bool; use function is_int; use function is_string; use function max; use function min; use function sprintf; use function stream_get_contents; use function substr; use _HumbugBox1cb33d1f20f1\SebastianBergmann\Diff\ConfigurationException; use _HumbugBox1cb33d1f20f1\SebastianBergmann\Diff\Differ; /** * Strict Unified diff output builder. * * Generates (strict) Unified diff's (unidiffs) with hunks. */ final class StrictUnifiedDiffOutputBuilder implements DiffOutputBuilderInterface { private static $default = [ 'collapseRanges' => \true, // ranges of length one are rendered with the trailing `,1` 'commonLineThreshold' => 6, // number of same lines before ending a new hunk and creating a new one (if needed) 'contextLines' => 3, // like `diff: -u, -U NUM, --unified[=NUM]`, for patch/git apply compatibility best to keep at least @ 3 'fromFile' => null, 'fromFileDate' => null, 'toFile' => null, 'toFileDate' => null, ]; /** * @var bool */ private $changed; /** * @var bool */ private $collapseRanges; /** * @var int >= 0 */ private $commonLineThreshold; /** * @var string */ private $header; /** * @var int >= 0 */ private $contextLines; public function __construct(array $options = []) { $options = array_merge(self::$default, $options); if (!is_bool($options['collapseRanges'])) { throw new ConfigurationException('collapseRanges', 'a bool', $options['collapseRanges']); } if (!is_int($options['contextLines']) || $options['contextLines'] < 0) { throw new ConfigurationException('contextLines', 'an int >= 0', $options['contextLines']); } if (!is_int($options['commonLineThreshold']) || $options['commonLineThreshold'] <= 0) { throw new ConfigurationException('commonLineThreshold', 'an int > 0', $options['commonLineThreshold']); } $this->assertString($options, 'fromFile'); $this->assertString($options, 'toFile'); $this->assertStringOrNull($options, 'fromFileDate'); $this->assertStringOrNull($options, 'toFileDate'); $this->header = sprintf("--- %s%s\n+++ %s%s\n", $options['fromFile'], null === $options['fromFileDate'] ? '' : "\t" . $options['fromFileDate'], $options['toFile'], null === $options['toFileDate'] ? '' : "\t" . $options['toFileDate']); $this->collapseRanges = $options['collapseRanges']; $this->commonLineThreshold = $options['commonLineThreshold']; $this->contextLines = $options['contextLines']; } public function getDiff(array $diff) : string { if (0 === count($diff)) { return ''; } $this->changed = \false; $buffer = fopen('php://memory', 'r+b'); fwrite($buffer, $this->header); $this->writeDiffHunks($buffer, $diff); if (!$this->changed) { fclose($buffer); return ''; } $diff = stream_get_contents($buffer, -1, 0); fclose($buffer); // If the last char is not a linebreak: add it. // This might happen when both the `from` and `to` do not have a trailing linebreak $last = substr($diff, -1); return "\n" !== $last && "\r" !== $last ? $diff . "\n" : $diff; } private function writeDiffHunks($output, array $diff) : void { // detect "No newline at end of file" and insert into `$diff` if needed $upperLimit = count($diff); if (0 === $diff[$upperLimit - 1][1]) { $lc = substr($diff[$upperLimit - 1][0], -1); if ("\n" !== $lc) { array_splice($diff, $upperLimit, 0, [["\n\\ No newline at end of file\n", Differ::NO_LINE_END_EOF_WARNING]]); } } else { // search back for the last `+` and `-` line, // check if has trailing linebreak, else add under it warning under it $toFind = [1 => \true, 2 => \true]; for ($i = $upperLimit - 1; $i >= 0; --$i) { if (isset($toFind[$diff[$i][1]])) { unset($toFind[$diff[$i][1]]); $lc = substr($diff[$i][0], -1); if ("\n" !== $lc) { array_splice($diff, $i + 1, 0, [["\n\\ No newline at end of file\n", Differ::NO_LINE_END_EOF_WARNING]]); } if (!count($toFind)) { break; } } } } // write hunks to output buffer $cutOff = max($this->commonLineThreshold, $this->contextLines); $hunkCapture = \false; $sameCount = $toRange = $fromRange = 0; $toStart = $fromStart = 1; $i = 0; /** @var int $i */ foreach ($diff as $i => $entry) { if (0 === $entry[1]) { // same if (\false === $hunkCapture) { ++$fromStart; ++$toStart; continue; } ++$sameCount; ++$toRange; ++$fromRange; if ($sameCount === $cutOff) { $contextStartOffset = $hunkCapture - $this->contextLines < 0 ? $hunkCapture : $this->contextLines; // note: $contextEndOffset = $this->contextLines; // // because we never go beyond the end of the diff. // with the cutoff/contextlines here the follow is never true; // // if ($i - $cutOff + $this->contextLines + 1 > \count($diff)) { // $contextEndOffset = count($diff) - 1; // } // // ; that would be true for a trailing incomplete hunk case which is dealt with after this loop $this->writeHunk($diff, $hunkCapture - $contextStartOffset, $i - $cutOff + $this->contextLines + 1, $fromStart - $contextStartOffset, $fromRange - $cutOff + $contextStartOffset + $this->contextLines, $toStart - $contextStartOffset, $toRange - $cutOff + $contextStartOffset + $this->contextLines, $output); $fromStart += $fromRange; $toStart += $toRange; $hunkCapture = \false; $sameCount = $toRange = $fromRange = 0; } continue; } $sameCount = 0; if ($entry[1] === Differ::NO_LINE_END_EOF_WARNING) { continue; } $this->changed = \true; if (\false === $hunkCapture) { $hunkCapture = $i; } if (Differ::ADDED === $entry[1]) { // added ++$toRange; } if (Differ::REMOVED === $entry[1]) { // removed ++$fromRange; } } if (\false === $hunkCapture) { return; } // we end here when cutoff (commonLineThreshold) was not reached, but we where capturing a hunk, // do not render hunk till end automatically because the number of context lines might be less than the commonLineThreshold $contextStartOffset = $hunkCapture - $this->contextLines < 0 ? $hunkCapture : $this->contextLines; // prevent trying to write out more common lines than there are in the diff _and_ // do not write more than configured through the context lines $contextEndOffset = min($sameCount, $this->contextLines); $fromRange -= $sameCount; $toRange -= $sameCount; $this->writeHunk($diff, $hunkCapture - $contextStartOffset, $i - $sameCount + $contextEndOffset + 1, $fromStart - $contextStartOffset, $fromRange + $contextStartOffset + $contextEndOffset, $toStart - $contextStartOffset, $toRange + $contextStartOffset + $contextEndOffset, $output); } private function writeHunk(array $diff, int $diffStartIndex, int $diffEndIndex, int $fromStart, int $fromRange, int $toStart, int $toRange, $output) : void { fwrite($output, '@@ -' . $fromStart); if (!$this->collapseRanges || 1 !== $fromRange) { fwrite($output, ',' . $fromRange); } fwrite($output, ' +' . $toStart); if (!$this->collapseRanges || 1 !== $toRange) { fwrite($output, ',' . $toRange); } fwrite($output, " @@\n"); for ($i = $diffStartIndex; $i < $diffEndIndex; ++$i) { if ($diff[$i][1] === Differ::ADDED) { $this->changed = \true; fwrite($output, '+' . $diff[$i][0]); } elseif ($diff[$i][1] === Differ::REMOVED) { $this->changed = \true; fwrite($output, '-' . $diff[$i][0]); } elseif ($diff[$i][1] === Differ::OLD) { fwrite($output, ' ' . $diff[$i][0]); } elseif ($diff[$i][1] === Differ::NO_LINE_END_EOF_WARNING) { $this->changed = \true; fwrite($output, $diff[$i][0]); } //} elseif ($diff[$i][1] === Differ::DIFF_LINE_END_WARNING) { // custom comment inserted by PHPUnit/diff package // skip //} else { // unknown/invalid //} } } private function assertString(array $options, string $option) : void { if (!is_string($options[$option])) { throw new ConfigurationException($option, 'a string', $options[$option]); } } private function assertStringOrNull(array $options, string $option) : void { if (null !== $options[$option] && !is_string($options[$option])) { throw new ConfigurationException($option, 'a string or ', $options[$option]); } } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\SebastianBergmann\Diff\Output; /** * Defines how an output builder should take a generated * diff array and return a string representation of that diff. */ interface DiffOutputBuilderInterface { public function getDiff(array $diff) : string; } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _HumbugBox1cb33d1f20f1\SebastianBergmann\Diff; use function array_reverse; use function count; use function max; use SplFixedArray; final class TimeEfficientLongestCommonSubsequenceCalculator implements LongestCommonSubsequenceCalculator { /** * {@inheritdoc} */ public function calculate(array $from, array $to) : array { $common = []; $fromLength = count($from); $toLength = count($to); $width = $fromLength + 1; $matrix = new SplFixedArray($width * ($toLength + 1)); for ($i = 0; $i <= $fromLength; ++$i) { $matrix[$i] = 0; } for ($j = 0; $j <= $toLength; ++$j) { $matrix[$j * $width] = 0; } for ($i = 1; $i <= $fromLength; ++$i) { for ($j = 1; $j <= $toLength; ++$j) { $o = $j * $width + $i; $matrix[$o] = max($matrix[$o - 1], $matrix[$o - $width], $from[$i - 1] === $to[$j - 1] ? $matrix[$o - $width - 1] + 1 : 0); } } $i = $fromLength; $j = $toLength; while ($i > 0 && $j > 0) { if ($from[$i - 1] === $to[$j - 1]) { $common[] = $from[$i - 1]; --$i; --$j; } else { $o = $j * $width + $i; if ($matrix[$o - $width] > $matrix[$o - 1]) { --$j; } else { --$i; } } } return array_reverse($common); } } sebastian/diff Copyright (c) 2002-2020, Sebastian Bergmann . All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Sebastian Bergmann nor the names of his contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. id) && isset($msg->error); } /** * @param int|string $id * @param \AdvancedJsonRpc\Error $error */ public function __construct($id, Error $error) { parent::__construct($id); $this->error = $error; } } error)); } /** * @param int|string $id * @param mixed $result * @param ResponseError $error */ public function __construct($id) { $this->id = $id; } } result = $result; } } method); } /** * @param string $method * @param mixed $params */ public function __construct(string $method, $params = null) { $this->method = $method; $this->params = $params; } } ReflectionMethod[] * * @var ReflectionMethod */ private $methods; /** * @var \phpDocumentor\Reflection\DocBlockFactory */ private $docBlockFactory; /** * @var \phpDocumentor\Reflection\Types\ContextFactory */ private $contextFactory; /** * @param object $target The target object that should receive the method calls * @param string $delimiter A delimiter for method calls on properties, for example someProperty->someMethod */ public function __construct($target, $delimiter = '->') { $this->target = $target; $this->delimiter = $delimiter; $this->docBlockFactory = DocBlockFactory::createInstance(); $this->contextFactory = new Types\ContextFactory(); $this->mapper = new JsonMapper(); } /** * Calls the appropriate method handler for an incoming Message * * @param string|object $msg The incoming message * @return mixed */ public function dispatch($msg) { if (\is_string($msg)) { $msg = \json_decode($msg); if (\json_last_error() !== \JSON_ERROR_NONE) { throw new Error(\json_last_error_msg(), ErrorCode::PARSE_ERROR); } } // Find out the object and function that should be called $obj = $this->target; $parts = \explode($this->delimiter, $msg->method); // The function to call is always the last part of the method $fn = \array_pop($parts); // For namespaced methods like textDocument/didOpen, call the didOpen method on the $textDocument property // For simple methods like initialize, shutdown, exit, this loop will simply not be entered and $obj will be // the target foreach ($parts as $part) { if (!isset($obj->{$part})) { throw new Error("Method {$msg->method} is not implemented", ErrorCode::METHOD_NOT_FOUND); } $obj = $obj->{$part}; } if (!isset($this->methods[$msg->method])) { try { $method = new ReflectionMethod($obj, $fn); $this->methods[$msg->method] = $method; } catch (ReflectionException $e) { throw new Error($e->getMessage(), ErrorCode::METHOD_NOT_FOUND, null, $e); } } $method = $this->methods[$msg->method]; $parameters = $method->getParameters(); if ($method->getDocComment()) { $docBlock = $this->docBlockFactory->create($method->getDocComment(), $this->contextFactory->createFromReflector($method->getDeclaringClass())); $paramTags = $docBlock->getTagsByName('param'); } $args = []; if (isset($msg->params)) { // Find out the position if (\is_array($msg->params)) { $args = $msg->params; } else { if (\is_object($msg->params)) { foreach ($parameters as $pos => $parameter) { $value = null; foreach (\get_object_vars($msg->params) as $key => $val) { if ($parameter->name === $key) { $value = $val; break; } } $args[$pos] = $value; } } else { throw new Error('Params must be structured or omitted', ErrorCode::INVALID_REQUEST); } } foreach ($args as $position => $value) { try { // If the type is structured (array or object), map it with JsonMapper if (\is_object($value)) { // Does the parameter have a type hint? $param = $parameters[$position]; if ($param->hasType()) { $paramType = $param->getType(); if ($paramType instanceof ReflectionNamedType) { // We have object data to map and want the class name. // This should not include the `?` if the type was nullable. $class = $paramType->getName(); } else { // Fallback for php 7.0, which is still supported (and doesn't have nullable). $class = (string) $paramType; } $value = $this->mapper->map($value, new $class()); } } else { if (\is_array($value) && isset($docBlock)) { // Get the array type from the DocBlock $type = $paramTags[$position]->getType(); // For union types, use the first one that is a class array (often it is SomeClass[]|null) if ($type instanceof Types\Compound) { for ($i = 0; $t = $type->get($i); $i++) { if ($t instanceof Types\Array_ && $t->getValueType() instanceof Types\Object_ && (string) $t->getValueType() !== 'object') { $class = (string) $t->getValueType()->getFqsen(); $value = $this->mapper->mapArray($value, [], $class); break; } } } else { if ($type instanceof Types\Array_) { $class = (string) $type->getValueType()->getFqsen(); $value = $this->mapper->mapArray($value, [], $class); } else { throw new Error('Type is not matching @param tag', ErrorCode::INVALID_PARAMS); } } } } } catch (JsonMapper_Exception $e) { throw new Error($e->getMessage(), ErrorCode::INVALID_PARAMS, null, $e); } $args[$position] = $value; } } \ksort($args); $result = $obj->{$fn}(...$args); return $result; } } method, $decoded->params ?? null); } else { if (Request::isRequest($decoded)) { $obj = new Request($decoded->id, $decoded->method, $decoded->params ?? null); } else { if (SuccessResponse::isSuccessResponse($decoded)) { $obj = new SuccessResponse($decoded->id, $decoded->result); } else { if (ErrorResponse::isErrorResponse($decoded)) { $obj = new ErrorResponse($decoded->id, new Error($decoded->error->message, $decoded->error->code, $decoded->error->data ?? null)); } else { throw new Error('Invalid message', ErrorCode::INVALID_REQUEST); } } } } return $obj; } public function __toString() : string { $encoded = \json_encode($this); if ($encoded === \false) { throw new Error(\json_last_error_msg(), ErrorCode::INTERNAL_ERROR); } return $encoded; } } data = $data; } } method); } /** * @param string|int $id * @param string $method * @param object|array $params */ public function __construct($id, string $method, $params = null) { $this->id = $id; $this->method = $method; $this->params = $params; } } ISC License Copyright (c) 2016, Felix Frederick Becker Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. { "name": "php-language-server-protocol", "version": "1.0.0", "lockfileVersion": 1, "requires": true, "dependencies": { "@mrmlnc/readdir-enhanced": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", "dev": true, "requires": { "call-me-maybe": "^1.0.1", "glob-to-regexp": "^0.3.0" } }, "@nodelib/fs.stat": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.2.tgz", "integrity": "sha512-yprFYuno9FtNsSHVlSWd+nRlmGoAbqbeCwOryP6sC/zoCjhpArcRMYp19EvpSUSizJAlsXEwJv+wcWS9XaXdMw==", "dev": true }, "@octokit/rest": { "version": "15.12.0", "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-15.12.0.tgz", "integrity": "sha512-5wRag4kHRkp0JDo++L9x9FkDlHEALbLnbSede16D8u+a2/t+gX32uhDs8cukVLyyrZR79nmh1lNpxZmffwoNoQ==", "dev": true, "requires": { "before-after-hook": "^1.1.0", "btoa-lite": "^1.0.0", "debug": "^3.1.0", "http-proxy-agent": "^2.1.0", "https-proxy-agent": "^2.2.0", "lodash": "^4.17.4", "node-fetch": "^2.1.1", "universal-user-agent": "^2.0.0", "url-template": "^2.0.8" }, "dependencies": { "debug": { "version": "3.2.5", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.5.tgz", "integrity": "sha512-D61LaDQPQkxJ5AUM2mbSJRbPkNs/TmdmOeLAi1hgDkpDfIfetSrjmWhccwtuResSwMbACjx/xXQofvM9CE/aeg==", "dev": true, "requires": { "ms": "^2.1.1" } } } }, "@semantic-release/commit-analyzer": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-6.0.1.tgz", "integrity": "sha512-ENCRn1tm1D08CCBnIPsID8GjboWT6E97s0Lk3XrpAh+IMx615uAU1X2FoXyOGGc6zmqp9Ff4s8KECd/GjMcodQ==", "dev": true, "requires": { "conventional-changelog-angular": "^5.0.0", "conventional-commits-filter": "^2.0.0", "conventional-commits-parser": "^3.0.0", "debug": "^4.0.0", "import-from": "^2.1.0", "lodash": "^4.17.4" } }, "@semantic-release/error": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-2.2.0.tgz", "integrity": "sha512-9Tj/qn+y2j+sjCI3Jd+qseGtHjOAeg7dU2/lVcqIQ9TV3QDaDXDYXcoOHU+7o2Hwh8L8ymL4gfuO7KxDs3q2zg==", "dev": true }, "@semantic-release/github": { "version": "5.0.5", "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-5.0.5.tgz", "integrity": "sha512-Hdt6b8ST2pg6pl151PlcsnTcdsC2UJhA5FdbmunbZG/TVmlnKCZ4WUzpji7YqJtDLjbQTuFm/vhM6atW3XjMWg==", "dev": true, "requires": { "@octokit/rest": "^15.2.0", "@semantic-release/error": "^2.2.0", "aggregate-error": "^1.0.0", "bottleneck": "^2.0.1", "debug": "^4.0.0", "dir-glob": "^2.0.0", "fs-extra": "^7.0.0", "globby": "^8.0.0", "http-proxy-agent": "^2.1.0", "https-proxy-agent": "^2.2.1", "issue-parser": "^3.0.0", "lodash": "^4.17.4", "mime": "^2.0.3", "p-filter": "^1.0.0", "p-retry": "^2.0.0", "parse-github-url": "^1.0.1", "url-join": "^4.0.0" } }, "@semantic-release/npm": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-5.0.4.tgz", "integrity": "sha512-ExGXP9GnM2hqUIgTnp6sXKB1G0Yh+fuLftmIopq5KHBWj34Wd2YbM/3iLkXXnAP1YZ9YCp7hsAdsR014ctbwHg==", "dev": true, "requires": { "@semantic-release/error": "^2.2.0", "aggregate-error": "^1.0.0", "detect-indent": "^5.0.0", "detect-newline": "^2.1.0", "execa": "^1.0.0", "fs-extra": "^7.0.0", "lodash": "^4.17.4", "nerf-dart": "^1.0.0", "normalize-url": "^3.0.0", "npm": "^6.3.0", "parse-json": "^4.0.0", "rc": "^1.2.8", "read-pkg": "^4.0.0", "registry-auth-token": "^3.3.1" }, "dependencies": { "read-pkg": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-4.0.1.tgz", "integrity": "sha1-ljYlN48+HE1IyFhytabsfV0JMjc=", "dev": true, "requires": { "normalize-package-data": "^2.3.2", "parse-json": "^4.0.0", "pify": "^3.0.0" } } } }, "@semantic-release/release-notes-generator": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-7.0.2.tgz", "integrity": "sha512-fomHrGq/gfZIAQYZk0MLRwfQ8d+DbTcI3kuO1hU2L0fDJYKHZHuPmKnsfVa5KoNdVVPHx878D/ojgyStRqhc9g==", "dev": true, "requires": { "conventional-changelog-angular": "^5.0.0", "conventional-changelog-writer": "^4.0.0", "conventional-commits-filter": "^2.0.0", "conventional-commits-parser": "^3.0.0", "debug": "^4.0.0", "get-stream": "^4.0.0", "git-url-parse": "^10.0.1", "import-from": "^2.1.0", "into-stream": "^3.1.0", "lodash": "^4.17.4" } }, "JSONStream": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.4.tgz", "integrity": "sha512-Y7vfi3I5oMOYIr+WxV8NZxDSwcbNgzdKYsTNInmycOq9bUYwGg9ryu57Wg5NLmCjqdFPNUmpMBo3kSJN9tCbXg==", "dev": true, "requires": { "jsonparse": "^1.2.0", "through": ">=2.2.7 <3" } }, "agent-base": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", "dev": true, "requires": { "es6-promisify": "^5.0.0" } }, "aggregate-error": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-1.0.0.tgz", "integrity": "sha1-iINE2tAiCnLjr1CQYRf0h3GSX6w=", "dev": true, "requires": { "clean-stack": "^1.0.0", "indent-string": "^3.0.0" } }, "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "^1.9.0" } }, "ansicolors": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=", "dev": true }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { "sprintf-js": "~1.0.2" } }, "argv-formatter": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/argv-formatter/-/argv-formatter-1.0.0.tgz", "integrity": "sha1-oMoMvCmltz6Dbuvhy/bF4OTrgvk=", "dev": true }, "arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", "dev": true }, "arr-flatten": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", "dev": true }, "arr-union": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", "dev": true }, "array-find-index": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", "dev": true }, "array-ify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", "dev": true }, "array-union": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", "dev": true, "requires": { "array-uniq": "^1.0.1" } }, "array-uniq": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", "dev": true }, "array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", "dev": true }, "assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", "dev": true }, "async": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", "dev": true, "requires": { "lodash": "^4.17.10" } }, "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", "dev": true }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, "base": { "version": "0.11.2", "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "dev": true, "requires": { "cache-base": "^1.0.1", "class-utils": "^0.3.5", "component-emitter": "^1.2.1", "define-property": "^1.0.0", "isobject": "^3.0.1", "mixin-deep": "^1.2.0", "pascalcase": "^0.1.1" }, "dependencies": { "define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { "is-descriptor": "^1.0.0" } }, "is-accessor-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { "kind-of": "^6.0.0" } }, "is-data-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { "kind-of": "^6.0.0" } }, "is-descriptor": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", "kind-of": "^6.0.2" } } } }, "before-after-hook": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-1.1.0.tgz", "integrity": "sha512-VOMDtYPwLbIncTxNoSzRyvaMxtXmLWLUqr8k5AfC1BzLk34HvBXaQX8snOwQZ4c0aX8aSERqtJSiI9/m2u5kuA==", "dev": true }, "bottleneck": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.11.0.tgz", "integrity": "sha512-DvKiYR1kG1qRVoLBUtPlmJffktoBZIz3qtdUbINlwzQXDhlhZdF8gWesPjwp05xqr5QZ7wXA2k1w78/COCweTg==", "dev": true }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "braces": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, "requires": { "arr-flatten": "^1.1.0", "array-unique": "^0.3.2", "extend-shallow": "^2.0.1", "fill-range": "^4.0.0", "isobject": "^3.0.1", "repeat-element": "^1.1.2", "snapdragon": "^0.8.1", "snapdragon-node": "^2.0.1", "split-string": "^3.0.2", "to-regex": "^3.0.1" }, "dependencies": { "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { "is-extendable": "^0.1.0" } } } }, "btoa-lite": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/btoa-lite/-/btoa-lite-1.0.0.tgz", "integrity": "sha1-M3dm2hWAEhD92VbCLpxokaudAzc=", "dev": true }, "builtin-modules": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", "dev": true }, "cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "dev": true, "requires": { "collection-visit": "^1.0.0", "component-emitter": "^1.2.1", "get-value": "^2.0.6", "has-value": "^1.0.0", "isobject": "^3.0.1", "set-value": "^2.0.0", "to-object-path": "^0.3.0", "union-value": "^1.0.0", "unset-value": "^1.0.0" } }, "call-me-maybe": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", "dev": true }, "camelcase": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", "dev": true }, "camelcase-keys": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", "dev": true, "requires": { "camelcase": "^4.1.0", "map-obj": "^2.0.0", "quick-lru": "^1.0.0" } }, "cardinal": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", "integrity": "sha1-fMEFXYItISlU0HsIXeolHMe8VQU=", "dev": true, "requires": { "ansicolors": "~0.3.2", "redeyed": "~2.1.0" } }, "chalk": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "dev": true, "requires": { "arr-union": "^3.1.0", "define-property": "^0.2.5", "isobject": "^3.0.0", "static-extend": "^0.1.1" }, "dependencies": { "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { "is-descriptor": "^0.1.0" } } } }, "clean-stack": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-1.3.0.tgz", "integrity": "sha1-noIVAa6XmYbEax1m0tQy2y/UrjE=", "dev": true }, "cli-table": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=", "dev": true, "requires": { "colors": "1.0.3" } }, "cliui": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", "dev": true, "requires": { "string-width": "^2.1.1", "strip-ansi": "^4.0.0", "wrap-ansi": "^2.0.0" } }, "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true }, "collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", "dev": true, "requires": { "map-visit": "^1.0.0", "object-visit": "^1.0.0" } }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { "color-name": "1.1.3" } }, "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, "colors": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", "dev": true }, "commander": { "version": "2.17.1", "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", "dev": true, "optional": true }, "compare-func": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-1.3.2.tgz", "integrity": "sha1-md0LpFfh+bxyKxLAjsM+6rMfpkg=", "dev": true, "requires": { "array-ify": "^1.0.0", "dot-prop": "^3.0.0" } }, "component-emitter": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", "dev": true }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, "conventional-changelog-angular": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.1.tgz", "integrity": "sha512-q4ylJ68fWZDdrFC9z4zKcf97HW6hp7Mo2YlqD4owfXhecFKy/PJCU/1oVFF4TqochchChqmZ0Vb0e0g8/MKNlA==", "dev": true, "requires": { "compare-func": "^1.3.1", "q": "^1.5.1" } }, "conventional-changelog-writer": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.0.0.tgz", "integrity": "sha512-hMZPe0AQ6Bi05epeK/7hz80xxk59nPA5z/b63TOHq2wigM0/akreOc8N4Jam5b9nFgKWX1e9PdPv2ewgW6bcfg==", "dev": true, "requires": { "compare-func": "^1.3.1", "conventional-commits-filter": "^2.0.0", "dateformat": "^3.0.0", "handlebars": "^4.0.2", "json-stringify-safe": "^5.0.1", "lodash": "^4.2.1", "meow": "^4.0.0", "semver": "^5.5.0", "split": "^1.0.0", "through2": "^2.0.0" } }, "conventional-commits-filter": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.0.tgz", "integrity": "sha512-Cfl0j1/NquB/TMVx7Wrmyq7uRM+/rPQbtVVGwzfkhZ6/yH6fcMmP0Q/9044TBZPTNdGzm46vXFXL14wbET0/Mg==", "dev": true, "requires": { "is-subset": "^0.1.1", "modify-values": "^1.0.0" } }, "conventional-commits-parser": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.0.0.tgz", "integrity": "sha512-GWh71U26BLWgMykCp+VghZ4s64wVbtseECcKQ/PvcPZR2cUnz+FUc2J9KjxNl7/ZbCxST8R03c9fc+Vi0umS9Q==", "dev": true, "requires": { "JSONStream": "^1.0.4", "is-text-path": "^1.0.0", "lodash": "^4.2.1", "meow": "^4.0.0", "split2": "^2.0.0", "through2": "^2.0.0", "trim-off-newlines": "^1.0.0" } }, "copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", "dev": true }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, "cosmiconfig": { "version": "5.0.6", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.0.6.tgz", "integrity": "sha512-6DWfizHriCrFWURP1/qyhsiFvYdlJzbCzmtFWh744+KyWsJo5+kPzUZZaMRSSItoYc0pxFX7gEO7ZC1/gN/7AQ==", "dev": true, "requires": { "is-directory": "^0.3.1", "js-yaml": "^3.9.0", "parse-json": "^4.0.0" } }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "requires": { "nice-try": "^1.0.4", "path-key": "^2.0.1", "semver": "^5.5.0", "shebang-command": "^1.2.0", "which": "^1.2.9" } }, "currently-unhandled": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", "dev": true, "requires": { "array-find-index": "^1.0.1" } }, "dateformat": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", "dev": true }, "debug": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.0.1.tgz", "integrity": "sha512-K23FHJ/Mt404FSlp6gSZCevIbTMLX0j3fmHhUEhQ3Wq0FMODW3+cUSoLdy1Gx4polAf4t/lphhmHH35BB8cLYw==", "dev": true, "requires": { "ms": "^2.1.1" } }, "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, "decamelize-keys": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", "dev": true, "requires": { "decamelize": "^1.1.0", "map-obj": "^1.0.0" }, "dependencies": { "map-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", "dev": true } } }, "decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", "dev": true }, "deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true }, "define-property": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "dev": true, "requires": { "is-descriptor": "^1.0.2", "isobject": "^3.0.1" }, "dependencies": { "is-accessor-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { "kind-of": "^6.0.0" } }, "is-data-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { "kind-of": "^6.0.0" } }, "is-descriptor": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", "kind-of": "^6.0.2" } } } }, "detect-indent": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", "integrity": "sha1-OHHMCmoALow+Wzz38zYmRnXwa50=", "dev": true }, "detect-newline": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", "dev": true }, "dir-glob": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", "dev": true, "requires": { "arrify": "^1.0.1", "path-type": "^3.0.0" } }, "dot-prop": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz", "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=", "dev": true, "requires": { "is-obj": "^1.0.0" } }, "duplexer2": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", "dev": true, "requires": { "readable-stream": "^2.0.2" } }, "end-of-stream": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", "dev": true, "requires": { "once": "^1.4.0" } }, "env-ci": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-3.0.0.tgz", "integrity": "sha512-3Xt4Cfjdy9MTTrg/eWTnJNQIrtU1DDV0KyuWOGlrR2oa9dOdzoOMbQBFbfrTiv+GypdiWWIw5HdmtakZO+rzWA==", "dev": true, "requires": { "execa": "^1.0.0", "java-properties": "^0.2.9" } }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, "requires": { "is-arrayish": "^0.2.1" } }, "es6-promise": { "version": "4.2.5", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz", "integrity": "sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg==", "dev": true }, "es6-promisify": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", "dev": true, "requires": { "es6-promise": "^4.0.3" } }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, "execa": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "dev": true, "requires": { "cross-spawn": "^6.0.0", "get-stream": "^4.0.0", "is-stream": "^1.1.0", "npm-run-path": "^2.0.0", "p-finally": "^1.0.0", "signal-exit": "^3.0.0", "strip-eof": "^1.0.0" } }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "requires": { "debug": "^2.3.3", "define-property": "^0.2.5", "extend-shallow": "^2.0.1", "posix-character-classes": "^0.1.0", "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.1" }, "dependencies": { "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { "ms": "2.0.0" } }, "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { "is-descriptor": "^0.1.0" } }, "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { "is-extendable": "^0.1.0" } }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true } } }, "extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, "requires": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" }, "dependencies": { "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { "is-plain-object": "^2.0.4" } } } }, "extglob": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "requires": { "array-unique": "^0.3.2", "define-property": "^1.0.0", "expand-brackets": "^2.1.4", "extend-shallow": "^2.0.1", "fragment-cache": "^0.2.1", "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.1" }, "dependencies": { "define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { "is-descriptor": "^1.0.0" } }, "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { "is-extendable": "^0.1.0" } }, "is-accessor-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { "kind-of": "^6.0.0" } }, "is-data-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { "kind-of": "^6.0.0" } }, "is-descriptor": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", "kind-of": "^6.0.2" } } } }, "fast-glob": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.2.tgz", "integrity": "sha512-TR6zxCKftDQnUAPvkrCWdBgDq/gbqx8A3ApnBrR5rMvpp6+KMJI0Igw7fkWPgeVK0uhRXTXdvO3O+YP0CaUX2g==", "dev": true, "requires": { "@mrmlnc/readdir-enhanced": "^2.2.1", "@nodelib/fs.stat": "^1.0.1", "glob-parent": "^3.1.0", "is-glob": "^4.0.0", "merge2": "^1.2.1", "micromatch": "^3.1.10" } }, "figures": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", "dev": true, "requires": { "escape-string-regexp": "^1.0.5" } }, "fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, "requires": { "extend-shallow": "^2.0.1", "is-number": "^3.0.0", "repeat-string": "^1.6.1", "to-regex-range": "^2.1.0" }, "dependencies": { "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { "is-extendable": "^0.1.0" } } } }, "find-up": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { "locate-path": "^2.0.0" } }, "find-versions": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-2.0.0.tgz", "integrity": "sha1-KtkNSQ9oKMGqQCks9wmsMxghDDw=", "dev": true, "requires": { "array-uniq": "^1.0.0", "semver-regex": "^1.0.0" } }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "dev": true }, "fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "dev": true, "requires": { "map-cache": "^0.2.2" } }, "from2": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", "dev": true, "requires": { "inherits": "^2.0.1", "readable-stream": "^2.0.0" } }, "fs-extra": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.0.tgz", "integrity": "sha512-EglNDLRpmaTWiD/qraZn6HREAEAHJcJOmxNEYwq6xeMKnVMAy3GUcFB+wXt2C6k4CNvB/mP1y/U3dzvKKj5OtQ==", "dev": true, "requires": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, "get-caller-file": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", "dev": true }, "get-stream": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.0.0.tgz", "integrity": "sha512-FneLKMENeOR7wOK0/ZXCh+lwqtnPwkeunJjRN28LPqzGvNAhYvrTAhXv6xDm4vsJ0M7lcRbIYHQudKsSy2RtSQ==", "dev": true, "requires": { "pump": "^3.0.0" } }, "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", "dev": true }, "git-log-parser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/git-log-parser/-/git-log-parser-1.2.0.tgz", "integrity": "sha1-LmpMGxP8AAKCB7p5WnrDFme5/Uo=", "dev": true, "requires": { "argv-formatter": "~1.0.0", "spawn-error-forwarder": "~1.0.0", "split2": "~1.0.0", "stream-combiner2": "~1.1.1", "through2": "~2.0.0", "traverse": "~0.6.6" }, "dependencies": { "split2": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/split2/-/split2-1.0.0.tgz", "integrity": "sha1-UuLiIdiMdfmnP5BVbiY/+WdysxQ=", "dev": true, "requires": { "through2": "~2.0.0" } } } }, "git-up": { "version": "2.0.10", "resolved": "https://registry.npmjs.org/git-up/-/git-up-2.0.10.tgz", "integrity": "sha512-2v4UN3qV2RGypD9QpmUjpk+4+RlYpW8GFuiZqQnKmvei08HsFPd0RfbDvEhnE4wBvnYs8ORVtYpOFuuCEmBVBw==", "dev": true, "requires": { "is-ssh": "^1.3.0", "parse-url": "^1.3.0" } }, "git-url-parse": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-10.0.1.tgz", "integrity": "sha512-Tq2u8UPXc/FawC/dO8bvh8jcck0Lkor5OhuZvmVSeyJGRucDBfw9y2zy/GNCx28lMYh1N12IzPwDexjUNFyAeg==", "dev": true, "requires": { "git-up": "^2.0.0" } }, "glob": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "glob-parent": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "dev": true, "requires": { "is-glob": "^3.1.0", "path-dirname": "^1.0.0" }, "dependencies": { "is-glob": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "dev": true, "requires": { "is-extglob": "^2.1.0" } } } }, "glob-to-regexp": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", "dev": true }, "globby": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.1.tgz", "integrity": "sha512-oMrYrJERnKBLXNLVTqhm3vPEdJ/b2ZE28xN4YARiix1NOIOBPEpOUnm844K1iu/BkphCaf2WNFwMszv8Soi1pw==", "dev": true, "requires": { "array-union": "^1.0.1", "dir-glob": "^2.0.0", "fast-glob": "^2.0.2", "glob": "^7.1.2", "ignore": "^3.3.5", "pify": "^3.0.0", "slash": "^1.0.0" } }, "graceful-fs": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", "dev": true }, "handlebars": { "version": "4.0.12", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.12.tgz", "integrity": "sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA==", "dev": true, "requires": { "async": "^2.5.0", "optimist": "^0.6.1", "source-map": "^0.6.1", "uglify-js": "^3.1.4" }, "dependencies": { "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "dev": true, "requires": { "get-value": "^2.0.6", "has-values": "^1.0.0", "isobject": "^3.0.0" } }, "has-values": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", "dev": true, "requires": { "is-number": "^3.0.0", "kind-of": "^4.0.0" }, "dependencies": { "kind-of": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "dev": true, "requires": { "is-buffer": "^1.1.5" } } } }, "hook-std": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-1.1.0.tgz", "integrity": "sha512-aIyBZbZl3NS8XoSwIDQ+ZaiBuPOhhPWoBFA3QX0Q8hOMO8Tx4xGRTDnn/nl/LAtZWdieXzFC9ohAtTSnWrlHCQ==", "dev": true }, "hosted-git-info": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", "dev": true }, "http-proxy-agent": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", "dev": true, "requires": { "agent-base": "4", "debug": "3.1.0" }, "dependencies": { "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { "ms": "2.0.0" } }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true } } }, "https-proxy-agent": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", "dev": true, "requires": { "agent-base": "^4.1.0", "debug": "^3.1.0" }, "dependencies": { "debug": { "version": "3.2.5", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.5.tgz", "integrity": "sha512-D61LaDQPQkxJ5AUM2mbSJRbPkNs/TmdmOeLAi1hgDkpDfIfetSrjmWhccwtuResSwMbACjx/xXQofvM9CE/aeg==", "dev": true, "requires": { "ms": "^2.1.1" } } } }, "ignore": { "version": "3.3.10", "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", "dev": true }, "import-from": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", "dev": true, "requires": { "resolve-from": "^3.0.0" }, "dependencies": { "resolve-from": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", "dev": true } } }, "indent-string": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", "dev": true }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" } }, "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true }, "ini": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "dev": true }, "into-stream": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=", "dev": true, "requires": { "from2": "^2.1.1", "p-is-promise": "^1.1.0" } }, "invert-kv": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", "dev": true }, "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { "is-buffer": "^1.1.5" } } } }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, "is-builtin-module": { "version": "1.0.0", "resolved": "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "dev": true, "requires": { "builtin-modules": "^1.0.0" } }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { "is-buffer": "^1.1.5" } } } }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", "kind-of": "^5.0.0" }, "dependencies": { "kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", "dev": true } } }, "is-directory": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", "dev": true }, "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", "dev": true }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, "is-glob": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", "dev": true, "requires": { "is-extglob": "^2.1.1" } }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { "is-buffer": "^1.1.5" } } } }, "is-obj": { "version": "1.0.1", "resolved": "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", "dev": true }, "is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", "dev": true }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "requires": { "isobject": "^3.0.1" } }, "is-ssh": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.3.0.tgz", "integrity": "sha1-6+oRaaJhTaOSpjdANmw84EnY3/Y=", "dev": true, "requires": { "protocols": "^1.1.0" } }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, "is-subset": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=", "dev": true }, "is-text-path": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", "dev": true, "requires": { "text-extensions": "^1.0.0" } }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, "issue-parser": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-3.0.0.tgz", "integrity": "sha512-VWIhBdy0eOhlvpxOOMecBCHMpjx7lWVZcYpSzjD4dSdxptzI9TBR/cQEh057HL8+7jQKTLs+uCtezY/9VoveCA==", "dev": true, "requires": { "lodash.capitalize": "^4.2.1", "lodash.escaperegexp": "^4.1.2", "lodash.isplainobject": "^4.0.6", "lodash.isstring": "^4.0.1", "lodash.uniqby": "^4.7.0" } }, "java-properties": { "version": "0.2.10", "resolved": "https://registry.npmjs.org/java-properties/-/java-properties-0.2.10.tgz", "integrity": "sha512-CpKJh9VRNhS+XqZtg1UMejETGEiqwCGDC/uwPEEQwc2nfdbSm73SIE29TplG2gLYuBOOTNDqxzG6A9NtEPLt0w==", "dev": true }, "js-yaml": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", "dev": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" } }, "json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "dev": true }, "jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", "dev": true, "requires": { "graceful-fs": "^4.1.6" } }, "jsonparse": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", "dev": true }, "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", "dev": true }, "lcid": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", "dev": true, "requires": { "invert-kv": "^2.0.0" } }, "load-json-file": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", "dev": true, "requires": { "graceful-fs": "^4.1.2", "parse-json": "^4.0.0", "pify": "^3.0.0", "strip-bom": "^3.0.0" } }, "locate-path": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dev": true, "requires": { "p-locate": "^2.0.0", "path-exists": "^3.0.0" }, "dependencies": { "p-locate": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, "requires": { "p-limit": "^1.1.0" } } } }, "lodash": { "version": "4.17.11", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", "dev": true }, "lodash.assign": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", "dev": true }, "lodash.capitalize": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", "integrity": "sha1-+CbJtOKoUR2E46yinbBeGk87cqk=", "dev": true }, "lodash.escaperegexp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", "integrity": "sha1-ZHYsSGGAglGKw99Mz11YhtriA0c=", "dev": true }, "lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", "dev": true }, "lodash.isstring": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=", "dev": true }, "lodash.toarray": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz", "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE=", "dev": true }, "lodash.uniqby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", "integrity": "sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI=", "dev": true }, "loud-rejection": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", "dev": true, "requires": { "currently-unhandled": "^0.4.1", "signal-exit": "^3.0.0" } }, "macos-release": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-1.1.0.tgz", "integrity": "sha512-mmLbumEYMi5nXReB9js3WGsB8UE6cDBWyIO62Z4DNx6GbRhDxHNjA1MlzSpJ2S2KM1wyiPRA0d19uHWYYvMHjA==", "dev": true }, "map-age-cleaner": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.2.tgz", "integrity": "sha512-UN1dNocxQq44IhJyMI4TU8phc2m9BddacHRPRjKGLYaF0jqd3xLz0jS0skpAU9WgYyoR4gHtUpzytNBS385FWQ==", "dev": true, "requires": { "p-defer": "^1.0.0" } }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", "dev": true }, "map-obj": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", "dev": true }, "map-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "dev": true, "requires": { "object-visit": "^1.0.0" } }, "marked": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/marked/-/marked-0.5.0.tgz", "integrity": "sha512-UhjmkCWKu1SS/BIePL2a59BMJ7V42EYtTfksodPRXzPEGEph3Inp5dylseqt+KbU9Jglsx8xcMKmlumfJMBXAA==", "dev": true }, "marked-terminal": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-3.1.1.tgz", "integrity": "sha512-7UBFww1rdx0w9HehLMCVYa8/AxXaiDigDfMsJcj82/wgLQG9cj+oiMAVlJpeWD57VFJY2OYY+bKeEVIjIlxi+w==", "dev": true, "requires": { "cardinal": "^2.1.1", "chalk": "^2.4.1", "cli-table": "^0.3.1", "lodash.assign": "^4.2.0", "node-emoji": "^1.4.1" } }, "mem": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/mem/-/mem-4.0.0.tgz", "integrity": "sha512-WQxG/5xYc3tMbYLXoXPm81ET2WDULiU5FxbuIoNbJqLOOI8zehXFdZuiUEgfdrU2mVB1pxBZUGlYORSrpuJreA==", "dev": true, "requires": { "map-age-cleaner": "^0.1.1", "mimic-fn": "^1.0.0", "p-is-promise": "^1.1.0" } }, "meow": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", "dev": true, "requires": { "camelcase-keys": "^4.0.0", "decamelize-keys": "^1.0.0", "loud-rejection": "^1.0.0", "minimist": "^1.1.3", "minimist-options": "^3.0.1", "normalize-package-data": "^2.3.4", "read-pkg-up": "^3.0.0", "redent": "^2.0.0", "trim-newlines": "^2.0.0" }, "dependencies": { "read-pkg-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", "dev": true, "requires": { "find-up": "^2.0.0", "read-pkg": "^3.0.0" } } } }, "merge2": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.2.tgz", "integrity": "sha512-bgM8twH86rWni21thii6WCMQMRMmwqqdW3sGWi9IipnVAszdLXRjwDwAnyrVXo6DuP3AjRMMttZKUB48QWIFGg==", "dev": true }, "micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "requires": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", "braces": "^2.3.1", "define-property": "^2.0.2", "extend-shallow": "^3.0.2", "extglob": "^2.0.4", "fragment-cache": "^0.2.1", "kind-of": "^6.0.2", "nanomatch": "^1.2.9", "object.pick": "^1.3.0", "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.2" } }, "mime": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz", "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==", "dev": true }, "mimic-fn": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { "version": "1.2.0", "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, "minimist-options": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", "dev": true, "requires": { "arrify": "^1.0.1", "is-plain-obj": "^1.1.0" } }, "mixin-deep": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", "dev": true, "requires": { "for-in": "^1.0.2", "is-extendable": "^1.0.1" }, "dependencies": { "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { "is-plain-object": "^2.0.4" } } } }, "modify-values": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", "dev": true }, "ms": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", "dev": true, "requires": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", "define-property": "^2.0.2", "extend-shallow": "^3.0.2", "fragment-cache": "^0.2.1", "is-windows": "^1.0.2", "kind-of": "^6.0.2", "object.pick": "^1.3.0", "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.1" } }, "nerf-dart": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/nerf-dart/-/nerf-dart-1.0.0.tgz", "integrity": "sha1-5tq3/r9a2Bbqgc9cYpxaDr3nLBo=", "dev": true }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, "node-emoji": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.8.1.tgz", "integrity": "sha512-+ktMAh1Jwas+TnGodfCfjUbJKoANqPaJFN0z0iqh41eqD8dvguNzcitVSBSVK1pidz0AqGbLKcoVuVLRVZ/aVg==", "dev": true, "requires": { "lodash.toarray": "^4.4.0" } }, "node-fetch": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.2.0.tgz", "integrity": "sha512-OayFWziIxiHY8bCUyLX6sTpDH8Jsbp4FfYd1j1f7vZyfgkcOnAyM4oQR16f8a0s7Gl/viMGRey8eScYk4V4EZA==", "dev": true }, "normalize-package-data": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", "dev": true, "requires": { "hosted-git-info": "^2.1.4", "is-builtin-module": "^1.0.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" } }, "normalize-url": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", "dev": true }, "npm": { "version": "6.4.1", "resolved": "https://registry.npmjs.org/npm/-/npm-6.4.1.tgz", "integrity": "sha512-mXJL1NTVU136PtuopXCUQaNWuHlXCTp4McwlSW8S9/Aj8OEPAlSBgo8og7kJ01MjCDrkmqFQTvN5tTEhBMhXQg==", "dev": true, "requires": { "JSONStream": "^1.3.4", "abbrev": "~1.1.1", "ansicolors": "~0.3.2", "ansistyles": "~0.1.3", "aproba": "~1.2.0", "archy": "~1.0.0", "bin-links": "^1.1.2", "bluebird": "~3.5.1", "byte-size": "^4.0.3", "cacache": "^11.2.0", "call-limit": "~1.1.0", "chownr": "~1.0.1", "ci-info": "^1.4.0", "cli-columns": "^3.1.2", "cli-table3": "^0.5.0", "cmd-shim": "~2.0.2", "columnify": "~1.5.4", "config-chain": "~1.1.11", "debuglog": "*", "detect-indent": "~5.0.0", "detect-newline": "^2.1.0", "dezalgo": "~1.0.3", "editor": "~1.0.0", "figgy-pudding": "^3.4.1", "find-npm-prefix": "^1.0.2", "fs-vacuum": "~1.2.10", "fs-write-stream-atomic": "~1.0.10", "gentle-fs": "^2.0.1", "glob": "~7.1.2", "graceful-fs": "~4.1.11", "has-unicode": "~2.0.1", "hosted-git-info": "^2.7.1", "iferr": "^1.0.2", "imurmurhash": "*", "inflight": "~1.0.6", "inherits": "~2.0.3", "ini": "^1.3.5", "init-package-json": "^1.10.3", "is-cidr": "^2.0.6", "json-parse-better-errors": "^1.0.2", "lazy-property": "~1.0.0", "libcipm": "^2.0.2", "libnpmhook": "^4.0.1", "libnpx": "^10.2.0", "lock-verify": "^2.0.2", "lockfile": "^1.0.4", "lodash._baseindexof": "*", "lodash._baseuniq": "~4.6.0", "lodash._bindcallback": "*", "lodash._cacheindexof": "*", "lodash._createcache": "*", "lodash._getnative": "*", "lodash.clonedeep": "~4.5.0", "lodash.restparam": "*", "lodash.union": "~4.6.0", "lodash.uniq": "~4.5.0", "lodash.without": "~4.4.0", "lru-cache": "^4.1.3", "meant": "~1.0.1", "mississippi": "^3.0.0", "mkdirp": "~0.5.1", "move-concurrently": "^1.0.1", "node-gyp": "^3.8.0", "nopt": "~4.0.1", "normalize-package-data": "~2.4.0", "npm-audit-report": "^1.3.1", "npm-cache-filename": "~1.0.2", "npm-install-checks": "~3.0.0", "npm-lifecycle": "^2.1.0", "npm-package-arg": "^6.1.0", "npm-packlist": "^1.1.11", "npm-pick-manifest": "^2.1.0", "npm-profile": "^3.0.2", "npm-registry-client": "^8.6.0", "npm-registry-fetch": "^1.1.0", "npm-user-validate": "~1.0.0", "npmlog": "~4.1.2", "once": "~1.4.0", "opener": "^1.5.0", "osenv": "^0.1.5", "pacote": "^8.1.6", "path-is-inside": "~1.0.2", "promise-inflight": "~1.0.1", "qrcode-terminal": "^0.12.0", "query-string": "^6.1.0", "qw": "~1.0.1", "read": "~1.0.7", "read-cmd-shim": "~1.0.1", "read-installed": "~4.0.3", "read-package-json": "^2.0.13", "read-package-tree": "^5.2.1", "readable-stream": "^2.3.6", "readdir-scoped-modules": "*", "request": "^2.88.0", "retry": "^0.12.0", "rimraf": "~2.6.2", "safe-buffer": "^5.1.2", "semver": "^5.5.0", "sha": "~2.0.1", "slide": "~1.1.6", "sorted-object": "~2.0.1", "sorted-union-stream": "~2.1.3", "ssri": "^6.0.0", "stringify-package": "^1.0.0", "tar": "^4.4.6", "text-table": "~0.2.0", "tiny-relative-date": "^1.3.0", "uid-number": "0.0.6", "umask": "~1.1.0", "unique-filename": "~1.1.0", "unpipe": "~1.0.0", "update-notifier": "^2.5.0", "uuid": "^3.3.2", "validate-npm-package-license": "^3.0.4", "validate-npm-package-name": "~3.0.0", "which": "^1.3.1", "worker-farm": "^1.6.0", "write-file-atomic": "^2.3.0" }, "dependencies": { "JSONStream": { "version": "1.3.4", "bundled": true, "dev": true, "requires": { "jsonparse": "^1.2.0", "through": ">=2.2.7 <3" } }, "abbrev": { "version": "1.1.1", "bundled": true, "dev": true }, "agent-base": { "version": "4.2.0", "bundled": true, "dev": true, "requires": { "es6-promisify": "^5.0.0" } }, "agentkeepalive": { "version": "3.4.1", "bundled": true, "dev": true, "requires": { "humanize-ms": "^1.2.1" } }, "ajv": { "version": "5.5.2", "bundled": true, "dev": true, "requires": { "co": "^4.6.0", "fast-deep-equal": "^1.0.0", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.3.0" } }, "ansi-align": { "version": "2.0.0", "bundled": true, "dev": true, "requires": { "string-width": "^2.0.0" } }, "ansi-regex": { "version": "2.1.1", "bundled": true, "dev": true }, "ansi-styles": { "version": "3.2.1", "bundled": true, "dev": true, "requires": { "color-convert": "^1.9.0" } }, "ansicolors": { "version": "0.3.2", "bundled": true, "dev": true }, "ansistyles": { "version": "0.1.3", "bundled": true, "dev": true }, "aproba": { "version": "1.2.0", "bundled": true, "dev": true }, "archy": { "version": "1.0.0", "bundled": true, "dev": true }, "are-we-there-yet": { "version": "1.1.4", "bundled": true, "dev": true, "requires": { "delegates": "^1.0.0", "readable-stream": "^2.0.6" } }, "asap": { "version": "2.0.6", "bundled": true, "dev": true }, "asn1": { "version": "0.2.4", "bundled": true, "dev": true, "requires": { "safer-buffer": "~2.1.0" } }, "assert-plus": { "version": "1.0.0", "bundled": true, "dev": true }, "asynckit": { "version": "0.4.0", "bundled": true, "dev": true }, "aws-sign2": { "version": "0.7.0", "bundled": true, "dev": true }, "aws4": { "version": "1.8.0", "bundled": true, "dev": true }, "balanced-match": { "version": "1.0.0", "bundled": true, "dev": true }, "bcrypt-pbkdf": { "version": "1.0.2", "bundled": true, "dev": true, "optional": true, "requires": { "tweetnacl": "^0.14.3" } }, "bin-links": { "version": "1.1.2", "bundled": true, "dev": true, "requires": { "bluebird": "^3.5.0", "cmd-shim": "^2.0.2", "gentle-fs": "^2.0.0", "graceful-fs": "^4.1.11", "write-file-atomic": "^2.3.0" } }, "block-stream": { "version": "0.0.9", "bundled": true, "dev": true, "requires": { "inherits": "~2.0.0" } }, "bluebird": { "version": "3.5.1", "bundled": true, "dev": true }, "boxen": { "version": "1.3.0", "bundled": true, "dev": true, "requires": { "ansi-align": "^2.0.0", "camelcase": "^4.0.0", "chalk": "^2.0.1", "cli-boxes": "^1.0.0", "string-width": "^2.0.0", "term-size": "^1.2.0", "widest-line": "^2.0.0" } }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "buffer-from": { "version": "1.0.0", "bundled": true, "dev": true }, "builtin-modules": { "version": "1.1.1", "bundled": true, "dev": true }, "builtins": { "version": "1.0.3", "bundled": true, "dev": true }, "byline": { "version": "5.0.0", "bundled": true, "dev": true }, "byte-size": { "version": "4.0.3", "bundled": true, "dev": true }, "cacache": { "version": "11.2.0", "bundled": true, "dev": true, "requires": { "bluebird": "^3.5.1", "chownr": "^1.0.1", "figgy-pudding": "^3.1.0", "glob": "^7.1.2", "graceful-fs": "^4.1.11", "lru-cache": "^4.1.3", "mississippi": "^3.0.0", "mkdirp": "^0.5.1", "move-concurrently": "^1.0.1", "promise-inflight": "^1.0.1", "rimraf": "^2.6.2", "ssri": "^6.0.0", "unique-filename": "^1.1.0", "y18n": "^4.0.0" } }, "call-limit": { "version": "1.1.0", "bundled": true, "dev": true }, "camelcase": { "version": "4.1.0", "bundled": true, "dev": true }, "capture-stack-trace": { "version": "1.0.0", "bundled": true, "dev": true }, "caseless": { "version": "0.12.0", "bundled": true, "dev": true }, "chalk": { "version": "2.4.1", "bundled": true, "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "chownr": { "version": "1.0.1", "bundled": true, "dev": true }, "ci-info": { "version": "1.4.0", "bundled": true, "dev": true }, "cidr-regex": { "version": "2.0.9", "bundled": true, "dev": true, "requires": { "ip-regex": "^2.1.0" } }, "cli-boxes": { "version": "1.0.0", "bundled": true, "dev": true }, "cli-columns": { "version": "3.1.2", "bundled": true, "dev": true, "requires": { "string-width": "^2.0.0", "strip-ansi": "^3.0.1" } }, "cli-table3": { "version": "0.5.0", "bundled": true, "dev": true, "requires": { "colors": "^1.1.2", "object-assign": "^4.1.0", "string-width": "^2.1.1" } }, "cliui": { "version": "4.1.0", "bundled": true, "dev": true, "requires": { "string-width": "^2.1.1", "strip-ansi": "^4.0.0", "wrap-ansi": "^2.0.0" }, "dependencies": { "ansi-regex": { "version": "3.0.0", "bundled": true, "dev": true }, "strip-ansi": { "version": "4.0.0", "bundled": true, "dev": true, "requires": { "ansi-regex": "^3.0.0" } } } }, "clone": { "version": "1.0.4", "bundled": true, "dev": true }, "cmd-shim": { "version": "2.0.2", "bundled": true, "dev": true, "requires": { "graceful-fs": "^4.1.2", "mkdirp": "~0.5.0" } }, "co": { "version": "4.6.0", "bundled": true, "dev": true }, "code-point-at": { "version": "1.1.0", "bundled": true, "dev": true }, "color-convert": { "version": "1.9.1", "bundled": true, "dev": true, "requires": { "color-name": "^1.1.1" } }, "color-name": { "version": "1.1.3", "bundled": true, "dev": true }, "colors": { "version": "1.1.2", "bundled": true, "dev": true, "optional": true }, "columnify": { "version": "1.5.4", "bundled": true, "dev": true, "requires": { "strip-ansi": "^3.0.0", "wcwidth": "^1.0.0" } }, "combined-stream": { "version": "1.0.6", "bundled": true, "dev": true, "requires": { "delayed-stream": "~1.0.0" } }, "concat-map": { "version": "0.0.1", "bundled": true, "dev": true }, "concat-stream": { "version": "1.6.2", "bundled": true, "dev": true, "requires": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^2.2.2", "typedarray": "^0.0.6" } }, "config-chain": { "version": "1.1.11", "bundled": true, "dev": true, "requires": { "ini": "^1.3.4", "proto-list": "~1.2.1" } }, "configstore": { "version": "3.1.2", "bundled": true, "dev": true, "requires": { "dot-prop": "^4.1.0", "graceful-fs": "^4.1.2", "make-dir": "^1.0.0", "unique-string": "^1.0.0", "write-file-atomic": "^2.0.0", "xdg-basedir": "^3.0.0" } }, "console-control-strings": { "version": "1.1.0", "bundled": true, "dev": true }, "copy-concurrently": { "version": "1.0.5", "bundled": true, "dev": true, "requires": { "aproba": "^1.1.1", "fs-write-stream-atomic": "^1.0.8", "iferr": "^0.1.5", "mkdirp": "^0.5.1", "rimraf": "^2.5.4", "run-queue": "^1.0.0" }, "dependencies": { "iferr": { "version": "0.1.5", "bundled": true, "dev": true } } }, "core-util-is": { "version": "1.0.2", "bundled": true, "dev": true }, "create-error-class": { "version": "3.0.2", "bundled": true, "dev": true, "requires": { "capture-stack-trace": "^1.0.0" } }, "cross-spawn": { "version": "5.1.0", "bundled": true, "dev": true, "requires": { "lru-cache": "^4.0.1", "shebang-command": "^1.2.0", "which": "^1.2.9" } }, "crypto-random-string": { "version": "1.0.0", "bundled": true, "dev": true }, "cyclist": { "version": "0.2.2", "bundled": true, "dev": true }, "dashdash": { "version": "1.14.1", "bundled": true, "dev": true, "requires": { "assert-plus": "^1.0.0" } }, "debug": { "version": "3.1.0", "bundled": true, "dev": true, "requires": { "ms": "2.0.0" }, "dependencies": { "ms": { "version": "2.0.0", "bundled": true, "dev": true } } }, "debuglog": { "version": "1.0.1", "bundled": true, "dev": true }, "decamelize": { "version": "1.2.0", "bundled": true, "dev": true }, "decode-uri-component": { "version": "0.2.0", "bundled": true, "dev": true }, "deep-extend": { "version": "0.5.1", "bundled": true, "dev": true }, "defaults": { "version": "1.0.3", "bundled": true, "dev": true, "requires": { "clone": "^1.0.2" } }, "delayed-stream": { "version": "1.0.0", "bundled": true, "dev": true }, "delegates": { "version": "1.0.0", "bundled": true, "dev": true }, "detect-indent": { "version": "5.0.0", "bundled": true, "dev": true }, "detect-newline": { "version": "2.1.0", "bundled": true, "dev": true }, "dezalgo": { "version": "1.0.3", "bundled": true, "dev": true, "requires": { "asap": "^2.0.0", "wrappy": "1" } }, "dot-prop": { "version": "4.2.0", "bundled": true, "dev": true, "requires": { "is-obj": "^1.0.0" } }, "dotenv": { "version": "5.0.1", "bundled": true, "dev": true }, "duplexer3": { "version": "0.1.4", "bundled": true, "dev": true }, "duplexify": { "version": "3.6.0", "bundled": true, "dev": true, "requires": { "end-of-stream": "^1.0.0", "inherits": "^2.0.1", "readable-stream": "^2.0.0", "stream-shift": "^1.0.0" } }, "ecc-jsbn": { "version": "0.1.2", "bundled": true, "dev": true, "optional": true, "requires": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" } }, "editor": { "version": "1.0.0", "bundled": true, "dev": true }, "encoding": { "version": "0.1.12", "bundled": true, "dev": true, "requires": { "iconv-lite": "~0.4.13" } }, "end-of-stream": { "version": "1.4.1", "bundled": true, "dev": true, "requires": { "once": "^1.4.0" } }, "err-code": { "version": "1.1.2", "bundled": true, "dev": true }, "errno": { "version": "0.1.7", "bundled": true, "dev": true, "requires": { "prr": "~1.0.1" } }, "es6-promise": { "version": "4.2.4", "bundled": true, "dev": true }, "es6-promisify": { "version": "5.0.0", "bundled": true, "dev": true, "requires": { "es6-promise": "^4.0.3" } }, "escape-string-regexp": { "version": "1.0.5", "bundled": true, "dev": true }, "execa": { "version": "0.7.0", "bundled": true, "dev": true, "requires": { "cross-spawn": "^5.0.1", "get-stream": "^3.0.0", "is-stream": "^1.1.0", "npm-run-path": "^2.0.0", "p-finally": "^1.0.0", "signal-exit": "^3.0.0", "strip-eof": "^1.0.0" } }, "extend": { "version": "3.0.2", "bundled": true, "dev": true }, "extsprintf": { "version": "1.3.0", "bundled": true, "dev": true }, "fast-deep-equal": { "version": "1.1.0", "bundled": true, "dev": true }, "fast-json-stable-stringify": { "version": "2.0.0", "bundled": true, "dev": true }, "figgy-pudding": { "version": "3.4.1", "bundled": true, "dev": true }, "find-npm-prefix": { "version": "1.0.2", "bundled": true, "dev": true }, "find-up": { "version": "2.1.0", "bundled": true, "dev": true, "requires": { "locate-path": "^2.0.0" } }, "flush-write-stream": { "version": "1.0.3", "bundled": true, "dev": true, "requires": { "inherits": "^2.0.1", "readable-stream": "^2.0.4" } }, "forever-agent": { "version": "0.6.1", "bundled": true, "dev": true }, "form-data": { "version": "2.3.2", "bundled": true, "dev": true, "requires": { "asynckit": "^0.4.0", "combined-stream": "1.0.6", "mime-types": "^2.1.12" } }, "from2": { "version": "2.3.0", "bundled": true, "dev": true, "requires": { "inherits": "^2.0.1", "readable-stream": "^2.0.0" } }, "fs-minipass": { "version": "1.2.5", "bundled": true, "dev": true, "requires": { "minipass": "^2.2.1" } }, "fs-vacuum": { "version": "1.2.10", "bundled": true, "dev": true, "requires": { "graceful-fs": "^4.1.2", "path-is-inside": "^1.0.1", "rimraf": "^2.5.2" } }, "fs-write-stream-atomic": { "version": "1.0.10", "bundled": true, "dev": true, "requires": { "graceful-fs": "^4.1.2", "iferr": "^0.1.5", "imurmurhash": "^0.1.4", "readable-stream": "1 || 2" }, "dependencies": { "iferr": { "version": "0.1.5", "bundled": true, "dev": true } } }, "fs.realpath": { "version": "1.0.0", "bundled": true, "dev": true }, "fstream": { "version": "1.0.11", "bundled": true, "dev": true, "requires": { "graceful-fs": "^4.1.2", "inherits": "~2.0.0", "mkdirp": ">=0.5 0", "rimraf": "2" } }, "gauge": { "version": "2.7.4", "bundled": true, "dev": true, "requires": { "aproba": "^1.0.3", "console-control-strings": "^1.0.0", "has-unicode": "^2.0.0", "object-assign": "^4.1.0", "signal-exit": "^3.0.0", "string-width": "^1.0.1", "strip-ansi": "^3.0.1", "wide-align": "^1.1.0" }, "dependencies": { "string-width": { "version": "1.0.2", "bundled": true, "dev": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", "strip-ansi": "^3.0.0" } } } }, "genfun": { "version": "4.0.1", "bundled": true, "dev": true }, "gentle-fs": { "version": "2.0.1", "bundled": true, "dev": true, "requires": { "aproba": "^1.1.2", "fs-vacuum": "^1.2.10", "graceful-fs": "^4.1.11", "iferr": "^0.1.5", "mkdirp": "^0.5.1", "path-is-inside": "^1.0.2", "read-cmd-shim": "^1.0.1", "slide": "^1.1.6" }, "dependencies": { "iferr": { "version": "0.1.5", "bundled": true, "dev": true } } }, "get-caller-file": { "version": "1.0.2", "bundled": true, "dev": true }, "get-stream": { "version": "3.0.0", "bundled": true, "dev": true }, "getpass": { "version": "0.1.7", "bundled": true, "dev": true, "requires": { "assert-plus": "^1.0.0" } }, "glob": { "version": "7.1.2", "bundled": true, "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "global-dirs": { "version": "0.1.1", "bundled": true, "dev": true, "requires": { "ini": "^1.3.4" } }, "got": { "version": "6.7.1", "bundled": true, "dev": true, "requires": { "create-error-class": "^3.0.0", "duplexer3": "^0.1.4", "get-stream": "^3.0.0", "is-redirect": "^1.0.0", "is-retry-allowed": "^1.0.0", "is-stream": "^1.0.0", "lowercase-keys": "^1.0.0", "safe-buffer": "^5.0.1", "timed-out": "^4.0.0", "unzip-response": "^2.0.1", "url-parse-lax": "^1.0.0" } }, "graceful-fs": { "version": "4.1.11", "bundled": true, "dev": true }, "har-schema": { "version": "2.0.0", "bundled": true, "dev": true }, "har-validator": { "version": "5.1.0", "bundled": true, "dev": true, "requires": { "ajv": "^5.3.0", "har-schema": "^2.0.0" } }, "has-flag": { "version": "3.0.0", "bundled": true, "dev": true }, "has-unicode": { "version": "2.0.1", "bundled": true, "dev": true }, "hosted-git-info": { "version": "2.7.1", "bundled": true, "dev": true }, "http-cache-semantics": { "version": "3.8.1", "bundled": true, "dev": true }, "http-proxy-agent": { "version": "2.1.0", "bundled": true, "dev": true, "requires": { "agent-base": "4", "debug": "3.1.0" } }, "http-signature": { "version": "1.2.0", "bundled": true, "dev": true, "requires": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", "sshpk": "^1.7.0" } }, "https-proxy-agent": { "version": "2.2.1", "bundled": true, "dev": true, "requires": { "agent-base": "^4.1.0", "debug": "^3.1.0" } }, "humanize-ms": { "version": "1.2.1", "bundled": true, "dev": true, "requires": { "ms": "^2.0.0" } }, "iconv-lite": { "version": "0.4.23", "bundled": true, "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" } }, "iferr": { "version": "1.0.2", "bundled": true, "dev": true }, "ignore-walk": { "version": "3.0.1", "bundled": true, "dev": true, "requires": { "minimatch": "^3.0.4" } }, "import-lazy": { "version": "2.1.0", "bundled": true, "dev": true }, "imurmurhash": { "version": "0.1.4", "bundled": true, "dev": true }, "inflight": { "version": "1.0.6", "bundled": true, "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" } }, "inherits": { "version": "2.0.3", "bundled": true, "dev": true }, "ini": { "version": "1.3.5", "bundled": true, "dev": true }, "init-package-json": { "version": "1.10.3", "bundled": true, "dev": true, "requires": { "glob": "^7.1.1", "npm-package-arg": "^4.0.0 || ^5.0.0 || ^6.0.0", "promzard": "^0.3.0", "read": "~1.0.1", "read-package-json": "1 || 2", "semver": "2.x || 3.x || 4 || 5", "validate-npm-package-license": "^3.0.1", "validate-npm-package-name": "^3.0.0" } }, "invert-kv": { "version": "1.0.0", "bundled": true, "dev": true }, "ip": { "version": "1.1.5", "bundled": true, "dev": true }, "ip-regex": { "version": "2.1.0", "bundled": true, "dev": true }, "is-builtin-module": { "version": "1.0.0", "bundled": true, "dev": true, "requires": { "builtin-modules": "^1.0.0" } }, "is-ci": { "version": "1.1.0", "bundled": true, "dev": true, "requires": { "ci-info": "^1.0.0" } }, "is-cidr": { "version": "2.0.6", "bundled": true, "dev": true, "requires": { "cidr-regex": "^2.0.8" } }, "is-fullwidth-code-point": { "version": "1.0.0", "bundled": true, "dev": true, "requires": { "number-is-nan": "^1.0.0" } }, "is-installed-globally": { "version": "0.1.0", "bundled": true, "dev": true, "requires": { "global-dirs": "^0.1.0", "is-path-inside": "^1.0.0" } }, "is-npm": { "version": "1.0.0", "bundled": true, "dev": true }, "is-obj": { "version": "1.0.1", "bundled": true, "dev": true }, "is-path-inside": { "version": "1.0.1", "bundled": true, "dev": true, "requires": { "path-is-inside": "^1.0.1" } }, "is-redirect": { "version": "1.0.0", "bundled": true, "dev": true }, "is-retry-allowed": { "version": "1.1.0", "bundled": true, "dev": true }, "is-stream": { "version": "1.1.0", "bundled": true, "dev": true }, "is-typedarray": { "version": "1.0.0", "bundled": true, "dev": true }, "isarray": { "version": "1.0.0", "bundled": true, "dev": true }, "isexe": { "version": "2.0.0", "bundled": true, "dev": true }, "isstream": { "version": "0.1.2", "bundled": true, "dev": true }, "jsbn": { "version": "0.1.1", "bundled": true, "dev": true, "optional": true }, "json-parse-better-errors": { "version": "1.0.2", "bundled": true, "dev": true }, "json-schema": { "version": "0.2.3", "bundled": true, "dev": true }, "json-schema-traverse": { "version": "0.3.1", "bundled": true, "dev": true }, "json-stringify-safe": { "version": "5.0.1", "bundled": true, "dev": true }, "jsonparse": { "version": "1.3.1", "bundled": true, "dev": true }, "jsprim": { "version": "1.4.1", "bundled": true, "dev": true, "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", "json-schema": "0.2.3", "verror": "1.10.0" } }, "latest-version": { "version": "3.1.0", "bundled": true, "dev": true, "requires": { "package-json": "^4.0.0" } }, "lazy-property": { "version": "1.0.0", "bundled": true, "dev": true }, "lcid": { "version": "1.0.0", "bundled": true, "dev": true, "requires": { "invert-kv": "^1.0.0" } }, "libcipm": { "version": "2.0.2", "bundled": true, "dev": true, "requires": { "bin-links": "^1.1.2", "bluebird": "^3.5.1", "find-npm-prefix": "^1.0.2", "graceful-fs": "^4.1.11", "lock-verify": "^2.0.2", "mkdirp": "^0.5.1", "npm-lifecycle": "^2.0.3", "npm-logical-tree": "^1.2.1", "npm-package-arg": "^6.1.0", "pacote": "^8.1.6", "protoduck": "^5.0.0", "read-package-json": "^2.0.13", "rimraf": "^2.6.2", "worker-farm": "^1.6.0" } }, "libnpmhook": { "version": "4.0.1", "bundled": true, "dev": true, "requires": { "figgy-pudding": "^3.1.0", "npm-registry-fetch": "^3.0.0" }, "dependencies": { "npm-registry-fetch": { "version": "3.1.1", "bundled": true, "dev": true, "requires": { "bluebird": "^3.5.1", "figgy-pudding": "^3.1.0", "lru-cache": "^4.1.2", "make-fetch-happen": "^4.0.0", "npm-package-arg": "^6.0.0" } } } }, "libnpx": { "version": "10.2.0", "bundled": true, "dev": true, "requires": { "dotenv": "^5.0.1", "npm-package-arg": "^6.0.0", "rimraf": "^2.6.2", "safe-buffer": "^5.1.0", "update-notifier": "^2.3.0", "which": "^1.3.0", "y18n": "^4.0.0", "yargs": "^11.0.0" } }, "locate-path": { "version": "2.0.0", "bundled": true, "dev": true, "requires": { "p-locate": "^2.0.0", "path-exists": "^3.0.0" } }, "lock-verify": { "version": "2.0.2", "bundled": true, "dev": true, "requires": { "npm-package-arg": "^5.1.2 || 6", "semver": "^5.4.1" } }, "lockfile": { "version": "1.0.4", "bundled": true, "dev": true, "requires": { "signal-exit": "^3.0.2" } }, "lodash._baseindexof": { "version": "3.1.0", "bundled": true, "dev": true }, "lodash._baseuniq": { "version": "4.6.0", "bundled": true, "dev": true, "requires": { "lodash._createset": "~4.0.0", "lodash._root": "~3.0.0" } }, "lodash._bindcallback": { "version": "3.0.1", "bundled": true, "dev": true }, "lodash._cacheindexof": { "version": "3.0.2", "bundled": true, "dev": true }, "lodash._createcache": { "version": "3.1.2", "bundled": true, "dev": true, "requires": { "lodash._getnative": "^3.0.0" } }, "lodash._createset": { "version": "4.0.3", "bundled": true, "dev": true }, "lodash._getnative": { "version": "3.9.1", "bundled": true, "dev": true }, "lodash._root": { "version": "3.0.1", "bundled": true, "dev": true }, "lodash.clonedeep": { "version": "4.5.0", "bundled": true, "dev": true }, "lodash.restparam": { "version": "3.6.1", "bundled": true, "dev": true }, "lodash.union": { "version": "4.6.0", "bundled": true, "dev": true }, "lodash.uniq": { "version": "4.5.0", "bundled": true, "dev": true }, "lodash.without": { "version": "4.4.0", "bundled": true, "dev": true }, "lowercase-keys": { "version": "1.0.1", "bundled": true, "dev": true }, "lru-cache": { "version": "4.1.3", "bundled": true, "dev": true, "requires": { "pseudomap": "^1.0.2", "yallist": "^2.1.2" } }, "make-dir": { "version": "1.3.0", "bundled": true, "dev": true, "requires": { "pify": "^3.0.0" } }, "make-fetch-happen": { "version": "4.0.1", "bundled": true, "dev": true, "requires": { "agentkeepalive": "^3.4.1", "cacache": "^11.0.1", "http-cache-semantics": "^3.8.1", "http-proxy-agent": "^2.1.0", "https-proxy-agent": "^2.2.1", "lru-cache": "^4.1.2", "mississippi": "^3.0.0", "node-fetch-npm": "^2.0.2", "promise-retry": "^1.1.1", "socks-proxy-agent": "^4.0.0", "ssri": "^6.0.0" } }, "meant": { "version": "1.0.1", "bundled": true, "dev": true }, "mem": { "version": "1.1.0", "bundled": true, "dev": true, "requires": { "mimic-fn": "^1.0.0" } }, "mime-db": { "version": "1.35.0", "bundled": true, "dev": true }, "mime-types": { "version": "2.1.19", "bundled": true, "dev": true, "requires": { "mime-db": "~1.35.0" } }, "mimic-fn": { "version": "1.2.0", "bundled": true, "dev": true }, "minimatch": { "version": "3.0.4", "bundled": true, "dev": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { "version": "0.0.8", "bundled": true, "dev": true }, "minipass": { "version": "2.3.3", "bundled": true, "dev": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" }, "dependencies": { "yallist": { "version": "3.0.2", "bundled": true, "dev": true } } }, "minizlib": { "version": "1.1.0", "bundled": true, "dev": true, "requires": { "minipass": "^2.2.1" } }, "mississippi": { "version": "3.0.0", "bundled": true, "dev": true, "requires": { "concat-stream": "^1.5.0", "duplexify": "^3.4.2", "end-of-stream": "^1.1.0", "flush-write-stream": "^1.0.0", "from2": "^2.1.0", "parallel-transform": "^1.1.0", "pump": "^3.0.0", "pumpify": "^1.3.3", "stream-each": "^1.1.0", "through2": "^2.0.0" } }, "mkdirp": { "version": "0.5.1", "bundled": true, "dev": true, "requires": { "minimist": "0.0.8" } }, "move-concurrently": { "version": "1.0.1", "bundled": true, "dev": true, "requires": { "aproba": "^1.1.1", "copy-concurrently": "^1.0.0", "fs-write-stream-atomic": "^1.0.8", "mkdirp": "^0.5.1", "rimraf": "^2.5.4", "run-queue": "^1.0.3" } }, "ms": { "version": "2.1.1", "bundled": true, "dev": true }, "mute-stream": { "version": "0.0.7", "bundled": true, "dev": true }, "node-fetch-npm": { "version": "2.0.2", "bundled": true, "dev": true, "requires": { "encoding": "^0.1.11", "json-parse-better-errors": "^1.0.0", "safe-buffer": "^5.1.1" } }, "node-gyp": { "version": "3.8.0", "bundled": true, "dev": true, "requires": { "fstream": "^1.0.0", "glob": "^7.0.3", "graceful-fs": "^4.1.2", "mkdirp": "^0.5.0", "nopt": "2 || 3", "npmlog": "0 || 1 || 2 || 3 || 4", "osenv": "0", "request": "^2.87.0", "rimraf": "2", "semver": "~5.3.0", "tar": "^2.0.0", "which": "1" }, "dependencies": { "nopt": { "version": "3.0.6", "bundled": true, "dev": true, "requires": { "abbrev": "1" } }, "semver": { "version": "5.3.0", "bundled": true, "dev": true }, "tar": { "version": "2.2.1", "bundled": true, "dev": true, "requires": { "block-stream": "*", "fstream": "^1.0.2", "inherits": "2" } } } }, "nopt": { "version": "4.0.1", "bundled": true, "dev": true, "requires": { "abbrev": "1", "osenv": "^0.1.4" } }, "normalize-package-data": { "version": "2.4.0", "bundled": true, "dev": true, "requires": { "hosted-git-info": "^2.1.4", "is-builtin-module": "^1.0.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" } }, "npm-audit-report": { "version": "1.3.1", "bundled": true, "dev": true, "requires": { "cli-table3": "^0.5.0", "console-control-strings": "^1.1.0" } }, "npm-bundled": { "version": "1.0.5", "bundled": true, "dev": true }, "npm-cache-filename": { "version": "1.0.2", "bundled": true, "dev": true }, "npm-install-checks": { "version": "3.0.0", "bundled": true, "dev": true, "requires": { "semver": "^2.3.0 || 3.x || 4 || 5" } }, "npm-lifecycle": { "version": "2.1.0", "bundled": true, "dev": true, "requires": { "byline": "^5.0.0", "graceful-fs": "^4.1.11", "node-gyp": "^3.8.0", "resolve-from": "^4.0.0", "slide": "^1.1.6", "uid-number": "0.0.6", "umask": "^1.1.0", "which": "^1.3.1" } }, "npm-logical-tree": { "version": "1.2.1", "bundled": true, "dev": true }, "npm-package-arg": { "version": "6.1.0", "bundled": true, "dev": true, "requires": { "hosted-git-info": "^2.6.0", "osenv": "^0.1.5", "semver": "^5.5.0", "validate-npm-package-name": "^3.0.0" } }, "npm-packlist": { "version": "1.1.11", "bundled": true, "dev": true, "requires": { "ignore-walk": "^3.0.1", "npm-bundled": "^1.0.1" } }, "npm-pick-manifest": { "version": "2.1.0", "bundled": true, "dev": true, "requires": { "npm-package-arg": "^6.0.0", "semver": "^5.4.1" } }, "npm-profile": { "version": "3.0.2", "bundled": true, "dev": true, "requires": { "aproba": "^1.1.2 || 2", "make-fetch-happen": "^2.5.0 || 3 || 4" } }, "npm-registry-client": { "version": "8.6.0", "bundled": true, "dev": true, "requires": { "concat-stream": "^1.5.2", "graceful-fs": "^4.1.6", "normalize-package-data": "~1.0.1 || ^2.0.0", "npm-package-arg": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0", "npmlog": "2 || ^3.1.0 || ^4.0.0", "once": "^1.3.3", "request": "^2.74.0", "retry": "^0.10.0", "safe-buffer": "^5.1.1", "semver": "2 >=2.2.1 || 3.x || 4 || 5", "slide": "^1.1.3", "ssri": "^5.2.4" }, "dependencies": { "retry": { "version": "0.10.1", "bundled": true, "dev": true }, "ssri": { "version": "5.3.0", "bundled": true, "dev": true, "requires": { "safe-buffer": "^5.1.1" } } } }, "npm-registry-fetch": { "version": "1.1.0", "bundled": true, "dev": true, "requires": { "bluebird": "^3.5.1", "figgy-pudding": "^2.0.1", "lru-cache": "^4.1.2", "make-fetch-happen": "^3.0.0", "npm-package-arg": "^6.0.0", "safe-buffer": "^5.1.1" }, "dependencies": { "cacache": { "version": "10.0.4", "bundled": true, "dev": true, "requires": { "bluebird": "^3.5.1", "chownr": "^1.0.1", "glob": "^7.1.2", "graceful-fs": "^4.1.11", "lru-cache": "^4.1.1", "mississippi": "^2.0.0", "mkdirp": "^0.5.1", "move-concurrently": "^1.0.1", "promise-inflight": "^1.0.1", "rimraf": "^2.6.2", "ssri": "^5.2.4", "unique-filename": "^1.1.0", "y18n": "^4.0.0" }, "dependencies": { "mississippi": { "version": "2.0.0", "bundled": true, "dev": true, "requires": { "concat-stream": "^1.5.0", "duplexify": "^3.4.2", "end-of-stream": "^1.1.0", "flush-write-stream": "^1.0.0", "from2": "^2.1.0", "parallel-transform": "^1.1.0", "pump": "^2.0.1", "pumpify": "^1.3.3", "stream-each": "^1.1.0", "through2": "^2.0.0" } } } }, "figgy-pudding": { "version": "2.0.1", "bundled": true, "dev": true }, "make-fetch-happen": { "version": "3.0.0", "bundled": true, "dev": true, "requires": { "agentkeepalive": "^3.4.1", "cacache": "^10.0.4", "http-cache-semantics": "^3.8.1", "http-proxy-agent": "^2.1.0", "https-proxy-agent": "^2.2.0", "lru-cache": "^4.1.2", "mississippi": "^3.0.0", "node-fetch-npm": "^2.0.2", "promise-retry": "^1.1.1", "socks-proxy-agent": "^3.0.1", "ssri": "^5.2.4" } }, "pump": { "version": "2.0.1", "bundled": true, "dev": true, "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "smart-buffer": { "version": "1.1.15", "bundled": true, "dev": true }, "socks": { "version": "1.1.10", "bundled": true, "dev": true, "requires": { "ip": "^1.1.4", "smart-buffer": "^1.0.13" } }, "socks-proxy-agent": { "version": "3.0.1", "bundled": true, "dev": true, "requires": { "agent-base": "^4.1.0", "socks": "^1.1.10" } }, "ssri": { "version": "5.3.0", "bundled": true, "dev": true, "requires": { "safe-buffer": "^5.1.1" } } } }, "npm-run-path": { "version": "2.0.2", "bundled": true, "dev": true, "requires": { "path-key": "^2.0.0" } }, "npm-user-validate": { "version": "1.0.0", "bundled": true, "dev": true }, "npmlog": { "version": "4.1.2", "bundled": true, "dev": true, "requires": { "are-we-there-yet": "~1.1.2", "console-control-strings": "~1.1.0", "gauge": "~2.7.3", "set-blocking": "~2.0.0" } }, "number-is-nan": { "version": "1.0.1", "bundled": true, "dev": true }, "oauth-sign": { "version": "0.9.0", "bundled": true, "dev": true }, "object-assign": { "version": "4.1.1", "bundled": true, "dev": true }, "once": { "version": "1.4.0", "bundled": true, "dev": true, "requires": { "wrappy": "1" } }, "opener": { "version": "1.5.0", "bundled": true, "dev": true }, "os-homedir": { "version": "1.0.2", "bundled": true, "dev": true }, "os-locale": { "version": "2.1.0", "bundled": true, "dev": true, "requires": { "execa": "^0.7.0", "lcid": "^1.0.0", "mem": "^1.1.0" } }, "os-tmpdir": { "version": "1.0.2", "bundled": true, "dev": true }, "osenv": { "version": "0.1.5", "bundled": true, "dev": true, "requires": { "os-homedir": "^1.0.0", "os-tmpdir": "^1.0.0" } }, "p-finally": { "version": "1.0.0", "bundled": true, "dev": true }, "p-limit": { "version": "1.2.0", "bundled": true, "dev": true, "requires": { "p-try": "^1.0.0" } }, "p-locate": { "version": "2.0.0", "bundled": true, "dev": true, "requires": { "p-limit": "^1.1.0" } }, "p-try": { "version": "1.0.0", "bundled": true, "dev": true }, "package-json": { "version": "4.0.1", "bundled": true, "dev": true, "requires": { "got": "^6.7.1", "registry-auth-token": "^3.0.1", "registry-url": "^3.0.3", "semver": "^5.1.0" } }, "pacote": { "version": "8.1.6", "bundled": true, "dev": true, "requires": { "bluebird": "^3.5.1", "cacache": "^11.0.2", "get-stream": "^3.0.0", "glob": "^7.1.2", "lru-cache": "^4.1.3", "make-fetch-happen": "^4.0.1", "minimatch": "^3.0.4", "minipass": "^2.3.3", "mississippi": "^3.0.0", "mkdirp": "^0.5.1", "normalize-package-data": "^2.4.0", "npm-package-arg": "^6.1.0", "npm-packlist": "^1.1.10", "npm-pick-manifest": "^2.1.0", "osenv": "^0.1.5", "promise-inflight": "^1.0.1", "promise-retry": "^1.1.1", "protoduck": "^5.0.0", "rimraf": "^2.6.2", "safe-buffer": "^5.1.2", "semver": "^5.5.0", "ssri": "^6.0.0", "tar": "^4.4.3", "unique-filename": "^1.1.0", "which": "^1.3.0" } }, "parallel-transform": { "version": "1.1.0", "bundled": true, "dev": true, "requires": { "cyclist": "~0.2.2", "inherits": "^2.0.3", "readable-stream": "^2.1.5" } }, "path-exists": { "version": "3.0.0", "bundled": true, "dev": true }, "path-is-absolute": { "version": "1.0.1", "bundled": true, "dev": true }, "path-is-inside": { "version": "1.0.2", "bundled": true, "dev": true }, "path-key": { "version": "2.0.1", "bundled": true, "dev": true }, "performance-now": { "version": "2.1.0", "bundled": true, "dev": true }, "pify": { "version": "3.0.0", "bundled": true, "dev": true }, "prepend-http": { "version": "1.0.4", "bundled": true, "dev": true }, "process-nextick-args": { "version": "2.0.0", "bundled": true, "dev": true }, "promise-inflight": { "version": "1.0.1", "bundled": true, "dev": true }, "promise-retry": { "version": "1.1.1", "bundled": true, "dev": true, "requires": { "err-code": "^1.0.0", "retry": "^0.10.0" }, "dependencies": { "retry": { "version": "0.10.1", "bundled": true, "dev": true } } }, "promzard": { "version": "0.3.0", "bundled": true, "dev": true, "requires": { "read": "1" } }, "proto-list": { "version": "1.2.4", "bundled": true, "dev": true }, "protoduck": { "version": "5.0.0", "bundled": true, "dev": true, "requires": { "genfun": "^4.0.1" } }, "prr": { "version": "1.0.1", "bundled": true, "dev": true }, "pseudomap": { "version": "1.0.2", "bundled": true, "dev": true }, "psl": { "version": "1.1.29", "bundled": true, "dev": true }, "pump": { "version": "3.0.0", "bundled": true, "dev": true, "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "pumpify": { "version": "1.5.1", "bundled": true, "dev": true, "requires": { "duplexify": "^3.6.0", "inherits": "^2.0.3", "pump": "^2.0.0" }, "dependencies": { "pump": { "version": "2.0.1", "bundled": true, "dev": true, "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } } } }, "punycode": { "version": "1.4.1", "bundled": true, "dev": true }, "qrcode-terminal": { "version": "0.12.0", "bundled": true, "dev": true }, "qs": { "version": "6.5.2", "bundled": true, "dev": true }, "query-string": { "version": "6.1.0", "bundled": true, "dev": true, "requires": { "decode-uri-component": "^0.2.0", "strict-uri-encode": "^2.0.0" } }, "qw": { "version": "1.0.1", "bundled": true, "dev": true }, "rc": { "version": "1.2.7", "bundled": true, "dev": true, "requires": { "deep-extend": "^0.5.1", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" }, "dependencies": { "minimist": { "version": "1.2.0", "bundled": true, "dev": true } } }, "read": { "version": "1.0.7", "bundled": true, "dev": true, "requires": { "mute-stream": "~0.0.4" } }, "read-cmd-shim": { "version": "1.0.1", "bundled": true, "dev": true, "requires": { "graceful-fs": "^4.1.2" } }, "read-installed": { "version": "4.0.3", "bundled": true, "dev": true, "requires": { "debuglog": "^1.0.1", "graceful-fs": "^4.1.2", "read-package-json": "^2.0.0", "readdir-scoped-modules": "^1.0.0", "semver": "2 || 3 || 4 || 5", "slide": "~1.1.3", "util-extend": "^1.0.1" } }, "read-package-json": { "version": "2.0.13", "bundled": true, "dev": true, "requires": { "glob": "^7.1.1", "graceful-fs": "^4.1.2", "json-parse-better-errors": "^1.0.1", "normalize-package-data": "^2.0.0", "slash": "^1.0.0" } }, "read-package-tree": { "version": "5.2.1", "bundled": true, "dev": true, "requires": { "debuglog": "^1.0.1", "dezalgo": "^1.0.0", "once": "^1.3.0", "read-package-json": "^2.0.0", "readdir-scoped-modules": "^1.0.0" } }, "readable-stream": { "version": "2.3.6", "bundled": true, "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "readdir-scoped-modules": { "version": "1.0.2", "bundled": true, "dev": true, "requires": { "debuglog": "^1.0.1", "dezalgo": "^1.0.0", "graceful-fs": "^4.1.2", "once": "^1.3.0" } }, "registry-auth-token": { "version": "3.3.2", "bundled": true, "dev": true, "requires": { "rc": "^1.1.6", "safe-buffer": "^5.0.1" } }, "registry-url": { "version": "3.1.0", "bundled": true, "dev": true, "requires": { "rc": "^1.0.1" } }, "request": { "version": "2.88.0", "bundled": true, "dev": true, "requires": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", "caseless": "~0.12.0", "combined-stream": "~1.0.6", "extend": "~3.0.2", "forever-agent": "~0.6.1", "form-data": "~2.3.2", "har-validator": "~5.1.0", "http-signature": "~1.2.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", "json-stringify-safe": "~5.0.1", "mime-types": "~2.1.19", "oauth-sign": "~0.9.0", "performance-now": "^2.1.0", "qs": "~6.5.2", "safe-buffer": "^5.1.2", "tough-cookie": "~2.4.3", "tunnel-agent": "^0.6.0", "uuid": "^3.3.2" } }, "require-directory": { "version": "2.1.1", "bundled": true, "dev": true }, "require-main-filename": { "version": "1.0.1", "bundled": true, "dev": true }, "resolve-from": { "version": "4.0.0", "bundled": true, "dev": true }, "retry": { "version": "0.12.0", "bundled": true, "dev": true }, "rimraf": { "version": "2.6.2", "bundled": true, "dev": true, "requires": { "glob": "^7.0.5" } }, "run-queue": { "version": "1.0.3", "bundled": true, "dev": true, "requires": { "aproba": "^1.1.1" } }, "safe-buffer": { "version": "5.1.2", "bundled": true, "dev": true }, "safer-buffer": { "version": "2.1.2", "bundled": true, "dev": true }, "semver": { "version": "5.5.0", "bundled": true, "dev": true }, "semver-diff": { "version": "2.1.0", "bundled": true, "dev": true, "requires": { "semver": "^5.0.3" } }, "set-blocking": { "version": "2.0.0", "bundled": true, "dev": true }, "sha": { "version": "2.0.1", "bundled": true, "dev": true, "requires": { "graceful-fs": "^4.1.2", "readable-stream": "^2.0.2" } }, "shebang-command": { "version": "1.2.0", "bundled": true, "dev": true, "requires": { "shebang-regex": "^1.0.0" } }, "shebang-regex": { "version": "1.0.0", "bundled": true, "dev": true }, "signal-exit": { "version": "3.0.2", "bundled": true, "dev": true }, "slash": { "version": "1.0.0", "bundled": true, "dev": true }, "slide": { "version": "1.1.6", "bundled": true, "dev": true }, "smart-buffer": { "version": "4.0.1", "bundled": true, "dev": true }, "socks": { "version": "2.2.0", "bundled": true, "dev": true, "requires": { "ip": "^1.1.5", "smart-buffer": "^4.0.1" } }, "socks-proxy-agent": { "version": "4.0.1", "bundled": true, "dev": true, "requires": { "agent-base": "~4.2.0", "socks": "~2.2.0" } }, "sorted-object": { "version": "2.0.1", "bundled": true, "dev": true }, "sorted-union-stream": { "version": "2.1.3", "bundled": true, "dev": true, "requires": { "from2": "^1.3.0", "stream-iterate": "^1.1.0" }, "dependencies": { "from2": { "version": "1.3.0", "bundled": true, "dev": true, "requires": { "inherits": "~2.0.1", "readable-stream": "~1.1.10" } }, "isarray": { "version": "0.0.1", "bundled": true, "dev": true }, "readable-stream": { "version": "1.1.14", "bundled": true, "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.1", "isarray": "0.0.1", "string_decoder": "~0.10.x" } }, "string_decoder": { "version": "0.10.31", "bundled": true, "dev": true } } }, "spdx-correct": { "version": "3.0.0", "bundled": true, "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "spdx-exceptions": { "version": "2.1.0", "bundled": true, "dev": true }, "spdx-expression-parse": { "version": "3.0.0", "bundled": true, "dev": true, "requires": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "spdx-license-ids": { "version": "3.0.0", "bundled": true, "dev": true }, "sshpk": { "version": "1.14.2", "bundled": true, "dev": true, "requires": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", "bcrypt-pbkdf": "^1.0.0", "dashdash": "^1.12.0", "ecc-jsbn": "~0.1.1", "getpass": "^0.1.1", "jsbn": "~0.1.0", "safer-buffer": "^2.0.2", "tweetnacl": "~0.14.0" } }, "ssri": { "version": "6.0.0", "bundled": true, "dev": true }, "stream-each": { "version": "1.2.2", "bundled": true, "dev": true, "requires": { "end-of-stream": "^1.1.0", "stream-shift": "^1.0.0" } }, "stream-iterate": { "version": "1.2.0", "bundled": true, "dev": true, "requires": { "readable-stream": "^2.1.5", "stream-shift": "^1.0.0" } }, "stream-shift": { "version": "1.0.0", "bundled": true, "dev": true }, "strict-uri-encode": { "version": "2.0.0", "bundled": true, "dev": true }, "string-width": { "version": "2.1.1", "bundled": true, "dev": true, "requires": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" }, "dependencies": { "ansi-regex": { "version": "3.0.0", "bundled": true, "dev": true }, "is-fullwidth-code-point": { "version": "2.0.0", "bundled": true, "dev": true }, "strip-ansi": { "version": "4.0.0", "bundled": true, "dev": true, "requires": { "ansi-regex": "^3.0.0" } } } }, "string_decoder": { "version": "1.1.1", "bundled": true, "dev": true, "requires": { "safe-buffer": "~5.1.0" } }, "stringify-package": { "version": "1.0.0", "bundled": true, "dev": true }, "strip-ansi": { "version": "3.0.1", "bundled": true, "dev": true, "requires": { "ansi-regex": "^2.0.0" } }, "strip-eof": { "version": "1.0.0", "bundled": true, "dev": true }, "strip-json-comments": { "version": "2.0.1", "bundled": true, "dev": true }, "supports-color": { "version": "5.4.0", "bundled": true, "dev": true, "requires": { "has-flag": "^3.0.0" } }, "tar": { "version": "4.4.6", "bundled": true, "dev": true, "requires": { "chownr": "^1.0.1", "fs-minipass": "^1.2.5", "minipass": "^2.3.3", "minizlib": "^1.1.0", "mkdirp": "^0.5.0", "safe-buffer": "^5.1.2", "yallist": "^3.0.2" }, "dependencies": { "yallist": { "version": "3.0.2", "bundled": true, "dev": true } } }, "term-size": { "version": "1.2.0", "bundled": true, "dev": true, "requires": { "execa": "^0.7.0" } }, "text-table": { "version": "0.2.0", "bundled": true, "dev": true }, "through": { "version": "2.3.8", "bundled": true, "dev": true }, "through2": { "version": "2.0.3", "bundled": true, "dev": true, "requires": { "readable-stream": "^2.1.5", "xtend": "~4.0.1" } }, "timed-out": { "version": "4.0.1", "bundled": true, "dev": true }, "tiny-relative-date": { "version": "1.3.0", "bundled": true, "dev": true }, "tough-cookie": { "version": "2.4.3", "bundled": true, "dev": true, "requires": { "psl": "^1.1.24", "punycode": "^1.4.1" } }, "tunnel-agent": { "version": "0.6.0", "bundled": true, "dev": true, "requires": { "safe-buffer": "^5.0.1" } }, "tweetnacl": { "version": "0.14.5", "bundled": true, "dev": true, "optional": true }, "typedarray": { "version": "0.0.6", "bundled": true, "dev": true }, "uid-number": { "version": "0.0.6", "bundled": true, "dev": true }, "umask": { "version": "1.1.0", "bundled": true, "dev": true }, "unique-filename": { "version": "1.1.0", "bundled": true, "dev": true, "requires": { "unique-slug": "^2.0.0" } }, "unique-slug": { "version": "2.0.0", "bundled": true, "dev": true, "requires": { "imurmurhash": "^0.1.4" } }, "unique-string": { "version": "1.0.0", "bundled": true, "dev": true, "requires": { "crypto-random-string": "^1.0.0" } }, "unpipe": { "version": "1.0.0", "bundled": true, "dev": true }, "unzip-response": { "version": "2.0.1", "bundled": true, "dev": true }, "update-notifier": { "version": "2.5.0", "bundled": true, "dev": true, "requires": { "boxen": "^1.2.1", "chalk": "^2.0.1", "configstore": "^3.0.0", "import-lazy": "^2.1.0", "is-ci": "^1.0.10", "is-installed-globally": "^0.1.0", "is-npm": "^1.0.0", "latest-version": "^3.0.0", "semver-diff": "^2.0.0", "xdg-basedir": "^3.0.0" } }, "url-parse-lax": { "version": "1.0.0", "bundled": true, "dev": true, "requires": { "prepend-http": "^1.0.1" } }, "util-deprecate": { "version": "1.0.2", "bundled": true, "dev": true }, "util-extend": { "version": "1.0.3", "bundled": true, "dev": true }, "uuid": { "version": "3.3.2", "bundled": true, "dev": true }, "validate-npm-package-license": { "version": "3.0.4", "bundled": true, "dev": true, "requires": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, "validate-npm-package-name": { "version": "3.0.0", "bundled": true, "dev": true, "requires": { "builtins": "^1.0.3" } }, "verror": { "version": "1.10.0", "bundled": true, "dev": true, "requires": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", "extsprintf": "^1.2.0" } }, "wcwidth": { "version": "1.0.1", "bundled": true, "dev": true, "requires": { "defaults": "^1.0.3" } }, "which": { "version": "1.3.1", "bundled": true, "dev": true, "requires": { "isexe": "^2.0.0" } }, "which-module": { "version": "2.0.0", "bundled": true, "dev": true }, "wide-align": { "version": "1.1.2", "bundled": true, "dev": true, "requires": { "string-width": "^1.0.2" }, "dependencies": { "string-width": { "version": "1.0.2", "bundled": true, "dev": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", "strip-ansi": "^3.0.0" } } } }, "widest-line": { "version": "2.0.0", "bundled": true, "dev": true, "requires": { "string-width": "^2.1.1" } }, "worker-farm": { "version": "1.6.0", "bundled": true, "dev": true, "requires": { "errno": "~0.1.7" } }, "wrap-ansi": { "version": "2.1.0", "bundled": true, "dev": true, "requires": { "string-width": "^1.0.1", "strip-ansi": "^3.0.1" }, "dependencies": { "string-width": { "version": "1.0.2", "bundled": true, "dev": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", "strip-ansi": "^3.0.0" } } } }, "wrappy": { "version": "1.0.2", "bundled": true, "dev": true }, "write-file-atomic": { "version": "2.3.0", "bundled": true, "dev": true, "requires": { "graceful-fs": "^4.1.11", "imurmurhash": "^0.1.4", "signal-exit": "^3.0.2" } }, "xdg-basedir": { "version": "3.0.0", "bundled": true, "dev": true }, "xtend": { "version": "4.0.1", "bundled": true, "dev": true }, "y18n": { "version": "4.0.0", "bundled": true, "dev": true }, "yallist": { "version": "2.1.2", "bundled": true, "dev": true }, "yargs": { "version": "11.0.0", "bundled": true, "dev": true, "requires": { "cliui": "^4.0.0", "decamelize": "^1.1.1", "find-up": "^2.1.0", "get-caller-file": "^1.0.1", "os-locale": "^2.0.0", "require-directory": "^2.1.1", "require-main-filename": "^1.0.1", "set-blocking": "^2.0.0", "string-width": "^2.0.0", "which-module": "^2.0.0", "y18n": "^3.2.1", "yargs-parser": "^9.0.2" }, "dependencies": { "y18n": { "version": "3.2.1", "bundled": true, "dev": true } } }, "yargs-parser": { "version": "9.0.2", "bundled": true, "dev": true, "requires": { "camelcase": "^4.1.0" } } } }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "dev": true, "requires": { "path-key": "^2.0.0" } }, "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, "object-copy": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", "dev": true, "requires": { "copy-descriptor": "^0.1.0", "define-property": "^0.2.5", "kind-of": "^3.0.3" }, "dependencies": { "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { "is-descriptor": "^0.1.0" } }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { "is-buffer": "^1.1.5" } } } }, "object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "dev": true, "requires": { "isobject": "^3.0.0" } }, "object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "dev": true, "requires": { "isobject": "^3.0.1" } }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { "wrappy": "1" } }, "optimist": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", "dev": true, "requires": { "minimist": "~0.0.1", "wordwrap": "~0.0.2" }, "dependencies": { "minimist": { "version": "0.0.10", "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", "dev": true } } }, "os-locale": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.0.1.tgz", "integrity": "sha512-7g5e7dmXPtzcP4bgsZ8ixDVqA7oWYuEz4lOSujeWyliPai4gfVDiFIcwBg3aGCPnmSGfzOKTK3ccPn0CKv3DBw==", "dev": true, "requires": { "execa": "^0.10.0", "lcid": "^2.0.0", "mem": "^4.0.0" }, "dependencies": { "execa": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", "dev": true, "requires": { "cross-spawn": "^6.0.0", "get-stream": "^3.0.0", "is-stream": "^1.1.0", "npm-run-path": "^2.0.0", "p-finally": "^1.0.0", "signal-exit": "^3.0.0", "strip-eof": "^1.0.0" } }, "get-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", "dev": true } } }, "os-name": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/os-name/-/os-name-2.0.1.tgz", "integrity": "sha1-uaOGNhwXrjohc27wWZQFyajF3F4=", "dev": true, "requires": { "macos-release": "^1.0.0", "win-release": "^1.0.0" } }, "p-defer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", "dev": true }, "p-filter": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-1.0.0.tgz", "integrity": "sha1-Yp0xcVAgnI/VCLoTdxPvS7kg6ds=", "dev": true, "requires": { "p-map": "^1.0.0" } }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", "dev": true }, "p-is-promise": { "version": "1.1.0", "resolved": "http://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=", "dev": true }, "p-limit": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, "requires": { "p-try": "^1.0.0" } }, "p-locate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "requires": { "p-limit": "^2.0.0" }, "dependencies": { "p-limit": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", "dev": true, "requires": { "p-try": "^2.0.0" } }, "p-try": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", "dev": true } } }, "p-map": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", "dev": true }, "p-reduce": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=", "dev": true }, "p-retry": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-2.0.0.tgz", "integrity": "sha512-ZbCuzAmiwJ45q4evp/IG9D+5MUllGSUeCWwPt3j/tdYSi1KPkSD+46uqmAA1LhccDhOXv8kYZKNb8x78VflzfA==", "dev": true, "requires": { "retry": "^0.12.0" } }, "p-try": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true }, "parse-github-url": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.2.tgz", "integrity": "sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==", "dev": true }, "parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "dev": true, "requires": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" } }, "parse-url": { "version": "1.3.11", "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-1.3.11.tgz", "integrity": "sha1-V8FUKKuKiSsfQ4aWRccR0OFEtVQ=", "dev": true, "requires": { "is-ssh": "^1.3.0", "protocols": "^1.4.0" } }, "pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", "dev": true }, "path-dirname": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", "dev": true }, "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", "dev": true }, "path-type": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, "requires": { "pify": "^3.0.0" } }, "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "dev": true }, "pkg-conf": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", "integrity": "sha1-ISZRTKbyq/69FoWW3xi6V4Z/AFg=", "dev": true, "requires": { "find-up": "^2.0.0", "load-json-file": "^4.0.0" } }, "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", "dev": true }, "process-nextick-args": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", "dev": true }, "protocols": { "version": "1.4.6", "resolved": "https://registry.npmjs.org/protocols/-/protocols-1.4.6.tgz", "integrity": "sha1-+LsmPqG1/Xp2BNJri+Ob13Z4v4o=", "dev": true }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "q": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", "dev": true }, "quick-lru": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", "dev": true }, "rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, "requires": { "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" } }, "read-pkg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", "dev": true, "requires": { "load-json-file": "^4.0.0", "normalize-package-data": "^2.3.2", "path-type": "^3.0.0" } }, "read-pkg-up": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", "dev": true, "requires": { "find-up": "^3.0.0", "read-pkg": "^3.0.0" }, "dependencies": { "find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { "locate-path": "^3.0.0" } }, "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "requires": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" } } } }, "readable-stream": { "version": "2.3.6", "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "redent": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", "dev": true, "requires": { "indent-string": "^3.0.0", "strip-indent": "^2.0.0" } }, "redeyed": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", "integrity": "sha1-iYS1gV2ZyyIEacme7v/jiRPmzAs=", "dev": true, "requires": { "esprima": "~4.0.0" } }, "regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "dev": true, "requires": { "extend-shallow": "^3.0.2", "safe-regex": "^1.1.0" } }, "registry-auth-token": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", "dev": true, "requires": { "rc": "^1.1.6", "safe-buffer": "^5.0.1" } }, "repeat-element": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", "dev": true }, "repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", "dev": true }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, "require-main-filename": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", "dev": true }, "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, "resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", "dev": true }, "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", "dev": true }, "retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", "dev": true }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, "safe-regex": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { "ret": "~0.1.10" } }, "semantic-release": { "version": "15.9.16", "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-15.9.16.tgz", "integrity": "sha512-5RWqMFwDBXzIaNGUdnJxI4aCd4DtKtdc+5ZNjNWXABEmkimZVuuzZhMaTVNhHYfSuVUqWG9GuATEKhjlVoTzfQ==", "dev": true, "requires": { "@semantic-release/commit-analyzer": "^6.0.0", "@semantic-release/error": "^2.2.0", "@semantic-release/github": "^5.0.0", "@semantic-release/npm": "^5.0.1", "@semantic-release/release-notes-generator": "^7.0.0", "aggregate-error": "^1.0.0", "cosmiconfig": "^5.0.1", "debug": "^4.0.0", "env-ci": "^3.0.0", "execa": "^1.0.0", "figures": "^2.0.0", "find-versions": "^2.0.0", "get-stream": "^4.0.0", "git-log-parser": "^1.2.0", "git-url-parse": "^10.0.1", "hook-std": "^1.1.0", "hosted-git-info": "^2.7.1", "lodash": "^4.17.4", "marked": "^0.5.0", "marked-terminal": "^3.0.0", "p-locate": "^3.0.0", "p-reduce": "^1.0.0", "read-pkg-up": "^4.0.0", "resolve-from": "^4.0.0", "semver": "^5.4.1", "signale": "^1.2.1", "yargs": "^12.0.0" } }, "semver": { "version": "5.5.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==", "dev": true }, "semver-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-1.0.0.tgz", "integrity": "sha1-kqSWkGX5xwxpR1PVUkj8aPj2Usk=", "dev": true }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, "set-value": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", "dev": true, "requires": { "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", "is-plain-object": "^2.0.3", "split-string": "^3.0.1" }, "dependencies": { "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { "is-extendable": "^0.1.0" } } } }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, "requires": { "shebang-regex": "^1.0.0" } }, "shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, "signale": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/signale/-/signale-1.3.0.tgz", "integrity": "sha512-TyFhsQ9wZDYDfsPqWMyjCxsDoMwfpsT0130Mce7wDiVCSDdtWSg83dOqoj8aGpGCs3n1YPcam6sT1OFPuGT/OQ==", "dev": true, "requires": { "chalk": "^2.3.2", "figures": "^2.0.0", "pkg-conf": "^2.1.0" } }, "slash": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", "dev": true }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", "dev": true, "requires": { "base": "^0.11.1", "debug": "^2.2.0", "define-property": "^0.2.5", "extend-shallow": "^2.0.1", "map-cache": "^0.2.2", "source-map": "^0.5.6", "source-map-resolve": "^0.5.0", "use": "^3.1.0" }, "dependencies": { "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { "ms": "2.0.0" } }, "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { "is-descriptor": "^0.1.0" } }, "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { "is-extendable": "^0.1.0" } }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true } } }, "snapdragon-node": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "dev": true, "requires": { "define-property": "^1.0.0", "isobject": "^3.0.0", "snapdragon-util": "^3.0.1" }, "dependencies": { "define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { "is-descriptor": "^1.0.0" } }, "is-accessor-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { "kind-of": "^6.0.0" } }, "is-data-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { "kind-of": "^6.0.0" } }, "is-descriptor": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", "kind-of": "^6.0.2" } } } }, "snapdragon-util": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "dev": true, "requires": { "kind-of": "^3.2.0" }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { "is-buffer": "^1.1.5" } } } }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true }, "source-map-resolve": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", "dev": true, "requires": { "atob": "^2.1.1", "decode-uri-component": "^0.2.0", "resolve-url": "^0.2.1", "source-map-url": "^0.4.0", "urix": "^0.1.0" } }, "source-map-url": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", "dev": true }, "spawn-error-forwarder": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz", "integrity": "sha1-Gv2Uc46ZmwNG17n8NzvlXgdXcCk=", "dev": true }, "spdx-correct": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "spdx-exceptions": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", "dev": true }, "spdx-expression-parse": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", "dev": true, "requires": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "spdx-license-ids": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.1.tgz", "integrity": "sha512-TfOfPcYGBB5sDuPn3deByxPhmfegAhpDYKSOXZQN81Oyrrif8ZCodOLzK3AesELnCx03kikhyDwh0pfvvQvF8w==", "dev": true }, "split": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", "dev": true, "requires": { "through": "2" } }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "dev": true, "requires": { "extend-shallow": "^3.0.0" } }, "split2": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", "dev": true, "requires": { "through2": "^2.0.2" } }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, "static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", "dev": true, "requires": { "define-property": "^0.2.5", "object-copy": "^0.1.0" }, "dependencies": { "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { "is-descriptor": "^0.1.0" } } } }, "stream-combiner2": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", "dev": true, "requires": { "duplexer2": "~0.1.0", "readable-stream": "^2.0.2" } }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" } }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { "safe-buffer": "~5.1.0" } }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { "ansi-regex": "^3.0.0" } }, "strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, "strip-indent": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", "dev": true }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" } }, "text-extensions": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.8.0.tgz", "integrity": "sha512-mVzjRxuWnDKs/qH1rbOJEVHLlSX9kty9lpi7lMvLgU9S74mQ8/Ozg9UPcKxShh0qG2NZ+NyPOPpcZU4C1Eld9A==", "dev": true }, "through": { "version": "2.3.8", "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, "through2": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", "dev": true, "requires": { "readable-stream": "^2.1.5", "xtend": "~4.0.1" } }, "to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "dev": true, "requires": { "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { "is-buffer": "^1.1.5" } } } }, "to-regex": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", "dev": true, "requires": { "define-property": "^2.0.2", "extend-shallow": "^3.0.2", "regex-not": "^1.0.2", "safe-regex": "^1.1.0" } }, "to-regex-range": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "dev": true, "requires": { "is-number": "^3.0.0", "repeat-string": "^1.6.1" } }, "traverse": { "version": "0.6.6", "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=", "dev": true }, "trim-newlines": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", "dev": true }, "trim-off-newlines": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz", "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=", "dev": true }, "uglify-js": { "version": "3.4.9", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", "dev": true, "optional": true, "requires": { "commander": "~2.17.1", "source-map": "~0.6.1" }, "dependencies": { "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "optional": true } } }, "union-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", "dev": true, "requires": { "arr-union": "^3.1.0", "get-value": "^2.0.6", "is-extendable": "^0.1.1", "set-value": "^0.4.3" }, "dependencies": { "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { "is-extendable": "^0.1.0" } }, "set-value": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", "dev": true, "requires": { "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", "is-plain-object": "^2.0.1", "to-object-path": "^0.3.0" } } } }, "universal-user-agent": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-2.0.1.tgz", "integrity": "sha512-vz+heWVydO0iyYAa65VHD7WZkYzhl7BeNVy4i54p4TF8OMiLSXdbuQe4hm+fmWAsL+rVibaQHXfhvkw3c1Ws2w==", "dev": true, "requires": { "os-name": "^2.0.1" } }, "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true }, "unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", "dev": true, "requires": { "has-value": "^0.3.1", "isobject": "^3.0.0" }, "dependencies": { "has-value": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", "dev": true, "requires": { "get-value": "^2.0.3", "has-values": "^0.1.4", "isobject": "^2.0.0" }, "dependencies": { "isobject": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", "dev": true, "requires": { "isarray": "1.0.0" } } } }, "has-values": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", "dev": true } } }, "urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", "dev": true }, "url-join": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.0.tgz", "integrity": "sha1-TTNA6AfTdzvamZH4MFrNzCpmXSo=", "dev": true }, "url-template": { "version": "2.0.8", "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", "integrity": "sha1-/FZaPMy/93MMd19WQflVV5FDnyE=", "dev": true }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", "dev": true }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, "requires": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "requires": { "isexe": "^2.0.0" } }, "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, "win-release": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/win-release/-/win-release-1.1.1.tgz", "integrity": "sha1-X6VeAr58qTTt/BJmVjLoSbcuUgk=", "dev": true, "requires": { "semver": "^5.0.1" } }, "wordwrap": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", "dev": true }, "wrap-ansi": { "version": "2.1.0", "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { "string-width": "^1.0.1", "strip-ansi": "^3.0.1" }, "dependencies": { "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true }, "is-fullwidth-code-point": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { "number-is-nan": "^1.0.0" } }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", "strip-ansi": "^3.0.0" } }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { "ansi-regex": "^2.0.0" } } } }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, "xregexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz", "integrity": "sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg==", "dev": true }, "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", "dev": true }, "y18n": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", "dev": true }, "yargs": { "version": "12.0.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.2.tgz", "integrity": "sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ==", "dev": true, "requires": { "cliui": "^4.0.0", "decamelize": "^2.0.0", "find-up": "^3.0.0", "get-caller-file": "^1.0.1", "os-locale": "^3.0.0", "require-directory": "^2.1.1", "require-main-filename": "^1.0.1", "set-blocking": "^2.0.0", "string-width": "^2.0.0", "which-module": "^2.0.0", "y18n": "^3.2.1 || ^4.0.0", "yargs-parser": "^10.1.0" }, "dependencies": { "decamelize": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz", "integrity": "sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg==", "dev": true, "requires": { "xregexp": "4.0.0" } }, "find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { "locate-path": "^3.0.0" } }, "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "requires": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" } } } }, "yargs-parser": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", "dev": true, "requires": { "camelcase": "^4.1.0" } } } } triggerCharacters = $triggerCharacters; } } range = $range; $this->full = $full; } } contents = $contents; $this->range = $range; } } dynamicRegistration = $dynamicRegistration; } } dynamicRegistration = $dynamicRegistration; $this->linkSupport = $linkSupport; } } name = $name; $this->version = $version; } } snippetSupport = $snippetSupport; $this->commitCharactersSupport = $commitCharactersSupport; $this->documentationFormat = $documentationFormat; $this->deprecatedSupport = $deprecatedSupport; $this->preselectSupport = $preselectSupport; $this->tagSupport = $tagSupport; $this->insertReplaceSupport = $insertReplaceSupport; $this->resolveSupport = $resolveSupport; $this->insertTextModeSupport = $insertTextModeSupport; $this->labelDetailsSupport = $labelDetailsSupport; } } href = $href; } } tabSize = $tabSize; /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ $this->insertSpaces = $insertSpaces; } } detail = $detail; $this->description = $description; } } uri = $uri; /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ $this->range = $range; } } ` and a completion item with an `insertText` of * `console` is provided it will only insert `sole`. Therefore it is * recommended to use `textEdit` instead since it avoids additional client * side interpretation. * * @var string|null */ public $insertText; /** * The format of the insert text. The format applies to both the * `insertText` property and the `newText` property of a provided * `textEdit`. If omitted defaults to `InsertTextFormat.PlainText`. * * Please note that the insertTextFormat doesn't apply to * `additionalTextEdits`. * * @var int|null * @see InsertTextFormat */ public $insertTextFormat; /** * How whitespace and indentation is handled during completion * item insertion. If not provided the client's default value depends on * the `textDocument.completion.insertTextMode` client capability. * * @since 3.16.0 * @since 3.17.0 - support for `textDocument.completion.insertTextMode` * * @var int|null * @see InsertTextMode */ public $insertTextMode; /** * An edit which is applied to a document when selecting this completion. * When an edit is provided the value of `insertText` is ignored. * * *Note:* The range of the edit must be a single line range and it must * contain the position at which completion has been requested. * * Most editors support two different operations when accepting a completion * item. One is to insert a completion text and the other is to replace an * existing text with a completion text. Since this can usually not be * predetermined by a server it can report both ranges. Clients need to * signal support for `InsertReplaceEdit`s via the * `textDocument.completion.completionItem.insertReplaceSupport` client * capability property. * * *Note 1:* The text edit's range as well as both ranges from an insert * replace edit must be a [single line] and they must contain the position * at which completion has been requested. * *Note 2:* If an `InsertReplaceEdit` is returned the edit's insert range * must be a prefix of the edit's replace range, that means it must be * contained and starting at the same position. * * @since 3.16.0 additional type `InsertReplaceEdit` * * @var TextEdit|null */ public $textEdit; /** * An optional array of additional text edits that are applied when * selecting this completion. Edits must not overlap (including the same * insert position) with the main edit nor with themselves. * * Additional text edits should be used to change text unrelated to the * current cursor position (for example adding an import statement at the * top of the file if the completion item will insert an unqualified type). * * @var TextEdit[]|null */ public $additionalTextEdits; /** * An optional set of characters that when pressed while this completion is * active will accept it first and then type that character. *Note* that all * commit characters should have `length=1` and that superfluous characters * will be ignored. * * @var string[]|null */ public $commitCharacters; /** * An optional command that is executed *after* inserting this completion. *Note* that * additional modifications to the current document should be described with the * additionalTextEdits-property. * * @var Command|null */ public $command; /** * An data entry field that is preserved on a completion item between * a completion and a completion resolve request. * * @var mixed */ public $data; /** * @param string $label * @param int|null $kind * @param string|null $detail * @param string|null $documentation * @param string|null $sortText * @param string|null $filterText * @param string|null $insertText * @param TextEdit|null $textEdit * @param TextEdit[]|null $additionalTextEdits * @param Command|null $command * @param mixed|null $data * @param int|null $insertTextFormat */ public function __construct(string $label = null, int $kind = null, string $detail = null, string $documentation = null, string $sortText = null, string $filterText = null, string $insertText = null, TextEdit $textEdit = null, array $additionalTextEdits = null, Command $command = null, $data = null, int $insertTextFormat = null) { /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ $this->label = $label; $this->kind = $kind; $this->detail = $detail; $this->documentation = $documentation; $this->sortText = $sortText; $this->filterText = $filterText; $this->insertText = $insertText; $this->textEdit = $textEdit; $this->additionalTextEdits = $additionalTextEdits; $this->command = $command; $this->data = $data; $this->insertTextFormat = $insertTextFormat; } } dynamicRegistration = $dynamicRegistration; $this->prepareSupport = $prepareSupport; $this->prepareSupportDefaultBehavior = $prepareSupportDefaultBehavior; $this->honorsChangeAnnotations = $honorsChangeAnnotations; } } range = $range; $this->kind = $kind; } } messageActionItem = $messageActionItem; } } includeDeclaration = $includeDeclaration; } } dynamicRegistration = $dynamicRegistration; $this->willSave = $willSave; $this->willSaveWaitUntil = $willSaveWaitUntil; $this->didSave = $didSave; } } name = $name; /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ $this->kind = $kind; /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ $this->location = $location; $this->containerName = $containerName; } } range = $range; $this->rangeLength = $rangeLength; /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ $this->text = $text; } } dynamicRegistration = $dynamicRegistration; } } groupsOnLabel = $groupsOnLabel; } } itemDefaults = $itemDefaults; } } parser = $parser; $this->version = $version; $this->allowedTags = $allowedTags; } } start = $start; /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ $this->end = $end; } /** * Checks if a position is within the range * * @param Position $position * @return bool */ public function includes(Position $position) : bool { return $this->start->compare($position) <= 0 && $this->end->compare($position) >= 0; } } regularExpressions = $regularExpressions; $this->markdown = $markdown; } } line = $line; /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ $this->character = $character; } /** * Compares this position to another position * Returns * - 0 if the positions match * - a negative number if $this is before $position * - a positive number otherwise * * @param Position $position * @return int */ public function compare(Position $position) : int { if ($this->line === $position->line && $this->character === $position->character) { return 0; } if ($this->line !== $position->line) { return $this->line - $position->line; } return $this->character - $position->character; } /** * Returns the offset of the position in a string * * @param string $content * @return int */ public function toOffset(string $content) : int { $lines = \explode("\n", $content); $slice = \array_slice($lines, 0, $this->line); return \array_sum(\array_map('strlen', $slice)) + \count($slice) + $this->character; } } fqsen = $fqsen; $this->package = $package; } } dynamicRegistration = $dynamicRegistration; } } dynamicRegistration = $dynamicRegistration; $this->linkSupport = $linkSupport; } } signatures = $signatures; $this->activeSignature = $activeSignature; $this->activeParameter = $activeParameter; } } attributes = $attributes ?? new \stdClass(); $this->hints = $hints; } } uri = $uri; } } dynamicRegistration = $dynamicRegistration; $this->contentFormat = $contentFormat; } } dynamicRegistration = $dynamicRegistration; } } relatedInformation = $relatedInformation; $this->tagSupport = $tagSupport; $this->versionSupport = $versionSupport; $this->codeDescriptionSupport = $codeDescriptionSupport; $this->dataSupport = $dataSupport; } } valueSet = $valueSet; } } dynamicRegistration = $dynamicRegistration; $this->didCreate = $didCreate; $this->willCreate = $willCreate; $this->didRename = $didRename; $this->willRename = $willRename; $this->didDelete = $didDelete; $this->willDelete = $willDelete; } } title = $title; } } properties = $properties; } } valueSet = $valueSet; } } language = $language; /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ $this->value = $value; } } type = $type; $this->message = $message; } } capabilities = $capabilities; $this->serverInfo = $serverInfo; } } */ public $changes; /** * Depending on the client capability * `workspace.workspaceEdit.resourceOperations` document changes are either * an array of `TextDocumentEdit`s to express changes to n different text * documents where each text document edit addresses a specific version of * a text document. Or it can contain above `TextDocumentEdit`s mixed with * create, rename and delete file / folder operations. * * Whether a client supports versioned document edits is expressed via * `workspace.workspaceEdit.documentChanges` client capability. * * If a client neither supports `documentChanges` nor * `workspace.workspaceEdit.resourceOperations` then only plain `TextEdit`s * using the `changes` property are supported. * * @var mixed */ public $documentChanges; /** * A map of change annotations that can be referenced in * `AnnotatedTextEdit`s or create, rename and delete file / folder * operations. * * Whether clients honor this property depends on the client capability * `workspace.changeAnnotationSupport`. * * @since 3.16.0 * * @var array|null */ public $changeAnnotations; /** * @param array $changes * @param mixed $documentChanges * @param array|null $changeAnnotations */ public function __construct(array $changes = [], $documentChanges = null, array $changeAnnotations = null) { $this->changes = $changes; $this->documentChanges = $documentChanges; $this->changeAnnotations = $changeAnnotations; } /** * This is needed because VSCode Does not like nulls * meaning if a null is sent then this will not compute * * @return mixed */ #[\ReturnTypeWillChange] public function jsonSerialize() { return \array_filter(\get_object_vars($this)); } } name = $name; } } dynamicRegistration = $dynamicRegistration; } } message = $message; /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ $this->range = $range; $this->code = $code; $this->severity = $severity; $this->source = $source; $this->codeDescription = $codeDescription; $this->tags = $tags; $this->relatedInformation = $relatedInformation; $this->data = $data; } } valueSet = $valueSet; } } dynamicRegistration = $dynamicRegistration; } } dynamicRegistration = $dynamicRegistration; $this->signatureInformation = $signatureInformation; $this->contextSupport = $contextSupport; } } dynamicRegistration = $dynamicRegistration; } } symbol = $symbol; $this->location = $location; } } support = $support; } } workspace = $workspace; $this->textDocument = $textDocument; $this->window = $window; $this->general = $general; $this->experimental = $experimental; $this->xfilesProvider = $xfilesProvider; $this->xcontentProvider = $xcontentProvider; $this->xcacheProvider = $xcacheProvider; } } version = $version; } } engine = $engine; $this->version = $version; } } additionalPropertiesSupport = $additionalPropertiesSupport; } } reason = $reason; } } dynamicRegistration = $dynamicRegistration; $this->symbolKind = $symbolKind; $this->tagSupport = $tagSupport; $this->resolveSupport = $resolveSupport; } } triggerKind = $triggerKind; $this->triggerCharacter = $triggerCharacter; } } dynamicRegistration = $dynamicRegistration; } } synchronization = $synchronization; $this->completion = $completion; $this->hover = $hover; $this->signatureHelp = $signatureHelp; $this->declaration = $declaration; $this->definition = $definition; $this->typeDefinition = $typeDefinition; $this->implementation = $implementation; $this->references = $references; $this->documentHighlight = $documentHighlight; $this->documentSymbol = $documentSymbol; $this->codeAction = $codeAction; $this->codeLens = $codeLens; $this->documentLink = $documentLink; $this->colorProvider = $colorProvider; $this->formatting = $formatting; $this->rangeFormatting = $rangeFormatting; $this->onTypeFormatting = $onTypeFormatting; $this->rename = $rename; $this->publishDiagnostics = $publishDiagnostics; $this->foldingRange = $foldingRange; $this->selectionRange = $selectionRange; $this->linkedEditingRange = $linkedEditingRange; $this->callHierarchy = $callHierarchy; $this->semanticTokens = $semanticTokens; $this->moniker = $moniker; } } requests = $requests; /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ $this->tokenTypes = $tokenTypes; /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ $this->tokenModifiers = $tokenModifiers; /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ $this->formats = $formats; $this->dynamicRegistration = $dynamicRegistration; $this->overlappingTokenSupport = $overlappingTokenSupport; $this->multilineTokenSupport = $multilineTokenSupport; $this->serverCancelSupport = $serverCancelSupport; $this->augmentsSyntaxTokens = $augmentsSyntaxTokens; } } valueSet = $valueSet; } } uri = $uri; /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ $this->languageId = $languageId; /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ $this->version = $version; /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ $this->text = $text; } } label = $label; $this->needsConfirmation = $needsConfirmation; $this->description = $description; } } name = $name; $this->version = $version; } } refreshSupport = $refreshSupport; } } dynamicRegistration = $dynamicRegistration; } } codeActionKind = $codeActionKind; } } properties = $properties; } } <3tabs>foo. Accepting a * multi line completion item is indented using 2 tabs and all * following lines inserted will be indented using 2 tabs as well. */ const ADJUST_INDENTATION = 2; } uri = $uri; /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ $this->name = $name; } } properties = $properties; } } documentationFormat = $documentationFormat; $this->parameterInformation = $parameterInformation; $this->activeParameterSupport = $activeParameterSupport; } } diagnostics = $diagnostics; } } dynamicRegistration = $dynamicRegistration; $this->tooltipSupport = $tooltipSupport; } } location = $location; $this->message = $message; } } title = $title; $this->command = $command; $this->arguments = $arguments; } } firstTriggerCharacter = $firstTriggerCharacter; $this->moreTriggerCharacter = $moreTriggerCharacter; } } commands = $commands; } } workDoneProgress = $workDoneProgress; $this->showMessage = $showMessage; $this->showDocument = $showDocument; } } dynamicRegistration = $dynamicRegistration; $this->codeActionLiteralSupport = $codeActionLiteralSupport; $this->isPreferredSupport = $isPreferredSupport; $this->disabledSupport = $disabledSupport; $this->dataSupport = $dataSupport; $this->resolveSupport = $resolveSupport; $this->honorsChangeAnnotations = $honorsChangeAnnotations; } } valueSet = $valueSet; } } documentChanges = $documentChanges; $this->resourceOperations = $resourceOperations; $this->failureHandling = $failureHandling; $this->normalizesLineEndings = $normalizesLineEndings; $this->changeAnnotationSupport = $changeAnnotationSupport; } } dynamicRegistration = $dynamicRegistration; $this->linkSupport = $linkSupport; } } dynamicRegistration = $dynamicRegistration; $this->symbolKind = $symbolKind; $this->hierarchicalDocumentSymbolSupport = $hierarchicalDocumentSymbolSupport; $this->tagSupport = $tagSupport; $this->labelSupport = $labelSupport; } } label = $label; $this->documentation = $documentation; } } valueSet = $valueSet; } } resolveProvider = $resolveProvider; $this->triggerCharacters = $triggerCharacters; } } kind = $kind; /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ $this->value = $value; } } title = $title; $this->kind = $kind; $this->diagnostics = $diagnostics; $this->isPreferred = $isPreferred; $this->disabled = $disabled; $this->edit = $edit; $this->command = $command; $this->data = $data; } /** * This is needed because VSCode Does not like nulls * meaning if a null is sent then this will not compute * * @return mixed */ #[\ReturnTypeWillChange] public function jsonSerialize() { return \array_filter(\get_object_vars($this)); } } valueSet = $valueSet; } } dynamicRegistration = $dynamicRegistration; $this->linkSupport = $linkSupport; } } refreshSupport = $refreshSupport; } } dynamicRegistration = $dynamicRegistration; } } dynamicRegistration = $dynamicRegistration; } } labelOffsetSupport = $labelOffsetSupport; } } dynamicRegistration = $dynamicRegistration; } } dynamicRegistration = $dynamicRegistration; } } dynamicRegistration = $dynamicRegistration; } } range = $range; $this->rangeLength = $rangeLength; /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ $this->text = $text; } } label = $label; $this->parameters = $parameters; $this->documentation = $documentation; $this->activeParameter = $activeParameter; } } range = $range; $this->newText = $newText; } } uri = $uri; $this->type = $type; } } dynamicRegistration = $dynamicRegistration; $this->rangeLimit = $rangeLimit; $this->lineFoldingOnly = $lineFoldingOnly; } } message = $message; $this->verbose = $verbose; } } resolveProvider = $resolveProvider; } } dynamicRegistration = $dynamicRegistration; $this->completionItem = $completionItem; $this->contextSupport = $contextSupport; $this->insertTextMode = $insertTextMode; $this->completionList = $completionList; } } reference = $reference; /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ $this->symbol = $symbol; } } valueSet = $valueSet; } } range = $range; $this->command = $command; $this->data = $data; } } items = $items; $this->isIncomplete = $isIncomplete; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare (strict_types=1); namespace _HumbugBox1cb33d1f20f1\Fidry\CpuCoreCounter; use _HumbugBox1cb33d1f20f1\Fidry\CpuCoreCounter\Finder\CpuCoreFinder; use _HumbugBox1cb33d1f20f1\Fidry\CpuCoreCounter\Finder\FinderRegistry; final class CpuCoreCounter { /** * @var list */ private $finders; /** * @var positive-int|null */ private $count; /** * @param list|null $finders */ public function __construct(?array $finders = null) { $this->finders = $finders ?? FinderRegistry::getDefaultLogicalFinders(); } /** * @throws NumberOfCpuCoreNotFound * * @return positive-int */ public function getCount() : int { // Memoize result if (null === $this->count) { $this->count = $this->findCount(); } return $this->count; } /** * @throws NumberOfCpuCoreNotFound * * @return positive-int */ private function findCount() : int { foreach ($this->finders as $finder) { $cores = $finder->find(); if (null !== $cores) { return $cores; } } throw NumberOfCpuCoreNotFound::create(); } /** * @throws NumberOfCpuCoreNotFound * * @return array{CpuCoreFinder, positive-int} */ public function getFinderAndCores() : array { foreach ($this->finders as $finder) { $cores = $finder->find(); if (null !== $cores) { return [$finder, $cores]; } } throw NumberOfCpuCoreNotFound::create(); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare (strict_types=1); namespace _HumbugBox1cb33d1f20f1\Fidry\CpuCoreCounter; use _HumbugBox1cb33d1f20f1\Fidry\CpuCoreCounter\Finder\CpuCoreFinder; use function array_map; use function explode; use function implode; use function max; use function str_repeat; use const PHP_EOL; /** * Utility to debug. * * @private */ final class Diagnoser { /** * Provides an aggregated diagnosis based on each finders diagnosis. * * @param list $finders */ public static function diagnose(array $finders) : string { $diagnoses = array_map(static function (CpuCoreFinder $finder) : string { return self::diagnoseFinder($finder); }, $finders); return implode(PHP_EOL, $diagnoses); } /** * Executes each finders. * * @param list $finders */ public static function execute(array $finders) : string { $diagnoses = array_map(static function (CpuCoreFinder $finder) : string { $coresCount = $finder->find(); return implode('', [$finder->toString(), ': ', null === $coresCount ? 'NULL' : $coresCount]); }, $finders); return implode(PHP_EOL, $diagnoses); } private static function diagnoseFinder(CpuCoreFinder $finder) : string { $diagnosis = $finder->diagnose(); $maxLineLength = max(array_map('strlen', explode(PHP_EOL, $diagnosis))); $separator = str_repeat('-', $maxLineLength); return implode('', [$finder->toString() . ':' . PHP_EOL, $separator . PHP_EOL, $diagnosis . PHP_EOL, $separator . PHP_EOL]); } private function __construct() { } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare (strict_types=1); namespace _HumbugBox1cb33d1f20f1\Fidry\CpuCoreCounter\Exec; use function fclose; use function is_resource; use function proc_close; use function proc_open; use function stream_get_contents; final class ProcOpen { /** * @return array{string, string} STDOUT & STDERR tuple */ public static function execute(string $command) : ?array { $pipes = []; $process = @proc_open($command, [ ['pipe', 'rb'], ['pipe', 'wb'], // stdout ['pipe', 'wb'], ], $pipes); if (!is_resource($process)) { return null; } fclose($pipes[0]); $stdout = (string) stream_get_contents($pipes[1]); $stderr = (string) stream_get_contents($pipes[2]); proc_close($process); return [$stdout, $stderr]; } private function __construct() { } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare (strict_types=1); namespace _HumbugBox1cb33d1f20f1\Fidry\CpuCoreCounter; use RuntimeException; final class NumberOfCpuCoreNotFound extends RuntimeException { public static function create() : self { return new self('Could not find the number of CPU cores available.'); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare (strict_types=1); namespace _HumbugBox1cb33d1f20f1\Fidry\CpuCoreCounter\Finder; use function file_get_contents; use function is_file; use function sprintf; use function substr_count; use const PHP_EOL; /** * Find the number of CPU cores looking up at the cpuinfo file which is available * on Linux systems and Windows systems with a Linux sub-system. * * @see https://github.com/paratestphp/paratest/blob/c163539818fd96308ca8dc60f46088461e366ed4/src/Runners/PHPUnit/Options.php#L903-L909 * @see https://unix.stackexchange.com/questions/146051/number-of-processors-in-proc-cpuinfo */ final class CpuInfoFinder implements CpuCoreFinder { private const CPU_INFO_PATH = '/proc/cpuinfo'; public function diagnose() : string { if (!is_file(self::CPU_INFO_PATH)) { return sprintf('The file "%s" could not be found.', self::CPU_INFO_PATH); } $cpuInfo = file_get_contents(self::CPU_INFO_PATH); if (\false === $cpuInfo) { return sprintf('Could not get the content of the file "%s".', self::CPU_INFO_PATH); } return sprintf('Found the file "%s" with the content:%s%s', self::CPU_INFO_PATH, PHP_EOL, $cpuInfo); } /** * @return positive-int|null */ public function find() : ?int { $cpuInfo = self::getCpuInfo(); return null === $cpuInfo ? null : self::countCpuCores($cpuInfo); } public function toString() : string { return 'CpuInfoFinder'; } private static function getCpuInfo() : ?string { if (!@is_file(self::CPU_INFO_PATH)) { return null; } $cpuInfo = @file_get_contents(self::CPU_INFO_PATH); return \false === $cpuInfo ? null : $cpuInfo; } /** * @internal * * @return positive-int|null */ public static function countCpuCores(string $cpuInfo) : ?int { $processorCount = substr_count($cpuInfo, 'processor'); return $processorCount > 0 ? $processorCount : null; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare (strict_types=1); namespace _HumbugBox1cb33d1f20f1\Fidry\CpuCoreCounter\Finder; final class FinderRegistry { /** * @return list List of all the known finders with all their variants. */ public static function getAllVariants() : array { return [new CpuInfoFinder(), new DummyCpuCoreFinder(1), new HwLogicalFinder(), new HwPhysicalFinder(), new _NProcessorFinder(), new NProcessorFinder(), new NProcFinder(\true), new NProcFinder(\false), new NullCpuCoreFinder(), new OnlyOnWindowsFinder(new DummyCpuCoreFinder(1)), new SkipOnWindowsFinder(new DummyCpuCoreFinder(1)), new WmicPhysicalFinder(), new WmicLogicalFinder()]; } /** * @return list */ public static function getDefaultLogicalFinders() : array { return [new OnlyOnWindowsFinder(new WmicLogicalFinder()), new NProcFinder(), new HwLogicalFinder(), new _NProcessorFinder(), new NProcessorFinder(), new CpuInfoFinder()]; } /** * @return list */ public static function getDefaultPhysicalFinders() : array { return [new OnlyOnWindowsFinder(new WmicPhysicalFinder()), new HwPhysicalFinder()]; } private function __construct() { } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare (strict_types=1); namespace _HumbugBox1cb33d1f20f1\Fidry\CpuCoreCounter\Finder; /** * Find the number of physical CPU cores for Linux, BSD and OSX. * * @see https://github.com/paratestphp/paratest/blob/c163539818fd96308ca8dc60f46088461e366ed4/src/Runners/PHPUnit/Options.php#L903-L909 * @see https://opensource.apple.com/source/xnu/xnu-792.2.4/libkern/libkern/sysctl.h.auto.html */ final class HwPhysicalFinder extends ProcOpenBasedFinder { protected function getCommand() : string { return 'sysctl -n hw.physicalcpu'; } public function toString() : string { return 'HwPhysicalFinder'; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare (strict_types=1); namespace _HumbugBox1cb33d1f20f1\Fidry\CpuCoreCounter\Finder; use function defined; use function sprintf; final class SkipOnWindowsFinder implements CpuCoreFinder { /** * @var CpuCoreFinder */ private $decoratedFinder; public function __construct(CpuCoreFinder $decoratedFinder) { $this->decoratedFinder = $decoratedFinder; } public function diagnose() : string { return self::skip() ? 'Windows platform detected (PHP_WINDOWS_VERSION_MAJOR is set).' : $this->decoratedFinder->diagnose(); } public function find() : ?int { return self::skip() ? null : $this->decoratedFinder->find(); } public function toString() : string { return sprintf('SkipOnWindowsFinder(%s)', $this->decoratedFinder->toString()); } private static function skip() : bool { // Skip if on Windows. Rely on PHP to detect the platform // rather than reading the platform name or others. return defined('PHP_WINDOWS_VERSION_MAJOR'); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare (strict_types=1); namespace _HumbugBox1cb33d1f20f1\Fidry\CpuCoreCounter\Finder; /** * Find the number of logical CPU cores for FreeSBD, Solaris and the likes. * * @see https://twitter.com/freebsdfrau/status/1052016199452700678?s=20&t=M2pHkRqmmna-UF68lfL2hw */ final class NProcessorFinder extends ProcOpenBasedFinder { protected function getCommand() : string { return 'getconf NPROCESSORS_ONLN'; } public function toString() : string { return 'NProcessorFinder'; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare (strict_types=1); namespace _HumbugBox1cb33d1f20f1\Fidry\CpuCoreCounter\Finder; use _HumbugBox1cb33d1f20f1\Fidry\CpuCoreCounter\Exec\ProcOpen; use function filter_var; use function function_exists; use function is_int; use function sprintf; use function trim; use const FILTER_VALIDATE_INT; use const PHP_EOL; abstract class ProcOpenBasedFinder implements CpuCoreFinder { public function diagnose() : string { if (!function_exists('proc_open')) { return 'The function "proc_open" is not available.'; } $command = $this->getCommand(); $output = ProcOpen::execute($command); if (null === $output) { return sprintf('Failed to execute the command "%s".', $command); } [$stdout, $stderr] = $output; $failed = '' !== trim($stderr); return $failed ? sprintf('Executed the command "%s" which wrote the following output to the STDERR:%s%s', $command, PHP_EOL, $stderr) : sprintf('Executed the command "%s" and got the following (STDOUT) output:%s%s', $command, PHP_EOL, $stdout); } /** * @return positive-int|null */ public function find() : ?int { if (!function_exists('proc_open')) { return null; } $output = ProcOpen::execute($this->getCommand()); if (null === $output) { return null; } [$stdout, $stderr] = $output; $failed = '' !== trim($stderr); return $failed ? null : static::countCpuCores($stdout); } /** * @internal * * @return positive-int|null */ public static function countCpuCores(string $process) : ?int { $cpuCount = filter_var($process, FILTER_VALIDATE_INT); return is_int($cpuCount) && $cpuCount > 0 ? $cpuCount : null; } protected abstract function getCommand() : string; } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare (strict_types=1); namespace _HumbugBox1cb33d1f20f1\Fidry\CpuCoreCounter\Finder; interface CpuCoreFinder { /** * Provides an explanation which may offer some insight as to what the finder * will be able to find. * * This is practical to have an idea of what each finder will find collect * information for the unit tests, since integration tests are quite complicated * as dependent on complex infrastructures. */ public function diagnose() : string; /** * Find the number of CPU cores. If it could not find it, returns null. The * means used to find the cores are at the implementation discretion. * * @return positive-int|null */ public function find() : ?int; public function toString() : string; } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare (strict_types=1); namespace _HumbugBox1cb33d1f20f1\Fidry\CpuCoreCounter\Finder; /** * This finder returns whatever value you gave to it. This is useful for testing. */ final class NullCpuCoreFinder implements CpuCoreFinder { public function diagnose() : string { return 'Will return "null".'; } public function find() : ?int { return null; } public function toString() : string { return 'NullCpuCoreFinder'; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare (strict_types=1); namespace _HumbugBox1cb33d1f20f1\Fidry\CpuCoreCounter\Finder; /** * Find the number of logical CPU cores for Linux and the likes. * * @see https://twitter.com/freebsdfrau/status/1052016199452700678?s=20&t=M2pHkRqmmna-UF68lfL2hw */ final class _NProcessorFinder extends ProcOpenBasedFinder { protected function getCommand() : string { return 'getconf _NPROCESSORS_ONLN'; } public function toString() : string { return '_NProcessorFinder'; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare (strict_types=1); namespace _HumbugBox1cb33d1f20f1\Fidry\CpuCoreCounter\Finder; use function preg_match; /** * Find the number of logical CPU cores for Windows. * * @see https://github.com/paratestphp/paratest/blob/c163539818fd96308ca8dc60f46088461e366ed4/src/Runners/PHPUnit/Options.php#L912-L916 */ final class WmicLogicalFinder extends ProcOpenBasedFinder { private const CPU_CORE_COUNT_REGEX = '/NumberOfLogicalProcessors[\\s\\n]+(?\\d+)/'; protected function getCommand() : string { return 'wmic cpu get NumberOfLogicalProcessors'; } public function toString() : string { return 'WmicLogicalFinder'; } public static function countCpuCores(string $process) : ?int { if (0 === preg_match(self::CPU_CORE_COUNT_REGEX, $process, $matches)) { return parent::countCpuCores($process); } $count = $matches['count']; return parent::countCpuCores($count); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare (strict_types=1); namespace _HumbugBox1cb33d1f20f1\Fidry\CpuCoreCounter\Finder; use function preg_match; /** * Find the number of physical CPU cores for Windows. * * @see https://github.com/paratestphp/paratest/blob/c163539818fd96308ca8dc60f46088461e366ed4/src/Runners/PHPUnit/Options.php#L912-L916 */ final class WmicPhysicalFinder extends ProcOpenBasedFinder { private const CPU_CORE_COUNT_REGEX = '/NumberOfCores[\\s\\n]+(?\\d+)/'; protected function getCommand() : string { return 'wmic cpu get NumberOfCores'; } public function toString() : string { return 'WmicPhysicalFinder'; } public static function countCpuCores(string $process) : ?int { if (0 === preg_match(self::CPU_CORE_COUNT_REGEX, $process, $matches)) { return parent::countCpuCores($process); } $count = $matches['count']; return parent::countCpuCores($count); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare (strict_types=1); namespace _HumbugBox1cb33d1f20f1\Fidry\CpuCoreCounter\Finder; use function sprintf; /** * This finder returns whatever value you gave to it. This is useful for testing * or as a fallback to avoid to catch the NumberOfCpuCoreNotFound exception. */ final class DummyCpuCoreFinder implements CpuCoreFinder { /** * @var positive-int */ private $count; public function diagnose() : string { return sprintf('Will return "%d".', $this->count); } /** * @param positive-int $count */ public function __construct(int $count) { $this->count = $count; } public function find() : ?int { return $this->count; } public function toString() : string { return sprintf('DummyCpuCoreFinder(value=%d)', $this->count); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare (strict_types=1); namespace _HumbugBox1cb33d1f20f1\Fidry\CpuCoreCounter\Finder; use function filter_var; use function is_int; use function sprintf; use const FILTER_VALIDATE_INT; /** * The number of (logical) cores. * * @see https://github.com/infection/infection/blob/fbd8c44/src/Resource/Processor/CpuCoresCountProvider.php#L69-L82 * @see https://unix.stackexchange.com/questions/146051/number-of-processors-in-proc-cpuinfo */ final class NProcFinder extends ProcOpenBasedFinder { /** * @var bool */ private $all; /** * @param bool $all If disabled will give the number of cores available for the current process only. */ public function __construct(bool $all = \true) { $this->all = $all; } public function toString() : string { return sprintf('NProcFinder(all=%s)', $this->all ? 'true' : 'false'); } protected function getCommand() : string { return 'nproc' . ($this->all ? ' --all' : '') . ' 2>&1'; } /** * @return positive-int|null */ public static function countCpuCores(string $nproc) : ?int { $cpuCount = filter_var($nproc, FILTER_VALIDATE_INT); return is_int($cpuCount) && $cpuCount > 0 ? $cpuCount : null; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare (strict_types=1); namespace _HumbugBox1cb33d1f20f1\Fidry\CpuCoreCounter\Finder; use function defined; use function sprintf; final class OnlyOnWindowsFinder implements CpuCoreFinder { /** * @var CpuCoreFinder */ private $decoratedFinder; public function __construct(CpuCoreFinder $decoratedFinder) { $this->decoratedFinder = $decoratedFinder; } public function diagnose() : string { return self::skip() ? 'Non-windows platform detected (PHP_WINDOWS_VERSION_MAJOR is not set).' : $this->decoratedFinder->diagnose(); } public function find() : ?int { return self::skip() ? null : $this->decoratedFinder->find(); } public function toString() : string { return sprintf('OnlyOnWindowsFinder(%s)', $this->decoratedFinder->toString()); } private static function skip() : bool { // Skip if not on Windows. Rely on PHP to detect the platform // rather than reading the platform name or others. return !defined('PHP_WINDOWS_VERSION_MAJOR'); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare (strict_types=1); namespace _HumbugBox1cb33d1f20f1\Fidry\CpuCoreCounter\Finder; /** * Find the number of logical CPU cores for Linux, BSD and OSX. * * @see https://github.com/paratestphp/paratest/blob/c163539818fd96308ca8dc60f46088461e366ed4/src/Runners/PHPUnit/Options.php#L903-L909 * @see https://opensource.apple.com/source/xnu/xnu-792.2.4/libkern/libkern/sysctl.h.auto.html */ final class HwLogicalFinder extends ProcOpenBasedFinder { protected function getCommand() : string { return 'sysctl -n hw.logicalcpu'; } public function toString() : string { return 'HwLogicalFinder'; } } #!/usr/bin/env php * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare (strict_types=1); namespace _HumbugBox1cb33d1f20f1; use _HumbugBox1cb33d1f20f1\Fidry\CpuCoreCounter\Diagnoser; use _HumbugBox1cb33d1f20f1\Fidry\CpuCoreCounter\Finder\FinderRegistry; require_once __DIR__ . '/../vendor/autoload.php'; echo 'Running diagnosis...' . \PHP_EOL . \PHP_EOL; echo Diagnoser::diagnose(FinderRegistry::getAllVariants()) . \PHP_EOL; #!/usr/bin/env php * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare (strict_types=1); namespace _HumbugBox1cb33d1f20f1; use _HumbugBox1cb33d1f20f1\Fidry\CpuCoreCounter\Diagnoser; use _HumbugBox1cb33d1f20f1\Fidry\CpuCoreCounter\Finder\FinderRegistry; require_once __DIR__ . '/../vendor/autoload.php'; echo 'Executing finders...' . \PHP_EOL . \PHP_EOL; echo Diagnoser::execute(FinderRegistry::getAllVariants()) . \PHP_EOL; */ public function getAliasedClassesFlipped() : array; /** * @return array */ public function getAliasedClassesFlippedReplaceable() : array; public function getFQCLN() : ?string; public function getClassName() : ?string; public function getParentFQCLN() : ?string; /** * @return array>|null */ public function getTemplateTypeMap() : ?array; public function setRootFilePath(string $file_path, string $file_name) : void; public function hasParentFilePath(string $file_path) : bool; public function hasAlreadyRequiredFilePath(string $file_path) : bool; public function getRequireNesting() : int; public function isStatic() : bool; public function getSource() : \Psalm\StatementsSource; public function getCodebase() : \Psalm\Codebase; /** * Get a list of suppressed issues * * @return array */ public function getSuppressedIssues() : array; /** * @param list $new_issues */ public function addSuppressedIssues(array $new_issues) : void; /** * @param list $new_issues */ public function removeSuppressedIssues(array $new_issues) : void; public function getNodeTypeProvider() : \Psalm\NodeTypeProvider; } []]; foreach ($this->issues_data as $issue_data) { $report['issues'][] = ['engineId' => 'Psalm', 'ruleId' => $issue_data->type, 'primaryLocation' => ['message' => $issue_data->message, 'filePath' => $issue_data->file_name, 'textRange' => [ 'startLine' => $issue_data->line_from, 'endLine' => $issue_data->line_to, // Columns in external issue reports are indexed from 0 'startColumn' => max(0, $issue_data->column_from - 1), 'endColumn' => max(0, $issue_data->column_to - 1), ]], 'type' => 'CODE_SMELL', 'severity' => $issue_data->severity === Config::REPORT_ERROR ? 'CRITICAL' : 'MINOR']; } $options = $this->pretty ? Json::PRETTY : Json::DEFAULT; return Json::encode($report, $options) . "\n"; } } issues_data as $issue_data) { $type = $issue_data->type; if (!isset($type_counts[$type])) { $type_counts[$type] = 0; } ++$type_counts[$type]; } $options = $this->pretty ? Json::PRETTY : Json::DEFAULT; return Json::encode(['issue_counts' => $type_counts, 'mixed_expression_count' => $this->mixed_expression_count, 'total_expression_count' => $this->total_expression_count], $options) . "\n"; } } */ final class CodeClimateReport extends Report { public function create() : string { $options = $this->pretty ? Json::PRETTY : Json::DEFAULT; $issues_data = array_map([$this, 'mapToNewStructure'], $this->issues_data); return Json::encode(array_values($issues_data), $options) . "\n"; } /** * convert our own severity to CodeClimate format * Values can be : info, minor, major, critical, or blocker */ protected function convertSeverity(string $input) : string { if (Config::REPORT_INFO === $input) { return 'info'; } if (Config::REPORT_ERROR === $input) { return 'critical'; } if (Config::REPORT_SUPPRESS === $input) { return 'minor'; } // unknown cases ? fallback return 'critical'; } /** * calculate a unique fingerprint for a given issue */ protected function calculateFingerprint(IssueData $issue) : string { return md5($issue->type . $issue->message . $issue->file_name . $issue->from . $issue->to); } /** * map fields to new structure. * Expected fields: * - type * - check_name * - description* * - content * - categories[] * - severity * - fingerprint* * - location.path* * - location.lines.begin* * * Fields with * are the one used by Gitlab for Code Quality */ private function mapToNewStructure(IssueData $issue) : array { return ['type' => 'issue', 'check_name' => $issue->type, 'description' => $issue->message, 'categories' => [$issue->type], 'severity' => $this->convertSeverity($issue->severity), 'fingerprint' => $this->calculateFingerprint($issue), 'location' => ['path' => $issue->file_name, 'lines' => ['begin' => $issue->line_from, 'end' => $issue->line_to]]]; } } issues_data as $issue_data) { if (array_key_exists($issue_data->type, $issue_type_counts)) { $issue_type_counts[$issue_data->type]++; } else { $issue_type_counts[$issue_data->type] = 1; } } uksort($issue_type_counts, function (string $a, string $b) use($issue_type_counts) : int { $cmp_result = $issue_type_counts[$a] <=> $issue_type_counts[$b]; if ($cmp_result === 0) { return $a <=> $b; } else { return $cmp_result; } }); $output = ''; foreach ($issue_type_counts as $issue_type => $count) { $output .= "{$issue_type}: {$count}\n"; } return $output; } } issues_data as $issue_data) { $output .= $this->format($issue_data) . "\n" . "\n"; } return $output; } private function format(IssueData $issue_data) : string { $issue_string = ''; $is_error = $issue_data->severity === Config::REPORT_ERROR; if ($is_error) { $issue_string .= $this->use_color ? "\x1b[0;31mERROR\x1b[0m" : 'ERROR'; } else { $issue_string .= 'INFO'; } $issue_reference = $issue_data->link ? ' (see ' . $issue_data->link . ')' : ''; $issue_string .= ': ' . $issue_data->type . ' - ' . $this->getFileReference($issue_data) . ' - ' . $issue_data->message . $issue_reference . "\n"; if ($issue_data->taint_trace) { $issue_string .= $this->getTaintSnippets($issue_data->taint_trace); } elseif ($this->show_snippet) { $snippet = $issue_data->snippet; if (!$this->use_color) { $issue_string .= $snippet; } else { $selection_start = $issue_data->from - $issue_data->snippet_from; $selection_length = $issue_data->to - $issue_data->from; $issue_string .= substr($snippet, 0, $selection_start) . ($is_error ? "\x1b[97;41m" : "\x1b[30;47m") . substr($snippet, $selection_start, $selection_length) . "\x1b[0m" . substr($snippet, $selection_length + $selection_start) . "\n"; } } if ($issue_data->other_references) { if ($this->show_snippet) { $issue_string .= "\n"; } $issue_string .= $this->getTaintSnippets($issue_data->other_references); } return $issue_string; } /** * @param non-empty-list $taint_trace */ private function getTaintSnippets(array $taint_trace) : string { $snippets = ''; foreach ($taint_trace as $node_data) { if ($node_data instanceof DataFlowNodeData) { $snippets .= ' ' . $node_data->label . ' - ' . $this->getFileReference($node_data) . "\n"; if ($this->show_snippet) { $snippet = $node_data->snippet; if (!$this->use_color) { $snippets .= $snippet . "\n\n"; } else { $selection_start = $node_data->from - $node_data->snippet_from; $selection_length = $node_data->to - $node_data->from; $snippets .= substr($snippet, 0, $selection_start) . "\x1b[30;47m" . substr($snippet, $selection_start, $selection_length) . "\x1b[0m" . substr($snippet, $selection_length + $selection_start) . "\n\n"; } } } else { $snippets .= ' ' . $node_data['label'] . "\n"; $snippets .= ' ' . "\n\n"; } } return $snippets; } /** * @param IssueData|DataFlowNodeData $data */ private function getFileReference($data) : string { $reference = $data->file_name . ':' . $data->line_from . ':' . $data->column_from; if (!$this->use_color) { return $reference; } $file_basename = basename($data->file_name); $file_path = substr($data->file_name, 0, -strlen($file_basename)); $reference = $file_path . "\x1b[1;31m" . $file_basename . ':' . $data->line_from . ':' . $data->column_from . "\x1b[0m"; if ($this->in_ci) { return $reference; } if (null === $this->link_format) { // if xdebug is not enabled, use `get_cfg_var` to get the value directly from php.ini $this->link_format = (ini_get('xdebug.file_link_format') ?: get_cfg_var('xdebug.file_link_format')) ?: 'file://%f#L%l'; } $link = strtr($this->link_format, ['%f' => $data->file_path, '%l' => $data->line_from]); // $reference = $data->file_name . ':' . $data->line_from . ':' . $data->column_from; return "\x1b]8;;" . $link . "\x1b\\" . $reference . "\x1b]8;;\x1b\\"; } } issues_data as $issue_data) { $issue_reference = $issue_data->link ? ' (see ' . $issue_data->link . ')' : ''; $properties = sprintf('file=%1$s,line=%2$d,col=%3$d,title=%4$s', $this->escapeProperty($issue_data->file_name), $this->escapeProperty($issue_data->line_from), $this->escapeProperty($issue_data->column_from), $this->escapeProperty($issue_data->type)); $data = $this->escapeData(sprintf('%1$s:%2$d:%3$d: %4$s: %5$s', $issue_data->file_name, $issue_data->line_from, $issue_data->column_from, $issue_data->type, $issue_data->message . $issue_reference)); $output .= sprintf('::%1$s %2$s::%3$s', $issue_data->severity === Config::REPORT_ERROR ? 'error' : 'warning', $properties, $data) . "\n"; } return $output; } private function escapeData(string $data) : string { return strtr($data, ['%' => '%25', "\r" => '%0D', "\n" => '%0A']); } /** @param mixed $value */ private function escapeProperty($value) : string { return strtr((string) $value, ['%' => '%25', "\r" => '%0D', "\n" => '%0A', ':' => '%3A', ',' => '%2C']); } } pretty ? Json::PRETTY : Json::DEFAULT; $issues_data = array_map(static function (IssueData $issue_data) : array { $issue_data = (array) $issue_data; unset($issue_data['dupe_key']); return $issue_data; }, $this->issues_data); return Json::encode(array_values($issues_data), $options) . "\n"; } } issues_data as $i => $issue_data) { if (!$this->show_info && $issue_data->severity === Config::REPORT_INFO) { continue; } if ($current_file === null || $current_file !== $issue_data->file_name) { // If we're processing a new file, then wrap up the last table and render it out. if ($buffer !== null) { $table->render(); $output[] = $buffer->fetch(); } $output[] = 'FILE: ' . $issue_data->file_name . "\n"; $buffer = new BufferedOutput(); $table = new Table($buffer); $table->setHeaders(['SEVERITY', 'LINE', 'ISSUE', 'DESCRIPTION']); } $is_error = $issue_data->severity === Config::REPORT_ERROR; if ($is_error) { $severity = $this->use_color ? "\x1b[0;31mERROR\x1b[0m" : 'ERROR'; } else { $severity = strtoupper($issue_data->severity); } // Since `Table::setColumnMaxWidth` is only available in symfony/console 4.2+ we need do something similar // so we have clean tables. $message = $issue_data->message; if (strlen($message) > 70) { $message = implode("\n", str_split($message, 70)); } $table->addRow([$severity, $issue_data->line_from, $issue_data->type, $message]); $current_file = $issue_data->file_name; // If we're at the end of the issue sets, then wrap up the last table and render it out. if ($i === count($this->issues_data) - 1) { $table->render(); $output[] = $buffer->fetch(); } } return implode("\n", $output); } } '2.1.0', '$schema' => 'https://json.schemastore.org/sarif-2.1.0.json', 'runs' => [['tool' => ['driver' => ['name' => 'Psalm', 'informationUri' => 'https://psalm.dev', 'version' => \PSALM_VERSION]], 'results' => []]]]; $rules = []; foreach ($this->issues_data as $issue_data) { $rules[$issue_data->shortcode] = ['id' => (string) $issue_data->shortcode, 'name' => $issue_data->type, 'shortDescription' => ['text' => $issue_data->type], 'properties' => ['tags' => [strpos($issue_data->type, 'Tainted') === 0 ? 'security' : 'maintainability']], 'helpUri' => $issue_data->link]; $markdown_documentation_path = __DIR__ . '/../../../docs/running_psalm/issues/' . $issue_data->type . '.md'; if (file_exists($markdown_documentation_path)) { $markdown_documentation = file_get_contents($markdown_documentation_path); $rules[$issue_data->shortcode]['help']['markdown'] = $markdown_documentation; $rules[$issue_data->shortcode]['help']['text'] = $markdown_documentation; } $jsonEntry = ['ruleId' => (string) $issue_data->shortcode, 'message' => ['text' => $issue_data->message], 'level' => $issue_data->severity === Config::REPORT_ERROR ? 'error' : 'note', 'locations' => [['physicalLocation' => ['artifactLocation' => ['uri' => $issue_data->file_name], 'region' => ['startLine' => $issue_data->line_from, 'endLine' => $issue_data->line_to, 'startColumn' => $issue_data->column_from, 'endColumn' => $issue_data->column_to]]]]]; if ($issue_data->taint_trace != null) { $jsonEntry['codeFlows'] = [['message' => ['text' => 'Tracing the path from user input to insecure usage'], 'threadFlows' => [['locations' => []]]]]; foreach ($issue_data->taint_trace as $trace) { if ($trace instanceof DataFlowNodeData && $trace->line_from > 0) { $jsonEntry['codeFlows'][0]['threadFlows'][0]['locations'][] = ['location' => ['physicalLocation' => ['artifactLocation' => ['uri' => $trace->file_name], 'region' => ['startLine' => $trace->line_from, 'endLine' => $trace->line_to, 'startColumn' => $trace->column_from, 'endColumn' => $trace->column_to]]]]; } } } $report['runs'][0]['results'][] = $jsonEntry; } foreach ($rules as $rule) { $report['runs'][0]['tool']['driver']['rules'][] = $rule; } $options = $this->pretty ? Json::PRETTY : Json::DEFAULT; return Json::encode($report, $options) . "\n"; } } issues_data as $issue_data) { $output .= sprintf('%s:%s:%s:%s - %s', $issue_data->file_path, $issue_data->line_from, $issue_data->column_from, $issue_data->severity === Config::REPORT_ERROR ? 'error' : 'warning', $issue_data->message) . "\n"; } return $output; } } issues_data as $issue_data) { $output .= sprintf('%s:%s:%s:%s - %s: %s', $issue_data->file_path, $issue_data->line_from, $issue_data->column_from, $issue_data->severity === Config::REPORT_ERROR ? 'error' : 'warning', $issue_data->type, $issue_data->message) . "\n"; } return $output; } } sortIssuesByLevelAndType(); $output = <<