#!/usr/bin/env php .".box/src/Printer.php !=b kG.box/src/IsFulfilled.phpu!=buˤ.box/src/Requirement.php|!=b|*Sn.box/src/IO.php;!=b;F!.box/src/IsExtensionFulfilled.php!=bOP".box/src/IsPhpVersionFulfilled.php?!=b?i.box/src/Terminal.php !=b H”|".box/src/RequirementCollection.php!=bHOo.box/src/Checker.php!=bl%.box/.requirements.php!=b5.box/vendor/autoload.php!=b$6.box/vendor/composer/LICENSE.!=b. ,.box/vendor/composer/autoload_namespaces.php!=bt!פ1.box/vendor/composer/semver/src/VersionParser.php:!=b:(t*.box/vendor/composer/semver/src/Semver.php!=b {..box/vendor/composer/semver/src/Comparator.php!=b9.box/vendor/composer/semver/src/Constraint/Constraint.php!=b:A.box/vendor/composer/semver/src/Constraint/AbstractConstraint.php!=b^_{>.box/vendor/composer/semver/src/Constraint/MultiConstraint.php!=bX>.box/vendor/composer/semver/src/Constraint/EmptyConstraint.php!=b KOB.box/vendor/composer/semver/src/Constraint/ConstraintInterface.php !=b  }z&.box/vendor/composer/autoload_psr4.php4!=b4&.box/vendor/composer/autoload_real.php!=bNl$.box/vendor/composer/ClassLoader.php4!=b4z*.box/vendor/composer/autoload_classmap.php!=b)V(.box/vendor/composer/autoload_static.php !=b y͏.box/bin/check-requirements.php!=b=&Asrc/phpDocumentor/Console/Command/Project/ListSettingsCommand.php!=bx|~Ƥ8src/phpDocumentor/Console/Command/Project/RunCommand.php"!=b"1)src/phpDocumentor/Console/Application.php!=bA8o3src/phpDocumentor/Guides/Handlers/RenderHandler.php !=b Lo.src/phpDocumentor/Guides/DocumentCollector.php!=bPAsrc/phpDocumentor/Guides/References/Resolver/Php/PHPReference.php!=b;ꂤ*src/phpDocumentor/Guides/RenderCommand.php!=buY'src/phpDocumentor/AutoloaderLocator.phpk!=bkD.src/phpDocumentor/Pipeline/PipelineFactory.phpx!=bxп.src/phpDocumentor/Pipeline/Stage/Transform.php!=b.src/phpDocumentor/Pipeline/Stage/Configure.php@ !=b@ 4k,src/phpDocumentor/Pipeline/Stage/Compile.php!=b7src/phpDocumentor/Pipeline/Stage/TransformToPayload.php/!=b/qj98,src/phpDocumentor/Pipeline/Stage/Payload.phpR!=bRN >src/phpDocumentor/Pipeline/Stage/Cache/GarbageCollectCache.php !=b 7^>src/phpDocumentor/Pipeline/Stage/Cache/LoadGuidesFromCache.php!=bܤIsrc/phpDocumentor/Pipeline/Stage/Cache/LoadProjectDescriptorFromCache.php!=b=src/phpDocumentor/Pipeline/Stage/Cache/StoreGuidesToCache.php!=b4ŪHsrc/phpDocumentor/Pipeline/Stage/Cache/StoreProjectDescriptorToCache.php!=br @src/phpDocumentor/Pipeline/Stage/Cache/PurgeCachesWhenForced.php!=bW*2@src/phpDocumentor/Pipeline/Stage/InitializeBuilderFromConfig.php!=bzi7src/phpDocumentor/Pipeline/Stage/Parser/ParseGuides.php1 !=b1 Qa6src/phpDocumentor/Pipeline/Stage/Parser/ParseFiles.php!=bmڤ3src/phpDocumentor/Pipeline/Stage/Parser/Payload.php !=b ѝIHDsrc/phpDocumentor/Pipeline/Stage/Parser/TransformToParserPayload.phpJ!=bJtP8src/phpDocumentor/Pipeline/Stage/Parser/CollectFiles.php!=bۉդsrc/phpDocumentor/Kernel.php2 !=b2 I&src/phpDocumentor/Event/Dispatcher.php !=b c)src/phpDocumentor/Event/EventAbstract.php!=bҽsrc/phpDocumentor/Dsn.php !=b KNsrc/phpDocumentor/DependencyInjection/ReflectionProjectFactoryStrategyPass.php!=bcEޤ!src/phpDocumentor/Application.php!=b6:0src/phpDocumentor/Transformer/Transformation.php!=b*src/phpDocumentor/Transformer/Template.php !=b U}͝9src/phpDocumentor/Transformer/Event/PreTransformEvent.php5!=b5>MAsrc/phpDocumentor/Transformer/Event/WriterInitializationEvent.php5!=b5N?src/phpDocumentor/Transformer/Event/PostTransformationEvent.php)!=b)4:src/phpDocumentor/Transformer/Event/PostTransformEvent.php6!=b6!>src/phpDocumentor/Transformer/Event/PreTransformationEvent.php!=b,-src/phpDocumentor/Transformer/Transformer.php!=b+src/phpDocumentor/Transformer/Exception.phpz!=bz}U3src/phpDocumentor/Transformer/Writer/Sourcecode.phpL!=bL776src/phpDocumentor/Transformer/Writer/Initializable.php!=bˈ?3src/phpDocumentor/Transformer/Writer/Pathfinder.phpA!=bAzԁ0src/phpDocumentor/Transformer/Writer/IoTrait.php !=b Y-src/phpDocumentor/Transformer/Writer/Twig.php !=b 6"..src/phpDocumentor/Transformer/Writer/Graph.php!=bktx/src/phpDocumentor/Transformer/Writer/FileIo.phpX!=bX@(6src/phpDocumentor/Transformer/Writer/PathGenerator.php !=b ̈y=src/phpDocumentor/Transformer/Writer/Twig/FlySystemLoader.php!=bf7src/phpDocumentor/Transformer/Writer/Twig/Extension.php#!=b#M-X@src/phpDocumentor/Transformer/Writer/Twig/EnvironmentFactory.php!=bǔˤ:src/phpDocumentor/Transformer/Writer/Twig/LinkRenderer.php!!=b!Yڸ?src/phpDocumentor/Transformer/Writer/Twig/CommonMarkFactory.php!=b.3@src/phpDocumentor/Transformer/Writer/Twig/ExtensionInterface.php!=b?~9Esrc/phpDocumentor/Transformer/Writer/Exception/RequirementMissing.php!=b+>C4src/phpDocumentor/Transformer/Writer/RenderGuide.php !=b g 3src/phpDocumentor/Transformer/Writer/Collection.php!=bUCsrc/phpDocumentor/Transformer/Writer/Graph/PlantumlClassDiagram.php7!=b70?src/phpDocumentor/Transformer/Writer/Graph/PlantumlRenderer.phpK!=bK|y8src/phpDocumentor/Transformer/Writer/Graph/Generator.php!=bf@VCsrc/phpDocumentor/Transformer/Writer/Graph/GraphVizClassDiagram.php;!=b;Ƒ67src/phpDocumentor/Transformer/Writer/WriterAbstract.php!=buADsrc/phpDocumentor/Transformer/Router/ClassBasedFqsenUrlGenerator.phpb!=bbQ*/src/phpDocumentor/Transformer/Router/Router.php@!=b@c֤2src/phpDocumentor/Transformer/Template/Factory.phpP!=bP;src/phpDocumentor/Transformer/Template/TemplateNotFound.phpn!=bnm]$4src/phpDocumentor/Transformer/Template/Parameter.php!=b^G5src/phpDocumentor/Transformer/Template/Collection.php!=b]2src/phpDocumentor/Descriptor/ProjectDescriptor.php !=b )6src/phpDocumentor/Descriptor/TableOfContents/Entry.php!=b[U4src/phpDocumentor/Descriptor/NamespaceDescriptor.phpA !=bA D23src/phpDocumentor/Descriptor/FunctionDescriptor.phpA!=bAV ?src/phpDocumentor/Descriptor/DocBlock/DescriptionDescriptor.php^!=b^=5src/phpDocumentor/Descriptor/Tag/AuthorDescriptor.php!=bX6src/phpDocumentor/Descriptor/Tag/ExampleDescriptor.php!=b2src/phpDocumentor/Descriptor/Tag/VarDescriptor.php!=b3<9src/phpDocumentor/Descriptor/Tag/DeprecatedDescriptor.phpr!=brL2src/phpDocumentor/Descriptor/Tag/SeeDescriptor.php!=bnH4src/phpDocumentor/Descriptor/Tag/SinceDescriptor.phpi!=bizz+6src/phpDocumentor/Descriptor/Tag/VersionDescriptor.phpk!=bk)aG7src/phpDocumentor/Descriptor/Tag/PropertyDescriptor.php!=b݃<src/phpDocumentor/Descriptor/Tag/BaseTypes/TypedAbstract.php"!=b"c?Dsrc/phpDocumentor/Descriptor/Tag/BaseTypes/TypedVariableAbstract.phpu!=bus-3src/phpDocumentor/Descriptor/Tag/LinkDescriptor.phpS!=bSn5src/phpDocumentor/Descriptor/Tag/ThrowsDescriptor.php!=bSl/5src/phpDocumentor/Descriptor/Tag/ReturnDescriptor.php!=be3src/phpDocumentor/Descriptor/Tag/UsesDescriptor.php!=bÛ4src/phpDocumentor/Descriptor/Tag/ParamDescriptor.php!=b!Z5src/phpDocumentor/Descriptor/Tag/MethodDescriptor.php!=b9src/phpDocumentor/Descriptor/ProjectDescriptorBuilder.php!=b] ./src/phpDocumentor/Descriptor/Example/Finder.php !=b z;3src/phpDocumentor/Descriptor/DocumentDescriptor.php-!=b-D0src/phpDocumentor/Descriptor/ProjectAnalyzer.phpf!=bfl/src/phpDocumentor/Descriptor/FileDescriptor.php!=b&z/src/phpDocumentor/Descriptor/EnumDescriptor.php !=b 3src/phpDocumentor/Descriptor/ArgumentDescriptor.phpD!=bD\MM2src/phpDocumentor/Descriptor/VersionDescriptor.php!=boq3src/phpDocumentor/Descriptor/PropertyDescriptor.phpB !=bB &Esrc/phpDocumentor/Descriptor/Exception/MissingDependencyException.php!=b=_3src/phpDocumentor/Descriptor/GuideSetDescriptor.php!=b锤1src/phpDocumentor/Descriptor/Validation/Error.php!=bF`.src/phpDocumentor/Descriptor/TocDescriptor.phpC!=bC#;src/phpDocumentor/Descriptor/DocumentationSetDescriptor.php!=bh0src/phpDocumentor/Descriptor/ClassDescriptor.php !=b e+src/phpDocumentor/Descriptor/Collection.php6 !=b6 c2src/phpDocumentor/Descriptor/PackageDescriptor.php!=bnAsrc/phpDocumentor/Descriptor/Builder/Reflector/TraitAssembler.php!=bUxEsrc/phpDocumentor/Descriptor/Builder/Reflector/NamespaceAssembler.php!=bCGAsrc/phpDocumentor/Descriptor/Builder/Reflector/ClassAssembler.php !=b 2UDsrc/phpDocumentor/Descriptor/Builder/Reflector/AssemblerAbstract.php^ !=b^ !=b> Dsrc/phpDocumentor/Descriptor/Builder/Reflector/PropertyAssembler.phpo!=boy'Esrc/phpDocumentor/Descriptor/Builder/Reflector/InterfaceAssembler.php!=bVDsrc/phpDocumentor/Descriptor/Builder/Reflector/EnumCaseAssembler.php!=bbMҤDsrc/phpDocumentor/Descriptor/Builder/Reflector/ConstantAssembler.php!=bC@src/phpDocumentor/Descriptor/Builder/Reflector/FileAssembler.php!=bo 0@src/phpDocumentor/Descriptor/Builder/Reflector/EnumAssembler.phpD !=bD )N2Fsrc/phpDocumentor/Descriptor/Builder/Reflector/Tags/ParamAssembler.php !=b Hsrc/phpDocumentor/Descriptor/Builder/Reflector/Tags/VersionAssembler.php!=b]Hsrc/phpDocumentor/Descriptor/Builder/Reflector/Tags/BaseTagAssembler.phpx!=bxzFsrc/phpDocumentor/Descriptor/Builder/Reflector/Tags/SinceAssembler.php!=b'Esrc/phpDocumentor/Descriptor/Builder/Reflector/Tags/UsesAssembler.php!=b@NIsrc/phpDocumentor/Descriptor/Builder/Reflector/Tags/PropertyAssembler.php!=b58Hsrc/phpDocumentor/Descriptor/Builder/Reflector/Tags/ExampleAssembler.php!=b9BDsrc/phpDocumentor/Descriptor/Builder/Reflector/Tags/SeeAssembler.php!=bkb;src/phpDocumentor/Descriptor/Builder/AssemblerInterface.phpj!=bjvR9src/phpDocumentor/Descriptor/Builder/AssemblerReducer.php!=b]>src/phpDocumentor/Descriptor/Cache/ProjectDescriptorMapper.php !=b MJ+src/phpDocumentor/Descriptor/Descriptor.php!=b:p9̤.src/phpDocumentor/Descriptor/TagDescriptor.php!=bjEsrc/phpDocumentor/Descriptor/ProjectDescriptor/WithCustomSettings.php!=b/``;src/phpDocumentor/Descriptor/ProjectDescriptor/Settings.php<!=b<"7src/phpDocumentor/Descriptor/Filter/FilterInterface.php!=b<5src/phpDocumentor/Descriptor/Filter/StripInternal.php!=b8src/phpDocumentor/Descriptor/Filter/StripIgnoredTags.php!=b^m3src/phpDocumentor/Descriptor/Filter/StripIgnore.php!=bq.src/phpDocumentor/Descriptor/Filter/Filter.php!=bj<09src/phpDocumentor/Descriptor/Filter/StripOnVisibility.php !=b kd{2src/phpDocumentor/Descriptor/Filter/Filterable.php;!=b;d5src/phpDocumentor/Descriptor/Filter/FilterPayload.php&!=b&71src/phpDocumentor/Descriptor/ApiSetDescriptor.phpw!=bwNV3src/phpDocumentor/Descriptor/ConstantDescriptor.php% !=b% U3src/phpDocumentor/Descriptor/EnumCaseDescriptor.phpU!=bUON0src/phpDocumentor/Descriptor/TraitDescriptor.phpZ !=bZ 23src/phpDocumentor/Descriptor/DescriptorAbstract.php^!=b^r.4src/phpDocumentor/Descriptor/InterfaceDescriptor.phpr!=brm7x;src/phpDocumentor/Descriptor/Interfaces/MethodInterface.phpc!=bc i9src/phpDocumentor/Descriptor/Interfaces/TypeInterface.php!=b8<src/phpDocumentor/Descriptor/Interfaces/ProjectInterface.php!=bD]s=src/phpDocumentor/Descriptor/Interfaces/PropertyInterface.phpl!=blm=src/phpDocumentor/Descriptor/Interfaces/ConstantInterface.php!=b.<src/phpDocumentor/Descriptor/Interfaces/ElementInterface.php!=b39src/phpDocumentor/Descriptor/Interfaces/EnumInterface.php8!=b8o):src/phpDocumentor/Descriptor/Interfaces/ChildInterface.php"!=b"V|:>src/phpDocumentor/Descriptor/Interfaces/NamespaceInterface.phpE!=bE2>src/phpDocumentor/Descriptor/Interfaces/InterfaceInterface.php !=b 5:src/phpDocumentor/Descriptor/Interfaces/ClassInterface.php!=bRV<src/phpDocumentor/Descriptor/Interfaces/PackageInterface.php!=bڏĤ9src/phpDocumentor/Descriptor/Interfaces/FileInterface.php_!=b_Y\ߤ:src/phpDocumentor/Descriptor/Interfaces/TraitInterface.php!=bi=src/phpDocumentor/Descriptor/Interfaces/FunctionInterface.phpr!=bruz_:?src/phpDocumentor/Descriptor/Interfaces/VisibilityInterface.php!=b,P9X>src/phpDocumentor/Descriptor/Interfaces/ContainerInterface.php!=bl=src/phpDocumentor/Descriptor/Interfaces/EnumCaseInterface.php!=bާ0=src/phpDocumentor/Descriptor/Interfaces/ArgumentInterface.php!=bq21src/phpDocumentor/Descriptor/MethodDescriptor.php!=b'#O*src/phpDocumentor/Parser/ReEncodedFile.phpP!=bPG .src/phpDocumentor/Parser/FileSystemFactory.php!=b:src/phpDocumentor/Parser/SpecificationFactoryInterface.php.!=b.b1src/phpDocumentor/Parser/SpecificationFactory.php+!=b+U{֤/src/phpDocumentor/Parser/FlySystemCollector.phpB!=bBNؤ/src/phpDocumentor/Parser/Event/PreFileEvent.php!=bQ2src/phpDocumentor/Parser/Event/PreParsingEvent.php!=bΥ-src/phpDocumentor/Parser/FlySystemFactory.phpU!=bU@gJ=src/phpDocumentor/Parser/Exception/FilesNotFoundException.php!=b,(src/phpDocumentor/Parser/FileFactory.php`!=b`$*src/phpDocumentor/Parser/FlySystemFile.php!=b4src/phpDocumentor/Parser/Cache/FilesystemAdapter.phpl!=bla*src/phpDocumentor/Parser/Cache/Locator.php!=b#O*src/phpDocumentor/Parser/FileCollector.php!=bۡ3#src/phpDocumentor/Parser/Parser.php !=b oY,src/phpDocumentor/Parser/FlySystemMirror.php!=b&:src/phpDocumentor/Parser/Middleware/EmittingMiddleware.php!=b32?src/phpDocumentor/Parser/Middleware/ErrorHandlingMiddleware.php+!=b+tq;src/phpDocumentor/Parser/Middleware/StopwatchMiddleware.php&!=b&pwo7src/phpDocumentor/Parser/Middleware/CacheMiddleware.php!=b B5X<src/phpDocumentor/Parser/Middleware/ReEncodingMiddleware.phpw!=bwZ8:src/phpDocumentor/Compiler/Pass/TableOfContentsBuilder.php !=b t8src/phpDocumentor/Compiler/Pass/NamespaceTreeBuilder.phpK!=bK[&ګ4src/phpDocumentor/Compiler/Pass/RemoveSourcecode.php#!=b#c6src/phpDocumentor/Compiler/Pass/PackageTreeBuilder.phpx!=bxk);src/phpDocumentor/Compiler/Pass/MarkerFromTagsExtractor.php.!=b.2<)src/phpDocumentor/Compiler/Pass/Debug.php!=bs78src/phpDocumentor/Compiler/Pass/ElementsIndexBuilder.php8!=b88src/phpDocumentor/Compiler/Pass/ResolveInlineMarkers.php!=b9ɤ,src/phpDocumentor/Compiler/Linker/Linker.php!=bh%$:src/phpDocumentor/Compiler/Linker/DescriptorRepository.php !=b ~ U'src/phpDocumentor/Compiler/Compiler.php!=b6ޤ4src/phpDocumentor/Compiler/CompilerPassInterface.php!=bX=src/phpDocumentor/Configuration/PathNormalizingMiddleware.php4 !=b4 wIsrc/phpDocumentor/Configuration/ProvideTemplateOverridePathMiddleware.php!=bc⥤7src/phpDocumentor/Configuration/MiddlewareInterface.php!=bc6src/phpDocumentor/Configuration/GuideSpecification.php!=b+*Dsrc/phpDocumentor/Configuration/Exception/UpgradeFailedException.php!=b2,ͤHsrc/phpDocumentor/Configuration/Exception/InvalidConfigPathException.php!=bd%Osrc/phpDocumentor/Configuration/Exception/UnSupportedConfigVersionException.php!=bͰi@src/phpDocumentor/Configuration/CommandlineOptionsMiddleware.phpM&!=bM&=h*src/phpDocumentor/Configuration/Source.php!=b9٤8src/phpDocumentor/Configuration/VersionSpecification.php!=b .5src/phpDocumentor/Configuration/LegacyArrayAccess.php!=b4src/phpDocumentor/Configuration/ApiSpecification.php !=b K91src/phpDocumentor/Configuration/Configuration.php!=bJ7src/phpDocumentor/Configuration/Definition/Version3.phpc!=bc57src/phpDocumentor/Configuration/Definition/Version2.php6!=b6CT;src/phpDocumentor/Configuration/Definition/Normalizable.php!=bv 9src/phpDocumentor/Configuration/Definition/Upgradable.php!=bn28src/phpDocumentor/Configuration/SymfonyConfigFactory.php !=b d# 8src/phpDocumentor/Configuration/ConfigurationFactory.phpU !=bU Ksrc/phpDocumentor/Path.php !=b , src/phpDocumentor/UriFactory.php!=b٫ symfony.lock\!=b\? composer.json !=b ` composer.lock_!=b_VERSION!=bconfig/bundles.php!=b{=Aconfig/secrets/prod/.gitkeep!=bdata/xsd/phpdoc.xsd)!=b)z%data/templates/default/enum.html.twig!=bB,data/templates/default/objects/grid.css.twig !=b pR{-data/templates/default/objects/links.css.twig!=b{b1data/templates/default/objects/paragraph.css.twigN!=bNʴ0data/templates/default/objects/headings.css.twig!=b.data/templates/default/objects/images.css.twig!=bY!1-data/templates/default/objects/lists.css.twig!=bn/data/templates/default/objects/section.css.twig:!=b:RN,data/templates/default/objects/code.css.twigm!=bm23.-data/templates/default/objects/forms.css.twig!=b2:/data/templates/default/objects/buttons.css.twig!=b,data/templates/default/objects/line.css.twig!=b.data/templates/default/objects/tables.css.twig!=b#kΤ2data/templates/default/objects/blockquote.css.twig-!=b-+Ͷؤ*data/templates/default/namespace.html.twig!=bsU-data/templates/default/graphs/class.html.twigt!=btxL'data/templates/default/layout.html.twig !=b b*data/templates/default/searchIndex.js.twig!=bkt&data/templates/default/trait.html.twig!=bפ,data/templates/default/icons/source.svg.twigm!=bm9.data/templates/default/icons/constant.svg.twig!=ba*/data/templates/default/icons/protected.svg.twig!=b !9-data/templates/default/icons/private.svg.twig!=b Q,data/templates/default/icons/method.svg.twig!=b+b%data/templates/default/file.html.twig!=b(data/templates/default/package.html.twig!=b,7data/templates/default/components/back-to-top.html.twigo!=boG3data/templates/default/components/sidebar.html.twig7!=b7\%>data/templates/default/components/constant-signature.html.twigN!=bNI4data/templates/default/components/constant.html.twig!!=b!e0z6data/templates/default/components/description.css.twigE!=bEp6data/templates/default/components/file-title.html.twig>!=b>|<data/templates/default/components/table-of-contents.css.twig !=b U^4data/templates/default/components/signature.css.twig!=buۤ8data/templates/default/components/source-modal.html.twig !=b &Q5data/templates/default/components/enum-case.html.twig!=b#Cp0data/templates/default/components/menu.html.twig!=bŠf6data/templates/default/components/class-graph.css.twig!=bbMCdata/templates/default/components/table-of-contents-entry.html.twig!=b4data/templates/default/components/function.html.twigj!=bjD^>3data/templates/default/components/methods.html.twig!=b%w2data/templates/default/components/topnav.html.twig!=bv07data/templates/default/components/description.html.twig!=bmAxŤ7data/templates/default/components/class-title.html.twig!=b _5data/templates/default/components/functions.html.twig!=b6data/templates/default/components/back-to-top.css.twig!=b D>7data/templates/default/components/header-title.css.twig!=bbF7data/templates/default/components/source-modal.css.twig!=b-S<data/templates/default/components/method-signature.html.twigh!=bhDspB9data/templates/default/components/search-results.css.twig!=bx<data/templates/default/components/element-found-in.html.twig!=bޤ;data/templates/default/components/method-response.html.twig!=b`'2data/templates/default/components/search.html.twign!=bn>n¤=data/templates/default/components/table-of-contents.html.twig !=b QP;data/templates/default/components/element-found-in.css.twig!=b<2data/templates/default/components/summary.css.twig3!=b3 '2data/templates/default/components/sidebar.css.twig !=b V5data/templates/default/components/admonition.css.twig!=bE96data/templates/default/components/breadcrumbs.css.twig!=b=q<data/templates/default/components/method-arguments.html.twigg!=bgħ1data/templates/default/components/search.css.twig.!=b.e:data/templates/default/components/search-results.html.twigW!=bW9.T6data/templates/default/components/properties.html.twig!=b Ƥ;data/templates/default/components/interface-title.html.twig!=bBl]6data/templates/default/components/enum-cases.html.twig!=bh>data/templates/default/components/property-signature.html.twig!=b57data/templates/default/components/trait-title.html.twigo!=bo(W1data/templates/default/components/header.css.twig!!=b!/68data/templates/default/components/header-title.html.twigx!=bx6;data/templates/default/components/namespace-title.html.twigh!=bh_7data/templates/default/components/breadcrumbs.html.twig!=b 2data/templates/default/components/element.css.twig!=bm4data/templates/default/components/property.html.twigB!=bBXX0W:data/templates/default/components/element-header.html.twig!=bH&1data/templates/default/components/topnav.css.twig!=b\?0data/templates/default/components/tags.html.twig!=bF 5data/templates/default/components/constants.html.twig!=b؄3data/templates/default/components/summary.html.twig^!=b^+2data/templates/default/components/header.html.twig!=bk26data/templates/default/components/enum-title.html.twig!=bA]o3data/templates/default/components/tag-list.css.twig}!=b}S2data/templates/default/components/method.html.twig&!=b&#̲Ҥ%data/templates/default/search.js.twig!=b,data/templates/default/css/template.css.twig!=bɤ-data/templates/default/css/normalize.css.twig!=bP-data/templates/default/css/variables.css.twig!=b=(data/templates/default/css/base.css.twig!=bͻޤ-data/templates/default/css/utilities.css.twig!=b3*data/templates/default/css/custom.css.twig~!=b~S#data/templates/default/template.xml !=b .data/templates/default/indices/files.html.twigq!=bqU{%data/templates/default/base.html.twig!!=b! &data/templates/default/class.html.twigT!=bTj^]+data/templates/default/guides/toc.html.twigw!=bw,ҢV-data/templates/default/guides/image.html.twig!=b.80data/templates/default/guides/emphasis.html.twig!=b=U.+data/templates/default/guides/code.tex.twigf!=bf3L7data/templates/default/guides/strong-emphasis.html.twig !=b 1 /data/templates/default/guides/emphasis.tex.twig(!=b(I7data/templates/default/guides/definition-list.html.twigr!=brZa/data/templates/default/guides/literal.html.twig"!=b"x0data/templates/default/guides/paragraph.tex.twig{!=b{w+data/templates/default/guides/link.tex.twig!=b,data/templates/default/guides/list.html.twigU!=bU Ҥ5data/templates/default/guides/section-begin.html.twig3!=b30data/templates/default/guides/toc-item.html.twig!=b0M.data/templates/default/guides/anchor.html.twig!=bEjZ7data/templates/default/guides/stylesheet-link.html.twig;!=b; +data/templates/default/guides/meta.tex.twig!=b.data/templates/default/guides/footer.html.twig!=bN -data/templates/default/guides/table.html.twig!=b&/data/templates/default/guides/document.tex.twig!=b"+data/templates/default/guides/uml.html.twigy!=byuʤ+data/templates/default/guides/list.tex.twig!=bm!/data/templates/default/guides/favicon.html.twig9!=b9 +yܤ,data/templates/default/guides/nbsp.html.twig!=b3data/templates/default/guides/section-end.html.twig!=b>(ߤ,data/templates/default/guides/meta.html.twig:!=b:che0data/templates/default/guides/list-item.tex.twig!=bw0data/templates/default/guides/document.html.twig3!=b3/1data/templates/default/guides/paragraph.html.twig!=bOä)data/templates/default/guides/br.tex.twig !=b ^m豤-data/templates/default/guides/anchor.tex.twig)!=b)/Jg*data/templates/default/guides/toc.tex.twigf!=bfo_2data/templates/default/guides/javascript.html.twig8!=b8-data/templates/default/guides/title.html.twig!=b|1data/templates/default/guides/toc-level.html.twig!=by:data/templates/default/guides/directives/sidebar.html.twig!=bNcߤ@data/templates/default/guides/directives/literal-block.html.twig !=b =c=data/templates/default/guides/directives/admonition.html.twig!=bx8data/templates/default/guides/directives/topic.html.twig`!=b`)M[<data/templates/default/guides/directives/container.html.twigr!=br ;9,data/templates/default/guides/code.html.twig!=b{k*data/templates/default/guides/br.html.twig!=b&Q4data/templates/default/guides/header-title.html.twigD!=bD/$v6data/templates/default/guides/strong-emphasis.tex.twig(!=b([d1data/templates/default/guides/list-item.html.twigB!=bB-data/templates/default/guides/quote.html.twigw!=bw&<,data/templates/default/guides/link.html.twigr!=br`\,data/templates/default/guides/title.tex.twig?!=b?d+data/templates/default/guides/nbsp.tex.twig!=b.data/templates/default/guides/figure.html.twig!=bD0data/templates/default/guides/separator.tex.twig!=b n1data/templates/default/guides/separator.html.twig!=b@r).data/templates/default/guides/literal.tex.twig!=ba9|,data/templates/default/guides/quote.tex.twig?!=b?̤,data/templates/default/guides/image.tex.twig1!=b1J|5e&data/templates/default/index.html.twigO!=bOG/ *data/templates/default/interface.html.twig#!=b#]L3data/templates/default/reports/deprecated.html.twig!=bp/data/templates/default/reports/errors.html.twigo!=bo10data/templates/default/reports/markers.html.twig!=b6!Adata/templates/responsive-twig/img/glyphicons-halflings-white.png!=b2zǤ.data/templates/responsive-twig/img/favicon.ico~!=b~\W>data/templates/responsive-twig/img/iviewer/iviewer.zoom_in.png!=bMז@data/templates/responsive-twig/img/iviewer/iviewer.zoom_zero.pngC!=bC?data/templates/responsive-twig/img/iviewer/iviewer.zoom_fit.png!=b2Ф?data/templates/responsive-twig/img/iviewer/iviewer.zoom_in2.gifZ!=bZ*Cdata/templates/responsive-twig/img/iviewer/iviewer.rotate_right.png!=b-ĢϤ@data/templates/responsive-twig/img/iviewer/iviewer.zoom_out2.gifE!=bEt?data/templates/responsive-twig/img/iviewer/iviewer.zoom_out.png!=b^@data/templates/responsive-twig/img/iviewer/iviewer.zoom_fit2.gif_!=b_& Bdata/templates/responsive-twig/img/iviewer/iviewer.rotate_left.png!=btmAdata/templates/responsive-twig/img/iviewer/iviewer.zoom_zero2.gifb!=bbL73data/templates/responsive-twig/img/iviewer/grab.cur~!=b~'23data/templates/responsive-twig/img/iviewer/hand.cur~!=b~hګ;data/templates/responsive-twig/img/glyphicons-halflings.png!=b!ˤ1data/templates/responsive-twig/img/icons/file.gifn!=bnG~N4data/templates/responsive-twig/img/icons/favicon.ico~!=b~3data/templates/responsive-twig/img/icons/folder.gifj!=bjZrAdata/templates/responsive-twig/img/icons/icon-folder-open-big.png!=b3data/templates/responsive-twig/img/icons/method.pngy!=by?`0Ǥ5data/templates/responsive-twig/img/icons/file-php.png!=b .:data/templates/responsive-twig/img/icons/icon_template.svgU !=bU t%F3data/templates/responsive-twig/img/icons/search.gif!=b>2data/templates/responsive-twig/img/icons/class.png!=bJX7data/templates/responsive-twig/img/icons/arrow_down.png^!=b^8V5data/templates/responsive-twig/img/icons/property.pngh!=bh5data/templates/responsive-twig/img/icons/function.pngR!=bRK+H?data/templates/responsive-twig/img/icons/visibility_private.pngi !=bi 8data/templates/responsive-twig/img/icons/arrow_right.pngt!=bttF>data/templates/responsive-twig/img/icons/visibility_public.png{ !=b{ /s6data/templates/responsive-twig/img/icons/interface.png!=bWG8data/templates/responsive-twig/img/icons/view_source.png[!=b[EQ5data/templates/responsive-twig/img/icons/variable.png=!=b=&8data/templates/responsive-twig/img/icons/icon-th-big.pngj!=bjs̤Adata/templates/responsive-twig/img/icons/visibility_protected.png!=bm/data/templates/responsive-twig/img/icons/ok.pnge!=be "5data/templates/responsive-twig/img/icons/constant.png!=b0Aפ7data/templates/responsive-twig/img/apple-touch-icon.png !=b u-data/templates/responsive-twig/img/loader.gifv!=bv z?data/templates/responsive-twig/img/apple-touch-icon-114x114.pngn!=bnl=data/templates/responsive-twig/img/apple-touch-icon-72x72.png1!=b1C2data/templates/responsive-twig/namespace.html.twig!=b%ܤ5data/templates/responsive-twig/graphs/class.html.twig!=baE3data/templates/responsive-twig/js/jquery.panzoom.js 9!=b 9A:data/templates/responsive-twig/js/jquery.mousewheel.min.jsh!=bhɅ,4data/templates/responsive-twig/js/jquery.splitter.js-!=b-#5data/templates/responsive-twig/js/jquery-1.7.1.min.js!=b,data/templates/responsive-twig/js/sidebar.js!=b2data/templates/responsive-twig/js/jquery.cookie.js!=bs3data/templates/responsive-twig/js/jquery.iviewer.js*!=b*(K-data/templates/responsive-twig/js/template.js$&!=b$&2l4data/templates/responsive-twig/js/jquery.xml2json.js!=b+data/templates/responsive-twig/js/SVGPan.js!=b@?data/templates/responsive-twig/js/jquery-ui-1.8.2.custom.min.js(!=b(cޤ7data/templates/responsive-twig/js/jquery.iviewer.min.jsR=!=bR=95data/templates/responsive-twig/js/prettify/lang-ml.jsS!=bSm @6data/templates/responsive-twig/js/prettify/lang-sql.js!=b5data/templates/responsive-twig/js/prettify/lang-vb.js!=bB5data/templates/responsive-twig/js/prettify/lang-xq.jsZ!=bZċO6data/templates/responsive-twig/js/prettify/lang-tex.js!=bbe7data/templates/responsive-twig/js/prettify/lang-lisp.js!=b9פ:data/templates/responsive-twig/js/prettify/prettify.min.js@5!=b@5;J8data/templates/responsive-twig/js/prettify/lang-scala.js!=bP7data/templates/responsive-twig/js/prettify/lang-wiki.js!!=b!.:6data/templates/responsive-twig/js/prettify/lang-lua.js*!=b*٨6data/templates/responsive-twig/js/prettify/lang-clj.js!=bޤ4data/templates/responsive-twig/js/prettify/lang-n.jsx!=bxV7e5data/templates/responsive-twig/js/prettify/lang-go.js!=b7data/templates/responsive-twig/js/prettify/lang-yaml.js!=b,I6data/templates/responsive-twig/js/prettify/lang-css.js]!=b],z7data/templates/responsive-twig/js/prettify/lang-vhdl.js!=b9data/templates/responsive-twig/js/prettify/lang-apollo.js!=bdfŊ8data/templates/responsive-twig/js/prettify/lang-proto.js.!=b.5data/templates/responsive-twig/js/prettify/lang-hs.js9!=b9uk3V5data/templates/responsive-twig/js/jquery.tools.min.jsĵ!=bĵBbe4data/templates/responsive-twig/js/jqplot/gpl-2.0.txt ;!=b ;4data/templates/responsive-twig/js/jqplot/changes.txtzT!=bzT%y=data/templates/responsive-twig/js/jqplot/jquery.jqplot.min.js!=bF:Qdata/templates/responsive-twig/js/jqplot/plugins/jqplot.canvasTextRenderer.min.js >!=b >69פJdata/templates/responsive-twig/js/jqplot/plugins/jqplot.pointLabels.min.js1!=b11Rdata/templates/responsive-twig/js/jqplot/plugins/jqplot.pyramidGridRenderer.min.js !=b 'Ndata/templates/responsive-twig/js/jqplot/plugins/jqplot.pyramidRenderer.min.js]!!=b]!MsOOdata/templates/responsive-twig/js/jqplot/plugins/jqplot.dateAxisRenderer.min.jsR'!=bR''Ldata/templates/responsive-twig/js/jqplot/plugins/jqplot.donutRenderer.min.js3!=b3BHdata/templates/responsive-twig/js/jqplot/plugins/jqplot.trendline.min.js !=b 9Gdata/templates/responsive-twig/js/jqplot/plugins/jqplot.ciParser.min.js!=btJdata/templates/responsive-twig/js/jqplot/plugins/jqplot.highlighter.min.js!=b,?Ndata/templates/responsive-twig/js/jqplot/plugins/jqplot.logAxisRenderer.min.js!=beoX4Ldata/templates/responsive-twig/js/jqplot/plugins/jqplot.blockRenderer.min.js !=b LEdata/templates/responsive-twig/js/jqplot/plugins/jqplot.mobile.min.js!=b/Vdata/templates/responsive-twig/js/jqplot/plugins/jqplot.canvasAxisLabelRenderer.min.js !=b ơ^Ldata/templates/responsive-twig/js/jqplot/plugins/jqplot.canvasOverlay.min.js9!=b9Qdata/templates/responsive-twig/js/jqplot/plugins/jqplot.meterGaugeRenderer.min.jsmF!=bmFRdata/templates/responsive-twig/js/jqplot/plugins/jqplot.BezierCurveRenderer.min.js!=b ݤKdata/templates/responsive-twig/js/jqplot/plugins/jqplot.ohlcRenderer.min.jsD!=bD[VMdata/templates/responsive-twig/js/jqplot/plugins/jqplot.bubbleRenderer.min.js2!=b2}Rdata/templates/responsive-twig/js/jqplot/plugins/jqplot.pyramidAxisRenderer.min.js)!=b) IJdata/templates/responsive-twig/js/jqplot/plugins/jqplot.pieRenderer.min.jsN5!=bN5&Gdata/templates/responsive-twig/js/jqplot/plugins/jqplot.dragable.min.jsO!=bO&@Mdata/templates/responsive-twig/js/jqplot/plugins/jqplot.funnelRenderer.min.js4!=b412Ddata/templates/responsive-twig/js/jqplot/plugins/jqplot.json2.min.js !=b M Pdata/templates/responsive-twig/js/jqplot/plugins/jqplot.mekkoAxisRenderer.min.js~$!=b~$nԤUdata/templates/responsive-twig/js/jqplot/plugins/jqplot.enhancedLegendRenderer.min.js!=b>LǤEdata/templates/responsive-twig/js/jqplot/plugins/jqplot.cursor.min.jsPI!=bPIyLdata/templates/responsive-twig/js/jqplot/plugins/jqplot.mekkoRenderer.min.js!=bUdata/templates/responsive-twig/js/jqplot/plugins/jqplot.canvasAxisTickRenderer.min.js !=b EJSdata/templates/responsive-twig/js/jqplot/plugins/jqplot.categoryAxisRenderer.min.js2&!=b2&LUڤJdata/templates/responsive-twig/js/jqplot/plugins/jqplot.barRenderer.min.jso4!=bo4៯@>data/templates/responsive-twig/js/jqplot/jquery.jqplot.min.css !=b g;T6data/templates/responsive-twig/js/jqplot/copyright.txt!=bå!8data/templates/responsive-twig/js/jqplot/MIT-LICENSE.txt;!=b;0K8data/templates/responsive-twig/js/jqplot/excanvas.min.jsL!=bL/*ڤ3data/templates/responsive-twig/js/jqplot/README.txtW !=bW 4data/templates/responsive-twig/js/jquery.treeview.js !=b XW)data/templates/responsive-twig/js/menu.js!=b4.data/templates/responsive-twig/js/bootstrap.js!!=b!R5data/templates/responsive-twig/js/jquery-1.4.2.min.js!=b42data/templates/responsive-twig/js/bootstrap.min.jsP!=bPk:&D/data/templates/responsive-twig/layout.html.twig!=bt0data/templates/responsive-twig/package.html.twig!=bBF5data/templates/responsive-twig/base/sidebar.html.twig!=bK4data/templates/responsive-twig/base/macros.html.twig!=bb;data/templates/responsive-twig/base/class.sidebar.html.twigL!=bL~/data/templates/responsive-twig/css/prettify.css!=bC+v0data/templates/responsive-twig/css/bootstrap.cssZ>!=bZ>I~4data/templates/responsive-twig/css/bootstrap.min.cssU!=bU1?data/templates/responsive-twig/css/bootstrap-responsive.min.css!=bp;data/templates/responsive-twig/css/bootstrap-responsive.css#)!=b#)/data/templates/responsive-twig/css/template.css5%!=b5%Gh5data/templates/responsive-twig/css/jquery.iviewer.css3!=b3Ԥ+data/templates/responsive-twig/template.xml!=b.data/templates/responsive-twig/class.html.twig&!=b&9.data/templates/responsive-twig/index.html.twig !=b  o;data/templates/responsive-twig/reports/deprecated.html.twig~ !=b~ dZ[7data/templates/responsive-twig/reports/errors.html.twigs !=bs ͂a8data/templates/responsive-twig/reports/markers.html.twig !=b }/data/templates/responsive-twig/method.html.twig!=b09G"data/templates/clean/htaccess.dist!=br@0data/templates/clean/elements/constant.html.twigz !=bz uW:data/templates/clean/elements/namespaces.sidebar.html.twig!=bT0data/templates/clean/elements/property.html.twig~ !=b~ 8.data/templates/clean/elements/method.html.twig!=b.(data/templates/clean/namespace.html.twigx!=bx,$)data/templates/clean/file.source.txt.twig!=bIf`1data/templates/clean/font/fontawesome-webfont.svg/!=b/} )data/templates/clean/font/FontAwesome.otf%!=b%Xy2data/templates/clean/font/fontawesome-webfont.woff0G!=b0GD֤1data/templates/clean/font/fontawesome-webfont.ttf(!=b($F1data/templates/clean/font/fontawesome-webfont.eot!=bdata/templates/clean/css/phpdocumentor-clean-icons/Read Me.txtX!=bXY <data/templates/clean/css/phpdocumentor-clean-icons/style.css?!=b?DEVdata/templates/clean/css/phpdocumentor-clean-icons/fonts/phpdocumentor-clean-icons.svgM!=bMuWdata/templates/clean/css/phpdocumentor-clean-icons/fonts/phpdocumentor-clean-icons.woff(!=b(Zdata/templates/clean/css/phpdocumentor-clean-icons/fonts/phpdocumentor-clean-icons.dev.svg!=blVdata/templates/clean/css/phpdocumentor-clean-icons/fonts/phpdocumentor-clean-icons.eot !=b ˲Vdata/templates/clean/css/phpdocumentor-clean-icons/fonts/phpdocumentor-clean-icons.ttf !=b @f=data/templates/clean/css/phpdocumentor-clean-icons/lte-ie7.js!=b;O;%data/templates/clean/css/template.css!!=b!5=<data/templates/clean/css/bootstrap-combined.no-icons.min.css2!=b26"data/templates/clean/css/prism.css !=b Cy+data/templates/clean/css/jquery.iviewer.css !=b ,~be!data/templates/clean/template.xml !=b i$$data/templates/clean/class.html.twigB!=bB<(data/templates/clean/interface.html.twig)!=b)vn1data/templates/clean/reports/deprecated.html.twig !=b -data/templates/clean/reports/errors.html.twig !=b .data/templates/clean/reports/markers.html.twig !=b 1 data/templates/checkstyle/README!=b&data/templates/checkstyle/template.xmlL!=bLXF*data/templates/xml/namespace_tree.xml.twig!=b,R$data/templates/xml/argument.xml.twig!=b$N&ؤ$data/templates/xml/property.xml.twig!=b\"data/templates/xml/method.xml.twig!=bi$data/templates/xml/constant.xml.twig!=b%data/templates/xml/structure.xml.twigE!=bE\U^data/templates/xml/template.xml!=b>$data/templates/xml/docblock.xml.twig!=bDǛ$data/asset-builder/package-lock.jsonn!=bndata/asset-builder/package.json!=b*+vdata/website/Dockerfile !=b h data/website/docs.conf!=bwפdata/website/demo.conf!=bu(data/website/demo/screenshot-default.png+!=b+ fɤ!data/website/demo/index.html.dist+2!=b+2^'data/website/demo/redirectToLatest.html!=bdata/website/www.conf!=b$][data/website/site/favicon.ico:!=b:hŤ#data/website/site/favicon-16x16.png[!=b[eQ,data/website/site/android-chrome-192x192.png_!=b_G#data/website/site/favicon-32x32.png!=bW'data/website/site/safari-pinned-tab.svgQ!=bQ![data/website/site/index.htmlF4!=bF4c)s&data/website/site/images/checkmark.svg#!=b#j!data/website/site/images/logo.png!=b}T!!data/website/site/images/logo.svg!=bcT.data/website/site/images/hero-illustration.svgc3!=bc3j~ $data/website/site/images/favicon.png!=b Bޤ'data/website/site/images/screenshot.pngD!=bD>AV&data/website/site/apple-touch-icon.png!=b Ԥ"data/website/site/site.webmanifest!=b"data/website/site/css/template.cssk!=bko#data/website/site/browserconfig.xml!=bk,data/website/site/android-chrome-512x512.png`!=b`դ$data/website/site/mstile-150x150.png!=b&8-data/examples/MariosPizzeria/src/Pizzeria.php!=b,E5/data/examples/MariosPizzeria/src/Pizza/Base.php!=b0data/examples/MariosPizzeria/src/Pizza/Sauce.phpR!=bRHO2data/examples/MariosPizzeria/src/Pizza/Topping.php!=b){k.data/examples/MariosPizzeria/src/functions.php!=b-data/examples/MariosPizzeria/src/Delivery.phpf!=bf]D.data/examples/MariosPizzeria/src/constants.php!=bH&)data/examples/MariosPizzeria/src/Oven.php!=bYԤ*data/examples/MariosPizzeria/src/Pizza.php!=b0I,data/examples/MariosPizzeria/src/Product.php!=bc=0data/examples/MariosPizzeria/src/SharedTrait.php!=b|+X3data/examples/MariosPizzeria/tests/PizzeriaTest.phpP!=bPt'data/examples/MariosPizzeria/phpdoc.xml!=bsWTBvendor/psr/cache/LICENSE.txt8!=b8Df+vendor/psr/cache/src/CacheItemInterface.phpN!=bN</vendor/psr/cache/src/CacheItemPoolInterface.php!=bf'vendor/psr/cache/src/CacheException.php=!=b=A1vendor/psr/cache/src/InvalidArgumentException.phpa!=ba- vendor/psr/http-message/LICENSE=!=b=0vendor/psr/http-message/src/RequestInterface.php!=bV0vendor/psr/http-message/src/MessageInterface.php!=b)t 6vendor/psr/http-message/src/ServerRequestInterface.phpo!=bo $h5vendor/psr/http-message/src/UploadedFileInterface.phpz!=bz9b/vendor/psr/http-message/src/StreamInterface.php!=bh\l,vendor/psr/http-message/src/UriInterface.php!=bxNL1vendor/psr/http-message/src/ResponseInterface.php!=b#vendor/psr/event-dispatcher/LICENSE(!=b(}]=vendor/psr/event-dispatcher/src/ListenerProviderInterface.php!=b7 <vendor/psr/event-dispatcher/src/EventDispatcherInterface.php!=bISؤ;vendor/psr/event-dispatcher/src/StoppableEventInterface.php!=b.vendor/psr/log/LICENSE=!=b=pO+vendor/psr/log/Psr/Log/LoggerAwareTrait.php!=bTB*vendor/psr/log/Psr/Log/LoggerInterface.php!=bx3vendor/psr/log/Psr/Log/InvalidArgumentException.php`!=b` X1)vendor/psr/log/Psr/Log/AbstractLogger.php;!=b;>3[&vendor/psr/log/Psr/Log/LoggerTrait.phpk!=bk}#vendor/psr/log/Psr/Log/LogLevel.php!=bj8/vendor/psr/log/Psr/Log/LoggerAwareInterface.php|!=b|$%vendor/psr/log/Psr/Log/NullLogger.php!=bDivendor/psr/container/LICENSEy!=byOp7vendor/psr/container/src/NotFoundExceptionInterface.phpq!=bqR/vendor/psr/container/src/ContainerInterface.php!=b8vendor/psr/container/src/ContainerExceptionInterface.phpp!=bp;Z )vendor/nette/utils/src/HtmlStringable.php!=bi*vendor/nette/utils/src/Utils/Paginator.php !=b 'A1'vendor/nette/utils/src/Utils/Random.php!=bG&vendor/nette/utils/src/Utils/Image.phpt/!=bt/]*vendor/nette/utils/src/Utils/ArrayList.phpL!=bLQ9*vendor/nette/utils/src/Utils/ArrayHash.php!=bS)vendor/nette/utils/src/Utils/Callback.php !=b xB(vendor/nette/utils/src/Utils/Strings.phpv.!=bv.z(vendor/nette/utils/src/Utils/Helpers.phpx!=bx_p +vendor/nette/utils/src/Utils/exceptions.php!=b %vendor/nette/utils/src/Utils/Html.php!!=b!C,vendor/nette/utils/src/Utils/ObjectMixin.php!=b =L%vendor/nette/utils/src/Utils/Json.php!=b'Q'vendor/nette/utils/src/Utils/Arrays.php{!=b{ЁѲ+vendor/nette/utils/src/Utils/Validators.php !=b 9%vendor/nette/utils/src/Utils/Type.php!=b+vendor/nette/utils/src/Utils/FileSystem.php!=bD, +vendor/nette/utils/src/Utils/Reflection.phpg!!=bg!c)vendor/nette/utils/src/Utils/DateTime.php!=b*V'vendor/nette/utils/src/Utils/Floats.php!=b]+.vendor/nette/utils/src/Utils/ObjectHelpers.php!=bƑ%vendor/nette/utils/src/exceptions.php7!=b7[)[+vendor/nette/utils/src/Iterators/Mapper.phpo!=bo/>4vendor/nette/utils/src/Iterators/CachingIterator.phpC!=bC)qJ9&vendor/nette/utils/src/SmartObject.php!=b-5-(vendor/nette/utils/src/compatibility.php!=b>Ӥ%vendor/nette/utils/src/Translator.php!=bҭ]i&vendor/nette/utils/src/StaticClass.php\!=b\3vendor/nette/schema/src/Schema/DynamicParameter.php_!=b_<*vendor/nette/schema/src/Schema/Helpers.php!=bn0vendor/nette/schema/src/Schema/Elements/Base.php6!=b6MP)5vendor/nette/schema/src/Schema/Elements/Structure.php2!=b2ߢ#0vendor/nette/schema/src/Schema/Elements/Type.php!=bl21vendor/nette/schema/src/Schema/Elements/AnyOf.php2 !=b2 ;F)vendor/nette/schema/src/Schema/Expect.php!=buW*vendor/nette/schema/src/Schema/Context.php!=bq6vendor/nette/schema/src/Schema/ValidationException.php%!=b%*vendor/nette/schema/src/Schema/Message.php!=bG.1)vendor/nette/schema/src/Schema/Schema.php !=b ,vendor/nette/schema/src/Schema/Processor.phpe!=bexvendor/doctrine/lexer/LICENSE)!=b)`XQAvendor/doctrine/lexer/lib/Doctrine/Common/Lexer/AbstractLexer.php !=b 8^%vendor/doctrine/event-manager/LICENSE)!=b)9ޤBvendor/doctrine/event-manager/lib/Doctrine/Common/EventManager.php,!=b,äEvendor/doctrine/event-manager/lib/Doctrine/Common/EventSubscriber.php!=b&̤?vendor/doctrine/event-manager/lib/Doctrine/Common/EventArgs.phpG!=bG9vendor/autoload.php!=bavendor/monolog/monolog/LICENSE'!=b',vendor/monolog/monolog/src/Monolog/Utils.php!=bU^/vendor/monolog/monolog/src/Monolog/Registry.php>!=b>ie^:vendor/monolog/monolog/src/Monolog/Handler/NoopHandler.php!=bS Dvendor/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php<!=b<?t<vendor/monolog/monolog/src/Monolog/Handler/BufferHandler.php !=b ݞDvendor/monolog/monolog/src/Monolog/Handler/BrowserConsoleHandler.phpQ!=bQ դ>vendor/monolog/monolog/src/Monolog/Handler/LogmaticHandler.php!=bp3Hvendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php!=bBvendor/monolog/monolog/src/Monolog/Handler/SlackWebhookHandler.php!=by=vendor/monolog/monolog/src/Monolog/Handler/MongoDBHandler.php,!=b,J:vendor/monolog/monolog/src/Monolog/Handler/CubeHandler.php !=b fwp>vendor/monolog/monolog/src/Monolog/Handler/DynamoDbHandler.php!=bl'Fvendor/monolog/monolog/src/Monolog/Handler/WhatFailureGroupHandler.php!=b%>vendor/monolog/monolog/src/Monolog/Handler/AbstractHandler.php!=b(2`7?vendor/monolog/monolog/src/Monolog/Handler/SyslogUdpHandler.php !=b RAvendor/monolog/monolog/src/Monolog/Handler/ZendMonitorHandler.phpv!=bv?vendor/monolog/monolog/src/Monolog/Handler/HandlerInterface.php!=bYI>vendor/monolog/monolog/src/Monolog/Handler/PushoverHandler.php!!=b!Qg啤?vendor/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php> !=b> hդ@vendor/monolog/monolog/src/Monolog/Handler/Slack/SlackRecord.phpl!=bl X>vendor/monolog/monolog/src/Monolog/Handler/SamplingHandler.phpC!=bCz =vendor/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php` !=b` 2^:vendor/monolog/monolog/src/Monolog/Handler/AmqpHandler.phpM !=bM M8\vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ChannelLevelActivationStrategy.phpv!=bvV&Yvendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php!=bcoZvendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ErrorLevelActivationStrategy.php!=ba/Aw>vendor/monolog/monolog/src/Monolog/Handler/SendGridHandler.php!=bFvendor/monolog/monolog/src/Monolog/Handler/FormattableHandlerTrait.php]!=b]3D:vendor/monolog/monolog/src/Monolog/Handler/GelfHandler.php!=bԉAvendor/monolog/monolog/src/Monolog/Handler/TelegramBotHandler.php !=b Dvendor/monolog/monolog/src/Monolog/Handler/AbstractSyslogHandler.phpd!=bdTCvendor/monolog/monolog/src/Monolog/Handler/ElasticsearchHandler.php !=b FBvendor/monolog/monolog/src/Monolog/Handler/NativeMailerHandler.php !=b SF=vendor/monolog/monolog/src/Monolog/Handler/ProcessHandler.php !=b JBvendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.phpB!=bBtؤ>vendor/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.phpT!=bToF;vendor/monolog/monolog/src/Monolog/Handler/RedisHandler.php!=b@vendor/monolog/monolog/src/Monolog/Handler/PHPConsoleHandler.php\!=b\`M<vendor/monolog/monolog/src/Monolog/Handler/FilterHandler.php !=b rCvendor/monolog/monolog/src/Monolog/Handler/FallbackGroupHandler.php!=b~Jvendor/monolog/monolog/src/Monolog/Handler/FormattableHandlerInterface.php.!=b.0dߤ<vendor/monolog/monolog/src/Monolog/Handler/LogglyHandler.php !=b ڦAvendor/monolog/monolog/src/Monolog/Handler/RedisPubSubHandler.phpa!=ba1su-=vendor/monolog/monolog/src/Monolog/Handler/RollbarHandler.php!=bHvendor/monolog/monolog/src/Monolog/Handler/MissingExtensionException.php!=b)Ј:vendor/monolog/monolog/src/Monolog/Handler/MailHandler.php!=b۰a>vendor/monolog/monolog/src/Monolog/Handler/OverflowHandler.php!=b"Fvendor/monolog/monolog/src/Monolog/Handler/ProcessableHandlerTrait.php!=bWؤ=vendor/monolog/monolog/src/Monolog/Handler/CouchDBHandler.php"!=b"8vendor/monolog/monolog/src/Monolog/Handler/Curl/Util.phpu!=bu <vendor/monolog/monolog/src/Monolog/Handler/SocketHandler.php!=b!8,@vendor/monolog/monolog/src/Monolog/Handler/InsightOpsHandler.php?!=b?b0>vendor/monolog/monolog/src/Monolog/Handler/ElasticaHandler.php!=bI2?vendor/monolog/monolog/src/Monolog/Handler/FleepHookHandler.phpa!=ba_6vendor/monolog/monolog/src/Monolog/Handler/Handler.php!=bMwtJvendor/monolog/monolog/src/Monolog/Handler/ProcessableHandlerInterface.phpD!=bDvendor/monolog/monolog/src/Monolog/Handler/MandrillHandler.php!=b5>vendor/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php !=b +I$=vendor/monolog/monolog/src/Monolog/Handler/HandlerWrapper.php!=bgJ:vendor/monolog/monolog/src/Monolog/Handler/TestHandler.phpW !=bW -}p@vendor/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php!=b_9vendor/monolog/monolog/src/Monolog/Handler/SqsHandler.php!=b)ɘ'9vendor/monolog/monolog/src/Monolog/Handler/PsrHandler.php!=b6H;vendor/monolog/monolog/src/Monolog/Handler/SlackHandler.php!=bSMZ;vendor/monolog/monolog/src/Monolog/Handler/IFTTTHandler.php!=bSh*&<vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php !=b $ Bvendor/monolog/monolog/src/Monolog/Handler/SyslogUdp/UdpSocket.php!=bz>vendor/monolog/monolog/src/Monolog/Handler/FlowdockHandler.php}!=b}8⨤Evendor/monolog/monolog/src/Monolog/Handler/DoctrineCouchDBHandler.php!=b}C#;vendor/monolog/monolog/src/Monolog/Handler/GroupHandler.phpG!=bG\Y,:vendor/monolog/monolog/src/Monolog/Handler/NullHandler.php!=bCvendor/monolog/monolog/src/Monolog/Handler/DeduplicationHandler.php !=b /̤-vendor/monolog/monolog/src/Monolog/Logger.php!=b>3vendor/monolog/monolog/src/Monolog/ErrorHandler.phpH!=bHp8vendor/monolog/monolog/src/Monolog/DateTimeImmutable.phpY!=bYv =vendor/monolog/monolog/src/Monolog/Processor/GitProcessor.phpq!=bq-=vendor/monolog/monolog/src/Monolog/Processor/UidProcessor.php!=b ,=vendor/monolog/monolog/src/Monolog/Processor/TagProcessor.php !=b  S+=vendor/monolog/monolog/src/Monolog/Processor/WebProcessor.php;!=b;ܥj@vendor/monolog/monolog/src/Monolog/Processor/MemoryProcessor.phpk!=bk['Cvendor/monolog/monolog/src/Monolog/Processor/ProcessorInterface.php!=by渤Ivendor/monolog/monolog/src/Monolog/Processor/MemoryPeakUsageProcessor.phpv!=bvygCvendor/monolog/monolog/src/Monolog/Processor/ProcessIdProcessor.php!=b'dVGvendor/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.phpG!=bG"㾤Evendor/monolog/monolog/src/Monolog/Processor/MemoryUsageProcessor.phph!=bh0sGvendor/monolog/monolog/src/Monolog/Processor/PsrLogMessageProcessor.php)!=b)[^rBvendor/monolog/monolog/src/Monolog/Processor/HostnameProcessor.phpX!=bX"T٤Cvendor/monolog/monolog/src/Monolog/Processor/MercurialProcessor.phpB!=bB5Ag:vendor/monolog/monolog/src/Monolog/ResettableInterface.php!=baREvendor/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.phpQ !=bQ |iCvendor/monolog/monolog/src/Monolog/Formatter/ChromePHPFormatter.php!=bCvendor/monolog/monolog/src/Monolog/Formatter/FormatterInterface.php!=bU$eBvendor/monolog/monolog/src/Monolog/Formatter/LogstashFormatter.php!=b8Dw @vendor/monolog/monolog/src/Monolog/Formatter/LogglyFormatter.php2!=b2BBvendor/monolog/monolog/src/Monolog/Formatter/ElasticaFormatter.php!=bb3>vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php !=b HȂ}Bvendor/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.php!=b3 Avendor/monolog/monolog/src/Monolog/Formatter/FluentdFormatter.phpe!=beW}SDvendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php!=b[UۤGvendor/monolog/monolog/src/Monolog/Formatter/ElasticsearchFormatter.php!=bHbBvendor/monolog/monolog/src/Monolog/Formatter/FlowdockFormatter.php!=b"–@vendor/monolog/monolog/src/Monolog/Formatter/ScalarFormatter.php!=bW>vendor/monolog/monolog/src/Monolog/Formatter/HtmlFormatter.php !=b 3Bvendor/monolog/monolog/src/Monolog/Formatter/LogmaticFormatter.php!=b|(G>vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.phpu!=buAvendor/monolog/monolog/src/Monolog/Formatter/MongoDBFormatter.phpr !=br g\4vendor/monolog/monolog/src/Monolog/SignalHandler.php !=b "n5vendor/phpdocumentor/guides-restructured-text/LICENSE8!=b8ʤVvendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Span/SpanParser.php !=b γiUvendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Span/SpanLexer.php<!=b<[&6ovendor/phpdocumentor/guides-restructured-text/src/RestructuredText/NodeRenderers/Html/ContainerNodeRenderer.php!=b@Rmvendor/phpdocumentor/guides-restructured-text/src/RestructuredText/NodeRenderers/Html/SidebarNodeRenderer.php!=bj䙤pvendor/phpdocumentor/guides-restructured-text/src/RestructuredText/NodeRenderers/Html/AdmonitionNodeRenderer.php !=b ekvendor/phpdocumentor/guides-restructured-text/src/RestructuredText/NodeRenderers/Html/TopicNodeRenderer.php!=bS`I^vendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Directives/RawDirective.php!=bKXvendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Directives/Figure.php~!=b~k-bvendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Directives/SeeAlsoDirective.php!=bek`vendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Directives/IndexDirective.php!=b[vendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Directives/LaTeXMain.php!=bcS}bvendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Directives/IncludeDirective.php!=b̬T_vendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Directives/HintDirective.php!=bdvendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Directives/ImportantDirective.php!=bTC._vendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Directives/RoleDirective.php!=b ^`vendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Directives/TopicDirective.php$!=b$;IzUvendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Directives/Uml.php!=bJxVvendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Directives/Code.php!=bxdvendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Directives/ContainerDirective.php!=bf`vendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Directives/ClassDirective.php!=bAaWvendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Directives/Image.php!=b{bvendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Directives/SidebarDirective.phpD!=bDVvendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Directives/Wrap.php!=b Ҥbvendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Directives/WarningDirective.php!=bi/Wvendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Directives/Title.phpV!=bV/bvendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Directives/CautionDirective.php!=bGŤYvendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Directives/Replace.php!=bގ_vendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Directives/NoteDirective.php!=bTQ[vendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Directives/CodeBlock.php!=bcФVvendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Directives/Meta.php!=bݷNevendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Directives/AdmonitionDirective.php!=b.3[vendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Directives/Directive.php!=bΒ_^vendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Directives/TipDirective.php!=b<ΒP^vendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Directives/SubDirective.php!=b0Hmvendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Directives/AbstractAdmonitionDirective.phpP!=bP{Yvendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Directives/Toctree.php!=b.'gvendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Directives/BestPracticeDirective.php!=bZ[vendor/phpdocumentor/guides-restructured-text/src/RestructuredText/MarkupLanguageParser.php3!=b3Zvendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Nodes/ContainerNode.php!=b$, Vvendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Nodes/TopicNode.phpp!=bpdc[vendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Nodes/AdmonitionNode.php!=bq)Xvendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Nodes/SidebarNode.phpx!=bxbfvendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Exception/InvalidTableStructure.php!=bȎSvendor/phpdocumentor/guides-restructured-text/src/RestructuredText/OutputFormat.php!=bULiYvendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Toc/ToctreeBuilder.php!=b~k$Wvendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Toc/GlobSearcher.php!=bX\vendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Parser/DocumentParser.php#!=b#ہTvendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Parser/Buffer.phpy!=byyw[vendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Parser/LinesIterator.php!=băbvendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Parser/Productions/LinkRule.phpa!=baHn|(gvendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Parser/Productions/DirectiveRule.php!=bsMgvendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Parser/Productions/ParagraphRule.php!=b@lvendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Parser/Productions/DefinitionListRule.phpr!=brJuH^vendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Parser/Productions/Rule.php!=b0jvendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Parser/Productions/LiteralBlockRule.php!=bc0bvendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Parser/Productions/ListRule.php!=b󽧤cvendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Parser/Productions/TableRule.php!=bP'O~hvendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Parser/Productions/BlockQuoteRule.php\!=b\~ahvendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Parser/Productions/TransitionRule.php!=b€&rcvendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Parser/Productions/TitleRule.php{!=b{bfvendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Parser/Productions/DocumentRule.php !=b xevendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Parser/Productions/CommentRule.php!=b]vendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Parser/DirectiveOption.phpo!=boG:kWvendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Parser/Directive.php!=b,Yvendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Parser/LineChecker.phpS!=bSYwfvendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Parser/TableSeparatorLineConfig.phpR!=bR=Yvendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Parser/TableParser.php !=b {ˤ\vendor/phpdocumentor/guides-restructured-text/src/RestructuredText/Parser/LineDataParser.php!=b ,vendor/phpdocumentor/guides-markdown/LICENSE8!=b8ʤJvendor/phpdocumentor/guides-markdown/src/Markdown/MarkupLanguageParser.phpL!=bLkKvendor/phpdocumentor/guides-markdown/src/Markdown/Parsers/ThematicBreak.php!=b]iFKvendor/phpdocumentor/guides-markdown/src/Markdown/Parsers/AbstractBlock.php!=bCWGvendor/phpdocumentor/guides-markdown/src/Markdown/Parsers/Paragraph.php!=b.Gvendor/phpdocumentor/guides-markdown/src/Markdown/Parsers/ListBlock.php!=bUJvendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/TagWithType.phpX!=bXН4Fvendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.phph!=bh zIvendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Deprecated.php!=bCvendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Uses.phpp!=bpZEvendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Source.php!=bdLCvendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Link.php$!=b$nKvendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php !=b Hvendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter.php!=bDUWvendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/AlignFormatter.phpq!=bq?9]vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/PassthroughFormatter.phpr!=bre-Svendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/StaticMethod.php!=b|~Cvendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php !=b J*YIvendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/InvalidTag.phpt !=bt {iEvendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Author.php!=bxEvendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Throws.phpi!=bihd̐Lvendor/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.php!=bDEvendor/phpdocumentor/reflection-docblock/src/DocBlock/Description.php!=b)I=vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tag.phpi!=bi9vendor/phpdocumentor/reflection-docblock/src/DocBlock.php !=b :鉤Ivendor/phpdocumentor/reflection-docblock/src/DocBlockFactoryInterface.php`!=b`WAWˤHvendor/phpdocumentor/reflection-docblock/src/Exception/PcreException.php!=b*Ǹ'vendor/phpdocumentor/reflection/LICENSE8!=b8ʤ.vendor/phpdocumentor/reflection/phpmd.xml.distM!=bM.J[)vendor/phpdocumentor/reflection/phive.xml!=bQ8÷Ovendor/phpdocumentor/reflection/src/phpDocumentor/Reflection/File/LocalFile.php!=b/<]vendor/phpdocumentor/reflection/src/phpDocumentor/Reflection/Types/NamespaceNodeToContext.phpu!=bu)ƤMvendor/phpdocumentor/reflection/src/phpDocumentor/Reflection/Php/Argument.php!=bkۮ\Kvendor/phpdocumentor/reflection/src/phpDocumentor/Reflection/Php/Class_.php !=b ߤMvendor/phpdocumentor/reflection/src/phpDocumentor/Reflection/Php/EnumCase.php5!=b5P0Kvendor/phpdocumentor/reflection/src/phpDocumentor/Reflection/Php/Trait_.phpP!=bPt%Vvendor/phpdocumentor/reflection/src/phpDocumentor/Reflection/Php/MetadataContainer.php_!=b_ͪ]vendor/phpdocumentor/reflection/src/phpDocumentor/Reflection/Php/ProjectFactoryStrategies.phpT!=bTB5Lvendor/phpdocumentor/reflection/src/phpDocumentor/Reflection/Php/Project.php;!=b; ̤Mvendor/phpdocumentor/reflection/src/phpDocumentor/Reflection/Php/Property.php.!=b.Ovendor/phpdocumentor/reflection/src/phpDocumentor/Reflection/Php/Visibility.php!=bVNvendor/phpdocumentor/reflection/src/phpDocumentor/Reflection/Php/Function_.php!=beKvendor/phpdocumentor/reflection/src/phpDocumentor/Reflection/Php/Method.phpK !=bK YbSvendor/phpdocumentor/reflection/src/phpDocumentor/Reflection/Php/ProjectFactory.php@!=b@ФOvendor/phpdocumentor/reflection/src/phpDocumentor/Reflection/Php/Namespace_.php9!=b9eYiOvendor/phpdocumentor/reflection/src/phpDocumentor/Reflection/Php/Interface_.php!=bMMvendor/phpdocumentor/reflection/src/phpDocumentor/Reflection/Php/Constant.phpE!=bEФIvendor/phpdocumentor/reflection/src/phpDocumentor/Reflection/Php/File.php !=b aĤ[vendor/phpdocumentor/reflection/src/phpDocumentor/Reflection/Php/ProjectFactoryStrategy.phpm!=bmBfJvendor/phpdocumentor/reflection/src/phpDocumentor/Reflection/Php/Enum_.php!=bU aQvendor/phpdocumentor/reflection/src/phpDocumentor/Reflection/Php/NodesFactory.php!=bIUvendor/phpdocumentor/reflection/src/phpDocumentor/Reflection/Php/Factory/TraitUse.php9!=b90Uvendor/phpdocumentor/reflection/src/phpDocumentor/Reflection/Php/Factory/Argument.phpu!=bu4 Svendor/phpdocumentor/reflection/src/phpDocumentor/Reflection/Php/Factory/Class_.phpG!=bGLUvendor/phpdocumentor/reflection/src/phpDocumentor/Reflection/Php/Factory/EnumCase.php5!=b5I!ΤSvendor/phpdocumentor/reflection/src/phpDocumentor/Reflection/Php/Factory/Trait_.php!=b͊^Qvendor/phpdocumentor/reflection/src/phpDocumentor/Reflection/Php/Factory/Noop.php!=bƤ_vendor/phpdocumentor/reflection/src/phpDocumentor/Reflection/Php/Factory/File/CreateCommand.php!=bOݹbvendor/phpdocumentor/reflection/src/phpDocumentor/Reflection/Php/Factory/ClassConstantIterator.php!=b`][vendor/phpdocumentor/reflection/src/phpDocumentor/Reflection/Php/Factory/GlobalConstant.php!=b]RԤ\vendor/phpdocumentor/reflection/src/phpDocumentor/Reflection/Php/Factory/AbstractFactory.php!=bȮfXvendor/phpdocumentor/reflection/src/phpDocumentor/Reflection/Php/Factory/IfStatement.php!=b."#Uvendor/phpdocumentor/reflection/src/phpDocumentor/Reflection/Php/Factory/Property.phpC!=bCAVvendor/phpdocumentor/reflection/src/phpDocumentor/Reflection/Php/Factory/Function_.php !=b ~TSvendor/phpdocumentor/reflection/src/phpDocumentor/Reflection/Php/Factory/Method.php\!=b\I0eޤ]vendor/phpdocumentor/reflection/src/phpDocumentor/Reflection/Php/Factory/PropertyIterator.php!=boecvendor/phpdocumentor/reflection/src/phpDocumentor/Reflection/Php/Factory/GlobalConstantIterator.phpj!=bj4eWvendor/phpdocumentor/reflection/src/phpDocumentor/Reflection/Php/Factory/Namespace_.phps!=bsh Wvendor/phpdocumentor/reflection/src/phpDocumentor/Reflection/Php/Factory/Interface_.php!=b/}Zvendor/phpdocumentor/reflection/src/phpDocumentor/Reflection/Php/Factory/ClassConstant.phps!=bs;[Qvendor/phpdocumentor/reflection/src/phpDocumentor/Reflection/Php/Factory/File.phph!=bhΉSvendor/phpdocumentor/reflection/src/phpDocumentor/Reflection/Php/Factory/Define.phpD !=bD ֠Qvendor/phpdocumentor/reflection/src/phpDocumentor/Reflection/Php/Factory/Type.php!=bR |avendor/phpdocumentor/reflection/src/phpDocumentor/Reflection/Php/Factory/ConstructorPromotion.php !=b ;Rvendor/phpdocumentor/reflection/src/phpDocumentor/Reflection/Php/Factory/Enum_.phpc!=bc "ǤYvendor/phpdocumentor/reflection/src/phpDocumentor/Reflection/Php/Factory/ContextStack.phpc!=bc<Vvendor/phpdocumentor/reflection/src/phpDocumentor/Reflection/Php/StrategyContainer.php3!=b3t`vendor/phpdocumentor/reflection/src/phpDocumentor/Reflection/NodeVisitor/ElementNameResolver.php !=b guPJvendor/phpdocumentor/reflection/src/phpDocumentor/Reflection/Exception.php{!=b{ނJ[vendor/phpdocumentor/reflection/src/phpDocumentor/Reflection/Metadata/MetaDataContainer.php!=b6"Rvendor/phpdocumentor/reflection/src/phpDocumentor/Reflection/Metadata/Metadata.php!=b*?Vvendor/phpdocumentor/reflection/src/phpDocumentor/Reflection/Middleware/Middleware.php!=bPD2Svendor/phpdocumentor/reflection/src/phpDocumentor/Reflection/Middleware/Command.phps!=bsdXvendor/phpdocumentor/reflection/src/phpDocumentor/Reflection/Middleware/ChainFactory.php<!=b<j}+vendor/phpdocumentor/reflection/example.php !=b #դ<vendor/phpdocumentor/reflection/composer-require-config.json!=bI+vendor/phpdocumentor/reflection/rector.yaml}!=b},#vendor/phpdocumentor/guides/LICENSE8!=b8ʤ2vendor/phpdocumentor/guides/src/Span/SpanToken.php!=bŵM';vendor/phpdocumentor/guides/src/Span/CrossReferenceNode.php!=b7P5vendor/phpdocumentor/guides/src/Span/LiteralToken.phpT!=bTb$>vendor/phpdocumentor/guides/src/NodeRenderers/NodeRenderer.php7!=b7k)Evendor/phpdocumentor/guides/src/NodeRenderers/NodeRendererFactory.php!=bCJGvendor/phpdocumentor/guides/src/NodeRenderers/LaTeX/TocNodeRenderer.php^!=b^!sHvendor/phpdocumentor/guides/src/NodeRenderers/LaTeX/SpanNodeRenderer.php!=b}ӑLvendor/phpdocumentor/guides/src/NodeRenderers/LaTeX/DocumentNodeRenderer.phpm!=bmIvendor/phpdocumentor/guides/src/NodeRenderers/LaTeX/TableNodeRenderer.php!=b%Ivendor/phpdocumentor/guides/src/NodeRenderers/LaTeX/TitleNodeRenderer.php!=buyEA>vendor/phpdocumentor/guides/src/NodeRenderers/SpanRenderer.php!=bU2\Mvendor/phpdocumentor/guides/src/NodeRenderers/InMemoryNodeRendererFactory.php!=bXpBvendor/phpdocumentor/guides/src/NodeRenderers/SpanNodeRenderer.php4!=b422 Fvendor/phpdocumentor/guides/src/NodeRenderers/DocumentNodeRenderer.php!=b u Fvendor/phpdocumentor/guides/src/NodeRenderers/TemplateNodeRenderer.php!=b0Evendor/phpdocumentor/guides/src/NodeRenderers/DefaultNodeRenderer.phpT!=bTC~2Jvendor/phpdocumentor/guides/src/NodeRenderers/FullDocumentNodeRenderer.php.!=b.\3Fvendor/phpdocumentor/guides/src/NodeRenderers/Html/TocNodeRenderer.phpO !=bO %Lvendor/phpdocumentor/guides/src/NodeRenderers/Html/TemplatedNodeRenderer.php!=bZ=Gvendor/phpdocumentor/guides/src/NodeRenderers/Html/SpanNodeRenderer.phpl!=bl$dKvendor/phpdocumentor/guides/src/NodeRenderers/Html/DocumentNodeRenderer.php!=b#Hvendor/phpdocumentor/guides/src/NodeRenderers/Html/TableNodeRenderer.php!=bmv]Yvendor/phpdocumentor/guides/src/NodeRenderers/Html/Metadata/DocumentTitleNodeRenderer.php!=b1Jvendor/phpdocumentor/guides/src/NodeRenderers/NodeRendererFactoryAware.php!=bўaBvendor/phpdocumentor/guides/src/Handlers/ParseDirectoryCommand.php!=bBG=vendor/phpdocumentor/guides/src/Handlers/LoadCacheCommand.php!=b=vendor/phpdocumentor/guides/src/Handlers/ParseFileCommand.php!=b*N=vendor/phpdocumentor/guides/src/Handlers/LoadCacheHandler.phpV!=bVBvendor/phpdocumentor/guides/src/Handlers/ParseDirectoryHandler.php!=bx@vendor/phpdocumentor/guides/src/Handlers/PersistCacheHandler.phpU!=bUA려=vendor/phpdocumentor/guides/src/Handlers/ParseFileHandler.php_ !=b_ A0@vendor/phpdocumentor/guides/src/Handlers/PersistCacheCommand.php!=b61vendor/phpdocumentor/guides/src/ParserContext.php !=b D8vendor/phpdocumentor/guides/src/MarkupLanguageParser.php!=bYͤ;vendor/phpdocumentor/guides/src/Event/PostParseDocument.php!=b]Y:vendor/phpdocumentor/guides/src/Event/PreParseDocument.php!=b o1vendor/phpdocumentor/guides/src/Nodes/RawNode.phpp!=bpW]#6vendor/phpdocumentor/guides/src/Nodes/DocumentNode.php !=b 5^7vendor/phpdocumentor/guides/src/Nodes/SeparatorNode.php!=bCUnŤ8vendor/phpdocumentor/guides/src/Nodes/Lists/ListItem.phpx!=bx(:vendor/phpdocumentor/guides/src/Nodes/SectionBeginNode.phpD!=bD3vendor/phpdocumentor/guides/src/Nodes/BlockNode.php!=bl6vendor/phpdocumentor/guides/src/Nodes/ListItemNode.php4!=b4@d2vendor/phpdocumentor/guides/src/Nodes/SpanNode.php5!=b5-Jz1vendor/phpdocumentor/guides/src/Nodes/UmlNode.php!=b`Z^4vendor/phpdocumentor/guides/src/Nodes/AnchorNode.phpy!=by43vendor/phpdocumentor/guides/src/Nodes/QuoteNode.phpr!=brZ2vendor/phpdocumentor/guides/src/Nodes/MainNode.phpq!=bqaG44vendor/phpdocumentor/guides/src/Nodes/FigureNode.php!=b:2vendor/phpdocumentor/guides/src/Nodes/ListNode.php!=bmͤ<vendor/phpdocumentor/guides/src/Nodes/DefinitionListNode.php!=baQФ:vendor/phpdocumentor/guides/src/Nodes/LiteralBlockNode.phpv!=bv .;vendor/phpdocumentor/guides/src/Nodes/Links/InvalidLink.php!=bf:4vendor/phpdocumentor/guides/src/Nodes/Links/Link.php!=b6j-5vendor/phpdocumentor/guides/src/Nodes/GenericNode.phpG!=bGLHvendor/phpdocumentor/guides/src/Nodes/DefinitionLists/DefinitionList.php!=b<Lvendor/phpdocumentor/guides/src/Nodes/DefinitionLists/DefinitionListTerm.php>!=b>5i2vendor/phpdocumentor/guides/src/Nodes/CodeNode.phpo!=boJS7vendor/phpdocumentor/guides/src/Nodes/ParagraphNode.phpv!=bv Ƥ;vendor/phpdocumentor/guides/src/Nodes/Metadata/MetaNode.php:!=b:q-MDvendor/phpdocumentor/guides/src/Nodes/Metadata/DocumentTitleNode.php!=b`?vendor/phpdocumentor/guides/src/Nodes/Metadata/MetadataNode.php!=b-ˤ1vendor/phpdocumentor/guides/src/Nodes/TocNode.php$!=b$粤3vendor/phpdocumentor/guides/src/Nodes/TitleNode.php!=b`3vendor/phpdocumentor/guides/src/Nodes/ImageNode.phpr!=br&Y8vendor/phpdocumentor/guides/src/Nodes/SectionEndNode.phpB!=bB͏i.vendor/phpdocumentor/guides/src/Nodes/Node.php!=b8vendor/phpdocumentor/guides/src/Nodes/Table/TableRow.php!=b$ƋФ;vendor/phpdocumentor/guides/src/Nodes/Table/TableColumn.phpb!=bbM3vendor/phpdocumentor/guides/src/Nodes/TableNode.php'!=b'Њ7vendor/phpdocumentor/guides/src/Nodes/TemplatedNode.php5!=b5:vendor/phpdocumentor/guides/src/Meta/CachedMetasLoader.php!=bcq.vendor/phpdocumentor/guides/src/Meta/Entry.php. !=b. s1˸1vendor/phpdocumentor/guides/src/RenderContext.php !=b >)vendor/phpdocumentor/guides/src/Files.php!=bNФ8vendor/phpdocumentor/guides/src/Twig/AssetsExtension.php !=b a--,vendor/phpdocumentor/guides/src/Renderer.phpm !=bm G3=vendor/phpdocumentor/guides/src/Renderer/TemplateRenderer.php!=bwH֤Avendor/phpdocumentor/guides/src/Renderer/OutputFormatRenderer.phpK!=bKW /9vendor/phpdocumentor/guides/src/Formats/OutputFormats.php!=bO8vendor/phpdocumentor/guides/src/Formats/OutputFormat.php!=b m@vendor/phpdocumentor/guides/src/References/ResolvedReference.php!=b'@vendor/phpdocumentor/guides/src/References/ReferenceResolver.phpp!=bpp--@vendor/phpdocumentor/guides/src/References/Resolver/Resolver.php!=bTCvendor/phpdocumentor/guides/src/References/Resolver/DocResolver.php!=bo"Ф1vendor/phpdocumentor/guides/src/FileCollector.php !=b Ȃ*vendor/phpdocumentor/guides/src/Parser.php !=b rIǤ0vendor/phpdocumentor/guides/src/UrlGenerator.php#!=b#P~ͤ)vendor/phpdocumentor/guides/src/Metas.php!=bZA.vendor/phpdocumentor/reflection-common/LICENSE9!=b9*2Ȑ6vendor/phpdocumentor/reflection-common/src/Project.php!=bޗ4vendor/phpdocumentor/reflection-common/src/Fqsen.php!=b)|9=vendor/phpdocumentor/reflection-common/src/ProjectFactory.php!=b޳ 3vendor/phpdocumentor/reflection-common/src/File.php!=b )6vendor/phpdocumentor/reflection-common/src/Element.php!=b9J7vendor/phpdocumentor/reflection-common/src/Location.php!=bO-vendor/jean85/pretty-package-versions/LICENSE/!=b/*4<vendor/jean85/pretty-package-versions/src/PrettyVersions.php-!=b-.K5vendor/jean85/pretty-package-versions/src/Version.php!=b{Pvendor/jean85/pretty-package-versions/src/Exception/ReplacedPackageException.phps!=bsτPvendor/jean85/pretty-package-versions/src/Exception/ProvidedPackageException.phpu!=buXvendor/jean85/pretty-package-versions/src/Exception/VersionMissingExceptionInterface.php!=b*Qvendor/webmozart/assert/LICENSE<!=b<t}&vendor/webmozart/assert/src/Assert.phpp!=bpz8vendor/webmozart/assert/src/InvalidArgumentException.phpr!=brtV%vendor/webmozart/assert/src/Mixin.php)u!=b)ul&c0vendor/symfony/error-handler/BufferingLogger.php !=b ڍ/[$vendor/symfony/error-handler/LICENSE)!=b)==vendor/symfony/error-handler/Resources/assets/js/exception.jsW<!=bW<Pߐ1Ivendor/symfony/error-handler/Resources/assets/images/icon-plus-square.svg!=bUEvendor/symfony/error-handler/Resources/assets/images/symfony-logo.svg!=b%0ɤKvendor/symfony/error-handler/Resources/assets/images/icon-plus-square-o.svg!=b-Jvendor/symfony/error-handler/Resources/assets/images/symfony-ghost.svg.php!=bJvendor/symfony/error-handler/Resources/assets/images/icon-minus-square.svgQ!=bQpGvendor/symfony/error-handler/Resources/assets/images/favicon.png.base64!=b"i^Fvendor/symfony/error-handler/Resources/assets/images/chevron-right.svg!=b Bvendor/symfony/error-handler/Resources/assets/images/icon-book.svg!=bLvendor/symfony/error-handler/Resources/assets/images/icon-minus-square-o.svg!=bs0Bvendor/symfony/error-handler/Resources/assets/images/icon-copy.svg !=b "ȖEvendor/symfony/error-handler/Resources/assets/images/icon-support.svgz!=bzS̤?vendor/symfony/error-handler/Resources/assets/css/exception.cssK7!=bK7ډ\Ӥ;vendor/symfony/error-handler/Resources/assets/css/error.css!=b%7Dvendor/symfony/error-handler/Resources/assets/css/exception_full.css !=b *bc<vendor/symfony/error-handler/Resources/views/traces.html.php!=bZYDvendor/symfony/error-handler/Resources/views/exception_full.html.php1!=b1r;vendor/symfony/error-handler/Resources/views/error.html.phpy!=byP)e:vendor/symfony/error-handler/Resources/views/logs.html.php!=byXAvendor/symfony/error-handler/Resources/views/traces_text.html.php!=bR\;vendor/symfony/error-handler/Resources/views/trace.html.php !=b :w?vendor/symfony/error-handler/Resources/views/exception.html.php!=bsaMvendor/symfony/error-handler/Resources/bin/extract-tentative-return-types.php!=bΰBvendor/symfony/error-handler/Resources/bin/patch-type-declarations!=b@vendor/symfony/error-handler/ErrorRenderer/HtmlErrorRenderer.phpM!=bMWpӤFvendor/symfony/error-handler/ErrorRenderer/SerializerErrorRenderer.php !=b Et6Evendor/symfony/error-handler/ErrorRenderer/ErrorRendererInterface.php!=b^s?vendor/symfony/error-handler/ErrorRenderer/CliErrorRenderer.php;!=b;)֤8vendor/symfony/error-handler/Internal/TentativeTypes.php!=b]k=q/vendor/symfony/error-handler/ThrowableUtils.php!=bz(1vendor/symfony/error-handler/DebugClassLoader.phpm}!=bm}CKvendor/symfony/error-handler/ErrorEnhancer/UndefinedMethodErrorEnhancer.php!=bl4Evendor/symfony/error-handler/ErrorEnhancer/ErrorEnhancerInterface.php!=bhtIvendor/symfony/error-handler/ErrorEnhancer/ClassNotFoundErrorEnhancer.php!=buZYMvendor/symfony/error-handler/ErrorEnhancer/UndefinedFunctionErrorEnhancer.php!=b^ˤ-vendor/symfony/error-handler/ErrorHandler.phpeK!=beĶ?vendor/symfony/error-handler/Exception/SilencedErrorContext.phpb!=bb|Q$B;vendor/symfony/error-handler/Exception/FlattenException.php!=bX =vendor/symfony/error-handler/Error/UndefinedFunctionError.php !=b Fw¤7vendor/symfony/error-handler/Error/OutOfMemoryError.phpo!=bo1vendor/symfony/error-handler/Error/FatalError.php!=bjd;vendor/symfony/error-handler/Error/UndefinedMethodError.php !=b y9vendor/symfony/error-handler/Error/ClassNotFoundError.php !=b g>@&vendor/symfony/error-handler/Debug.phpX!=bX.X;vendor/symfony/console/LICENSE)!=b)ax0vendor/symfony/console/Resources/completion.bash- !=b- tBQ4vendor/symfony/console/Resources/bin/hiddeninput.exe$!=b$v!vendor/symfony/console/Cursor.php !=b ƫ=vendor/symfony/console/CommandLoader/FactoryCommandLoader.php!=bd"z?vendor/symfony/console/CommandLoader/ContainerCommandLoader.phpU!=bU_?vendor/symfony/console/CommandLoader/CommandLoaderInterface.phpQ!=bQH6vendor/symfony/console/EventListener/ErrorListener.php1!=b1`] 3vendor/symfony/console/SingleCommandApplication.php7!=b7'8vendor/symfony/console/SignalRegistry/SignalRegistry.php !=b x4vendor/symfony/console/Event/ConsoleCommandEvent.php!=b O~-vendor/symfony/console/Event/ConsoleEvent.php!=bo٤3vendor/symfony/console/Event/ConsoleSignalEvent.phpG!=bG 6vendor/symfony/console/Event/ConsoleTerminateEvent.php~!=b~hr֤2vendor/symfony/console/Event/ConsoleErrorEvent.php!=b/vendor/symfony/console/Tester/CommandTester.php!=b=A-vendor/symfony/console/Tester/TesterTrait.php !=b 2'L9vendor/symfony/console/Tester/CommandCompletionTester.php!=bʛ;3vendor/symfony/console/Tester/ApplicationTester.php!=bL!@vendor/symfony/console/Tester/Constraint/CommandIsSuccessful.php!=bƃ1vendor/symfony/console/Output/OutputInterface.php!=b(vendor/symfony/console/Output/Output.php !=b C,0vendor/symfony/console/Output/BufferedOutput.phpl!=bly:8vendor/symfony/console/Output/ConsoleOutputInterface.php!=b,vendor/symfony/console/Output/NullOutput.phpH!=bH56vendor/symfony/console/Output/ConsoleSectionOutput.php !=b  D.vendor/symfony/console/Output/StreamOutput.php!=b`5vendor/symfony/console/Output/TrimmedBufferOutput.php!=bű /vendor/symfony/console/Output/ConsoleOutput.php !=b ۤ(vendor/symfony/console/ConsoleEvents.php!=b>cA2vendor/symfony/console/Command/CompleteCommand.php !=b -*vendor/symfony/console/Command/Command.phpL'!=bL'=^.vendor/symfony/console/Command/ListCommand.php1 !=b1 $D|8vendor/symfony/console/Command/DumpCompletionCommand.php!=b?Z7=vendor/symfony/console/Command/SignalableCommandInterface.php!=bB`.vendor/symfony/console/Command/HelpCommand.php !=b }.vendor/symfony/console/Command/LazyCommand.php!=bJo0vendor/symfony/console/Command/LockableTrait.php!=b.V:vendor/symfony/console/Exception/MissingInputException.php!=bS 3vendor/symfony/console/Exception/LogicException.php!=bO\e5vendor/symfony/console/Exception/RuntimeException.php!=b,6;vendor/symfony/console/Exception/InvalidOptionException.php!=bH=vendor/symfony/console/Exception/InvalidArgumentException.php!=b̽Z?vendor/symfony/console/Exception/NamespaceNotFoundException.php!=bn=vendor/symfony/console/Exception/CommandNotFoundException.php!=bw7vendor/symfony/console/Exception/ExceptionInterface.phpy!=by9[&#vendor/symfony/console/Terminal.php !=b p-vendor/symfony/console/Style/SymfonyStyle.php4'!=b4'<շ ,vendor/symfony/console/Style/OutputStyle.phpt!=btO;Ƥ/vendor/symfony/console/Style/StyleInterface.php !=b ݡ.vendor/symfony/console/Input/InputArgument.php!!=b!y&vendor/symfony/console/Input/Input.php !=b 1/vendor/symfony/console/Input/InputInterface.php!=bG+vendor/symfony/console/Input/ArrayInput.php !=b $4vendor/symfony/console/Input/InputAwareInterface.php!=bO9vendor/symfony/console/Input/StreamableInputInterface.php!=bB,vendor/symfony/console/Input/StringInput.php@!=b@f)h,vendor/symfony/console/Input/InputOption.php !=b B@0vendor/symfony/console/Input/InputDefinition.php#!=b# !3*vendor/symfony/console/Input/ArgvInput.php9!=b9/)l/vendor/symfony/console/Logger/ConsoleLogger.php !=b \W ;vendor/symfony/console/Completion/CompletionSuggestions.php!=bAFvendor/symfony/console/Completion/Output/CompletionOutputInterface.phpF!=bF2nMAvendor/symfony/console/Completion/Output/BashCompletionOutput.php!=bEڤ5vendor/symfony/console/Completion/CompletionInput.php!=bV#0vendor/symfony/console/Completion/Suggestion.php3!=b3̆ Dvendor/symfony/console/DependencyInjection/AddConsoleCommandPass.php*!=b*Fvendor/symfony/console/Formatter/WrappableOutputFormatterInterface.php!=bZ>vendor/symfony/console/Formatter/OutputFormatterStyleStack.php!=bFx=vendor/symfony/console/Formatter/NullOutputFormatterStyle.php!=b 4vendor/symfony/console/Formatter/OutputFormatter.php!=b"T=vendor/symfony/console/Formatter/OutputFormatterInterface.php!=bY ߤ9vendor/symfony/console/Formatter/OutputFormatterStyle.phpH!=bH2bBvendor/symfony/console/Formatter/OutputFormatterStyleInterface.php!=bZä8vendor/symfony/console/Formatter/NullOutputFormatter.php!=b5Bk&vendor/symfony/console/Application.phpo!=boV4vendor/symfony/console/Descriptor/JsonDescriptor.php!=b1%菤9vendor/symfony/console/Descriptor/DescriptorInterface.php!=b@4vendor/symfony/console/Descriptor/TextDescriptor.php"!=b"3vendor/symfony/console/Descriptor/XmlDescriptor.php!=b0vendor/symfony/console/Descriptor/Descriptor.php}!=b}3^<vendor/symfony/console/Descriptor/ApplicationDescription.php !=b g8vendor/symfony/console/Descriptor/MarkdownDescriptor.phpQ!=bQtv vendor/symfony/console/Color.phpi!=bil&/vendor/symfony/console/Helper/ProcessHelper.phpW !=bW e (vendor/symfony/console/Helper/Helper.php; !=b; :(vendor/symfony/console/Helper/Dumper.php!=bܽ-vendor/symfony/console/Helper/ProgressBar.php{/!=b{/%3+vendor/symfony/console/Helper/TableCell.phpB!=bBd"1vendor/symfony/console/Helper/HelperInterface.php!=b6vendor/symfony/console/Helper/DebugFormatterHelper.php!=b67vendor/symfony/console/Helper/SymfonyQuestionHelper.php !=b d2vendor/symfony/console/Helper/DescriptorHelper.php!=bḡ+vendor/symfony/console/Helper/HelperSet.php@!=b@@`2vendor/symfony/console/Helper/InputAwareHelper.phpc!=bc0vendor/symfony/console/Helper/TableCellStyle.php!=bэ_3vendor/symfony/console/Helper/ProgressIndicator.php!=b\'vendor/symfony/console/Helper/Table.phpH!=bHǠ;0vendor/symfony/console/Helper/TableSeparator.php!=b+vendor/symfony/console/Helper/TableRows.php)!=b)W3z1vendor/symfony/console/Helper/FormatterHelper.phpi!=biw,vendor/symfony/console/Helper/TableStyle.php!=bI;x0vendor/symfony/console/Helper/QuestionHelper.php-!=b-Q2vendor/symfony/console/Question/ChoiceQuestion.php !=b \`,vendor/symfony/console/Question/Question.php !=b T8vendor/symfony/console/Question/ConfirmationQuestion.php!=byń2vendor/symfony/console/CI/GithubActionReporter.php!=b)m.vendor/symfony/console/Attribute/AsCommand.php!=b;vendor/symfony/yaml/Dumper.php !=b 鉤vendor/symfony/yaml/LICENSE)!=b)ax+vendor/symfony/yaml/Resources/bin/yaml-linty!=byh5'vendor/symfony/yaml/Tag/TaggedValue.phpN!=bNu~!vendor/symfony/yaml/Unescaper.php!=bhץT+vendor/symfony/yaml/Command/LintCommand.php|!=b|6g0vendor/symfony/yaml/Exception/ParseException.phph!=bhu2vendor/symfony/yaml/Exception/RuntimeException.php!=b$/vendor/symfony/yaml/Exception/DumpException.phps!=bsƤ4vendor/symfony/yaml/Exception/ExceptionInterface.phpv!=bv0ʤvendor/symfony/yaml/Yaml.phpG!=bGPnvendor/symfony/yaml/Inline.phpAP!=bAPB5vendor/symfony/yaml/Escaper.php!=bU!vendor/symfony/yaml/Parser.php{!=b{E$g?0vendor/symfony/polyfill-mbstring/bootstrap80.php !=b D פ(vendor/symfony/polyfill-mbstring/LICENSE)!=b)\Fvendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php!=by_@vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.php8[!=b8[+R*@vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.phpT!=bT+.vendor/symfony/polyfill-mbstring/bootstrap.php!=bNZ^-vendor/symfony/polyfill-mbstring/Mbstring.phpzJ!=bzJ@Xɤ(vendor/symfony/routing/CompiledRoute.php!=br *vendor/symfony/routing/RouterInterface.php7!=b7@Vvendor/symfony/routing/LICENSE)!=b)ax!vendor/symfony/routing/Router.php!=bcS7vendor/symfony/routing/RequestContextAwareInterface.php!=b>1vendor/symfony/routing/RouteCompilerInterface.php!=b vendor/symfony/routing/Loader/Configurator/Traits/AddTrait.phpt!=bt\Ivendor/symfony/routing/Loader/Configurator/Traits/LocalizedRouteTrait.phpt!=btǁ @vendor/symfony/routing/Loader/Configurator/Traits/RouteTrait.php!=bX~Bvendor/symfony/routing/Loader/Configurator/RoutingConfigurator.php!=bzص*vendor/symfony/routing/RouteCollection.phpb!=bbc8>vendor/symfony/routing/Exception/InvalidParameterException.php!=bw5vendor/symfony/routing/Exception/RuntimeException.php!=byĤ>vendor/symfony/routing/Exception/MethodNotAllowedException.php!=b^=vendor/symfony/routing/Exception/NoConfigurationException.php!=b̊=vendor/symfony/routing/Exception/InvalidArgumentException.php!=b)äHvendor/symfony/routing/Exception/MissingMandatoryParametersException.php!=b΁9Dvendor/symfony/routing/Exception/RouteCircularReferenceException.php<!=b<=;vendor/symfony/routing/Exception/RouteNotFoundException.php!=ble7vendor/symfony/routing/Exception/ExceptionInterface.phpy!=byf̶>vendor/symfony/routing/Exception/ResourceNotFoundException.php!=bȤ6vendor/symfony/routing/Matcher/UrlMatcherInterface.php!=bvBvendor/symfony/routing/Matcher/RedirectableUrlMatcherInterface.php!=b?ߨ26vendor/symfony/routing/Matcher/TraceableUrlMatcher.phpr!=brp{Bvendor/symfony/routing/Matcher/Dumper/CompiledUrlMatcherDumper.php/!=b/Ȁu@vendor/symfony/routing/Matcher/Dumper/MatcherDumperInterface.php!=b47vendor/symfony/routing/Matcher/Dumper/MatcherDumper.php[!=b[BJAvendor/symfony/routing/Matcher/Dumper/CompiledUrlMatcherTrait.php!=b0M@vendor/symfony/routing/Matcher/Dumper/StaticPrefixCollection.phpw!=bwrʢ5vendor/symfony/routing/Matcher/CompiledUrlMatcher.php!=b"z%=vendor/symfony/routing/Matcher/ExpressionLanguageProvider.php.!=b.T:vendor/symfony/routing/Matcher/RequestMatcherInterface.php!=bA[9vendor/symfony/routing/Matcher/RedirectableUrlMatcher.php!=bR@?-vendor/symfony/routing/Matcher/UrlMatcher.phpO!=bOWh vendor/symfony/routing/Route.php!=b1TBvendor/symfony/routing/DependencyInjection/RoutingResolverPass.php!=bd vendor/symfony/routing/Alias.phpJ!=bJSXr1vendor/symfony/routing/RouteCollectionBuilder.php!=bE9vendor/symfony/routing/Generator/CompiledUrlGenerator.phpE!=bEhDvendor/symfony/routing/Generator/Dumper/GeneratorDumperInterface.php!=b"Fvendor/symfony/routing/Generator/Dumper/CompiledUrlGeneratorDumper.php& !=b& !/;vendor/symfony/routing/Generator/Dumper/GeneratorDumper.phpa!=ba$:vendor/symfony/routing/Generator/UrlGeneratorInterface.php!=bZFvendor/symfony/routing/Generator/ConfigurableRequirementsInterface.php!=b1vendor/symfony/routing/Generator/UrlGenerator.php!!=b!F o(vendor/symfony/routing/RouteCompiler.php!=b j"vendor/symfony/dom-crawler/LICENSE)!=b)ax&vendor/symfony/dom-crawler/Crawler.phpR!=bRHpŤ0vendor/symfony/dom-crawler/FormFieldRegistry.php !=b *vendor/symfony/dom-crawler/UriResolver.phpj!=bjCsƤ$vendor/symfony/dom-crawler/Image.php!=b 4vendor/symfony/dom-crawler/Field/ChoiceFormField.php!=b:96vendor/symfony/dom-crawler/Field/TextareaFormField.php!=b4^3vendor/symfony/dom-crawler/Field/InputFormField.php!=b!O2vendor/symfony/dom-crawler/Field/FileFormField.php+!=b+j.vendor/symfony/dom-crawler/Field/FormField.php!=bs#vendor/symfony/dom-crawler/Form.php!=b;e1vendor/symfony/dom-crawler/AbstractUriElement.php-!=b-ɤ#vendor/symfony/dom-crawler/Link.php!=bvۮ vendor/symfony/contracts/LICENSE)!=b)Ǩ7?vendor/symfony/contracts/Service/ServiceSubscriberInterface.php!=bd (vendor/symfony/contracts/Service/LICENSE)!=b)Ǩ73vendor/symfony/contracts/Service/ResetInterface.phpy!=byj=vendor/symfony/contracts/Service/ServiceProviderInterface.php!=boe 8vendor/symfony/contracts/Service/ServiceLocatorTrait.php !=b =Qf;vendor/symfony/contracts/Service/ServiceSubscriberTrait.phpa !=ba -[@vendor/symfony/contracts/Service/Attribute/SubscribedService.php!=bzd7vendor/symfony/contracts/Service/Attribute/Required.phpb!=bbu,vendor/symfony/contracts/Translation/LICENSE)!=b)Ǩ78vendor/symfony/contracts/Translation/TranslatorTrait.php !=b jB=vendor/symfony/contracts/Translation/LocaleAwareInterface.php!=b_2 >vendor/symfony/contracts/Translation/TranslatableInterface.php!=bTfФ<vendor/symfony/contracts/Translation/TranslatorInterface.php!=bK*+vendor/symfony/contracts/HttpClient/LICENSE)!=b)Ǩ7?vendor/symfony/contracts/HttpClient/ResponseStreamInterface.php!=bM d;vendor/symfony/contracts/HttpClient/HttpClientInterface.phpe!=be=Lvendor/symfony/contracts/HttpClient/Exception/DecodingExceptionInterface.php!=bmOvendor/symfony/contracts/HttpClient/Exception/RedirectionExceptionInterface.php!=b]NKvendor/symfony/contracts/HttpClient/Exception/TimeoutExceptionInterface.php!=bӛHvendor/symfony/contracts/HttpClient/Exception/HttpExceptionInterface.php!=bWJvendor/symfony/contracts/HttpClient/Exception/ClientExceptionInterface.php!=bMvendor/symfony/contracts/HttpClient/Exception/TransportExceptionInterface.php!=bsƤDvendor/symfony/contracts/HttpClient/Exception/ExceptionInterface.php|!=b|lzJvendor/symfony/contracts/HttpClient/Exception/ServerExceptionInterface.php!=bf6vendor/symfony/contracts/HttpClient/ChunkInterface.php!=bM'Ȥ9vendor/symfony/contracts/HttpClient/ResponseInterface.phpc!=bc֤&vendor/symfony/contracts/Cache/LICENSE)!=b)Ǩ74vendor/symfony/contracts/Cache/CallbackInterface.php!=b 6Z0vendor/symfony/contracts/Cache/ItemInterface.php!=b 1vendor/symfony/contracts/Cache/CacheInterface.phpN!=bN>v-vendor/symfony/contracts/Cache/CacheTrait.php!=b'N`9vendor/symfony/contracts/Cache/TagAwareCacheInterface.php!=bI,vendor/symfony/contracts/Deprecation/LICENSE)!=b)8½1vendor/symfony/contracts/Deprecation/function.php=!=b= 0vendor/symfony/contracts/EventDispatcher/LICENSE)!=b)Ǩ72vendor/symfony/contracts/EventDispatcher/Event.php!=b\Evendor/symfony/contracts/EventDispatcher/EventDispatcherInterface.php2!=b2svvendor/symfony/cache/LICENSE)!=b))vendor/symfony/cache/DoctrineProvider.php!=b-H̤#vendor/symfony/cache/Psr16Cache.phpB!=bB{|%vendor/symfony/cache/LockRegistry.php=!=b=6*1vendor/symfony/cache/Exception/LogicException.php!=bx 1vendor/symfony/cache/Exception/CacheException.php!=bJ/;vendor/symfony/cache/Exception/InvalidArgumentException.php!=b~?9vendor/symfony/cache/Messenger/EarlyExpirationMessage.php;!=b;]<vendor/symfony/cache/Messenger/EarlyExpirationDispatcher.phpd!=bd9vendor/symfony/cache/Messenger/EarlyExpirationHandler.php!=b$Y9vendor/symfony/cache/DataCollector/CacheDataCollector.php]!=b]42+vendor/symfony/cache/PruneableInterface.phpt!=btרAvendor/symfony/cache/DependencyInjection/CachePoolClearerPass.php !=b W@vendor/symfony/cache/DependencyInjection/CachePoolPrunerPass.phpx!=bx|?vendor/symfony/cache/DependencyInjection/CacheCollectorPass.php !=b bj:vendor/symfony/cache/DependencyInjection/CachePoolPass.php!!=b!=,vendor/symfony/cache/ResettableInterface.php!=b1vendor/symfony/cache/Traits/RedisClusterProxy.php!=bw- /vendor/symfony/cache/Traits/FilesystemTrait.phpI!=bIS@*vendor/symfony/cache/Traits/RedisTrait.phpE!=bEe͇:*vendor/symfony/cache/Traits/ProxyTrait.php!=bTM.vendor/symfony/cache/Traits/ContractsTrait.php !=b 4vendor/symfony/cache/Traits/AbstractAdapterTrait.php!=bS5vendor/symfony/cache/Traits/FilesystemCommonTrait.php!=bbŤ5vendor/symfony/cache/Traits/RedisClusterNodeProxy.php<!=b<Mj'0*vendor/symfony/cache/Traits/RedisProxy.phpO!=bOъ6vendor/symfony/cache/Marshaller/TagAwareMarshaller.php!=bHuj*4vendor/symfony/cache/Marshaller/SodiumMarshaller.php!=b,L7vendor/symfony/cache/Marshaller/MarshallerInterface.php!=bcD5vendor/symfony/cache/Marshaller/DefaultMarshaller.phpH !=bH 65vendor/symfony/cache/Marshaller/DeflateMarshaller.php!=b{K4vendor/symfony/cache/Adapter/ParameterNormalizer.php!=b219vendor/symfony/cache/Adapter/TagAwareAdapterInterface.php!=b-vendor/symfony/cache/Adapter/RedisAdapter.php!=b#Y5vendor/symfony/cache/Adapter/RedisTagAwareAdapter.php!=b2.90vendor/symfony/cache/Adapter/PhpArrayAdapter.php!=bs`,vendor/symfony/cache/Adapter/ApcuAdapter.php !=b "Ƥ-vendor/symfony/cache/Adapter/ChainAdapter.php!=by|-vendor/symfony/cache/Adapter/ArrayAdapter.php!=b֍,vendor/symfony/cache/Adapter/NullAdapter.php!=b̍u-vendor/symfony/cache/Adapter/Psr16Adapter.php!=bx2vendor/symfony/cache/Adapter/FilesystemAdapter.php!=bp%9vendor/symfony/cache/Adapter/TraceableTagAwareAdapter.php!=b7(C0vendor/symfony/cache/Adapter/AbstractAdapter.php!=bD1vendor/symfony/cache/Adapter/TraceableAdapter.phpt!=bt3#8vendor/symfony/cache/Adapter/AbstractTagAwareAdapter.php!=bR0vendor/symfony/cache/Adapter/DoctrineAdapter.php!=b1G0vendor/symfony/cache/Adapter/TagAwareAdapter.php!=bՍ:vendor/symfony/cache/Adapter/FilesystemTagAwareAdapter.phpb!=bb%Q'+vendor/symfony/cache/Adapter/PdoAdapter.php4!=b4$ 0vendor/symfony/cache/Adapter/PhpFilesAdapter.php !=b ?D;vendor/symfony/cache/Adapter/CouchbaseCollectionAdapter.php!=b7vendor/symfony/cache/Adapter/CouchbaseBucketAdapter.php_!=b_-vendor/symfony/cache/Adapter/ProxyAdapter.php2!=b2|;_4vendor/symfony/cache/Adapter/DoctrineDbalAdapter.phph)!=bh)hB1vendor/symfony/cache/Adapter/MemcachedAdapter.php"!=b"? )1vendor/symfony/cache/Adapter/AdapterInterface.phpw!=bw."vendor/symfony/cache/CacheItem.php !=b 7vendor/symfony/polyfill-intl-normalizer/bootstrap80.php!=b=r/vendor/symfony/polyfill-intl-normalizer/LICENSE)!=b)\6vendor/symfony/polyfill-intl-normalizer/Normalizer.php!=bb"qFvendor/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php.!=b.Qs$Tvendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalDecomposition.phpa!=baR}Xvendor/symfony/polyfill-intl-normalizer/Resources/unidata/compatibilityDecomposition.php!=boe)Lvendor/symfony/polyfill-intl-normalizer/Resources/unidata/combiningClass.phpt.!=bt. qܤRvendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalComposition.php=!=b=*o?5vendor/symfony/polyfill-intl-normalizer/bootstrap.php!=bPD1vendor/symfony/expression-language/Expression.php !=b  &),vendor/symfony/expression-language/Lexer.php !=b 3eg*vendor/symfony/expression-language/LICENSE)!=b)axLvendor/symfony/expression-language/Resources/bin/generate_operator_regex.php#!=b#\V/vendor/symfony/expression-language/Compiler.php_!=b_/2vendor/symfony/expression-language/SyntaxError.php!=bmAvendor/symfony/expression-language/SerializedParsedExpression.phpV!=bV2vendor/symfony/expression-language/TokenStream.php!=b{*9vendor/symfony/expression-language/ExpressionFunction.php!=b>vendor/symfony/framework-bundle/Resources/config/profiling.php!=b׭?vendor/symfony/framework-bundle/Resources/config/debug_prod.php!=bCZ?vendor/symfony/framework-bundle/Resources/config/serializer.php"!=b"hiFvendor/symfony/framework-bundle/Resources/config/fragment_renderer.php!=b|k<vendor/symfony/framework-bundle/Resources/config/session.php!=bw+@vendor/symfony/framework-bundle/Resources/config/annotations.php!=bV8vendor/symfony/framework-bundle/Resources/config/ssi.php!=bu50=vendor/symfony/framework-bundle/Resources/config/web_link.php\!=b\v<vendor/symfony/framework-bundle/Resources/config/routing.php!=bIQq9vendor/symfony/framework-bundle/Resources/config/form.php!=bo?vendor/symfony/framework-bundle/Resources/config/collectors.php !=b s!Fvendor/symfony/framework-bundle/Resources/config/http_client_debug.php!=b@vendor/symfony/framework-bundle/Resources/config/cache_debug.php!=b_Dvendor/symfony/framework-bundle/Resources/config/messenger_debug.php!=bV{SCvendor/symfony/framework-bundle/Resources/config/notifier_debug.php!=bAVFvendor/symfony/framework-bundle/Resources/config/mailer_transports.php !=b 'Cvendor/symfony/framework-bundle/Resources/config/error_renderer.phpA!=bAGBvendor/symfony/framework-bundle/Resources/config/security_csrf.php0!=b0_YAvendor/symfony/framework-bundle/Resources/config/rate_limiter.php!=bP*Dvendor/symfony/framework-bundle/Resources/config/property_access.php!=b *@vendor/symfony/framework-bundle/Resources/config/http_client.php!=bԹbBvendor/symfony/framework-bundle/Resources/config/property_info.php,!=b,y-<vendor/symfony/framework-bundle/Resources/config/request.php!=b>vendor/symfony/framework-bundle/Resources/config/messenger.phpH!=bHV ?vendor/symfony/framework-bundle/Resources/config/form_debug.php!=bmru@vendor/symfony/framework-bundle/Resources/config/translation.php!=b?¤=vendor/symfony/framework-bundle/Resources/config/services.php!=b <vendor/symfony/framework-bundle/Resources/config/console.php&!=b&ւ@Y>vendor/symfony/framework-bundle/Resources/config/mime_type.php!=bl8vendor/symfony/framework-bundle/Resources/config/esi.php!=bU[h>vendor/symfony/framework-bundle/Resources/config/validator.php} !=b} o$$ɤ<vendor/symfony/framework-bundle/Resources/config/secrets.php!=b Z9vendor/symfony/framework-bundle/Resources/config/lock.php!=bqJvendor/symfony/framework-bundle/Resources/config/translation_providers.php!=bEp/8vendor/symfony/framework-bundle/Resources/config/web.phpY!=bYd:vendor/symfony/framework-bundle/Resources/config/debug.php!=bj7Dvendor/symfony/framework-bundle/Resources/config/validator_debug.php!=b宱Z:vendor/symfony/framework-bundle/Resources/config/cache.php!=bAȤAvendor/symfony/framework-bundle/Resources/config/mailer_debug.php!=b>vendor/symfony/framework-bundle/Resources/config/form_csrf.phpM!=bMPɤFvendor/symfony/framework-bundle/Resources/config/fragment_listener.php}!=b}Hvendor/symfony/framework-bundle/Resources/config/notifier_transports.php7!=b7BۤGvendor/symfony/framework-bundle/Resources/config/schema/symfony-1.0.xsd!=bn;vendor/symfony/framework-bundle/Resources/config/assets.php1 !=b1 >Hvendor/symfony/framework-bundle/Resources/config/identity_translator.php!=bh$ ;vendor/symfony/framework-bundle/Resources/config/mailer.php!=beFvendor/symfony/framework-bundle/Resources/config/translation_debug.php!=bHN=vendor/symfony/framework-bundle/Resources/config/notifier.phpf!=bfWIvendor/symfony/framework-bundle/Resources/bin/check-unused-known-tags.php !=b Avendor/symfony/framework-bundle/Controller/TemplateController.php!=bϤAvendor/symfony/framework-bundle/Controller/AbstractController.php,0!=b,0Avendor/symfony/framework-bundle/Controller/RedirectController.phpr!=brzAvendor/symfony/framework-bundle/Controller/ControllerResolver.phpM!=bM_7vendor/symfony/framework-bundle/Console/Application.php!=b^Evendor/symfony/framework-bundle/Console/Descriptor/JsonDescriptor.php.!=b.r[Evendor/symfony/framework-bundle/Console/Descriptor/TextDescriptor.phpN!=bN"QDvendor/symfony/framework-bundle/Console/Descriptor/XmlDescriptor.phpM!=bMIS2Avendor/symfony/framework-bundle/Console/Descriptor/Descriptor.php#!=b#pUIvendor/symfony/framework-bundle/Console/Descriptor/MarkdownDescriptor.php'3!=b'3@Cvendor/symfony/framework-bundle/Console/Helper/DescriptorHelper.php6!=b6PῤQvendor/symfony/framework-bundle/EventListener/SuggestMissingPackageSubscriber.php;!=b;9ФGvendor/symfony/framework-bundle/CacheWarmer/TranslationsCacheWarmer.php!=b"u|Dvendor/symfony/framework-bundle/CacheWarmer/ValidatorCacheWarmer.php!=bA.NHvendor/symfony/framework-bundle/CacheWarmer/ConfigBuilderCacheWarmer.php!=b+Kvendor/symfony/framework-bundle/CacheWarmer/CachePoolClearerCacheWarmer.php!=b`mEvendor/symfony/framework-bundle/CacheWarmer/SerializerCacheWarmer.php!=b[Avendor/symfony/framework-bundle/CacheWarmer/RouterCacheWarmer.php4!=b4<ʤFvendor/symfony/framework-bundle/CacheWarmer/AnnotationsCacheWarmer.phpT!=bTyGJvendor/symfony/framework-bundle/CacheWarmer/AbstractPhpFileCacheWarmer.phpM!=bMd@_3vendor/symfony/framework-bundle/FrameworkBundle.php $!=b $gĤHvendor/symfony/framework-bundle/Command/SecretsDecryptToLocalCommand.php !=b +Ĥ@vendor/symfony/framework-bundle/Command/AssetsInstallCommand.php!=bJs8vendor/symfony/framework-bundle/Command/AboutCommand.phpl!=bl }@vendor/symfony/framework-bundle/Command/ContainerLintCommand.php!=b6 =vendor/symfony/framework-bundle/Command/SecretsSetCommand.php!=bz>vendor/symfony/framework-bundle/Command/RouterMatchCommand.php !=b l6Fvendor/symfony/framework-bundle/Command/SecretsGenerateKeysCommand.php !=b u>vendor/symfony/framework-bundle/Command/CacheWarmupCommand.php!=bCvendor/symfony/framework-bundle/Command/TranslationDebugCommand.php,!=b,@vendor/symfony/framework-bundle/Command/CachePoolListCommand.php!=b"@Dvendor/symfony/framework-bundle/Command/BuildDebugContainerTrait.php^!=b^l;vendor/symfony/framework-bundle/Command/YamlLintCommand.php!=b@bFvendor/symfony/framework-bundle/Command/ConfigDumpReferenceCommand.php<!=b</׹Avendor/symfony/framework-bundle/Command/AbstractConfigCommand.php!=b# >vendor/symfony/framework-bundle/Command/RouterDebugCommand.php!=bĤ<vendor/symfony/framework-bundle/Command/XliffLintCommand.php!=b ԜAvendor/symfony/framework-bundle/Command/CachePoolPruneCommand.php!=bvS,=vendor/symfony/framework-bundle/Command/CacheClearCommand.php!=bt/U?vendor/symfony/framework-bundle/Command/WorkflowDumpCommand.php$!=b$"MAvendor/symfony/framework-bundle/Command/ContainerDebugCommand.phpr)!=br)Avendor/symfony/framework-bundle/Command/CachePoolClearCommand.php !=b ؄f=>vendor/symfony/framework-bundle/Command/SecretsListCommand.php !=b 6%>vendor/symfony/framework-bundle/Command/ConfigDebugCommand.php!=b @vendor/symfony/framework-bundle/Command/SecretsRemoveCommand.php !=b sBvendor/symfony/framework-bundle/Command/CachePoolDeleteCommand.php!=bD%oqDvendor/symfony/framework-bundle/Command/TranslationUpdateCommand.php6!=b6^TGvendor/symfony/framework-bundle/Command/EventDispatcherDebugCommand.php!=bѡnCBvendor/symfony/framework-bundle/Command/DebugAutowiringCommand.php!=bl0kJvendor/symfony/framework-bundle/Command/SecretsEncryptFromLocalCommand.php|!=b|_ؽȤGvendor/symfony/framework-bundle/DataCollector/AbstractDataCollector.php!=bkΤUvendor/symfony/framework-bundle/DataCollector/TemplateAwareDataCollectorInterface.php!=bJEvendor/symfony/framework-bundle/DataCollector/RouterDataCollector.phpk!=bk˜Dvendor/symfony/framework-bundle/Session/DeprecatedSessionFactory.php!=bI >Avendor/symfony/framework-bundle/Session/ServiceSessionFactory.php!=b&Jvendor/symfony/framework-bundle/DependencyInjection/FrameworkExtension.php!=bflEvendor/symfony/framework-bundle/DependencyInjection/Configuration.php!=bv`Vvendor/symfony/framework-bundle/DependencyInjection/Compiler/LoggingTranslatorPass.php!=b8e r_vendor/symfony/framework-bundle/DependencyInjection/Compiler/AddAnnotationsCachedReaderPass.phpF!=bFKuZvendor/symfony/framework-bundle/DependencyInjection/Compiler/WorkflowGuardListenerPass.php!=b@'3Lvendor/symfony/framework-bundle/DependencyInjection/Compiler/SessionPass.php<!=b<_uo\vendor/symfony/framework-bundle/DependencyInjection/Compiler/DataCollectorTranslatorPass.php!=bimYvendor/symfony/framework-bundle/DependencyInjection/Compiler/AddDebugLogProcessorPass.php!=bФRvendor/symfony/framework-bundle/DependencyInjection/Compiler/AssetsContextPass.php!=be*^vendor/symfony/framework-bundle/DependencyInjection/Compiler/ContainerBuilderDebugDumpPass.php!=b6Ovendor/symfony/framework-bundle/DependencyInjection/Compiler/UnusedTagsPass.php7 !=b7 "`vendor/symfony/framework-bundle/DependencyInjection/Compiler/TestServiceContainerRealRefPass.php!=b Ojvendor/symfony/framework-bundle/DependencyInjection/Compiler/RemoveUnusedSessionMarshallingHandlerPass.php!=b bMvendor/symfony/framework-bundle/DependencyInjection/Compiler/ProfilerPass.php!=b1cvendor/symfony/framework-bundle/DependencyInjection/Compiler/AddExpressionLanguageProvidersPass.php!=bk`vendor/symfony/framework-bundle/DependencyInjection/Compiler/TestServiceContainerWeakRefPass.php7!=b7 7vendor/symfony/framework-bundle/Secrets/SodiumVault.phpo!=boy}7vendor/symfony/framework-bundle/Secrets/DotenvVault.php !=b fϤ9vendor/symfony/framework-bundle/Secrets/AbstractVault.php@!=b@r6;vendor/symfony/framework-bundle/Kernel/MicroKernelTrait.php!=b/痤7vendor/symfony/framework-bundle/HttpCache/HttpCache.php!=b_y1vendor/symfony/framework-bundle/KernelBrowser.php!=b-<vendor/symfony/framework-bundle/Routing/DelegatingLoader.php!=b!2vendor/symfony/framework-bundle/Routing/Router.phpn!=bn$Jvendor/symfony/framework-bundle/Routing/AnnotatedRouteControllerLoader.php!=bcJvendor/symfony/framework-bundle/Routing/RedirectableCompiledUrlMatcher.php!=bg@vendor/symfony/framework-bundle/Routing/RouteLoaderInterface.phpi!=bi{u%vendor/symfony/monolog-bridge/LICENSE)!=b) :vendor/symfony/monolog-bridge/Handler/ServerLogHandler.php !=b *(8vendor/symfony/monolog-bridge/Handler/FirePHPHandler.phpP!=bPjSvendor/symfony/monolog-bridge/Handler/FingersCrossed/HttpCodeActivationStrategy.phpu!=bu[sSvendor/symfony/monolog-bridge/Handler/FingersCrossed/NotFoundActivationStrategy.php!=bpR7vendor/symfony/monolog-bridge/Handler/MailerHandler.php !=b zFvendor/symfony/monolog-bridge/Handler/ElasticsearchLogstashHandler.php !=b |_68vendor/symfony/monolog-bridge/Handler/ConsoleHandler.php !=b `C9vendor/symfony/monolog-bridge/Handler/NotifierHandler.php<!=b<<vendor/symfony/monolog-bridge/Handler/SwiftMailerHandler.php!=b|5>:vendor/symfony/monolog-bridge/Handler/ChromePhpHandler.php!=bxg(vendor/symfony/monolog-bridge/Logger.php!=bb׹:vendor/symfony/monolog-bridge/Command/ServerLogCommand.php!=bHvendor/symfony/monolog-bridge/Messenger/ResetLoggersWorkerSubscriber.php!=bLBvendor/symfony/monolog-bridge/Processor/AbstractTokenProcessor.phps!=bsp7Cvendor/symfony/monolog-bridge/Processor/ConsoleCommandProcessor.php!=bUW8vendor/symfony/monolog-bridge/Processor/WebProcessor.php.!=b.:vendor/symfony/monolog-bridge/Processor/DebugProcessor.php!=bҩ:vendor/symfony/monolog-bridge/Processor/RouteProcessor.php}!=b}vendor/symfony/monolog-bridge/Formatter/VarDumperFormatter.php!=bf,<vendor/symfony/monolog-bridge/Formatter/ConsoleFormatter.phpL!=bL]aդvendor/symfony/process/LICENSE)!=b) 'vendor/symfony/process/ProcessUtils.php!=bg>^+vendor/symfony/process/ExecutableFinder.php!=bާ}"vendor/symfony/process/Process.php f!=b fК3vendor/symfony/process/Exception/LogicException.php!=b 5vendor/symfony/process/Exception/RuntimeException.php!=b:=vendor/symfony/process/Exception/InvalidArgumentException.php!=b+_=vendor/symfony/process/Exception/ProcessTimedOutException.php1!=b1'Z7vendor/symfony/process/Exception/ExceptionInterface.phpy!=byqVXJ=vendor/symfony/process/Exception/ProcessSignaledException.php!=bYש;vendor/symfony/process/Exception/ProcessFailedException.phpx!=bxzy&vendor/symfony/process/InputStream.php(!=b(P)-vendor/symfony/process/Pipes/WindowsPipes.php3 !=b3 X*vendor/symfony/process/Pipes/UnixPipes.php!=b~7/vendor/symfony/process/Pipes/PipesInterface.php!=bfQ .vendor/symfony/process/Pipes/AbstractPipes.php !=b .vendor/symfony/process/PhpExecutableFinder.phpO!=bO(%vendor/symfony/process/PhpProcess.php!=bs!vendor/symfony/filesystem/LICENSE)!=b)ax3vendor/symfony/filesystem/Exception/IOException.php!=b3Lפ8vendor/symfony/filesystem/Exception/RuntimeException.php!=bUUH<vendor/symfony/filesystem/Exception/IOExceptionInterface.php!=bjwM@vendor/symfony/filesystem/Exception/InvalidArgumentException.php!=b!Ǥ=vendor/symfony/filesystem/Exception/FileNotFoundException.php!=b%󇑤:vendor/symfony/filesystem/Exception/ExceptionInterface.php|!=b|D(vendor/symfony/filesystem/Filesystem.php|?!=b|?I"vendor/symfony/filesystem/Path.php'!=b'?J0vendor/symfony/event-dispatcher/GenericEvent.php!=bm6'vendor/symfony/event-dispatcher/LICENSE)!=b)axBvendor/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php!=bOl9vendor/symfony/event-dispatcher/Debug/WrappedListener.php !=b }<vendor/symfony/event-dispatcher/EventDispatcherInterface.php !=b -hM<vendor/symfony/event-dispatcher/ImmutableEventDispatcher.php!=bYiv3vendor/symfony/event-dispatcher/EventDispatcher.php!=b ˻Mvendor/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php!=bG}Kvendor/symfony/event-dispatcher/DependencyInjection/AddEventAliasesPass.php!=b'"L>vendor/symfony/event-dispatcher/LegacyEventDispatcherProxy.php!=bb<vendor/symfony/event-dispatcher/EventSubscriberInterface.php!=b=vendor/symfony/event-dispatcher/Attribute/AsEventListener.php!=b2椟!vendor/symfony/var-dumper/LICENSE)!=b)/v8vendor/symfony/var-dumper/Resources/js/htmlDescriptor.jsb!=bbh|6vendor/symfony/var-dumper/Resources/functions/dump.php!=bK:vendor/symfony/var-dumper/Resources/css/htmlDescriptor.css !=b Dva7vendor/symfony/var-dumper/Resources/bin/var-dump-server!=b.3vendor/symfony/var-dumper/Dumper/AbstractDumper.php& !=b& fD/vendor/symfony/var-dumper/Dumper/HtmlDumper.php%x!=b%x9vendor/symfony/var-dumper/Dumper/ContextualizedDumper.php!=b\8vendor/symfony/var-dumper/Dumper/DataDumperInterface.php!=bF.vendor/symfony/var-dumper/Dumper/CliDumper.php3!=b3lҤԤKvendor/symfony/var-dumper/Dumper/ContextProvider/RequestContextProvider.php!=bz^ˤJvendor/symfony/var-dumper/Dumper/ContextProvider/SourceContextProvider.php3 !=b3 4jGvendor/symfony/var-dumper/Dumper/ContextProvider/CliContextProvider.php!=bNXMvendor/symfony/var-dumper/Dumper/ContextProvider/ContextProviderInterface.php!=b1vendor/symfony/var-dumper/Dumper/ServerDumper.php,!=b,F /vendor/symfony/var-dumper/Server/DumpServer.phpC!=bCs./vendor/symfony/var-dumper/Server/Connection.php!=bjȤ7vendor/symfony/var-dumper/Command/ServerDumpCommand.php !=b ،>vendor/symfony/var-dumper/Command/Descriptor/CliDescriptor.phpq!=bq&jqHvendor/symfony/var-dumper/Command/Descriptor/DumpDescriptorInterface.php<!=b<ސ?vendor/symfony/var-dumper/Command/Descriptor/HtmlDescriptor.php !=b [7?vendor/symfony/var-dumper/Exception/ThrowingCasterException.php!=bm- .vendor/symfony/var-dumper/Caster/PdoCaster.phpW !=bW _踤.vendor/symfony/var-dumper/Caster/DOMCaster.php+!=b+_3.vendor/symfony/var-dumper/Caster/SplCaster.php5!=b5a|-vendor/symfony/var-dumper/Caster/DsCaster.php!=b"3vendor/symfony/var-dumper/Caster/DoctrineCaster.php0!=b0=`5vendor/symfony/var-dumper/Caster/ReflectionCaster.php+!=b+-¤.vendor/symfony/var-dumper/Caster/TraceStub.php!=bq.,vendor/symfony/var-dumper/Caster/ImgStub.php=!=b=,I-F/vendor/symfony/var-dumper/Caster/DateCaster.php!=bXZ-vendor/symfony/var-dumper/Caster/EnumStub.php'!=b'N+vendor/symfony/var-dumper/Caster/Caster.php6 !=b6 %/vendor/symfony/var-dumper/Caster/IntlCaster.php!=bɣ 1vendor/symfony/var-dumper/Caster/MysqliCaster.phpL!=bLP3vendor/symfony/var-dumper/Caster/ResourceCaster.phpm !=bm UU.vendor/symfony/var-dumper/Caster/FrameStub.phpH!=bHh2=/vendor/symfony/var-dumper/Caster/AmqpCaster.php!=b_Ȼ/vendor/symfony/var-dumper/Caster/UuidCaster.phpX!=bX.פ2vendor/symfony/var-dumper/Caster/RdKafkaCaster.phpY !=bY oh0vendor/symfony/var-dumper/Caster/FiberCaster.phpI!=bI3&.vendor/symfony/var-dumper/Caster/GmpCaster.phpb!=bbo .vendor/symfony/var-dumper/Caster/ClassStub.phpX !=bX 4vendor/symfony/var-dumper/Caster/XmlReaderCaster.php!=brwsm2vendor/symfony/var-dumper/Caster/SymfonyCaster.php!=bKQ3vendor/symfony/var-dumper/Cloner/AbstractCloner.phpgB!=bgBmށ+vendor/symfony/var-dumper/Cloner/Cursor.php!=bzC)vendor/symfony/var-dumper/Cloner/Stub.php!=b^¤4vendor/symfony/var-dumper/Cloner/ClonerInterface.php!=b\o].vendor/symfony/var-dumper/Cloner/VarCloner.php!=bJ8 'vendor/symfony/var-dumper/VarDumper.php !=b L1פvendor/symfony/string/LICENSE)!=b)=-vendor/symfony/string/Resources/functions.php!=bcڪ"<vendor/symfony/string/Resources/data/wcswidth_table_zero.php?!=b?&^}<vendor/symfony/string/Resources/data/wcswidth_table_wide.php^!=b^%o)'vendor/symfony/string/UnicodeString.php%!=b%`)vendor/symfony/string/CodePointString.php!=bbu$vendor/symfony/string/LazyString.php !=b {$vendor/symfony/string/ByteString.php+!=b+ƼDФ6vendor/symfony/string/Inflector/InflectorInterface.php!=bhD3vendor/symfony/string/Inflector/FrenchInflector.php !=b {4vendor/symfony/string/Inflector/EnglishInflector.php!=bTs4vendor/symfony/string/Exception/RuntimeException.php!=bug<vendor/symfony/string/Exception/InvalidArgumentException.php!=bA6vendor/symfony/string/Exception/ExceptionInterface.phps!=bsqHV2vendor/symfony/string/Slugger/SluggerInterface.php!=bQ.vendor/symfony/string/Slugger/AsciiSlugger.php!=bwɤ(vendor/symfony/string/AbstractString.php3!=b3a/vendor/symfony/string/AbstractUnicodeString.phpR!=bRHMJvendor/symfony/dotenv/LICENSE)!=b) vendor/symfony/dotenv/Dotenv.php6!=b6fK@3vendor/symfony/dotenv/Command/DotenvDumpCommand.phpl !=bl KW;.vendor/symfony/dotenv/Command/DebugCommand.phpP !=bP N+:vendor/symfony/dotenv/Exception/FormatExceptionContext.php0!=b0(3vendor/symfony/dotenv/Exception/FormatException.php6!=b6/Y6vendor/symfony/dotenv/Exception/ExceptionInterface.phpx!=bx=!?1vendor/symfony/dotenv/Exception/PathException.phpX!=bX :l+vendor/symfony/dependency-injection/LICENSE)!=b)ax6vendor/symfony/dependency-injection/TypedReference.php !=b 5m1vendor/symfony/dependency-injection/Reference.php!=b^V!7vendor/symfony/dependency-injection/EnvVarProcessor.php!=bL#v 1vendor/symfony/dependency-injection/Parameter.php!=b];;vendor/symfony/dependency-injection/ContainerAwareTrait.php!=b7t₤5vendor/symfony/dependency-injection/Dumper/Dumper.php3!=b3F>vendor/symfony/dependency-injection/Dumper/DumperInterface.php!=bF7 8vendor/symfony/dependency-injection/Dumper/PhpDumper.phpd!=bd#}8vendor/symfony/dependency-injection/Dumper/Preloader.php !=b [8vendor/symfony/dependency-injection/Dumper/XmlDumper.php/!=b/:ܾ=vendor/symfony/dependency-injection/Dumper/GraphvizDumper.php!=bd\9vendor/symfony/dependency-injection/Dumper/YamlDumper.php '!=b '4gJvendor/symfony/dependency-injection/ParameterBag/ParameterBagInterface.php!=bZiAGvendor/symfony/dependency-injection/ParameterBag/FrozenParameterBag.php7!=b7ˠpAvendor/symfony/dependency-injection/ParameterBag/ParameterBag.php!=bիAvendor/symfony/dependency-injection/ParameterBag/ContainerBag.phpJ!=bJ Ovendor/symfony/dependency-injection/ParameterBag/EnvPlaceholderParameterBag.php !=b 93Jvendor/symfony/dependency-injection/ParameterBag/ContainerBagInterface.php!=b]=vendor/symfony/dependency-injection/EnvVarLoaderInterface.php!=b<9-<vendor/symfony/dependency-injection/Loader/XmlFileLoader.phpy^!=by^j2<vendor/symfony/dependency-injection/Loader/ClosureLoader.phpT!=bT 9vendor/symfony/dependency-injection/Loader/FileLoader.php!=bp>vendor/symfony/dependency-injection/Loader/DirectoryLoader.php!=bc2<vendor/symfony/dependency-injection/Loader/PhpFileLoader.php!=b[P=vendor/symfony/dependency-injection/Loader/YamlFileLoader.phpy!=by=vendor/symfony/dependency-injection/Loader/GlobFileLoader.php!=bNtOvendor/symfony/dependency-injection/Loader/schema/dic/services/services-1.0.xsdr9!=br9-0Rvendor/symfony/dependency-injection/Loader/Configurator/InstanceofConfigurator.php !=b VbPvendor/symfony/dependency-injection/Loader/Configurator/ServicesConfigurator.phpr!=br^sPvendor/symfony/dependency-injection/Loader/Configurator/DefaultsConfigurator.php!=b<&Xvendor/symfony/dependency-injection/Loader/Configurator/ClosureReferenceConfigurator.php!=bKvendor/symfony/dependency-injection/Loader/Configurator/EnvConfigurator.php0 !=b0 vPvendor/symfony/dependency-injection/Loader/Configurator/AbstractConfigurator.php| !=b| 2Qvendor/symfony/dependency-injection/Loader/Configurator/ContainerConfigurator.php!=bUvendor/symfony/dependency-injection/Loader/Configurator/InlineServiceConfigurator.php!=bܟ DRvendor/symfony/dependency-injection/Loader/Configurator/ParametersConfigurator.php!=bkMvendor/symfony/dependency-injection/Loader/Configurator/AliasConfigurator.php!=b0,äOvendor/symfony/dependency-injection/Loader/Configurator/ServiceConfigurator.php!=bU!MLvendor/symfony/dependency-injection/Loader/Configurator/Traits/LazyTrait.php;!=b;Kvendor/symfony/dependency-injection/Loader/Configurator/Traits/TagTrait.php!=bCMvendor/symfony/dependency-injection/Loader/Configurator/Traits/ClassTrait.php!=bPLvendor/symfony/dependency-injection/Loader/Configurator/Traits/CallTrait.php!=bU~Lvendor/symfony/dependency-injection/Loader/Configurator/Traits/BindTrait.phpl!=blENvendor/symfony/dependency-injection/Loader/Configurator/Traits/PublicTrait.php4!=b4-kPvendor/symfony/dependency-injection/Loader/Configurator/Traits/DecorateTrait.php!=b1Qvendor/symfony/dependency-injection/Loader/Configurator/Traits/DeprecateTrait.php !=b ʤMvendor/symfony/dependency-injection/Loader/Configurator/Traits/ShareTrait.php!=b<Lvendor/symfony/dependency-injection/Loader/Configurator/Traits/FileTrait.php!=b΋;Uvendor/symfony/dependency-injection/Loader/Configurator/Traits/AutoconfigureTrait.phpa!=ba=Ovendor/symfony/dependency-injection/Loader/Configurator/Traits/FactoryTrait.php!=b*Nvendor/symfony/dependency-injection/Loader/Configurator/Traits/ParentTrait.phpx!=bxiPvendor/symfony/dependency-injection/Loader/Configurator/Traits/AbstractTrait.php!=b:Pvendor/symfony/dependency-injection/Loader/Configurator/Traits/PropertyTrait.php!=btQvendor/symfony/dependency-injection/Loader/Configurator/Traits/SyntheticTrait.php!=b!1Pvendor/symfony/dependency-injection/Loader/Configurator/Traits/AutowireTrait.php!=b/Pvendor/symfony/dependency-injection/Loader/Configurator/Traits/ArgumentTrait.php!=bTvendor/symfony/dependency-injection/Loader/Configurator/Traits/ConfiguratorTrait.php!=b6tQvendor/symfony/dependency-injection/Loader/Configurator/PrototypeConfigurator.php!=b@Qvendor/symfony/dependency-injection/Loader/Configurator/ReferenceConfigurator.phpb!=bb9gEWvendor/symfony/dependency-injection/Loader/Configurator/AbstractServiceConfigurator.php1!=b1`Y<vendor/symfony/dependency-injection/Loader/IniFileLoader.php!=b~rKvendor/symfony/dependency-injection/LazyProxy/PhpDumper/DumperInterface.php!=bKFvendor/symfony/dependency-injection/LazyProxy/PhpDumper/NullDumper.php!=b~=vendor/symfony/dependency-injection/LazyProxy/ProxyHelper.php!=bhȤTvendor/symfony/dependency-injection/LazyProxy/Instantiator/InstantiatorInterface.php!=b ԤVvendor/symfony/dependency-injection/LazyProxy/Instantiator/RealServiceInstantiator.php!=bWäBvendor/symfony/dependency-injection/ExpressionLanguageProvider.php}!=b}7giJvendor/symfony/dependency-injection/Config/ContainerParametersResource.php!=bگhQvendor/symfony/dependency-injection/Config/ContainerParametersResourceChecker.php=!=b=؝e;vendor/symfony/dependency-injection/Extension/Extension.php !=b /Kvendor/symfony/dependency-injection/Extension/PrependExtensionInterface.php!=bCQvendor/symfony/dependency-injection/Extension/ConfigurationExtensionInterface.phpO!=bO)aDvendor/symfony/dependency-injection/Extension/ExtensionInterface.phps!=bsvW)Gvendor/symfony/dependency-injection/Exception/EnvParameterException.php!=b { Fvendor/symfony/dependency-injection/Exception/EnvNotFoundException.php!=ba@vendor/symfony/dependency-injection/Exception/LogicException.php!=bOYBvendor/symfony/dependency-injection/Exception/RuntimeException.php!=bCןSvendor/symfony/dependency-injection/Exception/ServiceCircularReferenceException.phpI!=bIHvendor/symfony/dependency-injection/Exception/BadMethodCallException.php!=bhڀJvendor/symfony/dependency-injection/Exception/ServiceNotFoundException.php!=bkO֤Ovendor/symfony/dependency-injection/Exception/InvalidParameterTypeException.phpW!=bWkYCKvendor/symfony/dependency-injection/Exception/AutowiringFailedException.php!=bJvendor/symfony/dependency-injection/Exception/InvalidArgumentException.php!=bKUvendor/symfony/dependency-injection/Exception/ParameterCircularReferenceException.php !=b HFvendor/symfony/dependency-injection/Exception/OutOfBoundsException.php!=bT~셤Dvendor/symfony/dependency-injection/Exception/ExceptionInterface.php!=b%4ULvendor/symfony/dependency-injection/Exception/ParameterNotFoundException.php!=b3|{8vendor/symfony/dependency-injection/ContainerBuilder.php!=b*H?vendor/symfony/dependency-injection/ContainerAwareInterface.php!=bzn@vendor/symfony/dependency-injection/EnvVarProcessorInterface.php7!=b7d2vendor/symfony/dependency-injection/Definition.php*!=b*z@vendor/symfony/dependency-injection/TaggedContainerInterface.php!=bM:vendor/symfony/dependency-injection/ExpressionLanguage.php=!=b=+F0vendor/symfony/dependency-injection/Variable.php!=bTK08vendor/symfony/dependency-injection/ReverseContainer.phpu!=bu'1vendor/symfony/dependency-injection/Container.php" !=b" r,_7vendor/symfony/dependency-injection/ChildDefinition.php,!=b,-vendor/symfony/dependency-injection/Alias.php !=b P›h:vendor/symfony/dependency-injection/ContainerInterface.phpQ!=bQ!ĤMvendor/symfony/dependency-injection/Compiler/RegisterEnvVarProcessorsPass.php!=b';vendor/symfony/dependency-injection/Compiler/PassConfig.phpi!=biFvendor/symfony/dependency-injection/Compiler/AbstractRecursivePass.phpC!=bC?Kvendor/symfony/dependency-injection/Compiler/ResolveEnvPlaceholdersPass.phpp!=bpuPvendor/symfony/dependency-injection/Compiler/MergeExtensionConfigurationPass.php!=b]IEvendor/symfony/dependency-injection/Compiler/ResolveNoPreloadPass.phpI !=bI PѤEvendor/symfony/dependency-injection/Compiler/DecoratorServicePass.php0!=b0Lvendor/symfony/dependency-injection/Compiler/CheckDefinitionValidityPass.phpS !=bS #Rvendor/symfony/dependency-injection/Compiler/ResolveTaggedIteratorArgumentPass.php !=b Kvendor/symfony/dependency-injection/Compiler/PriorityTaggedServiceTrait.php!=b 9vendor/symfony/dependency-injection/Compiler/Compiler.php!=b`Rvendor/symfony/dependency-injection/Compiler/ResolveInstanceofConditionalsPass.php!=bKRvendor/symfony/dependency-injection/Compiler/AliasDeprecatedPublicServicesPass.phpy!=bywJvendor/symfony/dependency-injection/Compiler/CheckTypeDeclarationsPass.php!!=b!z 1Tvendor/symfony/dependency-injection/Compiler/RegisterAutoconfigureAttributesPass.phpI !=bI ]|"Nvendor/symfony/dependency-injection/Compiler/RemoveAbstractDefinitionsPass.php!=bHvendor/symfony/dependency-injection/Compiler/ResolveFactoryClassPass.php!=b+Lvendor/symfony/dependency-injection/Compiler/RemoveUnusedDefinitionsPass.php!=b?J"Lvendor/symfony/dependency-injection/Compiler/CheckCircularReferencesPass.php!=b̄Svendor/symfony/dependency-injection/Compiler/ReplaceAliasByActualDefinitionPass.php !=b ΚMvendor/symfony/dependency-injection/Compiler/AnalyzeServiceReferencesPass.phpJ!=bJ}>Fvendor/symfony/dependency-injection/Compiler/ServiceReferenceGraph.php!=b*Mvendor/symfony/dependency-injection/Compiler/DefinitionErrorExceptionPass.php!=b5Jvendor/symfony/dependency-injection/Compiler/ResolveDecoratorStackPass.php !=b Kvendor/symfony/dependency-injection/Compiler/CheckReferenceValidityPass.php!=bnlDvendor/symfony/dependency-injection/Compiler/ResolvePrivatesPass.php!=bޘ.Ovendor/symfony/dependency-injection/Compiler/AttributeAutoconfigurationPass.php!=bW ӤJvendor/symfony/dependency-injection/Compiler/ResolveNamedArgumentsPass.phpo!=bozOvendor/symfony/dependency-injection/Compiler/ResolveReferencesToAliasesPass.php!=bMvendor/symfony/dependency-injection/Compiler/RegisterReverseContainerPass.php!=bFtCvendor/symfony/dependency-injection/Compiler/ResolveHotPathPass.php!=b=Dvendor/symfony/dependency-injection/Compiler/ResolveBindingsPass.php!=b8`vQvendor/symfony/dependency-injection/Compiler/ResolveParameterPlaceHoldersPass.php!=bLvendor/symfony/dependency-injection/Compiler/ValidateEnvPlaceholdersPass.php !=b ۤEvendor/symfony/dependency-injection/Compiler/AutoAliasServicePass.php!=bfAvendor/symfony/dependency-injection/Compiler/ResolveClassPass.phpJ!=bJuFvendor/symfony/dependency-injection/Compiler/ExtensionCompilerPass.php!=b+)Fvendor/symfony/dependency-injection/Compiler/ServiceLocatorTagPass.php!=b=)-Lvendor/symfony/dependency-injection/Compiler/ResolveChildDefinitionsPass.phpA!=bA#$Ivendor/symfony/dependency-injection/Compiler/RemovePrivateAliasesPass.php!=b 7=vendor/symfony/dependency-injection/Compiler/AutowirePass.phpzE!=bzESd]vendor/symfony/dependency-injection/Compiler/CheckExceptionOnInvalidReferenceBehaviorPass.php !=b 8Fvendor/symfony/dependency-injection/Compiler/CompilerPassInterface.php!=b%uMvendor/symfony/dependency-injection/Compiler/ResolveInvalidReferencesPass.php9 !=b9 *LOvendor/symfony/dependency-injection/Compiler/RegisterServiceSubscribersPass.php !=b 0&aJvendor/symfony/dependency-injection/Compiler/ServiceReferenceGraphNode.php!=bdalNvendor/symfony/dependency-injection/Compiler/ResolveServiceSubscribersPass.php^!=b^אOvendor/symfony/dependency-injection/Compiler/AutowireRequiredPropertiesPass.php!=bof Mvendor/symfony/dependency-injection/Compiler/InlineServiceDefinitionsPass.phpX!=bXlܡLvendor/symfony/dependency-injection/Compiler/AutowireRequiredMethodsPass.php !=b "&LJvendor/symfony/dependency-injection/Compiler/ServiceReferenceGraphEdge.php!=bKvendor/symfony/dependency-injection/Compiler/CheckArgumentsValidityPass.php !=b Jvendor/symfony/dependency-injection/Argument/ReferenceSetArgumentTrait.php!=b,2Gvendor/symfony/dependency-injection/Argument/ServiceLocatorArgument.php;!=b;Avendor/symfony/dependency-injection/Argument/AbstractArgument.php!=b|-Dvendor/symfony/dependency-injection/Argument/RewindableGenerator.php!=b0Gvendor/symfony/dependency-injection/Argument/TaggedIteratorArgument.php!=b" Avendor/symfony/dependency-injection/Argument/IteratorArgument.php!=bK^>vendor/symfony/dependency-injection/Argument/BoundArgument.php!=b&4\Gvendor/symfony/dependency-injection/Argument/ServiceClosureArgument.php!=b_5^Bvendor/symfony/dependency-injection/Argument/ArgumentInterface.php!=bW?vendor/symfony/dependency-injection/Argument/ServiceLocator.php.!=b.X6vendor/symfony/dependency-injection/ServiceLocator.php!=bh?vendor/symfony/dependency-injection/Attribute/Autoconfigure.php!=bœÕ>vendor/symfony/dependency-injection/Attribute/AsTaggedItem.php!=b|[@vendor/symfony/dependency-injection/Attribute/TaggedIterator.php!=bw?vendor/symfony/dependency-injection/Attribute/TaggedLocator.php!=b ˖?Bvendor/symfony/dependency-injection/Attribute/AutoconfigureTag.php!=bm6vendor/symfony/dependency-injection/Attribute/When.php!=be8vendor/symfony/dependency-injection/Attribute/Target.php!=b41mvendor/symfony/flex/LICENSE)!=b)p&vendor/symfony/flex/src/Downloader.phpF4!=bF4 6פ*vendor/symfony/flex/src/CurlDownloader.php!=bQ"vendor/symfony/flex/src/Recipe.php!=b@y vendor/symfony/flex/src/Flex.php{!=b{(*vendor/symfony/flex/src/ScriptExecutor.php!=b<)vendor/symfony/flex/src/SymfonyBundle.php; !=b; ;JS.vendor/symfony/flex/src/ParallelDownloader.phpq!=bqɤ+vendor/symfony/flex/src/PackageResolver.phpU!=bU$5/vendor/symfony/flex/src/Update/RecipeUpdate.php6!=b60vendor/symfony/flex/src/Update/RecipePatcher.php!=b~4.vendor/symfony/flex/src/Update/RecipePatch.php!=be S-vendor/symfony/flex/src/Update/DiffHelper.phpq!=bq:3vendor/symfony/flex/src/PackageJsonSynchronizer.php!=b>u-vendor/symfony/flex/src/Event/UpdateEvent.php!=b$c)vendor/symfony/flex/src/PackageFilter.phpJ!=bJԽ2vendor/symfony/flex/src/Command/RecipesCommand.phpZ!=bZ21vendor/symfony/flex/src/Command/UnpackCommand.php] !=b] /1vendor/symfony/flex/src/Command/RemoveCommand.php!=bu9vendor/symfony/flex/src/Command/InstallRecipesCommand.php!=b) 2vendor/symfony/flex/src/Command/DumpEnvCommand.php;!=b;g25vendor/symfony/flex/src/Command/GenerateIdCommand.php~!=b~MwC1vendor/symfony/flex/src/Command/UpdateCommand.php?!=b?X8vendor/symfony/flex/src/Command/UpdateRecipesCommand.php-!=b-GБ2vendor/symfony/flex/src/Command/RequireCommand.php !=b 1v$vendor/symfony/flex/src/Unpacker.php!=bY;$vendor/symfony/flex/src/Response.php!=bSt7vendor/symfony/flex/src/TruncatedComposerRepository.php!=bxf̤%vendor/symfony/flex/src/GithubApi.php !=b ҵ0vendor/symfony/flex/src/InformationOperation.php!=bb!vendor/symfony/flex/src/Cache.php!=b vendor/symfony/flex/src/Lock.php!=bQ7#vendor/symfony/flex/src/Options.php!=b+J e)vendor/symfony/flex/src/Unpack/Result.phpQ!=bQdJ1,vendor/symfony/flex/src/Unpack/Operation.php=!=b=8[?vendor/symfony/flex/src/Configurator/DockerfileConfigurator.php !=b Dvendor/symfony/flex/src/Configurator/CopyFromPackageConfigurator.php!=bʁv`8vendor/symfony/flex/src/Configurator/EnvConfigurator.php!=bv Cvendor/symfony/flex/src/Configurator/CopyFromRecipeConfigurator.php!=b>vendor/symfony/flex/src/Configurator/GitignoreConfigurator.php !=b Yr=vendor/symfony/flex/src/Configurator/AbstractConfigurator.php !=b -=vendor/symfony/flex/src/Configurator/MakefileConfigurator.php- !=b- Cv>vendor/symfony/flex/src/Configurator/ContainerConfigurator.php !=b (#Bvendor/symfony/flex/src/Configurator/DockerComposeConfigurator.php$!=b$0Dvendor/symfony/flex/src/Configurator/ComposerScriptsConfigurator.php*!=b*]<vendor/symfony/flex/src/Configurator/BundlesConfigurator.php !=b ߢ(vendor/symfony/flex/src/Configurator.php{ !=b{ .vendor/symfony/flex/src/ComposerRepository.php!=b̍r vendor/symfony/flex/src/Path.phpr!=briڤ#vendor/symfony/var-exporter/LICENSE)!=b)5古1vendor/symfony/var-exporter/Internal/Registry.php!=bJNZ1vendor/symfony/var-exporter/Internal/Exporter.php/)!=b/) T2vendor/symfony/var-exporter/Internal/Reference.php!=b]/vendor/symfony/var-exporter/Internal/Values.php!=b2Ҥ1vendor/symfony/var-exporter/Internal/Hydrator.php !=b ,vendor/symfony/var-exporter/Instantiator.php^!=b^D(h@vendor/symfony/var-exporter/Exception/ClassNotFoundException.php/!=b/oFvendor/symfony/var-exporter/Exception/NotInstantiableTypeException.php<!=b<8PҤ<vendor/symfony/var-exporter/Exception/ExceptionInterface.phpx!=bx󄶤+vendor/symfony/var-exporter/VarExporter.php!=b+pԤ2vendor/symfony/config/ResourceCheckerInterface.php<!=b<, vendor/symfony/config/LICENSE)!=b)ax;vendor/symfony/config/ResourceCheckerConfigCacheFactory.php!=b_'<9vendor/symfony/config/Resource/ClassExistenceResource.phpN!=bN4vendor/symfony/config/Resource/ResourceInterface.php!=bj@vendor/symfony/config/Resource/SelfCheckingResourceInterface.php!=bdv:vendor/symfony/config/Resource/ReflectionClassResource.php!=bs /vendor/symfony/config/Resource/FileResource.php!=bBף>vendor/symfony/config/Resource/SelfCheckingResourceChecker.php!!=b!,S4vendor/symfony/config/Resource/DirectoryResource.phpy!=byߕX3vendor/symfony/config/Resource/ComposerResource.php!=bH֤/vendor/symfony/config/Resource/GlobResource.php!=b8vendor/symfony/config/Resource/FileExistenceResource.php#!=b#n'vendor/symfony/config/Loader/Loader.php!=b Sc1vendor/symfony/config/Loader/DelegatingLoader.phpw!=bw\T+vendor/symfony/config/Loader/FileLoader.php!=b}+2vendor/symfony/config/Loader/ParamConfigurator.php!=b#/vendor/symfony/config/Loader/LoaderResolver.phps!=bs4Ť0vendor/symfony/config/Loader/LoaderInterface.phpI!=bIy//vendor/symfony/config/Loader/GlobFileLoader.php$!=b$T8vendor/symfony/config/Loader/LoaderResolverInterface.php!=b>n%vendor/symfony/config/ConfigCache.php?!=b?(-{Nvendor/symfony/config/Exception/FileLoaderImportCircularReferenceException.phpe!=be@0Dvendor/symfony/config/Exception/FileLocatorFileNotFoundException.php!=bW7vendor/symfony/config/Exception/LoaderLoadException.php!=b2r'.vendor/symfony/config/ConfigCacheInterface.php$!=b$:].vendor/symfony/config/Builder/ClassBuilder.php !=b gʟ8vendor/symfony/config/Builder/ConfigBuilderInterface.php!=bvݤ8vendor/symfony/config/Builder/ConfigBuilderGenerator.phpO.!=bO.MacF*vendor/symfony/config/Builder/Property.php!=bUߊ(vendor/symfony/config/Builder/Method.php!=b ̤Avendor/symfony/config/Builder/ConfigBuilderGeneratorInterface.php!=bC{5vendor/symfony/config/ConfigCacheFactoryInterface.php!=bդ.vendor/symfony/config/FileLocatorInterface.php!=b\\%vendor/symfony/config/FileLocator.php!=b7=,vendor/symfony/config/ConfigCacheFactory.php!=baM8vendor/symfony/config/Definition/PrototypedArrayNode.phpX!=bX.vendor/symfony/config/Definition/ArrayNode.php!=bfդ2vendor/symfony/config/Definition/NodeInterface.php!=b`1vendor/symfony/config/Definition/VariableNode.php!=b9v-vendor/symfony/config/Definition/EnumNode.php\!=b\˪. >vendor/symfony/config/Definition/Dumper/XmlReferenceDumper.phpk!=bkm?vendor/symfony/config/Definition/Dumper/YamlReferenceDumper.php!=b/vendor/symfony/config/Definition/ScalarNode.php!=b]ۤ;vendor/symfony/config/Definition/PrototypeNodeInterface.php!=bUa0vendor/symfony/config/Definition/BooleanNode.php!=bZ-vendor/symfony/config/Definition/BaseNode.phpM$!=bM$ռLvendor/symfony/config/Definition/Exception/InvalidConfigurationException.php!=bz6zIvendor/symfony/config/Definition/Exception/InvalidDefinitionException.php!=b1@vendor/symfony/config/Definition/Exception/UnsetKeyException.php~!=b~_8vendor/symfony/config/Definition/Exception/Exception.php}!=b}Cvendor/symfony/config/Definition/Exception/InvalidTypeException.php!=bJvendor/symfony/config/Definition/Exception/ForbiddenOverwriteException.php!=bۙZDvendor/symfony/config/Definition/Exception/DuplicateKeyException.php!=ba0vendor/symfony/config/Definition/NumericNode.php!=bs,ڥ;vendor/symfony/config/Definition/ConfigurationInterface.php!=b[hBvendor/symfony/config/Definition/Builder/NumericNodeDefinition.php!=b1y>vendor/symfony/config/Definition/Builder/ValidationBuilder.php!=bN֤Avendor/symfony/config/Definition/Builder/NormalizationBuilder.phpK!=bK˥U9vendor/symfony/config/Definition/Builder/MergeBuilder.php!=bJvendor/symfony/config/Definition/Builder/ParentNodeDefinitionInterface.php'!=b'MCvendor/symfony/config/Definition/Builder/VariableNodeDefinition.php!=b7H@vendor/symfony/config/Definition/Builder/NodeParentInterface.phpo!=bo vrBvendor/symfony/config/Definition/Builder/BooleanNodeDefinition.php!=b`-Avendor/symfony/config/Definition/Builder/ScalarNodeDefinition.php7!=b7f8vendor/symfony/config/Definition/Builder/TreeBuilder.php!=b18vendor/symfony/config/Definition/Builder/NodeBuilder.php!=bRq@vendor/symfony/config/Definition/Builder/ArrayNodeDefinition.php3"!=b3"դzBvendor/symfony/config/Definition/Builder/IntegerNodeDefinition.phpQ!=bQ_ դ8vendor/symfony/config/Definition/Builder/ExprBuilder.php@ !=b@ +s)@vendor/symfony/config/Definition/Builder/FloatNodeDefinition.phpK!=bK?vendor/symfony/config/Definition/Builder/EnumNodeDefinition.php!=b TM;vendor/symfony/config/Definition/Builder/NodeDefinition.php!=bBvendor/symfony/config/Definition/Builder/BuilderAwareInterface.php!=b9驤0vendor/symfony/config/Definition/IntegerNode.phpA!=bAT.vendor/symfony/config/Definition/FloatNode.phpz!=bzi i.vendor/symfony/config/Definition/Processor.php!=b3q<vendor/symfony/config/Util/Exception/InvalidXmlException.php!=bW<vendor/symfony/config/Util/Exception/XmlParsingException.php!=b;NN-'vendor/symfony/config/Util/XmlUtils.php!=bf94vendor/symfony/config/ResourceCheckerConfigCache.php; !=b; YNޤ%vendor/symfony/monolog-bundle/LICENSE)!=b)Ǥ:vendor/symfony/monolog-bundle/Resources/config/monolog.xmlM !=bM 7Evendor/symfony/monolog-bundle/Resources/config/schema/monolog-1.0.xsd&!=b&̤Fvendor/symfony/monolog-bundle/DependencyInjection/MonologExtension.phpn!=bnhCvendor/symfony/monolog-bundle/DependencyInjection/Configuration.php[!=b[  Zvendor/symfony/monolog-bundle/DependencyInjection/Compiler/AddSwiftMailerTransportPass.php!=bVOvendor/symfony/monolog-bundle/DependencyInjection/Compiler/DebugHandlerPass.php!=bH,LPvendor/symfony/monolog-bundle/DependencyInjection/Compiler/AddProcessorsPass.phpW!=bWPPvendor/symfony/monolog-bundle/DependencyInjection/Compiler/LoggerChannelPass.php!=b/Qvendor/symfony/monolog-bundle/DependencyInjection/Compiler/FixEmptyLoggerPass.php!=be/vendor/symfony/monolog-bundle/MonologBundle.php!=bt<vendor/symfony/monolog-bundle/SwiftMailer/MessageFactory.php!=byפ"vendor/symfony/http-kernel/LICENSE)!=b)ax(vendor/symfony/http-kernel/UriSigner.php!=bQAvendor/symfony/http-kernel/CacheClearer/CacheClearerInterface.php!=b<vendor/symfony/http-kernel/CacheClearer/Psr6CacheClearer.phpV!=bV=:ߤ=vendor/symfony/http-kernel/CacheClearer/ChainCacheClearer.phpm!=bm=vendor/symfony/http-kernel/Debug/TraceableEventDispatcher.php)!=b)&*6vendor/symfony/http-kernel/Debug/FileLinkFormatter.php !=b -ڤ5vendor/symfony/http-kernel/Resources/welcome.html.php~!=b~Evendor/symfony/http-kernel/Controller/ContainerControllerResolver.phpv!=bvXtCvendor/symfony/http-kernel/Controller/TraceableArgumentResolver.php!=b ?drCvendor/symfony/http-kernel/Controller/ArgumentResolverInterface.php!=bv+9vendor/symfony/http-kernel/Controller/ErrorController.php!=bF$FEvendor/symfony/http-kernel/Controller/ControllerResolverInterface.php!=b"=vendor/symfony/http-kernel/Controller/ControllerReference.php!=b(Evendor/symfony/http-kernel/Controller/TraceableControllerResolver.phpm!=bmi:vendor/symfony/http-kernel/Controller/ArgumentResolver.phpK !=bK .͇<vendor/symfony/http-kernel/Controller/ControllerResolver.php!=b.Qvendor/symfony/http-kernel/Controller/ArgumentResolver/TraceableValueResolver.php!=bWqOvendor/symfony/http-kernel/Controller/ArgumentResolver/ServiceValueResolver.php!=b)Ovendor/symfony/http-kernel/Controller/ArgumentResolver/SessionValueResolver.php^!=b^\_Xvendor/symfony/http-kernel/Controller/ArgumentResolver/RequestAttributeValueResolver.php!=b=Ovendor/symfony/http-kernel/Controller/ArgumentResolver/RequestValueResolver.php!=biPvendor/symfony/http-kernel/Controller/ArgumentResolver/VariadicValueResolver.php!=bFQ|ͤOvendor/symfony/http-kernel/Controller/ArgumentResolver/DefaultValueResolver.php!=b_][vendor/symfony/http-kernel/Controller/ArgumentResolver/NotTaggedControllerValueResolver.php!=b݈Hvendor/symfony/http-kernel/Controller/ArgumentValueResolverInterface.php!=bN:)vendor/symfony/http-kernel/HttpKernel.php!=b*h?Dvendor/symfony/http-kernel/EventListener/AbstractSessionListener.php!=bvendor/symfony/http-kernel/EventListener/SurrogateListener.phpd!=bdP\ߤ@vendor/symfony/http-kernel/EventListener/LocaleAwareListener.phpx!=bx $aFvendor/symfony/http-kernel/EventListener/AddRequestFormatsListener.php!=bE:vendor/symfony/http-kernel/EventListener/ErrorListener.phpD!=bDBvendor/symfony/http-kernel/EventListener/DebugHandlersListener.php!=b٤;vendor/symfony/http-kernel/EventListener/RouterListener.php!=bX<vendor/symfony/http-kernel/CacheWarmer/WarmableInterface.php!=b^?vendor/symfony/http-kernel/CacheWarmer/CacheWarmerAggregate.php !=b ζ(ݤ6vendor/symfony/http-kernel/CacheWarmer/CacheWarmer.php!=bP!?vendor/symfony/http-kernel/CacheWarmer/CacheWarmerInterface.php!=bM#%vendor/symfony/http-kernel/Kernel.phpjN!=bjNy4vendor/symfony/http-kernel/Event/ControllerEvent.phpt!=bt51vendor/symfony/http-kernel/Event/RequestEvent.php!=b)A7vendor/symfony/http-kernel/Event/FinishRequestEvent.php{!=b{d3vendor/symfony/http-kernel/Event/TerminateEvent.php3!=b3O=vendor/symfony/http-kernel/Event/ControllerArgumentsEvent.phpR!=bRtf.vendor/symfony/http-kernel/Event/ViewEvent.php!=b43vendor/symfony/http-kernel/Event/ExceptionEvent.phpW!=bWAҤ0vendor/symfony/http-kernel/Event/KernelEvent.php!=b@ju2vendor/symfony/http-kernel/Event/ResponseEvent.php!=bmq0vendor/symfony/http-kernel/HttpKernelBrowser.php !=b |)vendor/symfony/http-kernel/Log/Logger.php !=b WH7vendor/symfony/http-kernel/Log/DebugLoggerInterface.php(!=b(.vendor/symfony/http-kernel/KernelInterface.php!=b2vendor/symfony/http-kernel/RebootableInterface.php!=bFOIvendor/symfony/http-kernel/ControllerMetadata/ArgumentMetadataFactory.php!=bvLBvendor/symfony/http-kernel/ControllerMetadata/ArgumentMetadata.php !=b WRvendor/symfony/http-kernel/ControllerMetadata/ArgumentMetadataFactoryInterface.php!=bߤ/vendor/symfony/http-kernel/HttpClientKernel.php !=b #1vendor/symfony/http-kernel/Config/FileLocator.phpz!=bz}r@vendor/symfony/http-kernel/Exception/BadRequestHttpException.php!=biΏ:vendor/symfony/http-kernel/Exception/GoneHttpException.php!=b`85Qvendor/symfony/http-kernel/Exception/ControllerDoesNotReturnResponseException.php!=b}T8`Fvendor/symfony/http-kernel/Exception/MethodNotAllowedHttpException.php!=b*|Hvendor/symfony/http-kernel/Exception/PreconditionFailedHttpException.php!=bWNJ?vendor/symfony/http-kernel/Exception/HttpExceptionInterface.php!=bP Bvendor/symfony/http-kernel/Exception/AccessDeniedHttpException.php!=bLh؁Evendor/symfony/http-kernel/Exception/TooManyRequestsHttpException.php!=bGJvendor/symfony/http-kernel/Exception/UnsupportedMediaTypeHttpException.php!=b_66vendor/symfony/http-kernel/Exception/HttpException.php!=b>vendor/symfony/http-kernel/Exception/ConflictHttpException.php!=b{9jBvendor/symfony/http-kernel/Exception/UnauthorizedHttpException.php!=bIO[Hvendor/symfony/http-kernel/Exception/UnexpectedSessionUsageException.php!=bBȟ Cvendor/symfony/http-kernel/Exception/NotAcceptableHttpException.php!=b-cDvendor/symfony/http-kernel/Exception/LengthRequiredHttpException.php!=ba@Jvendor/symfony/http-kernel/Exception/PreconditionRequiredHttpException.php!=bHHvendor/symfony/http-kernel/Exception/ServiceUnavailableHttpException.php!=bhF>vendor/symfony/http-kernel/Exception/NotFoundHttpException.php!=bB걤Ivendor/symfony/http-kernel/Exception/UnprocessableEntityHttpException.php!=b}hAvendor/symfony/http-kernel/Exception/InvalidMetadataException.php~!=b~vendor/symfony/http-kernel/DataCollector/TimeDataCollector.php!=b>vendor/symfony/http-kernel/DataCollector/AjaxDataCollector.php!=bAvendor/symfony/http-kernel/DataCollector/RequestDataCollector.phpR,!=bR,^>&@vendor/symfony/http-kernel/DataCollector/LoggerDataCollector.php!=bV:vendor/symfony/http-kernel/DataCollector/DataCollector.php%!=b%kfGvendor/symfony/http-kernel/DataCollector/LateDataCollectorInterface.php!=b @vendor/symfony/http-kernel/DataCollector/MemoryDataCollector.php!=b1?vendor/symfony/http-kernel/DataCollector/EventDataCollector.php!=bt>vendor/symfony/http-kernel/DataCollector/DumpDataCollector.php!=b@vendor/symfony/http-kernel/DataCollector/RouterDataCollector.php!=bRRvendor/symfony/http-kernel/DependencyInjection/MergeExtensionConfigurationPass.php!=bNФ\vendor/symfony/http-kernel/DependencyInjection/RemoveEmptyControllerArgumentLocatorsPass.php1!=b1yڤMvendor/symfony/http-kernel/DependencyInjection/LazyLoadingFragmentHandler.phpQ!=bQI֤Vvendor/symfony/http-kernel/DependencyInjection/ControllerArgumentValueResolverPass.php!=b2Yvendor/symfony/http-kernel/DependencyInjection/RegisterControllerArgumentLocatorsPass.php!=b*BgHvendor/symfony/http-kernel/DependencyInjection/ConfigurableExtension.php!=b92Rvendor/symfony/http-kernel/DependencyInjection/RegisterLocaleAwareServicesPass.php!=be<vendor/symfony/http-kernel/DependencyInjection/Extension.php!=beHvendor/symfony/http-kernel/DependencyInjection/ResettableServicePass.php!=bdGvendor/symfony/http-kernel/DependencyInjection/FragmentRendererPass.phpK!=bK.ؤCvendor/symfony/http-kernel/DependencyInjection/ServicesResetter.php!=bx=vendor/symfony/http-kernel/DependencyInjection/LoggerPass.phpO!=bOk_nQvendor/symfony/http-kernel/DependencyInjection/AddAnnotatedClassesToCachePass.php !=b /@vendor/symfony/http-kernel/Fragment/HIncludeFragmentRenderer.php!=b!DEvendor/symfony/http-kernel/Fragment/FragmentUriGeneratorInterface.php!=b@vendor/symfony/http-kernel/Fragment/RoutableFragmentRenderer.php!=b[;vendor/symfony/http-kernel/Fragment/EsiFragmentRenderer.php!=bI@>vendor/symfony/http-kernel/Fragment/InlineFragmentRenderer.php !=b 򠀆<vendor/symfony/http-kernel/Fragment/FragmentUriGenerator.phpE !=bE 8ʤ;vendor/symfony/http-kernel/Fragment/SsiFragmentRenderer.php!=bU2Ivendor/symfony/http-kernel/Fragment/AbstractSurrogateFragmentRenderer.php(!=b(T7vendor/symfony/http-kernel/Fragment/FragmentHandler.php7!=b7ZjAvendor/symfony/http-kernel/Fragment/FragmentRendererInterface.php{!=b{yf+vendor/symfony/http-kernel/KernelEvents.phph!=bhq:vendor/symfony/http-kernel/HttpCache/AbstractSurrogate.php_ !=b_ ;T,vendor/symfony/http-kernel/HttpCache/Esi.php !=b ?_:vendor/symfony/http-kernel/HttpCache/SubRequestHandler.phpI !=bI 7vendor/symfony/http-kernel/HttpCache/StoreInterface.phpF!=bFR >vendor/symfony/http-kernel/HttpCache/ResponseCacheStrategy.php6!=b6)äGvendor/symfony/http-kernel/HttpCache/ResponseCacheStrategyInterface.php!=b.vendor/symfony/http-kernel/HttpCache/Store.php!=b 2vendor/symfony/http-kernel/HttpCache/HttpCache.php,!=b,Z:;vendor/symfony/http-kernel/HttpCache/SurrogateInterface.php)!=b)j%o,vendor/symfony/http-kernel/HttpCache/Ssi.php5!=b5C00vendor/symfony/http-kernel/Profiler/Profiler.php!=bcv@vendor/symfony/http-kernel/Profiler/ProfilerStorageInterface.php|!=b| ;vendor/symfony/http-kernel/Profiler/FileProfilerStorage.php+!=b+O/vendor/symfony/http-kernel/Profiler/Profile.php^ !=b^ 'Np2vendor/symfony/http-kernel/HttpKernelInterface.php!=b 5vendor/symfony/http-kernel/Bundle/BundleInterface.phpY!=bY!,vendor/symfony/http-kernel/Bundle/Bundle.phpx !=bx &O.2vendor/symfony/http-kernel/TerminableInterface.php!=b!Ҥ5vendor/symfony/http-kernel/Attribute/AsController.php!=bP_:vendor/symfony/http-kernel/Attribute/ArgumentInterface.php!=ḃvendor/symfony/finder/LICENSE)!=b)ax vendor/symfony/finder/Finder.php'!=b'A5vendor/symfony/finder/Comparator/NumberComparator.php!=bP3vendor/symfony/finder/Comparator/DateComparator.php!=b%e/vendor/symfony/finder/Comparator/Comparator.php3!=b3h%vendor/symfony/finder/SplFileInfo.php!=by#vendor/symfony/finder/Gitignore.php!=b=A֤:vendor/symfony/finder/Iterator/DateRangeFilterIterator.php!=b';vendor/symfony/finder/Iterator/DepthRangeFilterIterator.php!=bgg7vendor/symfony/finder/Iterator/CustomFilterIterator.phpY!=bYNu9vendor/symfony/finder/Iterator/FilenameFilterIterator.php!=b{:vendor/symfony/finder/Iterator/SizeRangeFilterIterator.phpr!=br7sˤAvendor/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php!=bD=vendor/symfony/finder/Iterator/MultiplePcreFilterIterator.php>!=b>Fդ=vendor/symfony/finder/Iterator/RecursiveDirectoryIterator.phpa !=ba ~M/vendor/symfony/finder/Iterator/LazyIterator.phpQ!=bQn]<vendor/symfony/finder/Iterator/FilecontentFilterIterator.phpT!=bT ͆Z5vendor/symfony/finder/Iterator/PathFilterIterator.php!=boդ;vendor/symfony/finder/Iterator/VcsIgnoredFilterIterator.phpy !=by 2 դ9vendor/symfony/finder/Iterator/FileTypeFilterIterator.php~!=b~Y3vendor/symfony/finder/Iterator/SortableIterator.php! !=b! *9vendor/symfony/finder/Exception/AccessDeniedException.php!=bs>vendor/symfony/finder/Exception/DirectoryNotFoundException.php!=ba)vendor/symfony/finder/Glob.php!=bx b5vendor/symfony/polyfill-intl-grapheme/bootstrap80.phpY !=bY !-vendor/symfony/polyfill-intl-grapheme/LICENSE)!=b)\2vendor/symfony/polyfill-intl-grapheme/Grapheme.php!=ba3vendor/symfony/polyfill-intl-grapheme/bootstrap.php!=b9|%vendor/symfony/polyfill-php80/LICENSE$!=b$LO! :vendor/symfony/polyfill-php80/Resources/stubs/PhpToken.php!=b}GG<vendor/symfony/polyfill-php80/Resources/stubs/Stringable.phpb!=bbћ<;vendor/symfony/polyfill-php80/Resources/stubs/Attribute.php!=bpNEvendor/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.phpT!=bTO<vendor/symfony/polyfill-php80/Resources/stubs/ValueError.phpK!=bK'vendor/symfony/polyfill-php80/Php80.php !=b Q[R*vendor/symfony/polyfill-php80/PhpToken.php!=bMI+vendor/symfony/polyfill-php80/bootstrap.php!=b3vendor/symfony/http-foundation/AcceptHeaderItem.php!=bQ[&vendor/symfony/http-foundation/LICENSE)!=b)ax)vendor/symfony/http-foundation/Cookie.php!=bFp.vendor/symfony/http-foundation/File/Stream.php!=bۖzGvendor/symfony/http-foundation/File/Exception/NoTmpDirFileException.php!=b•?vendor/symfony/http-foundation/File/Exception/FileException.php!=b!Gvendor/symfony/http-foundation/File/Exception/AccessDeniedException.php!=bt;Ivendor/symfony/http-foundation/File/Exception/UnexpectedTypeException.php1!=b1XT Gvendor/symfony/http-foundation/File/Exception/FormSizeFileException.php!=bE Hvendor/symfony/http-foundation/File/Exception/ExtensionFileException.php!=b޾ϤGvendor/symfony/http-foundation/File/Exception/FileNotFoundException.php!=be҇kAvendor/symfony/http-foundation/File/Exception/UploadException.php!=bTJvendor/symfony/http-foundation/File/Exception/CannotWriteFileException.php!=biFvendor/symfony/http-foundation/File/Exception/IniSizeFileException.php!=b@cäAvendor/symfony/http-foundation/File/Exception/NoFileException.php!=bFvendor/symfony/http-foundation/File/Exception/PartialFileException.php!=bb,vendor/symfony/http-foundation/File/File.phpD !=bD 1vQ@4vendor/symfony/http-foundation/File/UploadedFile.php!=beŤ3vendor/symfony/http-foundation/StreamedResponse.php!=b3,vendor/symfony/http-foundation/ServerBag.phpJ!=bJpYIvendor/symfony/http-foundation/RateLimiter/AbstractRequestRateLimiter.php!=bXJvendor/symfony/http-foundation/RateLimiter/RequestRateLimiterInterface.php=!=b=+x`/vendor/symfony/http-foundation/ParameterBag.phpF !=bF Ky/vendor/symfony/http-foundation/RequestStack.php!=b23vendor/symfony/http-foundation/RedirectResponse.php!=bsդ;vendor/symfony/http-foundation/ExpressionRequestMatcher.phpN!=bNN/vendor/symfony/http-foundation/JsonResponse.php !=b }ҔIvendor/symfony/http-foundation/Exception/SuspiciousOperationException.php!=b;3Hvendor/symfony/http-foundation/Exception/ConflictingHeadersException.php!=bf פ:vendor/symfony/http-foundation/Exception/JsonException.php!=bǕEvendor/symfony/http-foundation/Exception/SessionNotFoundException.phpi!=bid.Fvendor/symfony/http-foundation/Exception/RequestExceptionInterface.phpt!=bt(@vendor/symfony/http-foundation/Exception/BadRequestException.php!=bb/vendor/symfony/http-foundation/AcceptHeader.php!=bz+vendor/symfony/http-foundation/Response.phpCK!=bCK\:vendor/symfony/http-foundation/RequestMatcherInterface.php!=bl,vendor/symfony/http-foundation/UrlHelper.php!=b|1vendor/symfony/http-foundation/RequestMatcher.php !=b ,UBvendor/symfony/http-foundation/Session/Flash/FlashBagInterface.phpi!=bio\9vendor/symfony/http-foundation/Session/Flash/FlashBag.php!=b#\&Cvendor/symfony/http-foundation/Session/Flash/AutoExpireFlashBag.php!=b_2vendor/symfony/http-foundation/Session/Session.php!=bBvendor/symfony/http-foundation/Session/SessionFactoryInterface.php!=b/A 9vendor/symfony/http-foundation/Session/SessionFactory.php1!=b1**:vendor/symfony/http-foundation/Session/SessionBagProxy.phpB!=bBPmG>vendor/symfony/http-foundation/Session/SessionBagInterface.php!=bg7vendor/symfony/http-foundation/Session/SessionUtils.php=!=b=CKJvendor/symfony/http-foundation/Session/Storage/PhpBridgeSessionStorage.php!=b Qvendor/symfony/http-foundation/Session/Storage/SessionStorageFactoryInterface.php!=bggRvendor/symfony/http-foundation/Session/Storage/Handler/MigratingSessionHandler.php!=bÞSvendor/symfony/http-foundation/Session/Storage/Handler/NativeFileSessionHandler.php'!=b'ۤPvendor/symfony/http-foundation/Session/Storage/Handler/MongoDbSessionHandler.php !=b DgMvendor/symfony/http-foundation/Session/Storage/Handler/NullSessionHandler.phpW!=bW?>Pvendor/symfony/http-foundation/Session/Storage/Handler/SessionHandlerFactory.php !=b ﶔyOvendor/symfony/http-foundation/Session/Storage/Handler/StrictSessionHandler.php!=b+voMvendor/symfony/http-foundation/Session/Storage/Handler/IdentityMarshaller.php !=b :9ϤTvendor/symfony/http-foundation/Session/Storage/Handler/MarshallingSessionHandler.phpf!=bfHNvendor/symfony/http-foundation/Session/Storage/Handler/RedisSessionHandler.php#!=b#]3RRvendor/symfony/http-foundation/Session/Storage/Handler/MemcachedSessionHandler.php!=bxͬNQvendor/symfony/http-foundation/Session/Storage/Handler/AbstractSessionHandler.php\ !=b\ c;Lvendor/symfony/http-foundation/Session/Storage/Handler/PdoSessionHandler.phpQH!=bQHVNvendor/symfony/http-foundation/Session/Storage/NativeSessionStorageFactory.phpL!=bLg&Gvendor/symfony/http-foundation/Session/Storage/NativeSessionStorage.php!=bOLvendor/symfony/http-foundation/Session/Storage/Proxy/SessionHandlerProxy.php!=bJFvendor/symfony/http-foundation/Session/Storage/Proxy/AbstractProxy.php!=b'Pvendor/symfony/http-foundation/Session/Storage/MockFileSessionStorageFactory.php!=bb&Qvendor/symfony/http-foundation/Session/Storage/PhpBridgeSessionStorageFactory.php!=bսHvendor/symfony/http-foundation/Session/Storage/ServiceSessionFactory.php;!=b;<@>vendor/symfony/http-foundation/Session/Storage/MetadataBag.php!=bmJvendor/symfony/http-foundation/Session/Storage/MockArraySessionStorage.php !=b `zIvendor/symfony/http-foundation/Session/Storage/MockFileSessionStorage.phpR!=bRSi_Jvendor/symfony/http-foundation/Session/Storage/SessionStorageInterface.php!=bs;vendor/symfony/http-foundation/Session/SessionInterface.php!=b߁uQKvendor/symfony/http-foundation/Session/Attribute/NamespacedAttributeBag.php!=b <]Jvendor/symfony/http-foundation/Session/Attribute/AttributeBagInterface.php!=bǤAvendor/symfony/http-foundation/Session/Attribute/AttributeBag.phpg!=bgo^Ԥ+vendor/symfony/http-foundation/InputBag.php9 !=b9 S,vendor/symfony/http-foundation/HeaderBag.php!=b5*vendor/symfony/http-foundation/FileBag.php!=bT}*vendor/symfony/http-foundation/IpUtils.php!=bIP٤4vendor/symfony/http-foundation/ResponseHeaderBag.php!=b 3R.vendor/symfony/http-foundation/HeaderUtils.php!=b`R5vendor/symfony/http-foundation/BinaryFileResponse.phpb!=bb0*vendor/symfony/http-foundation/Request.php!=b"ä)vendor/symfony/polyfill-intl-idn/Info.php!=b[0vendor/symfony/polyfill-intl-idn/bootstrap80.php@!=b@6> (vendor/symfony/polyfill-intl-idn/LICENSEW!=bWnMvendor/symfony/polyfill-intl-idn/Resources/unidata/disallowed_STD3_mapped.php!=b;qf<vendor/symfony/polyfill-intl-idn/Resources/unidata/Regex.phṗ!=ḃ q]R=vendor/symfony/polyfill-intl-idn/Resources/unidata/mapped.php/f!=b/f-=vendor/symfony/polyfill-intl-idn/Resources/unidata/virama.php!=b/ɤ@vendor/symfony/polyfill-intl-idn/Resources/unidata/deviation.phpK!=bKë`ҤGvendor/symfony/polyfill-intl-idn/Resources/unidata/DisallowedRanges.php!=b8tLvendor/symfony/polyfill-intl-idn/Resources/unidata/disallowed_STD3_valid.php>!=b>NچG>vendor/symfony/polyfill-intl-idn/Resources/unidata/ignored.php!=bdAvendor/symfony/polyfill-intl-idn/Resources/unidata/disallowed.php8!=b8M:P(vendor/symfony/polyfill-intl-idn/Idn.phpB!=bB.vendor/symfony/polyfill-intl-idn/bootstrap.php[!=b[ΐ*,vendor/symfony/stopwatch/StopwatchPeriod.php!=bѳH vendor/symfony/stopwatch/LICENSE)!=b)ax&vendor/symfony/stopwatch/Stopwatch.php!=bf$vendor/symfony/stopwatch/Section.php!=b9E߽+vendor/symfony/stopwatch/StopwatchEvent.php !=b A-vendor/symfony/polyfill-ctype/bootstrap80.phph!=bhKy%vendor/symfony/polyfill-ctype/LICENSE)!=b)`e0+vendor/symfony/polyfill-ctype/bootstrap.php2!=b2a8'vendor/symfony/polyfill-ctype/Ctype.php !=b ~dvendor/league/pipeline/LICENSE9!=b9 I.vendor/league/pipeline/src/PipelineBuilder.php!=b7ڐ7vendor/league/pipeline/src/PipelineBuilderInterface.php!=b=0vendor/league/pipeline/src/PipelineInterface.php!=b}!֤5vendor/league/pipeline/src/InterruptibleProcessor.php!=b0dP1vendor/league/pipeline/src/ProcessorInterface.php!=b~6vendor/league/pipeline/src/FingersCrossedProcessor.php!=b'F-vendor/league/pipeline/src/StageInterface.php!=bcݤ'vendor/league/pipeline/src/Pipeline.php!=bOvendor/league/flysystem/LICENSE'!=b'r٤/vendor/league/flysystem/src/PluginInterface.php!=bO)vendor/league/flysystem/src/Directory.php!=bwZc;vendor/league/flysystem/src/FilesystemNotFoundException.php!=bi367vendor/league/flysystem/src/UnreadableFileException.php!=b?zɤ-vendor/league/flysystem/src/ReadInterface.php!=bv3vendor/league/flysystem/src/FilesystemInterface.php!=b'<ʾ5vendor/league/flysystem/src/CorruptedPathDetected.php!=bM#86vendor/league/flysystem/src/RootViolationException.php!=bZ15&vendor/league/flysystem/src/Config.php!=b:z5vendor/league/flysystem/src/NotSupportedException.php!=by8vendor/league/flysystem/src/ConnectionErrorException.php!=bB5*3vendor/league/flysystem/src/FilesystemException.phpF!=bF1vendor/league/flysystem/src/Plugin/ForcedCopy.php!=b5o0vendor/league/flysystem/src/Plugin/ListFiles.php!=b&z>vendor/league/flysystem/src/Plugin/PluginNotFoundException.phpz!=bz  5vendor/league/flysystem/src/Plugin/AbstractPlugin.php=!=b=gx5vendor/league/flysystem/src/Plugin/PluggableTrait.php!=bs;6vendor/league/flysystem/src/Plugin/GetWithMetadata.php!=bC3vendor/league/flysystem/src/Plugin/ForcedRename.php!=bX/vendor/league/flysystem/src/Plugin/ListWith.phpb!=bb.c/vendor/league/flysystem/src/Plugin/EmptyDir.php!=bYR0vendor/league/flysystem/src/Plugin/ListPaths.php}!=b}l%)vendor/league/flysystem/src/Exception.phpk!=bk5vendor/league/flysystem/src/FileNotFoundException.php!=b^,vendor/league/flysystem/src/MountManager.php!=bd $vendor/league/flysystem/src/File.php!=blvAz3vendor/league/flysystem/src/FileExistsException.php!=b ۤ'vendor/league/flysystem/src/Handler.php!=b4vendor/league/flysystem/src/InvalidRootException.php!=bO~$vendor/league/flysystem/src/Util.php!=bA<+vendor/league/flysystem/src/SafeStorage.php5!=b5U $0vendor/league/flysystem/src/ConfigAwareTrait.php!=b] *vendor/league/flysystem/src/Filesystem.php'!=b'&|:vendor/league/flysystem/src/ConnectionRuntimeException.php!=b؄1vendor/league/flysystem/src/Util/StreamHasher.phpN!=bNR)-vendor/league/flysystem/src/Util/MimeType.php!=b=nڤ<vendor/league/flysystem/src/Util/ContentListingFormatter.php!=b _33vendor/league/flysystem/src/Adapter/SynologyFtp.phpP!=bP13vendor/league/flysystem/src/Adapter/NullAdapter.php!=b%zy7vendor/league/flysystem/src/Adapter/AbstractAdapter.php!=ba-,vendor/league/flysystem/src/Adapter/Ftpd.phpu!=buQ?+vendor/league/flysystem/src/Adapter/Ftp.phpg$!=bg$e%,-vendor/league/flysystem/src/Adapter/Local.phpZ"!=bZ"c":vendor/league/flysystem/src/Adapter/AbstractFtpAdapter.php!=bͮsEvendor/league/flysystem/src/Adapter/Polyfill/StreamedWritingTrait.php)!=b)x¤Mvendor/league/flysystem/src/Adapter/Polyfill/NotSupportingVisibilityTrait.php!=bФBvendor/league/flysystem/src/Adapter/Polyfill/StreamedCopyTrait.phpa!=ba"S>vendor/league/flysystem/src/Adapter/Polyfill/StreamedTrait.php!=bb<Evendor/league/flysystem/src/Adapter/Polyfill/StreamedReadingTrait.php!=b#ä9vendor/league/flysystem/src/Adapter/CanOverwriteFiles.phpQ!=bQpeC0vendor/league/flysystem/src/AdapterInterface.php !=b .x)vendor/league/tactician-container/LICENSE!=b6:vendor/league/tactician-container/src/ContainerLocator.phpM!=bMXgIKvendor/league/tactician-bundle/src/Handler/ContainerBasedHandlerLocator.php!=b& Ivendor/league/tactician-bundle/src/Resources/config/services/services.yml/!=b/_Hvendor/league/tactician-bundle/src/Security/Voter/HandleCommandVoter.php!=bT>ُ;vendor/league/tactician-bundle/src/Command/DebugCommand.php`!=b`MۤZvendor/league/tactician-bundle/src/DependencyInjection/HandlerMapping/ClassNameMapping.php!=bYvendor/league/tactician-bundle/src/DependencyInjection/HandlerMapping/TagBasedMapping.phpp!=bpIhԆYvendor/league/tactician-bundle/src/DependencyInjection/HandlerMapping/TypeHintMapping.php!=bĤQvendor/league/tactician-bundle/src/DependencyInjection/HandlerMapping/Routing.php!=b½(Xvendor/league/tactician-bundle/src/DependencyInjection/HandlerMapping/HandlerMapping.php!=b6:Zvendor/league/tactician-bundle/src/DependencyInjection/HandlerMapping/CompositeMapping.php!=b,iHNvendor/league/tactician-bundle/src/DependencyInjection/InvalidCommandBusId.phpN!=bNncMvendor/league/tactician-bundle/src/DependencyInjection/TacticianExtension.php !=b |Hvendor/league/tactician-bundle/src/DependencyInjection/Configuration.php !=b sZvendor/league/tactician-bundle/src/DependencyInjection/Compiler/DoctrineMiddlewarePass.php!=bWv[vendor/league/tactician-bundle/src/DependencyInjection/Compiler/ValidatorMiddlewarePass.php!=bʤZvendor/league/tactician-bundle/src/DependencyInjection/Compiler/SecurityMiddlewarePass.php!=b3* )Zvendor/league/tactician-bundle/src/DependencyInjection/Compiler/BusBuilder/BusBuilders.php!=bݤdvendor/league/tactician-bundle/src/DependencyInjection/Compiler/BusBuilder/BusBuildersFromConfig.php!=b3UYvendor/league/tactician-bundle/src/DependencyInjection/Compiler/BusBuilder/BusBuilder.phpQ !=bQ ]Vvendor/league/tactician-bundle/src/DependencyInjection/Compiler/CommandHandlerPass.php5!=b5\_Qvendor/league/tactician-bundle/src/DependencyInjection/DuplicatedCommandBusId.php&!=b&lɤ6vendor/league/tactician-bundle/src/TacticianBundle.php!=b1Dvendor/league/tactician-bundle/src/Middleware/SecurityMiddleware.php!=brUFIvendor/league/tactician-bundle/src/Middleware/InvalidCommandException.php!=bٖƤEvendor/league/tactician-bundle/src/Middleware/ValidatorMiddleware.phpR!=bRM*)vendor/league/mime-type-detection/LICENSE'!=b'3ǫ'Ivendor/league/mime-type-detection/src/GeneratedExtensionToMimeTypeMap.phpe!=be:vendor/league/mime-type-detection/src/MimeTypeDetector.phpp!=bp@vendor/league/mime-type-detection/src/ExtensionToMimeTypeMap.php!=b`uW?vendor/league/mime-type-detection/src/FinfoMimeTypeDetector.phpb!=bbjC֤Jvendor/league/mime-type-detection/src/OverridingExtensionToMimeTypeMap.php!=b Cvendor/league/mime-type-detection/src/ExtensionMimeTypeDetector.phpD!=bDujEvendor/league/mime-type-detection/src/EmptyExtensionToMimeTypeMap.php!=bi| vendor/league/commonmark/LICENSEs!=bs4vendor/league/commonmark/src/Delimiter/Delimiter.php!=bZ)9vendor/league/commonmark/src/Delimiter/DelimiterStack.php!=b-Ť=vendor/league/commonmark/src/Delimiter/DelimiterInterface.php,!=b,lVQvendor/league/commonmark/src/Delimiter/Processor/DelimiterProcessorCollection.php?!=b?O.KPvendor/league/commonmark/src/Delimiter/Processor/DelimiterProcessorInterface.php!=b; Zvendor/league/commonmark/src/Delimiter/Processor/DelimiterProcessorCollectionInterface.php!=b-SPvendor/league/commonmark/src/Delimiter/Processor/StaggeredDelimiterProcessor.phpl!=blm:vendor/league/commonmark/src/Delimiter/DelimiterParser.php !=b Ѝ;vendor/league/commonmark/src/MarkdownConverterInterface.php!=b5}4vendor/league/commonmark/src/Reference/Reference.phpz!=bzz<Avendor/league/commonmark/src/Reference/ReferenceableInterface.php!=b;E@vendor/league/commonmark/src/Reference/ReferenceMapInterface.phpV!=bVv`7vendor/league/commonmark/src/Reference/ReferenceMap.php !=b &~U=vendor/league/commonmark/src/Reference/ReferenceInterface.php!=bQu:vendor/league/commonmark/src/Reference/ReferenceParser.php-!=b-*ʤ=vendor/league/commonmark/src/Event/DocumentPreParsedEvent.php!=bϿA3vendor/league/commonmark/src/Event/ListenerData.php!=bLB&<vendor/league/commonmark/src/Event/DocumentRenderedEvent.php!=bq=vendor/league/commonmark/src/Event/DocumentPreRenderEvent.php !=b u:vendor/league/commonmark/src/Event/DocumentParsedEvent.phpx!=bx¥\4vendor/league/commonmark/src/Event/AbstractEvent.php!=b 9Ӭ@vendor/league/commonmark/src/Output/RenderedContentInterface.php"!=b"7vendor/league/commonmark/src/Output/RenderedContent.phpk!=bkB`Hvendor/league/commonmark/src/Environment/EnvironmentBuilderInterface.php !=b 8vendor/league/commonmark/src/Environment/Environment.php)!=b)]=NFvendor/league/commonmark/src/Environment/EnvironmentAwareInterface.php!=bEo 'Avendor/league/commonmark/src/Environment/EnvironmentInterface.php!=b ڹg;vendor/league/commonmark/src/Extension/SmartPunct/Quote.php!=b{ڤAvendor/league/commonmark/src/Extension/SmartPunct/QuoteParser.php !=b LB}Svendor/league/commonmark/src/Extension/SmartPunct/ReplaceUnpairedQuotesListener.phpM!=bMOˤDvendor/league/commonmark/src/Extension/SmartPunct/QuoteProcessor.php!=bDvendor/league/commonmark/src/Extension/SmartPunct/EllipsesParser.php!=b8"ݤ@vendor/league/commonmark/src/Extension/SmartPunct/DashParser.phpw!=bw>%Ivendor/league/commonmark/src/Extension/SmartPunct/SmartPunctExtension.php!=b}bҤ]vendor/league/commonmark/src/Extension/Footnote/Event/FixOrphanedFootnotesAndRefsListener.php!=bIzQvendor/league/commonmark/src/Extension/Footnote/Event/GatherFootnotesListener.php!=bv$/Qvendor/league/commonmark/src/Extension/Footnote/Event/NumberFootnotesListener.php!=b|LTvendor/league/commonmark/src/Extension/Footnote/Event/AnonymousFootnotesListener.php!=b1&Mvendor/league/commonmark/src/Extension/Footnote/Renderer/FootnoteRenderer.php!=bB{ĤTvendor/league/commonmark/src/Extension/Footnote/Renderer/FootnoteBackrefRenderer.php!=bIVvendor/league/commonmark/src/Extension/Footnote/Renderer/FootnoteContainerRenderer.php!=buPvendor/league/commonmark/src/Extension/Footnote/Renderer/FootnoteRefRenderer.phpt!=btWJvendor/league/commonmark/src/Extension/Footnote/Node/FootnoteContainer.php!=brHdAvendor/league/commonmark/src/Extension/Footnote/Node/Footnote.phpL!=bLHvendor/league/commonmark/src/Extension/Footnote/Node/FootnoteBackref.phpY!=bYp'Dvendor/league/commonmark/src/Extension/Footnote/Node/FootnoteRef.php!=bɤLvendor/league/commonmark/src/Extension/Footnote/Parser/FootnoteRefParser.php !=b #Nvendor/league/commonmark/src/Extension/Footnote/Parser/FootnoteStartParser.php+!=b+6Ivendor/league/commonmark/src/Extension/Footnote/Parser/FootnoteParser.php!=b@XnUvendor/league/commonmark/src/Extension/Footnote/Parser/AnonymousFootnoteRefParser.php!=b!LEvendor/league/commonmark/src/Extension/Footnote/FootnoteExtension.php !=b U*Wvendor/league/commonmark/src/Extension/DefaultAttributes/DefaultAttributesExtension.phpt!=btb \vendor/league/commonmark/src/Extension/DefaultAttributes/ApplyDefaultAttributesProcessor.php!=bJTvendor/league/commonmark/src/Extension/HeadingPermalink/HeadingPermalinkRenderer.php!=b`Uvendor/league/commonmark/src/Extension/HeadingPermalink/HeadingPermalinkProcessor.php!=b5,ͤLvendor/league/commonmark/src/Extension/HeadingPermalink/HeadingPermalink.php!=bUvendor/league/commonmark/src/Extension/HeadingPermalink/HeadingPermalinkExtension.php!=bSvendor/league/commonmark/src/Extension/TableOfContents/TableOfContentsGenerator.php!=be Rvendor/league/commonmark/src/Extension/TableOfContents/TableOfContentsRenderer.php!=b|]vendor/league/commonmark/src/Extension/TableOfContents/TableOfContentsPlaceholderRenderer.php!=b$Qvendor/league/commonmark/src/Extension/TableOfContents/TableOfContentsBuilder.php !=b ~:[vendor/league/commonmark/src/Extension/TableOfContents/TableOfContentsPlaceholderParser.php<!=b<F\vendor/league/commonmark/src/Extension/TableOfContents/TableOfContentsGeneratorInterface.phpD!=bDo>\vendor/league/commonmark/src/Extension/TableOfContents/Normalizer/FlatNormalizerStrategy.php)!=b)ڲvendor/league/commonmark/src/Extension/Table/TableRenderer.php!=bz59vendor/league/commonmark/src/Extension/Table/TableRow.php!=bŵCդ6vendor/league/commonmark/src/Extension/Table/Table.php!=b]ˤEvendor/league/commonmark/src/Extension/Table/TableSectionRenderer.phpb!=bb?vendor/league/commonmark/src/Extension/Table/TableExtension.phpu!=bu*,MAvendor/league/commonmark/src/Extension/Table/TableStartParser.php7 !=b7 aAvendor/league/commonmark/src/Extension/Table/TableRowRenderer.php!=b<vendor/league/commonmark/src/Extension/Table/TableParser.php !=b y eFvendor/league/commonmark/src/Exception/UnexpectedEncodingException.php!=b52vendor/league/commonmark/src/MarkdownConverter.php!=b,o-~@vendor/league/commonmark/src/GithubFlavoredMarkdownConverter.php!=bL^Dvendor/league/commonmark/src/Renderer/ChildNodeRendererInterface.php4!=b4Mդ@vendor/league/commonmark/src/Renderer/Block/DocumentRenderer.phpd!=bd5pڤAvendor/league/commonmark/src/Renderer/Block/ParagraphRenderer.php!=b,I@vendor/league/commonmark/src/Renderer/Inline/NewlineRenderer.php!=bGO\=vendor/league/commonmark/src/Renderer/Inline/TextRenderer.php!=bƙ6vendor/league/commonmark/src/Renderer/HtmlRenderer.php!=bǁhCvendor/league/commonmark/src/Renderer/MarkdownRendererInterface.php0!=b0Q?vendor/league/commonmark/src/Renderer/NodeRendererInterface.php!=b F4vendor/league/commonmark/src/Input/MarkdownInput.php!=bNj'=vendor/league/commonmark/src/Input/MarkdownInputInterface.php!=bu|:vendor/league/commonmark/src/Normalizer/SlugNormalizer.php!=bC$Ivendor/league/commonmark/src/Normalizer/UniqueSlugNormalizerInterface.php@!=b@0 Cvendor/league/commonmark/src/Normalizer/TextNormalizerInterface.php!=b:vendor/league/commonmark/src/Normalizer/TextNormalizer.php!=bɞ@vendor/league/commonmark/src/Normalizer/UniqueSlugNormalizer.phpS!=bSC &=vendor/league/commonmark/src/Xml/XmlNodeRendererInterface.php!=b(5W0vendor/league/commonmark/src/Xml/XmlRenderer.php# !=b# 19,<vendor/league/commonmark/src/Xml/FallbackNodeXmlRenderer.php!=b-9vendor/league/commonmark/src/Node/Block/AbstractBlock.php5!=b5]F5vendor/league/commonmark/src/Node/Block/Paragraph.php!=bWqp?vendor/league/commonmark/src/Node/Block/TightBlockInterface.php!=bѺR4vendor/league/commonmark/src/Node/Block/Document.php!=b♥M?vendor/league/commonmark/src/Node/Inline/AdjacentTextMerger.php!=bbF4vendor/league/commonmark/src/Node/Inline/Newline.php!=b0.Z1vendor/league/commonmark/src/Node/Inline/Text.php!=bm*;vendor/league/commonmark/src/Node/Inline/AbstractInline.php!=bɴj?vendor/league/commonmark/src/Node/Inline/DelimitedInterface.php!=b= @Dvendor/league/commonmark/src/Node/Inline/AbstractStringContainer.phpC!=bC=Z;vendor/league/commonmark/src/Node/StringContainerHelper.phps!=bs׿C0vendor/league/commonmark/src/Node/NodeWalker.php!=bH92vendor/league/commonmark/src/Node/Query/OrExpr.php3!=b3z3vendor/league/commonmark/src/Node/Query/AndExpr.php6!=b6iz?vendor/league/commonmark/src/Node/Query/ExpressionInterface.php!=b` Avendor/league/commonmark/src/Node/RawMarkupContainerInterface.php!=b㕤+vendor/league/commonmark/src/Node/Query.php!=bs-n5vendor/league/commonmark/src/Node/NodeWalkerEvent.php!=b>vendor/league/commonmark/src/Node/StringContainerInterface.php!=b+2vendor/league/commonmark/src/Node/NodeIterator.php!=bGw*vendor/league/commonmark/src/Node/Node.phpS!=bS4vendor/league/commonmark/src/CommonMarkConverter.phpD!=bDtV?vendor/league/commonmark/src/Parser/MarkdownParserInterface.php!=b.vendor/league/commonmark/src/Parser/Cursor.php!=b2O;vendor/league/commonmark/src/Parser/Block/BlockContinue.phpL!=bLR1Gvendor/league/commonmark/src/Parser/Block/BlockStartParserInterface.phpK!=bKPvendor/league/commonmark/src/Parser/Block/SkipLinesStartingWithLettersParser.phpg!=bgy 8vendor/league/commonmark/src/Parser/Block/BlockStart.phpC!=bC=vendor/league/commonmark/src/Parser/Block/ParagraphParser.phpp!=bpФJvendor/league/commonmark/src/Parser/Block/BlockContinueParserInterface.php|!=b|Uvendor/league/commonmark/src/Parser/Block/BlockContinueParserWithInlinesInterface.php=!=b=sxIvendor/league/commonmark/src/Parser/Block/AbstractBlockContinueParser.php!=b} Avendor/league/commonmark/src/Parser/Block/DocumentBlockParser.phpR!=bR/+z<vendor/league/commonmark/src/Parser/Inline/NewlineParser.php!=b<Dvendor/league/commonmark/src/Parser/Inline/InlineParserInterface.php(!=b(V@vendor/league/commonmark/src/Parser/Inline/InlineParserMatch.php.!=b.%ä3vendor/league/commonmark/src/Parser/CursorState.php3!=b3 z-Dvendor/league/commonmark/src/Parser/MarkdownParserStateInterface.php!=b1 ;vendor/league/commonmark/src/Parser/MarkdownParserState.php!=b~gCvendor/league/commonmark/src/Parser/InlineParserEngineInterface.php!=b 16vendor/league/commonmark/src/Parser/MarkdownParser.php!=bᶎu:vendor/league/commonmark/src/Parser/InlineParserEngine.php !=b G7;vendor/league/commonmark/src/Parser/InlineParserContext.php!=bf0vendor/league/commonmark/src/Util/UrlEncoder.php!=bǴ0vendor/league/commonmark/src/Util/HtmlFilter.php/!=b/8vendor/league/commonmark/src/Util/Html5EntityDecoder.php!=b&5vendor/league/commonmark/src/Util/ArrayCollection.php!=bt460vendor/league/commonmark/src/Util/SpecReader.php]!=b]gA1vendor/league/commonmark/src/Util/HtmlElement.phpj!=bjY 6vendor/league/commonmark/src/Util/LinkParserHelper.php !=b uS)vendor/league/commonmark/src/Util/Xml.php!=b͏5vendor/league/commonmark/src/Util/PrioritizedList.php!=bo1vendor/league/commonmark/src/Util/RegexHelper.php!!=b!=,vendor/league/commonmark/roave-bc-check.yaml!=bYCvendor/league/tactician-logger/src/Formatter/ClassNameFormatter.phpy!=byfѤIvendor/league/tactician-logger/src/Formatter/ClassPropertiesFormatter.php!=b_:vendor/league/tactician-logger/src/Formatter/Formatter.php!=b7vendor/league/tactician-logger/src/LoggerMiddleware.php!=bX篡Lvendor/league/tactician-logger/src/PropertyNormalizer/PropertyNormalizer.php!=bmRvendor/league/tactician-logger/src/PropertyNormalizer/SimplePropertyNormalizer.php!=b:vendor/league/config/src/ConfigurationBuilderInterface.php!=b L3vendor/league/config/src/SchemaBuilderInterface.php!=b1p;vendor/league/config/src/ConfigurationProviderInterface.php!=b? Dvendor/league/config/src/Exception/InvalidConfigurationException.php!=bdO:vendor/league/config/src/Exception/ValidationException.php !=b :锤=vendor/league/config/src/Exception/UnknownOptionException.php!=b9Fvendor/league/config/src/Exception/ConfigurationExceptionInterface.php!=bű?8vendor/league/config/src/ConfigurationAwareInterface.php!=b1Ƥ3vendor/league/config/src/ConfigurationInterface.phpI!=bIk2vendor/league/config/src/ReadOnlyConfiguration.php!=br:vendor/league/config/src/MutableConfigurationInterface.php!=bOʤ*vendor/league/config/src/Configuration.php !=b RWϤ$vendor/league/uri-interfaces/LICENSEB!=bBLEFvendor/league/uri-interfaces/src/Exceptions/FileinfoSupportMissing.php!=bz;vendor/league/uri-interfaces/src/Exceptions/SyntaxError.php!=bAvendor/league/uri-interfaces/src/Exceptions/IdnSupportMissing.php!=b5ͤDvendor/league/uri-interfaces/src/Exceptions/IdnaConversionFailed.php!=bܡJ2vendor/league/uri-interfaces/src/Idna/IdnaInfo.php{ !=b{ yK.vendor/league/uri-interfaces/src/Idna/Idna.php'!=b'U^Ӥ<vendor/league/uri-interfaces/src/Contracts/HostInterface.php!=bT"Bvendor/league/uri-interfaces/src/Contracts/DomainHostInterface.php!=bYg@vendor/league/uri-interfaces/src/Contracts/DataPathInterface.phpS!=bSi]f=vendor/league/uri-interfaces/src/Contracts/QueryInterface.php!=bsAvendor/league/uri-interfaces/src/Contracts/AuthorityInterface.php;!=b;`0פ<vendor/league/uri-interfaces/src/Contracts/PortInterface.php!=b#@vendor/league/uri-interfaces/src/Contracts/UserInfoInterface.php8!=b8;vendor/league/uri-interfaces/src/Contracts/UriInterface.php!=b~]Iv<vendor/league/uri-interfaces/src/Contracts/PathInterface.phpC!=bC&x@>vendor/league/uri-interfaces/src/Contracts/IpHostInterface.phpa!=baM <Evendor/league/uri-interfaces/src/Contracts/SegmentedPathInterface.php!=b@6MuDvendor/league/uri-interfaces/src/Contracts/UriComponentInterface.php!=b|@vendor/league/uri-interfaces/src/Contracts/FragmentInterface.php!=b:;vendor/league/uri-interfaces/src/Contracts/UriException.php!=bWW*vendor/league/tactician/src/Middleware.php!=b3$@vendor/league/tactician/src/Handler/CommandHandlerMiddleware.php!=bITvendor/league/tactician/src/Handler/MethodNameInflector/HandleClassNameInflector.php$!=b$36Ovendor/league/tactician/src/Handler/MethodNameInflector/MethodNameInflector.php!=b5Kvendor/league/tactician/src/Handler/MethodNameInflector/HandleInflector.php!=bGKKvendor/league/tactician/src/Handler/MethodNameInflector/InvokeInflector.php!=bLC<Nvendor/league/tactician/src/Handler/MethodNameInflector/ClassNameInflector.php!=bz1avendor/league/tactician/src/Handler/MethodNameInflector/HandleClassNameWithoutSuffixInflector.phpd!=bdX?vendor/league/tactician/src/Handler/Locator/CallableLocator.php!=bGvendor/league/tactician/src/Handler/Locator/HandlerLocator.php!=bp'DQvendor/league/tactician/src/Handler/CommandNameExtractor/CommandNameExtractor.php!=bmOvendor/league/tactician/src/Handler/CommandNameExtractor/ClassNameExtractor.php!=bwʤMvendor/league/tactician/src/Exception/CanNotDetermineCommandNameException.php!=bl)Fvendor/league/tactician/src/Exception/CanNotInvokeHandlerException.php!=bAD$Avendor/league/tactician/src/Exception/InvalidCommandException.php!=bM33vendor/league/tactician/src/Exception/Exception.phpI!=bI"Dvendor/league/tactician/src/Exception/InvalidMiddlewareException.php!=bVAvendor/league/tactician/src/Exception/MissingHandlerException.php!=b^Avendor/league/tactician/src/Plugins/NamedCommand/NamedCommand.php~!=b~٤Jvendor/league/tactician/src/Plugins/NamedCommand/NamedCommandExtractor.php!=b?9vendor/league/tactician/src/Plugins/LockingMiddleware.php!=b;*ä0vendor/league/tactician/src/Setup/QuickStart.php!=b^xL*vendor/league/tactician/src/CommandBus.php!=bCzDvendor/league/uri/LICENSEB!=bB8!=vendor/league/uri/src/Exceptions/TemplateCanNotBeExpanded.php=!=b=AD%vendor/league/uri/src/UriResolver.php!=b~G %vendor/league/uri/src/UriTemplate.php!=b:J!vendor/league/uri/src/UriInfo.php !=b ͤvendor/league/uri/src/Http.php>!=b>Ϥ#vendor/league/uri/src/UriString.php,+!=b,+Z`i0vendor/league/uri/src/UriTemplate/Expression.php8!=b882vendor/league/uri/src/UriTemplate/VarSpecifier.php!=b'.vendor/league/uri/src/UriTemplate/Template.phpn !=bn cѤ1vendor/league/uri/src/UriTemplate/VariableBag.php!=bSpYvendor/league/uri/src/Uri.phpl!=bl}6,vendor/jawira/plantuml/resources/version.txt !=b +vendor/jawira/plantuml/bin/plantuml.jar.md5/!=b/W=#vendor/jawira/plantuml/bin/plantuml!=b &>\,vendor/jawira/plantuml/bin/plantuml.jar.sha17!=b7q$'vendor/jawira/plantuml/bin/plantuml.jar,A!=b,A mvendor/nikic/php-parser/LICENSE!=b*&vendor/nikic/php-parser/grammar/php5.y!=b۫Ӥ/vendor/nikic/php-parser/grammar/tokens.template*!=b*_֤&vendor/nikic/php-parser/grammar/php7.y!=bq ,vendor/nikic/php-parser/grammar/phpyLang.phpM!=bMŀWӤ2vendor/nikic/php-parser/grammar/rebuildParsers.phpV!=bVx/vendor/nikic/php-parser/grammar/parser.template !=b -ɚQ(vendor/nikic/php-parser/grammar/tokens.y !=b C~jFvendor/nikic/php-parser/lib/PhpParser/ConstExprEvaluationException.phpV!=bVo 58vendor/nikic/php-parser/lib/PhpParser/BuilderHelpers.php!=bjt1vendor/nikic/php-parser/lib/PhpParser/Builder.phps!=bsI%/vendor/nikic/php-parser/lib/PhpParser/Lexer.php0!=b0#ڤ1vendor/nikic/php-parser/lib/PhpParser/Comment.php !=b s0/vendor/nikic/php-parser/lib/PhpParser/Error.php !=b τh8vendor/nikic/php-parser/lib/PhpParser/BuilderFactory.php!=bܽ5vendor/nikic/php-parser/lib/PhpParser/JsonDecoder.php !=b r4vendor/nikic/php-parser/lib/PhpParser/NodeFinder.php9!=b9rLvendor/nikic/php-parser/lib/PhpParser/Internal/PrintableNewAnonClassNode.php !=b "M;vendor/nikic/php-parser/lib/PhpParser/Internal/DiffElem.phpL!=bL>vendor/nikic/php-parser/lib/PhpParser/Internal/TokenStream.php$!=b$Mn9vendor/nikic/php-parser/lib/PhpParser/Internal/Differ.phpN !=bN [l@!7vendor/nikic/php-parser/lib/PhpParser/ParserFactory.phpq!=bq _'?vendor/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php}!=b}ҋ5vendor/nikic/php-parser/lib/PhpParser/Comment/Doc.phpg!=bgѤ4vendor/nikic/php-parser/lib/PhpParser/NodeDumper.php{!=b{o"75vendor/nikic/php-parser/lib/PhpParser/NameContext.php!=b ͤ6vendor/nikic/php-parser/lib/PhpParser/ErrorHandler.php!=bi7vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.phpI!=bI$\]vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NumericLiteralSeparatorEmulator.php !=b "Svendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyTokenEmulator.phpq!=bq+>Wvendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/CoaleseEqualTokenEmulator.phpG!=bG3HsWvendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FlexibleDocStringEmulator.phpr!=br}IOvendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/EnumTokenEmulator.phpI!=bI>(Mvendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/KeywordEmulator.phpD!=bDqfSvendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NullsafeTokenEmulator.php!=beMvendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReverseEmulator.php!=btY\nKvendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/TokenEmulator.php!=b]Y4Ovendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/AttributeEmulator.php!=bq!Mvendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/FnTokenEmulator.php_!=b_ƍSvendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ExplicitOctalEmulator.phpm!=bm$8Pvendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/MatchTokenEmulator.phpi!=bi.g9vendor/nikic/php-parser/lib/PhpParser/Lexer/Emulative.php!=b7:Kvendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NodeConnectingVisitor.php'!=b'}LؤDvendor/nikic/php-parser/lib/PhpParser/NodeVisitor/CloningVisitor.php5!=b5U1SDvendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FindingVisitor.php!=bnqBvendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NameResolver.phps!=bs}nPMvendor/nikic/php-parser/lib/PhpParser/NodeVisitor/ParentConnectingVisitor.php9!=b9tbIvendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FirstFindingVisitor.php!=b_V>vendor/nikic/php-parser/lib/PhpParser/Builder/FunctionLike.phpU!=bUv597vendor/nikic/php-parser/lib/PhpParser/Builder/Param.php!=bL5+:vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUse.phpY!=bY?8vendor/nikic/php-parser/lib/PhpParser/Builder/Class_.php!=by:vendor/nikic/php-parser/lib/PhpParser/Builder/EnumCase.php!=bK8vendor/nikic/php-parser/lib/PhpParser/Builder/Trait_.php!=b`*Dvendor/nikic/php-parser/lib/PhpParser/Builder/TraitUseAdaptation.php !=b ':vendor/nikic/php-parser/lib/PhpParser/Builder/Property.php!=bucۤ;vendor/nikic/php-parser/lib/PhpParser/Builder/Function_.php_!=b_B%8vendor/nikic/php-parser/lib/PhpParser/Builder/Method.php!=bSF0<vendor/nikic/php-parser/lib/PhpParser/Builder/ClassConst.php!=b,@ǥ<vendor/nikic/php-parser/lib/PhpParser/Builder/Namespace_.phpE!=bEYZ<vendor/nikic/php-parser/lib/PhpParser/Builder/Interface_.php?!=b?̤:vendor/nikic/php-parser/lib/PhpParser/Node/ComplexType.php!=b7h8vendor/nikic/php-parser/lib/PhpParser/Node/UnionType.phpu!=bup3vendor/nikic/php-parser/lib/PhpParser/Node/Stmt.php!=bn=vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayItem.php\!=b\ ͤ:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Yield_.php!=b[hܤ;vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostDec.php!=b78vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast.phpO!=bOEtΤ9vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Error.phpR!=bR~Յ?vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Instanceof_.php!=bUV9vendor/nikic/php-parser/lib/PhpParser/Node/Expr/List_.php!=b<vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp.php!=b[?8Fvendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafeMethodCall.php!=b 4s<vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Include_.php,!=b,s` :vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Print_.php!=bƋ<vendor/nikic/php-parser/lib/PhpParser/Node/Expr/CallLike.php !=b [:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Throw_.php!=b_9vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Eval_.php!=bo|;vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostInc.php!=bd|:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Empty_.php!=b >vendor/nikic/php-parser/lib/PhpParser/Node/Expr/MethodCall.php!=b5٤=vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ShellExec.php!=bc:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Isset_.php!=b5(>vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryMinus.php!=bߣӤ:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Clone_.php!=b9vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Exit_.php!=b[8vendor/nikic/php-parser/lib/PhpParser/Node/Expr/New_.phpU!=bUi_Avendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayDimFetch.php!=b9+=>vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticCall.php!=bS?S>vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ConstFetch.php!=bݩgCvendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Concat.php!=bQ(ڤFvendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseOr.php!=bbGvendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftRight.php!=b B@vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mod.php!=bA@vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mul.php!=blO@vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Div.php!=b6@vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Pow.php!=b Evendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Coalesce.php!=b\h.Gvendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseAnd.php!=bsGvendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseXor.php!=b;SFvendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftLeft.php!=bHAvendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Plus.php!=bbݤBvendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Minus.php!=bd<vendor/nikic/php-parser/lib/PhpParser/Node/Expr/FuncCall.php!=b0ܤ>vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BitwiseNot.php!=bv=vendor/nikic/php-parser/lib/PhpParser/Node/Expr/YieldFrom.php!=bI<vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Variable.php!=b8mvAvendor/nikic/php-parser/lib/PhpParser/Node/Expr/ErrorSuppress.php!=b @vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/String_.php!=b?vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Double.php!=bXo=vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Int_.php!=b8'@vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Object_.php!=b?vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Unset_.php!=bN¤>vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Bool_.php!=b?vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Array_.php!=bm(=vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignRef.php!=bM>vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BooleanNot.php!=b=Cvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Concat.php!=b2f<Fvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseOr.php!=bSFvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalOr.php!=bUGvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftRight.php!=b?*Dvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Greater.php!=bxD@vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mod.php !=b t@vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mul.php !=b B`*Ivendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotIdentical.php!=bfKvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/GreaterOrEqual.php"!=b".Dvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Smaller.php!=bURFvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanOr.php!=bKFṲ@vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Div.php !=b 3ID@vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Pow.php !=b ;@ Evendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Coalesce.php!=bp xGvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalXor.php!=bT)KGvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseAnd.php!=bGvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseXor.php!=bu-Gvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalAnd.php!=bSeEvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotEqual.php!=b'Bvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Equal.php!=bM[1TFvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Identical.php!=bz7Kvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/SmallerOrEqual.php"!=b"7Fvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftLeft.php!=b>CϤAvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Plus.php !=b FǍGvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanAnd.php!=b4YBvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Minus.php!=b-Fvendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Spaceship.php!=bFGvendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticPropertyFetch.phpF!=bF 9ѩ;vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Ternary.php!=bx>vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClosureUse.php!=bm=vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryPlus.php!=b!2;vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Closure.phpW!=bW0̤Avendor/nikic/php-parser/lib/PhpParser/Node/Expr/PropertyFetch.php!=bk:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Array_.php!=b!:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Assign.php!=bE:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Match_.php!=bAaPfIvendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafePropertyFetch.php!=bߊ Avendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrowFunction.php;!=b; yl<vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp.php!=b/+Cvendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClassConstFetch.php0!=b0%h:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreInc.php!=brn:vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreDec.php!=b01¤9vendor/nikic/php-parser/lib/PhpParser/Node/Identifier.phpB!=bBt桤3vendor/nikic/php-parser/lib/PhpParser/Node/Name.php !=b ͥ =vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/String_.php !=b t=vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php=!=b=`+@vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst.phpV!=bVa>vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Encapsed.php!=b0AGvendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Class_.php!=bbGvendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Trait_.php!=bPJvendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Function_.php&!=b&f]Gvendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Method.php!=b?xDvendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Dir.php!=bEvendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Line.php!=bM¤Kvendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Namespace_.php)!=b)Evendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/File.php!=b_Hvendor/nikic/php-parser/lib/PhpParser/Node/Scalar/EncapsedStringPart.php!=b!b=vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php2!=b2㷤<vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUse.php!=b~9vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Case_.php!=b/Iz:vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.php!=b=t>vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Expression.php!=b_i<vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/EnumCase.phpz!=bz Qvendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Precedence.phpv!=bvFLvendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Alias.php!=b<vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/GroupUse.php3!=b3^Ȥ:vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Trait_.php-!=b-%:vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Const_.php!=b1#=vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/StaticVar.php!=b\ؤ?vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassMethod.php !=b w9vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Goto_.php!=b'Fvendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation.php!=b(S<vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Property.php#!=b#q0=vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php<!=b<uʤ:vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Throw_.php!=bA<vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Declare_.php!=b9q7vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/If_.phpj!=bj#Q<vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TryCatch.php,!=b,MFI>vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassConst.php !=b kBvendor/nikic/php-parser/lib/PhpParser/Node/Stmt/DeclareDeclare.php!=bE^7vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Nop.php!=b<:vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Break_.php!=b=3>vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Namespace_.php !=b t:vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/UseUse.php!=bƆ9vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Label.php!=bN,;vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Return_.php!=b7vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Do_.php!=bz>vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Interface_.php!=bP7Ť=vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.php!=b228vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/For_.php_!=b_<@vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/HaltCompiler.php!=bc3:vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Catch_.php.!=b.In<vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Foreach_.php!=bU;vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Global_.php!=bCݤ9vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Else_.php!=b*Ѫ=vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Continue_.php!=b'8vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Use_.php8!=b8˸>Dvendor/nikic/php-parser/lib/PhpParser/Node/Stmt/PropertyProperty.php!!=b!v{;vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Switch_.php!=bߤ:vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Unset_.php!=bEJY;vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ElseIf_.php!=b>vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/InlineHTML.php!=b'l9vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Enum_.php!=b:V<vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Finally_.php!=b,;vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Static_.php!=b@9vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Echo_.php!=bߨ:vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/While_.php!=b?vendor/nikic/php-parser/lib/PhpParser/Node/IntersectionType.php!=b%<vendor/nikic/php-parser/lib/PhpParser/Node/Name/Relative.php!=bE%Bvendor/nikic/php-parser/lib/PhpParser/Node/Name/FullyQualified.php!=bgaK=vendor/nikic/php-parser/lib/PhpParser/Node/AttributeGroup.php!=bw8vendor/nikic/php-parser/lib/PhpParser/Node/Attribute.php!=bI(n3vendor/nikic/php-parser/lib/PhpParser/Node/Expr.php!=b;vendor/nikic/php-parser/lib/PhpParser/Node/NullableType.php!=bVdʤ5vendor/nikic/php-parser/lib/PhpParser/Node/Scalar.phpb!=bbf@vendor/nikic/php-parser/lib/PhpParser/NodeTraverserInterface.php!=bx5vendor/nikic/php-parser/lib/PhpParser/NodeVisitor.php6!=b6EeY0vendor/nikic/php-parser/lib/PhpParser/Parser.php!=bH{5vendor/nikic/php-parser/lib/PhpParser/Parser/Php5.php!=bϤ5vendor/nikic/php-parser/lib/PhpParser/Parser/Php7.php!=bW9vendor/nikic/php-parser/lib/PhpParser/Parser/Multiple.php!=b 7vendor/nikic/php-parser/lib/PhpParser/Parser/Tokens.php !=b Q@vendor/nikic/php-parser/lib/PhpParser/PrettyPrinter/Standard.phpF!=bFԊʤ.vendor/nikic/php-parser/lib/PhpParser/Node.php!=b>ű8vendor/nikic/php-parser/lib/PhpParser/ParserAbstract.phpQ!=bQ:ᆤ?vendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Throwing.php!=bqAvendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Collecting.php!=b?6vendor/nikic/php-parser/lib/PhpParser/NodeAbstract.php!=b(%vendor/nikic/php-parser/bin/php-parsef!=bf vendor/composer/LICENSE.!=b. 'vendor/composer/autoload_namespaces.php!=bl7"vendor/composer/autoload_files.php!=bi$ "vendor/composer/platform_check.php!=b>L!vendor/composer/autoload_psr4.php!=by!vendor/composer/autoload_real.php !=b .vendor/composer/ClassLoader.php>!=b>5Kyvendor/composer/installed.json!=b[%vendor/composer/autoload_classmap.phpl!=bl8V#vendor/composer/autoload_static.phpB!=bB\ D&vendor/dflydev/dot-access-data/LICENSE.!=b.6w.4vendor/dflydev/dot-access-data/src/DataInterface.php!=b*+vendor/dflydev/dot-access-data/src/Data.php !=b ղEvendor/dflydev/dot-access-data/src/Exception/MissingPathException.php!=b?>vendor/dflydev/dot-access-data/src/Exception/DataException.php!=bMqEvendor/dflydev/dot-access-data/src/Exception/InvalidPathException.php!=b?1i+vendor/dflydev/dot-access-data/src/Util.php]!=b]LWxvendor/twig/twig/LICENSE!=b ˤ(vendor/twig/twig/src/TemplateWrapper.php?!=b?\ 6vendor/twig/twig/src/Lexer.php2!=b2x#6vendor/twig/twig/src/FileExtensionEscapingStrategy.php!=bE¤#vendor/twig/twig/src/TwigFilter.phpm!=bmd*!vendor/twig/twig/src/Template.php!=bȊ|$vendor/twig/twig/src/Environment.php2!=b2{`v!vendor/twig/twig/src/Compiler.phpS !=bS jW!vendor/twig/twig/src/TwigTest.php!=bڤ+vendor/twig/twig/src/Loader/ArrayLoader.php!=b޶0vendor/twig/twig/src/Loader/FilesystemLoader.php!=b 8<vendor/twig/twig/src/Loader/SourceContextLoaderInterface.php!=bLfLc5vendor/twig/twig/src/Loader/ExistsLoaderInterface.php!=b[7B+vendor/twig/twig/src/Loader/ChainLoader.php!=b /vendor/twig/twig/src/Loader/LoaderInterface.phpx!=bxA%vendor/twig/twig/src/ExtensionSet.php#!=b#>vendor/twig/twig/src/Sandbox/SecurityNotAllowedMethodError.php!=b(פ@vendor/twig/twig/src/Sandbox/SecurityNotAllowedPropertyError.php!=bWh^@vendor/twig/twig/src/Sandbox/SecurityNotAllowedFunctionError.php8!=b8ܡ|>vendor/twig/twig/src/Sandbox/SecurityNotAllowedFilterError.php*!=b* +;vendor/twig/twig/src/Sandbox/SecurityNotAllowedTagError.php !=b uTդ8vendor/twig/twig/src/Sandbox/SecurityPolicyInterface.phpa!=ba^(1/vendor/twig/twig/src/Sandbox/SecurityPolicy.php !=b 7ݤ.vendor/twig/twig/src/Sandbox/SecurityError.php!=bt%vendor/twig/twig/src/TwigFunction.php!=bCzMvendor/twig/twig/src/Markup.php!=be$vendor/twig/twig/src/TokenStream.php!=bϤ3vendor/twig/twig/src/Extension/GlobalsInterface.php!=bϱ1vendor/twig/twig/src/Extension/DebugExtension.phpC!=bC&P4vendor/twig/twig/src/Extension/AbstractExtension.php!=bko5vendor/twig/twig/src/Extension/OptimizerExtension.php!=b2ɤ8vendor/twig/twig/src/Extension/StringLoaderExtension.phpJ!=bJ…~4vendor/twig/twig/src/Extension/ProfilerExtension.php!=b<#<vendor/twig/twig/src/Extension/RuntimeExtensionInterface.phpV!=bV`>3vendor/twig/twig/src/Extension/StagingExtension.php4!=b4HpM5vendor/twig/twig/src/Extension/ExtensionInterface.php<!=b<__7vendor/twig/twig/src/Extension/InitRuntimeInterface.php!=b83vendor/twig/twig/src/Extension/EscaperExtension.phpo!=bo=٤0vendor/twig/twig/src/Extension/CoreExtension.phpT!=bTU'3vendor/twig/twig/src/Extension/SandboxExtension.php: !=b: xD$vendor/twig/twig/src/Error/Error.php!=bP**vendor/twig/twig/src/Error/SyntaxError.php!=bq>|*vendor/twig/twig/src/Error/LoaderError.php!=bQؤ+vendor/twig/twig/src/Error/RuntimeError.php!=b&vendor/twig/twig/src/NodeTraverser.php!=b<vendor/twig/twig/src/NodeVisitor/SafeAnalysisNodeVisitor.phpc !=bc Q8vendor/twig/twig/src/NodeVisitor/AbstractNodeVisitor.phpc!=bc?vendor/twig/twig/src/NodeVisitor/MacroAutoImportNodeVisitor.php!=b&>9vendor/twig/twig/src/NodeVisitor/NodeVisitorInterface.php!=bwe9vendor/twig/twig/src/NodeVisitor/OptimizerNodeVisitor.php:!=b:wn7vendor/twig/twig/src/NodeVisitor/SandboxNodeVisitor.php6 !=b6 Tk7vendor/twig/twig/src/NodeVisitor/EscaperNodeVisitor.php!=bkvendor/twig/twig/src/Source.php!=b(E5vendor/twig/twig/src/TokenParser/EmbedTokenParser.php!=b IФ5vendor/twig/twig/src/TokenParser/ApplyTokenParser.php!=bk17vendor/twig/twig/src/TokenParser/IncludeTokenParser.php!=b.4vendor/twig/twig/src/TokenParser/WithTokenParser.php!!=b!%3vendor/twig/twig/src/TokenParser/SetTokenParser.php%!=b%HB2vendor/twig/twig/src/TokenParser/IfTokenParser.php !=b tS6vendor/twig/twig/src/TokenParser/ImportTokenParser.php#!=b#W>5vendor/twig/twig/src/TokenParser/FlushTokenParser.php!=b?L6vendor/twig/twig/src/TokenParser/FilterTokenParser.php !=b |5vendor/twig/twig/src/TokenParser/MacroTokenParser.php!=b咖7vendor/twig/twig/src/TokenParser/SandboxTokenParser.php!=bQD2vendor/twig/twig/src/TokenParser/DoTokenParser.php!=bl9vendor/twig/twig/src/TokenParser/TokenParserInterface.php!=b<դ:vendor/twig/twig/src/TokenParser/DeprecatedTokenParser.php!=bOߤ7vendor/twig/twig/src/TokenParser/ExtendsTokenParser.php!=b[4vendor/twig/twig/src/TokenParser/FromTokenParser.php3!=b3zѤ:vendor/twig/twig/src/TokenParser/AutoEscapeTokenParser.php>!=b>j5vendor/twig/twig/src/TokenParser/BlockTokenParser.php!=b;Ɉ3vendor/twig/twig/src/TokenParser/ForTokenParser.php*!=b*դ9vendor/twig/twig/src/TokenParser/SpacelessTokenParser.php!=bx+r8vendor/twig/twig/src/TokenParser/AbstractTokenParser.php3!=b3 Y3vendor/twig/twig/src/TokenParser/UseTokenParser.phpj!=bjd;(vendor/twig/twig/src/Cache/NullCache.phpT!=bTWN\-vendor/twig/twig/src/Cache/CacheInterface.phpC!=bCd.vendor/twig/twig/src/Cache/FilesystemCache.php!=bTu=vendor/twig/twig/src/RuntimeLoader/ContainerRuntimeLoader.php!=bw&=vendor/twig/twig/src/RuntimeLoader/RuntimeLoaderInterface.php!=bt[~;vendor/twig/twig/src/RuntimeLoader/FactoryRuntimeLoader.php!=b'vendor/twig/twig/src/Node/EmbedNode.php{!=b{t](vendor/twig/twig/src/Node/ModuleNode.php%!=b%9&vendor/twig/twig/src/Node/BodyNode.php!=b' '&vendor/twig/twig/src/Node/TextNode.php!=b,%vendor/twig/twig/src/Node/ForNode.php !=b A,vendor/twig/twig/src/Node/AutoEscapeNode.php!=b̓K$vendor/twig/twig/src/Node/IfNode.php!=b'vendor/twig/twig/src/Node/PrintNode.php!=b&(vendor/twig/twig/src/Node/ImportNode.php}!=b}dJ)vendor/twig/twig/src/Node/SandboxNode.php#!=b#,vendor/twig/twig/src/Node/DeprecatedNode.php!=b{'vendor/twig/twig/src/Node/BlockNode.php!=bip?0vendor/twig/twig/src/Node/SandboxedPrintNode.php!=ba3dۤ'vendor/twig/twig/src/Node/FlushNode.phpg!=bgi9)vendor/twig/twig/src/Node/IncludeNode.php2!=b23m0vendor/twig/twig/src/Node/BlockReferenceNode.php!=bpx-:vendor/twig/twig/src/Node/Expression/GetAttrExpression.php!=biO7vendor/twig/twig/src/Node/Expression/Unary/PosUnary.php!=buE<vendor/twig/twig/src/Node/Expression/Unary/AbstractUnary.phpX!=bX:P$T7vendor/twig/twig/src/Node/Expression/Unary/NegUnary.php!=bq7vendor/twig/twig/src/Node/Expression/Unary/NotUnary.php!=b+_5vendor/twig/twig/src/Node/Expression/Test/OddTest.php!=bwU;6vendor/twig/twig/src/Node/Expression/Test/EvenTest.php!=bwD8vendor/twig/twig/src/Node/Expression/Test/SameasTest.php!=bm=vendor/twig/twig/src/Node/Expression/Test/DivisiblebyTest.php!=b ՟6vendor/twig/twig/src/Node/Expression/Test/NullTest.phpz!=bzo¿:vendor/twig/twig/src/Node/Expression/Test/ConstantTest.phpt!=bt$n9vendor/twig/twig/src/Node/Expression/Test/DefinedTest.php!=bah@vendor/twig/twig/src/Node/Expression/ArrowFunctionExpression.php!=b;vendor/twig/twig/src/Node/Expression/ConstantExpression.php!=b(9vendor/twig/twig/src/Node/Expression/FilterExpression.php!=b?vendor/twig/twig/src/Node/Expression/NullCoalesceExpression.php!=bxuVAvendor/twig/twig/src/Node/Expression/BlockReferenceExpression.php0!=b0<ؤ;vendor/twig/twig/src/Node/Expression/TempNameExpression.php!=bs'];vendor/twig/twig/src/Node/Expression/AbstractExpression.php!=b57vendor/twig/twig/src/Node/Expression/CallExpression.phpe#!=be#67vendor/twig/twig/src/Node/Expression/NameExpression.phpr!=brn;vendor/twig/twig/src/Node/Expression/VariadicExpression.php!=bW7vendor/twig/twig/src/Node/Expression/TestExpression.phpk!=bkW>vendor/twig/twig/src/Node/Expression/Binary/NotEqualBinary.php.!=b.A>vendor/twig/twig/src/Node/Expression/Binary/EndsWithBinary.php!=bvvendor/twig/twig/src/Node/Expression/Binary/FloorDivBinary.php!=bCb49vendor/twig/twig/src/Node/Expression/Binary/DivBinary.php!=bnܤ;vendor/twig/twig/src/Node/Expression/Binary/NotInBinary.php!=bӤ9vendor/twig/twig/src/Node/Expression/Binary/AndBinary.php !=b !ԆBvendor/twig/twig/src/Node/Expression/Binary/GreaterEqualBinary.php:!=b:g@vendor/twig/twig/src/Node/Expression/Binary/BitwiseAndBinary.php4!=b4~?|@vendor/twig/twig/src/Node/Expression/Binary/BitwiseXorBinary.php4!=b4B}?vendor/twig/twig/src/Node/Expression/Binary/SpaceshipBinary.php!=b%=vendor/twig/twig/src/Node/Expression/Binary/MatchesBinary.php!=b >vendor/twig/twig/src/Node/Expression/Binary/AbstractBinary.php!=btU9vendor/twig/twig/src/Node/Expression/Binary/SubBinary.php!=b9vendor/twig/twig/src/Node/Expression/Binary/AddBinary.php!=bQ=^;vendor/twig/twig/src/Node/Expression/Binary/RangeBinary.php!=bH=vendor/twig/twig/src/Node/Expression/Filter/DefaultFilter.phpl!=bl7E=vendor/twig/twig/src/Node/Expression/MethodCallExpression.php!=b1¤>vendor/twig/twig/src/Node/Expression/ConditionalExpression.php!=bD8vendor/twig/twig/src/Node/Expression/ArrayExpression.php!=b=vendor/twig/twig/src/Node/Expression/AssignNameExpression.phpZ!=bZgn9vendor/twig/twig/src/Node/Expression/ParentExpression.php!=bsa4vendor/twig/twig/src/Node/Expression/InlinePrint.php{!=b{e;vendor/twig/twig/src/Node/Expression/FunctionExpression.phph!=bh|1vendor/twig/twig/src/Node/NodeOutputInterface.php!=bm/vendor/twig/twig/src/Node/CheckToStringNode.php%!=b%e'vendor/twig/twig/src/Node/MacroNode.php!=bfC2vendor/twig/twig/src/Node/NodeCaptureInterface.php!=bx)+vendor/twig/twig/src/Node/SpacelessNode.php!=b &vendor/twig/twig/src/Node/WithNode.php!=b0l)vendor/twig/twig/src/Node/ForLoopNode.php!=bVS$vendor/twig/twig/src/Node/DoNode.php!=b#"vendor/twig/twig/src/Node/Node.php !=b ’3vendor/twig/twig/src/Node/CheckSecurityCallNode.php*!=b*/vendor/twig/twig/src/Node/CheckSecurityNode.php!=botF%vendor/twig/twig/src/Node/SetNode.php!=b3vendor/twig/twig/src/Profiler/Dumper/TextDumper.php!=b&RҤ3vendor/twig/twig/src/Profiler/Dumper/HtmlDumper.phph!=bhiΡ3vendor/twig/twig/src/Profiler/Dumper/BaseDumper.php!=b)8vendor/twig/twig/src/Profiler/Dumper/BlackfireDumper.php!=bQR Avendor/twig/twig/src/Profiler/NodeVisitor/ProfilerNodeVisitor.php !=b OZ!}7vendor/twig/twig/src/Profiler/Node/LeaveProfileNode.php!=b)7vendor/twig/twig/src/Profiler/Node/EnterProfileNode.php!=bY})vendor/twig/twig/src/Profiler/Profile.php !=b Qtm)vendor/twig/twig/src/ExpressionParser.php(V!=b(V9΋vendor/twig/twig/src/Token.php !=b YiBvendor/twig/twig/src/Parser.phpK!!=bK!1vendor/twig/twig/src/Util/TemplateDirIterator.php@!=b@H`S2vendor/twig/twig/src/Util/DeprecationCollector.php!=b-vendor/twig/twig/lib/Twig/TemplateWrapper.php)!=b)] #vendor/twig/twig/lib/Twig/Lexer.php!=b*t';vendor/twig/twig/lib/Twig/FileExtensionEscapingStrategy.php}!=b}WԤ#vendor/twig/twig/lib/Twig/Error.php!=b-4vendor/twig/twig/lib/Twig/ContainerRuntimeLoader.php}!=b}!E&vendor/twig/twig/lib/Twig/Template.php!=bKb)vendor/twig/twig/lib/Twig/Environment.php!=bTwͤ,vendor/twig/twig/lib/Twig/SimpleFunction.php-!=b-&vendor/twig/twig/lib/Twig/Compiler.php!=bNP1vendor/twig/twig/lib/Twig/NodeOutputInterface.phpP!=bP_2vendor/twig/twig/lib/Twig/NodeCaptureInterface.phpV!=bVJ,vendor/twig/twig/lib/Twig/CacheInterface.php5!=b57*vendor/twig/twig/lib/Twig/Loader/Array.php(!=b(f*vendor/twig/twig/lib/Twig/Loader/Chain.php(!=b(庤/vendor/twig/twig/lib/Twig/Loader/Filesystem.phpF!=bFcȞ*vendor/twig/twig/lib/Twig/ExtensionSet.php!=b:uCvendor/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedMethodError.php!=b(5ҤEvendor/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedPropertyError.php!=bEvendor/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedFunctionError.php!=b>^ACvendor/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedFilterError.php!=b$Cй@vendor/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedTagError.php!=b_=vendor/twig/twig/lib/Twig/Sandbox/SecurityPolicyInterface.php!=b44vendor/twig/twig/lib/Twig/Sandbox/SecurityPolicy.phpK!=bK?ns3vendor/twig/twig/lib/Twig/Sandbox/SecurityError.phpE!=bEJ'vendor/twig/twig/lib/Twig/Extension.phpC!=bCv$vendor/twig/twig/lib/Twig/Markup.php!=b :vendor/twig/twig/lib/Twig/SourceContextLoaderInterface.php!=bl)vendor/twig/twig/lib/Twig/TokenStream.php!=b8vendor/twig/twig/lib/Twig/Extension/GlobalsInterface.phpa!=ba/vendor/twig/twig/lib/Twig/Extension/Staging.phpO!=bOk-84vendor/twig/twig/lib/Twig/Extension/StringLoader.phpm!=bm9^1vendor/twig/twig/lib/Twig/Extension/Optimizer.php[!=b[ͤ0vendor/twig/twig/lib/Twig/Extension/Profiler.phpU!=bUwX/vendor/twig/twig/lib/Twig/Extension/Escaper.phpO!=bO*-vendor/twig/twig/lib/Twig/Extension/Debug.phpC!=bCl<vendor/twig/twig/lib/Twig/Extension/InitRuntimeInterface.phpy!=byBˤ,vendor/twig/twig/lib/Twig/Extension/Core.php=!=b=9|Vդ/vendor/twig/twig/lib/Twig/Extension/Sandbox.phpO!=bO {Iۤ*vendor/twig/twig/lib/Twig/Error/Loader.php%!=b%+vendor/twig/twig/lib/Twig/Error/Runtime.php+!=b+E*vendor/twig/twig/lib/Twig/Error/Syntax.php%!=b%ܿ*vendor/twig/twig/lib/Twig/SimpleFilter.php!!=b!,dF&vendor/twig/twig/lib/Twig/Function.php!=b+vendor/twig/twig/lib/Twig/NodeTraverser.php!=b46vendor/twig/twig/lib/Twig/NodeVisitor/SafeAnalysis.php!=b#3vendor/twig/twig/lib/Twig/NodeVisitor/Optimizer.phpm!=bm:I1vendor/twig/twig/lib/Twig/NodeVisitor/Escaper.phpa!=baDn1vendor/twig/twig/lib/Twig/NodeVisitor/Sandbox.phpa!=bar]2vendor/twig/twig/lib/Twig/TokenParserInterface.phpk!=bkUn,3vendor/twig/twig/lib/Twig/ExistsLoaderInterface.phpb!=bbaT$vendor/twig/twig/lib/Twig/Source.php!=b*̤)vendor/twig/twig/lib/Twig/TokenParser.phpU!=bUw٤,vendor/twig/twig/lib/Twig/TokenParser/If.phpC!=bC2u--vendor/twig/twig/lib/Twig/TokenParser/Use.phpI!=bIYu\/vendor/twig/twig/lib/Twig/TokenParser/Macro.phpU!=bUEI-vendor/twig/twig/lib/Twig/TokenParser/For.phpI!=bI3vendor/twig/twig/lib/Twig/TokenParser/Spaceless.phpm!=bmғ/vendor/twig/twig/lib/Twig/TokenParser/Embed.phpU!=bU0⿤1vendor/twig/twig/lib/Twig/TokenParser/Include.phpa!=ba54vendor/twig/twig/lib/Twig/TokenParser/AutoEscape.phps!=bsPK.vendor/twig/twig/lib/Twig/TokenParser/With.phpO!=bOz1vendor/twig/twig/lib/Twig/TokenParser/Extends.phpa!=ba ˤ-vendor/twig/twig/lib/Twig/TokenParser/Set.phpI!=bIz4vendor/twig/twig/lib/Twig/TokenParser/Deprecated.phps!=bse/vendor/twig/twig/lib/Twig/TokenParser/Block.phpU!=bUؐb@0vendor/twig/twig/lib/Twig/TokenParser/Import.php[!=b[zֻ0vendor/twig/twig/lib/Twig/TokenParser/Filter.php[!=b[q'*.vendor/twig/twig/lib/Twig/TokenParser/From.phpO!=bOu21vendor/twig/twig/lib/Twig/TokenParser/Sandbox.phpa!=ba̴I/vendor/twig/twig/lib/Twig/TokenParser/Flush.phpU!=bU0=,vendor/twig/twig/lib/Twig/TokenParser/Do.phpC!=bCṤ$vendor/twig/twig/lib/Twig/Filter.php!=bK-vendor/twig/twig/lib/Twig/BaseNodeVisitor.php]!=b]Di(vendor/twig/twig/lib/Twig/Cache/Null.php!=b.vendor/twig/twig/lib/Twig/Cache/Filesystem.php=!=b=>RL-vendor/twig/twig/lib/Twig/LoaderInterface.php>!=b> 00vendor/twig/twig/lib/Twig/ExtensionInterface.phpY!=bYUx%vendor/twig/twig/lib/Twig/Node/If.php!=b,ͤ-vendor/twig/twig/lib/Twig/Node/Expression.phpe!=be-(vendor/twig/twig/lib/Twig/Node/Macro.php!=bv T?&vendor/twig/twig/lib/Twig/Node/For.php !=b ZDq,vendor/twig/twig/lib/Twig/Node/Spaceless.php.!=b.vendor/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseOr.php!=bL7vendor/twig/twig/lib/Twig/Node/Expression/Binary/Or.phpf!=bfP=Ф<vendor/twig/twig/lib/Twig/Node/Expression/Binary/Greater.php!=b0G:vendor/twig/twig/lib/Twig/Node/Expression/Binary/Power.phpx!=bx&8vendor/twig/twig/lib/Twig/Node/Expression/Binary/Sub.phpl!=bl!Tp8vendor/twig/twig/lib/Twig/Node/Expression/Binary/Mod.phpl!=blS,=vendor/twig/twig/lib/Twig/Node/Expression/Binary/EndsWith.php!=baD6Avendor/twig/twig/lib/Twig/Node/Expression/Binary/GreaterEqual.php!=bޚ/P8vendor/twig/twig/lib/Twig/Node/Expression/Binary/Mul.phpl!=bl*:vendor/twig/twig/lib/Twig/Node/Expression/Binary/NotIn.phpx!=bx0ͤ8vendor/twig/twig/lib/Twig/Node/Expression/Binary/Div.phpl!=blY0U<vendor/twig/twig/lib/Twig/Node/Expression/Binary/Matches.php!=bؤ:vendor/twig/twig/lib/Twig/Node/Expression/Binary/Range.phpx!=bxg8vendor/twig/twig/lib/Twig/Node/Expression/Binary/Add.phpl!=bliJL8vendor/twig/twig/lib/Twig/Node/Expression/Binary/And.phpl!=blUM?vendor/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseAnd.php!=b%0?vendor/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseXor.php!=bOPz=vendor/twig/twig/lib/Twig/Node/Expression/Binary/NotEqual.php!=bS:vendor/twig/twig/lib/Twig/Node/Expression/Binary/Equal.phpx!=bx/?vendor/twig/twig/lib/Twig/Node/Expression/Binary/StartsWith.php!=b,:>vendor/twig/twig/lib/Twig/Node/Expression/Binary/LessEqual.php!=bܿ7vendor/twig/twig/lib/Twig/Node/Expression/Binary/In.phpf!=bf?H9vendor/twig/twig/lib/Twig/Node/Expression/Binary/Less.phpr!=br=g6vendor/twig/twig/lib/Twig/Node/Expression/TempName.phpw!=bwZ <vendor/twig/twig/lib/Twig/Node/Expression/Filter/Default.php!=bм\'vendor/twig/twig/lib/Twig/Node/Text.php!=bC*vendor/twig/twig/lib/Twig/Node/ForLoop.php"!=b"]~'vendor/twig/twig/lib/Twig/Node/With.php!=b&vendor/twig/twig/lib/Twig/Node/Set.php !=b ٠D-vendor/twig/twig/lib/Twig/Node/Deprecated.php4!=b4asȊ(vendor/twig/twig/lib/Twig/Node/Block.php!=b!B)vendor/twig/twig/lib/Twig/Node/Import.php!=b)vendor/twig/twig/lib/Twig/Node/Module.php!=b#*vendor/twig/twig/lib/Twig/Node/Sandbox.php"!=b"gW(vendor/twig/twig/lib/Twig/Node/Flush.php!=b+%vendor/twig/twig/lib/Twig/Node/Do.php!=bpU'vendor/twig/twig/lib/Twig/Node/Body.php!=b꣤0vendor/twig/twig/lib/Twig/Node/CheckSecurity.phpF!=bF92vendor/twig/twig/lib/Twig/NodeVisitorInterface.phpk!=bkPU2vendor/twig/twig/lib/Twig/Profiler/Dumper/Base.phpO!=bO2vendor/twig/twig/lib/Twig/Profiler/Dumper/Text.phpO!=bO&˻2vendor/twig/twig/lib/Twig/Profiler/Dumper/Html.phpO!=bOKU7vendor/twig/twig/lib/Twig/Profiler/Dumper/Blackfire.phpm!=bm({ݤ;vendor/twig/twig/lib/Twig/Profiler/NodeVisitor/Profiler.php!=b8vendor/twig/twig/lib/Twig/Profiler/Node/LeaveProfile.phpm!=bm^)8vendor/twig/twig/lib/Twig/Profiler/Node/EnterProfile.phpm!=bmx0$B.vendor/twig/twig/lib/Twig/Profiler/Profile.php&!=b&^U&%.vendor/twig/twig/lib/Twig/ExpressionParser.php/!=b/&sk4vendor/twig/twig/lib/Twig/RuntimeLoaderInterface.php}!=b}xz#vendor/twig/twig/lib/Twig/Token.php!=b9<ä$vendor/twig/twig/lib/Twig/Parser.php!=bWX2vendor/twig/twig/lib/Twig/FactoryRuntimeLoader.phpq!=bq u"vendor/twig/twig/lib/Twig/Node.php!=bN&Q6vendor/twig/twig/lib/Twig/Util/TemplateDirIterator.phpZ!=bZJȊ7vendor/twig/twig/lib/Twig/Util/DeprecationCollector.php`!=b`kPvar/cache/prod/annotations.map[!=b[Rc9var/cache/prod/phpDocumentor_KernelProdContainer.php.metaco!=bcoH`fQ<var/cache/prod/phpDocumentor_KernelProdContainer.preload.php4@!=b4@{l&var/cache/prod/url_matching_routes.php!=b9var/cache/prod/phpDocumentor_KernelProdContainer.php.lock!=b-var/cache/prod/url_generating_routes.php.meta!=bԤ(var/cache/prod/url_generating_routes.php!=bŨUvar/cache/prod/ContainerRRHX7xE/getConsole_Command_SecretsEncryptFromLocalService.php!=b tG=var/cache/prod/ContainerRRHX7xE/getCacheMiddlewareService.php !=b 0_7var/cache/prod/ContainerRRHX7xE/getCache_AppService.php% !=b% Ivar/cache/prod/ContainerRRHX7xE/getConsole_Command_DotenvDebugService.phpI!=bI7ۤCvar/cache/prod/ContainerRRHX7xE/getPhpdoc_Parse_PipelineService.php{ !=b{ Evar/cache/prod/ContainerRRHX7xE/getErrorHandlingMiddlewareService.phpq!=bqMNvar/cache/prod/ContainerRRHX7xE/getGuides_Renderer_Noderenderer_UmlService.php!=bѤSvar/cache/prod/ContainerRRHX7xE/getGuides_Renderer_Noderenderer_SparatorService.php!=b͘L<var/cache/prod/ContainerRRHX7xE/getRouting_LoaderService.php3!=b35ѤPvar/cache/prod/ContainerRRHX7xE/getGuides_Renderer_Noderenderer_TitleService.php!=b .Mvar/cache/prod/ContainerRRHX7xE/getConsole_Command_DebugAutowiringService.phpm!=bm@Qvar/cache/prod/ContainerRRHX7xE/get_Console_Command_AssetsInstall_LazyService.php!=bRE5var/cache/prod/ContainerRRHX7xE/getToctreeService.php!=bKvar/cache/prod/ContainerRRHX7xE/getConsole_Command_SecretsRemoveService.php:!=b:yqLvar/cache/prod/ContainerRRHX7xE/getLoadProjectDescriptorFromCacheService.php!=bp*Lvar/cache/prod/ContainerRRHX7xE/get_Console_Command_YamlLint_LazyService.php!=ba@?var/cache/prod/ContainerRRHX7xE/getTopicNodeRendererService.php!=b2ڤ9var/cache/prod/ContainerRRHX7xE/getRenderGuideService.php!=be_2nCvar/cache/prod/ContainerRRHX7xE/getConsole_ErrorListenerService.php!=bStAvar/cache/prod/ContainerRRHX7xE/getCache_GlobalClearerService.php !=b nrROvar/cache/prod/ContainerRRHX7xE/get_Console_Command_SecretsList_LazyService.php!=by7var/cache/prod/ContainerRRHX7xE/getTransformService.php !=b FSTvar/cache/prod/ContainerRRHX7xE/getGuides_Renderer_Noderenderer_ParagraphService.php!=b]Svar/cache/prod/ContainerRRHX7xE/get_Console_Command_DebugAutowiring_LazyService.php!=b %ؤ>var/cache/prod/ContainerRRHX7xE/getParseFileHandlerService.phpl!=blTݤOvar/cache/prod/ContainerRRHX7xE/get_Console_Command_RouterDebug_LazyService.php!=bᡥ>var/cache/prod/ContainerRRHX7xE/getLoadCacheHandlerService.php!=beIvar/cache/prod/ContainerRRHX7xE/getConsole_Command_SecretsListService.php!=b.IRvar/cache/prod/ContainerRRHX7xE/getConsole_Command_EventDispatcherDebugService.php!=b*wIvar/cache/prod/ContainerRRHX7xE/getConsole_Command_RouterDebugService.php!=bLlHvar/cache/prod/ContainerRRHX7xE/getConsole_Command_CacheClearService.php!=b7Nvar/cache/prod/ContainerRRHX7xE/get_Console_Command_CacheClear_LazyService.php!=b/0Wvar/cache/prod/ContainerRRHX7xE/getGuides_Renderer_Noderenderer_Latex_AnchorService.php!=bQ▤Avar/cache/prod/ContainerRRHX7xE/getGarbageCollectCacheService.php!=bk=ȤKvar/cache/prod/ContainerRRHX7xE/getPhpdoc_Configuration_PipelineService.php!=b7Ovar/cache/prod/ContainerRRHX7xE/get_Console_Command_RouterMatch_LazyService.php!=bQOvar/cache/prod/ContainerRRHX7xE/get_Console_Command_ConfigDebug_LazyService.php!=bmAvar/cache/prod/ContainerRRHX7xE/getPersistCacheHandlerService.php!=b3var/cache/prod/ContainerRRHX7xE/getGraphService.php!=b BUvar/cache/prod/ContainerRRHX7xE/getGuides_Renderer_Noderenderer_Latex_ListService.php!=b'bȤ[var/cache/prod/ContainerRRHX7xE/get_Console_Command_SecretsEncryptFromLocal_LazyService.php(!=b(Y猤Bvar/cache/prod/ContainerRRHX7xE/getDocumentNodeRendererService.phpt!=bt)Avar/cache/prod/ContainerRRHX7xE/getStopwatchMiddlewareService.php9!=b9CWƤQvar/cache/prod/ContainerRRHX7xE/getGuides_Renderer_Noderenderer_FigureService.php!=b)!Evar/cache/prod/ContainerRRHX7xE/get_ServiceLocator_KfwZsneService.phpm!=bm9Fvar/cache/prod/ContainerRRHX7xE/getConsole_Command_YamlLintService.php!=bȌPvar/cache/prod/ContainerRRHX7xE/getGuides_Renderer_Noderenderer_QuoteService.php!=b#9var/cache/prod/ContainerRRHX7xE/getCacheWarmerService.php2!=b2]짤8var/cache/prod/ContainerRRHX7xE/getDispatcherService.php !=b ٦Lvar/cache/prod/ContainerRRHX7xE/getConsole_Command_ContainerDebugService.php!=bsOvar/cache/prod/ContainerRRHX7xE/getGuides_Renderer_Noderenderer_MetaService.php!=b9?Cvar/cache/prod/ContainerRRHX7xE/getParseDirectoryHandlerService.phpp!=bp}Nvar/cache/prod/ContainerRRHX7xE/get_Console_Command_SecretsSet_LazyService.php!=beLkOvar/cache/prod/ContainerRRHX7xE/get_Console_Command_DotenvDebug_LazyService.php!=b<Ivar/cache/prod/ContainerRRHX7xE/getConsole_Command_RouterMatchService.phpq!=bqrRvar/cache/prod/ContainerRRHX7xE/get_Console_Command_CachePoolClear_LazyService.php!=b:var/cache/prod/ContainerRRHX7xE/getCollectFilesService.php!=bzaiJvar/cache/prod/ContainerRRHX7xE/getTactician_Commandbus_DefaultService.php!=be?Kvar/cache/prod/ContainerRRHX7xE/getConsole_Command_AssetsInstallService.phpx!=bx (̤>var/cache/prod/ContainerRRHX7xE/getPlantumlRendererService.php!=bB>var/cache/prod/ContainerRRHX7xE/getSpanNodeRendererService.php!=bR>[ͤavar/cache/prod/ContainerRRHX7xE/getConsole_Command_PublicAlias_Tactician_Command_DebugService.php!=bRLvar/cache/prod/ContainerRRHX7xE/getConsole_Command_CachePoolClearService.phpc!=bc:/:var/cache/prod/ContainerRRHX7xE/getCache_SystemService.php. !=b. &q<Vvar/cache/prod/ContainerRRHX7xE/getGuides_Renderer_Noderenderer_Latex_QuoteService.php!=bXҬ2var/cache/prod/ContainerRRHX7xE/getTwigService.phpW!=bW[Evar/cache/prod/ContainerRRHX7xE/get_ServiceLocator_U47of_0Service.phpD!=bD1>var/cache/prod/ContainerRRHX7xE/getServicesResetterService.php !=b s@I'Xvar/cache/prod/ContainerRRHX7xE/get_Console_Command_EventDispatcherDebug_LazyService.php!=b >var/cache/prod/ContainerRRHX7xE/getContainerBuilderService.php!=b+֤8var/cache/prod/ContainerRRHX7xE/getRunCommandService.php!=b㚤>var/cache/prod/ContainerRRHX7xE/getFlySystemFactoryService.php!=bRYvar/cache/prod/ContainerRRHX7xE/getGuides_Renderer_Noderenderer_DefinitionlistService.php!=bP@var/cache/prod/ContainerRRHX7xE/getRedirectControllerService.phpu!=buG*Lvar/cache/prod/ContainerRRHX7xE/getConsole_Command_CachePoolPruneService.php!=b'Vvar/cache/prod/ContainerRRHX7xE/getGuides_Renderer_Noderenderer_Latex_ImageService.php!=b@M Gvar/cache/prod/ContainerRRHX7xE/getContainer_EnvVarProcessorService.phps!=bs|?var/cache/prod/ContainerRRHX7xE/getSpanNodeRenderer2Service.php!=bjG>var/cache/prod/ContainerRRHX7xE/getContainer_GetenvService.php!=b4Mvar/cache/prod/ContainerRRHX7xE/getConsole_Command_CachePoolDeleteService.phpy!=byw`Cvar/cache/prod/ContainerRRHX7xE/getPurgeCachesWhenForcedService.php3 !=b3 AXAvar/cache/prod/ContainerRRHX7xE/getListSettingsCommandService.php!=b?֤Ivar/cache/prod/ContainerRRHX7xE/get_Console_Command_About_LazyService.php!=b~Q}Ivar/cache/prod/ContainerRRHX7xE/getConsole_Command_ConfigDebugService.php!=b Bvar/cache/prod/ContainerRRHX7xE/getMarkupLanguageParserService.php!!=b!NuCvar/cache/prod/ContainerRRHX7xE/getContainerNodeRendererService.php!=b0LxWvar/cache/prod/ContainerRRHX7xE/get_Console_Command_ConfigDumpReference_LazyService.php!=b Avar/cache/prod/ContainerRRHX7xE/getSidebarNodeRendererService.php!=b8FCvar/cache/prod/ContainerRRHX7xE/getGuides_Renderer_LatexService.php@!=b@Kvar/cache/prod/ContainerRRHX7xE/get_Container_Private_FilesystemService.php!!=b!G?var/cache/prod/ContainerRRHX7xE/getTableNodeRendererService.phpp!=bprg=var/cache/prod/ContainerRRHX7xE/getLoaderInterfaceService.php)!=b)8^QSvar/cache/prod/ContainerRRHX7xE/getConsole_Command_SecretsDecryptToLocalService.php!=bդIvar/cache/prod/ContainerRRHX7xE/getInitializeBuilderFromConfigService.php!!=b!8var/cache/prod/ContainerRRHX7xE/getParseFilesService.php!=bD;ۤCvar/cache/prod/ContainerRRHX7xE/getPhpdoc_Cache_PipelineService.php!=bV7Fvar/cache/prod/ContainerRRHX7xE/getProjectDescriptorBuilderService.php !=b >var/cache/prod/ContainerRRHX7xE/getCache_AppClearerService.phpm!=bmB$Kvar/cache/prod/ContainerRRHX7xE/getStoreProjectDescriptorToCacheService.php!=bhWvar/cache/prod/ContainerRRHX7xE/getGuides_Renderer_Noderenderer_SectionbeginService.php!=blIBvar/cache/prod/ContainerRRHX7xE/getGuides_Renderer_HtmlService.php"!=b"7]@var/cache/prod/ContainerRRHX7xE/getEnvironmentFactoryService.php!=b~ĤUvar/cache/prod/ContainerRRHX7xE/getGuides_Renderer_Noderenderer_Latex_MetaService.php!=bѤUvar/cache/prod/ContainerRRHX7xE/getGuides_Renderer_Noderenderer_Latex_CodeService.php!=bQ5nIvar/cache/prod/ContainerRRHX7xE/getConsole_Command_CacheWarmupService.php!=bIzRvar/cache/prod/ContainerRRHX7xE/getGuides_Renderer_Noderenderer_LiteralService.php!=bF+"eDvar/cache/prod/ContainerRRHX7xE/getAdmonitionNodeRendererService.php!=b^ruOvar/cache/prod/ContainerRRHX7xE/getGuides_Renderer_Noderenderer_ListService.php!=bqѤOvar/cache/prod/ContainerRRHX7xE/getGuides_Renderer_Noderenderer_CodeService.php!=boؘ;var/cache/prod/ContainerRRHX7xE/getPathGeneratorService.php`!=b`0e%7var/cache/prod/ContainerRRHX7xE/getConfigureService.php!=b'<var/cache/prod/ContainerRRHX7xE/getMonolog_LoggerService.phpb!=bb2cvKvar/cache/prod/ContainerRRHX7xE/getConsole_Command_CachePoolListService.php!=bʯi@var/cache/prod/ContainerRRHX7xE/getTemplateControllerService.php!=bCvar/cache/prod/ContainerRRHX7xE/getConsole_Command_AboutService.php%!=b%Avar/cache/prod/ContainerRRHX7xE/getCache_SystemClearerService.php!=b(_d;var/cache/prod/ContainerRRHX7xE/getSecrets_VaultService.php!=bvEvar/cache/prod/ContainerRRHX7xE/get_ServiceLocator_KfbR3DYService.phpn!=bn^Uj6var/cache/prod/ContainerRRHX7xE/getResponseService.php!=b؀XHvar/cache/prod/ContainerRRHX7xE/getConsole_Command_SecretsSetService.php !=b X4var/cache/prod/ContainerRRHX7xE/getParserService.php!=bWڤCvar/cache/prod/ContainerRRHX7xE/getDocumentNodeRenderer2Service.phpz!=bzL+8var/cache/prod/ContainerRRHX7xE/getSourcecodeService.php!=bHwQvar/cache/prod/ContainerRRHX7xE/getGuides_Renderer_Noderenderer_AnchorService.php!=b8΂6var/cache/prod/ContainerRRHX7xE/getRendererService.php1!=b1SH?Cvar/cache/prod/ContainerRRHX7xE/getConsole_CommandLoaderService.phpo!=boE/=var/cache/prod/ContainerRRHX7xE/getTocNodeRendererService.phpd!=bd,EyMvar/cache/prod/ContainerRRHX7xE/get_Container_Private_CacheClearerService.phpC!=bC"~(Gvar/cache/prod/ContainerRRHX7xE/getPhpdoc_Transform_PipelineService.php!=bT!Rvar/cache/prod/ContainerRRHX7xE/get_Console_Command_ContainerDebug_LazyService.php!=bg7@var/cache/prod/ContainerRRHX7xE/getRouter_CacheWarmerService.php!=bU6;var/cache/prod/ContainerRRHX7xE/getRenderHandlerService.php!=b5var/cache/prod/ContainerRRHX7xE/getRouter2Service.php!=bZPvar/cache/prod/ContainerRRHX7xE/getConsole_Command_SecretsGenerateKeyService.phpb!=bb( r`3var/cache/prod/ContainerRRHX7xE/getImageService.php)!=b)YPvar/cache/prod/ContainerRRHX7xE/getGuides_Renderer_Noderenderer_ImageService.php!=bݤ:var/cache/prod/ContainerRRHX7xE/getPHPReferenceService.phpq!=bq#)Uvar/cache/prod/ContainerRRHX7xE/getGuides_Renderer_Noderenderer_SectionendService.php!=bD&>Yvar/cache/prod/ContainerRRHX7xE/get_Console_Command_SecretsDecryptToLocal_LazyService.php*!=b*7pQvar/cache/prod/ContainerRRHX7xE/get_Console_Command_CachePoolList_LazyService.php!=b)ӖEvar/cache/prod/ContainerRRHX7xE/phpDocumentor_KernelProdContainer.php!=b쓌,Ovar/cache/prod/ContainerRRHX7xE/getContainer_EnvVarProcessorsLocatorService.php !=b )ic@var/cache/prod/ContainerRRHX7xE/getTransformToPayloadService.php!=b2&=var/cache/prod/ContainerRRHX7xE/getErrorControllerService.php!=b1eFvar/cache/prod/ContainerRRHX7xE/getArgumentResolver_ServiceService.php !=b M~?var/cache/prod/ContainerRRHX7xE/getReferenceResolverService.phpY!=bY#,xBvar/cache/prod/ContainerRRHX7xE/getMonolog_Logger_CacheService.phpC!=bCr]EKvar/cache/prod/ContainerRRHX7xE/getConsole_Command_ContainerLintService.phpw!=bwgbRvar/cache/prod/ContainerRRHX7xE/get_Console_Command_CachePoolPrune_LazyService.php!=b ѤZvar/cache/prod/ContainerRRHX7xE/getGuides_Renderer_Noderenderer_Latex_SeparatorService.php!=bEvar/cache/prod/ContainerRRHX7xE/getProjectDescriptorMapperService.phpJ !=bJ (Ovar/cache/prod/ContainerRRHX7xE/get_Console_Command_CacheWarmup_LazyService.php!=bGLZvar/cache/prod/ContainerRRHX7xE/getGuides_Renderer_Noderenderer_Latex_ParagraphService.php!=b"aCvar/cache/prod/ContainerRRHX7xE/getTemplatedNodeRendererService.php!=b$Avar/cache/prod/ContainerRRHX7xE/getLoadGuidesFromCacheService.phpZ!=bZ)#Svar/cache/prod/ContainerRRHX7xE/get_Console_Command_CachePoolDelete_LazyService.php!=b|u@var/cache/prod/ContainerRRHX7xE/getStoreGuidesToCacheService.phpT!=bTФ>var/cache/prod/ContainerRRHX7xE/getTocNodeRenderer2Service.phpj!=bjo̼Qvar/cache/prod/ContainerRRHX7xE/get_Console_Command_ContainerLint_LazyService.php!=bVvar/cache/prod/ContainerRRHX7xE/get_Console_Command_SecretsGenerateKey_LazyService.php!=bJQ 4var/cache/prod/ContainerRRHX7xE/getFigureService.php!=bzQvar/cache/prod/ContainerRRHX7xE/get_Console_Command_SecretsRemove_LazyService.php!=bvmGvar/cache/prod/ContainerRRHX7xE/getDocumentTitleNodeRendererService.php!=bdBvar/cache/prod/ContainerRRHX7xE/getConfigBuilder_WarmerService.phpi!=bi5ju/var/cache/prod/ContainerRRHX7xE/removed-ids.php!=b e9var/cache/prod/ContainerRRHX7xE/getParseGuidesService.php!=b~ 5var/cache/prod/ContainerRRHX7xE/getCompileService.php !=b @Qvar/cache/prod/ContainerRRHX7xE/getConsole_Command_ConfigDumpReferenceService.php!=blCN+var/cache/prod/url_matching_routes.php.meta!=bԤ4var/cache/prod/phpDocumentor_KernelProdContainer.php#!=b# 1var/cache/prod/Symfony/Config/TacticianConfig.php!=bMEvar/cache/prod/Symfony/Config/Framework/Form/CsrfProtectionConfig.php~!=b~6[<var/cache/prod/Symfony/Config/Framework/ValidationConfig.phpT!=bTUߤ5var/cache/prod/Symfony/Config/Framework/UidConfig.phpv!=bv<Avar/cache/prod/Symfony/Config/Framework/Mailer/EnvelopeConfig.phpv!=bvt?var/cache/prod/Symfony/Config/Framework/Mailer/HeaderConfig.phpf!=bfc^;var/cache/prod/Symfony/Config/Framework/HttpCacheConfig.phpq!=bqI^<var/cache/prod/Symfony/Config/Framework/SerializerConfig.php!=bW:var/cache/prod/Symfony/Config/Framework/NotifierConfig.php!=byG5var/cache/prod/Symfony/Config/Framework/SsiConfig.phpp!=bpul9var/cache/prod/Symfony/Config/Framework/SessionConfig.php*!=b*<var/cache/prod/Symfony/Config/Framework/HttpClientConfig.php!=bFȤ7var/cache/prod/Symfony/Config/Framework/CacheConfig.php!=b;4ǤPvar/cache/prod/Symfony/Config/Framework/RateLimiter/LimiterConfig/RateConfig.php5!=b5Evar/cache/prod/Symfony/Config/Framework/RateLimiter/LimiterConfig.php!=b;var/cache/prod/Symfony/Config/Framework/FragmentsConfig.php!=b/&8var/cache/prod/Symfony/Config/Framework/AssetsConfig.php4!=b4-lL@var/cache/prod/Symfony/Config/Framework/CsrfProtectionConfig.phpz!=bzgJ6var/cache/prod/Symfony/Config/Framework/FormConfig.php !=b jKvar/cache/prod/Symfony/Config/Framework/HttpClient/DefaultOptionsConfig.php(0!=b(0_6Ivar/cache/prod/Symfony/Config/Framework/HttpClient/ScopedClientConfig.phpq=!=bq=_var/cache/prod/Symfony/Config/Framework/HttpClient/ScopedClientConfig/PeerFingerprintConfig.php2!=b2@<dvar/cache/prod/Symfony/Config/Framework/HttpClient/ScopedClientConfig/RetryFailed/HttpCodeConfig.phpe!=bel+[var/cache/prod/Symfony/Config/Framework/HttpClient/ScopedClientConfig/RetryFailedConfig.phpW!=bWe[var/cache/prod/Symfony/Config/Framework/HttpClient/DefaultOptions/PeerFingerprintConfig.php.!=b.n$`var/cache/prod/Symfony/Config/Framework/HttpClient/DefaultOptions/RetryFailed/HttpCodeConfig.phpa!=baLWvar/cache/prod/Symfony/Config/Framework/HttpClient/DefaultOptions/RetryFailedConfig.phpG!=bGs rVvar/cache/prod/Symfony/Config/Framework/Workflows/WorkflowsConfig/AuditTrailConfig.php!=b V8Qvar/cache/prod/Symfony/Config/Framework/Workflows/WorkflowsConfig/PlaceConfig.php^!=b^j8Vvar/cache/prod/Symfony/Config/Framework/Workflows/WorkflowsConfig/TransitionConfig.phpS !=bS `gtȤXvar/cache/prod/Symfony/Config/Framework/Workflows/WorkflowsConfig/MarkingStoreConfig.phpM!=bM(gWEvar/cache/prod/Symfony/Config/Framework/Workflows/WorkflowsConfig.php !=b P<var/cache/prod/Symfony/Config/Framework/ExceptionsConfig.php !=b Ӄ픤9var/cache/prod/Symfony/Config/Framework/WebLinkConfig.phpt!=bta6<8var/cache/prod/Symfony/Config/Framework/RouterConfig.php!=brrz=var/cache/prod/Symfony/Config/Framework/RateLimiterConfig.php!=b.ϤYvar/cache/prod/Symfony/Config/Framework/Messenger/TransportConfig/RetryStrategyConfig.php !=b l^u2Fvar/cache/prod/Symfony/Config/Framework/Messenger/SerializerConfig.php !=b yG?var/cache/prod/Symfony/Config/Framework/Messenger/BusConfig.php!=bYEvar/cache/prod/Symfony/Config/Framework/Messenger/TransportConfig.phpH!=bH29Cvar/cache/prod/Symfony/Config/Framework/Messenger/RoutingConfig.php!=bKLBXvar/cache/prod/Symfony/Config/Framework/Messenger/Serializer/SymfonySerializerConfig.php!=b_mPvar/cache/prod/Symfony/Config/Framework/Messenger/BusConfig/MiddlewareConfig.phpS!=bSSvar/cache/prod/Symfony/Config/Framework/Validation/NotCompromisedPasswordConfig.php!=bHvar/cache/prod/Symfony/Config/Framework/Validation/AutoMappingConfig.php!=b0*P&Dvar/cache/prod/Symfony/Config/Framework/Validation/MappingConfig.phpn!=bnRk@var/cache/prod/Symfony/Config/Framework/Assets/PackageConfig.php7!=b7ĜK05var/cache/prod/Symfony/Config/Framework/EsiConfig.phpp!=bpW>var/cache/prod/Symfony/Config/Framework/PropertyInfoConfig.phpy!=byx<var/cache/prod/Symfony/Config/Framework/Cache/PoolConfig.php:!=b:7Ivar/cache/prod/Symfony/Config/Framework/Notifier/AdminRecipientConfig.php*!=b*COvar/cache/prod/Symfony/Config/Framework/Translator/PseudoLocalizationConfig.php+!=b+ьFEvar/cache/prod/Symfony/Config/Framework/Translator/ProviderConfig.php$!=b$ Dvar/cache/prod/Symfony/Config/Framework/Serializer/MappingConfig.phpn!=bnpn=var/cache/prod/Symfony/Config/Framework/AnnotationsConfig.phpQ !=bQ <var/cache/prod/Symfony/Config/Framework/TranslatorConfig.php!=b9R"@var/cache/prod/Symfony/Config/Framework/PropertyAccessConfig.php)!=b)6+(9var/cache/prod/Symfony/Config/Framework/RequestConfig.phpV!=bVԩ8var/cache/prod/Symfony/Config/Framework/MailerConfig.phpG!=bG6var/cache/prod/Symfony/Config/Framework/LockConfig.phpg!=bgW:var/cache/prod/Symfony/Config/Framework/ProfilerConfig.php !=b ;var/cache/prod/Symfony/Config/Framework/PhpErrorsConfig.phpe!=be7`;var/cache/prod/Symfony/Config/Framework/WorkflowsConfig.php!=bؽ{Ԥ9var/cache/prod/Symfony/Config/Framework/SecretsConfig.php !=b ;var/cache/prod/Symfony/Config/Framework/MessengerConfig.php!=bˤ7var/cache/prod/Symfony/Config/Monolog/HandlerConfig.php!=bJ_TCvar/cache/prod/Symfony/Config/Monolog/HandlerConfig/MongoConfig.phpV!=bV9xKvar/cache/prod/Symfony/Config/Monolog/HandlerConfig/ElasticsearchConfig.php !=b uNvar/cache/prod/Symfony/Config/Monolog/HandlerConfig/ExcludedHttpCodeConfig.php3!=b3xCvar/cache/prod/Symfony/Config/Monolog/HandlerConfig/RedisConfig.php !=b %ڄFvar/cache/prod/Symfony/Config/Monolog/HandlerConfig/ChannelsConfig.phpS!=bS5 Gvar/cache/prod/Symfony/Config/Monolog/HandlerConfig/PublisherConfig.php !=b däLvar/cache/prod/Symfony/Config/Monolog/HandlerConfig/EmailPrototypeConfig.php.!=b.]YۤDvar/cache/prod/Symfony/Config/Monolog/HandlerConfig/PredisConfig.php!=bйMvar/cache/prod/Symfony/Config/Monolog/HandlerConfig/VerbosityLevelsConfig.php !=b (1var/cache/prod/Symfony/Config/FrameworkConfig.php!=btuӤ<var/cache/prod/Symfony/Config/Tactician/CommandbusConfig.php!=b s/var/cache/prod/Symfony/Config/MonologConfig.phpO !=bO y bin/phpdoc!=b> "\33[0m", 'red' => "\33[31m", 'green' => "\33[32m", 'yellow' => "\33[33m", 'title' => "\33[33m", 'error' => "\33[37;41m", 'success' => "\33[30;42m"); private $verbosity; private $supportColors; private $width; public function __construct($verbosity, $supportColors, $width = null) { if (null === $width) { $terminal = new \HumbugBox380\KevinGH\RequirementChecker\Terminal(); $width = \min($terminal->getWidth(), 80); } $this->verbosity = $verbosity; $this->supportColors = $supportColors; $this->width = $width; } public function getVerbosity() { return $this->verbosity; } public function setVerbosity($verbosity) { $this->verbosity = $verbosity; } public function title($title, $verbosity, $style = null) { if (null === $style) { $style = 'title'; } $this->printvln('', $verbosity, $style); $this->printvln($title, $verbosity, $style); $this->printvln(\str_repeat('=', \min(\strlen($title), $this->width)), $verbosity, $style); $this->printvln('', $verbosity, $style); } public function getRequirementErrorMessage(\HumbugBox380\KevinGH\RequirementChecker\Requirement $requirement) { if ($requirement->isFulfilled()) { return null; } $errorMessage = \wordwrap($requirement->getTestMessage(), $this->width - 3, \PHP_EOL . ' ') . \PHP_EOL; return $errorMessage; } public function block($title, $message, $verbosity, $style = null) { $prefix = ' [' . $title . '] '; $message = $prefix . \trim($message); $lines = array(); $remainingMessage = $message; while ($remainingMessage !== '') { $wrapped = \wordwrap($remainingMessage, $this->width - 3, '¬'); $exploded = \explode('¬', $wrapped); $line = $exploded[0]; $remainingMessage = \ltrim(\substr($remainingMessage, \strlen($line))); if ($remainingMessage !== '') { $remainingMessage = \str_repeat(' ', \strlen($prefix)) . $remainingMessage; } $lines[] = \str_pad($line, $this->width, ' ', \STR_PAD_RIGHT); } $this->printvln('', $verbosity); $this->printvln(\str_repeat(' ', $this->width), $verbosity, $style); foreach ($lines as $line) { $this->printvln($line, $verbosity, $style); } $this->printv(\str_repeat(' ', $this->width), $verbosity, $style); $this->printvln('', $verbosity); } public function printvln($message, $verbosity, $style = null) { $this->printv($message, $verbosity, $style); $this->printv(\PHP_EOL, $verbosity, null); } public function printv($message, $verbosity, $style = null) { if ($verbosity > $this->verbosity) { return; } $message = \wordwrap($message, $this->width); $message = \sprintf('%s%s%s', $this->supportColors && isset($this->styles[$style]) ? $this->styles[$style] : '', $message, $this->supportColors ? $this->styles['reset'] : ''); echo $message; } } checkIsFulfilled = $checkIsFulfilled; $this->testMessage = $testMessage; $this->helpText = $helpText; } public function isFulfilled() { if (null === $this->fulfilled) { $this->fulfilled = $this->checkIsFulfilled->__invoke(); } return (bool) $this->fulfilled; } public function getIsFullfilledChecker() { return $this->checkIsFulfilled; } public function getTestMessage() { return $this->testMessage; } public function getHelpText() { return $this->helpText; } } options = \implode(' ', $_SERVER['argv']); $shellVerbosity = $this->configureVerbosity(); $this->interactive = $this->checkInteractivity($shellVerbosity); $this->colorSupport = $this->checkColorSupport(); } public function isInteractive() { return $this->interactive; } public function getVerbosity() { return $this->verbosity; } public function hasColorSupport() { return $this->colorSupport; } public function hasParameter($values) { $values = (array) $values; foreach ($values as $value) { $regexp = \sprintf('/\\s%s\\b/', \str_replace(' ', '\\s+', \preg_quote($value, '/'))); if (1 === \preg_match($regexp, $this->options)) { return \true; } } return \false; } private function checkInteractivity($shellVerbosity) { if (-1 === $shellVerbosity) { return \false; } if (\true === $this->hasParameter(array('--no-interaction', '-n'))) { return \false; } if (\function_exists('posix_isatty') && !@\posix_isatty(\STDOUT) && \false === \getenv('SHELL_INTERACTIVE')) { return \false; } return \true; } private function configureVerbosity() { switch ($shellVerbosity = (int) \getenv('SHELL_VERBOSITY')) { case -1: $this->verbosity = self::VERBOSITY_QUIET; break; case 1: $this->verbosity = self::VERBOSITY_VERBOSE; break; case 2: $this->verbosity = self::VERBOSITY_VERY_VERBOSE; break; case 3: $this->verbosity = self::VERBOSITY_DEBUG; break; default: $shellVerbosity = 0; break; } if ($this->hasParameter(array('--quiet', '-q'))) { $this->verbosity = self::VERBOSITY_QUIET; $shellVerbosity = -1; } elseif ($this->hasParameter(array('-vvv', '--verbose=3', '--verbose 3'))) { $this->verbosity = self::VERBOSITY_DEBUG; $shellVerbosity = 3; } elseif ($this->hasParameter(array('-vv', '--verbose=2', '--verbose 2'))) { $this->verbosity = self::VERBOSITY_VERY_VERBOSE; $shellVerbosity = 2; } elseif ($this->hasParameter(array('-v', '--verbose=1', '--verbose 1', '--verbose'))) { $this->verbosity = self::VERBOSITY_VERBOSE; $shellVerbosity = 1; } return $shellVerbosity; } /** @symfony */ private function checkColorSupport() { if ($this->hasParameter(array('--ansi'))) { return \true; } if ($this->hasParameter(array('--no-ansi'))) { return \false; } if (\DIRECTORY_SEPARATOR === '\\') { return \function_exists('sapi_windows_vt100_support') && \sapi_windows_vt100_support(\STDOUT) || \false !== \getenv('ANSICON') || 'ON' === \getenv('ConEmuANSI') || 'xterm' === \getenv('TERM'); } if (\function_exists('stream_isatty')) { return \stream_isatty(\STDOUT); } if (\function_exists('posix_isatty')) { return \posix_isatty(\STDOUT); } $stat = \fstat(\STDOUT); return $stat ? 020000 === ($stat['mode'] & 0170000) : \false; } } requiredExtension = $requiredExtension; } public function __invoke() { return \extension_loaded($this->requiredExtension); } } requiredPhpVersion = $requiredPhpVersion; } public function __invoke() { return \HumbugBox380\Composer\Semver\Semver::satisfies(\sprintf('%d.%d.%d', \PHP_MAJOR_VERSION, \PHP_MINOR_VERSION, \PHP_RELEASE_VERSION), $this->requiredPhpVersion); } } array('pipe', 'w'), 2 => array('pipe', 'w')); $process = \proc_open($command, $descriptorspec, $pipes, null, null, array('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; } } requirements); } public function count() { return \count($this->requirements); } public function add(\HumbugBox380\KevinGH\RequirementChecker\Requirement $requirement) { $this->requirements[] = $requirement; } public function addRequirement($checkIsFulfilled, $testMessage, $helpText) { $this->add(new \HumbugBox380\KevinGH\RequirementChecker\Requirement($checkIsFulfilled, $testMessage, $helpText)); } public function getRequirements() { return $this->requirements; } public function getPhpIniPath() { return \get_cfg_var('cfg_file_path'); } public function evaluateRequirements() { return \array_reduce($this->requirements, function ($checkPassed, \HumbugBox380\KevinGH\RequirementChecker\Requirement $requirement) { return $checkPassed && $requirement->isFulfilled(); }, \true); } } evaluateRequirements(); $io = new \HumbugBox380\KevinGH\RequirementChecker\IO(); self::printCheck($checkPassed, new \HumbugBox380\KevinGH\RequirementChecker\Printer($io->getVerbosity(), $io->hasColorSupport()), $requirements); return $checkPassed; } public static function printCheck($checkPassed, \HumbugBox380\KevinGH\RequirementChecker\Printer $printer, \HumbugBox380\KevinGH\RequirementChecker\RequirementCollection $requirements) { if (\false === $checkPassed && \HumbugBox380\KevinGH\RequirementChecker\IO::VERBOSITY_VERY_VERBOSE > $printer->getVerbosity()) { $printer->setVerbosity(\HumbugBox380\KevinGH\RequirementChecker\IO::VERBOSITY_VERY_VERBOSE); } $verbosity = \HumbugBox380\KevinGH\RequirementChecker\IO::VERBOSITY_VERY_VERBOSE; $iniPath = $requirements->getPhpIniPath(); $printer->title('Box Requirements Checker', $verbosity); $printer->printv('> Using PHP ', $verbosity); $printer->printvln(\PHP_VERSION, $verbosity, 'green'); $printer->printvln('> PHP is using the following php.ini file:', $verbosity); if ($iniPath) { $printer->printvln(' ' . $iniPath, $verbosity, 'green'); } else { $printer->printvln(' WARNING: No configuration file (php.ini) used by PHP!', $verbosity, 'yellow'); } $printer->printvln('', $verbosity); if (\count($requirements) > 0) { $printer->printvln('> Checking Box requirements:', $verbosity); $printer->printv(' ', $verbosity); } else { $printer->printvln('> No requirements found.', $verbosity); } $errorMessages = array(); foreach ($requirements->getRequirements() as $requirement) { if ($errorMessage = $printer->getRequirementErrorMessage($requirement)) { if (\HumbugBox380\KevinGH\RequirementChecker\IO::VERBOSITY_DEBUG === $printer->getVerbosity()) { $printer->printvln('✘ ' . $requirement->getTestMessage(), \HumbugBox380\KevinGH\RequirementChecker\IO::VERBOSITY_DEBUG, 'red'); $printer->printv(' ', \HumbugBox380\KevinGH\RequirementChecker\IO::VERBOSITY_DEBUG); $errorMessages[] = $errorMessage; } else { $printer->printv('E', $verbosity, 'red'); $errorMessages[] = $errorMessage; } continue; } if (\HumbugBox380\KevinGH\RequirementChecker\IO::VERBOSITY_DEBUG === $printer->getVerbosity()) { $printer->printvln('✔ ' . $requirement->getHelpText(), \HumbugBox380\KevinGH\RequirementChecker\IO::VERBOSITY_DEBUG, 'green'); $printer->printv(' ', \HumbugBox380\KevinGH\RequirementChecker\IO::VERBOSITY_DEBUG); } else { $printer->printv('.', $verbosity, 'green'); } } if (\HumbugBox380\KevinGH\RequirementChecker\IO::VERBOSITY_DEBUG !== $printer->getVerbosity() && \count($requirements) > 0) { $printer->printvln('', $verbosity); } if ($requirements->evaluateRequirements()) { $printer->block('OK', 'Your system is ready to run the application.', $verbosity, 'success'); } else { $printer->block('ERROR', 'Your system is not ready to run the application.', $verbosity, 'error'); $printer->title('Fix the following mandatory requirements:', $verbosity, 'red'); foreach ($errorMessages as $errorMessage) { $printer->printv(' * ' . $errorMessage, $verbosity); } } $printer->printvln('', $verbosity); } private static function retrieveRequirements() { if (null === self::$requirementsConfig) { self::$requirementsConfig = __DIR__ . '/../.requirements.php'; } $config = (require self::$requirementsConfig); $requirements = new \HumbugBox380\KevinGH\RequirementChecker\RequirementCollection(); foreach ($config as $constraint) { $requirements->addRequirement('php' === $constraint['type'] ? new \HumbugBox380\KevinGH\RequirementChecker\IsPhpVersionFulfilled($constraint['condition']) : new \HumbugBox380\KevinGH\RequirementChecker\IsExtensionFulfilled($constraint['condition']), $constraint['message'], $constraint['helpMessage']); } return $requirements; } } array ( 'type' => 'php', 'condition' => '^7.4.0||^8.0', 'message' => 'The application requires the version "^7.4.0||^8.0" or greater.', 'helpMessage' => 'The application requires the version "^7.4.0||^8.0" or greater.', ), 1 => array ( 'type' => 'extension', 'condition' => 'hash', 'message' => 'The application requires the extension "hash". Enable it or install a polyfill.', 'helpMessage' => 'The application requires the extension "hash".', ), 2 => array ( 'type' => 'extension', 'condition' => 'iconv', 'message' => 'The application requires the extension "iconv". Enable it or install a polyfill.', 'helpMessage' => 'The application requires the extension "iconv".', ), 3 => array ( 'type' => 'extension', 'condition' => 'json', 'message' => 'The application requires the extension "json". Enable it or install a polyfill.', 'helpMessage' => 'The application requires the extension "json".', ), 4 => array ( 'type' => 'extension', 'condition' => 'json', 'message' => 'The package "league/uri" requires the extension "json". Enable it or install a polyfill.', 'helpMessage' => 'The package "league/uri" requires the extension "json".', ), 5 => array ( 'type' => 'extension', 'condition' => 'json', 'message' => 'The package "league/uri-interfaces" requires the extension "json". Enable it or install a polyfill.', 'helpMessage' => 'The package "league/uri-interfaces" requires the extension "json".', ), 6 => array ( 'type' => 'extension', 'condition' => 'simplexml', 'message' => 'The application requires the extension "simplexml". Enable it or install a polyfill.', 'helpMessage' => 'The application requires the extension "simplexml".', ), 7 => array ( 'type' => 'extension', 'condition' => 'xml', 'message' => 'The application requires the extension "xml". Enable it or install a polyfill.', 'helpMessage' => 'The application requires the extension "xml".', ), 8 => array ( 'type' => 'extension', 'condition' => 'xml', 'message' => 'The package "symfony/framework-bundle" requires the extension "xml". Enable it or install a polyfill.', 'helpMessage' => 'The package "symfony/framework-bundle" requires the extension "xml".', ), 9 => array ( 'type' => 'extension', 'condition' => 'fileinfo', 'message' => 'The package "league/flysystem" requires the extension "fileinfo". Enable it or install a polyfill.', 'helpMessage' => 'The package "league/flysystem" requires the extension "fileinfo".', ), 10 => array ( 'type' => 'extension', 'condition' => 'fileinfo', 'message' => 'The package "league/mime-type-detection" requires the extension "fileinfo". Enable it or install a polyfill.', 'helpMessage' => 'The package "league/mime-type-detection" requires the extension "fileinfo".', ), 11 => array ( 'type' => 'extension', 'condition' => 'tokenizer', 'message' => 'The package "nikic/php-parser" requires the extension "tokenizer". Enable it or install a polyfill.', 'helpMessage' => 'The package "nikic/php-parser" requires the extension "tokenizer".', ), 12 => array ( 'type' => 'extension', 'condition' => 'filter', 'message' => 'The package "phpdocumentor/reflection-docblock" requires the extension "filter". Enable it or install a polyfill.', 'helpMessage' => 'The package "phpdocumentor/reflection-docblock" requires the extension "filter".', ), );expandStability($matches[$index]) . (!empty($matches[$index + 1]) ? \ltrim($matches[$index + 1], '.-') : ''); } if (!empty($matches[$index + 2])) { $version .= '-dev'; } return $version; } if (\preg_match('{(.*?)[.-]?dev$}i', $version, $match)) { try { return $this->normalizeBranch($match[1]); } catch (\Exception $e) { } } $extraMessage = ''; if (\preg_match('{ +as +' . \preg_quote($version) . '$}', $fullVersion)) { $extraMessage = ' in "' . $fullVersion . '", the alias must be an exact version'; } elseif (\preg_match('{^' . \preg_quote($version) . ' +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 "' . $version . '"' . $extraMessage); } public function parseNumericAliasPrefix($branch) { if (\preg_match('{^(?P(\\d++\\.)*\\d++)(?:\\.x)?-dev$}i', $branch, $matches)) { return $matches['version'] . '.'; } return \false; } public function normalizeBranch($name) { $name = \trim($name); if (\in_array($name, array('master', 'trunk', 'default'))) { return $this->normalize($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; } public function parseConstraints($constraints) { $prettyConstraint = $constraints; if (\preg_match('{^([^,\\s]*?)@(' . \implode('|', self::$stabilities) . ')$}i', $constraints, $match)) { $constraints = empty($match[1]) ? '*' : $match[1]; } if (\preg_match('{^(dev-[^,\\s@]+?|[^,\\s@]+?\\.x-dev)#.+$}i', $constraints, $match)) { $constraints = $match[1]; } $orConstraints = \preg_split('{\\s*\\|\\|?\\s*}', \trim($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 \HumbugBox380\Composer\Semver\Constraint\MultiConstraint($constraintObjects); } $orGroups[] = $constraint; } if (1 === \count($orGroups)) { $constraint = $orGroups[0]; } elseif (2 === \count($orGroups) && $orGroups[0] instanceof \HumbugBox380\Composer\Semver\Constraint\MultiConstraint && $orGroups[1] instanceof \HumbugBox380\Composer\Semver\Constraint\MultiConstraint && 2 === \count($orGroups[0]->getConstraints()) && 2 === \count($orGroups[1]->getConstraints()) && ($a = (string) $orGroups[0]) && \substr($a, 0, 3) === '[>=' && \false !== ($posA = \strpos($a, '<', 4)) && ($b = (string) $orGroups[1]) && \substr($b, 0, 3) === '[>=' && \false !== ($posB = \strpos($b, '<', 4)) && \substr($a, $posA + 2, -1) === \substr($b, 4, $posB - 5)) { $constraint = new \HumbugBox380\Composer\Semver\Constraint\MultiConstraint(array(new \HumbugBox380\Composer\Semver\Constraint\Constraint('>=', \substr($a, 4, $posA - 5)), new \HumbugBox380\Composer\Semver\Constraint\Constraint('<', \substr($b, $posB + 2, -1)))); } else { $constraint = new \HumbugBox380\Composer\Semver\Constraint\MultiConstraint($orGroups, \false); } $constraint->setPrettyString($prettyConstraint); return $constraint; } private function parseConstraint($constraint) { if (\preg_match('{^([^,\\s]+?)@(' . \implode('|', self::$stabilities) . ')$}i', $constraint, $match)) { $constraint = $match[1]; if ($match[2] !== 'stable') { $stabilityModifier = $match[2]; } } if (\preg_match('{^v?[xX*](\\.[xX*])*$}i', $constraint)) { return array(new \HumbugBox380\Composer\Semver\Constraint\EmptyConstraint()); } $versionRegex = 'v?(\\d++)(?:\\.(\\d++))?(?:\\.(\\d++))?(?:\\.(\\d++))?' . self::$modifierRegex . '(?:\\+[^\\s]+)?'; if (\preg_match('{^~>?' . $versionRegex . '$}i', $constraint, $matches)) { if (\substr($constraint, 0, 2) === '~>') { throw new \UnexpectedValueException('Could not parse version constraint ' . $constraint . ': ' . 'Invalid operator "~>", you probably meant to use the "~" operator'); } 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; } $stabilitySuffix = ''; if (empty($matches[5]) && empty($matches[7])) { $stabilitySuffix .= '-dev'; } $lowVersion = $this->normalize(\substr($constraint . $stabilitySuffix, 1)); $lowerBound = new \HumbugBox380\Composer\Semver\Constraint\Constraint('>=', $lowVersion); $highPosition = \max(1, $position - 1); $highVersion = $this->manipulateVersionString($matches, $highPosition, 1) . '-dev'; $upperBound = new \HumbugBox380\Composer\Semver\Constraint\Constraint('<', $highVersion); return array($lowerBound, $upperBound); } if (\preg_match('{^\\^' . $versionRegex . '($)}i', $constraint, $matches)) { 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; } $stabilitySuffix = ''; if (empty($matches[5]) && empty($matches[7])) { $stabilitySuffix .= '-dev'; } $lowVersion = $this->normalize(\substr($constraint . $stabilitySuffix, 1)); $lowerBound = new \HumbugBox380\Composer\Semver\Constraint\Constraint('>=', $lowVersion); $highVersion = $this->manipulateVersionString($matches, $position, 1) . '-dev'; $upperBound = new \HumbugBox380\Composer\Semver\Constraint\Constraint('<', $highVersion); return array($lowerBound, $upperBound); } 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 \HumbugBox380\Composer\Semver\Constraint\Constraint('<', $highVersion)); } return array(new \HumbugBox380\Composer\Semver\Constraint\Constraint('>=', $lowVersion), new \HumbugBox380\Composer\Semver\Constraint\Constraint('<', $highVersion)); } if (\preg_match('{^(?P' . $versionRegex . ') +- +(?P' . $versionRegex . ')($)}i', $constraint, $matches)) { $lowStabilitySuffix = ''; if (empty($matches[6]) && empty($matches[8])) { $lowStabilitySuffix = '-dev'; } $lowVersion = $this->normalize($matches['from']); $lowerBound = new \HumbugBox380\Composer\Semver\Constraint\Constraint('>=', $lowVersion . $lowStabilitySuffix); $empty = function ($x) { return $x === 0 || $x === '0' ? \false : empty($x); }; if (!$empty($matches[11]) && !$empty($matches[12]) || !empty($matches[14]) || !empty($matches[16])) { $highVersion = $this->normalize($matches['to']); $upperBound = new \HumbugBox380\Composer\Semver\Constraint\Constraint('<=', $highVersion); } else { $highMatch = array('', $matches[10], $matches[11], $matches[12], $matches[13]); $highVersion = $this->manipulateVersionString($highMatch, $empty($matches[11]) ? 1 : 2, 1) . '-dev'; $upperBound = new \HumbugBox380\Composer\Semver\Constraint\Constraint('<', $highVersion); } return array($lowerBound, $upperBound); } if (\preg_match('{^(<>|!=|>=?|<=?|==?)?\\s*(.*)}', $constraint, $matches)) { try { $version = $this->normalize($matches[2]); if (!empty($stabilityModifier) && $this->parseStability($version) === 'stable') { $version .= '-' . $stabilityModifier; } elseif ('<' === $matches[1] || '>=' === $matches[1]) { if (!\preg_match('/-' . self::$modifierRegex . '$/', \strtolower($matches[2]))) { if (\substr($matches[2], 0, 4) !== 'dev-') { $version .= '-dev'; } } } return array(new \HumbugBox380\Composer\Semver\Constraint\Constraint($matches[1] ?: '=', $version)); } catch (\Exception $e) { } } $message = 'Could not parse version constraint ' . $constraint; if (isset($e)) { $message .= ': ' . $e->getMessage(); } throw new \UnexpectedValueException($message); } private function manipulateVersionString($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] < 0) { $matches[$i] = $pad; --$position; if ($i === 1) { return; } } } } return $matches[1] . '.' . $matches[2] . '.' . $matches[3] . '.' . $matches[4]; } 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; } } } normalize($version)); $constraints = $versionParser->parseConstraints($constraints); return $constraints->matches($provider); } public static function satisfiedBy(array $versions, $constraints) { $versions = \array_filter($versions, function ($version) use($constraints) { return \HumbugBox380\Composer\Semver\Semver::satisfies($version, $constraints); }); return \array_values($versions); } public static function sort(array $versions) { return self::usort($versions, self::SORT_ASC); } public static function rsort(array $versions) { return self::usort($versions, self::SORT_DESC); } private static function usort(array $versions, $direction) { if (null === self::$versionParser) { self::$versionParser = new \HumbugBox380\Composer\Semver\VersionParser(); } $versionParser = self::$versionParser; $normalized = array(); foreach ($versions as $key => $version) { $normalized[] = array($versionParser->normalize($version), $key); } \usort($normalized, function (array $left, array $right) use($direction) { if ($left[0] === $right[0]) { return 0; } if (\HumbugBox380\Composer\Semver\Comparator::lessThan($left[0], $right[0])) { return -$direction; } return $direction; }); $sorted = array(); foreach ($normalized as $item) { $sorted[] = $versions[$item[1]]; } return $sorted; } } ', $version2); } public static function greaterThanOrEqualTo($version1, $version2) { return self::compare($version1, '>=', $version2); } public static function lessThan($version1, $version2) { return self::compare($version1, '<', $version2); } public static function lessThanOrEqualTo($version1, $version2) { return self::compare($version1, '<=', $version2); } public static function equalTo($version1, $version2) { return self::compare($version1, '==', $version2); } public static function notEqualTo($version1, $version2) { return self::compare($version1, '!=', $version2); } public static function compare($version1, $operator, $version2) { $constraint = new \HumbugBox380\Composer\Semver\Constraint\Constraint($operator, $version2); return $constraint->matches(new \HumbugBox380\Composer\Semver\Constraint\Constraint('==', $version1)); } } self::OP_EQ, '==' => self::OP_EQ, '<' => self::OP_LT, '<=' => self::OP_LE, '>' => self::OP_GT, '>=' => self::OP_GE, '<>' => self::OP_NE, '!=' => self::OP_NE); private static $transOpInt = array(self::OP_EQ => '==', self::OP_LT => '<', self::OP_LE => '<=', self::OP_GT => '>', self::OP_GE => '>=', self::OP_NE => '!='); protected $operator; protected $version; protected $prettyString; public function matches(\HumbugBox380\Composer\Semver\Constraint\ConstraintInterface $provider) { if ($provider instanceof $this) { return $this->matchSpecific($provider); } return $provider->matches($this); } public function setPrettyString($prettyString) { $this->prettyString = $prettyString; } public function getPrettyString() { if ($this->prettyString) { return $this->prettyString; } return $this->__toString(); } public static function getSupportedOperators() { return \array_keys(self::$transOpStr); } 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; } 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 = 'dev-' === \substr($a, 0, 4); $bIsBranch = 'dev-' === \substr($b, 0, 4); if ($aIsBranch && $bIsBranch) { return $operator === '==' && $a === $b; } if (!$compareBranches && ($aIsBranch || $bIsBranch)) { return \false; } return \version_compare($a, $b, $operator); } public function matchSpecific(\HumbugBox380\Composer\Semver\Constraint\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; if ($isNonEqualOp || $isProviderNonEqualOp) { return !$isEqualOp && !$isProviderEqualOp || $this->versionCompare($provider->version, $this->version, '!=', $compareBranches); } if ($this->operator !== self::OP_EQ && $noEqualOp === $providerNoEqualOp) { return \true; } if ($this->versionCompare($provider->version, $this->version, self::$transOpInt[$this->operator], $compareBranches)) { if ($provider->version === $this->version && self::$transOpInt[$provider->operator] === $providerNoEqualOp && self::$transOpInt[$this->operator] !== $noEqualOp) { return \false; } return \true; } return \false; } public function __toString() { return self::$transOpInt[$this->operator] . ' ' . $this->version; } } matchSpecific($provider); } return $provider->matches($this); } public function setPrettyString($prettyString) { $this->prettyString = $prettyString; } public function getPrettyString() { if ($this->prettyString) { return $this->prettyString; } return $this->__toString(); } } constraints = $constraints; $this->conjunctive = $conjunctive; } public function getConstraints() { return $this->constraints; } public function isConjunctive() { return $this->conjunctive; } public function isDisjunctive() { return !$this->conjunctive; } public function matches(\HumbugBox380\Composer\Semver\Constraint\ConstraintInterface $provider) { if (\false === $this->conjunctive) { foreach ($this->constraints as $constraint) { if ($constraint->matches($provider)) { return \true; } } return \false; } foreach ($this->constraints as $constraint) { if (!$constraint->matches($provider)) { return \false; } } return \true; } public function setPrettyString($prettyString) { $this->prettyString = $prettyString; } public function getPrettyString() { if ($this->prettyString) { return $this->prettyString; } return $this->__toString(); } public function __toString() { $constraints = array(); foreach ($this->constraints as $constraint) { $constraints[] = (string) $constraint; } return '[' . \implode($this->conjunctive ? ' ' : ' || ', $constraints) . ']'; } } prettyString = $prettyString; } public function getPrettyString() { if ($this->prettyString) { return $this->prettyString; } return $this->__toString(); } public function __toString() { return '[]'; } } array($baseDir . '/src'), 'HumbugBox380\\Composer\\Semver\\' => array($vendorDir . '/composer/semver/src'), ); = 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); if ($useStaticLoader) { require_once __DIR__ . '/autoload_static.php'; call_user_func(\Composer\Autoload\ComposerStaticInit0d96cc2add98eaac9c2cac2d900e67fe::getInitializer($loader)); } else { $classMap = require __DIR__ . '/autoload_classmap.php'; if ($classMap) { $loader->addClassMap($classMap); } } $loader->setClassMapAuthoritative(true); $loader->register(true); return $loader; } } * 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 http://www.php-fig.org/psr/psr-0/ * @see http://www.php-fig.org/psr/psr-4/ */ class ClassLoader { // PSR-4 private $prefixLengthsPsr4 = array(); private $prefixDirsPsr4 = array(); private $fallbackDirsPsr4 = array(); // PSR-0 private $prefixesPsr0 = array(); private $fallbackDirsPsr0 = array(); private $useIncludePath = false; private $classMap = array(); private $classMapAuthoritative = false; private $missingClasses = array(); private $apcuPrefix; public function getPrefixes() { if (!empty($this->prefixesPsr0)) { return call_user_func_array('array_merge', $this->prefixesPsr0); } return array(); } public function getPrefixesPsr4() { return $this->prefixDirsPsr4; } public function getFallbackDirs() { return $this->fallbackDirsPsr0; } public function getFallbackDirsPsr4() { return $this->fallbackDirsPsr4; } public function getClassMap() { return $this->classMap; } /** * @param array $classMap Class to filename map */ 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 array|string $paths The PSR-0 root directories * @param bool $prepend Whether to prepend the directories */ 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 array|string $paths The PSR-4 base directories * @param bool $prepend Whether to prepend the directories * * @throws \InvalidArgumentException */ 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 array|string $paths The PSR-0 base directories */ 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 array|string $paths The PSR-4 base directories * * @throws \InvalidArgumentException */ 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 */ 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 */ 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 */ 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 */ public function register($prepend = false) { spl_autoload_register(array($this, 'loadClass'), true, $prepend); } /** * Unregisters this instance as an autoloader. */ public function unregister() { spl_autoload_unregister(array($this, 'loadClass')); } /** * Loads the given class or interface. * * @param string $class The name of the class * @return bool|null True if loaded, null otherwise */ public function loadClass($class) { if ($file = $this->findFile($class)) { includeFile($file); return true; } } /** * 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; } 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; } } /** * Scope isolated include. * * Prevents access to $this/self from included files. */ function includeFile($file) { include $file; } $vendorDir . '/composer/semver/src/Comparator.php', 'HumbugBox380\\Composer\\Semver\\Constraint\\AbstractConstraint' => $vendorDir . '/composer/semver/src/Constraint/AbstractConstraint.php', 'HumbugBox380\\Composer\\Semver\\Constraint\\Constraint' => $vendorDir . '/composer/semver/src/Constraint/Constraint.php', 'HumbugBox380\\Composer\\Semver\\Constraint\\ConstraintInterface' => $vendorDir . '/composer/semver/src/Constraint/ConstraintInterface.php', 'HumbugBox380\\Composer\\Semver\\Constraint\\EmptyConstraint' => $vendorDir . '/composer/semver/src/Constraint/EmptyConstraint.php', 'HumbugBox380\\Composer\\Semver\\Constraint\\MultiConstraint' => $vendorDir . '/composer/semver/src/Constraint/MultiConstraint.php', 'HumbugBox380\\Composer\\Semver\\Semver' => $vendorDir . '/composer/semver/src/Semver.php', 'HumbugBox380\\Composer\\Semver\\VersionParser' => $vendorDir . '/composer/semver/src/VersionParser.php', 'HumbugBox380\\KevinGH\\RequirementChecker\\Checker' => $baseDir . '/src/Checker.php', 'HumbugBox380\\KevinGH\\RequirementChecker\\IO' => $baseDir . '/src/IO.php', 'HumbugBox380\\KevinGH\\RequirementChecker\\IsExtensionFulfilled' => $baseDir . '/src/IsExtensionFulfilled.php', 'HumbugBox380\\KevinGH\\RequirementChecker\\IsFulfilled' => $baseDir . '/src/IsFulfilled.php', 'HumbugBox380\\KevinGH\\RequirementChecker\\IsPhpVersionFulfilled' => $baseDir . '/src/IsPhpVersionFulfilled.php', 'HumbugBox380\\KevinGH\\RequirementChecker\\Printer' => $baseDir . '/src/Printer.php', 'HumbugBox380\\KevinGH\\RequirementChecker\\Requirement' => $baseDir . '/src/Requirement.php', 'HumbugBox380\\KevinGH\\RequirementChecker\\RequirementCollection' => $baseDir . '/src/RequirementCollection.php', 'HumbugBox380\\KevinGH\\RequirementChecker\\Terminal' => $baseDir . '/src/Terminal.php', ); array ( 'HumbugBox380\\KevinGH\\RequirementChecker\\' => 40, 'HumbugBox380\\Composer\\Semver\\' => 29, ), ); public static $prefixDirsPsr4 = array ( 'HumbugBox380\\KevinGH\\RequirementChecker\\' => array ( 0 => __DIR__ . '/../..' . '/src', ), 'HumbugBox380\\Composer\\Semver\\' => array ( 0 => __DIR__ . '/..' . '/composer/semver/src', ), ); public static $classMap = array ( 'HumbugBox380\\Composer\\Semver\\Comparator' => __DIR__ . '/..' . '/composer/semver/src/Comparator.php', 'HumbugBox380\\Composer\\Semver\\Constraint\\AbstractConstraint' => __DIR__ . '/..' . '/composer/semver/src/Constraint/AbstractConstraint.php', 'HumbugBox380\\Composer\\Semver\\Constraint\\Constraint' => __DIR__ . '/..' . '/composer/semver/src/Constraint/Constraint.php', 'HumbugBox380\\Composer\\Semver\\Constraint\\ConstraintInterface' => __DIR__ . '/..' . '/composer/semver/src/Constraint/ConstraintInterface.php', 'HumbugBox380\\Composer\\Semver\\Constraint\\EmptyConstraint' => __DIR__ . '/..' . '/composer/semver/src/Constraint/EmptyConstraint.php', 'HumbugBox380\\Composer\\Semver\\Constraint\\MultiConstraint' => __DIR__ . '/..' . '/composer/semver/src/Constraint/MultiConstraint.php', 'HumbugBox380\\Composer\\Semver\\Semver' => __DIR__ . '/..' . '/composer/semver/src/Semver.php', 'HumbugBox380\\Composer\\Semver\\VersionParser' => __DIR__ . '/..' . '/composer/semver/src/VersionParser.php', 'HumbugBox380\\KevinGH\\RequirementChecker\\Checker' => __DIR__ . '/../..' . '/src/Checker.php', 'HumbugBox380\\KevinGH\\RequirementChecker\\IO' => __DIR__ . '/../..' . '/src/IO.php', 'HumbugBox380\\KevinGH\\RequirementChecker\\IsExtensionFulfilled' => __DIR__ . '/../..' . '/src/IsExtensionFulfilled.php', 'HumbugBox380\\KevinGH\\RequirementChecker\\IsFulfilled' => __DIR__ . '/../..' . '/src/IsFulfilled.php', 'HumbugBox380\\KevinGH\\RequirementChecker\\IsPhpVersionFulfilled' => __DIR__ . '/../..' . '/src/IsPhpVersionFulfilled.php', 'HumbugBox380\\KevinGH\\RequirementChecker\\Printer' => __DIR__ . '/../..' . '/src/Printer.php', 'HumbugBox380\\KevinGH\\RequirementChecker\\Requirement' => __DIR__ . '/../..' . '/src/Requirement.php', 'HumbugBox380\\KevinGH\\RequirementChecker\\RequirementCollection' => __DIR__ . '/../..' . '/src/RequirementCollection.php', 'HumbugBox380\\KevinGH\\RequirementChecker\\Terminal' => __DIR__ . '/../..' . '/src/Terminal.php', ); public static function getInitializer(ClassLoader $loader) { return \Closure::bind(function () use ($loader) { $loader->prefixLengthsPsr4 = ComposerStaticInit0d96cc2add98eaac9c2cac2d900e67fe::$prefixLengthsPsr4; $loader->prefixDirsPsr4 = ComposerStaticInit0d96cc2add98eaac9c2cac2d900e67fe::$prefixDirsPsr4; $loader->classMap = ComposerStaticInit0d96cc2add98eaac9c2cac2d900e67fe::$classMap; }, null, ClassLoader::class); } } servicesWithCustomSettings = $servicesWithCustomSettings; } protected function execute(InputInterface $input, OutputInterface $output): int { $output->writeln('The following settings are supported using --setting or -s.'); $output->writeln(''); $output->writeln('Settings:'); foreach ($this->servicesWithCustomSettings as $servicesWithCustomSetting) { foreach ($servicesWithCustomSetting->getDefaultSettings() as $setting => $default) { $output->writeln( sprintf(' %s [default: %s]', $setting, var_export($default, true)) ); } } $output->writeln(''); return 0; } } projectDescriptorBuilder = $projectDescriptorBuilder; $this->pipeline = $pipeline; $this->eventDispatcher = $eventDispatcher; } protected function configure(): void { $this->setName('project:run') ->setAliases(['run']) ->setDescription( 'Parses and transforms the given files to a specified location' ) ->setHelp( <<$ phpdoc run -d [directory to parse] -t [output directory] This will parse every file ending with .php in and then output a HTML site containing easily readable documentation in . phpDocumentor will try to look for a phpdoc.dist.xml or phpdoc.xml file in your current working directory and use that to override the default settings if present. In the configuration file can you specify the same settings (and more) as the command line provides. Other commands In addition to this command phpDocumentor also supports additional commands: Available commands: help list run project project:run You can get a more detailed listing of the commands using the list command and get help by prepending the word help to the command name. HELP ) ->addOption( 'target', 't', InputOption::VALUE_OPTIONAL, 'Path where to store the generated output' ) ->addOption( 'cache-folder', null, InputOption::VALUE_OPTIONAL, 'Path where to store the cache files' ) ->addOption( 'filename', 'f', InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY, 'File to parse, glob patterns are supported. Provide multiple options of this type to add multiple files.' ) ->addOption( 'directory', 'd', InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY, 'directory to parse, glob patterns are supported. Provide multiple options of this type to add multiple directories.' ) ->addOption( 'encoding', null, InputOption::VALUE_OPTIONAL, 'encoding to be used to interpret source files with' ) ->addOption( 'extensions', null, InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY, 'Provide multiple options of this type to add multiple extensions. default is php' ) ->addOption( 'ignore', 'i', InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY, 'File(s) and directories (relative to the source-code directory) that will be ' . 'ignored. Glob patterns are supported. Add multiple options of this type of add more ignore patterns' ) ->addOption( 'ignore-tags', null, InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY, 'Tag that will be ignored, defaults to none. package, subpackage and ignore ' . 'may not be ignored. Add multiple options of this type to ignore multiple tags.' ) ->addOption( 'hidden', null, InputOption::VALUE_NONE, 'Use this option to tell phpDocumentor to parse files and directories that begin with a period (.), ' . 'by default these are ignored' ) ->addOption( 'ignore-symlinks', null, InputOption::VALUE_NONE, 'Ignore symlinks to other files or directories, default is on' ) ->addOption( 'markers', 'm', InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY, 'Comma-separated list of markers/tags to filter' ) ->addOption( 'title', null, InputOption::VALUE_OPTIONAL, 'Sets the title for this project; default is the phpDocumentor logo' ) ->addOption( 'force', null, InputOption::VALUE_NONE, 'Forces a full build of the documentation, does not increment existing documentation' ) ->addOption( 'validate', null, InputOption::VALUE_NONE, 'Validates every processed file using PHP Lint, costs a lot of performance' ) ->addOption( 'visibility', null, InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY, 'Specifies the parse visibility that should be displayed in the documentation. Add multiple options of this type to specify multiple levels.' . '("public,protected")' ) ->addOption( 'defaultpackagename', null, InputOption::VALUE_OPTIONAL, 'Name to use for the default package.' ) ->addOption( 'sourcecode', null, InputOption::VALUE_NONE, 'Whether to include syntax highlighted source code' ) ->addOption( 'template', null, InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY, 'Name of the template to use (optional)' ) ->addOption( 'examples-dir', null, InputOption::VALUE_OPTIONAL, 'Directory to seacher for example files referenced by @example tags' ) ->addOption( 'setting', 's', InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY, 'Provide custom setting(s) as "key=value", run again with --list-settings for a list' ) ->addOption( 'list-settings', null, InputOption::VALUE_NONE, 'Returns a list of available settings' ) ->addOption( 'parseprivate', null, InputOption::VALUE_NONE, 'Whether to parse DocBlocks marked with @internal tag' ); parent::configure(); } protected function execute(InputInterface $input, OutputInterface $output): int { $stopwatch = new Stopwatch(); $event = $stopwatch->start('all'); $output->writeln('phpDocumentor ' . $this->getApplication()->getVersion()); $output->writeln(''); if ($input->getOption('list-settings')) { return ($this->getApplication()->find('settings:list')) ->run(new ArrayInput([]), $output); } $this->observeProgressToShowProgressBars($output); $pipeLine = $this->pipeline; $pipeLine($input->getOptions()); if ($output->getVerbosity() === OutputInterface::VERBOSITY_DEBUG) { file_put_contents('ast.dump', serialize($this->projectDescriptorBuilder->getProjectDescriptor())); } $event->stop(); $output->writeln(''); if ($output->getVerbosity() === OutputInterface::VERBOSITY_VERBOSE) { $output->writeln(sprintf('Observed max. memory usage: %s mb', round($event->getMemory() / 1024 / 1024, 2))); } $output->writeln(sprintf('All done in %s!', $this->durationInText($event))); return 0; } private function observeProgressToShowProgressBars(OutputInterface $output): void { if ($output->getVerbosity() !== OutputInterface::VERBOSITY_NORMAL) { return; } $dispatcherInstance = Dispatcher::getInstance(); $dispatcherInstance->addListener( 'parser.pre', function (PreParsingEvent $event) use ($output): void { $output->writeln('Parsing files'); $this->progressBar = new ProgressBar($output, $event->getFileCount()); } ); $dispatcherInstance->addListener( 'parser.file.pre', function (): void { $this->progressBar->advance(); } ); $dispatcherInstance->addListener( Transformer::EVENT_PRE_TRANSFORM, function (PreTransformEvent $event) use ($output): void { $output->writeln(''); $output->writeln('Applying transformations (can take a while)'); $this->transformerProgressBar = new ProgressBar( $output, count($event->getTransformations()) ); } ); $this->eventDispatcher->addListener( Transformer::EVENT_POST_TRANSFORMATION, function (): void { $this->transformerProgressBar->advance(); } ); } private function durationInText(StopwatchEvent $event): string { $durationText = ''; $duration = round($event->getDuration() / 1000); if ($duration > 59) { $minutes = floor($duration / 60); $durationText .= sprintf('%s minute%s ', $minutes, $minutes > 1 ? 's' : ''); } $durationText .= ($duration % 60) . ' seconds'; return $durationText; } } setName('phpDocumentor'); $this->setVersion($this->detectVersion()); } protected function getCommandName(InputInterface $input): ?string { try { if ($input->getFirstArgument() !== null) { $this->find($input->getFirstArgument()); return $input->getFirstArgument(); } } catch (CommandNotFoundException $e) { } return 'project:run'; } protected function getDefaultInputDefinition(): InputDefinition { $inputDefinition = parent::getDefaultInputDefinition(); $inputDefinition->addOption( new InputOption( 'config', 'c', InputOption::VALUE_OPTIONAL, 'Location of a custom configuration file' ) ); $inputDefinition->addOption( new InputOption('log', null, InputOption::VALUE_OPTIONAL, 'Log file to write to') ); return $inputDefinition; } public function getLongVersion(): string { return sprintf('%s %s', $this->getName(), $this->getVersion()); } private function detectVersion(): string { $version = self::VERSION; if (sprintf('%s%s%s', '@', 'package_version', '@') === self::VERSION) { $version = trim(file_get_contents(__DIR__ . '/../../../VERSION')); try { $version = PrettyVersions::getRootPackageVersion()->getPrettyVersion(); $version = sprintf('v%s', ltrim($version, 'v')); } catch (OutOfBoundsException $e) { } } return $version; } } metas = $metas; $this->renderer = $renderer; $this->router = $router; $this->urlGenerator = $urlGenerator; } public function handle(RenderCommand $command): void { $origin = $command->getOrigin(); $destinationPath = $command->getDestinationPath(); $environment = $this->createEnvironment($destinationPath, $origin, $command->getTargetFileFormat()); $this->render($command->getDocumentationSet(), $environment, $command->getDestination()); } private function render( GuideSetDescriptor $documentationSet, RenderContext $environment, FilesystemInterface $destination ): void { foreach ($documentationSet->getDocuments() as $descriptor) { $destinationPath = str_replace( '//', '/', $documentationSet->getOutputLocation() . '/' . $this->router->generate($descriptor) ); $renderedOutput = $this->renderDocument( $descriptor, $destinationPath, $environment, $documentationSet ); $destination->put($destinationPath, $renderedOutput); } } private function renderDocument( DocumentDescriptor $descriptor, string $destinationPath, RenderContext $environment, GuideSetDescriptor $documentationSet ): string { $document = $descriptor->getDocumentNode(); $environment->setCurrentFileName($descriptor->getFile()); $sourcePath = $documentationSet->getSource()->paths()[0]; $environment->setCurrentAbsolutePath($sourcePath . '/' . dirname($descriptor->getFile())); foreach ($descriptor->getLinks() as $link => $url) { $environment->setLink($link, $url); } foreach ($descriptor->getVariables() as $key => $value) { $environment->setVariable($key, $value); } $this->renderer->setGuidesEnvironment($environment); $this->renderer->setDestination($destinationPath); return $this->renderer->renderDocument($document, $environment); } private function createEnvironment( string $outputFolder, FilesystemInterface $origin, string $outputFormat ): RenderContext { return new RenderContext( $outputFolder, $origin, $this->metas, $this->urlGenerator, $outputFormat ); } } metas = $metas; $this->guideSetDescriptor = $guideSetDescriptor; $this->logger = $logger; } public function __invoke(PostParseDocument $event): void { $this->addDocumentToDocumentationSet($event->getFileName(), $event->getDocumentNode()); } private function addDocumentToDocumentationSet( string $file, DocumentNode $document ): void { $metaEntry = $this->metas->get($file); if ($metaEntry instanceof Entry === false) { $this->logger->error(sprintf('Could not find meta entry for %s, parsing may have failed', $file)); return; } $this->guideSetDescriptor->addDocument( $file, new DocumentDescriptor( $document, $document->getHash(), $file, $document->getTitle() ? $document->getTitle()->getValueString() : '', $document->getTitles(), $document->getTocs(), $document->getDependencies(), $metaEntry->getLinks(), $document->getVariables() ) ); } } router = $router; } public function supports(CrossReferenceNode $node, RenderContext $context): bool { return $node->getDomain() === 'php'; } public function resolve(CrossReferenceNode $node, RenderContext $context): ?ResolvedReference { $fqsen = ltrim($node->getUrl(), '\\'); $url = $this->router->generate(new Fqsen('\\' . $fqsen)); return new ResolvedReference( $context->getCurrentFileName(), $node->getUrl(), $url, [], ['title' => $node->getUrl()] ); } } destination = $destination; $this->documentationSet = $documentationSet; $this->origin = $origin; } public function getDocumentationSet(): GuideSetDescriptor { return $this->documentationSet; } public function getOrigin(): FilesystemInterface { return $this->origin; } public function getDestination(): FilesystemInterface { return $this->destination; } public function getDestinationPath(): string { return $this->documentationSet->getOutputLocation(); } public function getTargetFileFormat(): string { return $this->documentationSet->getOutputFormat(); } } add($stage); } return $builder->build(); } } transformer = $transformer; $this->logger = $logger; $this->templateFactory = $templateFactory; $this->flySystemFactory = $flySystemFactory; $this->connectOutputToEvents(); } public function __invoke(Payload $payload): Payload { $configuration = $payload->getConfig(); $templates = $this->templateFactory->getTemplates( $configuration['phpdocumentor']['templates'], $this->createFileSystem($configuration['phpdocumentor']['paths']['output']) ); $project = $payload->getBuilder()->getProjectDescriptor(); $transformations = $templates->getTransformations(); $preTransformEvent = PreTransformEvent::createInstance($this); $preTransformEvent->setProject($project); $preTransformEvent->setTransformations($transformations); Dispatcher::getInstance()->dispatch( $preTransformEvent, Transformer::EVENT_PRE_TRANSFORM ); $this->transformer->execute( $project, $transformations ); $postTransformEvent = PostTransformEvent::createInstance($this); $postTransformEvent->setProject($project); $postTransformEvent->setTransformations($transformations); Dispatcher::getInstance()->dispatch($postTransformEvent, Transformer::EVENT_POST_TRANSFORM); return $payload; } private function connectOutputToEvents(): void { $dispatcherInstance = Dispatcher::getInstance(); $dispatcherInstance->addListener( Transformer::EVENT_PRE_TRANSFORM, function (PreTransformEvent $event): void { $transformations = $event->getTransformations(); $this->logger->info(sprintf("\nApplying %d transformations", count($transformations))); } ); $dispatcherInstance->addListener( Transformer::EVENT_PRE_INITIALIZATION, function (WriterInitializationEvent $event): void { if (!($event->getWriter() instanceof WriterAbstract)) { return; } $this->logger->info(' Initialize writer "' . get_class($event->getWriter()) . '"'); } ); $dispatcherInstance->addListener( Transformer::EVENT_PRE_TRANSFORMATION, function (PreTransformationEvent $event): void { $this->logger->info( ' Execute transformation using writer "' . $event->getTransformation()->getWriter() . '"' ); } ); } private function createFileSystem(Dsn $dsn): FilesystemInterface { $target = $dsn->getPath(); $fileSystem = new Filesystem(); if (!$fileSystem->isAbsolutePath((string) $target)) { $target = getcwd() . DIRECTORY_SEPARATOR . $target; } $destination = $this->flySystemFactory->create(Dsn::createFromString((string) $target)); $this->transformer->setTarget((string) $target); $this->transformer->setDestination($destination); return $destination; } } configFactory = $configFactory; $this->configuration = $configuration; $this->logger = $logger; $this->locator = $locator; $this->environmentFactory = $environmentFactory; } public function __invoke(array $options): array { $this->configFactory->addMiddleware( new CommandlineOptionsMiddleware($options, $this->configFactory, getcwd()) ); $this->configFactory->addMiddleware(new PathNormalizingMiddleware()); $this->configFactory->addMiddleware(new ProvideTemplateOverridePathMiddleware($this->environmentFactory)); $this->loadConfigurationFile($options['config'] ?? ''); $this->locator->providePath($this->configuration['phpdocumentor']['paths']['cache']); $this->logger->info(sprintf('Logging to: %s', (string) $this->locator->locate())); return $this->configuration->getArrayCopy(); } private function loadConfigurationFile(string $path): void { if ($path === '') { $this->logger->notice('Using the configuration file at the default location'); $this->configuration->exchangeArray($this->configFactory->fromDefaultLocations()->getArrayCopy()); return; } if ($path === 'none') { $this->logger->notice('Not using any configuration file, relying on application defaults'); $this->configuration->exchangeArray( $this->configFactory->fromDefault()->getArrayCopy() ); return; } $uri = realpath($path); if ($uri === false) { throw new InvalidArgumentException( sprintf('The configuration file in path "%s" can not be found or read', $path) ); } $this->logger->notice(sprintf('Using the configuration file at: %s', $path)); $this->configuration->exchangeArray( $this->configFactory->fromUri(UriFactory::createUri($uri))->getArrayCopy() ); } } compiler = $compiler; } public function __invoke(Payload $payload): Payload { foreach ($this->compiler as $pass) { $pass->execute($payload->getBuilder()->getProjectDescriptor()); } return $payload; } } descriptorBuilder = $descriptorBuilder; } public function __invoke(array $configuration): Payload { return new Payload($configuration, $this->descriptorBuilder); } } config = $config; $this->builder = $builder; } public function getConfig(): array { return $this->config; } public function getBuilder(): ProjectDescriptorBuilder { return $this->builder; } } descriptorMapper = $descriptorMapper; } public function __invoke(Payload $payload): Payload { $this->descriptorMapper->garbageCollect($payload->getFiles()); return $payload; } } logger = $logger; $this->commandBus = $commandBus; } public function __invoke(Payload $payload): Payload { $configuration = $payload->getConfig(); if (($configuration['phpdocumentor']['settings']['guides.enabled'] ?? false) === true) { $useCache = $configuration['phpdocumentor']['use-cache']; if ($useCache && !$payload->getBuilder()->getProjectDescriptor()->getSettings()->isModified()) { $this->logger->info('Loading project from cache'); $cacheFolder = $configuration['phpdocumentor']['paths']['cache']; $this->commandBus->handle( new LoadCacheCommand( ((string) $cacheFolder) . '/guides', $useCache ) ); } } return $payload; } } descriptorMapper = $descriptorMapper; $this->logger = $logger; } public function __invoke(Payload $payload): Payload { $configuration = $payload->getConfig(); if ( $configuration['phpdocumentor']['use-cache'] && !$payload->getBuilder()->getProjectDescriptor()->getSettings()->isModified() ) { $this->log('Loading project from cache'); $this->descriptorMapper->populate($payload->getBuilder()->getProjectDescriptor()); } return $payload; } private function log(string $message, string $priority = LogLevel::INFO, array $parameters = []): void { $this->logger->log($priority, $message, $parameters); } } commandBus = $commandBus; $this->logger = $logger; } public function __invoke(Payload $payload): Payload { $configuration = $payload->getConfig(); if (($configuration['phpdocumentor']['settings']['guides.enabled'] ?? false) === true) { $this->logger->info('Storing cache .. '); $this->commandBus->handle( new PersistCacheCommand( ((string) $configuration['phpdocumentor']['paths']['cache']) . '/guides', $configuration['phpdocumentor']['use-cache'] ) ); $this->logger->info('OK'); } return $payload; } } descriptorMapper = $descriptorMapper; $this->logger = $logger; } public function __invoke(Payload $payload): Payload { $projectDescriptor = $payload->getBuilder()->getProjectDescriptor(); $this->log('Storing cache .. ', LogLevel::NOTICE); $projectDescriptor->getSettings()->clearModifiedFlag(); $this->descriptorMapper->save($projectDescriptor); $this->log('OK'); return $payload; } private function log(string $message, string $priority = LogLevel::INFO, array $parameters = []): void { $this->logger->log($priority, $message, $parameters); } } filesCache = $filesCache; $this->descriptorsCache = $descriptorsCache; $this->logger = $logger; } public function __invoke(Payload $payload): Payload { $this->logger->info('Checking whether to purge cache'); if ( !$payload->getConfig()['phpdocumentor']['use-cache'] || $payload->getBuilder()->getProjectDescriptor()->getSettings()->isModified() ) { $this->logger->info('Purging cache'); $this->filesCache->clear(); $this->descriptorsCache->clear(); } return $payload; } } partials = $partials; } public function __invoke(Payload $payload): Payload { $configuration = $payload->getConfig(); $builder = $payload->getBuilder(); $builder->createProjectDescriptor(); $builder->setName($configuration['phpdocumentor']['title'] ?? ''); $builder->setPartials($this->partials); $builder->setCustomSettings($configuration['phpdocumentor']['settings'] ?? []); foreach ($configuration['phpdocumentor']['versions'] as $version) { $builder->addVersion( $this->buildVersion( $version ) ); } return $payload; } private function buildVersion(VersionSpecification $version): VersionDescriptor { $collection = Collection::fromClassString(DocumentationSetDescriptor::class); foreach ($version->getGuides() as $guide) { $collection->add( new GuideSetDescriptor(md5($guide['output']), $guide['source'], $guide['output'], $guide['format']) ); } foreach ($version->getApi() as $apiSpecification) { $collection->add( new ApiSetDescriptor( md5($apiSpecification['output']), $apiSpecification['source'], $apiSpecification['output'], $apiSpecification ) ); } return new VersionDescriptor( $version->getNumber(), $collection ); } } commandBus = $commandBus; $this->logger = $logger; $this->flySystemFactory = $flySystemFactory; $this->eventDispatcher = $eventDispatcher; $this->metas = $metas; } public function __invoke(Payload $payload): Payload { if (($payload->getConfig()['phpdocumentor']['settings']['guides.enabled'] ?? false) !== true) { return $payload; } $version = $payload->getBuilder()->getProjectDescriptor()->getVersions()->get(0); $guideDocumentationSet = null; foreach ($version->getDocumentationSets() as $set) { if ($set instanceof GuideSetDescriptor) { $guideDocumentationSet = $set; break; } } if ($guideDocumentationSet === null) { return $payload; } $this->log('Parsing guides', LogLevel::NOTICE); $dsn = $guideDocumentationSet->getSource()->dsn(); $origin = $this->flySystemFactory->create($dsn); $sourcePath = (string) ($guideDocumentationSet->getSource()->paths()[0] ?? ''); $listener = new DocumentCollector( $this->metas, $guideDocumentationSet, $this->logger ); $this->eventDispatcher->addListener(PostParseDocument::class, $listener); $this->commandBus->handle( new ParseDirectoryCommand($origin, $sourcePath, $guideDocumentationSet->getInputFormat()) ); $this->eventDispatcher->removeListener(PostParseDocument::class, $listener); return $payload; } private function log(string $message, string $priority = LogLevel::INFO, array $parameters = []): void { $this->logger->log($priority, $message, $parameters); } } parser = $parser; $this->logger = $logger; $this->reEncodingMiddleware = $reEncodingMiddleware; } public function __invoke(Payload $payload): Payload { $apiConfig = current($payload->getApiConfigs()); $builder = $payload->getBuilder(); $builder->setApiSpecification($apiConfig); $builder->setVisibility($apiConfig->calculateVisiblity()); $this->reEncodingMiddleware->withEncoding($apiConfig['encoding']); $this->parser->setMarkers($apiConfig['markers']); $this->parser->setValidate($apiConfig['validate']); $this->parser->setDefaultPackageName($apiConfig['default-package-name']); $this->log('Parsing files', LogLevel::NOTICE); $project = $this->parser->parse($payload->getFiles()); $payload->getBuilder()->createApiDocumentationSet($project); return $payload; } private function log(string $message, string $priority = LogLevel::INFO, array $parameters = []): void { $this->logger->log($priority, $message, $parameters); } } files = $files; } public function getApiConfigs(): array { $version = current($this->getConfig()['phpdocumentor']['versions']); return $version->getApi(); } public function withFiles(array $files): Payload { return new self( $this->getConfig(), $this->getBuilder(), array_merge($this->getFiles(), $files) ); } public function getFiles(): array { return $this->files; } } getConfig(), $payload->getBuilder()); } } fileCollector = $fileCollector; $this->logger = $logger; } public function __invoke(Payload $payload): Payload { foreach ($payload->getApiConfigs() as $apiConfig) { $this->log('Collecting files from ' . $apiConfig->source()->dsn()); $files = $this->fileCollector->getFiles( $apiConfig->source()->dsn(), $apiConfig->source()->globPatterns(), $apiConfig['ignore'], $apiConfig['extensions'] ); $payload = $payload->withFiles($files); } $this->log('OK'); if (count($payload->getFiles()) === 0) { $this->log('Your project seems to be empty!', LogLevel::WARNING); $this->log('Where are the files??!!!', LogLevel::DEBUG); } return $payload; } private function log(string $message, string $priority = LogLevel::INFO, array $parameters = []): void { $this->logger->log($priority, $message, $parameters); } } getProjectDir() . '/var/cache/' . $this->environment; } public function getLogDir(): string { if ($this->isPhar()) { return '/tmp/php-doc/log'; } return $this->getProjectDir() . '/var/log'; } public function getProjectDir() { return parent::getProjectDir(); } public function registerBundles(): iterable { $contents = require $this->getProjectDir() . '/config/bundles.php'; foreach ($contents as $class => $envs) { if (isset($envs['all']) === false && isset($envs[$this->environment]) === false) { continue; } yield new $class(); } } public function build(ContainerBuilder $container): void { $container->addCompilerPass(new ReflectionProjectFactoryStrategyPass()); } protected function configureContainer(ContainerBuilder $c, LoaderInterface $loader): void { $c->setParameter('container.autowiring.strict_mode', true); $c->setParameter('container.dumper.inline_class_loader', true); $confDir = $this->getProjectDir() . '/config'; $loader->load($confDir . '/packages/*' . self::CONFIG_EXTS, 'glob'); if (is_dir($confDir . '/packages/' . $this->environment)) { $loader->load($confDir . '/packages/' . $this->environment . '/**/*' . self::CONFIG_EXTS, 'glob'); } $loader->load($confDir . '/services' . self::CONFIG_EXTS, 'glob'); $loader->load($confDir . '/services_' . $this->environment . self::CONFIG_EXTS, 'glob'); } protected function configureRoutes(RouteCollectionBuilder $routes): void { $confDir = $this->getProjectDir() . '/config'; if (is_dir($confDir . '/routes/')) { $routes->import($confDir . '/routes/*' . self::CONFIG_EXTS, '/', 'glob'); } if (is_dir($confDir . '/routes/' . $this->environment)) { $routes->import($confDir . '/routes/' . $this->environment . '/**/*' . self::CONFIG_EXTS, '/', 'glob'); } $routes->import($confDir . '/routes' . self::CONFIG_EXTS, '/', 'glob'); } public static function isPhar(): bool { return strlen(Phar::running()) > 0; } } subject = $subject; } public function getSubject(): object { return $this->subject; } abstract public static function createInstance(object $subject): self; } dsn = $dsn; $this->parameters = $parameters; $this->uri = $uri; } public static function createFromString(string $dsn): self { $parameters = explode(';', $dsn); $uri = UriFactory::createUri(array_shift($parameters)); $parsedParameters = self::parseParameters($parameters); array_splice($parameters, 0, 0, (string) $uri); $dsn = implode(';', $parameters); return new self($uri, $parsedParameters, $dsn); } public static function createFromUri(UriInterface $uri, array $parameters = []): self { $dsn = implode(';', [(string) $uri] + $parameters); return new self($uri, $parameters, $dsn); } public function __toString(): string { if ($this->getScheme() === 'phar' && $this->isWindowsLocalPath()) { return 'phar://' . $this->getPath(); } return $this->dsn; } public function getScheme(): ?string { return $this->uri->getScheme(); } public function getHost(): string { return $this->uri->getHost() ?? ''; } public function getPort(): ?int { $port = $this->uri->getPort(); if ($port !== null) { return $port; } switch ($this->uri->getScheme()) { case 'http': case 'git+http': return 80; case 'https': case 'git+https': return 443; default: return null; } } public function getUsername(): string { return explode(':', $this->uri->getUserInfo() ?? '')[0]; } public function getPassword(): string { return explode(':', $this->uri->getUserInfo() ?? '')[1] ?? ''; } public function getPath(): Path { if ($this->isWindowsLocalPath()) { return new Path(ltrim($this->uri->getPath(), '/')); } return new Path($this->uri->getPath() ?: '/'); } public function isWindowsLocalPath(): bool { $path = ltrim($this->uri->getPath(), '/'); return preg_match(UriFactory::WINDOWS_URI_FORMAT, $path) === 1; } public function getQuery(): array { $result = []; parse_str($this->uri->getQuery() ?? '', $result); return $result; } public function getParameters(): array { return $this->parameters; } public function resolve(Dsn $baseDsn): self { if (UriInfo::isAbsolute($this->uri) || UriInfo::isAbsolutePath($this->uri)) { return $this; } $baseUri = rtrim(((string) $baseDsn->uri), '/'); $newUri = UriFactory::createUri($baseUri . '/' . $this->uri->getPath()); return self::createFromUri( UriResolver::resolve($newUri, $baseDsn->uri), $baseDsn->parameters ); } public function withPath(Path $path): self { $pathString = (string) $path; if (strpos($pathString, '/') !== 0) { $pathString = '/' . $pathString; } return self::createFromUri($this->uri->withPath($pathString), $this->parameters); } private static function parseParameters(array $parameters): array { $result = []; foreach ($parameters as $parameter) { foreach (self::parseParameter($parameter) as $key => $value) { $result[$key] = $value; } } return $result; } private static function parseParameter(string $part): Generator { $result = []; parse_str($part, $result); yield from $result; } } getDefinition(ProjectFactoryStrategies::class); foreach ($container->findTaggedServiceIds('phpdoc.reflection.strategy') as $id => $tags) { $priotities = array_column($tags, 'priority'); if (empty($priotities)) { $strategies->addMethodCall( 'addStrategy', [ new Reference($id), ProjectFactoryStrategies::DEFAULT_PRIORITY, ] ); continue; } foreach ($priotities as $priotity) { $strategies->addMethodCall( 'addStrategy', [ new Reference($id), $priotity ?? ProjectFactoryStrategies::DEFAULT_PRIORITY, ] ); } } } } defineIniSettings(); } private function defineIniSettings(): void { $this->setTimezone(); ini_set('memory_limit', '-1'); if ( extension_loaded('Zend OPcache') && ini_get('opcache.enable') && ini_get('opcache.enable_cli') && ini_get('opcache.save_comments') === '0' ) { throw new RuntimeException('Please enable opcache.save_comments in php.ini.'); } if (extension_loaded('Zend Optimizer+') && ini_get('zend_optimizerplus.save_comments') === '0') { throw new RuntimeException('Please enable zend_optimizerplus.save_comments in php.ini.'); } } private function setTimezone(): void { if (ini_get('date.timezone') !== false) { return; } date_default_timezone_set('UTC'); } } template = $template; $this->query = $query; $this->writer = $writer; $this->source = $source; $this->artifact = $artifact; } public function getQuery(): string { return $this->query; } public function getWriter(): string { return $this->writer; } public function getSource(): string { return $this->source; } public function template(): Template { return $this->template; } public function getArtifact(): string { return $this->artifact; } public function setParameters(array $parameters): void { $this->parameters = $parameters; } public function getParameters(): array { return $this->parameters; } public function getParameter(string $name): ?Parameter { foreach ($this->parameters as $parameter) { if ($parameter->key() === $name) { return $parameter; } } return null; } public function getParametersWithKey(string $name): array { $parameters = []; foreach ($this->parameters as $parameter) { if ($parameter->key() !== $name) { continue; } $parameters[] = $parameter; } return $parameters; } public function setTransformer(Transformer $transformer): void { $this->transformer = $transformer; } public function getTransformer(): ?Transformer { return $this->transformer; } } name = $name; $this->files = $files; } public function getName(): string { return $this->name; } public function setAuthor(string $author): void { $this->author = $author; } public function getAuthor(): string { return $this->author; } public function setCopyright(string $copyright): void { $this->copyright = $copyright; } public function getCopyright(): string { return $this->copyright; } public function setVersion(string $version): void { if (!preg_match('/^\d+\.\d+\.\d+$/', $version)) { throw new InvalidArgumentException( 'Version number is invalid; ' . $version . ' does not match ' . 'x.x.x (where x is a number)' ); } $this->version = $version; } public function files(): MountManager { return $this->files; } public function getVersion(): string { return $this->version; } public function setDescription(string $description): void { $this->description = $description; } public function getDescription(): string { return $this->description; } public function offsetSet($offset, $value): void { if (!$value instanceof Transformation) { throw new InvalidArgumentException( '\phpDocumentor\Transformer\Template may only contain items of ' . 'type \phpDocumentor\Transformer\Transformation' ); } $this->transformations[$offset] = $value; } public function offsetGet($offset): Transformation { return $this->transformations[$offset]; } public function offsetUnset($offset): void { unset($this->transformations[$offset]); } public function offsetExists($offset): bool { return isset($this->transformations[$offset]); } public function count(): int { return count($this->transformations); } public function getParameters(): array { return $this->parameters; } public function setParameter($key, Parameter $value): void { $this->parameters[$key] = $value; } public function propagateParameters(): void { foreach ($this->transformations as $transformation) { $transformation->setParameters(array_merge($transformation->getParameters(), $this->getParameters())); } } public function getIterator(): ArrayIterator { return new ArrayIterator($this->transformations); } } project; } public function setProject(ProjectDescriptor $project): self { $this->project = $project; return $this; } public function setTransformations(array $transformations): void { $this->transformations = $transformations; } public function getTransformations(): array { return $this->transformations; } } writer = $writer; return $this; } public function getWriter(): ?WriterAbstract { return $this->writer; } } project; } public function setProject(ProjectDescriptor $project): self { $this->project = $project; return $this; } public function setTransformations(array $transformations): void { $this->transformations = $transformations; } public function getTransformations(): array { return $this->transformations; } } subject = $subject; $this->transformation = $transformation; } public static function create(object $subject, Transformation $transformation): self { return new self($subject, $transformation); } public function getTransformation(): Transformation { return $this->transformation; } public function getSubject(): object { return $this->subject; } } writers = $writerCollection; $this->logger = $logger; $this->flySystemFactory = $flySystemFactory; $this->eventDispatcher = $eventDispatcher; } public function getDescription(): string { return 'Transform analyzed project into artifacts'; } public function setTarget(string $target): void { $this->target = $target; $this->destination = $this->flySystemFactory->create(Dsn::createFromString($target)); } public function getTarget(): ?string { return $this->target; } public function setDestination(FilesystemInterface $filesystem): void { $this->destination = $filesystem; } public function destination(): FilesystemInterface { $destination = $this->destination; Assert::notNull($destination); return $destination; } public function execute(ProjectDescriptor $project, array $transformations): void { $this->initializeWriters($project, $transformations); $this->transformProject($project, $transformations); $this->logger->log(LogLevel::NOTICE, 'Finished transformation process'); } private function initializeWriters(ProjectDescriptor $project, array $transformations): void { $isInitialized = []; foreach ($transformations as $transformation) { $writerName = $transformation->getWriter(); if (in_array($writerName, $isInitialized, true)) { continue; } $isInitialized[] = $writerName; $writer = $this->writers->get($writerName); $this->initializeWriter($writer, $project, $transformation->template()); } } private function initializeWriter(WriterAbstract $writer, ProjectDescriptor $project, Template $template): void { $instance = WriterInitializationEvent::createInstance($this); $event = $instance->setWriter($writer); $this->eventDispatcher->dispatch($event, self::EVENT_PRE_INITIALIZATION); if ($writer instanceof Initializable) { $writer->initialize($project, $template); } $this->eventDispatcher->dispatch($event, self::EVENT_POST_INITIALIZATION); } private function transformProject(ProjectDescriptor $project, array $transformations): void { foreach ($transformations as $transformation) { $transformation->setTransformer($this); $this->applyTransformationToProject($transformation, $project); } } private function applyTransformationToProject(Transformation $transformation, ProjectDescriptor $project): void { $this->logger->log( LogLevel::NOTICE, sprintf( ' Writer %s %s on %s', $transformation->getWriter(), ($transformation->getQuery() ? ' using query "' . $transformation->getQuery() . '"' : ''), $transformation->getArtifact() ) ); $preTransformationEvent = PreTransformationEvent::create($this, $transformation); $this->eventDispatcher->dispatch($preTransformationEvent, self::EVENT_PRE_TRANSFORMATION); $writer = $this->writers->get($transformation->getWriter()); $writer->transform($project, $transformation); $postTransformationEvent = PostTransformationEvent::createInstance($this); $this->eventDispatcher->dispatch($postTransformationEvent, self::EVENT_POST_TRANSFORMATION); } } pathGenerator = $pathGenerator; } public function getName(): string { return 'sourcecode'; } public function transform(ProjectDescriptor $project, Transformation $transformation): void { foreach ($project->getVersions() as $version) { foreach ($version->getDocumentationSets() as $documentationSet) { if ( $documentationSet instanceof ApiSetDescriptor && $documentationSet->getSettings()['include-source'] === false ) { return; } foreach ($project->getFiles() as $file) { $source = $file->getSource(); if ($source === null) { continue; } $path = $this->pathGenerator->generate($file, $transformation); $this->persistTo($transformation, $path, $source); } } } } } walkObjectTree($object, $query); if (!is_array($node) && (!$node instanceof Traversable)) { $node = [$node]; } return $node; } return [$object]; } private function walkObjectTree(object $object, string $query) { $node = $object; $elements = explode('.', $query); foreach ($elements as $elementName) { if (is_array($node)) { if (isset($node[$elementName])) { $node = $node[$elementName]; continue; } } elseif (is_object($node)) { if (isset($node->{$elementName}) || (method_exists($node, '__get') && $node->{$elementName})) { $node = $node->{$elementName}; continue; } if (method_exists($node, $elementName)) { $node = $node->{$elementName}(); continue; } if (method_exists($node, 'get' . $elementName)) { $elementName = 'get' . $elementName; $node = $node->{$elementName}(); continue; } if (method_exists($node, 'is' . $elementName)) { $elementName = 'is' . $elementName; $node = $node->{$elementName}(); continue; } } return null; } return $node; } } normalizeSourcePath($path); $destination = $this->normalizeDestination($destination); $type = $transformation->template()->files()->getMetadata($path)['type']; if ($type === 'file') { if ($transformation->template()->files()->has($destination)) { $transformation->template()->files()->delete($destination); } $transformation->template()->files()->copy($path, $destination); return; } $this->copyDirectory($transformation, $path, $destination); } protected function readSourceFile(Transformation $transformation, string $path): string { $path = $this->normalizeSourcePath($path); $contents = $transformation->template()->files()->read($path); if ($contents === false) { throw new FileNotFoundException($path); } return $contents; } protected function persistTo(Transformation $transformation, string $path, string $contents): void { $path = $this->normalizeDestination($path); $transformation->template()->files()->put($path, $contents); } private function copyDirectory(Transformation $transformation, string $path, string $destination): void { $list = $transformation->template()->files()->listContents($path, true); $scheme = UriString::parse($path)['scheme']; foreach ($list as $file) { if ($file['type'] !== 'file') { continue; } $destinationPath = $this->stripFirstPartOfPath($file['path']); if ($this->isGlobalTemplateReference($path)) { $destinationPath = $this->stripFirstPartOfPath($destinationPath); } $this->copy( $transformation, $scheme . '://' . $file['path'], $destination . '/' . $destinationPath ); } } private function stripFirstPartOfPath(string $path): string { $findPathSeparator = strpos($path, '/', 1); if ($findPathSeparator === false) { return $path; } return ltrim(substr($path, $findPathSeparator), '/'); } private function isGlobalTemplateReference(string $path): bool { return strpos($path, 'templates/') === 0 || strpos($path, 'templates://') === 0; } private function normalizeSourcePath(string $path): string { if (UriString::parse($path)['scheme']) { return $path; } if ($this->isGlobalTemplateReference($path)) { return 'templates://' . $this->stripFirstPartOfPath($path); } return 'template://' . $path; } private function normalizeDestination(string $destination): string { if (!UriString::parse($destination)['scheme']) { $destination = 'destination://' . $destination; } return $destination; } } environmentFactory = $environmentFactory; $this->pathGenerator = $pathGenerator; } public function getName(): string { return 'twig'; } public function initialize(ProjectDescriptor $project, Template $template): void { $this->environment = $this->environmentFactory->create($project, $template); } public function transform(ProjectDescriptor $project, Transformation $transformation): void { $templatePath = $this->getTemplatePath($transformation); $finder = new Pathfinder(); $nodes = $finder->find($project, $transformation->getQuery()); foreach ($nodes as $node) { if (!$node) { continue; } $path = $this->pathGenerator->generate($node, $transformation); if ($path === '') { continue; } $this->environment->addGlobal('project', $project); $this->environment->addGlobal('usesNamespaces', count($project->getNamespace()->getChildren()) > 0); $this->environment->addGlobal('usesPackages', count($project->getPackage()->getChildren()) > 0); $this->environment->addGlobal('documentationSet', $project); $this->environment->addGlobal('node', $node); $this->environment->addGlobal('destinationPath', $path); $this->environment->addGlobal('parameter', $transformation->getParameters()); $output = $this->environment->render( substr($transformation->getSource(), strlen($templatePath)), ['target_path' => ltrim($path, '/\\')] ); $this->persistTo($transformation, ltrim($path, '/\\'), $output); } } private function getTemplatePath(Transformation $transformation): string { $parts = preg_split('~[\\\\|/]~', $transformation->getSource()); Assert::isArray($parts); if ($parts[0] !== 'templates') { return ''; } return $parts[0] . '/' . $parts[1]; } } classDiagramGenerator = $classDiagramGenerator; $this->plantumlClassDiagram = $plantumlClassDiagram; } public function getName(): string { return 'Graph'; } public function getDefaultSettings(): array { return ['graphs.enabled' => false]; } public function transform(ProjectDescriptor $project, Transformation $transformation): void { if ($project->getSettings()->getCustom()['graphs.enabled'] === false) { return; } $filename = $this->getDestinationPath($transformation); switch ($transformation->getSource() ?: 'class') { case 'class': default: $this->classDiagramGenerator->create($project, $filename); $this->plantumlClassDiagram->create($project, $filename); } } private function getDestinationPath(Transformation $transformation): string { return $transformation->getTransformer()->getTarget() . DIRECTORY_SEPARATOR . $transformation->getArtifact(); } } getQuery(); if (strtolower($method) !== 'copy') { throw new InvalidArgumentException( 'The query ' . $method . ' is not supported by the FileIo writer, supported operation is "copy"' ); } $this->copy($transformation, $transformation->getSource(), $transformation->getArtifact()); } } router = $router; $this->pathfinder = $pathfinder; } public function generate(Descriptor $descriptor, Transformation $transformation): string { $path = $this->determinePath($descriptor, $transformation); return $this->replaceVariablesInPath($path, $descriptor); } private function determinePath(Descriptor $descriptor, Transformation $transformation): string { $path = '/' . $transformation->getArtifact(); if (!$transformation->getArtifact()) { $path = $this->router->generate($descriptor); if (!$path) { throw new InvalidArgumentException( 'No matching routing rule could be found for the given node, please provide an artifact location, ' . 'encountered: ' . get_class($descriptor) ); } } return $path; } private function replaceVariablesInPath(string $path, Descriptor $descriptor): string { $destination = preg_replace_callback( '/{{([^}]*)}}/', function (array $query) use ($path, $descriptor) { $variable = $query[1]; if (!$variable) { throw new RuntimeException( sprintf('Variable substitution in path %s failed, no variable was specified', $path) ); } $value = (string) current($this->pathfinder->find($descriptor, $variable)); $filepart = trim(trim($value), '\\/'); if ($filepart === '') { throw new RuntimeException( sprintf( 'Variable substitution in path %s failed, variable "%s" did not return a value', $path, $variable ) ); } $filepart = (new UnicodeString($filepart))->ascii()->toString(); return strpos($filepart, '/') !== false ? implode('/', array_map('urlencode', explode('/', $filepart))) : implode('\\', array_map('urlencode', explode('\\', $filepart))); }, $path ); if (!is_string($destination)) { throw new RuntimeException(sprintf('Variable substitution in path %s failed', $path)); } return $destination; } } filesystem = $filesystem; $this->templatePath = $templatePath; $this->overloadPrefix = $overloadPrefix !== null ? $overloadPrefix . '::' : null; } public function getSourceContext($name) { $this->guardTemplateExistsAndIsFile($name); $path = $this->resolveTemplateName($name); return new Source( $this->filesystem->read($path), $name, $path ); } public function exists($name) { return $this->filesystem->has($this->resolveTemplateName($name)); } public function getCacheKey($name) { $this->guardTemplateExistsAndIsFile($name); return $name; } public function isFresh($name, $time) { $this->guardTemplateExistsAndIsFile($name); $timestamp = $this->filesystem->getTimestamp($this->resolveTemplateName($name)); return (int) $time >= (int) $timestamp; } private function guardTemplateExistsAndIsFile(string $name): void { try { $path = $this->resolveTemplateName($name); $metadata = $this->filesystem->getMetadata($path); if ($metadata['type'] !== 'file') { throw new LoaderError( sprintf('Cannot use anything other than a file as a template, received: %s', $path) ); } } catch (FileNotFoundException $exception) { throw new LoaderError(sprintf('Template "%s" could not be found on the given filesystem', $name)); } } private function resolveTemplateName(string $name): string { if (($this->overloadPrefix !== null) && strpos($name, $this->overloadPrefix) === 0) { $name = substr($name, strlen($this->overloadPrefix)); } $prefix = $this->templatePath; if ($prefix !== '') { $prefix = rtrim($prefix, '/') . '/'; } return $prefix . $name; } } markdownConverter = $markdownConverter; $this->routeRenderer = $routeRenderer; $this->routeRenderer = $this->routeRenderer->withProject($project); } public function getGlobals(): array { return [ 'project' => null, 'documentationSet' => null, 'node' => null, 'usesNamespaces' => true, 'usesPackages' => true, 'destinationPath' => null, ]; } public function getFunctions(): array { return [ new TwigFunction( 'renderBaseUrlHeader', function (array $context): string { $this->routeRenderer = $this->contextRouteRenderer($context)->doNotConvertUrlsToRootPath(); $absolutePath = $this->routeRenderer->convertToRootPath('/', true); if (!$absolutePath) { return ''; } return ''; }, ['is_safe' => ['all'], 'needs_context' => true] ), new TwigFunction( 'path', function (array $context, string $url): string { $path = $this->contextRouteRenderer($context)->convertToRootPath($url); Assert::notNull($path); return $path; }, ['needs_context' => true] ), new TwigFunction( 'link', function (array $context, object $element): string { return $this->contextRouteRenderer($context)->link($element); }, ['needs_context' => true] ), new TwigFunction( 'breadcrumbs', static function (DescriptorAbstract $baseNode): array { $results = []; $namespace = $baseNode instanceof NamespaceDescriptor ? $baseNode->getParent() : $baseNode->getNamespace(); while ($namespace instanceof NamespaceDescriptor && $namespace->getName() !== '\\') { array_unshift($results, $namespace); $namespace = $namespace->getParent(); } return $results; } ), new TwigFunction( 'packages', static function (DescriptorAbstract $baseNode): array { $results = []; $package = $baseNode instanceof PackageDescriptor ? $baseNode->getParent() : $baseNode->getPackage(); while ($package instanceof PackageDescriptor && $package->getName() !== '\\') { array_unshift($results, $package); $package = $package->getParent(); } return $results; } ), new TwigFunction( 'methods', static function (DescriptorAbstract $descriptor): Collection { $methods = new Collection(); if (method_exists($descriptor, 'getInheritedMethods')) { $methods = $methods->merge($descriptor->getInheritedMethods()); } if (method_exists($descriptor, 'getMagicMethods')) { $methods = $methods->merge($descriptor->getMagicMethods()); } if (method_exists($descriptor, 'getMethods')) { $methods = $methods->merge($descriptor->getMethods()); } return $methods; } ), new TwigFunction( 'properties', static function (DescriptorAbstract $descriptor): Collection { $properties = new Collection(); if (method_exists($descriptor, 'getInheritedProperties')) { $properties = $properties->merge($descriptor->getInheritedProperties()); } if (method_exists($descriptor, 'getMagicProperties')) { $properties = $properties->merge($descriptor->getMagicProperties()); } if (method_exists($descriptor, 'getProperties')) { $properties = $properties->merge($descriptor->getProperties()); } return $properties; } ), new TwigFunction( 'constants', static function (DescriptorAbstract $descriptor): Collection { $constants = new Collection(); if (method_exists($descriptor, 'getInheritedConstants')) { $constants = $constants->merge($descriptor->getInheritedConstants()); } if (method_exists($descriptor, 'getMagicConstants')) { $constants = $constants->merge($descriptor->getMagicConstants()); } if (method_exists($descriptor, 'getConstants')) { $constants = $constants->merge($descriptor->getConstants()); } return $constants; } ), new TwigFunction( 'cases', static function (DescriptorAbstract $descriptor): Collection { if ($descriptor instanceof EnumDescriptor) { return $descriptor->getCases(); } return new Collection(); } ), new TwigFunction( 'toc', static function ( Environment $env, Entry $entry, string $template, ?int $maxDepth = null, int $depth = 0 ): string { if ($maxDepth === $depth) { return ''; } return $env->render( $template, [ 'entry' => $entry, 'depth' => ++$depth, 'maxDepth' => $maxDepth, ] ); }, [ 'needs_environment' => true, 'is_safe' => ['html'], ] ), ]; } public function getFilters(): array { return [ 'markdown' => new TwigFilter( 'markdown', function (?string $value): string { return str_replace( ['
', ''],
['
', ''],
$this->markdownConverter->convertToHtml($value ?? '')->getContent()
);
},
['is_safe' => ['all']]
),
'trans' => new TwigFilter(
'trans',
static function ($value) {
return $value;
}
),
'route' => new TwigFilter(
'route',
function ($value, string $presentation = LinkRenderer::PRESENTATION_NORMAL) {
return $this->routeRenderer->render($value, $presentation);
},
['is_safe' => ['all']]
),
'sort' => new TwigFilter(
'sort_*',

static function (string $direction, Collection $collection): ArrayIterator {
$iterator = $collection->getIterator();
$iterator->uasort(
static function (Descriptor $a, Descriptor $b) use ($direction) {
$aElem = strtolower($a->getName());
$bElem = strtolower($b->getName());
if ($aElem === $bElem) {
return 0;
}

if (
($direction === 'asc' && $aElem > $bElem) ||
($direction === 'desc' && $aElem < $bElem)
) {
return 1;
}

return -1;
}
);

return $iterator;
}
),
'sortByVisibility' => new TwigFilter(
'sortByVisibility',

static function (Collection $collection): ArrayIterator {
$visibilityOrder = [
'public' => 0,
'protected' => 1,
'private' => 2,
];
$iterator = $collection->getIterator();
$iterator->uasort(
static function (Descriptor $a, Descriptor $b) use ($visibilityOrder) {
$prio = 0;
if ($a instanceof VisibilityInterface && $b instanceof VisibilityInterface) {
$visibilityPriorityA = $visibilityOrder[$a->getVisibility()] ?? 0;
$visibilityPriorityB = $visibilityOrder[$b->getVisibility()] ?? 0;
$prio = $visibilityPriorityA <=> $visibilityPriorityB;
}

if ($prio !== 0) {
return $prio;
}

$aElem = strtolower($a->getName());
$bElem = strtolower($b->getName());

return $aElem <=> $bElem;
}
);

return $iterator;
}
),
'export' => new TwigFilter(
'export',
static function ($var) {
return var_export($var, true);
}
),
'description' => new TwigFilter(
'description',
function (array $context, ?DescriptionDescriptor $description) {
if ($description === null || $description->getBodyTemplate() === '') {
return '';
}

$tagStrings = [];
foreach ($description->getTags() as $tag) {
if ($tag instanceof SeeDescriptor) {
$tagStrings[] = $this->renderRoute(
$context,
$tag->getReference(),
LinkRenderer::PRESENTATION_CLASS_SHORT
);
} elseif ($tag instanceof LinkDescriptor) {
$tagStrings[] = sprintf(
'[%s](%s)',
(string) $tag->getDescription(),
$tag->getLink()
);
} elseif ($tag instanceof ExampleDescriptor) {
$tagStrings[] = $tag->getDescription() . "\n"
. '```php' . "\n" . $tag->getExample() . "\n" . '```';
} else {
$tagStrings[] = (string) $tag;
}
}

return vsprintf($description->getBodyTemplate(), $tagStrings);
},
['needs_context' => true]
),
'shortFQSEN' => new TwigFilter(
'shortFQSEN',
static function (string $fqsenOrTitle) {
try {
return (new Fqsen($fqsenOrTitle))->getName();
} catch (InvalidArgumentException $e) {
}

return $fqsenOrTitle;
}
),
];
}







public function renderRoute(array $context, $value, string $presentation)
{
$routeRenderer = $this->contextRouteRenderer($context);

return $routeRenderer->render($value, $presentation);
}


private function contextRouteRenderer(array $context): LinkRenderer
{
return $this->routeRenderer
->withDestination(ltrim($context['destinationPath'], '/\\'))
->withProject($context['project']);
}
}
renderer = $renderer;
$this->markDownConverter = $markDownConverter;
}

public function withTemplateOverridesAt(Path $path): void
{
$this->templateOverridesAt = $path;
}

public function create(
ProjectDescriptor $project,
Template $template
): Environment {
$mountManager = $template->files();

$loaders = [];
if ($this->templateOverridesAt instanceof Path) {
$loaders[] = new FilesystemLoader([(string) $this->templateOverridesAt]);
}

$loaders[] = new FlySystemLoader($mountManager->getFilesystem('template'), '', 'base');
$loaders[] = new FlySystemLoader($mountManager->getFilesystem('templates'));

$env = new Environment(new ChainLoader($loaders));

$this->addPhpDocumentorExtension($project, $env);
$this->enableDebug($env);

return $env;
}




private function addPhpDocumentorExtension(
ProjectDescriptor $project,
Environment $twigEnvironment
): void {
$extension = new Extension($project, $this->markDownConverter, $this->renderer);
$twigEnvironment->addExtension($extension);
}

private function enableDebug(Environment $twigEnvironment): void
{
$twigEnvironment->setCache(false);
$twigEnvironment->enableDebug();
$twigEnvironment->enableAutoReload();
$twigEnvironment->addExtension(new DebugExtension());
}
}
router = $router;
}




public function setDestination(string $destination): void
{
$this->destination = $destination;
}











public function withDestination(string $destination): self
{
$result = clone $this;
$result->destination = $destination;

return $result;
}

public function withProject(ProjectDescriptor $projectDescriptor): self
{
$result = clone $this;
$result->project = $projectDescriptor;

return $result;
}

public function doNotConvertUrlsToRootPath(): self
{
$result = clone $this;
$result->convertToRootPath = false;

return $result;
}




public function getDestination(): string
{
return $this->destination;
}




public function link(object $value): string
{
$uri = $this->router->generate($value);
if (!$uri) {
return $uri;
}

$path = $this->convertToRootPath($this->withoutLeadingSlash($uri));

Assert::notNull($path);

return $path;
}






public function render($value, string $presentation)
{
if (is_array($value) && current($value) instanceof Type) {

return $this->renderType($value);
}

if ($value instanceof Nullable) {
return $this->renderASeriesOfLinks([$value->getActualType(), new Null_()], $presentation);
}

if (is_iterable($value)) {
return $this->renderASeriesOfLinks($value, $presentation);
}

return $this->renderLink($value, $presentation);
}

/**
     * Converts the given path to be relative to the root of the documentation
     * target directory.
     *
     * It is not possible to use absolute paths in documentation templates since
     * they may be used locally, or in a subfolder. As such we need to calculate
     * the number of levels to go up from the current document's directory and
     * then append the given path.
     *
     * For example:
     *
     *     Suppose you are in /classes/my/class.html and you want open
     *     /my/index.html then you provide 'my/index.html' to this method
     *     and it will convert it into ../../my/index.html (/classes/my is
     *     two nesting levels until the root).
     *
     * This method does not try to normalize or optimize the paths in order to
     * save on development time and performance, and because it adds no real
     * value.
     *
     * In addition, when a path starts with an @-sign, it is interpreted as a
     * reference to a structural element and we use the router to try and find
     * a path to which this refers.
     *
     * @todo References can only point to an element that is a class,
     *       interface, trait, method, property or class constant at this
     *       moment. This is because an FQSEN does not contain the necessary
     *       data to distinguish whether the FQCN is actually a class or a
     *       namespace reference. As such we assume a class as that is the
     *       most common occurrence.
     */
public function convertToRootPath(string $pathOrReference, bool $force = false): ?string
{
if ($this->isReferenceToFqsen($pathOrReference)) {
try {
$pathOrReference = $this->router->generate($this->createFqsenFromReference($pathOrReference));
} catch (InvalidArgumentException $e) {
return null;
}
}

if (!$pathOrReference) {
return null;
}

$withoutLeadingSlash = $this->withoutLeadingSlash($pathOrReference);
if ($this->convertToRootPath || $force) {
return $this->getPathPrefixBasedOnDepth() . $withoutLeadingSlash;
}

return $withoutLeadingSlash;
}








private function renderASeriesOfLinks(iterable $value, string $presentation): array
{
$result = [];
foreach ($value as $path) {
$result[] = $this->render($path, $presentation);
}

return $result;
}




private function renderLink($node, string $presentation): string
{
$generatedUrl = $node;

if ($node instanceof Reference\Fqsen) {
$node = (string) $node;
}

if (is_string($node)) {
try {
$node = new Fqsen($node);
} catch (InvalidArgumentException $exception) {

 }
}

if ($node instanceof Object_) {
$node = $node->getFqsen() ?? $node;
}

if ($node instanceof Fqsen) {
$node = $this->project->findElement($node) ?? $node;
}

if ($node instanceof AbstractList) {
return $this->renderAbstractListLinks($node, $presentation);
}


 if ($node instanceof Fqsen || $node instanceof Type) {

 if ($presentation === self::PRESENTATION_CLASS_SHORT && (!$node instanceof Type)) {
$parts = explode('\\', (string) $node);
if (count($parts) <= 1) {
return (string) $node;
}

return sprintf('%s', (string) $node, end($parts));
}

return (string) $node;
}

if ($node instanceof Descriptor) {
Assert::isInstanceOf($node, DescriptorAbstract::class);
try {
$generatedUrl = $this->router->generate($node);
} catch (InvalidArgumentException $e) {
$generatedUrl = '';
}
}

$url = $generatedUrl ? ltrim((string) $generatedUrl, '/') : false;

try {
if ($url !== false && UriInfo::isRelativePath(Uri::createFromString($url))) {
$url = $this->convertToRootPath($url);
}
} catch (SyntaxError $exception) {

 }

switch ($presentation) {
case self::PRESENTATION_URL:

 return $url ?: '';

case self::PRESENTATION_NORMAL:
case self::PRESENTATION_CLASS_SHORT:
$parts = explode('\\', (string) $node);

return sprintf(
'%s',
$url,
(string) $node,
end($parts)
);

case self::PRESENTATION_FILE_SHORT:
$parts = explode('/', (string) $node);

return sprintf(
'%s',
$url,
(string) $node,
end($parts)
);

default:
if ($presentation !== '') {
return sprintf(
'%s',
$url,
(string) $node,
$presentation
);
}
}

return $url ? sprintf('%s', $url, (string) $node) : (string) $node;
}






private function renderType(iterable $value): array
{
$result = [];
foreach ($value as $type) {
$result[] = (string) $type;
}

return $result;
}










private function getPathPrefixBasedOnDepth(): string
{
$directoryDepth = substr_count($this->getDestination(), '/') + 1;

return $directoryDepth > 1
? implode('/', array_fill(0, $directoryDepth - 1, '..')) . '/'
: '';
}

private function isReferenceToFqsen(string $path): bool
{
return strpos($path, '@') === 0;
}

private function withoutLeadingSlash(string $path): string
{
return ltrim($path, '/');
}

private function createFqsenFromReference(string $path): Fqsen
{
if (!$this->isReferenceToFqsen($path)) {
throw new InvalidArgumentException('References to FQSENs are expected to begin with an @-sign');
}

$strippedAtSign = substr($path, 1);


 if ($strippedAtSign[0] !== '\\') {
$strippedAtSign = '\\' . $strippedAtSign;
}

return new Fqsen($strippedAtSign);
}

private function renderAbstractListLinks(AbstractList $node, string $presentation): string
{
$typeLink = null;
$valueLink = $this->renderLink($node->getValueType(), $presentation);
$keyLink = $this->renderLink($node->getKeyType(), $presentation);

if ($node instanceof Collection) {
$typeLink = $this->renderLink($node->getFqsen(), $presentation);
}

if ($node instanceof Array_) {
$typeLink = 'array';
}

if ($node instanceof Iterable_) {
$typeLink = 'iteratable';
}

return sprintf('%s<%s, %s>', $typeLink, $keyLink, $valueLink);
}
}
getEnvironment()->addExtension($extension);
}

return $converter;
}
}
logger = $logger;
$this->commandBus = $commandBus;
$this->renderer = $renderer;
$this->flySystemFactory = $flySystemFactory;
}

public function getName(): string
{
return 'RenderGuide';
}

public function transform(ProjectDescriptor $project, Transformation $transformation): void
{

 if (!($project->getSettings()->getCustom()[self::FEATURE_FLAG])) {
return;
}

$this->logger->warning(
'Generating guides is experimental, no BC guarantees are given, use at your own risk'
);


foreach ($project->getVersions() as $version) {
foreach ($version->getDocumentationSets() as $documentationSet) {
if (!$documentationSet instanceof GuideSetDescriptor) {
continue;
}

$this->renderDocumentationSet($documentationSet, $project, $transformation);
}
}
}

public function getDefaultSettings(): array
{
return [self::FEATURE_FLAG => false];
}

private function renderDocumentationSet(
GuideSetDescriptor $documentationSet,
ProjectDescriptor $project,
Transformation $transformation
): void {
$dsn = $documentationSet->getSource()->dsn();
$stopwatch = $this->startRenderingSetMessage($dsn);

$this->renderer->initialize($project, $documentationSet, $transformation);

$this->commandBus->handle(
new RenderCommand(
$documentationSet,
$this->flySystemFactory->create($dsn),
$transformation->getTransformer()->destination()
)
);

$this->completedRenderingSetMessage($stopwatch, $dsn);
}

private function startRenderingSetMessage(Dsn $dsn): Stopwatch
{
$stopwatch = new Stopwatch();
$stopwatch->start('guide');
$this->logger->info('Rendering guide ' . $dsn);

return $stopwatch;
}

private function completedRenderingSetMessage(Stopwatch $stopwatch, Dsn $dsn): void
{
$stopwatchEvent = $stopwatch->stop('guide');
$this->logger->info(
sprintf(
'Completed rendering guide %s in %.2fms using %.2f mb memory',
(string) $dsn,
$stopwatchEvent->getDuration(),
$stopwatchEvent->getMemory() / 1024 / 1024
)
);
}
}
register($writer);
}
}

public function register(WriterAbstract $writer): void
{
$this->writers[$writer->getName()] = $writer;
}








public function get(string $index): WriterAbstract
{
if (array_key_exists($index, $this->writers) === false) {
throw new InvalidArgumentException('Writer "' . $index . '" does not exist');
}

return $this->writers[$index];
}






public function checkRequirements(): void
{

foreach ($this->writers as $writer) {
$writer->checkRequirements();
}
}
}
logger = $logger;
$this->plantumlRenderer = $plantumlRenderer;
}

public function create(ProjectDescriptor $project, string $filename): void
{
$output = $this->plantumlRenderer->render(
<<renderNamespace($project->getNamespace())}
PUML
);

if (!$output) {
$this->logger->error('Generating the class diagram failed');

return;
}

file_put_contents($filename, $output);
}

private function renderNamespace(NamespaceInterface $namespace): string
{
$output = '';

foreach ($namespace->getClasses() as $class) {
$abstract = $class->isAbstract() ? 'abstract ' : '';
$className = addslashes((string) $class->getFullyQualifiedStructuralElementName());

$extends = '';
if ($class->getParent() !== null) {
$parentFqsen = $class->getParent() instanceof ClassDescriptor
? (string) $class->getParent()->getFullyQualifiedStructuralElementName()
: (string) $class->getParent();

$extends = ' extends ' . addslashes($parentFqsen);
}

$implementsList = [];
foreach ($class->getInterfaces() as $parent) {
$parentFqsen = $parent instanceof InterfaceDescriptor
? (string) $parent->getFullyQualifiedStructuralElementName()
: (string) $parent;

$implementsList[] = addslashes($parentFqsen);
}

if ($implementsList !== []) {
$implements = ' implements ' . implode(',', $implementsList);
} else {
$implements = '';
}

foreach ($class->getUsedTraits() as $parent) {
$parentFqsen = $parent instanceof TraitDescriptor
? (string) $parent->getFullyQualifiedStructuralElementName()
: (string) $parent;

$output .= addslashes($parentFqsen) . ' <-- ' . $className . ' : uses' . PHP_EOL;
}

$output .= <<getInterfaces() as $interface) {
$interfaceName = addslashes((string) $interface->getFullyQualifiedStructuralElementName());

$implementsList = [];
foreach ($interface->getParent() as $parent) {
$parentFqsen = $parent instanceof InterfaceDescriptor
? (string) $parent->getFullyQualifiedStructuralElementName()
: (string) $parent;

$implementsList[] = addslashes($parentFqsen);
}

if ($implementsList !== []) {
$implements = ' extends ' . implode(',', $implementsList);
} else {
$implements = '';
}

$output .= <<getTraits() as $class) {
$className = addslashes((string) $class->getFullyQualifiedStructuralElementName());

foreach ($class->getUsedTraits() as $parent) {
$parentFqsen = $parent instanceof TraitDescriptor
? (string) $parent->getFullyQualifiedStructuralElementName()
: (string) $parent;

$output .= addslashes($parentFqsen) . ' <-- ' . $className . ' : uses' . PHP_EOL;
}

$output .= <<> {
}

PUML;
}

foreach ($namespace->getChildren() as $child) {
$output .= $this->renderNamespace($child);
}

return $output;
}
}
logger = $logger;
$this->plantUmlBinaryPath = $plantUmlBinaryPath;
}

public function render(string $diagram): ?string
{
$pumlFileLocation = tempnam('phpdocumentor', 'pu_');

$output = <<plantUmlBinaryPath = 'plantuml';
}

$process = new Process([$this->plantUmlBinaryPath, '-tsvg', $pumlFileLocation], __DIR__, null, null, 600.0);
$process->run();

if (!$process->isSuccessful()) {
$this->logger->error('Generating the class diagram failed', ['error' => $process->getErrorOutput()]);

return null;
}

return file_get_contents($pumlFileLocation . '.svg') ?: null;
}
}
checkIfGraphVizIsInstalled();
} catch (Throwable $e) {
echo $e->getMessage();

return;
}

$graph = GraphVizGraph::create()
->setRankSep('1.0')
->setCenter('true')
->setRank('source')
->setRankDir('RL')
->setSplines('true')
->setConcentrate('true');

$this->buildNamespaceTree($graph, $project->getNamespace());

$classes = $project->getIndexes()->fetch('classes', new Collection())->getAll();
$interfaces = $project->getIndexes()->fetch('interfaces', new Collection())->getAll();
$traits = $project->getIndexes()->fetch('traits', new Collection())->getAll();


$containers = array_merge($classes, $interfaces, $traits);

foreach ($containers as $container) {
$fromName = (string) $container->getFullyQualifiedStructuralElementName();

$parents = [];
$implemented = [];
if ($container instanceof ClassDescriptor) {
if ($container->getParent()) {
$parents[] = $container->getParent();
}

$implemented = $container->getInterfaces()->getAll();
}

if ($container instanceof InterfaceDescriptor) {
$parents = $container->getParent()->getAll();
}


foreach ($parents as $parent) {
$edge = $this->createEdge($fromName, $parent);
if ($edge === null) {
continue;
}

$edge->setArrowHead('empty');
$graph->link($edge);
}


foreach ($implemented as $parent) {
$edge = $this->createEdge($fromName, $parent);
if ($edge === null) {
continue;
}

$edge->setStyle('dotted');
$edge->setArrowHead('empty');
$graph->link($edge);
}
}

$graph->export('svg', $filename);
}






private function checkIfGraphVizIsInstalled(): void
{

 exec('dot -V 2>&1', $output, $error);
if ($error !== 0) {
throw new RuntimeException(
'Unable to find the `dot` command of the GraphViz package. '
. 'Is GraphViz correctly installed and present in your path?'
);
}
}






private function createEdge(string $fromName, $to): ?Edge
{
$toName = (string) ($to instanceof DescriptorAbstract ? $to->getFullyQualifiedStructuralElementName() : $to);

if (!isset($this->nodeCache[$fromName])) {
$namespaceParts = explode('\\', $fromName);
$this->nodeCache[$fromName] = $this->createEmptyNode(
array_pop($namespaceParts),
$this->createNamespaceGraph($fromName)
);
}

if (!isset($this->nodeCache[$toName])) {
$namespaceParts = explode('\\', $toName);
$this->nodeCache[$toName] = $this->createEmptyNode(
array_pop($namespaceParts),
$this->createNamespaceGraph($toName)
);
}

$fromNode = $this->nodeCache[$fromName];
$toNode = $this->nodeCache[$toName];
if ($fromNode !== null && $toNode !== null) {
return Edge::create($fromNode, $toNode);
}

return null;
}

private function createNamespaceGraph(string $fqcn): ?GraphVizGraph
{
$namespaceParts = explode('\\', $fqcn);


 array_pop($namespaceParts);

$graph = null;
$reassembledFqnn = '';
foreach ($namespaceParts as $part) {
if ($part === '\\' || $part === '') {
$part = 'Global';
$reassembledFqnn = 'Global';
} else {
$reassembledFqnn .= '\\' . $part;
}

if (isset($this->namespaceCache[$part])) {
$graph = $this->namespaceCache[$part];
} else {
$subgraph = $this->createGraphForNamespace($reassembledFqnn, $part);
$graph->addGraph($subgraph);
$graph = $subgraph;
}
}

return $graph;
}

private function createEmptyNode(string $name, ?GraphVizGraph $graph): ?Node
{
if ($graph === null) {
return null;
}

$node = Node::create($name);
$node->setFontColor('gray');
$node->setLabel($name);
$graph->setNode($node);

return $node;
}




private function buildNamespaceTree(GraphVizGraph $graph, NamespaceInterface $namespace): void
{
$fullNamespaceName = (string) $namespace->getFullyQualifiedStructuralElementName();
if ($fullNamespaceName === '\\') {
$fullNamespaceName = 'Global';
}

$label = $namespace->getName() === '\\' ? 'Global' : $namespace->getName();
$subGraph = $this->createGraphForNamespace($fullNamespaceName, $label);
$this->namespaceCache[$fullNamespaceName] = $subGraph;

$elements = array_merge(
$namespace->getClasses()->getAll(),
$namespace->getInterfaces()->getAll(),
$namespace->getTraits()->getAll()
);


foreach ($elements as $subElement) {
$node = Node::create(
(string) $subElement->getFullyQualifiedStructuralElementName(),
$subElement->getName()
)
->setShape('box')
->setFontName('Courier')
->setFontSize('11');

if ($subElement instanceof ClassDescriptor && $subElement->isAbstract()) {
$node->setLabel('<«abstract»
' . $subElement->getName() . '>'); } $this->nodeCache[(string) $subElement->getFullyQualifiedStructuralElementName()] = $node; $subGraph->setNode($node); } foreach ($namespace->getChildren()->getAll() as $element) { $this->buildNamespaceTree($subGraph, $element); } $graph->addGraph($subGraph); } private function createGraphForNamespace(string $fullNamespaceName, string $label): GraphVizGraph { return GraphVizGraph::create('cluster_' . $fullNamespaceName) ->setLabel($label) ->setFontColor('gray') ->setFontSize('11') ->setRankDir('LR'); } } urlGenerator = $urlGenerator; $this->slugger = $slugger; } public function __invoke(Fqsen $fqsen): string { $fqsenParts = explode('::', (string) $fqsen); $className = $this->slugger->slug($fqsenParts[0])->toString(); if (count($fqsenParts) === 1) { return $this->urlGenerator->generate( 'class', ['name' => $className] ); } if (strpos($fqsenParts[1], '$') !== false) { $propertyName = explode('$', $fqsenParts[1]); return $this->urlGenerator->generate( 'class', [ 'name' => $className, '_fragment' => 'property_' . $propertyName[1], ] ); } if (strpos($fqsenParts[1], '()') !== false) { $methodName = explode('()', $fqsenParts[1]); return $this->urlGenerator->generate( 'class', [ 'name' => $className, '_fragment' => 'method_' . $methodName[0], ] ); } return $this->urlGenerator->generate( 'class', [ 'name' => $className, '_fragment' => 'constant_' . $fqsenParts[1], ] ); } } fqsenUrlGenerator = $fqsenUrlGenerator; $this->urlGenerator = $urlGenerator; $this->slugger = $slugger; } public function generate(object $node): string { if ($node instanceof DocumentDescriptor) { return $this->urlGenerator->generate( 'document', ['name' => $node->getFile()] ); } if ($node instanceof FileDescriptor) { return $this->generateUrlForDescriptor('file', $node->getPath()); } if ($node instanceof PackageDescriptor) { return $this->generateUrlForDescriptor( 'package', (string) $node->getFullyQualifiedStructuralElementName() ); } if ($node instanceof NamespaceDescriptor) { return $this->generateUrlForDescriptor( 'namespace', (string) $node->getFullyQualifiedStructuralElementName() ); } if ( $node instanceof ClassDescriptor || $node instanceof InterfaceDescriptor || $node instanceof TraitDescriptor || $node instanceof EnumDescriptor ) { return $this->generateUrlForDescriptor( 'class', (string) $node->getFullyQualifiedStructuralElementName() ); } if ($node instanceof ConstantDescriptor && $node->getParent() === null) { return $this->generateUrlForDescriptor( 'namespace', (string) $node->getNamespace(), 'constant_' . $node->getName() ); } if ($node instanceof ConstantDescriptor && $node->getParent() !== null) { return $this->generateUrlForDescriptor( 'class', (string) $node->getParent()->getFullyQualifiedStructuralElementName(), 'constant_' . $node->getName() ); } if ($node instanceof MethodDescriptor) { return $this->generateUrlForDescriptor( 'class', (string) $node->getParent()->getFullyQualifiedStructuralElementName(), 'method_' . $node->getName() ); } if ($node instanceof FunctionDescriptor) { return $this->generateUrlForDescriptor( 'namespace', (string) $node->getNamespace(), 'function_' . $node->getName() ); } if ($node instanceof PropertyDescriptor) { if ($node->getParent() === null) { return ''; } return $this->generateUrlForDescriptor( 'class', (string) $node->getParent()->getFullyQualifiedStructuralElementName(), 'property_' . $node->getName() ); } if ($node instanceof Fqsen) { return ($this->fqsenUrlGenerator)($node); } if ($node instanceof UriInterface) { return (string) $node; } return ''; } private function generateUrlForDescriptor(string $type, string $fqsen, string $fragment = ''): string { $name = $this->slugifyNameBasedOnType($type, $fqsen); return $this->urlGenerator->generate( $type, ['name' => $name, '_fragment' => $fragment] ); } private function slugifyNameBasedOnType(string $type, string $name): string { if ($type === 'file') { return $this->slugger->slug($this->removeFileExtensionFromPath($name))->lower()->toString(); } $default = $type === 'class' ? '' : 'default'; $slug = $this->slugger->slug($name); if ($type === 'namespace') { $slug = $slug->lower(); } return $slug->toString() ?: $default; } private function removeFileExtensionFromPath(string $path): string { if (strrpos($path, '.') !== false) { $path = substr($path, 0, strrpos($path, '.')); } return $path; } } flySystemFactory = $flySystemFactory; $this->globalTemplatesPath = $globalTemplatesPath; $this->writerCollection = $writerCollection; } public function getTemplates(array $templates, FilesystemInterface $output): Collection { $stopWatch = new Stopwatch(); $loadedTemplates = []; foreach ($templates as $template) { $stopWatch->start('load template'); $loadedTemplates[$template['name']] = $this->loadTemplate( $output, $template['name'], $template['parameters'] ?? [] ); $stopWatch->stop('load template'); } return new Collection($loadedTemplates); } private function loadTemplate(FilesystemInterface $output, string $template, array $parameters): Template { $template = $this->createTemplateFromXml($output, $template, $parameters); foreach ($template as $transformation) { $writer = $this->writerCollection->get($transformation->getWriter()); $writer->checkRequirements(); } return $template; } public function getAllNames(): array { $files = new DirectoryIterator($this->getTemplatesPath()); $templateNames = []; while ($files->valid()) { $name = $files->getBasename(); if (!$files->isDir() || in_array($name, ['.', '..'], true)) { $files->next(); continue; } $templateNames[] = $name; $files->next(); } return $templateNames; } public function getTemplatesPath(): string { return $this->globalTemplatesPath; } private function createTemplateFromXml( FilesystemInterface $filesystem, string $nameOrPath, array $templateParams ): Template { $files = new MountManager( [ 'templates' => $this->getTemplatesDirectory(), 'template' => $this->resolve($nameOrPath), 'destination' => $filesystem, ] ); $xml = $files->read('template://' . self::TEMPLATE_DEFINITION_FILENAME); $xml = new SimpleXMLElement($xml); $template = new Template((string) $xml->name, $files); $template->setAuthor((string) $xml->author . ((string) $xml->email ? ' <' . $xml->email . '>' : '')); $template->setVersion((string) $xml->version); $template->setCopyright((string) $xml->copyright); $template->setDescription((string) $xml->description); if ($xml->parameters) { foreach ($xml->parameters->children() as $parameter) { $parameterObject = new Parameter((string) $parameter->attributes()->key, (string) $parameter); $template->setParameter($parameterObject->key(), $parameterObject); } } foreach ($templateParams as $key => $value) { $parameterObject = new Parameter($key, $value); $template->setParameter($parameterObject->key(), $parameterObject); } $i = 0; foreach ($xml->transformations->transformation as $transformation) { $transformationObject = new Transformation( $template, (string) $transformation->attributes()->query, (string) $transformation->attributes()->writer, (string) $transformation->attributes()->source, (string) $transformation->attributes()->artifact ); $parameters = []; foreach ($transformation->parameter as $parameter) { $parameterObject = new Parameter((string) $parameter->attributes()->key, (string) $parameter); $parameters[$parameterObject->key()] = $parameterObject; } $transformationObject->setParameters(array_merge($parameters, $template->getParameters())); $template[$i++] = $transformationObject; } $template->propagateParameters(); return $template; } private function resolve(string $nameOrPath): FilesystemInterface { $configPath = rtrim($nameOrPath, DIRECTORY_SEPARATOR) . '/template.xml'; if (file_exists($configPath) && is_readable($configPath)) { return $this->flySystemFactory->create(Dsn::createFromString(rtrim($nameOrPath, DIRECTORY_SEPARATOR))); } $globalTemplatesFilesystem = $this->getTemplatesDirectory(); if ($globalTemplatesFilesystem->has($nameOrPath)) { $templateFilesystem = $this->createNewFilesystemFromSubfolder($globalTemplatesFilesystem, $nameOrPath); if (!$templateFilesystem->has('template.xml')) { throw new TemplateNotFound($nameOrPath); } return $templateFilesystem; } throw new TemplateNotFound($nameOrPath); } private function getTemplatesDirectory(): Filesystem { $dsnString = $this->getTemplatesPath(); try { $filesystem = $this->flySystemFactory->create(Dsn::createFromString($dsnString)); } catch (InvalidArgumentException $e) { throw new RuntimeException( 'Unable to access the folder with the global templates, received DSN is: ' . $dsnString ); } return $filesystem; } private function createNewFilesystemFromSubfolder( Filesystem $hostFilesystem, string $subfolder ): Filesystem { $hostFilesystemAdapter = $hostFilesystem->getAdapter(); if (!$hostFilesystemAdapter instanceof AbstractAdapter) { throw new RuntimeException( 'Failed to load template, The filesystem of the global templates does not support ' . 'getting a subfolder from it' ); } $templateAdapter = clone $hostFilesystemAdapter; $globalRoot = $templateAdapter->getPathPrefix(); $templateAdapter->setPathPrefix($globalRoot . $subfolder); return new Filesystem($templateAdapter); } } key = $key; $this->value = $value; } public function key(): string { return $this->key; } public function value(): string { return $this->value; } public function __toString(): string { return $this->value; } } setName($name); $this->setSettings(new Settings()); $namespace = new NamespaceDescriptor(); $namespace->setName('\\'); $namespace->setFullyQualifiedStructuralElementName(new Fqsen('\\')); $this->setNamespace($namespace); $package = new PackageDescriptor(); $package->setName('\\'); $package->setFullyQualifiedStructuralElementName(new Fqsen('\\')); $this->setPackage($package); $this->setFiles(new Collection()); $this->setIndexes(new Collection()); $this->setPartials(new Collection()); $this->versions = Collection::fromClassString(VersionDescriptor::class); $this->description = new DescriptionDescriptor(new Description(''), []); } public function setName(string $name): void { $this->name = $name; } public function getName(): string { return $this->name; } public function getDescription(): DescriptionDescriptor { return $this->description; } public function setFiles(Collection $files): void { $this->files = $files; } public function getFiles(): Collection { return $this->files; } public function setIndexes(Collection $indexes): void { $this->indexes = $indexes; } public function getIndexes(): Collection { return $this->indexes; } public function setNamespace(NamespaceDescriptor $namespace): void { $this->namespace = $namespace; } public function getNamespace(): NamespaceDescriptor { return $this->namespace; } public function setSettings(Settings $settings): void { $this->settings = $settings; } public function getSettings(): Settings { return $this->settings; } public function setPartials(Collection $partials): void { $this->partials = $partials; } public function getPartials(): Collection { return $this->partials; } public function findElement(Fqsen $fqsen): ?Descriptor { if (!isset($this->getIndexes()['elements'])) { return null; } return $this->getIndexes()['elements']->fetch((string) $fqsen); } private function setPackage(PackageDescriptor $package): void { $this->package = $package; } public function getPackage(): PackageDescriptor { return $this->package; } public function getVersions(): Collection { return $this->versions; } } url = $url; $this->title = $title; $this->parent = $parent; $this->children = Collection::fromClassString(self::class); } public function getUrl(): string { return $this->url; } public function getTitle(): string { return $this->title; } public function getParent(): ?string { return $this->parent; } public function addChild(Entry $child): void { $this->children->set($child->getUrl(), $child); } public function getChildren(): Collection { return $this->children; } } setChildren(new Collection()); $this->setFunctions(new Collection()); $this->setConstants(new Collection()); $this->setClasses(new Collection()); $this->setInterfaces(new Collection()); $this->setTraits(new Collection()); $this->setTags(new Collection()); $this->setEnums(Collection::fromClassString(EnumDescriptor::class)); } public function setParent($parent): void { Assert::nullOrIsInstanceOf($parent, __CLASS__); $this->parent = $parent; } public function getParent(): ?NamespaceDescriptor { return $this->parent; } public function setClasses(Collection $classes): void { $this->classes = $classes; } public function getClasses(): Collection { return $this->classes; } public function setConstants(Collection $constants): void { $this->constants = $constants; } public function getConstants(): Collection { return $this->constants; } public function setFunctions(Collection $functions): void { $this->functions = $functions; } public function getFunctions(): Collection { return $this->functions; } public function setInterfaces(Collection $interfaces): void { $this->interfaces = $interfaces; } public function getInterfaces(): Collection { return $this->interfaces; } public function addChild(NamespaceDescriptor $namespaceDescriptor): void { $this->children->set($namespaceDescriptor->getName(), $namespaceDescriptor); $namespaceDescriptor->setParent($this); } public function setChildren(Collection $children): void { $this->children = $children; } public function getChildren(): Collection { return $this->children; } public function setTraits(Collection $traits): void { $this->traits = $traits; } public function getTraits(): Collection { return $this->traits; } public function getEnums(): Collection { return $this->enums; } public function setEnums(Collection $enums): void { $this->enums = $enums; } } setArguments(new Collection()); } public function setArguments(Collection $arguments): void { $this->arguments = $arguments; } public function getArguments(): Collection { return $this->arguments; } public function getResponse(): ReturnDescriptor { $definedReturn = new ReturnDescriptor('return'); $definedReturn->setType($this->returnType); $returnTags = $this->getTags()->fetch('return', new Collection())->filter(ReturnDescriptor::class); if ($returnTags instanceof Collection && $returnTags->count() > 0) { return current($returnTags->getAll()); } return $definedReturn; } public function setReturnType(Type $returnType): void { $this->returnType = $returnType; } public function setHasReturnByReference(bool $hasReturnByReference): void { $this->hasReturnByReference = $hasReturnByReference; } public function getHasReturnByReference(): bool { return $this->hasReturnByReference; } } description = $description ?? new Description(''); $this->inlineTags = $inlineTags; } public function getBodyTemplate(): string { return $this->description->getBodyTemplate(); } public function replaceTag(int $position, ?TagDescriptor $tagDescriptor): void { $this->inlineTags[$position] = $tagDescriptor; } public function getTags(): array { return $this->inlineTags; } public function isEmpty(): bool { return $this->description->getBodyTemplate() === ''; } public function __toString() { $tags = []; foreach ($this->getTags() as $tag) { if ($tag === null) { $tags[] = null; continue; } $tags[] = '{' . trim('@' . $tag->getName() . ' ' . $tag) . '}'; } return vsprintf($this->getBodyTemplate(), $tags); } } filePath = $filePath; } public function getFilePath(): string { return $this->filePath; } public function setStartingLine(int $startingLine): void { $this->startingLine = $startingLine; } public function getStartingLine(): ?int { return $this->startingLine; } public function setLineCount(int $lineCount): void { $this->lineCount = $lineCount; } public function getLineCount(): ?int { return $this->lineCount; } public function setExample(string $example): void { $this->example = $example; } public function getExample(): string { return $this->example; } } version; } public function setVersion(string $version): void { $this->version = $version; } } reference = $reference; } public function getReference(): Reference { return $this->reference; } } version; } public function setVersion(string $version): void { $this->version = $version; } } version; } public function setVersion(string $version): void { $this->version = $version; } } types = $types; } public function setType(?Type $types = null): void { $this->types = $types; } public function getTypes(): array { trigger_error('Use getType, because type is an object', E_USER_DEPRECATED); return array_filter([$this->types]); } public function getType(): ?Type { return $this->types; } } variableName; } public function setVariableName(string $variableName): void { $this->variableName = $variableName; } } link = $link; } public function getLink(): string { return $this->link; } } reference; } public function setReference(?object $reference): void { $this->reference = $reference; } } arguments = Collection::fromClassString(ArgumentDescriptor::class); } public function setMethodName(string $methodName): void { $this->methodName = $methodName; } public function getMethodName(): string { return $this->methodName; } public function setArguments(Collection $arguments): void { $this->arguments = $arguments; } public function getArguments(): Collection { return $this->arguments; } public function setResponse(?ReturnDescriptor $response): void { $this->response = $response; } public function getResponse(): ?ReturnDescriptor { return $this->response; } public function setStatic(bool $static): void { $this->static = $static; } public function isStatic(): bool { return $this->static; } } assemblerFactory = $assemblerFactory; $this->filter = $filterManager; $this->servicesWithCustomSettings = $servicesWithCustomSettings; } public function createProjectDescriptor(): void { $this->project = new ProjectDescriptor(self::DEFAULT_PROJECT_NAME); } public function getProjectDescriptor(): ProjectDescriptor { return $this->project; } /** @template */ public function buildDescriptor(object $data, string $type): ?Descriptor { $assembler = $this->getAssembler($data, $type); if (!$assembler) { throw new InvalidArgumentException( 'Unable to build a Descriptor; the provided data did not match any Assembler ' . get_class($data) ); } if ($assembler instanceof Builder\AssemblerAbstract) { $assembler->setBuilder($this); } return $this->filterDescriptor($assembler->create($data)); } /** @template @template */ public function getAssembler(object $data, string $type): ?AssemblerInterface { return $this->assemblerFactory->get($data, $type); } /** @template */ public function filter(Filterable $descriptor): ?Filterable { return $this->filter->filter($descriptor, $this->apiSpecification); } /** @template */ protected function filterDescriptor(Descriptor $descriptor): ?Descriptor { if (!$descriptor instanceof Filterable) { return $descriptor; } $descriptor = $this->filter($descriptor); return $descriptor; } public function setApiSpecification(ApiSpecification $apiSpecification): void { $this->apiSpecification = $apiSpecification; } public function createApiDocumentationSet(Project $project): void { $customSettings = $this->getProjectDescriptor()->getSettings()->getCustom(); foreach ($this->servicesWithCustomSettings as $service) { $customSettings = array_merge($service->getDefaultSettings(), $customSettings); } $this->getProjectDescriptor()->getSettings()->setCustom($customSettings); foreach ($project->getFiles() as $file) { $descriptor = $this->buildDescriptor($file, FileDescriptor::class); if ($descriptor === null) { continue; } $this->getProjectDescriptor()->getFiles()->set($descriptor->getPath(), $descriptor); } $namespaces = $this->getProjectDescriptor()->getIndexes()->fetch('namespaces', new Collection()); foreach ($project->getNamespaces() as $namespace) { $namespaces->set( (string) $namespace->getFqsen(), $this->buildDescriptor($namespace, NamespaceDescriptor::class) ); } } public function getDefaultPackage(): string { return $this->apiSpecification['default-package-name']; } public function setVisibility(int $visibility): void { $this->project->getSettings()->setVisibility($visibility); } public function shouldIncludeSource(): bool { return $this->apiSpecification['include-source']; } public function setName(string $title): void { $this->project->setName($title); } public function setPartials(Collection $partials): void { $this->project->setPartials($partials); } public function setCustomSettings(array $customSettings): void { $this->project->getSettings()->setCustom($customSettings); } public function addVersion(VersionDescriptor $version): void { $this->project->getVersions()->add($version); } } getFilePath(); $file = $this->getExampleFileContents($filename); if (!$file) { return sprintf('** File not found : %s **', $filename); } return implode( '', array_slice($file, $descriptor->getStartingLine() - 1, $descriptor->getLineCount()) ); } public function setSourceDirectory(string $directory = ''): void { $this->sourceDirectory = $directory; } public function getSourceDirectory(): string { return $this->sourceDirectory; } public function setExampleDirectories(array $directories = []): void { $this->exampleDirectories = $directories; } public function getExampleDirectories(): array { return $this->exampleDirectories; } 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; } } return $normalizedPath && is_readable($normalizedPath) ? file($normalizedPath) : null; } private function getExamplePathFromExampleDirectory(string $file): string { return getcwd() . DIRECTORY_SEPARATOR . 'examples' . DIRECTORY_SEPARATOR . $file; } private function constructExamplePath(string $directory, string $file): string { return rtrim($directory, '\\/') . DIRECTORY_SEPARATOR . $file; } private function getExamplePathFromSource(string $file): string { return sprintf( '%s%s%s', trim($this->getSourceDirectory(), '\\/'), DIRECTORY_SEPARATOR, trim($file, '"') ); } } documentNode = $documentNode; $this->hash = $hash; $this->file = $file; $this->title = $title; $this->titles = $titles; $this->tocs = $tocs; $this->depends = $depends; $this->links = $links; $this->variables = $variables; } public function getDocumentNode(): DocumentNode { return $this->documentNode; } public function getHash(): string { return $this->hash; } public function getFile(): string { return $this->file; } public function getTitle(): string { return $this->title; } public function getTitles(): array { return $this->titles; } public function getTocs(): array { return $this->tocs; } public function getDepends(): array { return $this->depends; } public function getLinks(): array { return $this->links; } public function getVariables(): array { return $this->variables; } public function getName(): string { return $this->title; } public function getDescription(): ?DocBlock\DescriptionDescriptor { return null; } } unresolvedParentClassesCount = 0; $elementCounter = []; foreach ($this->findAllElements($projectDescriptor) as $element) { $elementCounter = $this->addElementToCounter($elementCounter, $element); $this->incrementUnresolvedParentCounter($element); } $this->descriptorCountByType = $elementCounter; $this->fileCount = count($projectDescriptor->getFiles()); $this->topLevelNamespaceCount = count($projectDescriptor->getNamespace()->getChildren()); } public function __toString(): string { $logString = <<descriptorCountByType as $class => $count) { $logString .= sprintf(' %8d %s elements' . PHP_EOL, $count, $class); } return sprintf( $logString, $this->fileCount, $this->topLevelNamespaceCount, $this->unresolvedParentClassesCount ); } /** @phpstan @phpstan */ protected function addElementToCounter(array $classCounters, DescriptorAbstract $element): array { if (!isset($classCounters[get_class($element)])) { $classCounters[get_class($element)] = 0; } ++$classCounters[get_class($element)]; return $classCounters; } protected function incrementUnresolvedParentCounter(DescriptorAbstract $element): void { if (!$element instanceof ClassDescriptor) { return; } if (!is_string($element->getParent())) { return; } ++$this->unresolvedParentClassesCount; } protected function findAllElements(ProjectDescriptor $projectDescriptor): Collection { return $projectDescriptor->getIndexes()->fetch('elements', new Collection()); } } setHash($hash); $this->setNamespaceAliases(new Collection()); $this->setIncludes(new Collection()); $this->setConstants(new Collection()); $this->setFunctions(new Collection()); $this->setClasses(new Collection()); $this->setInterfaces(new Collection()); $this->setTraits(new Collection()); $this->setEnums(Collection::fromClassString(EnumDescriptor::class)); $this->setMarkers(new Collection()); } public function getHash(): string { return $this->hash; } protected function setHash(string $hash): void { $this->hash = $hash; } public function getSource(): ?string { return $this->source; } public function setSource(?string $source): void { $this->source = $source; } public function getNamespaceAliases(): Collection { return $this->namespaceAliases; } public function setNamespaceAliases(Collection $namespaceAliases): void { $this->namespaceAliases = $namespaceAliases; } public function getIncludes(): Collection { return $this->includes; } public function setIncludes(Collection $includes): void { $this->includes = $includes; } public function getConstants(): Collection { return $this->constants; } public function setConstants(Collection $constants): void { $this->constants = $constants; } public function getFunctions(): Collection { return $this->functions; } public function setFunctions(Collection $functions): void { $this->functions = $functions; } public function getClasses(): Collection { return $this->classes; } public function setClasses(Collection $classes): void { $this->classes = $classes; } public function getInterfaces(): Collection { return $this->interfaces; } public function setInterfaces(Collection $interfaces): void { $this->interfaces = $interfaces; } public function getTraits(): Collection { return $this->traits; } public function setTraits(Collection $traits): void { $this->traits = $traits; } public function getEnums(): Collection { return $this->enums; } public function setEnums(Collection $enums): void { $this->enums = $enums; } public function getMarkers(): Collection { return $this->markers; } public function setMarkers(Collection $markers): void { $this->markers = $markers; } public function getAllErrors(): Collection { $errors = $this->getErrors(); $types = Collection::fromClassString(DescriptorAbstract::class) ->merge($this->getClasses()) ->merge($this->getInterfaces()) ->merge($this->getTraits()); $elements = Collection::fromClassString(DescriptorAbstract::class) ->merge($this->getFunctions()) ->merge($this->getConstants()) ->merge($types); foreach ($elements as $element) { $errors = $errors->merge($element->getErrors()); } foreach ($types as $element) { if ( $element instanceof ClassDescriptor || $element instanceof InterfaceDescriptor || $element instanceof TraitDescriptor || $element instanceof EnumDescriptor ) { foreach ($element->getMethods() as $item) { $errors = $errors->merge($item->getErrors()); } } if ( $element instanceof ClassDescriptor || $element instanceof InterfaceDescriptor ) { foreach ($element->getConstants() as $item) { $errors = $errors->merge($item->getErrors()); } } if ( !$element instanceof ClassDescriptor && !$element instanceof TraitDescriptor ) { continue; } foreach ($element->getProperties() as $item) { $errors = $errors->merge($item->getErrors()); } } return $errors; } public function setPath(string $path): void { $this->path = $path; } public function getPath(): string { return $this->path; } public function __toString(): string { return $this->getPath(); } } setInterfaces(new Collection()); $this->setUsedTraits(new Collection()); $this->setMethods(new Collection()); $this->setCases(new Collection()); } public function setInterfaces(Collection $implements): void { $this->implements = $implements; } public function getInterfaces(): Collection { return $this->implements; } public function setMethods(Collection $methods): void { $this->methods = $methods; } public function getMethods(): Collection { return $this->methods; } public function getInheritedMethods(): Collection { $inheritedMethods = Collection::fromClassString(MethodDescriptor::class); foreach ($this->getUsedTraits() as $trait) { if (!$trait instanceof TraitDescriptor) { continue; } $inheritedMethods = $inheritedMethods->merge($trait->getMethods()); } return $inheritedMethods; } public function getMagicMethods(): Collection { $methodTags = $this->getTags()->fetch('method', new Collection())->filter(Tag\MethodDescriptor::class); $methods = Collection::fromClassString(MethodDescriptor::class); foreach ($methodTags as $methodTag) { $method = new MethodDescriptor(); $method->setName($methodTag->getMethodName()); $method->setDescription($methodTag->getDescription()); $method->setStatic($methodTag->isStatic()); $method->setParent($this); $returnTags = $method->getTags()->fetch('return', new Collection())->filter(ReturnDescriptor::class); $returnTags->add($methodTag->getResponse()); foreach ($methodTag->getArguments() as $name => $argument) { $method->addArgument($name, $argument); } $methods->add($method); } return $methods; } public function setPackage($package): void { parent::setPackage($package); foreach ($this->getCases() as $case) { $case->setPackage($package); } foreach ($this->getMethods() as $method) { $method->setPackage($package); } } public function setLocation(FileDescriptor $file, int $line = 0): void { parent::setLocation($file, $line); foreach ($this->getCases() as $case) { $case->setFile($file); } } public function setUsedTraits(Collection $usedTraits): void { $this->usedTraits = $usedTraits; } public function getUsedTraits(): Collection { return $this->usedTraits; } public function setCases(Collection $cases): void { $this->cases = $cases; } public function getCases(): Collection { return $this->cases; } public function setBackedType(?Type $type): void { $this->backedType = $type; } public function getBackedType(): ?Type { return $this->backedType; } } method = $method; } public function getMethod(): ?MethodDescriptor { return $this->method; } public function setType(?Type $type): void { $this->type = $type; } public function getType(): ?Type { if ($this->type === null && $this->getInheritedElement() !== null) { $this->setType($this->getInheritedElement()->getType()); } return $this->type; } public function getTypes(): array { trigger_error('Please use getType', E_USER_DEPRECATED); return array_filter([$this->getType()]); } public function getInheritedElement(): ?ArgumentDescriptor { if ( $this->method instanceof MethodDescriptor && $this->method->getInheritedElement() instanceof MethodDescriptor ) { $parents = $this->method->getInheritedElement()->getArguments(); foreach ($parents as $parentArgument) { if ($parentArgument->getName() === $this->getName()) { return $parentArgument; } } } return null; } public function setDefault(?string $value): void { $this->default = $value; } public function getDefault(): ?string { return $this->default; } public function setByReference(bool $byReference): void { $this->byReference = $byReference; } public function isByReference(): bool { return $this->byReference; } public function setVariadic(bool $isVariadic): void { $this->isVariadic = $isVariadic; } public function isVariadic(): bool { return $this->isVariadic; } } documentationSets = $documentationSets; $this->number = $number; } public function getNumber(): string { return $this->number; } public function getDocumentationSets(): Collection { return $this->documentationSets; } public function getTableOfContents(): Collection { $tocs = Collection::fromClassString(TocDescriptor::class); foreach ($this->documentationSets as $documentationSet) { $tocs = $tocs->merge($documentationSet->getTableOfContents()); } return $tocs; } } parent = $parent; $this->setFullyQualifiedStructuralElementName( new Fqsen($parent->getFullyQualifiedStructuralElementName() . '::$' . $this->getName()) ); } public function getParent(): ?DescriptorAbstract { return $this->parent; } public function setDefault(?string $default): void { $this->default = $default; } public function getDefault(): ?string { return $this->default; } public function setStatic(bool $static): void { $this->static = $static; } public function isStatic(): bool { return $this->static; } public function setType(?Type $type): void { $this->type = $type; } public function getTypes(): array { if ($this->getType() instanceof Type) { return [(string) $this->getType()]; } return []; } public function getType(): ?Type { if ($this->type === null) { $var = $this->getVar()->getIterator()->current(); if ($var instanceof VarDescriptor) { return $var->getType(); } } return $this->type; } public function setVisibility(string $visibility): void { $this->visibility = $visibility; } public function getVisibility(): string { return $this->visibility; } public function getVar(): Collection { $var = $this->getTags()->fetch('var', new Collection()); if ($var->count() !== 0) { return $var; } $inheritedElement = $this->getInheritedElement(); if ($inheritedElement) { return $inheritedElement->getVar(); } return new Collection(); } public function getFile(): FileDescriptor { $file = $this->getParent()->getFile(); Assert::notNull($file); return $file; } public function getInheritedElement(): ?PropertyDescriptor { $associatedClass = $this->getParent(); if ( ($associatedClass instanceof ClassDescriptor || $associatedClass instanceof InterfaceDescriptor) && ($associatedClass->getParent() instanceof ClassDescriptor || $associatedClass->getParent() instanceof InterfaceDescriptor ) ) { $parentClass = $associatedClass->getParent(); return $parentClass->getProperties()->fetch($this->getName()); } return null; } public function setReadOnly(bool $value): void { $this->readOnly = $value; } public function isReadOnly(): bool { return $this->readOnly; } public function setWriteOnly(bool $value): void { $this->writeOnly = $value; } public function isWriteOnly(): bool { return $this->writeOnly; } } name = $name; $this->source = $source; $this->outputLocation = $outputLocation; $this->inputFormat = $inputFormat; $this->documents = Collection::fromClassString(DocumentDescriptor::class); $this->outputFormat = $outputFormat; $this->initialHeaderLevel = $initialHeaderLevel; } public function addDocument(string $file, DocumentDescriptor $documentDescriptor): void { $this->documents->set($file, $documentDescriptor); } public function getInputFormat(): string { return $this->inputFormat; } public function getOutputFormat(): string { return $this->outputFormat; } public function getInitialHeaderLevel(): int { return $this->initialHeaderLevel; } public function getDocuments(): Collection { return $this->documents; } } severity = $severity; $this->code = $code; $this->line = $line ?? 0; $this->context = $context; } public function getCode(): string { return $this->code; } public function getLine(): int { return $this->line; } public function getSeverity(): string { return $this->severity; } public function getContext(): array { return $this->context; } } name = $name; $this->entries = Collection::fromClassString(Entry::class); } public function getName(): string { return $this->name; } public function getDescription(): ?DocBlock\DescriptionDescriptor { return null; } public function addEntry(TableOfContents\Entry $entry): void { $this->entries->set($entry->getUrl(), $entry); } public function getRoots(): Collection { return Collection::fromClassString( Entry::class, array_filter( $this->entries->getAll(), static function (Entry $entry) { return $entry->getParent() === null; } ) ); } } tocs = Collection::fromClassString(TocDescriptor::class); } public function getName(): string { return $this->name; } public function addTableOfContents(TocDescriptor $descriptor): void { $this->tocs->set($descriptor->getName(), $descriptor); } public function getTableOfContents(): Collection { return $this->tocs; } public function getSource(): Source { return $this->source; } public function getOutputLocation(): string { return $this->outputLocation; } } setInterfaces(new Collection()); $this->setUsedTraits(new Collection()); $this->setConstants(new Collection()); $this->setProperties(new Collection()); $this->setMethods(new Collection()); } public function setParent($parent): void { $this->parent = $parent; } public function getParent() { return $this->parent; } public function setInterfaces(Collection $implements): void { $this->implements = $implements; } public function getInterfaces(): Collection { return $this->implements; } public function setFinal(bool $final): void { $this->final = $final; } public function isFinal(): bool { return $this->final; } public function setAbstract(bool $abstract): void { $this->abstract = $abstract; } public function isAbstract(): bool { return $this->abstract; } public function setConstants(Collection $constants): void { $this->constants = $constants; } public function getConstants(): Collection { return $this->constants; } public function getInheritedConstants(): Collection { if ($this->getParent() === null || (!$this->getParent() instanceof self)) { return new Collection(); } $inheritedConstants = $this->getParent()->getConstants(); return $inheritedConstants->merge($this->getParent()->getInheritedConstants()); } public function setMethods(Collection $methods): void { $this->methods = $methods; } public function getMethods(): Collection { return $this->methods; } public function getInheritedMethods(): Collection { $inheritedMethods = Collection::fromClassString(MethodDescriptor::class); foreach ($this->getUsedTraits() as $trait) { if (!$trait instanceof TraitDescriptor) { continue; } $inheritedMethods = $inheritedMethods->merge($trait->getMethods()); } if ($this->getParent() === null || (!$this->getParent() instanceof self)) { return $inheritedMethods; } $inheritedMethods = $inheritedMethods->merge($this->getParent()->getMethods()); return $inheritedMethods->merge($this->getParent()->getInheritedMethods()); } public function getMagicMethods(): Collection { $methodTags = $this->getTags()->fetch('method', new Collection())->filter(Tag\MethodDescriptor::class); $methods = Collection::fromClassString(MethodDescriptor::class); foreach ($methodTags as $methodTag) { $method = new MethodDescriptor(); $method->setName($methodTag->getMethodName()); $method->setDescription($methodTag->getDescription()); $method->setStatic($methodTag->isStatic()); $method->setParent($this); $method->setReturnType($methodTag->getResponse()->getType()); $returnTags = $method->getTags()->fetch('return', new Collection())->filter(ReturnDescriptor::class); $returnTags->add($methodTag->getResponse()); foreach ($methodTag->getArguments() as $name => $argument) { $method->addArgument($name, $argument); } $methods->add($method); } if ($this->getParent() instanceof static) { $methods = $methods->merge($this->getParent()->getMagicMethods()); } return $methods; } public function setProperties(Collection $properties): void { $this->properties = $properties; } public function getProperties(): Collection { return $this->properties; } public function getInheritedProperties(): Collection { $inheritedProperties = Collection::fromClassString(PropertyDescriptor::class); foreach ($this->getUsedTraits() as $trait) { if (!$trait instanceof TraitDescriptor) { continue; } $inheritedProperties = $inheritedProperties->merge($trait->getProperties()); } if ($this->getParent() === null || (!$this->getParent() instanceof self)) { return $inheritedProperties; } $inheritedProperties = $inheritedProperties->merge($this->getParent()->getProperties()); return $inheritedProperties->merge($this->getParent()->getInheritedProperties()); } public function getMagicProperties(): Collection { $tags = $this->getTags(); $propertyTags = $tags->fetch('property', new Collection())->filter(Tag\PropertyDescriptor::class) ->merge($tags->fetch('property-read', new Collection())->filter(Tag\PropertyDescriptor::class)) ->merge($tags->fetch('property-write', new Collection())->filter(Tag\PropertyDescriptor::class)); $properties = Collection::fromClassString(PropertyDescriptor::class); foreach ($propertyTags as $propertyTag) { $property = new PropertyDescriptor(); $property->setName(ltrim($propertyTag->getVariableName(), '$')); $property->setDescription($propertyTag->getDescription()); $property->setType($propertyTag->getType()); $property->setWriteOnly($propertyTag->getName() === 'property-write'); $property->setReadOnly($propertyTag->getName() === 'property-read'); try { $property->setParent($this); } catch (InvalidArgumentException $e) { $property->getErrors()->add( new Error( 'ERROR', sprintf( 'Property name is invalid %s', $e->getMessage() ), null ) ); } $properties->add($property); } if ($this->getParent() instanceof self) { $properties = $properties->merge($this->getParent()->getMagicProperties()); } return $properties; } public function setPackage($package): void { parent::setPackage($package); foreach ($this->getConstants() as $constant) { $constant->setPackage($package); } foreach ($this->getProperties() as $property) { $property->setPackage($package); } foreach ($this->getMethods() as $method) { $method->setPackage($package); } } public function setUsedTraits(Collection $usedTraits): void { $this->usedTraits = $usedTraits; } public function getUsedTraits(): Collection { return $this->usedTraits; } public function getInheritedElement() { return $this->getParent(); } } items = $items; } public function add($item): void { $this->items[] = $item; } public function set($index, $item): void { $this->offsetSet($index, $item); } public function get($index) { if (!isset($this->items[$index])) { throw new OutOfRangeException($index . ' offset not found in Collection'); } return $this->items[$index]; } /** @psalm @phpstan @template */ public function fetch($index, $valueIfEmpty = null) { if (!$this->offsetExists($index) && $valueIfEmpty !== null) { $this->offsetSet($index, $valueIfEmpty); } return $this->offsetGet($index); } public function getAll(): array { return $this->items; } public function getIterator(): ArrayIterator { return new ArrayIterator($this->items); } public function count(): int { return count($this->items); } public function clear(): void { $this->items = []; } /** @phpstan */ public function __get(string $name) { return $this->get($name); } public function offsetExists($offset): bool { return isset($this->items[$offset]); } public function offsetGet($offset) { return $this->offsetExists($offset) ? $this->items[$offset] : null; } public function offsetSet($offset, $value): void { if ($offset === '' || $offset === null) { throw new InvalidArgumentException('The key of a collection must always be set'); } Assert::notNull($value); $this->items[$offset] = $value; } public function offsetUnset($offset): void { unset($this->items[$offset]); } public function merge(self $collection): Collection { return new self(array_merge($this->items, $collection->getAll())); } /** @template */ public function filter(string $className): Collection { $collection = new self( array_filter( $this->getAll(), static function ($item) use ($className) { return $item instanceof $className; } ) ); return $collection; } /** @template */ public static function fromClassString(string $classString, array $elements = []): Collection { Assert::classExists($classString); return new Collection($elements); } } setFullyQualifiedStructuralElementName($data->getFqsen()); $traitDescriptor->setName($data->getName()); $traitDescriptor->setLine($data->getLocation()->getLineNumber()); $traitDescriptor->setPackage($this->extractPackageFromDocBlock($data->getDocBlock()) ?? ''); $traitDescriptor->setNamespace( substr((string) $data->getFqsen(), 0, -strlen($data->getName()) - 1) ); $this->assembleDocBlock($data->getDocBlock(), $traitDescriptor); $this->addProperties($data->getProperties(), $traitDescriptor); $this->addMethods($data->getMethods(), $traitDescriptor); return $traitDescriptor; } protected function addProperties(array $properties, TraitDescriptor $traitDescriptor): void { foreach ($properties as $property) { $propertyDescriptor = $this->getBuilder()->buildDescriptor($property, PropertyDescriptor::class); if ($propertyDescriptor === null) { continue; } $propertyDescriptor->setParent($traitDescriptor); $traitDescriptor->getProperties()->set($propertyDescriptor->getName(), $propertyDescriptor); } } protected function addMethods(array $methods, TraitDescriptor $traitDescriptor): void { foreach ($methods as $method) { $methodDescriptor = $this->getBuilder()->buildDescriptor($method, MethodDescriptor::class); if ($methodDescriptor === null) { continue; } $methodDescriptor->setParent($traitDescriptor); $traitDescriptor->getMethods()->set($methodDescriptor->getName(), $methodDescriptor); } } } setName($data->getName()); $descriptor->setFullyQualifiedStructuralElementName($data->getFqsen()); $namespace = substr((string) $data->getFqsen(), 0, -strlen($data->getName()) - 1); $descriptor->setNamespace($namespace === '' ? '\\' : $namespace); return $descriptor; } } setFullyQualifiedStructuralElementName($data->getFqsen()); $classDescriptor->setName($data->getName()); $classDescriptor->setPackage( $this->extractPackageFromDocBlock($data->getDocBlock()) ?? $this->getBuilder()->getDefaultPackage() ); $classDescriptor->setLine($data->getLocation()->getLineNumber()); if ((string) $data->getParent() !== (string) $data->getFqsen()) { $classDescriptor->setParent($data->getParent()); } $classDescriptor->setAbstract($data->isAbstract()); $classDescriptor->setFinal($data->isFinal()); $classDescriptor->setNamespace(substr((string) $data->getFqsen(), 0, -strlen($data->getName()) - 1)); $interfaces = $classDescriptor->getInterfaces(); foreach ($data->getInterfaces() as $interfaceClassName) { $interfaces->set((string) $interfaceClassName, $interfaceClassName); } $this->assembleDocBlock($data->getDocBlock(), $classDescriptor); $this->addConstants($data->getConstants(), $classDescriptor); $this->addProperties($data->getProperties(), $classDescriptor); $this->addMethods($data->getMethods(), $classDescriptor); $this->addUses($data->getUsedTraits(), $classDescriptor); return $classDescriptor; } protected function addConstants(array $constants, ClassDescriptor $classDescriptor): void { foreach ($constants as $constant) { $constantDescriptor = $this->getBuilder()->buildDescriptor($constant, ConstantDescriptor::class); if ($constantDescriptor === null) { continue; } $constantDescriptor->setParent($classDescriptor); $classDescriptor->getConstants()->set($constantDescriptor->getName(), $constantDescriptor); } } protected function addProperties(array $properties, ClassDescriptor $classDescriptor): void { foreach ($properties as $property) { $propertyDescriptor = $this->getBuilder()->buildDescriptor($property, PropertyDescriptor::class); if ($propertyDescriptor === null) { continue; } $propertyDescriptor->setParent($classDescriptor); $classDescriptor->getProperties()->set($propertyDescriptor->getName(), $propertyDescriptor); } } protected function addMethods(array $methods, ClassDescriptor $classDescriptor): void { foreach ($methods as $method) { $methodDescriptor = $this->getBuilder()->buildDescriptor($method, MethodDescriptor::class); if ($methodDescriptor === null) { continue; } $methodDescriptor->setParent($classDescriptor); $classDescriptor->getMethods()->set($methodDescriptor->getName(), $methodDescriptor); } } protected function addUses(array $traits, ClassDescriptor $classDescriptor): void { $classDescriptor->setUsedTraits(new Collection($traits)); } } reducers = $reducers; } public function create(object $data) { $descriptor = $this->buildDescriptor($data); foreach ($this->reducers as $reducer) { if ($reducer instanceof BaseAssembler) { $reducer->setBuilder($this->getBuilder()); } $descriptor = $reducer->create($data, $descriptor); } return $descriptor; } protected function buildDescriptor(object $data) { return null; } protected function assembleDocBlock(?DocBlock $docBlock, DescriptorAbstract $target): void { if (!$docBlock) { return; } $target->setSummary($docBlock->getSummary()); $reducer = new DescriptionAssemblerReducer(); $reducer->setBuilder($this->getBuilder()); $target = $reducer->create($docBlock, $target); foreach ($docBlock->getTags() as $tag) { $tagDescriptor = $this->builder->buildDescriptor($tag, TagDescriptor::class); if (!$tagDescriptor) { continue; } $target->getTags() ->fetch($tag->getName(), new Collection()) ->add($tagDescriptor); } } protected function extractPackageFromDocBlock(?DocBlock $docBlock): ?string { $packageTags = $docBlock ? $docBlock->getTagsByName('package') : []; if (count($packageTags) === 0) { return null; } $tag = reset($packageTags); return trim((string) $tag->getDescription()); } public static function deduplicateTypes(?Type $type): ?Type { if ($type instanceof Compound) { $normalizedTypes = []; foreach ($type->getIterator() as $typePart) { $normalizedTypes[(string) $typePart] = $typePart; } return new Compound(array_values($normalizedTypes)); } return $type; } } argumentAssembler = $argumentAssembler; } public function create(object $data): FunctionDescriptor { $functionDescriptor = new FunctionDescriptor(); $this->mapReflectorPropertiesOntoDescriptor($data, $functionDescriptor); $this->assembleDocBlock($data->getDocBlock(), $functionDescriptor); $this->addArgumentsToFunctionDescriptor($data->getArguments(), $functionDescriptor); return $functionDescriptor; } protected function mapReflectorPropertiesOntoDescriptor(Function_ $reflector, FunctionDescriptor $descriptor): void { $packages = Collection::fromClassString(TagDescriptor::class); $package = $this->extractPackageFromDocBlock($reflector->getDocBlock()); if ($package) { $tag = new TagDescriptor('package'); $tag->setDescription(new DescriptionDescriptor(new Description($package), [])); $packages->add($tag); } $descriptor->getTags()->set('package', $packages); $descriptor->setFullyQualifiedStructuralElementName($reflector->getFqsen()); $descriptor->setName($reflector->getName()); $descriptor->setLine($reflector->getLocation()->getLineNumber()); $descriptor->setNamespace('\\' . trim(substr( (string) $reflector->getFqsen(), 0, -strlen($reflector->getName()) - 2 ), '\\')); $descriptor->setReturnType($reflector->getReturnType()); $descriptor->setHasReturnByReference($reflector->getHasReturnByReference()); } protected function addArgumentsToFunctionDescriptor(array $arguments, FunctionDescriptor $functionDescriptor): void { foreach ($arguments as $argument) { $descriptor = $this->createArgumentDescriptor($functionDescriptor, $argument); $descriptor->setLine($functionDescriptor->getLine()); $this->addArgumentDescriptorToFunction( $functionDescriptor, $descriptor ); } } protected function addArgumentDescriptorToFunction( FunctionDescriptor $functionDescriptor, ArgumentDescriptor $argumentDescriptor ): void { $functionDescriptor->getArguments()->set($argumentDescriptor->getName(), $argumentDescriptor); } protected function createArgumentDescriptor( FunctionDescriptor $functionDescriptor, Argument $argument ): ArgumentDescriptor { $params = $functionDescriptor->getTags()->fetch('param', new Collection())->filter(ParamDescriptor::class); if (!$this->argumentAssembler->getBuilder()) { $this->argumentAssembler->setBuilder($this->builder); } return $this->argumentAssembler->create($argument, $params); } } setNamespace(substr((string) $data->getFqsen(), 0, -strlen($data->getName()) - 3)); $propertyDescriptor->setFullyQualifiedStructuralElementName($data->getFqsen()); $propertyDescriptor->setName($data->getName()); $propertyDescriptor->setVisibility((string) $data->getVisibility() ?: 'public'); $propertyDescriptor->setStatic($data->isStatic()); $propertyDescriptor->setReadOnly($data->isReadOnly()); $propertyDescriptor->setDefault($data->getDefault()); if ($data->getType()) { $propertyDescriptor->setType($data->getType()); } $this->assembleDocBlock($data->getDocBlock(), $propertyDescriptor); $propertyDescriptor->setLine($data->getLocation()->getLineNumber()); return $propertyDescriptor; } } setFullyQualifiedStructuralElementName($data->getFqsen()); $interfaceDescriptor->setName($data->getName()); $interfaceDescriptor->setLine($data->getLocation()->getLineNumber()); $interfaceDescriptor->setPackage($this->extractPackageFromDocBlock($data->getDocBlock()) ?? ''); $interfaceDescriptor->setNamespace(substr((string) $data->getFqsen(), 0, -strlen($data->getName()) - 1)); $this->assembleDocBlock($data->getDocBlock(), $interfaceDescriptor); $this->addConstants($data->getConstants(), $interfaceDescriptor); $this->addMethods($data->getMethods(), $interfaceDescriptor); $interfaceParent = $interfaceDescriptor->getParent(); foreach ($data->getParents() as $interfaceClassName) { $interfaceParent->set((string) $interfaceClassName, $interfaceClassName); } return $interfaceDescriptor; } protected function addConstants(array $constants, InterfaceDescriptor $interfaceDescriptor): void { foreach ($constants as $constant) { $constantDescriptor = $this->getBuilder()->buildDescriptor($constant, ConstantDescriptor::class); if ($constantDescriptor === null) { continue; } $constantDescriptor->setParent($interfaceDescriptor); $interfaceDescriptor->getConstants()->set($constantDescriptor->getName(), $constantDescriptor); } } protected function addMethods(array $methods, InterfaceDescriptor $interfaceDescriptor): void { foreach ($methods as $method) { $methodDescriptor = $this->getBuilder()->buildDescriptor($method, MethodDescriptor::class); if ($methodDescriptor === null) { continue; } $methodDescriptor->setParent($interfaceDescriptor); $interfaceDescriptor->getMethods()->set($methodDescriptor->getName(), $methodDescriptor); } } } setFullyQualifiedStructuralElementName($data->getFqsen()); $descriptor->setName($data->getName()); $descriptor->setLine($data->getLocation()->getLineNumber()); $descriptor->setValue($data->getValue()); $this->assembleDocBlock($data->getDocBlock() ?? new DocBlock(), $descriptor); return $descriptor; } } setName($data->getName()); $constantDescriptor->setValue($data->getValue()); $constantDescriptor->setFinal($data->isFinal()); $separatorLength = strpos((string) $data->getFqsen(), '::') === false ? 1 : 2; $constantDescriptor->setNamespace( substr((string) $data->getFqsen(), 0, -strlen($data->getName()) - $separatorLength) ); $constantDescriptor->setFullyQualifiedStructuralElementName($data->getFqsen()); $this->assembleDocBlock($data->getDocBlock(), $constantDescriptor); $constantDescriptor->setLine($data->getLocation()->getLineNumber()); $constantDescriptor->setVisibility((string) $data->getVisibility() ?: 'public'); return $constantDescriptor; } } getHash()); $fileDescriptor->setPackage( $this->extractPackageFromDocBlock($data->getDocBlock()) ?? $this->getBuilder()->getDefaultPackage() ); $fileDescriptor->setName($data->getName()); $fileDescriptor->setPath($data->getPath()); $fileDescriptor->setSource($data->getSource()); $fileDescriptor->setIncludes(new Collection($data->getIncludes())); $fileDescriptor->setNamespaceAliases(new Collection($data->getNamespaces())); $this->assembleDocBlock($data->getDocBlock(), $fileDescriptor); $this->overridePackageTag($data, $fileDescriptor); $this->addConstants($data->getConstants(), $fileDescriptor); $this->addFunctions($data->getFunctions(), $fileDescriptor); $this->addClasses($data->getClasses(), $fileDescriptor); $this->addEnums($data->getEnums(), $fileDescriptor); $this->addInterfaces($data->getInterfaces(), $fileDescriptor); $this->addTraits($data->getTraits(), $fileDescriptor); return $fileDescriptor; } protected function addConstants(array $constants, FileDescriptor $fileDescriptor): void { foreach ($constants as $constant) { $constantDescriptor = $this->getBuilder()->buildDescriptor($constant, ConstantDescriptor::class); if ($constantDescriptor === null) { continue; } $constantDescriptor->setLocation($fileDescriptor, $constant->getLocation()->getLineNumber()); if (count($constantDescriptor->getTags()->fetch('package', new Collection())) === 0) { $constantDescriptor->getTags() ->set('package', $fileDescriptor->getTags()->fetch('package', new Collection())); } $fileDescriptor->getConstants()->set( (string) $constantDescriptor->getFullyQualifiedStructuralElementName(), $constantDescriptor ); } } protected function addFunctions(array $functions, FileDescriptor $fileDescriptor): void { foreach ($functions as $function) { $functionDescriptor = $this->getBuilder()->buildDescriptor($function, FunctionDescriptor::class); if ($functionDescriptor === null) { continue; } $functionDescriptor->setLocation($fileDescriptor, $function->getLocation()->getLineNumber()); if (count($functionDescriptor->getTags()->fetch('package', new Collection())) === 0) { $functionDescriptor->getTags() ->set('package', $fileDescriptor->getTags()->fetch('package', new Collection())); } $fileDescriptor->getFunctions()->set( (string) $functionDescriptor->getFullyQualifiedStructuralElementName(), $functionDescriptor ); } } protected function addClasses(array $classes, FileDescriptor $fileDescriptor): void { foreach ($classes as $class) { $classDescriptor = $this->getBuilder()->buildDescriptor($class, ClassDescriptor::class); if ($classDescriptor === null) { continue; } $classDescriptor->setLocation($fileDescriptor, $class->getLocation()->getLineNumber()); if (count($classDescriptor->getTags()->fetch('package', new Collection())) === 0) { $classDescriptor->getTags()->set( 'package', $fileDescriptor->getTags()->fetch('package', new Collection()) ); } $fileDescriptor->getClasses()->set( (string) $classDescriptor->getFullyQualifiedStructuralElementName(), $classDescriptor ); } } private function addEnums(array $enums, FileDescriptor $fileDescriptor): void { foreach ($enums as $enum) { $enumDescriptor = $this->getBuilder()->buildDescriptor($enum, EnumDescriptor::class); if ($enumDescriptor === null) { continue; } $enumDescriptor->setLocation($fileDescriptor, $enum->getLocation()->getLineNumber()); if (count($enumDescriptor->getTags()->fetch('package', new Collection())) === 0) { $enumDescriptor->getTags()->set( 'package', $fileDescriptor->getTags()->fetch('package', new Collection()) ); } $fileDescriptor->getEnums()->set( (string) $enumDescriptor->getFullyQualifiedStructuralElementName(), $enumDescriptor ); } } protected function addInterfaces(array $interfaces, FileDescriptor $fileDescriptor): void { foreach ($interfaces as $interface) { $interfaceDescriptor = $this->getBuilder()->buildDescriptor($interface, InterfaceDescriptor::class); if ($interfaceDescriptor === null) { continue; } $interfaceDescriptor->setLocation($fileDescriptor, $interface->getLocation()->getLineNumber()); if (count($interfaceDescriptor->getTags()->fetch('package', new Collection())) === 0) { $interfaceDescriptor->getTags() ->set('package', $fileDescriptor->getTags()->fetch('package', new Collection())); } $fileDescriptor->getInterfaces()->set( (string) $interfaceDescriptor->getFullyQualifiedStructuralElementName(), $interfaceDescriptor ); } } protected function addTraits(array $traits, FileDescriptor $fileDescriptor): void { foreach ($traits as $trait) { $traitDescriptor = $this->getBuilder()->buildDescriptor($trait, TraitDescriptor::class); if ($traitDescriptor === null) { continue; } $traitDescriptor->setLocation($fileDescriptor, $trait->getLocation()->getLineNumber()); if (count($traitDescriptor->getTags()->fetch('package', new Collection())) === 0) { $traitDescriptor->getTags() ->set('package', $fileDescriptor->getTags()->fetch('package', new Collection())); } $fileDescriptor->getTraits()->set( (string) $traitDescriptor->getFullyQualifiedStructuralElementName(), $traitDescriptor ); } } protected function overridePackageTag(File $data, FileDescriptor $fileDescriptor): void { $packages = Collection::fromClassString(TagDescriptor::class); $package = $this->extractPackageFromDocBlock($data->getDocBlock()); if (!$package) { $package = $this->getBuilder()->getDefaultPackage(); } $tag = new TagDescriptor('package'); $tag->setDescription(new DescriptionDescriptor(new Description($package), [])); $packages->add($tag); $fileDescriptor->getTags()->set('package', $packages); } } setFullyQualifiedStructuralElementName($data->getFqsen()); $descriptor->setName($data->getName()); $descriptor->setPackage( $this->extractPackageFromDocBlock($data->getDocBlock()) ?? $this->getBuilder()->getDefaultPackage() ); $descriptor->setLine($data->getLocation()->getLineNumber()); $descriptor->setNamespace(substr((string) $data->getFqsen(), 0, -strlen($data->getName()) - 1)); $descriptor->setBackedType($data->getBackedType()); $interfaces = $descriptor->getInterfaces(); foreach ($data->getInterfaces() as $interfaceClassName) { $interfaces->set((string) $interfaceClassName, $interfaceClassName); } $this->assembleDocBlock($data->getDocBlock(), $descriptor); $this->addCases($data->getCases(), $descriptor); $this->addMethods($data->getMethods(), $descriptor); $this->addUses($data->getUsedTraits(), $descriptor); return $descriptor; } private function addMethods(array $methods, EnumDescriptor $descriptor): void { foreach ($methods as $method) { $methodDescriptor = $this->getBuilder()->buildDescriptor($method, MethodDescriptor::class); if ($methodDescriptor === null) { continue; } $methodDescriptor->setParent($descriptor); $descriptor->getMethods()->set($methodDescriptor->getName(), $methodDescriptor); } } private function addUses(array $traits, EnumDescriptor $descriptor): void { $descriptor->setUsedTraits(new Collection($traits)); } private function addCases(array $cases, EnumDescriptor $descriptor): void { foreach ($cases as $case) { $caseDescriptor = $this->getBuilder()->buildDescriptor($case, EnumCaseDescriptor::class); if ($caseDescriptor === null) { continue; } $descriptor->getCases()->set($caseDescriptor->getName(), $caseDescriptor); } } } getName()); $descriptor->setVariableName((string) $data->getVariableName()); $descriptor->setType($data->getType()); return $descriptor; } } getName()); $descriptor->setVersion((string) $data->getVersion()); return $descriptor; } } getName()); $descriptor->setVersion($data->getVersion()); return $descriptor; } } getName()); $reference = $data->getReference(); $descriptor->setReference($reference); return $descriptor; } } getName()); $descriptor->setVariableName($data->getVariableName()); $descriptor->setType($data->getType()); return $descriptor; } } finder = $finder; } public function buildDescriptor(object $data): ExampleDescriptor { Assert::isInstanceOf($data, Example::class); $descriptor = new ExampleDescriptor($data->getName()); $descriptor->setFilePath($data->getFilePath()); $descriptor->setStartingLine($data->getStartingLine()); $descriptor->setLineCount($data->getLineCount()); $descriptor->setDescription(new DescriptionDescriptor(new Description($data->getDescription() ?? ''), [])); $descriptor->setExample($this->finder->find($data)); return $descriptor; } } getName()); $reference = $data->getReference(); $descriptor->setReference($reference); return $descriptor; } } getName()); $descriptor->setVariableName((string) $data->getVariableName()); $descriptor->setType($data->getType()); return $descriptor; } } getName()); } } getName()); $descriptor->setDescription(new DescriptionDescriptor(new Description((string) $data), [])); $descriptor->getErrors()->add( new Error( 'ERROR', sprintf( 'Tag "%s" with body "%s" has error %s', $data->getName(), $data->render(), $data->getException() === null ? '' : $data->getException()->getMessage() ), null ) ); return $descriptor; } } getName()); $descriptor->setType(AssemblerAbstract::deduplicateTypes($data->getType())); return $descriptor; } } */ class DeprecatedAssembler extends BaseTagAssembler { public function buildDescriptor(object $data): DeprecatedDescriptor { $descriptor = new DeprecatedDescriptor($data->getName()); $descriptor->setVersion($data->getVersion() ?: ''); return $descriptor; } } getName()); $tag->setDescription(new DescriptionDescriptor(new Description((string) $data), [])); return $tag; } } getName()); $descriptor->setMethodName($data->getMethodName()); $descriptor->setStatic($data->isStatic()); $response = new ReturnDescriptor('return'); $response->setType($data->getReturnType()); $descriptor->setResponse($response); foreach ($data->getArguments() as $argument) { if (!array_key_exists('name', $argument) || !array_key_exists('type', $argument)) { continue; } $argumentDescriptor = $this->createArgumentDescriptorForMagicMethod( $argument['name'], $argument['type'] ); $descriptor->getArguments()->set($argumentDescriptor->getName(), $argumentDescriptor); } return $descriptor; } private function createArgumentDescriptorForMagicMethod(string $name, Type $type): ArgumentDescriptor { $argumentDescriptor = new ArgumentDescriptor(); $argumentDescriptor->setType($type); $argumentDescriptor->setName($name); return $argumentDescriptor; } } getName()); $descriptor->setLink($data->getLink()); return $descriptor; } } getName()); $descriptor->setType($data->getType()); return $descriptor; } } argumentAssembler = $argumentAssembler; } public function create(object $data): MethodDescriptor { $methodDescriptor = new MethodDescriptor(); $methodDescriptor->setNamespace( substr( (string) $data->getFqsen(), 0, strrpos((string) $data->getFqsen(), '\\') ) ); $this->mapReflectorToDescriptor($data, $methodDescriptor); $this->assembleDocBlock($data->getDocBlock(), $methodDescriptor); $this->addArguments($data, $methodDescriptor); $this->addVariadicArgument($data, $methodDescriptor); return $methodDescriptor; } protected function mapReflectorToDescriptor(Method $reflector, MethodDescriptor $descriptor): void { $descriptor->setFullyQualifiedStructuralElementName($reflector->getFqsen()); $descriptor->setName($reflector->getName()); $descriptor->setVisibility((string) $reflector->getVisibility() ?: 'public'); $descriptor->setFinal($reflector->isFinal()); $descriptor->setAbstract($reflector->isAbstract()); $descriptor->setStatic($reflector->isStatic()); $descriptor->setLine($reflector->getLocation()->getLineNumber()); $descriptor->setReturnType($reflector->getReturnType()); $descriptor->setHasReturnByReference($reflector->getHasReturnByReference()); } protected function addArguments(Method $reflector, MethodDescriptor $descriptor): void { foreach ($reflector->getArguments() as $argument) { $this->addArgument($argument, $descriptor); } } protected function addArgument(Argument $argument, MethodDescriptor $descriptor): void { $params = $descriptor->getTags()->fetch('param', new Collection())->filter(ParamDescriptor::class); if (!$this->argumentAssembler->getBuilder()) { $this->argumentAssembler->setBuilder($this->builder); } $argumentDescriptor = $this->argumentAssembler->create($argument, $params); $argumentDescriptor->setLine($descriptor->getLine()); $descriptor->addArgument($argumentDescriptor->getName(), $argumentDescriptor); } protected function addVariadicArgument(Method $data, MethodDescriptor $methodDescriptor): void { if (!$data->getDocBlock()) { return; } $paramTags = $data->getDocBlock()->getTagsByName('param'); $lastParamTag = end($paramTags); if (!$lastParamTag instanceof Param) { return; } if ( !$lastParamTag->isVariadic() || !array_key_exists($lastParamTag->getVariableName(), $methodDescriptor->getArguments()->getAll()) ) { return; } $types = $lastParamTag->getType(); $argument = new ArgumentDescriptor(); $argument->setName($lastParamTag->getVariableName()); $argument->setType($types); $argument->setDescription(new DescriptionDescriptor($lastParamTag->getDescription(), [])); $argument->setLine($methodDescriptor->getLine()); $argument->setVariadic(true); $methodDescriptor->getArguments()->set($argument->getName(), $argument); } } getDescription(), $data->getDescription() !== null ? $this->createTags($data->getDescription()->getTags()) : [] ); $descriptor->setDescription($description); return $descriptor; } private function createTags(array $tags): array { $result = []; foreach ($tags as $tag) { $result[] = $this->builder->buildDescriptor($tag, TagDescriptor::class); } return $result; } } setName($data->getName()); $argumentDescriptor->setType($data->getType()); foreach ($params as $paramDescriptor) { $this->overwriteTypeAndDescriptionFromParamTag($data, $paramDescriptor, $argumentDescriptor); } $argumentDescriptor->setDefault($this->pretifyValue($data->getDefault())); $argumentDescriptor->setByReference($data->isByReference()); $argumentDescriptor->setVariadic($data->isVariadic()); return $argumentDescriptor; } protected function overwriteTypeAndDescriptionFromParamTag( Argument $argument, ParamDescriptor $paramDescriptor, ArgumentDescriptor $argumentDescriptor ): void { if ($paramDescriptor->getVariableName() !== $argument->getName()) { return; } $argumentDescriptor->setDescription($paramDescriptor->getDescription()); $argumentDescriptor->setType($paramDescriptor->getType()); } protected function pretifyValue(?string $value): ?string { if ($value === null) { return null; } return stripcslashes($value); } } assemblers[] = new AssemblerMatcher($matcher, $assembler); } public function registerFallback(Matcher $matcher, AssemblerInterface $assembler): void { $this->fallbackAssemblers[] = new AssemblerMatcher($matcher, $assembler); } /** @psalm @psalm */ public function get(object $criteria, string $type): ?AssemblerInterface { foreach (array_merge($this->assemblers, $this->fallbackAssemblers) as $candidate) { if ($candidate->match($criteria)) { return $candidate->getAssembler(); } } return null; } public static function createDefault(ExampleFinder $exampleFinder): self { $factory = new self(); $argumentAssembler = new ArgumentAssembler(); $descriptionReducer = new DescriptionAssemblerReducer(); $factory->register(Matcher::forType(File::class), new FileAssembler()); $factory->register(Matcher::forType(Constant::class), new ConstantAssembler()); $factory->register(Matcher::forType(Trait_::class), new TraitAssembler()); $factory->register(Matcher::forType(Class_::class), new ClassAssembler()); $factory->register(Matcher::forType(Enum_::class), new EnumAssembler()); $factory->register(Matcher::forType(EnumCase::class), new EnumCaseAssembler()); $factory->register(Matcher::forType(Interface_::class), new InterfaceAssembler()); $factory->register(Matcher::forType(Property::class), new PropertyAssembler()); $factory->register(Matcher::forType(Argument::class), $argumentAssembler); $factory->register(Matcher::forType(Method::class), new MethodAssembler($argumentAssembler)); $factory->register(Matcher::forType(Function_::class), new FunctionAssembler($argumentAssembler)); $factory->register(Matcher::forType(Namespace_::class), new NamespaceAssembler()); $factory->register(Matcher::forType(Author::class), new AuthorAssembler()); $factory->register(Matcher::forType(Deprecated::class), new DeprecatedAssembler()); $factory->register(Matcher::forType(Example::class), new ExampleAssembler($exampleFinder)); $factory->register(Matcher::forType(Link::class), new LinkAssembler($descriptionReducer)); $factory->register(Matcher::forType(Tags\Method::class), new MethodTagAssembler()); $factory->register(Matcher::forType(Tags\Property::class), new PropertyTagAssembler()); $factory->register(Matcher::forType(Tags\PropertyRead::class), new PropertyTagAssembler()); $factory->register(Matcher::forType(Tags\PropertyWrite::class), new PropertyTagAssembler()); $factory->register(Matcher::forType(Tags\InvalidTag::class), new InvalidTagAssembler()); $factory->register(Matcher::forType(Var_::class), new VarAssembler()); $factory->register(Matcher::forType(Param::class), new ParamAssembler()); $factory->register(Matcher::forType(Throws::class), new ThrowsAssembler()); $factory->register(Matcher::forType(Return_::class), new ReturnAssembler()); $factory->register(Matcher::forType(Uses::class), new UsesAssembler()); $factory->register(Matcher::forType(See::class), new SeeAssembler()); $factory->register(Matcher::forType(Since::class), new SinceAssembler()); $factory->register(Matcher::forType(Version::class), new VersionAssembler()); $factory->registerFallback(Matcher::forType(Tag::class), new GenericTagAssembler()); return $factory; } } builder; } public function setBuilder(ProjectDescriptorBuilder $builder): void { $this->builder = $builder; } } matcher = $matcher; $this->assembler = $assembler; } public function match(object $criteria): bool { $matcher = $this->matcher; return $matcher($criteria); } public function getAssembler(): AssemblerInterface { return $this->assembler; } } type, true); } private function __construct(string $type) { $this->type = $type; } } cache = $descriptors; } public function populate(ProjectDescriptor $projectDescriptor): void { $this->loadCacheItemAsSettings($projectDescriptor); $fileList = $this->cache->getItem(self::FILE_LIST)->get(); if ($fileList === null) { return; } foreach ($this->cache->getItems($fileList) as $item) { $file = $item->get(); if (!($file instanceof FileDescriptor)) { continue; } $projectDescriptor->getFiles()->set($file->getPath(), $file); } } public function save(ProjectDescriptor $projectDescriptor): void { $fileListItem = $this->cache->getItem(self::FILE_LIST); $currentFileList = $fileListItem->get(); $item = $this->cache->getItem(self::KEY_SETTINGS); $this->cache->saveDeferred($item->set($projectDescriptor->getSettings())); $fileKeys = []; foreach ($projectDescriptor->getFiles() as $file) { $key = self::FILE_PREFIX . md5($file->getPath()); $fileKeys[] = $key; $item = $this->cache->getItem($key); $this->cache->saveDeferred($item->set($file)); } $this->cache->saveDeferred($fileListItem->set($fileKeys)); $this->cache->commit(); if ($currentFileList === null) { return; } $invalidatedKeys = array_diff($currentFileList, $fileKeys); if (!$invalidatedKeys) { return; } $this->cache->deleteItems($invalidatedKeys); } public function garbageCollect(array $files): void { $fileListItem = $this->cache->getItem(self::FILE_LIST); $cachedFileList = $fileListItem->get(); if ($cachedFileList === null) { return; } $realFileKeys = array_map( static function (File $file) { return self::FILE_PREFIX . md5($file->path()); }, $files ); $this->cache->deleteItems(array_diff($cachedFileList, $realFileKeys)); } private function loadCacheItemAsSettings(ProjectDescriptor $projectDescriptor): void { $item = $this->cache->getItem(self::KEY_SETTINGS); if (!$item->isHit()) { return; } $settings = $item->get(); $projectDescriptor->setSettings($settings); } } setName($name); $this->errors = Collection::fromClassString(Validation\Error::class); $this->setDescription($description); } protected function setName(string $name): void { $this->name = $name; } public function getName(): string { return $this->name; } public function setDescription(?DescriptionDescriptor $description): void { $this->description = $description ?? new DescriptionDescriptor(new Description(''), []); } public function getDescription(): DescriptionDescriptor { return $this->description; } public function __toString(): string { return (string) $this->description; } public function setErrors(Collection $errors): void { $this->errors = $errors; } public function getErrors(): Collection { return $this->errors; } } setValueAndCheckIfModified('visibility', $visibilityFlag); } public function getVisibility(): int { return $this->visibility; } public function isModified(): bool { return $this->isModified; } public function clearModifiedFlag(): void { $this->isModified = false; } public function includeSource(): void { $this->setValueAndCheckIfModified('includeSource', true); } public function excludeSource(): void { $this->setValueAndCheckIfModified('includeSource', false); } public function shouldIncludeSource(): bool { return $this->includeSource; } public function getCustom(): array { return $this->custom; } public function setCustom(array $settings): void { $this->setValueAndCheckIfModified('custom', $settings); } private function setValueAndCheckIfModified(string $propertyName, $value): void { if ($this->{$propertyName} !== $value) { $this->isModified = true; } $this->{$propertyName} = $value; } } getApiSpecification()->isVisibilityAllowed( ApiSpecification::VISIBILITY_INTERNAL ); if ($isInternalAllowed) { return $payload; } $filterable = $payload->getFilterable(); if ($filterable === null) { return $payload; } if ($filterable->getDescription() !== null) { foreach ($filterable->getDescription()->getTags() as $position => $tag) { if ($tag->getName() !== 'internal') { continue; } $filterable->getDescription()->replaceTag($position, null); } } if ($filterable instanceof DescriptorAbstract) { if ($filterable->getTags()->fetch('internal')) { return new FilterPayload(null, $payload->getApiSpecification()); } } return $payload; } } getFilterable() instanceof TagDescriptor) { return $payload; } if (in_array($payload->getFilterable()->getName(), $payload->getApiSpecification()->getIgnoredTags())) { return new FilterPayload(null, $payload->getApiSpecification()); } return $payload; } } getFilterable() instanceof DescriptorAbstract) { return $payload; } if ($payload->getFilterable()->getTags()->fetch('ignore')) { return new FilterPayload(null, $payload->getApiSpecification()); } return $payload; } } getFilterable() !== null; }); $this->pipeline = new Pipeline($nullInteruption, ...$filters); } /** @template */ public function filter(Filterable $descriptor, ApiSpecification $apiSpecification): ?Filterable { return $this->pipeline->process(new FilterPayload($descriptor, $apiSpecification))->getFilterable(); } } getFilterable() instanceof DescriptorAbstract) { return $payload; } $filterable = $payload->getFilterable(); if ( isset($filterable->getTags()['api']) && $payload->getApiSpecification()->isVisibilityAllowed(ApiSpecification::VISIBILITY_API) ) { return $payload; } if (!$filterable instanceof VisibilityInterface) { return $payload; } if ($payload->getApiSpecification()->isVisibilityAllowed($this->toVisibility($filterable->getVisibility()))) { return $payload; } return new FilterPayload(null, $payload->getApiSpecification()); } private function toVisibility(string $visibility): int { switch ($visibility) { case 'public': return ApiSpecification::VISIBILITY_PUBLIC; case 'protected': return ApiSpecification::VISIBILITY_PROTECTED; case 'private': return ApiSpecification::VISIBILITY_PRIVATE; } throw new InvalidArgumentException($visibility . ' is not a valid visibility'); } } filterable = $filterable; $this->apiSpecification = $apiSpecification; } public function getFilterable(): ?Filterable { return $this->filterable; } public function getApiSpecification(): ApiSpecification { return $this->apiSpecification; } } name = $name; $this->source = $source; $this->outputLocation = $outputLocation; $this->apiSpecification = $apiSpecification; } public function getSettings(): ApiSpecification { return $this->apiSpecification; } } getFullyQualifiedStructuralElementName() . '::' . $this->getName() : $this->getName(); $this->setFullyQualifiedStructuralElementName(new Fqsen($fqsen)); $this->parent = $parent; } public function getParent(): ?DescriptorAbstract { return $this->parent; } public function setTypes(Type $types): void { $this->types = $types; } public function getTypes(): array { return array_filter([$this->getType()]); } public function getType(): ?Type { if ($this->types === null) { $var = $this->getVar()->fetch(0); if ($var instanceof VarDescriptor) { return $var->getType(); } } return $this->types; } public function setValue(string $value): void { $this->value = $value; } public function getValue(): string { return $this->value; } public function getVar(): Collection { $var = $this->getTags()->fetch('var', new Collection()); if ($var->count() !== 0) { return $var; } $inheritedElement = $this->getInheritedElement(); if ($inheritedElement) { return $inheritedElement->getVar(); } return new Collection(); } public function getFile(): FileDescriptor { $file = parent::getFile() ?? $this->getParent()->getFile(); Assert::notNull($file); return $file; } public function getInheritedElement(): ?ConstantDescriptor { $associatedClass = $this->getParent(); if ( ($associatedClass instanceof ClassDescriptor || $associatedClass instanceof InterfaceDescriptor) && ($associatedClass->getParent() instanceof ClassDescriptor || $associatedClass->getParent() instanceof InterfaceDescriptor ) ) { $parentClass = $associatedClass->getParent(); return $parentClass->getConstants()->fetch($this->getName()); } return null; } public function setVisibility(string $visibility): void { $this->visibility = $visibility; } public function getVisibility(): string { return $this->visibility; } public function setFinal(bool $final): void { $this->isFinal = $final; } public function isFinal(): bool { return $this->isFinal; } } value = $value; } public function getValue(): ?string { return $this->value; } } setProperties(new Collection()); $this->setMethods(new Collection()); $this->setUsedTraits(new Collection()); } public function setMethods(Collection $methods): void { $this->methods = $methods; } public function getMethods(): Collection { return $this->methods; } public function getInheritedMethods(): Collection { return new Collection(); } public function getMagicMethods(): Collection { $methodTags = $this->getTags()->fetch('method', new Collection()); $methods = Collection::fromClassString(MethodDescriptor::class); foreach ($methodTags as $methodTag) { $method = new MethodDescriptor(); $method->setName($methodTag->getMethodName()); $method->setDescription($methodTag->getDescription()); $method->setStatic($methodTag->isStatic()); $method->setParent($this); $returnTags = $method->getTags()->fetch('return', new Collection()); $returnTags->add($methodTag->getResponse()); foreach ($methodTag->getArguments() as $name => $argument) { $method->addArgument($name, $argument); } $methods->add($method); } return $methods; } public function setProperties(Collection $properties): void { $this->properties = $properties; } public function getProperties(): Collection { return $this->properties; } public function getInheritedProperties(): Collection { return new Collection(); } public function getMagicProperties(): Collection { $tags = $this->getTags(); $propertyTags = $tags->fetch('property', new Collection())->filter(Tag\PropertyDescriptor::class) ->merge($tags->fetch('property-read', new Collection())->filter(Tag\PropertyDescriptor::class)) ->merge($tags->fetch('property-write', new Collection())->filter(Tag\PropertyDescriptor::class)); $properties = Collection::fromClassString(PropertyDescriptor::class); foreach ($propertyTags as $propertyTag) { $property = new PropertyDescriptor(); $property->setName(ltrim($propertyTag->getVariableName(), '$')); $property->setDescription($propertyTag->getDescription()); $property->setType($propertyTag->getType()); try { $property->setParent($this); } catch (InvalidArgumentException $e) { $property->getErrors()->add( new Error( 'ERROR', sprintf( 'Property name is invalid %s', $e->getMessage() ), null ) ); } $properties->add($property); } return $properties; } public function setPackage($package): void { parent::setPackage($package); foreach ($this->getProperties() as $property) { $property->setPackage($package); } foreach ($this->getMethods() as $method) { $method->setPackage($package); } } public function setUsedTraits(Collection $usedTraits): void { $this->usedTraits = $usedTraits; } public function getUsedTraits(): Collection { return $this->usedTraits; } } setTags(new Collection()); $this->setErrors(new Collection()); } public function setFullyQualifiedStructuralElementName(Fqsen $name): void { $this->fqsen = $name; } public function getFullyQualifiedStructuralElementName(): ?Fqsen { return $this->fqsen; } public function setName(string $name): void { $this->name = $name; } public function getName(): string { return $this->name; } public function setNamespace($namespace): void { $this->namespace = $namespace; } public function getNamespace() { return $this->namespace; } public function setSummary(string $summary): void { $this->summary = $summary; } public function getSummary(): string { if ($this->summary && strtolower(trim($this->summary)) !== '{@inheritdoc}') { return $this->summary; } $parent = $this->getInheritedElement(); if ($parent instanceof self) { return $parent->getSummary(); } return $this->summary; } public function setDescription(?DocBlock\DescriptionDescriptor $description): void { $this->description = $description; } public function getDescription(): ?DocBlock\DescriptionDescriptor { if ($this->description !== null) { return $this->description; } $parentElement = $this->getInheritedElement(); if ($parentElement instanceof self) { return $parentElement->getDescription(); } return null; } public function setLocation(FileDescriptor $file, int $line = 0): void { $this->setFile($file); $this->line = $line; } public function getPath(): string { return $this->fileDescriptor ? $this->fileDescriptor->getPath() : ''; } public function getFile(): ?FileDescriptor { return $this->fileDescriptor; } public function setFile(FileDescriptor $file): void { $this->fileDescriptor = $file; } public function getLine(): int { return $this->line; } public function setLine(int $lineNumber): void { $this->line = $lineNumber; } public function setTags(Collection $tags): void { $this->tags = $tags; } public function getTags(): Collection { return $this->tags; } public function setPackage($package): void { $this->package = $package; } public function getPackage(): ?PackageDescriptor { $inheritedElement = $this->getInheritedElement(); if ( $this->package instanceof PackageDescriptor && !($this->package->getName() === '\\' && $inheritedElement) ) { return $this->package; } if ($inheritedElement instanceof self) { return $inheritedElement->getPackage(); } return null; } public function getAuthor(): Collection { $author = $this->getTags()->fetch('author', new Collection()); if ($author->count() !== 0) { return $author; } $inheritedElement = $this->getInheritedElement(); if ($inheritedElement) { return $inheritedElement->getAuthor(); } return new Collection(); } public function getVersion(): Collection { $version = $this->getTags()->fetch('version', new Collection()); if ($version->count() !== 0) { return $version; } $inheritedElement = $this->getInheritedElement(); if ($inheritedElement) { return $inheritedElement->getVersion(); } return new Collection(); } public function getCopyright(): Collection { $copyright = $this->getTags()->fetch('copyright', new Collection()); if ($copyright->count() !== 0) { return $copyright; } $inheritedElement = $this->getInheritedElement(); if ($inheritedElement) { return $inheritedElement->getCopyright(); } return new Collection(); } public function isDeprecated(): bool { return isset($this->tags['deprecated']); } public function setErrors(Collection $errors): void { $this->errors = $errors; } public function getErrors(): Collection { $errors = $this->errors; foreach ($this->tags as $tags) { foreach ($tags as $tag) { $errors = $errors->merge($tag->getErrors()); } } return $errors; } public function __call(string $name, array $arguments) { if (strpos($name, 'get') !== 0) { return null; } $tagName = substr($name, 3); $tagName = lcfirst($tagName); return $this->getTags()->fetch($tagName, new Collection()); } public function __toString(): string { return (string) $this->getFullyQualifiedStructuralElementName(); } public function getInheritedElement() { return $this->inheritedElement; } } setParent(new Collection()); $this->setConstants(new Collection()); $this->setMethods(new Collection()); } public function setParent(Collection $parents): void { $this->parents = $parents; } public function getParent(): Collection { return $this->parents; } public function setConstants(Collection $constants): void { $this->constants = $constants; } public function getConstants(): Collection { return $this->constants; } public function getInheritedConstants(): Collection { $inheritedConstants = Collection::fromClassString(ConstantDescriptor::class); foreach ($this->getParent() as $parent) { if (!$parent instanceof Interfaces\InterfaceInterface) { continue; } $inheritedConstants = $inheritedConstants->merge($parent->getConstants()); $inheritedConstants = $inheritedConstants->merge($parent->getInheritedConstants()); } return $inheritedConstants; } public function setMethods(Collection $methods): void { $this->methods = $methods; } public function getMethods(): Collection { return $this->methods; } public function getInheritedMethods(): Collection { $inheritedMethods = Collection::fromClassString(MethodDescriptor::class); foreach ($this->getParent() as $parent) { if ($parent instanceof Fqsen) { continue; } $inheritedMethods = $inheritedMethods->merge($parent->getMethods()); $inheritedMethods = $inheritedMethods->merge($parent->getInheritedMethods()); } return $inheritedMethods; } public function setPackage($package): void { parent::setPackage($package); foreach ($this->getConstants() as $constant) { $constant->setPackage($package); } foreach ($this->getMethods() as $method) { $method->setPackage($package); } } public function getInheritedElement(): ?object { return $this->getParent()->count() > 0 ? $this->getParent()->getIterator()->current() : null; } } setArguments(new Collection()); } public function setParent(DescriptorAbstract $parent): void { $this->setFullyQualifiedStructuralElementName( new Fqsen($parent->getFullyQualifiedStructuralElementName() . '::' . $this->getName() . '()') ); $this->inheritedElement = null; $this->parent = $parent; } public function getParent(): ?DescriptorAbstract { return $this->parent; } public function setAbstract(bool $abstract): void { $this->abstract = $abstract; } public function isAbstract(): bool { return $this->abstract; } public function setFinal(bool $final): void { $this->final = $final; } public function isFinal(): bool { return $this->final; } public function setStatic(bool $static): void { $this->static = $static; } public function isStatic(): bool { return $this->static; } public function setVisibility(string $visibility): void { $this->visibility = $visibility; } public function getVisibility(): string { return $this->visibility; } public function setArguments(Collection $arguments): void { $this->arguments = Collection::fromClassString(ArgumentDescriptor::class); foreach ($arguments as $argument) { $this->addArgument($argument->getName(), $argument); } } public function addArgument(string $name, ArgumentDescriptor $argument): void { $argument->setMethod($this); $this->arguments->set($name, $argument); } public function getArguments(): Collection { return $this->arguments; } public function getResponse(): ReturnDescriptor { $definedReturn = new ReturnDescriptor('return'); $definedReturn->setType($this->returnType); $returnTags = $this->getReturn(); if ($returnTags instanceof Collection && $returnTags->count() > 0) { return current($returnTags->getAll()); } return $definedReturn; } public function getFile(): FileDescriptor { $file = $this->getParent()->getFile(); Assert::notNull($file); return $file; } public function getReturn(): Collection { $var = $this->getTags()->fetch('return', new Collection())->filter(ReturnDescriptor::class); if ($var->count() !== 0) { return $var; } $inheritedElement = $this->getInheritedElement(); if ($inheritedElement) { return $inheritedElement->getReturn(); } return new Collection(); } public function getParam(): Collection { $var = $this->getTags()->fetch('param', new Collection()); if ($var instanceof Collection && $var->count() > 0) { return $var; } $inheritedElement = $this->getInheritedElement(); if ($inheritedElement) { return $inheritedElement->getParam(); } return new Collection(); } public function getInheritedElement(): ?MethodDescriptor { if ($this->inheritedElement !== null) { Assert::isInstanceOf($this->inheritedElement, self::class); return $this->inheritedElement; } $associatedClass = $this->getParent(); if (!$associatedClass instanceof ClassDescriptor && !$associatedClass instanceof InterfaceDescriptor) { return null; } $parentClass = $associatedClass->getParent(); if ($parentClass instanceof ClassDescriptor || $parentClass instanceof Collection) { $parents = $parentClass instanceof ClassDescriptor ? [$parentClass] : $parentClass->filter(InterfaceDescriptor::class); foreach ($parents as $parent) { $parentMethod = $parent->getMethods()->fetch($this->getName()); if ($parentMethod instanceof self) { $this->inheritedElement = $parentMethod; return $this->inheritedElement; } } } if ($associatedClass instanceof ClassDescriptor) { foreach ($associatedClass->getInterfaces() as $interface) { if ($interface instanceof Fqsen) { continue; } $parentMethod = $interface->getMethods()->fetch($this->getName()); if ($parentMethod instanceof self) { $this->inheritedElement = $parentMethod; return $this->inheritedElement; } } } return null; } public function setReturnType(Type $returnType): void { $this->returnType = $returnType; } public function setHasReturnByReference(bool $hasReturnByReference): void { $this->hasReturnByReference = $hasReturnByReference; } public function getHasReturnByReference(): bool { return $this->hasReturnByReference; } } path = $path; $this->contents = $contents; } public function getContents(): string { return $this->contents->toString(); } public function md5(): string { return md5($this->getContents()); } public function path(): string { return $this->path; } } orSpecification(new Glob($path)); } $ignoreSpec = null; foreach ($ignore['paths'] ?? [] as $path) { if ($ignoreSpec === null) { $ignoreSpec = new Glob($path); continue; } $ignoreSpec = $ignoreSpec->orSpecification(new Glob($path)); } if (($ignore['hidden'] ?? false) === true) { $ignoreSpec = $ignoreSpec === null ? new IsHidden() : $ignoreSpec->orSpecification(new IsHidden()); } $result = new HasExtension($extensions); if ($ignoreSpec !== null) { $result = $result->andSpecification(new NotSpecification($ignoreSpec)); } if ($pathSpec !== null) { $result = $result->andSpecification($pathSpec); } return $result; } } specificationFactory = $specificationFactory; $this->flySystemFactory = $flySystemFactory; } public function getFiles(Dsn $dsn, array $paths, array $ignore, array $extensions): array { $specs = $this->specificationFactory->create($paths, $ignore, $extensions); $fileSystem = $this->flySystemFactory->create($dsn); $files = []; foreach ($fileSystem->find($specs) as $file) { $files[] = new FlySystemFile($fileSystem, $file['path']); } return $files; } } file = $file; return $this; } public function getFile(): string { return $this->file; } } fileCount = $fileCount; return $this; } public function getFileCount(): int { return $this->fileCount; } } mountManager = $mountManager; } public function create(Dsn $dsn): Filesystem { $dsnId = hash('md5', (string) $dsn); try { $filesystem = $this->mountManager->getFilesystem($dsnId); } catch (LogicException $e) { $filesystem = new Filesystem($this->createAdapter($dsn)); $this->mountManager->mountFilesystem($dsnId, $filesystem); } $filesystem->addPlugin(new Finder()); Assert::isInstanceOf($filesystem, Filesystem::class); return $filesystem; } private function createAdapter(Dsn $dsn): AdapterInterface { if (!in_array($dsn->getScheme(), [null, 'file', 'vfs', 'phar'], true)) { throw new InvalidArgumentException(sprintf('"%s" is not a supported file system yet', $dsn->getScheme())); } return new Local( $this->formatDsn($dsn), $dsn->getScheme() !== 'vfs' ? LOCK_EX : 0, Local::SKIP_LINKS ); } private function formatDsn(Dsn $dsn): string { if (PHP_OS_FAMILY === 'Windows' && $dsn->isWindowsLocalPath() && $dsn->getScheme() === 'file') { return (string) $dsn->getPath(); } return (string) $dsn; } } fileSystem = $fileSystem; $this->fileName = $fileName; } public function getContents(): string { $contents = $this->fileSystem->read($this->fileName); Assert::notFalse($contents); return $contents; } public function md5(): string { return md5($this->getContents()); } public function path(): string { return $this->fileName; } } marshaller = new DefaultMarshaller(); parent::__construct($namespace, $defaultLifetime); $this->init($namespace, sys_get_temp_dir() . '/phpdocumentor'); } public function init(string $namespace, string $directory): void { $this->doInit($namespace, $directory); } } fileCache = $files; $this->descriptorCache = $descriptors; } public function providePath(Path $path): void { $this->path = $path; $this->fileCache->init('files', (string) $path); $this->descriptorCache->init('descriptors', (string) $path); } public function locate(string $namespace = ''): Path { $namespacePath = rtrim(sprintf('%s/%s', (string) $this->root(), $namespace), '/'); if (!is_dir($namespacePath) && !@mkdir($namespacePath, 0777, true)) { $error = error_get_last(); if ($error) { throw new RuntimeException( sprintf( 'Received error "%s", while attempting to create directory "%s"', $error['message'], $namespacePath ) ); } } return new Path($namespacePath); } private function root(): Path { if ($this->path === null) { throw new RuntimeException('Cache folder has not been set yet, please call `providePath` first'); } return $this->path; } } encoding = $defaultEncoding; } $this->projectFactory = $projectFactory; $this->stopwatch = $stopwatch; $this->logger = $logger; } public function setValidate(bool $validate): void { $this->validate = $validate; } public function doValidation(): bool { return $this->validate; } public function setMarkers(array $markers): void { $this->markers = $markers; } public function getMarkers(): array { return $this->markers; } public function setPath(string $path): void { $this->path = $path; } public function getPath(): string { return $this->path; } public function setDefaultPackageName(string $defaultPackageName): void { $this->defaultPackageName = $defaultPackageName; } public function getDefaultPackageName(): string { return $this->defaultPackageName; } public function setEncoding(string $encoding): void { $this->encoding = $encoding; } public function getEncoding(): string { return $this->encoding; } public function parse(array $files): Project { $this->startTimingTheParsePhase(); $event = PreParsingEvent::createInstance($this); Assert::isInstanceOf($event, PreParsingEvent::class); Dispatcher::getInstance() ->dispatch( $event->setFileCount(count($files)), 'parser.pre' ); $project = $this->projectFactory->create(ProjectDescriptorBuilder::DEFAULT_PROJECT_NAME, $files); $this->logAfterParsingAllFiles(); return $project; } private function logAfterParsingAllFiles(): void { $event = $this->stopwatch->stop('parser.parse'); $this->log('Elapsed time to parse all files: ' . round($event->getDuration() / 1000, 2) . 's'); $this->log('Peak memory usage: ' . round($event->getMemory() / 1024 / 1024, 2) . 'M'); } private function log(string $message, string $priority = LogLevel::INFO, array $parameters = []): void { $this->logger->log($priority, $message, $parameters); } private function startTimingTheParsePhase(): void { $this->stopwatch->start('parser.parse'); } } $source, 'destination' => $destination]); $contents = $mountManager->listContents('source://' . $sourcePath, true); $mountManager->createDir('destination://' . $destinationPath); foreach ($contents as $fileNode) { if ($fileNode['type'] === 'dir') { $mountManager->createDir('destination://' . $destinationPath . '/' . $fileNode['path']); continue; } $mountManager->put( 'destination://' . $destinationPath . '/' . $fileNode['path'], $mountManager->read('source://' . $sourcePath . '/' . $fileNode['path']) ); } } } dispatch( PreFileEvent::createInstance($this)->setFile($command->getFile()->path()), 'parser.file.pre' ); } return $next($command); } } logger = $logger; } public function execute(Command $command, callable $next): object { Assert::isInstanceOf($command, CreateCommand::class); $filename = $command->getFile()->path(); $this->log('Starting to parse file: ' . $filename); try { return $next($command); } catch (Throwable $e) { $this->log( ' Unable to parse file "' . $filename . '", an error was detected: ' . $e->getMessage(), LogLevel::ALERT ); $this->log(' -- Found in ' . $e->getFile() . ' at line ' . $e->getLine(), LogLevel::NOTICE); $this->log(' ' . $e->getTraceAsString(), LogLevel::DEBUG); } return new File('', $command->getFile()->path()); } private function log(string $message, string $priority = LogLevel::INFO, array $parameters = []): void { $this->logger->log($priority, $message, $parameters); } } stopwatch = $stopwatch; $this->logger = $logger; } public function execute(Command $command, callable $next): object { $result = $next($command); $lap = $this->stopwatch->lap('parser.parse'); $oldMemory = $this->memory; $periods = $lap->getPeriods(); $memory = end($periods)->getMemory(); $differenceInMemory = $memory - $oldMemory; $this->log( sprintf( '>> Memory after processing of file: %s megabytes (%s kilobytes)', $this->formatMemoryInMegabytes($memory), ($differenceInMemory >= 0 ? '+' : '-') . $this->formatMemoryInKilobytes($differenceInMemory) ), LogLevel::DEBUG ); $this->memory = $memory; return $result; } private function log(string $message, string $priority = LogLevel::INFO, array $parameters = []): void { $this->logger->log($priority, $message, $parameters); } private function formatMemoryInMegabytes(int $memory): string { return number_format($memory / 1024 / 1024, 2); } private function formatMemoryInKilobytes(int $memory): string { return number_format($memory / 1024); } } cache = $files; $this->logger = $logger; } public function execute(Command $command, callable $next): object { Assert::isInstanceOf($command, CreateCommand::class); $itemName = md5($command->getFile()->path()); $cacheResponse = $this->cache->get( $itemName . '-' . $command->getFile()->md5(), function () use ($next, $command) { $this->logger->log(LogLevel::NOTICE, 'Parsing ' . $command->getFile()->path()); $file = $next($command); return base64_encode(serialize($file)); } ); return unserialize(base64_decode($cacheResponse)); } } encoding = $encoding; } public function execute(Command $command, callable $next): object { if (!$command instanceof CreateCommand) { return $next($command); } $file = new ReEncodedFile( $command->getFile()->path(), (new ByteString($command->getFile()->getContents()))->toUnicodeString($this->encoding) ); return $next(new CreateCommand($command->getContext(), $file, $command->getStrategies())); } } router = $router; $this->logger = $logger; } public function getDescription(): string { return 'Builds table of contents for api documentation sets'; } public function execute(ProjectDescriptor $project): void { foreach ($project->getVersions() as $version) { foreach ($version->getDocumentationSets() as $documentationSet) { if ($documentationSet instanceof ApiSetDescriptor) { if ($project->getNamespace()->getChildren()->count() > 0) { $namespacesToc = new TocDescriptor('Namespaces'); foreach ($project->getNamespace()->getChildren() as $child) { $this->createNamespaceEntries($child, $namespacesToc); } $documentationSet->addTableOfContents($namespacesToc); } if ($project->getPackage()->getChildren()->count() > 0) { $packagesToc = new TocDescriptor('Packages'); foreach ($project->getPackage()->getChildren() as $child) { $this->createNamespaceEntries($child, $packagesToc); } $documentationSet->addTableOfContents($packagesToc); } } if (!($documentationSet instanceof GuideSetDescriptor)) { continue; } $documents = $documentationSet->getDocuments(); $index = $documents->fetch('index'); if ($index === null) { continue; } $guideToc = new TocDescriptor($index->getTitle()); $this->createGuideEntries($index, $documents, $guideToc); $documentationSet->addTableOfContents($guideToc); } } } private function createNamespaceEntries( NamespaceDescriptor $namespace, TocDescriptor $namespacesToc, ?Entry $parent = null ): void { $entry = new Entry( ltrim($this->router->generate($namespace), '/'), (string) $namespace->getFullyQualifiedStructuralElementName(), $parent !== null ? $parent->getUrl() : null ); if ($parent !== null) { $parent->addChild($entry); } $namespacesToc->addEntry($entry); foreach ($namespace->getChildren() as $child) { $this->createNamespaceEntries($child, $namespacesToc, $entry); } } private function createGuideEntries( DocumentDescriptor $documentDescriptor, Collection $documents, TocDescriptor $guideToc, ?Entry $parent = null ): void { foreach ($documentDescriptor->getTocs() as $toc) { foreach ($toc->getFiles() as $file) { $subDocument = $documents->fetch(ltrim($file, '/')); if ($subDocument === null) { $this->logger->error(sprintf('Toc contains a link to a missing document %s', $file)); continue; } $entry = new Entry( 'guide/' . ltrim($this->router->generate($subDocument), '/'), $subDocument->getTitle(), $parent !== null ? $parent->getUrl() : null ); if ($parent !== null) { $parent->addChild($entry); } $guideToc->addEntry($entry); if ($subDocument->getFile() === $documentDescriptor->getFile()) { continue; } $this->createGuideEntries($subDocument, $documents, $guideToc, $entry); } } } } getIndexes()->fetch('elements', new Collection())->set('~\\', $project->getNamespace()); $project->getIndexes()->fetch('namespaces', new Collection())->set('\\', $project->getNamespace()); foreach ($project->getFiles() as $file) { $this->addElementsOfTypeToNamespace($project, $file->getConstants()->getAll(), 'constants'); $this->addElementsOfTypeToNamespace($project, $file->getFunctions()->getAll(), 'functions'); $this->addElementsOfTypeToNamespace($project, $file->getClasses()->getAll(), 'classes'); $this->addElementsOfTypeToNamespace($project, $file->getInterfaces()->getAll(), 'interfaces'); $this->addElementsOfTypeToNamespace($project, $file->getTraits()->getAll(), 'traits'); $this->addElementsOfTypeToNamespace($project, $file->getEnums()->getAll(), 'enums'); } foreach ($project->getIndexes()->get('namespaces')->getAll() as $namespace) { if ($namespace->getNamespace() === '') { continue; } $this->addToParentNamespace($project, $namespace); } } protected function addElementsOfTypeToNamespace(ProjectDescriptor $project, array $elements, string $type): void { foreach ($elements as $element) { $namespaceName = (string) $element->getNamespace(); if ($namespaceName === '') { $namespaceName = '\\'; } $namespace = $project->getIndexes()->fetch('namespaces', new Collection())->fetch($namespaceName); if ($namespace === null) { $namespace = new NamespaceDescriptor(); $fqsen = new Fqsen($namespaceName); $namespace->setName($fqsen->getName()); $namespace->setFullyQualifiedStructuralElementName($fqsen); $namespaceName = substr((string) $fqsen, 0, -strlen($fqsen->getName()) - 1); $namespace->setNamespace($namespaceName); $project->getIndexes() ->fetch('namespaces', new Collection()) ->set((string) $namespace->getFullyQualifiedStructuralElementName(), $namespace); $this->addToParentNamespace($project, $namespace); } Assert::isInstanceOf($namespace, NamespaceDescriptor::class); $element->setNamespace($namespace); $getter = 'get' . ucfirst($type); $collection = $namespace->{$getter}(); $collection->add($element); } } private function addToParentNamespace(ProjectDescriptor $project, NamespaceDescriptor $namespace): void { $parent = $project->getIndexes()->fetch( 'namespaces', new Collection() )->fetch((string) $namespace->getNamespace()); $project->getIndexes()->fetch('elements', new Collection())->set( '~' . (string) $namespace->getFullyQualifiedStructuralElementName(), $namespace ); try { if ($parent === null) { $parent = new NamespaceDescriptor(); $fqsen = new Fqsen($namespace->getNamespace()); $parent->setFullyQualifiedStructuralElementName($fqsen); $parent->setName($fqsen->getName()); $namespaceName = substr((string) $fqsen, 0, -strlen($parent->getName()) - 1); $parent->setNamespace($namespaceName === '' ? '\\' : $namespaceName); $project->getIndexes() ->fetch('namespaces', new Collection()) ->set((string) $parent->getFullyQualifiedStructuralElementName(), $parent); $this->addToParentNamespace($project, $parent); } $namespace->setParent($parent); $parent->getChildren()->set($namespace->getName(), $namespace); } catch (InvalidArgumentException $e) { } } } getVersions() as $version) { foreach ($version->getDocumentationSets() as $documentationSet) { if ( !$documentationSet instanceof ApiSetDescriptor || $documentationSet->getSettings()['include-source'] ) { continue; } foreach ($project->getFiles() as $file) { $file->setSource(null); } } } } } parser = $parser; } public const COMPILER_PRIORITY = 9001; public function getDescription(): string { return 'Build "packages" index'; } public function execute(ProjectDescriptor $project): void { $packages = Collection::fromClassString(PackageDescriptor::class); $packages['\\'] = $project->getPackage(); foreach ($project->getFiles() as $file) { $this->addElementsOfTypeToPackage($packages, [$file], 'files'); $this->addElementsOfTypeToPackage($packages, $file->getConstants()->getAll(), 'constants'); $this->addElementsOfTypeToPackage($packages, $file->getFunctions()->getAll(), 'functions'); $this->addElementsOfTypeToPackage($packages, $file->getClasses()->getAll(), 'classes'); $this->addElementsOfTypeToPackage($packages, $file->getInterfaces()->getAll(), 'interfaces'); $this->addElementsOfTypeToPackage($packages, $file->getTraits()->getAll(), 'traits'); } $project->getIndexes()->set('packages', $packages); } private function addElementsOfTypeToPackage(Collection $packages, array $elements, string $type): void { foreach ($elements as $element) { $packageName = ''; $packageTags = $element->getTags()->fetch('package'); if ($packageTags instanceof Collection) { $packageTag = $packageTags->getIterator()->current(); if ($packageTag instanceof TagDescriptor) { $packageName = $this->normalizePackageName((string) $packageTag->getDescription()); } } $subpackageCollection = $element->getTags()->fetch('subpackage'); if ($subpackageCollection instanceof Collection && $subpackageCollection->count() > 0) { $subpackageTag = $subpackageCollection->getIterator()->current(); if ($subpackageTag instanceof TagDescriptor) { $packageName .= '\\' . $this->normalizePackageName((string) $subpackageTag->getDescription()); } } if ($packageName === '') { $packageName = $this->parser->getDefaultPackageName(); } $packageIndexName = '\\' . ltrim($packageName, '\\'); if (!isset($packages[$packageIndexName])) { $this->createPackageDescriptorTree($packages, $packageName); } $package = $packages[$packageIndexName]; $element->setPackage($package); $getter = 'get' . ucfirst($type); $collection = $package->{$getter}(); $collection->add($element); } } private function createPackageDescriptorTree(Collection $packages, string $packageName): void { $parts = explode('\\', ltrim($packageName, '\\')); $fqnn = ''; $pointer = $packages['\\']; foreach ($parts as $part) { $fqnn .= '\\' . $part; if ($pointer->getChildren()->fetch($part)) { $pointer = $pointer->getChildren()->get($part); continue; } $interimPackageDescriptor = new PackageDescriptor(); $interimPackageDescriptor->setParent($pointer); $interimPackageDescriptor->setName($part); $interimPackageDescriptor->setFullyQualifiedStructuralElementName(new Fqsen($fqnn)); $pointer->getChildren()->set($part ?: 'UNKNOWN', $interimPackageDescriptor); $packages[$fqnn] = $interimPackageDescriptor; $pointer = $interimPackageDescriptor; } } private function normalizePackageName(string $packageName): string { $name = rtrim(str_replace(['.', '_', '-', '[', ']'], ['\\', '\\', '\\', '\\', '\\'], $packageName), '\\'); return preg_replace('/[^A-Za-z0-9\\\\]/', '', $name); } } getIndexes()->fetch('elements', new Collection()) as $element) { $todos = $element->getTags()->fetch('todo'); if (!$todos) { continue; } foreach ($todos as $todo) { $fileDescriptor = $this->getFileDescriptor($element); $this->addTodoMarkerToFile($fileDescriptor, $todo, $element->getLine()); } } } private function getFileDescriptor(DescriptorAbstract $element): FileDescriptor { $fileDescriptor = $element instanceof FileDescriptor ? $element : $element->getFile(); if (!$fileDescriptor instanceof FileDescriptor) { throw new UnexpectedValueException('An element should always have a file associated with it'); } return $fileDescriptor; } private function addTodoMarkerToFile(FileDescriptor $fileDescriptor, TagDescriptor $todo, int $lineNumber): void { $fileDescriptor->getMarkers()->add( [ 'type' => 'TODO', 'message' => (string) $todo->getDescription(), 'line' => $lineNumber, ] ); } } log = $log; $this->analyzer = $analyzer; } public function getDescription(): string { return 'Analyze results and write report to log'; } public function execute(ProjectDescriptor $project): void { $this->analyzer->analyze($project); $this->log->debug((string) $this->analyzer); } } getIndexes()->set('elements', $elementCollection); $constantsIndex = $project->getIndexes()->fetch('constants', new Collection()); $functionsIndex = $project->getIndexes()->fetch('functions', new Collection()); $classesIndex = $project->getIndexes()->fetch('classes', new Collection()); $interfacesIndex = $project->getIndexes()->fetch('interfaces', new Collection()); $traitsIndex = $project->getIndexes()->fetch('traits', new Collection()); $enumsIndex = $project->getIndexes()->fetch('enums', new Collection()); foreach ($project->getFiles() as $file) { $this->addElementsToIndexes($file->getConstants()->getAll(), [$constantsIndex, $elementCollection]); $this->addElementsToIndexes($file->getFunctions()->getAll(), [$functionsIndex, $elementCollection]); foreach ($file->getClasses()->getAll() as $element) { $this->addElementsToIndexes($element, [$classesIndex, $elementCollection]); $this->addElementsToIndexes($this->getSubElements($element), [$elementCollection]); } foreach ($file->getInterfaces()->getAll() as $element) { $this->addElementsToIndexes($element, [$interfacesIndex, $elementCollection]); $this->addElementsToIndexes($this->getSubElements($element), [$elementCollection]); } foreach ($file->getTraits()->getAll() as $element) { $this->addElementsToIndexes($element, [$traitsIndex, $elementCollection]); $this->addElementsToIndexes($this->getSubElements($element), [$elementCollection]); } foreach ($file->getEnums()->getAll() as $element) { $this->addElementsToIndexes($element, [$enumsIndex, $elementCollection]); $this->addElementsToIndexes($this->getSubElements($element), [$elementCollection]); } } } protected function getSubElements(DescriptorAbstract $element): array { $subElements = []; if ($element instanceof ClassInterface) { $subElements = array_merge( $element->getMethods()->getAll(), $element->getConstants()->getAll(), $element->getProperties()->getAll() ); } if ($element instanceof InterfaceInterface) { $subElements = array_merge( $element->getMethods()->getAll(), $element->getConstants()->getAll() ); } if ($element instanceof TraitInterface) { $subElements = array_merge( $element->getMethods()->getAll(), $element->getProperties()->getAll() ); } if ($element instanceof EnumInterface) { $subElements = array_merge( $element->getMethods()->getAll(), $element->getCases()->getAll() ); } return $subElements; } protected function addElementsToIndexes($elements, array $indexes): void { if (!is_array($elements)) { $elements = [$elements]; } foreach ($elements as $element) { foreach ($indexes as $collection) { $collection->set($this->getIndexKey($element), $element); } } } protected function getIndexKey(DescriptorAbstract $element): string { return (string) $element->getFullyQualifiedStructuralElementName(); } } getVersions() as $version) { foreach ($version->getDocumentationSets() as $documentationSet) { if ($documentationSet instanceof ApiSetDescriptor === false) { continue; } $markerTerms = $documentationSet->getSettings()['markers']; foreach ($project->getFiles() as $file) { $matches = []; $source = $file->getSource() ?? ''; preg_match_all( '~//[\s]*(' . implode('|', $markerTerms) . ')\:?[\s]*(.*)~', $source, $matches, PREG_SET_ORDER | PREG_OFFSET_CAPTURE ); foreach ($matches as $match) { [$before] = str_split($source, $match[1][1]); $lineNumber = strlen($before) - strlen(str_replace("\n", '', $before)) + 1; $file->getMarkers()->add( [ 'type' => trim($match[1][0], '@'), 'line' => $lineNumber, 'message' => $match[2][0], ] ); } } } } } } substitutions = $substitutions; $this->descriptorRepository = $descriptorRepository; } public function execute(ProjectDescriptor $project): void { $this->descriptorRepository->setObjectAliasesList($project->getIndexes()->elements->getAll()); $this->substitute($project); } public function getSubstitutions(): array { return $this->substitutions; } public function substitute($item, ?DescriptorAbstract $container = null) { if ($item instanceof Type) { return null; } if ($item instanceof Fqsen) { return $this->descriptorRepository->findAlias((string) $item, $container); } if (is_string($item)) { return $this->descriptorRepository->findAlias($item, $container); } if (is_iterable($item)) { Assert::true(is_array($item) || $item instanceof Collection); return $this->substituteChildrenOfCollection($item, $container); } if (!is_object($item)) { return null; } $this->substituteMembersOfObject($item, $container); return null; } private function substituteChildrenOfCollection(iterable $collection, ?DescriptorAbstract $container): ?iterable { $isModified = false; foreach ($collection as $key => $element) { $element = $this->substitute($element, $container); if ($element === null) { continue; } $isModified = true; $collection[$key] = $element; } if ($isModified) { return $collection; } return null; } private function findFieldValue(object $object, string $fieldName) { $getter = 'get' . ucfirst($fieldName); return $object->{$getter}(); } /** @psalm */ private function isDescriptorContainer(object $item): bool { return $item instanceof FileDescriptor || $item instanceof NamespaceDescriptor || $item instanceof ClassDescriptor || $item instanceof TraitDescriptor || $item instanceof InterfaceDescriptor || $item instanceof EnumInterface; } private function substituteMembersOfObject(object $object, ?DescriptorAbstract $container): void { $hash = spl_object_hash($object); if (isset($this->processedObjects[$hash])) { return; } $newContainer = $this->isDescriptorContainer($object) ? $object : $container; $this->processedObjects[$hash] = $hash; $objectClassName = get_class($object); $fieldNames = $this->substitutions[$objectClassName] ?? []; foreach ($fieldNames as $fieldName) { $fieldValue = $this->findFieldValue($object, $fieldName); $response = $this->substitute($fieldValue, $newContainer); if ($response === null) { continue; } $setter = 'set' . ucfirst($fieldName); $object->{$setter}($response); } } } fetchElementByFqsen($fqsen); } $fqsen = $this->replacePseudoTypes($fqsen, $container); if (!$this->isContextMarkerInFqsen($fqsen)) { return $this->fetchElementByFqsen($fqsen); } $classMember = $this->fetchElementByFqsen($this->getTypeWithClassAsContext($fqsen, $container)); if ($classMember) { return $classMember; } $namespaceContext = $this->getTypeWithNamespaceAsContext($fqsen, $container); $namespaceMember = $this->fetchElementByFqsen($namespaceContext); if ($namespaceMember) { return $namespaceMember; } $globalNamespaceContext = $this->getTypeWithGlobalNamespaceAsContext($fqsen); $globalNamespaceMember = $this->fetchElementByFqsen($globalNamespaceContext); if ($globalNamespaceMember) { return $globalNamespaceMember; } return $namespaceContext; } public function setObjectAliasesList(array $elementList): void { $this->elementList = $elementList; } private function replacePseudoTypes(string $fqsen, DescriptorAbstract $container): string { $pseudoTypes = ['self', '$this']; foreach ($pseudoTypes as $pseudoType) { if (strpos($fqsen, $pseudoType . '::') !== 0 && $fqsen !== $pseudoType) { continue; } return sprintf( '%s%s', (string) $container->getFullyQualifiedStructuralElementName(), substr($fqsen, strlen($pseudoType)) ); } return $fqsen; } private function isContextMarkerInFqsen(string $fqsen): bool { return strpos($fqsen, self::CONTEXT_MARKER) !== false; } private function getTypeWithClassAsContext(string $fqsen, DescriptorAbstract $container): string { if ( !$container instanceof ClassDescriptor && !$container instanceof InterfaceDescriptor && !$container instanceof TraitDescriptor && !$container instanceof EnumDescriptor ) { return $fqsen; } $containerFqsen = $container->getFullyQualifiedStructuralElementName(); return str_replace(self::CONTEXT_MARKER . '::', $containerFqsen . '::', $fqsen); } private function getTypeWithNamespaceAsContext(string $fqsen, DescriptorAbstract $container): string { $namespace = $container instanceof NamespaceDescriptor ? $container : $container->getNamespace(); $fqnn = $namespace instanceof NamespaceDescriptor ? $namespace->getFullyQualifiedStructuralElementName() : $namespace; return str_replace(self::CONTEXT_MARKER . '::', $fqnn . '\\', $fqsen); } private function getTypeWithGlobalNamespaceAsContext(string $fqsen): string { return str_replace(self::CONTEXT_MARKER . '::', '\\', $fqsen); } private function fetchElementByFqsen(string $fqsen): ?DescriptorAbstract { return $this->elementList[$fqsen] ?? null; } } makeDsnRelativeToConfig($configuration, $uri); $configuration['phpdocumentor']['paths']['cache'] = $this->normalizeCachePath($uri, $configuration['phpdocumentor']['paths']['cache']); return $this->normalizePaths($configuration); } private function makeDsnRelativeToConfig(Configuration $configuration, ?UriInterface $uri): Configuration { if ($uri === null) { return $configuration; } $configFile = Dsn::createFromUri($uri); $configPath = $configFile->withPath(Path::dirname($configFile->getPath())); $configuration['phpdocumentor']['paths']['output'] = $configuration['phpdocumentor']['paths']['output']->resolve($configPath); foreach ($configuration['phpdocumentor']['versions'] as $version) { $apiConfigs = []; foreach ($version->getApi() as $api) { $apiConfigs[] = $api->withSource($api->source()->withDsn($api['source']['dsn']->resolve($configPath))); } $version->setApi($apiConfigs); foreach ($version->getGuides() ?? [] as $key => $guide) { $version->guides[$key]->withSource( $guide->source()->withDsn( $guide->source()->dsn()->resolve($configPath) ) ); } } return $configuration; } private function normalizePaths(Configuration $configuration): Configuration { foreach ($configuration['phpdocumentor']['versions'] as $version) { foreach ($version->getApi() as $key => $api) { $api->setIgnore( array_merge( $api['ignore'], [ 'paths' => array_map( function (string $path): string { return $this->pathToGlobPattern($path); }, $api['ignore']['paths'] ), ] ) ); $version->api[$key] = $api; } foreach ($version->getGuides() ?? [] as $key => $guide) { $version->guides[$key] = $guide->withSource( $guide->source()->withPaths( array_map( function (string $path): Path { return new Path($this->normalizePath((string) $path)); }, $guide->source()->paths() ) ) ); } } return $configuration; } private function normalizePath(string $path): string { if (strpos($path, '.') === 0) { $path = ltrim($path, '.'); } if (strpos($path, '/') !== 0) { $path = '/' . $path; } return rtrim($path, '/'); } private function pathToGlobPattern(string $path): string { $path = $this->normalizePath($path); if (substr($path, -1) !== '*' && strpos($path, '.') === false) { $path .= '/**/*'; } return $path; } public function normalizeCachePath(?UriInterface $uri, Path $cachePath): Path { if ($cachePath::isAbsolutePath((string) $cachePath)) { return $cachePath; } if ($uri === null) { return $cachePath; } $configFile = Dsn::createFromUri($uri); $configPath = $configFile->withPath(Path::dirname($configFile->getPath())); return Dsn::createFromString((string) $cachePath)->resolve($configPath)->getPath(); } } environmentFactory = $environmentFactory; } public function __invoke(Configuration $configuration, ?UriInterface $pathOfConfigFile = null): Configuration { $path = $this->normalizePath($pathOfConfigFile, new Path(self::PATH_TO_TEMPLATE_OVERRIDES)); if (file_exists((string) $path)) { $this->environmentFactory->withTemplateOverridesAt($path); } return $configuration; } private function normalizePath(?UriInterface $uri, Path $path): Path { if ($uri === null) { return new Path(getcwd() . '/' . $path); } $configFile = Dsn::createFromUri($uri); $configPath = $configFile->withPath(Path::dirname($configFile->getPath())); return Dsn::createFromString((string) $path)->resolve($configPath)->getPath(); } } source = $source; $this->output = $output; $this->format = $format; } public function source(): Source { return $this->source; } public function withSource(Source $source): self { $clone = clone $this; $clone->source = $source; return $clone; } public function getOutput(): string { return $this->output; } public function getFormat(): string { return $this->format; } } options = $options; $this->configFactory = $configFactory; $this->currentWorkingDir = Dsn::createFromString($currentWorkingDir); } public function __invoke(Configuration $configuration, ?UriInterface $uri = null): Configuration { $configuration = $this->overwriteDestinationFolder($configuration); $configuration = $this->disableCache($configuration); $configuration = $this->overwriteCacheFolder($configuration); $configuration = $this->overwriteTitle($configuration); $configuration = $this->overwriteTemplates($configuration); $configuration = $this->overwriteSettings($configuration); if (!isset($configuration['phpdocumentor']['versions'])) { $configuration['phpdocumentor']['versions']['1.0.0'] = $this->createDefaultVersionSettings(); } if ($this->shouldReduceNumberOfVersionsToOne($configuration)) { $configuration['phpdocumentor']['versions'] = [ '1.0.0' => end($configuration['phpdocumentor']['versions']), ]; } foreach ($configuration['phpdocumentor']['versions'] as &$version) { $version = $this->setDirectoriesInPath($version); $version = $this->setFilesInPath($version); $version = $this->registerExtensions($version); $version = $this->overwriteIgnoredPaths($version); $version = $this->overwriteIgnoredTags($version); $version = $this->overwriteMarkers($version); $version = $this->overwriteIncludeSource($version); $version = $this->overwriteVisibility($version); $version = $this->overwriteExamples($version); $version = $this->overwriteEncoding($version); $version = $this->overwriteDefaultPackageName($version); } return $configuration; } private function overwriteDestinationFolder(Configuration $configuration): Configuration { if (isset($this->options['target']) && $this->options['target']) { $configuration['phpdocumentor']['paths']['output'] = Dsn::createFromString($this->options['target']) ->resolve($this->currentWorkingDir); } return $configuration; } private function disableCache(Configuration $configuration): Configuration { if (isset($this->options['force']) && $this->options['force']) { $configuration['phpdocumentor']['use-cache'] = false; } return $configuration; } private function overwriteCacheFolder(Configuration $configuration): Configuration { if (isset($this->options['cache-folder']) && $this->options['cache-folder']) { $configuration['phpdocumentor']['paths']['cache'] = new Path($this->options['cache-folder']); } return $configuration; } private function overwriteTitle(Configuration $configuration): Configuration { if (isset($this->options['title']) && $this->options['title']) { $configuration['phpdocumentor']['title'] = $this->options['title']; } return $configuration; } private function overwriteTemplates(Configuration $configuration): Configuration { if (isset($this->options['template']) && $this->options['template']) { $configuration['phpdocumentor']['templates'] = array_map( static function ($templateName) { return ['name' => $templateName]; }, (array) $this->options['template'] ); } return $configuration; } private function setFilesInPath(VersionSpecification $version): VersionSpecification { $filename = $this->options['filename'] ?? null; if (!$filename) { return $version; } $filename = explode(',', implode(',', $filename)); if (empty($version->getApi())) { $version->addApi($this->createDefaultApiSettings()); } $version->api[0] = $version->api[0]->withSource( $version->api[0]->source()->withPaths( array_map( static function ($path): Path { return new Path($path); }, $filename ) ) ); return $version; } private function setDirectoriesInPath(VersionSpecification $version): VersionSpecification { $directory = $this->options['directory'] ?? ''; if (!$directory) { return $version; } $directory = explode(',', implode(',', $directory)); $currentApiConfig = current($version->getApi()); if (!$currentApiConfig) { $currentApiConfig = $this->createDefaultApiSettings(); } $currentApiConfig = $currentApiConfig->withSource(new Source($currentApiConfig['source']['dsn'], [])); $version->setApi([]); foreach ($directory as $path) { if (Path::isAbsolutePath($path)) { $version->addApi( $currentApiConfig->withSource(new Source(Dsn::createFromString($path), [new Path('./')])) ); } else { $currentApiConfig = $currentApiConfig->withSource( $currentApiConfig->source()->withPaths( array_merge($currentApiConfig->source()->paths(), [new Path($path)]) ) ); } } if (count($currentApiConfig->source()->paths()) > 0) { $version->addApi($currentApiConfig); } return $version; } private function registerExtensions(VersionSpecification $version): VersionSpecification { if (!isset($this->options['extensions']) || !$this->options['extensions']) { return $version; } if (empty($version->getApi())) { $version->addApi($this->createDefaultApiSettings()); } Assert::isArray($this->options['extensions']); $version->api[0]['extensions'] = $this->options['extensions']; return $version; } private function overwriteIgnoredPaths(VersionSpecification $version): VersionSpecification { if (!isset($this->options['ignore']) || !$this->options['ignore']) { return $version; } if (empty($version->getApi())) { $version->addApi($this->createDefaultApiSettings()); } $version->api[0]->setIgnore( array_merge( $version->api[0]['ignore'], [ 'paths' => array_map( static function ($path): Path { return new Path($path); }, $this->options['ignore'] ), ] ) ); return $version; } private function overwriteIgnoredTags(VersionSpecification $version): VersionSpecification { if (!isset($this->options['ignore-tags']) || !$this->options['ignore-tags']) { return $version; } if (empty($version->getApi())) { $version->addApi($this->createDefaultApiSettings()); } Assert::isArray($this->options['ignore-tags']); $version->api[0]['ignore-tags'] = $this->options['ignore-tags']; return $version; } private function overwriteMarkers(VersionSpecification $version): VersionSpecification { if (!isset($this->options['markers']) || !$this->options['markers']) { return $version; } if (empty($version->getApi())) { $version->addApi($this->createDefaultApiSettings()); } Assert::isArray($this->options['markers']); $version->api[0]['markers'] = $this->options['markers']; return $version; } private function overwriteIncludeSource(VersionSpecification $version): VersionSpecification { if (!isset($this->options['sourcecode'])) { return $version; } if (empty($version->getApi())) { $version->addApi($this->createDefaultApiSettings()); } $version->api[0]['include-source'] = $this->options['sourcecode']; return $version; } private function overwriteVisibility(VersionSpecification $version): VersionSpecification { $visibilityFlags = $this->options['visibility'] ?? null; if (!$visibilityFlags) { return $version; } if (empty($version->getApi())) { $version->addApi($this->createDefaultApiSettings()); } $visibilities = array_unique(explode(',', implode(',', $visibilityFlags))); $version->api[0]['visibility'] = $visibilities; return $version; } private function overwriteDefaultPackageName(VersionSpecification $version): VersionSpecification { if (!isset($this->options['defaultpackagename']) || !$this->options['defaultpackagename']) { return $version; } if (empty($version->getApi())) { $version->addApi($this->createDefaultApiSettings()); } $version->api[0]['default-package-name'] = $this->options['defaultpackagename']; return $version; } private function overwriteExamples(VersionSpecification $version): VersionSpecification { $examples = $this->options['examples-dir'] ?? null; if (!$examples) { return $version; } if (empty($version->getApi())) { $version->addApi($this->createDefaultApiSettings()); } $version->api[0]['examples'] = new Source(Dsn::createFromString($examples), [new Path('./')]); return $version; } private function createDefaultVersionSettings(): VersionSpecification { return current($this->configFactory->createDefault()['phpdocumentor']['versions']); } private function createDefaultApiSettings(): ApiSpecification { return current($this->createDefaultVersionSettings()->getApi()); } private function shouldReduceNumberOfVersionsToOne(Configuration $configuration): bool { return (($this->options['filename'] ?? '') !== '' || ($this->options['directory'] ?? '') !== '') && count($configuration['phpdocumentor']['versions']) > 1; } private function overwriteSettings(Configuration $configuration): Configuration { if (!($configuration['phpdocumentor']['settings'] ?? null)) { $configuration['phpdocumentor']['settings'] = []; } foreach (($this->options['setting'] ?? []) as $setting) { [$key, $value] = explode('=', $setting); if (!$key || !$value) { continue; } if ($value === 'on' || $value === 'true') { $value = true; } if ($value === 'off' || $value === 'false') { $value = false; } $configuration['phpdocumentor']['settings'][$key] = $value; } return $configuration; } private function overwriteEncoding(VersionSpecification $version): VersionSpecification { $encoding = $this->options['encoding'] ?? null; if (!$encoding) { return $version; } if (empty($version->getApi())) { $version->addApi($this->createDefaultApiSettings()); } $version->api[0]['encoding'] = $encoding; return $version; } } dsn = $dsn; $this->paths = $paths; } public function withDsn(Dsn $dsn): Source { $self = clone $this; $self->dsn = $dsn; return $self; } public function withPaths(array $paths): Source { $self = clone $this; $self->paths = $paths; return $self; } public function dsn(): Dsn { return $this->dsn; } public function paths(): array { return $this->paths; } public function globPatterns(): array { return array_map( function (Path $path): string { return $this->pathToGlobPattern((string) $path); }, $this->paths ); } private function normalizePath(string $path): string { if (strpos($path, '.') === 0) { $path = ltrim($path, '.'); } if (strpos($path, '/') !== 0) { $path = '/' . $path; } return rtrim($path, '/'); } private function pathToGlobPattern(string $path): string { $path = $this->normalizePath($path); if (substr($path, -1) !== '*' && strpos($path, '.') === false) { $path .= '/**/*'; } return $path; } public function offsetExists($offset): bool { return in_array($offset, ['dsn', 'paths']); } public function offsetGet($offset) { switch ($offset) { case 'dsn': return $this->dsn; case 'paths': return $this->paths; default: throw new OutOfBoundsException(sprintf('Offset %s does not exist', $offset)); } } public function offsetSet($offset, $value): void { throw new BadMethodCallException('Cannot set offset of ' . self::class); } public function offsetUnset($offset): void { throw new BadMethodCallException('Cannot unset offset of ' . self::class); } } number = $number; $this->api = $api; $this->guides = $guides; } public function getNumber(): string { return $this->number; } public function getApi(): array { return $this->api; } public function setApi(array $api): void { $this->api = $api; } public function addApi(ApiSpecification $api): void { $this->api[] = $api; } public function getGuides(): ?array { return $this->guides; } } normalizePropertyName($offset); return property_exists($this, $property); } public function offsetGet($offset) { $property = $this->normalizePropertyName($offset); if (!property_exists($this, $property)) { throw new InvalidArgumentException('Invalid property ' . $property); } return $this->$property; } public function offsetSet($offset, $value): void { $property = $this->normalizePropertyName($offset); if (!property_exists($this, $property)) { throw new InvalidArgumentException('Invalid property ' . $property); } $this->{$property} = $value; } public function offsetUnset($offset): void { $property = $this->normalizePropertyName($offset); if (!property_exists($this, $property)) { throw new InvalidArgumentException('Invalid property ' . $property); } $this->$property = null; } private function normalizePropertyName(string $offset): string { return lcfirst(str_replace('-', '', ucwords($offset, '-'))); } } source = $source; $this->output = $output; $this->ignore = $ignore; $this->extensions = $extensions; $this->visibility = $visibility; $this->defaultPackageName = $defaultPackageName; $this->includeSource = $includeSource; $this->markers = $markers; $this->ignoreTags = $ignoreTags; $this->examples = $examples; $this->encoding = $encoding; $this->validate = $validate; } public static function createFromArray(array $api): self { return new self( new Source($api['source']['dsn'], $api['source']['paths']), $api['output'], $api['ignore'], $api['extensions'], $api['visibility'], $api['default-package-name'], $api['include-source'], $api['markers'], $api['ignore-tags'], isset($api['examples']) ? new Source(Dsn::createFromString($api['examples']['dsn']), $api['examples']['paths']) : null, $api['encoding'], $api['validate'] ); } public static function createDefault(): ApiSpecification { return new self( new Source( Dsn::createFromString('./'), [new Path('./src')] ), './api', [ 'paths' => [], ], ['php'], [], '', false, [], [], null, 'utf8', false ); } public function withSource(Source $source): self { $clone = clone $this; $clone->source = $source; return $clone; } public function setIgnore(array $ignore): void { $this->ignore = $ignore; } public function getIgnoredTags(): array { return $this->ignoreTags; } public function calculateVisiblity(): int { $visibility = 0; foreach ($this->visibility as $item) { switch ($item) { case 'api': $visibility |= self::VISIBILITY_API; break; case 'public': $visibility |= self::VISIBILITY_PUBLIC; break; case 'protected': $visibility |= self::VISIBILITY_PROTECTED; break; case 'private': $visibility |= self::VISIBILITY_PRIVATE; break; case 'internal': $visibility |= self::VISIBILITY_INTERNAL; break; default: throw new RuntimeException( sprintf( '%s is not a type of visibility, supported is: api, public, protected, private or internal', $item ) ); } } if ($visibility === self::VISIBILITY_INTERNAL) { $visibility |= self::VISIBILITY_DEFAULT; } return $visibility; } public function isVisibilityAllowed(int $visibility): bool { $visibilityAllowed = $this->calculateVisiblity(); return (bool) ($visibilityAllowed & $visibility); } public function source(): Source { return $this->source; } } defaultTemplateName = $defaultTemplateName; } public function getConfigTreeBuilder(): TreeBuilder { $treebuilder = new TreeBuilder('phpdocumentor'); $treebuilder->getRootNode() ->fixXmlConfig('version') ->fixXmlConfig('setting') ->fixXmlConfig('template') ->addDefaultsIfNotSet() ->children() ->scalarNode(SymfonyConfigFactory::FIELD_CONFIG_VERSION)->defaultValue('3')->end() ->scalarNode('title')->defaultValue('Documentation')->end() ->booleanNode('use-cache')->defaultTrue()->end() ->arrayNode('paths') ->addDefaultsIfNotSet() ->children() ->scalarNode('output')->defaultValue('.phpdoc/build')->end() ->scalarNode('cache')->defaultValue('.phpdoc/cache')->end() ->end() ->end() ->arrayNode('versions') ->useAttributeAsKey('number', false) ->addDefaultChildrenIfNoneSet('1.0.0') ->prototype('array') ->fixXmlConfig('api', 'apis') ->fixXmlConfig('guide') ->children() ->scalarNode('number') ->defaultValue('1.0.0') ->beforeNormalization() ->always( static function ($value) { if (!is_int($value) && !is_string($value)) { return var_export($value, true); } return $value; } ) ->end() ->end() ->scalarNode('folder')->defaultValue('')->end() ->append($this->apiSection()) ->append($this->guideSection()) ->end() ->end() ->end() ->arrayNode('settings') ->useAttributeAsKey('name', true) ->prototype('array') ->children() ->scalarNode('name')->end() ->scalarNode('value')->end() ->end() ->end() ->end() ->arrayNode('templates') ->addDefaultChildrenIfNoneSet(1) ->prototype('array') ->fixXmlConfig('parameter') ->children() ->scalarNode('name')->defaultValue($this->defaultTemplateName)->end() ->scalarNode('location')->end() ->arrayNode('parameters') ->useAttributeAsKey('name', true) ->prototype('array') ->children() ->scalarNode('name')->end() ->scalarNode('value')->end() ->end() ->end() ->end() ->end() ->end() ->end() ->end(); return $treebuilder; } public function normalize(array $configuration): array { $configuration['configVersion'] = (string) $configuration['configVersion']; $configuration['paths']['output'] = Dsn::createFromString($configuration['paths']['output']); $configuration['paths']['cache'] = new Path($configuration['paths']['cache']); foreach ($configuration['versions'] as $versionNumber => $version) { $configuration['versions'][$versionNumber]['api'] = $configuration['versions'][$versionNumber]['apis']; unset($configuration['versions'][$versionNumber]['apis']); foreach ($version['apis'] as $key => $api) { $apiKey = $configuration['versions'][$versionNumber]['api'][$key]; $apiKey['source']['dsn'] = Dsn::createFromString($api['source']['dsn']); foreach ($api['source']['paths'] as $subkey => $path) { $apiKey['source']['paths'][$subkey] = new Path($path); } $apiKey['ignore-tags'] = $apiKey['ignore-tags']['ignore_tags']; $apiKey['extensions'] = $apiKey['extensions']['extensions']; $apiKey['markers'] = $apiKey['markers']['markers']; $apiKey['visibility'] = $apiKey['visibilities']; unset($apiKey['visibilities']); $configuration['versions'][$versionNumber]['api'][$key] = $apiKey; } foreach ($version['guides'] as $key => $guide) { $guidesKey = $configuration['versions'][$versionNumber]['guides'][$key]; $guidesKey['source']['dsn'] = Dsn::createFromString($guide['source']['dsn']); foreach ($guide['source']['paths'] as $subkey => $path) { $guidesKey['source']['paths'][$subkey] = new Path($path); } $configuration['versions'][$versionNumber]['guides'][$key] = $guidesKey; } } return $configuration; } private function apiSection(): ArrayNodeDefinition { $treebuilder = new TreeBuilder('apis'); return $treebuilder->getRootNode() ->addDefaultChildrenIfNoneSet(1) ->prototype('array') ->addDefaultsIfNotSet() ->normalizeKeys(false) ->fixXmlConfig('visibility', 'visibilities') ->children() ->enumNode('format') ->info('In which language is your code written?') ->values(['php']) ->defaultValue('php') ->end() ->arrayNode('visibilities') ->prototype('enum') ->info('What is the deepest level of visibility to include in the documentation?') ->values([ 'api', 'public', 'protected', 'private', 'internal', ]) ->end() ->defaultValue(['public', 'protected', 'private']) ->end() ->scalarNode('default-package-name') ->info( 'When your source code is grouped using the @package tag; what is the name of the ' . 'default package when none is provided?' ) ->defaultValue('Application') ->end() ->scalarNode('encoding')->defaultValue('utf-8')->end() ->append($this->source(['/**/*'])) ->scalarNode('output')->defaultValue('.')->end() ->arrayNode('ignore') ->addDefaultsIfNotSet() ->fixXmlConfig('path') ->children() ->booleanNode('hidden')->defaultTrue()->end() ->booleanNode('symlinks')->defaultTrue()->end() ->append($this->paths()) ->end() ->end() ->arrayNode('ignore-tags') ->addDefaultsIfNotSet() ->fixXmlConfig('ignore_tag') ->children() ->arrayNode('ignore_tags') ->defaultValue([]) ->beforeNormalization()->castToArray()->end() ->prototype('scalar')->end() ->end() ->end() ->end() ->arrayNode('extensions') ->addDefaultsIfNotSet() ->fixXmlConfig('extension') ->children() ->arrayNode('extensions') ->defaultValue(['php', 'php3', 'phtml']) ->beforeNormalization()->castToArray()->end() ->prototype('scalar')->end() ->end() ->end() ->end() ->booleanNode('include-source') ->defaultTrue() ->end() ->arrayNode('examples') ->fixXmlConfig('path') ->children() ->scalarNode('dsn')->defaultValue('.')->end() ->append($this->paths()) ->end() ->end() ->booleanNode('validate') ->defaultFalse() ->end() ->arrayNode('markers') ->addDefaultsIfNotSet() ->fixXmlConfig('marker') ->children() ->arrayNode('markers') ->defaultValue(['TODO', 'FIXME']) ->beforeNormalization()->castToArray()->end() ->prototype('scalar')->end() ->end() ->end() ->end() ->end() ->end(); } private function guideSection(): ArrayNodeDefinition { $treebuilder = new TreeBuilder('guides'); return $treebuilder->getRootNode() ->prototype('array') ->children() ->enumNode('format') ->values(['rst', 'md']) ->defaultValue('rst') ->end() ->append($this->source()) ->scalarNode('output')->defaultValue('docs')->end() ->end() ->end(); } private function source(array $defaultPaths = []): ArrayNodeDefinition { $treebuilder = new TreeBuilder('source'); return $treebuilder->getRootNode() ->addDefaultsIfNotSet() ->fixXmlConfig('path') ->children() ->scalarNode('dsn')->defaultValue('.')->end() ->append($this->paths($defaultPaths)) ->end(); } private function paths(array $defaultValue = []): ArrayNodeDefinition { $treebuilder = new TreeBuilder('paths'); return $treebuilder->getRootNode() ->beforeNormalization()->castToArray()->end() ->defaultValue($defaultValue) ->prototype('scalar')->end(); } } defaultTemplateName = $defaultTemplateName; } public function getConfigTreeBuilder(): TreeBuilder { $treebuilder = new TreeBuilder('phpdocumentor'); $treebuilder->getRootNode() ->addDefaultsIfNotSet() ->children() ->scalarNode(SymfonyConfigFactory::FIELD_CONFIG_VERSION)->defaultValue('2')->end() ->scalarNode('title')->defaultValue('Documentation')->end() ->arrayNode('parser') ->addDefaultsIfNotSet() ->normalizeKeys(false) ->children() ->scalarNode('default-package-name')->defaultValue('Application')->end() ->scalarNode('visibility') ->defaultValue(implode(',', ['public', 'protected', 'private'])) ->info('What is the deepest level of visibility to include in the documentation?') ->end() ->scalarNode('target')->defaultValue('build/api-cache')->end() ->scalarNode('encoding') ->defaultValue('utf-8') ->end() ->arrayNode('extensions') ->addDefaultsIfNotSet() ->fixXmlConfig('extension') ->children() ->arrayNode('extensions') ->defaultValue(['php', 'php3', 'phtml']) ->beforeNormalization()->castToArray()->end() ->prototype('scalar')->end() ->end() ->end() ->end() ->arrayNode('markers') ->addDefaultsIfNotSet() ->fixXmlConfig('item') ->children() ->arrayNode('items') ->defaultValue(['TODO', 'FIXME']) ->beforeNormalization()->castToArray()->end() ->prototype('scalar')->end() ->end() ->end() ->end() ->end() ->end() ->arrayNode('transformer') ->addDefaultsIfNotSet() ->children() ->scalarNode('target')->defaultValue('build/api')->end() ->end() ->end() ->arrayNode('logging') ->addDefaultsIfNotSet() ->children() ->scalarNode('level')->defaultValue('error')->end() ->end() ->end() ->arrayNode('transformations') ->addDefaultsIfNotSet() ->fixXmlConfig('template') ->children() ->arrayNode('templates') ->fixXmlConfig('parameter') ->useAttributeAsKey('name') ->defaultValue([$this->defaultTemplateName => ['name' => $this->defaultTemplateName]]) ->prototype('array') ->children() ->scalarNode('location')->end() ->arrayNode('parameters') ->children() ->scalarNode('name')->end() ->scalarNode('value')->end() ->end() ->end() ->end() ->end() ->end() ->end() ->end() ->arrayNode('files') ->addDefaultsIfNotSet() ->fixXmlConfig('file', 'files') ->fixXmlConfig('directory', 'directories') ->fixXmlConfig('ignore', 'ignores') ->normalizeKeys(false) ->children() ->booleanNode('ignore-hidden') ->defaultTrue() ->end() ->booleanNode('ignore-symlinks') ->defaultTrue() ->end() ->arrayNode('directories') ->defaultValue([getcwd()]) ->beforeNormalization()->castToArray()->end() ->prototype('scalar')->end() ->end() ->arrayNode('files') ->beforeNormalization()->castToArray()->end() ->prototype('scalar')->end() ->end() ->arrayNode('ignores') ->beforeNormalization()->castToArray()->end() ->prototype('scalar')->end() ->end() ->end() ->end() ->end(); return $treebuilder; } public function upgrade(array $values): array { return [ SymfonyConfigFactory::FIELD_CONFIG_VERSION => '3', 'title' => $values['title'], 'paths' => [ 'output' => $values['transformer']['target'], 'cache' => $values['parser']['target'], ], 'version' => [ [ 'number' => '1.0.0', 'api' => [ [ 'default-package-name' => $values['parser']['default-package-name'], 'source' => [ 'paths' => array_map( function ($value) { return $this->convertSingleStarPathEndingIntoGlobPattern($value); }, array_merge($values['files']['files'], $values['files']['directories']) ), ], 'ignore' => [ 'paths' => array_map( function ($value) { return $this->convertSingleStarPathEndingIntoGlobPattern($value); }, $values['files']['ignores'] ), ], 'extensions' => [ 'extensions' => $values['parser']['extensions']['extensions'], ], 'visibilities' => $values['parser']['visibility'] ? explode( ',', $values['parser']['visibility'] ) : null, 'markers' => [ 'markers' => $values['parser']['markers']['items'], ], ], ], ], ], 'templates' => array_values($values['transformations']['templates']), ]; } private function convertSingleStarPathEndingIntoGlobPattern(string $path): string { if (substr($path, -2) === '/*' && substr($path, -4) !== '**/*') { $path .= '*/*'; } return $path; } } configurationDefinitions = $definitions; } public function createFromFile(string $filename): array { $values = XmlUtils::loadFile($filename); $values = XmlUtils::convertDomElementToArray($values->documentElement); return $this->generateConfiguration($values); } public function createDefault(): array { return $this->generateConfiguration([ self::FIELD_CONFIG_VERSION => (string) array_key_last($this->configurationDefinitions), ]); } private function generateConfiguration(array $values): array { $configuration = $this->processConfiguration($values); if ($configuration[self::FIELD_CONFIG_VERSION] !== (string) array_key_last($this->configurationDefinitions)) { throw new RuntimeException( 'The configuration file does not match the latest version and auto-upgrading failed. Please ' . 'contact the maintainers and provide your configuration file or whole project to reproduce this issue' ); } return ['phpdocumentor' => $configuration]; } private function processConfiguration(array $values): array { $configurationVersion = (string) ($values[self::FIELD_CONFIG_VERSION] ?? self::DEFAULT_CONFIG_VERSION); $definition = $this->findDefinition($configurationVersion); $processor = new Processor(); $configuration = $processor->processConfiguration($definition, [$values]); if ($definition instanceof Normalizable) { $configuration = $definition->normalize($configuration); } if ($definition instanceof Upgradable) { $configuration = $this->processConfiguration( $this->upgradeConfiguration($definition, $configuration) ); } return $configuration; } private function findDefinition(string $configurationVersion): ConfigurationInterface { $definition = $this->configurationDefinitions[$configurationVersion] ?? null; if ($definition === null) { throw UnSupportedConfigVersionException::create( $configurationVersion, array_keys($this->configurationDefinitions) ); } return $definition; } private function upgradeConfiguration(Upgradable $definition, array $configuration): array { $upgradedConfiguration = $definition->upgrade($configuration); if ( !isset($upgradedConfiguration[self::FIELD_CONFIG_VERSION]) || $configuration[self::FIELD_CONFIG_VERSION] === $upgradedConfiguration[self::FIELD_CONFIG_VERSION] ) { throw UpgradeFailedException::create($configuration[self::FIELD_CONFIG_VERSION]); } return $upgradedConfiguration; } } defaultFiles = $defaultFiles; $this->symfonyConfigFactory = $symfonyConfigFactory; } public function addMiddleware(MiddlewareInterface $middleware): void { $this->middlewares[] = $middleware; } public function fromDefaultLocations(): Configuration { foreach ($this->defaultFiles as $file) { try { return $this->fromUri(UriFactory::createUri($file)); } catch (InvalidConfigPathException $e) { continue; } } return new Configuration($this->applyMiddleware($this->createDefault(), null)); } public function createDefault(): Configuration { return $this->createConfigurationFromArray($this->symfonyConfigFactory->createDefault()); } public function fromUri(UriInterface $uri): Configuration { $filename = (string) $uri; if (!file_exists($filename)) { throw new InvalidConfigPathException(sprintf('File %s could not be found', $filename)); } $config = $this->symfonyConfigFactory->createFromFile($filename); return $this->applyMiddleware($this->createConfigurationFromArray($config), $uri); } public function fromDefault(): Configuration { return $this->applyMiddleware($this->createDefault(), null); } private function applyMiddleware(Configuration $configuration, ?UriInterface $uri): Configuration { foreach ($this->middlewares as $middleware) { $configuration = $middleware($configuration, $uri); } return $configuration; } private function createConfigurationFromArray(array $configuration): Configuration { if (isset($configuration['phpdocumentor']['versions'])) { foreach ($configuration['phpdocumentor']['versions'] as $versionNumber => $version) { $configuration['phpdocumentor']['versions'][$versionNumber] = new VersionSpecification( (string) $versionNumber, array_map( static function ($api): ApiSpecification { return ApiSpecification::createFromArray($api); }, $version['api'] ), array_map( static function ($guide): GuideSpecification { return new GuideSpecification( new Source( $guide['source']['dsn'], $guide['source']['paths'] ), $guide['output'], $guide['format'] ); }, $version['guides'] ) ); } } return new Configuration($configuration); } } path = $path; } public function equals(self $otherPath): bool { return $this->path === (string) $otherPath; } public function __toString(): string { return $this->path; } public static function isAbsolutePath(string $file): bool { return strspn($file, '/\\', 0, 1) || (strlen($file) > 3 && ctype_alpha($file[0]) && $file[1] === ':' && strspn($file, '/\\', 2, 1) ) || parse_url($file, PHP_URL_SCHEME) !== null; } public static function dirname(Path $input): self { $parts = explode('/', (string) $input); array_pop($parts); return new self(implode('/', $parts)); } } [a-zA-Z][:|\|])~'; public static function createUri(string $uriString): UriInterface { try { $uriString = str_replace(DIRECTORY_SEPARATOR, '/', $uriString); if (strpos($uriString, 'phar://') === 0) { return self::createPharUri($uriString); } if (preg_match(self::WINDOWS_URI_FORMAT, $uriString)) { if (strpos($uriString, 'file:///') === 0) { $uriString = substr($uriString, strlen('file:///')); } return LeagueUri::createFromWindowsPath($uriString); } return LeagueUri::createFromString($uriString); } catch (Throwable $exception) { throw new InvalidArgumentException( sprintf( 'The uri "%s" could not be parsed, the following error occured: %s', $uriString, $exception->getMessage() ), 0, $exception ); } } private static function createPharUri(string $uriString): UriInterface { $path = substr($uriString, strlen('phar://')); if (strpos($path, '/') !== 0) { $path = '/' . $path; } return LeagueUri::createFromComponents( [ 'scheme' => 'phar', 'host' => '', 'path' => $path, ] ); } } {"dflydev\/dot-access-data":{"version":"v3.0.1"},"doctrine\/event-manager":{"version":"1.1.1"},"doctrine\/lexer":{"version":"1.2.1"},"fzaninotto\/faker":{"version":"v1.9.1"},"hamcrest\/hamcrest-php":{"version":"v2.0.0"},"jawira\/plantuml":{"version":"v1.27.0"},"jean85\/pretty-package-versions":{"version":"1.2"},"league\/commonmark":{"version":"1.5.6"},"league\/config":{"version":"v1.1.1"},"league\/flysystem":{"version":"1.0.41"},"league\/mime-type-detection":{"version":"1.4.0"},"league\/pipeline":{"version":"0.3.0"},"league\/tactician":{"version":"v1.0.3"},"league\/tactician-bundle":{"version":"1.0","recipe":{"repo":"github.com\/symfony\/recipes-contrib","branch":"master","version":"1.0","ref":"222c3d39d38378bc6a9790a0b5baf841ba6679b9"}},"league\/tactician-container":{"version":"2.0.0"},"league\/tactician-logger":{"version":"v0.10.0"},"league\/uri":{"version":"6.0.1"},"league\/uri-interfaces":{"version":"2.0.1"},"mikey179\/vfsstream":{"version":"v1.6.5"},"mockery\/mockery":{"version":"1.0"},"monolog\/monolog":{"version":"1.23.0"},"nette\/schema":{"version":"v1.2.2"},"nette\/utils":{"version":"v3.2.6"},"nikic\/php-parser":{"version":"v3.1.3"},"phpdocumentor\/flyfinder":{"version":"1.0.0-beta1"},"phpdocumentor\/graphviz":{"version":"1.0.4"},"phpdocumentor\/guides":{"version":"dev-feature\/make-guides-a-package-within-phpdocumentor"},"phpdocumentor\/guides-markdown":{"version":"dev-feature\/split-guides-incubator-package"},"phpdocumentor\/guides-restructured-text":{"version":"dev-feature\/split-guides-incubator-package"},"phpdocumentor\/reflection":{"version":"4.0.x-dev"},"phpdocumentor\/reflection-common":{"version":"1.0.1"},"phpdocumentor\/reflection-docblock":{"version":"4.2.0"},"phpdocumentor\/type-resolver":{"version":"0.4.0"},"psalm\/phar":{"version":"4.17.0"},"psr\/cache":{"version":"1.0.1"},"psr\/container":{"version":"1.0.0"},"psr\/event-dispatcher":{"version":"1.0.0"},"psr\/http-message":{"version":"1.0.1"},"psr\/log":{"version":"1.0.2"},"symfony\/cache":{"version":"v4.0.3"},"symfony\/config":{"version":"v4.0.3"},"symfony\/console":{"version":"3.3","recipe":{"repo":"github.com\/symfony\/recipes","branch":"master","version":"3.3","ref":"9f94d3ea453cd8a3b95db7f82592d7344fe3a76a"}},"symfony\/contracts":{"version":"v2.0.1"},"symfony\/dependency-injection":{"version":"v4.0.3"},"symfony\/dom-crawler":{"version":"v5.0.2"},"symfony\/dotenv":{"version":"v4.0.3"},"symfony\/error-handler":{"version":"v5.0.0"},"symfony\/event-dispatcher":{"version":"v4.0.3"},"symfony\/expression-language":{"version":"v5.0.0"},"symfony\/filesystem":{"version":"v4.0.3"},"symfony\/finder":{"version":"v4.0.3"},"symfony\/flex":{"version":"1.0","recipe":{"repo":"github.com\/symfony\/recipes","branch":"master","version":"1.0","ref":"cc1afd81841db36fbef982fe56b48ade6716fac4"}},"symfony\/framework-bundle":{"version":"3.3","recipe":{"repo":"github.com\/symfony\/recipes","branch":"master","version":"3.3","ref":"18f6fdceb63737d991efbb37ae9619a6f6c978c8"}},"symfony\/http-foundation":{"version":"v4.0.3"},"symfony\/http-kernel":{"version":"v4.0.3"},"symfony\/monolog-bridge":{"version":"v4.0.3"},"symfony\/monolog-bundle":{"version":"3.1","recipe":{"repo":"github.com\/symfony\/recipes","branch":"master","version":"3.1","ref":"371d1a2b69984710646b09a1182ef1d4308c904f"}},"symfony\/polyfill-ctype":{"version":"v1.11.0"},"symfony\/polyfill-intl-grapheme":{"version":"v1.13.1"},"symfony\/polyfill-intl-idn":{"version":"v1.22.0"},"symfony\/polyfill-intl-normalizer":{"version":"v1.13.1"},"symfony\/polyfill-mbstring":{"version":"v1.6.0"},"symfony\/polyfill-php73":{"version":"v1.12.0"},"symfony\/polyfill-php80":{"version":"v1.18.1"},"symfony\/polyfill-php81":{"version":"v1.23.0"},"symfony\/process":{"version":"v5.0.0"},"symfony\/routing":{"version":"4.0","recipe":{"repo":"github.com\/symfony\/recipes","branch":"master","version":"4.0","ref":"cda8b550123383d25827705d05a42acf6819fe4e"}},"symfony\/stopwatch":{"version":"v4.0.3"},"symfony\/string":{"version":"v5.0.1"},"symfony\/var-dumper":{"version":"v5.0.0"},"symfony\/var-exporter":{"version":"v5.0.0"},"symfony\/yaml":{"version":"v4.0.3"},"twig\/twig":{"version":"v1.35.0"},"webmozart\/assert":{"version":"1.2.0"}}{"name":"phpdocumentor\/phpdocumentor","description":"Documentation Generator for PHP","keywords":["documentation","api","dga","application","phpdoc"],"homepage":"https:\/\/www.phpdoc.org","license":"MIT","autoload":{"psr-4":{"phpDocumentor\\":["src\/phpDocumentor\/"]}},"autoload-dev":{"psr-4":{"phpDocumentor\\":["tests\/unit\/phpDocumentor\/","tests\/integration\/phpDocumentor\/","tests\/functional\/phpDocumentor\/"],"Prophecy\\":["tests\/unit\/Prophecy"]}},"repositories":[{"type":"path","url":"incubator\/guides"},{"type":"path","url":"incubator\/guides-restructured-text"},{"type":"path","url":"incubator\/guides-markdown"}],"require":{"php":"^7.4.0||^8.0","ext-ctype":"*","ext-hash":"*","ext-iconv":"*","ext-json":"*","ext-mbstring":"*","ext-simplexml":"*","ext-xml":"*","jawira\/plantuml":"^1.27","jean85\/pretty-package-versions":"^1.5 || ^2.0.1","league\/commonmark":"^2.1","league\/flysystem":"^1.0","league\/pipeline":"^1.0","league\/tactician":"^1.0","league\/tactician-bundle":"^1.2","league\/uri":"~6.3.0","league\/uri-interfaces":"^2.0","phpdocumentor\/flyfinder":"^1.0","phpdocumentor\/graphviz":"^2.0","phpdocumentor\/guides":"*@dev","phpdocumentor\/guides-markdown":"*@dev","phpdocumentor\/guides-restructured-text":"*@dev","phpdocumentor\/reflection":"^5.1","phpdocumentor\/reflection-common":"^2.0","phpdocumentor\/reflection-docblock":"^5.0","phpdocumentor\/type-resolver":"^1.6","psr\/cache":"^1.0","psr\/log":"^1.1","symfony\/cache":"^5.0","symfony\/config":"^5.0","symfony\/console":"^5.0","symfony\/contracts":"^2.0","symfony\/dependency-injection":"^5.0","symfony\/dom-crawler":"5.4.*","symfony\/dotenv":"^5.0","symfony\/event-dispatcher":"^5.0","symfony\/expression-language":"^5.0","symfony\/filesystem":"^5.0","symfony\/finder":"5.4.*","symfony\/flex":"^1.3.1","symfony\/framework-bundle":"^5.0","symfony\/http-foundation":"^5.0.7","symfony\/http-kernel":"^5.0.8","symfony\/monolog-bundle":"^3.0","symfony\/polyfill-intl-idn":"^1.22","symfony\/process":"5.4.*","symfony\/routing":"^5.0","symfony\/stopwatch":"^5.0","symfony\/string":"5.4.*","symfony\/yaml":"^5.0","twig\/twig":"~2.0","webmozart\/assert":"^1.3"},"minimum-stability":"stable","require-dev":{"fzaninotto\/faker":"^1.9","mikey179\/vfsstream":"^1.2","mockery\/mockery":"^1.0","psalm\/phar":"^4.17"},"config":{"bin-dir":"bin\/","preferred-install":{"*":"dist"},"sort-packages":true,"platform":{"php":"7.4.0"},"allow-plugins":{"symfony\/flex":true}},"replace":{"paragonie\/random_compat":"2.*","symfony\/polyfill-iconv":"*","symfony\/polyfill-php72":"*","symfony\/polyfill-php71":"*","symfony\/polyfill-php70":"*","symfony\/polyfill-php56":"*"},"bin":["bin\/phpdoc.php","bin\/phpdoc"],"conflict":{"symfony\/symfony":"*"},"extra":{"branch-alias":{"dev-master":"3.4-dev"},"symfony":{"id":"01C32VS9393M1CP9R8TEJMH62G","allow-contrib":false,"require":"^5.0"}}}{"_readme":["This file locks the dependencies of your project to a known state","Read more about it at https:\/\/getcomposer.org\/doc\/01-basic-usage.md#installing-dependencies","This file is @generated automatically"],"content-hash":"e66b91f230564fdb5c322268917bccd2","packages":[{"name":"dflydev\/dot-access-data","version":"v3.0.1","source":{"type":"git","url":"https:\/\/github.com\/dflydev\/dflydev-dot-access-data.git","reference":"0992cc19268b259a39e86f296da5f0677841f42c"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/dflydev\/dflydev-dot-access-data\/zipball\/0992cc19268b259a39e86f296da5f0677841f42c","reference":"0992cc19268b259a39e86f296da5f0677841f42c","shasum":""},"require":{"php":"^7.1 || ^8.0"},"require-dev":{"phpstan\/phpstan":"^0.12.42","phpunit\/phpunit":"^7.5 || ^8.5 || ^9.3","scrutinizer\/ocular":"1.6.0","squizlabs\/php_codesniffer":"^3.5","vimeo\/psalm":"^3.14"},"type":"library","extra":{"branch-alias":{"dev-main":"3.x-dev"}},"autoload":{"psr-4":{"Dflydev\\DotAccessData\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Dragonfly Development Inc.","email":"info@dflydev.com","homepage":"http:\/\/dflydev.com"},{"name":"Beau Simensen","email":"beau@dflydev.com","homepage":"http:\/\/beausimensen.com"},{"name":"Carlos Frutos","email":"carlos@kiwing.it","homepage":"https:\/\/github.com\/cfrutos"},{"name":"Colin O'Dell","email":"colinodell@gmail.com","homepage":"https:\/\/www.colinodell.com"}],"description":"Given a deep data structure, access data by dot notation.","homepage":"https:\/\/github.com\/dflydev\/dflydev-dot-access-data","keywords":["access","data","dot","notation"],"support":{"issues":"https:\/\/github.com\/dflydev\/dflydev-dot-access-data\/issues","source":"https:\/\/github.com\/dflydev\/dflydev-dot-access-data\/tree\/v3.0.1"},"time":"2021-08-13T13:06:58+00:00"},{"name":"doctrine\/event-manager","version":"1.1.1","source":{"type":"git","url":"https:\/\/github.com\/doctrine\/event-manager.git","reference":"41370af6a30faa9dc0368c4a6814d596e81aba7f"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/doctrine\/event-manager\/zipball\/41370af6a30faa9dc0368c4a6814d596e81aba7f","reference":"41370af6a30faa9dc0368c4a6814d596e81aba7f","shasum":""},"require":{"php":"^7.1 || ^8.0"},"conflict":{"doctrine\/common":"<2.9@dev"},"require-dev":{"doctrine\/coding-standard":"^6.0","phpunit\/phpunit":"^7.0"},"type":"library","extra":{"branch-alias":{"dev-master":"1.0.x-dev"}},"autoload":{"psr-4":{"Doctrine\\Common\\":"lib\/Doctrine\/Common"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Guilherme Blanco","email":"guilhermeblanco@gmail.com"},{"name":"Roman Borschel","email":"roman@code-factory.org"},{"name":"Benjamin Eberlei","email":"kontakt@beberlei.de"},{"name":"Jonathan Wage","email":"jonwage@gmail.com"},{"name":"Johannes Schmitt","email":"schmittjoh@gmail.com"},{"name":"Marco Pivetta","email":"ocramius@gmail.com"}],"description":"The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.","homepage":"https:\/\/www.doctrine-project.org\/projects\/event-manager.html","keywords":["event","event dispatcher","event manager","event system","events"],"support":{"issues":"https:\/\/github.com\/doctrine\/event-manager\/issues","source":"https:\/\/github.com\/doctrine\/event-manager\/tree\/1.1.x"},"funding":[{"url":"https:\/\/www.doctrine-project.org\/sponsorship.html","type":"custom"},{"url":"https:\/\/www.patreon.com\/phpdoctrine","type":"patreon"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/doctrine%2Fevent-manager","type":"tidelift"}],"time":"2020-05-29T18:28:51+00:00"},{"name":"doctrine\/lexer","version":"1.2.1","source":{"type":"git","url":"https:\/\/github.com\/doctrine\/lexer.git","reference":"e864bbf5904cb8f5bb334f99209b48018522f042"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/doctrine\/lexer\/zipball\/e864bbf5904cb8f5bb334f99209b48018522f042","reference":"e864bbf5904cb8f5bb334f99209b48018522f042","shasum":""},"require":{"php":"^7.2 || ^8.0"},"require-dev":{"doctrine\/coding-standard":"^6.0","phpstan\/phpstan":"^0.11.8","phpunit\/phpunit":"^8.2"},"type":"library","extra":{"branch-alias":{"dev-master":"1.2.x-dev"}},"autoload":{"psr-4":{"Doctrine\\Common\\Lexer\\":"lib\/Doctrine\/Common\/Lexer"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Guilherme Blanco","email":"guilhermeblanco@gmail.com"},{"name":"Roman Borschel","email":"roman@code-factory.org"},{"name":"Johannes Schmitt","email":"schmittjoh@gmail.com"}],"description":"PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.","homepage":"https:\/\/www.doctrine-project.org\/projects\/lexer.html","keywords":["annotations","docblock","lexer","parser","php"],"support":{"issues":"https:\/\/github.com\/doctrine\/lexer\/issues","source":"https:\/\/github.com\/doctrine\/lexer\/tree\/1.2.1"},"funding":[{"url":"https:\/\/www.doctrine-project.org\/sponsorship.html","type":"custom"},{"url":"https:\/\/www.patreon.com\/phpdoctrine","type":"patreon"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/doctrine%2Flexer","type":"tidelift"}],"time":"2020-05-25T17:44:05+00:00"},{"name":"jawira\/plantuml","version":"v1.2022.2","source":{"type":"git","url":"https:\/\/github.com\/jawira\/plantuml.git","reference":"cafdf27fbc7b412e4b4956c80afa8da260314b5a"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/jawira\/plantuml\/zipball\/cafdf27fbc7b412e4b4956c80afa8da260314b5a","reference":"cafdf27fbc7b412e4b4956c80afa8da260314b5a","shasum":""},"bin":["bin\/plantuml"],"type":"library","notification-url":"https:\/\/packagist.org\/downloads\/","license":["GPL-3.0-or-later"],"authors":[{"name":"Jawira Portugal"}],"description":"Provides PlantUML executable and plantuml.jar","keywords":["diagram","jar","plantuml","plantuml.jar","uml"],"support":{"issues":"https:\/\/github.com\/jawira\/plantuml\/issues","source":"https:\/\/github.com\/jawira\/plantuml\/tree\/v1.2022.2"},"time":"2022-03-11T14:00:48+00:00"},{"name":"jean85\/pretty-package-versions","version":"2.0.5","source":{"type":"git","url":"https:\/\/github.com\/Jean85\/pretty-package-versions.git","reference":"ae547e455a3d8babd07b96966b17d7fd21d9c6af"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/Jean85\/pretty-package-versions\/zipball\/ae547e455a3d8babd07b96966b17d7fd21d9c6af","reference":"ae547e455a3d8babd07b96966b17d7fd21d9c6af","shasum":""},"require":{"composer-runtime-api":"^2.0.0","php":"^7.1|^8.0"},"require-dev":{"friendsofphp\/php-cs-fixer":"^2.17","jean85\/composer-provided-replaced-stub-package":"^1.0","phpstan\/phpstan":"^0.12.66","phpunit\/phpunit":"^7.5|^8.5|^9.4","vimeo\/psalm":"^4.3"},"type":"library","extra":{"branch-alias":{"dev-master":"1.x-dev"}},"autoload":{"psr-4":{"Jean85\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Alessandro Lai","email":"alessandro.lai85@gmail.com"}],"description":"A library to get pretty versions strings of installed dependencies","keywords":["composer","package","release","versions"],"support":{"issues":"https:\/\/github.com\/Jean85\/pretty-package-versions\/issues","source":"https:\/\/github.com\/Jean85\/pretty-package-versions\/tree\/2.0.5"},"time":"2021-10-08T21:21:46+00:00"},{"name":"league\/commonmark","version":"2.1.1","source":{"type":"git","url":"https:\/\/github.com\/thephpleague\/commonmark.git","reference":"17d2b9cb5161a2ea1a8dd30e6991d668e503fb9d"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/thephpleague\/commonmark\/zipball\/17d2b9cb5161a2ea1a8dd30e6991d668e503fb9d","reference":"17d2b9cb5161a2ea1a8dd30e6991d668e503fb9d","shasum":""},"require":{"ext-mbstring":"*","league\/config":"^1.1.1","php":"^7.4 || ^8.0","psr\/event-dispatcher":"^1.0","symfony\/polyfill-php80":"^1.15"},"require-dev":{"cebe\/markdown":"^1.0","commonmark\/cmark":"0.30.0","commonmark\/commonmark.js":"0.30.0","composer\/package-versions-deprecated":"^1.8","erusev\/parsedown":"^1.0","ext-json":"*","github\/gfm":"0.29.0","michelf\/php-markdown":"^1.4","phpstan\/phpstan":"^0.12.88 || ^1.0.0","phpunit\/phpunit":"^9.5.5","scrutinizer\/ocular":"^1.8.1","symfony\/finder":"^5.3","symfony\/yaml":"^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0","unleashedtech\/php-coding-standard":"^3.1","vimeo\/psalm":"^4.7.3"},"suggest":{"symfony\/yaml":"v2.3+ required if using the Front Matter extension"},"type":"library","extra":{"branch-alias":{"dev-main":"2.2-dev"}},"autoload":{"psr-4":{"League\\CommonMark\\":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["BSD-3-Clause"],"authors":[{"name":"Colin O'Dell","email":"colinodell@gmail.com","homepage":"https:\/\/www.colinodell.com","role":"Lead Developer"}],"description":"Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)","homepage":"https:\/\/commonmark.thephpleague.com","keywords":["commonmark","flavored","gfm","github","github-flavored","markdown","md","parser"],"support":{"docs":"https:\/\/commonmark.thephpleague.com\/","forum":"https:\/\/github.com\/thephpleague\/commonmark\/discussions","issues":"https:\/\/github.com\/thephpleague\/commonmark\/issues","rss":"https:\/\/github.com\/thephpleague\/commonmark\/releases.atom","source":"https:\/\/github.com\/thephpleague\/commonmark"},"funding":[{"url":"https:\/\/www.colinodell.com\/sponsor","type":"custom"},{"url":"https:\/\/www.paypal.me\/colinpodell\/10.00","type":"custom"},{"url":"https:\/\/github.com\/colinodell","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/league\/commonmark","type":"tidelift"}],"time":"2022-01-02T18:25:06+00:00"},{"name":"league\/config","version":"v1.1.1","source":{"type":"git","url":"https:\/\/github.com\/thephpleague\/config.git","reference":"a9d39eeeb6cc49d10a6e6c36f22c4c1f4a767f3e"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/thephpleague\/config\/zipball\/a9d39eeeb6cc49d10a6e6c36f22c4c1f4a767f3e","reference":"a9d39eeeb6cc49d10a6e6c36f22c4c1f4a767f3e","shasum":""},"require":{"dflydev\/dot-access-data":"^3.0.1","nette\/schema":"^1.2","php":"^7.4 || ^8.0"},"require-dev":{"phpstan\/phpstan":"^0.12.90","phpunit\/phpunit":"^9.5.5","scrutinizer\/ocular":"^1.8.1","unleashedtech\/php-coding-standard":"^3.1","vimeo\/psalm":"^4.7.3"},"type":"library","extra":{"branch-alias":{"dev-main":"1.2-dev"}},"autoload":{"psr-4":{"League\\Config\\":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["BSD-3-Clause"],"authors":[{"name":"Colin O'Dell","email":"colinodell@gmail.com","homepage":"https:\/\/www.colinodell.com","role":"Lead Developer"}],"description":"Define configuration arrays with strict schemas and access values with dot notation","homepage":"https:\/\/config.thephpleague.com","keywords":["array","config","configuration","dot","dot-access","nested","schema"],"support":{"docs":"https:\/\/config.thephpleague.com\/","issues":"https:\/\/github.com\/thephpleague\/config\/issues","rss":"https:\/\/github.com\/thephpleague\/config\/releases.atom","source":"https:\/\/github.com\/thephpleague\/config"},"funding":[{"url":"https:\/\/www.colinodell.com\/sponsor","type":"custom"},{"url":"https:\/\/www.paypal.me\/colinpodell\/10.00","type":"custom"},{"url":"https:\/\/github.com\/colinodell","type":"github"}],"time":"2021-08-14T12:15:32+00:00"},{"name":"league\/flysystem","version":"1.1.9","source":{"type":"git","url":"https:\/\/github.com\/thephpleague\/flysystem.git","reference":"094defdb4a7001845300334e7c1ee2335925ef99"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/thephpleague\/flysystem\/zipball\/094defdb4a7001845300334e7c1ee2335925ef99","reference":"094defdb4a7001845300334e7c1ee2335925ef99","shasum":""},"require":{"ext-fileinfo":"*","league\/mime-type-detection":"^1.3","php":"^7.2.5 || ^8.0"},"conflict":{"league\/flysystem-sftp":"<1.0.6"},"require-dev":{"phpspec\/prophecy":"^1.11.1","phpunit\/phpunit":"^8.5.8"},"suggest":{"ext-ftp":"Allows you to use FTP server storage","ext-openssl":"Allows you to use FTPS server storage","league\/flysystem-aws-s3-v2":"Allows you to use S3 storage with AWS SDK v2","league\/flysystem-aws-s3-v3":"Allows you to use S3 storage with AWS SDK v3","league\/flysystem-azure":"Allows you to use Windows Azure Blob storage","league\/flysystem-cached-adapter":"Flysystem adapter decorator for metadata caching","league\/flysystem-eventable-filesystem":"Allows you to use EventableFilesystem","league\/flysystem-rackspace":"Allows you to use Rackspace Cloud Files","league\/flysystem-sftp":"Allows you to use SFTP server storage via phpseclib","league\/flysystem-webdav":"Allows you to use WebDAV storage","league\/flysystem-ziparchive":"Allows you to use ZipArchive adapter","spatie\/flysystem-dropbox":"Allows you to use Dropbox storage","srmklive\/flysystem-dropbox-v2":"Allows you to use Dropbox storage for PHP 5 applications"},"type":"library","extra":{"branch-alias":{"dev-master":"1.1-dev"}},"autoload":{"psr-4":{"League\\Flysystem\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Frank de Jonge","email":"info@frenky.net"}],"description":"Filesystem abstraction: Many filesystems, one API.","keywords":["Cloud Files","WebDAV","abstraction","aws","cloud","copy.com","dropbox","file systems","files","filesystem","filesystems","ftp","rackspace","remote","s3","sftp","storage"],"support":{"issues":"https:\/\/github.com\/thephpleague\/flysystem\/issues","source":"https:\/\/github.com\/thephpleague\/flysystem\/tree\/1.1.9"},"funding":[{"url":"https:\/\/offset.earth\/frankdejonge","type":"other"}],"time":"2021-12-09T09:40:50+00:00"},{"name":"league\/mime-type-detection","version":"1.9.0","source":{"type":"git","url":"https:\/\/github.com\/thephpleague\/mime-type-detection.git","reference":"aa70e813a6ad3d1558fc927863d47309b4c23e69"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/thephpleague\/mime-type-detection\/zipball\/aa70e813a6ad3d1558fc927863d47309b4c23e69","reference":"aa70e813a6ad3d1558fc927863d47309b4c23e69","shasum":""},"require":{"ext-fileinfo":"*","php":"^7.2 || ^8.0"},"require-dev":{"friendsofphp\/php-cs-fixer":"^3.2","phpstan\/phpstan":"^0.12.68","phpunit\/phpunit":"^8.5.8 || ^9.3"},"type":"library","autoload":{"psr-4":{"League\\MimeTypeDetection\\":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Frank de Jonge","email":"info@frankdejonge.nl"}],"description":"Mime-type detection for Flysystem","support":{"issues":"https:\/\/github.com\/thephpleague\/mime-type-detection\/issues","source":"https:\/\/github.com\/thephpleague\/mime-type-detection\/tree\/1.9.0"},"funding":[{"url":"https:\/\/github.com\/frankdejonge","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/league\/flysystem","type":"tidelift"}],"time":"2021-11-21T11:48:40+00:00"},{"name":"league\/pipeline","version":"1.0.0","source":{"type":"git","url":"https:\/\/github.com\/thephpleague\/pipeline.git","reference":"aa14b0e3133121f8be39e9a3b6ddd011fc5bb9a8"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/thephpleague\/pipeline\/zipball\/aa14b0e3133121f8be39e9a3b6ddd011fc5bb9a8","reference":"aa14b0e3133121f8be39e9a3b6ddd011fc5bb9a8","shasum":""},"require":{"php":">=7.1"},"require-dev":{"leanphp\/phpspec-code-coverage":"^4.2","phpspec\/phpspec":"^4.3"},"type":"library","autoload":{"psr-4":{"League\\Pipeline\\":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Frank de Jonge","email":"info@frenky.net","role":"Author"},{"name":"Woody Gilk","email":"woody.gilk@gmail.com","role":"Maintainer"}],"description":"A plug and play pipeline implementation.","keywords":["composition","design pattern","pattern","pipeline","sequential"],"support":{"issues":"https:\/\/github.com\/thephpleague\/pipeline\/issues","source":"https:\/\/github.com\/thephpleague\/pipeline\/tree\/master"},"time":"2018-06-05T21:06:51+00:00"},{"name":"league\/tactician","version":"v1.1.0","source":{"type":"git","url":"https:\/\/github.com\/thephpleague\/tactician.git","reference":"e79f763170f3d5922ec29e85cffca0bac5cd8975"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/thephpleague\/tactician\/zipball\/e79f763170f3d5922ec29e85cffca0bac5cd8975","reference":"e79f763170f3d5922ec29e85cffca0bac5cd8975","shasum":""},"require":{"php":">=7.1"},"require-dev":{"mockery\/mockery":"^1.3","phpunit\/phpunit":"^7.5.20 || ^9.3.8","squizlabs\/php_codesniffer":"^3.5.8"},"type":"library","extra":{"branch-alias":{"dev-master":"2.0-dev"}},"autoload":{"psr-4":{"League\\Tactician\\":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Ross Tuck","homepage":"http:\/\/tactician.thephpleague.com"}],"description":"A small, flexible command bus. Handy for building service layers.","keywords":["command","command bus","service layer"],"support":{"issues":"https:\/\/github.com\/thephpleague\/tactician\/issues","source":"https:\/\/github.com\/thephpleague\/tactician\/tree\/v1.1.0"},"time":"2021-02-14T15:29:04+00:00"},{"name":"league\/tactician-bundle","version":"v1.3.2","source":{"type":"git","url":"https:\/\/github.com\/thephpleague\/tactician-bundle.git","reference":"069c665b47530ada5a8442ba9dbbe1ff6704a1b7"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/thephpleague\/tactician-bundle\/zipball\/069c665b47530ada5a8442ba9dbbe1ff6704a1b7","reference":"069c665b47530ada5a8442ba9dbbe1ff6704a1b7","shasum":""},"require":{"league\/tactician":"^1.0","league\/tactician-container":"^2.0","league\/tactician-logger":"^0.10|^0.11","php":">=7.2","symfony\/config":"^3.4|^4.4|^5.0|^6.0","symfony\/dependency-injection":"^3.4|^4.4|^5.0|^6.0","symfony\/http-kernel":"^3.4|^4.4|^5.0|^6.0","symfony\/yaml":"^3.4|^4.4|^5.0|^6.0"},"require-dev":{"matthiasnoback\/symfony-config-test":"^4.2.1","matthiasnoback\/symfony-dependency-injection-test":"^4.2.1","mockery\/mockery":"~1.0","phpunit\/phpunit":"~8.5","symfony\/console":"^3.4|^4.4|^5.0|^6.0","symfony\/framework-bundle":"^3.4.31|^4.4|^5.0|^6.0","symfony\/security-bundle":"^3.4|^4.4|^5.0|^6.0","symfony\/security-core":"^3.4|^4.4|^5.0|^6.0","symfony\/validator":"^3.4|^4.4|^5.0|^6.0"},"suggest":{"league\/tactician-doctrine":"For doctrine transaction middleware","symfony\/console":"For debugging command-to-handler routing using the tactician:debug console command","symfony\/security":"For command security middleware","symfony\/validator":"For command validator middleware"},"type":"symfony-bundle","extra":{"branch-alias":{"dev-master":"1.0-dev"}},"autoload":{"psr-4":{"League\\Tactician\\Bundle\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Rafael Dohms","homepage":"http:\/\/doh.ms"},{"name":"Richard Tuin","homepage":"http:\/\/www.rtuin.nl\/"},{"name":"Xander Smalbil","email":"xander@videofunk.nl"},{"name":"Ross Tuck","email":"me@rosstuck.com"}],"description":"Bundle to integrate Tactician with Symfony projects","keywords":["bundle","symfony","tactician"],"support":{"issues":"https:\/\/github.com\/thephpleague\/tactician-bundle\/issues","source":"https:\/\/github.com\/thephpleague\/tactician-bundle\/tree\/v1.3.2"},"time":"2021-12-16T20:04:25+00:00"},{"name":"league\/tactician-container","version":"2.0.0","source":{"type":"git","url":"https:\/\/github.com\/thephpleague\/tactician-container.git","reference":"d1a5d884e072b8cafbff802d07766076eb2ffcb0"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/thephpleague\/tactician-container\/zipball\/d1a5d884e072b8cafbff802d07766076eb2ffcb0","reference":"d1a5d884e072b8cafbff802d07766076eb2ffcb0","shasum":""},"require":{"league\/tactician":"^1.0","php":">=5.5","psr\/container":"^1.0"},"require-dev":{"league\/container":"~2.3","phpunit\/phpunit":"~4.3","squizlabs\/php_codesniffer":"~2.0"},"type":"library","autoload":{"psr-4":{"League\\Tactician\\Container\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Nigel Greenway","homepage":"http:\/\/futurepixels.co.uk"}],"description":"Tactician integration for any container implementing PSR-11","keywords":["container","container-interop","di","interoperable","league","tactician"],"support":{"issues":"https:\/\/github.com\/thephpleague\/tactician-container\/issues","source":"https:\/\/github.com\/thephpleague\/tactician-container\/tree\/master"},"time":"2017-04-13T06:27:12+00:00"},{"name":"league\/tactician-logger","version":"v0.11.0","source":{"type":"git","url":"https:\/\/github.com\/thephpleague\/tactician-logger.git","reference":"c2d0977445d18d7e3d85adccef7dc14948707ea9"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/thephpleague\/tactician-logger\/zipball\/c2d0977445d18d7e3d85adccef7dc14948707ea9","reference":"c2d0977445d18d7e3d85adccef7dc14948707ea9","shasum":""},"require":{"league\/tactician":"^1.1","php":">=7.3","psr\/log":"^1.0|^2.0|^3.0"},"require-dev":{"mockery\/mockery":"^1.3","phpunit\/phpunit":"^9.3","squizlabs\/php_codesniffer":"^3.5.8"},"type":"library","autoload":{"psr-4":{"League\\Tactician\\Logger\\":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Ross Tuck"}],"description":"Adds PSR-3 logging support to the Tactician command bus","homepage":"https:\/\/github.com\/thephpleague\/tactician-logger","keywords":["log","logging","tactician"],"support":{"issues":"https:\/\/github.com\/thephpleague\/tactician-logger\/issues","source":"https:\/\/github.com\/thephpleague\/tactician-logger\/tree\/v0.11.0"},"time":"2021-11-14T15:08:02+00:00"},{"name":"league\/uri","version":"6.3.0","source":{"type":"git","url":"https:\/\/github.com\/thephpleague\/uri.git","reference":"aa3babf16e9d7535544bd94e3def026ac56640f3"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/thephpleague\/uri\/zipball\/aa3babf16e9d7535544bd94e3def026ac56640f3","reference":"aa3babf16e9d7535544bd94e3def026ac56640f3","shasum":""},"require":{"ext-json":"*","league\/uri-interfaces":"^2.1","php":">=7.2","psr\/http-message":"^1.0"},"conflict":{"league\/uri-schemes":"^1.0"},"require-dev":{"friendsofphp\/php-cs-fixer":"^2.16","phpstan\/phpstan":"^0.12","phpstan\/phpstan-phpunit":"^0.12","phpstan\/phpstan-strict-rules":"^0.12","phpunit\/phpunit":"^8.0"},"suggest":{"ext-fileinfo":"Needed to create Data URI from a filepath","ext-intl":"Needed to improve host validation","league\/uri-components":"Needed to easily manipulate URI objects"},"type":"library","extra":{"branch-alias":{"dev-master":"6.x-dev"}},"autoload":{"psr-4":{"League\\Uri\\":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Ignace Nyamagana Butera","email":"nyamsprod@gmail.com","homepage":"https:\/\/nyamsprod.com"}],"description":"URI manipulation library","homepage":"http:\/\/uri.thephpleague.com","keywords":["data-uri","file-uri","ftp","hostname","http","https","middleware","parse_str","parse_url","psr-7","query-string","querystring","rfc3986","rfc3987","rfc6570","uri","uri-template","url","ws"],"support":{"docs":"https:\/\/uri.thephpleague.com","forum":"https:\/\/thephpleague.slack.com","issues":"https:\/\/github.com\/thephpleague\/uri\/issues","source":"https:\/\/github.com\/thephpleague\/uri\/tree\/master"},"funding":[{"url":"https:\/\/github.com\/sponsors\/nyamsprod","type":"github"}],"time":"2020-08-13T17:18:44+00:00"},{"name":"league\/uri-interfaces","version":"2.3.0","source":{"type":"git","url":"https:\/\/github.com\/thephpleague\/uri-interfaces.git","reference":"00e7e2943f76d8cb50c7dfdc2f6dee356e15e383"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/thephpleague\/uri-interfaces\/zipball\/00e7e2943f76d8cb50c7dfdc2f6dee356e15e383","reference":"00e7e2943f76d8cb50c7dfdc2f6dee356e15e383","shasum":""},"require":{"ext-json":"*","php":"^7.2 || ^8.0"},"require-dev":{"friendsofphp\/php-cs-fixer":"^2.19","phpstan\/phpstan":"^0.12.90","phpstan\/phpstan-phpunit":"^0.12.19","phpstan\/phpstan-strict-rules":"^0.12.9","phpunit\/phpunit":"^8.5.15 || ^9.5"},"suggest":{"ext-intl":"to use the IDNA feature","symfony\/intl":"to use the IDNA feature via Symfony Polyfill"},"type":"library","extra":{"branch-alias":{"dev-master":"2.x-dev"}},"autoload":{"psr-4":{"League\\Uri\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Ignace Nyamagana Butera","email":"nyamsprod@gmail.com","homepage":"https:\/\/nyamsprod.com"}],"description":"Common interface for URI representation","homepage":"http:\/\/github.com\/thephpleague\/uri-interfaces","keywords":["rfc3986","rfc3987","uri","url"],"support":{"issues":"https:\/\/github.com\/thephpleague\/uri-interfaces\/issues","source":"https:\/\/github.com\/thephpleague\/uri-interfaces\/tree\/2.3.0"},"funding":[{"url":"https:\/\/github.com\/sponsors\/nyamsprod","type":"github"}],"time":"2021-06-28T04:27:21+00:00"},{"name":"monolog\/monolog","version":"2.3.5","source":{"type":"git","url":"https:\/\/github.com\/Seldaek\/monolog.git","reference":"fd4380d6fc37626e2f799f29d91195040137eba9"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/Seldaek\/monolog\/zipball\/fd4380d6fc37626e2f799f29d91195040137eba9","reference":"fd4380d6fc37626e2f799f29d91195040137eba9","shasum":""},"require":{"php":">=7.2","psr\/log":"^1.0.1 || ^2.0 || ^3.0"},"provide":{"psr\/log-implementation":"1.0.0 || 2.0.0 || 3.0.0"},"require-dev":{"aws\/aws-sdk-php":"^2.4.9 || ^3.0","doctrine\/couchdb":"~1.0@dev","elasticsearch\/elasticsearch":"^7","graylog2\/gelf-php":"^1.4.2","mongodb\/mongodb":"^1.8","php-amqplib\/php-amqplib":"~2.4 || ^3","php-console\/php-console":"^3.1.3","phpspec\/prophecy":"^1.6.1","phpstan\/phpstan":"^0.12.91","phpunit\/phpunit":"^8.5","predis\/predis":"^1.1","rollbar\/rollbar":"^1.3","ruflin\/elastica":">=0.90@dev","swiftmailer\/swiftmailer":"^5.3|^6.0"},"suggest":{"aws\/aws-sdk-php":"Allow sending log messages to AWS services like DynamoDB","doctrine\/couchdb":"Allow sending log messages to a CouchDB server","elasticsearch\/elasticsearch":"Allow sending log messages to an Elasticsearch server via official client","ext-amqp":"Allow sending log messages to an AMQP server (1.0+ required)","ext-curl":"Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler","ext-mbstring":"Allow to work properly with unicode symbols","ext-mongodb":"Allow sending log messages to a MongoDB server (via driver)","ext-openssl":"Required to send log messages using SSL","ext-sockets":"Allow sending log messages to a Syslog server (via UDP driver)","graylog2\/gelf-php":"Allow sending log messages to a GrayLog2 server","mongodb\/mongodb":"Allow sending log messages to a MongoDB server (via library)","php-amqplib\/php-amqplib":"Allow sending log messages to an AMQP server using php-amqplib","php-console\/php-console":"Allow sending log messages to Google Chrome","rollbar\/rollbar":"Allow sending log messages to Rollbar","ruflin\/elastica":"Allow sending log messages to an Elastic Search server"},"type":"library","extra":{"branch-alias":{"dev-main":"2.x-dev"}},"autoload":{"psr-4":{"Monolog\\":"src\/Monolog"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Jordi Boggiano","email":"j.boggiano@seld.be","homepage":"https:\/\/seld.be"}],"description":"Sends your logs to files, sockets, inboxes, databases and various web services","homepage":"https:\/\/github.com\/Seldaek\/monolog","keywords":["log","logging","psr-3"],"support":{"issues":"https:\/\/github.com\/Seldaek\/monolog\/issues","source":"https:\/\/github.com\/Seldaek\/monolog\/tree\/2.3.5"},"funding":[{"url":"https:\/\/github.com\/Seldaek","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/monolog\/monolog","type":"tidelift"}],"time":"2021-10-01T21:08:31+00:00"},{"name":"nette\/schema","version":"v1.2.2","source":{"type":"git","url":"https:\/\/github.com\/nette\/schema.git","reference":"9a39cef03a5b34c7de64f551538cbba05c2be5df"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/nette\/schema\/zipball\/9a39cef03a5b34c7de64f551538cbba05c2be5df","reference":"9a39cef03a5b34c7de64f551538cbba05c2be5df","shasum":""},"require":{"nette\/utils":"^2.5.7 || ^3.1.5 || ^4.0","php":">=7.1 <8.2"},"require-dev":{"nette\/tester":"^2.3 || ^2.4","phpstan\/phpstan-nette":"^0.12","tracy\/tracy":"^2.7"},"type":"library","extra":{"branch-alias":{"dev-master":"1.2-dev"}},"autoload":{"classmap":["src\/"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["BSD-3-Clause","GPL-2.0-only","GPL-3.0-only"],"authors":[{"name":"David Grudl","homepage":"https:\/\/davidgrudl.com"},{"name":"Nette Community","homepage":"https:\/\/nette.org\/contributors"}],"description":"\ud83d\udcd0 Nette Schema: validating data structures against a given Schema.","homepage":"https:\/\/nette.org","keywords":["config","nette"],"support":{"issues":"https:\/\/github.com\/nette\/schema\/issues","source":"https:\/\/github.com\/nette\/schema\/tree\/v1.2.2"},"time":"2021-10-15T11:40:02+00:00"},{"name":"nette\/utils","version":"v3.2.6","source":{"type":"git","url":"https:\/\/github.com\/nette\/utils.git","reference":"2f261e55bd6a12057442045bf2c249806abc1d02"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/nette\/utils\/zipball\/2f261e55bd6a12057442045bf2c249806abc1d02","reference":"2f261e55bd6a12057442045bf2c249806abc1d02","shasum":""},"require":{"php":">=7.2 <8.2"},"conflict":{"nette\/di":"<3.0.6"},"require-dev":{"nette\/tester":"~2.0","phpstan\/phpstan":"^1.0","tracy\/tracy":"^2.3"},"suggest":{"ext-gd":"to use Image","ext-iconv":"to use Strings::webalize(), toAscii(), chr() and reverse()","ext-intl":"to use Strings::webalize(), toAscii(), normalize() and compare()","ext-json":"to use Nette\\Utils\\Json","ext-mbstring":"to use Strings::lower() etc...","ext-tokenizer":"to use Nette\\Utils\\Reflection::getUseStatements()","ext-xml":"to use Strings::length() etc. when mbstring is not available"},"type":"library","extra":{"branch-alias":{"dev-master":"3.2-dev"}},"autoload":{"classmap":["src\/"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["BSD-3-Clause","GPL-2.0-only","GPL-3.0-only"],"authors":[{"name":"David Grudl","homepage":"https:\/\/davidgrudl.com"},{"name":"Nette Community","homepage":"https:\/\/nette.org\/contributors"}],"description":"\ud83d\udee0 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding\/decoding, validation, slug or strong password generating etc.","homepage":"https:\/\/nette.org","keywords":["array","core","datetime","images","json","nette","paginator","password","slugify","string","unicode","utf-8","utility","validation"],"support":{"issues":"https:\/\/github.com\/nette\/utils\/issues","source":"https:\/\/github.com\/nette\/utils\/tree\/v3.2.6"},"time":"2021-11-24T15:47:23+00:00"},{"name":"nikic\/php-parser","version":"v4.13.2","source":{"type":"git","url":"https:\/\/github.com\/nikic\/PHP-Parser.git","reference":"210577fe3cf7badcc5814d99455df46564f3c077"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/nikic\/PHP-Parser\/zipball\/210577fe3cf7badcc5814d99455df46564f3c077","reference":"210577fe3cf7badcc5814d99455df46564f3c077","shasum":""},"require":{"ext-tokenizer":"*","php":">=7.0"},"require-dev":{"ircmaxell\/php-yacc":"^0.0.7","phpunit\/phpunit":"^6.5 || ^7.0 || ^8.0 || ^9.0"},"bin":["bin\/php-parse"],"type":"library","extra":{"branch-alias":{"dev-master":"4.9-dev"}},"autoload":{"psr-4":{"PhpParser\\":"lib\/PhpParser"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["BSD-3-Clause"],"authors":[{"name":"Nikita Popov"}],"description":"A PHP parser written in PHP","keywords":["parser","php"],"support":{"issues":"https:\/\/github.com\/nikic\/PHP-Parser\/issues","source":"https:\/\/github.com\/nikic\/PHP-Parser\/tree\/v4.13.2"},"time":"2021-11-30T19:35:32+00:00"},{"name":"phpdocumentor\/flyfinder","version":"1.1.0","source":{"type":"git","url":"https:\/\/github.com\/phpDocumentor\/FlyFinder.git","reference":"6e145e676d9fbade7527fd8d4c99ab36b687b958"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/phpDocumentor\/FlyFinder\/zipball\/6e145e676d9fbade7527fd8d4c99ab36b687b958","reference":"6e145e676d9fbade7527fd8d4c99ab36b687b958","shasum":""},"require":{"league\/flysystem":"^1.0","php":"^7.2||^8.0"},"require-dev":{"league\/flysystem-memory":"~1","mockery\/mockery":"^1.3"},"type":"library","extra":{"branch-alias":{"dev-master":"1.x-dev"}},"autoload":{"psr-4":{"Flyfinder\\":["src\/"]}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"description":"Flysystem plugin to add file finding capabilities to the Filesystem entity","homepage":"http:\/\/www.phpdoc.org","keywords":["Flysystem","phpdoc"],"support":{"issues":"https:\/\/github.com\/phpDocumentor\/FlyFinder\/issues","source":"https:\/\/github.com\/phpDocumentor\/FlyFinder\/tree\/1.1.0"},"time":"2021-06-04T13:44:40+00:00"},{"name":"phpdocumentor\/graphviz","version":"2.1.0","source":{"type":"git","url":"https:\/\/github.com\/phpDocumentor\/GraphViz.git","reference":"115999dc7f31f2392645aa825a94a6b165e1cedf"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/phpDocumentor\/GraphViz\/zipball\/115999dc7f31f2392645aa825a94a6b165e1cedf","reference":"115999dc7f31f2392645aa825a94a6b165e1cedf","shasum":""},"require":{"php":"^7.2 || ^8.0"},"require-dev":{"ext-simplexml":"*","mockery\/mockery":"^1.2","phpstan\/phpstan":"^0.12","phpunit\/phpunit":"^8.2 || ^9.2","psalm\/phar":"^4.15"},"type":"library","extra":{"branch-alias":{"dev-master":"2.x-dev"}},"autoload":{"psr-4":{"phpDocumentor\\GraphViz\\":"src\/phpDocumentor\/GraphViz","phpDocumentor\\GraphViz\\PHPStan\\":".\/src\/phpDocumentor\/PHPStan"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Mike van Riel","email":"mike.vanriel@naenius.com"}],"description":"Wrapper for Graphviz","support":{"issues":"https:\/\/github.com\/phpDocumentor\/GraphViz\/issues","source":"https:\/\/github.com\/phpDocumentor\/GraphViz\/tree\/2.1.0"},"time":"2021-12-13T19:03:21+00:00"},{"name":"phpdocumentor\/guides","version":"dev-master","dist":{"type":"path","url":"incubator\/guides","reference":"630a398f9eb34e854f328673e0ee7463a7971afd"},"require":{"league\/flysystem":"^1.0","php":">=7.2.5||^8.0","phpdocumentor\/flyfinder":"^1.0","twig\/twig":"~2.0","webmozart\/assert":"^1.3"},"type":"library","autoload":{"psr-4":{"phpDocumentor\\Guides\\":"src\/"}},"autoload-dev":{"psr-4":{"phpDocumentor\\Guides\\":["tests\/unit\/"]}},"license":["MIT"],"homepage":"https:\/\/www.phpdoc.org","transport-options":{"relative":true}},{"name":"phpdocumentor\/guides-markdown","version":"dev-master","dist":{"type":"path","url":"incubator\/guides-markdown","reference":"424eeced9b4152084424ce8a9b6c6518272efd30"},"require":{"league\/commonmark":"^2.1","php":"^7.4.0||^8.0"},"type":"library","autoload":{"psr-4":{"phpDocumentor\\Guides\\":"src\/"}},"autoload-dev":{"psr-4":{"phpDocumentor\\Guides\\":["tests\/unit\/"]}},"license":["MIT"],"homepage":"https:\/\/www.phpdoc.org","transport-options":{"relative":true}},{"name":"phpdocumentor\/guides-restructured-text","version":"dev-master","dist":{"type":"path","url":"incubator\/guides-restructured-text","reference":"479c5eb3cc86b3604c33bf251110c51b23916953"},"require":{"doctrine\/event-manager":"^1.1","doctrine\/lexer":"^1.2","php":">=7.2.5||^8.0","webmozart\/assert":"^1.3"},"type":"library","autoload":{"psr-4":{"phpDocumentor\\Guides\\":"src\/"}},"autoload-dev":{"psr-4":{"phpDocumentor\\Guides\\":["tests\/unit\/"]}},"license":["MIT"],"homepage":"https:\/\/www.phpdoc.org","transport-options":{"relative":true}},{"name":"phpdocumentor\/reflection","version":"5.1.0","source":{"type":"git","url":"https:\/\/github.com\/phpDocumentor\/Reflection.git","reference":"d0fcff5f5fcd319bd8ca9fb73f17646ba6f58534"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/phpDocumentor\/Reflection\/zipball\/d0fcff5f5fcd319bd8ca9fb73f17646ba6f58534","reference":"d0fcff5f5fcd319bd8ca9fb73f17646ba6f58534","shasum":""},"require":{"nikic\/php-parser":"^4.0","php":">=7.2","phpdocumentor\/reflection-common":"^2.0","phpdocumentor\/reflection-docblock":"^5","phpdocumentor\/type-resolver":"^1.0","psr\/log":"~1.0","webmozart\/assert":"^1.0"},"require-dev":{"mikey179\/vfsstream":"~1.2","mockery\/mockery":"~1.3.2"},"type":"library","extra":{"branch-alias":{"dev-4.x":"5.0.x-dev"}},"autoload":{"psr-4":{"phpDocumentor\\":"src\/phpDocumentor"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"description":"Reflection library to do Static Analysis for PHP Projects","homepage":"http:\/\/www.phpdoc.org","keywords":["phpDocumentor","phpdoc","reflection","static analysis"],"support":{"issues":"https:\/\/github.com\/phpDocumentor\/Reflection\/issues","source":"https:\/\/github.com\/phpDocumentor\/Reflection\/tree\/5.1.0"},"time":"2022-01-04T20:59:25+00:00"},{"name":"phpdocumentor\/reflection-common","version":"2.2.0","source":{"type":"git","url":"https:\/\/github.com\/phpDocumentor\/ReflectionCommon.git","reference":"1d01c49d4ed62f25aa84a747ad35d5a16924662b"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/phpDocumentor\/ReflectionCommon\/zipball\/1d01c49d4ed62f25aa84a747ad35d5a16924662b","reference":"1d01c49d4ed62f25aa84a747ad35d5a16924662b","shasum":""},"require":{"php":"^7.2 || ^8.0"},"type":"library","extra":{"branch-alias":{"dev-2.x":"2.x-dev"}},"autoload":{"psr-4":{"phpDocumentor\\Reflection\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Jaap van Otterdijk","email":"opensource@ijaap.nl"}],"description":"Common reflection classes used by phpdocumentor to reflect the code structure","homepage":"http:\/\/www.phpdoc.org","keywords":["FQSEN","phpDocumentor","phpdoc","reflection","static analysis"],"support":{"issues":"https:\/\/github.com\/phpDocumentor\/ReflectionCommon\/issues","source":"https:\/\/github.com\/phpDocumentor\/ReflectionCommon\/tree\/2.x"},"time":"2020-06-27T09:03:43+00:00"},{"name":"phpdocumentor\/reflection-docblock","version":"5.3.0","source":{"type":"git","url":"https:\/\/github.com\/phpDocumentor\/ReflectionDocBlock.git","reference":"622548b623e81ca6d78b721c5e029f4ce664f170"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/phpDocumentor\/ReflectionDocBlock\/zipball\/622548b623e81ca6d78b721c5e029f4ce664f170","reference":"622548b623e81ca6d78b721c5e029f4ce664f170","shasum":""},"require":{"ext-filter":"*","php":"^7.2 || ^8.0","phpdocumentor\/reflection-common":"^2.2","phpdocumentor\/type-resolver":"^1.3","webmozart\/assert":"^1.9.1"},"require-dev":{"mockery\/mockery":"~1.3.2","psalm\/phar":"^4.8"},"type":"library","extra":{"branch-alias":{"dev-master":"5.x-dev"}},"autoload":{"psr-4":{"phpDocumentor\\Reflection\\":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Mike van Riel","email":"me@mikevanriel.com"},{"name":"Jaap van Otterdijk","email":"account@ijaap.nl"}],"description":"With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.","support":{"issues":"https:\/\/github.com\/phpDocumentor\/ReflectionDocBlock\/issues","source":"https:\/\/github.com\/phpDocumentor\/ReflectionDocBlock\/tree\/5.3.0"},"time":"2021-10-19T17:43:47+00:00"},{"name":"phpdocumentor\/type-resolver","version":"1.6.0","source":{"type":"git","url":"https:\/\/github.com\/phpDocumentor\/TypeResolver.git","reference":"93ebd0014cab80c4ea9f5e297ea48672f1b87706"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/phpDocumentor\/TypeResolver\/zipball\/93ebd0014cab80c4ea9f5e297ea48672f1b87706","reference":"93ebd0014cab80c4ea9f5e297ea48672f1b87706","shasum":""},"require":{"php":"^7.2 || ^8.0","phpdocumentor\/reflection-common":"^2.0"},"require-dev":{"ext-tokenizer":"*","psalm\/phar":"^4.8"},"type":"library","extra":{"branch-alias":{"dev-1.x":"1.x-dev"}},"autoload":{"psr-4":{"phpDocumentor\\Reflection\\":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Mike van Riel","email":"me@mikevanriel.com"}],"description":"A PSR-5 based resolver of Class names, Types and Structural Element Names","support":{"issues":"https:\/\/github.com\/phpDocumentor\/TypeResolver\/issues","source":"https:\/\/github.com\/phpDocumentor\/TypeResolver\/tree\/1.6.0"},"time":"2022-01-04T19:58:01+00:00"},{"name":"psr\/cache","version":"1.0.1","source":{"type":"git","url":"https:\/\/github.com\/php-fig\/cache.git","reference":"d11b50ad223250cf17b86e38383413f5a6764bf8"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/php-fig\/cache\/zipball\/d11b50ad223250cf17b86e38383413f5a6764bf8","reference":"d11b50ad223250cf17b86e38383413f5a6764bf8","shasum":""},"require":{"php":">=5.3.0"},"type":"library","extra":{"branch-alias":{"dev-master":"1.0.x-dev"}},"autoload":{"psr-4":{"Psr\\Cache\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"PHP-FIG","homepage":"http:\/\/www.php-fig.org\/"}],"description":"Common interface for caching libraries","keywords":["cache","psr","psr-6"],"support":{"source":"https:\/\/github.com\/php-fig\/cache\/tree\/master"},"time":"2016-08-06T20:24:11+00:00"},{"name":"psr\/container","version":"1.1.2","source":{"type":"git","url":"https:\/\/github.com\/php-fig\/container.git","reference":"513e0666f7216c7459170d56df27dfcefe1689ea"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/php-fig\/container\/zipball\/513e0666f7216c7459170d56df27dfcefe1689ea","reference":"513e0666f7216c7459170d56df27dfcefe1689ea","shasum":""},"require":{"php":">=7.4.0"},"type":"library","autoload":{"psr-4":{"Psr\\Container\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"PHP-FIG","homepage":"https:\/\/www.php-fig.org\/"}],"description":"Common Container Interface (PHP FIG PSR-11)","homepage":"https:\/\/github.com\/php-fig\/container","keywords":["PSR-11","container","container-interface","container-interop","psr"],"support":{"issues":"https:\/\/github.com\/php-fig\/container\/issues","source":"https:\/\/github.com\/php-fig\/container\/tree\/1.1.2"},"time":"2021-11-05T16:50:12+00:00"},{"name":"psr\/event-dispatcher","version":"1.0.0","source":{"type":"git","url":"https:\/\/github.com\/php-fig\/event-dispatcher.git","reference":"dbefd12671e8a14ec7f180cab83036ed26714bb0"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/php-fig\/event-dispatcher\/zipball\/dbefd12671e8a14ec7f180cab83036ed26714bb0","reference":"dbefd12671e8a14ec7f180cab83036ed26714bb0","shasum":""},"require":{"php":">=7.2.0"},"type":"library","extra":{"branch-alias":{"dev-master":"1.0.x-dev"}},"autoload":{"psr-4":{"Psr\\EventDispatcher\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"PHP-FIG","homepage":"http:\/\/www.php-fig.org\/"}],"description":"Standard interfaces for event handling.","keywords":["events","psr","psr-14"],"support":{"issues":"https:\/\/github.com\/php-fig\/event-dispatcher\/issues","source":"https:\/\/github.com\/php-fig\/event-dispatcher\/tree\/1.0.0"},"time":"2019-01-08T18:20:26+00:00"},{"name":"psr\/http-message","version":"1.0.1","source":{"type":"git","url":"https:\/\/github.com\/php-fig\/http-message.git","reference":"f6561bf28d520154e4b0ec72be95418abe6d9363"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/php-fig\/http-message\/zipball\/f6561bf28d520154e4b0ec72be95418abe6d9363","reference":"f6561bf28d520154e4b0ec72be95418abe6d9363","shasum":""},"require":{"php":">=5.3.0"},"type":"library","extra":{"branch-alias":{"dev-master":"1.0.x-dev"}},"autoload":{"psr-4":{"Psr\\Http\\Message\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"PHP-FIG","homepage":"http:\/\/www.php-fig.org\/"}],"description":"Common interface for HTTP messages","homepage":"https:\/\/github.com\/php-fig\/http-message","keywords":["http","http-message","psr","psr-7","request","response"],"support":{"source":"https:\/\/github.com\/php-fig\/http-message\/tree\/master"},"time":"2016-08-06T14:39:51+00:00"},{"name":"psr\/log","version":"1.1.4","source":{"type":"git","url":"https:\/\/github.com\/php-fig\/log.git","reference":"d49695b909c3b7628b6289db5479a1c204601f11"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/php-fig\/log\/zipball\/d49695b909c3b7628b6289db5479a1c204601f11","reference":"d49695b909c3b7628b6289db5479a1c204601f11","shasum":""},"require":{"php":">=5.3.0"},"type":"library","extra":{"branch-alias":{"dev-master":"1.1.x-dev"}},"autoload":{"psr-4":{"Psr\\Log\\":"Psr\/Log\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"PHP-FIG","homepage":"https:\/\/www.php-fig.org\/"}],"description":"Common interface for logging libraries","homepage":"https:\/\/github.com\/php-fig\/log","keywords":["log","psr","psr-3"],"support":{"source":"https:\/\/github.com\/php-fig\/log\/tree\/1.1.4"},"time":"2021-05-03T11:20:27+00:00"},{"name":"symfony\/cache","version":"v5.4.6","source":{"type":"git","url":"https:\/\/github.com\/symfony\/cache.git","reference":"c0718d0e01ac14251a45cc9c8b93716ec41ae64b"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/cache\/zipball\/c0718d0e01ac14251a45cc9c8b93716ec41ae64b","reference":"c0718d0e01ac14251a45cc9c8b93716ec41ae64b","shasum":""},"require":{"php":">=7.2.5","psr\/cache":"^1.0|^2.0","psr\/log":"^1.1|^2|^3","symfony\/cache-contracts":"^1.1.7|^2","symfony\/deprecation-contracts":"^2.1|^3","symfony\/polyfill-php73":"^1.9","symfony\/polyfill-php80":"^1.16","symfony\/service-contracts":"^1.1|^2|^3","symfony\/var-exporter":"^4.4|^5.0|^6.0"},"conflict":{"doctrine\/dbal":"<2.13.1","symfony\/dependency-injection":"<4.4","symfony\/http-kernel":"<4.4","symfony\/var-dumper":"<4.4"},"provide":{"psr\/cache-implementation":"1.0|2.0","psr\/simple-cache-implementation":"1.0|2.0","symfony\/cache-implementation":"1.0|2.0"},"require-dev":{"cache\/integration-tests":"dev-master","doctrine\/cache":"^1.6|^2.0","doctrine\/dbal":"^2.13.1|^3.0","predis\/predis":"^1.1","psr\/simple-cache":"^1.0|^2.0","symfony\/config":"^4.4|^5.0|^6.0","symfony\/dependency-injection":"^4.4|^5.0|^6.0","symfony\/filesystem":"^4.4|^5.0|^6.0","symfony\/http-kernel":"^4.4|^5.0|^6.0","symfony\/messenger":"^4.4|^5.0|^6.0","symfony\/var-dumper":"^4.4|^5.0|^6.0"},"type":"library","autoload":{"psr-4":{"Symfony\\Component\\Cache\\":""},"exclude-from-classmap":["\/Tests\/"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Nicolas Grekas","email":"p@tchwork.com"},{"name":"Symfony Community","homepage":"https:\/\/symfony.com\/contributors"}],"description":"Provides an extended PSR-6, PSR-16 (and tags) implementation","homepage":"https:\/\/symfony.com","keywords":["caching","psr6"],"support":{"source":"https:\/\/github.com\/symfony\/cache\/tree\/v5.4.6"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2022-03-02T12:56:28+00:00"},{"name":"symfony\/config","version":"v5.4.3","source":{"type":"git","url":"https:\/\/github.com\/symfony\/config.git","reference":"d65e1bd990c740e31feb07d2b0927b8d4df9956f"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/config\/zipball\/d65e1bd990c740e31feb07d2b0927b8d4df9956f","reference":"d65e1bd990c740e31feb07d2b0927b8d4df9956f","shasum":""},"require":{"php":">=7.2.5","symfony\/deprecation-contracts":"^2.1|^3","symfony\/filesystem":"^4.4|^5.0|^6.0","symfony\/polyfill-ctype":"~1.8","symfony\/polyfill-php80":"^1.16","symfony\/polyfill-php81":"^1.22"},"conflict":{"symfony\/finder":"<4.4"},"require-dev":{"symfony\/event-dispatcher":"^4.4|^5.0|^6.0","symfony\/finder":"^4.4|^5.0|^6.0","symfony\/messenger":"^4.4|^5.0|^6.0","symfony\/service-contracts":"^1.1|^2|^3","symfony\/yaml":"^4.4|^5.0|^6.0"},"suggest":{"symfony\/yaml":"To use the yaml reference dumper"},"type":"library","autoload":{"psr-4":{"Symfony\\Component\\Config\\":""},"exclude-from-classmap":["\/Tests\/"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Fabien Potencier","email":"fabien@symfony.com"},{"name":"Symfony Community","homepage":"https:\/\/symfony.com\/contributors"}],"description":"Helps you find, load, combine, autofill and validate configuration values of any kind","homepage":"https:\/\/symfony.com","support":{"source":"https:\/\/github.com\/symfony\/config\/tree\/v5.4.3"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2022-01-03T09:50:52+00:00"},{"name":"symfony\/console","version":"v5.4.5","source":{"type":"git","url":"https:\/\/github.com\/symfony\/console.git","reference":"d8111acc99876953f52fe16d4c50eb60940d49ad"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/console\/zipball\/d8111acc99876953f52fe16d4c50eb60940d49ad","reference":"d8111acc99876953f52fe16d4c50eb60940d49ad","shasum":""},"require":{"php":">=7.2.5","symfony\/deprecation-contracts":"^2.1|^3","symfony\/polyfill-mbstring":"~1.0","symfony\/polyfill-php73":"^1.9","symfony\/polyfill-php80":"^1.16","symfony\/service-contracts":"^1.1|^2|^3","symfony\/string":"^5.1|^6.0"},"conflict":{"psr\/log":">=3","symfony\/dependency-injection":"<4.4","symfony\/dotenv":"<5.1","symfony\/event-dispatcher":"<4.4","symfony\/lock":"<4.4","symfony\/process":"<4.4"},"provide":{"psr\/log-implementation":"1.0|2.0"},"require-dev":{"psr\/log":"^1|^2","symfony\/config":"^4.4|^5.0|^6.0","symfony\/dependency-injection":"^4.4|^5.0|^6.0","symfony\/event-dispatcher":"^4.4|^5.0|^6.0","symfony\/lock":"^4.4|^5.0|^6.0","symfony\/process":"^4.4|^5.0|^6.0","symfony\/var-dumper":"^4.4|^5.0|^6.0"},"suggest":{"psr\/log":"For using the console logger","symfony\/event-dispatcher":"","symfony\/lock":"","symfony\/process":""},"type":"library","autoload":{"psr-4":{"Symfony\\Component\\Console\\":""},"exclude-from-classmap":["\/Tests\/"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Fabien Potencier","email":"fabien@symfony.com"},{"name":"Symfony Community","homepage":"https:\/\/symfony.com\/contributors"}],"description":"Eases the creation of beautiful and testable command line interfaces","homepage":"https:\/\/symfony.com","keywords":["cli","command line","console","terminal"],"support":{"source":"https:\/\/github.com\/symfony\/console\/tree\/v5.4.5"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2022-02-24T12:45:35+00:00"},{"name":"symfony\/contracts","version":"v2.5.0","source":{"type":"git","url":"https:\/\/github.com\/symfony\/contracts.git","reference":"1f4c95d47bddf0c1579779d4b85602c923ed2f1c"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/contracts\/zipball\/1f4c95d47bddf0c1579779d4b85602c923ed2f1c","reference":"1f4c95d47bddf0c1579779d4b85602c923ed2f1c","shasum":""},"require":{"php":">=7.2.5","psr\/cache":"^1.0|^2.0|^3.0","psr\/container":"^1.1","psr\/event-dispatcher":"^1.0"},"conflict":{"ext-psr":"<1.1|>=2"},"replace":{"symfony\/cache-contracts":"self.version","symfony\/deprecation-contracts":"self.version","symfony\/event-dispatcher-contracts":"self.version","symfony\/http-client-contracts":"self.version","symfony\/service-contracts":"self.version","symfony\/translation-contracts":"self.version"},"require-dev":{"symfony\/polyfill-intl-idn":"^1.10"},"suggest":{"symfony\/cache-implementation":"","symfony\/event-dispatcher-implementation":"","symfony\/http-client-implementation":"","symfony\/service-implementation":"","symfony\/translation-implementation":""},"type":"library","extra":{"branch-alias":{"dev-main":"2.5-dev"}},"autoload":{"files":["Deprecation\/function.php"],"psr-4":{"Symfony\\Contracts\\":""},"exclude-from-classmap":["**\/Tests\/"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Nicolas Grekas","email":"p@tchwork.com"},{"name":"Symfony Community","homepage":"https:\/\/symfony.com\/contributors"}],"description":"A set of abstractions extracted out of the Symfony components","homepage":"https:\/\/symfony.com","keywords":["abstractions","contracts","decoupling","interfaces","interoperability","standards"],"support":{"source":"https:\/\/github.com\/symfony\/contracts\/tree\/v2.5.0"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2021-11-22T15:13:51+00:00"},{"name":"symfony\/dependency-injection","version":"v5.4.6","source":{"type":"git","url":"https:\/\/github.com\/symfony\/dependency-injection.git","reference":"0828fa3e6e436243dbb3dc85abe6b698b3876b89"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/dependency-injection\/zipball\/0828fa3e6e436243dbb3dc85abe6b698b3876b89","reference":"0828fa3e6e436243dbb3dc85abe6b698b3876b89","shasum":""},"require":{"php":">=7.2.5","psr\/container":"^1.1.1","symfony\/deprecation-contracts":"^2.1|^3","symfony\/polyfill-php80":"^1.16","symfony\/polyfill-php81":"^1.22","symfony\/service-contracts":"^1.1.6|^2"},"conflict":{"ext-psr":"<1.1|>=2","symfony\/config":"<5.3","symfony\/finder":"<4.4","symfony\/proxy-manager-bridge":"<4.4","symfony\/yaml":"<4.4.26"},"provide":{"psr\/container-implementation":"1.0","symfony\/service-implementation":"1.0|2.0"},"require-dev":{"symfony\/config":"^5.3|^6.0","symfony\/expression-language":"^4.4|^5.0|^6.0","symfony\/yaml":"^4.4.26|^5.0|^6.0"},"suggest":{"symfony\/config":"","symfony\/expression-language":"For using expressions in service container configuration","symfony\/finder":"For using double-star glob patterns or when GLOB_BRACE portability is required","symfony\/proxy-manager-bridge":"Generate service proxies to lazy load them","symfony\/yaml":""},"type":"library","autoload":{"psr-4":{"Symfony\\Component\\DependencyInjection\\":""},"exclude-from-classmap":["\/Tests\/"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Fabien Potencier","email":"fabien@symfony.com"},{"name":"Symfony Community","homepage":"https:\/\/symfony.com\/contributors"}],"description":"Allows you to standardize and centralize the way objects are constructed in your application","homepage":"https:\/\/symfony.com","support":{"source":"https:\/\/github.com\/symfony\/dependency-injection\/tree\/v5.4.6"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2022-03-02T12:42:23+00:00"},{"name":"symfony\/dom-crawler","version":"v5.4.6","source":{"type":"git","url":"https:\/\/github.com\/symfony\/dom-crawler.git","reference":"c0bda97480d96337bd3866026159a8b358665457"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/dom-crawler\/zipball\/c0bda97480d96337bd3866026159a8b358665457","reference":"c0bda97480d96337bd3866026159a8b358665457","shasum":""},"require":{"php":">=7.2.5","symfony\/deprecation-contracts":"^2.1|^3","symfony\/polyfill-ctype":"~1.8","symfony\/polyfill-mbstring":"~1.0","symfony\/polyfill-php80":"^1.16"},"conflict":{"masterminds\/html5":"<2.6"},"require-dev":{"masterminds\/html5":"^2.6","symfony\/css-selector":"^4.4|^5.0|^6.0"},"suggest":{"symfony\/css-selector":""},"type":"library","autoload":{"psr-4":{"Symfony\\Component\\DomCrawler\\":""},"exclude-from-classmap":["\/Tests\/"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Fabien Potencier","email":"fabien@symfony.com"},{"name":"Symfony Community","homepage":"https:\/\/symfony.com\/contributors"}],"description":"Eases DOM navigation for HTML and XML documents","homepage":"https:\/\/symfony.com","support":{"source":"https:\/\/github.com\/symfony\/dom-crawler\/tree\/v5.4.6"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2022-03-02T12:42:23+00:00"},{"name":"symfony\/dotenv","version":"v5.4.5","source":{"type":"git","url":"https:\/\/github.com\/symfony\/dotenv.git","reference":"83a2310904a4f5d4f42526227b5a578ac82232a9"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/dotenv\/zipball\/83a2310904a4f5d4f42526227b5a578ac82232a9","reference":"83a2310904a4f5d4f42526227b5a578ac82232a9","shasum":""},"require":{"php":">=7.2.5","symfony\/deprecation-contracts":"^2.1|^3"},"require-dev":{"symfony\/console":"^4.4|^5.0|^6.0","symfony\/process":"^4.4|^5.0|^6.0"},"type":"library","autoload":{"psr-4":{"Symfony\\Component\\Dotenv\\":""},"exclude-from-classmap":["\/Tests\/"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Fabien Potencier","email":"fabien@symfony.com"},{"name":"Symfony Community","homepage":"https:\/\/symfony.com\/contributors"}],"description":"Registers environment variables from a .env file","homepage":"https:\/\/symfony.com","keywords":["dotenv","env","environment"],"support":{"source":"https:\/\/github.com\/symfony\/dotenv\/tree\/v5.4.5"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2022-02-15T17:04:12+00:00"},{"name":"symfony\/error-handler","version":"v5.4.3","source":{"type":"git","url":"https:\/\/github.com\/symfony\/error-handler.git","reference":"c4ffc2cd919950d13c8c9ce32a70c70214c3ffc5"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/error-handler\/zipball\/c4ffc2cd919950d13c8c9ce32a70c70214c3ffc5","reference":"c4ffc2cd919950d13c8c9ce32a70c70214c3ffc5","shasum":""},"require":{"php":">=7.2.5","psr\/log":"^1|^2|^3","symfony\/var-dumper":"^4.4|^5.0|^6.0"},"require-dev":{"symfony\/deprecation-contracts":"^2.1|^3","symfony\/http-kernel":"^4.4|^5.0|^6.0","symfony\/serializer":"^4.4|^5.0|^6.0"},"bin":["Resources\/bin\/patch-type-declarations"],"type":"library","autoload":{"psr-4":{"Symfony\\Component\\ErrorHandler\\":""},"exclude-from-classmap":["\/Tests\/"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Fabien Potencier","email":"fabien@symfony.com"},{"name":"Symfony Community","homepage":"https:\/\/symfony.com\/contributors"}],"description":"Provides tools to manage errors and ease debugging PHP code","homepage":"https:\/\/symfony.com","support":{"source":"https:\/\/github.com\/symfony\/error-handler\/tree\/v5.4.3"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2022-01-02T09:53:40+00:00"},{"name":"symfony\/event-dispatcher","version":"v5.4.3","source":{"type":"git","url":"https:\/\/github.com\/symfony\/event-dispatcher.git","reference":"dec8a9f58d20df252b9cd89f1c6c1530f747685d"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/event-dispatcher\/zipball\/dec8a9f58d20df252b9cd89f1c6c1530f747685d","reference":"dec8a9f58d20df252b9cd89f1c6c1530f747685d","shasum":""},"require":{"php":">=7.2.5","symfony\/deprecation-contracts":"^2.1|^3","symfony\/event-dispatcher-contracts":"^2|^3","symfony\/polyfill-php80":"^1.16"},"conflict":{"symfony\/dependency-injection":"<4.4"},"provide":{"psr\/event-dispatcher-implementation":"1.0","symfony\/event-dispatcher-implementation":"2.0"},"require-dev":{"psr\/log":"^1|^2|^3","symfony\/config":"^4.4|^5.0|^6.0","symfony\/dependency-injection":"^4.4|^5.0|^6.0","symfony\/error-handler":"^4.4|^5.0|^6.0","symfony\/expression-language":"^4.4|^5.0|^6.0","symfony\/http-foundation":"^4.4|^5.0|^6.0","symfony\/service-contracts":"^1.1|^2|^3","symfony\/stopwatch":"^4.4|^5.0|^6.0"},"suggest":{"symfony\/dependency-injection":"","symfony\/http-kernel":""},"type":"library","autoload":{"psr-4":{"Symfony\\Component\\EventDispatcher\\":""},"exclude-from-classmap":["\/Tests\/"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Fabien Potencier","email":"fabien@symfony.com"},{"name":"Symfony Community","homepage":"https:\/\/symfony.com\/contributors"}],"description":"Provides tools that allow your application components to communicate with each other by dispatching events and listening to them","homepage":"https:\/\/symfony.com","support":{"source":"https:\/\/github.com\/symfony\/event-dispatcher\/tree\/v5.4.3"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2022-01-02T09:53:40+00:00"},{"name":"symfony\/expression-language","version":"v5.4.3","source":{"type":"git","url":"https:\/\/github.com\/symfony\/expression-language.git","reference":"c68c6d1a308f6e2a1382bdb3a317959e1ee9aa08"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/expression-language\/zipball\/c68c6d1a308f6e2a1382bdb3a317959e1ee9aa08","reference":"c68c6d1a308f6e2a1382bdb3a317959e1ee9aa08","shasum":""},"require":{"php":">=7.2.5","symfony\/cache":"^4.4|^5.0|^6.0","symfony\/service-contracts":"^1.1|^2|^3"},"type":"library","autoload":{"psr-4":{"Symfony\\Component\\ExpressionLanguage\\":""},"exclude-from-classmap":["\/Tests\/"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Fabien Potencier","email":"fabien@symfony.com"},{"name":"Symfony Community","homepage":"https:\/\/symfony.com\/contributors"}],"description":"Provides an engine that can compile and evaluate expressions","homepage":"https:\/\/symfony.com","support":{"source":"https:\/\/github.com\/symfony\/expression-language\/tree\/v5.4.3"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2022-01-02T09:53:40+00:00"},{"name":"symfony\/filesystem","version":"v5.4.6","source":{"type":"git","url":"https:\/\/github.com\/symfony\/filesystem.git","reference":"d53a45039974952af7f7ebc461ccdd4295e29440"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/filesystem\/zipball\/d53a45039974952af7f7ebc461ccdd4295e29440","reference":"d53a45039974952af7f7ebc461ccdd4295e29440","shasum":""},"require":{"php":">=7.2.5","symfony\/polyfill-ctype":"~1.8","symfony\/polyfill-mbstring":"~1.8","symfony\/polyfill-php80":"^1.16"},"type":"library","autoload":{"psr-4":{"Symfony\\Component\\Filesystem\\":""},"exclude-from-classmap":["\/Tests\/"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Fabien Potencier","email":"fabien@symfony.com"},{"name":"Symfony Community","homepage":"https:\/\/symfony.com\/contributors"}],"description":"Provides basic utilities for the filesystem","homepage":"https:\/\/symfony.com","support":{"source":"https:\/\/github.com\/symfony\/filesystem\/tree\/v5.4.6"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2022-03-02T12:42:23+00:00"},{"name":"symfony\/finder","version":"v5.4.3","source":{"type":"git","url":"https:\/\/github.com\/symfony\/finder.git","reference":"231313534dded84c7ecaa79d14bc5da4ccb69b7d"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/finder\/zipball\/231313534dded84c7ecaa79d14bc5da4ccb69b7d","reference":"231313534dded84c7ecaa79d14bc5da4ccb69b7d","shasum":""},"require":{"php":">=7.2.5","symfony\/deprecation-contracts":"^2.1|^3","symfony\/polyfill-php80":"^1.16"},"type":"library","autoload":{"psr-4":{"Symfony\\Component\\Finder\\":""},"exclude-from-classmap":["\/Tests\/"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Fabien Potencier","email":"fabien@symfony.com"},{"name":"Symfony Community","homepage":"https:\/\/symfony.com\/contributors"}],"description":"Finds files and directories via an intuitive fluent interface","homepage":"https:\/\/symfony.com","support":{"source":"https:\/\/github.com\/symfony\/finder\/tree\/v5.4.3"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2022-01-26T16:34:36+00:00"},{"name":"symfony\/flex","version":"v1.18.5","source":{"type":"git","url":"https:\/\/github.com\/symfony\/flex.git","reference":"10e438f53a972439675dc720706f0cd5c0ed94f1"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/flex\/zipball\/10e438f53a972439675dc720706f0cd5c0ed94f1","reference":"10e438f53a972439675dc720706f0cd5c0ed94f1","shasum":""},"require":{"composer-plugin-api":"^1.0|^2.0","php":">=7.1"},"require-dev":{"composer\/composer":"^1.0.2|^2.0","symfony\/dotenv":"^4.4|^5.0|^6.0","symfony\/filesystem":"^4.4|^5.0|^6.0","symfony\/phpunit-bridge":"^4.4.12|^5.0|^6.0","symfony\/process":"^4.4|^5.0|^6.0"},"type":"composer-plugin","extra":{"class":"Symfony\\Flex\\Flex"},"autoload":{"psr-4":{"Symfony\\Flex\\":"src"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Fabien Potencier","email":"fabien.potencier@gmail.com"}],"description":"Composer plugin for Symfony","support":{"issues":"https:\/\/github.com\/symfony\/flex\/issues","source":"https:\/\/github.com\/symfony\/flex\/tree\/v1.18.5"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2022-02-16T17:26:46+00:00"},{"name":"symfony\/framework-bundle","version":"v5.4.6","source":{"type":"git","url":"https:\/\/github.com\/symfony\/framework-bundle.git","reference":"76ea755f30924924ea37a28e098df61679efcb63"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/framework-bundle\/zipball\/76ea755f30924924ea37a28e098df61679efcb63","reference":"76ea755f30924924ea37a28e098df61679efcb63","shasum":""},"require":{"ext-xml":"*","php":">=7.2.5","symfony\/cache":"^5.2|^6.0","symfony\/config":"^5.3|^6.0","symfony\/dependency-injection":"^5.4.5|^6.0.5","symfony\/deprecation-contracts":"^2.1|^3","symfony\/error-handler":"^4.4.1|^5.0.1|^6.0","symfony\/event-dispatcher":"^5.1|^6.0","symfony\/filesystem":"^4.4|^5.0|^6.0","symfony\/finder":"^4.4|^5.0|^6.0","symfony\/http-foundation":"^5.3|^6.0","symfony\/http-kernel":"^5.4|^6.0","symfony\/polyfill-mbstring":"~1.0","symfony\/polyfill-php80":"^1.16","symfony\/polyfill-php81":"^1.22","symfony\/routing":"^5.3|^6.0"},"conflict":{"doctrine\/annotations":"<1.13.1","doctrine\/cache":"<1.11","doctrine\/persistence":"<1.3","phpdocumentor\/reflection-docblock":"<3.2.2","phpdocumentor\/type-resolver":"<1.4.0","phpunit\/phpunit":"<5.4.3","symfony\/asset":"<5.3","symfony\/console":"<5.2.5","symfony\/dom-crawler":"<4.4","symfony\/dotenv":"<5.1","symfony\/form":"<5.2","symfony\/http-client":"<4.4","symfony\/lock":"<4.4","symfony\/mailer":"<5.2","symfony\/messenger":"<5.4","symfony\/mime":"<4.4","symfony\/property-access":"<5.3","symfony\/property-info":"<4.4","symfony\/security-csrf":"<5.3","symfony\/serializer":"<5.2","symfony\/service-contracts":">=3.0","symfony\/stopwatch":"<4.4","symfony\/translation":"<5.3","symfony\/twig-bridge":"<4.4","symfony\/twig-bundle":"<4.4","symfony\/validator":"<5.2","symfony\/web-profiler-bundle":"<4.4","symfony\/workflow":"<5.2"},"require-dev":{"doctrine\/annotations":"^1.13.1","doctrine\/cache":"^1.11|^2.0","doctrine\/persistence":"^1.3|^2.0","phpdocumentor\/reflection-docblock":"^3.0|^4.0|^5.0","symfony\/asset":"^5.3|^6.0","symfony\/browser-kit":"^5.4|^6.0","symfony\/console":"^5.4|^6.0","symfony\/css-selector":"^4.4|^5.0|^6.0","symfony\/dom-crawler":"^4.4.30|^5.3.7|^6.0","symfony\/dotenv":"^5.1|^6.0","symfony\/expression-language":"^4.4|^5.0|^6.0","symfony\/form":"^5.2|^6.0","symfony\/http-client":"^4.4|^5.0|^6.0","symfony\/lock":"^4.4|^5.0|^6.0","symfony\/mailer":"^5.2|^6.0","symfony\/messenger":"^5.4|^6.0","symfony\/mime":"^4.4|^5.0|^6.0","symfony\/notifier":"^5.4|^6.0","symfony\/phpunit-bridge":"^5.3|^6.0","symfony\/polyfill-intl-icu":"~1.0","symfony\/process":"^4.4|^5.0|^6.0","symfony\/property-info":"^4.4|^5.0|^6.0","symfony\/rate-limiter":"^5.2|^6.0","symfony\/security-bundle":"^5.4|^6.0","symfony\/serializer":"^5.4|^6.0","symfony\/stopwatch":"^4.4|^5.0|^6.0","symfony\/string":"^5.0|^6.0","symfony\/translation":"^5.3|^6.0","symfony\/twig-bundle":"^4.4|^5.0|^6.0","symfony\/validator":"^5.2|^6.0","symfony\/web-link":"^4.4|^5.0|^6.0","symfony\/workflow":"^5.2|^6.0","symfony\/yaml":"^4.4|^5.0|^6.0","twig\/twig":"^2.10|^3.0"},"suggest":{"ext-apcu":"For best performance of the system caches","symfony\/console":"For using the console commands","symfony\/form":"For using forms","symfony\/property-info":"For using the property_info service","symfony\/serializer":"For using the serializer service","symfony\/validator":"For using validation","symfony\/web-link":"For using web links, features such as preloading, prefetching or prerendering","symfony\/yaml":"For using the debug:config and lint:yaml commands"},"type":"symfony-bundle","autoload":{"psr-4":{"Symfony\\Bundle\\FrameworkBundle\\":""},"exclude-from-classmap":["\/Tests\/"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Fabien Potencier","email":"fabien@symfony.com"},{"name":"Symfony Community","homepage":"https:\/\/symfony.com\/contributors"}],"description":"Provides a tight integration between Symfony components and the Symfony full-stack framework","homepage":"https:\/\/symfony.com","support":{"source":"https:\/\/github.com\/symfony\/framework-bundle\/tree\/v5.4.6"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2022-03-04T14:13:35+00:00"},{"name":"symfony\/http-foundation","version":"v5.4.6","source":{"type":"git","url":"https:\/\/github.com\/symfony\/http-foundation.git","reference":"34e89bc147633c0f9dd6caaaf56da3b806a21465"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/http-foundation\/zipball\/34e89bc147633c0f9dd6caaaf56da3b806a21465","reference":"34e89bc147633c0f9dd6caaaf56da3b806a21465","shasum":""},"require":{"php":">=7.2.5","symfony\/deprecation-contracts":"^2.1|^3","symfony\/polyfill-mbstring":"~1.1","symfony\/polyfill-php80":"^1.16"},"require-dev":{"predis\/predis":"~1.0","symfony\/cache":"^4.4|^5.0|^6.0","symfony\/expression-language":"^4.4|^5.0|^6.0","symfony\/mime":"^4.4|^5.0|^6.0"},"suggest":{"symfony\/mime":"To use the file extension guesser"},"type":"library","autoload":{"psr-4":{"Symfony\\Component\\HttpFoundation\\":""},"exclude-from-classmap":["\/Tests\/"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Fabien Potencier","email":"fabien@symfony.com"},{"name":"Symfony Community","homepage":"https:\/\/symfony.com\/contributors"}],"description":"Defines an object-oriented layer for the HTTP specification","homepage":"https:\/\/symfony.com","support":{"source":"https:\/\/github.com\/symfony\/http-foundation\/tree\/v5.4.6"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2022-03-05T21:03:43+00:00"},{"name":"symfony\/http-kernel","version":"v5.4.6","source":{"type":"git","url":"https:\/\/github.com\/symfony\/http-kernel.git","reference":"d41f29ae9af1b5f40c7ebcddf09082953229411d"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/http-kernel\/zipball\/d41f29ae9af1b5f40c7ebcddf09082953229411d","reference":"d41f29ae9af1b5f40c7ebcddf09082953229411d","shasum":""},"require":{"php":">=7.2.5","psr\/log":"^1|^2","symfony\/deprecation-contracts":"^2.1|^3","symfony\/error-handler":"^4.4|^5.0|^6.0","symfony\/event-dispatcher":"^5.0|^6.0","symfony\/http-foundation":"^5.3.7|^6.0","symfony\/polyfill-ctype":"^1.8","symfony\/polyfill-php73":"^1.9","symfony\/polyfill-php80":"^1.16"},"conflict":{"symfony\/browser-kit":"<5.4","symfony\/cache":"<5.0","symfony\/config":"<5.0","symfony\/console":"<4.4","symfony\/dependency-injection":"<5.3","symfony\/doctrine-bridge":"<5.0","symfony\/form":"<5.0","symfony\/http-client":"<5.0","symfony\/mailer":"<5.0","symfony\/messenger":"<5.0","symfony\/translation":"<5.0","symfony\/twig-bridge":"<5.0","symfony\/validator":"<5.0","twig\/twig":"<2.13"},"provide":{"psr\/log-implementation":"1.0|2.0"},"require-dev":{"psr\/cache":"^1.0|^2.0|^3.0","symfony\/browser-kit":"^5.4|^6.0","symfony\/config":"^5.0|^6.0","symfony\/console":"^4.4|^5.0|^6.0","symfony\/css-selector":"^4.4|^5.0|^6.0","symfony\/dependency-injection":"^5.3|^6.0","symfony\/dom-crawler":"^4.4|^5.0|^6.0","symfony\/expression-language":"^4.4|^5.0|^6.0","symfony\/finder":"^4.4|^5.0|^6.0","symfony\/http-client-contracts":"^1.1|^2|^3","symfony\/process":"^4.4|^5.0|^6.0","symfony\/routing":"^4.4|^5.0|^6.0","symfony\/stopwatch":"^4.4|^5.0|^6.0","symfony\/translation":"^4.4|^5.0|^6.0","symfony\/translation-contracts":"^1.1|^2|^3","twig\/twig":"^2.13|^3.0.4"},"suggest":{"symfony\/browser-kit":"","symfony\/config":"","symfony\/console":"","symfony\/dependency-injection":""},"type":"library","autoload":{"psr-4":{"Symfony\\Component\\HttpKernel\\":""},"exclude-from-classmap":["\/Tests\/"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Fabien Potencier","email":"fabien@symfony.com"},{"name":"Symfony Community","homepage":"https:\/\/symfony.com\/contributors"}],"description":"Provides a structured process for converting a Request into a Response","homepage":"https:\/\/symfony.com","support":{"source":"https:\/\/github.com\/symfony\/http-kernel\/tree\/v5.4.6"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2022-03-05T21:14:51+00:00"},{"name":"symfony\/monolog-bridge","version":"v5.4.0","source":{"type":"git","url":"https:\/\/github.com\/symfony\/monolog-bridge.git","reference":"6ce6f39536a718ec2ece37eae81c6899030fc571"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/monolog-bridge\/zipball\/6ce6f39536a718ec2ece37eae81c6899030fc571","reference":"6ce6f39536a718ec2ece37eae81c6899030fc571","shasum":""},"require":{"monolog\/monolog":"^1.25.1|^2","php":">=7.2.5","symfony\/deprecation-contracts":"^2.1|^3","symfony\/http-kernel":"^5.3|^6.0","symfony\/polyfill-php80":"^1.16","symfony\/service-contracts":"^1.1|^2|^3"},"conflict":{"symfony\/console":"<4.4","symfony\/http-foundation":"<5.3"},"require-dev":{"symfony\/console":"^4.4|^5.0|^6.0","symfony\/http-client":"^4.4|^5.0|^6.0","symfony\/mailer":"^4.4|^5.0|^6.0","symfony\/messenger":"^4.4|^5.0|^6.0","symfony\/mime":"^4.4|^5.0|^6.0","symfony\/security-core":"^4.4|^5.0|^6.0","symfony\/var-dumper":"^4.4|^5.0|^6.0"},"suggest":{"symfony\/console":"For the possibility to show log messages in console commands depending on verbosity settings.","symfony\/http-kernel":"For using the debugging handlers together with the response life cycle of the HTTP kernel.","symfony\/var-dumper":"For using the debugging handlers like the console handler or the log server handler."},"type":"symfony-bridge","autoload":{"psr-4":{"Symfony\\Bridge\\Monolog\\":""},"exclude-from-classmap":["\/Tests\/"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Fabien Potencier","email":"fabien@symfony.com"},{"name":"Symfony Community","homepage":"https:\/\/symfony.com\/contributors"}],"description":"Provides integration for Monolog with various Symfony components","homepage":"https:\/\/symfony.com","support":{"source":"https:\/\/github.com\/symfony\/monolog-bridge\/tree\/v5.4.0"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2021-11-23T10:19:22+00:00"},{"name":"symfony\/monolog-bundle","version":"v3.7.1","source":{"type":"git","url":"https:\/\/github.com\/symfony\/monolog-bundle.git","reference":"fde12fc628162787a4e53877abadc30047fd868b"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/monolog-bundle\/zipball\/fde12fc628162787a4e53877abadc30047fd868b","reference":"fde12fc628162787a4e53877abadc30047fd868b","shasum":""},"require":{"monolog\/monolog":"~1.22 || ~2.0","php":">=7.1.3","symfony\/config":"~4.4 || ^5.0 || ^6.0","symfony\/dependency-injection":"^4.4 || ^5.0 || ^6.0","symfony\/http-kernel":"~4.4 || ^5.0 || ^6.0","symfony\/monolog-bridge":"~4.4 || ^5.0 || ^6.0"},"require-dev":{"symfony\/console":"~4.4 || ^5.0 || ^6.0","symfony\/phpunit-bridge":"^5.2 || ^6.0","symfony\/yaml":"~4.4 || ^5.0 || ^6.0"},"type":"symfony-bundle","extra":{"branch-alias":{"dev-master":"3.x-dev"}},"autoload":{"psr-4":{"Symfony\\Bundle\\MonologBundle\\":""},"exclude-from-classmap":["\/Tests\/"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Fabien Potencier","email":"fabien@symfony.com"},{"name":"Symfony Community","homepage":"https:\/\/symfony.com\/contributors"}],"description":"Symfony MonologBundle","homepage":"https:\/\/symfony.com","keywords":["log","logging"],"support":{"issues":"https:\/\/github.com\/symfony\/monolog-bundle\/issues","source":"https:\/\/github.com\/symfony\/monolog-bundle\/tree\/v3.7.1"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2021-11-05T10:34:29+00:00"},{"name":"symfony\/polyfill-ctype","version":"v1.25.0","source":{"type":"git","url":"https:\/\/github.com\/symfony\/polyfill-ctype.git","reference":"30885182c981ab175d4d034db0f6f469898070ab"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/polyfill-ctype\/zipball\/30885182c981ab175d4d034db0f6f469898070ab","reference":"30885182c981ab175d4d034db0f6f469898070ab","shasum":""},"require":{"php":">=7.1"},"provide":{"ext-ctype":"*"},"suggest":{"ext-ctype":"For best performance"},"type":"library","extra":{"branch-alias":{"dev-main":"1.23-dev"},"thanks":{"name":"symfony\/polyfill","url":"https:\/\/github.com\/symfony\/polyfill"}},"autoload":{"files":["bootstrap.php"],"psr-4":{"Symfony\\Polyfill\\Ctype\\":""}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Gert de Pagter","email":"BackEndTea@gmail.com"},{"name":"Symfony Community","homepage":"https:\/\/symfony.com\/contributors"}],"description":"Symfony polyfill for ctype functions","homepage":"https:\/\/symfony.com","keywords":["compatibility","ctype","polyfill","portable"],"support":{"source":"https:\/\/github.com\/symfony\/polyfill-ctype\/tree\/v1.25.0"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2021-10-20T20:35:02+00:00"},{"name":"symfony\/polyfill-intl-grapheme","version":"v1.25.0","source":{"type":"git","url":"https:\/\/github.com\/symfony\/polyfill-intl-grapheme.git","reference":"81b86b50cf841a64252b439e738e97f4a34e2783"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/polyfill-intl-grapheme\/zipball\/81b86b50cf841a64252b439e738e97f4a34e2783","reference":"81b86b50cf841a64252b439e738e97f4a34e2783","shasum":""},"require":{"php":">=7.1"},"suggest":{"ext-intl":"For best performance"},"type":"library","extra":{"branch-alias":{"dev-main":"1.23-dev"},"thanks":{"name":"symfony\/polyfill","url":"https:\/\/github.com\/symfony\/polyfill"}},"autoload":{"files":["bootstrap.php"],"psr-4":{"Symfony\\Polyfill\\Intl\\Grapheme\\":""}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Nicolas Grekas","email":"p@tchwork.com"},{"name":"Symfony Community","homepage":"https:\/\/symfony.com\/contributors"}],"description":"Symfony polyfill for intl's grapheme_* functions","homepage":"https:\/\/symfony.com","keywords":["compatibility","grapheme","intl","polyfill","portable","shim"],"support":{"source":"https:\/\/github.com\/symfony\/polyfill-intl-grapheme\/tree\/v1.25.0"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2021-11-23T21:10:46+00:00"},{"name":"symfony\/polyfill-intl-idn","version":"v1.25.0","source":{"type":"git","url":"https:\/\/github.com\/symfony\/polyfill-intl-idn.git","reference":"749045c69efb97c70d25d7463abba812e91f3a44"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/polyfill-intl-idn\/zipball\/749045c69efb97c70d25d7463abba812e91f3a44","reference":"749045c69efb97c70d25d7463abba812e91f3a44","shasum":""},"require":{"php":">=7.1","symfony\/polyfill-intl-normalizer":"^1.10","symfony\/polyfill-php72":"^1.10"},"suggest":{"ext-intl":"For best performance"},"type":"library","extra":{"branch-alias":{"dev-main":"1.23-dev"},"thanks":{"name":"symfony\/polyfill","url":"https:\/\/github.com\/symfony\/polyfill"}},"autoload":{"files":["bootstrap.php"],"psr-4":{"Symfony\\Polyfill\\Intl\\Idn\\":""}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Laurent Bassin","email":"laurent@bassin.info"},{"name":"Trevor Rowbotham","email":"trevor.rowbotham@pm.me"},{"name":"Symfony Community","homepage":"https:\/\/symfony.com\/contributors"}],"description":"Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions","homepage":"https:\/\/symfony.com","keywords":["compatibility","idn","intl","polyfill","portable","shim"],"support":{"source":"https:\/\/github.com\/symfony\/polyfill-intl-idn\/tree\/v1.25.0"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2021-09-14T14:02:44+00:00"},{"name":"symfony\/polyfill-intl-normalizer","version":"v1.25.0","source":{"type":"git","url":"https:\/\/github.com\/symfony\/polyfill-intl-normalizer.git","reference":"8590a5f561694770bdcd3f9b5c69dde6945028e8"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/polyfill-intl-normalizer\/zipball\/8590a5f561694770bdcd3f9b5c69dde6945028e8","reference":"8590a5f561694770bdcd3f9b5c69dde6945028e8","shasum":""},"require":{"php":">=7.1"},"suggest":{"ext-intl":"For best performance"},"type":"library","extra":{"branch-alias":{"dev-main":"1.23-dev"},"thanks":{"name":"symfony\/polyfill","url":"https:\/\/github.com\/symfony\/polyfill"}},"autoload":{"files":["bootstrap.php"],"psr-4":{"Symfony\\Polyfill\\Intl\\Normalizer\\":""},"classmap":["Resources\/stubs"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Nicolas Grekas","email":"p@tchwork.com"},{"name":"Symfony Community","homepage":"https:\/\/symfony.com\/contributors"}],"description":"Symfony polyfill for intl's Normalizer class and related functions","homepage":"https:\/\/symfony.com","keywords":["compatibility","intl","normalizer","polyfill","portable","shim"],"support":{"source":"https:\/\/github.com\/symfony\/polyfill-intl-normalizer\/tree\/v1.25.0"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2021-02-19T12:13:01+00:00"},{"name":"symfony\/polyfill-mbstring","version":"v1.25.0","source":{"type":"git","url":"https:\/\/github.com\/symfony\/polyfill-mbstring.git","reference":"0abb51d2f102e00a4eefcf46ba7fec406d245825"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/polyfill-mbstring\/zipball\/0abb51d2f102e00a4eefcf46ba7fec406d245825","reference":"0abb51d2f102e00a4eefcf46ba7fec406d245825","shasum":""},"require":{"php":">=7.1"},"provide":{"ext-mbstring":"*"},"suggest":{"ext-mbstring":"For best performance"},"type":"library","extra":{"branch-alias":{"dev-main":"1.23-dev"},"thanks":{"name":"symfony\/polyfill","url":"https:\/\/github.com\/symfony\/polyfill"}},"autoload":{"files":["bootstrap.php"],"psr-4":{"Symfony\\Polyfill\\Mbstring\\":""}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Nicolas Grekas","email":"p@tchwork.com"},{"name":"Symfony Community","homepage":"https:\/\/symfony.com\/contributors"}],"description":"Symfony polyfill for the Mbstring extension","homepage":"https:\/\/symfony.com","keywords":["compatibility","mbstring","polyfill","portable","shim"],"support":{"source":"https:\/\/github.com\/symfony\/polyfill-mbstring\/tree\/v1.25.0"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2021-11-30T18:21:41+00:00"},{"name":"symfony\/polyfill-php73","version":"v1.25.0","source":{"type":"git","url":"https:\/\/github.com\/symfony\/polyfill-php73.git","reference":"cc5db0e22b3cb4111010e48785a97f670b350ca5"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/polyfill-php73\/zipball\/cc5db0e22b3cb4111010e48785a97f670b350ca5","reference":"cc5db0e22b3cb4111010e48785a97f670b350ca5","shasum":""},"require":{"php":">=7.1"},"type":"library","extra":{"branch-alias":{"dev-main":"1.23-dev"},"thanks":{"name":"symfony\/polyfill","url":"https:\/\/github.com\/symfony\/polyfill"}},"autoload":{"files":["bootstrap.php"],"psr-4":{"Symfony\\Polyfill\\Php73\\":""},"classmap":["Resources\/stubs"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Nicolas Grekas","email":"p@tchwork.com"},{"name":"Symfony Community","homepage":"https:\/\/symfony.com\/contributors"}],"description":"Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions","homepage":"https:\/\/symfony.com","keywords":["compatibility","polyfill","portable","shim"],"support":{"source":"https:\/\/github.com\/symfony\/polyfill-php73\/tree\/v1.25.0"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2021-06-05T21:20:04+00:00"},{"name":"symfony\/polyfill-php80","version":"v1.25.0","source":{"type":"git","url":"https:\/\/github.com\/symfony\/polyfill-php80.git","reference":"4407588e0d3f1f52efb65fbe92babe41f37fe50c"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/polyfill-php80\/zipball\/4407588e0d3f1f52efb65fbe92babe41f37fe50c","reference":"4407588e0d3f1f52efb65fbe92babe41f37fe50c","shasum":""},"require":{"php":">=7.1"},"type":"library","extra":{"branch-alias":{"dev-main":"1.23-dev"},"thanks":{"name":"symfony\/polyfill","url":"https:\/\/github.com\/symfony\/polyfill"}},"autoload":{"files":["bootstrap.php"],"psr-4":{"Symfony\\Polyfill\\Php80\\":""},"classmap":["Resources\/stubs"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Ion Bazan","email":"ion.bazan@gmail.com"},{"name":"Nicolas Grekas","email":"p@tchwork.com"},{"name":"Symfony Community","homepage":"https:\/\/symfony.com\/contributors"}],"description":"Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions","homepage":"https:\/\/symfony.com","keywords":["compatibility","polyfill","portable","shim"],"support":{"source":"https:\/\/github.com\/symfony\/polyfill-php80\/tree\/v1.25.0"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2022-03-04T08:16:47+00:00"},{"name":"symfony\/polyfill-php81","version":"v1.25.0","source":{"type":"git","url":"https:\/\/github.com\/symfony\/polyfill-php81.git","reference":"5de4ba2d41b15f9bd0e19b2ab9674135813ec98f"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/polyfill-php81\/zipball\/5de4ba2d41b15f9bd0e19b2ab9674135813ec98f","reference":"5de4ba2d41b15f9bd0e19b2ab9674135813ec98f","shasum":""},"require":{"php":">=7.1"},"type":"library","extra":{"branch-alias":{"dev-main":"1.23-dev"},"thanks":{"name":"symfony\/polyfill","url":"https:\/\/github.com\/symfony\/polyfill"}},"autoload":{"files":["bootstrap.php"],"psr-4":{"Symfony\\Polyfill\\Php81\\":""},"classmap":["Resources\/stubs"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Nicolas Grekas","email":"p@tchwork.com"},{"name":"Symfony Community","homepage":"https:\/\/symfony.com\/contributors"}],"description":"Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions","homepage":"https:\/\/symfony.com","keywords":["compatibility","polyfill","portable","shim"],"support":{"source":"https:\/\/github.com\/symfony\/polyfill-php81\/tree\/v1.25.0"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2021-09-13T13:58:11+00:00"},{"name":"symfony\/process","version":"v5.4.2","source":{"type":"git","url":"https:\/\/github.com\/symfony\/process.git","reference":"2b3ba8722c4aaf3e88011be5e7f48710088fb5e4"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/process\/zipball\/2b3ba8722c4aaf3e88011be5e7f48710088fb5e4","reference":"2b3ba8722c4aaf3e88011be5e7f48710088fb5e4","shasum":""},"require":{"php":">=7.2.5","symfony\/polyfill-php80":"^1.16"},"type":"library","autoload":{"psr-4":{"Symfony\\Component\\Process\\":""},"exclude-from-classmap":["\/Tests\/"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Fabien Potencier","email":"fabien@symfony.com"},{"name":"Symfony Community","homepage":"https:\/\/symfony.com\/contributors"}],"description":"Executes commands in sub-processes","homepage":"https:\/\/symfony.com","support":{"source":"https:\/\/github.com\/symfony\/process\/tree\/v5.4.2"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2021-12-27T21:01:00+00:00"},{"name":"symfony\/routing","version":"v5.4.3","source":{"type":"git","url":"https:\/\/github.com\/symfony\/routing.git","reference":"44b29c7a94e867ccde1da604792f11a469958981"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/routing\/zipball\/44b29c7a94e867ccde1da604792f11a469958981","reference":"44b29c7a94e867ccde1da604792f11a469958981","shasum":""},"require":{"php":">=7.2.5","symfony\/deprecation-contracts":"^2.1|^3","symfony\/polyfill-php80":"^1.16"},"conflict":{"doctrine\/annotations":"<1.12","symfony\/config":"<5.3","symfony\/dependency-injection":"<4.4","symfony\/yaml":"<4.4"},"require-dev":{"doctrine\/annotations":"^1.12","psr\/log":"^1|^2|^3","symfony\/config":"^5.3|^6.0","symfony\/dependency-injection":"^4.4|^5.0|^6.0","symfony\/expression-language":"^4.4|^5.0|^6.0","symfony\/http-foundation":"^4.4|^5.0|^6.0","symfony\/yaml":"^4.4|^5.0|^6.0"},"suggest":{"symfony\/config":"For using the all-in-one router or any loader","symfony\/expression-language":"For using expression matching","symfony\/http-foundation":"For using a Symfony Request object","symfony\/yaml":"For using the YAML loader"},"type":"library","autoload":{"psr-4":{"Symfony\\Component\\Routing\\":""},"exclude-from-classmap":["\/Tests\/"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Fabien Potencier","email":"fabien@symfony.com"},{"name":"Symfony Community","homepage":"https:\/\/symfony.com\/contributors"}],"description":"Maps an HTTP request to a set of configuration variables","homepage":"https:\/\/symfony.com","keywords":["router","routing","uri","url"],"support":{"source":"https:\/\/github.com\/symfony\/routing\/tree\/v5.4.3"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2022-01-02T09:53:40+00:00"},{"name":"symfony\/stopwatch","version":"v5.4.5","source":{"type":"git","url":"https:\/\/github.com\/symfony\/stopwatch.git","reference":"4d04b5c24f3c9a1a168a131f6cbe297155bc0d30"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/stopwatch\/zipball\/4d04b5c24f3c9a1a168a131f6cbe297155bc0d30","reference":"4d04b5c24f3c9a1a168a131f6cbe297155bc0d30","shasum":""},"require":{"php":">=7.2.5","symfony\/service-contracts":"^1|^2|^3"},"type":"library","autoload":{"psr-4":{"Symfony\\Component\\Stopwatch\\":""},"exclude-from-classmap":["\/Tests\/"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Fabien Potencier","email":"fabien@symfony.com"},{"name":"Symfony Community","homepage":"https:\/\/symfony.com\/contributors"}],"description":"Provides a way to profile code","homepage":"https:\/\/symfony.com","support":{"source":"https:\/\/github.com\/symfony\/stopwatch\/tree\/v5.4.5"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2022-02-18T16:06:09+00:00"},{"name":"symfony\/string","version":"v5.4.3","source":{"type":"git","url":"https:\/\/github.com\/symfony\/string.git","reference":"92043b7d8383e48104e411bc9434b260dbeb5a10"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/string\/zipball\/92043b7d8383e48104e411bc9434b260dbeb5a10","reference":"92043b7d8383e48104e411bc9434b260dbeb5a10","shasum":""},"require":{"php":">=7.2.5","symfony\/polyfill-ctype":"~1.8","symfony\/polyfill-intl-grapheme":"~1.0","symfony\/polyfill-intl-normalizer":"~1.0","symfony\/polyfill-mbstring":"~1.0","symfony\/polyfill-php80":"~1.15"},"conflict":{"symfony\/translation-contracts":">=3.0"},"require-dev":{"symfony\/error-handler":"^4.4|^5.0|^6.0","symfony\/http-client":"^4.4|^5.0|^6.0","symfony\/translation-contracts":"^1.1|^2","symfony\/var-exporter":"^4.4|^5.0|^6.0"},"type":"library","autoload":{"files":["Resources\/functions.php"],"psr-4":{"Symfony\\Component\\String\\":""},"exclude-from-classmap":["\/Tests\/"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Nicolas Grekas","email":"p@tchwork.com"},{"name":"Symfony Community","homepage":"https:\/\/symfony.com\/contributors"}],"description":"Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way","homepage":"https:\/\/symfony.com","keywords":["grapheme","i18n","string","unicode","utf-8","utf8"],"support":{"source":"https:\/\/github.com\/symfony\/string\/tree\/v5.4.3"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2022-01-02T09:53:40+00:00"},{"name":"symfony\/var-dumper","version":"v5.4.6","source":{"type":"git","url":"https:\/\/github.com\/symfony\/var-dumper.git","reference":"294e9da6e2e0dd404e983daa5aa74253d92c05d0"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/var-dumper\/zipball\/294e9da6e2e0dd404e983daa5aa74253d92c05d0","reference":"294e9da6e2e0dd404e983daa5aa74253d92c05d0","shasum":""},"require":{"php":">=7.2.5","symfony\/polyfill-mbstring":"~1.0","symfony\/polyfill-php80":"^1.16"},"conflict":{"phpunit\/phpunit":"<5.4.3","symfony\/console":"<4.4"},"require-dev":{"ext-iconv":"*","symfony\/console":"^4.4|^5.0|^6.0","symfony\/process":"^4.4|^5.0|^6.0","symfony\/uid":"^5.1|^6.0","twig\/twig":"^2.13|^3.0.4"},"suggest":{"ext-iconv":"To convert non-UTF-8 strings to UTF-8 (or symfony\/polyfill-iconv in case ext-iconv cannot be used).","ext-intl":"To show region name in time zone dump","symfony\/console":"To use the ServerDumpCommand and\/or the bin\/var-dump-server script"},"bin":["Resources\/bin\/var-dump-server"],"type":"library","autoload":{"files":["Resources\/functions\/dump.php"],"psr-4":{"Symfony\\Component\\VarDumper\\":""},"exclude-from-classmap":["\/Tests\/"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Nicolas Grekas","email":"p@tchwork.com"},{"name":"Symfony Community","homepage":"https:\/\/symfony.com\/contributors"}],"description":"Provides mechanisms for walking through any arbitrary PHP variable","homepage":"https:\/\/symfony.com","keywords":["debug","dump"],"support":{"source":"https:\/\/github.com\/symfony\/var-dumper\/tree\/v5.4.6"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2022-03-02T12:42:23+00:00"},{"name":"symfony\/var-exporter","version":"v5.4.6","source":{"type":"git","url":"https:\/\/github.com\/symfony\/var-exporter.git","reference":"49e2355fe6f59ea30c18ebb68edf13b7e20582e5"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/var-exporter\/zipball\/49e2355fe6f59ea30c18ebb68edf13b7e20582e5","reference":"49e2355fe6f59ea30c18ebb68edf13b7e20582e5","shasum":""},"require":{"php":">=7.2.5","symfony\/polyfill-php80":"^1.16"},"require-dev":{"symfony\/var-dumper":"^4.4.9|^5.0.9|^6.0"},"type":"library","autoload":{"psr-4":{"Symfony\\Component\\VarExporter\\":""},"exclude-from-classmap":["\/Tests\/"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Nicolas Grekas","email":"p@tchwork.com"},{"name":"Symfony Community","homepage":"https:\/\/symfony.com\/contributors"}],"description":"Allows exporting any serializable PHP data structure to plain PHP code","homepage":"https:\/\/symfony.com","keywords":["clone","construct","export","hydrate","instantiate","serialize"],"support":{"source":"https:\/\/github.com\/symfony\/var-exporter\/tree\/v5.4.6"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2022-03-02T12:42:23+00:00"},{"name":"symfony\/yaml","version":"v5.4.3","source":{"type":"git","url":"https:\/\/github.com\/symfony\/yaml.git","reference":"e80f87d2c9495966768310fc531b487ce64237a2"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/symfony\/yaml\/zipball\/e80f87d2c9495966768310fc531b487ce64237a2","reference":"e80f87d2c9495966768310fc531b487ce64237a2","shasum":""},"require":{"php":">=7.2.5","symfony\/deprecation-contracts":"^2.1|^3","symfony\/polyfill-ctype":"^1.8"},"conflict":{"symfony\/console":"<5.3"},"require-dev":{"symfony\/console":"^5.3|^6.0"},"suggest":{"symfony\/console":"For validating YAML files using the lint command"},"bin":["Resources\/bin\/yaml-lint"],"type":"library","autoload":{"psr-4":{"Symfony\\Component\\Yaml\\":""},"exclude-from-classmap":["\/Tests\/"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Fabien Potencier","email":"fabien@symfony.com"},{"name":"Symfony Community","homepage":"https:\/\/symfony.com\/contributors"}],"description":"Loads and dumps YAML files","homepage":"https:\/\/symfony.com","support":{"source":"https:\/\/github.com\/symfony\/yaml\/tree\/v5.4.3"},"funding":[{"url":"https:\/\/symfony.com\/sponsor","type":"custom"},{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/symfony\/symfony","type":"tidelift"}],"time":"2022-01-26T16:32:32+00:00"},{"name":"twig\/twig","version":"v2.14.11","source":{"type":"git","url":"https:\/\/github.com\/twigphp\/Twig.git","reference":"66baa66f29ee30e487e05f1679903e36eb01d727"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/twigphp\/Twig\/zipball\/66baa66f29ee30e487e05f1679903e36eb01d727","reference":"66baa66f29ee30e487e05f1679903e36eb01d727","shasum":""},"require":{"php":">=7.1.3","symfony\/polyfill-ctype":"^1.8","symfony\/polyfill-mbstring":"^1.3","symfony\/polyfill-php72":"^1.8"},"require-dev":{"psr\/container":"^1.0","symfony\/phpunit-bridge":"^4.4.9|^5.0.9|^6.0"},"type":"library","extra":{"branch-alias":{"dev-master":"2.14-dev"}},"autoload":{"psr-0":{"Twig_":"lib\/"},"psr-4":{"Twig\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["BSD-3-Clause"],"authors":[{"name":"Fabien Potencier","email":"fabien@symfony.com","homepage":"http:\/\/fabien.potencier.org","role":"Lead Developer"},{"name":"Twig Team","role":"Contributors"},{"name":"Armin Ronacher","email":"armin.ronacher@active-4.com","role":"Project Founder"}],"description":"Twig, the flexible, fast, and secure template language for PHP","homepage":"https:\/\/twig.symfony.com","keywords":["templating"],"support":{"issues":"https:\/\/github.com\/twigphp\/Twig\/issues","source":"https:\/\/github.com\/twigphp\/Twig\/tree\/v2.14.11"},"funding":[{"url":"https:\/\/github.com\/fabpot","type":"github"},{"url":"https:\/\/tidelift.com\/funding\/github\/packagist\/twig\/twig","type":"tidelift"}],"time":"2022-02-04T06:57:25+00:00"},{"name":"webmozart\/assert","version":"1.10.0","source":{"type":"git","url":"https:\/\/github.com\/webmozarts\/assert.git","reference":"6964c76c7804814a842473e0c8fd15bab0f18e25"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/webmozarts\/assert\/zipball\/6964c76c7804814a842473e0c8fd15bab0f18e25","reference":"6964c76c7804814a842473e0c8fd15bab0f18e25","shasum":""},"require":{"php":"^7.2 || ^8.0","symfony\/polyfill-ctype":"^1.8"},"conflict":{"phpstan\/phpstan":"<0.12.20","vimeo\/psalm":"<4.6.1 || 4.6.2"},"require-dev":{"phpunit\/phpunit":"^8.5.13"},"type":"library","extra":{"branch-alias":{"dev-master":"1.10-dev"}},"autoload":{"psr-4":{"Webmozart\\Assert\\":"src\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Bernhard Schussek","email":"bschussek@gmail.com"}],"description":"Assertions to validate method input\/output with nice error messages.","keywords":["assert","check","validate"],"support":{"issues":"https:\/\/github.com\/webmozarts\/assert\/issues","source":"https:\/\/github.com\/webmozarts\/assert\/tree\/1.10.0"},"time":"2021-03-09T10:59:23+00:00"}],"packages-dev":[{"name":"fzaninotto\/faker","version":"v1.9.2","source":{"type":"git","url":"https:\/\/github.com\/fzaninotto\/Faker.git","reference":"848d8125239d7dbf8ab25cb7f054f1a630e68c2e"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/fzaninotto\/Faker\/zipball\/848d8125239d7dbf8ab25cb7f054f1a630e68c2e","reference":"848d8125239d7dbf8ab25cb7f054f1a630e68c2e","shasum":""},"require":{"php":"^5.3.3 || ^7.0"},"require-dev":{"ext-intl":"*","phpunit\/phpunit":"^4.8.35 || ^5.7","squizlabs\/php_codesniffer":"^2.9.2"},"type":"library","extra":{"branch-alias":{"dev-master":"1.9-dev"}},"autoload":{"psr-4":{"Faker\\":"src\/Faker\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"authors":[{"name":"Fran\u00e7ois Zaninotto"}],"description":"Faker is a PHP library that generates fake data for you.","keywords":["data","faker","fixtures"],"support":{"issues":"https:\/\/github.com\/fzaninotto\/Faker\/issues","source":"https:\/\/github.com\/fzaninotto\/Faker\/tree\/v1.9.2"},"abandoned":true,"time":"2020-12-11T09:56:16+00:00"},{"name":"hamcrest\/hamcrest-php","version":"v2.0.1","source":{"type":"git","url":"https:\/\/github.com\/hamcrest\/hamcrest-php.git","reference":"8c3d0a3f6af734494ad8f6fbbee0ba92422859f3"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/hamcrest\/hamcrest-php\/zipball\/8c3d0a3f6af734494ad8f6fbbee0ba92422859f3","reference":"8c3d0a3f6af734494ad8f6fbbee0ba92422859f3","shasum":""},"require":{"php":"^5.3|^7.0|^8.0"},"replace":{"cordoval\/hamcrest-php":"*","davedevelopment\/hamcrest-php":"*","kodova\/hamcrest-php":"*"},"require-dev":{"phpunit\/php-file-iterator":"^1.4 || ^2.0","phpunit\/phpunit":"^4.8.36 || ^5.7 || ^6.5 || ^7.0"},"type":"library","extra":{"branch-alias":{"dev-master":"2.1-dev"}},"autoload":{"classmap":["hamcrest"]},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["BSD-3-Clause"],"description":"This is the PHP port of Hamcrest Matchers","keywords":["test"],"support":{"issues":"https:\/\/github.com\/hamcrest\/hamcrest-php\/issues","source":"https:\/\/github.com\/hamcrest\/hamcrest-php\/tree\/v2.0.1"},"time":"2020-07-09T08:09:16+00:00"},{"name":"mikey179\/vfsstream","version":"v1.6.10","source":{"type":"git","url":"https:\/\/github.com\/bovigo\/vfsStream.git","reference":"250c0825537d501e327df879fb3d4cd751933b85"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/bovigo\/vfsStream\/zipball\/250c0825537d501e327df879fb3d4cd751933b85","reference":"250c0825537d501e327df879fb3d4cd751933b85","shasum":""},"require":{"php":">=5.3.0"},"require-dev":{"phpunit\/phpunit":"^4.5|^5.0"},"type":"library","extra":{"branch-alias":{"dev-master":"1.6.x-dev"}},"autoload":{"psr-0":{"org\\bovigo\\vfs\\":"src\/main\/php"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["BSD-3-Clause"],"authors":[{"name":"Frank Kleine","homepage":"http:\/\/frankkleine.de\/","role":"Developer"}],"description":"Virtual file system to mock the real file system in unit tests.","homepage":"http:\/\/vfs.bovigo.org\/","support":{"issues":"https:\/\/github.com\/bovigo\/vfsStream\/issues","source":"https:\/\/github.com\/bovigo\/vfsStream\/tree\/master","wiki":"https:\/\/github.com\/bovigo\/vfsStream\/wiki"},"time":"2021-09-25T08:05:01+00:00"},{"name":"mockery\/mockery","version":"1.5.0","source":{"type":"git","url":"https:\/\/github.com\/mockery\/mockery.git","reference":"c10a5f6e06fc2470ab1822fa13fa2a7380f8fbac"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/mockery\/mockery\/zipball\/c10a5f6e06fc2470ab1822fa13fa2a7380f8fbac","reference":"c10a5f6e06fc2470ab1822fa13fa2a7380f8fbac","shasum":""},"require":{"hamcrest\/hamcrest-php":"^2.0.1","lib-pcre":">=7.0","php":"^7.3 || ^8.0"},"conflict":{"phpunit\/phpunit":"<8.0"},"require-dev":{"phpunit\/phpunit":"^8.5 || ^9.3"},"type":"library","extra":{"branch-alias":{"dev-master":"1.4.x-dev"}},"autoload":{"psr-0":{"Mockery":"library\/"}},"notification-url":"https:\/\/packagist.org\/downloads\/","license":["BSD-3-Clause"],"authors":[{"name":"P\u00e1draic Brady","email":"padraic.brady@gmail.com","homepage":"http:\/\/blog.astrumfutura.com"},{"name":"Dave Marshall","email":"dave.marshall@atstsolutions.co.uk","homepage":"http:\/\/davedevelopment.co.uk"}],"description":"Mockery is a simple yet flexible PHP mock object framework","homepage":"https:\/\/github.com\/mockery\/mockery","keywords":["BDD","TDD","library","mock","mock objects","mockery","stub","test","test double","testing"],"support":{"issues":"https:\/\/github.com\/mockery\/mockery\/issues","source":"https:\/\/github.com\/mockery\/mockery\/tree\/1.5.0"},"time":"2022-01-20T13:18:17+00:00"},{"name":"psalm\/phar","version":"4.22.0","source":{"type":"git","url":"https:\/\/github.com\/psalm\/phar.git","reference":"feebed09c9782d9aaa819b794d880c2671ba0e4c"},"dist":{"type":"zip","url":"https:\/\/api.github.com\/repos\/psalm\/phar\/zipball\/feebed09c9782d9aaa819b794d880c2671ba0e4c","reference":"feebed09c9782d9aaa819b794d880c2671ba0e4c","shasum":""},"require":{"php":"^7.1 || ^8.0"},"conflict":{"vimeo\/psalm":"*"},"bin":["psalm.phar"],"type":"library","notification-url":"https:\/\/packagist.org\/downloads\/","license":["MIT"],"description":"Composer-based Psalm Phar","support":{"issues":"https:\/\/github.com\/psalm\/phar\/issues","source":"https:\/\/github.com\/psalm\/phar\/tree\/4.22.0"},"time":"2022-02-27T11:01:37+00:00"}],"aliases":[],"minimum-stability":"stable","stability-flags":{"phpdocumentor\/guides":20,"phpdocumentor\/guides-markdown":20,"phpdocumentor\/guides-restructured-text":20},"prefer-stable":false,"prefer-lowest":false,"platform":{"php":"^7.4.0||^8.0","ext-ctype":"*","ext-hash":"*","ext-iconv":"*","ext-json":"*","ext-mbstring":"*","ext-simplexml":"*","ext-xml":"*"},"platform-dev":[],"platform-overrides":{"php":"7.4.0"},"plugin-api-version":"2.1.0"}3.2.1 ['all' => true], Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true], League\Tactician\Bundle\TacticianBundle::class => ['all' => true], ]; {% extends 'base.html.twig' %} {% block content %} {% include 'components/breadcrumbs.html.twig' %}
{{ include('components/enum-title.html.twig') }} {{ include('components/element-found-in.html.twig') }} {{ include('components/element-header.html.twig') }} {{ include('components/enum-cases.html.twig') }} {{ include('components/methods.html.twig') }} {{ include('components/source-modal.html.twig') }}
{% endblock %} .phpdocumentor-column { box-sizing: border-box; float: left; width: 100%; } @media (min-width: {{ breakpoints['md'] }}) { .phpdocumentor-column { margin-left: 4%; } .phpdocumentor-column:first-child { margin-left: 0; } .-one.phpdocumentor-column { width: 4.66666666667%; } .-two.phpdocumentor-column { width: 13.3333333333%; } .-three.phpdocumentor-column { width: 22%; } .-four.phpdocumentor-column { width: 30.6666666667%; } .-five.phpdocumentor-column { width: 39.3333333333%; } .-six.phpdocumentor-column { width: 48%; } .-seven.phpdocumentor-column { width: 56.6666666667%; } .-eight.phpdocumentor-column { width: 65.3333333333%; } .-nine.phpdocumentor-column { width: 74.0%; } .-ten.phpdocumentor-column { width: 82.6666666667%; } .-eleven.phpdocumentor-column { width: 91.3333333333%; } .-twelve.phpdocumentor-column { margin-left: 0; width: 100%; } .-one-third.phpdocumentor-column { width: 30.6666666667%; } .-two-thirds.phpdocumentor-column { width: 65.3333333333%; } .-one-half.phpdocumentor-column { width: 48%; } /* Offsets */ .-offset-by-one.phpdocumentor-column { margin-left: 8.66666666667%; } .-offset-by-two.phpdocumentor-column { margin-left: 17.3333333333%; } .-offset-by-three.phpdocumentor-column { margin-left: 26%; } .-offset-by-four.phpdocumentor-column { margin-left: 34.6666666667%; } .-offset-by-five.phpdocumentor-column { margin-left: 43.3333333333%; } .-offset-by-six.phpdocumentor-column { margin-left: 52%; } .-offset-by-seven.phpdocumentor-column { margin-left: 60.6666666667%; } .-offset-by-eight.phpdocumentor-column { margin-left: 69.3333333333%; } .-offset-by-nine.phpdocumentor-column { margin-left: 78.0%; } .-offset-by-ten.phpdocumentor-column { margin-left: 86.6666666667%; } .-offset-by-eleven.phpdocumentor-column { margin-left: 95.3333333333%; } .-offset-by-one-third.phpdocumentor-column { margin-left: 34.6666666667%; } .-offset-by-two-thirds.phpdocumentor-column { margin-left: 69.3333333333%; } .-offset-by-one-half.phpdocumentor-column { margin-left: 52%; } } .phpdocumentor a { color: var(--link-color-primary); } .phpdocumentor a:hover { color: var(--link-hover-color-primary); } .phpdocumentor p { margin-top: 0; margin-bottom: var(--spacing-md); } .phpdocumentor h1, .phpdocumentor h2, .phpdocumentor h3, .phpdocumentor h4, .phpdocumentor h5, .phpdocumentor h6 { margin-bottom: var(--spacing-lg); margin-top: var(--spacing-lg); font-weight: 600; } .phpdocumentor h1 { font-size: var(--text-xxxxl); letter-spacing: var(--letter-spacing--primary); line-height: 1.2; margin-top: 0; } .phpdocumentor h2 { font-size: var(--text-xxxl); letter-spacing: var(--letter-spacing--primary); line-height: 1.25; } .phpdocumentor h3 { font-size: var(--text-xxl); letter-spacing: var(--letter-spacing--primary); line-height: 1.3; } .phpdocumentor h4 { font-size: var(--text-xl); letter-spacing: calc(var(--letter-spacing--primary) / 2); line-height: 1.35; margin-bottom: var(--spacing-md); } .phpdocumentor h5 { font-size: var(--text-lg); letter-spacing: calc(var(--letter-spacing--primary) / 4); line-height: 1.5; margin-bottom: var(--spacing-md); margin-top: var(--spacing-md); } .phpdocumentor h6 { font-size: var(--text-md); letter-spacing: 0; line-height: var(--line-height--primary); margin-bottom: var(--spacing-md); margin-top: var(--spacing-md); } .phpdocumentor h1 .headerlink, .phpdocumentor h2 .headerlink, .phpdocumentor h3 .headerlink, .phpdocumentor h4 .headerlink, .phpdocumentor h5 .headerlink, .phpdocumentor h6 .headerlink { transition: all .3s ease-in-out; opacity: 0; text-decoration: none; color: silver; font-size: 80%; } .phpdocumentor h1:hover .headerlink, .phpdocumentor h2:hover .headerlink, .phpdocumentor h3:hover .headerlink, .phpdocumentor h4:hover .headerlink, .phpdocumentor h5:hover .headerlink, .phpdocumentor h6:hover .headerlink { opacity: 1; } .phpdocumentor figure { margin-bottom: var(--spacing-md); } .phpdocumentor figcaption { text-align: center; font-style: italic; font-size: 80%; } .phpdocumentor-uml-diagram svg { max-width: 100%; height: auto !important; } .phpdocumentor-column ul, div.phpdocumentor-list > ul, ul.phpdocumentor-list { list-style: circle; } .phpdocumentor-column ol, div.phpdocumentor-list > ol, ol.phpdocumentor-list { list-style: decimal; } .phpdocumentor-column ul, div.phpdocumentor-list > ul, ol.phpdocumentor-list, ul.phpdocumentor-list { margin-top: 0; padding-left: 1rem; margin-bottom: var(--spacing-md); } dl { margin-bottom: var(--spacing-md); } .phpdocumentor-column ul ul, div.phpdocumentor-list > ul ul, ul.phpdocumentor-list ul.phpdocumentor-list, ul.phpdocumentor-list ol.phpdocumentor-list, ol.phpdocumentor-list ol.phpdocumentor-list, ol.phpdocumentor-list ul.phpdocumentor-list { font-size: var(--text-sm); margin: var(--spacing-xs) 0 var(--spacing-xs) calc(var(--spacing-xs) * 2); } .phpdocumentor-column ul li, .phpdocumentor-list li { padding-bottom: var(--spacing-xs); } .phpdocumentor dl dt { margin-bottom: var(--spacing-xs); } .phpdocumentor dl dd { margin-bottom: var(--spacing-md); } .phpdocumentor-section { box-sizing: border-box; margin: 0 auto; max-width: var(--container-width); padding: 0 var(--spacing-lg); position: relative; width: 100%; } @media (min-width: {{ breakpoints['xxl'] }}) { .phpdocumentor-section { padding: 0; width: 95%; } } .phpdocumentor pre { margin-bottom: var(--spacing-md); } .phpdocumentor-code { font-family: var(--font-monospace); background: var(--code-background-color); border: 1px solid var(--code-border-color); border-radius: var(--border-radius-base-size); font-size: var(--text-sm); padding: var(--spacing-sm) var(--spacing-md); width: 100%; box-sizing: border-box; } .phpdocumentor-code.-dark { background: var(--primary-color-darkest); color: var(--light-gray); box-shadow: 0 2px 3px var(--dark-gray); } pre > .phpdocumentor-code { display: block; white-space: pre; } .phpdocumentor form { margin-bottom: var(--spacing-md); } .phpdocumentor-field { background-color: var(--form-field-color); border: 1px solid var(--form-field-border-color); border-radius: var(--border-radius-base-size); box-shadow: none; box-sizing: border-box; height: 38px; padding: var(--spacing-xxxs) var(--spacing-xxs); /* The 6px vertically centers text on FF, ignored by Webkit */ margin-bottom: var(--spacing-md); } /* Removes awkward default styles on some inputs for iOS */ input[type="email"], input[type="number"], input[type="search"], input[type="text"], input[type="tel"], input[type="url"], input[type="password"], textarea { -moz-appearance: none; -webkit-appearance: none; appearance: none; } .phpdocumentor-textarea { min-height: 65px; padding-bottom: var(--spacing-xxxs); padding-top: var(--spacing-xxxs); } .phpdocumentor-field:focus { border: 1px solid var(--button-color-primary); outline: 0; } .phpdocumentor-label { display: block; margin-bottom: var(--spacing-xs); } .phpdocumentor-fieldset { border-width: 0; padding: 0; } input[type="checkbox"].phpdocumentor-field, input[type="radio"].phpdocumentor-field { display: inline; } .phpdocumentor-button { background-color: var(--button-color); border: 1px solid var(--button-border-color); border-radius: var(--border-radius-base-size); box-sizing: border-box; color: var(--button-text-color); cursor: pointer; display: inline-block; font-size: var(--text-sm); font-weight: 600; height: 38px; letter-spacing: .1rem; line-height: 38px; padding: 0 var(--spacing-xxl); text-align: center; text-decoration: none; text-transform: uppercase; white-space: nowrap; margin-bottom: var(--spacing-md); } .phpdocumentor-button .-wide { width: 100%; } .phpdocumentor-button:hover, .phpdocumentor-button:focus { border-color: #888; color: #333; outline: 0; } .phpdocumentor-button.-primary { background-color: var(--button-color-primary); border-color: var(--button-color-primary); color: var(--button-text-color-primary); } .phpdocumentor-button.-primary:hover, .phpdocumentor-button.-primary:focus { background-color: var(--link-color-primary); border-color: var(--link-color-primary); color: var(--button-text-color-primary); } .phpdocumentor-line { border-top: 1px solid #E1E1E1; border-width: 0; margin-bottom: var(--spacing-xxl); margin-top: var(--spacing-xxl); } .phpdocumentor table { margin-bottom: var(--spacing-md); } th.phpdocumentor-heading, td.phpdocumentor-cell { border-bottom: 1px solid var(--table-separator-color); padding: var(--spacing-sm) var(--spacing-md); text-align: left; } th.phpdocumentor-heading:first-child, td.phpdocumentor-cell:first-child { padding-left: 0; } th.phpdocumentor-heading:last-child, td.phpdocumentor-cell:last-child { padding-right: 0; } .phpdocumentor blockquote { border-left: 4px solid var(--primary-color-darken); margin: var(--spacing-md) 0; padding: var(--spacing-xs) var(--spacing-sm); color: var(--primary-color-darker); font-style: italic; } .phpdocumentor blockquote p:last-of-type { margin-bottom: 0; } {% extends 'base.html.twig' %} {% block content %} {% include 'components/breadcrumbs.html.twig' %}
{{ include('components/namespace-title.html.twig') }} {{ include('components/table-of-contents.html.twig', {'namespaces': node.children}) }} {{ include('components/constants.html.twig') }} {{ include('components/functions.html.twig') }}
{% endblock %} {% extends 'base.html.twig' %} {% set baseUrl = renderBaseUrlHeader() %} {% block stylesheets %} {% endblock %} {% block javascripts %} {% endblock %} {% block content %}
{% endblock %} {% block head %} {% block title %}{{ project.name }}{% endblock %} {% endblock %} {{ renderBaseUrlHeader() }} {% block stylesheets %} {% endblock %} {% block javascripts %} {% endblock %} {% include 'components/header.html.twig' %}
{% include 'components/sidebar.html.twig' %}
{% block content %}{% endblock %} {% include 'components/search-results.html.twig' %}
{{ include('components/back-to-top.html.twig') }}
{% set baseUrl = renderBaseUrlHeader() %} Search.appendIndex( [ {% for element in project.indexes.elements %} { "fqsen": "{{ element.fullyQualifiedStructuralElementName|e('js') }}", "name": "{{ element.name|e('js') }}", "summary": "{{ element.summary|e('js') }}", "url": "{{ link(element) }}" }{% if not loop.last %},{% endif %} {% endfor %} ] ); {% extends 'base.html.twig' %} {% block content %} {% include 'components/breadcrumbs.html.twig' %}
{{ include('components/trait-title.html.twig') }} {{ include('components/element-found-in.html.twig') }} {{ include('components/element-header.html.twig') }} {{ include('components/properties.html.twig') }} {{ include('components/methods.html.twig') }} {{ include('components/source-modal.html.twig') }}
{% endblock %} {% extends 'base.html.twig' %} {% block content %} {% include('components/breadcrumbs.html.twig') %}
{{ include('components/file-title.html.twig') }} {{ include('components/element-header.html.twig') }} {{ include('components/constants.html.twig') }} {{ include('components/functions.html.twig') }}
{% endblock %} {% extends 'base.html.twig' %} {% block content %} {% include 'components/breadcrumbs.html.twig' %}
{{ include('components/namespace-title.html.twig') }} {{ include('components/table-of-contents.html.twig', {'packages': node.children}) }} {{ include('components/constants.html.twig') }} {{ include('components/functions.html.twig') }}
{% endblock %} {{ node.visibility }} {% if node.final %}final{% endif %} {{ not node.type ? "mixed" : node.type|route('class:short')|join('|')|raw }} {{ node.name }} = {{ node.value | default('""') }}

{{ constant.name }}

{{ include('components/element-found-in.html.twig', {'node': constant}) }} {{ include('components/summary.html.twig', {'node': constant}) }} {{ include('components/constant-signature.html.twig', {'node': constant}) }} {{ include('components/description.html.twig', {'node': constant}) }} {{ include('components/description.html.twig', {'node': constant.var[0]}) }} {{ include ('components/tags.html.twig', {'node': constant}) }}
.phpdocumentor-description { margin-bottom: var(--spacing-md); }

{{ node.name }}

.phpdocumentor-table-of-contents { } .phpdocumentor-table-of-contents .phpdocumentor-table-of-contents__entry { padding-top: var(--spacing-xs); margin-left: 2rem; display: flex; } .phpdocumentor-table-of-contents .phpdocumentor-table-of-contents__entry > a { flex: 0 1 auto; } .phpdocumentor-table-of-contents .phpdocumentor-table-of-contents__entry > span { flex: 1; white-space: nowrap; text-overflow: ellipsis; overflow: hidden; } .phpdocumentor-table-of-contents .phpdocumentor-table-of-contents__entry:after { content: ''; height: 12px; width: 12px; left: 16px; position: absolute; } .phpdocumentor-table-of-contents .phpdocumentor-table-of-contents__entry.-private:after { background: url('data:image/svg+xml;utf8,{{ include('icons/private.svg.twig')|trim|raw }}') no-repeat; } .phpdocumentor-table-of-contents .phpdocumentor-table-of-contents__entry.-protected:after { left: 13px; background: url('data:image/svg+xml;utf8,{{ include('icons/protected.svg.twig')|trim|raw }}') no-repeat; } .phpdocumentor-table-of-contents .phpdocumentor-table-of-contents__entry:before { width: 1.25rem; height: 1.25rem; line-height: 1.25rem; background: transparent url('data:image/svg+xml;utf8,{{ include('icons/method.svg.twig')|trim|raw }}') no-repeat center center; content: ''; position: absolute; left: 0; border-radius: 50%; font-weight: 600; color: white; text-align: center; font-size: .75rem; margin-top: .2rem; } .phpdocumentor-table-of-contents .phpdocumentor-table-of-contents__entry.-method:before { content: 'M'; background-image: url('data:image/svg+xml;utf8,{{ include('icons/method.svg.twig')|trim|raw }}'); } .phpdocumentor-table-of-contents .phpdocumentor-table-of-contents__entry.-function:before { content: 'M'; background-image: url('data:image/svg+xml;utf8,{{ include('icons/method.svg.twig')|trim|raw }}'); } .phpdocumentor-table-of-contents .phpdocumentor-table-of-contents__entry.-property:before { content: 'P' } .phpdocumentor-table-of-contents .phpdocumentor-table-of-contents__entry.-constant:before { content: 'C'; background-color: transparent; background-image: url('data:image/svg+xml;utf8,{{ include('icons/constant.svg.twig')|trim|raw }}'); } .phpdocumentor-table-of-contents .phpdocumentor-table-of-contents__entry.-class:before { content: 'C' } .phpdocumentor-table-of-contents .phpdocumentor-table-of-contents__entry.-interface:before { content: 'I' } .phpdocumentor-table-of-contents .phpdocumentor-table-of-contents__entry.-trait:before { content: 'T' } .phpdocumentor-table-of-contents .phpdocumentor-table-of-contents__entry.-namespace:before { content: 'N' } .phpdocumentor-table-of-contents .phpdocumentor-table-of-contents__entry.-package:before { content: 'P' } .phpdocumentor-table-of-contents .phpdocumentor-table-of-contents__entry.-enum:before { content: 'E' } .phpdocumentor-table-of-contents dd { font-style: italic; margin-left: 2rem; } .phpdocumentor-signature { display: inline-block; font-size: var(--text-sm); margin-bottom: var(--spacing-md); } .phpdocumentor-signature.-deprecated .phpdocumentor-signature__name { text-decoration: line-through; } {% if node.file.source %}

        
{% endif %} {% block javascripts %} {% endblock %}

{{ case.name }}

{{ include('components/element-found-in.html.twig', {'node': case}) }} {{ include('components/summary.html.twig', {'node': case}) }} {{ include('components/description.html.twig', {'node': case}) }} {{ include('components/description.html.twig', {'node': case.var[0]}) }} {{ include ('components/tags.html.twig', {'node': case}) }}
{% if depth == 1 %}

{{ entry.title | shortFQSEN }}

{% endif %} {% if entry.children.count > 0 %} {% endif %} .phpdocumentor-class-graph { width: 100%; height: 600px; border:1px solid black; overflow: hidden } .phpdocumentor-class-graph__graph { width: 100%; }
{{ type == 'property' ? '$' }}{{ node.name }}{{ type == 'method' or type == 'function' ? '()' }} {% if type == 'constant' %} = {{ node.value }}{% endif %} {% if type == 'case' %}{% if node.value %} = {{ node.value }}{% endif %}{% endif %} {% if type == 'property' %} : {{ node.type ? node.type|route('class:short')|join('|')|raw : 'mixed' }}{% endif %} {% if type == 'method' or type == 'function' %} : {{ node.response.type|route('class:short')|join('|')|raw }}{% endif %}
{{ node.summary }}

{{ function.name }}()

{{ include('components/element-found-in.html.twig', {'node': function}) }} {{ include('components/summary.html.twig', {'node': function}) }} {{ include('components/method-signature.html.twig', {'node': function}) }} {{ include('components/description.html.twig', {'node': function}) }} {{ include('components/method-arguments.html.twig', {'node': function}) }} {{ include('components/tags.html.twig', {'node': function}) }} {{ include('components/method-response.html.twig', {'node': function}) }}
{% set methods = methods(node)|sortByVisibility %} {% if methods is not empty %}

Methods

{% for method in methods %} {% include 'components/method.html.twig' %} {% endfor %}
{% endif %} {% if not node.description.empty %}
{{ node.description|description|markdown }}
{% endif %}

{{ node.name }} {% if node.parent %} extends {{ node.parent|route('class:short') }} {% endif %} {% if usesPackages %}
in package
{% endif %} {% if node.interfaces is not empty %} implements {% for interface in node.interfaces %} {{ interface|route('class:short') }}{% if not loop.last %}, {% endif %} {% endfor %} {% endif %} {% if node.usedTraits is not empty %} Uses {% for trait in node.usedTraits %} {{ trait|route('class:short') }}{% if not loop.last %}, {% endif %} {% endfor %} {% endif %}

{% if node.functions is not empty %}

Functions

{% for function in node.functions %} {% include 'components/function.html.twig' %} {% endfor %}
{% endif %} .phpdocumentor .phpdocumentor-back-to-top { position: fixed; bottom: 2rem; font-size: 2.5rem; opacity: .25; transition: all .3s ease-in-out; right: 2rem; } .phpdocumentor .phpdocumentor-back-to-top:hover { color: var(--link-color-primary); opacity: 1; } .phpdocumentor-title { box-sizing: border-box; color: var(--title-text-color); font-size: var(--text-xxl); letter-spacing: .05rem; font-weight: normal; width: auto; margin: 0; display: flex; align-items: center; } .phpdocumentor-title.-without-divider { border: none; } .phpdocumentor-title__link { transition: all .3s ease-out; display: flex; color: var(--title-text-color); text-decoration: none; font-weight: normal; white-space: nowrap; transform: scale(.75); transform-origin: left; } .phpdocumentor-title__link:hover { transform: perspective(15rem) translateX(.5rem); font-weight: 600; } @media (min-width: {{ breakpoints['menu'] }}) { .phpdocumentor-title { width: 30.6666666667%; border-right: var(--sidebar-border-color) solid 1px; } .phpdocumentor-title__link { transform-origin: left; } } @media (min-width: {{ breakpoints['xl'] }}) { .phpdocumentor-title__link { transform: scale(.85); } } @media (min-width: {{ breakpoints['xxl'] }}) { .phpdocumentor-title__link { transform: scale(1); } } .phpdocumentor-modal { position: fixed; width: 100vw; height: 100vh; opacity: 0; visibility: hidden; transition: all 0.3s ease; top: 0; left: 0; display: flex; align-items: center; justify-content: center; } .phpdocumentor-modal__open { visibility: visible; opacity: 1; transition-delay: 0s; } .phpdocumentor-modal-bg { position: absolute; background: gray; opacity: 50%; width: 100%; height: 100%; } .phpdocumentor-modal-container { border-radius: 1em; background: #fff; position: relative; padding: 2em; box-sizing: border-box; max-width:100vw; } .phpdocumentor-modal__close { position: absolute; right: 0.75em; top: 0.75em; outline: none; appearance: none; color: var(--primary-color); background: none; border: 0px; font-weight: bold; cursor: pointer; } {{ node.visibility }} {% if node.abstract %}abstract{% endif %} {% if node.final %}final{% endif %} {% if node.static %}static{% endif %} {% if node.hasReturnByReference %}&{% endif %} {% apply spaceless %} {{ node.name }} ( {% for argument in node.arguments %} {% if argument.default %}[{% endif %} {% if not loop.first %}, {% endif %} {{ argument.type|route('class:short')|join('|')|raw }}  {% if argument.isVariadic %}...{% endif %} {%- if argument.byReference -%}&{%- endif -%} ${{ argument.name }} {% if argument.default %} = {{ argument.default }} ] {% endif %} {% endfor %} ) : {{ node.response.type|route('class:short')|join('|')|raw }} {% endapply %} .phpdocumentor-content { position: relative; } .phpdocumentor-search-results { backdrop-filter: blur(5px); background: var(--popover-background-color); position: fixed; top: 0; left: 0; right: 0; bottom: 0; padding: 0; opacity: 1; pointer-events: all; transition: opacity .3s, background .3s; } .phpdocumentor-search-results--hidden { background: transparent; backdrop-filter: blur(0); opacity: 0; pointer-events: none; } .phpdocumentor-search-results__dialog { width: 100%; background: white; max-height: 100%; display: flex; flex-direction: column; } .phpdocumentor-search-results__body { overflow: auto; } .phpdocumentor-search-results__header { padding: var(--spacing-lg); display: flex; justify-content: space-between; background: var(--primary-color-darken); color: white; align-items: center; } .phpdocumentor-search-results__close { font-size: var(--text-xl); background: none; border: none; padding: 0; margin: 0; } .phpdocumentor .phpdocumentor-search-results__title { font-size: var(--text-xl); margin-bottom: 0; } .phpdocumentor-search-results__entries { list-style: none; padding: 0 var(--spacing-lg); margin: 0; } .phpdocumentor-search-results__entry { border-bottom: 1px solid var(--table-separator-color); padding: var(--spacing-sm) 0; text-align: left; } .phpdocumentor-search-results__entry a { display: block; } .phpdocumentor-search-results__entry small { margin-top: var(--spacing-xs); margin-bottom: var(--spacing-md); color: var(--primary-color-darker); display: block; word-break: break-word; } .phpdocumentor-search-results__entry h3 { font-size: var(--text-lg); margin: 0; } @media (min-width: {{ breakpoints['md'] }}) { .phpdocumentor-search-results { padding: 0 var(--spacing-lg); } .phpdocumentor-search-results__entry h3 { font-size: var(--text-xxl); } .phpdocumentor-search-results__dialog { margin: var(--spacing-xl) auto; max-width: 40rem; background: white; border: 1px solid silver; box-shadow: 0 2px 5px silver; max-height: 40rem; border-radius: 3px; } } {% if (node.response.type and node.response.type != 'void') or node.response.description %}
Return values
{{ node.response.type|route('class:short')|join('|')|raw }} {% if node.response %} — {{ include('components/description.html.twig', {'node': node.response}) }} {% endif %} {% endif %} {% if packages|default([]) is not empty %}

Packages

{% for package in packages %}
{{ package|route('class:short') }}
{% endfor %}
{% endif %} {% if namespaces|default([]) is not empty %}

Namespaces

{% for namespace in namespaces %}
{{ namespace|route('class:short') }}
{% endfor %}
{% endif %} {% if node.interfaces is not empty or node.classes is not empty or node.traits is not empty or node.enums is not empty %}

Interfaces, Classes, Traits and Enums

{% for interface in node.interfaces %}
{{ interface|route('class:short') }}
{{ interface.summary }}
{% endfor %} {% for class in node.classes %}
{{ class|route('class:short') }}
{{ class.summary }}
{% endfor %} {% for trait in node.traits %}
{{ trait|route('class:short') }}
{{ trait.summary }}
{% endfor %} {% for enum in node.enums %}
{{ enum|route('class:short') }}
{{ enum.summary }}
{% endfor %}
{% endif %} {% set constants = constants(node) %} {% set properties = properties(node) %} {% set methods = methods(node) %} {% if constants is not empty or node.functions is not empty or methods is not empty or properties is not empty %}

Table of Contents

{% for constant in constants(node)|sortByVisibility %} {{ include('components/table-of-contents-entry.html.twig', {'type': 'constant', 'node': constant}) }} {% endfor %} {% for case in cases(node)|sortByVisibility %} {{ include('components/table-of-contents-entry.html.twig', {'type': 'case', 'node': case}) }} {% endfor %} {% for property in properties(node)|sortByVisibility %} {{ include('components/table-of-contents-entry.html.twig', {'type': 'property', 'node': property}) }} {% endfor %} {% for method in methods(node)|sortByVisibility %} {{ include('components/table-of-contents-entry.html.twig', {'type': 'method', 'node': method}) }} {% endfor %} {% for function in node.functions|default([]) %} {{ include('components/table-of-contents-entry.html.twig', {'type': 'function', 'node': function}) }} {% endfor %}
{% endif %} .phpdocumentor-element-found-in { position: absolute; top: 0; right: 0; font-size: var(--text-sm); color: gray; } .phpdocumentor-element-found-in .phpdocumentor-element-found-in__source { flex: 0 1 auto; display: inline-flex; } .phpdocumentor-element-found-in .phpdocumentor-element-found-in__source:after { width: 1.25rem; height: 1.25rem; line-height: 1.25rem; background: transparent url('data:image/svg+xml;utf8,{{ include('icons/source.svg.twig')|trim|raw }}') no-repeat center center; content: ''; left: 0; border-radius: 50%; font-weight: 600; text-align: center; font-size: .75rem; margin-top: .2rem; } .phpdocumentor-summary { font-style: italic; } .phpdocumentor-sidebar { margin: 0; overflow: hidden; max-height: 0; } .phpdocumentor .phpdocumentor-sidebar .phpdocumentor-list { padding: var(--spacing-xs) var(--spacing-md); list-style: none; margin: 0; } .phpdocumentor .phpdocumentor-sidebar li { white-space: nowrap; text-overflow: ellipsis; overflow: hidden; padding: 0 0 var(--spacing-xxxs) var(--spacing-md); } .phpdocumentor .phpdocumentor-sidebar abbr, .phpdocumentor .phpdocumentor-sidebar a { text-decoration: none; border-bottom: none; color: var(--text-color); font-size: var(--text-md); padding-left: 0; transition: padding-left .4s ease-out; } .phpdocumentor .phpdocumentor-sidebar a:hover, .phpdocumentor .phpdocumentor-sidebar a.-active { padding-left: 5px; font-weight: 600; } .phpdocumentor .phpdocumentor-sidebar__category > * { border-left: 1px solid var(--primary-color-lighten); } .phpdocumentor .phpdocumentor-sidebar__category { margin-bottom: var(--spacing-lg); } .phpdocumentor .phpdocumentor-sidebar__category-header { font-size: var(--text-md); margin-bottom: var(--spacing-xs); color: var(--link-color-primary); font-weight: 600; border-left: 0; } .phpdocumentor .phpdocumentor-sidebar__root-package, .phpdocumentor .phpdocumentor-sidebar__root-namespace { font-size: var(--text-md); margin: 0; padding-top: var(--spacing-xs); padding-left: var(--spacing-md); color: var(--text-color); font-weight: normal; } @media (min-width: {{ breakpoints['md'] }}) { .phpdocumentor-sidebar { border-right: var(--sidebar-border-color) solid 1px; } } .phpdocumentor-sidebar__menu-button { position: absolute; top: -100%; left: -100%; } .phpdocumentor-sidebar__menu-icon { font-size: var(--text-md); font-weight: 600; background: var(--primary-color); color: white; margin: 0 0 var(--spacing-lg); display: block; padding: var(--spacing-sm); text-align: center; border-radius: 3px; text-transform: uppercase; letter-spacing: .15rem; } .phpdocumentor-sidebar__menu-button:checked ~ .phpdocumentor-sidebar { max-height: 100%; padding-top: var(--spacing-md); } @media (min-width: {{ breakpoints['md'] }}) { .phpdocumentor-sidebar { overflow: visible; max-height: 100%; } .phpdocumentor-sidebar__menu-icon { display: none; } } .phpdocumentor-admonition { border: 1px solid var(--admonition-border-color); border-radius: var(--border-radius-base-size); border-color: var(--primary-color-lighten); background-color: var(--primary-color-lighter); padding: var(--spacing-lg); margin: var(--spacing-lg) 0; display: flex; flex-direction: row; align-items: flex-start; } .phpdocumentor-admonition p:last-of-type { margin-bottom: 0; } .phpdocumentor-admonition--success, .phpdocumentor-admonition.-success { border-color: var(--admonition-success-color); } .phpdocumentor-admonition__icon { margin-right: var(--spacing-md); color: var(--primary-color); max-width: 3rem; } .phpdocumentor ul.phpdocumentor-breadcrumbs { font-size: var(--text-md); list-style: none; margin: 0; padding: 0; } .phpdocumentor ul.phpdocumentor-breadcrumbs a { color: var(--text-color); text-decoration: none; } .phpdocumentor ul.phpdocumentor-breadcrumbs > li { display: inline-block; margin: 0; } .phpdocumentor ul.phpdocumentor-breadcrumbs > li + li:before { color: var(--dark-gray); content: "\\\A0"; padding: 0; } {% if node.arguments|length > 0 %}
Parameters
{% for argument in node.arguments %}
${{ argument.name }} : {{ argument.type|route('class:short')|join('|')|raw }} {% if argument.default %} = {{ argument.default }}{% endif %}
{{ include('components/description.html.twig', {'node': argument}) }}
{% endfor %}
{% endif %} .phpdocumentor-search { position: relative; display: none; /** disable by default for non-js flow */ opacity: .3; /** white-out default for loading indication */ transition: opacity .3s, background .3s; margin: var(--spacing-sm) 0; flex: 1; min-width: 100%; } .phpdocumentor-search label { display: flex; align-items: center; flex: 1; } .phpdocumentor-search__icon { color: var(--primary-color); margin-right: var(--spacing-sm); width: 1rem; height: 1rem; } .phpdocumentor-search--enabled { display: flex; } .phpdocumentor-search--active { opacity: 1; } .phpdocumentor-search input:disabled { background-color: lightgray; } .phpdocumentor-search__field:focus, .phpdocumentor-search__field { margin-bottom: 0; border: 0; border-bottom: 2px solid var(--primary-color); padding: 0; border-radius: 0; flex: 1; } @media (min-width: {{ breakpoints['menu'] }}) { .phpdocumentor-search { min-width: auto; max-width: 20rem; margin: 0 0 0 auto; } }

Search results

    {% set properties = properties(node)|sortByVisibility %} {% if properties is not empty %}

    Properties

    {% for property in properties %} {% include 'components/property.html.twig' %} {% endfor %}
    {% endif %}

    {{ node.name }} {% if node.parent is not empty %} extends {% for interface in node.parent %} {{ interface|route('class:short') }}{% if not loop.last %}, {% endif %} {% endfor %} {% endif %} {% if usesPackages %}
    in
    {% endif %}

    {% set cases = node.cases %} {% if cases is not empty %}

    Cases

    {% for case in cases %} {% include 'components/enum-case.html.twig' %} {% endfor %}
    {% endif %} {{ node.visibility }} {% if node.static %}static{% endif %} {{ not node.type ? "mixed" : node.type|route('class:short')|join('|')|raw }} ${{ node.name }} {% if node.default is not null %} = {{ node.default is not null ? node.default : '""' }}{% endif %}

    {{ node.name }} {% if node.usedTraits is not empty %} Uses {% for trait in node.usedTraits %} {{ trait|route('trait:short') }}{% if not loop.last %}, {% endif %} {% endfor %} {% endif %}

    .phpdocumentor-header { display: flex; flex-direction: row; align-items: stretch; flex-wrap: wrap; justify-content: space-between; height: auto; padding: var(--spacing-md) var(--spacing-md); } .phpdocumentor-header__menu-button { position: absolute; top: -100%; left: -100%; } .phpdocumentor-header__menu-icon { font-size: 2rem; color: var(--primary-color); } .phpdocumentor-header__menu-button:checked ~ .phpdocumentor-topnav { max-height: 250px; padding-top: var(--spacing-md); } @media (min-width: {{ breakpoints['menu'] }}) { .phpdocumentor-header { flex-direction: row; padding: var(--spacing-lg) var(--spacing-lg); min-height: var(--header-height); } .phpdocumentor-header__menu-icon { display: none; } } @media (min-width: {{ breakpoints['xl'] }}) { .phpdocumentor-header { padding-top: 0; padding-bottom: 0; } } @media (min-width: {{ breakpoints['xxl'] }}) { .phpdocumentor-header { padding: 0; } }

    {{ project.name }}

    {{ node.name == '\\' ? 'API Documentation' : node.name }}

    {% set breadcrumbs = usesNamespaces ? breadcrumbs(node) : packages(node) %} .phpdocumentor-element { position: relative; } .phpdocumentor .phpdocumentor-element__name { line-height: 1; } .phpdocumentor-element__package, .phpdocumentor-element__extends, .phpdocumentor-element__implements { display: block; font-size: var(--text-xxs); font-weight: normal; opacity: .7; } .phpdocumentor-element__package .phpdocumentor-breadcrumbs { display: inline; } .phpdocumentor-element:not(:last-child) { border-bottom: 1px solid var(--primary-color-lighten); padding-bottom: var(--spacing-lg); } .phpdocumentor-element.-deprecated .phpdocumentor-element__name { text-decoration: line-through; } .phpdocumentor-element__modifier { font-size: var(--text-xxs); padding: calc(var(--spacing-base-size) / 4) calc(var(--spacing-base-size) / 2); color: var(--text-color); background-color: var(--light-gray); border-radius: 3px; text-transform: uppercase; }

    ${{ property.name }} {% if property.writeOnly %}write-only{% endif %} {% if property.readOnly %}read-only{% endif %}

    {{ include('components/element-found-in.html.twig', {'node': property}) }} {{ include('components/summary.html.twig', {'node': property}) }} {{ include('components/property-signature.html.twig', {'node': property}) }} {{ include('components/description.html.twig', {'node': property}) }} {{ include('components/description.html.twig', {'node': property.var[0]}) }} {{ include ('components/tags.html.twig', {'node': property}) }}
    {{ include('components/summary.html.twig') }} {{ include('components/description.html.twig') }} {{ include('components/tags.html.twig', {node: node}) }} {{ include ('components/table-of-contents.html.twig') }} .phpdocumentor-topnav { display: flex; align-items: center; margin: 0; max-height: 0; overflow: hidden; transition: max-height 0.2s ease-out; flex-basis: 100%; } .phpdocumentor-topnav__menu { text-align: right; list-style: none; margin: 0; padding: 0; flex: 1; display: flex; flex-flow: row wrap; justify-content: center; } .phpdocumentor-topnav__menu-item { margin: 0; width: 100%; display: inline-block; text-align: center; padding: var(--spacing-sm) 0 } .phpdocumentor-topnav__menu-item.-social { width: auto; padding: var(--spacing-sm) } .phpdocumentor-topnav__menu-item a { display: inline-block; color: var(--text-color); text-decoration: none; font-size: var(--text-lg); transition: all .3s ease-out; border-bottom: 1px dotted transparent; line-height: 1; } .phpdocumentor-topnav__menu-item a:hover { transform: perspective(15rem) translateY(.1rem); border-bottom: 1px dotted var(--text-color); } @media (min-width: {{ breakpoints['menu'] }}) { .phpdocumentor-topnav { max-height: none; overflow: visible; flex-basis: auto; } .phpdocumentor-topnav__menu { display: flex; flex-flow: row wrap; justify-content: flex-end; } .phpdocumentor-topnav__menu-item, .phpdocumentor-topnav__menu-item.-social { width: auto; display: inline; text-align: right; padding: 0 0 0 var(--spacing-md) } } {% set tags = node.tags|filter((v,k) => k not in ['var', 'param', 'property', 'property-read', 'property-write', 'method', 'return', 'package', 'api']) %} {% if tags|length > 0 %}
    Tags
    {% for name,seriesOfTag in tags %} {% for tag in seriesOfTag %}
    {{ name }}
    {% if tag.version %} {{ tag.version }} {% endif %} {% if tag.type %} {{ tag.type|route('class:short')|join('|')|raw }} {% endif %} {% if tag.reference %} {{ tag.reference|route('class:short')|join('|')|raw }} {% endif %} {% if tag.link %} {% if tag.description is not empty %} {{ tag.description | description | markdown }} {% else %} {{ tag.link }} {% endif %} {% endif %} {% if not tag.link %} {{ include('components/description.html.twig', {'node': tag}) }} {% endif %}
    {% endfor %} {% endfor %}
    {% endif %} {% set constants = constants(node)|sortByVisibility %} {% if constants is not empty %}

    Constants

    {% for constant in constants %} {% include 'components/constant.html.twig' %} {% endfor %}
    {% endif %} {% if node.summary %}

    {{ node.summary }}

    {% endif %}
    {% include 'components/header-title.html.twig' %} {{ include('components/search.html.twig') }} {% include 'components/topnav.html.twig' %}

    {{ node.name }} {% if node.backedType %} : {{ node.backedType }} {% endif %} {% if usesPackages %}
    in package
    {% endif %} {% if node.interfaces is not empty %} implements {% for interface in node.interfaces %} {{ interface|route('class:short') }}{% if not loop.last %}, {% endif %} {% endfor %} {% endif %} {% if node.usedTraits is not empty %} Uses {% for trait in node.usedTraits %} {{ trait|route('class:short') }}{% if not loop.last %}, {% endif %} {% endfor %} {% endif %}

    .phpdocumentor-tag-list__definition { display: flex; } .phpdocumentor-tag-link { margin-right: var(--spacing-sm); }

    {{ method.name }}()

    {{ include('components/element-found-in.html.twig', {'node': method}) }} {{ include('components/summary.html.twig', {'node': method}) }} {{ include('components/method-signature.html.twig', {'node': method}) }} {{ include('components/description.html.twig', {'node': method}) }} {{ include('components/method-arguments.html.twig', {'node': method}) }} {{ include('components/tags.html.twig', {'node': method }) }} {{ include('components/method-response.html.twig', {'node': method}) }}
    // Search module for phpDocumentor // // This module is a wrapper around fuse.js that will use a given index and attach itself to a // search form and to a search results pane identified by the following data attributes: // // 1. data-search-form // 2. data-search-results // // The data-search-form is expected to have a single input element of type 'search' that will trigger searching for // a series of results, were the data-search-results pane is expected to have a direct UL child that will be populated // with rendered results. // // The search has various stages, upon loading this stage the data-search-form receives the CSS class // 'phpdocumentor-search--enabled'; this indicates that JS is allowed and indices are being loaded. It is recommended // to hide the form by default and show it when it receives this class to achieve progressive enhancement for this // feature. // // After loading this module, it is expected to load a search index asynchronously, for example: // // // // In this script the generated index should attach itself to the search module using the `appendIndex` function. By // doing it like this the page will continue loading, unhindered by the loading of the search. // // After the page has fully loaded, and all these deferred indexes loaded, the initialization of the search module will // be called and the form will receive the class 'phpdocumentor-search--active', indicating search is ready. At this // point, the input field will also have it's 'disabled' attribute removed. var Search = (function () { var fuse; var index = []; var options = { shouldSort: true, threshold: 0.6, location: 0, distance: 100, maxPatternLength: 32, minMatchCharLength: 1, keys: [ "fqsen", "name", "summary", "url" ] }; // Credit David Walsh (https://davidwalsh.name/javascript-debounce-function) // Returns a function, that, as long as it continues to be invoked, will not // be triggered. The function will be called after it stops being called for // N milliseconds. If `immediate` is passed, trigger the function on the // leading edge, instead of the trailing. function debounce(func, wait, immediate) { var timeout; return function executedFunction() { var context = this; var args = arguments; var later = function () { timeout = null; if (!immediate) func.apply(context, args); }; var callNow = immediate && !timeout; clearTimeout(timeout); timeout = setTimeout(later, wait); if (callNow) func.apply(context, args); }; } function close() { // Start scroll prevention: https://css-tricks.com/prevent-page-scrolling-when-a-modal-is-open/ const scrollY = document.body.style.top; document.body.style.position = ''; document.body.style.top = ''; window.scrollTo(0, parseInt(scrollY || '0') * -1); // End scroll prevention var form = document.querySelector('[data-search-form]'); var searchResults = document.querySelector('[data-search-results]'); form.classList.toggle('phpdocumentor-search--has-results', false); searchResults.classList.add('phpdocumentor-search-results--hidden'); var searchField = document.querySelector('[data-search-form] input[type="search"]'); searchField.blur(); } function search(event) { // Start scroll prevention: https://css-tricks.com/prevent-page-scrolling-when-a-modal-is-open/ document.body.style.position = 'fixed'; document.body.style.top = `-${window.scrollY}px`; // End scroll prevention // prevent enter's from autosubmitting event.stopPropagation(); var form = document.querySelector('[data-search-form]'); var searchResults = document.querySelector('[data-search-results]'); var searchResultEntries = document.querySelector('[data-search-results] .phpdocumentor-search-results__entries'); searchResultEntries.innerHTML = ''; if (!event.target.value) { close(); return; } form.classList.toggle('phpdocumentor-search--has-results', true); searchResults.classList.remove('phpdocumentor-search-results--hidden'); var results = fuse.search(event.target.value, {limit: 25}); results.forEach(function (result) { var entry = document.createElement("li"); entry.classList.add("phpdocumentor-search-results__entry"); entry.innerHTML += '

    ' + result.name + "

    \n"; entry.innerHTML += '' + result.fqsen + "\n"; entry.innerHTML += '
    ' + result.summary + '
    '; searchResultEntries.appendChild(entry) }); } function appendIndex(added) { index = index.concat(added); // re-initialize search engine when appending an index after initialisation if (typeof fuse !== 'undefined') { fuse = new Fuse(index, options); } } function init() { fuse = new Fuse(index, options); var form = document.querySelector('[data-search-form]'); var searchField = document.querySelector('[data-search-form] input[type="search"]'); var closeButton = document.querySelector('.phpdocumentor-search-results__close'); closeButton.addEventListener('click', function() { close() }.bind(this)); var searchResults = document.querySelector('[data-search-results]'); searchResults.addEventListener('click', function() { close() }.bind(this)); form.classList.add('phpdocumentor-search--active'); searchField.setAttribute('placeholder', 'Search (Press "/" to focus)'); searchField.removeAttribute('disabled'); searchField.addEventListener('keyup', debounce(search, 300)); window.addEventListener('keyup', function (event) { if (event.key === '/') { searchField.focus(); } if (event.code === 'Escape') { close(); } }.bind(this)); } return { appendIndex, init } })(); window.addEventListener('DOMContentLoaded', function () { var form = document.querySelector('[data-search-form]'); // When JS is supported; show search box. Must be before including the search for it to take effect immediately form.classList.add('phpdocumentor-search--enabled'); }); window.addEventListener('load', function () { Search.init(); }); {% include 'components/summary.css.twig' %} {% include 'components/description.css.twig' %} {% include 'components/element.css.twig' %} {% include 'components/signature.css.twig' %} {% include 'components/table-of-contents.css.twig' %} {% include 'components/element-found-in.css.twig' %} {% include 'components/class-graph.css.twig' %} {% include 'components/tag-list.css.twig' %} {% include 'css/custom.css.twig' %} /*! normalize.css v3.0.2 | MIT License | git.io/normalize */ /** * 1. Set default font family to sans-serif. * 2. Prevent iOS text size adjust after orientation change, without disabling * user zoom. */ html { font-family: sans-serif; /* 1 */ -ms-text-size-adjust: 100%; /* 2 */ -webkit-text-size-adjust: 100%; /* 2 */ } /** * Remove default margin. */ body { margin: 0; } /* HTML5 display definitions ========================================================================== */ /** * Correct `block` display not defined for any HTML5 element in IE 8/9. * Correct `block` display not defined for `details` or `summary` in IE 10/11 * and Firefox. * Correct `block` display not defined for `main` in IE 11. */ article, aside, details, figcaption, figure, footer, header, hgroup, main, menu, nav, section, summary { display: block; } /** * 1. Correct `inline-block` display not defined in IE 8/9. * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. */ audio, canvas, progress, video { display: inline-block; /* 1 */ vertical-align: baseline; /* 2 */ } /** * Prevent modern browsers from displaying `audio` without controls. * Remove excess height in iOS 5 devices. */ audio:not([controls]) { display: none; height: 0; } /** * Address `[hidden]` styling not present in IE 8/9/10. * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22. */ [hidden], template { display: none; } /* Links ========================================================================== */ /** * Remove the gray background color from active links in IE 10. */ a { background-color: transparent; } /** * Improve readability when focused and also mouse hovered in all browsers. */ a:active, a:hover { outline: 0; } /* Text-level semantics ========================================================================== */ /** * Address styling not present in IE 8/9/10/11, Safari, and Chrome. */ abbr[title] { border-bottom: 1px dotted; } /** * Address style set to `bolder` in Firefox 4+, Safari, and Chrome. */ b, strong { font-weight: bold; } /** * Address styling not present in Safari and Chrome. */ dfn { font-style: italic; } /** * Address variable `h1` font-size and margin within `section` and `article` * contexts in Firefox 4+, Safari, and Chrome. */ h1 { font-size: 2em; margin: 0.67em 0; } /** * Address styling not present in IE 8/9. */ mark { background: #ff0; color: #000; } /** * Address inconsistent and variable font size in all browsers. */ small { font-size: 80%; } /** * Prevent `sub` and `sup` affecting `line-height` in all browsers. */ sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; } sup { top: -0.5em; } sub { bottom: -0.25em; } /* Embedded content ========================================================================== */ /** * Remove border when inside `a` element in IE 8/9/10. */ img { border: 0; } /** * Correct overflow not hidden in IE 9/10/11. */ svg:not(:root) { overflow: hidden; } /* Grouping content ========================================================================== */ /** * Address margin not present in IE 8/9 and Safari. */ figure { margin: 1em 40px; } /** * Address differences between Firefox and other browsers. */ hr { -moz-box-sizing: content-box; box-sizing: content-box; height: 0; } /** * Contain overflow in all browsers. */ pre { overflow: auto; } /** * Address odd `em`-unit font size rendering in all browsers. */ code, kbd, pre, samp { font-family: var(--font-monospace); font-size: 1em; } /* Forms ========================================================================== */ /** * Known limitation: by default, Chrome and Safari on OS X allow very limited * styling of `select`, unless a `border` property is set. */ /** * 1. Correct color not being inherited. * Known issue: affects color of disabled elements. * 2. Correct font properties not being inherited. * 3. Address margins set differently in Firefox 4+, Safari, and Chrome. */ button, input, optgroup, select, textarea { color: inherit; /* 1 */ font: inherit; /* 2 */ margin: 0; /* 3 */ } /** * Address `overflow` set to `hidden` in IE 8/9/10/11. */ button { overflow: visible; } /** * Address inconsistent `text-transform` inheritance for `button` and `select`. * All other form control elements do not inherit `text-transform` values. * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. * Correct `select` style inheritance in Firefox. */ button, select { text-transform: none; } /** * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` * and `video` controls. * 2. Correct inability to style clickable `input` types in iOS. * 3. Improve usability and consistency of cursor style between image-type * `input` and others. */ button, html input[type="button"], /* 1 */ input[type="reset"], input[type="submit"] { -webkit-appearance: button; /* 2 */ cursor: pointer; /* 3 */ } /** * Re-set default cursor for disabled elements. */ button[disabled], html input[disabled] { cursor: default; } /** * Remove inner padding and border in Firefox 4+. */ button::-moz-focus-inner, input::-moz-focus-inner { border: 0; padding: 0; } /** * Address Firefox 4+ setting `line-height` on `input` using `!important` in * the UA stylesheet. */ input { line-height: normal; } /** * It's recommended that you don't attempt to style these elements. * Firefox's implementation doesn't respect box-sizing, padding, or width. * * 1. Address box sizing set to `content-box` in IE 8/9/10. * 2. Remove excess padding in IE 8/9/10. */ input[type="checkbox"], input[type="radio"] { box-sizing: border-box; /* 1 */ padding: 0; /* 2 */ } /** * Fix the cursor style for Chrome's increment/decrement buttons. For certain * `font-size` values of the `input`, it causes the cursor style of the * decrement button to change from `default` to `text`. */ input[type="number"]::-webkit-inner-spin-button, input[type="number"]::-webkit-outer-spin-button { height: auto; } /** * 1. Address `appearance` set to `searchfield` in Safari and Chrome. * 2. Address `box-sizing` set to `border-box` in Safari and Chrome * (include `-moz` to future-proof). */ input[type="search"] { -webkit-appearance: textfield; /* 1 */ -moz-box-sizing: content-box; -webkit-box-sizing: content-box; /* 2 */ box-sizing: content-box; } /** * Remove inner padding and search cancel button in Safari and Chrome on OS X. * Safari (but not Chrome) clips the cancel button when the search input has * padding (and `textfield` appearance). */ input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; } /** * Define consistent border, margin, and padding. */ fieldset { border: 1px solid #c0c0c0; margin: 0 2px; padding: 0.35em 0.625em 0.75em; } /** * 1. Correct `color` not being inherited in IE 8/9/10/11. * 2. Remove padding so people aren't caught out if they zero out fieldsets. */ legend { border: 0; /* 1 */ padding: 0; /* 2 */ } /** * Remove default vertical scrollbar in IE 8/9/10/11. */ textarea { overflow: auto; } /** * Don't inherit the `font-weight` (applied by a rule above). * NOTE: the default cannot safely be changed in Chrome and Safari on OS X. */ optgroup { font-weight: bold; } /* Tables ========================================================================== */ /** * Remove most spacing between table cells. */ table { border-collapse: collapse; border-spacing: 0; } td, th { padding: 0; } :root { /* Typography */ --font-primary: 'Source Sans Pro', Helvetica, Arial, sans-serif; --font-secondary: 'Source Sans Pro', Helvetica, Arial, sans-serif; --font-monospace: 'Source Code Pro', monospace; --line-height--primary: 1.6; --letter-spacing--primary: .05rem; --text-base-size: 1em; --text-scale-ratio: 1.2; --text-xxs: calc(var(--text-base-size) / var(--text-scale-ratio) / var(--text-scale-ratio) / var(--text-scale-ratio)); --text-xs: calc(var(--text-base-size) / var(--text-scale-ratio) / var(--text-scale-ratio)); --text-sm: calc(var(--text-base-size) / var(--text-scale-ratio)); --text-md: var(--text-base-size); --text-lg: calc(var(--text-base-size) * var(--text-scale-ratio)); --text-xl: calc(var(--text-base-size) * var(--text-scale-ratio) * var(--text-scale-ratio)); --text-xxl: calc(var(--text-base-size) * var(--text-scale-ratio) * var(--text-scale-ratio) * var(--text-scale-ratio)); --text-xxxl: calc(var(--text-base-size) * var(--text-scale-ratio) * var(--text-scale-ratio) * var(--text-scale-ratio) * var(--text-scale-ratio)); --text-xxxxl: calc(var(--text-base-size) * var(--text-scale-ratio) * var(--text-scale-ratio) * var(--text-scale-ratio) * var(--text-scale-ratio) * var(--text-scale-ratio)); --text-xxxxxl: calc(var(--text-base-size) * var(--text-scale-ratio) * var(--text-scale-ratio) * var(--text-scale-ratio) * var(--text-scale-ratio) * var(--text-scale-ratio) * var(--text-scale-ratio)); /* Colors */ --primary-color-hue: 96; --primary-color-saturation: 57%; --primary-color: hsl(var(--primary-color-hue), var(--primary-color-saturation), 60%); --primary-color-darken: hsl(var(--primary-color-hue), var(--primary-color-saturation), 40%); --primary-color-darker: hsl(var(--primary-color-hue), var(--primary-color-saturation), 20%); --primary-color-darkest: hsl(var(--primary-color-hue), var(--primary-color-saturation), 10%); --primary-color-lighten: hsl(var(--primary-color-hue), var(--primary-color-saturation), 80%); --primary-color-lighter: hsl(var(--primary-color-hue), var(--primary-color-saturation), 99%); --dark-gray: #d1d1d1; --light-gray: #f0f0f0; --text-color: var(--primary-color-darkest); --header-height: var(--spacing-xxxxl); --header-bg-color: var(--primary-color); --code-background-color: var(--primary-color-lighter); --code-border-color: --primary-color-lighten; --button-border-color: var(--primary-color-darken); --button-color: transparent; --button-color-primary: var(--primary-color); --button-text-color: #555; --button-text-color-primary: white; --popover-background-color: rgba(255, 255, 255, 0.75); --link-color-primary: var(--primary-color-darken); --link-hover-color-primary: var(--primary-color-darker); --form-field-border-color: var(--dark-gray); --form-field-color: #fff; --admonition-success-color: var(--primary-color); --admonition-border-color: silver; --table-separator-color: var(--primary-color-lighten); --title-text-color: var(--primary-color); --sidebar-border-color: var(--primary-color-lighten); /* Grid */ --container-width: 1400px; /* Spacing */ --spacing-base-size: 1rem; --spacing-scale-ratio: 1.5; --spacing-xxxs: calc(var(--spacing-base-size) / var(--spacing-scale-ratio) / var(--spacing-scale-ratio) / var(--spacing-scale-ratio) / var(--spacing-scale-ratio)); --spacing-xxs: calc(var(--spacing-base-size) / var(--spacing-scale-ratio) / var(--spacing-scale-ratio) / var(--spacing-scale-ratio)); --spacing-xs: calc(var(--spacing-base-size) / var(--spacing-scale-ratio) / var(--spacing-scale-ratio)); --spacing-sm: calc(var(--spacing-base-size) / var(--spacing-scale-ratio)); --spacing-md: var(--spacing-base-size); --spacing-lg: calc(var(--spacing-base-size) * var(--spacing-scale-ratio)); --spacing-xl: calc(var(--spacing-base-size) * var(--spacing-scale-ratio) * var(--spacing-scale-ratio)); --spacing-xxl: calc(var(--spacing-base-size) * var(--spacing-scale-ratio) * var(--spacing-scale-ratio) * var(--spacing-scale-ratio)); --spacing-xxxl: calc(var(--spacing-base-size) * var(--spacing-scale-ratio) * var(--spacing-scale-ratio) * var(--spacing-scale-ratio) * var(--spacing-scale-ratio)); --spacing-xxxxl: calc(var(--spacing-base-size) * var(--spacing-scale-ratio) * var(--spacing-scale-ratio) * var(--spacing-scale-ratio) * var(--spacing-scale-ratio) * var(--spacing-scale-ratio)); --border-radius-base-size: 3px; } {% set breakpoints = {'sm': '400px', 'md': '550px', 'lg': '750px', 'xl': '1000px', 'xxl': '1200px', 'menu': '1000px'} %} {% include 'css/variables.css.twig' %} /* Base Styles -------------------------------------------------- */ body { color: var(--text-color); font-family: var(--font-primary); font-size: var(--text-md); letter-spacing: var(--letter-spacing--primary); line-height: var(--line-height--primary); width: 100%; } {% include 'objects/headings.css.twig' %} {% include 'objects/paragraph.css.twig' %} {% include 'objects/images.css.twig' %} {% include 'objects/line.css.twig' %} {% include 'objects/section.css.twig' %} {% include 'objects/grid.css.twig' %} {% include 'objects/links.css.twig' %} {% include 'objects/buttons.css.twig' %} {% include 'objects/forms.css.twig' %} {% include 'objects/lists.css.twig' %} {% include 'objects/code.css.twig' %} {% include 'objects/blockquote.css.twig' %} {% include 'objects/tables.css.twig' %} {% include 'components/header.css.twig' %} {% include 'components/header-title.css.twig' %} {% include 'components/topnav.css.twig' %} {% include 'components/sidebar.css.twig' %} {% include 'components/admonition.css.twig' %} {% include 'components/breadcrumbs.css.twig' %} {% include 'components/back-to-top.css.twig' %} {% include 'components/search.css.twig' %} {% include 'components/search-results.css.twig' %} {% include 'components/source-modal.css.twig' %} {% include 'css/utilities.css.twig' %} /* Used for screen readers and such */ .visually-hidden { display: none; } .float-right { float: right; } .float-left { float: left; } {# this file is meant as a catch-all location for consumers to provide overrides without having to override specific parts #} {% extends 'base.html.twig' %} {% block content %} {% set orderedFiles = project.files|sort((a,b) => a.name <=> b.name) %}

    Files

    {% for letter in range('a', 'z') %} {% set filesStartingWith = orderedFiles|filter(v => v.name|first|lower == letter) %} {% if filesStartingWith is not empty %}

    {{ letter|upper }}

      {% for file in filesStartingWith %}
    • {{ file|route('file:short') }}
    • {% endfor %}
    {% endif %} {% endfor %} {% endblock %} {% extends 'layout.html.twig' %} {% extends 'base.html.twig' %} {% block content %} {% include 'components/breadcrumbs.html.twig' %}
    {{ include('components/class-title.html.twig') }} {{ include('components/element-found-in.html.twig') }} {{ include('components/element-header.html.twig') }} {{ include('components/constants.html.twig') }} {{ include('components/properties.html.twig') }} {{ include('components/methods.html.twig') }} {{ include('components/source-modal.html.twig') }}
    {% endblock %} {% spaceless %}
    {% include "guides/toc-level.html.twig" %}
    {% endspaceless %} {{ text|raw }} \lstset{language={{ node.language }}{{ '}'}} \begin{lstlisting} {{ node.value|raw }} \end{lstlisting} {{ text|raw }} \textit{{ '{' }}{{ text|raw }}{{ '}' }} {% spaceless %} {% for definitionListTerm in node.definitionList.terms %} {% if definitionListTerm.classifiers is empty %}
    {{ renderNode(definitionListTerm.term) }}
    {% else %}
    {{ renderNode(definitionListTerm.term) }} {% for classifier in definitionListTerm.classifiers %} : {{ renderNode(classifier) }} {% endfor %}
    {% endif %} {% if definitionListTerm.definitions|length > 1 %}
    {% for definition in definitionListTerm.definitions %} {% if loop.first %}

    {{ renderNode(definition) }}

    {% elseif loop.last %}

    {{ renderNode(definition) }}

    {% else %}

    {{ renderNode(definition) }}

    {% endif %} {% endfor %}
    {% elseif definitionListTerm.definitions|length == 1 %}
    {{ renderNode(definitionListTerm.firstDefinition) }}
    {% endif %} {% endfor %} {% endspaceless %} {{ node.value|raw }} {% spaceless %} {% set text = renderNode(node.value) %} {% if text|trim %} {{ text|raw }} {% endif %} {% endspaceless %} {% if type == 'ref' %} \ref{{ '{' }}{{ url }}{{ '}' }} {% else %} \href{{ '{' }}{{ url }}{{ '}' }}{{ '{' }}{{ title }}{{ '}' }} {% endif %} {% set keyword = 'ul' %} {% if node.isOrdered %} {% set keyword = 'ol' %} {% endif %} <{{ keyword }}{% if node.classes %} class="{{ node.classesString }}"{% endif %}> {% for item in node.items %}
  • {% for content in item.contents %} {{ renderNode(content) }} {% endfor %}
  • {% endfor %}
  • {{ tocItem.title|raw }} {% if tocItem.children|length %} {% include "guides/toc-level.html.twig" with { tocItems:tocItem.children } %} {% endif %}
  • {#{% if (theme_prev_next_buttons_location == 'bottom' or theme_prev_next_buttons_location == 'both') and (next or prev) %}#} {##} {#{% endif %}#}

    {#{%- if show_copyright %}#} {#{%- if hasdoc('copyright') %}#} {#{% trans path=pathto('copyright'), copyright=copyright|e %}© Copyright {{ copyright }}.{% endtrans %}#} {#{%- else %}#} {#{% trans copyright=copyright|e %}© Copyright {{ copyright }}.{% endtrans %}#} {#{%- endif %}#} {#{%- endif %}#} {#{%- if build_id and build_url %}#} {#{% trans build_url=build_url, build_id=build_id %}#} {##} {#Build#} {#{{ build_id }}.#} {##} {#{% endtrans %}#} {#{%- elif commit %}#} {#{% trans commit=commit %}#} {##} {#Revision {{ commit }}.#} {##} {#{% endtrans %}#} {#{%- elif last_updated %}#} {#{% trans last_updated=last_updated|e %}Last updated on {{ last_updated }}.{% endtrans %}#} {#{%- endif %}#}

    {% if tableHeaderRows is not empty %} {% for tableHeaderRow in tableHeaderRows %} {% for column in tableHeaderRow.columns %} 1 %} colspan="{{ column.colspan }}"{% endif %}>{{ renderNode(column.node) }} {% endfor %} {% endfor %} {% endif %} {% for tableRow in tableRows %} {% for column in tableRow.columns %} 1 %} colspan="{{ column.colSpan }}"{% endif %}{% if column.rowSpan > 1 %} rowspan="{{ column.rowSpan }}"{% endif %}>{{ renderNode(column.node) }} {% endfor %} {% endfor %} {% if isMain %} \documentclass[11pt]{report} \usepackage[utf8]{inputenc} \usepackage[T1]{fontenc} \usepackage[french]{babel} \usepackage{cite} \usepackage{amssymb} \usepackage{amsmath} \usepackage{mathrsfs} \usepackage{graphicx} \usepackage{hyperref} \usepackage{listings} {% for node in document.headerNodes %} {{ renderNode(node) }} {% endfor %} \begin{document} {% endif %} \label{{ '{' }}{{ document.environment.url}}{{ '}' }} {{ body|raw }} {% if isMain %} \end{document} {% endif %} {% apply spaceless %}
    {{ uml(node.value) }} {% if node.caption %}
    {{ node.caption }}
    {% endif %}
    {% endapply %} {% set keyword = 'itemize' %} {% if node.isOrdered %} {% set enumerate = 'ol' %} {% endif %} \begin{{ '{' }}{{ keyword }}{{ '}' }} {% for item in node.items %} {{ renderNode(item) }} {% endfor %} \end{{ '{' }}{{ keyword }}{{ '}' }}  
    \item {{ text|raw }} {% extends "layout.html.twig" %} {% block head %} {% for headerNode in node.headerNodes %} {{ renderNode(headerNode) }} {% endfor %} {{ parent() }} {% endblock %} {% block body %} {{ renderNode(node) }} {% endblock %} {% block content %} {{ renderNode(node) }} {% endblock %} {% apply spaceless %} {% set text = renderNode(node.value) %} {% if text %} {{ text|raw }}

    {% endif %} {% endapply %} \\\\\\\\\n \label{{ '{' }}{{ node.value }}{{ '}' }} \tableofcontents {% for tocItem in tocItems %} \input{{ '{' }}{{ tocItem.url }}{{ '}' }} {% endfor %} {{ title }} {% spaceless %}
      {% for tocItem in tocItems %} {% include "guides/toc-item.html.twig" %} {% endfor %}
    {% endspaceless %}
    {{ renderNode(node) }}
    {{ node.value|raw }}
    {% if name == 'important' %} {% endif %} {% if name == 'note' %} {% endif %} {% if name == 'warning' or name == 'caution' %} {% endif %} {% if name == 'tip' or name == 'hint' %} {% endif %} {% if name == 'seealso' %} {% endif %}
    {{ renderNode(node) }}

    {{ name }}

    {{ renderNode(node) }}
    {{ renderNode(node) }}
    {% if node.raw %} {# see the RawDirective for where this is coming from; a refactor is desired to move this onto its own template / renderer #} {{ node.value|raw }} {% else %}
    {{ text|raw }}
    {{ renderNode(node.value) }}
    {{ title|raw }}
    \{{ type }}{{ '{' }}{{ renderNode(titleNode.value) }}{{ '}' }}
    ~
    {% spaceless %}
    
    {{ renderNode(node.image) }} {% if node.document %} {% set caption = renderNode(node.document) %} {% if caption %}
    {{ caption|raw }}
    {% endif %} {% endif %}
    {% endspaceless %} \ \
    \verb|{{ node.value|raw }}| \begin{quotation} {{ renderNode(node.value) }} \end{quotation} \includegraphics{{ '{' }}{{ node.url }}{{ '}' }} {% extends 'base.html.twig' %} {% block content %}

    Documentation

    {% set node = project.namespace %} {{ include( 'components/table-of-contents.html.twig', { 'node': project.namespace, 'namespaces': usesNamespaces or not usesPackages ? node.children : [], 'packages': usesPackages ? project.package.children : [] } ) }} {{ include('components/constants.html.twig', {'node': project.namespace}) }} {{ include('components/functions.html.twig', {'node': project.namespace}) }} {% endblock %} {% extends 'base.html.twig' %} {% block content %} {% include 'components/breadcrumbs.html.twig' %}
    {{ include('components/interface-title.html.twig') }} {{ include('components/element-found-in.html.twig') }} {{ include('components/element-header.html.twig') }} {{ include('components/constants.html.twig') }} {{ include('components/methods.html.twig') }} {{ include('components/source-modal.html.twig') }}
    {% endblock %} {% extends 'base.html.twig' %} {% set deprecatedElements = project.indexes.elements|filter(element => element.deprecated) %} {% set filesWithDeprecatedElements = deprecatedElements|reduce( (unique, item) => item.file.path in unique|keys ? unique : unique|merge({(item.file.path): item.file}), {} ) %} {% block title %} {{ project.name }} » Deprecated elements {% endblock %} {% block content %}

    Deprecated

    {% if filesWithDeprecatedElements is not empty %}

    Table of Contents

    {% for file in filesWithDeprecatedElements %} {% endfor %}
    {{ file.path }}
    {% endif %} {% for file in filesWithDeprecatedElements %}

    {{ file.name }}

    {% for element in deprecatedElements|filter(el => el.file == file) %} {% for tag in element.tags.deprecated %} {% endfor %} {% endfor %}
    Line Element Reason
    {{ element.line }} {{ element|route}} {{ tag.description | description | markdown }}
    {% else %}
    No deprecated elements have been found in this project.
    {% endfor %}
    {% endblock %} {% extends 'base.html.twig' %} {% set filesWithErrors = project.files|filter(file => file.allErrors is not empty) %} {% block title %} {{ project.name }} » Compilation errors {% endblock %} {% block content %}

    Errors

    {% if filesWithErrors is not empty %}

    Table of Contents

    {% set errorCount = 0 %} {% for file in project.files|filter(file => file.allErrors is not empty) %} {% if file.allerrors.count > 0 %} {% endif %} {% set errorCount = errorCount + file.allerrors.count %} {% endfor %}
    {{ file.path }} {{ file.allErrors.count }}
    {% endif %} {% if errorCount <= 0 %}
    No errors have been found in this project.
    {% endif %} {% for file in filesWithErrors %}

    {{ file.name }}

    {% for error in file.allerrors %} {% endfor %}
    Type Line Description
    {{ error.severity }} {{ error.line }} {{ error.code|trans(error.context) }}
    {% endfor %}
    {% endblock %} {% extends 'base.html.twig' %} {% set filesWithMarkers = project.files|filter(file => file.markers is not empty) %} {% block title %} {{ project.name }} » Markers {% endblock %} {% block content %}

    Markers

    {% if filesWithMarkers is not empty %}

    Table of Contents

    {% for file in filesWithMarkers %} {% if file.markers.count > 0 %} {% endif %} {% endfor %}
    {{ file.path }} {{ file.markers.count }}
    {% else %}
    No markers have been found in this project.
    {% endif %} {% for file in filesWithMarkers %}

    {{ file.name }}

    {% for marker in file.markers %} {% endfor %}
    Type Line Description
    {{ marker.type }} {{ marker.line }} {{ marker.message }}
    {% endfor %}
    {% endblock %} PNG  IHDR:PLTEaY+tRNS/_?MOo ثKHuÓ'*zǽ̎sIDATx^흉r8h_fMp+̹J`pjt**qo }H)B~uY-o2Jl!aOpŷVcqJHR`f(WQY&)A^蜫/dկqX+bFcOS!paTUJwpIdt;fX^d|M/ LUZk!k [s#v[n'//j3Ǡw_ _/UOT=S^QooR;U|*Ugi[YsTfgXq}ہx?] R5j*IrH;z] Xȕ~(O+AEjSJۿ͈@DZT THUBGHl;??_v8 ށdg( _S@RXcx }Ș{vˎ+N5=ƥM^{sgcq#ϖsw*͖S}Tɒ+6L1ogl~ryenc e`5 u9!C0T 5j\]r.q_9p*߅hSm%a%T-JS>pʿO*)<$TerXK]ՕSgBv!miGzkdͫKJX|7ˑj:q36kqt8GՒ 2NSϹNeȽk[1_yT9NFKqpίňjQ`(TDʤ4D\-/- 6~T=Vy* AJFFҤq!/ b3C}@ط f-5jמ)$'@ހc|*䠯z@Z+ >#)[~OcDq_ux;E5{3)/Ry!"_T=MZ* FGfF8qo3a>8>NvʑF(4zQ}7T[~^i`>^CQF80KO\s%t5TUi:7Mq"@,\Gy幞jã<([omխsk>*"Tg'@q,ƙ#\g ْk̖:[uKWt l)%8UGW[߫JuV6TϻTUTӸuUG̾*귻 28^_uu1U1U.|'KH!ʋ,ozj^TS)I9gG=]k#|Du֩z5pru7(f?<-#e ՚zW߉EYE1m2oӳrgʸҚOv*VlS=YlP$!<.QM@OU>g6KPVlɬԷ>["vm0 ?>=Vhoٱnw!̰heK\@ҧKO<7z\Sgρ8mTR?7 mkޅ5mUۄPz?Sݩ|ϓCWY]]]]]]]]]]]]]]]]]]]m ]n_C{.[ THR#k0]bF>RˇZ~d @=xd~S0 @RvZA4-SO.a*U֠ $910v{Oȥo%9+f.@@AN3<0X~WT.o|p}0v}'~Tac1Zv^Lgu|K ?Gj1',UU_dTalL]~:C=CP4J`°Qݠ2 &nz&CDuJۻTa* ŧPe26T0}Q 'P D[Ne@:|*Ws|q]i rQZ#pcZ.俩H"?:xIpU[ 5ӈjLq SIPig*O{U׿W =[ `O7|Z|9% ):d+'Bl=EZnziՐlʺ^-0O+-\[|^Oi˷-oyoɾD%]dxg.z|f=>*8mq~_e2ɛ25]A5:"#Jyp>X=4+~"4VR?C0<.ޢj@tK/ٶM5zyDs7yKYFkݏAW%#Z$zjqkosEDB:HoiM39_,tt#Ύ޲6b=O;sG9Mu|qXO\ԍ|6yDG>G /"Pn?bO3v~1G{UT'W(|؃X+='Um*e`"N+U%JqDlߌ瓳T!>Syc%qoa/IB~ZxWJydFGj5fKlz+. bUoU͇ 9 Hqx˳Ϛ-}IW6H/J|ڜ ]^+kF]=}N 48E5r2ryVSe]oD/E8T3E &./g믿ַo|>ɭ?l2:cE0?EAkA쬣fsy??'u`D!h?*bƅQ,UmxO)zk{71LY&/7:rJt!PPC|39\YRea7r7ztyj}}sGy*{e]do}fX\3Uj{^`)z/7^V9.$`,LIu0SeM{xFydQ=JnߴJ&z Lot*&Yli%r*;ݢ)K5,U%{Lut)z|d?[QAF8g4vXQA5. {>LK9iDʥuG TngKȴg ") is յ[o&~ZS(DMʀ*i+ʔ`\; s敍eh+k!~ J.lk6S2S7\3U1S1M!9f8g/P.S%>l3MymwPX.M8ZsH[<]7YP^Y\'Ao(>g0U*L0Y7e0N9Vv *`.K$?p!9d)I/P2\2Kx8W7Xr{)7m3R8Q~(?g!2R/Q*?h8Q|0MNZ8S=V(?h&8X3V)Cl5Ox>[!3cUfp8U*Fq+Bi$6X0Cb5Ov=UOiFd1@jC`Ok9Qy*Em+?]1Ea6QuD_=X~iLkMkMkIk`|GbA[>X8Lh(?a>UvEbHaQnztId;V|Li>Uv4IjF[}KdJdNjLgUsRm;a:aQmHiPkLfCZ~JdBUw.D]ToRnLgOmSm[x[xNm\yPlKeNg?Vv/#%*0KcG[IdGaD\PgOgNgG`LeJcF\#&+1PNG  IHDR;0tEXtSoftwareAdobe ImageReadyqe<diTXtXML:com.adobe.xmp '5rIDATxڼJ@ ȩPBO>'oP PT]KWAxJB^^+82&qevgdv6^i匇hb֠GY 4mpS9^*AO*i1oʂ 45I%\N)W2/-O:=1\+OY+Ǣ&f6ŏH0憹DWgϲKخ̿7 $uطm00_TcP m|_J㴐'@x]:ϕ+y2K⹂Kb\+õy1p?fTC ri|&->}p!ZxTQYBpMYO\x`![ X{V>L s euIDATxb?@&322RĘ1`>f!4mP3TvbU Yhd`nO2jCb`Vb(ţӿE?:^G$$S`IENDB`PNG  IHDR;0tEXtSoftwareAdobe ImageReadyqe<diTXtXML:com.adobe.xmp TIDATxW] 0 ^& C`[{l{u-ڴn!K.p̲3TM+I^m[rUb3)GjGC!~JĦoɉK7[[AGq׆jczi$Xh3qXIafbt\feNMtfM"u>XyR1Ub !!PgKWi(qQsĵ%!Ֆr%I@}cٽ,>-IENDB`GIF89a,9X,L}I(d*2\%RbJ!QH3 B ;PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<lIDATXŖ PUBN5Ze9YdiB%MSGeqFAŔU 54aE * .*A ewYXXe w~Ve'G|9˥T!Lg#b { R/a }w]Zc(RqzG3KCU T u < a_<{*} yi.n#2w0B1지se|D5և ~d}q$p&=C`TOϗnwN+S^ cqD3Zӻpb744.6%4uHT!B/'d|NTYL D:"aqQ&k 5h&YMpV@Pb Be.cx7]`\Y N+ިE;k֕:ߟU@pr)G߆G[+|O)E#)$ E.,;)?:OyCN'@5CȠi8,/k^s$1seӜW7vJq$\-i@lkFܾ̒ķ=+\Tǥb'9#@N#d;͡wAZX|32Ьp+ -mX|t_ՒKB5 )i*8Dqo3{7:={)vuv o)&`y''%l<ϧ `)5IENDB`GIF89a,$ڋ޼{ Hb&Ls;PNG  IHDR;0tEXtSoftwareAdobe ImageReadyqe<diTXtXML:com.adobe.xmp IDATxڼJ@ ȩPBO>'oP P]KWAxJB^^+8lvv82ٙ/;ٝ]UѲ,s C4@1_@#_J@[A[KUd]Г c`,盒0]F6iDT=[_0 fۀ%]c)8}vDS w)6sQ> u qh$s\OW瓈zkIy+ .{?/ xYIP6~+ɛմ_`s ex؃.Zs,l\L9mϱ\"Njc4(,~l%YȒ5/^ٔdCᵂ~#`|4]q0p=#{u]W YWyIENDB`GIF89a,>Aqy[|I(J)(^]Cax4!\Q;PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<wIDATXŖ{PUj:VDQ:IiS6854MJ!M "7@4P,yInˮEV . + {ݥEL^><1lq KZS<:mgq w ^~N1S Y{qW2ݨ;bYП%J%P݋׭2D2c*D[OoSsܒ(]{ [.p~!Lp,c%̱9ow^ 0\\ G?!v8=j V~C9@UT\9.`1E&3P28`=n; XxBABNLB^HpOHj 6(b84H1oʢ+*&/Xv6:Ƣ)s]_,`4TVGo&_ 6 %Y]Ah!f"=5bp,8=\ScOИ`11b U G\þXBu%Aq5Sš.̩AL+Bjؚ۫{~E8M9GlEne'"UPf0[o #W {#ofP+"2JYS/_׉j7}ZH-@Hc25q2>R,y:4a u'Zw'),z+WPTݮY) Y_>[t܂/?uz)2ڐxDT U0N-kHJ`MST=߀ }(W4Wu*].źLO5+N\&(+ Մ!R¦>Gz$o29 Ppꚅ1r%\O,;m37l xЅtV܇fp٣P\KMEh`&VB#//k reYƶ>T]xBR(O˸uUYn%u)dG Gv^5Gv y =bc'%C]ۂGoaޔ(cy* )mnFӌiƚP9?c4Ӗr-IBu?Ks' OdX!=p0זoj?p)z%&֏00a{Mϰ/%9>/_IENDB`GIF89a,Aڋ1q=`xpz33屯?ut%iɝPXD3Ԫj; h(      O h(      !!!              PNG  IHDR:PLTE333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333gT+tRNS/_?MOo ثKHuÓ'*zǽ̎sIDATx^흉r8h_fMp+̹J`pjt**qo }H)B~uY-o2Jl!aOpŷVcqJHR`f(WQY&)A^蜫/dկqX+bFcOS!paTUJwpIdt;fX^d|M/ LUZk!k [s#v[n'//j3Ǡw_ _/UOT=S^QooR;U|*Ugi[YsTfgXq}ہx?] R5j*IrH;z] Xȕ~(O+AEjSJۿ͈@DZT THUBGHl;??_v8 ށdg( _S@RXcx }Ș{vˎ+N5=ƥM^{sgcq#ϖsw*͖S}Tɒ+6L1ogl~ryenc e`5 u9!C0T 5j\]r.q_9p*߅hSm%a%T-JS>pʿO*)<$TerXK]ՕSgBv!miGzkdͫKJX|7ˑj:q36kqt8GՒ 2NSϹNeȽk[1_yT9NFKqpίňjQ`(TDʤ4D\-/- 6~T=Vy* AJFFҤq!/ b3C}@ط f-5jמ)$'@ހc|*䠯z@Z+ >#)[~OcDq_ux;E5{3)/Ry!"_T=MZ* FGfF8qo3a>8>NvʑF(4zQ}7T[~^i`>^CQF80KO\s%t5TUi:7Mq"@,\Gy幞jã<([omխsk>*"Tg'@q,ƙ#\g ْk̖:[uKWt l)%8UGW[߫JuV6TϻTUTӸuUG̾*귻 28^_uu1U1U.|'KH!ʋ,ozj^TS)I9gG=]k#|Du֩z5pru7(f?<-#e ՚zW߉EYE1m2oӳrgʸҚOv*VlS=YlP$!<.QM@OU>g6KPVlɬԷ>["vm0 ?>=Vhoٱnw!̰heK\@ҧKO<7z\Sgρ8mTR?7 mkޅ5mUۄPz?Sݩ|ϓCWY]]]]]]]]]]]]]]]]]]]m ]n_C{.[ THR#k0]bF>RˇZ~d @=xd~S0 @RvZA4-SO.a*U֠ $910v{Oȥo%9+f.@@AN3<0X~WT.o|p}0v}'~Tac1Zv^Lgu|K ?Gj1',UU_dTalL]~:C=CP4J`°Qݠ2 &nz&CDuJۻTa* ŧPe26T0}Q 'P D[Ne@:|*Ws|q]i rQZ#pcZ.俩H"?:xIpU[ 5ӈjLq SIPig*O{U׿W =[ `O7|Z|9% ):d+'Bl=EZnziՐlʺ^-0O+-\[|^Oi˷-oyoɾD%]dxg.z|f=>*8mq~_e2ɛ25]A5:"#Jyp>X=4+~"4VR?C0<.ޢj@tK/ٶM5zyDs7yKYFkݏAW%#Z$zjqkosEDB:HoiM39_,tt#Ύ޲6b=O;sG9Mu|qXO\ԍ|6yDG>G /"Pn?bO3v~1G{UT'W(|؃X+='Um*e`"N+U%JqDlߌ瓳T!>Syc%qoa/IB~ZxWJydFGj5fKlz+. bUoU͇ 9 Hqx˳Ϛ-}IW6H/J|ڜ ]^+kF]=}N 48E5r2ryVSe]oD/E8T3E &./g믿ַo|>ɭ?l2:cE0?EAkA쬣fsy??'u`D!h?*bƅQ,UmxO)zk{71LY&/7:rJt!PPC|39\YRea7r7ztyj}}sGy*{e]do}fX\3Uj{^`)z/7^V9.$`,LIu0SeM{xFydQ=JnߴJ&z Lot*&Yli%r*;ݢ)K5,U%{Lut)z|d?[QAF8g4vXQA5. {>LK9iDʥuG TngKȴg ") is յ[o&~ZS(DMʀ*i+ʔ`\; s敍eh+k!~ J.lˣc6c6c6c6c6c6c6c6c6c6c6c6c6c6i>ėyc6c6c6c6c6c6c6pGc6c6c6c6c6c6tKic6c6c6c6c6c6pGǷZpGc6c6c6c6c6c6c6c6c6c6c6c6pGǷZGIF89aZx➭s-҃h$Ç4,7H`KPl\:pL )e9@\"l:+PB;PNG  IHDRc,IDATx Ez ۯ$n h<("N#Ũ@W/*.J@G_ k"y% 8Y,V 'K|nT8ZqdiU&v U'PY1=& U#U݊QCM*n=fג}*IENDB`PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8œAj@E_'AA8 SA67pxҳ,A'&E>4TUSU$jSyށ[0;I1/8#ue/W`7Ƈi~Զ$)" P|ߟKXH֒)$Z&T,8xTQk 2 a( <*s߶9MӐeO=O|n9  H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-gAMA|Q cHRMz%u0`:o_FIDATx̗mlE{Σ/^/GE[   F(񃆐cŨQD>Q%&Q Fmy +zngٖQqg?B),"Z7 nzܟS`"!Q&hlml >(IJ;MO֚@h潮"Y+0BIRa$ 0]1"M.#( JP*yom29CC-Oh@wa(2؀YeD0> dB[y ͠aáHVr8ㅰbb9԰^Bo5D>7^i>5*&?eؐ*94tӡKK TυxB}fVzv;*)@P=8Gfͪ~ \]KjJ5>r [MLcB8Ƣ۶-\6@BqrlYb\킜|E)p; 7-567";>22a(N̊gtVa;tm" }YsY\/w)԰$>ıG ijϊGVSMy` J~ ̧ŷmԀgwx4iQͿ@B$͑1H%, :?g[NtxyyلC9+;г_)#Jy3e%s'ct*d9.] S3{9W``};: >Ƭy.AvM5lq image/svg+xml Co GIF89a 𵵶ݺ! ,EI8[s/f,^ W\߄xh%@[1 J3@hHW";PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8œN`hM.nMnewqg!%tjB <s&4\XWWE+ ` \\a(QI\kǯC~H۶2i)1F4Z+Z1= c$IDzgǷ@euR(m0Ɛ;G8W':~iߎg؜4ʳ7GΏIENDB`PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8œ1 PDFH[zxmRi!c7$`$ ?'xK뵤8zQ(j">W`{~THtʪmC`fr98vikLI 6)UUEeE1z<ǬcaGs`d|S>:&ӻ9gO~IENDB`PNG  IHDRa MiCCPPhotoshop ICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/%ҟ3bKGD pHYs  tIME&PIDAT8}kG3{ssosMjBRTP[Zčv#bݸu!..tU V;7I͇Ixg9]܏. ss0f} ^}5_\>r򞝚XXK۩_>x]߇*;3ڊRiqw޻pqu?=?S6 é|>yb[ zWb8D E^gnNG?|  bDu؊V\cخ=izYs!"FJl! F=et/ifD=5A !L͡=i;;rT#Ah ) w7bZ&.+݂@nkjFkRCiKn66-Iܟ rKsK%QC+{yOTTg75+pACTQ3>D%O2&0SOoXơFVoq=ʮҍƧ7~厙~>usqu_ј5Otu[\t|GۍsM~ԕ$HRk/ I IENDB`PNG  IHDRasRGBbKGD pHYs  tIME\sIDAT8˕˫RQ-# H" AA"Ms05 #  ΤfgR"&MAc}IO#wM6k>ZD4"pn?T*դlCҌ[!Fb$Ih4.L gA4 pX/WշT*<@~p\D"!t:l9%f(w çD"qfJ)TUjzzsx^||r 6 E(c2R`0PӴL1ctlA;^J)L&Ǜk  5UUJ't:Aj$It:p\.ZÎ (`AE8VzodY~'f3v;-~V}nNZxv: 9GȴIENDB`PNG  IHDRa MiCCPPhotoshop ICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/%ҟ3bKGD pHYs  tIME&z;n7IDAT8}Oh\UΛLf$iJ@Oc)PE4)h B.qeE((,?(D M6ЖhH$޻{\$.z79s8<}@p+HNո8Sᩱ[bv{iOqo}776jf;WϜ=! "F"D1b!(PI>s"RWe=Q H\ Q+h_ZX[΋fP=G@ Y3Wz8OMBLr4"Q༫7VfsKso[\#I̼X1ɻ"u+ձ'CuZ:-TA5Uj4⫞ol)齯&95^:3M`prJ2{W-f=F3%8@kxZ'@1FR4[9C|lm.]D\cn?/ 8FNq$ɷAIP0Hɦi²,0iDQdAJ|mTU&2t]$ILPT@IMIP[5AJ(Je%6O(~0[dāa(*yUtOлM̾_ ^I P%4UUoVNcc_E{v_B|NuXתA"*kfB"_0-K?6љc.oal7.`Z:g|)bbܬ*āG å2Da.a2A$tCʘ?IENDB`PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb?% X@ĄPFd1U 6b] =@|o@,hzF%X Iq0˟]~n/ T pMSPadeOCV@R@㼰̹`ny*,c/? /ÿ_@WGJKVQ)U`h tO&o 00#ß  L|zpb "<3Ue8s )X~ABW 3@WL%^4ÙKOL4| G88a1@L !&ZB >õo4ϯ  `6f7|`O }`0Vegа^m??^zfVW&зafx`͠ӧ7oJ%w- ,$geȫ!aa> ßw|3>|t̵+Ϟ=_Kwٽ[F"| ,Woo޸y9D3<)z^ͻ@LTfb4;-)oypIENDB`PNG  IHDRĴl;1IDATx1 8A&:=`cc^oZ! r(TIENDB`PNG  IHDRasRGBbKGD pHYs  tIME&s"|IDAT8˅OlLQΛԤLjCkJYV] $D,!DN$,6AXI"HFjռk˂ι!AWkYӴ! =?pSr7N'Gj.ZVsYoGxL]Yï;9*d6x;<[*Z1`Cp.9VtY~K@BTydkO' ن !HNyhkH574~_*ZPL:O0XUjã H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-gAMA|Q cHRMz%u0`:o_FIDATxԕLuE $Q^㥵u 7Lw 9;ޮY 3"KY| ;gڲH/XEm v2^N%(B-sB>w}3Ύ0N;dH3)Am u=8TJR@umЬ'tLuG:_j n/B3S&/#) Rr252C WOeV4ƺs$Dc'7C܎/!) ҖTt2 'uۖN U*Ǭ,byw$D:xlzja&"O`ܿHowAeb2ө"J'蜺;Vfsc$k:q\ik6ug CCH9/8m,g sBP%<N@+clտse h?ܬ jNAOD0D]9hZ8q}r贵9\l2n v^;z>z ;3c2p+vcƨgQyͳNl0U_Yyr2~>IvĺdS's5=3Qp\{IENDB`PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<mIDAT8œ"Qkz@N&A|#&ML|IhHA` lM1Seofe=PpOpVSgKT#O %}#cXm⧤~Ie9˅nGP#y!I$I6 Fiu2 aPpvm=IUV ȋnqjbxqC0"d$: HyÁVeY4M,zM:s:bƂ$Jٌ v%STNy5L$ER5~=-A(Hǣ$0I Q =лIENDB`PNG  IHDR99sRGBbKGD pHYs  tIME 'w+( IDATh͛ygY?;ɝr3s!B$L-jŪ*TV*HQZJI Had2sr;7S\mWZ^}vd?7~[^ZJV^'(%"9k!HHcDb@+Ae9)ukO 2@$DB@RjC!SBb6W899}1Eδnfyg ͌lll2DT",ۖ#* J {\Ca,6ӈ("Bn#5>%1Jȵ9U@+ Z4my1ymw_<ے`\դ?klgcgD41D ~Fhں*CL=.E^ EaIFC BS;Li !RuD%TuKY kA%v3z[ǴVJ\ۦ2+d볲wp}Cnz˯2( t=zsk^[?\/>yEZ"OJ+IB-F $eYbd9ܢ1y -!2'5fX 1 tgdGC/5J kOVcRgEVӴ/nx+=~ݷ߾q/}ݼgG}4 )wH<ˈ)CHh1Fc IVi$J. (52BHh Z(f4mK(ȌYScAk# Qc ^:|\/z5ğW j~}ٹ+&ֈQDiф %B̐sSN-uV@(kIa"5{5DcEnR"&(&&hۖf"h@iiӦ^a:o 痗ГG+ hΙ1%4-) \̚ !3`lwmh!ALhcNKHX!ѓ$G5QZCJn"h! T&31Z#$TӔ 1l>p@/>3ݷR}(%F+Ci!v@)oAYb I  EOBKhMBA(Q݊fx %EA ڐ)RBSikj3+Y#((!){VnW-M'ILF RIgR;ZI1:zJ =T%m wh]$K<'E͘ԳiWyFkoBRV8QD$zB}ĘD5RB Mgt:\sOXH}Y)P$ZOfef)rKV55H kjFwA F SlG2Z̦yBT/zT ZV!dJB@jFk2IiՁBO;pKg(@ ×_ T5_3];9\@ Jw- (I4.0mZ<((mHn=;q蹲du]~/Z`c{mSҌ&Ak yf8>_~W&RuT,)9bT?#i֟~X i _(IO Csoa~)_|O]>zI(lF4(V5hm([e"ɴγ="Y'On J+BYK&~QS͏sHBd_yϰ+ɐtNFYS3<+вpsӏ~s~ /7'7 .o䢋Qxpkoe|ŋI)PW4ш (M %BtC/IP)cˆhE#9ƣZd~_| ?@C_hp-" "!vAKE[)D)MgiiMkXŃy&HR6c4p*dR7-VDJ9?m|9N{hRJnooQM{O~Z 1yȔh HBµ 1Q7 m1|4=) 1(dZfu}/{|/a뙇!fuUB!Sؘpjfc_.~<5.[hӆD=(_3N2OZߦ3ZDh*]K :2QA`Ɛ ʒhE׿$jS-Jmy\S:\{O ^[c\|-a flL01b(EjZ*oFNG۸[I 3^wˋλs\5˜LVAn:k<ŸM,#(yOc\RӸރ=gqMpƾw6go3_GƘ'~@ϗY ŭ.&Ȯ(ҡD}t<i.` zmzYpk䵯Gș_p}#}?+9c_^.)<;Z}q%/Ax[3(EI|{!e[GDh}H=~>6M/+[Ch@R# L~V,6||ѱ'IR^d<앯GsY9t!cl|n'y37\υW_ó~/Ɨq%/IJf 78"p]w!yB#gǷc L;AhɋX:x'^_sg{~k?·_*6Ngo=1 F?+{XY^C "* 4 0Y4F"Fm4y=\(lV1X%mU3X9m:r"Gx\p%7>r;<.. xs,Ɉsrknm,/"g: zYH=sg,wAXV8;bM")M:}`4R5UPHm#sP$b1V ̛緸z ?¡. s6OK.~=2\׼s.#}\v L[|c=2H)ҳZtXʲdn u눘ऄGt`Z| x'[K6slg(Ҿ,?@GhUWS/_'_Jzbg׿h/L^l}3/7o!hWZե CRL"%L_͐JI_B;OY\P=]g0WFZ^-WbϻO~ o%ώ)Ko>sOY^3W^ K|6mMR(cvPJ(:RI2 c [{?l׿'Y9s?x?_ݬ> c*:7ha AF>TUR֤]s Ѵ&Dwv"ňI b+HhҬlr&vFLF#,-R~Ͻ\SoE>ͬٯw}99Iaѡl ȗʷ\3~J ]( ou1vwxO#&H]WĀ:Q(k q_lyMfƀ2P[w|fsdLjVy/.@Jmy AiO#XJ(JMjrkȴBIgufU\b90y[l>?/z;a1U7?y'bkl}z/_:_J$BL*8zbTk;8O UնX[gsgx2m]y1|'\{c{VEe<'I+hqyùc~)CK"DK99Wœ&5g~@EK4S{OXYo5*FBP"(e4OĔP)J(eW7VBg?9,@?mz Fd65?hBdI|DlsƉ1-9GrMӪM~g~$ a P9 L 54ՔEv"L%r2y9pG፷P1xus> [f.a{rُ8.vy讯ro&lO`m2ApV!ư8qc\#o7\ e?cs8%xҊ,/ֲ0g56tTL^~gS"ӊ̉gw-*&s ב;~nzT4)DF ZN}$p6O?> a$;;lGچ1Uͭ-q=7ߏWiIsǓ Bٜݦs}VQ¬hRgP]*<.-^q)!۫sJcR rؚ\| -kkՌd )2zEF!ԉ` g◘YW{ɯ*6;;VuDQfǷ^v=[dzm4sdF#7^.&uw5[W9J\q<''q" zc eZLGCmJJGY۞?b.!*c+Z: )&xT2ڼ@+u-n=wy+7>}/_*Y,3z g;am-!Aiѻ(FCk4;#&S孿0_* 8&f +z5M; VhmP6CH۩oӋy+[' sgtdk,hexB`]_˯a"{WǾA%_d5!$,q-6ĔX`V"K\px'HQDwPږ-tS'Jb$DL6v"$dJqdM_{-sgZ80F[Kn sEof)f(Ҡdei6X]R[8ha0^b{ud:e"Y/c̃,Y_u0&OZO|x{|x{"hSn#QZ iږi0i|g܆3qo4>x"ȴ<4zLFC&P\ ø@Ahyg9l|N3acgB"n6WVSD445(EQûڤ;UU|R*Mi 2g{{a:/ T \CaOK_9pޥY>c %}B1g󙓜|iN=k?i~vIWӧRVb-zE[ee-фHb)k t`ЄHI1kiLqR?&D rj76dv{b !xOMoVI#(J꨹՝:i+l4-ǎKLh7R("@d0krkA񗘄=Ӻ;@imv-i}m[<'bk4B8CumJ\"I5Y"0:5l*ɳk/VlEl77Sse rw0ڒ4">.Zn$"Z[|Hp13ALxI:6;eXs URO 36&CO 0޵>:g6RY*7MsZmiBJRO{TTu~p BJi]k28ZSdR5 BQdh}dV7 eJֆJ"SuxS{Ut#eMz8!&Me"ƦM)tFPmm=6Pi5 RW ! y.خ| Һsu!yZqz/ f$4gԷOl70id=%qݨ6{Kw_fJ+|ՍMaw;rT:(X(MVkfń1u$kiCi0m=n{GЄDTOokiJU]I䙍ι}F ~ugֆ=ƽ,]}xsN}HT5Z1#B۶Ѱ[$v nn\}H4$mC6( EIY^2*`4ܦjy*?~c۳o_A{K&XN)4p8._-IDATzХߦΊ@D}XRIENDB`GIF89a\\z\yӗߴ! NETSCAPE2.0!"Created with Chimply.com"! ,\\h0I8ͻ`h dih)VCp<3 ԴPfNx&h;piSiK0RjH$|Ϣ:vJS,R( E;G {O. rޭw߿ È+@LJ;Lyd3YsE)se?E.m2Ꜫn 6jܿw[6p‡'xʗM3S;;SÆn|+7|7_Ya7`Z}6lj܁mg g Wjȡa(A! ,\\h0I8ͻ`(8hCIp,s,U|PhO:a#.\6è47VXvz}lLF@is%_zN`y{s~mpjdga[^XR_r|kuve]yLPn;OGVFJNSY-t.17Ák0 \0Zb;YdWō c=ܘ.䭏MA Q% ]I84kޤkH A t M=tիXj ׯ`Êݺ@ٳ_X˶۷n;Vܻxʥ˷ڼKoD5 Ἁ-f<㻑 N|巙n\g&d@ӘS~ڬgzegtP4n 6"j6򓣗7?|et?Wywg*_8K[nk?~uY~ٷ A5P/~_k!VM[ `T݀iY (S ! ,\\h0I8ͻ`(di%lVE,ϴL8=<0UaMId6:#PʴYv>2ꍁѫqS=?te~lm}p|^hAfXwxkmnvDu8{aK~(H$ײW3T_ݴHM>YHp"C],~)Hlɖ^œI͛8ɳϟ@sJH*]tiP*hJ*jʵVQm'-O}'e7PxlX~ `di=%N9eF! ,\\h0I8ͻ`(diYl+l[=sӕ'\"l42ISyFSdl?0歹xpWjsdn9sl:oun=kztv|{r2xC@~-) ºǾ̹̩ҨɧpG` COa=Nb:,8O_@{ZӸc;yeJ&Lh59xY}*t(ϢH*]Z,ӧPJʴԫX6ׯ`J*h>۷p@(K7ִxܺdͻa>;Ç**1J,e3z֜tgƨA^=kӰcn@ۯZs7ۧu}uW7/ut9W|=s-w]q#~~pzw̻u}?]+jfb}_eb&(V*>UՆvᇲ$! ,\\h0I8ͻ`xudhi+p γWpHC:NrijFkB: x꒬B6=5su~@9]5yb|}p{x}ZztWQOlwsejuRn;ƾ ͬ50*ڽSo :0&h0D :)te1= Kkɓ+42̕(IXC9[|ϋE;x/KMA<*b*իXjʵWŠKد̪]`۷pm]m߿N{p޽B̘1v'۷e!<˖3k.˹3ʠGցiʟS מV ҸQK7‡(^Ùvn飩O.f퉹x9^2Ha$K<ʕ:ztR KQ4k*N|JKK24cʥHUL|ȩ%^ R!X#úS8ʝKݻx˷ L +6ǐ#Gfƒ3Kue˘5&٩ϋC\ԩ!i؅Uφ\kܹe,ou']q䁕9t黩lA|Qɏ64—?f/=lv>z|4E`}VAП8~هAQH? ؇ ($h] ! ,\\h0I8ͻ`&di蹀l9B,t-7i0PM:o4\OgqZ[,1*-h`c%8xN/9pzj}1m%L|4Ty}ztwqknhbe_Y\VOSKuHP<Ǎ ʐvͿJCRiGWF.~ ͊"/{ H*\XpÇ#Jċ+FBIR$?\I$J*Yt2F3'ԼgI;!9hPC4z4RASO5RkN G#zeؕeSTZTgXk.ub\i9IdžuLÈ+^̸ǐ#K쀀˘3g\Ag -@Ϩ-Mi S;ؠ%n]6ͺ{~ S_-nϿJh*lX^;p,Y\WmRo-%9ٰ#E`…;Na1ǐ#KL˘3kPϠ=SMҨ-N=auӮMW6ζo-5oܾwnÍ׽ǖ:9s У78vW[w{㹗Wgy_wg<0~푗iWz֠l — ~6ev ( $;PNG  IHDRrr݅}sRGBbKGD pHYs  tIME$S IDATxڜyeiU[߰91ϑC$LBBB (2%jRHW[N8C>e-*X(  ɔ$9S psV#s8}z׻wΌ{rr(NQ#`TP97rsIQP@E{sC^L}]Eȹ7ycdi#+dA1CLdڅ903'}=sF/W?p$LjĀC*`C*n@Zb XWR߼ȚX3R*981n`V 7 *)3d$Pg,V &RXq宇u&D*9ҴSq9R ԾВb@E12ڌit9W?ܗm5fؾ@UgHc]g_ ^}Ϯm8;ZΜ9xϜaueӧ0i;1Im-%ԕ;B֌A"ƠYI9s&4e@ȱŨXaPU )Xjoq)V] XO:2 %%ĤdQsiCD43 ]A|t:%wwXc'kfv$+JЄ5!g541҄"X#BA.XvX>{?ǯh38kCL;~#6ziƘ;rm'b yڎ?yȓ}9=s%1A{nՋ)7HsZ@cPMM u1ҧrDCfKKزR ,øGW90ƂxU#֡ )%+ "vxobPUbK! /.4 !&R)⌣PʌrC'N [-^{ջ?|~wv~ *̆wuo?tߟf Z\UcAc`]EL)+ Jь80\UT_DJR1.{-}pj ؖSjrZjT%kN0dV25X`J ,We@}bsޢ3t9SF`g8qFSGtW>oݸn+Pp-ϼhv޺iWW#'OX+Ik=FrFz+ouL)5dUT!>a%=[ ;&2 b 10%a3Y0$Y3"NӂXŖO߳񊠱[ 1B ֣1S8S>ECb HX2"ЎQUb$G9+*jk ]HԾ\*}w`WZ$ HQ;Ol .t%@͊1`rWj9vH˪)PbJ`ȸ& Ccm|?(8Kc ]u0"A3) "6`v[S ]PR| "ʙs[3%BJxfŗ|wsU4yZ'lϬۼu5׿,7ٵ Us>éٹs;K"YsuZ7dc]WR#Y&LiS$,hlPc3T!9S6t!2Nib&Rac)ȁ.$(hg癛qh ,XS1C qWh8f#UeB`b͊d(M,SdS񼛾z~e}2 N%/hmzjyoru/^;><]{yjkؾ};pHbi!0[Xؠlዳ9rWC$f6`Qg*.FR΄L¢9.c/ eBL 5MIצ4ˮQ|UatmߕРboz7k/bQFyCD)^SS5B̆6 ٔj5Oxgv@JJ״t1E=Z522 r֓aNxdص} nE")e&KLW8u'|GƧ:L̉'Ie i.ndqv]⦭ 昙`ljsO_nC{AnY`EZc!du-LwbQUjkޡ#fG"O!^[+/%"kє ]kL*DӮ)CefFJL2 h47Z E&GLC ,Yi37|{~ P=ZgO+1Y9{9z NO< G#ՀŅyvotʅ6Gs榖&$L'+z ֱR_v.[w0wɨk/~O5nȜbEsp1%]"@+Lc-W/cBL6D- oۊ(F))gڶ#Ls6̌P%@Nᠢo :T0X^3;3B]Ȫeq\:)a2:}-^/VQ d}|}w'gX~=;6o`i-duե\Nr Nu1Qeeủrxx~/O6^q%pH@T#_]ɧw9v)6ځ3ӦE 1jCj_hm;b.zؔsڤO\MHIfB h/; mWRg6!d2% jxb %-gOf׾"#dfFC,t)56->׾yiv^4TOQkҌyR<~779Nٴq#skƌO5 "*52P~&1P1[®{v9yss5gN%6︀s^6mP5bpR)DHQhP\̤\zRcȰlS6VaJߺŷ:#m3MU(+h-2x"" ɡu{/_~vlD(DN5!3r㷜^?l֚zˤ\ƄZjP&E }V!H$RN%W-T$m(L"Dʉu7Ͼ~? 6=ݟqz+׭#+,,ĴiI(S4MCʹ Yrj)IPh.ZXY^&a &sj^?idp~* K,%W]}{ٸi9vԕ=JN麎6)mS%^8)y$ĞTbpXq㷜Y@zkv_wϬ\k\HJZTcua Xs^y{b?{} _enqI!5t3Ǐq'~C}y2RnD҅@NzhQ-RWWD)mJԆP1躆iS^Jw/.+{? /g8/@m岫gwslߺk kYhHK?2^Vj`1)9b=Y7;'rfsvq.LA$edzU|:[ƥ1遵ESO:†ݗ_mmQm{pwLJi> >}I3aڴ. ^jV}Dr&['-T׭j/eӶc-("$1As, ]P|>D^:Ǝ[)3LLеfz[cȥ~9F,b+uٞ}rJc$EQеHh,fg?ԡ}ܵ*t 1c!ۦayy LU 2BF*AsQ^JT|?}q/}џGdeypiSG5xӫ{``iZEu+\rdpTlQ Xay =4PW.C B̅ d\sj/qɥb]E?YEGRzMbċ-W<1Wzu&v41?.` mH JyΣk,J =~)úb>]?Ȏ_=Wr8욫BU'.~ƳyߍYm~O`f0DlS麆AERQ5]5}F#0|`Ӆdӎ"&sVغB7> #S$#ghچ)teVxȔŎř;t|z͓ѰV{c{7VzԔzYK3;'>;l`CۤAIJ<1/pee4+g$S* KOe #)FNX⑇Fnx^=|2?_a.ǘUD, ૖Ky/P H$aoH:fƶmiVx)kWL# l:S\z/|RyAx_'; GCKʃ_?3??b$@Wԗx~#C{0O93r24m9#ض,sF>Α}zsϑ{Gi&T͈jTN$I IRW#j)&-9oCiB?k/riIJLz_EGl}YN;EW>W ]D)P_/nLv6fb"i8yf'۾7ʏor/p߭3l`{~Kx[~gh ÷W?QNˋ_ֳzt̮+I=(f ,^"n3ǎa0mڒbǠ jy0|эHXW~ so \|/IzBp_ʴLrHV "3>txړfƛ']Dmr֌cDJۣRQi\}=o7\ [O/sE[NL'Ł;:p ˝7~y杻9^ǿwXzjϿ8 Osl}\i<3 #~tr'n"'q~moS<ɉ/}p#6 (?Eod*޻3+3`41겛rffn_&׼{:i{L~Klݺ"cs`rUS>f(qYx-˓Z}u7Y#yrv {=ӑqbΣ!,(zL~I:4lxջ~Ø;?w@DyˋlB̯_S0ZzDXܲg:UR4gs 9e>qo} |s\wP{7<,lfvq7XrnWL, 3.3=hH%ر%~ hXElUS?sveR]m?N\##ܰ档v3Y;o^iuA'eTt?ɵRz>k ǎ-ss^w% kT(O~WؽcuMcPjṯ#Ǹ>͗O誫y;57 7xГ(g /{;M+SsΎテZz+1ݟ 's[_ClڹK}<}_,/1Zhg<&|$ ))7i|UϽVѻbD9+1~ziGB dx4w֛W&Sz+/ԩO{NS=z'Yj=/rs mܐ{z7l0G;g&ʗ|9IJe8aΜ:3^},nZN *~kndfn{Yzbl;A\r-wpf^淲y*ו ]׿SOߢgذ2.wY\-.M N+V,+zv>߼!1ssU3)泵Tc#[wя0L ʹLRGa0q})N=$x ;.ĺJFPehŭ7r}~|cI9t>j{~[`' DX=$y.y_?ºٳejTIG1yHR o |7ѵb.T$v̠~g3b.AŃGoY7棪ʴ,S4 [Ssi˫ly1CжC QsѮY!ݮm+_P%Lv]?%x&߰|W앬ۺa>ejHY9l4T_ষ\=+Dd O{ F–fDQiv;a=9 gˮ gѵLEH=,3vTpi/)Ƣ@I;{Ў[S(xGZ.״9?, N*ʙU.|eR[;>$ĮFI)̀2X:q)׾7q>]qӹ_{>|O+n|9<^rQ:bF.~lb6_k0 ;q&VNpյN刕t-Xwl]p5G+an";h&=ず>N5I$1 k81"^G(߸/}rAn~Ͽ ~ lt+oFXj>x짙.Un?Wen0~ ͟q5o3'/%߄yY7s5h[-dcY l9!I{MtB!8$dh0xGlY5ZPg=%ݽ֪jiUoO<#׽s>+jJx?B+˩'4"OB9LYQlڒ($]DrzM9m)DRL4uE!'b82vaV4piXw>rݳ#>Mx ȁFvpK>k? Wexǭh}q{~l=W).;lsMfOrϟ|+o~9ooť]əO_F+RdEb9z`Iʐfuh;Sg,_$u[C*B6h"!?j# J<@HaY\I-Q*dJ6g-PQY \qT[ڶllL9З!ֻߍuEUN|=].< /z͛8)_W#ibȫ57qM7q扇y'8~oʗ(FT3gSB !#k#| bՊsgೠ@ ?jJH)Qo"v2 }!SD2kj_ޤČQ4vTuqTBvLgUˎOxooc茼^XU=kX).5j9Ka-E86c{1~'~wßصNPE?|w.xw ny밮YGSҗov?o~wo3ZsqhQD^Œ+I8g/Cơ'v0 3r N釕1" ]|/)_L6I` E=v|)c%`ٴ@BN)˜y95/B_rM\C_)hr<Gب>S+:L+>+ᶷ*fe_(8tɿ7~G=o[ߋk#~C|o# Ry }i)>j/fiZeH3 =)Ӛa_ I\gUYkZ2Sľr3zi,E? ;CȢ#-b1\E`3e U;Ֆ<@P` cA-9pp'esp!. CnZ({q!.r|w~m^=oqNBUե7o{kWp;ln;0!2uz"$uLU,x E6lsf_dɇ+2lMR2: *U! eXvL+ۙq(x)12\.S\v=u/}n4mn*tOU ;rȔ/ow o|`kF@҆k߃~h&m?I4hsV\(p:YqQK0) 1hN?rO~YKbwR ҂b7rʌ̩9 > $JB&F:ʂLjb~8?! ׏C/EsRteK6FT9(e6ۊqөCϵ/>iudY@gzݳXSg9ƕӏ>ʟ_>6lqG]k to~7۸;OaIz~E1C,uY'T ([A҄QA?avʪ:4=ec1 r+"\yudyx~$i!j]8x@!XMJbd؊B|3]߳\vm.d>^!eM J[9!xpysZqՍ7WRbmTV1_xmsݻO?3(W9%׿q+^Y{!v,kt_ELUb`kgG>7~Y/.p쪫n^w)zE)E bC8'I6H~M3ibskNA0oV3,w> ,WV*Ib!ff\!I!0at uUiqPC*$IMQH%llL̓}nh.y{%ʺzEJgHS9/%K?B̎!$Ƙ5r#O7xpgN?hNŁK/%ov^;8|q!g])BT[2uOiP(Z|N,nmU/]Q:A QjOw W^~;#UՈ)Nu"xNY o0(j{"P+RBW,9ըKUfBd kPŊ'y<:0%eoV~|Wn 3'1KD}dGiKÀ_@XʞS"9`ц0iGȕ7ii,y( 1T΀>ܐ`8kVش#+é9o \J ݺA5Ś~g\($@QAZ臱=#!+6RLSW#A|9Q6lx+r7 ,)Xy[_oKA_$7I~)[[aiEc 6EEog) S~.:ț[W|;OP736^u+ǯ ؅"sTyITa4Yk-5Q!&1`sk >귾V{xejỿʡPhɗTJ*y^I&gx?NmЌIc[(kŎmm=s SW>9:!+#װzL[K R7]\rElc|=x5䱓B:_*%TV9?|l]y5W%pS²IԂ+l\W$!XBuCHRbLr ([wydX Ƕ!'vvW<|\qLӘҦDg xI_SaN6L\,`9fggoЂDJGu[΀C&}},W\rdR_/Rq *E֙yZrn2Xyczۛ:~mrH_Xf.*G!FAХ3??&2FԆ)9U E;LN~8m1.! (|J37'L'y'qqA2^&~BXg(kKLbf.a4>e1; *Hi>qr)kcpb+o~v&]k%|30XmBHUUcbFL <.}u(+v_AVLI<,+6!.Q*rojsC@5B9{~8yWPd6)R>J*Qhvv\Wr'`9@5:c \}я>тK5Ƞ3_o="FQJ-k(cR7̚@mGK}'wEa"t}w?y𡓄aTFbRoSetb8tвؗ9>$(=-ZF cLRk=ENZAӠPOkѿx#?u?[ܠ213zd,O?zw5yaQ5<<~=6b` T6 ɄiSQ)6z}fQ]SWu5}@BFˮ*eMSUX%)k*TF}+;i"=7v=x}Ӝ)zrLt^jdVΖab7gݏL&LBdzc>cWGŌbL:ȝ ^&,:M`F>Y;LP}E^K\NLjK5@L ;WW^]s ՚1)B*ɵh" 5M- F !2ʗ*,U]]#X&eq.p 38#)0F+W W30_c+?/o(?;IlM6[:HZ`МR9u}ّMgg-{D ZHsȫ/ҟOY6LbS2c/hm]3?[?W}h"5|l{?qj|^p0EM̆@6 8ǁP金9Gqc/tgQMM[IbEVRsZbtm؜H9nzLdgQV#3[]_vE`*Ge-T1xֽĥRTZsX\8je7܂k p'>\›%rPOOoSL5Ƒ"~޿U^&zྒྷ| TKCΨeZ󳿊ϠufZ}v,wPb(ZW$cmV)>d5G~Om4ӥ (+ErEMg1#]?^E8XjС?+xMQ(>~|o牻kD9AB !E1ĮIu8_o?/:!.TĺN=ˡ-]EN؜5a`FlRê08sN)5 ?8ݼ/= r)?Ie\T=u\~߱"'$ Y<;~#1z)\* )˽=%6m&S,#o%rIgY^qE)DF8'd3C7Tsts!Ə=vF[bM=.ף^0ց1w?$A$-a= )@S9+UR*t%ɇL85acS/~ V|#L\vAډ؍ݚ9u!mH^cHc{I$(V>s~gV].vG4֒f񯽏',[EV@,-ATib=|%f*)XsHk@pGXRqc;p45s ]sRTc2`)|c6)U% y6i>w5R=Gr%y[⚛_0l*iSA154C+,gUז+.?̥GrLj (6&̗+vwwǨ֬YEXȔO <6z5:rgv${)~~^{9_ZP4PFb_,}1ϖ$+l4{@}Us(i!&ѳ^Vca:V5U]A[3 #5l~[?zTO|۾@29yt5s^{FV"3kjJ{diJ!XwkIFp~ , F?R5S[a6uj1 R7T8U^ZMc$) ;wy=/:/{Mm6%mpn?8qIE =!KMu I^k%Dmrlln0NحD<h6&u%9xBsCt{~7[0FN*s[7!B聆Z2m ),$4ۏe#+).j"ekD/JAa+KH9C)wx/gfom_Or /(E=j6c'IaQX /!KR #"f+B]$W(rdM뮓+FZy# Q Nw@ܵa2iM&"HI09:l&FI (b/uےBرM.<p%7cV17N@\rozS9^2&d*c1QW=]u9kP)2F躮'QT-cƙxr>EG?: 0ȡH4մWy+\r!%(vߜP†O)&$[ޯ22ݺLJU'ƏPRsc;}R&3 MS_}J¦nH; E%pnp-F =#w޷\u $vrHCW_mo}Nk=b4LIM_b 8#X Sx舘T~MFZj0P j9}GF+$Fʙ%7NϿˮ؄՜lldT0{y 檫KIYjș,5y񇡰/S̓k]%`*'3<1 5īol*F֫ qiSŤ}$!*0ZªvU%+cL/^Pޓ'L/{먷NCOwa=I%BhjM] £S9Gڵ1RU[cIKK.R3Z|?bi|r7HqA+4SVu`|N^^Opz'TqdVX1l\>Gv; #ԎvE-Wܑ%>{O7$bdkDe4Wl :'vwg1->'B\'BdiGko@U?uݳٛa+GҝWɫ̺[1SWMYB~Ǧ>`vwUm;s-7P Zj͛3΍|7+~6L~d #Y=U_'ҾYTI,U(a.(پ(Tۜs#V'n5DI٘Lu;ir1V]W1TrlLu;!釞#Ƕ8l C`p[BPst@TF\(T*Ւ~tr[9szu0Tҗ[қyۼ-NB(ba#uߦ!p{^rƏH2F֗:VJ\\UkQ'1Y_ bj?Ȫ߯*ؘNjrJ,A! !HT)]K 鄦5ł=Dł= {%:03V^Wq`}'~U"VKTsUx|'O<0O=0x 'Oe9s~!&dF"5` P PZb!z_"wCn(B rMa#xޕ0tNҊHBbnT!=X&MY,x?Ng$˽=(Qrlm cW}Qn|m|ӫ_P$4t9.j _"^[3'ٹCXnRqVRcduǏqaqK1bNKD R3g.Q WO>_CvzV{2sԌzTV`5˾kZmZq(jl9g,:s!)e(y Y",1P]LoDXkpU[xuJo{9,U݂X.g2m%2!sq`CG/af<<y'|?xPn˅,>(eX%:n9^~5ua0= $--kr@+٫kRt|r?IC(e,zυ ,KT S颐R/Iۈ;R叉L.C BN֢TGiicKs4;8vc,> \VkꚪrFe4Mba1_\.1RMfF)E3iKɉbz66t2A w|+׼_~JڕZmFoQ1R&rH! SYLJUX4PD5Fg-JosC<I=/p,+{  "20&a2%rALeàhGq$^"9U WΏhrF%MB@ÕV"yi*ˤi)srJ-!%5)%I+IF3[q/W7=gq9rpنFmvC8MDuU@rdog0Zh3r MUQ7r!!Tc1_03D?ҭTV4)*6՚p'O?>q5/x˹P\DfeYރ(B++ hQ4@Gt7)52a{Z*%p钨Bn$VMe\'61{yAUnRL 51JulªsdZ:!(~ݕ~$bS6U5RIaGɔtFzMLl6^;)${mzѱZp] >9i0i$5oR؜I?{Ͼ79r\~ .:f^!c9t7@Ss_?(g9S }`65X8dq9ǁ&Tރ2tuLNRvRYsQ wLyP嬠ˌAQ&gr[8A|&0V+,>ni0h}qV2Mq`UZuUb%8vAjŭ#1y6f3n2!CKUUa fBNrE" L& uUQCm`yk<~$E7DV NjtZѭ2ichlyÈ1 wNrC"z.҅|d6XQ 1'T\L8" ҆TgqVDn*.ٛYFOȓ}D%wcZ9gpqD*EjX, nZ&XV6,12L&3VXkkbfblceyrN\}*XMXiE#McZNClkcdV;bY[,0B6gZҍ W9c3HS+񣠫SLbt255!&V00t='t6#e\Ɛ#|1kHA0t+9{?\MN軞U/..Tq7dRԭcxD$t?GzI30iU/_QږZ=|$ sTqde7bJT10kГF/gIbwbC0 4Uٺ^,y%'e#'D0z//Қ#>f3-wx(%hublE:6_IDATu:s(pdmN\Q"w@SUTN2' z6~LfL66a0e2a"( \U]O]bLT1 `$SZoq#'DH^ j#V 5뾗8*gƮU0UXcH@Ӵ|9d2neB׌!3EoE ࣔ}%Kh}-,?3Oɰ9_o׌à6Yj3<ŜrA [U41]kfı'M*ڟe>S]W$YYŇՄDGBe*$S9'nCGBd:KlMد%WaD;- Ƒl s! ɄzUj%@FDl1ܸː 65Y/qR %E>*GIqY]s%HMOz t)}CLgχLlI3_v={Cc+'4mX,CG]5To_V*GNFTU]r1n1Lq\-I%gK1N\S%$)9WWED+/; =J;!ZV1a< pV5,1I95ǔцnDL qB̙ʈ;iUBk~ !:|"ʔIn\XǓN^3OquKef#LI3dvEq4u[n' =UUՆ3FdcYukBNXcJ#S7"g-DqGIwE=x/2) u%k9+h'a3uC"ᇑ29KX/j?a +0cBk+W>~*b \|Gʒ8gHEd@F/8(wc 5cJBTZczV@(cZi_zgƠKQr/gΞ^jΟgwoxꆔ2뮗T C5dlʆKӹݘfZP4#@h Ƒr)KB[@8CZxyNEXℵ-\YLXi#9-|1UvUن}?oiVݪ$e~5$✣EiqrPdLJuKej$۹X @N>`I+zXv8N.Ù'ͿsH?k|w^-rL׶4 R]%h'UþW/Cyu8XSZm)GʒB")#}?`̹$RFO#! ϠlZBX&'c')7)Kc Sd); Q. b8W/AʀuY֒霅R+y/"0c#J[%JVnA1O?rcOg&}F0!C._MR(%wCd2Qh&$w-[[&eJٲt@iLbQ@(yKCF(1CJvT(4~%Bk"JIaK{ǢpΡtjz*ѢY Wt@6JRiOLA_E# i~.{d2G–=[k8]By\*%& G~]L&]*GS -OL0F,46ZNcF)DJTUE@Ӎ`EV¸ 93 JSD(hQ-lK;Zs-}6hcA̽ҪY-W)gVuPMQs$f9BAɥ|4mc'eE*WFC#>r*p^59wvv|Ji5i[*)2v^UP[Y\rb{OUIG9$5 )bJTW1F1Xk Bu݈A11Ƚ2Xr"躹XFba9dK[^O4ŵ0U6V$~BGb~-sŊTCV[mɅGNp +)`O{@ ǔԩuBirjY}'otU qYI$qXQp`K\%1DⴤK"P*ZL!""F*^)Q-QQkIcZI"Oq@!HrXx(dFյO ~3[=eIϏfe,5!ƧvV%gRR{ 9ڶEi|`Ft PkQ9.^ p}Kb,o֚bӇͤ`#Z,/"{U3 #a eAyJ(ORf^ڂ,8wRrUb D Ieʋ8Q}m]óZ%x}~'!ZѶ=0h{{{,mk0K4cmu iYڇ{]2]} 6p{sY5XcMI]{/!p8v8chonȯ.֕r3UIr X51j=Ӣ{B+G#ΰ\.yDl[|Yr<HWX &dCUs^cdw8UkXp =#ڳ|l5M> SN.n}y|q~[@έT5߀3fz{YZcZ_ىY,5bC\4RNQ}dTaG!Vs("şR*.S#cʔojv):e#krBX 8k51Ž1V,6FG@f URSrCL]?NSJp׃_&62:[~>}QG~`AWՎ ؓrG#@^FP ,7 G06y~@_~ jJf&s` a߀wma tVjKIENDB`PNG  IHDRHHUGsRGBbKGD pHYs  tIME &[ IDATxdy%U}YcU3C7 Q@DA@gDBfrFɍQsohLH0I'EP "BMj>>z70젟7F_J)b()EL y[_ǟZ}th9rGf4i(DPJPZ66R T".gb&% YWhqMSjd!)QhM| %ubĈ1k*#LQ8OMZ ރ-ya;A]+SRʐRJZJY$wL_ 3ͯ30\۾d2!p)T9 @E&5~$@ƔPRS$@V2TE)Z\LQ|$61xTB"DP7 jMi-s@60WY"1fƭm B!)g$3Fi 2d F(ItsE+ rBK $h%PRsBhMPV`R D(ʂh$f-3(E4@*qӈ=[f9M@K>q;B !Fa7(mB7Od2JvwHkRsT1]hZ-H9R@K, wHYs6 LCʙ*=!$[Zr-5JI*R)&mCDFxK'mއ~ 9-O=u+rケmJ Ȉ J*j)#%kB13BrĐ0Z!B)H DN()DJ)R~YJ#-RRmIN$ZIxנ;Gi5Z )s1/J}hqS%RwsO ` %PG]JkbJ0Zc ڶ%#h"c $1cD -XL&HJ!@"' A.PRpPJ g)Մqsw 8ByF!Fkn^lvfx3LӄJH)QR"  $Z|;AAH)@ x961}/yݻ97 ߒ)'lc?_7&U#ʲGD D Mp A"@)$ r7w\)aB 5IҴјG\LY$׀Iv ̸nYyQ)7yY#{znFGPOY~tlޱ {"G|:Gx*v!9%]ŗÞoSND Pd1.0  cdSI2n>YktǷ ?_ +pkc^U0(K2ZRuad~v@LZJ|H1Vo~ 99b{C)T&Ye' l߁D?Wrǣ9'pSǒ"g9ބq:Rqv00hh T #LH1|mYQƐW-;!Bkn?o2Ul1 h'H YaJ{f|oKxs/?Ws !=9:|O^EٌEA9&#u['Dy1#c7+`.\qduh{}J6#B(LO-d2yW stf/}o_~yGVpgRLjRLR"Dx׶i[c akǞ brd~s_'- 5&B@M"֚" (I P%N&,N9B$'@!IM3Yxҟ0h&/;x_dn`>Ĥi!Bc@_otkي~ԕ4ȁ?Oqhq~ZƵG~ɨ4԰Y-7C:@H4H"M#%"'| D@@)~cu3ZH!3w΂N>9@K2-KPin\b U,k JcJSCi4(Ƭ'ޓõ-!<wGdCFuKʙQVm5qʉX\ZǃWxG9#І,TɄ#geyulOo~-"\z frL(2ZֆH*GRN4m> Ĕ8uI9!P#JRma,5o?; 7}8D=@ם4Y ɏ~C&qdb rWn5d{7mSBlB΄򬦍ƵV3ojn@ ( ЉgYYZ* \4ށ!!0iZ*R2s }YJR@gD:LTJsJ i['t!4-*1ni={t:@*:"y/}vT"{d abR)Ex cy*/{եq_KnZ1g=?췸.y,GQNoXF쾃;n2g>"|է7s{nga\ǯ\Crs=kslIϸ(J3 )D&Dž@B|Ke;N3N.|1_oykIg^{=OpK_o~zvzǝz4?2w3`Vb4k !}s -t-t^NLG">vAʉ``m'5Y!E")I̹9J*#ؓE(^۾'!#${6m}O:x?s?y ۏ_j~318&y''^%_$G O8_yeu.vlJ!o;և * zNx1l8 :q?eȂD"N{$b;h|Fwʿ2N1&QFa"&J[|՘:{Ik ~fJߺg(E [XcJQ%QF+Kƫvι0F|;)+CiBb _̖m :O;k![gq^!MZ[ lGcX|d|zVN{x\%q)8pwB#LjYN94+2FfzE9S!Oe*Ԥܙ~i.(eZȸqI{I" W#c#rcݷeo|;0w~//|<)OBJ+}K{7/JyغDr゗ ;zlnO˞X;Wz7W71=3epEh&+Aalj'1dqu.8Ў9S;O;(DΑ @ :Yp,C A7FHAΎӟ$>W#a)qv.ghMaN|y\+~OZ@23`ԓqK~a߃YVB z/,QXAzl^I-:B R2ZN QRQYFu.JAZeI!$>~ufs7R"#'u6v @͑f?~J ^7i r&H'=|((#2x cm(Z"DD YLHh[b)c ؑbY D/Jv[0mXOpށEa&Db&%jDyMs_?A dEUs;}/2'y#r79urvJ ?WlBFGD$L / cp&4xDLt)r֏RqbbB"EhЦLBN KAeN/s-,JTSX463#wϯ+|7UJn؇C\ku>9BaS@UdA=|33CیA$ :mo\[\?(Qƒ|DKE ]"ĀPk%:I%)Q I(Buϑ},;oYش@L3;'UՌ_b>g?Gwdu|?rhaw)?YAA!5Uۑs |Щs} A)2eUc OG9vyIy*ZDR\ $}kHD&ĄxO+(C"xLq PY9E/`ߏlu""˯A5ЌϸLg L..Җzx/C{A/sC:FuC:$%@EJmBYCk1MY)"%<.*WY?1޹aeoCnU(-q!Zɑt8ECn[Dj;+0cyl=D-ONэb"UX"0.2jyJMoB mo& QĔZTY^]cc4n) uZ°yu|hMm]FT%A56'P.қHo~+uџ)BB]Л,lUH&b7ppk>ϿUl4S.i[Yɦ?*8,T#9E 6_Pԙ7 , (2RDwsEɜVq0C: Q46PU~ppɗp^!KIRXHKH1".OSL2ҳ _7N@ !K^\EOoH kcBR䄋ih떐Xb0S.XݝKAY\]g=叺,񖍃CIDATgL PMD][ɼl߲|=|OWegEL ̐w`1t -ui3:3ֵꖵk4EB~<V93Pqdi @[3-hкv-c&:(UAe,"tdX7j`pٵPhU<*B*djL&5묯(Y)[Yby8.Fb-2z(ƎV%Jt1pҸCz< X_̧Uv5Kq"'뚞5L*cf23\_HZ|x(f2`u 1>IfNX-%ѵty _ ^dODZ껅 &2 ѵ 1UB<|N|%S/?Fvl%5YkFiNB-2~yzyvsܖ+ׇ6٪WX$&dBH"_TZ|0Y(n 5ǝy2!d_I^}bߞGmLU=-0Ҵ Z(4>xw_2lwPa& zZ("ƄHBeZE1iPNzW$]T9#Fk(%-KeLգMu6/8t9|`g>3y<شs3OyKyڙ^thC04Z|Lxر1Y_mfNxx^ ^6PXDc\K>y/1;gYYYa8 S@ T )MkW,%J5S3[koxiX7% 6 ] hI- "oE Kk6sޯ_Y<"f2׌V7xY;h(mdabqDZП/;7e:~}f$e4&C㽲N7ƍn=1g|ue$6(wXN]D'ŀ +(!)2?3%^JUuw?7̇ɜrI;P:xH&Qƚje%'AAdH<ZE}rRd[,8p ᐹ[iZZ'c(C3vkϳtm-R()A)|sוJuo^P@5 87h"k&;jژ Lf81RRUYdd0i[RJx6HH-pm CmK-X&{1Uŕ2ӦDLISsI "Rk\ yҸ<(xhqVa`({|5:L-дLQ`i&Q0OȺ{2ts4j)&BȘp!D:(&LRag!@j" {Rc$.x" ]' Ҳ6%%J*N)Y|ćX7wR/n_:jtUE̩;VU!zUEhk fiۖdvn%VftUU[GbA\?GB n{NDa ?mWS=s0)5#ijs;OBiR.)1 R^G?Q/lH3ǀfO;E_'9(z!%jβ1`1*-).(Fc;GQ&D@!8WNe%uHc-$YJ\E{GL6xԽaccDl~$(s;IoOw2+F{ .!0lt.v r*Tイ I{ӍR0mV5bHqk%fJ|PTsEm 7!Zj{Vj]/֎( Τn[UT v[YqжxP=5z0xz! | *z*@SPwyUrhZfy89,)Ke ,'B DD ƨ8X-N/psx |Ϋ@G[/|

    {{ element.name }}{% if path(element) %}{% endif %}

    {{ element.summary }}

    {% if type == 'function' %} {% include 'method.html.twig' with {'method': element} %} {% else %} {{ element.description|markdown|raw }} {% endif %}
    {% if path(element) %}« More »{% endif %} {% endmacro %} {% macro buildBreadcrumb(element) %} {% import _self as self %} {% if element.parent and element.parent.name != '\\' %} {{ self.buildBreadcrumb(element.parent) }} {% endif %}
  • \{{ element.name }}
  • {% endmacro %} {% macro renderNamespaceDetails(node) %} {% import _self as self %} {% if node.classes|length > 0 or node.interfaces|length > 0 or node.traits|length > 0 or node.functions|length > 0 or node.constants|length > 0 %} {% if node.functions|length > 0 %}

    Functions

    {% for function in node.functions|sort_asc %} {{ self.elementSummary(function, 'function') }} {% endfor %}
    {% endif %} {% if node.constants|length > 0 %}

    Constants

    {% for constant in node.constants %} {{ self.elementSummary(constant, 'constant') }} {% endfor %}
    {% endif %} {% if node.classes|length > 0 or node.interfaces|length > 0 or node.traits|length > 0 %}

    Classes, interfaces and traits

    {% for trait in node.traits|sort_asc %} {{ self.elementSummary(trait, 'trait') }} {% endfor %} {% for interface in node.interfaces|sort_asc %} {{ self.elementSummary(interface, 'interface') }} {% endfor %} {% for class in node.classes|sort_asc %} {{ self.elementSummary(class, 'class') }} {% endfor %}
    {% endif %} {% endif %} {% for namespace in node.children %} {{ self.renderNamespaceDetails(namespace) }} {% endfor %} {% endmacro %} {% macro renderNamespaceSidebar(node) %} {% import _self as self %} {% for namespace in node.children|sort_asc %}
  • {{ namespace.name }}
  • {% endfor %} {% endmacro %} {% block title %} {{ project.title }} » {{ node.FullyQualifiedStructuralElementName }} {% endblock %} {% block content %} {% import _self as self %}
    {{ self.renderNamespaceDetails(node) }}
    {% endblock %} {% extends 'layout.html.twig' %} {% block content %}
    {% endblock %} /* * jQuery PanZoom Plugin * Pan and zoom an image within a parent div. * * version: 0.9.0 * @requires jQuery v1.4.2 or later (earlier probably work, but untested so far) * * Copyright (c) 2011 Ben Lumley * Examples and documentation at: https://github.com/benlumley/jQuery-PanZoom * * Dual licensed under the MIT and GPL licenses: * http://www.opensource.org/licenses/mit-license.php * http://www.gnu.org/licenses/gpl.html */ (function( $ ){ $.fn.panZoom = function(method) { if ( methods[method] ) { return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 )); } else if ( typeof method === 'object' || ! method ) { return methods.init.apply( this, arguments ); } else { $.error( 'Method ' + method + ' does not exist' ); } }; $.fn.panZoom.defaults = { zoomIn : false, zoomOut : false, panUp : false, panDown : false, panLeft : false, panRight : false, fit : false, out_x1 : false, out_y1 : false, out_x2 : false, out_y2 : false, min_width : 20, min_height : 20, zoom_step : 3, pan_step : 3, debug : false, directedit : false, aspect : true, factor : 1, animate : true, animate_duration : 200, animate_easing : 'linear', double_click : true, mousewheel : true, mousewheel_delta : 1, draggable : true, clickandhold : true }; var settings = {} var methods = { 'init': function (options) { $.extend(settings, $.fn.panZoom.defaults, options); setupCSS.apply(this); setupData.apply(this); setupBindings.apply(this); methods.readPosition.apply(this); }, 'destroy': function () { $(window).unbind('.panZoom'); this.removeData('panZoom'); }, 'loadImage': function () { var data = this.data('panZoom'); loadTargetDimensions.apply(this); methods.updatePosition.apply(this); if (data.last_image != null && data.last_image != this.attr('src')) { methods.fit.apply(this); } data.last_image = this.attr('src'); data.loaded = true; }, 'readPosition': function () { var data = this.data('panZoom'); if (settings.out_x1) { data.position.x1 = settings.out_x1.val()*settings.factor } if (settings.out_y1) { data.position.y1 = settings.out_y1.val()*settings.factor } if (settings.out_x2) { data.position.x2 = settings.out_x2.val()*settings.factor } if (settings.out_y2) { data.position.y2 = settings.out_y2.val()*settings.factor } methods.updatePosition.apply(this); }, 'updatePosition': function() { validatePosition.apply(this); writePosition.apply(this); applyPosition.apply(this); }, 'fit': function () { var data = this.data('panZoom'); data.position.x1 = 0; data.position.y1 = 0; data.position.x2 = data.viewport_dimensions.x; data.position.y2 = data.viewport_dimensions.y; methods.updatePosition.apply(this); }, 'zoomIn': function (steps) { var data = this.data('panZoom'); if (typeof(steps) == 'undefined') { var steps = getStepDimensions.apply(this); } console.debug(data.position); console.debug(data.viewport_dimensions); data.position.x1 = data.position.x1*1 - steps.zoom.x; data.position.x2 = data.position.x2*1 + steps.zoom.x; data.position.y1 = data.position.y1*1 - steps.zoom.y; data.position.y2 = data.position.y2*1 + steps.zoom.y; methods.updatePosition.apply(this); }, 'zoomOut': function (steps) { var data = this.data('panZoom'); if (typeof(steps) == 'undefined') { var steps = getStepDimensions.apply(this); } data.position.x1 = data.position.x1*1 + steps.zoom.x; data.position.x2 = data.position.x2*1 - steps.zoom.x; data.position.y1 = data.position.y1*1 + steps.zoom.y; data.position.y2 = data.position.y2*1 - steps.zoom.y; methods.updatePosition.apply(this); }, 'panUp': function () { var data = this.data('panZoom'); var steps = getStepDimensions.apply(this); data.position.y1 -= steps.pan.y; data.position.y2 -= steps.pan.y; methods.updatePosition.apply(this); }, 'panDown': function () { var data = this.data('panZoom'); var steps = getStepDimensions.apply(this); data.position.y1 = data.position.y1*1 + steps.pan.y; data.position.y2 = data.position.y2*1 + steps.pan.y; methods.updatePosition.apply(this); }, 'panLeft': function () { var data = this.data('panZoom'); var steps = getStepDimensions.apply(this); data.position.x1 -= steps.pan.x; data.position.x2 -= steps.pan.x; methods.updatePosition.apply(this); }, 'panRight': function () { var data = this.data('panZoom'); var steps = getStepDimensions.apply(this); data.position.x1 = data.position.x1*1 + steps.pan.x; data.position.x2 = data.position.x2*1 + steps.pan.x; methods.updatePosition.apply(this); }, 'mouseWheel': function (delta) { // first calculate how much to zoom in/out var steps = getStepDimensions.apply(this); steps.zoom.x = steps.zoom.x * (Math.abs(delta) / settings.mousewheel_delta); steps.zoom.y = steps.zoom.y * (Math.abs(delta) / settings.mousewheel_delta); // then do it if (delta > 0) { methods.zoomIn.apply(this, [steps]); } else if (delta < 0) { methods.zoomOut.apply(this, [steps]); } }, 'dragComplete': function() { var data = this.data('panZoom'); data.position.x1 = this.position().left; data.position.y1 = this.position().top; data.position.x2 = this.position().left*1 + this.width(); data.position.y2 = this.position().top*1 + this.height(); methods.updatePosition.apply(this); }, 'mouseDown': function (action) { methods[action].apply(this); if (settings.clickandhold) { var data = this.data('panZoom'); methods.mouseUp.apply(this); data.mousedown_interval = window.setInterval(function (that, action) { that.panZoom(action); }, settings.animate_duration, this, action); } }, 'mouseUp': function() { var data = this.data('panZoom'); window.clearInterval(data.mousedown_interval); } } function setupBindings() { eventData = { target: this } // bind up controls if (settings.zoomIn) { settings.zoomIn.bind('mousedown.panZoom', eventData, function(event) { event.preventDefault(); event.data.target.panZoom('mouseDown', 'zoomIn'); }).bind('mouseleave.panZoom mouseup.panZoom', eventData, function(event) { event.preventDefault(); event.data.target.panZoom('mouseUp'); }); } if (settings.zoomOut) { settings.zoomOut.bind('mousedown.panZoom', eventData, function(event) { event.preventDefault(); event.data.target.panZoom('mouseDown', 'zoomOut'); }).bind('mouseleave.panZoom mouseup.panZoom', eventData, function(event) { event.preventDefault(); event.data.target.panZoom('mouseUp'); }); } if (settings.panUp) { settings.panUp.bind('mousedown.panZoom', eventData, function(event) { event.preventDefault(); event.data.target.panZoom('mouseDown', 'panUp'); }).bind('mouseleave.panZoom mouseup.panZoom', eventData, function(event) { event.preventDefault(); event.data.target.panZoom('mouseUp'); }); } if (settings.panDown) { settings.panDown.bind('mousedown.panZoom', eventData, function(event) { event.preventDefault(); event.data.target.panZoom('mouseDown', 'panDown'); }).bind('mouseleave.panZoom mouseup.panZoom', eventData, function(event) { event.preventDefault(); event.data.target.panZoom('mouseUp'); }); } if (settings.panLeft) { settings.panLeft.bind('mousedown.panZoom', eventData, function(event) { event.preventDefault(); event.data.target.panZoom('mouseDown', 'panLeft'); }).bind('mouseleave.panZoom mouseup.panZoom', eventData, function(event) { event.preventDefault(); event.data.target.panZoom('mouseUp'); }); } if (settings.panRight) { settings.panRight.bind('mousedown.panZoom', eventData, function(event) { event.preventDefault(); event.data.target.panZoom('mouseDown', 'panRight'); }).bind('mouseleave.panZoom mouseup.panZoom', eventData, function(event) { event.preventDefault(); event.data.target.panZoom('mouseUp'); }); } if (settings.fit) { settings.fit.bind('click.panZoom', eventData, function(event) { event.preventDefault(); event.data.target.panZoom('fit'); } ); } // double click if (settings.double_click) { this.bind('dblclick.panZoom', eventData, function(event, delta) { event.data.target.panZoom('zoomIn') } ); } // mousewheel if (settings.mousewheel && typeof(this.mousewheel) == 'function') { this.parent().mousewheel(function(event, delta) { event.preventDefault(); $(this).find('img').panZoom('mouseWheel', delta) } ); } else if (settings.mousewheel) { alert('Mousewheel requires mousewheel from jQuery tools - please include jQuery tools or disable mousewheel to remove this warning.') } // direct form input if (settings.directedit) { $(settings.out_x1).add(settings.out_y1).add(settings.out_x2).add(settings.out_y2).bind('change.panZoom blur.panZoom', eventData, function(event) { event.data.target.panZoom('readPosition') } ); } if (settings.draggable && typeof(this.draggable) == 'function') { this.draggable({ stop: function () { $(this).panZoom('dragComplete'); } }); } else if (settings.draggable) { alert('Draggable requires jQuery UI - please include jQuery UI or disable draggable to remove this warning.') } // image load $(this).bind('load.panZoom', eventData, function (event) { event.data.target.panZoom('loadImage') }) } function setupData() { this.data('panZoom', { target_element: this, target_dimensions: { x: null, y: null }, viewport_element: this.parent(), viewport_dimensions: { x: this.parent().width(), y: this.parent().height() }, position: { x1: null, y1: null, x2: null, y2: null }, last_image: null, loaded: false, mousewheel_delta: 0, mousedown_interval: false }); if (settings.debug) { console.log(this.data('panZoom')); } } function setupCSS() { if (this.parent().css('position') == 'static') { this.parent().css('position', 'relative'); } this.css({ 'position': 'absolute', 'top': 0, 'left': 0 }); if (settings.draggable) { this.css({ 'cursor': 'move' }); } } function validatePosition() { var data = this.data('panZoom'); // if dimensions are too small... if ( data.position.x2 - data.position.x1 < settings.min_width/settings.factor || data.position.y2 - data.position.y1 < settings.min_height/settings.factor ) { // and second co-ords are zero (IE: no dims set), fit image if (data.position.x2 == 0 || data.position.y2 == 0) { methods.fit.apply(this); } // otherwise, backout a bit else { if (data.position.x2 - data.position.x1 < settings.min_width/settings.factor) { data.position.x2 = data.position.x1*1+settings.min_width/settings.factor; } if (data.position.y2 - data.position.y1 < settings.min_height/settings.factor) { data.position.y2 = data.position.y1*1+settings.min_height/settings.factor; } } } if (settings.aspect) { target = data.target_dimensions.ratio; current = getCurrentAspectRatio.apply(this) if (current > target) { new_width = getHeight.apply(this) * target; diff = getWidth.apply(this) - new_width; data.position.x1 = data.position.x1*1 + (diff/2); data.position.x2 = data.position.x2*1 - (diff/2); } else if (current < target) { new_height = getWidth.apply(this) / target; diff = getHeight.apply(this) - new_height; data.position.y1 = data.position.y1*1 + (diff/2); data.position.y2 = data.position.y2*1 - (diff/2); } } } function applyPosition() { var data = this.data('panZoom'); width = getWidth.apply(this); height = getHeight.apply(this); left_offset = getLeftOffset.apply(this); top_offset = getTopOffset.apply(this); properties = { 'top': Math.round(top_offset), 'left': Math.round(left_offset), 'width': Math.round(width), 'height': Math.round(height) } if (data.loaded && settings.animate) { applyAnimate.apply(this, [ properties ]); } else { applyCSS.apply(this, [ properties ]); } if (settings.debug) { console.log('--'); console.log('width:' + width); console.log('height:' + height); console.log('left:' + left_offset); console.log('top:' + top_offset); } } function applyCSS() { this.css( properties ); } function applyAnimate() { this.stop().animate( properties , settings.animate_duration, settings.animate_easing); } function getWidth() { var data = this.data('panZoom'); width = (data.position.x2 - data.position.x1); return width; } function getLeftOffset() { var data = this.data('panZoom'); return data.position.x1; } function getHeight() { var data = this.data('panZoom'); height = (data.position.y2 - data.position.y1); return height; } function getTopOffset() { var data = this.data('panZoom'); top_offset = data.position.y1; return top_offset; } function getCurrentAspectRatio() { return (getWidth.apply(this) / getHeight.apply(this)); } function writePosition() { var data = this.data('panZoom'); if (settings.out_x1) { settings.out_x1.val(Math.round(data.position.x1 / settings.factor)) } if (settings.out_y1) { settings.out_y1.val(Math.round(data.position.y1 / settings.factor)) } if (settings.out_x2) { settings.out_x2.val(Math.round(data.position.x2 / settings.factor)) } if (settings.out_y2) { settings.out_y2.val(Math.round(data.position.y2 / settings.factor)) } } function getStepDimensions() { var data = this.data('panZoom'); ret = { zoom: { x: (settings.zoom_step/100 * data.viewport_dimensions.x), y: (settings.zoom_step/100 * data.viewport_dimensions.y) }, pan: { x: (settings.pan_step/100 * data.viewport_dimensions.x), y: (settings.pan_step/100 * data.viewport_dimensions.y) } } return ret; } function loadTargetDimensions() { var data = this.data('panZoom'); var img = document.createElement('img'); img.src = this.attr('src'); img.id = "jqpz-temp"; $('body').append(img); data.target_dimensions.x = $('#jqpz-temp').width(); data.target_dimensions.y = $('#jqpz-temp').height(); $('#jqpz-temp').remove(); data.target_dimensions.ratio = data.target_dimensions.x / data.target_dimensions.y; } })( jQuery ); /*! Copyright (c) 2011 Brandon Aaron (http://brandonaaron.net) * Licensed under the MIT License (LICENSE.txt). * * Thanks to: http://adomas.org/javascript-mouse-wheel/ for some pointers. * Thanks to: Mathias Bank(http://www.mathias-bank.de) for a scope bug fix. * Thanks to: Seamus Leahy for adding deltaX and deltaY * * Version: 3.0.6 * * Requires: 1.2.2+ */ (function(d){function e(a){var b=a||window.event,c=[].slice.call(arguments,1),f=0,e=0,g=0,a=d.event.fix(b);a.type="mousewheel";b.wheelDelta&&(f=b.wheelDelta/120);b.detail&&(f=-b.detail/3);g=f;b.axis!==void 0&&b.axis===b.HORIZONTAL_AXIS&&(g=0,e=-1*f);b.wheelDeltaY!==void 0&&(g=b.wheelDeltaY/120);b.wheelDeltaX!==void 0&&(e=-1*b.wheelDeltaX/120);c.unshift(a,f,e,g);return(d.event.dispatch||d.event.handle).apply(this,c)}var c=["DOMMouseScroll","mousewheel"];if(d.event.fixHooks)for(var h=c.length;h;)d.event.fixHooks[c[--h]]= d.event.mouseHooks;d.event.special.mousewheel={setup:function(){if(this.addEventListener)for(var a=c.length;a;)this.addEventListener(c[--a],e,false);else this.onmousewheel=e},teardown:function(){if(this.removeEventListener)for(var a=c.length;a;)this.removeEventListener(c[--a],e,false);else this.onmousewheel=null}};d.fn.extend({mousewheel:function(a){return a?this.bind("mousewheel",a):this.trigger("mousewheel")},unmousewheel:function(a){return this.unbind("mousewheel",a)}})})(jQuery); /* * jQuery.splitter.js - two-pane splitter window plugin * * version 1.51 (2009/01/09) * * Dual licensed under the MIT and GPL licenses: * http://www.opensource.org/licenses/mit-license.php * http://www.gnu.org/licenses/gpl.html */ /** * The splitter() plugin implements a two-pane resizable splitter window. * The selected elements in the jQuery object are converted to a splitter; * each selected element should have two child elements, used for the panes * of the splitter. The plugin adds a third child element for the splitbar. * * For more details see: http://methvin.com/splitter/ * * * @example $('#MySplitter').splitter(); * @desc Create a vertical splitter with default settings * * @example $('#MySplitter').splitter({type: 'h', accessKey: 'M'}); * @desc Create a horizontal splitter resizable via Alt+Shift+M * * @name splitter * @type jQuery * @param Object options Options for the splitter (not required) * @cat Plugins/Splitter * @return jQuery * @author Dave Methvin (dave.methvin@gmail.com) */ ; (function($) { $.fn.splitter = function(args) { args = args || {}; return this.each(function() { var zombie; // left-behind splitbar for outline resizes function startSplitMouse(evt) { if (opts.outline) zombie = zombie || bar.clone(false).insertAfter(A); panes.css("-webkit-user-select", "none"); // Safari selects A/B text on a move bar.addClass(opts.activeClass); $('
    ').insertAfter(bar); A._posSplit = A[0][opts.pxSplit] - evt[opts.eventPos]; $(document) .bind("mousemove", doSplitMouse) .bind("mouseup", endSplitMouse); } function doSplitMouse(evt) { var newPos = A._posSplit + evt[opts.eventPos]; if (opts.outline) { newPos = Math.max(0, Math.min(newPos, splitter._DA - bar._DA)); bar.css(opts.origin, newPos); } else resplit(newPos); } function endSplitMouse(evt) { $('div.splitterMask').remove(); bar.removeClass(opts.activeClass); var newPos = A._posSplit + evt[opts.eventPos]; if (opts.outline) { zombie.remove(); zombie = null; resplit(newPos); } panes.css("-webkit-user-select", "text"); // let Safari select text again $(document) .unbind("mousemove", doSplitMouse) .unbind("mouseup", endSplitMouse); } function resplit(newPos) { // Constrain new splitbar position to fit pane size limits newPos = Math.max(A._min, splitter._DA - B._max, Math.min(newPos, A._max, splitter._DA - bar._DA - B._min)); // Resize/position the two panes bar._DA = bar[0][opts.pxSplit]; // bar size may change during dock bar.css(opts.origin, newPos).css(opts.fixed, splitter._DF); A.css(opts.origin, 0).css(opts.split, newPos).css(opts.fixed, splitter._DF); B.css(opts.origin, newPos + bar._DA) .css(opts.split, splitter._DA - bar._DA - newPos).css(opts.fixed, splitter._DF); // IE fires resize for us; all others pay cash if (!$.browser.msie) panes.trigger("resize"); } function dimSum(jq, dims) { // Opera returns -1 for missing min/max width, turn into 0 var sum = 0; for (var i = 1; i < arguments.length; i++) sum += Math.max(parseInt(jq.css(arguments[i])) || 0, 0); return sum; } // Determine settings based on incoming opts, element classes, and defaults var vh = (args.splitHorizontal ? 'h' : args.splitVertical ? 'v' : args.type) || 'v'; var opts = $.extend({ activeClass: 'active', // class name for active splitter pxPerKey: 8, // splitter px moved per keypress tabIndex: 0, // tab order indicator accessKey: '' // accessKey for splitbar }, { v: { // Vertical splitters: keyLeft: 39, keyRight: 37, cursor: "e-resize", splitbarClass: "vsplitbar", outlineClass: "voutline", type: 'v', eventPos: "pageX", origin: "left", split: "width", pxSplit: "offsetWidth", side1: "Left", side2: "Right", fixed: "height", pxFixed: "offsetHeight", side3: "Top", side4: "Bottom" }, h: { // Horizontal splitters: keyTop: 40, keyBottom: 38, cursor: "n-resize", splitbarClass: "hsplitbar", outlineClass: "houtline", type: 'h', eventPos: "pageY", origin: "top", split: "height", pxSplit: "offsetHeight", side1: "Top", side2: "Bottom", fixed: "width", pxFixed: "offsetWidth", side3: "Left", side4: "Right" } }[vh], args); // Create jQuery object closures for splitter and both panes var splitter = $(this).css({position: "relative"}); var panes = $(">*", splitter[0]).css({ position: "absolute", // positioned inside splitter container "z-index": "1", // splitbar is positioned above "-moz-outline-style": "none" // don't show dotted outline }); var A = $(panes[0]); // left or top var B = $(panes[1]); // right or bottom // Focuser element, provides keyboard support; title is shown by Opera accessKeys var focuser = $('') .attr({accessKey: opts.accessKey, tabIndex: opts.tabIndex, title: opts.splitbarClass}) .bind($.browser.opera ? "click" : "focus", function() { this.focus(); bar.addClass(opts.activeClass) }) .bind("keydown", function(e) { var key = e.which || e.keyCode; var dir = key == opts["key" + opts.side1] ? 1 : key == opts["key" + opts.side2] ? -1 : 0; if (dir) resplit(A[0][opts.pxSplit] + dir * opts.pxPerKey, false); }) .bind("blur", function() { bar.removeClass(opts.activeClass) }); // Splitbar element, can be already in the doc or we create one var bar = $(panes[2] || '
    ') .insertAfter(A).css("z-index", "100").append(focuser) .attr({"class": opts.splitbarClass, unselectable: "on"}) .css({position: "absolute", "user-select": "none", "-webkit-user-select": "none", "-khtml-user-select": "none", "-moz-user-select": "none", "top": "0px"}) .bind("mousedown", startSplitMouse); // Use our cursor unless the style specifies a non-default cursor if (/^(auto|default|)$/.test(bar.css("cursor"))) bar.css("cursor", opts.cursor); // Cache several dimensions for speed, rather than re-querying constantly bar._DA = bar[0][opts.pxSplit]; splitter._PBF = $.boxModel ? dimSum(splitter, "border" + opts.side3 + "Width", "border" + opts.side4 + "Width") : 0; splitter._PBA = $.boxModel ? dimSum(splitter, "border" + opts.side1 + "Width", "border" + opts.side2 + "Width") : 0; A._pane = opts.side1; B._pane = opts.side2; $.each([A,B], function() { this._min = opts["min" + this._pane] || dimSum(this, "min-" + opts.split); this._max = opts["max" + this._pane] || dimSum(this, "max-" + opts.split) || 9999; this._init = opts["size" + this._pane] === true ? parseInt($.curCSS(this[0], opts.split)) : opts["size" + this._pane]; }); // Determine initial position, get from cookie if specified var initPos = A._init; if (!isNaN(B._init)) // recalc initial B size as an offset from the top or left side initPos = splitter[0][opts.pxSplit] - splitter._PBA - B._init - bar._DA; if (opts.cookie) { if (!$.cookie) alert('jQuery.splitter(): jQuery cookie plugin required'); var ckpos = parseInt($.cookie(opts.cookie)); if (!isNaN(ckpos)) initPos = ckpos; $(window).bind("unload", function() { var state = String(bar.css(opts.origin)); // current location of splitbar $.cookie(opts.cookie, state, {expires: opts.cookieExpires || 365, path: opts.cookiePath || document.location.pathname}); }); } if (isNaN(initPos)) // King Solomon's algorithm initPos = Math.round((splitter[0][opts.pxSplit] - splitter._PBA - bar._DA) / 2); // Resize event propagation and splitter sizing if (opts.anchorToWindow) { // Account for margin or border on the splitter container and enforce min height splitter._hadjust = dimSum(splitter, "borderTopWidth", "borderBottomWidth", "marginBottom"); splitter._hmin = Math.max(dimSum(splitter, "minHeight"), 20); $(window).bind("resize", function() { var top = splitter.offset().top; var wh = $(window).height(); splitter.css("height", Math.max(wh - top - splitter._hadjust, splitter._hmin) + "px"); if (!$.browser.msie) splitter.trigger("resize"); }).trigger("resize"); } else if (opts.resizeToWidth && !$.browser.msie) $(window).bind("resize", function() { splitter.trigger("resize"); }); // Resize event handler; triggered immediately to set initial position splitter.bind("resize", function(e, size) { // Custom events bubble in jQuery 1.3; don't Yo Dawg if (e.target != this) return; // Determine new width/height of splitter container splitter._DF = splitter[0][opts.pxFixed] - splitter._PBF; splitter._DA = splitter[0][opts.pxSplit] - splitter._PBA; // Bail if splitter isn't visible or content isn't there yet if (splitter._DF <= 0 || splitter._DA <= 0) return; // Re-divvy the adjustable dimension; maintain size of the preferred pane resplit(!isNaN(size) ? size : (!(opts.sizeRight || opts.sizeBottom) ? A[0][opts.pxSplit] : splitter._DA - B[0][opts.pxSplit] - bar._DA)); }).trigger("resize", [initPos]); }); }; })(jQuery); /* * Downloaded from http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.js, 2012-02-04 23:26 */ /*! * jQuery JavaScript Library v1.7.1 * http://jquery.com/ * * Copyright 2011, John Resig * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * Includes Sizzle.js * http://sizzlejs.com/ * Copyright 2011, The Dojo Foundation * Released under the MIT, BSD, and GPL Licenses. * * Date: Mon Nov 21 21:11:03 2011 -0500 */ (function( window, undefined ) { // Use the correct document accordingly with window argument (sandbox) var document = window.document, navigator = window.navigator, location = window.location; var jQuery = (function() { // Define a local copy of jQuery var jQuery = function( selector, context ) { // The jQuery object is actually just the init constructor 'enhanced' return new jQuery.fn.init( selector, context, rootjQuery ); }, // Map over jQuery in case of overwrite _jQuery = window.jQuery, // Map over the $ in case of overwrite _$ = window.$, // A central reference to the root jQuery(document) rootjQuery, // A simple way to check for HTML strings or ID strings // Prioritize #id over to avoid XSS via location.hash (#9521) quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/, // Check if a string has a non-whitespace character in it rnotwhite = /\S/, // Used for trimming whitespace trimLeft = /^\s+/, trimRight = /\s+$/, // Match a standalone tag rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, // JSON RegExp rvalidchars = /^[\],:{}\s]*$/, rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, // Useragent RegExp rwebkit = /(webkit)[ \/]([\w.]+)/, ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/, rmsie = /(msie) ([\w.]+)/, rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/, // Matches dashed string for camelizing rdashAlpha = /-([a-z]|[0-9])/ig, rmsPrefix = /^-ms-/, // Used by jQuery.camelCase as callback to replace() fcamelCase = function( all, letter ) { return ( letter + "" ).toUpperCase(); }, // Keep a UserAgent string for use with jQuery.browser userAgent = navigator.userAgent, // For matching the engine and version of the browser browserMatch, // The deferred used on DOM ready readyList, // The ready event handler DOMContentLoaded, // Save a reference to some core methods toString = Object.prototype.toString, hasOwn = Object.prototype.hasOwnProperty, push = Array.prototype.push, slice = Array.prototype.slice, trim = String.prototype.trim, indexOf = Array.prototype.indexOf, // [[Class]] -> type pairs class2type = {}; jQuery.fn = jQuery.prototype = { constructor: jQuery, init: function( selector, context, rootjQuery ) { var match, elem, ret, doc; // Handle $(""), $(null), or $(undefined) if ( !selector ) { return this; } // Handle $(DOMElement) if ( selector.nodeType ) { this.context = this[0] = selector; this.length = 1; return this; } // The body element only exists once, optimize finding it if ( selector === "body" && !context && document.body ) { this.context = document; this[0] = document.body; this.selector = selector; this.length = 1; return this; } // Handle HTML strings if ( typeof selector === "string" ) { // Are we dealing with HTML string or an ID? if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { // Assume that strings that start and end with <> are HTML and skip the regex check match = [ null, selector, null ]; } else { match = quickExpr.exec( selector ); } // Verify a match, and that no context was specified for #id if ( match && (match[1] || !context) ) { // HANDLE: $(html) -> $(array) if ( match[1] ) { context = context instanceof jQuery ? context[0] : context; doc = ( context ? context.ownerDocument || context : document ); // If a single string is passed in and it's a single tag // just do a createElement and skip the rest ret = rsingleTag.exec( selector ); if ( ret ) { if ( jQuery.isPlainObject( context ) ) { selector = [ document.createElement( ret[1] ) ]; jQuery.fn.attr.call( selector, context, true ); } else { selector = [ doc.createElement( ret[1] ) ]; } } else { ret = jQuery.buildFragment( [ match[1] ], [ doc ] ); selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes; } return jQuery.merge( this, selector ); // HANDLE: $("#id") } else { elem = document.getElementById( match[2] ); // Check parentNode to catch when Blackberry 4.6 returns // nodes that are no longer in the document #6963 if ( elem && elem.parentNode ) { // Handle the case where IE and Opera return items // by name instead of ID if ( elem.id !== match[2] ) { return rootjQuery.find( selector ); } // Otherwise, we inject the element directly into the jQuery object this.length = 1; this[0] = elem; } this.context = document; this.selector = selector; return this; } // HANDLE: $(expr, $(...)) } else if ( !context || context.jquery ) { return ( context || rootjQuery ).find( selector ); // HANDLE: $(expr, context) // (which is just equivalent to: $(context).find(expr) } else { return this.constructor( context ).find( selector ); } // HANDLE: $(function) // Shortcut for document ready } else if ( jQuery.isFunction( selector ) ) { return rootjQuery.ready( selector ); } if ( selector.selector !== undefined ) { this.selector = selector.selector; this.context = selector.context; } return jQuery.makeArray( selector, this ); }, // Start with an empty selector selector: "", // The current version of jQuery being used jquery: "1.7.1", // The default length of a jQuery object is 0 length: 0, // The number of elements contained in the matched element set size: function() { return this.length; }, toArray: function() { return slice.call( this, 0 ); }, // Get the Nth element in the matched element set OR // Get the whole matched element set as a clean array get: function( num ) { return num == null ? // Return a 'clean' array this.toArray() : // Return just the object ( num < 0 ? this[ this.length + num ] : this[ num ] ); }, // Take an array of elements and push it onto the stack // (returning the new matched element set) pushStack: function( elems, name, selector ) { // Build a new jQuery matched element set var ret = this.constructor(); if ( jQuery.isArray( elems ) ) { push.apply( ret, elems ); } else { jQuery.merge( ret, elems ); } // Add the old object onto the stack (as a reference) ret.prevObject = this; ret.context = this.context; if ( name === "find" ) { ret.selector = this.selector + ( this.selector ? " " : "" ) + selector; } else if ( name ) { ret.selector = this.selector + "." + name + "(" + selector + ")"; } // Return the newly-formed element set return ret; }, // Execute a callback for every element in the matched set. // (You can seed the arguments with an array of args, but this is // only used internally.) each: function( callback, args ) { return jQuery.each( this, callback, args ); }, ready: function( fn ) { // Attach the listeners jQuery.bindReady(); // Add the callback readyList.add( fn ); return this; }, eq: function( i ) { i = +i; return i === -1 ? this.slice( i ) : this.slice( i, i + 1 ); }, first: function() { return this.eq( 0 ); }, last: function() { return this.eq( -1 ); }, slice: function() { return this.pushStack( slice.apply( this, arguments ), "slice", slice.call(arguments).join(",") ); }, map: function( callback ) { return this.pushStack( jQuery.map(this, function( elem, i ) { return callback.call( elem, i, elem ); })); }, end: function() { return this.prevObject || this.constructor(null); }, // For internal use only. // Behaves like an Array's method, not like a jQuery method. push: push, sort: [].sort, splice: [].splice }; // Give the init function the jQuery prototype for later instantiation jQuery.fn.init.prototype = jQuery.fn; jQuery.extend = jQuery.fn.extend = function() { var options, name, src, copy, copyIsArray, clone, target = arguments[0] || {}, i = 1, length = arguments.length, deep = false; // Handle a deep copy situation if ( typeof target === "boolean" ) { deep = target; target = arguments[1] || {}; // skip the boolean and the target i = 2; } // Handle case when target is a string or something (possible in deep copy) if ( typeof target !== "object" && !jQuery.isFunction(target) ) { target = {}; } // extend jQuery itself if only one argument is passed if ( length === i ) { target = this; --i; } for ( ; i < length; i++ ) { // Only deal with non-null/undefined values if ( (options = arguments[ i ]) != null ) { // Extend the base object for ( name in options ) { src = target[ name ]; copy = options[ name ]; // Prevent never-ending loop if ( target === copy ) { continue; } // Recurse if we're merging plain objects or arrays if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { if ( copyIsArray ) { copyIsArray = false; clone = src && jQuery.isArray(src) ? src : []; } else { clone = src && jQuery.isPlainObject(src) ? src : {}; } // Never move original objects, clone them target[ name ] = jQuery.extend( deep, clone, copy ); // Don't bring in undefined values } else if ( copy !== undefined ) { target[ name ] = copy; } } } } // Return the modified object return target; }; jQuery.extend({ noConflict: function( deep ) { if ( window.$ === jQuery ) { window.$ = _$; } if ( deep && window.jQuery === jQuery ) { window.jQuery = _jQuery; } return jQuery; }, // Is the DOM ready to be used? Set to true once it occurs. isReady: false, // A counter to track how many items to wait for before // the ready event fires. See #6781 readyWait: 1, // Hold (or release) the ready event holdReady: function( hold ) { if ( hold ) { jQuery.readyWait++; } else { jQuery.ready( true ); } }, // Handle when the DOM is ready ready: function( wait ) { // Either a released hold or an DOMready/load event and not yet ready if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) { // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). if ( !document.body ) { return setTimeout( jQuery.ready, 1 ); } // Remember that the DOM is ready jQuery.isReady = true; // If a normal DOM Ready event fired, decrement, and wait if need be if ( wait !== true && --jQuery.readyWait > 0 ) { return; } // If there are functions bound, to execute readyList.fireWith( document, [ jQuery ] ); // Trigger any bound ready events if ( jQuery.fn.trigger ) { jQuery( document ).trigger( "ready" ).off( "ready" ); } } }, bindReady: function() { if ( readyList ) { return; } readyList = jQuery.Callbacks( "once memory" ); // Catch cases where $(document).ready() is called after the // browser event has already occurred. if ( document.readyState === "complete" ) { // Handle it asynchronously to allow scripts the opportunity to delay ready return setTimeout( jQuery.ready, 1 ); } // Mozilla, Opera and webkit nightlies currently support this event if ( document.addEventListener ) { // Use the handy event callback document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); // A fallback to window.onload, that will always work window.addEventListener( "load", jQuery.ready, false ); // If IE event model is used } else if ( document.attachEvent ) { // ensure firing before onload, // maybe late but safe also for iframes document.attachEvent( "onreadystatechange", DOMContentLoaded ); // A fallback to window.onload, that will always work window.attachEvent( "onload", jQuery.ready ); // If IE and not a frame // continually check to see if the document is ready var toplevel = false; try { toplevel = window.frameElement == null; } catch(e) {} if ( document.documentElement.doScroll && toplevel ) { doScrollCheck(); } } }, // See test/unit/core.js for details concerning isFunction. // Since version 1.3, DOM methods and functions like alert // aren't supported. They return false on IE (#2968). isFunction: function( obj ) { return jQuery.type(obj) === "function"; }, isArray: Array.isArray || function( obj ) { return jQuery.type(obj) === "array"; }, // A crude way of determining if an object is a window isWindow: function( obj ) { return obj && typeof obj === "object" && "setInterval" in obj; }, isNumeric: function( obj ) { return !isNaN( parseFloat(obj) ) && isFinite( obj ); }, type: function( obj ) { return obj == null ? String( obj ) : class2type[ toString.call(obj) ] || "object"; }, isPlainObject: function( obj ) { // Must be an Object. // Because of IE, we also have to check the presence of the constructor property. // Make sure that DOM nodes and window objects don't pass through, as well if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { return false; } try { // Not own constructor property must be Object if ( obj.constructor && !hasOwn.call(obj, "constructor") && !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { return false; } } catch ( e ) { // IE8,9 Will throw exceptions on certain host objects #9897 return false; } // Own properties are enumerated firstly, so to speed up, // if last one is own, then all properties are own. var key; for ( key in obj ) {} return key === undefined || hasOwn.call( obj, key ); }, isEmptyObject: function( obj ) { for ( var name in obj ) { return false; } return true; }, error: function( msg ) { throw new Error( msg ); }, parseJSON: function( data ) { if ( typeof data !== "string" || !data ) { return null; } // Make sure leading/trailing whitespace is removed (IE can't handle it) data = jQuery.trim( data ); // Attempt to parse using the native JSON parser first if ( window.JSON && window.JSON.parse ) { return window.JSON.parse( data ); } // Make sure the incoming data is actual JSON // Logic borrowed from http://json.org/json2.js if ( rvalidchars.test( data.replace( rvalidescape, "@" ) .replace( rvalidtokens, "]" ) .replace( rvalidbraces, "")) ) { return ( new Function( "return " + data ) )(); } jQuery.error( "Invalid JSON: " + data ); }, // Cross-browser xml parsing parseXML: function( data ) { var xml, tmp; try { if ( window.DOMParser ) { // Standard tmp = new DOMParser(); xml = tmp.parseFromString( data , "text/xml" ); } else { // IE xml = new ActiveXObject( "Microsoft.XMLDOM" ); xml.async = "false"; xml.loadXML( data ); } } catch( e ) { xml = undefined; } if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) { jQuery.error( "Invalid XML: " + data ); } return xml; }, noop: function() {}, // Evaluates a script in a global context // Workarounds based on findings by Jim Driscoll // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context globalEval: function( data ) { if ( data && rnotwhite.test( data ) ) { // We use execScript on Internet Explorer // We use an anonymous function so that context is window // rather than jQuery in Firefox ( window.execScript || function( data ) { window[ "eval" ].call( window, data ); } )( data ); } }, // Convert dashed to camelCase; used by the css and data modules // Microsoft forgot to hump their vendor prefix (#9572) camelCase: function( string ) { return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); }, nodeName: function( elem, name ) { return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase(); }, // args is for internal usage only each: function( object, callback, args ) { var name, i = 0, length = object.length, isObj = length === undefined || jQuery.isFunction( object ); if ( args ) { if ( isObj ) { for ( name in object ) { if ( callback.apply( object[ name ], args ) === false ) { break; } } } else { for ( ; i < length; ) { if ( callback.apply( object[ i++ ], args ) === false ) { break; } } } // A special, fast, case for the most common use of each } else { if ( isObj ) { for ( name in object ) { if ( callback.call( object[ name ], name, object[ name ] ) === false ) { break; } } } else { for ( ; i < length; ) { if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) { break; } } } } return object; }, // Use native String.trim function wherever possible trim: trim ? function( text ) { return text == null ? "" : trim.call( text ); } : // Otherwise use our own trimming functionality function( text ) { return text == null ? "" : text.toString().replace( trimLeft, "" ).replace( trimRight, "" ); }, // results is for internal usage only makeArray: function( array, results ) { var ret = results || []; if ( array != null ) { // The window, strings (and functions) also have 'length' // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930 var type = jQuery.type( array ); if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) { push.call( ret, array ); } else { jQuery.merge( ret, array ); } } return ret; }, inArray: function( elem, array, i ) { var len; if ( array ) { if ( indexOf ) { return indexOf.call( array, elem, i ); } len = array.length; i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; for ( ; i < len; i++ ) { // Skip accessing in sparse arrays if ( i in array && array[ i ] === elem ) { return i; } } } return -1; }, merge: function( first, second ) { var i = first.length, j = 0; if ( typeof second.length === "number" ) { for ( var l = second.length; j < l; j++ ) { first[ i++ ] = second[ j ]; } } else { while ( second[j] !== undefined ) { first[ i++ ] = second[ j++ ]; } } first.length = i; return first; }, grep: function( elems, callback, inv ) { var ret = [], retVal; inv = !!inv; // Go through the array, only saving the items // that pass the validator function for ( var i = 0, length = elems.length; i < length; i++ ) { retVal = !!callback( elems[ i ], i ); if ( inv !== retVal ) { ret.push( elems[ i ] ); } } return ret; }, // arg is for internal usage only map: function( elems, callback, arg ) { var value, key, ret = [], i = 0, length = elems.length, // jquery objects are treated as arrays isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ; // Go through the array, translating each of the items to their if ( isArray ) { for ( ; i < length; i++ ) { value = callback( elems[ i ], i, arg ); if ( value != null ) { ret[ ret.length ] = value; } } // Go through every key on the object, } else { for ( key in elems ) { value = callback( elems[ key ], key, arg ); if ( value != null ) { ret[ ret.length ] = value; } } } // Flatten any nested arrays return ret.concat.apply( [], ret ); }, // A global GUID counter for objects guid: 1, // Bind a function to a context, optionally partially applying any // arguments. proxy: function( fn, context ) { if ( typeof context === "string" ) { var tmp = fn[ context ]; context = fn; fn = tmp; } // Quick check to determine if target is callable, in the spec // this throws a TypeError, but we will just return undefined. if ( !jQuery.isFunction( fn ) ) { return undefined; } // Simulated bind var args = slice.call( arguments, 2 ), proxy = function() { return fn.apply( context, args.concat( slice.call( arguments ) ) ); }; // Set the guid of unique handler to the same of original handler, so it can be removed proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; return proxy; }, // Mutifunctional method to get and set values to a collection // The value/s can optionally be executed if it's a function access: function( elems, key, value, exec, fn, pass ) { var length = elems.length; // Setting many attributes if ( typeof key === "object" ) { for ( var k in key ) { jQuery.access( elems, k, key[k], exec, fn, value ); } return elems; } // Setting one attribute if ( value !== undefined ) { // Optionally, function values get executed if exec is true exec = !pass && exec && jQuery.isFunction(value); for ( var i = 0; i < length; i++ ) { fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); } return elems; } // Getting an attribute return length ? fn( elems[0], key ) : undefined; }, now: function() { return ( new Date() ).getTime(); }, // Use of jQuery.browser is frowned upon. // More details: http://docs.jquery.com/Utilities/jQuery.browser uaMatch: function( ua ) { ua = ua.toLowerCase(); var match = rwebkit.exec( ua ) || ropera.exec( ua ) || rmsie.exec( ua ) || ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) || []; return { browser: match[1] || "", version: match[2] || "0" }; }, sub: function() { function jQuerySub( selector, context ) { return new jQuerySub.fn.init( selector, context ); } jQuery.extend( true, jQuerySub, this ); jQuerySub.superclass = this; jQuerySub.fn = jQuerySub.prototype = this(); jQuerySub.fn.constructor = jQuerySub; jQuerySub.sub = this.sub; jQuerySub.fn.init = function init( selector, context ) { if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) { context = jQuerySub( context ); } return jQuery.fn.init.call( this, selector, context, rootjQuerySub ); }; jQuerySub.fn.init.prototype = jQuerySub.fn; var rootjQuerySub = jQuerySub(document); return jQuerySub; }, browser: {} }); // Populate the class2type map jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) { class2type[ "[object " + name + "]" ] = name.toLowerCase(); }); browserMatch = jQuery.uaMatch( userAgent ); if ( browserMatch.browser ) { jQuery.browser[ browserMatch.browser ] = true; jQuery.browser.version = browserMatch.version; } // Deprecated, use jQuery.browser.webkit instead if ( jQuery.browser.webkit ) { jQuery.browser.safari = true; } // IE doesn't match non-breaking spaces with \s if ( rnotwhite.test( "\xA0" ) ) { trimLeft = /^[\s\xA0]+/; trimRight = /[\s\xA0]+$/; } // All jQuery objects should point back to these rootjQuery = jQuery(document); // Cleanup functions for the document ready method if ( document.addEventListener ) { DOMContentLoaded = function() { document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); jQuery.ready(); }; } else if ( document.attachEvent ) { DOMContentLoaded = function() { // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). if ( document.readyState === "complete" ) { document.detachEvent( "onreadystatechange", DOMContentLoaded ); jQuery.ready(); } }; } // The DOM ready check for Internet Explorer function doScrollCheck() { if ( jQuery.isReady ) { return; } try { // If IE is used, use the trick by Diego Perini // http://javascript.nwbox.com/IEContentLoaded/ document.documentElement.doScroll("left"); } catch(e) { setTimeout( doScrollCheck, 1 ); return; } // and execute any waiting functions jQuery.ready(); } return jQuery; })(); // String to Object flags format cache var flagsCache = {}; // Convert String-formatted flags into Object-formatted ones and store in cache function createFlags( flags ) { var object = flagsCache[ flags ] = {}, i, length; flags = flags.split( /\s+/ ); for ( i = 0, length = flags.length; i < length; i++ ) { object[ flags[i] ] = true; } return object; } /* * Create a callback list using the following parameters: * * flags: an optional list of space-separated flags that will change how * the callback list behaves * * By default a callback list will act like an event callback list and can be * "fired" multiple times. * * Possible flags: * * once: will ensure the callback list can only be fired once (like a Deferred) * * memory: will keep track of previous values and will call any callback added * after the list has been fired right away with the latest "memorized" * values (like a Deferred) * * unique: will ensure a callback can only be added once (no duplicate in the list) * * stopOnFalse: interrupt callings when a callback returns false * */ jQuery.Callbacks = function( flags ) { // Convert flags from String-formatted to Object-formatted // (we check in cache first) flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {}; var // Actual callback list list = [], // Stack of fire calls for repeatable lists stack = [], // Last fire value (for non-forgettable lists) memory, // Flag to know if list is currently firing firing, // First callback to fire (used internally by add and fireWith) firingStart, // End of the loop when firing firingLength, // Index of currently firing callback (modified by remove if needed) firingIndex, // Add one or several callbacks to the list add = function( args ) { var i, length, elem, type, actual; for ( i = 0, length = args.length; i < length; i++ ) { elem = args[ i ]; type = jQuery.type( elem ); if ( type === "array" ) { // Inspect recursively add( elem ); } else if ( type === "function" ) { // Add if not in unique mode and callback is not in if ( !flags.unique || !self.has( elem ) ) { list.push( elem ); } } } }, // Fire callbacks fire = function( context, args ) { args = args || []; memory = !flags.memory || [ context, args ]; firing = true; firingIndex = firingStart || 0; firingStart = 0; firingLength = list.length; for ( ; list && firingIndex < firingLength; firingIndex++ ) { if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) { memory = true; // Mark as halted break; } } firing = false; if ( list ) { if ( !flags.once ) { if ( stack && stack.length ) { memory = stack.shift(); self.fireWith( memory[ 0 ], memory[ 1 ] ); } } else if ( memory === true ) { self.disable(); } else { list = []; } } }, // Actual Callbacks object self = { // Add a callback or a collection of callbacks to the list add: function() { if ( list ) { var length = list.length; add( arguments ); // Do we need to add the callbacks to the // current firing batch? if ( firing ) { firingLength = list.length; // With memory, if we're not firing then // we should call right away, unless previous // firing was halted (stopOnFalse) } else if ( memory && memory !== true ) { firingStart = length; fire( memory[ 0 ], memory[ 1 ] ); } } return this; }, // Remove a callback from the list remove: function() { if ( list ) { var args = arguments, argIndex = 0, argLength = args.length; for ( ; argIndex < argLength ; argIndex++ ) { for ( var i = 0; i < list.length; i++ ) { if ( args[ argIndex ] === list[ i ] ) { // Handle firingIndex and firingLength if ( firing ) { if ( i <= firingLength ) { firingLength--; if ( i <= firingIndex ) { firingIndex--; } } } // Remove the element list.splice( i--, 1 ); // If we have some unicity property then // we only need to do this once if ( flags.unique ) { break; } } } } } return this; }, // Control if a given callback is in the list has: function( fn ) { if ( list ) { var i = 0, length = list.length; for ( ; i < length; i++ ) { if ( fn === list[ i ] ) { return true; } } } return false; }, // Remove all callbacks from the list empty: function() { list = []; return this; }, // Have the list do nothing anymore disable: function() { list = stack = memory = undefined; return this; }, // Is it disabled? disabled: function() { return !list; }, // Lock the list in its current state lock: function() { stack = undefined; if ( !memory || memory === true ) { self.disable(); } return this; }, // Is it locked? locked: function() { return !stack; }, // Call all callbacks with the given context and arguments fireWith: function( context, args ) { if ( stack ) { if ( firing ) { if ( !flags.once ) { stack.push( [ context, args ] ); } } else if ( !( flags.once && memory ) ) { fire( context, args ); } } return this; }, // Call all the callbacks with the given arguments fire: function() { self.fireWith( this, arguments ); return this; }, // To know if the callbacks have already been called at least once fired: function() { return !!memory; } }; return self; }; var // Static reference to slice sliceDeferred = [].slice; jQuery.extend({ Deferred: function( func ) { var doneList = jQuery.Callbacks( "once memory" ), failList = jQuery.Callbacks( "once memory" ), progressList = jQuery.Callbacks( "memory" ), state = "pending", lists = { resolve: doneList, reject: failList, notify: progressList }, promise = { done: doneList.add, fail: failList.add, progress: progressList.add, state: function() { return state; }, // Deprecated isResolved: doneList.fired, isRejected: failList.fired, then: function( doneCallbacks, failCallbacks, progressCallbacks ) { deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks ); return this; }, always: function() { deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments ); return this; }, pipe: function( fnDone, fnFail, fnProgress ) { return jQuery.Deferred(function( newDefer ) { jQuery.each( { done: [ fnDone, "resolve" ], fail: [ fnFail, "reject" ], progress: [ fnProgress, "notify" ] }, function( handler, data ) { var fn = data[ 0 ], action = data[ 1 ], returned; if ( jQuery.isFunction( fn ) ) { deferred[ handler ](function() { returned = fn.apply( this, arguments ); if ( returned && jQuery.isFunction( returned.promise ) ) { returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify ); } else { newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] ); } }); } else { deferred[ handler ]( newDefer[ action ] ); } }); }).promise(); }, // Get a promise for this deferred // If obj is provided, the promise aspect is added to the object promise: function( obj ) { if ( obj == null ) { obj = promise; } else { for ( var key in promise ) { obj[ key ] = promise[ key ]; } } return obj; } }, deferred = promise.promise({}), key; for ( key in lists ) { deferred[ key ] = lists[ key ].fire; deferred[ key + "With" ] = lists[ key ].fireWith; } // Handle state deferred.done( function() { state = "resolved"; }, failList.disable, progressList.lock ).fail( function() { state = "rejected"; }, doneList.disable, progressList.lock ); // Call given func if any if ( func ) { func.call( deferred, deferred ); } // All done! return deferred; }, // Deferred helper when: function( firstParam ) { var args = sliceDeferred.call( arguments, 0 ), i = 0, length = args.length, pValues = new Array( length ), count = length, pCount = length, deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ? firstParam : jQuery.Deferred(), promise = deferred.promise(); function resolveFunc( i ) { return function( value ) { args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; if ( !( --count ) ) { deferred.resolveWith( deferred, args ); } }; } function progressFunc( i ) { return function( value ) { pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; deferred.notifyWith( promise, pValues ); }; } if ( length > 1 ) { for ( ; i < length; i++ ) { if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) { args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) ); } else { --count; } } if ( !count ) { deferred.resolveWith( deferred, args ); } } else if ( deferred !== firstParam ) { deferred.resolveWith( deferred, length ? [ firstParam ] : [] ); } return promise; } }); jQuery.support = (function() { var support, all, a, select, opt, input, marginDiv, fragment, tds, events, eventName, i, isSupported, div = document.createElement( "div" ), documentElement = document.documentElement; // Preliminary tests div.setAttribute("className", "t"); div.innerHTML = "
    a"; all = div.getElementsByTagName( "*" ); a = div.getElementsByTagName( "a" )[ 0 ]; // Can't get basic test support if ( !all || !all.length || !a ) { return {}; } // First batch of supports tests select = document.createElement( "select" ); opt = select.appendChild( document.createElement("option") ); input = div.getElementsByTagName( "input" )[ 0 ]; support = { // IE strips leading whitespace when .innerHTML is used leadingWhitespace: ( div.firstChild.nodeType === 3 ), // Make sure that tbody elements aren't automatically inserted // IE will insert them into empty tables tbody: !div.getElementsByTagName("tbody").length, // Make sure that link elements get serialized correctly by innerHTML // This requires a wrapper element in IE htmlSerialize: !!div.getElementsByTagName("link").length, // Get the style information from getAttribute // (IE uses .cssText instead) style: /top/.test( a.getAttribute("style") ), // Make sure that URLs aren't manipulated // (IE normalizes it by default) hrefNormalized: ( a.getAttribute("href") === "/a" ), // Make sure that element opacity exists // (IE uses filter instead) // Use a regex to work around a WebKit issue. See #5145 opacity: /^0.55/.test( a.style.opacity ), // Verify style float existence // (IE uses styleFloat instead of cssFloat) cssFloat: !!a.style.cssFloat, // Make sure that if no value is specified for a checkbox // that it defaults to "on". // (WebKit defaults to "" instead) checkOn: ( input.value === "on" ), // Make sure that a selected-by-default option has a working selected property. // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) optSelected: opt.selected, // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) getSetAttribute: div.className !== "t", // Tests for enctype support on a form(#6743) enctype: !!document.createElement("form").enctype, // Makes sure cloning an html5 element does not cause problems // Where outerHTML is undefined, this still works html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav>", // Will be defined later submitBubbles: true, changeBubbles: true, focusinBubbles: false, deleteExpando: true, noCloneEvent: true, inlineBlockNeedsLayout: false, shrinkWrapBlocks: false, reliableMarginRight: true }; // Make sure checked status is properly cloned input.checked = true; support.noCloneChecked = input.cloneNode( true ).checked; // Make sure that the options inside disabled selects aren't marked as disabled // (WebKit marks them as disabled) select.disabled = true; support.optDisabled = !opt.disabled; // Test to see if it's possible to delete an expando from an element // Fails in Internet Explorer try { delete div.test; } catch( e ) { support.deleteExpando = false; } if ( !div.addEventListener && div.attachEvent && div.fireEvent ) { div.attachEvent( "onclick", function() { // Cloning a node shouldn't copy over any // bound event handlers (IE does this) support.noCloneEvent = false; }); div.cloneNode( true ).fireEvent( "onclick" ); } // Check if a radio maintains its value // after being appended to the DOM input = document.createElement("input"); input.value = "t"; input.setAttribute("type", "radio"); support.radioValue = input.value === "t"; input.setAttribute("checked", "checked"); div.appendChild( input ); fragment = document.createDocumentFragment(); fragment.appendChild( div.lastChild ); // WebKit doesn't clone checked state correctly in fragments support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; // Check if a disconnected checkbox will retain its checked // value of true after appended to the DOM (IE6/7) support.appendChecked = input.checked; fragment.removeChild( input ); fragment.appendChild( div ); div.innerHTML = ""; // Check if div with explicit width and no margin-right incorrectly // gets computed margin-right based on width of container. For more // info see bug #3333 // Fails in WebKit before Feb 2011 nightlies // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right if ( window.getComputedStyle ) { marginDiv = document.createElement( "div" ); marginDiv.style.width = "0"; marginDiv.style.marginRight = "0"; div.style.width = "2px"; div.appendChild( marginDiv ); support.reliableMarginRight = ( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0; } // Technique from Juriy Zaytsev // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/ // We only care about the case where non-standard event systems // are used, namely in IE. Short-circuiting here helps us to // avoid an eval call (in setAttribute) which can cause CSP // to go haywire. See: https://developer.mozilla.org/en/Security/CSP if ( div.attachEvent ) { for( i in { submit: 1, change: 1, focusin: 1 }) { eventName = "on" + i; isSupported = ( eventName in div ); if ( !isSupported ) { div.setAttribute( eventName, "return;" ); isSupported = ( typeof div[ eventName ] === "function" ); } support[ i + "Bubbles" ] = isSupported; } } fragment.removeChild( div ); // Null elements to avoid leaks in IE fragment = select = opt = marginDiv = div = input = null; // Run tests that need a body at doc ready jQuery(function() { var container, outer, inner, table, td, offsetSupport, conMarginTop, ptlm, vb, style, html, body = document.getElementsByTagName("body")[0]; if ( !body ) { // Return for frameset docs that don't have a body return; } conMarginTop = 1; ptlm = "position:absolute;top:0;left:0;width:1px;height:1px;margin:0;"; vb = "visibility:hidden;border:0;"; style = "style='" + ptlm + "border:5px solid #000;padding:0;'"; html = "
    " + "" + "
    "; container = document.createElement("div"); container.style.cssText = vb + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px"; body.insertBefore( container, body.firstChild ); // Construct the test element div = document.createElement("div"); container.appendChild( div ); // Check if table cells still have offsetWidth/Height when they are set // to display:none and there are still other visible table cells in a // table row; if so, offsetWidth/Height are not reliable for use when // determining if an element has been hidden directly using // display:none (it is still safe to use offsets if a parent element is // hidden; don safety goggles and see bug #4512 for more information). // (only IE 8 fails this test) div.innerHTML = "
    t
    "; tds = div.getElementsByTagName( "td" ); isSupported = ( tds[ 0 ].offsetHeight === 0 ); tds[ 0 ].style.display = ""; tds[ 1 ].style.display = "none"; // Check if empty table cells still have offsetWidth/Height // (IE <= 8 fail this test) support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 ); // Figure out if the W3C box model works as expected div.innerHTML = ""; div.style.width = div.style.paddingLeft = "1px"; jQuery.boxModel = support.boxModel = div.offsetWidth === 2; if ( typeof div.style.zoom !== "undefined" ) { // Check if natively block-level elements act like inline-block // elements when setting their display to 'inline' and giving // them layout // (IE < 8 does this) div.style.display = "inline"; div.style.zoom = 1; support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 ); // Check if elements with layout shrink-wrap their children // (IE 6 does this) div.style.display = ""; div.innerHTML = "
    "; support.shrinkWrapBlocks = ( div.offsetWidth !== 2 ); } div.style.cssText = ptlm + vb; div.innerHTML = html; outer = div.firstChild; inner = outer.firstChild; td = outer.nextSibling.firstChild.firstChild; offsetSupport = { doesNotAddBorder: ( inner.offsetTop !== 5 ), doesAddBorderForTableAndCells: ( td.offsetTop === 5 ) }; inner.style.position = "fixed"; inner.style.top = "20px"; // safari subtracts parent border width here which is 5px offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 ); inner.style.position = inner.style.top = ""; outer.style.overflow = "hidden"; outer.style.position = "relative"; offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 ); offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop ); body.removeChild( container ); div = container = null; jQuery.extend( support, offsetSupport ); }); return support; })(); var rbrace = /^(?:\{.*\}|\[.*\])$/, rmultiDash = /([A-Z])/g; jQuery.extend({ cache: {}, // Please use with caution uuid: 0, // Unique for each copy of jQuery on the page // Non-digits removed to match rinlinejQuery expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ), // The following elements throw uncatchable exceptions if you // attempt to add expando properties to them. noData: { "embed": true, // Ban all objects except for Flash (which handle expandos) "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", "applet": true }, hasData: function( elem ) { elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; return !!elem && !isEmptyDataObject( elem ); }, data: function( elem, name, data, pvt /* Internal Use Only */ ) { if ( !jQuery.acceptData( elem ) ) { return; } var privateCache, thisCache, ret, internalKey = jQuery.expando, getByName = typeof name === "string", // We have to handle DOM nodes and JS objects differently because IE6-7 // can't GC object references properly across the DOM-JS boundary isNode = elem.nodeType, // Only DOM nodes need the global jQuery cache; JS object data is // attached directly to the object so GC can occur automatically cache = isNode ? jQuery.cache : elem, // Only defining an ID for JS objects if its cache already exists allows // the code to shortcut on the same path as a DOM node with no cache id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey, isEvents = name === "events"; // Avoid doing any more work than we need to when trying to get data on an // object that has no data at all if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) { return; } if ( !id ) { // Only DOM nodes need a new unique ID for each element since their data // ends up in the global cache if ( isNode ) { elem[ internalKey ] = id = ++jQuery.uuid; } else { id = internalKey; } } if ( !cache[ id ] ) { cache[ id ] = {}; // Avoids exposing jQuery metadata on plain JS objects when the object // is serialized using JSON.stringify if ( !isNode ) { cache[ id ].toJSON = jQuery.noop; } } // An object can be passed to jQuery.data instead of a key/value pair; this gets // shallow copied over onto the existing cache if ( typeof name === "object" || typeof name === "function" ) { if ( pvt ) { cache[ id ] = jQuery.extend( cache[ id ], name ); } else { cache[ id ].data = jQuery.extend( cache[ id ].data, name ); } } privateCache = thisCache = cache[ id ]; // jQuery data() is stored in a separate object inside the object's internal data // cache in order to avoid key collisions between internal data and user-defined // data. if ( !pvt ) { if ( !thisCache.data ) { thisCache.data = {}; } thisCache = thisCache.data; } if ( data !== undefined ) { thisCache[ jQuery.camelCase( name ) ] = data; } // Users should not attempt to inspect the internal events object using jQuery.data, // it is undocumented and subject to change. But does anyone listen? No. if ( isEvents && !thisCache[ name ] ) { return privateCache.events; } // Check for both converted-to-camel and non-converted data property names // If a data property was specified if ( getByName ) { // First Try to find as-is property data ret = thisCache[ name ]; // Test for null|undefined property data if ( ret == null ) { // Try to find the camelCased property ret = thisCache[ jQuery.camelCase( name ) ]; } } else { ret = thisCache; } return ret; }, removeData: function( elem, name, pvt /* Internal Use Only */ ) { if ( !jQuery.acceptData( elem ) ) { return; } var thisCache, i, l, // Reference to internal data cache key internalKey = jQuery.expando, isNode = elem.nodeType, // See jQuery.data for more information cache = isNode ? jQuery.cache : elem, // See jQuery.data for more information id = isNode ? elem[ internalKey ] : internalKey; // If there is already no cache entry for this object, there is no // purpose in continuing if ( !cache[ id ] ) { return; } if ( name ) { thisCache = pvt ? cache[ id ] : cache[ id ].data; if ( thisCache ) { // Support array or space separated string names for data keys if ( !jQuery.isArray( name ) ) { // try the string as a key before any manipulation if ( name in thisCache ) { name = [ name ]; } else { // split the camel cased version by spaces unless a key with the spaces exists name = jQuery.camelCase( name ); if ( name in thisCache ) { name = [ name ]; } else { name = name.split( " " ); } } } for ( i = 0, l = name.length; i < l; i++ ) { delete thisCache[ name[i] ]; } // If there is no data left in the cache, we want to continue // and let the cache object itself get destroyed if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) { return; } } } // See jQuery.data for more information if ( !pvt ) { delete cache[ id ].data; // Don't destroy the parent cache unless the internal data object // had been the only thing left in it if ( !isEmptyDataObject(cache[ id ]) ) { return; } } // Browsers that fail expando deletion also refuse to delete expandos on // the window, but it will allow it on all other JS objects; other browsers // don't care // Ensure that `cache` is not a window object #10080 if ( jQuery.support.deleteExpando || !cache.setInterval ) { delete cache[ id ]; } else { cache[ id ] = null; } // We destroyed the cache and need to eliminate the expando on the node to avoid // false lookups in the cache for entries that no longer exist if ( isNode ) { // IE does not allow us to delete expando properties from nodes, // nor does it have a removeAttribute function on Document nodes; // we must handle all of these cases if ( jQuery.support.deleteExpando ) { delete elem[ internalKey ]; } else if ( elem.removeAttribute ) { elem.removeAttribute( internalKey ); } else { elem[ internalKey ] = null; } } }, // For internal use only. _data: function( elem, name, data ) { return jQuery.data( elem, name, data, true ); }, // A method for determining if a DOM node can handle the data expando acceptData: function( elem ) { if ( elem.nodeName ) { var match = jQuery.noData[ elem.nodeName.toLowerCase() ]; if ( match ) { return !(match === true || elem.getAttribute("classid") !== match); } } return true; } }); jQuery.fn.extend({ data: function( key, value ) { var parts, attr, name, data = null; if ( typeof key === "undefined" ) { if ( this.length ) { data = jQuery.data( this[0] ); if ( this[0].nodeType === 1 && !jQuery._data( this[0], "parsedAttrs" ) ) { attr = this[0].attributes; for ( var i = 0, l = attr.length; i < l; i++ ) { name = attr[i].name; if ( name.indexOf( "data-" ) === 0 ) { name = jQuery.camelCase( name.substring(5) ); dataAttr( this[0], name, data[ name ] ); } } jQuery._data( this[0], "parsedAttrs", true ); } } return data; } else if ( typeof key === "object" ) { return this.each(function() { jQuery.data( this, key ); }); } parts = key.split("."); parts[1] = parts[1] ? "." + parts[1] : ""; if ( value === undefined ) { data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); // Try to fetch any internally stored data first if ( data === undefined && this.length ) { data = jQuery.data( this[0], key ); data = dataAttr( this[0], key, data ); } return data === undefined && parts[1] ? this.data( parts[0] ) : data; } else { return this.each(function() { var self = jQuery( this ), args = [ parts[0], value ]; self.triggerHandler( "setData" + parts[1] + "!", args ); jQuery.data( this, key, value ); self.triggerHandler( "changeData" + parts[1] + "!", args ); }); } }, removeData: function( key ) { return this.each(function() { jQuery.removeData( this, key ); }); } }); function dataAttr( elem, key, data ) { // If nothing was found internally, try to fetch any // data from the HTML5 data-* attribute if ( data === undefined && elem.nodeType === 1 ) { var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); data = elem.getAttribute( name ); if ( typeof data === "string" ) { try { data = data === "true" ? true : data === "false" ? false : data === "null" ? null : jQuery.isNumeric( data ) ? parseFloat( data ) : rbrace.test( data ) ? jQuery.parseJSON( data ) : data; } catch( e ) {} // Make sure we set the data so it isn't changed later jQuery.data( elem, key, data ); } else { data = undefined; } } return data; } // checks a cache object for emptiness function isEmptyDataObject( obj ) { for ( var name in obj ) { // if the public data object is empty, the private is still empty if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) { continue; } if ( name !== "toJSON" ) { return false; } } return true; } function handleQueueMarkDefer( elem, type, src ) { var deferDataKey = type + "defer", queueDataKey = type + "queue", markDataKey = type + "mark", defer = jQuery._data( elem, deferDataKey ); if ( defer && ( src === "queue" || !jQuery._data(elem, queueDataKey) ) && ( src === "mark" || !jQuery._data(elem, markDataKey) ) ) { // Give room for hard-coded callbacks to fire first // and eventually mark/queue something else on the element setTimeout( function() { if ( !jQuery._data( elem, queueDataKey ) && !jQuery._data( elem, markDataKey ) ) { jQuery.removeData( elem, deferDataKey, true ); defer.fire(); } }, 0 ); } } jQuery.extend({ _mark: function( elem, type ) { if ( elem ) { type = ( type || "fx" ) + "mark"; jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 ); } }, _unmark: function( force, elem, type ) { if ( force !== true ) { type = elem; elem = force; force = false; } if ( elem ) { type = type || "fx"; var key = type + "mark", count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 ); if ( count ) { jQuery._data( elem, key, count ); } else { jQuery.removeData( elem, key, true ); handleQueueMarkDefer( elem, type, "mark" ); } } }, queue: function( elem, type, data ) { var q; if ( elem ) { type = ( type || "fx" ) + "queue"; q = jQuery._data( elem, type ); // Speed up dequeue by getting out quickly if this is just a lookup if ( data ) { if ( !q || jQuery.isArray(data) ) { q = jQuery._data( elem, type, jQuery.makeArray(data) ); } else { q.push( data ); } } return q || []; } }, dequeue: function( elem, type ) { type = type || "fx"; var queue = jQuery.queue( elem, type ), fn = queue.shift(), hooks = {}; // If the fx queue is dequeued, always remove the progress sentinel if ( fn === "inprogress" ) { fn = queue.shift(); } if ( fn ) { // Add a progress sentinel to prevent the fx queue from being // automatically dequeued if ( type === "fx" ) { queue.unshift( "inprogress" ); } jQuery._data( elem, type + ".run", hooks ); fn.call( elem, function() { jQuery.dequeue( elem, type ); }, hooks ); } if ( !queue.length ) { jQuery.removeData( elem, type + "queue " + type + ".run", true ); handleQueueMarkDefer( elem, type, "queue" ); } } }); jQuery.fn.extend({ queue: function( type, data ) { if ( typeof type !== "string" ) { data = type; type = "fx"; } if ( data === undefined ) { return jQuery.queue( this[0], type ); } return this.each(function() { var queue = jQuery.queue( this, type, data ); if ( type === "fx" && queue[0] !== "inprogress" ) { jQuery.dequeue( this, type ); } }); }, dequeue: function( type ) { return this.each(function() { jQuery.dequeue( this, type ); }); }, // Based off of the plugin by Clint Helfers, with permission. // http://blindsignals.com/index.php/2009/07/jquery-delay/ delay: function( time, type ) { time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; type = type || "fx"; return this.queue( type, function( next, hooks ) { var timeout = setTimeout( next, time ); hooks.stop = function() { clearTimeout( timeout ); }; }); }, clearQueue: function( type ) { return this.queue( type || "fx", [] ); }, // Get a promise resolved when queues of a certain type // are emptied (fx is the type by default) promise: function( type, object ) { if ( typeof type !== "string" ) { object = type; type = undefined; } type = type || "fx"; var defer = jQuery.Deferred(), elements = this, i = elements.length, count = 1, deferDataKey = type + "defer", queueDataKey = type + "queue", markDataKey = type + "mark", tmp; function resolve() { if ( !( --count ) ) { defer.resolveWith( elements, [ elements ] ); } } while( i-- ) { if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) || ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) || jQuery.data( elements[ i ], markDataKey, undefined, true ) ) && jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) { count++; tmp.add( resolve ); } } resolve(); return defer.promise(); } }); var rclass = /[\n\t\r]/g, rspace = /\s+/, rreturn = /\r/g, rtype = /^(?:button|input)$/i, rfocusable = /^(?:button|input|object|select|textarea)$/i, rclickable = /^a(?:rea)?$/i, rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i, getSetAttribute = jQuery.support.getSetAttribute, nodeHook, boolHook, fixSpecified; jQuery.fn.extend({ attr: function( name, value ) { return jQuery.access( this, name, value, true, jQuery.attr ); }, removeAttr: function( name ) { return this.each(function() { jQuery.removeAttr( this, name ); }); }, prop: function( name, value ) { return jQuery.access( this, name, value, true, jQuery.prop ); }, removeProp: function( name ) { name = jQuery.propFix[ name ] || name; return this.each(function() { // try/catch handles cases where IE balks (such as removing a property on window) try { this[ name ] = undefined; delete this[ name ]; } catch( e ) {} }); }, addClass: function( value ) { var classNames, i, l, elem, setClass, c, cl; if ( jQuery.isFunction( value ) ) { return this.each(function( j ) { jQuery( this ).addClass( value.call(this, j, this.className) ); }); } if ( value && typeof value === "string" ) { classNames = value.split( rspace ); for ( i = 0, l = this.length; i < l; i++ ) { elem = this[ i ]; if ( elem.nodeType === 1 ) { if ( !elem.className && classNames.length === 1 ) { elem.className = value; } else { setClass = " " + elem.className + " "; for ( c = 0, cl = classNames.length; c < cl; c++ ) { if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) { setClass += classNames[ c ] + " "; } } elem.className = jQuery.trim( setClass ); } } } } return this; }, removeClass: function( value ) { var classNames, i, l, elem, className, c, cl; if ( jQuery.isFunction( value ) ) { return this.each(function( j ) { jQuery( this ).removeClass( value.call(this, j, this.className) ); }); } if ( (value && typeof value === "string") || value === undefined ) { classNames = ( value || "" ).split( rspace ); for ( i = 0, l = this.length; i < l; i++ ) { elem = this[ i ]; if ( elem.nodeType === 1 && elem.className ) { if ( value ) { className = (" " + elem.className + " ").replace( rclass, " " ); for ( c = 0, cl = classNames.length; c < cl; c++ ) { className = className.replace(" " + classNames[ c ] + " ", " "); } elem.className = jQuery.trim( className ); } else { elem.className = ""; } } } } return this; }, toggleClass: function( value, stateVal ) { var type = typeof value, isBool = typeof stateVal === "boolean"; if ( jQuery.isFunction( value ) ) { return this.each(function( i ) { jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal ); }); } return this.each(function() { if ( type === "string" ) { // toggle individual class names var className, i = 0, self = jQuery( this ), state = stateVal, classNames = value.split( rspace ); while ( (className = classNames[ i++ ]) ) { // check each className given, space seperated list state = isBool ? state : !self.hasClass( className ); self[ state ? "addClass" : "removeClass" ]( className ); } } else if ( type === "undefined" || type === "boolean" ) { if ( this.className ) { // store className if set jQuery._data( this, "__className__", this.className ); } // toggle whole className this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; } }); }, hasClass: function( selector ) { var className = " " + selector + " ", i = 0, l = this.length; for ( ; i < l; i++ ) { if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) { return true; } } return false; }, val: function( value ) { var hooks, ret, isFunction, elem = this[0]; if ( !arguments.length ) { if ( elem ) { hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ]; if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { return ret; } ret = elem.value; return typeof ret === "string" ? // handle most common string cases ret.replace(rreturn, "") : // handle cases where value is null/undef or number ret == null ? "" : ret; } return; } isFunction = jQuery.isFunction( value ); return this.each(function( i ) { var self = jQuery(this), val; if ( this.nodeType !== 1 ) { return; } if ( isFunction ) { val = value.call( this, i, self.val() ); } else { val = value; } // Treat null/undefined as ""; convert numbers to string if ( val == null ) { val = ""; } else if ( typeof val === "number" ) { val += ""; } else if ( jQuery.isArray( val ) ) { val = jQuery.map(val, function ( value ) { return value == null ? "" : value + ""; }); } hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ]; // If set returns undefined, fall back to normal setting if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { this.value = val; } }); } }); jQuery.extend({ valHooks: { option: { get: function( elem ) { // attributes.value is undefined in Blackberry 4.7 but // uses .value. See #6932 var val = elem.attributes.value; return !val || val.specified ? elem.value : elem.text; } }, select: { get: function( elem ) { var value, i, max, option, index = elem.selectedIndex, values = [], options = elem.options, one = elem.type === "select-one"; // Nothing was selected if ( index < 0 ) { return null; } // Loop through all the selected options i = one ? index : 0; max = one ? index + 1 : options.length; for ( ; i < max; i++ ) { option = options[ i ]; // Don't return options that are disabled or in a disabled optgroup if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) { // Get the specific value for the option value = jQuery( option ).val(); // We don't need an array for one selects if ( one ) { return value; } // Multi-Selects return an array values.push( value ); } } // Fixes Bug #2551 -- select.val() broken in IE after form.reset() if ( one && !values.length && options.length ) { return jQuery( options[ index ] ).val(); } return values; }, set: function( elem, value ) { var values = jQuery.makeArray( value ); jQuery(elem).find("option").each(function() { this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; }); if ( !values.length ) { elem.selectedIndex = -1; } return values; } } }, attrFn: { val: true, css: true, html: true, text: true, data: true, width: true, height: true, offset: true }, attr: function( elem, name, value, pass ) { var ret, hooks, notxml, nType = elem.nodeType; // don't get/set attributes on text, comment and attribute nodes if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { return; } if ( pass && name in jQuery.attrFn ) { return jQuery( elem )[ name ]( value ); } // Fallback to prop when attributes are not supported if ( typeof elem.getAttribute === "undefined" ) { return jQuery.prop( elem, name, value ); } notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); // All attributes are lowercase // Grab necessary hook if one is defined if ( notxml ) { name = name.toLowerCase(); hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook ); } if ( value !== undefined ) { if ( value === null ) { jQuery.removeAttr( elem, name ); return; } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) { return ret; } else { elem.setAttribute( name, "" + value ); return value; } } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) { return ret; } else { ret = elem.getAttribute( name ); // Non-existent attributes return null, we normalize to undefined return ret === null ? undefined : ret; } }, removeAttr: function( elem, value ) { var propName, attrNames, name, l, i = 0; if ( value && elem.nodeType === 1 ) { attrNames = value.toLowerCase().split( rspace ); l = attrNames.length; for ( ; i < l; i++ ) { name = attrNames[ i ]; if ( name ) { propName = jQuery.propFix[ name ] || name; // See #9699 for explanation of this approach (setting first, then removal) jQuery.attr( elem, name, "" ); elem.removeAttribute( getSetAttribute ? name : propName ); // Set corresponding property to false for boolean attributes if ( rboolean.test( name ) && propName in elem ) { elem[ propName ] = false; } } } } }, attrHooks: { type: { set: function( elem, value ) { // We can't allow the type property to be changed (since it causes problems in IE) if ( rtype.test( elem.nodeName ) && elem.parentNode ) { jQuery.error( "type property can't be changed" ); } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) { // Setting the type on a radio button after the value resets the value in IE6-9 // Reset value to it's default in case type is set after value // This is for element creation var val = elem.value; elem.setAttribute( "type", value ); if ( val ) { elem.value = val; } return value; } } }, // Use the value property for back compat // Use the nodeHook for button elements in IE6/7 (#1954) value: { get: function( elem, name ) { if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { return nodeHook.get( elem, name ); } return name in elem ? elem.value : null; }, set: function( elem, value, name ) { if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { return nodeHook.set( elem, value, name ); } // Does not return so that setAttribute is also used elem.value = value; } } }, propFix: { tabindex: "tabIndex", readonly: "readOnly", "for": "htmlFor", "class": "className", maxlength: "maxLength", cellspacing: "cellSpacing", cellpadding: "cellPadding", rowspan: "rowSpan", colspan: "colSpan", usemap: "useMap", frameborder: "frameBorder", contenteditable: "contentEditable" }, prop: function( elem, name, value ) { var ret, hooks, notxml, nType = elem.nodeType; // don't get/set properties on text, comment and attribute nodes if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { return; } notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); if ( notxml ) { // Fix name and attach hooks name = jQuery.propFix[ name ] || name; hooks = jQuery.propHooks[ name ]; } if ( value !== undefined ) { if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { return ret; } else { return ( elem[ name ] = value ); } } else { if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { return ret; } else { return elem[ name ]; } } }, propHooks: { tabIndex: { get: function( elem ) { // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ var attributeNode = elem.getAttributeNode("tabindex"); return attributeNode && attributeNode.specified ? parseInt( attributeNode.value, 10 ) : rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? 0 : undefined; } } } }); // Add the tabIndex propHook to attrHooks for back-compat (different case is intentional) jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex; // Hook for boolean attributes boolHook = { get: function( elem, name ) { // Align boolean attributes with corresponding properties // Fall back to attribute presence where some booleans are not supported var attrNode, property = jQuery.prop( elem, name ); return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ? name.toLowerCase() : undefined; }, set: function( elem, value, name ) { var propName; if ( value === false ) { // Remove boolean attributes when set to false jQuery.removeAttr( elem, name ); } else { // value is true since we know at this point it's type boolean and not false // Set boolean attributes to the same name and set the DOM property propName = jQuery.propFix[ name ] || name; if ( propName in elem ) { // Only set the IDL specifically if it already exists on the element elem[ propName ] = true; } elem.setAttribute( name, name.toLowerCase() ); } return name; } }; // IE6/7 do not support getting/setting some attributes with get/setAttribute if ( !getSetAttribute ) { fixSpecified = { name: true, id: true }; // Use this for any attribute in IE6/7 // This fixes almost every IE6/7 issue nodeHook = jQuery.valHooks.button = { get: function( elem, name ) { var ret; ret = elem.getAttributeNode( name ); return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ? ret.nodeValue : undefined; }, set: function( elem, value, name ) { // Set the existing or create a new attribute node var ret = elem.getAttributeNode( name ); if ( !ret ) { ret = document.createAttribute( name ); elem.setAttributeNode( ret ); } return ( ret.nodeValue = value + "" ); } }; // Apply the nodeHook to tabindex jQuery.attrHooks.tabindex.set = nodeHook.set; // Set width and height to auto instead of 0 on empty string( Bug #8150 ) // This is for removals jQuery.each([ "width", "height" ], function( i, name ) { jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { set: function( elem, value ) { if ( value === "" ) { elem.setAttribute( name, "auto" ); return value; } } }); }); // Set contenteditable to false on removals(#10429) // Setting to empty string throws an error as an invalid value jQuery.attrHooks.contenteditable = { get: nodeHook.get, set: function( elem, value, name ) { if ( value === "" ) { value = "false"; } nodeHook.set( elem, value, name ); } }; } // Some attributes require a special call on IE if ( !jQuery.support.hrefNormalized ) { jQuery.each([ "href", "src", "width", "height" ], function( i, name ) { jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { get: function( elem ) { var ret = elem.getAttribute( name, 2 ); return ret === null ? undefined : ret; } }); }); } if ( !jQuery.support.style ) { jQuery.attrHooks.style = { get: function( elem ) { // Return undefined in the case of empty string // Normalize to lowercase since IE uppercases css property names return elem.style.cssText.toLowerCase() || undefined; }, set: function( elem, value ) { return ( elem.style.cssText = "" + value ); } }; } // Safari mis-reports the default selected property of an option // Accessing the parent's selectedIndex property fixes it if ( !jQuery.support.optSelected ) { jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, { get: function( elem ) { var parent = elem.parentNode; if ( parent ) { parent.selectedIndex; // Make sure that it also works with optgroups, see #5701 if ( parent.parentNode ) { parent.parentNode.selectedIndex; } } return null; } }); } // IE6/7 call enctype encoding if ( !jQuery.support.enctype ) { jQuery.propFix.enctype = "encoding"; } // Radios and checkboxes getter/setter if ( !jQuery.support.checkOn ) { jQuery.each([ "radio", "checkbox" ], function() { jQuery.valHooks[ this ] = { get: function( elem ) { // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified return elem.getAttribute("value") === null ? "on" : elem.value; } }; }); } jQuery.each([ "radio", "checkbox" ], function() { jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], { set: function( elem, value ) { if ( jQuery.isArray( value ) ) { return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 ); } } }); }); var rformElems = /^(?:textarea|input|select)$/i, rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/, rhoverHack = /\bhover(\.\S+)?\b/, rkeyEvent = /^key/, rmouseEvent = /^(?:mouse|contextmenu)|click/, rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/, quickParse = function( selector ) { var quick = rquickIs.exec( selector ); if ( quick ) { // 0 1 2 3 // [ _, tag, id, class ] quick[1] = ( quick[1] || "" ).toLowerCase(); quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" ); } return quick; }, quickIs = function( elem, m ) { var attrs = elem.attributes || {}; return ( (!m[1] || elem.nodeName.toLowerCase() === m[1]) && (!m[2] || (attrs.id || {}).value === m[2]) && (!m[3] || m[3].test( (attrs[ "class" ] || {}).value )) ); }, hoverHack = function( events ) { return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" ); }; /* * Helper functions for managing events -- not part of the public interface. * Props to Dean Edwards' addEvent library for many of the ideas. */ jQuery.event = { add: function( elem, types, handler, data, selector ) { var elemData, eventHandle, events, t, tns, type, namespaces, handleObj, handleObjIn, quick, handlers, special; // Don't attach events to noData or text/comment nodes (allow plain objects tho) if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) { return; } // Caller can pass in an object of custom data in lieu of the handler if ( handler.handler ) { handleObjIn = handler; handler = handleObjIn.handler; } // Make sure that the handler has a unique ID, used to find/remove it later if ( !handler.guid ) { handler.guid = jQuery.guid++; } // Init the element's event structure and main handler, if this is the first events = elemData.events; if ( !events ) { elemData.events = events = {}; } eventHandle = elemData.handle; if ( !eventHandle ) { elemData.handle = eventHandle = function( e ) { // Discard the second event of a jQuery.event.trigger() and // when an event is called after a page has unloaded return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ? jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : undefined; }; // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events eventHandle.elem = elem; } // Handle multiple events separated by a space // jQuery(...).bind("mouseover mouseout", fn); types = jQuery.trim( hoverHack(types) ).split( " " ); for ( t = 0; t < types.length; t++ ) { tns = rtypenamespace.exec( types[t] ) || []; type = tns[1]; namespaces = ( tns[2] || "" ).split( "." ).sort(); // If event changes its type, use the special event handlers for the changed type special = jQuery.event.special[ type ] || {}; // If selector defined, determine special event api type, otherwise given type type = ( selector ? special.delegateType : special.bindType ) || type; // Update special based on newly reset type special = jQuery.event.special[ type ] || {}; // handleObj is passed to all event handlers handleObj = jQuery.extend({ type: type, origType: tns[1], data: data, handler: handler, guid: handler.guid, selector: selector, quick: quickParse( selector ), namespace: namespaces.join(".") }, handleObjIn ); // Init the event handler queue if we're the first handlers = events[ type ]; if ( !handlers ) { handlers = events[ type ] = []; handlers.delegateCount = 0; // Only use addEventListener/attachEvent if the special events handler returns false if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { // Bind the global event handler to the element if ( elem.addEventListener ) { elem.addEventListener( type, eventHandle, false ); } else if ( elem.attachEvent ) { elem.attachEvent( "on" + type, eventHandle ); } } } if ( special.add ) { special.add.call( elem, handleObj ); if ( !handleObj.handler.guid ) { handleObj.handler.guid = handler.guid; } } // Add to the element's handler list, delegates in front if ( selector ) { handlers.splice( handlers.delegateCount++, 0, handleObj ); } else { handlers.push( handleObj ); } // Keep track of which events have ever been used, for event optimization jQuery.event.global[ type ] = true; } // Nullify elem to prevent memory leaks in IE elem = null; }, global: {}, // Detach an event or set of events from an element remove: function( elem, types, handler, selector, mappedTypes ) { var elemData = jQuery.hasData( elem ) && jQuery._data( elem ), t, tns, type, origType, namespaces, origCount, j, events, special, handle, eventType, handleObj; if ( !elemData || !(events = elemData.events) ) { return; } // Once for each type.namespace in types; type may be omitted types = jQuery.trim( hoverHack( types || "" ) ).split(" "); for ( t = 0; t < types.length; t++ ) { tns = rtypenamespace.exec( types[t] ) || []; type = origType = tns[1]; namespaces = tns[2]; // Unbind all events (on this namespace, if provided) for the element if ( !type ) { for ( type in events ) { jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); } continue; } special = jQuery.event.special[ type ] || {}; type = ( selector? special.delegateType : special.bindType ) || type; eventType = events[ type ] || []; origCount = eventType.length; namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null; // Remove matching events for ( j = 0; j < eventType.length; j++ ) { handleObj = eventType[ j ]; if ( ( mappedTypes || origType === handleObj.origType ) && ( !handler || handler.guid === handleObj.guid ) && ( !namespaces || namespaces.test( handleObj.namespace ) ) && ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { eventType.splice( j--, 1 ); if ( handleObj.selector ) { eventType.delegateCount--; } if ( special.remove ) { special.remove.call( elem, handleObj ); } } } // Remove generic event handler if we removed something and no more handlers exist // (avoids potential for endless recursion during removal of special event handlers) if ( eventType.length === 0 && origCount !== eventType.length ) { if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) { jQuery.removeEvent( elem, type, elemData.handle ); } delete events[ type ]; } } // Remove the expando if it's no longer used if ( jQuery.isEmptyObject( events ) ) { handle = elemData.handle; if ( handle ) { handle.elem = null; } // removeData also checks for emptiness and clears the expando if empty // so use it instead of delete jQuery.removeData( elem, [ "events", "handle" ], true ); } }, // Events that are safe to short-circuit if no handlers are attached. // Native DOM events should not be added, they may have inline handlers. customEvent: { "getData": true, "setData": true, "changeData": true }, trigger: function( event, data, elem, onlyHandlers ) { // Don't do events on text and comment nodes if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) { return; } // Event object or event type var type = event.type || event, namespaces = [], cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType; // focus/blur morphs to focusin/out; ensure we're not firing them right now if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { return; } if ( type.indexOf( "!" ) >= 0 ) { // Exclusive events trigger only for the exact event (no namespaces) type = type.slice(0, -1); exclusive = true; } if ( type.indexOf( "." ) >= 0 ) { // Namespaced trigger; create a regexp to match event type in handle() namespaces = type.split("."); type = namespaces.shift(); namespaces.sort(); } if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) { // No jQuery handlers for this event type, and it can't have inline handlers return; } // Caller can pass in an Event, Object, or just an event type string event = typeof event === "object" ? // jQuery.Event object event[ jQuery.expando ] ? event : // Object literal new jQuery.Event( type, event ) : // Just the event type (string) new jQuery.Event( type ); event.type = type; event.isTrigger = true; event.exclusive = exclusive; event.namespace = namespaces.join( "." ); event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null; ontype = type.indexOf( ":" ) < 0 ? "on" + type : ""; // Handle a global trigger if ( !elem ) { // TODO: Stop taunting the data cache; remove global events and always attach to document cache = jQuery.cache; for ( i in cache ) { if ( cache[ i ].events && cache[ i ].events[ type ] ) { jQuery.event.trigger( event, data, cache[ i ].handle.elem, true ); } } return; } // Clean up the event in case it is being reused event.result = undefined; if ( !event.target ) { event.target = elem; } // Clone any incoming data and prepend the event, creating the handler arg list data = data != null ? jQuery.makeArray( data ) : []; data.unshift( event ); // Allow special events to draw outside the lines special = jQuery.event.special[ type ] || {}; if ( special.trigger && special.trigger.apply( elem, data ) === false ) { return; } // Determine event propagation path in advance, per W3C events spec (#9951) // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) eventPath = [[ elem, special.bindType || type ]]; if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { bubbleType = special.delegateType || type; cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode; old = null; for ( ; cur; cur = cur.parentNode ) { eventPath.push([ cur, bubbleType ]); old = cur; } // Only add window if we got to document (e.g., not plain obj or detached DOM) if ( old && old === elem.ownerDocument ) { eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]); } } // Fire handlers on the event path for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) { cur = eventPath[i][0]; event.type = eventPath[i][1]; handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" ); if ( handle ) { handle.apply( cur, data ); } // Note that this is a bare JS function and not a jQuery handler handle = ontype && cur[ ontype ]; if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) { event.preventDefault(); } } event.type = type; // If nobody prevented the default action, do it now if ( !onlyHandlers && !event.isDefaultPrevented() ) { if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) && !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) { // Call a native DOM method on the target with the same name name as the event. // Can't use an .isFunction() check here because IE6/7 fails that test. // Don't do default actions on window, that's where global variables be (#6170) // IE<9 dies on focus/blur to hidden element (#1486) if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) { // Don't re-trigger an onFOO event when we call its FOO() method old = elem[ ontype ]; if ( old ) { elem[ ontype ] = null; } // Prevent re-triggering of the same event, since we already bubbled it above jQuery.event.triggered = type; elem[ type ](); jQuery.event.triggered = undefined; if ( old ) { elem[ ontype ] = old; } } } } return event.result; }, dispatch: function( event ) { // Make a writable jQuery.Event from the native event object event = jQuery.event.fix( event || window.event ); var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []), delegateCount = handlers.delegateCount, args = [].slice.call( arguments, 0 ), run_all = !event.exclusive && !event.namespace, handlerQueue = [], i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related; // Use the fix-ed jQuery.Event rather than the (read-only) native event args[0] = event; event.delegateTarget = this; // Determine handlers that should run if there are delegated events // Avoid disabled elements in IE (#6911) and non-left-click bubbling in Firefox (#3861) if ( delegateCount && !event.target.disabled && !(event.button && event.type === "click") ) { // Pregenerate a single jQuery object for reuse with .is() jqcur = jQuery(this); jqcur.context = this.ownerDocument || this; for ( cur = event.target; cur != this; cur = cur.parentNode || this ) { selMatch = {}; matches = []; jqcur[0] = cur; for ( i = 0; i < delegateCount; i++ ) { handleObj = handlers[ i ]; sel = handleObj.selector; if ( selMatch[ sel ] === undefined ) { selMatch[ sel ] = ( handleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel ) ); } if ( selMatch[ sel ] ) { matches.push( handleObj ); } } if ( matches.length ) { handlerQueue.push({ elem: cur, matches: matches }); } } } // Add the remaining (directly-bound) handlers if ( handlers.length > delegateCount ) { handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) }); } // Run delegates first; they may want to stop propagation beneath us for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) { matched = handlerQueue[ i ]; event.currentTarget = matched.elem; for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) { handleObj = matched.matches[ j ]; // Triggered event must either 1) be non-exclusive and have no namespace, or // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) { event.data = handleObj.data; event.handleObj = handleObj; ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) .apply( matched.elem, args ); if ( ret !== undefined ) { event.result = ret; if ( ret === false ) { event.preventDefault(); event.stopPropagation(); } } } } } return event.result; }, // Includes some event props shared by KeyEvent and MouseEvent // *** attrChange attrName relatedNode srcElement are not normalized, non-W3C, deprecated, will be removed in 1.8 *** props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), fixHooks: {}, keyHooks: { props: "char charCode key keyCode".split(" "), filter: function( event, original ) { // Add which for key events if ( event.which == null ) { event.which = original.charCode != null ? original.charCode : original.keyCode; } return event; } }, mouseHooks: { props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), filter: function( event, original ) { var eventDoc, doc, body, button = original.button, fromElement = original.fromElement; // Calculate pageX/Y if missing and clientX/Y available if ( event.pageX == null && original.clientX != null ) { eventDoc = event.target.ownerDocument || document; doc = eventDoc.documentElement; body = eventDoc.body; event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); } // Add relatedTarget, if necessary if ( !event.relatedTarget && fromElement ) { event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; } // Add which for click: 1 === left; 2 === middle; 3 === right // Note: button is not normalized, so don't use it if ( !event.which && button !== undefined ) { event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); } return event; } }, fix: function( event ) { if ( event[ jQuery.expando ] ) { return event; } // Create a writable copy of the event object and normalize some properties var i, prop, originalEvent = event, fixHook = jQuery.event.fixHooks[ event.type ] || {}, copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; event = jQuery.Event( originalEvent ); for ( i = copy.length; i; ) { prop = copy[ --i ]; event[ prop ] = originalEvent[ prop ]; } // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2) if ( !event.target ) { event.target = originalEvent.srcElement || document; } // Target should not be a text node (#504, Safari) if ( event.target.nodeType === 3 ) { event.target = event.target.parentNode; } // For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8) if ( event.metaKey === undefined ) { event.metaKey = event.ctrlKey; } return fixHook.filter? fixHook.filter( event, originalEvent ) : event; }, special: { ready: { // Make sure the ready event is setup setup: jQuery.bindReady }, load: { // Prevent triggered image.load events from bubbling to window.load noBubble: true }, focus: { delegateType: "focusin" }, blur: { delegateType: "focusout" }, beforeunload: { setup: function( data, namespaces, eventHandle ) { // We only want to do this special case on windows if ( jQuery.isWindow( this ) ) { this.onbeforeunload = eventHandle; } }, teardown: function( namespaces, eventHandle ) { if ( this.onbeforeunload === eventHandle ) { this.onbeforeunload = null; } } } }, simulate: function( type, elem, event, bubble ) { // Piggyback on a donor event to simulate a different one. // Fake originalEvent to avoid donor's stopPropagation, but if the // simulated event prevents default then we do the same on the donor. var e = jQuery.extend( new jQuery.Event(), event, { type: type, isSimulated: true, originalEvent: {} } ); if ( bubble ) { jQuery.event.trigger( e, null, elem ); } else { jQuery.event.dispatch.call( elem, e ); } if ( e.isDefaultPrevented() ) { event.preventDefault(); } } }; // Some plugins are using, but it's undocumented/deprecated and will be removed. // The 1.7 special event interface should provide all the hooks needed now. jQuery.event.handle = jQuery.event.dispatch; jQuery.removeEvent = document.removeEventListener ? function( elem, type, handle ) { if ( elem.removeEventListener ) { elem.removeEventListener( type, handle, false ); } } : function( elem, type, handle ) { if ( elem.detachEvent ) { elem.detachEvent( "on" + type, handle ); } }; jQuery.Event = function( src, props ) { // Allow instantiation without the 'new' keyword if ( !(this instanceof jQuery.Event) ) { return new jQuery.Event( src, props ); } // Event object if ( src && src.type ) { this.originalEvent = src; this.type = src.type; // Events bubbling up the document may have been marked as prevented // by a handler lower down the tree; reflect the correct value. this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false || src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse; // Event type } else { this.type = src; } // Put explicitly provided properties onto the event object if ( props ) { jQuery.extend( this, props ); } // Create a timestamp if incoming event doesn't have one this.timeStamp = src && src.timeStamp || jQuery.now(); // Mark it as fixed this[ jQuery.expando ] = true; }; function returnFalse() { return false; } function returnTrue() { return true; } // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html jQuery.Event.prototype = { preventDefault: function() { this.isDefaultPrevented = returnTrue; var e = this.originalEvent; if ( !e ) { return; } // if preventDefault exists run it on the original event if ( e.preventDefault ) { e.preventDefault(); // otherwise set the returnValue property of the original event to false (IE) } else { e.returnValue = false; } }, stopPropagation: function() { this.isPropagationStopped = returnTrue; var e = this.originalEvent; if ( !e ) { return; } // if stopPropagation exists run it on the original event if ( e.stopPropagation ) { e.stopPropagation(); } // otherwise set the cancelBubble property of the original event to true (IE) e.cancelBubble = true; }, stopImmediatePropagation: function() { this.isImmediatePropagationStopped = returnTrue; this.stopPropagation(); }, isDefaultPrevented: returnFalse, isPropagationStopped: returnFalse, isImmediatePropagationStopped: returnFalse }; // Create mouseenter/leave events using mouseover/out and event-time checks jQuery.each({ mouseenter: "mouseover", mouseleave: "mouseout" }, function( orig, fix ) { jQuery.event.special[ orig ] = { delegateType: fix, bindType: fix, handle: function( event ) { var target = this, related = event.relatedTarget, handleObj = event.handleObj, selector = handleObj.selector, ret; // For mousenter/leave call the handler if related is outside the target. // NB: No relatedTarget if the mouse left/entered the browser window if ( !related || (related !== target && !jQuery.contains( target, related )) ) { event.type = handleObj.origType; ret = handleObj.handler.apply( this, arguments ); event.type = fix; } return ret; } }; }); // IE submit delegation if ( !jQuery.support.submitBubbles ) { jQuery.event.special.submit = { setup: function() { // Only need this for delegated form submit events if ( jQuery.nodeName( this, "form" ) ) { return false; } // Lazy-add a submit handler when a descendant form may potentially be submitted jQuery.event.add( this, "click._submit keypress._submit", function( e ) { // Node name check avoids a VML-related crash in IE (#9807) var elem = e.target, form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined; if ( form && !form._submit_attached ) { jQuery.event.add( form, "submit._submit", function( event ) { // If form was submitted by the user, bubble the event up the tree if ( this.parentNode && !event.isTrigger ) { jQuery.event.simulate( "submit", this.parentNode, event, true ); } }); form._submit_attached = true; } }); // return undefined since we don't need an event listener }, teardown: function() { // Only need this for delegated form submit events if ( jQuery.nodeName( this, "form" ) ) { return false; } // Remove delegated handlers; cleanData eventually reaps submit handlers attached above jQuery.event.remove( this, "._submit" ); } }; } // IE change delegation and checkbox/radio fix if ( !jQuery.support.changeBubbles ) { jQuery.event.special.change = { setup: function() { if ( rformElems.test( this.nodeName ) ) { // IE doesn't fire change on a check/radio until blur; trigger it on click // after a propertychange. Eat the blur-change in special.change.handle. // This still fires onchange a second time for check/radio after blur. if ( this.type === "checkbox" || this.type === "radio" ) { jQuery.event.add( this, "propertychange._change", function( event ) { if ( event.originalEvent.propertyName === "checked" ) { this._just_changed = true; } }); jQuery.event.add( this, "click._change", function( event ) { if ( this._just_changed && !event.isTrigger ) { this._just_changed = false; jQuery.event.simulate( "change", this, event, true ); } }); } return false; } // Delegated event; lazy-add a change handler on descendant inputs jQuery.event.add( this, "beforeactivate._change", function( e ) { var elem = e.target; if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) { jQuery.event.add( elem, "change._change", function( event ) { if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { jQuery.event.simulate( "change", this.parentNode, event, true ); } }); elem._change_attached = true; } }); }, handle: function( event ) { var elem = event.target; // Swallow native change events from checkbox/radio, we already triggered them above if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) { return event.handleObj.handler.apply( this, arguments ); } }, teardown: function() { jQuery.event.remove( this, "._change" ); return rformElems.test( this.nodeName ); } }; } // Create "bubbling" focus and blur events if ( !jQuery.support.focusinBubbles ) { jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { // Attach a single capturing handler while someone wants focusin/focusout var attaches = 0, handler = function( event ) { jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); }; jQuery.event.special[ fix ] = { setup: function() { if ( attaches++ === 0 ) { document.addEventListener( orig, handler, true ); } }, teardown: function() { if ( --attaches === 0 ) { document.removeEventListener( orig, handler, true ); } } }; }); } jQuery.fn.extend({ on: function( types, selector, data, fn, /*INTERNAL*/ one ) { var origFn, type; // Types can be a map of types/handlers if ( typeof types === "object" ) { // ( types-Object, selector, data ) if ( typeof selector !== "string" ) { // ( types-Object, data ) data = selector; selector = undefined; } for ( type in types ) { this.on( type, selector, data, types[ type ], one ); } return this; } if ( data == null && fn == null ) { // ( types, fn ) fn = selector; data = selector = undefined; } else if ( fn == null ) { if ( typeof selector === "string" ) { // ( types, selector, fn ) fn = data; data = undefined; } else { // ( types, data, fn ) fn = data; data = selector; selector = undefined; } } if ( fn === false ) { fn = returnFalse; } else if ( !fn ) { return this; } if ( one === 1 ) { origFn = fn; fn = function( event ) { // Can use an empty set, since event contains the info jQuery().off( event ); return origFn.apply( this, arguments ); }; // Use same guid so caller can remove using origFn fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); } return this.each( function() { jQuery.event.add( this, types, fn, data, selector ); }); }, one: function( types, selector, data, fn ) { return this.on.call( this, types, selector, data, fn, 1 ); }, off: function( types, selector, fn ) { if ( types && types.preventDefault && types.handleObj ) { // ( event ) dispatched jQuery.Event var handleObj = types.handleObj; jQuery( types.delegateTarget ).off( handleObj.namespace? handleObj.type + "." + handleObj.namespace : handleObj.type, handleObj.selector, handleObj.handler ); return this; } if ( typeof types === "object" ) { // ( types-object [, selector] ) for ( var type in types ) { this.off( type, selector, types[ type ] ); } return this; } if ( selector === false || typeof selector === "function" ) { // ( types [, fn] ) fn = selector; selector = undefined; } if ( fn === false ) { fn = returnFalse; } return this.each(function() { jQuery.event.remove( this, types, fn, selector ); }); }, bind: function( types, data, fn ) { return this.on( types, null, data, fn ); }, unbind: function( types, fn ) { return this.off( types, null, fn ); }, live: function( types, data, fn ) { jQuery( this.context ).on( types, this.selector, data, fn ); return this; }, die: function( types, fn ) { jQuery( this.context ).off( types, this.selector || "**", fn ); return this; }, delegate: function( selector, types, data, fn ) { return this.on( types, selector, data, fn ); }, undelegate: function( selector, types, fn ) { // ( namespace ) or ( selector, types [, fn] ) return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn ); }, trigger: function( type, data ) { return this.each(function() { jQuery.event.trigger( type, data, this ); }); }, triggerHandler: function( type, data ) { if ( this[0] ) { return jQuery.event.trigger( type, data, this[0], true ); } }, toggle: function( fn ) { // Save reference to arguments for access in closure var args = arguments, guid = fn.guid || jQuery.guid++, i = 0, toggler = function( event ) { // Figure out which function to execute var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i; jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 ); // Make sure that clicks stop event.preventDefault(); // and execute the function return args[ lastToggle ].apply( this, arguments ) || false; }; // link all the functions, so any of them can unbind this click handler toggler.guid = guid; while ( i < args.length ) { args[ i++ ].guid = guid; } return this.click( toggler ); }, hover: function( fnOver, fnOut ) { return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); } }); jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) { // Handle event binding jQuery.fn[ name ] = function( data, fn ) { if ( fn == null ) { fn = data; data = null; } return arguments.length > 0 ? this.on( name, null, data, fn ) : this.trigger( name ); }; if ( jQuery.attrFn ) { jQuery.attrFn[ name ] = true; } if ( rkeyEvent.test( name ) ) { jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks; } if ( rmouseEvent.test( name ) ) { jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks; } }); /*! * Sizzle CSS Selector Engine * Copyright 2011, The Dojo Foundation * Released under the MIT, BSD, and GPL Licenses. * More information: http://sizzlejs.com/ */ (function(){ var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, expando = "sizcache" + (Math.random() + '').replace('.', ''), done = 0, toString = Object.prototype.toString, hasDuplicate = false, baseHasDuplicate = true, rBackslash = /\\/g, rReturn = /\r\n/g, rNonWord = /\W/; // Here we check if the JavaScript engine is using some sort of // optimization where it does not always call our comparision // function. If that is the case, discard the hasDuplicate value. // Thus far that includes Google Chrome. [0, 0].sort(function() { baseHasDuplicate = false; return 0; }); var Sizzle = function( selector, context, results, seed ) { results = results || []; context = context || document; var origContext = context; if ( context.nodeType !== 1 && context.nodeType !== 9 ) { return []; } if ( !selector || typeof selector !== "string" ) { return results; } var m, set, checkSet, extra, ret, cur, pop, i, prune = true, contextXML = Sizzle.isXML( context ), parts = [], soFar = selector; // Reset the position of the chunker regexp (start from head) do { chunker.exec( "" ); m = chunker.exec( soFar ); if ( m ) { soFar = m[3]; parts.push( m[1] ); if ( m[2] ) { extra = m[3]; break; } } } while ( m ); if ( parts.length > 1 && origPOS.exec( selector ) ) { if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { set = posProcess( parts[0] + parts[1], context, seed ); } else { set = Expr.relative[ parts[0] ] ? [ context ] : Sizzle( parts.shift(), context ); while ( parts.length ) { selector = parts.shift(); if ( Expr.relative[ selector ] ) { selector += parts.shift(); } set = posProcess( selector, set, seed ); } } } else { // Take a shortcut and set the context if the root selector is an ID // (but not if it'll be faster if the inner selector is an ID) if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { ret = Sizzle.find( parts.shift(), context, contextXML ); context = ret.expr ? Sizzle.filter( ret.expr, ret.set )[0] : ret.set[0]; } if ( context ) { ret = seed ? { expr: parts.pop(), set: makeArray(seed) } : Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); set = ret.expr ? Sizzle.filter( ret.expr, ret.set ) : ret.set; if ( parts.length > 0 ) { checkSet = makeArray( set ); } else { prune = false; } while ( parts.length ) { cur = parts.pop(); pop = cur; if ( !Expr.relative[ cur ] ) { cur = ""; } else { pop = parts.pop(); } if ( pop == null ) { pop = context; } Expr.relative[ cur ]( checkSet, pop, contextXML ); } } else { checkSet = parts = []; } } if ( !checkSet ) { checkSet = set; } if ( !checkSet ) { Sizzle.error( cur || selector ); } if ( toString.call(checkSet) === "[object Array]" ) { if ( !prune ) { results.push.apply( results, checkSet ); } else if ( context && context.nodeType === 1 ) { for ( i = 0; checkSet[i] != null; i++ ) { if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) { results.push( set[i] ); } } } else { for ( i = 0; checkSet[i] != null; i++ ) { if ( checkSet[i] && checkSet[i].nodeType === 1 ) { results.push( set[i] ); } } } } else { makeArray( checkSet, results ); } if ( extra ) { Sizzle( extra, origContext, results, seed ); Sizzle.uniqueSort( results ); } return results; }; Sizzle.uniqueSort = function( results ) { if ( sortOrder ) { hasDuplicate = baseHasDuplicate; results.sort( sortOrder ); if ( hasDuplicate ) { for ( var i = 1; i < results.length; i++ ) { if ( results[i] === results[ i - 1 ] ) { results.splice( i--, 1 ); } } } } return results; }; Sizzle.matches = function( expr, set ) { return Sizzle( expr, null, null, set ); }; Sizzle.matchesSelector = function( node, expr ) { return Sizzle( expr, null, null, [node] ).length > 0; }; Sizzle.find = function( expr, context, isXML ) { var set, i, len, match, type, left; if ( !expr ) { return []; } for ( i = 0, len = Expr.order.length; i < len; i++ ) { type = Expr.order[i]; if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { left = match[1]; match.splice( 1, 1 ); if ( left.substr( left.length - 1 ) !== "\\" ) { match[1] = (match[1] || "").replace( rBackslash, "" ); set = Expr.find[ type ]( match, context, isXML ); if ( set != null ) { expr = expr.replace( Expr.match[ type ], "" ); break; } } } } if ( !set ) { set = typeof context.getElementsByTagName !== "undefined" ? context.getElementsByTagName( "*" ) : []; } return { set: set, expr: expr }; }; Sizzle.filter = function( expr, set, inplace, not ) { var match, anyFound, type, found, item, filter, left, i, pass, old = expr, result = [], curLoop = set, isXMLFilter = set && set[0] && Sizzle.isXML( set[0] ); while ( expr && set.length ) { for ( type in Expr.filter ) { if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { filter = Expr.filter[ type ]; left = match[1]; anyFound = false; match.splice(1,1); if ( left.substr( left.length - 1 ) === "\\" ) { continue; } if ( curLoop === result ) { result = []; } if ( Expr.preFilter[ type ] ) { match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); if ( !match ) { anyFound = found = true; } else if ( match === true ) { continue; } } if ( match ) { for ( i = 0; (item = curLoop[i]) != null; i++ ) { if ( item ) { found = filter( item, match, i, curLoop ); pass = not ^ found; if ( inplace && found != null ) { if ( pass ) { anyFound = true; } else { curLoop[i] = false; } } else if ( pass ) { result.push( item ); anyFound = true; } } } } if ( found !== undefined ) { if ( !inplace ) { curLoop = result; } expr = expr.replace( Expr.match[ type ], "" ); if ( !anyFound ) { return []; } break; } } } // Improper expression if ( expr === old ) { if ( anyFound == null ) { Sizzle.error( expr ); } else { break; } } old = expr; } return curLoop; }; Sizzle.error = function( msg ) { throw new Error( "Syntax error, unrecognized expression: " + msg ); }; /** * Utility function for retreiving the text value of an array of DOM nodes * @param {Array|Element} elem */ var getText = Sizzle.getText = function( elem ) { var i, node, nodeType = elem.nodeType, ret = ""; if ( nodeType ) { if ( nodeType === 1 || nodeType === 9 ) { // Use textContent || innerText for elements if ( typeof elem.textContent === 'string' ) { return elem.textContent; } else if ( typeof elem.innerText === 'string' ) { // Replace IE's carriage returns return elem.innerText.replace( rReturn, '' ); } else { // Traverse it's children for ( elem = elem.firstChild; elem; elem = elem.nextSibling) { ret += getText( elem ); } } } else if ( nodeType === 3 || nodeType === 4 ) { return elem.nodeValue; } } else { // If no nodeType, this is expected to be an array for ( i = 0; (node = elem[i]); i++ ) { // Do not traverse comment nodes if ( node.nodeType !== 8 ) { ret += getText( node ); } } } return ret; }; var Expr = Sizzle.selectors = { order: [ "ID", "NAME", "TAG" ], match: { ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/, ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/, TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/, CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/, POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/, PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ }, leftMatch: {}, attrMap: { "class": "className", "for": "htmlFor" }, attrHandle: { href: function( elem ) { return elem.getAttribute( "href" ); }, type: function( elem ) { return elem.getAttribute( "type" ); } }, relative: { "+": function(checkSet, part){ var isPartStr = typeof part === "string", isTag = isPartStr && !rNonWord.test( part ), isPartStrNotTag = isPartStr && !isTag; if ( isTag ) { part = part.toLowerCase(); } for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { if ( (elem = checkSet[i]) ) { while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? elem || false : elem === part; } } if ( isPartStrNotTag ) { Sizzle.filter( part, checkSet, true ); } }, ">": function( checkSet, part ) { var elem, isPartStr = typeof part === "string", i = 0, l = checkSet.length; if ( isPartStr && !rNonWord.test( part ) ) { part = part.toLowerCase(); for ( ; i < l; i++ ) { elem = checkSet[i]; if ( elem ) { var parent = elem.parentNode; checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; } } } else { for ( ; i < l; i++ ) { elem = checkSet[i]; if ( elem ) { checkSet[i] = isPartStr ? elem.parentNode : elem.parentNode === part; } } if ( isPartStr ) { Sizzle.filter( part, checkSet, true ); } } }, "": function(checkSet, part, isXML){ var nodeCheck, doneName = done++, checkFn = dirCheck; if ( typeof part === "string" && !rNonWord.test( part ) ) { part = part.toLowerCase(); nodeCheck = part; checkFn = dirNodeCheck; } checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML ); }, "~": function( checkSet, part, isXML ) { var nodeCheck, doneName = done++, checkFn = dirCheck; if ( typeof part === "string" && !rNonWord.test( part ) ) { part = part.toLowerCase(); nodeCheck = part; checkFn = dirNodeCheck; } checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML ); } }, find: { ID: function( match, context, isXML ) { if ( typeof context.getElementById !== "undefined" && !isXML ) { var m = context.getElementById(match[1]); // Check parentNode to catch when Blackberry 4.6 returns // nodes that are no longer in the document #6963 return m && m.parentNode ? [m] : []; } }, NAME: function( match, context ) { if ( typeof context.getElementsByName !== "undefined" ) { var ret = [], results = context.getElementsByName( match[1] ); for ( var i = 0, l = results.length; i < l; i++ ) { if ( results[i].getAttribute("name") === match[1] ) { ret.push( results[i] ); } } return ret.length === 0 ? null : ret; } }, TAG: function( match, context ) { if ( typeof context.getElementsByTagName !== "undefined" ) { return context.getElementsByTagName( match[1] ); } } }, preFilter: { CLASS: function( match, curLoop, inplace, result, not, isXML ) { match = " " + match[1].replace( rBackslash, "" ) + " "; if ( isXML ) { return match; } for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { if ( elem ) { if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) { if ( !inplace ) { result.push( elem ); } } else if ( inplace ) { curLoop[i] = false; } } } return false; }, ID: function( match ) { return match[1].replace( rBackslash, "" ); }, TAG: function( match, curLoop ) { return match[1].replace( rBackslash, "" ).toLowerCase(); }, CHILD: function( match ) { if ( match[1] === "nth" ) { if ( !match[2] ) { Sizzle.error( match[0] ); } match[2] = match[2].replace(/^\+|\s*/g, ''); // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec( match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); // calculate the numbers (first)n+(last) including if they are negative match[2] = (test[1] + (test[2] || 1)) - 0; match[3] = test[3] - 0; } else if ( match[2] ) { Sizzle.error( match[0] ); } // TODO: Move to normal caching system match[0] = done++; return match; }, ATTR: function( match, curLoop, inplace, result, not, isXML ) { var name = match[1] = match[1].replace( rBackslash, "" ); if ( !isXML && Expr.attrMap[name] ) { match[1] = Expr.attrMap[name]; } // Handle if an un-quoted value was used match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" ); if ( match[2] === "~=" ) { match[4] = " " + match[4] + " "; } return match; }, PSEUDO: function( match, curLoop, inplace, result, not ) { if ( match[1] === "not" ) { // If we're dealing with a complex expression, or a simple one if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { match[3] = Sizzle(match[3], null, null, curLoop); } else { var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); if ( !inplace ) { result.push.apply( result, ret ); } return false; } } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { return true; } return match; }, POS: function( match ) { match.unshift( true ); return match; } }, filters: { enabled: function( elem ) { return elem.disabled === false && elem.type !== "hidden"; }, disabled: function( elem ) { return elem.disabled === true; }, checked: function( elem ) { return elem.checked === true; }, selected: function( elem ) { // Accessing this property makes selected-by-default // options in Safari work properly if ( elem.parentNode ) { elem.parentNode.selectedIndex; } return elem.selected === true; }, parent: function( elem ) { return !!elem.firstChild; }, empty: function( elem ) { return !elem.firstChild; }, has: function( elem, i, match ) { return !!Sizzle( match[3], elem ).length; }, header: function( elem ) { return (/h\d/i).test( elem.nodeName ); }, text: function( elem ) { var attr = elem.getAttribute( "type" ), type = elem.type; // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) // use getAttribute instead to test this case return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null ); }, radio: function( elem ) { return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type; }, checkbox: function( elem ) { return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type; }, file: function( elem ) { return elem.nodeName.toLowerCase() === "input" && "file" === elem.type; }, password: function( elem ) { return elem.nodeName.toLowerCase() === "input" && "password" === elem.type; }, submit: function( elem ) { var name = elem.nodeName.toLowerCase(); return (name === "input" || name === "button") && "submit" === elem.type; }, image: function( elem ) { return elem.nodeName.toLowerCase() === "input" && "image" === elem.type; }, reset: function( elem ) { var name = elem.nodeName.toLowerCase(); return (name === "input" || name === "button") && "reset" === elem.type; }, button: function( elem ) { var name = elem.nodeName.toLowerCase(); return name === "input" && "button" === elem.type || name === "button"; }, input: function( elem ) { return (/input|select|textarea|button/i).test( elem.nodeName ); }, focus: function( elem ) { return elem === elem.ownerDocument.activeElement; } }, setFilters: { first: function( elem, i ) { return i === 0; }, last: function( elem, i, match, array ) { return i === array.length - 1; }, even: function( elem, i ) { return i % 2 === 0; }, odd: function( elem, i ) { return i % 2 === 1; }, lt: function( elem, i, match ) { return i < match[3] - 0; }, gt: function( elem, i, match ) { return i > match[3] - 0; }, nth: function( elem, i, match ) { return match[3] - 0 === i; }, eq: function( elem, i, match ) { return match[3] - 0 === i; } }, filter: { PSEUDO: function( elem, match, i, array ) { var name = match[1], filter = Expr.filters[ name ]; if ( filter ) { return filter( elem, i, match, array ); } else if ( name === "contains" ) { return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0; } else if ( name === "not" ) { var not = match[3]; for ( var j = 0, l = not.length; j < l; j++ ) { if ( not[j] === elem ) { return false; } } return true; } else { Sizzle.error( name ); } }, CHILD: function( elem, match ) { var first, last, doneName, parent, cache, count, diff, type = match[1], node = elem; switch ( type ) { case "only": case "first": while ( (node = node.previousSibling) ) { if ( node.nodeType === 1 ) { return false; } } if ( type === "first" ) { return true; } node = elem; case "last": while ( (node = node.nextSibling) ) { if ( node.nodeType === 1 ) { return false; } } return true; case "nth": first = match[2]; last = match[3]; if ( first === 1 && last === 0 ) { return true; } doneName = match[0]; parent = elem.parentNode; if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) { count = 0; for ( node = parent.firstChild; node; node = node.nextSibling ) { if ( node.nodeType === 1 ) { node.nodeIndex = ++count; } } parent[ expando ] = doneName; } diff = elem.nodeIndex - last; if ( first === 0 ) { return diff === 0; } else { return ( diff % first === 0 && diff / first >= 0 ); } } }, ID: function( elem, match ) { return elem.nodeType === 1 && elem.getAttribute("id") === match; }, TAG: function( elem, match ) { return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match; }, CLASS: function( elem, match ) { return (" " + (elem.className || elem.getAttribute("class")) + " ") .indexOf( match ) > -1; }, ATTR: function( elem, match ) { var name = match[1], result = Sizzle.attr ? Sizzle.attr( elem, name ) : Expr.attrHandle[ name ] ? Expr.attrHandle[ name ]( elem ) : elem[ name ] != null ? elem[ name ] : elem.getAttribute( name ), value = result + "", type = match[2], check = match[4]; return result == null ? type === "!=" : !type && Sizzle.attr ? result != null : type === "=" ? value === check : type === "*=" ? value.indexOf(check) >= 0 : type === "~=" ? (" " + value + " ").indexOf(check) >= 0 : !check ? value && result !== false : type === "!=" ? value !== check : type === "^=" ? value.indexOf(check) === 0 : type === "$=" ? value.substr(value.length - check.length) === check : type === "|=" ? value === check || value.substr(0, check.length + 1) === check + "-" : false; }, POS: function( elem, match, i, array ) { var name = match[2], filter = Expr.setFilters[ name ]; if ( filter ) { return filter( elem, i, match, array ); } } } }; var origPOS = Expr.match.POS, fescape = function(all, num){ return "\\" + (num - 0 + 1); }; for ( var type in Expr.match ) { Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) ); Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) ); } var makeArray = function( array, results ) { array = Array.prototype.slice.call( array, 0 ); if ( results ) { results.push.apply( results, array ); return results; } return array; }; // Perform a simple check to determine if the browser is capable of // converting a NodeList to an array using builtin methods. // Also verifies that the returned array holds DOM nodes // (which is not the case in the Blackberry browser) try { Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType; // Provide a fallback method if it does not work } catch( e ) { makeArray = function( array, results ) { var i = 0, ret = results || []; if ( toString.call(array) === "[object Array]" ) { Array.prototype.push.apply( ret, array ); } else { if ( typeof array.length === "number" ) { for ( var l = array.length; i < l; i++ ) { ret.push( array[i] ); } } else { for ( ; array[i]; i++ ) { ret.push( array[i] ); } } } return ret; }; } var sortOrder, siblingCheck; if ( document.documentElement.compareDocumentPosition ) { sortOrder = function( a, b ) { if ( a === b ) { hasDuplicate = true; return 0; } if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { return a.compareDocumentPosition ? -1 : 1; } return a.compareDocumentPosition(b) & 4 ? -1 : 1; }; } else { sortOrder = function( a, b ) { // The nodes are identical, we can exit early if ( a === b ) { hasDuplicate = true; return 0; // Fallback to using sourceIndex (in IE) if it's available on both nodes } else if ( a.sourceIndex && b.sourceIndex ) { return a.sourceIndex - b.sourceIndex; } var al, bl, ap = [], bp = [], aup = a.parentNode, bup = b.parentNode, cur = aup; // If the nodes are siblings (or identical) we can do a quick check if ( aup === bup ) { return siblingCheck( a, b ); // If no parents were found then the nodes are disconnected } else if ( !aup ) { return -1; } else if ( !bup ) { return 1; } // Otherwise they're somewhere else in the tree so we need // to build up a full list of the parentNodes for comparison while ( cur ) { ap.unshift( cur ); cur = cur.parentNode; } cur = bup; while ( cur ) { bp.unshift( cur ); cur = cur.parentNode; } al = ap.length; bl = bp.length; // Start walking down the tree looking for a discrepancy for ( var i = 0; i < al && i < bl; i++ ) { if ( ap[i] !== bp[i] ) { return siblingCheck( ap[i], bp[i] ); } } // We ended someplace up the tree so do a sibling check return i === al ? siblingCheck( a, bp[i], -1 ) : siblingCheck( ap[i], b, 1 ); }; siblingCheck = function( a, b, ret ) { if ( a === b ) { return ret; } var cur = a.nextSibling; while ( cur ) { if ( cur === b ) { return -1; } cur = cur.nextSibling; } return 1; }; } // Check to see if the browser returns elements by name when // querying by getElementById (and provide a workaround) (function(){ // We're going to inject a fake input element with a specified name var form = document.createElement("div"), id = "script" + (new Date()).getTime(), root = document.documentElement; form.innerHTML = ""; // Inject it into the root element, check its status, and remove it quickly root.insertBefore( form, root.firstChild ); // The workaround has to do additional checks after a getElementById // Which slows things down for other browsers (hence the branching) if ( document.getElementById( id ) ) { Expr.find.ID = function( match, context, isXML ) { if ( typeof context.getElementById !== "undefined" && !isXML ) { var m = context.getElementById(match[1]); return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : []; } }; Expr.filter.ID = function( elem, match ) { var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); return elem.nodeType === 1 && node && node.nodeValue === match; }; } root.removeChild( form ); // release memory in IE root = form = null; })(); (function(){ // Check to see if the browser returns only elements // when doing getElementsByTagName("*") // Create a fake element var div = document.createElement("div"); div.appendChild( document.createComment("") ); // Make sure no comments are found if ( div.getElementsByTagName("*").length > 0 ) { Expr.find.TAG = function( match, context ) { var results = context.getElementsByTagName( match[1] ); // Filter out possible comments if ( match[1] === "*" ) { var tmp = []; for ( var i = 0; results[i]; i++ ) { if ( results[i].nodeType === 1 ) { tmp.push( results[i] ); } } results = tmp; } return results; }; } // Check to see if an attribute returns normalized href attributes div.innerHTML = ""; if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && div.firstChild.getAttribute("href") !== "#" ) { Expr.attrHandle.href = function( elem ) { return elem.getAttribute( "href", 2 ); }; } // release memory in IE div = null; })(); if ( document.querySelectorAll ) { (function(){ var oldSizzle = Sizzle, div = document.createElement("div"), id = "__sizzle__"; div.innerHTML = "

    "; // Safari can't handle uppercase or unicode characters when // in quirks mode. if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { return; } Sizzle = function( query, context, extra, seed ) { context = context || document; // Only use querySelectorAll on non-XML documents // (ID selectors don't work in non-HTML documents) if ( !seed && !Sizzle.isXML(context) ) { // See if we find a selector to speed up var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query ); if ( match && (context.nodeType === 1 || context.nodeType === 9) ) { // Speed-up: Sizzle("TAG") if ( match[1] ) { return makeArray( context.getElementsByTagName( query ), extra ); // Speed-up: Sizzle(".CLASS") } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) { return makeArray( context.getElementsByClassName( match[2] ), extra ); } } if ( context.nodeType === 9 ) { // Speed-up: Sizzle("body") // The body element only exists once, optimize finding it if ( query === "body" && context.body ) { return makeArray( [ context.body ], extra ); // Speed-up: Sizzle("#ID") } else if ( match && match[3] ) { var elem = context.getElementById( match[3] ); // Check parentNode to catch when Blackberry 4.6 returns // nodes that are no longer in the document #6963 if ( elem && elem.parentNode ) { // Handle the case where IE and Opera return items // by name instead of ID if ( elem.id === match[3] ) { return makeArray( [ elem ], extra ); } } else { return makeArray( [], extra ); } } try { return makeArray( context.querySelectorAll(query), extra ); } catch(qsaError) {} // qSA works strangely on Element-rooted queries // We can work around this by specifying an extra ID on the root // and working up from there (Thanks to Andrew Dupont for the technique) // IE 8 doesn't work on object elements } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { var oldContext = context, old = context.getAttribute( "id" ), nid = old || id, hasParent = context.parentNode, relativeHierarchySelector = /^\s*[+~]/.test( query ); if ( !old ) { context.setAttribute( "id", nid ); } else { nid = nid.replace( /'/g, "\\$&" ); } if ( relativeHierarchySelector && hasParent ) { context = context.parentNode; } try { if ( !relativeHierarchySelector || hasParent ) { return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra ); } } catch(pseudoError) { } finally { if ( !old ) { oldContext.removeAttribute( "id" ); } } } } return oldSizzle(query, context, extra, seed); }; for ( var prop in oldSizzle ) { Sizzle[ prop ] = oldSizzle[ prop ]; } // release memory in IE div = null; })(); } (function(){ var html = document.documentElement, matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector; if ( matches ) { // Check to see if it's possible to do matchesSelector // on a disconnected node (IE 9 fails this) var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ), pseudoWorks = false; try { // This should fail with an exception // Gecko does not error, returns false instead matches.call( document.documentElement, "[test!='']:sizzle" ); } catch( pseudoError ) { pseudoWorks = true; } Sizzle.matchesSelector = function( node, expr ) { // Make sure that attribute selectors are quoted expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']"); if ( !Sizzle.isXML( node ) ) { try { if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) { var ret = matches.call( node, expr ); // IE 9's matchesSelector returns false on disconnected nodes if ( ret || !disconnectedMatch || // As well, disconnected nodes are said to be in a document // fragment in IE 9, so check for that node.document && node.document.nodeType !== 11 ) { return ret; } } } catch(e) {} } return Sizzle(expr, null, null, [node]).length > 0; }; } })(); (function(){ var div = document.createElement("div"); div.innerHTML = "
    "; // Opera can't find a second classname (in 9.6) // Also, make sure that getElementsByClassName actually exists if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) { return; } // Safari caches class attributes, doesn't catch changes (in 3.2) div.lastChild.className = "e"; if ( div.getElementsByClassName("e").length === 1 ) { return; } Expr.order.splice(1, 0, "CLASS"); Expr.find.CLASS = function( match, context, isXML ) { if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { return context.getElementsByClassName(match[1]); } }; // release memory in IE div = null; })(); function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { for ( var i = 0, l = checkSet.length; i < l; i++ ) { var elem = checkSet[i]; if ( elem ) { var match = false; elem = elem[dir]; while ( elem ) { if ( elem[ expando ] === doneName ) { match = checkSet[elem.sizset]; break; } if ( elem.nodeType === 1 && !isXML ){ elem[ expando ] = doneName; elem.sizset = i; } if ( elem.nodeName.toLowerCase() === cur ) { match = elem; break; } elem = elem[dir]; } checkSet[i] = match; } } } function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { for ( var i = 0, l = checkSet.length; i < l; i++ ) { var elem = checkSet[i]; if ( elem ) { var match = false; elem = elem[dir]; while ( elem ) { if ( elem[ expando ] === doneName ) { match = checkSet[elem.sizset]; break; } if ( elem.nodeType === 1 ) { if ( !isXML ) { elem[ expando ] = doneName; elem.sizset = i; } if ( typeof cur !== "string" ) { if ( elem === cur ) { match = true; break; } } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { match = elem; break; } } elem = elem[dir]; } checkSet[i] = match; } } } if ( document.documentElement.contains ) { Sizzle.contains = function( a, b ) { return a !== b && (a.contains ? a.contains(b) : true); }; } else if ( document.documentElement.compareDocumentPosition ) { Sizzle.contains = function( a, b ) { return !!(a.compareDocumentPosition(b) & 16); }; } else { Sizzle.contains = function() { return false; }; } Sizzle.isXML = function( elem ) { // documentElement is verified for cases where it doesn't yet exist // (such as loading iframes in IE - #4833) var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; return documentElement ? documentElement.nodeName !== "HTML" : false; }; var posProcess = function( selector, context, seed ) { var match, tmpSet = [], later = "", root = context.nodeType ? [context] : context; // Position selectors must be done after the filter // And so must :not(positional) so we move all PSEUDOs to the end while ( (match = Expr.match.PSEUDO.exec( selector )) ) { later += match[0]; selector = selector.replace( Expr.match.PSEUDO, "" ); } selector = Expr.relative[selector] ? selector + "*" : selector; for ( var i = 0, l = root.length; i < l; i++ ) { Sizzle( selector, root[i], tmpSet, seed ); } return Sizzle.filter( later, tmpSet ); }; // EXPOSE // Override sizzle attribute retrieval Sizzle.attr = jQuery.attr; Sizzle.selectors.attrMap = {}; jQuery.find = Sizzle; jQuery.expr = Sizzle.selectors; jQuery.expr[":"] = jQuery.expr.filters; jQuery.unique = Sizzle.uniqueSort; jQuery.text = Sizzle.getText; jQuery.isXMLDoc = Sizzle.isXML; jQuery.contains = Sizzle.contains; })(); var runtil = /Until$/, rparentsprev = /^(?:parents|prevUntil|prevAll)/, // Note: This RegExp should be improved, or likely pulled from Sizzle rmultiselector = /,/, isSimple = /^.[^:#\[\.,]*$/, slice = Array.prototype.slice, POS = jQuery.expr.match.POS, // methods guaranteed to produce a unique set when starting from a unique set guaranteedUnique = { children: true, contents: true, next: true, prev: true }; jQuery.fn.extend({ find: function( selector ) { var self = this, i, l; if ( typeof selector !== "string" ) { return jQuery( selector ).filter(function() { for ( i = 0, l = self.length; i < l; i++ ) { if ( jQuery.contains( self[ i ], this ) ) { return true; } } }); } var ret = this.pushStack( "", "find", selector ), length, n, r; for ( i = 0, l = this.length; i < l; i++ ) { length = ret.length; jQuery.find( selector, this[i], ret ); if ( i > 0 ) { // Make sure that the results are unique for ( n = length; n < ret.length; n++ ) { for ( r = 0; r < length; r++ ) { if ( ret[r] === ret[n] ) { ret.splice(n--, 1); break; } } } } } return ret; }, has: function( target ) { var targets = jQuery( target ); return this.filter(function() { for ( var i = 0, l = targets.length; i < l; i++ ) { if ( jQuery.contains( this, targets[i] ) ) { return true; } } }); }, not: function( selector ) { return this.pushStack( winnow(this, selector, false), "not", selector); }, filter: function( selector ) { return this.pushStack( winnow(this, selector, true), "filter", selector ); }, is: function( selector ) { return !!selector && ( typeof selector === "string" ? // If this is a positional selector, check membership in the returned set // so $("p:first").is("p:last") won't return true for a doc with two "p". POS.test( selector ) ? jQuery( selector, this.context ).index( this[0] ) >= 0 : jQuery.filter( selector, this ).length > 0 : this.filter( selector ).length > 0 ); }, closest: function( selectors, context ) { var ret = [], i, l, cur = this[0]; // Array (deprecated as of jQuery 1.7) if ( jQuery.isArray( selectors ) ) { var level = 1; while ( cur && cur.ownerDocument && cur !== context ) { for ( i = 0; i < selectors.length; i++ ) { if ( jQuery( cur ).is( selectors[ i ] ) ) { ret.push({ selector: selectors[ i ], elem: cur, level: level }); } } cur = cur.parentNode; level++; } return ret; } // String var pos = POS.test( selectors ) || typeof selectors !== "string" ? jQuery( selectors, context || this.context ) : 0; for ( i = 0, l = this.length; i < l; i++ ) { cur = this[i]; while ( cur ) { if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) { ret.push( cur ); break; } else { cur = cur.parentNode; if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) { break; } } } } ret = ret.length > 1 ? jQuery.unique( ret ) : ret; return this.pushStack( ret, "closest", selectors ); }, // Determine the position of an element within // the matched set of elements index: function( elem ) { // No argument, return index in parent if ( !elem ) { return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1; } // index in selector if ( typeof elem === "string" ) { return jQuery.inArray( this[0], jQuery( elem ) ); } // Locate the position of the desired element return jQuery.inArray( // If it receives a jQuery object, the first element is used elem.jquery ? elem[0] : elem, this ); }, add: function( selector, context ) { var set = typeof selector === "string" ? jQuery( selector, context ) : jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ), all = jQuery.merge( this.get(), set ); return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ? all : jQuery.unique( all ) ); }, andSelf: function() { return this.add( this.prevObject ); } }); // A painfully simple check to see if an element is disconnected // from a document (should be improved, where feasible). function isDisconnected( node ) { return !node || !node.parentNode || node.parentNode.nodeType === 11; } jQuery.each({ parent: function( elem ) { var parent = elem.parentNode; return parent && parent.nodeType !== 11 ? parent : null; }, parents: function( elem ) { return jQuery.dir( elem, "parentNode" ); }, parentsUntil: function( elem, i, until ) { return jQuery.dir( elem, "parentNode", until ); }, next: function( elem ) { return jQuery.nth( elem, 2, "nextSibling" ); }, prev: function( elem ) { return jQuery.nth( elem, 2, "previousSibling" ); }, nextAll: function( elem ) { return jQuery.dir( elem, "nextSibling" ); }, prevAll: function( elem ) { return jQuery.dir( elem, "previousSibling" ); }, nextUntil: function( elem, i, until ) { return jQuery.dir( elem, "nextSibling", until ); }, prevUntil: function( elem, i, until ) { return jQuery.dir( elem, "previousSibling", until ); }, siblings: function( elem ) { return jQuery.sibling( elem.parentNode.firstChild, elem ); }, children: function( elem ) { return jQuery.sibling( elem.firstChild ); }, contents: function( elem ) { return jQuery.nodeName( elem, "iframe" ) ? elem.contentDocument || elem.contentWindow.document : jQuery.makeArray( elem.childNodes ); } }, function( name, fn ) { jQuery.fn[ name ] = function( until, selector ) { var ret = jQuery.map( this, fn, until ); if ( !runtil.test( name ) ) { selector = until; } if ( selector && typeof selector === "string" ) { ret = jQuery.filter( selector, ret ); } ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret; if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) { ret = ret.reverse(); } return this.pushStack( ret, name, slice.call( arguments ).join(",") ); }; }); jQuery.extend({ filter: function( expr, elems, not ) { if ( not ) { expr = ":not(" + expr + ")"; } return elems.length === 1 ? jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] : jQuery.find.matches(expr, elems); }, dir: function( elem, dir, until ) { var matched = [], cur = elem[ dir ]; while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { if ( cur.nodeType === 1 ) { matched.push( cur ); } cur = cur[dir]; } return matched; }, nth: function( cur, result, dir, elem ) { result = result || 1; var num = 0; for ( ; cur; cur = cur[dir] ) { if ( cur.nodeType === 1 && ++num === result ) { break; } } return cur; }, sibling: function( n, elem ) { var r = []; for ( ; n; n = n.nextSibling ) { if ( n.nodeType === 1 && n !== elem ) { r.push( n ); } } return r; } }); // Implement the identical functionality for filter and not function winnow( elements, qualifier, keep ) { // Can't pass null or undefined to indexOf in Firefox 4 // Set to 0 to skip string check qualifier = qualifier || 0; if ( jQuery.isFunction( qualifier ) ) { return jQuery.grep(elements, function( elem, i ) { var retVal = !!qualifier.call( elem, i, elem ); return retVal === keep; }); } else if ( qualifier.nodeType ) { return jQuery.grep(elements, function( elem, i ) { return ( elem === qualifier ) === keep; }); } else if ( typeof qualifier === "string" ) { var filtered = jQuery.grep(elements, function( elem ) { return elem.nodeType === 1; }); if ( isSimple.test( qualifier ) ) { return jQuery.filter(qualifier, filtered, !keep); } else { qualifier = jQuery.filter( qualifier, filtered ); } } return jQuery.grep(elements, function( elem, i ) { return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep; }); } function createSafeFragment( document ) { var list = nodeNames.split( "|" ), safeFrag = document.createDocumentFragment(); if ( safeFrag.createElement ) { while ( list.length ) { safeFrag.createElement( list.pop() ); } } return safeFrag; } var nodeNames = "abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|" + "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, rleadingWhitespace = /^\s+/, rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig, rtagName = /<([\w:]+)/, rtbody = /", "" ], legend: [ 1, "
    ", "
    " ], thead: [ 1, "", "
    " ], tr: [ 2, "", "
    " ], td: [ 3, "", "
    " ], col: [ 2, "", "
    " ], area: [ 1, "", "" ], _default: [ 0, "", "" ] }, safeFragment = createSafeFragment( document ); wrapMap.optgroup = wrapMap.option; wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; wrapMap.th = wrapMap.td; // IE can't serialize and > > For usage instructions, see in usage.txt. For available options, see in jqPlotOptions.txt. Building from source: If you've cloned the repository, you can build a distribution from source. You need to have ant installed. You can simply type "ant" from the jqplot directory to build the default "all" target. There are 6 pertinent targets: clean, dist, min, docs, compress and all. Use: > ant -p to get a description of the various build targets. Legal Notices: Copyright (c) 2009-2013 Chris Leonello jqPlot is currently available for use in all personal or commercial projects under both the MIT and GPL version 2.0 licenses. This means that you can choose the license that best suits your project and use it accordingly. Although not required, the author would appreciate an email letting him know of any substantial use of jqPlot. You can reach the author at: chris at jqplot or see http://www.jqplot.com/info.php . If you are feeling kind and generous, consider supporting the project by making a donation at: http://www.jqplot.com/donate.php . jqPlot includes date instance methods and printf/sprintf functions by other authors: Date instance methods: author Ken Snyder (ken d snyder at gmail dot com) date 2008-09-10 version 2.0.2 (http://kendsnyder.com/sandbox/date/) license Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/) JavaScript printf/sprintf functions. version 2007.04.27 author Ash Searle http://hexmen.com/blog/2007/03/printf-sprintf/ http://hexmen.com/js/sprintf.js The author (Ash Searle) has placed this code in the public domain: "This code is unrestricted: you are free to use it however you like." /* * Treeview 1.5pre - jQuery plugin to hide and show branches of a tree * * http://bassistance.de/jquery-plugins/jquery-plugin-treeview/ * http://docs.jquery.com/Plugins/Treeview * * Copyright (c) 2007 Jörn Zaefferer * * Dual licensed under the MIT and GPL licenses: * http://www.opensource.org/licenses/mit-license.php * http://www.gnu.org/licenses/gpl.html * * Revision: $Id: jquery.treeview.js 5759 2008-07-01 07:50:28Z joern.zaefferer $ * */ ;(function($) { // TODO rewrite as a widget, removing all the extra plugins $.extend($.fn, { swapClass: function(c1, c2) { var c1Elements = this.filter('.' + c1); this.filter('.' + c2).removeClass(c2).addClass(c1); c1Elements.removeClass(c1).addClass(c2); return this; }, replaceClass: function(c1, c2) { return this.filter('.' + c1).removeClass(c1).addClass(c2).end(); }, hoverClass: function(className) { className = className || "hover"; return this.hover(function() { $(this).addClass(className); }, function() { $(this).removeClass(className); }); }, heightToggle: function(animated, callback) { animated ? this.animate({ height: "toggle" }, animated, callback) : this.each(function(){ jQuery(this)[ jQuery(this).is(":hidden") ? "show" : "hide" ](); if(callback) callback.apply(this, arguments); }); }, heightHide: function(animated, callback) { if (animated) { this.animate({ height: "hide" }, animated, callback); } else { this.hide(); if (callback) this.each(callback); } }, prepareBranches: function(settings) { if (!settings.prerendered) { // mark last tree items this.filter(":last-child:not(ul)").addClass(CLASSES.last); // collapse whole tree, or only those marked as closed, anyway except those marked as open this.filter((settings.collapsed ? "" : "." + CLASSES.closed) + ":not(." + CLASSES.open + ")").find(">ul").hide(); } // return all items with sublists return this.filter(":has(>ul)"); }, applyClasses: function(settings, toggler) { // TODO use event delegation this.filter(":has(>ul):not(:has(>a))").find(">span").unbind("click.treeview").bind("click.treeview", function(event) { // don't handle click events on children, eg. checkboxes if ( this == event.target ) toggler.apply($(this).next()); }).add( $("a", this) ).hoverClass(); if (!settings.prerendered) { // handle closed ones first this.filter(":has(>ul:hidden)") .addClass(CLASSES.expandable) .replaceClass(CLASSES.last, CLASSES.lastExpandable); // handle open ones this.not(":has(>ul:hidden)") .addClass(CLASSES.collapsable) .replaceClass(CLASSES.last, CLASSES.lastCollapsable); // create hitarea if not present var hitarea = this.find("div." + CLASSES.hitarea); if (!hitarea.length) hitarea = this.prepend("
    ").find("div." + CLASSES.hitarea); hitarea.removeClass().addClass(CLASSES.hitarea).each(function() { var classes = ""; $.each($(this).parent().attr("class").split(" "), function() { classes += this + "-hitarea "; }); $(this).addClass( classes ); }) } // apply event to hitarea this.find("div." + CLASSES.hitarea).click( toggler ); }, treeview: function(settings) { settings = $.extend({ cookieId: "treeview" }, settings); if ( settings.toggle ) { var callback = settings.toggle; settings.toggle = function() { return callback.apply($(this).parent()[0], arguments); }; } // factory for treecontroller function treeController(tree, control) { // factory for click handlers function handler(filter) { return function() { // reuse toggle event handler, applying the elements to toggle // start searching for all hitareas toggler.apply( $("div." + CLASSES.hitarea, tree).filter(function() { // for plain toggle, no filter is provided, otherwise we need to check the parent element return filter ? $(this).parent("." + filter).length : true; }) ); return false; }; } // click on first element to collapse tree $("a:eq(0)", control).click( handler(CLASSES.collapsable) ); // click on second to expand tree $("a:eq(1)", control).click( handler(CLASSES.expandable) ); // click on third to toggle tree $("a:eq(2)", control).click( handler() ); } // handle toggle event function toggler() { $(this) .parent() // swap classes for hitarea .find(">.hitarea") .swapClass( CLASSES.collapsableHitarea, CLASSES.expandableHitarea ) .swapClass( CLASSES.lastCollapsableHitarea, CLASSES.lastExpandableHitarea ) .end() // swap classes for parent li .swapClass( CLASSES.collapsable, CLASSES.expandable ) .swapClass( CLASSES.lastCollapsable, CLASSES.lastExpandable ) // find child lists .find( ">ul" ) // toggle them .heightToggle( settings.animated, settings.toggle ); if ( settings.unique ) { $(this).parent() .siblings() // swap classes for hitarea .find(">.hitarea") .replaceClass( CLASSES.collapsableHitarea, CLASSES.expandableHitarea ) .replaceClass( CLASSES.lastCollapsableHitarea, CLASSES.lastExpandableHitarea ) .end() .replaceClass( CLASSES.collapsable, CLASSES.expandable ) .replaceClass( CLASSES.lastCollapsable, CLASSES.lastExpandable ) .find( ">ul" ) .heightHide( settings.animated, settings.toggle ); } } this.data("toggler", toggler); function serialize() { function binary(arg) { return arg ? 1 : 0; } var data = []; branches.each(function(i, e) { data[i] = $(e).is(":has(>ul:visible)") ? 1 : 0; }); $.cookie(settings.cookieId, data.join(""), settings.cookieOptions ); } function deserialize() { var stored = $.cookie(settings.cookieId); if ( stored ) { var data = stored.split(""); branches.each(function(i, e) { $(e).find(">ul")[ parseInt(data[i]) ? "show" : "hide" ](); }); } } // add treeview class to activate styles this.addClass("treeview"); // prepare branches and find all tree items with child lists var branches = this.find("li").prepareBranches(settings); switch(settings.persist) { case "cookie": var toggleCallback = settings.toggle; settings.toggle = function() { serialize(); if (toggleCallback) { toggleCallback.apply(this, arguments); } }; deserialize(); break; case "location": var current = this.find("a").filter(function() { return this.href.toLowerCase() == location.href.toLowerCase(); }); if ( current.length ) { // TODO update the open/closed classes var items = current.addClass("selected").parents("ul, li").add( current.next() ).show(); if (settings.prerendered) { // if prerendered is on, replicate the basic class swapping items.filter("li") .swapClass( CLASSES.collapsable, CLASSES.expandable ) .swapClass( CLASSES.lastCollapsable, CLASSES.lastExpandable ) .find(">.hitarea") .swapClass( CLASSES.collapsableHitarea, CLASSES.expandableHitarea ) .swapClass( CLASSES.lastCollapsableHitarea, CLASSES.lastExpandableHitarea ); } } break; } branches.applyClasses(settings, toggler); // if control option is set, create the treecontroller and show it if ( settings.control ) { treeController(this, settings.control); $(settings.control).show(); } return this; } }); // classes used by the plugin // need to be styled via external stylesheet, see first example $.treeview = {}; var CLASSES = ($.treeview.classes = { open: "open", closed: "closed", expandable: "expandable", expandableHitarea: "expandable-hitarea", lastExpandableHitarea: "lastExpandable-hitarea", collapsable: "collapsable", collapsableHitarea: "collapsable-hitarea", lastCollapsableHitarea: "lastCollapsable-hitarea", lastCollapsable: "lastCollapsable", lastExpandable: "lastExpandable", last: "last", hitarea: "hitarea" }); })(jQuery); var timeout = 500; var closetimer = 0; var ddmenuitem = 0; function menu_open() { menu_canceltimer(); menu_close(); ddmenuitem = $(this).find('ul').css('visibility', 'visible'); } function menu_close() { if (ddmenuitem) ddmenuitem.css('visibility', 'hidden'); } function menu_timer() { closetimer = window.setTimeout(menu_close, timeout); } function menu_canceltimer() { if (closetimer) { window.clearTimeout(closetimer); closetimer = null; } } $(document).ready(function() { $('#file-nav > li').bind('mouseover', menu_open); $('#file-nav > li').bind('mouseout', menu_timer); }); document.onclick = menu_close; /* =================================================== * bootstrap-transition.js v2.0.0 * http://twitter.github.com/bootstrap/javascript.html#transitions * =================================================== * Copyright 2012 Twitter, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ========================================================== */ !function( $ ) { $(function () { "use strict" /* CSS TRANSITION SUPPORT (https://gist.github.com/373874) * ======================================================= */ $.support.transition = (function () { var thisBody = document.body || document.documentElement , thisStyle = thisBody.style , support = thisStyle.transition !== undefined || thisStyle.WebkitTransition !== undefined || thisStyle.MozTransition !== undefined || thisStyle.MsTransition !== undefined || thisStyle.OTransition !== undefined return support && { end: (function () { var transitionEnd = "TransitionEnd" if ( $.browser.webkit ) { transitionEnd = "webkitTransitionEnd" } else if ( $.browser.mozilla ) { transitionEnd = "transitionend" } else if ( $.browser.opera ) { transitionEnd = "oTransitionEnd" } return transitionEnd }()) } })() }) }( window.jQuery ) /* ========================================================== * bootstrap-alert.js v2.0.0 * http://twitter.github.com/bootstrap/javascript.html#alerts * ========================================================== * Copyright 2012 Twitter, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ========================================================== */ !function( $ ){ "use strict" /* ALERT CLASS DEFINITION * ====================== */ var dismiss = '[data-dismiss="alert"]' , Alert = function ( el ) { $(el).on('click', dismiss, this.close) } Alert.prototype = { constructor: Alert , close: function ( e ) { var $this = $(this) , selector = $this.attr('data-target') , $parent if (!selector) { selector = $this.attr('href') selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 } $parent = $(selector) $parent.trigger('close') e && e.preventDefault() $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent()) $parent.removeClass('in') function removeElement() { $parent.remove() $parent.trigger('closed') } $.support.transition && $parent.hasClass('fade') ? $parent.on($.support.transition.end, removeElement) : removeElement() } } /* ALERT PLUGIN DEFINITION * ======================= */ $.fn.alert = function ( option ) { return this.each(function () { var $this = $(this) , data = $this.data('alert') if (!data) $this.data('alert', (data = new Alert(this))) if (typeof option == 'string') data[option].call($this) }) } $.fn.alert.Constructor = Alert /* ALERT DATA-API * ============== */ $(function () { $('body').on('click.alert.data-api', dismiss, Alert.prototype.close) }) }( window.jQuery ) /* ============================================================ * bootstrap-button.js v2.0.0 * http://twitter.github.com/bootstrap/javascript.html#buttons * ============================================================ * Copyright 2012 Twitter, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================ */ !function( $ ){ "use strict" /* BUTTON PUBLIC CLASS DEFINITION * ============================== */ var Button = function ( element, options ) { this.$element = $(element) this.options = $.extend({}, $.fn.button.defaults, options) } Button.prototype = { constructor: Button , setState: function ( state ) { var d = 'disabled' , $el = this.$element , data = $el.data() , val = $el.is('input') ? 'val' : 'html' state = state + 'Text' data.resetText || $el.data('resetText', $el[val]()) $el[val](data[state] || this.options[state]) // push to event loop to allow forms to submit setTimeout(function () { state == 'loadingText' ? $el.addClass(d).attr(d, d) : $el.removeClass(d).removeAttr(d) }, 0) } , toggle: function () { var $parent = this.$element.parent('[data-toggle="buttons-radio"]') $parent && $parent .find('.active') .removeClass('active') this.$element.toggleClass('active') } } /* BUTTON PLUGIN DEFINITION * ======================== */ $.fn.button = function ( option ) { return this.each(function () { var $this = $(this) , data = $this.data('button') , options = typeof option == 'object' && option if (!data) $this.data('button', (data = new Button(this, options))) if (option == 'toggle') data.toggle() else if (option) data.setState(option) }) } $.fn.button.defaults = { loadingText: 'loading...' } $.fn.button.Constructor = Button /* BUTTON DATA-API * =============== */ $(function () { $('body').on('click.button.data-api', '[data-toggle^=button]', function ( e ) { $(e.target).button('toggle') }) }) }( window.jQuery ) /* ========================================================== * bootstrap-carousel.js v2.0.0 * http://twitter.github.com/bootstrap/javascript.html#carousel * ========================================================== * Copyright 2012 Twitter, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ========================================================== */ !function( $ ){ "use strict" /* CAROUSEL CLASS DEFINITION * ========================= */ var Carousel = function (element, options) { this.$element = $(element) this.options = $.extend({}, $.fn.carousel.defaults, options) this.options.slide && this.slide(this.options.slide) } Carousel.prototype = { cycle: function () { this.interval = setInterval($.proxy(this.next, this), this.options.interval) return this } , to: function (pos) { var $active = this.$element.find('.active') , children = $active.parent().children() , activePos = children.index($active) , that = this if (pos > (children.length - 1) || pos < 0) return if (this.sliding) { return this.$element.one('slid', function () { that.to(pos) }) } if (activePos == pos) { return this.pause().cycle() } return this.slide(pos > activePos ? 'next' : 'prev', $(children[pos])) } , pause: function () { clearInterval(this.interval) return this } , next: function () { if (this.sliding) return return this.slide('next') } , prev: function () { if (this.sliding) return return this.slide('prev') } , slide: function (type, next) { var $active = this.$element.find('.active') , $next = next || $active[type]() , isCycling = this.interval , direction = type == 'next' ? 'left' : 'right' , fallback = type == 'next' ? 'first' : 'last' , that = this this.sliding = true isCycling && this.pause() $next = $next.length ? $next : this.$element.find('.item')[fallback]() if (!$.support.transition && this.$element.hasClass('slide')) { this.$element.trigger('slide') $active.removeClass('active') $next.addClass('active') this.sliding = false this.$element.trigger('slid') } else { $next.addClass(type) $next[0].offsetWidth // force reflow $active.addClass(direction) $next.addClass(direction) this.$element.trigger('slide') this.$element.one($.support.transition.end, function () { $next.removeClass([type, direction].join(' ')).addClass('active') $active.removeClass(['active', direction].join(' ')) that.sliding = false setTimeout(function () { that.$element.trigger('slid') }, 0) }) } isCycling && this.cycle() return this } } /* CAROUSEL PLUGIN DEFINITION * ========================== */ $.fn.carousel = function ( option ) { return this.each(function () { var $this = $(this) , data = $this.data('carousel') , options = typeof option == 'object' && option if (!data) $this.data('carousel', (data = new Carousel(this, options))) if (typeof option == 'number') data.to(option) else if (typeof option == 'string' || (option = options.slide)) data[option]() else data.cycle() }) } $.fn.carousel.defaults = { interval: 5000 } $.fn.carousel.Constructor = Carousel /* CAROUSEL DATA-API * ================= */ $(function () { $('body').on('click.carousel.data-api', '[data-slide]', function ( e ) { var $this = $(this), href , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 , options = !$target.data('modal') && $.extend({}, $target.data(), $this.data()) $target.carousel(options) e.preventDefault() }) }) }( window.jQuery ) /* ============================================================= * bootstrap-collapse.js v2.0.0 * http://twitter.github.com/bootstrap/javascript.html#collapse * ============================================================= * Copyright 2012 Twitter, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================ */ !function( $ ){ "use strict" var Collapse = function ( element, options ) { this.$element = $(element) this.options = $.extend({}, $.fn.collapse.defaults, options) if (this.options["parent"]) { this.$parent = $(this.options["parent"]) } this.options.toggle && this.toggle() } Collapse.prototype = { constructor: Collapse , dimension: function () { var hasWidth = this.$element.hasClass('width') return hasWidth ? 'width' : 'height' } , show: function () { var dimension = this.dimension() , scroll = $.camelCase(['scroll', dimension].join('-')) , actives = this.$parent && this.$parent.find('.in') , hasData if (actives && actives.length) { hasData = actives.data('collapse') actives.collapse('hide') hasData || actives.data('collapse', null) } this.$element[dimension](0) this.transition('addClass', 'show', 'shown') this.$element[dimension](this.$element[0][scroll]) } , hide: function () { var dimension = this.dimension() this.reset(this.$element[dimension]()) this.transition('removeClass', 'hide', 'hidden') this.$element[dimension](0) } , reset: function ( size ) { var dimension = this.dimension() this.$element .removeClass('collapse') [dimension](size || 'auto') [0].offsetWidth this.$element.addClass('collapse') } , transition: function ( method, startEvent, completeEvent ) { var that = this , complete = function () { if (startEvent == 'show') that.reset() that.$element.trigger(completeEvent) } this.$element .trigger(startEvent) [method]('in') $.support.transition && this.$element.hasClass('collapse') ? this.$element.one($.support.transition.end, complete) : complete() } , toggle: function () { this[this.$element.hasClass('in') ? 'hide' : 'show']() } } /* COLLAPSIBLE PLUGIN DEFINITION * ============================== */ $.fn.collapse = function ( option ) { return this.each(function () { var $this = $(this) , data = $this.data('collapse') , options = typeof option == 'object' && option if (!data) $this.data('collapse', (data = new Collapse(this, options))) if (typeof option == 'string') data[option]() }) } $.fn.collapse.defaults = { toggle: true } $.fn.collapse.Constructor = Collapse /* COLLAPSIBLE DATA-API * ==================== */ $(function () { $('body').on('click.collapse.data-api', '[data-toggle=collapse]', function ( e ) { var $this = $(this), href , target = $this.attr('data-target') || e.preventDefault() || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 , option = $(target).data('collapse') ? 'toggle' : $this.data() $(target).collapse(option) }) }) }( window.jQuery ) /* ============================================================ * bootstrap-dropdown.js v2.0.0 * http://twitter.github.com/bootstrap/javascript.html#dropdowns * ============================================================ * Copyright 2012 Twitter, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================ */ !function( $ ){ "use strict" /* DROPDOWN CLASS DEFINITION * ========================= */ var toggle = '[data-toggle="dropdown"]' , Dropdown = function ( element ) { var $el = $(element).on('click.dropdown.data-api', this.toggle) $('html').on('click.dropdown.data-api', function () { $el.parent().removeClass('open') }) } Dropdown.prototype = { constructor: Dropdown , toggle: function ( e ) { var $this = $(this) , selector = $this.attr('data-target') , $parent , isActive if (!selector) { selector = $this.attr('href') selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 } $parent = $(selector) $parent.length || ($parent = $this.parent()) isActive = $parent.hasClass('open') clearMenus() !isActive && $parent.toggleClass('open') return false } } function clearMenus() { $(toggle).parent().removeClass('open') } /* DROPDOWN PLUGIN DEFINITION * ========================== */ $.fn.dropdown = function ( option ) { return this.each(function () { var $this = $(this) , data = $this.data('dropdown') if (!data) $this.data('dropdown', (data = new Dropdown(this))) if (typeof option == 'string') data[option].call($this) }) } $.fn.dropdown.Constructor = Dropdown /* APPLY TO STANDARD DROPDOWN ELEMENTS * =================================== */ $(function () { $('html').on('click.dropdown.data-api', clearMenus) $('body').on('click.dropdown.data-api', toggle, Dropdown.prototype.toggle) }) }( window.jQuery ) /* ========================================================= * bootstrap-modal.js v2.0.0 * http://twitter.github.com/bootstrap/javascript.html#modals * ========================================================= * Copyright 2012 Twitter, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ========================================================= */ !function( $ ){ "use strict" /* MODAL CLASS DEFINITION * ====================== */ var Modal = function ( content, options ) { this.options = $.extend({}, $.fn.modal.defaults, options) this.$element = $(content) .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this)) } Modal.prototype = { constructor: Modal , toggle: function () { return this[!this.isShown ? 'show' : 'hide']() } , show: function () { var that = this if (this.isShown) return $('body').addClass('modal-open') this.isShown = true this.$element.trigger('show') escape.call(this) backdrop.call(this, function () { var transition = $.support.transition && that.$element.hasClass('fade') !that.$element.parent().length && that.$element.appendTo(document.body) //don't move modals dom position that.$element .show() if (transition) { that.$element[0].offsetWidth // force reflow } that.$element.addClass('in') transition ? that.$element.one($.support.transition.end, function () { that.$element.trigger('shown') }) : that.$element.trigger('shown') }) } , hide: function ( e ) { e && e.preventDefault() if (!this.isShown) return var that = this this.isShown = false $('body').removeClass('modal-open') escape.call(this) this.$element .trigger('hide') .removeClass('in') $.support.transition && this.$element.hasClass('fade') ? hideWithTransition.call(this) : hideModal.call(this) } } /* MODAL PRIVATE METHODS * ===================== */ function hideWithTransition() { var that = this , timeout = setTimeout(function () { that.$element.off($.support.transition.end) hideModal.call(that) }, 500) this.$element.one($.support.transition.end, function () { clearTimeout(timeout) hideModal.call(that) }) } function hideModal( that ) { this.$element .hide() .trigger('hidden') backdrop.call(this) } function backdrop( callback ) { var that = this , animate = this.$element.hasClass('fade') ? 'fade' : '' if (this.isShown && this.options.backdrop) { var doAnimate = $.support.transition && animate this.$backdrop = $('