Failed Conditions
Push — master ( 4f8027...fa7802 )
by Guilherme
09:14
created

nameIsMandatoryForDiscriminatorColumns()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 1
dl 0
loc 3
ccs 0
cts 2
cp 0
crap 2
rs 10
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Doctrine\ORM\Mapping;
6
7
use Doctrine\DBAL\Types\Type;
8
use Doctrine\ORM\Exception\ORMException;
9
use LogicException;
10
use ReflectionException;
11
use function array_map;
12
use function get_parent_class;
13
use function implode;
14
use function sprintf;
15
16
/**
17
 * A MappingException indicates that something is wrong with the mapping setup.
18
 */
19
class MappingException extends LogicException implements ORMException
20
{
21
    /**
22
     * @return MappingException
23
     */
24
    public static function pathRequired()
25
    {
26
        return new self('Specifying the paths to your entities is required ' .
27
            'in the AnnotationDriver to retrieve all class names.');
28
    }
29
30
    /**
31
     * @param string $entityName
32
     *
33
     * @return MappingException
34
     */
35 4
    public static function identifierRequired($entityName)
36
    {
37 4
        $parent = get_parent_class($entityName);
38
39 4
        if ($parent !== false) {
40 2
            return new self(sprintf(
41 2
                'No identifier/primary key specified for Entity "%s" sub class of "%s". Every Entity must have an identifier/primary key.',
42 2
                $entityName,
43 2
                $parent
44
            ));
45
        }
46
47 2
        return new self(sprintf(
48 2
            'No identifier/primary key specified for Entity "%s". Every Entity must have an identifier/primary key.',
49 2
            $entityName
50
        ));
51
    }
52
53
    /**
54
     * @param string $entityName
55
     * @param string $type
56
     *
57
     * @return MappingException
58
     */
59
    public static function invalidInheritanceType($entityName, $type)
60
    {
61
        return new self(sprintf("The inheritance type '%s' specified for '%s' does not exist.", $type, $entityName));
62
    }
63
64
    /**
65
     * @return MappingException
66
     */
67
    public static function generatorNotAllowedWithCompositeId()
68
    {
69
        return new self("Id generators can't be used with a composite id.");
70
    }
71
72
    /**
73
     * @param string $entity
74
     *
75
     * @return MappingException
76
     */
77 1
    public static function missingFieldName($entity)
78
    {
79 1
        return new self(sprintf("The field or association mapping misses the 'fieldName' attribute in entity '%s'.", $entity));
80
    }
81
82
    /**
83
     * @param string $fieldName
84
     *
85
     * @return MappingException
86
     */
87
    public static function missingTargetEntity($fieldName)
88
    {
89
        return new self(sprintf("The association mapping '%s' misses the 'targetEntity' attribute.", $fieldName));
90
    }
91
92
    /**
93
     * @param string $fieldName
94
     *
95
     * @return MappingException
96
     */
97
    public static function missingSourceEntity($fieldName)
98
    {
99
        return new self(sprintf("The association mapping '%s' misses the 'sourceEntity' attribute.", $fieldName));
100
    }
101
102
    /**
103
     * @param string $fieldName
104
     *
105
     * @return MappingException
106
     */
107
    public static function missingEmbeddedClass($fieldName)
108
    {
109
        return new self(sprintf("The embed mapping '%s' misses the 'class' attribute.", $fieldName));
110
    }
111
112
    /**
113
     * @param string $entityName
114
     * @param string $fileName
115
     *
116
     * @return MappingException
117
     */
118
    public static function mappingFileNotFound($entityName, $fileName)
119
    {
120
        return new self(sprintf("No mapping file found named '%s' for class '%s'.", $fileName, $entityName));
121
    }
122
123
    /**
124
     * Exception for invalid property name override.
125
     *
126
     * @param string $className The entity's name.
127
     * @param string $fieldName
128
     *
129
     * @return MappingException
130
     */
131 2
    public static function invalidOverrideFieldName($className, $fieldName)
132
    {
133 2
        return new self(sprintf("Invalid field override named '%s' for class '%s'.", $fieldName, $className));
134
    }
135
136
    /**
137
     * Exception for invalid property type override.
138
     *
139
     * @param string $className The entity's name.
140
     * @param string $fieldName
141
     *
142
     * @return MappingException
143
     */
144
    public static function invalidOverridePropertyType($className, $fieldName)
145
    {
146
        return new self(sprintf("Invalid property override named '%s' for class '%s'.", $fieldName, $className));
147
    }
148
149
    /**
150
     * Exception for invalid version property override.
151
     *
152
     * @param string $className The entity's name.
153
     * @param string $fieldName
154
     *
155
     * @return MappingException
156
     */
157
    public static function invalidOverrideVersionField($className, $fieldName)
158
    {
159
        return new self(sprintf("Invalid version field override named '%s' for class '%s'.", $fieldName, $className));
160
    }
161
162
    /**
163
     * Exception for invalid property type override.
164
     *
165
     * @param string $className The entity's name.
166
     * @param string $fieldName
167
     *
168
     * @return MappingException
169
     */
170
    public static function invalidOverrideFieldType($className, $fieldName)
171
    {
172
        return new self(sprintf("The column type of attribute '%s' on class '%s' could not be changed.", $fieldName, $className));
173
    }
174
175
    /**
176
     * @param string $className
177
     * @param string $fieldName
178
     *
179
     * @return MappingException
180
     */
181
    public static function mappingNotFound($className, $fieldName)
182
    {
183
        return new self(sprintf("No mapping found for field '%s' on class '%s'.", $fieldName, $className));
184
    }
185
186
    /**
187
     * @param string $className
188
     * @param string $queryName
189
     *
190
     * @return MappingException
191
     */
192
    public static function queryNotFound($className, $queryName)
193
    {
194
        return new self(sprintf("No query found named '%s' on class '%s'.", $queryName, $className));
195
    }
196
197
    /**
198
     * @param string $className
199
     * @param string $resultName
200
     *
201
     * @return MappingException
202
     */
203
    public static function resultMappingNotFound($className, $resultName)
204
    {
205
        return new self(sprintf("No result set mapping found named '%s' on class '%s'.", $resultName, $className));
206
    }
207
208
    /**
209
     * @param string $entity
210
     * @param string $queryName
211
     *
212
     * @return MappingException
213
     */
214
    public static function missingQueryMapping($entity, $queryName)
215
    {
216
        return new self('Query named "' . $queryName . '" in "' . $entity . ' requires a result class or result set mapping.');
217
    }
218
219
    /**
220
     * @param string $entity
221
     * @param string $resultName
222
     *
223
     * @return MappingException
224
     */
225
    public static function missingResultSetMappingEntity($entity, $resultName)
226
    {
227
        return new self('Result set mapping named "' . $resultName . '" in "' . $entity . ' requires a entity class name.');
228
    }
229
230
    /**
231
     * @param string $entity
232
     * @param string $resultName
233
     *
234
     * @return MappingException
235
     */
236
    public static function missingResultSetMappingFieldName($entity, $resultName)
237
    {
238
        return new self('Result set mapping named "' . $resultName . '" in "' . $entity . ' requires a field name.');
239
    }
240
241
    /**
242
     * @param string $className
243
     *
244
     * @return MappingException
245
     */
246
    public static function nameIsMandatoryForSqlResultSetMapping($className)
247
    {
248
        return new self(sprintf("Result set mapping name on entity class '%s' is not defined.", $className));
249
    }
250
251
    /**
252
     * @param string $fieldName
253
     *
254
     * @return MappingException
255
     */
256
    public static function oneToManyRequiresMappedBy($fieldName)
257
    {
258
        return new self(sprintf("OneToMany mapping on field '%s' requires the 'mappedBy' attribute.", $fieldName));
259
    }
260
261
    /**
262
     * @param string $fieldName
263
     *
264
     * @return MappingException
265
     */
266
    public static function joinTableRequired($fieldName)
267
    {
268
        return new self(sprintf("The mapping of field '%s' requires an the 'joinTable' attribute.", $fieldName));
269
    }
270
271
    /**
272
     * Called if a required option was not found but is required
273
     *
274
     * @param string $field          Which field cannot be processed?
275
     * @param string $expectedOption Which option is required
276
     * @param string $hint           Can optionally be used to supply a tip for common mistakes,
277
     *                               e.g. "Did you think of the plural s?"
278
     *
279
     * @return MappingException
280
     */
281
    public static function missingRequiredOption($field, $expectedOption, $hint = '')
282
    {
283
        $message = sprintf("The mapping of field '%s' is invalid: The option '%s' is required.", $field, $expectedOption);
284
285
        if (! empty($hint)) {
286
            $message .= ' (Hint: ' . $hint . ')';
287
        }
288
289
        return new self($message);
290
    }
291
292
    /**
293
     * Generic exception for invalid mappings.
294
     *
295
     * @param string $fieldName
296
     *
297
     * @return MappingException
298
     */
299
    public static function invalidMapping($fieldName)
300
    {
301
        return new self(sprintf("The mapping of field '%s' is invalid.", $fieldName));
302
    }
303
304
    /**
305
     * Exception for reflection exceptions - adds the entity name,
306
     * because there might be long classnames that will be shortened
307
     * within the stacktrace
308
     *
309
     * @param string $entity The entity's name
310
     *
311
     * @return MappingException
312
     */
313
    public static function reflectionFailure($entity, ReflectionException $previousException)
314
    {
315
        return new self('An error occurred in ' . $entity, 0, $previousException);
316
    }
317
318
    /**
319
     * @param string $className
320
     * @param string $joinColumn
321
     *
322
     * @return MappingException
323
     */
324
    public static function joinColumnMustPointToMappedField($className, $joinColumn)
325
    {
326
        return new self('The column ' . $joinColumn . ' must be mapped to a field in class '
327
            . $className . ' since it is referenced by a join column of another class.');
328
    }
329
330
    /**
331
     * @param string $className
332
     *
333
     * @return MappingException
334
     */
335 6
    public static function classIsNotAValidEntityOrMappedSuperClass($className)
336
    {
337 6
        $parent = get_parent_class($className);
338
339 6
        if ($parent !== false) {
340 1
            return new self(sprintf(
341 1
                'Class "%s" sub class of "%s" is not a valid entity or mapped super class.',
342 1
                $className,
343 1
                $parent
344
            ));
345
        }
346
347 5
        return new self(sprintf(
348 5
            'Class "%s" is not a valid entity or mapped super class.',
349 5
            $className
350
        ));
351
    }
352
353
    /**
354
     * @param string $className
355
     * @param string $propertyName
356
     *
357
     * @return MappingException
358
     */
359
    public static function propertyTypeIsRequired($className, $propertyName)
360
    {
361
        return new self("The attribute 'type' is required for the column description of property " . $className . '::$' . $propertyName . '.');
362
    }
363
364
    /**
365
     * @param string $className
366
     *
367
     * @return MappingException
368
     */
369
    public static function tableIdGeneratorNotImplemented($className)
370
    {
371
        return new self('TableIdGenerator is not yet implemented for use with class ' . $className);
372
    }
373
374
    /**
375
     * @param string $className
376
     *
377
     * @return MappingException
378
     */
379 3
    public static function duplicateProperty($className, Property $property)
380
    {
381 3
        return new self(sprintf(
382 3
            'Property "%s" in "%s" was already declared in "%s", but it must be declared only once',
383 3
            $property->getName(),
384 3
            $className,
385 3
            $property->getDeclaringClass()->getClassName()
386
        ));
387
    }
388
389
    /**
390
     * @param string $entity
391
     * @param string $queryName
392
     *
393
     * @return MappingException
394
     */
395
    public static function duplicateQueryMapping($entity, $queryName)
396
    {
397
        return new self('Query named "' . $queryName . '" in "' . $entity . '" was already declared, but it must be declared only once');
398
    }
399
400
    /**
401
     * @param string $entity
402
     * @param string $resultName
403
     *
404
     * @return MappingException
405
     */
406
    public static function duplicateResultSetMapping($entity, $resultName)
407
    {
408
        return new self('Result set mapping named "' . $resultName . '" in "' . $entity . '" was already declared, but it must be declared only once');
409
    }
410
411
    /**
412
     * @param string $entity
413
     *
414
     * @return MappingException
415
     */
416 1
    public static function singleIdNotAllowedOnCompositePrimaryKey($entity)
417
    {
418 1
        return new self('Single id is not allowed on composite primary key in entity ' . $entity);
419
    }
420
421
    /**
422
     * @param string $entity
423
     *
424
     * @return MappingException
425
     */
426 1
    public static function noIdDefined($entity)
427
    {
428 1
        return new self('No ID defined for entity ' . $entity);
429
    }
430
431
    /**
432
     * @return MappingException
433
     */
434
    public static function unsupportedOptimisticLockingType(Type $unsupportedType)
435
    {
436
        return new self('Locking type "' . $unsupportedType->getName() . '" is not supported by Doctrine.');
437
    }
438
439
    /**
440
     * @param string|null $path
441
     *
442
     * @return MappingException
443
     */
444
    public static function fileMappingDriversRequireConfiguredDirectoryPath($path = null)
445
    {
446
        if (! empty($path)) {
447
            $path = '[' . $path . ']';
448
        }
449
450
        return new self(
451
            'File mapping drivers must have a valid directory path, ' .
452
            'however the given path ' . $path . ' seems to be incorrect!'
453
        );
454
    }
455
456
    /**
457
     * Returns an exception that indicates that a class used in a discriminator map does not exist.
458
     * An example would be an outdated (maybe renamed) classname.
459
     *
460
     * @param string $className   The class that could not be found
461
     * @param string $owningClass The class that declares the discriminator map.
462
     *
463
     * @return MappingException
464
     */
465
    public static function invalidClassInDiscriminatorMap($className, $owningClass)
466
    {
467
        return new self(sprintf(
468
            "Entity class '%s' used in the discriminator map of class '%s' " .
469
            'does not exist.',
470
            $className,
471
            $owningClass
472
        ));
473
    }
474
475
    /**
476
     * @param string $className
477
     *
478
     * @return MappingException
479
     */
480 3
    public static function missingDiscriminatorMap($className)
481
    {
482 3
        return new self(sprintf("Entity class '%s' is using inheritance but no discriminator map was defined.", $className));
483
    }
484
485
    /**
486
     * @param string $className
487
     *
488
     * @return MappingException
489
     */
490
    public static function missingDiscriminatorColumn($className)
491
    {
492
        return new self(sprintf("Entity class '%s' is using inheritance but no discriminator column was defined.", $className));
493
    }
494
495
    /**
496
     * @param string $type
497
     *
498
     * @return MappingException
499
     */
500
    public static function invalidDiscriminatorColumnType($type)
501
    {
502
        return new self(sprintf("Discriminator column type is not allowed to be '%s'. 'string' or 'integer' type variables are suggested!", $type));
503
    }
504
505
    /**
506
     * @param string $className
507
     *
508
     * @return MappingException
509
     */
510
    public static function nameIsMandatoryForDiscriminatorColumns($className)
511
    {
512
        return new self(sprintf("Discriminator column name on entity class '%s' is not defined.", $className));
513
    }
514
515
    /**
516
     * @param string $className
517
     * @param string $fieldName
518
     *
519
     * @return MappingException
520
     */
521
    public static function cannotVersionIdField($className, $fieldName)
522
    {
523
        return new self(sprintf("Setting Id field '%s' as versionable in entity class '%s' is not supported.", $fieldName, $className));
524
    }
525
526
    /**
527
     * @param string $className
528
     *
529
     * @return MappingException
530
     */
531
    public static function sqlConversionNotAllowedForPrimaryKeyProperties($className, $fieldName, $type)
532
    {
533
        return new self(sprintf(
534
            'It is not possible to set id field "%s" to type "%s" in entity class "%s". ' .
535
            'The type "%s" requires conversion SQL which is not allowed for identifiers.',
536
            $fieldName,
537
            $type,
538
            $className,
539
            $type
540
        ));
541
    }
542
543
    /**
544
     * @param string $className
545
     * @param string $fieldName
546
     * @param string $type
547
     *
548
     * @return MappingException
549
     */
550
    public static function sqlConversionNotAllowedForIdentifiers($className, $fieldName, $type)
551
    {
552
        return new self(sprintf(
553
            "It is not possible to set id field '%s' to type '%s' in entity class '%s'. The type '%s' "
554
                . 'requires conversion SQL which is not allowed for identifiers.',
555
            $fieldName,
556
            $type,
557
            $className,
558
            $type
559
        ));
560
    }
561
562
    /**
563
     * @param string $className
564
     * @param string $columnName
565
     *
566
     * @return MappingException
567
     */
568
    public static function duplicateColumnName($className, $columnName)
569
    {
570
        return new self("Duplicate definition of column '" . $columnName . "' on entity '" . $className . "' in a field or discriminator column mapping.");
571
    }
572
573
    /**
574
     * @param string $className
575
     * @param string $field
576
     *
577
     * @return MappingException
578
     */
579 1
    public static function illegalToManyAssociationOnMappedSuperclass($className, $field)
580
    {
581 1
        return new self("It is illegal to put an inverse side one-to-many or many-to-many association on mapped superclass '" . $className . '#' . $field . "'.");
582
    }
583
584
    /**
585
     * @param string $className
586
     * @param string $targetEntity
587
     * @param string $targetField
588
     *
589
     * @return MappingException
590
     */
591
    public static function cannotMapCompositePrimaryKeyEntitiesAsForeignId($className, $targetEntity, $targetField)
592
    {
593
        return new self("It is not possible to map entity '" . $className . "' with a composite primary key " .
594
            "as part of the primary key of another entity '" . $targetEntity . '#' . $targetField . "'.");
595
    }
596
597
    /**
598
     * @param string $className
599
     * @param string $field
600
     *
601
     * @return MappingException
602
     */
603
    public static function noSingleAssociationJoinColumnFound($className, $field)
604
    {
605
        return new self(sprintf("'%s#%s' is not an association with a single join column.", $className, $field));
606
    }
607
608
    /**
609
     * @param string $className
610
     * @param string $column
611
     *
612
     * @return MappingException
613
     */
614
    public static function noFieldNameFoundForColumn($className, $column)
615
    {
616
        return new self(sprintf(
617
            "Cannot find a field on '%s' that is mapped to column '%s'. Either the "
618
                . 'field does not exist or an association exists but it has multiple join columns.',
619
            $className,
620
            $column
621
        ));
622
    }
623
624
    /**
625
     * @param string $className
626
     * @param string $field
627
     *
628
     * @return MappingException
629
     */
630 1
    public static function illegalOrphanRemovalOnIdentifierAssociation($className, $field)
631
    {
632 1
        return new self(sprintf(
633
            'The orphan removal option is not allowed on an association that is '
634 1
                . "part of the identifier in '%s#%s'.",
635 1
            $className,
636 1
            $field
637
        ));
638
    }
639
640
    /**
641
     * @param string $className
642
     * @param string $field
643
     *
644
     * @return MappingException
645
     */
646
    public static function illegalOrphanRemoval($className, $field)
647
    {
648
        return new self('Orphan removal is only allowed on one-to-one and one-to-many ' .
649
            'associations, but ' . $className . '#' . $field . ' is not.');
650
    }
651
652
    /**
653
     * @param string $className
654
     * @param string $field
655
     *
656
     * @return MappingException
657
     */
658 1
    public static function illegalInverseIdentifierAssociation($className, $field)
659
    {
660 1
        return new self(sprintf("An inverse association is not allowed to be identifier in '%s#%s'.", $className, $field));
661
    }
662
663
    /**
664
     * @param string $className
665
     * @param string $field
666
     *
667
     * @return MappingException
668
     */
669 1
    public static function illegalToManyIdentifierAssociation($className, $field)
670
    {
671 1
        return new self(sprintf("Many-to-many or one-to-many associations are not allowed to be identifier in '%s#%s'.", $className, $field));
672
    }
673
674
    /**
675
     * @param string $className
676
     *
677
     * @return MappingException
678
     */
679
    public static function noInheritanceOnMappedSuperClass($className)
680
    {
681
        return new self("It is not supported to define inheritance information on a mapped superclass '" . $className . "'.");
682
    }
683
684
    /**
685
     * @param string $className
686
     * @param string $rootClassName
687
     *
688
     * @return MappingException
689
     */
690 1
    public static function mappedClassNotPartOfDiscriminatorMap($className, $rootClassName)
691
    {
692 1
        return new self(
693 1
            "Entity '" . $className . "' has to be part of the discriminator map of '" . $rootClassName . "' " .
694 1
            "to be properly mapped in the inheritance hierarchy. Alternatively you can make '" . $className . "' an abstract class " .
695 1
            'to avoid this exception from occurring.'
696
        );
697
    }
698
699
    /**
700
     * @param string $className
701
     * @param string $methodName
702
     *
703
     * @return MappingException
704
     */
705 1
    public static function lifecycleCallbackMethodNotFound($className, $methodName)
706
    {
707 1
        return new self("Entity '" . $className . "' has no public method '" . $methodName . "' to be registered as lifecycle callback.");
708
    }
709
710
    /**
711
     * @param string $listenerName
712
     * @param string $className
713
     *
714
     * @return \Doctrine\ORM\Mapping\MappingException
715
     */
716 1
    public static function entityListenerClassNotFound($listenerName, $className)
717
    {
718 1
        return new self(sprintf('Entity Listener "%s" declared on "%s" not found.', $listenerName, $className));
719
    }
720
721
    /**
722
     * @param string $listenerName
723
     * @param string $methodName
724
     * @param string $className
725
     *
726
     * @return \Doctrine\ORM\Mapping\MappingException
727
     */
728 1
    public static function entityListenerMethodNotFound($listenerName, $methodName, $className)
729
    {
730 1
        return new self(sprintf('Entity Listener "%s" declared on "%s" has no method "%s".', $listenerName, $className, $methodName));
731
    }
732
733
    /**
734
     * @param string $className
735
     * @param string $annotation
736
     *
737
     * @return MappingException
738
     */
739
    public static function invalidFetchMode($className, $annotation)
740
    {
741
        return new self("Entity '" . $className . "' has a mapping with invalid fetch mode '" . $annotation . "'");
742
    }
743
744
    /**
745
     * @param string $className
746
     *
747
     * @return MappingException
748
     */
749
    public static function compositeKeyAssignedIdGeneratorRequired($className)
750
    {
751
        return new self("Entity '" . $className . "' has a composite identifier but uses an ID generator other than manually assigning (Identity, Sequence). This is not supported.");
752
    }
753
754
    /**
755
     * @param string $targetEntity
756
     * @param string $sourceEntity
757
     * @param string $associationName
758
     *
759
     * @return MappingException
760
     */
761 1
    public static function invalidTargetEntityClass($targetEntity, $sourceEntity, $associationName)
762
    {
763 1
        return new self("The target-entity '" . $targetEntity . "' cannot be found in '" . $sourceEntity . '#' . $associationName . "'.");
764
    }
765
766
    /**
767
     * @param string[] $cascades
768
     * @param string   $className
769
     * @param string   $propertyName
770
     *
771
     * @return MappingException
772
     */
773 1
    public static function invalidCascadeOption(array $cascades, $className, $propertyName)
774
    {
775
        $cascades = implode(', ', array_map(static function ($e) {
776 1
            return "'" . $e . "'";
777 1
        }, $cascades));
778
779 1
        return new self(sprintf(
780 1
            "You have specified invalid cascade options for %s::$%s: %s; available options: 'remove', 'persist', and 'refresh'",
781 1
            $className,
782 1
            $propertyName,
783 1
            $cascades
784
        ));
785
    }
786
787
    /**
788
     * @param string $className
789
     *
790
     * @return MappingException
791
     */
792
    public static function missingSequenceName($className)
793
    {
794
        return new self(
795
            sprintf('Missing "sequenceName" attribute for sequence id generator definition on class "%s".', $className)
796
        );
797
    }
798
799
    /**
800
     * @param string $className
801
     * @param string $propertyName
802
     *
803
     * @return MappingException
804
     */
805
    public static function infiniteEmbeddableNesting($className, $propertyName)
806
    {
807
        return new self(
808
            sprintf(
809
                'Infinite nesting detected for embedded property %s::%s. ' .
810
                'You cannot embed an embeddable from the same type inside an embeddable.',
811
                $className,
812
                $propertyName
813
            )
814
        );
815
    }
816
817
    /**
818
     * @param string[] $namespaces
819
     */
820
    public static function classNotFoundInNamespaces(string $className, array $namespaces) : self
821
    {
822
        return new self(
823
            sprintf(
824
                'Class %s not found in namespaces %s.' .
825
                $className,
826
                implode(', ', $namespaces)
827
            )
828
        );
829
    }
830
}
831