Responsive Menu - Version 3.1.25

Version Description

(14th Dec 2019) = * Fix: Sub Menus -> Text Alignment Option does not work * Fix: Trigger Icon Position * Fix: Trigger Icon Border CSS code * Fix: Menu Text goes under Trigger Icon

Download this release

Release Info

Developer expresstech
Plugin Icon 128x128 Responsive Menu
Version 3.1.25
Comparing to
See all releases

Code changes from version 3.1.24 to 3.1.25

Files changed (271) hide show
  1. public/css/app.css.twig +48 -4
  2. public/img/banner.jpg +0 -0
  3. public/img/banner.png +0 -0
  4. readme.txt +11 -5
  5. responsive-menu.php +33 -4
  6. vendor/composer/autoload_files.php +10 -0
  7. vendor/symfony/polyfill-ctype/Ctype.php +227 -0
  8. vendor/symfony/polyfill-ctype/LICENSE +19 -0
  9. vendor/symfony/polyfill-ctype/README.md +12 -0
  10. vendor/symfony/polyfill-ctype/bootstrap.php +26 -0
  11. vendor/symfony/polyfill-ctype/composer.json +34 -0
  12. vendor/twig/twig/.gitignore +5 -0
  13. vendor/twig/twig/doc/filters/filter.rst +58 -0
  14. vendor/twig/twig/doc/filters/map.rst +38 -0
  15. vendor/twig/twig/doc/filters/reduce.rst +33 -0
  16. vendor/twig/twig/doc/filters/spaceless.rst +65 -0
  17. vendor/twig/twig/doc/tags/apply.rst +23 -0
  18. vendor/twig/twig/doc/tags/deprecated.rst +30 -0
  19. vendor/twig/twig/drupal_test.sh +51 -0
  20. vendor/twig/twig/ext/twig/.gitignore +30 -0
  21. vendor/twig/twig/lib/Twig/Node/Deprecated.php +11 -0
  22. vendor/twig/twig/lib/Twig/Profiler/Dumper/Base.php +11 -0
  23. vendor/twig/twig/lib/Twig/TokenParser/Deprecated.php +11 -0
  24. vendor/twig/twig/src/Cache/CacheInterface.php +60 -0
  25. vendor/twig/twig/src/Cache/FilesystemCache.php +93 -0
  26. vendor/twig/twig/src/Cache/NullCache.php +42 -0
  27. vendor/twig/twig/src/Compiler.php +288 -0
  28. vendor/twig/twig/src/Environment.php +1638 -0
  29. vendor/twig/twig/src/Error/Error.php +325 -0
  30. vendor/twig/twig/src/Error/LoaderError.php +23 -0
  31. vendor/twig/twig/src/Error/RuntimeError.php +24 -0
  32. vendor/twig/twig/src/Error/SyntaxError.php +57 -0
  33. vendor/twig/twig/src/ExpressionParser.php +834 -0
  34. vendor/twig/twig/src/Extension/AbstractExtension.php +72 -0
  35. vendor/twig/twig/src/Extension/CoreExtension.php +1724 -0
  36. vendor/twig/twig/src/Extension/DebugExtension.php +76 -0
  37. vendor/twig/twig/src/Extension/EscaperExtension.php +120 -0
  38. vendor/twig/twig/src/Extension/ExtensionInterface.php +101 -0
  39. vendor/twig/twig/src/Extension/GlobalsInterface.php +26 -0
  40. vendor/twig/twig/src/Extension/InitRuntimeInterface.php +26 -0
  41. vendor/twig/twig/src/Extension/OptimizerExtension.php +39 -0
  42. vendor/twig/twig/src/Extension/ProfilerExtension.php +53 -0
  43. vendor/twig/twig/src/Extension/RuntimeExtensionInterface.php +19 -0
  44. vendor/twig/twig/src/Extension/SandboxExtension.php +109 -0
  45. vendor/twig/twig/src/Extension/StagingExtension.php +117 -0
  46. vendor/twig/twig/src/Extension/StringLoaderExtension.php +54 -0
  47. vendor/twig/twig/src/FileExtensionEscapingStrategy.php +62 -0
  48. vendor/twig/twig/src/Lexer.php +534 -0
  49. vendor/twig/twig/src/Loader/ArrayLoader.php +102 -0
  50. vendor/twig/twig/src/Loader/ChainLoader.php +164 -0
  51. vendor/twig/twig/src/Loader/ExistsLoaderInterface.php +33 -0
  52. vendor/twig/twig/src/Loader/FilesystemLoader.php +323 -0
  53. vendor/twig/twig/src/Loader/LoaderInterface.php +61 -0
  54. vendor/twig/twig/src/Loader/SourceContextLoaderInterface.php +38 -0
  55. vendor/twig/twig/src/Markup.php +41 -0
  56. vendor/twig/twig/src/Node/AutoEscapeNode.php +40 -0
  57. vendor/twig/twig/src/Node/BlockNode.php +45 -0
  58. vendor/twig/twig/src/Node/BlockReferenceNode.php +38 -0
  59. vendor/twig/twig/src/Node/BodyNode.php +23 -0
  60. vendor/twig/twig/src/Node/CheckSecurityNode.php +85 -0
  61. vendor/twig/twig/src/Node/CheckToStringNode.php +42 -0
  62. vendor/twig/twig/src/Node/DeprecatedNode.php +55 -0
  63. vendor/twig/twig/src/Node/DoNode.php +40 -0
  64. vendor/twig/twig/src/Node/EmbedNode.php +52 -0
  65. vendor/twig/twig/src/Node/Expression/AbstractExpression.php +26 -0
  66. vendor/twig/twig/src/Node/Expression/ArrayExpression.php +88 -0
  67. vendor/twig/twig/src/Node/Expression/ArrowFunctionExpression.php +64 -0
  68. vendor/twig/twig/src/Node/Expression/AssignNameExpression.php +29 -0
  69. vendor/twig/twig/src/Node/Expression/Binary/AbstractBinary.php +43 -0
  70. vendor/twig/twig/src/Node/Expression/Binary/AddBinary.php +25 -0
  71. vendor/twig/twig/src/Node/Expression/Binary/AndBinary.php +25 -0
  72. vendor/twig/twig/src/Node/Expression/Binary/BitwiseAndBinary.php +25 -0
  73. vendor/twig/twig/src/Node/Expression/Binary/BitwiseOrBinary.php +25 -0
  74. vendor/twig/twig/src/Node/Expression/Binary/BitwiseXorBinary.php +25 -0
  75. vendor/twig/twig/src/Node/Expression/Binary/ConcatBinary.php +25 -0
  76. vendor/twig/twig/src/Node/Expression/Binary/DivBinary.php +25 -0
  77. vendor/twig/twig/src/Node/Expression/Binary/EndsWithBinary.php +37 -0
  78. vendor/twig/twig/src/Node/Expression/Binary/EqualBinary.php +24 -0
  79. vendor/twig/twig/src/Node/Expression/Binary/FloorDivBinary.php +31 -0
  80. vendor/twig/twig/src/Node/Expression/Binary/GreaterBinary.php +24 -0
  81. vendor/twig/twig/src/Node/Expression/Binary/GreaterEqualBinary.php +24 -0
  82. vendor/twig/twig/src/Node/Expression/Binary/InBinary.php +35 -0
  83. vendor/twig/twig/src/Node/Expression/Binary/LessBinary.php +24 -0
  84. vendor/twig/twig/src/Node/Expression/Binary/LessEqualBinary.php +24 -0
  85. vendor/twig/twig/src/Node/Expression/Binary/MatchesBinary.php +35 -0
  86. vendor/twig/twig/src/Node/Expression/Binary/ModBinary.php +25 -0
  87. vendor/twig/twig/src/Node/Expression/Binary/MulBinary.php +25 -0
  88. vendor/twig/twig/src/Node/Expression/Binary/NotEqualBinary.php +24 -0
  89. vendor/twig/twig/src/Node/Expression/Binary/NotInBinary.php +35 -0
  90. vendor/twig/twig/src/Node/Expression/Binary/OrBinary.php +25 -0
  91. vendor/twig/twig/src/Node/Expression/Binary/PowerBinary.php +39 -0
  92. vendor/twig/twig/src/Node/Expression/Binary/RangeBinary.php +35 -0
  93. vendor/twig/twig/src/Node/Expression/Binary/StartsWithBinary.php +37 -0
  94. vendor/twig/twig/src/Node/Expression/Binary/SubBinary.php +25 -0
  95. vendor/twig/twig/src/Node/Expression/BlockReferenceExpression.php +98 -0
  96. vendor/twig/twig/src/Node/Expression/CallExpression.php +305 -0
  97. vendor/twig/twig/src/Node/Expression/ConditionalExpression.php +38 -0
  98. vendor/twig/twig/src/Node/Expression/ConstantExpression.php +30 -0
  99. vendor/twig/twig/src/Node/Expression/Filter/DefaultFilter.php +54 -0
  100. vendor/twig/twig/src/Node/Expression/FilterExpression.php +47 -0
  101. vendor/twig/twig/src/Node/Expression/FunctionExpression.php +51 -0
  102. vendor/twig/twig/src/Node/Expression/GetAttrExpression.php +80 -0
  103. vendor/twig/twig/src/Node/Expression/InlinePrint.php +35 -0
  104. vendor/twig/twig/src/Node/Expression/MethodCallExpression.php +48 -0
  105. vendor/twig/twig/src/Node/Expression/NameExpression.php +119 -0
  106. vendor/twig/twig/src/Node/Expression/NullCoalesceExpression.php +58 -0
  107. vendor/twig/twig/src/Node/Expression/ParentExpression.php +48 -0
  108. vendor/twig/twig/src/Node/Expression/TempNameExpression.php +33 -0
  109. vendor/twig/twig/src/Node/Expression/Test/ConstantTest.php +51 -0
  110. vendor/twig/twig/src/Node/Expression/Test/DefinedTest.php +71 -0
  111. vendor/twig/twig/src/Node/Expression/Test/DivisiblebyTest.php +38 -0
  112. vendor/twig/twig/src/Node/Expression/Test/EvenTest.php +37 -0
  113. vendor/twig/twig/src/Node/Expression/Test/NullTest.php +36 -0
  114. vendor/twig/twig/src/Node/Expression/Test/OddTest.php +37 -0
  115. vendor/twig/twig/src/Node/Expression/Test/SameasTest.php +36 -0
  116. vendor/twig/twig/src/Node/Expression/TestExpression.php +51 -0
  117. vendor/twig/twig/src/Node/Expression/Unary/AbstractUnary.php +35 -0
  118. vendor/twig/twig/src/Node/Expression/Unary/NegUnary.php +25 -0
  119. vendor/twig/twig/src/Node/Expression/Unary/NotUnary.php +25 -0
  120. vendor/twig/twig/src/Node/Expression/Unary/PosUnary.php +25 -0
  121. vendor/twig/twig/src/Node/FlushNode.php +37 -0
  122. vendor/twig/twig/src/Node/ForLoopNode.php +56 -0
  123. vendor/twig/twig/src/Node/ForNode.php +119 -0
  124. vendor/twig/twig/src/Node/IfNode.php +72 -0
  125. vendor/twig/twig/src/Node/ImportNode.php +57 -0
  126. vendor/twig/twig/src/Node/IncludeNode.php +108 -0
  127. vendor/twig/twig/src/Node/MacroNode.php +136 -0
  128. vendor/twig/twig/src/Node/ModuleNode.php +492 -0
  129. vendor/twig/twig/src/Node/Node.php +274 -0
  130. vendor/twig/twig/src/Node/NodeCaptureInterface.php +23 -0
  131. vendor/twig/twig/src/Node/NodeOutputInterface.php +23 -0
  132. vendor/twig/twig/src/Node/PrintNode.php +41 -0
  133. vendor/twig/twig/src/Node/SandboxNode.php +47 -0
  134. vendor/twig/twig/src/Node/SandboxedPrintNode.php +69 -0
  135. vendor/twig/twig/src/Node/SetNode.php +107 -0
  136. vendor/twig/twig/src/Node/SetTempNode.php +44 -0
  137. vendor/twig/twig/src/Node/SpacelessNode.php +47 -0
  138. vendor/twig/twig/src/Node/TextNode.php +40 -0
  139. vendor/twig/twig/src/Node/WithNode.php +72 -0
  140. vendor/twig/twig/src/NodeTraverser.php +89 -0
  141. vendor/twig/twig/src/NodeVisitor/AbstractNodeVisitor.php +59 -0
  142. vendor/twig/twig/src/NodeVisitor/EscaperNodeVisitor.php +209 -0
  143. vendor/twig/twig/src/NodeVisitor/NodeVisitorInterface.php +50 -0
  144. vendor/twig/twig/src/NodeVisitor/OptimizerNodeVisitor.php +273 -0
  145. vendor/twig/twig/src/NodeVisitor/SafeAnalysisNodeVisitor.php +164 -0
  146. vendor/twig/twig/src/NodeVisitor/SandboxNodeVisitor.php +137 -0
  147. vendor/twig/twig/src/Parser.php +439 -0
  148. vendor/twig/twig/src/Profiler/Dumper/BaseDumper.php +65 -0
  149. vendor/twig/twig/src/Profiler/Dumper/BlackfireDumper.php +76 -0
  150. vendor/twig/twig/src/Profiler/Dumper/HtmlDumper.php +51 -0
  151. vendor/twig/twig/src/Profiler/Dumper/TextDumper.php +39 -0
  152. vendor/twig/twig/src/Profiler/Node/EnterProfileNode.php +44 -0
  153. vendor/twig/twig/src/Profiler/Node/LeaveProfileNode.php +38 -0
  154. vendor/twig/twig/src/Profiler/NodeVisitor/ProfilerNodeVisitor.php +80 -0
  155. vendor/twig/twig/src/Profiler/Profile.php +188 -0
  156. vendor/twig/twig/src/RuntimeLoader/ContainerRuntimeLoader.php +41 -0
  157. vendor/twig/twig/src/RuntimeLoader/FactoryRuntimeLoader.php +41 -0
  158. vendor/twig/twig/src/RuntimeLoader/RuntimeLoaderInterface.php +31 -0
  159. vendor/twig/twig/src/Sandbox/SecurityError.php +25 -0
  160. vendor/twig/twig/src/Sandbox/SecurityNotAllowedFilterError.php +35 -0
  161. vendor/twig/twig/src/Sandbox/SecurityNotAllowedFunctionError.php +35 -0
  162. vendor/twig/twig/src/Sandbox/SecurityNotAllowedMethodError.php +42 -0
  163. vendor/twig/twig/src/Sandbox/SecurityNotAllowedPropertyError.php +42 -0
  164. vendor/twig/twig/src/Sandbox/SecurityNotAllowedTagError.php +35 -0
  165. vendor/twig/twig/src/Sandbox/SecurityPolicy.php +129 -0
  166. vendor/twig/twig/src/Sandbox/SecurityPolicyInterface.php +28 -0
  167. vendor/twig/twig/src/Source.php +55 -0
  168. vendor/twig/twig/src/Template.php +733 -0
  169. vendor/twig/twig/src/TemplateWrapper.php +161 -0
  170. vendor/twig/twig/src/Test/IntegrationTestCase.php +257 -0
  171. vendor/twig/twig/src/Test/NodeTestCase.php +79 -0
  172. vendor/twig/twig/src/Token.php +215 -0
  173. vendor/twig/twig/src/TokenParser/AbstractTokenParser.php +34 -0
  174. vendor/twig/twig/src/TokenParser/ApplyTokenParser.php +58 -0
  175. vendor/twig/twig/src/TokenParser/AutoEscapeTokenParser.php +88 -0
  176. vendor/twig/twig/src/TokenParser/BlockTokenParser.php +80 -0
  177. vendor/twig/twig/src/TokenParser/DeprecatedTokenParser.php +44 -0
  178. vendor/twig/twig/src/TokenParser/DoTokenParser.php +39 -0
  179. vendor/twig/twig/src/TokenParser/EmbedTokenParser.php +74 -0
  180. vendor/twig/twig/src/TokenParser/ExtendsTokenParser.php +54 -0
  181. vendor/twig/twig/src/TokenParser/FilterTokenParser.php +59 -0
  182. vendor/twig/twig/src/TokenParser/FlushTokenParser.php +39 -0
  183. vendor/twig/twig/src/TokenParser/ForTokenParser.php +136 -0
  184. vendor/twig/twig/src/TokenParser/FromTokenParser.php +72 -0
  185. vendor/twig/twig/src/TokenParser/IfTokenParser.php +91 -0
  186. vendor/twig/twig/src/TokenParser/ImportTokenParser.php +45 -0
  187. vendor/twig/twig/src/TokenParser/IncludeTokenParser.php +68 -0
  188. vendor/twig/twig/src/TokenParser/MacroTokenParser.php +68 -0
  189. vendor/twig/twig/src/TokenParser/SandboxTokenParser.php +67 -0
  190. vendor/twig/twig/src/TokenParser/SetTokenParser.php +74 -0
  191. vendor/twig/twig/src/TokenParser/SpacelessTokenParser.php +53 -0
  192. vendor/twig/twig/src/TokenParser/TokenParserInterface.php +51 -0
  193. vendor/twig/twig/src/TokenParser/UseTokenParser.php +75 -0
  194. vendor/twig/twig/src/TokenParser/WithTokenParser.php +57 -0
  195. vendor/twig/twig/src/TokenStream.php +201 -0
  196. vendor/twig/twig/src/TwigFilter.php +128 -0
  197. vendor/twig/twig/src/TwigFunction.php +118 -0
  198. vendor/twig/twig/src/TwigTest.php +87 -0
  199. vendor/twig/twig/src/Util/DeprecationCollector.php +92 -0
  200. vendor/twig/twig/src/Util/TemplateDirIterator.php +30 -0
  201. vendor/twig/twig/test/Twig/Tests/Fixtures/errors/leak-output.php +31 -0
  202. vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/exception_in_extension_extends.test +12 -0
  203. vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/exception_in_extension_include.test +12 -0
  204. vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/strict_comparison_operator.test +6 -0
  205. vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/call_argument_defined_twice.test +8 -0
  206. vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/call_positional_arg_after_named_arg.test +8 -0
  207. vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/floats.test +16 -0
  208. vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/not_arrow_fn.test +8 -0
  209. vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/string_operator_as_var_assignment.test +18 -0
  210. vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_with_more_elements.test +23 -0
  211. vendor/twig/twig/test/Twig/Tests/Fixtures/filters/filter.test +46 -0
  212. vendor/twig/twig/test/Twig/Tests/Fixtures/filters/filter_php_55.test +23 -0
  213. vendor/twig/twig/test/Twig/Tests/Fixtures/filters/filter_php_56.test +27 -0
  214. vendor/twig/twig/test/Twig/Tests/Fixtures/filters/map.test +41 -0
  215. vendor/twig/twig/test/Twig/Tests/Fixtures/filters/reduce.test +14 -0
  216. vendor/twig/twig/test/Twig/Tests/Fixtures/filters/spaceless.test +8 -0
  217. vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/ignore_missing_exists.test +11 -0
  218. vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/include_missing_extends.test +13 -0
  219. vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include_template_from_string.test +11 -0
  220. vendor/twig/twig/test/Twig/Tests/Fixtures/functions/template_from_string_error.test +8 -0
  221. vendor/twig/twig/test/Twig/Tests/Fixtures/regression/block_names_unicity.test +19 -0
  222. vendor/twig/twig/test/Twig/Tests/Fixtures/tags/apply/basic.test +10 -0
  223. vendor/twig/twig/test/Twig/Tests/Fixtures/tags/apply/json_encode.test +8 -0
  224. vendor/twig/twig/test/Twig/Tests/Fixtures/tags/apply/multiple.test +10 -0
  225. vendor/twig/twig/test/Twig/Tests/Fixtures/tags/apply/nested.test +16 -0
  226. vendor/twig/twig/test/Twig/Tests/Fixtures/tags/apply/scope.test +15 -0
  227. vendor/twig/twig/test/Twig/Tests/Fixtures/tags/apply/with_for_tag.test +13 -0
  228. vendor/twig/twig/test/Twig/Tests/Fixtures/tags/apply/with_if_tag.test +29 -0
  229. vendor/twig/twig/test/Twig/Tests/Fixtures/tags/deprecated/block.legacy.test +20 -0
  230. vendor/twig/twig/test/Twig/Tests/Fixtures/tags/deprecated/macro.legacy.test +21 -0
  231. vendor/twig/twig/test/Twig/Tests/Fixtures/tags/deprecated/template.legacy.test +12 -0
  232. vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/scope.test +11 -0
  233. vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/ignore_missing_exists.test +11 -0
  234. vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/include_missing_extends.test +13 -0
  235. vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/extends_in_block.test +10 -0
  236. vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/extends_in_macro.test +10 -0
  237. vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_as_template_wrapper.test +12 -0
  238. vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/from_in_block_is_local.test +18 -0
  239. vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/from_local_override.test +28 -0
  240. vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/from_macro_in_a_macro.test +18 -0
  241. vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/from_nested_blocks.test +18 -0
  242. vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/from_nested_blocks_with_global_macro.test +18 -0
  243. vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/from_syntax_error.test +8 -0
  244. vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/import_and_blocks.test +36 -0
  245. vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/import_from_string_template.test +10 -0
  246. vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/import_in_block_is_local.test +18 -0
  247. vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/import_local_override.test +28 -0
  248. vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/import_macro_in_a_macro.test +18 -0
  249. vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/import_nested_blocks.legacy.test +18 -0
  250. vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/import_nested_blocks_with_global_macro.legacy.test +18 -0
  251. vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/import_self_parent.test +23 -0
  252. vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/import_syntax_error.test +10 -0
  253. vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/import_with_reserved_name.test +10 -0
  254. vendor/twig/twig/test/Twig/Tests/Fixtures/tags/sandbox/array.test +16 -0
  255. vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/capture_scope.test +10 -0
  256. vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/inheritance.test +24 -0
  257. vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/inheritance_overriding.test +24 -0
  258. vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/mutating.test +17 -0
  259. vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/use_with_parent.test +24 -0
  260. vendor/twig/twig/test/Twig/Tests/Fixtures/tags/with/globals.test +10 -0
  261. vendor/twig/twig/test/Twig/Tests/Fixtures/tags/with/iterable.test +10 -0
  262. vendor/twig/twig/test/Twig/Tests/Fixtures/tests/defined_on_complex_expr.test +8 -0
  263. vendor/twig/twig/test/Twig/Tests/Fixtures/tests/dynamic_test.test +14 -0
  264. vendor/twig/twig/test/Twig/Tests/Fixtures/whitespace/trim_block.test +68 -0
  265. vendor/twig/twig/test/Twig/Tests/Fixtures/whitespace/trim_delimiter_as_strings.test +10 -0
  266. vendor/twig/twig/test/Twig/Tests/Fixtures/whitespace/trim_left.test +32 -0
  267. vendor/twig/twig/test/Twig/Tests/Fixtures/whitespace/trim_line_left.test +33 -0
  268. vendor/twig/twig/test/Twig/Tests/Fixtures/whitespace/trim_line_right.test +32 -0
  269. vendor/twig/twig/test/Twig/Tests/Fixtures/whitespace/trim_right.test +28 -0
  270. vendor/twig/twig/test/Twig/Tests/Node/DeprecatedTest.php +80 -0
  271. vendor/twig/twig/test/Twig/Tests/NodeTraverserTest.php +47 -0
