Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 170a802

Browse filesBrowse files
committed
Add generic types to traversable implementations
Signed-off-by: Alexander M. Turek <me@derrabus.de>
1 parent c0e7f09 commit 170a802
Copy full SHA for 170a802

File tree

80 files changed

+224
-117
lines changed
Filter options

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Dismiss banner

80 files changed

+224
-117
lines changed

‎src/Symfony/Bridge/Doctrine/SchemaListener/MessengerTransportDoctrineSchemaSubscriber.php

Copy file name to clipboardExpand all lines: src/Symfony/Bridge/Doctrine/SchemaListener/MessengerTransportDoctrineSchemaSubscriber.php
+1-1Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ final class MessengerTransportDoctrineSchemaSubscriber implements EventSubscribe
3131
private $transports;
3232

3333
/**
34-
* @param iterable|TransportInterface[] $transports
34+
* @param iterable<int, TransportInterface> $transports
3535
*/
3636
public function __construct(iterable $transports)
3737
{

‎src/Symfony/Bridge/Doctrine/SchemaListener/PdoCacheAdapterDoctrineSchemaSubscriber.php

Copy file name to clipboardExpand all lines: src/Symfony/Bridge/Doctrine/SchemaListener/PdoCacheAdapterDoctrineSchemaSubscriber.php
+1-1Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ final class PdoCacheAdapterDoctrineSchemaSubscriber implements EventSubscriber
2626
private $pdoAdapters;
2727

2828
/**
29-
* @param iterable|PdoAdapter[] $pdoAdapters
29+
* @param iterable<int, PdoAdapter> $pdoAdapters
3030
*/
3131
public function __construct(iterable $pdoAdapters)
3232
{

‎src/Symfony/Bridge/Doctrine/SchemaListener/RememberMeTokenProviderDoctrineSchemaSubscriber.php

Copy file name to clipboardExpand all lines: src/Symfony/Bridge/Doctrine/SchemaListener/RememberMeTokenProviderDoctrineSchemaSubscriber.php
+1-1Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ final class RememberMeTokenProviderDoctrineSchemaSubscriber implements EventSubs
2828
private $rememberMeHandlers;
2929

3030
/**
31-
* @param iterable|RememberMeHandlerInterface[] $rememberMeHandlers
31+
* @param iterable<int, RememberMeHandlerInterface> $rememberMeHandlers
3232
*/
3333
public function __construct(iterable $rememberMeHandlers)
3434
{

‎src/Symfony/Bundle/FrameworkBundle/Command/CachePoolPruneCommand.php

Copy file name to clipboardExpand all lines: src/Symfony/Bundle/FrameworkBundle/Command/CachePoolPruneCommand.php
+1-1Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ final class CachePoolPruneCommand extends Command
3030
private $pools;
3131

3232
/**
33-
* @param iterable|PruneableInterface[] $pools
33+
* @param iterable<string, PruneableInterface> $pools
3434
*/
3535
public function __construct(iterable $pools)
3636
{

‎src/Symfony/Bundle/SecurityBundle/CacheWarmer/ExpressionCacheWarmer.php

Copy file name to clipboardExpand all lines: src/Symfony/Bundle/SecurityBundle/CacheWarmer/ExpressionCacheWarmer.php
+1-1Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class ExpressionCacheWarmer implements CacheWarmerInterface
2121
private $expressionLanguage;
2222

2323
/**
24-
* @param iterable|Expression[] $expressions
24+
* @param iterable<int, Expression> $expressions
2525
*/
2626
public function __construct(iterable $expressions, ExpressionLanguage $expressionLanguage)
2727
{

‎src/Symfony/Bundle/SecurityBundle/DependencyInjection/MainConfiguration.php

Copy file name to clipboardExpand all lines: src/Symfony/Bundle/SecurityBundle/DependencyInjection/MainConfiguration.php
+4-1Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ class MainConfiguration implements ConfigurationInterface
3434
private $userProviderFactories;
3535

3636
/**
37-
* @param (SecurityFactoryInterface|AuthenticatorFactoryInterface)[] $factories
37+
* @param array<int, SecurityFactoryInterface|AuthenticatorFactoryInterface> $factories
3838
*/
3939
public function __construct(array $factories, array $userProviderFactories)
4040
{
@@ -198,6 +198,9 @@ private function addAccessControlSection(ArrayNodeDefinition $rootNode)
198198
;
199199
}
200200

201+
/**
202+
* @param array<int, SecurityFactoryInterface|AuthenticatorFactoryInterface> $factories
203+
*/
201204
private function addFirewallsSection(ArrayNodeDefinition $rootNode, array $factories)
202205
{
203206
$firewallNodeBuilder = $rootNode

‎src/Symfony/Bundle/TwigBundle/TemplateIterator.php

Copy file name to clipboardExpand all lines: src/Symfony/Bundle/TwigBundle/TemplateIterator.php
+2Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
* @author Fabien Potencier <fabien@symfony.com>
2121
*
2222
* @internal
23+
*
24+
* @implements \IteratorAggregate<int, string>
2325
*/
2426
class TemplateIterator implements \IteratorAggregate
2527
{

‎src/Symfony/Component/Cache/Adapter/AdapterInterface.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/Cache/Adapter/AdapterInterface.php
+1-1Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public function getItem($key);
3434
/**
3535
* {@inheritdoc}
3636
*
37-
* @return \Traversable|CacheItem[]
37+
* @return \Traversable<string, CacheItem>
3838
*/
3939
public function getItems(array $keys = []);
4040

‎src/Symfony/Component/Config/Resource/GlobResource.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/Config/Resource/GlobResource.php
+2Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
* @author Nicolas Grekas <p@tchwork.com>
2323
*
2424
* @final
25+
*
26+
* @implements \IteratorAggregate<string, \SplFileInfo>
2527
*/
2628
class GlobResource implements \IteratorAggregate, SelfCheckingResourceInterface
2729
{

‎src/Symfony/Component/Config/ResourceCheckerConfigCache.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/Config/ResourceCheckerConfigCache.php
+3-4Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,13 @@ class ResourceCheckerConfigCache implements ConfigCacheInterface
2929
private $file;
3030

3131
/**
32-
* @var iterable|ResourceCheckerInterface[]
32+
* @var iterable<int, ResourceCheckerInterface>
3333
*/
3434
private $resourceCheckers;
3535

3636
/**
37-
* @param string $file The absolute cache path
38-
* @param iterable|ResourceCheckerInterface[] $resourceCheckers The ResourceCheckers to use for the freshness check
37+
* @param string $file The absolute cache path
38+
* @param iterable<int, ResourceCheckerInterface> $resourceCheckers The ResourceCheckers to use for the freshness check
3939
*/
4040
public function __construct(string $file, iterable $resourceCheckers = [])
4141
{
@@ -91,7 +91,6 @@ public function isFresh()
9191
$time = filemtime($this->file);
9292

9393
foreach ($meta as $resource) {
94-
/* @var ResourceInterface $resource */
9594
foreach ($this->resourceCheckers as $checker) {
9695
if (!$checker->supports($resource)) {
9796
continue; // next checker

‎src/Symfony/Component/Config/ResourceCheckerConfigCacheFactory.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/Config/ResourceCheckerConfigCacheFactory.php
+1-1Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ class ResourceCheckerConfigCacheFactory implements ConfigCacheFactoryInterface
2222
private $resourceCheckers = [];
2323

2424
/**
25-
* @param iterable|ResourceCheckerInterface[] $resourceCheckers
25+
* @param iterable<int, ResourceCheckerInterface> $resourceCheckers
2626
*/
2727
public function __construct(iterable $resourceCheckers = [])
2828
{

‎src/Symfony/Component/Console/Helper/HelperSet.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/Console/Helper/HelperSet.php
+3-1Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
* HelperSet represents a set of helpers to be used with a command.
1919
*
2020
* @author Fabien Potencier <fabien@symfony.com>
21+
*
22+
* @implements \IteratorAggregate<string, Helper>
2123
*/
2224
class HelperSet implements \IteratorAggregate
2325
{
@@ -89,7 +91,7 @@ public function getCommand()
8991
}
9092

9193
/**
92-
* @return \Traversable<Helper>
94+
* @return \Traversable<string, Helper>
9395
*/
9496
#[\ReturnTypeWillChange]
9597
public function getIterator()

‎src/Symfony/Component/DependencyInjection/Definition.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/Definition.php
+1-1Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -846,7 +846,7 @@ public function setAutowired(bool $autowired)
846846
/**
847847
* Gets bindings.
848848
*
849-
* @return array|BoundArgument[]
849+
* @return BoundArgument[]
850850
*/
851851
public function getBindings()
852852
{

‎src/Symfony/Component/DomCrawler/Crawler.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/DomCrawler/Crawler.php
+3-1Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
* Crawler eases navigation of a list of \DOMNode objects.
1919
*
2020
* @author Fabien Potencier <fabien@symfony.com>
21+
*
22+
* @implements \IteratorAggregate<int, \DOMNode>
2123
*/
2224
class Crawler implements \Countable, \IteratorAggregate
2325
{
@@ -1121,7 +1123,7 @@ public function count()
11211123
}
11221124

11231125
/**
1124-
* @return \ArrayIterator|\DOMNode[]
1126+
* @return \ArrayIterator<int, \DOMNode>
11251127
*/
11261128
#[\ReturnTypeWillChange]
11271129
public function getIterator()

‎src/Symfony/Component/EventDispatcher/GenericEvent.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/EventDispatcher/GenericEvent.php
+3Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@
1919
* Encapsulates events thus decoupling the observer from the subject they encapsulate.
2020
*
2121
* @author Drak <drak@zikula.org>
22+
*
23+
* @implements \ArrayAccess<string, mixed>
24+
* @implements \IteratorAggregate<string, mixed>
2225
*/
2326
class GenericEvent extends Event implements \ArrayAccess, \IteratorAggregate
2427
{

‎src/Symfony/Component/Finder/Finder.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/Finder/Finder.php
+2-2Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
*
3838
* @author Fabien Potencier <fabien@symfony.com>
3939
*
40-
* @implements \IteratorAggregate<SplFileInfo>
40+
* @implements \IteratorAggregate<string, SplFileInfo>
4141
*/
4242
class Finder implements \IteratorAggregate, \Countable
4343
{
@@ -603,7 +603,7 @@ public function in($dirs)
603603
*
604604
* This method implements the IteratorAggregate interface.
605605
*
606-
* @return \Iterator|SplFileInfo[] An iterator
606+
* @return \Iterator<string, SplFileInfo> An iterator
607607
*
608608
* @throws \LogicException if the in() method has not been called
609609
*/

‎src/Symfony/Component/Finder/Iterator/CustomFilterIterator.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/Finder/Iterator/CustomFilterIterator.php
+4-2Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,16 @@
1818
* to remove files.
1919
*
2020
* @author Fabien Potencier <fabien@symfony.com>
21+
*
22+
* @extends \FilterIterator<string, \SplFileInfo>
2123
*/
2224
class CustomFilterIterator extends \FilterIterator
2325
{
2426
private $filters = [];
2527

2628
/**
27-
* @param \Iterator $iterator The Iterator to filter
28-
* @param callable[] $filters An array of PHP callbacks
29+
* @param \Iterator<string, \SplFileInfo> $iterator The Iterator to filter
30+
* @param callable[] $filters An array of PHP callbacks
2931
*
3032
* @throws \InvalidArgumentException
3133
*/

‎src/Symfony/Component/Finder/Iterator/DateRangeFilterIterator.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/Finder/Iterator/DateRangeFilterIterator.php
+4-2Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,16 @@
1717
* DateRangeFilterIterator filters out files that are not in the given date range (last modified dates).
1818
*
1919
* @author Fabien Potencier <fabien@symfony.com>
20+
*
21+
* @extends \FilterIterator<string, \SplFileInfo>
2022
*/
2123
class DateRangeFilterIterator extends \FilterIterator
2224
{
2325
private $comparators = [];
2426

2527
/**
26-
* @param \Iterator $iterator The Iterator to filter
27-
* @param DateComparator[] $comparators An array of DateComparator instances
28+
* @param \Iterator<string, \SplFileInfo> $iterator
29+
* @param DateComparator[] $comparators
2830
*/
2931
public function __construct(\Iterator $iterator, array $comparators)
3032
{

‎src/Symfony/Component/Finder/Iterator/DepthRangeFilterIterator.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/Finder/Iterator/DepthRangeFilterIterator.php
+8-3Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,20 @@
1515
* DepthRangeFilterIterator limits the directory depth.
1616
*
1717
* @author Fabien Potencier <fabien@symfony.com>
18+
*
19+
* @template TKey
20+
* @template TValue
21+
*
22+
* @extends \FilterIterator<TKey, TValue>
1823
*/
1924
class DepthRangeFilterIterator extends \FilterIterator
2025
{
2126
private $minDepth = 0;
2227

2328
/**
24-
* @param \RecursiveIteratorIterator $iterator The Iterator to filter
25-
* @param int $minDepth The min depth
26-
* @param int $maxDepth The max depth
29+
* @param \RecursiveIteratorIterator<\RecursiveIterator<TKey, TValue>> $iterator The Iterator to filter
30+
* @param int $minDepth The min depth
31+
* @param int $maxDepth The max depth
2732
*/
2833
public function __construct(\RecursiveIteratorIterator $iterator, int $minDepth = 0, int $maxDepth = \PHP_INT_MAX)
2934
{

‎src/Symfony/Component/Finder/Iterator/ExcludeDirectoryFilterIterator.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/Finder/Iterator/ExcludeDirectoryFilterIterator.php
+3Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515
* ExcludeDirectoryFilterIterator filters out directories.
1616
*
1717
* @author Fabien Potencier <fabien@symfony.com>
18+
*
19+
* @extends \FilterIterator<string, \SplFileInfo>
20+
* @implements \RecursiveIterator<string, \SplFileInfo>
1821
*/
1922
class ExcludeDirectoryFilterIterator extends \FilterIterator implements \RecursiveIterator
2023
{

‎src/Symfony/Component/Finder/Iterator/FileTypeFilterIterator.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/Finder/Iterator/FileTypeFilterIterator.php
+2Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
* FileTypeFilterIterator only keeps files, directories, or both.
1616
*
1717
* @author Fabien Potencier <fabien@symfony.com>
18+
*
19+
* @extends \FilterIterator<string, \SplFileInfo>
1820
*/
1921
class FileTypeFilterIterator extends \FilterIterator
2022
{

‎src/Symfony/Component/Finder/Iterator/FilecontentFilterIterator.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/Finder/Iterator/FilecontentFilterIterator.php
+2Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
*
1717
* @author Fabien Potencier <fabien@symfony.com>
1818
* @author Włodzimierz Gajda <gajdaw@gajdaw.pl>
19+
*
20+
* @extends MultiplePcreFilterIterator<string, \SplFileInfo>
1921
*/
2022
class FilecontentFilterIterator extends MultiplePcreFilterIterator
2123
{

‎src/Symfony/Component/Finder/Iterator/FilenameFilterIterator.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/Finder/Iterator/FilenameFilterIterator.php
+2Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
* FilenameFilterIterator filters files by patterns (a regexp, a glob, or a string).
1818
*
1919
* @author Fabien Potencier <fabien@symfony.com>
20+
*
21+
* @extends MultiplePcreFilterIterator<string, \SplFileInfo>
2022
*/
2123
class FilenameFilterIterator extends MultiplePcreFilterIterator
2224
{

‎src/Symfony/Component/Finder/Iterator/MultiplePcreFilterIterator.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/Finder/Iterator/MultiplePcreFilterIterator.php
+5Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,11 @@
1515
* MultiplePcreFilterIterator filters files using patterns (regexps, globs or strings).
1616
*
1717
* @author Fabien Potencier <fabien@symfony.com>
18+
*
19+
* @template-covariant TKey
20+
* @template-covariant TValue
21+
*
22+
* @extends \FilterIterator<TKey, TValue>
1823
*/
1924
abstract class MultiplePcreFilterIterator extends \FilterIterator
2025
{

‎src/Symfony/Component/Finder/Iterator/PathFilterIterator.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/Finder/Iterator/PathFilterIterator.php
+2Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
*
1717
* @author Fabien Potencier <fabien@symfony.com>
1818
* @author Włodzimierz Gajda <gajdaw@gajdaw.pl>
19+
*
20+
* @extends MultiplePcreFilterIterator<string, \SplFileInfo>
1921
*/
2022
class PathFilterIterator extends MultiplePcreFilterIterator
2123
{

‎src/Symfony/Component/Finder/Iterator/SizeRangeFilterIterator.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/Finder/Iterator/SizeRangeFilterIterator.php
+4-2Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,16 @@
1717
* SizeRangeFilterIterator filters out files that are not in the given size range.
1818
*
1919
* @author Fabien Potencier <fabien@symfony.com>
20+
*
21+
* @extends \FilterIterator<string, \SplFileInfo>
2022
*/
2123
class SizeRangeFilterIterator extends \FilterIterator
2224
{
2325
private $comparators = [];
2426

2527
/**
26-
* @param \Iterator $iterator The Iterator to filter
27-
* @param NumberComparator[] $comparators An array of NumberComparator instances
28+
* @param \Iterator<string, \SplFileInfo> $iterator
29+
* @param NumberComparator[] $comparators
2830
*/
2931
public function __construct(\Iterator $iterator, array $comparators)
3032
{

‎src/Symfony/Component/Finder/Iterator/SortableIterator.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/Finder/Iterator/SortableIterator.php
+5-2Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
* SortableIterator applies a sort on a given Iterator.
1616
*
1717
* @author Fabien Potencier <fabien@symfony.com>
18+
*
19+
* @implements \IteratorAggregate<string, \SplFileInfo>
1820
*/
1921
class SortableIterator implements \IteratorAggregate
2022
{
@@ -30,7 +32,8 @@ class SortableIterator implements \IteratorAggregate
3032
private $sort;
3133

3234
/**
33-
* @param int|callable $sort The sort type (SORT_BY_NAME, SORT_BY_TYPE, or a PHP callback)
35+
* @param \Traversable<string, \SplFileInfo> $iterator
36+
* @param int|callable $sort The sort type (SORT_BY_NAME, SORT_BY_TYPE, or a PHP callback)
3437
*
3538
* @throws \InvalidArgumentException
3639
*/
@@ -79,7 +82,7 @@ public function __construct(\Traversable $iterator, $sort, bool $reverseOrder =
7982
}
8083

8184
/**
82-
* @return \Traversable
85+
* @return \Traversable<string, \SplFileInfo>
8386
*/
8487
#[\ReturnTypeWillChange]
8588
public function getIterator()

‎src/Symfony/Component/Form/Button.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/Form/Button.php
+3-1Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
* A form button.
1919
*
2020
* @author Bernhard Schussek <bschussek@gmail.com>
21+
*
22+
* @implements \IteratorAggregate<string, FormInterface>
2123
*/
2224
class Button implements \IteratorAggregate, FormInterface
2325
{
@@ -64,7 +66,7 @@ public function offsetExists($offset)
6466
*
6567
* @param mixed $offset
6668
*
67-
* @return mixed
69+
* @return FormInterface
6870
*
6971
* @throws BadMethodCallException
7072
*/

‎src/Symfony/Component/Form/ButtonBuilder.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/Form/ButtonBuilder.php
+2Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
* A builder for {@link Button} instances.
2020
*
2121
* @author Bernhard Schussek <bschussek@gmail.com>
22+
*
23+
* @implements \IteratorAggregate<string, FormBuilderInterface>
2224
*/
2325
class ButtonBuilder implements \IteratorAggregate, FormBuilderInterface
2426
{

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.