656df4be by Jeff Balicki

start

Signed-off-by: Jeff <jeff@gotenzing.com>
0 parents
Showing 1000 changed files with 5032 additions and 0 deletions

Too many changes to show.

To preserve performance only 1000 of 1000+ files are displayed.

No preview for this file type
1 DB_HOST=127.0.0.1
2 DB_NAME=tenzing-web-2023
3 DB_USER=root
4 DB_PASS=jeff518862
1
2 # BEGIN WordPress
3 # The directives (lines) between `BEGIN WordPress` and `END WordPress` are
4 # dynamically generated, and should only be modified via WordPress filters.
5 # Any changes to the directives between these markers will be overwritten.
6 <IfModule mod_rewrite.c>
7 RewriteEngine On
8 RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
9 RewriteBase /
10 RewriteRule ^index\.php$ - [L]
11 RewriteCond %{REQUEST_FILENAME} !-f
12 RewriteCond %{REQUEST_FILENAME} !-d
13 RewriteRule . /index.php [L]
14 </IfModule>
15
16 # END WordPress
...\ No newline at end of file ...\ No newline at end of file
1 {
2 "require": {
3 "php": ">=5.4",
4 "symfony/var-dumper": "~2.6",
5 "vlucas/phpdotenv": "~1.1"
6 },
7 "repositories": [
8 {
9 "type": "composer",
10 "url": "https://wpackagist.org"
11 }
12 ],
13 "config": {
14 "preferred-install": "dist"
15 },
16 "extra": {
17 "installer-paths": {
18 "wp-content/mu-plugins/{$name}/": [
19 "type:wordpress-muplugin"
20 ],
21 "wp-content/plugins/{$name}/": [
22 "type:wordpress-plugin"
23 ],
24 "wp-content/themes/{$name}/": [
25 "type:wordpress-theme"
26 ]
27 },
28 "wordpress-install-dir": "./"
29 }
30 }
1 {
2 "_readme": [
3 "This file locks the dependencies of your project to a known state",
4 "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
5 "This file is @generated automatically"
6 ],
7 "content-hash": "2b5fd6e0e1d56a6dc87df0aae3949d7d",
8 "packages": [
9 {
10 "name": "symfony/polyfill-mbstring",
11 "version": "v1.27.0",
12 "source": {
13 "type": "git",
14 "url": "https://github.com/symfony/polyfill-mbstring.git",
15 "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534"
16 },
17 "dist": {
18 "type": "zip",
19 "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
20 "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
21 "shasum": ""
22 },
23 "require": {
24 "php": ">=7.1"
25 },
26 "provide": {
27 "ext-mbstring": "*"
28 },
29 "suggest": {
30 "ext-mbstring": "For best performance"
31 },
32 "type": "library",
33 "extra": {
34 "branch-alias": {
35 "dev-main": "1.27-dev"
36 },
37 "thanks": {
38 "name": "symfony/polyfill",
39 "url": "https://github.com/symfony/polyfill"
40 }
41 },
42 "autoload": {
43 "files": [
44 "bootstrap.php"
45 ],
46 "psr-4": {
47 "Symfony\\Polyfill\\Mbstring\\": ""
48 }
49 },
50 "notification-url": "https://packagist.org/downloads/",
51 "license": [
52 "MIT"
53 ],
54 "authors": [
55 {
56 "name": "Nicolas Grekas",
57 "email": "p@tchwork.com"
58 },
59 {
60 "name": "Symfony Community",
61 "homepage": "https://symfony.com/contributors"
62 }
63 ],
64 "description": "Symfony polyfill for the Mbstring extension",
65 "homepage": "https://symfony.com",
66 "keywords": [
67 "compatibility",
68 "mbstring",
69 "polyfill",
70 "portable",
71 "shim"
72 ],
73 "support": {
74 "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0"
75 },
76 "funding": [
77 {
78 "url": "https://symfony.com/sponsor",
79 "type": "custom"
80 },
81 {
82 "url": "https://github.com/fabpot",
83 "type": "github"
84 },
85 {
86 "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
87 "type": "tidelift"
88 }
89 ],
90 "time": "2022-11-03T14:55:06+00:00"
91 },
92 {
93 "name": "symfony/var-dumper",
94 "version": "v2.8.52",
95 "source": {
96 "type": "git",
97 "url": "https://github.com/symfony/var-dumper.git",
98 "reference": "91abb1e39d14fb7773d25de9c711949ea8502ac1"
99 },
100 "dist": {
101 "type": "zip",
102 "url": "https://api.github.com/repos/symfony/var-dumper/zipball/91abb1e39d14fb7773d25de9c711949ea8502ac1",
103 "reference": "91abb1e39d14fb7773d25de9c711949ea8502ac1",
104 "shasum": ""
105 },
106 "require": {
107 "php": ">=5.3.9",
108 "symfony/polyfill-mbstring": "~1.0"
109 },
110 "conflict": {
111 "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0"
112 },
113 "require-dev": {
114 "ext-iconv": "*",
115 "twig/twig": "~1.34|~2.4"
116 },
117 "suggest": {
118 "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).",
119 "ext-symfony_debug": ""
120 },
121 "type": "library",
122 "extra": {
123 "branch-alias": {
124 "dev-master": "2.8-dev"
125 }
126 },
127 "autoload": {
128 "files": [
129 "Resources/functions/dump.php"
130 ],
131 "psr-4": {
132 "Symfony\\Component\\VarDumper\\": ""
133 },
134 "exclude-from-classmap": [
135 "/Tests/"
136 ]
137 },
138 "notification-url": "https://packagist.org/downloads/",
139 "license": [
140 "MIT"
141 ],
142 "authors": [
143 {
144 "name": "Nicolas Grekas",
145 "email": "p@tchwork.com"
146 },
147 {
148 "name": "Symfony Community",
149 "homepage": "https://symfony.com/contributors"
150 }
151 ],
152 "description": "Symfony mechanism for exploring and dumping PHP variables",
153 "homepage": "https://symfony.com",
154 "keywords": [
155 "debug",
156 "dump"
157 ],
158 "support": {
159 "source": "https://github.com/symfony/var-dumper/tree/v2.8.50"
160 },
161 "time": "2018-11-11T11:18:13+00:00"
162 },
163 {
164 "name": "vlucas/phpdotenv",
165 "version": "v1.1.1",
166 "source": {
167 "type": "git",
168 "url": "https://github.com/vlucas/phpdotenv.git",
169 "reference": "0cac554ce06277e33ddf9f0b7ade4b8bbf2af3fa"
170 },
171 "dist": {
172 "type": "zip",
173 "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/0cac554ce06277e33ddf9f0b7ade4b8bbf2af3fa",
174 "reference": "0cac554ce06277e33ddf9f0b7ade4b8bbf2af3fa",
175 "shasum": ""
176 },
177 "require": {
178 "php": ">=5.3.2"
179 },
180 "require-dev": {
181 "phpunit/phpunit": "~4.0"
182 },
183 "type": "library",
184 "autoload": {
185 "psr-0": {
186 "Dotenv": "src/"
187 }
188 },
189 "notification-url": "https://packagist.org/downloads/",
190 "license": [
191 "BSD"
192 ],
193 "authors": [
194 {
195 "name": "Vance Lucas",
196 "email": "vance@vancelucas.com",
197 "homepage": "http://www.vancelucas.com"
198 }
199 ],
200 "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.",
201 "homepage": "http://github.com/vlucas/phpdotenv",
202 "keywords": [
203 "dotenv",
204 "env",
205 "environment"
206 ],
207 "support": {
208 "issues": "https://github.com/vlucas/phpdotenv/issues",
209 "source": "https://github.com/vlucas/phpdotenv/tree/1.1"
210 },
211 "time": "2015-05-30T15:59:26+00:00"
212 }
213 ],
214 "packages-dev": [],
215 "aliases": [],
216 "minimum-stability": "stable",
217 "stability-flags": [],
218 "prefer-stable": false,
219 "prefer-lowest": false,
220 "platform": {
221 "php": ">=5.4"
222 },
223 "platform-dev": [],
224 "plugin-api-version": "2.3.0"
225 }
1 <?php
2 /**
3 * Front to the WordPress application. This file doesn't do anything, but loads
4 * wp-blog-header.php which does and tells WordPress to load the theme.
5 *
6 * @package WordPress
7 */
8
9 /**
10 * Tells WordPress to load the WordPress theme and output it.
11 *
12 * @var bool
13 */
14 define( 'WP_USE_THEMES', true );
15
16 /** Loads the WordPress Environment and Template */
17 require __DIR__ . '/wp-blog-header.php';
This diff is collapsed. Click to expand it.
1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta name="viewport" content="width=device-width" />
5 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
6 <title>WordPress &#8250; ReadMe</title>
7 <link rel="stylesheet" href="wp-admin/css/install.css?ver=20100228" type="text/css" />
8 </head>
9 <body>
10 <h1 id="logo">
11 <a href="https://wordpress.org/"><img alt="WordPress" src="wp-admin/images/wordpress-logo.png" /></a>
12 </h1>
13 <p style="text-align: center">Semantic Personal Publishing Platform</p>
14
15 <h2>First Things First</h2>
16 <p>Welcome. WordPress is a very special project to me. Every developer and contributor adds something unique to the mix, and together we create something beautiful that I am proud to be a part of. Thousands of hours have gone into WordPress, and we are dedicated to making it better every day. Thank you for making it part of your world.</p>
17 <p style="text-align: right">&#8212; Matt Mullenweg</p>
18
19 <h2>Installation: Famous 5-minute install</h2>
20 <ol>
21 <li>Unzip the package in an empty directory and upload everything.</li>
22 <li>Open <span class="file"><a href="wp-admin/install.php">wp-admin/install.php</a></span> in your browser. It will take you through the process to set up a <code>wp-config.php</code> file with your database connection details.
23 <ol>
24 <li>If for some reason this does not work, do not worry. It may not work on all web hosts. Open up <code>wp-config-sample.php</code> with a text editor like WordPad or similar and fill in your database connection details.</li>
25 <li>Save the file as <code>wp-config.php</code> and upload it.</li>
26 <li>Open <span class="file"><a href="wp-admin/install.php">wp-admin/install.php</a></span> in your browser.</li>
27 </ol>
28 </li>
29 <li>Once the configuration file is set up, the installer will set up the tables needed for your site. If there is an error, double check your <code>wp-config.php</code> file, and try again. If it fails again, please go to the <a href="https://wordpress.org/support/forums/">WordPress support forums</a> with as much data as you can gather.</li>
30 <li><strong>If you did not enter a password, note the password given to you.</strong> If you did not provide a username, it will be <code>admin</code>.</li>
31 <li>The installer should then send you to the <a href="wp-login.php">login page</a>. Sign in with the username and password you chose during the installation. If a password was generated for you, you can then click on &#8220;Profile&#8221; to change the password.</li>
32 </ol>
33
34 <h2>Updating</h2>
35 <h3>Using the Automatic Updater</h3>
36 <ol>
37 <li>Open <span class="file"><a href="wp-admin/update-core.php">wp-admin/update-core.php</a></span> in your browser and follow the instructions.</li>
38 <li>You wanted more, perhaps? That&#8217;s it!</li>
39 </ol>
40
41 <h3>Updating Manually</h3>
42 <ol>
43 <li>Before you update anything, make sure you have backup copies of any files you may have modified such as <code>index.php</code>.</li>
44 <li>Delete your old WordPress files, saving ones you&#8217;ve modified.</li>
45 <li>Upload the new files.</li>
46 <li>Point your browser to <span class="file"><a href="wp-admin/upgrade.php">/wp-admin/upgrade.php</a>.</span></li>
47 </ol>
48
49 <h2>Migrating from other systems</h2>
50 <p>WordPress can <a href="https://wordpress.org/support/article/importing-content/">import from a number of systems</a>. First you need to get WordPress installed and working as described above, before using <a href="wp-admin/import.php">our import tools</a>.</p>
51
52 <h2>System Requirements</h2>
53 <ul>
54 <li><a href="https://secure.php.net/">PHP</a> version <strong>5.6.20</strong> or greater.</li>
55 <li><a href="https://www.mysql.com/">MySQL</a> version <strong>5.0</strong> or greater.</li>
56 </ul>
57
58 <h3>Recommendations</h3>
59 <ul>
60 <li><a href="https://secure.php.net/">PHP</a> version <strong>7.4</strong> or greater.</li>
61 <li><a href="https://www.mysql.com/">MySQL</a> version <strong>5.7</strong> or greater OR <a href="https://mariadb.org/">MariaDB</a> version <strong>10.3</strong> or greater.</li>
62 <li>The <a href="https://httpd.apache.org/docs/2.2/mod/mod_rewrite.html">mod_rewrite</a> Apache module.</li>
63 <li><a href="https://wordpress.org/news/2016/12/moving-toward-ssl/">HTTPS</a> support.</li>
64 <li>A link to <a href="https://wordpress.org/">wordpress.org</a> on your site.</li>
65 </ul>
66
67 <h2>Online Resources</h2>
68 <p>If you have any questions that are not addressed in this document, please take advantage of WordPress&#8217; numerous online resources:</p>
69 <dl>
70 <dt><a href="https://wordpress.org/support/">HelpHub</a></dt>
71 <dd>HelpHub is the encyclopedia of all things WordPress. It is the most comprehensive source of information for WordPress available.</dd>
72 <dt><a href="https://wordpress.org/news/">The WordPress Blog</a></dt>
73 <dd>This is where you&#8217;ll find the latest updates and news related to WordPress. Recent WordPress news appears in your administrative dashboard by default.</dd>
74 <dt><a href="https://planet.wordpress.org/">WordPress Planet</a></dt>
75 <dd>The WordPress Planet is a news aggregator that brings together posts from WordPress blogs around the web.</dd>
76 <dt><a href="https://wordpress.org/support/forums/">WordPress Support Forums</a></dt>
77 <dd>If you&#8217;ve looked everywhere and still cannot find an answer, the support forums are very active and have a large community ready to help. To help them help you be sure to use a descriptive thread title and describe your question in as much detail as possible.</dd>
78 <dt><a href="https://make.wordpress.org/support/handbook/appendix/other-support-locations/introduction-to-irc/">WordPress <abbr>IRC</abbr> (Internet Relay Chat) Channel</a></dt>
79 <dd>There is an online chat channel that is used for discussion among people who use WordPress and occasionally support topics. The above wiki page should point you in the right direction. (<a href="https://web.libera.chat/#wordpress">irc.libera.chat #wordpress</a>)</dd>
80 </dl>
81
82 <h2>Final Notes</h2>
83 <ul>
84 <li>If you have any suggestions, ideas, or comments, or if you (gasp!) found a bug, join us in the <a href="https://wordpress.org/support/forums/">Support Forums</a>.</li>
85 <li>WordPress has a robust plugin <abbr>API</abbr> (Application Programming Interface) that makes extending the code easy. If you are a developer interested in utilizing this, see the <a href="https://developer.wordpress.org/plugins/">Plugin Developer Handbook</a>. You shouldn&#8217;t modify any of the core code.</li>
86 </ul>
87
88 <h2>Share the Love</h2>
89 <p>WordPress has no multi-million dollar marketing campaign or celebrity sponsors, but we do have something even better&#8212;you. If you enjoy WordPress please consider telling a friend, setting it up for someone less knowledgeable than yourself, or writing the author of a media article that overlooks us.</p>
90
91 <p>WordPress is the official continuation of <a href="http://cafelog.com/">b2/caf&#233;log</a>, which came from Michel V. The work has been continued by the <a href="https://wordpress.org/about/">WordPress developers</a>. If you would like to support WordPress, please consider <a href="https://wordpress.org/donate/">donating</a>.</p>
92
93 <h2>License</h2>
94 <p>WordPress is free software, and is released under the terms of the <abbr>GPL</abbr> (GNU General Public License) version 2 or (at your option) any later version. See <a href="license.txt">license.txt</a>.</p>
95
96 </body>
97 </html>
1 <?php
2
3 // autoload.php @generated by Composer
4
5 if (PHP_VERSION_ID < 50600) {
6 if (!headers_sent()) {
7 header('HTTP/1.1 500 Internal Server Error');
8 }
9 $err = 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL;
10 if (!ini_get('display_errors')) {
11 if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') {
12 fwrite(STDERR, $err);
13 } elseif (!headers_sent()) {
14 echo $err;
15 }
16 }
17 trigger_error(
18 $err,
19 E_USER_ERROR
20 );
21 }
22
23 require_once __DIR__ . '/composer/autoload_real.php';
24
25 return ComposerAutoloaderInit03eba1cd2ecc731639bb7ed2e1143f46::getLoader();
1
2 Copyright (c) Nils Adermann, Jordi Boggiano
3
4 Permission is hereby granted, free of charge, to any person obtaining a copy
5 of this software and associated documentation files (the "Software"), to deal
6 in the Software without restriction, including without limitation the rights
7 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 copies of the Software, and to permit persons to whom the Software is furnished
9 to do so, subject to the following conditions:
10
11 The above copyright notice and this permission notice shall be included in all
12 copies or substantial portions of the Software.
13
14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20 THE SOFTWARE.
21
1 <?php
2
3 // autoload_classmap.php @generated by Composer
4
5 $vendorDir = dirname(__DIR__);
6 $baseDir = dirname($vendorDir);
7
8 return array(
9 'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php',
10 );
1 <?php
2
3 // autoload_files.php @generated by Composer
4
5 $vendorDir = dirname(__DIR__);
6 $baseDir = dirname($vendorDir);
7
8 return array(
9 '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php',
10 '667aeda72477189d0494fecd327c3641' => $vendorDir . '/symfony/var-dumper/Resources/functions/dump.php',
11 );
1 <?php
2
3 // autoload_namespaces.php @generated by Composer
4
5 $vendorDir = dirname(__DIR__);
6 $baseDir = dirname($vendorDir);
7
8 return array(
9 'Dotenv' => array($vendorDir . '/vlucas/phpdotenv/src'),
10 );
1 <?php
2
3 // autoload_psr4.php @generated by Composer
4
5 $vendorDir = dirname(__DIR__);
6 $baseDir = dirname($vendorDir);
7
8 return array(
9 'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'),
10 'Symfony\\Component\\VarDumper\\' => array($vendorDir . '/symfony/var-dumper'),
11 );
1 <?php
2
3 // autoload_real.php @generated by Composer
4
5 class ComposerAutoloaderInit03eba1cd2ecc731639bb7ed2e1143f46
6 {
7 private static $loader;
8
9 public static function loadClassLoader($class)
10 {
11 if ('Composer\Autoload\ClassLoader' === $class) {
12 require __DIR__ . '/ClassLoader.php';
13 }
14 }
15
16 /**
17 * @return \Composer\Autoload\ClassLoader
18 */
19 public static function getLoader()
20 {
21 if (null !== self::$loader) {
22 return self::$loader;
23 }
24
25 require __DIR__ . '/platform_check.php';
26
27 spl_autoload_register(array('ComposerAutoloaderInit03eba1cd2ecc731639bb7ed2e1143f46', 'loadClassLoader'), true, true);
28 self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
29 spl_autoload_unregister(array('ComposerAutoloaderInit03eba1cd2ecc731639bb7ed2e1143f46', 'loadClassLoader'));
30
31 require __DIR__ . '/autoload_static.php';
32 call_user_func(\Composer\Autoload\ComposerStaticInit03eba1cd2ecc731639bb7ed2e1143f46::getInitializer($loader));
33
34 $loader->register(true);
35
36 $filesToLoad = \Composer\Autoload\ComposerStaticInit03eba1cd2ecc731639bb7ed2e1143f46::$files;
37 $requireFile = static function ($fileIdentifier, $file) {
38 if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
39 $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
40
41 require $file;
42 }
43 };
44 foreach ($filesToLoad as $fileIdentifier => $file) {
45 ($requireFile)($fileIdentifier, $file);
46 }
47
48 return $loader;
49 }
50 }
1 <?php
2
3 // autoload_static.php @generated by Composer
4
5 namespace Composer\Autoload;
6
7 class ComposerStaticInit03eba1cd2ecc731639bb7ed2e1143f46
8 {
9 public static $files = array (
10 '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
11 '667aeda72477189d0494fecd327c3641' => __DIR__ . '/..' . '/symfony/var-dumper/Resources/functions/dump.php',
12 );
13
14 public static $prefixLengthsPsr4 = array (
15 'S' =>
16 array (
17 'Symfony\\Polyfill\\Mbstring\\' => 26,
18 'Symfony\\Component\\VarDumper\\' => 28,
19 ),
20 );
21
22 public static $prefixDirsPsr4 = array (
23 'Symfony\\Polyfill\\Mbstring\\' =>
24 array (
25 0 => __DIR__ . '/..' . '/symfony/polyfill-mbstring',
26 ),
27 'Symfony\\Component\\VarDumper\\' =>
28 array (
29 0 => __DIR__ . '/..' . '/symfony/var-dumper',
30 ),
31 );
32
33 public static $prefixesPsr0 = array (
34 'D' =>
35 array (
36 'Dotenv' =>
37 array (
38 0 => __DIR__ . '/..' . '/vlucas/phpdotenv/src',
39 ),
40 ),
41 );
42
43 public static $classMap = array (
44 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',
45 );
46
47 public static function getInitializer(ClassLoader $loader)
48 {
49 return \Closure::bind(function () use ($loader) {
50 $loader->prefixLengthsPsr4 = ComposerStaticInit03eba1cd2ecc731639bb7ed2e1143f46::$prefixLengthsPsr4;
51 $loader->prefixDirsPsr4 = ComposerStaticInit03eba1cd2ecc731639bb7ed2e1143f46::$prefixDirsPsr4;
52 $loader->prefixesPsr0 = ComposerStaticInit03eba1cd2ecc731639bb7ed2e1143f46::$prefixesPsr0;
53 $loader->classMap = ComposerStaticInit03eba1cd2ecc731639bb7ed2e1143f46::$classMap;
54
55 }, null, ClassLoader::class);
56 }
57 }
1 {
2 "packages": [
3 {
4 "name": "symfony/polyfill-mbstring",
5 "version": "v1.27.0",
6 "version_normalized": "1.27.0.0",
7 "source": {
8 "type": "git",
9 "url": "https://github.com/symfony/polyfill-mbstring.git",
10 "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534"
11 },
12 "dist": {
13 "type": "zip",
14 "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
15 "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
16 "shasum": ""
17 },
18 "require": {
19 "php": ">=7.1"
20 },
21 "provide": {
22 "ext-mbstring": "*"
23 },
24 "suggest": {
25 "ext-mbstring": "For best performance"
26 },
27 "time": "2022-11-03T14:55:06+00:00",
28 "type": "library",
29 "extra": {
30 "branch-alias": {
31 "dev-main": "1.27-dev"
32 },
33 "thanks": {
34 "name": "symfony/polyfill",
35 "url": "https://github.com/symfony/polyfill"
36 }
37 },
38 "installation-source": "dist",
39 "autoload": {
40 "files": [
41 "bootstrap.php"
42 ],
43 "psr-4": {
44 "Symfony\\Polyfill\\Mbstring\\": ""
45 }
46 },
47 "notification-url": "https://packagist.org/downloads/",
48 "license": [
49 "MIT"
50 ],
51 "authors": [
52 {
53 "name": "Nicolas Grekas",
54 "email": "p@tchwork.com"
55 },
56 {
57 "name": "Symfony Community",
58 "homepage": "https://symfony.com/contributors"
59 }
60 ],
61 "description": "Symfony polyfill for the Mbstring extension",
62 "homepage": "https://symfony.com",
63 "keywords": [
64 "compatibility",
65 "mbstring",
66 "polyfill",
67 "portable",
68 "shim"
69 ],
70 "support": {
71 "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0"
72 },
73 "funding": [
74 {
75 "url": "https://symfony.com/sponsor",
76 "type": "custom"
77 },
78 {
79 "url": "https://github.com/fabpot",
80 "type": "github"
81 },
82 {
83 "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
84 "type": "tidelift"
85 }
86 ],
87 "install-path": "../symfony/polyfill-mbstring"
88 },
89 {
90 "name": "symfony/var-dumper",
91 "version": "v2.8.52",
92 "version_normalized": "2.8.52.0",
93 "source": {
94 "type": "git",
95 "url": "https://github.com/symfony/var-dumper.git",
96 "reference": "91abb1e39d14fb7773d25de9c711949ea8502ac1"
97 },
98 "dist": {
99 "type": "zip",
100 "url": "https://api.github.com/repos/symfony/var-dumper/zipball/91abb1e39d14fb7773d25de9c711949ea8502ac1",
101 "reference": "91abb1e39d14fb7773d25de9c711949ea8502ac1",
102 "shasum": ""
103 },
104 "require": {
105 "php": ">=5.3.9",
106 "symfony/polyfill-mbstring": "~1.0"
107 },
108 "conflict": {
109 "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0"
110 },
111 "require-dev": {
112 "ext-iconv": "*",
113 "twig/twig": "~1.34|~2.4"
114 },
115 "suggest": {
116 "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).",
117 "ext-symfony_debug": ""
118 },
119 "time": "2018-11-11T11:18:13+00:00",
120 "type": "library",
121 "extra": {
122 "branch-alias": {
123 "dev-master": "2.8-dev"
124 }
125 },
126 "installation-source": "dist",
127 "autoload": {
128 "files": [
129 "Resources/functions/dump.php"
130 ],
131 "psr-4": {
132 "Symfony\\Component\\VarDumper\\": ""
133 },
134 "exclude-from-classmap": [
135 "/Tests/"
136 ]
137 },
138 "notification-url": "https://packagist.org/downloads/",
139 "license": [
140 "MIT"
141 ],
142 "authors": [
143 {
144 "name": "Nicolas Grekas",
145 "email": "p@tchwork.com"
146 },
147 {
148 "name": "Symfony Community",
149 "homepage": "https://symfony.com/contributors"
150 }
151 ],
152 "description": "Symfony mechanism for exploring and dumping PHP variables",
153 "homepage": "https://symfony.com",
154 "keywords": [
155 "debug",
156 "dump"
157 ],
158 "support": {
159 "source": "https://github.com/symfony/var-dumper/tree/v2.8.50"
160 },
161 "install-path": "../symfony/var-dumper"
162 },
163 {
164 "name": "vlucas/phpdotenv",
165 "version": "v1.1.1",
166 "version_normalized": "1.1.1.0",
167 "source": {
168 "type": "git",
169 "url": "https://github.com/vlucas/phpdotenv.git",
170 "reference": "0cac554ce06277e33ddf9f0b7ade4b8bbf2af3fa"
171 },
172 "dist": {
173 "type": "zip",
174 "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/0cac554ce06277e33ddf9f0b7ade4b8bbf2af3fa",
175 "reference": "0cac554ce06277e33ddf9f0b7ade4b8bbf2af3fa",
176 "shasum": ""
177 },
178 "require": {
179 "php": ">=5.3.2"
180 },
181 "require-dev": {
182 "phpunit/phpunit": "~4.0"
183 },
184 "time": "2015-05-30T15:59:26+00:00",
185 "type": "library",
186 "installation-source": "dist",
187 "autoload": {
188 "psr-0": {
189 "Dotenv": "src/"
190 }
191 },
192 "notification-url": "https://packagist.org/downloads/",
193 "license": [
194 "BSD"
195 ],
196 "authors": [
197 {
198 "name": "Vance Lucas",
199 "email": "vance@vancelucas.com",
200 "homepage": "http://www.vancelucas.com"
201 }
202 ],
203 "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.",
204 "homepage": "http://github.com/vlucas/phpdotenv",
205 "keywords": [
206 "dotenv",
207 "env",
208 "environment"
209 ],
210 "support": {
211 "issues": "https://github.com/vlucas/phpdotenv/issues",
212 "source": "https://github.com/vlucas/phpdotenv/tree/1.1"
213 },
214 "install-path": "../vlucas/phpdotenv"
215 }
216 ],
217 "dev": true,
218 "dev-package-names": []
219 }
1 <?php return array(
2 'root' => array(
3 'name' => '__root__',
4 'pretty_version' => '1.0.0+no-version-set',
5 'version' => '1.0.0.0',
6 'reference' => NULL,
7 'type' => 'library',
8 'install_path' => __DIR__ . '/../../',
9 'aliases' => array(),
10 'dev' => true,
11 ),
12 'versions' => array(
13 '__root__' => array(
14 'pretty_version' => '1.0.0+no-version-set',
15 'version' => '1.0.0.0',
16 'reference' => NULL,
17 'type' => 'library',
18 'install_path' => __DIR__ . '/../../',
19 'aliases' => array(),
20 'dev_requirement' => false,
21 ),
22 'symfony/polyfill-mbstring' => array(
23 'pretty_version' => 'v1.27.0',
24 'version' => '1.27.0.0',
25 'reference' => '8ad114f6b39e2c98a8b0e3bd907732c207c2b534',
26 'type' => 'library',
27 'install_path' => __DIR__ . '/../symfony/polyfill-mbstring',
28 'aliases' => array(),
29 'dev_requirement' => false,
30 ),
31 'symfony/var-dumper' => array(
32 'pretty_version' => 'v2.8.52',
33 'version' => '2.8.52.0',
34 'reference' => '91abb1e39d14fb7773d25de9c711949ea8502ac1',
35 'type' => 'library',
36 'install_path' => __DIR__ . '/../symfony/var-dumper',
37 'aliases' => array(),
38 'dev_requirement' => false,
39 ),
40 'vlucas/phpdotenv' => array(
41 'pretty_version' => 'v1.1.1',
42 'version' => '1.1.1.0',
43 'reference' => '0cac554ce06277e33ddf9f0b7ade4b8bbf2af3fa',
44 'type' => 'library',
45 'install_path' => __DIR__ . '/../vlucas/phpdotenv',
46 'aliases' => array(),
47 'dev_requirement' => false,
48 ),
49 ),
50 );
1 <?php
2
3 // platform_check.php @generated by Composer
4
5 $issues = array();
6
7 if (!(PHP_VERSION_ID >= 70100)) {
8 $issues[] = 'Your Composer dependencies require a PHP version ">= 7.1.0". You are running ' . PHP_VERSION . '.';
9 }
10
11 if ($issues) {
12 if (!headers_sent()) {
13 header('HTTP/1.1 500 Internal Server Error');
14 }
15 if (!ini_get('display_errors')) {
16 if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') {
17 fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL);
18 } elseif (!headers_sent()) {
19 echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL;
20 }
21 }
22 trigger_error(
23 'Composer detected issues in your platform: ' . implode(' ', $issues),
24 E_USER_ERROR
25 );
26 }
1 Copyright (c) 2015-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.
1 Symfony Polyfill / Mbstring
2 ===========================
3
4 This component provides a partial, native PHP implementation for the
5 [Mbstring](https://php.net/mbstring) extension.
6
7 More information can be found in the
8 [main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md).
9
10 License
11 =======
12
13 This library is released under the [MIT license](LICENSE).
1 <?php
2
3 // from Case_Ignorable in https://unicode.org/Public/UNIDATA/DerivedCoreProperties.txt
4
5 return '/(?<![\x{0027}\x{002E}\x{003A}\x{005E}\x{0060}\x{00A8}\x{00AD}\x{00AF}\x{00B4}\x{00B7}\x{00B8}\x{02B0}-\x{02C1}\x{02C2}-\x{02C5}\x{02C6}-\x{02D1}\x{02D2}-\x{02DF}\x{02E0}-\x{02E4}\x{02E5}-\x{02EB}\x{02EC}\x{02ED}\x{02EE}\x{02EF}-\x{02FF}\x{0300}-\x{036F}\x{0374}\x{0375}\x{037A}\x{0384}-\x{0385}\x{0387}\x{0483}-\x{0487}\x{0488}-\x{0489}\x{0559}\x{0591}-\x{05BD}\x{05BF}\x{05C1}-\x{05C2}\x{05C4}-\x{05C5}\x{05C7}\x{05F4}\x{0600}-\x{0605}\x{0610}-\x{061A}\x{061C}\x{0640}\x{064B}-\x{065F}\x{0670}\x{06D6}-\x{06DC}\x{06DD}\x{06DF}-\x{06E4}\x{06E5}-\x{06E6}\x{06E7}-\x{06E8}\x{06EA}-\x{06ED}\x{070F}\x{0711}\x{0730}-\x{074A}\x{07A6}-\x{07B0}\x{07EB}-\x{07F3}\x{07F4}-\x{07F5}\x{07FA}\x{07FD}\x{0816}-\x{0819}\x{081A}\x{081B}-\x{0823}\x{0824}\x{0825}-\x{0827}\x{0828}\x{0829}-\x{082D}\x{0859}-\x{085B}\x{08D3}-\x{08E1}\x{08E2}\x{08E3}-\x{0902}\x{093A}\x{093C}\x{0941}-\x{0948}\x{094D}\x{0951}-\x{0957}\x{0962}-\x{0963}\x{0971}\x{0981}\x{09BC}\x{09C1}-\x{09C4}\x{09CD}\x{09E2}-\x{09E3}\x{09FE}\x{0A01}-\x{0A02}\x{0A3C}\x{0A41}-\x{0A42}\x{0A47}-\x{0A48}\x{0A4B}-\x{0A4D}\x{0A51}\x{0A70}-\x{0A71}\x{0A75}\x{0A81}-\x{0A82}\x{0ABC}\x{0AC1}-\x{0AC5}\x{0AC7}-\x{0AC8}\x{0ACD}\x{0AE2}-\x{0AE3}\x{0AFA}-\x{0AFF}\x{0B01}\x{0B3C}\x{0B3F}\x{0B41}-\x{0B44}\x{0B4D}\x{0B56}\x{0B62}-\x{0B63}\x{0B82}\x{0BC0}\x{0BCD}\x{0C00}\x{0C04}\x{0C3E}-\x{0C40}\x{0C46}-\x{0C48}\x{0C4A}-\x{0C4D}\x{0C55}-\x{0C56}\x{0C62}-\x{0C63}\x{0C81}\x{0CBC}\x{0CBF}\x{0CC6}\x{0CCC}-\x{0CCD}\x{0CE2}-\x{0CE3}\x{0D00}-\x{0D01}\x{0D3B}-\x{0D3C}\x{0D41}-\x{0D44}\x{0D4D}\x{0D62}-\x{0D63}\x{0DCA}\x{0DD2}-\x{0DD4}\x{0DD6}\x{0E31}\x{0E34}-\x{0E3A}\x{0E46}\x{0E47}-\x{0E4E}\x{0EB1}\x{0EB4}-\x{0EB9}\x{0EBB}-\x{0EBC}\x{0EC6}\x{0EC8}-\x{0ECD}\x{0F18}-\x{0F19}\x{0F35}\x{0F37}\x{0F39}\x{0F71}-\x{0F7E}\x{0F80}-\x{0F84}\x{0F86}-\x{0F87}\x{0F8D}-\x{0F97}\x{0F99}-\x{0FBC}\x{0FC6}\x{102D}-\x{1030}\x{1032}-\x{1037}\x{1039}-\x{103A}\x{103D}-\x{103E}\x{1058}-\x{1059}\x{105E}-\x{1060}\x{1071}-\x{1074}\x{1082}\x{1085}-\x{1086}\x{108D}\x{109D}\x{10FC}\x{135D}-\x{135F}\x{1712}-\x{1714}\x{1732}-\x{1734}\x{1752}-\x{1753}\x{1772}-\x{1773}\x{17B4}-\x{17B5}\x{17B7}-\x{17BD}\x{17C6}\x{17C9}-\x{17D3}\x{17D7}\x{17DD}\x{180B}-\x{180D}\x{180E}\x{1843}\x{1885}-\x{1886}\x{18A9}\x{1920}-\x{1922}\x{1927}-\x{1928}\x{1932}\x{1939}-\x{193B}\x{1A17}-\x{1A18}\x{1A1B}\x{1A56}\x{1A58}-\x{1A5E}\x{1A60}\x{1A62}\x{1A65}-\x{1A6C}\x{1A73}-\x{1A7C}\x{1A7F}\x{1AA7}\x{1AB0}-\x{1ABD}\x{1ABE}\x{1B00}-\x{1B03}\x{1B34}\x{1B36}-\x{1B3A}\x{1B3C}\x{1B42}\x{1B6B}-\x{1B73}\x{1B80}-\x{1B81}\x{1BA2}-\x{1BA5}\x{1BA8}-\x{1BA9}\x{1BAB}-\x{1BAD}\x{1BE6}\x{1BE8}-\x{1BE9}\x{1BED}\x{1BEF}-\x{1BF1}\x{1C2C}-\x{1C33}\x{1C36}-\x{1C37}\x{1C78}-\x{1C7D}\x{1CD0}-\x{1CD2}\x{1CD4}-\x{1CE0}\x{1CE2}-\x{1CE8}\x{1CED}\x{1CF4}\x{1CF8}-\x{1CF9}\x{1D2C}-\x{1D6A}\x{1D78}\x{1D9B}-\x{1DBF}\x{1DC0}-\x{1DF9}\x{1DFB}-\x{1DFF}\x{1FBD}\x{1FBF}-\x{1FC1}\x{1FCD}-\x{1FCF}\x{1FDD}-\x{1FDF}\x{1FED}-\x{1FEF}\x{1FFD}-\x{1FFE}\x{200B}-\x{200F}\x{2018}\x{2019}\x{2024}\x{2027}\x{202A}-\x{202E}\x{2060}-\x{2064}\x{2066}-\x{206F}\x{2071}\x{207F}\x{2090}-\x{209C}\x{20D0}-\x{20DC}\x{20DD}-\x{20E0}\x{20E1}\x{20E2}-\x{20E4}\x{20E5}-\x{20F0}\x{2C7C}-\x{2C7D}\x{2CEF}-\x{2CF1}\x{2D6F}\x{2D7F}\x{2DE0}-\x{2DFF}\x{2E2F}\x{3005}\x{302A}-\x{302D}\x{3031}-\x{3035}\x{303B}\x{3099}-\x{309A}\x{309B}-\x{309C}\x{309D}-\x{309E}\x{30FC}-\x{30FE}\x{A015}\x{A4F8}-\x{A4FD}\x{A60C}\x{A66F}\x{A670}-\x{A672}\x{A674}-\x{A67D}\x{A67F}\x{A69C}-\x{A69D}\x{A69E}-\x{A69F}\x{A6F0}-\x{A6F1}\x{A700}-\x{A716}\x{A717}-\x{A71F}\x{A720}-\x{A721}\x{A770}\x{A788}\x{A789}-\x{A78A}\x{A7F8}-\x{A7F9}\x{A802}\x{A806}\x{A80B}\x{A825}-\x{A826}\x{A8C4}-\x{A8C5}\x{A8E0}-\x{A8F1}\x{A8FF}\x{A926}-\x{A92D}\x{A947}-\x{A951}\x{A980}-\x{A982}\x{A9B3}\x{A9B6}-\x{A9B9}\x{A9BC}\x{A9CF}\x{A9E5}\x{A9E6}\x{AA29}-\x{AA2E}\x{AA31}-\x{AA32}\x{AA35}-\x{AA36}\x{AA43}\x{AA4C}\x{AA70}\x{AA7C}\x{AAB0}\x{AAB2}-\x{AAB4}\x{AAB7}-\x{AAB8}\x{AABE}-\x{AABF}\x{AAC1}\x{AADD}\x{AAEC}-\x{AAED}\x{AAF3}-\x{AAF4}\x{AAF6}\x{AB5B}\x{AB5C}-\x{AB5F}\x{ABE5}\x{ABE8}\x{ABED}\x{FB1E}\x{FBB2}-\x{FBC1}\x{FE00}-\x{FE0F}\x{FE13}\x{FE20}-\x{FE2F}\x{FE52}\x{FE55}\x{FEFF}\x{FF07}\x{FF0E}\x{FF1A}\x{FF3E}\x{FF40}\x{FF70}\x{FF9E}-\x{FF9F}\x{FFE3}\x{FFF9}-\x{FFFB}\x{101FD}\x{102E0}\x{10376}-\x{1037A}\x{10A01}-\x{10A03}\x{10A05}-\x{10A06}\x{10A0C}-\x{10A0F}\x{10A38}-\x{10A3A}\x{10A3F}\x{10AE5}-\x{10AE6}\x{10D24}-\x{10D27}\x{10F46}-\x{10F50}\x{11001}\x{11038}-\x{11046}\x{1107F}-\x{11081}\x{110B3}-\x{110B6}\x{110B9}-\x{110BA}\x{110BD}\x{110CD}\x{11100}-\x{11102}\x{11127}-\x{1112B}\x{1112D}-\x{11134}\x{11173}\x{11180}-\x{11181}\x{111B6}-\x{111BE}\x{111C9}-\x{111CC}\x{1122F}-\x{11231}\x{11234}\x{11236}-\x{11237}\x{1123E}\x{112DF}\x{112E3}-\x{112EA}\x{11300}-\x{11301}\x{1133B}-\x{1133C}\x{11340}\x{11366}-\x{1136C}\x{11370}-\x{11374}\x{11438}-\x{1143F}\x{11442}-\x{11444}\x{11446}\x{1145E}\x{114B3}-\x{114B8}\x{114BA}\x{114BF}-\x{114C0}\x{114C2}-\x{114C3}\x{115B2}-\x{115B5}\x{115BC}-\x{115BD}\x{115BF}-\x{115C0}\x{115DC}-\x{115DD}\x{11633}-\x{1163A}\x{1163D}\x{1163F}-\x{11640}\x{116AB}\x{116AD}\x{116B0}-\x{116B5}\x{116B7}\x{1171D}-\x{1171F}\x{11722}-\x{11725}\x{11727}-\x{1172B}\x{1182F}-\x{11837}\x{11839}-\x{1183A}\x{11A01}-\x{11A0A}\x{11A33}-\x{11A38}\x{11A3B}-\x{11A3E}\x{11A47}\x{11A51}-\x{11A56}\x{11A59}-\x{11A5B}\x{11A8A}-\x{11A96}\x{11A98}-\x{11A99}\x{11C30}-\x{11C36}\x{11C38}-\x{11C3D}\x{11C3F}\x{11C92}-\x{11CA7}\x{11CAA}-\x{11CB0}\x{11CB2}-\x{11CB3}\x{11CB5}-\x{11CB6}\x{11D31}-\x{11D36}\x{11D3A}\x{11D3C}-\x{11D3D}\x{11D3F}-\x{11D45}\x{11D47}\x{11D90}-\x{11D91}\x{11D95}\x{11D97}\x{11EF3}-\x{11EF4}\x{16AF0}-\x{16AF4}\x{16B30}-\x{16B36}\x{16B40}-\x{16B43}\x{16F8F}-\x{16F92}\x{16F93}-\x{16F9F}\x{16FE0}-\x{16FE1}\x{1BC9D}-\x{1BC9E}\x{1BCA0}-\x{1BCA3}\x{1D167}-\x{1D169}\x{1D173}-\x{1D17A}\x{1D17B}-\x{1D182}\x{1D185}-\x{1D18B}\x{1D1AA}-\x{1D1AD}\x{1D242}-\x{1D244}\x{1DA00}-\x{1DA36}\x{1DA3B}-\x{1DA6C}\x{1DA75}\x{1DA84}\x{1DA9B}-\x{1DA9F}\x{1DAA1}-\x{1DAAF}\x{1E000}-\x{1E006}\x{1E008}-\x{1E018}\x{1E01B}-\x{1E021}\x{1E023}-\x{1E024}\x{1E026}-\x{1E02A}\x{1E8D0}-\x{1E8D6}\x{1E944}-\x{1E94A}\x{1F3FB}-\x{1F3FF}\x{E0001}\x{E0020}-\x{E007F}\x{E0100}-\x{E01EF}])(\pL)(\pL*+)/u';
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\Mbstring as p;
13
14 if (\PHP_VERSION_ID >= 80000) {
15 return require __DIR__.'/bootstrap80.php';
16 }
17
18 if (!function_exists('mb_convert_encoding')) {
19 function mb_convert_encoding($string, $to_encoding, $from_encoding = null) { return p\Mbstring::mb_convert_encoding($string, $to_encoding, $from_encoding); }
20 }
21 if (!function_exists('mb_decode_mimeheader')) {
22 function mb_decode_mimeheader($string) { return p\Mbstring::mb_decode_mimeheader($string); }
23 }
24 if (!function_exists('mb_encode_mimeheader')) {
25 function mb_encode_mimeheader($string, $charset = null, $transfer_encoding = null, $newline = "\r\n", $indent = 0) { return p\Mbstring::mb_encode_mimeheader($string, $charset, $transfer_encoding, $newline, $indent); }
26 }
27 if (!function_exists('mb_decode_numericentity')) {
28 function mb_decode_numericentity($string, $map, $encoding = null) { return p\Mbstring::mb_decode_numericentity($string, $map, $encoding); }
29 }
30 if (!function_exists('mb_encode_numericentity')) {
31 function mb_encode_numericentity($string, $map, $encoding = null, $hex = false) { return p\Mbstring::mb_encode_numericentity($string, $map, $encoding, $hex); }
32 }
33 if (!function_exists('mb_convert_case')) {
34 function mb_convert_case($string, $mode, $encoding = null) { return p\Mbstring::mb_convert_case($string, $mode, $encoding); }
35 }
36 if (!function_exists('mb_internal_encoding')) {
37 function mb_internal_encoding($encoding = null) { return p\Mbstring::mb_internal_encoding($encoding); }
38 }
39 if (!function_exists('mb_language')) {
40 function mb_language($language = null) { return p\Mbstring::mb_language($language); }
41 }
42 if (!function_exists('mb_list_encodings')) {
43 function mb_list_encodings() { return p\Mbstring::mb_list_encodings(); }
44 }
45 if (!function_exists('mb_encoding_aliases')) {
46 function mb_encoding_aliases($encoding) { return p\Mbstring::mb_encoding_aliases($encoding); }
47 }
48 if (!function_exists('mb_check_encoding')) {
49 function mb_check_encoding($value = null, $encoding = null) { return p\Mbstring::mb_check_encoding($value, $encoding); }
50 }
51 if (!function_exists('mb_detect_encoding')) {
52 function mb_detect_encoding($string, $encodings = null, $strict = false) { return p\Mbstring::mb_detect_encoding($string, $encodings, $strict); }
53 }
54 if (!function_exists('mb_detect_order')) {
55 function mb_detect_order($encoding = null) { return p\Mbstring::mb_detect_order($encoding); }
56 }
57 if (!function_exists('mb_parse_str')) {
58 function mb_parse_str($string, &$result = []) { parse_str($string, $result); return (bool) $result; }
59 }
60 if (!function_exists('mb_strlen')) {
61 function mb_strlen($string, $encoding = null) { return p\Mbstring::mb_strlen($string, $encoding); }
62 }
63 if (!function_exists('mb_strpos')) {
64 function mb_strpos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_strpos($haystack, $needle, $offset, $encoding); }
65 }
66 if (!function_exists('mb_strtolower')) {
67 function mb_strtolower($string, $encoding = null) { return p\Mbstring::mb_strtolower($string, $encoding); }
68 }
69 if (!function_exists('mb_strtoupper')) {
70 function mb_strtoupper($string, $encoding = null) { return p\Mbstring::mb_strtoupper($string, $encoding); }
71 }
72 if (!function_exists('mb_substitute_character')) {
73 function mb_substitute_character($substitute_character = null) { return p\Mbstring::mb_substitute_character($substitute_character); }
74 }
75 if (!function_exists('mb_substr')) {
76 function mb_substr($string, $start, $length = 2147483647, $encoding = null) { return p\Mbstring::mb_substr($string, $start, $length, $encoding); }
77 }
78 if (!function_exists('mb_stripos')) {
79 function mb_stripos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_stripos($haystack, $needle, $offset, $encoding); }
80 }
81 if (!function_exists('mb_stristr')) {
82 function mb_stristr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_stristr($haystack, $needle, $before_needle, $encoding); }
83 }
84 if (!function_exists('mb_strrchr')) {
85 function mb_strrchr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_strrchr($haystack, $needle, $before_needle, $encoding); }
86 }
87 if (!function_exists('mb_strrichr')) {
88 function mb_strrichr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_strrichr($haystack, $needle, $before_needle, $encoding); }
89 }
90 if (!function_exists('mb_strripos')) {
91 function mb_strripos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_strripos($haystack, $needle, $offset, $encoding); }
92 }
93 if (!function_exists('mb_strrpos')) {
94 function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_strrpos($haystack, $needle, $offset, $encoding); }
95 }
96 if (!function_exists('mb_strstr')) {
97 function mb_strstr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_strstr($haystack, $needle, $before_needle, $encoding); }
98 }
99 if (!function_exists('mb_get_info')) {
100 function mb_get_info($type = 'all') { return p\Mbstring::mb_get_info($type); }
101 }
102 if (!function_exists('mb_http_output')) {
103 function mb_http_output($encoding = null) { return p\Mbstring::mb_http_output($encoding); }
104 }
105 if (!function_exists('mb_strwidth')) {
106 function mb_strwidth($string, $encoding = null) { return p\Mbstring::mb_strwidth($string, $encoding); }
107 }
108 if (!function_exists('mb_substr_count')) {
109 function mb_substr_count($haystack, $needle, $encoding = null) { return p\Mbstring::mb_substr_count($haystack, $needle, $encoding); }
110 }
111 if (!function_exists('mb_output_handler')) {
112 function mb_output_handler($string, $status) { return p\Mbstring::mb_output_handler($string, $status); }
113 }
114 if (!function_exists('mb_http_input')) {
115 function mb_http_input($type = null) { return p\Mbstring::mb_http_input($type); }
116 }
117
118 if (!function_exists('mb_convert_variables')) {
119 function mb_convert_variables($to_encoding, $from_encoding, &...$vars) { return p\Mbstring::mb_convert_variables($to_encoding, $from_encoding, ...$vars); }
120 }
121
122 if (!function_exists('mb_ord')) {
123 function mb_ord($string, $encoding = null) { return p\Mbstring::mb_ord($string, $encoding); }
124 }
125 if (!function_exists('mb_chr')) {
126 function mb_chr($codepoint, $encoding = null) { return p\Mbstring::mb_chr($codepoint, $encoding); }
127 }
128 if (!function_exists('mb_scrub')) {
129 function mb_scrub($string, $encoding = null) { $encoding = null === $encoding ? mb_internal_encoding() : $encoding; return mb_convert_encoding($string, $encoding, $encoding); }
130 }
131 if (!function_exists('mb_str_split')) {
132 function mb_str_split($string, $length = 1, $encoding = null) { return p\Mbstring::mb_str_split($string, $length, $encoding); }
133 }
134
135 if (extension_loaded('mbstring')) {
136 return;
137 }
138
139 if (!defined('MB_CASE_UPPER')) {
140 define('MB_CASE_UPPER', 0);
141 }
142 if (!defined('MB_CASE_LOWER')) {
143 define('MB_CASE_LOWER', 1);
144 }
145 if (!defined('MB_CASE_TITLE')) {
146 define('MB_CASE_TITLE', 2);
147 }
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\Mbstring as p;
13
14 if (!function_exists('mb_convert_encoding')) {
15 function mb_convert_encoding(array|string|null $string, ?string $to_encoding, array|string|null $from_encoding = null): array|string|false { return p\Mbstring::mb_convert_encoding($string ?? '', (string) $to_encoding, $from_encoding); }
16 }
17 if (!function_exists('mb_decode_mimeheader')) {
18 function mb_decode_mimeheader(?string $string): string { return p\Mbstring::mb_decode_mimeheader((string) $string); }
19 }
20 if (!function_exists('mb_encode_mimeheader')) {
21 function mb_encode_mimeheader(?string $string, ?string $charset = null, ?string $transfer_encoding = null, ?string $newline = "\r\n", ?int $indent = 0): string { return p\Mbstring::mb_encode_mimeheader((string) $string, $charset, $transfer_encoding, (string) $newline, (int) $indent); }
22 }
23 if (!function_exists('mb_decode_numericentity')) {
24 function mb_decode_numericentity(?string $string, array $map, ?string $encoding = null): string { return p\Mbstring::mb_decode_numericentity((string) $string, $map, $encoding); }
25 }
26 if (!function_exists('mb_encode_numericentity')) {
27 function mb_encode_numericentity(?string $string, array $map, ?string $encoding = null, ?bool $hex = false): string { return p\Mbstring::mb_encode_numericentity((string) $string, $map, $encoding, (bool) $hex); }
28 }
29 if (!function_exists('mb_convert_case')) {
30 function mb_convert_case(?string $string, ?int $mode, ?string $encoding = null): string { return p\Mbstring::mb_convert_case((string) $string, (int) $mode, $encoding); }
31 }
32 if (!function_exists('mb_internal_encoding')) {
33 function mb_internal_encoding(?string $encoding = null): string|bool { return p\Mbstring::mb_internal_encoding($encoding); }
34 }
35 if (!function_exists('mb_language')) {
36 function mb_language(?string $language = null): string|bool { return p\Mbstring::mb_language($language); }
37 }
38 if (!function_exists('mb_list_encodings')) {
39 function mb_list_encodings(): array { return p\Mbstring::mb_list_encodings(); }
40 }
41 if (!function_exists('mb_encoding_aliases')) {
42 function mb_encoding_aliases(?string $encoding): array { return p\Mbstring::mb_encoding_aliases((string) $encoding); }
43 }
44 if (!function_exists('mb_check_encoding')) {
45 function mb_check_encoding(array|string|null $value = null, ?string $encoding = null): bool { return p\Mbstring::mb_check_encoding($value, $encoding); }
46 }
47 if (!function_exists('mb_detect_encoding')) {
48 function mb_detect_encoding(?string $string, array|string|null $encodings = null, ?bool $strict = false): string|false { return p\Mbstring::mb_detect_encoding((string) $string, $encodings, (bool) $strict); }
49 }
50 if (!function_exists('mb_detect_order')) {
51 function mb_detect_order(array|string|null $encoding = null): array|bool { return p\Mbstring::mb_detect_order($encoding); }
52 }
53 if (!function_exists('mb_parse_str')) {
54 function mb_parse_str(?string $string, &$result = []): bool { parse_str((string) $string, $result); return (bool) $result; }
55 }
56 if (!function_exists('mb_strlen')) {
57 function mb_strlen(?string $string, ?string $encoding = null): int { return p\Mbstring::mb_strlen((string) $string, $encoding); }
58 }
59 if (!function_exists('mb_strpos')) {
60 function mb_strpos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null): int|false { return p\Mbstring::mb_strpos((string) $haystack, (string) $needle, (int) $offset, $encoding); }
61 }
62 if (!function_exists('mb_strtolower')) {
63 function mb_strtolower(?string $string, ?string $encoding = null): string { return p\Mbstring::mb_strtolower((string) $string, $encoding); }
64 }
65 if (!function_exists('mb_strtoupper')) {
66 function mb_strtoupper(?string $string, ?string $encoding = null): string { return p\Mbstring::mb_strtoupper((string) $string, $encoding); }
67 }
68 if (!function_exists('mb_substitute_character')) {
69 function mb_substitute_character(string|int|null $substitute_character = null): string|int|bool { return p\Mbstring::mb_substitute_character($substitute_character); }
70 }
71 if (!function_exists('mb_substr')) {
72 function mb_substr(?string $string, ?int $start, ?int $length = null, ?string $encoding = null): string { return p\Mbstring::mb_substr((string) $string, (int) $start, $length, $encoding); }
73 }
74 if (!function_exists('mb_stripos')) {
75 function mb_stripos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null): int|false { return p\Mbstring::mb_stripos((string) $haystack, (string) $needle, (int) $offset, $encoding); }
76 }
77 if (!function_exists('mb_stristr')) {
78 function mb_stristr(?string $haystack, ?string $needle, ?bool $before_needle = false, ?string $encoding = null): string|false { return p\Mbstring::mb_stristr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); }
79 }
80 if (!function_exists('mb_strrchr')) {
81 function mb_strrchr(?string $haystack, ?string $needle, ?bool $before_needle = false, ?string $encoding = null): string|false { return p\Mbstring::mb_strrchr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); }
82 }
83 if (!function_exists('mb_strrichr')) {
84 function mb_strrichr(?string $haystack, ?string $needle, ?bool $before_needle = false, ?string $encoding = null): string|false { return p\Mbstring::mb_strrichr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); }
85 }
86 if (!function_exists('mb_strripos')) {
87 function mb_strripos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null): int|false { return p\Mbstring::mb_strripos((string) $haystack, (string) $needle, (int) $offset, $encoding); }
88 }
89 if (!function_exists('mb_strrpos')) {
90 function mb_strrpos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null): int|false { return p\Mbstring::mb_strrpos((string) $haystack, (string) $needle, (int) $offset, $encoding); }
91 }
92 if (!function_exists('mb_strstr')) {
93 function mb_strstr(?string $haystack, ?string $needle, ?bool $before_needle = false, ?string $encoding = null): string|false { return p\Mbstring::mb_strstr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); }
94 }
95 if (!function_exists('mb_get_info')) {
96 function mb_get_info(?string $type = 'all'): array|string|int|false { return p\Mbstring::mb_get_info((string) $type); }
97 }
98 if (!function_exists('mb_http_output')) {
99 function mb_http_output(?string $encoding = null): string|bool { return p\Mbstring::mb_http_output($encoding); }
100 }
101 if (!function_exists('mb_strwidth')) {
102 function mb_strwidth(?string $string, ?string $encoding = null): int { return p\Mbstring::mb_strwidth((string) $string, $encoding); }
103 }
104 if (!function_exists('mb_substr_count')) {
105 function mb_substr_count(?string $haystack, ?string $needle, ?string $encoding = null): int { return p\Mbstring::mb_substr_count((string) $haystack, (string) $needle, $encoding); }
106 }
107 if (!function_exists('mb_output_handler')) {
108 function mb_output_handler(?string $string, ?int $status): string { return p\Mbstring::mb_output_handler((string) $string, (int) $status); }
109 }
110 if (!function_exists('mb_http_input')) {
111 function mb_http_input(?string $type = null): array|string|false { return p\Mbstring::mb_http_input($type); }
112 }
113
114 if (!function_exists('mb_convert_variables')) {
115 function mb_convert_variables(?string $to_encoding, array|string|null $from_encoding, mixed &$var, mixed &...$vars): string|false { return p\Mbstring::mb_convert_variables((string) $to_encoding, $from_encoding ?? '', $var, ...$vars); }
116 }
117
118 if (!function_exists('mb_ord')) {
119 function mb_ord(?string $string, ?string $encoding = null): int|false { return p\Mbstring::mb_ord((string) $string, $encoding); }
120 }
121 if (!function_exists('mb_chr')) {
122 function mb_chr(?int $codepoint, ?string $encoding = null): string|false { return p\Mbstring::mb_chr((int) $codepoint, $encoding); }
123 }
124 if (!function_exists('mb_scrub')) {
125 function mb_scrub(?string $string, ?string $encoding = null): string { $encoding ??= mb_internal_encoding(); return mb_convert_encoding((string) $string, $encoding, $encoding); }
126 }
127 if (!function_exists('mb_str_split')) {
128 function mb_str_split(?string $string, ?int $length = 1, ?string $encoding = null): array { return p\Mbstring::mb_str_split((string) $string, (int) $length, $encoding); }
129 }
130
131 if (extension_loaded('mbstring')) {
132 return;
133 }
134
135 if (!defined('MB_CASE_UPPER')) {
136 define('MB_CASE_UPPER', 0);
137 }
138 if (!defined('MB_CASE_LOWER')) {
139 define('MB_CASE_LOWER', 1);
140 }
141 if (!defined('MB_CASE_TITLE')) {
142 define('MB_CASE_TITLE', 2);
143 }
1 {
2 "name": "symfony/polyfill-mbstring",
3 "type": "library",
4 "description": "Symfony polyfill for the Mbstring extension",
5 "keywords": ["polyfill", "shim", "compatibility", "portable", "mbstring"],
6 "homepage": "https://symfony.com",
7 "license": "MIT",
8 "authors": [
9 {
10 "name": "Nicolas Grekas",
11 "email": "p@tchwork.com"
12 },
13 {
14 "name": "Symfony Community",
15 "homepage": "https://symfony.com/contributors"
16 }
17 ],
18 "require": {
19 "php": ">=7.1"
20 },
21 "provide": {
22 "ext-mbstring": "*"
23 },
24 "autoload": {
25 "psr-4": { "Symfony\\Polyfill\\Mbstring\\": "" },
26 "files": [ "bootstrap.php" ]
27 },
28 "suggest": {
29 "ext-mbstring": "For best performance"
30 },
31 "minimum-stability": "dev",
32 "extra": {
33 "branch-alias": {
34 "dev-main": "1.27-dev"
35 },
36 "thanks": {
37 "name": "symfony/polyfill",
38 "url": "https://github.com/symfony/polyfill"
39 }
40 }
41 }
1 composer.lock
2 phpunit.xml
3 vendor/
1 CHANGELOG
2 =========
3
4 2.7.0
5 -----
6
7 * deprecated Cloner\Data::getLimitedClone(). Use withMaxDepth, withMaxItemsPerDepth or withRefHandles instead.
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\Component\VarDumper\Caster;
13
14 use Symfony\Component\VarDumper\Cloner\Stub;
15
16 /**
17 * Casts Amqp related classes to array representation.
18 *
19 * @author Grégoire Pineau <lyrixx@lyrixx.info>
20 */
21 class AmqpCaster
22 {
23 private static $flags = array(
24 AMQP_DURABLE => 'AMQP_DURABLE',
25 AMQP_PASSIVE => 'AMQP_PASSIVE',
26 AMQP_EXCLUSIVE => 'AMQP_EXCLUSIVE',
27 AMQP_AUTODELETE => 'AMQP_AUTODELETE',
28 AMQP_INTERNAL => 'AMQP_INTERNAL',
29 AMQP_NOLOCAL => 'AMQP_NOLOCAL',
30 AMQP_AUTOACK => 'AMQP_AUTOACK',
31 AMQP_IFEMPTY => 'AMQP_IFEMPTY',
32 AMQP_IFUNUSED => 'AMQP_IFUNUSED',
33 AMQP_MANDATORY => 'AMQP_MANDATORY',
34 AMQP_IMMEDIATE => 'AMQP_IMMEDIATE',
35 AMQP_MULTIPLE => 'AMQP_MULTIPLE',
36 AMQP_NOWAIT => 'AMQP_NOWAIT',
37 AMQP_REQUEUE => 'AMQP_REQUEUE',
38 );
39
40 private static $exchangeTypes = array(
41 AMQP_EX_TYPE_DIRECT => 'AMQP_EX_TYPE_DIRECT',
42 AMQP_EX_TYPE_FANOUT => 'AMQP_EX_TYPE_FANOUT',
43 AMQP_EX_TYPE_TOPIC => 'AMQP_EX_TYPE_TOPIC',
44 AMQP_EX_TYPE_HEADERS => 'AMQP_EX_TYPE_HEADERS',
45 );
46
47 public static function castConnection(\AMQPConnection $c, array $a, Stub $stub, $isNested)
48 {
49 $prefix = Caster::PREFIX_VIRTUAL;
50
51 $a += array(
52 $prefix.'is_connected' => $c->isConnected(),
53 );
54
55 // Recent version of the extension already expose private properties
56 if (isset($a["\x00AMQPConnection\x00login"])) {
57 return $a;
58 }
59
60 // BC layer in the amqp lib
61 if (method_exists($c, 'getReadTimeout')) {
62 $timeout = $c->getReadTimeout();
63 } else {
64 $timeout = $c->getTimeout();
65 }
66
67 $a += array(
68 $prefix.'is_connected' => $c->isConnected(),
69 $prefix.'login' => $c->getLogin(),
70 $prefix.'password' => $c->getPassword(),
71 $prefix.'host' => $c->getHost(),
72 $prefix.'vhost' => $c->getVhost(),
73 $prefix.'port' => $c->getPort(),
74 $prefix.'read_timeout' => $timeout,
75 );
76
77 return $a;
78 }
79
80 public static function castChannel(\AMQPChannel $c, array $a, Stub $stub, $isNested)
81 {
82 $prefix = Caster::PREFIX_VIRTUAL;
83
84 $a += array(
85 $prefix.'is_connected' => $c->isConnected(),
86 $prefix.'channel_id' => $c->getChannelId(),
87 );
88
89 // Recent version of the extension already expose private properties
90 if (isset($a["\x00AMQPChannel\x00connection"])) {
91 return $a;
92 }
93
94 $a += array(
95 $prefix.'connection' => $c->getConnection(),
96 $prefix.'prefetch_size' => $c->getPrefetchSize(),
97 $prefix.'prefetch_count' => $c->getPrefetchCount(),
98 );
99
100 return $a;
101 }
102
103 public static function castQueue(\AMQPQueue $c, array $a, Stub $stub, $isNested)
104 {
105 $prefix = Caster::PREFIX_VIRTUAL;
106
107 $a += array(
108 $prefix.'flags' => self::extractFlags($c->getFlags()),
109 );
110
111 // Recent version of the extension already expose private properties
112 if (isset($a["\x00AMQPQueue\x00name"])) {
113 return $a;
114 }
115
116 $a += array(
117 $prefix.'connection' => $c->getConnection(),
118 $prefix.'channel' => $c->getChannel(),
119 $prefix.'name' => $c->getName(),
120 $prefix.'arguments' => $c->getArguments(),
121 );
122
123 return $a;
124 }
125
126 public static function castExchange(\AMQPExchange $c, array $a, Stub $stub, $isNested)
127 {
128 $prefix = Caster::PREFIX_VIRTUAL;
129
130 $a += array(
131 $prefix.'flags' => self::extractFlags($c->getFlags()),
132 );
133
134 $type = isset(self::$exchangeTypes[$c->getType()]) ? new ConstStub(self::$exchangeTypes[$c->getType()], $c->getType()) : $c->getType();
135
136 // Recent version of the extension already expose private properties
137 if (isset($a["\x00AMQPExchange\x00name"])) {
138 $a["\x00AMQPExchange\x00type"] = $type;
139
140 return $a;
141 }
142
143 $a += array(
144 $prefix.'connection' => $c->getConnection(),
145 $prefix.'channel' => $c->getChannel(),
146 $prefix.'name' => $c->getName(),
147 $prefix.'type' => $type,
148 $prefix.'arguments' => $c->getArguments(),
149 );
150
151 return $a;
152 }
153
154 public static function castEnvelope(\AMQPEnvelope $c, array $a, Stub $stub, $isNested, $filter = 0)
155 {
156 $prefix = Caster::PREFIX_VIRTUAL;
157
158 $deliveryMode = new ConstStub($c->getDeliveryMode().(2 === $c->getDeliveryMode() ? ' (persistent)' : ' (non-persistent)'), $c->getDeliveryMode());
159
160 // Recent version of the extension already expose private properties
161 if (isset($a["\x00AMQPEnvelope\x00body"])) {
162 $a["\0AMQPEnvelope\0delivery_mode"] = $deliveryMode;
163
164 return $a;
165 }
166
167 if (!($filter & Caster::EXCLUDE_VERBOSE)) {
168 $a += array($prefix.'body' => $c->getBody());
169 }
170
171 $a += array(
172 $prefix.'delivery_tag' => $c->getDeliveryTag(),
173 $prefix.'is_redelivery' => $c->isRedelivery(),
174 $prefix.'exchange_name' => $c->getExchangeName(),
175 $prefix.'routing_key' => $c->getRoutingKey(),
176 $prefix.'content_type' => $c->getContentType(),
177 $prefix.'content_encoding' => $c->getContentEncoding(),
178 $prefix.'headers' => $c->getHeaders(),
179 $prefix.'delivery_mode' => $deliveryMode,
180 $prefix.'priority' => $c->getPriority(),
181 $prefix.'correlation_id' => $c->getCorrelationId(),
182 $prefix.'reply_to' => $c->getReplyTo(),
183 $prefix.'expiration' => $c->getExpiration(),
184 $prefix.'message_id' => $c->getMessageId(),
185 $prefix.'timestamp' => $c->getTimeStamp(),
186 $prefix.'type' => $c->getType(),
187 $prefix.'user_id' => $c->getUserId(),
188 $prefix.'app_id' => $c->getAppId(),
189 );
190
191 return $a;
192 }
193
194 private static function extractFlags($flags)
195 {
196 $flagsArray = array();
197
198 foreach (self::$flags as $value => $name) {
199 if ($flags & $value) {
200 $flagsArray[] = $name;
201 }
202 }
203
204 if (!$flagsArray) {
205 $flagsArray = array('AMQP_NOPARAM');
206 }
207
208 return new ConstStub(implode('|', $flagsArray), $flags);
209 }
210 }
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\Component\VarDumper\Caster;
13
14 /**
15 * Helper for filtering out properties in casters.
16 *
17 * @author Nicolas Grekas <p@tchwork.com>
18 */
19 class Caster
20 {
21 const EXCLUDE_VERBOSE = 1;
22 const EXCLUDE_VIRTUAL = 2;
23 const EXCLUDE_DYNAMIC = 4;
24 const EXCLUDE_PUBLIC = 8;
25 const EXCLUDE_PROTECTED = 16;
26 const EXCLUDE_PRIVATE = 32;
27 const EXCLUDE_NULL = 64;
28 const EXCLUDE_EMPTY = 128;
29 const EXCLUDE_NOT_IMPORTANT = 256;
30 const EXCLUDE_STRICT = 512;
31
32 const PREFIX_VIRTUAL = "\0~\0";
33 const PREFIX_DYNAMIC = "\0+\0";
34 const PREFIX_PROTECTED = "\0*\0";
35
36 /**
37 * Casts objects to arrays and adds the dynamic property prefix.
38 *
39 * @param object $obj The object to cast
40 * @param \ReflectionClass $reflector The class reflector to use for inspecting the object definition
41 *
42 * @return array The array-cast of the object, with prefixed dynamic properties
43 */
44 public static function castObject($obj, \ReflectionClass $reflector)
45 {
46 if ($reflector->hasMethod('__debugInfo')) {
47 $a = $obj->__debugInfo();
48 } elseif ($obj instanceof \Closure) {
49 $a = array();
50 } else {
51 $a = (array) $obj;
52 }
53
54 if ($a) {
55 $p = array_keys($a);
56 foreach ($p as $i => $k) {
57 if (isset($k[0]) ? "\0" !== $k[0] && !$reflector->hasProperty($k) : \PHP_VERSION_ID >= 70200) {
58 $p[$i] = self::PREFIX_DYNAMIC.$k;
59 } elseif (isset($k[16]) && "\0" === $k[16] && 0 === strpos($k, "\0class@anonymous\0")) {
60 $p[$i] = "\0".$reflector->getParentClass().'@anonymous'.strrchr($k, "\0");
61 }
62 }
63 $a = array_combine($p, $a);
64 }
65
66 return $a;
67 }
68
69 /**
70 * Filters out the specified properties.
71 *
72 * By default, a single match in the $filter bit field filters properties out, following an "or" logic.
73 * When EXCLUDE_STRICT is set, an "and" logic is applied: all bits must match for a property to be removed.
74 *
75 * @param array $a The array containing the properties to filter
76 * @param int $filter A bit field of Caster::EXCLUDE_* constants specifying which properties to filter out
77 * @param string[] $listedProperties List of properties to exclude when Caster::EXCLUDE_VERBOSE is set, and to preserve when Caster::EXCLUDE_NOT_IMPORTANT is set
78 *
79 * @return array The filtered array
80 */
81 public static function filter(array $a, $filter, array $listedProperties = array())
82 {
83 foreach ($a as $k => $v) {
84 $type = self::EXCLUDE_STRICT & $filter;
85
86 if (null === $v) {
87 $type |= self::EXCLUDE_NULL & $filter;
88 }
89 if (empty($v)) {
90 $type |= self::EXCLUDE_EMPTY & $filter;
91 }
92 if ((self::EXCLUDE_NOT_IMPORTANT & $filter) && !\in_array($k, $listedProperties, true)) {
93 $type |= self::EXCLUDE_NOT_IMPORTANT;
94 }
95 if ((self::EXCLUDE_VERBOSE & $filter) && \in_array($k, $listedProperties, true)) {
96 $type |= self::EXCLUDE_VERBOSE;
97 }
98
99 if (!isset($k[1]) || "\0" !== $k[0]) {
100 $type |= self::EXCLUDE_PUBLIC & $filter;
101 } elseif ('~' === $k[1]) {
102 $type |= self::EXCLUDE_VIRTUAL & $filter;
103 } elseif ('+' === $k[1]) {
104 $type |= self::EXCLUDE_DYNAMIC & $filter;
105 } elseif ('*' === $k[1]) {
106 $type |= self::EXCLUDE_PROTECTED & $filter;
107 } else {
108 $type |= self::EXCLUDE_PRIVATE & $filter;
109 }
110
111 if ((self::EXCLUDE_STRICT & $filter) ? $type === $filter : $type) {
112 unset($a[$k]);
113 }
114 }
115
116 return $a;
117 }
118 }
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\Component\VarDumper\Caster;
13
14 use Symfony\Component\VarDumper\Cloner\Stub;
15
16 /**
17 * Represents a PHP constant and its value.
18 *
19 * @author Nicolas Grekas <p@tchwork.com>
20 */
21 class ConstStub extends Stub
22 {
23 public function __construct($name, $value)
24 {
25 $this->class = $name;
26 $this->value = $value;
27 }
28 }
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\Component\VarDumper\Caster;
13
14 /**
15 * Represents a cut array.
16 *
17 * @author Nicolas Grekas <p@tchwork.com>
18 */
19 class CutArrayStub extends CutStub
20 {
21 public $preservedSubset;
22
23 public function __construct(array $value, array $preservedKeys)
24 {
25 parent::__construct($value);
26
27 $this->preservedSubset = array_intersect_key($value, array_flip($preservedKeys));
28 $this->cut -= \count($this->preservedSubset);
29 }
30 }
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\Component\VarDumper\Caster;
13
14 use Symfony\Component\VarDumper\Cloner\Stub;
15
16 /**
17 * Represents the main properties of a PHP variable, pre-casted by a caster.
18 *
19 * @author Nicolas Grekas <p@tchwork.com>
20 */
21 class CutStub extends Stub
22 {
23 public function __construct($value)
24 {
25 $this->value = $value;
26
27 switch (\gettype($value)) {
28 case 'object':
29 $this->type = self::TYPE_OBJECT;
30 $this->class = \get_class($value);
31 $this->cut = -1;
32 break;
33
34 case 'array':
35 $this->type = self::TYPE_ARRAY;
36 $this->class = self::ARRAY_ASSOC;
37 $this->cut = $this->value = \count($value);
38 break;
39
40 case 'resource':
41 case 'unknown type':
42 case 'resource (closed)':
43 $this->type = self::TYPE_RESOURCE;
44 $this->handle = (int) $value;
45 if ('Unknown' === $this->class = @get_resource_type($value)) {
46 $this->class = 'Closed';
47 }
48 $this->cut = -1;
49 break;
50
51 case 'string':
52 $this->type = self::TYPE_STRING;
53 $this->class = preg_match('//u', $value) ? self::STRING_UTF8 : self::STRING_BINARY;
54 $this->cut = self::STRING_BINARY === $this->class ? \strlen($value) : mb_strlen($value, 'UTF-8');
55 $this->value = '';
56 break;
57 }
58 }
59 }
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\Component\VarDumper\Caster;
13
14 use Symfony\Component\VarDumper\Cloner\Stub;
15
16 /**
17 * Casts DOM related classes to array representation.
18 *
19 * @author Nicolas Grekas <p@tchwork.com>
20 */
21 class DOMCaster
22 {
23 private static $errorCodes = array(
24 DOM_PHP_ERR => 'DOM_PHP_ERR',
25 DOM_INDEX_SIZE_ERR => 'DOM_INDEX_SIZE_ERR',
26 DOMSTRING_SIZE_ERR => 'DOMSTRING_SIZE_ERR',
27 DOM_HIERARCHY_REQUEST_ERR => 'DOM_HIERARCHY_REQUEST_ERR',
28 DOM_WRONG_DOCUMENT_ERR => 'DOM_WRONG_DOCUMENT_ERR',
29 DOM_INVALID_CHARACTER_ERR => 'DOM_INVALID_CHARACTER_ERR',
30 DOM_NO_DATA_ALLOWED_ERR => 'DOM_NO_DATA_ALLOWED_ERR',
31 DOM_NO_MODIFICATION_ALLOWED_ERR => 'DOM_NO_MODIFICATION_ALLOWED_ERR',
32 DOM_NOT_FOUND_ERR => 'DOM_NOT_FOUND_ERR',
33 DOM_NOT_SUPPORTED_ERR => 'DOM_NOT_SUPPORTED_ERR',
34 DOM_INUSE_ATTRIBUTE_ERR => 'DOM_INUSE_ATTRIBUTE_ERR',
35 DOM_INVALID_STATE_ERR => 'DOM_INVALID_STATE_ERR',
36 DOM_SYNTAX_ERR => 'DOM_SYNTAX_ERR',
37 DOM_INVALID_MODIFICATION_ERR => 'DOM_INVALID_MODIFICATION_ERR',
38 DOM_NAMESPACE_ERR => 'DOM_NAMESPACE_ERR',
39 DOM_INVALID_ACCESS_ERR => 'DOM_INVALID_ACCESS_ERR',
40 DOM_VALIDATION_ERR => 'DOM_VALIDATION_ERR',
41 );
42
43 private static $nodeTypes = array(
44 XML_ELEMENT_NODE => 'XML_ELEMENT_NODE',
45 XML_ATTRIBUTE_NODE => 'XML_ATTRIBUTE_NODE',
46 XML_TEXT_NODE => 'XML_TEXT_NODE',
47 XML_CDATA_SECTION_NODE => 'XML_CDATA_SECTION_NODE',
48 XML_ENTITY_REF_NODE => 'XML_ENTITY_REF_NODE',
49 XML_ENTITY_NODE => 'XML_ENTITY_NODE',
50 XML_PI_NODE => 'XML_PI_NODE',
51 XML_COMMENT_NODE => 'XML_COMMENT_NODE',
52 XML_DOCUMENT_NODE => 'XML_DOCUMENT_NODE',
53 XML_DOCUMENT_TYPE_NODE => 'XML_DOCUMENT_TYPE_NODE',
54 XML_DOCUMENT_FRAG_NODE => 'XML_DOCUMENT_FRAG_NODE',
55 XML_NOTATION_NODE => 'XML_NOTATION_NODE',
56 XML_HTML_DOCUMENT_NODE => 'XML_HTML_DOCUMENT_NODE',
57 XML_DTD_NODE => 'XML_DTD_NODE',
58 XML_ELEMENT_DECL_NODE => 'XML_ELEMENT_DECL_NODE',
59 XML_ATTRIBUTE_DECL_NODE => 'XML_ATTRIBUTE_DECL_NODE',
60 XML_ENTITY_DECL_NODE => 'XML_ENTITY_DECL_NODE',
61 XML_NAMESPACE_DECL_NODE => 'XML_NAMESPACE_DECL_NODE',
62 );
63
64 public static function castException(\DOMException $e, array $a, Stub $stub, $isNested)
65 {
66 $k = Caster::PREFIX_PROTECTED.'code';
67 if (isset($a[$k], self::$errorCodes[$a[$k]])) {
68 $a[$k] = new ConstStub(self::$errorCodes[$a[$k]], $a[$k]);
69 }
70
71 return $a;
72 }
73
74 public static function castLength($dom, array $a, Stub $stub, $isNested)
75 {
76 $a += array(
77 'length' => $dom->length,
78 );
79
80 return $a;
81 }
82
83 public static function castImplementation($dom, array $a, Stub $stub, $isNested)
84 {
85 $a += array(
86 Caster::PREFIX_VIRTUAL.'Core' => '1.0',
87 Caster::PREFIX_VIRTUAL.'XML' => '2.0',
88 );
89
90 return $a;
91 }
92
93 public static function castNode(\DOMNode $dom, array $a, Stub $stub, $isNested)
94 {
95 $a += array(
96 'nodeName' => $dom->nodeName,
97 'nodeValue' => new CutStub($dom->nodeValue),
98 'nodeType' => new ConstStub(self::$nodeTypes[$dom->nodeType], $dom->nodeType),
99 'parentNode' => new CutStub($dom->parentNode),
100 'childNodes' => $dom->childNodes,
101 'firstChild' => new CutStub($dom->firstChild),
102 'lastChild' => new CutStub($dom->lastChild),
103 'previousSibling' => new CutStub($dom->previousSibling),
104 'nextSibling' => new CutStub($dom->nextSibling),
105 'attributes' => $dom->attributes,
106 'ownerDocument' => new CutStub($dom->ownerDocument),
107 'namespaceURI' => $dom->namespaceURI,
108 'prefix' => $dom->prefix,
109 'localName' => $dom->localName,
110 'baseURI' => $dom->baseURI,
111 'textContent' => new CutStub($dom->textContent),
112 );
113
114 return $a;
115 }
116
117 public static function castNameSpaceNode(\DOMNameSpaceNode $dom, array $a, Stub $stub, $isNested)
118 {
119 $a += array(
120 'nodeName' => $dom->nodeName,
121 'nodeValue' => new CutStub($dom->nodeValue),
122 'nodeType' => new ConstStub(self::$nodeTypes[$dom->nodeType], $dom->nodeType),
123 'prefix' => $dom->prefix,
124 'localName' => $dom->localName,
125 'namespaceURI' => $dom->namespaceURI,
126 'ownerDocument' => new CutStub($dom->ownerDocument),
127 'parentNode' => new CutStub($dom->parentNode),
128 );
129
130 return $a;
131 }
132
133 public static function castDocument(\DOMDocument $dom, array $a, Stub $stub, $isNested, $filter = 0)
134 {
135 $a += array(
136 'doctype' => $dom->doctype,
137 'implementation' => $dom->implementation,
138 'documentElement' => new CutStub($dom->documentElement),
139 'actualEncoding' => $dom->actualEncoding,
140 'encoding' => $dom->encoding,
141 'xmlEncoding' => $dom->xmlEncoding,
142 'standalone' => $dom->standalone,
143 'xmlStandalone' => $dom->xmlStandalone,
144 'version' => $dom->version,
145 'xmlVersion' => $dom->xmlVersion,
146 'strictErrorChecking' => $dom->strictErrorChecking,
147 'documentURI' => $dom->documentURI,
148 'config' => $dom->config,
149 'formatOutput' => $dom->formatOutput,
150 'validateOnParse' => $dom->validateOnParse,
151 'resolveExternals' => $dom->resolveExternals,
152 'preserveWhiteSpace' => $dom->preserveWhiteSpace,
153 'recover' => $dom->recover,
154 'substituteEntities' => $dom->substituteEntities,
155 );
156
157 if (!($filter & Caster::EXCLUDE_VERBOSE)) {
158 $formatOutput = $dom->formatOutput;
159 $dom->formatOutput = true;
160 $a += array(Caster::PREFIX_VIRTUAL.'xml' => $dom->saveXML());
161 $dom->formatOutput = $formatOutput;
162 }
163
164 return $a;
165 }
166
167 public static function castCharacterData(\DOMCharacterData $dom, array $a, Stub $stub, $isNested)
168 {
169 $a += array(
170 'data' => $dom->data,
171 'length' => $dom->length,
172 );
173
174 return $a;
175 }
176
177 public static function castAttr(\DOMAttr $dom, array $a, Stub $stub, $isNested)
178 {
179 $a += array(
180 'name' => $dom->name,
181 'specified' => $dom->specified,
182 'value' => $dom->value,
183 'ownerElement' => $dom->ownerElement,
184 'schemaTypeInfo' => $dom->schemaTypeInfo,
185 );
186
187 return $a;
188 }
189
190 public static function castElement(\DOMElement $dom, array $a, Stub $stub, $isNested)
191 {
192 $a += array(
193 'tagName' => $dom->tagName,
194 'schemaTypeInfo' => $dom->schemaTypeInfo,
195 );
196
197 return $a;
198 }
199
200 public static function castText(\DOMText $dom, array $a, Stub $stub, $isNested)
201 {
202 $a += array(
203 'wholeText' => $dom->wholeText,
204 );
205
206 return $a;
207 }
208
209 public static function castTypeinfo(\DOMTypeinfo $dom, array $a, Stub $stub, $isNested)
210 {
211 $a += array(
212 'typeName' => $dom->typeName,
213 'typeNamespace' => $dom->typeNamespace,
214 );
215
216 return $a;
217 }
218
219 public static function castDomError(\DOMDomError $dom, array $a, Stub $stub, $isNested)
220 {
221 $a += array(
222 'severity' => $dom->severity,
223 'message' => $dom->message,
224 'type' => $dom->type,
225 'relatedException' => $dom->relatedException,
226 'related_data' => $dom->related_data,
227 'location' => $dom->location,
228 );
229
230 return $a;
231 }
232
233 public static function castLocator(\DOMLocator $dom, array $a, Stub $stub, $isNested)
234 {
235 $a += array(
236 'lineNumber' => $dom->lineNumber,
237 'columnNumber' => $dom->columnNumber,
238 'offset' => $dom->offset,
239 'relatedNode' => $dom->relatedNode,
240 'uri' => $dom->uri,
241 );
242
243 return $a;
244 }
245
246 public static function castDocumentType(\DOMDocumentType $dom, array $a, Stub $stub, $isNested)
247 {
248 $a += array(
249 'name' => $dom->name,
250 'entities' => $dom->entities,
251 'notations' => $dom->notations,
252 'publicId' => $dom->publicId,
253 'systemId' => $dom->systemId,
254 'internalSubset' => $dom->internalSubset,
255 );
256
257 return $a;
258 }
259
260 public static function castNotation(\DOMNotation $dom, array $a, Stub $stub, $isNested)
261 {
262 $a += array(
263 'publicId' => $dom->publicId,
264 'systemId' => $dom->systemId,
265 );
266
267 return $a;
268 }
269
270 public static function castEntity(\DOMEntity $dom, array $a, Stub $stub, $isNested)
271 {
272 $a += array(
273 'publicId' => $dom->publicId,
274 'systemId' => $dom->systemId,
275 'notationName' => $dom->notationName,
276 'actualEncoding' => $dom->actualEncoding,
277 'encoding' => $dom->encoding,
278 'version' => $dom->version,
279 );
280
281 return $a;
282 }
283
284 public static function castProcessingInstruction(\DOMProcessingInstruction $dom, array $a, Stub $stub, $isNested)
285 {
286 $a += array(
287 'target' => $dom->target,
288 'data' => $dom->data,
289 );
290
291 return $a;
292 }
293
294 public static function castXPath(\DOMXPath $dom, array $a, Stub $stub, $isNested)
295 {
296 $a += array(
297 'document' => $dom->document,
298 );
299
300 return $a;
301 }
302 }
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\Component\VarDumper\Caster;
13
14 use Doctrine\Common\Proxy\Proxy as CommonProxy;
15 use Doctrine\ORM\PersistentCollection;
16 use Doctrine\ORM\Proxy\Proxy as OrmProxy;
17 use Symfony\Component\VarDumper\Cloner\Stub;
18
19 /**
20 * Casts Doctrine related classes to array representation.
21 *
22 * @author Nicolas Grekas <p@tchwork.com>
23 */
24 class DoctrineCaster
25 {
26 public static function castCommonProxy(CommonProxy $proxy, array $a, Stub $stub, $isNested)
27 {
28 foreach (array('__cloner__', '__initializer__') as $k) {
29 if (array_key_exists($k, $a)) {
30 unset($a[$k]);
31 ++$stub->cut;
32 }
33 }
34
35 return $a;
36 }
37
38 public static function castOrmProxy(OrmProxy $proxy, array $a, Stub $stub, $isNested)
39 {
40 foreach (array('_entityPersister', '_identifier') as $k) {
41 if (array_key_exists($k = "\0Doctrine\\ORM\\Proxy\\Proxy\0".$k, $a)) {
42 unset($a[$k]);
43 ++$stub->cut;
44 }
45 }
46
47 return $a;
48 }
49
50 public static function castPersistentCollection(PersistentCollection $coll, array $a, Stub $stub, $isNested)
51 {
52 foreach (array('snapshot', 'association', 'typeClass') as $k) {
53 if (array_key_exists($k = "\0Doctrine\\ORM\\PersistentCollection\0".$k, $a)) {
54 $a[$k] = new CutStub($a[$k]);
55 }
56 }
57
58 return $a;
59 }
60 }
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\Component\VarDumper\Caster;
13
14 use Symfony\Component\VarDumper\Cloner\Stub;
15
16 /**
17 * Represents an enumeration of values.
18 *
19 * @author Nicolas Grekas <p@tchwork.com>
20 */
21 class EnumStub extends Stub
22 {
23 public function __construct(array $values)
24 {
25 $this->value = $values;
26 }
27 }
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\Component\VarDumper\Caster;
13
14 /**
15 * Represents a single backtrace frame as returned by debug_backtrace() or Exception->getTrace().
16 *
17 * @author Nicolas Grekas <p@tchwork.com>
18 */
19 class FrameStub extends EnumStub
20 {
21 public $keepArgs;
22 public $inTraceStub;
23
24 public function __construct(array $frame, $keepArgs = true, $inTraceStub = false)
25 {
26 $this->value = $frame;
27 $this->keepArgs = $keepArgs;
28 $this->inTraceStub = $inTraceStub;
29 }
30 }
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\Component\VarDumper\Caster;
13
14 use Symfony\Component\VarDumper\Cloner\Stub;
15
16 /**
17 * Casts classes from the MongoDb extension to array representation.
18 *
19 * @author Nicolas Grekas <p@tchwork.com>
20 */
21 class MongoCaster
22 {
23 public static function castCursor(\MongoCursorInterface $cursor, array $a, Stub $stub, $isNested)
24 {
25 if ($info = $cursor->info()) {
26 foreach ($info as $k => $v) {
27 $a[Caster::PREFIX_VIRTUAL.$k] = $v;
28 }
29 }
30 $a[Caster::PREFIX_VIRTUAL.'dead'] = $cursor->dead();
31
32 return $a;
33 }
34 }
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\Component\VarDumper\Caster;
13
14 use Symfony\Component\VarDumper\Cloner\Stub;
15
16 /**
17 * Casts PDO related classes to array representation.
18 *
19 * @author Nicolas Grekas <p@tchwork.com>
20 */
21 class PdoCaster
22 {
23 private static $pdoAttributes = array(
24 'CASE' => array(
25 \PDO::CASE_LOWER => 'LOWER',
26 \PDO::CASE_NATURAL => 'NATURAL',
27 \PDO::CASE_UPPER => 'UPPER',
28 ),
29 'ERRMODE' => array(
30 \PDO::ERRMODE_SILENT => 'SILENT',
31 \PDO::ERRMODE_WARNING => 'WARNING',
32 \PDO::ERRMODE_EXCEPTION => 'EXCEPTION',
33 ),
34 'TIMEOUT',
35 'PREFETCH',
36 'AUTOCOMMIT',
37 'PERSISTENT',
38 'DRIVER_NAME',
39 'SERVER_INFO',
40 'ORACLE_NULLS' => array(
41 \PDO::NULL_NATURAL => 'NATURAL',
42 \PDO::NULL_EMPTY_STRING => 'EMPTY_STRING',
43 \PDO::NULL_TO_STRING => 'TO_STRING',
44 ),
45 'CLIENT_VERSION',
46 'SERVER_VERSION',
47 'STATEMENT_CLASS',
48 'EMULATE_PREPARES',
49 'CONNECTION_STATUS',
50 'STRINGIFY_FETCHES',
51 'DEFAULT_FETCH_MODE' => array(
52 \PDO::FETCH_ASSOC => 'ASSOC',
53 \PDO::FETCH_BOTH => 'BOTH',
54 \PDO::FETCH_LAZY => 'LAZY',
55 \PDO::FETCH_NUM => 'NUM',
56 \PDO::FETCH_OBJ => 'OBJ',
57 ),
58 );
59
60 public static function castPdo(\PDO $c, array $a, Stub $stub, $isNested)
61 {
62 $attr = array();
63 $errmode = $c->getAttribute(\PDO::ATTR_ERRMODE);
64 $c->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
65
66 foreach (self::$pdoAttributes as $k => $v) {
67 if (!isset($k[0])) {
68 $k = $v;
69 $v = array();
70 }
71
72 try {
73 $attr[$k] = 'ERRMODE' === $k ? $errmode : $c->getAttribute(\constant('PDO::ATTR_'.$k));
74 if ($v && isset($v[$attr[$k]])) {
75 $attr[$k] = new ConstStub($v[$attr[$k]], $attr[$k]);
76 }
77 } catch (\Exception $e) {
78 }
79 }
80
81 $prefix = Caster::PREFIX_VIRTUAL;
82 $a += array(
83 $prefix.'inTransaction' => method_exists($c, 'inTransaction'),
84 $prefix.'errorInfo' => $c->errorInfo(),
85 $prefix.'attributes' => new EnumStub($attr),
86 );
87
88 if ($a[$prefix.'inTransaction']) {
89 $a[$prefix.'inTransaction'] = $c->inTransaction();
90 } else {
91 unset($a[$prefix.'inTransaction']);
92 }
93
94 if (!isset($a[$prefix.'errorInfo'][1], $a[$prefix.'errorInfo'][2])) {
95 unset($a[$prefix.'errorInfo']);
96 }
97
98 $c->setAttribute(\PDO::ATTR_ERRMODE, $errmode);
99
100 return $a;
101 }
102
103 public static function castPdoStatement(\PDOStatement $c, array $a, Stub $stub, $isNested)
104 {
105 $prefix = Caster::PREFIX_VIRTUAL;
106 $a[$prefix.'errorInfo'] = $c->errorInfo();
107
108 if (!isset($a[$prefix.'errorInfo'][1], $a[$prefix.'errorInfo'][2])) {
109 unset($a[$prefix.'errorInfo']);
110 }
111
112 return $a;
113 }
114 }
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\Component\VarDumper\Caster;
13
14 use Symfony\Component\VarDumper\Cloner\Stub;
15
16 /**
17 * Casts pqsql resources to array representation.
18 *
19 * @author Nicolas Grekas <p@tchwork.com>
20 */
21 class PgSqlCaster
22 {
23 private static $paramCodes = array(
24 'server_encoding',
25 'client_encoding',
26 'is_superuser',
27 'session_authorization',
28 'DateStyle',
29 'TimeZone',
30 'IntervalStyle',
31 'integer_datetimes',
32 'application_name',
33 'standard_conforming_strings',
34 );
35
36 private static $transactionStatus = array(
37 PGSQL_TRANSACTION_IDLE => 'PGSQL_TRANSACTION_IDLE',
38 PGSQL_TRANSACTION_ACTIVE => 'PGSQL_TRANSACTION_ACTIVE',
39 PGSQL_TRANSACTION_INTRANS => 'PGSQL_TRANSACTION_INTRANS',
40 PGSQL_TRANSACTION_INERROR => 'PGSQL_TRANSACTION_INERROR',
41 PGSQL_TRANSACTION_UNKNOWN => 'PGSQL_TRANSACTION_UNKNOWN',
42 );
43
44 private static $resultStatus = array(
45 PGSQL_EMPTY_QUERY => 'PGSQL_EMPTY_QUERY',
46 PGSQL_COMMAND_OK => 'PGSQL_COMMAND_OK',
47 PGSQL_TUPLES_OK => 'PGSQL_TUPLES_OK',
48 PGSQL_COPY_OUT => 'PGSQL_COPY_OUT',
49 PGSQL_COPY_IN => 'PGSQL_COPY_IN',
50 PGSQL_BAD_RESPONSE => 'PGSQL_BAD_RESPONSE',
51 PGSQL_NONFATAL_ERROR => 'PGSQL_NONFATAL_ERROR',
52 PGSQL_FATAL_ERROR => 'PGSQL_FATAL_ERROR',
53 );
54
55 private static $diagCodes = array(
56 'severity' => PGSQL_DIAG_SEVERITY,
57 'sqlstate' => PGSQL_DIAG_SQLSTATE,
58 'message' => PGSQL_DIAG_MESSAGE_PRIMARY,
59 'detail' => PGSQL_DIAG_MESSAGE_DETAIL,
60 'hint' => PGSQL_DIAG_MESSAGE_HINT,
61 'statement position' => PGSQL_DIAG_STATEMENT_POSITION,
62 'internal position' => PGSQL_DIAG_INTERNAL_POSITION,
63 'internal query' => PGSQL_DIAG_INTERNAL_QUERY,
64 'context' => PGSQL_DIAG_CONTEXT,
65 'file' => PGSQL_DIAG_SOURCE_FILE,
66 'line' => PGSQL_DIAG_SOURCE_LINE,
67 'function' => PGSQL_DIAG_SOURCE_FUNCTION,
68 );
69
70 public static function castLargeObject($lo, array $a, Stub $stub, $isNested)
71 {
72 $a['seek position'] = pg_lo_tell($lo);
73
74 return $a;
75 }
76
77 public static function castLink($link, array $a, Stub $stub, $isNested)
78 {
79 $a['status'] = pg_connection_status($link);
80 $a['status'] = new ConstStub(PGSQL_CONNECTION_OK === $a['status'] ? 'PGSQL_CONNECTION_OK' : 'PGSQL_CONNECTION_BAD', $a['status']);
81 $a['busy'] = pg_connection_busy($link);
82
83 $a['transaction'] = pg_transaction_status($link);
84 if (isset(self::$transactionStatus[$a['transaction']])) {
85 $a['transaction'] = new ConstStub(self::$transactionStatus[$a['transaction']], $a['transaction']);
86 }
87
88 $a['pid'] = pg_get_pid($link);
89 $a['last error'] = pg_last_error($link);
90 $a['last notice'] = pg_last_notice($link);
91 $a['host'] = pg_host($link);
92 $a['port'] = pg_port($link);
93 $a['dbname'] = pg_dbname($link);
94 $a['options'] = pg_options($link);
95 $a['version'] = pg_version($link);
96
97 foreach (self::$paramCodes as $v) {
98 if (false !== $s = pg_parameter_status($link, $v)) {
99 $a['param'][$v] = $s;
100 }
101 }
102
103 $a['param']['client_encoding'] = pg_client_encoding($link);
104 $a['param'] = new EnumStub($a['param']);
105
106 return $a;
107 }
108
109 public static function castResult($result, array $a, Stub $stub, $isNested)
110 {
111 $a['num rows'] = pg_num_rows($result);
112 $a['status'] = pg_result_status($result);
113 if (isset(self::$resultStatus[$a['status']])) {
114 $a['status'] = new ConstStub(self::$resultStatus[$a['status']], $a['status']);
115 }
116 $a['command-completion tag'] = pg_result_status($result, PGSQL_STATUS_STRING);
117
118 if (-1 === $a['num rows']) {
119 foreach (self::$diagCodes as $k => $v) {
120 $a['error'][$k] = pg_result_error_field($result, $v);
121 }
122 }
123
124 $a['affected rows'] = pg_affected_rows($result);
125 $a['last OID'] = pg_last_oid($result);
126
127 $fields = pg_num_fields($result);
128
129 for ($i = 0; $i < $fields; ++$i) {
130 $field = array(
131 'name' => pg_field_name($result, $i),
132 'table' => sprintf('%s (OID: %s)', pg_field_table($result, $i), pg_field_table($result, $i, true)),
133 'type' => sprintf('%s (OID: %s)', pg_field_type($result, $i), pg_field_type_oid($result, $i)),
134 'nullable' => (bool) pg_field_is_null($result, $i),
135 'storage' => pg_field_size($result, $i).' bytes',
136 'display' => pg_field_prtlen($result, $i).' chars',
137 );
138 if (' (OID: )' === $field['table']) {
139 $field['table'] = null;
140 }
141 if ('-1 bytes' === $field['storage']) {
142 $field['storage'] = 'variable size';
143 } elseif ('1 bytes' === $field['storage']) {
144 $field['storage'] = '1 byte';
145 }
146 if ('1 chars' === $field['display']) {
147 $field['display'] = '1 char';
148 }
149 $a['fields'][] = new EnumStub($field);
150 }
151
152 return $a;
153 }
154 }
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\Component\VarDumper\Caster;
13
14 use Symfony\Component\VarDumper\Cloner\Stub;
15
16 /**
17 * Casts common resource types to array representation.
18 *
19 * @author Nicolas Grekas <p@tchwork.com>
20 */
21 class ResourceCaster
22 {
23 public static function castCurl($h, array $a, Stub $stub, $isNested)
24 {
25 return curl_getinfo($h);
26 }
27
28 public static function castDba($dba, array $a, Stub $stub, $isNested)
29 {
30 $list = dba_list();
31 $a['file'] = $list[(int) $dba];
32
33 return $a;
34 }
35
36 public static function castProcess($process, array $a, Stub $stub, $isNested)
37 {
38 return proc_get_status($process);
39 }
40
41 public static function castStream($stream, array $a, Stub $stub, $isNested)
42 {
43 return stream_get_meta_data($stream) + static::castStreamContext($stream, $a, $stub, $isNested);
44 }
45
46 public static function castStreamContext($stream, array $a, Stub $stub, $isNested)
47 {
48 return @stream_context_get_params($stream) ?: $a;
49 }
50
51 public static function castGd($gd, array $a, Stub $stub, $isNested)
52 {
53 $a['size'] = imagesx($gd).'x'.imagesy($gd);
54 $a['trueColor'] = imageistruecolor($gd);
55
56 return $a;
57 }
58
59 public static function castMysqlLink($h, array $a, Stub $stub, $isNested)
60 {
61 $a['host'] = mysql_get_host_info($h);
62 $a['protocol'] = mysql_get_proto_info($h);
63 $a['server'] = mysql_get_server_info($h);
64
65 return $a;
66 }
67 }
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\Component\VarDumper\Caster;
13
14 use Symfony\Component\VarDumper\Cloner\Stub;
15
16 /**
17 * Casts SPL related classes to array representation.
18 *
19 * @author Nicolas Grekas <p@tchwork.com>
20 */
21 class SplCaster
22 {
23 private static $splFileObjectFlags = array(
24 \SplFileObject::DROP_NEW_LINE => 'DROP_NEW_LINE',
25 \SplFileObject::READ_AHEAD => 'READ_AHEAD',
26 \SplFileObject::SKIP_EMPTY => 'SKIP_EMPTY',
27 \SplFileObject::READ_CSV => 'READ_CSV',
28 );
29
30 public static function castArrayObject(\ArrayObject $c, array $a, Stub $stub, $isNested)
31 {
32 return self::castSplArray($c, $a, $stub, $isNested);
33 }
34
35 public static function castArrayIterator(\ArrayIterator $c, array $a, Stub $stub, $isNested)
36 {
37 return self::castSplArray($c, $a, $stub, $isNested);
38 }
39
40 public static function castHeap(\Iterator $c, array $a, Stub $stub, $isNested)
41 {
42 $a += array(
43 Caster::PREFIX_VIRTUAL.'heap' => iterator_to_array(clone $c),
44 );
45
46 return $a;
47 }
48
49 public static function castDoublyLinkedList(\SplDoublyLinkedList $c, array $a, Stub $stub, $isNested)
50 {
51 $prefix = Caster::PREFIX_VIRTUAL;
52 $mode = $c->getIteratorMode();
53 $c->setIteratorMode(\SplDoublyLinkedList::IT_MODE_KEEP | $mode & ~\SplDoublyLinkedList::IT_MODE_DELETE);
54
55 $a += array(
56 $prefix.'mode' => new ConstStub((($mode & \SplDoublyLinkedList::IT_MODE_LIFO) ? 'IT_MODE_LIFO' : 'IT_MODE_FIFO').' | '.(($mode & \SplDoublyLinkedList::IT_MODE_DELETE) ? 'IT_MODE_DELETE' : 'IT_MODE_KEEP'), $mode),
57 $prefix.'dllist' => iterator_to_array($c),
58 );
59 $c->setIteratorMode($mode);
60
61 return $a;
62 }
63
64 public static function castFileInfo(\SplFileInfo $c, array $a, Stub $stub, $isNested)
65 {
66 static $map = array(
67 'path' => 'getPath',
68 'filename' => 'getFilename',
69 'basename' => 'getBasename',
70 'pathname' => 'getPathname',
71 'extension' => 'getExtension',
72 'realPath' => 'getRealPath',
73 'aTime' => 'getATime',
74 'mTime' => 'getMTime',
75 'cTime' => 'getCTime',
76 'inode' => 'getInode',
77 'size' => 'getSize',
78 'perms' => 'getPerms',
79 'owner' => 'getOwner',
80 'group' => 'getGroup',
81 'type' => 'getType',
82 'writable' => 'isWritable',
83 'readable' => 'isReadable',
84 'executable' => 'isExecutable',
85 'file' => 'isFile',
86 'dir' => 'isDir',
87 'link' => 'isLink',
88 'linkTarget' => 'getLinkTarget',
89 );
90
91 $prefix = Caster::PREFIX_VIRTUAL;
92
93 foreach ($map as $key => $accessor) {
94 try {
95 $a[$prefix.$key] = $c->$accessor();
96 } catch (\Exception $e) {
97 }
98 }
99
100 if (isset($a[$prefix.'perms'])) {
101 $a[$prefix.'perms'] = new ConstStub(sprintf('0%o', $a[$prefix.'perms']), $a[$prefix.'perms']);
102 }
103
104 static $mapDate = array('aTime', 'mTime', 'cTime');
105 foreach ($mapDate as $key) {
106 if (isset($a[$prefix.$key])) {
107 $a[$prefix.$key] = new ConstStub(date('Y-m-d H:i:s', $a[$prefix.$key]), $a[$prefix.$key]);
108 }
109 }
110
111 return $a;
112 }
113
114 public static function castFileObject(\SplFileObject $c, array $a, Stub $stub, $isNested)
115 {
116 static $map = array(
117 'csvControl' => 'getCsvControl',
118 'flags' => 'getFlags',
119 'maxLineLen' => 'getMaxLineLen',
120 'fstat' => 'fstat',
121 'eof' => 'eof',
122 'key' => 'key',
123 );
124
125 $prefix = Caster::PREFIX_VIRTUAL;
126
127 foreach ($map as $key => $accessor) {
128 try {
129 $a[$prefix.$key] = $c->$accessor();
130 } catch (\Exception $e) {
131 }
132 }
133
134 if (isset($a[$prefix.'flags'])) {
135 $flagsArray = array();
136 foreach (self::$splFileObjectFlags as $value => $name) {
137 if ($a[$prefix.'flags'] & $value) {
138 $flagsArray[] = $name;
139 }
140 }
141 $a[$prefix.'flags'] = new ConstStub(implode('|', $flagsArray), $a[$prefix.'flags']);
142 }
143
144 if (isset($a[$prefix.'fstat'])) {
145 $a[$prefix.'fstat'] = new CutArrayStub($a[$prefix.'fstat'], array('dev', 'ino', 'nlink', 'rdev', 'blksize', 'blocks'));
146 }
147
148 return $a;
149 }
150
151 public static function castFixedArray(\SplFixedArray $c, array $a, Stub $stub, $isNested)
152 {
153 $a += array(
154 Caster::PREFIX_VIRTUAL.'storage' => $c->toArray(),
155 );
156
157 return $a;
158 }
159
160 public static function castObjectStorage(\SplObjectStorage $c, array $a, Stub $stub, $isNested)
161 {
162 $storage = array();
163 unset($a[Caster::PREFIX_DYNAMIC."\0gcdata"]); // Don't hit https://bugs.php.net/65967
164
165 $clone = clone $c;
166 foreach ($clone as $obj) {
167 $storage[] = array(
168 'object' => $obj,
169 'info' => $clone->getInfo(),
170 );
171 }
172
173 $a += array(
174 Caster::PREFIX_VIRTUAL.'storage' => $storage,
175 );
176
177 return $a;
178 }
179
180 public static function castOuterIterator(\OuterIterator $c, array $a, Stub $stub, $isNested)
181 {
182 $a[Caster::PREFIX_VIRTUAL.'innerIterator'] = $c->getInnerIterator();
183
184 return $a;
185 }
186
187 private static function castSplArray($c, array $a, Stub $stub, $isNested)
188 {
189 $prefix = Caster::PREFIX_VIRTUAL;
190 $class = $stub->class;
191 $flags = $c->getFlags();
192
193 if (!($flags & \ArrayObject::STD_PROP_LIST)) {
194 $c->setFlags(\ArrayObject::STD_PROP_LIST);
195 $a = Caster::castObject($c, new \ReflectionClass($class));
196 $c->setFlags($flags);
197 }
198 $a += array(
199 $prefix.'flag::STD_PROP_LIST' => (bool) ($flags & \ArrayObject::STD_PROP_LIST),
200 $prefix.'flag::ARRAY_AS_PROPS' => (bool) ($flags & \ArrayObject::ARRAY_AS_PROPS),
201 );
202 if ($c instanceof \ArrayObject) {
203 $a[$prefix.'iteratorClass'] = $c->getIteratorClass();
204 }
205 $a[$prefix.'storage'] = $c->getArrayCopy();
206
207 return $a;
208 }
209 }
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\Component\VarDumper\Caster;
13
14 use Symfony\Component\VarDumper\Cloner\Stub;
15
16 /**
17 * Casts a caster's Stub.
18 *
19 * @author Nicolas Grekas <p@tchwork.com>
20 */
21 class StubCaster
22 {
23 public static function castStub(Stub $c, array $a, Stub $stub, $isNested)
24 {
25 if ($isNested) {
26 $stub->type = $c->type;
27 $stub->class = $c->class;
28 $stub->value = $c->value;
29 $stub->handle = $c->handle;
30 $stub->cut = $c->cut;
31
32 $a = array();
33 }
34
35 return $a;
36 }
37
38 public static function castCutArray(CutArrayStub $c, array $a, Stub $stub, $isNested)
39 {
40 return $isNested ? $c->preservedSubset : $a;
41 }
42
43 public static function cutInternals($obj, array $a, Stub $stub, $isNested)
44 {
45 if ($isNested) {
46 $stub->cut += \count($a);
47
48 return array();
49 }
50
51 return $a;
52 }
53
54 public static function castEnum(EnumStub $c, array $a, Stub $stub, $isNested)
55 {
56 if ($isNested) {
57 $stub->class = '';
58 $stub->handle = 0;
59 $stub->value = null;
60
61 $a = array();
62
63 if ($c->value) {
64 foreach (array_keys($c->value) as $k) {
65 $keys[] = !isset($k[0]) || "\0" !== $k[0] ? Caster::PREFIX_VIRTUAL.$k : $k;
66 }
67 // Preserve references with array_combine()
68 $a = array_combine($keys, $c->value);
69 }
70 }
71
72 return $a;
73 }
74 }
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\Component\VarDumper\Caster;
13
14 use Symfony\Component\VarDumper\Cloner\Stub;
15
16 /**
17 * Represents a backtrace as returned by debug_backtrace() or Exception->getTrace().
18 *
19 * @author Nicolas Grekas <p@tchwork.com>
20 */
21 class TraceStub extends Stub
22 {
23 public $keepArgs;
24 public $sliceOffset;
25 public $sliceLength;
26 public $numberingOffset;
27
28 public function __construct(array $trace, $keepArgs = true, $sliceOffset = 0, $sliceLength = null, $numberingOffset = 0)
29 {
30 $this->value = $trace;
31 $this->keepArgs = $keepArgs;
32 $this->sliceOffset = $sliceOffset;
33 $this->sliceLength = $sliceLength;
34 $this->numberingOffset = $numberingOffset;
35 }
36 }
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\Component\VarDumper\Caster;
13
14 use Symfony\Component\VarDumper\Cloner\Stub;
15
16 /**
17 * Casts XML resources to array representation.
18 *
19 * @author Nicolas Grekas <p@tchwork.com>
20 */
21 class XmlResourceCaster
22 {
23 private static $xmlErrors = array(
24 XML_ERROR_NONE => 'XML_ERROR_NONE',
25 XML_ERROR_NO_MEMORY => 'XML_ERROR_NO_MEMORY',
26 XML_ERROR_SYNTAX => 'XML_ERROR_SYNTAX',
27 XML_ERROR_NO_ELEMENTS => 'XML_ERROR_NO_ELEMENTS',
28 XML_ERROR_INVALID_TOKEN => 'XML_ERROR_INVALID_TOKEN',
29 XML_ERROR_UNCLOSED_TOKEN => 'XML_ERROR_UNCLOSED_TOKEN',
30 XML_ERROR_PARTIAL_CHAR => 'XML_ERROR_PARTIAL_CHAR',
31 XML_ERROR_TAG_MISMATCH => 'XML_ERROR_TAG_MISMATCH',
32 XML_ERROR_DUPLICATE_ATTRIBUTE => 'XML_ERROR_DUPLICATE_ATTRIBUTE',
33 XML_ERROR_JUNK_AFTER_DOC_ELEMENT => 'XML_ERROR_JUNK_AFTER_DOC_ELEMENT',
34 XML_ERROR_PARAM_ENTITY_REF => 'XML_ERROR_PARAM_ENTITY_REF',
35 XML_ERROR_UNDEFINED_ENTITY => 'XML_ERROR_UNDEFINED_ENTITY',
36 XML_ERROR_RECURSIVE_ENTITY_REF => 'XML_ERROR_RECURSIVE_ENTITY_REF',
37 XML_ERROR_ASYNC_ENTITY => 'XML_ERROR_ASYNC_ENTITY',
38 XML_ERROR_BAD_CHAR_REF => 'XML_ERROR_BAD_CHAR_REF',
39 XML_ERROR_BINARY_ENTITY_REF => 'XML_ERROR_BINARY_ENTITY_REF',
40 XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF => 'XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF',
41 XML_ERROR_MISPLACED_XML_PI => 'XML_ERROR_MISPLACED_XML_PI',
42 XML_ERROR_UNKNOWN_ENCODING => 'XML_ERROR_UNKNOWN_ENCODING',
43 XML_ERROR_INCORRECT_ENCODING => 'XML_ERROR_INCORRECT_ENCODING',
44 XML_ERROR_UNCLOSED_CDATA_SECTION => 'XML_ERROR_UNCLOSED_CDATA_SECTION',
45 XML_ERROR_EXTERNAL_ENTITY_HANDLING => 'XML_ERROR_EXTERNAL_ENTITY_HANDLING',
46 );
47
48 public static function castXml($h, array $a, Stub $stub, $isNested)
49 {
50 $a['current_byte_index'] = xml_get_current_byte_index($h);
51 $a['current_column_number'] = xml_get_current_column_number($h);
52 $a['current_line_number'] = xml_get_current_line_number($h);
53 $a['error_code'] = xml_get_error_code($h);
54
55 if (isset(self::$xmlErrors[$a['error_code']])) {
56 $a['error_code'] = new ConstStub(self::$xmlErrors[$a['error_code']], $a['error_code']);
57 }
58
59 return $a;
60 }
61 }
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\Component\VarDumper\Cloner;
13
14 /**
15 * @author Nicolas Grekas <p@tchwork.com>
16 */
17 interface ClonerInterface
18 {
19 /**
20 * Clones a PHP variable.
21 *
22 * @param mixed $var Any PHP variable
23 *
24 * @return Data The cloned variable represented by a Data object
25 */
26 public function cloneVar($var);
27 }
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\Component\VarDumper\Cloner;
13
14 /**
15 * Represents the current state of a dumper while dumping.
16 *
17 * @author Nicolas Grekas <p@tchwork.com>
18 */
19 class Cursor
20 {
21 const HASH_INDEXED = Stub::ARRAY_INDEXED;
22 const HASH_ASSOC = Stub::ARRAY_ASSOC;
23 const HASH_OBJECT = Stub::TYPE_OBJECT;
24 const HASH_RESOURCE = Stub::TYPE_RESOURCE;
25
26 public $depth = 0;
27 public $refIndex = 0;
28 public $softRefTo = 0;
29 public $softRefCount = 0;
30 public $softRefHandle = 0;
31 public $hardRefTo = 0;
32 public $hardRefCount = 0;
33 public $hardRefHandle = 0;
34 public $hashType;
35 public $hashKey;
36 public $hashKeyIsBinary;
37 public $hashIndex = 0;
38 public $hashLength = 0;
39 public $hashCut = 0;
40 public $stop = false;
41 }
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\Component\VarDumper\Cloner;
13
14 /**
15 * @author Nicolas Grekas <p@tchwork.com>
16 */
17 class Data
18 {
19 private $data;
20 private $maxDepth = 20;
21 private $maxItemsPerDepth = -1;
22 private $useRefHandles = -1;
23
24 /**
25 * @param array $data An array as returned by ClonerInterface::cloneVar()
26 */
27 public function __construct(array $data)
28 {
29 $this->data = $data;
30 }
31
32 /**
33 * @return array The raw data structure
34 */
35 public function getRawData()
36 {
37 return $this->data;
38 }
39
40 /**
41 * Returns a depth limited clone of $this.
42 *
43 * @param int $maxDepth The max dumped depth level
44 *
45 * @return self A clone of $this
46 */
47 public function withMaxDepth($maxDepth)
48 {
49 $data = clone $this;
50 $data->maxDepth = (int) $maxDepth;
51
52 return $data;
53 }
54
55 /**
56 * Limits the number of elements per depth level.
57 *
58 * @param int $maxItemsPerDepth The max number of items dumped per depth level
59 *
60 * @return self A clone of $this
61 */
62 public function withMaxItemsPerDepth($maxItemsPerDepth)
63 {
64 $data = clone $this;
65 $data->maxItemsPerDepth = (int) $maxItemsPerDepth;
66
67 return $data;
68 }
69
70 /**
71 * Enables/disables objects' identifiers tracking.
72 *
73 * @param bool $useRefHandles False to hide global ref. handles
74 *
75 * @return self A clone of $this
76 */
77 public function withRefHandles($useRefHandles)
78 {
79 $data = clone $this;
80 $data->useRefHandles = $useRefHandles ? -1 : 0;
81
82 return $data;
83 }
84
85 /**
86 * Returns a depth limited clone of $this.
87 *
88 * @param int $maxDepth The max dumped depth level
89 * @param int $maxItemsPerDepth The max number of items dumped per depth level
90 * @param bool $useRefHandles False to hide ref. handles
91 *
92 * @return self A depth limited clone of $this
93 *
94 * @deprecated since Symfony 2.7, to be removed in 3.0. Use withMaxDepth, withMaxItemsPerDepth or withRefHandles instead.
95 */
96 public function getLimitedClone($maxDepth, $maxItemsPerDepth, $useRefHandles = true)
97 {
98 @trigger_error('The '.__METHOD__.' method is deprecated since Symfony 2.7 and will be removed in 3.0. Use withMaxDepth, withMaxItemsPerDepth or withRefHandles methods instead.', E_USER_DEPRECATED);
99
100 $data = clone $this;
101 $data->maxDepth = (int) $maxDepth;
102 $data->maxItemsPerDepth = (int) $maxItemsPerDepth;
103 $data->useRefHandles = $useRefHandles ? -1 : 0;
104
105 return $data;
106 }
107
108 /**
109 * Dumps data with a DumperInterface dumper.
110 */
111 public function dump(DumperInterface $dumper)
112 {
113 $refs = array(0);
114 $this->dumpItem($dumper, new Cursor(), $refs, $this->data[0][0]);
115 }
116
117 /**
118 * Depth-first dumping of items.
119 *
120 * @param DumperInterface $dumper The dumper being used for dumping
121 * @param Cursor $cursor A cursor used for tracking dumper state position
122 * @param array &$refs A map of all references discovered while dumping
123 * @param mixed $item A Stub object or the original value being dumped
124 */
125 private function dumpItem($dumper, $cursor, &$refs, $item)
126 {
127 $cursor->refIndex = 0;
128 $cursor->softRefTo = $cursor->softRefHandle = $cursor->softRefCount = 0;
129 $cursor->hardRefTo = $cursor->hardRefHandle = $cursor->hardRefCount = 0;
130 $firstSeen = true;
131
132 if (!$item instanceof Stub) {
133 $type = \gettype($item);
134 } elseif (Stub::TYPE_REF === $item->type) {
135 if ($item->handle) {
136 if (!isset($refs[$r = $item->handle - (PHP_INT_MAX >> 1)])) {
137 $cursor->refIndex = $refs[$r] = $cursor->refIndex ?: ++$refs[0];
138 } else {
139 $firstSeen = false;
140 }
141 $cursor->hardRefTo = $refs[$r];
142 $cursor->hardRefHandle = $this->useRefHandles & $item->handle;
143 $cursor->hardRefCount = $item->refCount;
144 }
145 $type = $item->class ?: \gettype($item->value);
146 $item = $item->value;
147 }
148 if ($item instanceof Stub) {
149 if ($item->refCount) {
150 if (!isset($refs[$r = $item->handle])) {
151 $cursor->refIndex = $refs[$r] = $cursor->refIndex ?: ++$refs[0];
152 } else {
153 $firstSeen = false;
154 }
155 $cursor->softRefTo = $refs[$r];
156 }
157 $cursor->softRefHandle = $this->useRefHandles & $item->handle;
158 $cursor->softRefCount = $item->refCount;
159 $cut = $item->cut;
160
161 if ($item->position && $firstSeen) {
162 $children = $this->data[$item->position];
163
164 if ($cursor->stop) {
165 if ($cut >= 0) {
166 $cut += \count($children);
167 }
168 $children = array();
169 }
170 } else {
171 $children = array();
172 }
173 switch ($item->type) {
174 case Stub::TYPE_STRING:
175 $dumper->dumpString($cursor, $item->value, Stub::STRING_BINARY === $item->class, $cut);
176 break;
177
178 case Stub::TYPE_ARRAY:
179 $item = clone $item;
180 $item->type = $item->class;
181 $item->class = $item->value;
182 // no break
183 case Stub::TYPE_OBJECT:
184 case Stub::TYPE_RESOURCE:
185 $withChildren = $children && $cursor->depth !== $this->maxDepth && $this->maxItemsPerDepth;
186 $dumper->enterHash($cursor, $item->type, $item->class, $withChildren);
187 if ($withChildren) {
188 $cut = $this->dumpChildren($dumper, $cursor, $refs, $children, $cut, $item->type);
189 } elseif ($children && 0 <= $cut) {
190 $cut += \count($children);
191 }
192 $dumper->leaveHash($cursor, $item->type, $item->class, $withChildren, $cut);
193 break;
194
195 default:
196 throw new \RuntimeException(sprintf('Unexpected Stub type: %s', $item->type));
197 }
198 } elseif ('array' === $type) {
199 $dumper->enterHash($cursor, Cursor::HASH_INDEXED, 0, false);
200 $dumper->leaveHash($cursor, Cursor::HASH_INDEXED, 0, false, 0);
201 } elseif ('string' === $type) {
202 $dumper->dumpString($cursor, $item, false, 0);
203 } else {
204 $dumper->dumpScalar($cursor, $type, $item);
205 }
206 }
207
208 /**
209 * Dumps children of hash structures.
210 *
211 * @param DumperInterface $dumper
212 * @param Cursor $parentCursor The cursor of the parent hash
213 * @param array &$refs A map of all references discovered while dumping
214 * @param array $children The children to dump
215 * @param int $hashCut The number of items removed from the original hash
216 * @param string $hashType A Cursor::HASH_* const
217 *
218 * @return int The final number of removed items
219 */
220 private function dumpChildren($dumper, $parentCursor, &$refs, $children, $hashCut, $hashType)
221 {
222 $cursor = clone $parentCursor;
223 ++$cursor->depth;
224 $cursor->hashType = $hashType;
225 $cursor->hashIndex = 0;
226 $cursor->hashLength = \count($children);
227 $cursor->hashCut = $hashCut;
228 foreach ($children as $key => $child) {
229 $cursor->hashKeyIsBinary = isset($key[0]) && !preg_match('//u', $key);
230 $cursor->hashKey = $key;
231 $this->dumpItem($dumper, $cursor, $refs, $child);
232 if (++$cursor->hashIndex === $this->maxItemsPerDepth || $cursor->stop) {
233 $parentCursor->stop = true;
234
235 return $hashCut >= 0 ? $hashCut + $cursor->hashLength - $cursor->hashIndex : $hashCut;
236 }
237 }
238
239 return $hashCut;
240 }
241 }
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\Component\VarDumper\Cloner;
13
14 /**
15 * DumperInterface used by Data objects.
16 *
17 * @author Nicolas Grekas <p@tchwork.com>
18 */
19 interface DumperInterface
20 {
21 /**
22 * Dumps a scalar value.
23 *
24 * @param Cursor $cursor The Cursor position in the dump
25 * @param string $type The PHP type of the value being dumped
26 * @param scalar $value The scalar value being dumped
27 */
28 public function dumpScalar(Cursor $cursor, $type, $value);
29
30 /**
31 * Dumps a string.
32 *
33 * @param Cursor $cursor The Cursor position in the dump
34 * @param string $str The string being dumped
35 * @param bool $bin Whether $str is UTF-8 or binary encoded
36 * @param int $cut The number of characters $str has been cut by
37 */
38 public function dumpString(Cursor $cursor, $str, $bin, $cut);
39
40 /**
41 * Dumps while entering an hash.
42 *
43 * @param Cursor $cursor The Cursor position in the dump
44 * @param int $type A Cursor::HASH_* const for the type of hash
45 * @param string $class The object class, resource type or array count
46 * @param bool $hasChild When the dump of the hash has child item
47 */
48 public function enterHash(Cursor $cursor, $type, $class, $hasChild);
49
50 /**
51 * Dumps while leaving an hash.
52 *
53 * @param Cursor $cursor The Cursor position in the dump
54 * @param int $type A Cursor::HASH_* const for the type of hash
55 * @param string $class The object class, resource type or array count
56 * @param bool $hasChild When the dump of the hash has child item
57 * @param int $cut The number of items the hash has been cut by
58 */
59 public function leaveHash(Cursor $cursor, $type, $class, $hasChild, $cut);
60 }
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\Component\VarDumper\Cloner;
13
14 /**
15 * Represents the main properties of a PHP variable.
16 *
17 * @author Nicolas Grekas <p@tchwork.com>
18 */
19 class Stub
20 {
21 const TYPE_REF = 'ref';
22 const TYPE_STRING = 'string';
23 const TYPE_ARRAY = 'array';
24 const TYPE_OBJECT = 'object';
25 const TYPE_RESOURCE = 'resource';
26
27 const STRING_BINARY = 'bin';
28 const STRING_UTF8 = 'utf8';
29
30 const ARRAY_ASSOC = 'assoc';
31 const ARRAY_INDEXED = 'indexed';
32
33 public $type = self::TYPE_REF;
34 public $class = '';
35 public $value;
36 public $cut = 0;
37 public $handle = 0;
38 public $refCount = 0;
39 public $position = 0;
40 }
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\Component\VarDumper\Dumper;
13
14 use Symfony\Component\VarDumper\Cloner\Data;
15 use Symfony\Component\VarDumper\Cloner\DumperInterface;
16
17 /**
18 * Abstract mechanism for dumping a Data object.
19 *
20 * @author Nicolas Grekas <p@tchwork.com>
21 */
22 abstract class AbstractDumper implements DataDumperInterface, DumperInterface
23 {
24 public static $defaultOutput = 'php://output';
25
26 protected $line = '';
27 protected $lineDumper;
28 protected $outputStream;
29 protected $decimalPoint; // This is locale dependent
30 protected $indentPad = ' ';
31
32 private $charset;
33
34 /**
35 * @param callable|resource|string|null $output A line dumper callable, an opened stream or an output path, defaults to static::$defaultOutput
36 * @param string $charset The default character encoding to use for non-UTF8 strings
37 */
38 public function __construct($output = null, $charset = null)
39 {
40 $this->setCharset($charset ?: ini_get('php.output_encoding') ?: ini_get('default_charset') ?: 'UTF-8');
41 $this->decimalPoint = localeconv();
42 $this->decimalPoint = $this->decimalPoint['decimal_point'];
43 $this->setOutput($output ?: static::$defaultOutput);
44 if (!$output && \is_string(static::$defaultOutput)) {
45 static::$defaultOutput = $this->outputStream;
46 }
47 }
48
49 /**
50 * Sets the output destination of the dumps.
51 *
52 * @param callable|resource|string $output A line dumper callable, an opened stream or an output path
53 *
54 * @return callable|resource|string The previous output destination
55 */
56 public function setOutput($output)
57 {
58 $prev = null !== $this->outputStream ? $this->outputStream : $this->lineDumper;
59
60 if (\is_callable($output)) {
61 $this->outputStream = null;
62 $this->lineDumper = $output;
63 } else {
64 if (\is_string($output)) {
65 $output = fopen($output, 'wb');
66 }
67 $this->outputStream = $output;
68 $this->lineDumper = array($this, 'echoLine');
69 }
70
71 return $prev;
72 }
73
74 /**
75 * Sets the default character encoding to use for non-UTF8 strings.
76 *
77 * @param string $charset The default character encoding to use for non-UTF8 strings
78 *
79 * @return string The previous charset
80 */
81 public function setCharset($charset)
82 {
83 $prev = $this->charset;
84
85 $charset = strtoupper($charset);
86 $charset = null === $charset || 'UTF-8' === $charset || 'UTF8' === $charset ? 'CP1252' : $charset;
87
88 $this->charset = $charset;
89
90 return $prev;
91 }
92
93 /**
94 * Sets the indentation pad string.
95 *
96 * @param string $pad A string that will be prepended to dumped lines, repeated by nesting level
97 *
98 * @return string The previous indent pad
99 */
100 public function setIndentPad($pad)
101 {
102 $prev = $this->indentPad;
103 $this->indentPad = $pad;
104
105 return $prev;
106 }
107
108 /**
109 * Dumps a Data object.
110 *
111 * @param Data $data A Data object
112 * @param callable|resource|string|null $output A line dumper callable, an opened stream or an output path
113 */
114 public function dump(Data $data, $output = null)
115 {
116 $this->decimalPoint = localeconv();
117 $this->decimalPoint = $this->decimalPoint['decimal_point'];
118
119 $exception = null;
120 if ($output) {
121 $prevOutput = $this->setOutput($output);
122 }
123 try {
124 $data->dump($this);
125 $this->dumpLine(-1);
126 } catch (\Exception $exception) {
127 // Re-thrown below
128 } catch (\Throwable $exception) {
129 // Re-thrown below
130 }
131 if ($output) {
132 $this->setOutput($prevOutput);
133 }
134 if (null !== $exception) {
135 throw $exception;
136 }
137 }
138
139 /**
140 * Dumps the current line.
141 *
142 * @param int $depth The recursive depth in the dumped structure for the line being dumped,
143 * or -1 to signal the end-of-dump to the line dumper callable
144 */
145 protected function dumpLine($depth)
146 {
147 \call_user_func($this->lineDumper, $this->line, $depth, $this->indentPad);
148 $this->line = '';
149 }
150
151 /**
152 * Generic line dumper callback.
153 *
154 * @param string $line The line to write
155 * @param int $depth The recursive depth in the dumped structure
156 * @param string $indentPad The line indent pad
157 */
158 protected function echoLine($line, $depth, $indentPad)
159 {
160 if (-1 !== $depth) {
161 fwrite($this->outputStream, str_repeat($indentPad, $depth).$line."\n");
162 }
163 }
164
165 /**
166 * Converts a non-UTF-8 string to UTF-8.
167 *
168 * @param string $s The non-UTF-8 string to convert
169 *
170 * @return string The string converted to UTF-8
171 */
172 protected function utf8Encode($s)
173 {
174 if (!\function_exists('iconv')) {
175 throw new \RuntimeException('Unable to convert a non-UTF-8 string to UTF-8: required function iconv() does not exist. You should install ext-iconv or symfony/polyfill-iconv.');
176 }
177 if (false !== $c = @iconv($this->charset, 'UTF-8', $s)) {
178 return $c;
179 }
180 if ('CP1252' !== $this->charset && false !== $c = @iconv('CP1252', 'UTF-8', $s)) {
181 return $c;
182 }
183
184 return iconv('CP850', 'UTF-8', $s);
185 }
186 }
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\Component\VarDumper\Dumper;
13
14 use Symfony\Component\VarDumper\Cloner\Data;
15
16 /**
17 * DataDumperInterface for dumping Data objects.
18 *
19 * @author Nicolas Grekas <p@tchwork.com>
20 */
21 interface DataDumperInterface
22 {
23 public function dump(Data $data);
24 }
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\Component\VarDumper\Exception;
13
14 /**
15 * @author Nicolas Grekas <p@tchwork.com>
16 */
17 class ThrowingCasterException extends \Exception
18 {
19 /**
20 * @param \Exception $prev The exception thrown from the caster
21 */
22 public function __construct($prev, \Exception $e = null)
23 {
24 if (!$prev instanceof \Exception) {
25 @trigger_error('Providing $caster as the first argument of the '.__METHOD__.' method is deprecated since Symfony 2.8 and will be removed in 3.0. Provide directly the $prev exception instead.', E_USER_DEPRECATED);
26
27 $prev = $e;
28 }
29 parent::__construct('Unexpected '.\get_class($prev).' thrown from a caster: '.$prev->getMessage(), 0, $prev);
30 }
31 }
1 Copyright (c) 2014-2018 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.
1 VarDumper Component
2 ===================
3
4 The VarDumper component provides mechanisms for walking through any arbitrary
5 PHP variable. Built on top, it provides a better `dump()` function that you
6 can use instead of `var_dump`.
7
8 Resources
9 ---------
10
11 * [Documentation](https://symfony.com/doc/current/components/var_dumper/introduction.html)
12 * [Contributing](https://symfony.com/doc/current/contributing/index.html)
13 * [Report issues](https://github.com/symfony/symfony/issues) and
14 [send Pull Requests](https://github.com/symfony/symfony/pulls)
15 in the [main Symfony repository](https://github.com/symfony/symfony)
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\Component\VarDumper\VarDumper;
13
14 if (!function_exists('dump')) {
15 /**
16 * @author Nicolas Grekas <p@tchwork.com>
17 */
18 function dump($var)
19 {
20 foreach (func_get_args() as $var) {
21 VarDumper::dump($var);
22 }
23 }
24 }
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\Component\VarDumper\Test;
13
14 use PHPUnit\Framework\TestCase;
15 use Symfony\Component\VarDumper\Cloner\VarCloner;
16 use Symfony\Component\VarDumper\Dumper\CliDumper;
17
18 /**
19 * @author Nicolas Grekas <p@tchwork.com>
20 *
21 * @deprecated since version 2.8, to be removed in 3.0. Use the VarDumperTestTrait instead.
22 */
23 abstract class VarDumperTestCase extends TestCase
24 {
25 public function assertDumpEquals($dump, $data, $message = '')
26 {
27 $this->assertSame(rtrim($dump), $this->getDump($data), $message);
28 }
29
30 public function assertDumpMatchesFormat($dump, $data, $message = '')
31 {
32 $this->assertStringMatchesFormat(rtrim($dump), $this->getDump($data), $message);
33 }
34
35 protected function getDump($data)
36 {
37 $h = fopen('php://memory', 'r+b');
38 $cloner = new VarCloner();
39 $dumper = new CliDumper($h);
40 $dumper->setColors(false);
41 $dumper->dump($cloner->cloneVar($data)->withRefHandles(false));
42 $data = stream_get_contents($h, -1, 0);
43 fclose($h);
44
45 return rtrim($data);
46 }
47 }
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\Component\VarDumper\Test;
13
14 use Symfony\Component\VarDumper\Cloner\VarCloner;
15 use Symfony\Component\VarDumper\Dumper\CliDumper;
16
17 /**
18 * @author Nicolas Grekas <p@tchwork.com>
19 */
20 trait VarDumperTestTrait
21 {
22 public function assertDumpEquals($dump, $data, $message = '')
23 {
24 $this->assertSame(rtrim($dump), $this->getDump($data), $message);
25 }
26
27 public function assertDumpMatchesFormat($dump, $data, $message = '')
28 {
29 $this->assertStringMatchesFormat(rtrim($dump), $this->getDump($data), $message);
30 }
31
32 protected function getDump($data)
33 {
34 $h = fopen('php://memory', 'r+b');
35 $cloner = new VarCloner();
36 $cloner->setMaxItems(-1);
37 $dumper = new CliDumper($h);
38 $dumper->setColors(false);
39 $dumper->dump($cloner->cloneVar($data)->withRefHandles(false));
40 $data = stream_get_contents($h, -1, 0);
41 fclose($h);
42
43 return rtrim($data);
44 }
45 }
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\Component\VarDumper\Tests\Caster;
13
14 use Symfony\Component\VarDumper\Caster\Caster;
15 use Symfony\Component\VarDumper\Test\VarDumperTestCase;
16
17 /**
18 * @author Nicolas Grekas <p@tchwork.com>
19 */
20 class CasterTest extends VarDumperTestCase
21 {
22 private $referenceArray = array(
23 'null' => null,
24 'empty' => false,
25 'public' => 'pub',
26 "\0~\0virtual" => 'virt',
27 "\0+\0dynamic" => 'dyn',
28 "\0*\0protected" => 'prot',
29 "\0Foo\0private" => 'priv',
30 );
31
32 /**
33 * @dataProvider provideFilter
34 */
35 public function testFilter($filter, $expectedDiff, $listedProperties = null)
36 {
37 if (null === $listedProperties) {
38 $filteredArray = Caster::filter($this->referenceArray, $filter);
39 } else {
40 $filteredArray = Caster::filter($this->referenceArray, $filter, $listedProperties);
41 }
42
43 $this->assertSame($expectedDiff, array_diff_assoc($this->referenceArray, $filteredArray));
44 }
45
46 public function provideFilter()
47 {
48 return array(
49 array(
50 0,
51 array(),
52 ),
53 array(
54 Caster::EXCLUDE_PUBLIC,
55 array(
56 'null' => null,
57 'empty' => false,
58 'public' => 'pub',
59 ),
60 ),
61 array(
62 Caster::EXCLUDE_NULL,
63 array(
64 'null' => null,
65 ),
66 ),
67 array(
68 Caster::EXCLUDE_EMPTY,
69 array(
70 'null' => null,
71 'empty' => false,
72 ),
73 ),
74 array(
75 Caster::EXCLUDE_VIRTUAL,
76 array(
77 "\0~\0virtual" => 'virt',
78 ),
79 ),
80 array(
81 Caster::EXCLUDE_DYNAMIC,
82 array(
83 "\0+\0dynamic" => 'dyn',
84 ),
85 ),
86 array(
87 Caster::EXCLUDE_PROTECTED,
88 array(
89 "\0*\0protected" => 'prot',
90 ),
91 ),
92 array(
93 Caster::EXCLUDE_PRIVATE,
94 array(
95 "\0Foo\0private" => 'priv',
96 ),
97 ),
98 array(
99 Caster::EXCLUDE_VERBOSE,
100 array(
101 'public' => 'pub',
102 "\0*\0protected" => 'prot',
103 ),
104 array('public', "\0*\0protected"),
105 ),
106 array(
107 Caster::EXCLUDE_NOT_IMPORTANT,
108 array(
109 'null' => null,
110 'empty' => false,
111 "\0~\0virtual" => 'virt',
112 "\0+\0dynamic" => 'dyn',
113 "\0Foo\0private" => 'priv',
114 ),
115 array('public', "\0*\0protected"),
116 ),
117 array(
118 Caster::EXCLUDE_VIRTUAL | Caster::EXCLUDE_DYNAMIC,
119 array(
120 "\0~\0virtual" => 'virt',
121 "\0+\0dynamic" => 'dyn',
122 ),
123 ),
124 array(
125 Caster::EXCLUDE_NOT_IMPORTANT | Caster::EXCLUDE_VERBOSE,
126 $this->referenceArray,
127 array('public', "\0*\0protected"),
128 ),
129 array(
130 Caster::EXCLUDE_NOT_IMPORTANT | Caster::EXCLUDE_EMPTY,
131 array(
132 'null' => null,
133 'empty' => false,
134 "\0~\0virtual" => 'virt',
135 "\0+\0dynamic" => 'dyn',
136 "\0*\0protected" => 'prot',
137 "\0Foo\0private" => 'priv',
138 ),
139 array('public', 'empty'),
140 ),
141 array(
142 Caster::EXCLUDE_VERBOSE | Caster::EXCLUDE_EMPTY | Caster::EXCLUDE_STRICT,
143 array(
144 'empty' => false,
145 ),
146 array('public', 'empty'),
147 ),
148 );
149 }
150
151 /**
152 * @requires PHP 7.0
153 */
154 public function testAnonymousClass()
155 {
156 $c = eval('return new class extends stdClass { private $foo = "foo"; };');
157
158 $this->assertDumpMatchesFormat(
159 <<<'EOTXT'
160 stdClass@anonymous {
161 -foo: "foo"
162 }
163 EOTXT
164 , $c
165 );
166
167 $c = eval('return new class { private $foo = "foo"; };');
168
169 $this->assertDumpMatchesFormat(
170 <<<'EOTXT'
171 @anonymous {
172 -foo: "foo"
173 }
174 EOTXT
175 , $c
176 );
177 }
178 }
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\Component\VarDumper\Tests\Caster;
13
14 use Symfony\Component\VarDumper\Caster\FrameStub;
15 use Symfony\Component\VarDumper\Test\VarDumperTestCase;
16
17 class ExceptionCasterTest extends VarDumperTestCase
18 {
19 /**
20 * @requires function Twig\Template::getSourceContext
21 */
22 public function testFrameWithTwig()
23 {
24 require_once \dirname(__DIR__).'/Fixtures/Twig.php';
25
26 $f = array(
27 new FrameStub(array(
28 'file' => \dirname(__DIR__).'/Fixtures/Twig.php',
29 'line' => 21,
30 'class' => '__TwigTemplate_VarDumperFixture_u75a09',
31 )),
32 new FrameStub(array(
33 'file' => \dirname(__DIR__).'/Fixtures/Twig.php',
34 'line' => 21,
35 'class' => '__TwigTemplate_VarDumperFixture_u75a09',
36 'object' => new \__TwigTemplate_VarDumperFixture_u75a09(null, false),
37 )),
38 );
39
40 $expectedDump = <<<'EODUMP'
41 array:2 [
42 0 => {
43 class: "__TwigTemplate_VarDumperFixture_u75a09"
44 src: {
45 %sTwig.php:21: """
46 // line 2\n
47 throw new \Exception('Foobar');\n
48 }\n
49 """
50 bar.twig:2: """
51 foo bar\n
52 twig source\n
53 \n
54 """
55 }
56 }
57 1 => {
58 class: "__TwigTemplate_VarDumperFixture_u75a09"
59 object: __TwigTemplate_VarDumperFixture_u75a09 {
60 %A
61 }
62 src: {
63 %sTwig.php:21: """
64 // line 2\n
65 throw new \Exception('Foobar');\n
66 }\n
67 """
68 foo.twig:2: """
69 foo bar\n
70 twig source\n
71 \n
72 """
73 }
74 }
75 ]
76
77 EODUMP;
78
79 $this->assertDumpMatchesFormat($expectedDump, $f);
80 }
81 }
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\Component\VarDumper\Tests\Caster;
13
14 use PHPUnit\Framework\TestCase;
15 use Symfony\Component\VarDumper\Caster\PdoCaster;
16 use Symfony\Component\VarDumper\Cloner\Stub;
17
18 /**
19 * @author Nicolas Grekas <p@tchwork.com>
20 */
21 class PdoCasterTest extends TestCase
22 {
23 /**
24 * @requires extension pdo_sqlite
25 */
26 public function testCastPdo()
27 {
28 $pdo = new \PDO('sqlite::memory:');
29 $pdo->setAttribute(\PDO::ATTR_STATEMENT_CLASS, array('PDOStatement', array($pdo)));
30
31 $cast = PdoCaster::castPdo($pdo, array(), new Stub(), false);
32
33 $this->assertInstanceOf('Symfony\Component\VarDumper\Caster\EnumStub', $cast["\0~\0attributes"]);
34
35 $attr = $cast["\0~\0attributes"] = $cast["\0~\0attributes"]->value;
36 $this->assertInstanceOf('Symfony\Component\VarDumper\Caster\ConstStub', $attr['CASE']);
37 $this->assertSame('NATURAL', $attr['CASE']->class);
38 $this->assertSame('BOTH', $attr['DEFAULT_FETCH_MODE']->class);
39
40 $xCast = array(
41 "\0~\0inTransaction" => $pdo->inTransaction(),
42 "\0~\0attributes" => array(
43 'CASE' => $attr['CASE'],
44 'ERRMODE' => $attr['ERRMODE'],
45 'PERSISTENT' => false,
46 'DRIVER_NAME' => 'sqlite',
47 'ORACLE_NULLS' => $attr['ORACLE_NULLS'],
48 'CLIENT_VERSION' => $pdo->getAttribute(\PDO::ATTR_CLIENT_VERSION),
49 'SERVER_VERSION' => $pdo->getAttribute(\PDO::ATTR_SERVER_VERSION),
50 'STATEMENT_CLASS' => array('PDOStatement'),
51 'DEFAULT_FETCH_MODE' => $attr['DEFAULT_FETCH_MODE'],
52 ),
53 );
54 unset($cast["\0~\0attributes"]['STATEMENT_CLASS'][1]);
55
56 $this->assertSame($xCast, $cast);
57 }
58 }
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\Component\VarDumper\Tests\Caster;
13
14 use Symfony\Component\VarDumper\Test\VarDumperTestCase;
15 use Symfony\Component\VarDumper\Tests\Fixtures\GeneratorDemo;
16 use Symfony\Component\VarDumper\Tests\Fixtures\NotLoadableClass;
17
18 /**
19 * @author Nicolas Grekas <p@tchwork.com>
20 */
21 class ReflectionCasterTest extends VarDumperTestCase
22 {
23 public function testReflectionCaster()
24 {
25 $var = new \ReflectionClass('ReflectionClass');
26
27 $this->assertDumpMatchesFormat(
28 <<<'EOTXT'
29 ReflectionClass {
30 +name: "ReflectionClass"
31 %Aimplements: array:%d [
32 0 => "Reflector"
33 %A]
34 constants: array:3 [
35 "IS_IMPLICIT_ABSTRACT" => 16
36 "IS_EXPLICIT_ABSTRACT" => 32
37 "IS_FINAL" => %d
38 ]
39 properties: array:%d [
40 "name" => ReflectionProperty {
41 %A +name: "name"
42 +class: "ReflectionClass"
43 %A modifiers: "public"
44 }
45 %A]
46 methods: array:%d [
47 %A
48 "export" => ReflectionMethod {
49 +name: "export"
50 +class: "ReflectionClass"
51 %A parameters: {
52 $%s: ReflectionParameter {
53 %A position: 0
54 %A
55 }
56 EOTXT
57 , $var
58 );
59 }
60
61 public function testClosureCaster()
62 {
63 $a = $b = 123;
64 $var = function ($x) use ($a, &$b) {};
65
66 $this->assertDumpMatchesFormat(
67 <<<EOTXT
68 Closure {
69 %Aparameters: {
70 \$x: {}
71 }
72 use: {
73 \$a: 123
74 \$b: & 123
75 }
76 file: "%sReflectionCasterTest.php"
77 line: "64 to 64"
78 }
79 EOTXT
80 , $var
81 );
82 }
83
84 public function testReflectionParameter()
85 {
86 $var = new \ReflectionParameter(__NAMESPACE__.'\reflectionParameterFixture', 0);
87
88 $this->assertDumpMatchesFormat(
89 <<<'EOTXT'
90 ReflectionParameter {
91 +name: "arg1"
92 position: 0
93 typeHint: "Symfony\Component\VarDumper\Tests\Fixtures\NotLoadableClass"
94 default: null
95 }
96 EOTXT
97 , $var
98 );
99 }
100
101 /**
102 * @requires PHP 7.0
103 */
104 public function testReflectionParameterScalar()
105 {
106 $f = eval('return function (int $a) {};');
107 $var = new \ReflectionParameter($f, 0);
108
109 $this->assertDumpMatchesFormat(
110 <<<'EOTXT'
111 ReflectionParameter {
112 +name: "a"
113 position: 0
114 typeHint: "int"
115 }
116 EOTXT
117 , $var
118 );
119 }
120
121 /**
122 * @requires PHP 7.0
123 */
124 public function testReturnType()
125 {
126 $f = eval('return function ():int {};');
127 $line = __LINE__ - 1;
128
129 $this->assertDumpMatchesFormat(
130 <<<EOTXT
131 Closure {
132 returnType: "int"
133 class: "Symfony\Component\VarDumper\Tests\Caster\ReflectionCasterTest"
134 this: Symfony\Component\VarDumper\Tests\Caster\ReflectionCasterTest { …}
135 file: "%sReflectionCasterTest.php($line) : eval()'d code"
136 line: "1 to 1"
137 }
138 EOTXT
139 , $f
140 );
141 }
142
143 /**
144 * @requires PHP 7.0
145 */
146 public function testGenerator()
147 {
148 if (\extension_loaded('xdebug')) {
149 $this->markTestSkipped('xdebug is active');
150 }
151
152 $generator = new GeneratorDemo();
153 $generator = $generator->baz();
154
155 $expectedDump = <<<'EODUMP'
156 Generator {
157 this: Symfony\Component\VarDumper\Tests\Fixtures\GeneratorDemo { …}
158 executing: {
159 Symfony\Component\VarDumper\Tests\Fixtures\GeneratorDemo->baz(): {
160 %sGeneratorDemo.php:14: """
161 {\n
162 yield from bar();\n
163 }\n
164 """
165 }
166 }
167 closed: false
168 }
169 EODUMP;
170
171 $this->assertDumpMatchesFormat($expectedDump, $generator);
172
173 foreach ($generator as $v) {
174 break;
175 }
176
177 $expectedDump = <<<'EODUMP'
178 array:2 [
179 0 => ReflectionGenerator {
180 this: Symfony\Component\VarDumper\Tests\Fixtures\GeneratorDemo { …}
181 trace: {
182 3. Symfony\Component\VarDumper\Tests\Fixtures\GeneratorDemo::foo() ==> yield(): {
183 src: {
184 %sGeneratorDemo.php:9: """
185 {\n
186 yield 1;\n
187 }\n
188 """
189 }
190 }
191 2. Symfony\Component\VarDumper\Tests\Fixtures\bar() ==> Symfony\Component\VarDumper\Tests\Fixtures\GeneratorDemo::foo(): {
192 src: {
193 %sGeneratorDemo.php:20: """
194 {\n
195 yield from GeneratorDemo::foo();\n
196 }\n
197 """
198 }
199 }
200 1. Symfony\Component\VarDumper\Tests\Fixtures\GeneratorDemo->baz() ==> Symfony\Component\VarDumper\Tests\Fixtures\bar(): {
201 src: {
202 %sGeneratorDemo.php:14: """
203 {\n
204 yield from bar();\n
205 }\n
206 """
207 }
208 }
209 }
210 closed: false
211 }
212 1 => Generator {
213 executing: {
214 Symfony\Component\VarDumper\Tests\Fixtures\GeneratorDemo::foo(): {
215 %sGeneratorDemo.php:10: """
216 yield 1;\n
217 }\n
218 \n
219 """
220 }
221 }
222 closed: false
223 }
224 ]
225 EODUMP;
226
227 $r = new \ReflectionGenerator($generator);
228 $this->assertDumpMatchesFormat($expectedDump, array($r, $r->getExecutingGenerator()));
229
230 foreach ($generator as $v) {
231 }
232
233 $expectedDump = <<<'EODUMP'
234 Generator {
235 closed: true
236 }
237 EODUMP;
238 $this->assertDumpMatchesFormat($expectedDump, $generator);
239 }
240 }
241
242 function reflectionParameterFixture(NotLoadableClass $arg1 = null, $arg2)
243 {
244 }
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\Component\VarDumper\Tests\Caster;
13
14 use Symfony\Component\VarDumper\Test\VarDumperTestCase;
15
16 /**
17 * @author Grégoire Pineau <lyrixx@lyrixx.info>
18 */
19 class SplCasterTest extends VarDumperTestCase
20 {
21 public function getCastFileInfoTests()
22 {
23 return array(
24 array(__FILE__, <<<'EOTXT'
25 SplFileInfo {
26 %Apath: "%sCaster"
27 filename: "SplCasterTest.php"
28 basename: "SplCasterTest.php"
29 pathname: "%sSplCasterTest.php"
30 extension: "php"
31 realPath: "%sSplCasterTest.php"
32 aTime: %s-%s-%d %d:%d:%d
33 mTime: %s-%s-%d %d:%d:%d
34 cTime: %s-%s-%d %d:%d:%d
35 inode: %d
36 size: %d
37 perms: 0%d
38 owner: %d
39 group: %d
40 type: "file"
41 writable: true
42 readable: true
43 executable: false
44 file: true
45 dir: false
46 link: false
47 %A}
48 EOTXT
49 ),
50 array('https://google.com/about', <<<'EOTXT'
51 SplFileInfo {
52 %Apath: "https://google.com"
53 filename: "about"
54 basename: "about"
55 pathname: "https://google.com/about"
56 extension: ""
57 realPath: false
58 %A}
59 EOTXT
60 ),
61 );
62 }
63
64 /** @dataProvider getCastFileInfoTests */
65 public function testCastFileInfo($file, $dump)
66 {
67 $this->assertDumpMatchesFormat($dump, new \SplFileInfo($file));
68 }
69
70 public function testCastFileObject()
71 {
72 $var = new \SplFileObject(__FILE__);
73 $var->setFlags(\SplFileObject::DROP_NEW_LINE | \SplFileObject::SKIP_EMPTY);
74 $dump = <<<'EOTXT'
75 SplFileObject {
76 %Apath: "%sCaster"
77 filename: "SplCasterTest.php"
78 basename: "SplCasterTest.php"
79 pathname: "%sSplCasterTest.php"
80 extension: "php"
81 realPath: "%sSplCasterTest.php"
82 aTime: %s-%s-%d %d:%d:%d
83 mTime: %s-%s-%d %d:%d:%d
84 cTime: %s-%s-%d %d:%d:%d
85 inode: %d
86 size: %d
87 perms: 0%d
88 owner: %d
89 group: %d
90 type: "file"
91 writable: true
92 readable: true
93 executable: false
94 file: true
95 dir: false
96 link: false
97 %AcsvControl: array:%d [
98 0 => ","
99 1 => """
100 %A]
101 flags: DROP_NEW_LINE|SKIP_EMPTY
102 maxLineLen: 0
103 fstat: array:26 [
104 "dev" => %d
105 "ino" => %d
106 "nlink" => %d
107 "rdev" => 0
108 "blksize" => %i
109 "blocks" => %i
110 …20
111 ]
112 eof: false
113 key: 0
114 }
115 EOTXT;
116 $this->assertDumpMatchesFormat($dump, $var);
117 }
118
119 /**
120 * @dataProvider provideCastSplDoublyLinkedList
121 */
122 public function testCastSplDoublyLinkedList($modeValue, $modeDump)
123 {
124 $var = new \SplDoublyLinkedList();
125 $var->setIteratorMode($modeValue);
126 $dump = <<<EOTXT
127 SplDoublyLinkedList {
128 %Amode: $modeDump
129 dllist: []
130 }
131 EOTXT;
132 $this->assertDumpMatchesFormat($dump, $var);
133 }
134
135 public function provideCastSplDoublyLinkedList()
136 {
137 return array(
138 array(\SplDoublyLinkedList::IT_MODE_FIFO, 'IT_MODE_FIFO | IT_MODE_KEEP'),
139 array(\SplDoublyLinkedList::IT_MODE_LIFO, 'IT_MODE_LIFO | IT_MODE_KEEP'),
140 array(\SplDoublyLinkedList::IT_MODE_FIFO | \SplDoublyLinkedList::IT_MODE_DELETE, 'IT_MODE_FIFO | IT_MODE_DELETE'),
141 array(\SplDoublyLinkedList::IT_MODE_LIFO | \SplDoublyLinkedList::IT_MODE_DELETE, 'IT_MODE_LIFO | IT_MODE_DELETE'),
142 );
143 }
144
145 public function testCastObjectStorageIsntModified()
146 {
147 $var = new \SplObjectStorage();
148 $var->attach(new \stdClass());
149 $var->rewind();
150 $current = $var->current();
151
152 $this->assertDumpMatchesFormat('%A', $var);
153 $this->assertSame($current, $var->current());
154 }
155
156 public function testCastObjectStorageDumpsInfo()
157 {
158 $var = new \SplObjectStorage();
159 $var->attach(new \stdClass(), new \DateTime());
160
161 $this->assertDumpMatchesFormat('%ADateTime%A', $var);
162 }
163
164 public function testCastArrayObject()
165 {
166 if (\defined('HHVM_VERSION')) {
167 $this->markTestSkipped('HHVM as different internal details.');
168 }
169 $var = new \ArrayObject(array(123));
170 $var->foo = 234;
171
172 $expected = <<<EOTXT
173 ArrayObject {
174 +"foo": 234
175 flag::STD_PROP_LIST: false
176 flag::ARRAY_AS_PROPS: false
177 iteratorClass: "ArrayIterator"
178 storage: array:1 [
179 0 => 123
180 ]
181 }
182 EOTXT;
183 $this->assertDumpEquals($expected, $var);
184 }
185
186 public function testArrayIterator()
187 {
188 if (\defined('HHVM_VERSION')) {
189 $this->markTestSkipped('HHVM as different internal details.');
190 }
191 $var = new MyArrayIterator(array(234));
192
193 $expected = <<<EOTXT
194 Symfony\Component\VarDumper\Tests\Caster\MyArrayIterator {
195 -foo: 123
196 flag::STD_PROP_LIST: false
197 flag::ARRAY_AS_PROPS: false
198 storage: array:1 [
199 0 => 234
200 ]
201 }
202 EOTXT;
203 $this->assertDumpEquals($expected, $var);
204 }
205 }
206
207 class MyArrayIterator extends \ArrayIterator
208 {
209 private $foo = 123;
210 }
1 <?php
2
3 namespace Symfony\Component\VarDumper\Tests\Fixtures;
4
5 class GeneratorDemo
6 {
7 public static function foo()
8 {
9 yield 1;
10 }
11
12 public function baz()
13 {
14 yield from bar();
15 }
16 }
17
18 function bar()
19 {
20 yield from GeneratorDemo::foo();
21 }
1 <?php
2
3 namespace Symfony\Component\VarDumper\Tests\Fixtures;
4
5 class NotLoadableClass extends NotLoadableClass
6 {
7 }
1 <?php
2
3 /* foo.twig */
4 class __TwigTemplate_VarDumperFixture_u75a09 extends Twig\Template
5 {
6 private $filename;
7
8 public function __construct(Twig\Environment $env = null, $filename = null)
9 {
10 if (null !== $env) {
11 parent::__construct($env);
12 }
13 $this->parent = false;
14 $this->blocks = array();
15 $this->filename = $filename;
16 }
17
18 protected function doDisplay(array $context, array $blocks = array())
19 {
20 // line 2
21 throw new \Exception('Foobar');
22 }
23
24 public function getTemplateName()
25 {
26 return 'foo.twig';
27 }
28
29 public function getDebugInfo()
30 {
31 return array(21 => 2);
32 }
33
34 public function getSourceContext()
35 {
36 return new Twig\Source(" foo bar\n twig source\n\n", 'foo.twig', false === $this->filename ? null : ($this->filename ?: 'bar.twig'));
37 }
38 }
1 <?php
2
3 namespace Symfony\Component\VarDumper\Tests\Fixture;
4
5 if (!class_exists('Symfony\Component\VarDumper\Tests\Fixture\DumbFoo')) {
6 class DumbFoo
7 {
8 public $foo = 'foo';
9 }
10 }
11
12 $foo = new DumbFoo();
13 $foo->bar = 'bar';
14
15 $g = fopen(__FILE__, 'r');
16
17 $var = array(
18 'number' => 1, null,
19 'const' => 1.1, true, false, NAN, INF, -INF, PHP_INT_MAX,
20 'str' => "déjà\n", "\xE9\x00",
21 '[]' => array(),
22 'res' => $g,
23 'obj' => $foo,
24 'closure' => function ($a, \PDO &$b = null) {},
25 'line' => __LINE__ - 1,
26 'nobj' => array((object) array()),
27 );
28
29 $r = array();
30 $r[] = &$r;
31
32 $var['recurs'] = &$r;
33 $var[] = &$var[0];
34 $var['sobj'] = $var['obj'];
35 $var['snobj'] = &$var['nobj'][0];
36 $var['snobj2'] = $var['nobj'][0];
37 $var['file'] = __FILE__;
38 $var["bin-key-\xE9"] = '';
39
40 unset($g, $r);
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\Component\VarDumper\Tests;
13
14 use PHPUnit\Framework\TestCase;
15 use Symfony\Component\VarDumper\Cloner\VarCloner;
16 use Symfony\Component\VarDumper\Dumper\HtmlDumper;
17
18 /**
19 * @author Nicolas Grekas <p@tchwork.com>
20 */
21 class HtmlDumperTest extends TestCase
22 {
23 public function testGet()
24 {
25 require __DIR__.'/Fixtures/dumb-var.php';
26
27 $dumper = new HtmlDumper('php://output');
28 $dumper->setDumpHeader('<foo></foo>');
29 $dumper->setDumpBoundaries('<bar>', '</bar>');
30 $cloner = new VarCloner();
31 $cloner->addCasters(array(
32 ':stream' => function ($res, $a) {
33 unset($a['uri'], $a['wrapper_data']);
34
35 return $a;
36 },
37 ));
38 $data = $cloner->cloneVar($var);
39
40 ob_start();
41 $dumper->dump($data);
42 $out = ob_get_clean();
43 $out = preg_replace('/[ \t]+$/m', '', $out);
44 $var['file'] = htmlspecialchars($var['file'], ENT_QUOTES, 'UTF-8');
45 $intMax = PHP_INT_MAX;
46 preg_match('/sf-dump-\d+/', $out, $dumpId);
47 $dumpId = $dumpId[0];
48 $res = (int) $var['res'];
49 $closure54 = '';
50 $r = \defined('HHVM_VERSION') ? '' : '<a class=sf-dump-ref>#%d</a>';
51
52 if (\PHP_VERSION_ID >= 50400) {
53 $closure54 = <<<EOTXT
54
55 <span class=sf-dump-meta>class</span>: "<span class=sf-dump-str title="48 characters">Symfony\Component\VarDumper\Tests\HtmlDumperTest</span>"
56 <span class=sf-dump-meta>this</span>: <abbr title="Symfony\Component\VarDumper\Tests\HtmlDumperTest" class=sf-dump-note>HtmlDumperTest</abbr> {{$r} &%s;}
57 EOTXT;
58 }
59
60 $this->assertStringMatchesFormat(
61 <<<EOTXT
62 <foo></foo><bar><span class=sf-dump-note>array:24</span> [<samp>
63 "<span class=sf-dump-key>number</span>" => <span class=sf-dump-num>1</span>
64 <span class=sf-dump-key>0</span> => <a class=sf-dump-ref href=#{$dumpId}-ref01 title="2 occurrences">&amp;1</a> <span class=sf-dump-const>null</span>
65 "<span class=sf-dump-key>const</span>" => <span class=sf-dump-num>1.1</span>
66 <span class=sf-dump-key>1</span> => <span class=sf-dump-const>true</span>
67 <span class=sf-dump-key>2</span> => <span class=sf-dump-const>false</span>
68 <span class=sf-dump-key>3</span> => <span class=sf-dump-num>NAN</span>
69 <span class=sf-dump-key>4</span> => <span class=sf-dump-num>INF</span>
70 <span class=sf-dump-key>5</span> => <span class=sf-dump-num>-INF</span>
71 <span class=sf-dump-key>6</span> => <span class=sf-dump-num>{$intMax}</span>
72 "<span class=sf-dump-key>str</span>" => "<span class=sf-dump-str title="5 characters">d&%s;j&%s;</span>\\n"
73 <span class=sf-dump-key>7</span> => b"<span class=sf-dump-str title="2 binary or non-UTF-8 characters">&%s;</span>\\x00"
74 "<span class=sf-dump-key>[]</span>" => []
75 "<span class=sf-dump-key>res</span>" => <span class=sf-dump-note>stream resource</span> <a class=sf-dump-ref>@{$res}</a><samp>
76 %A <span class=sf-dump-meta>wrapper_type</span>: "<span class=sf-dump-str title="9 characters">plainfile</span>"
77 <span class=sf-dump-meta>stream_type</span>: "<span class=sf-dump-str title="5 characters">STDIO</span>"
78 <span class=sf-dump-meta>mode</span>: "<span class=sf-dump-str>r</span>"
79 <span class=sf-dump-meta>unread_bytes</span>: <span class=sf-dump-num>0</span>
80 <span class=sf-dump-meta>seekable</span>: <span class=sf-dump-const>true</span>
81 %A <span class=sf-dump-meta>options</span>: []
82 </samp>}
83 "<span class=sf-dump-key>obj</span>" => <abbr title="Symfony\Component\VarDumper\Tests\Fixture\DumbFoo" class=sf-dump-note>DumbFoo</abbr> {<a class=sf-dump-ref href=#{$dumpId}-ref2%d title="2 occurrences">#%d</a><samp id={$dumpId}-ref2%d>
84 +<span class=sf-dump-public title="Public property">foo</span>: "<span class=sf-dump-str title="3 characters">foo</span>"
85 +"<span class=sf-dump-public title="Runtime added dynamic property">bar</span>": "<span class=sf-dump-str title="3 characters">bar</span>"
86 </samp>}
87 "<span class=sf-dump-key>closure</span>" => <span class=sf-dump-note>Closure</span> {{$r}<samp>{$closure54}
88 <span class=sf-dump-meta>parameters</span>: {<samp>
89 <span class=sf-dump-meta>\$a</span>: {}
90 <span class=sf-dump-meta>&amp;\$b</span>: {<samp>
91 <span class=sf-dump-meta>typeHint</span>: "<span class=sf-dump-str title="3 characters">PDO</span>"
92 <span class=sf-dump-meta>default</span>: <span class=sf-dump-const>null</span>
93 </samp>}
94 </samp>}
95 <span class=sf-dump-meta>file</span>: "<span class=sf-dump-str title="%d characters">{$var['file']}</span>"
96 <span class=sf-dump-meta>line</span>: "<span class=sf-dump-str title="%d characters">{$var['line']} to {$var['line']}</span>"
97 </samp>}
98 "<span class=sf-dump-key>line</span>" => <span class=sf-dump-num>{$var['line']}</span>
99 "<span class=sf-dump-key>nobj</span>" => <span class=sf-dump-note>array:1</span> [<samp>
100 <span class=sf-dump-index>0</span> => <a class=sf-dump-ref href=#{$dumpId}-ref03 title="2 occurrences">&amp;3</a> {<a class=sf-dump-ref href=#{$dumpId}-ref2%d title="3 occurrences">#%d</a>}
101 </samp>]
102 "<span class=sf-dump-key>recurs</span>" => <a class=sf-dump-ref href=#{$dumpId}-ref04 title="2 occurrences">&amp;4</a> <span class=sf-dump-note>array:1</span> [<samp id={$dumpId}-ref04>
103 <span class=sf-dump-index>0</span> => <a class=sf-dump-ref href=#{$dumpId}-ref04 title="2 occurrences">&amp;4</a> <span class=sf-dump-note>array:1</span> [<a class=sf-dump-ref href=#{$dumpId}-ref04 title="2 occurrences">&amp;4</a>]
104 </samp>]
105 <span class=sf-dump-key>8</span> => <a class=sf-dump-ref href=#{$dumpId}-ref01 title="2 occurrences">&amp;1</a> <span class=sf-dump-const>null</span>
106 "<span class=sf-dump-key>sobj</span>" => <abbr title="Symfony\Component\VarDumper\Tests\Fixture\DumbFoo" class=sf-dump-note>DumbFoo</abbr> {<a class=sf-dump-ref href=#{$dumpId}-ref2%d title="2 occurrences">#%d</a>}
107 "<span class=sf-dump-key>snobj</span>" => <a class=sf-dump-ref href=#{$dumpId}-ref03 title="2 occurrences">&amp;3</a> {<a class=sf-dump-ref href=#{$dumpId}-ref2%d title="3 occurrences">#%d</a>}
108 "<span class=sf-dump-key>snobj2</span>" => {<a class=sf-dump-ref href=#{$dumpId}-ref2%d title="3 occurrences">#%d</a>}
109 "<span class=sf-dump-key>file</span>" => "<span class=sf-dump-str title="%d characters">{$var['file']}</span>"
110 b"<span class=sf-dump-key>bin-key-&%s;</span>" => ""
111 </samp>]
112 </bar>
113
114 EOTXT
115 ,
116
117 $out
118 );
119 }
120
121 public function testCharset()
122 {
123 $var = mb_convert_encoding('Словарь', 'CP1251', 'UTF-8');
124
125 $dumper = new HtmlDumper('php://output', 'CP1251');
126 $dumper->setDumpHeader('<foo></foo>');
127 $dumper->setDumpBoundaries('<bar>', '</bar>');
128 $cloner = new VarCloner();
129
130 $data = $cloner->cloneVar($var);
131 $out = fopen('php://memory', 'r+b');
132 $dumper->dump($data, $out);
133 $out = stream_get_contents($out, -1, 0);
134
135 $this->assertStringMatchesFormat(
136 <<<'EOTXT'
137 <foo></foo><bar>b"<span class=sf-dump-str title="7 binary or non-UTF-8 characters">&#1057;&#1083;&#1086;&#1074;&#1072;&#1088;&#1100;</span>"
138 </bar>
139
140 EOTXT
141 ,
142 $out
143 );
144 }
145
146 public function testAppend()
147 {
148 $out = fopen('php://memory', 'r+b');
149
150 $dumper = new HtmlDumper();
151 $dumper->setDumpHeader('<foo></foo>');
152 $dumper->setDumpBoundaries('<bar>', '</bar>');
153 $cloner = new VarCloner();
154
155 $dumper->dump($cloner->cloneVar(123), $out);
156 $dumper->dump($cloner->cloneVar(456), $out);
157
158 $out = stream_get_contents($out, -1, 0);
159
160 $this->assertSame(<<<'EOTXT'
161 <foo></foo><bar><span class=sf-dump-num>123</span>
162 </bar>
163 <bar><span class=sf-dump-num>456</span>
164 </bar>
165
166 EOTXT
167 ,
168 $out
169 );
170 }
171 }
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\Component\VarDumper\Tests\Test;
13
14 use Symfony\Component\VarDumper\Test\VarDumperTestCase;
15 use Symfony\Component\VarDumper\Test\VarDumperTestTrait;
16
17 class VarDumperTestTraitRequire54 extends VarDumperTestCase
18 {
19 use VarDumperTestTrait;
20
21 public function testItComparesLargeData()
22 {
23 $howMany = 700;
24 $data = array_fill_keys(range(0, $howMany), array('a', 'b', 'c', 'd'));
25
26 $expected = sprintf("array:%d [\n", $howMany + 1);
27 for ($i = 0; $i <= $howMany; ++$i) {
28 $expected .= <<<EODUMP
29 $i => array:4 [
30 0 => "a"
31 1 => "b"
32 2 => "c"
33 3 => "d"
34 ]\n
35 EODUMP;
36 }
37 $expected .= "]\n";
38
39 $this->assertDumpEquals($expected, $data);
40 }
41 }
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 // Skipping trait tests for PHP < 5.4
13 if (\PHP_VERSION_ID >= 50400) {
14 require __DIR__.'/VarDumperTestTraitRequire54.php';
15 }
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\Component\VarDumper\Tests;
13
14 use PHPUnit\Framework\TestCase;
15 use Symfony\Component\VarDumper\Cloner\VarCloner;
16
17 /**
18 * @author Nicolas Grekas <p@tchwork.com>
19 */
20 class VarClonerTest extends TestCase
21 {
22 public function testMaxIntBoundary()
23 {
24 $data = array(PHP_INT_MAX => 123);
25
26 $cloner = new VarCloner();
27 $clone = $cloner->cloneVar($data);
28
29 $expected = <<<EOTXT
30 Symfony\Component\VarDumper\Cloner\Data Object
31 (
32 [data:Symfony\Component\VarDumper\Cloner\Data:private] => Array
33 (
34 [0] => Array
35 (
36 [0] => Symfony\Component\VarDumper\Cloner\Stub Object
37 (
38 [type] => array
39 [class] => assoc
40 [value] => 1
41 [cut] => 0
42 [handle] => 0
43 [refCount] => 0
44 [position] => 1
45 )
46
47 )
48
49 [1] => Array
50 (
51 [%s] => 123
52 )
53
54 )
55
56 [maxDepth:Symfony\Component\VarDumper\Cloner\Data:private] => 20
57 [maxItemsPerDepth:Symfony\Component\VarDumper\Cloner\Data:private] => -1
58 [useRefHandles:Symfony\Component\VarDumper\Cloner\Data:private] => -1
59 )
60
61 EOTXT;
62 $this->assertSame(sprintf($expected, PHP_INT_MAX), print_r($clone, true));
63 }
64
65 public function testClone()
66 {
67 $json = json_decode('{"1":{"var":"val"},"2":{"var":"val"}}');
68
69 $cloner = new VarCloner();
70 $clone = $cloner->cloneVar($json);
71
72 $expected = <<<EOTXT
73 Symfony\Component\VarDumper\Cloner\Data Object
74 (
75 [data:Symfony\Component\VarDumper\Cloner\Data:private] => Array
76 (
77 [0] => Array
78 (
79 [0] => Symfony\Component\VarDumper\Cloner\Stub Object
80 (
81 [type] => object
82 [class] => stdClass
83 [value] =>
84 [cut] => 0
85 [handle] => %i
86 [refCount] => 0
87 [position] => 1
88 )
89
90 )
91
92 [1] => Array
93 (
94 [\000+\0001] => Symfony\Component\VarDumper\Cloner\Stub Object
95 (
96 [type] => object
97 [class] => stdClass
98 [value] =>
99 [cut] => 0
100 [handle] => %i
101 [refCount] => 0
102 [position] => 2
103 )
104
105 [\000+\0002] => Symfony\Component\VarDumper\Cloner\Stub Object
106 (
107 [type] => object
108 [class] => stdClass
109 [value] =>
110 [cut] => 0
111 [handle] => %i
112 [refCount] => 0
113 [position] => 3
114 )
115
116 )
117
118 [2] => Array
119 (
120 [\000+\000var] => val
121 )
122
123 [3] => Array
124 (
125 [\000+\000var] => val
126 )
127
128 )
129
130 [maxDepth:Symfony\Component\VarDumper\Cloner\Data:private] => 20
131 [maxItemsPerDepth:Symfony\Component\VarDumper\Cloner\Data:private] => -1
132 [useRefHandles:Symfony\Component\VarDumper\Cloner\Data:private] => -1
133 )
134
135 EOTXT;
136 $this->assertStringMatchesFormat($expected, print_r($clone, true));
137 }
138
139 public function testJsonCast()
140 {
141 if (2 == ini_get('xdebug.overload_var_dump')) {
142 $this->markTestSkipped('xdebug is active');
143 }
144
145 $data = (array) json_decode('{"1":{}}');
146
147 $cloner = new VarCloner();
148 $clone = $cloner->cloneVar($data);
149
150 $expected = <<<'EOTXT'
151 object(Symfony\Component\VarDumper\Cloner\Data)#%i (4) {
152 ["data":"Symfony\Component\VarDumper\Cloner\Data":private]=>
153 array(2) {
154 [0]=>
155 array(1) {
156 [0]=>
157 object(Symfony\Component\VarDumper\Cloner\Stub)#%i (7) {
158 ["type"]=>
159 string(5) "array"
160 ["class"]=>
161 string(5) "assoc"
162 ["value"]=>
163 int(1)
164 ["cut"]=>
165 int(0)
166 ["handle"]=>
167 int(0)
168 ["refCount"]=>
169 int(0)
170 ["position"]=>
171 int(1)
172 }
173 }
174 [1]=>
175 array(1) {
176 ["1"]=>
177 object(Symfony\Component\VarDumper\Cloner\Stub)#%i (7) {
178 ["type"]=>
179 string(6) "object"
180 ["class"]=>
181 string(8) "stdClass"
182 ["value"]=>
183 NULL
184 ["cut"]=>
185 int(0)
186 ["handle"]=>
187 int(%i)
188 ["refCount"]=>
189 int(0)
190 ["position"]=>
191 int(0)
192 }
193 }
194 }
195 ["maxDepth":"Symfony\Component\VarDumper\Cloner\Data":private]=>
196 int(20)
197 ["maxItemsPerDepth":"Symfony\Component\VarDumper\Cloner\Data":private]=>
198 int(-1)
199 ["useRefHandles":"Symfony\Component\VarDumper\Cloner\Data":private]=>
200 int(-1)
201 }
202
203 EOTXT;
204 ob_start();
205 var_dump($clone);
206 $this->assertStringMatchesFormat(\PHP_VERSION_ID >= 70200 ? str_replace('"1"', '1', $expected) : $expected, ob_get_clean());
207 }
208
209 public function testCaster()
210 {
211 $cloner = new VarCloner(array(
212 '*' => function ($obj, $array) {
213 return array('foo' => 123);
214 },
215 __CLASS__ => function ($obj, $array) {
216 ++$array['foo'];
217
218 return $array;
219 },
220 ));
221 $clone = $cloner->cloneVar($this);
222
223 $expected = <<<EOTXT
224 Symfony\Component\VarDumper\Cloner\Data Object
225 (
226 [data:Symfony\Component\VarDumper\Cloner\Data:private] => Array
227 (
228 [0] => Array
229 (
230 [0] => Symfony\Component\VarDumper\Cloner\Stub Object
231 (
232 [type] => object
233 [class] => %s
234 [value] =>
235 [cut] => 0
236 [handle] => %i
237 [refCount] => 0
238 [position] => 1
239 )
240
241 )
242
243 [1] => Array
244 (
245 [foo] => 124
246 )
247
248 )
249
250 [maxDepth:Symfony\Component\VarDumper\Cloner\Data:private] => 20
251 [maxItemsPerDepth:Symfony\Component\VarDumper\Cloner\Data:private] => -1
252 [useRefHandles:Symfony\Component\VarDumper\Cloner\Data:private] => -1
253 )
254
255 EOTXT;
256 $this->assertStringMatchesFormat($expected, print_r($clone, true));
257 }
258 }
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
No preview for this file type
No preview for this file type
This diff could not be displayed because it is too large.
No preview for this file type
No preview for this file type
This diff could not be displayed because it is too large.
No preview for this file type
No preview for this file type
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.