public/css/app.css.twig CHANGED
@@ -149,10 +149,33 @@ button#responsive-menu-button,
149
  width: 100%;
150
  display: block;
151
  text-decoration: none;
152
- padding: 0 {{ options.menu_depth_0 }}%;
153
  position: relative;
154
  }
155
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
156
  #responsive-menu-container li.responsive-menu-item a .fa {
157
  margin-right: 15px;
158
  }
@@ -512,7 +535,13 @@ button#responsive-menu-button,
512
  line-height: {{ options.submenu_arrow_height }}px;
513
  width: {{ options.submenu_arrow_width }}px;
514
  color: {{ options.menu_sub_arrow_shape_colour }};
515
- border-left: {{ options.menu_border_width }}px solid {{ options.menu_sub_arrow_border_colour }};
 
 
 
 
 
 
516
  background-color: {{ options.menu_sub_arrow_background_colour }};
517
  }
518
 
@@ -552,6 +581,7 @@ button#responsive-menu-button,
552
  font-family: {{ "'" ~ options.submenu_font ~ "'" }};
553
  {% endif %}
554
  font-size: {{ options.submenu_font_size }}px;
 
555
  }
556
 
557
  #responsive-menu-container #responsive-menu ul.responsive-menu-submenu li.responsive-menu-item a {
@@ -587,12 +617,26 @@ button#responsive-menu-button,
587
  }
588
 
589
  #responsive-menu-container #responsive-menu ul.responsive-menu-submenu li.responsive-menu-item a .responsive-menu-subarrow {
590
- {{ options.submenu_arrow_position }}: 0;
 
 
 
 
 
 
 
591
  height: {{ options.submenu_submenu_arrow_height }}px;
592
  line-height: {{ options.submenu_submenu_arrow_height }}px;
593
  width: {{ options.submenu_submenu_arrow_width }}px;
594
  color: {{ options.submenu_sub_arrow_shape_colour }};
595
- border-left: {{ options.submenu_border_width }}px solid {{ options.submenu_sub_arrow_border_colour }};
 
 
 
 
 
 
 
596
  background-color: {{ options.submenu_sub_arrow_background_colour }};
597
  }
598
 
149
  width: 100%;
150
  display: block;
151
  text-decoration: none;
152
+
153
  position: relative;
154
  }
155
 
156
+
157
+ #responsive-menu-container #responsive-menu li.responsive-menu-item a {
158
+ {% if options.menu_text_alignment == 'left' and options.arrow_position == 'left' %}
159
+ padding-left: {{options.submenu_arrow_width + 5}}px;
160
+ {% elseif options.menu_text_alignment == 'right' and options.arrow_position == 'right' %}
161
+ padding-right: {{options.submenu_arrow_width + 5}}px;
162
+ {% else %}
163
+ padding: 0 {{ options.menu_depth_0 }}%;
164
+ {% endif %}
165
+ }
166
+
167
+ #responsive-menu-container .responsive-menu-submenu li.responsive-menu-item a {
168
+ {% if options.submenu_text_alignment == 'left' and options.submenu_arrow_position == 'left' %}
169
+ padding-left: {{options.submenu_submenu_arrow_width + 5}}px !important;
170
+ padding-right:unset !important;
171
+ {% elseif options.submenu_text_alignment == 'right' and options.submenu_arrow_position == 'right' %}
172
+ padding-right: {{options.submenu_submenu_arrow_width + 5}}px !important;
173
+ padding-left:unset !important;
174
+ {% else %}
175
+ padding: 0 {{ options.menu_depth_0 }}%;
176
+ {% endif %}
177
+ }
178
+
179
  #responsive-menu-container li.responsive-menu-item a .fa {
180
  margin-right: 15px;
181
  }
535
  line-height: {{ options.submenu_arrow_height }}px;
536
  width: {{ options.submenu_arrow_width }}px;
537
  color: {{ options.menu_sub_arrow_shape_colour }};
538
+ {% if options.arrow_position == 'left' %}
539
+ border-right: {{ options.menu_border_width }}px
540
+ {% endif %}
541
+ {% if options.arrow_position == 'right' %}
542
+ border-left: {{ options.menu_border_width }}px
543
+ {% endif %}
544
+ solid {{ options.menu_sub_arrow_border_colour }};
545
  background-color: {{ options.menu_sub_arrow_background_colour }};
546
  }
547
 
581
  font-family: {{ "'" ~ options.submenu_font ~ "'" }};
582
  {% endif %}
583
  font-size: {{ options.submenu_font_size }}px;
584
+ text-align: {{ options.submenu_text_alignment }};
585
  }
586
 
587
  #responsive-menu-container #responsive-menu ul.responsive-menu-submenu li.responsive-menu-item a {
617
  }
618
 
619
  #responsive-menu-container #responsive-menu ul.responsive-menu-submenu li.responsive-menu-item a .responsive-menu-subarrow {
620
+ {% if options.submenu_arrow_position == 'left' %}
621
+ left:0;
622
+ right:unset;
623
+ {% endif %}
624
+ {% if options.submenu_arrow_position == 'right' %}
625
+ left:unset;
626
+ right:0;
627
+ {% endif %}
628
  height: {{ options.submenu_submenu_arrow_height }}px;
629
  line-height: {{ options.submenu_submenu_arrow_height }}px;
630
  width: {{ options.submenu_submenu_arrow_width }}px;
631
  color: {{ options.submenu_sub_arrow_shape_colour }};
632
+ {% if options.submenu_arrow_position == 'left' %}
633
+ border-right: {{ options.submenu_border_width }}px solid {{ options.submenu_sub_arrow_border_colour }} !important;
634
+ border-left:unset !important;
635
+ {% endif %}
636
+ {% if options.submenu_arrow_position == 'right' %}
637
+ border-left: {{ options.submenu_border_width }}px solid {{ options.submenu_sub_arrow_border_colour }} !important;
638
+ border-right:unset !important;
639
+ {% endif %}
640
  background-color: {{ options.submenu_sub_arrow_background_colour }};
641
  }
642
 
public/img/banner.jpg ADDED
Binary file
public/img/banner.png ADDED
Binary file
readme.txt CHANGED
@@ -1,9 +1,9 @@
1
- === Responsive Menu ===
2
- Contributors: peterfeatherstone
3
- Tags: responsive, menu, navigation, mobile, hamburger
4
  Requires at least: 3.6
5
- Tested up to: 5.2.2
6
- Stable tag: 3.1.24
7
  Requires PHP: 5.5
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
@@ -111,6 +111,12 @@ To view our FAQ, please go to [https://responsive.menu/faq/](https://responsive.
111
 
112
  == Changelog ==
113
 
 
 
 
 
 
 
114
  = 3.1.24 (14th Aug 2019) =
115
  * Allow support for PHP 5.5 again.
116
  * Downgrade Twig back to 1.33.0 as it doesn't play nicely with other plugins.
1
+ === Responsive Menu - Create Mobile-Friendly Menu ===
2
+ Contributors: expresstech,responsivemenu
3
+ Tags: responsive, menu, navigation, mobile, hamburger, mobile menu, responsive menu
4
  Requires at least: 3.6
5
+ Tested up to: 5.3.2
6
+ Stable tag: 3.1.25
7
  Requires PHP: 5.5
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
111
 
112
  == Changelog ==
113
 
114
+ = 3.1.25 (14th Dec 2019) =
115
+ * Fix: Sub Menus -> Text Alignment Option does not work
116
+ * Fix: Trigger Icon Position
117
+ * Fix: Trigger Icon Border CSS code
118
+ * Fix: Menu Text goes under Trigger Icon
119
+
120
  = 3.1.24 (14th Aug 2019) =
121
  * Allow support for PHP 5.5 again.
122
  * Downgrade Twig back to 1.33.0 as it doesn't play nicely with other plugins.
responsive-menu.php CHANGED
@@ -2,14 +2,14 @@
2
 
3
  /*
4
  Plugin Name: Responsive Menu
5
- Plugin URI: https://responsive.menu
6
  Description: Highly Customisable Responsive Menu Plugin for WordPress
7
- Version: 3.1.24
8
- Author: Peter Featherstone
9
  Text Domain: responsive-menu
10
  Author URI: https://responsive.menu
11
  License: GPL2
12
- Tags: responsive, menu, responsive menu
13
  */
14
 
15
  add_action('admin_init', 'check_responsive_menu_php_version');
@@ -32,6 +32,35 @@ function responsive_menu_deactivation_text() {
32
  if(version_compare(PHP_VERSION, '5.4', '<'))
33
  return;
34
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
35
  include dirname(__FILE__) . '/vendor/autoload.php';
36
  include dirname(__FILE__) . '/config/default_options.php';
37
  include dirname(__FILE__) . '/config/services.php';
2
 
3
  /*
4
  Plugin Name: Responsive Menu
5
+ Plugin URI: https://expresstech.io
6
  Description: Highly Customisable Responsive Menu Plugin for WordPress
7
+ Version: 3.1.25
8
+ Author: ExpressTech
9
  Text Domain: responsive-menu
10
  Author URI: https://responsive.menu
11
  License: GPL2
12
+ Tags: responsive, menu, responsive menu, mega menu, max mega menu, max menu
13
  */
14
 
15
  add_action('admin_init', 'check_responsive_menu_php_version');
32
  if(version_compare(PHP_VERSION, '5.4', '<'))
33
  return;
34
 
35
+ add_action( 'admin_notices', 'og_pro_deactivate_pro_version_notice');
36
+
37
+ function og_pro_deactivate_pro_version_notice() {
38
+ if(get_transient('og-admin-notice-activation-pro')) {
39
+ ?>
40
+ <div class="notice notice-error is-dismissible">
41
+ <p>Responsive Menu Pro has been deactivated<p/>
42
+
43
+ </div>
44
+ <?php
45
+ delete_transient('og-admin-notice-activation-pro');
46
+ }
47
+ }
48
+
49
+ function og_deactivate_responsive_menu_pro() {
50
+
51
+ $plugin = 'responsive-menu-pro/responsive-menu-pro.php';
52
+
53
+ if( is_plugin_active($plugin) ){
54
+ deactivate_plugins( 'responsive-menu-pro/responsive-menu-pro.php');
55
+ set_transient( 'og-admin-notice-activation-pro', true, 5 );
56
+
57
+ return;
58
+ }
59
+ }
60
+ //to check weather another plugin is acivated or not.
61
+ register_activation_hook( __FILE__, 'og_deactivate_responsive_menu_pro');
62
+
63
+
64
  include dirname(__FILE__) . '/vendor/autoload.php';
65
  include dirname(__FILE__) . '/config/default_options.php';
66
  include dirname(__FILE__) . '/config/services.php';
vendor/composer/autoload_files.php ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // autoload_files.php @generated by Composer
4
+
5
+ $vendorDir = dirname(dirname(__FILE__));
6
+ $baseDir = dirname($vendorDir);
7
+
8
+ return array(
9
+ '320cde22f66dd4f5d3fd621d3e88b98f' => $vendorDir . '/symfony/polyfill-ctype/bootstrap.php',
10
+ );
vendor/symfony/polyfill-ctype/Ctype.php ADDED
@@ -0,0 +1,227 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Polyfill\Ctype;
13
+
14
+ /**
15
+ * Ctype implementation through regex.
16
+ *
17
+ * @internal
18
+ *
19
+ * @author Gert de Pagter <BackEndTea@gmail.com>
20
+ */
21
+ final class Ctype
22
+ {
23
+ /**
24
+ * Returns TRUE if every character in text is either a letter or a digit, FALSE otherwise.
25
+ *
26
+ * @see https://php.net/ctype-alnum
27
+ *
28
+ * @param string|int $text
29
+ *
30
+ * @return bool
31
+ */
32
+ public static function ctype_alnum($text)
33
+ {
34
+ $text = self::convert_int_to_char_for_ctype($text);
35
+
36
+ return \is_string($text) && '' !== $text && !preg_match('/[^A-Za-z0-9]/', $text);
37
+ }
38
+
39
+ /**
40
+ * Returns TRUE if every character in text is a letter, FALSE otherwise.
41
+ *
42
+ * @see https://php.net/ctype-alpha
43
+ *
44
+ * @param string|int $text
45
+ *
46
+ * @return bool
47
+ */
48
+ public static function ctype_alpha($text)
49
+ {
50
+ $text = self::convert_int_to_char_for_ctype($text);
51
+
52
+ return \is_string($text) && '' !== $text && !preg_match('/[^A-Za-z]/', $text);
53
+ }
54
+
55
+ /**
56
+ * Returns TRUE if every character in text is a control character from the current locale, FALSE otherwise.
57
+ *
58
+ * @see https://php.net/ctype-cntrl
59
+ *
60
+ * @param string|int $text
61
+ *
62
+ * @return bool
63
+ */
64
+ public static function ctype_cntrl($text)
65
+ {
66
+ $text = self::convert_int_to_char_for_ctype($text);
67
+
68
+ return \is_string($text) && '' !== $text && !preg_match('/[^\x00-\x1f\x7f]/', $text);
69
+ }
70
+
71
+ /**
72
+ * Returns TRUE if every character in the string text is a decimal digit, FALSE otherwise.
73
+ *
74
+ * @see https://php.net/ctype-digit
75
+ *
76
+ * @param string|int $text
77
+ *
78
+ * @return bool
79
+ */
80
+ public static function ctype_digit($text)
81
+ {
82
+ $text = self::convert_int_to_char_for_ctype($text);
83
+
84
+ return \is_string($text) && '' !== $text && !preg_match('/[^0-9]/', $text);
85
+ }
86
+
87
+ /**
88
+ * Returns TRUE if every character in text is printable and actually creates visible output (no white space), FALSE otherwise.
89
+ *
90
+ * @see https://php.net/ctype-graph
91
+ *
92
+ * @param string|int $text
93
+ *
94
+ * @return bool
95
+ */
96
+ public static function ctype_graph($text)
97
+ {
98
+ $text = self::convert_int_to_char_for_ctype($text);
99
+
100
+ return \is_string($text) && '' !== $text && !preg_match('/[^!-~]/', $text);
101
+ }
102
+
103
+ /**
104
+ * Returns TRUE if every character in text is a lowercase letter.
105
+ *
106
+ * @see https://php.net/ctype-lower
107
+ *
108
+ * @param string|int $text
109
+ *
110
+ * @return bool
111
+ */
112
+ public static function ctype_lower($text)
113
+ {
114
+ $text = self::convert_int_to_char_for_ctype($text);
115
+
116
+ return \is_string($text) && '' !== $text && !preg_match('/[^a-z]/', $text);
117
+ }
118
+
119
+ /**
120
+ * Returns TRUE if every character in text will actually create output (including blanks). Returns FALSE if text contains control characters or characters that do not have any output or control function at all.
121
+ *
122
+ * @see https://php.net/ctype-print
123
+ *
124
+ * @param string|int $text
125
+ *
126
+ * @return bool
127
+ */
128
+ public static function ctype_print($text)
129
+ {
130
+ $text = self::convert_int_to_char_for_ctype($text);
131
+
132
+ return \is_string($text) && '' !== $text && !preg_match('/[^ -~]/', $text);
133
+ }
134
+
135
+ /**
136
+ * Returns TRUE if every character in text is printable, but neither letter, digit or blank, FALSE otherwise.
137
+ *
138
+ * @see https://php.net/ctype-punct
139
+ *
140
+ * @param string|int $text
141
+ *
142
+ * @return bool
143
+ */
144
+ public static function ctype_punct($text)
145
+ {
146
+ $text = self::convert_int_to_char_for_ctype($text);
147
+
148
+ return \is_string($text) && '' !== $text && !preg_match('/[^!-\/\:-@\[-`\{-~]/', $text);
149
+ }
150
+
151
+ /**
152
+ * Returns TRUE if every character in text creates some sort of white space, FALSE otherwise. Besides the blank character this also includes tab, vertical tab, line feed, carriage return and form feed characters.
153
+ *
154
+ * @see https://php.net/ctype-space
155
+ *
156
+ * @param string|int $text
157
+ *
158
+ * @return bool
159
+ */
160
+ public static function ctype_space($text)
161
+ {
162
+ $text = self::convert_int_to_char_for_ctype($text);
163
+
164
+ return \is_string($text) && '' !== $text && !preg_match('/[^\s]/', $text);
165
+ }
166
+
167
+ /**
168
+ * Returns TRUE if every character in text is an uppercase letter.
169
+ *
170
+ * @see https://php.net/ctype-upper
171
+ *
172
+ * @param string|int $text
173
+ *
174
+ * @return bool
175
+ */
176
+ public static function ctype_upper($text)
177
+ {
178
+ $text = self::convert_int_to_char_for_ctype($text);
179
+
180
+ return \is_string($text) && '' !== $text && !preg_match('/[^A-Z]/', $text);
181
+ }
182
+
183
+ /**
184
+ * Returns TRUE if every character in text is a hexadecimal 'digit', that is a decimal digit or a character from [A-Fa-f] , FALSE otherwise.
185
+ *
186
+ * @see https://php.net/ctype-xdigit
187
+ *
188
+ * @param string|int $text
189
+ *
190
+ * @return bool
191
+ */
192
+ public static function ctype_xdigit($text)
193
+ {
194
+ $text = self::convert_int_to_char_for_ctype($text);
195
+
196
+ return \is_string($text) && '' !== $text && !preg_match('/[^A-Fa-f0-9]/', $text);
197
+ }
198
+
199
+ /**
200
+ * Converts integers to their char versions according to normal ctype behaviour, if needed.
201
+ *
202
+ * If an integer between -128 and 255 inclusive is provided,
203
+ * it is interpreted as the ASCII value of a single character
204
+ * (negative values have 256 added in order to allow characters in the Extended ASCII range).
205
+ * Any other integer is interpreted as a string containing the decimal digits of the integer.
206
+ *
207
+ * @param string|int $int
208
+ *
209
+ * @return mixed
210
+ */
211
+ private static function convert_int_to_char_for_ctype($int)
212
+ {
213
+ if (!\is_int($int)) {
214
+ return $int;
215
+ }
216
+
217
+ if ($int < -128 || $int > 255) {
218
+ return (string) $int;
219
+ }
220
+
221
+ if ($int < 0) {
222
+ $int += 256;
223
+ }
224
+
225
+ return \chr($int);
226
+ }
227
+ }
vendor/symfony/polyfill-ctype/LICENSE ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Copyright (c) 2018-2019 Fabien Potencier
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is furnished
8
+ to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all
11
+ copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
vendor/symfony/polyfill-ctype/README.md ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Symfony Polyfill / Ctype
2
+ ========================
3
+
4
+ This component provides `ctype_*` functions to users who run php versions without the ctype extension.
5
+
6
+ More information can be found in the
7
+ [main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md).
8
+
9
+ License
10
+ =======
11
+
12
+ This library is released under the [MIT license](LICENSE).
vendor/symfony/polyfill-ctype/bootstrap.php ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ use Symfony\Polyfill\Ctype as p;
13
+
14
+ if (!function_exists('ctype_alnum')) {
15
+ function ctype_alnum($text) { return p\Ctype::ctype_alnum($text); }
16
+ function ctype_alpha($text) { return p\Ctype::ctype_alpha($text); }
17
+ function ctype_cntrl($text) { return p\Ctype::ctype_cntrl($text); }
18
+ function ctype_digit($text) { return p\Ctype::ctype_digit($text); }
19
+ function ctype_graph($text) { return p\Ctype::ctype_graph($text); }
20
+ function ctype_lower($text) { return p\Ctype::ctype_lower($text); }
21
+ function ctype_print($text) { return p\Ctype::ctype_print($text); }
22
+ function ctype_punct($text) { return p\Ctype::ctype_punct($text); }
23
+ function ctype_space($text) { return p\Ctype::ctype_space($text); }
24
+ function ctype_upper($text) { return p\Ctype::ctype_upper($text); }
25
+ function ctype_xdigit($text) { return p\Ctype::ctype_xdigit($text); }
26
+ }
vendor/symfony/polyfill-ctype/composer.json ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "symfony/polyfill-ctype",
3
+ "type": "library",
4
+ "description": "Symfony polyfill for ctype functions",
5
+ "keywords": ["polyfill", "compatibility", "portable", "ctype"],
6
+ "homepage": "https://symfony.com",
7
+ "license": "MIT",
8
+ "authors": [
9
+ {
10
+ "name": "Gert de Pagter",
11
+ "email": "BackEndTea@gmail.com"
12
+ },
13
+ {
14
+ "name": "Symfony Community",
15
+ "homepage": "https://symfony.com/contributors"
16
+ }
17
+ ],
18
+ "require": {
19
+ "php": ">=5.3.3"
20
+ },
21
+ "autoload": {
22
+ "psr-4": { "Symfony\\Polyfill\\Ctype\\": "" },
23
+ "files": [ "bootstrap.php" ]
24
+ },
25
+ "suggest": {
26
+ "ext-ctype": "For best performance"
27
+ },
28
+ "minimum-stability": "dev",
29
+ "extra": {
30
+ "branch-alias": {
31
+ "dev-master": "1.12-dev"
32
+ }
33
+ }
34
+ }
vendor/twig/twig/.gitignore ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ /build
2
+ /composer.lock
3
+ /ext/twig/autom4te.cache/
4
+ /phpunit.xml
5
+ /vendor
vendor/twig/twig/doc/filters/filter.rst ADDED
@@ -0,0 +1,58 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ``filter``
2
+ =========
3
+
4
+ .. versionadded:: 1.41
5
+ The ``filter`` filter was added in Twig 1.41 and 2.10.
6
+
7
+ The ``filter`` filter filters elements of a sequence or a mapping using an arrow
8
+ function. The arrow function receives the value of the sequence or mapping:
9
+
10
+ .. code-block:: twig
11
+
12
+ {% set sizes = [34, 36, 38, 40, 42] %}
13
+
14
+ {{ sizes|filter(v => v > 38)|join(', ') }}
15
+ {# output 40, 42 #}
16
+
17
+ Combined with the ``for`` tag, it allows to filter the items to iterate over:
18
+
19
+ .. code-block:: twig
20
+
21
+ {% for v in sizes|filter(v => v > 38) -%}
22
+ {{ v }}
23
+ {% endfor %}
24
+ {# output 40 42 #}
25
+
26
+ It also works with mappings:
27
+
28
+ .. code-block:: twig
29
+
30
+ {% set sizes = {
31
+ xs: 34,
32
+ s: 36,
33
+ m: 38,
34
+ l: 40,
35
+ xl: 42,
36
+ } %}
37
+
38
+ {% for k, v in sizes|filter(v => v > 38) -%}
39
+ {{ k }} = {{ v }}
40
+ {% endfor %}
41
+ {# output l = 40 xl = 42 #}
42
+
43
+ The arrow function also receives the key as a second argument:
44
+
45
+ .. code-block:: twig
46
+
47
+ {% for k, v in sizes|filter((v, k) => v > 38 and k != "xl") -%}
48
+ {{ k }} = {{ v }}
49
+ {% endfor %}
50
+ {# output l = 40 #}
51
+
52
+ Note that the arrow function has access to the current context.
53
+
54
+ Arguments
55
+ ---------
56
+
57
+ * ``array``: The sequence or mapping
58
+ * ``arrow``: The arrow function
vendor/twig/twig/doc/filters/map.rst ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ``map``
2
+ =======
3
+
4
+ .. versionadded:: 1.41
5
+ The ``map`` filter was added in Twig 1.41 and 2.10.
6
+
7
+ The ``map`` filter applies an arrow function to the elements of a sequence or a
8
+ mapping. The arrow function receives the value of the sequence or mapping:
9
+
10
+ .. code-block:: twig
11
+
12
+ {% set people = [
13
+ {first: "Bob", last: "Smith"},
14
+ {first: "Alice", last: "Dupond"},
15
+ ] %}
16
+
17
+ {{ people|map(p => "#{p.first} #{p.last}")|join(', ') }}
18
+ {# outputs Bob Smith, Alice Dupond #}
19
+
20
+ The arrow function also receives the key as a second argument:
21
+
22
+ .. code-block:: twig
23
+
24
+ {% set people = {
25
+ "Bob": "Smith",
26
+ "Alice": "Dupond",
27
+ } %}
28
+
29
+ {{ people|map((first, last) => "#{first} #{last}")|join(', ') }}
30
+ {# outputs Bob Smith, Alice Dupond #}
31
+
32
+ Note that the arrow function has access to the current context.
33
+
34
+ Arguments
35
+ ---------
36
+
37
+ * ``array``: The sequence or mapping
38
+ * ``arrow``: The arrow function
vendor/twig/twig/doc/filters/reduce.rst ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ``reduce``
2
+ =========
3
+
4
+ .. versionadded:: 1.41
5
+ The ``reduce`` filter was added in Twig 1.41 and 2.10.
6
+
7
+ The ``reduce`` filter iteratively reduces a sequence or a mapping to a single
8
+ value using an arrow function, so as to reduce it to a single value. The arrow
9
+ function receives the return value of the previous iteration and the current
10
+ value of the sequence or mapping:
11
+
12
+ .. code-block:: twig
13
+
14
+ {% set numbers = [1, 2, 3] %}
15
+
16
+ {{ numbers|reduce((carry, v) => carry + v) }}
17
+ {# output 6 #}
18
+
19
+ The ``reduce`` filter takes an ``initial`` value as a second argument:
20
+
21
+ .. code-block:: twig
22
+
23
+ {{ numbers|reduce((carry, v) => carry + v, 10) }}
24
+ {# output 16 #}
25
+
26
+ Note that the arrow function has access to the current context.
27
+
28
+ Arguments
29
+ ---------
30
+
31
+ * ``array``: The sequence or mapping
32
+ * ``arrow``: The arrow function
33
+ * ``initial``: The initial value
vendor/twig/twig/doc/filters/spaceless.rst ADDED
@@ -0,0 +1,65 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ``spaceless``
2
+ =============
3
+
4
+ .. versionadded:: 1.38
5
+
6
+ The ``spaceless`` filter was added in Twig 1.38.
7
+
8
+ Use the ``spaceless`` filter to remove whitespace *between HTML tags*, not
9
+ whitespace within HTML tags or whitespace in plain text:
10
+
11
+ .. code-block:: twig
12
+
13
+ {{
14
+ "<div>
15
+ <strong>foo</strong>
16
+ </div>
17
+ "|spaceless }}
18
+
19
+ {# output will be <div><strong>foo</strong></div> #}
20
+
21
+ You can combine ``spaceless`` with the ``apply`` tag to apply the transformation
22
+ on large amounts of HTML:
23
+
24
+ .. code-block:: twig
25
+
26
+ {% apply spaceless %}
27
+ <div>
28
+ <strong>foo</strong>
29
+ </div>
30
+ {% endapply %}
31
+
32
+ {# output will be <div><strong>foo</strong></div> #}
33
+
34
+ .. note::
35
+
36
+ The ``apply`` tag was introduced in Twig 1.40; use the ``filter`` tag with
37
+ previous versions.
38
+
39
+ This tag is not meant to "optimize" the size of the generated HTML content but
40
+ merely to avoid extra whitespace between HTML tags to avoid browser rendering
41
+ quirks under some circumstances.
42
+
43
+ .. caution::
44
+
45
+ As the filter uses a regular expression behind the scenes, its performance
46
+ is directly related to the text size you are working on (remember that
47
+ filters are executed at runtime).
48
+
49
+ .. tip::
50
+
51
+ If you want to optimize the size of the generated HTML content, gzip
52
+ compress the output instead.
53
+
54
+ .. tip::
55
+
56
+ If you want to create a tag that actually removes all extra whitespace in
57
+ an HTML string, be warned that this is not as easy as it seems to be
58
+ (think of ``textarea`` or ``pre`` tags for instance). Using a third-party
59
+ library like Tidy is probably a better idea.
60
+
61
+ .. tip::
62
+
63
+ For more information on whitespace control, read the
64
+ :ref:`dedicated section <templates-whitespace-control>` of the documentation and learn how
65
+ you can also use the whitespace control modifier on your tags.
vendor/twig/twig/doc/tags/apply.rst ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ``apply``
2
+ =========
3
+
4
+ .. versionadded:: 1.40
5
+ The ``apply`` tag was added in Twig 1.40.
6
+
7
+ The ``apply`` tag allows you to apply Twig filters on a block of template data:
8
+
9
+ .. code-block:: twig
10
+
11
+ {% apply upper %}
12
+ This text becomes uppercase
13
+ {% endapply %}
14
+
15
+ You can also chain filters and pass arguments to them:
16
+
17
+ .. code-block:: twig
18
+
19
+ {% apply lower|escape('html') %}
20
+ <strong>SOME TEXT</strong>
21
+ {% endapply %}
22
+
23
+ {# outputs "&lt;strong&gt;some text&lt;/strong&gt;" #}
vendor/twig/twig/doc/tags/deprecated.rst ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ``deprecated``
2
+ ==============
3
+
4
+ .. versionadded:: 1.36 and 2.6
5
+ The ``deprecated`` tag was added in Twig 1.36 and 2.6.
6
+
7
+ Twig generates a deprecation notice (via a call to the ``trigger_error()``
8
+ PHP function) where the ``deprecated`` tag is used in a template:
9
+
10
+ .. code-block:: twig
11
+
12
+ {# base.twig #}
13
+ {% deprecated 'The "base.twig" template is deprecated, use "layout.twig" instead.' %}
14
+ {% extends 'layout.twig' %}
15
+
16
+ Also you can deprecate a block in the following way:
17
+
18
+ .. code-block:: twig
19
+
20
+ {% block hey %}
21
+ {% deprecated 'The "hey" block is deprecated, use "greet" instead.' %}
22
+ {{ block('greet') }}
23
+ {% endblock %}
24
+
25
+ {% block greet %}
26
+ Hey you!
27
+ {% endblock %}
28
+
29
+ Note that by default, the deprecation notices are silenced and never displayed nor logged.
30
+ See :ref:`deprecation-notices` to learn how to handle them.
vendor/twig/twig/drupal_test.sh ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+
3
+ set -x
4
+ set -e
5
+
6
+ REPO=`pwd`
7
+ cd /tmp
8
+ rm -rf drupal-twig-test
9
+ composer create-project --no-interaction drupal-composer/drupal-project:8.x-dev drupal-twig-test
10
+ cd drupal-twig-test
11
+ (cd vendor/twig && rm -rf twig && ln -sf $REPO twig)
12
+ echo '$config["system.logging"]["error_level"] = "verbose";' >> web/sites/default/settings.php
13
+ php ./web/core/scripts/drupal install --no-interaction demo_umami > output
14
+ perl -p -i -e 's/^([A-Za-z]+)\: (.+)$/export DRUPAL_\1=\2/' output
15
+ source output
16
+
17
+ wget https://get.symfony.com/cli/installer -O - | bash
18
+ export PATH="$HOME/.symfony/bin:$PATH"
19
+ symfony server:start -d --no-tls
20
+ ENDPOINT=`symfony server:status -no-ansi | sed -E 's/^.+ http/http/'`
21
+
22
+ curl -OLsS https://get.blackfire.io/blackfire-player.phar
23
+ chmod +x blackfire-player.phar
24
+ cat > drupal-tests.bkf <<EOF
25
+ name "Drupal tests"
26
+
27
+ scenario
28
+ name "homepage"
29
+ set name "admin"
30
+ set pass "pass"
31
+
32
+ visit url('/')
33
+ expect status_code() == 200
34
+ click link('Articles')
35
+ expect status_code() == 200
36
+ click link('Dairy-free and delicious milk chocolate')
37
+ expect body() matches "/Dairy\-free milk chocolate is made in largely the same way as regular chocolate/"
38
+ expect status_code() == 200
39
+ click link('Log in')
40
+ expect status_code() == 200
41
+ submit button("Log in")
42
+ param name name
43
+ param pass pass
44
+ expect status_code() == 303
45
+ follow
46
+ expect status_code() == 200
47
+ click link('Structure')
48
+ expect status_code() == 200
49
+ EOF
50
+ ./blackfire-player.phar run drupal-tests.bkf --endpoint=$ENDPOINT --variable name=$DRUPAL_Username --variable pass=$DRUPAL_Password
51
+ symfony server:stop
vendor/twig/twig/ext/twig/.gitignore ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ *.sw*
2
+ .deps
3
+ Makefile
4
+ Makefile.fragments
5
+ Makefile.global
6
+ Makefile.objects
7
+ acinclude.m4
8
+ aclocal.m4
9
+ build/
10
+ config.cache
11
+ config.guess
12
+ config.h
13
+ config.h.in
14
+ config.log
15
+ config.nice
16
+ config.status
17
+ config.sub
18
+ configure
19
+ configure.in
20
+ install-sh
21
+ libtool
22
+ ltmain.sh
23
+ missing
24
+ mkinstalldirs
25
+ run-tests.php
26
+ twig.loT
27
+ .libs/
28
+ modules/
29
+ twig.la
30
+ twig.lo
vendor/twig/twig/lib/Twig/Node/Deprecated.php ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ use Twig\Node\DeprecatedNode;
4
+
5
+ class_exists('Twig\Node\DeprecatedNode');
6
+
7
+ if (\false) {
8
+ class Twig_Node_Deprecated extends DeprecatedNode
9
+ {
10
+ }
11
+ }
vendor/twig/twig/lib/Twig/Profiler/Dumper/Base.php ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ use Twig\Profiler\Dumper\BaseDumper;
4
+
5
+ class_exists('Twig\Profiler\Dumper\BaseDumper');
6
+
7
+ if (\false) {
8
+ class Twig_Profiler_Dumper_Base extends BaseDumper
9
+ {
10
+ }
11
+ }
vendor/twig/twig/lib/Twig/TokenParser/Deprecated.php ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ use Twig\TokenParser\DeprecatedTokenParser;
4
+
5
+ class_exists('Twig\TokenParser\DeprecatedTokenParser');
6
+
7
+ if (\false) {
8
+ class Twig_TokenParser_Deprecated extends DeprecatedTokenParser
9
+ {
10
+ }
11
+ }
vendor/twig/twig/src/Cache/CacheInterface.php ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of Twig.
5
+ *
6
+ * (c) Fabien Potencier
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Twig\Cache;
13
+
14
+ /**
15
+ * Interface implemented by cache classes.
16
+ *
17
+ * It is highly recommended to always store templates on the filesystem to
18
+ * benefit from the PHP opcode cache. This interface is mostly useful if you
19
+ * need to implement a custom strategy for storing templates on the filesystem.
20
+ *
21
+ * @author Andrew Tch <andrew@noop.lv>
22
+ */
23
+ interface CacheInterface
24
+ {
25
+ /**
26
+ * Generates a cache key for the given template class name.
27
+ *
28
+ * @param string $name The template name
29
+ * @param string $className The template class name
30
+ *
31
+ * @return string
32
+ */
33
+ public function generateKey($name, $className);
34
+
35
+ /**
36
+ * Writes the compiled template to cache.
37
+ *
38
+ * @param string $key The cache key
39
+ * @param string $content The template representation as a PHP class
40
+ */
41
+ public function write($key, $content);
42
+
43
+ /**
44
+ * Loads a template from the cache.
45
+ *
46
+ * @param string $key The cache key
47
+ */
48
+ public function load($key);
49
+
50
+ /**
51
+ * Returns the modification timestamp of a key.
52
+ *
53
+ * @param string $key The cache key
54
+ *
55
+ * @return int
56
+ */
57
+ public function getTimestamp($key);
58
+ }
59
+
60
+ class_alias('Twig\Cache\CacheInterface', 'Twig_CacheInterface');
vendor/twig/twig/src/Cache/FilesystemCache.php ADDED
@@ -0,0 +1,93 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of Twig.
5
+ *
6
+ * (c) Fabien Potencier
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Twig\Cache;
13
+
14
+ /**
15
+ * Implements a cache on the filesystem.
16
+ *
17
+ * @author Andrew Tch <andrew@noop.lv>
18
+ */
19
+ class FilesystemCache implements CacheInterface
20
+ {
21
+ const FORCE_BYTECODE_INVALIDATION = 1;
22
+
23
+ private $directory;
24
+ private $options;
25
+
26
+ /**
27
+ * @param string $directory The root cache directory
28
+ * @param int $options A set of options
29
+ */
30
+ public function __construct($directory, $options = 0)
31
+ {
32
+ $this->directory = rtrim($directory, '\/').'/';
33
+ $this->options = $options;
34
+ }
35
+
36
+ public function generateKey($name, $className)
37
+ {
38
+ $hash = hash('sha256', $className);
39
+
40
+ return $this->directory.$hash[0].$hash[1].'/'.$hash.'.php';
41
+ }
42
+
43
+ public function load($key)
44
+ {
45
+ if (file_exists($key)) {
46
+ @include_once $key;
47
+ }
48
+ }
49
+
50
+ public function write($key, $content)
51
+ {
52
+ $dir = \dirname($key);
53
+ if (!is_dir($dir)) {
54
+ if (false === @mkdir($dir, 0777, true)) {
55
+ clearstatcache(true, $dir);
56
+ if (!is_dir($dir)) {
57
+ throw new \RuntimeException(sprintf('Unable to create the cache directory (%s).', $dir));
58
+ }
59
+ }
60
+ } elseif (!is_writable($dir)) {
61
+ throw new \RuntimeException(sprintf('Unable to write in the cache directory (%s).', $dir));
62
+ }
63
+
64
+ $tmpFile = tempnam($dir, basename($key));
65
+ if (false !== @file_put_contents($tmpFile, $content) && @rename($tmpFile, $key)) {
66
+ @chmod($key, 0666 & ~umask());
67
+
68
+ if (self::FORCE_BYTECODE_INVALIDATION == ($this->options & self::FORCE_BYTECODE_INVALIDATION)) {
69
+ // Compile cached file into bytecode cache
70
+ if (\function_exists('opcache_invalidate')) {
71
+ opcache_invalidate($key, true);
72
+ } elseif (\function_exists('apc_compile_file')) {
73
+ apc_compile_file($key);
74
+ }
75
+ }
76
+
77
+ return;
78
+ }
79
+
80
+ throw new \RuntimeException(sprintf('Failed to write cache file "%s".', $key));
81
+ }
82
+
83
+ public function getTimestamp($key)
84
+ {
85
+ if (!file_exists($key)) {
86
+ return 0;
87
+ }
88
+
89
+ return (int) @filemtime($key);
90
+ }
91
+ }
92
+
93
+ class_alias('Twig\Cache\FilesystemCache', 'Twig_Cache_Filesystem');
vendor/twig/twig/src/Cache/NullCache.php ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of Twig.
5
+ *
6
+ * (c) Fabien Potencier
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Twig\Cache;
13
+
14
+ /**
15
+ * Implements a no-cache strategy.
16
+ *
17
+ * @final
18
+ *
19
+ * @author Fabien Potencier <fabien@symfony.com>
20
+ */
21
+ class NullCache implements CacheInterface
22
+ {
23
+ public function generateKey($name, $className)
24
+ {
25
+ return '';
26
+ }
27
+
28
+ public function write($key, $content)
29
+ {
30
+ }
31
+
32
+ public function load($key)
33
+ {
34
+ }
35
+
36
+ public function getTimestamp($key)
37
+ {
38
+ return 0;
39
+ }
40
+ }
41
+
42
+ class_alias('Twig\Cache\NullCache', 'Twig_Cache_Null');
vendor/twig/twig/src/Compiler.php ADDED
@@ -0,0 +1,288 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 </