ngx-vest-forms 1.0.2 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +109 -8
- package/esm2022/lib/components/control-wrapper/control-wrapper.component.mjs +15 -11
- package/esm2022/lib/constants.mjs +1 -1
- package/esm2022/lib/directives/form-model-group.directive.mjs +16 -7
- package/esm2022/lib/directives/form-model.directive.mjs +16 -7
- package/esm2022/lib/directives/form.directive.mjs +42 -34
- package/esm2022/lib/directives/validate-root-form.directive.mjs +28 -13
- package/esm2022/lib/directives/validation-options.mjs +2 -0
- package/esm2022/lib/exports.mjs +13 -6
- package/esm2022/lib/utils/array-to-object.mjs +1 -1
- package/esm2022/lib/utils/deep-partial.mjs +1 -1
- package/esm2022/lib/utils/deep-required.mjs +1 -1
- package/esm2022/lib/utils/form-utils.mjs +25 -8
- package/esm2022/lib/utils/shape-validation.mjs +4 -2
- package/esm2022/public-api.mjs +3 -3
- package/fesm2022/ngx-vest-forms.mjs +139 -66
- package/fesm2022/ngx-vest-forms.mjs.map +1 -1
- package/lib/components/control-wrapper/control-wrapper.component.d.ts +7 -6
- package/lib/directives/form-model-group.directive.d.ts +3 -1
- package/lib/directives/form-model.directive.d.ts +3 -1
- package/lib/directives/form.directive.d.ts +23 -16
- package/lib/directives/validate-root-form.directive.d.ts +8 -4
- package/lib/directives/validation-options.d.ts +9 -0
- package/lib/utils/form-utils.d.ts +4 -0
- package/package.json +1 -1
- package/public-api.d.ts +3 -2
package/README.md
CHANGED
|
@@ -485,6 +485,29 @@ omitWhen(
|
|
|
485
485
|
);
|
|
486
486
|
```
|
|
487
487
|
|
|
488
|
+
### Validation options
|
|
489
|
+
|
|
490
|
+
The validation is triggered immediately when the input on the formModel changes.
|
|
491
|
+
In some cases you want to debounce the input (e.g. if you make an api call in the validation suite).
|
|
492
|
+
|
|
493
|
+
You can configure additional `validationOptions` at various levels like `form`, `ngModelGroup` or `ngModel`.
|
|
494
|
+
|
|
495
|
+
```html
|
|
496
|
+
|
|
497
|
+
<form scVestForm
|
|
498
|
+
...
|
|
499
|
+
[validationOptions]="{ debounceTime: 0 }">
|
|
500
|
+
...
|
|
501
|
+
<div sc-control-wrapper>
|
|
502
|
+
<label>UserId</label>
|
|
503
|
+
<input type="text" name="userId" [ngModel]="formValue().userId?"
|
|
504
|
+
[validationOptions]="{ debounceTime: 300 }"/>
|
|
505
|
+
</div>
|
|
506
|
+
...
|
|
507
|
+
</form>
|
|
508
|
+
```
|
|
509
|
+
|
|
510
|
+
|
|
488
511
|
### Validations on the root form
|
|
489
512
|
|
|
490
513
|
When we want to validate multiple fields that are depending on each other,
|
|
@@ -545,22 +568,81 @@ test(ROOT_FORM, 'Brecht is not 30 anymore', () => {
|
|
|
545
568
|
});
|
|
546
569
|
```
|
|
547
570
|
|
|
548
|
-
### Validation dependencies
|
|
549
571
|
|
|
550
|
-
Sometimes we need to re-trigger validations of form controls or form groups because they are dependant on other form controls or form groups.
|
|
551
|
-
For instance: A `confirmPassword` field is not required unless the `password` is filled in. Which means that when the `password` field gets a new value,
|
|
552
|
-
we need to run the validations on `confirmPassword`.
|
|
553
572
|
|
|
573
|
+
### Validation of dependant controls and or groups
|
|
574
|
+
|
|
575
|
+
Sometimes, form validations are dependent on the values of other form controls or groups.
|
|
576
|
+
This scenario is common when a field's validity relies on the input of another field.
|
|
577
|
+
A typical example is the `confirmPassword` field, which should only be validated if the `password` field is filled in.
|
|
578
|
+
When the `password` field value changes, it necessitates re-validating the `confirmPassword` field to ensure
|
|
579
|
+
consistency.
|
|
580
|
+
|
|
581
|
+
Here's how you can handle validation dependencies with ngx-vest-forms and vest.js:
|
|
582
|
+
|
|
583
|
+
|
|
584
|
+
Use Vest to create a suite where you define the conditional validations.
|
|
585
|
+
For example, the `confirmPassword` field should only be validated when the `password` field is not empty.
|
|
586
|
+
Additionally, you need to ensure that both fields match.
|
|
587
|
+
|
|
588
|
+
```typescript
|
|
589
|
+
import { enforce, omitWhen, staticSuite, test } from 'vest';
|
|
590
|
+
import { MyFormModel } from '../models/my-form.model';
|
|
591
|
+
|
|
592
|
+
export const myFormModelSuite = staticSuite((model: MyFormModel, field?: string) => {
|
|
593
|
+
if (field) {
|
|
594
|
+
only(field);
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
test('password', 'Password is required', () => {
|
|
598
|
+
enforce(model.password).isNotBlank();
|
|
599
|
+
});
|
|
600
|
+
|
|
601
|
+
omitWhen(!model.password, () => {
|
|
602
|
+
test('confirmPassword', 'Confirm password is required', () => {
|
|
603
|
+
enforce(model.confirmPassword).isNotBlank();
|
|
604
|
+
});
|
|
605
|
+
});
|
|
606
|
+
|
|
607
|
+
omitWhen(!model.password || !model.confirmPassword, () => {
|
|
608
|
+
test('passwords', 'Passwords do not match', () => {
|
|
609
|
+
enforce(model.confirmPassword).equals(model.password);
|
|
610
|
+
});
|
|
611
|
+
});
|
|
612
|
+
});
|
|
613
|
+
```
|
|
614
|
+
|
|
615
|
+
Creating a validation config.
|
|
616
|
+
The `scVestForm` has an input called `validationConfig`, that we can use to let the system know when to retrigger validations.
|
|
617
|
+
|
|
618
|
+
```typescript
|
|
619
|
+
protected validationConfig = {
|
|
620
|
+
password: ['passwords.confirmPassword']
|
|
621
|
+
}
|
|
622
|
+
```
|
|
623
|
+
Here we see that when password changes, it needs to update the field `passwords.confirmPassword`.
|
|
624
|
+
This validationConfig is completely dynamic, and can also be used for form arrays.
|
|
625
|
+
|
|
626
|
+
```html
|
|
554
627
|
|
|
555
|
-
|
|
628
|
+
<form scVestForm
|
|
629
|
+
...
|
|
630
|
+
[validationConfig]="validationConfig">
|
|
631
|
+
<div ngModelGroup="passwords">
|
|
632
|
+
<label>Password</label>
|
|
633
|
+
<input type="password" name="password" [ngModel]="formValue().passwords?.password"/>
|
|
634
|
+
|
|
635
|
+
<label>Confirm Password</label>
|
|
636
|
+
<input type="password" name="confirmPassword" [ngModel]="formValue().passwords?.confirmPassword"/>
|
|
637
|
+
</div>
|
|
638
|
+
</form>
|
|
639
|
+
```
|
|
556
640
|
|
|
557
|
-
Todo
|
|
558
641
|
|
|
559
642
|
#### Form array validations
|
|
560
643
|
|
|
561
644
|
An example can be found [in this simplified courses article](https://blog.simplified.courses/template-driven-forms-with-form-arrays/)
|
|
562
|
-
|
|
563
|
-
We can look in `projects/examples/src/app/validations/phonenumber.validations.ts` to see an example on the validations part.
|
|
645
|
+
There is also a complex example of form arrays with complex validations in the examples.
|
|
564
646
|
|
|
565
647
|
|
|
566
648
|
### Child form components
|
|
@@ -583,4 +665,23 @@ export class AddressComponent {
|
|
|
583
665
|
}
|
|
584
666
|
```
|
|
585
667
|
|
|
668
|
+
# Examples
|
|
669
|
+
to check the examples, clone this repo and run:
|
|
670
|
+
```shell
|
|
671
|
+
npm i
|
|
672
|
+
npm start
|
|
673
|
+
```
|
|
674
|
+
|
|
675
|
+
There is an example of a complex form with a lot of conditionals and specifics,
|
|
676
|
+
and there is an example of a form array with complex validations that is used to
|
|
677
|
+
create a form to add business hours. A free tutorial will follow soon.
|
|
678
|
+
|
|
679
|
+
|
|
586
680
|
You can check the examples in the github repo [here](https://github.com/simplifiedcourses/ngx-vest-forms/blob/master/projects/examples).
|
|
681
|
+
[Here](https://stackblitz.com/~/github.com/simplifiedcourses/ngx-vest-forms-stackblitz){:target="_blank"} is a stackblitz example for you.
|
|
682
|
+
It's filled with form complexities and also contains form array logic.
|
|
683
|
+
|
|
684
|
+
## Want to learn more?
|
|
685
|
+
[](https://www.simplified.courses/complex-angular-template-driven-forms)
|
|
686
|
+
|
|
687
|
+
[This course](https://www.simplified.courses/complex-angular-template-driven-forms) teaches you to become a form expert in no time.
|
|
@@ -1,21 +1,17 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChild,
|
|
1
|
+
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChild, HostBinding, inject, } from '@angular/core';
|
|
2
2
|
import { NgModel, NgModelGroup } from '@angular/forms';
|
|
3
|
-
import { mergeWith, of, switchMap } from 'rxjs';
|
|
4
|
-
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
3
|
+
import { mergeWith, of, Subject, switchMap, takeUntil } from 'rxjs';
|
|
5
4
|
import { FormDirective } from '../../directives/form.directive';
|
|
6
5
|
import * as i0 from "@angular/core";
|
|
7
6
|
export class ControlWrapperComponent {
|
|
8
7
|
constructor() {
|
|
9
|
-
this.cdRef = inject(ChangeDetectorRef);
|
|
10
|
-
this.formDirective = inject(FormDirective);
|
|
11
|
-
this.destroyRef = inject(DestroyRef);
|
|
12
8
|
this.ngModelGroup = inject(NgModelGroup, {
|
|
13
9
|
optional: true,
|
|
14
10
|
self: true,
|
|
15
11
|
});
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
12
|
+
this.destroy$$ = new Subject();
|
|
13
|
+
this.cdRef = inject(ChangeDetectorRef);
|
|
14
|
+
this.formDirective = inject(FormDirective);
|
|
19
15
|
}
|
|
20
16
|
get invalid() {
|
|
21
17
|
return this.control?.touched && this.errors;
|
|
@@ -29,13 +25,21 @@ export class ControlWrapperComponent {
|
|
|
29
25
|
}
|
|
30
26
|
return this.control?.errors?.['errors'];
|
|
31
27
|
}
|
|
28
|
+
get control() {
|
|
29
|
+
return this.ngModelGroup
|
|
30
|
+
? this.ngModelGroup.control
|
|
31
|
+
: this.ngModel?.control;
|
|
32
|
+
}
|
|
33
|
+
ngOnDestroy() {
|
|
34
|
+
this.destroy$$.next();
|
|
35
|
+
}
|
|
32
36
|
ngAfterViewInit() {
|
|
33
37
|
// Wait until the form is idle
|
|
34
38
|
// Then, listen to all events of the ngModelGroup or ngModel
|
|
35
39
|
// and mark the component and its ancestors as dirty
|
|
36
40
|
// This allows us to use the OnPush ChangeDetection Strategy
|
|
37
41
|
this.formDirective.idle$
|
|
38
|
-
.pipe(switchMap(() => this.ngModelGroup?.control?.events || of(null)), mergeWith(this.control?.events || of(null)),
|
|
42
|
+
.pipe(switchMap(() => this.ngModelGroup?.control?.events || of(null)), mergeWith(this.control?.events || of(null)), takeUntil(this.destroy$$))
|
|
39
43
|
.subscribe(() => {
|
|
40
44
|
this.cdRef.markForCheck();
|
|
41
45
|
});
|
|
@@ -53,4 +57,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImpor
|
|
|
53
57
|
type: HostBinding,
|
|
54
58
|
args: ['class.sc-control-wrapper--invalid']
|
|
55
59
|
}] } });
|
|
56
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
60
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbC13cmFwcGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC12ZXN0LWZvcm1zL3NyYy9saWIvY29tcG9uZW50cy9jb250cm9sLXdyYXBwZXIvY29udHJvbC13cmFwcGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC12ZXN0LWZvcm1zL3NyYy9saWIvY29tcG9uZW50cy9jb250cm9sLXdyYXBwZXIvY29udHJvbC13cmFwcGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxZQUFZLEVBQ1osV0FBVyxFQUNYLE1BQU0sR0FFUCxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQW1CLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4RSxPQUFPLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUNBQWlDLENBQUM7O0FBU2hFLE1BQU0sT0FBTyx1QkFBdUI7SUFQcEM7UUFTa0IsaUJBQVksR0FBd0IsTUFBTSxDQUFDLFlBQVksRUFBRTtZQUN2RSxRQUFRLEVBQUUsSUFBSTtZQUNkLElBQUksRUFBRSxJQUFJO1NBQ1gsQ0FBQyxDQUFDO1FBQ2MsY0FBUyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFDaEMsVUFBSyxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ2xDLGtCQUFhLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0tBMkN4RDtJQXZDQyxJQUNXLE9BQU87UUFDaEIsT0FBTyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQzlDLENBQUM7SUFFRCxJQUFXLE1BQU07UUFDZixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUM7WUFDMUIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQzVCLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3hELENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVELElBQVksT0FBTztRQUNqQixPQUFPLElBQUksQ0FBQyxZQUFZO1lBQ3RCLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU87WUFDM0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDO0lBQzVCLENBQUM7SUFFTSxXQUFXO1FBQ2hCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVNLGVBQWU7UUFDcEIsOEJBQThCO1FBQzlCLDREQUE0RDtRQUM1RCxvREFBb0Q7UUFDcEQsNERBQTREO1FBQzVELElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSzthQUNyQixJQUFJLENBQ0gsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsT0FBTyxFQUFFLE1BQU0sSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsRUFDL0QsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUMzQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUMxQjthQUNBLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzVCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQzs4R0FsRFUsdUJBQXVCO2tHQUF2Qix1QkFBdUIsb01BQ3BCLE9BQU8sZ0RDdkJ2Qiw2VEFZQTs7MkZEVWEsdUJBQXVCO2tCQVBuQyxTQUFTOytCQUNFLHNCQUFzQixjQUNwQixJQUFJLG1CQUdDLHVCQUF1QixDQUFDLE1BQU07OEJBR2pCLE9BQU87c0JBQXBDLFlBQVk7dUJBQUMsT0FBTztnQkFZVixPQUFPO3NCQURqQixXQUFXO3VCQUFDLG1DQUFtQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIEhvc3RCaW5kaW5nLFxuICBpbmplY3QsXG4gIE9uRGVzdHJveSxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgTmdNb2RlbCwgTmdNb2RlbEdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgbWVyZ2VXaXRoLCBvZiwgU3ViamVjdCwgc3dpdGNoTWFwLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEZvcm1EaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL2Zvcm0uZGlyZWN0aXZlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnW3NjLWNvbnRyb2wtd3JhcHBlcl0nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICB0ZW1wbGF0ZVVybDogJy4vY29udHJvbC13cmFwcGVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY29udHJvbC13cmFwcGVyLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBDb250cm9sV3JhcHBlckNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIEBDb250ZW50Q2hpbGQoTmdNb2RlbCkgcHVibGljIG5nTW9kZWw/OiBOZ01vZGVsOyAvLyBPcHRpb25hbCBuZ01vZGVsXG4gIHB1YmxpYyByZWFkb25seSBuZ01vZGVsR3JvdXA6IE5nTW9kZWxHcm91cCB8IG51bGwgPSBpbmplY3QoTmdNb2RlbEdyb3VwLCB7XG4gICAgb3B0aW9uYWw6IHRydWUsXG4gICAgc2VsZjogdHJ1ZSxcbiAgfSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjZFJlZiA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG4gIHByaXZhdGUgcmVhZG9ubHkgZm9ybURpcmVjdGl2ZSA9IGluamVjdChGb3JtRGlyZWN0aXZlKTtcbiAgLy8gQ2FjaGUgdGhlIHByZXZpb3VzIGVycm9yIHRvIGF2b2lkICdmbGlja2VyaW5nJ1xuICBwcml2YXRlIHByZXZpb3VzRXJyb3I/OiBzdHJpbmdbXTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnNjLWNvbnRyb2wtd3JhcHBlci0taW52YWxpZCcpXG4gIHB1YmxpYyBnZXQgaW52YWxpZCgpIHtcbiAgICByZXR1cm4gdGhpcy5jb250cm9sPy50b3VjaGVkICYmIHRoaXMuZXJyb3JzO1xuICB9XG5cbiAgcHVibGljIGdldCBlcnJvcnMoKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmNvbnRyb2w/LnBlbmRpbmcpIHtcbiAgICAgIHJldHVybiB0aGlzLnByZXZpb3VzRXJyb3I7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHJldmlvdXNFcnJvciA9IHRoaXMuY29udHJvbD8uZXJyb3JzPy5bJ2Vycm9ycyddO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb250cm9sPy5lcnJvcnM/LlsnZXJyb3JzJ107XG4gIH1cblxuICBwcml2YXRlIGdldCBjb250cm9sKCk6IEFic3RyYWN0Q29udHJvbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMubmdNb2RlbEdyb3VwXG4gICAgICA/IHRoaXMubmdNb2RlbEdyb3VwLmNvbnRyb2xcbiAgICAgIDogdGhpcy5uZ01vZGVsPy5jb250cm9sO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveSQkLm5leHQoKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgLy8gV2FpdCB1bnRpbCB0aGUgZm9ybSBpcyBpZGxlXG4gICAgLy8gVGhlbiwgbGlzdGVuIHRvIGFsbCBldmVudHMgb2YgdGhlIG5nTW9kZWxHcm91cCBvciBuZ01vZGVsXG4gICAgLy8gYW5kIG1hcmsgdGhlIGNvbXBvbmVudCBhbmQgaXRzIGFuY2VzdG9ycyBhcyBkaXJ0eVxuICAgIC8vIFRoaXMgYWxsb3dzIHVzIHRvIHVzZSB0aGUgT25QdXNoIENoYW5nZURldGVjdGlvbiBTdHJhdGVneVxuICAgIHRoaXMuZm9ybURpcmVjdGl2ZS5pZGxlJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLm5nTW9kZWxHcm91cD8uY29udHJvbD8uZXZlbnRzIHx8IG9mKG51bGwpKSxcbiAgICAgICAgbWVyZ2VXaXRoKHRoaXMuY29udHJvbD8uZXZlbnRzIHx8IG9mKG51bGwpKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQkKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuY2RSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInNjLWNvbnRyb2wtd3JhcHBlclwiPlxuICA8ZGl2IGNsYXNzPVwic2MtY29udHJvbC13cmFwcGVyX19jb250ZW50XCI+XG4gICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cInNjLWNvbnRyb2wtd3JhcHBlcl9fZXJyb3JzXCI+XG4gICAgPHVsIFtoaWRkZW5dPVwiIWludmFsaWRcIj5cbiAgICAgIEBmb3IgKGVycm9yIG9mIGVycm9yczsgdHJhY2sgZXJyb3IpIHtcbiAgICAgICAgPGxpPnt7IGVycm9yIH19PC9saT5cbiAgICAgIH1cbiAgICA8L3VsPlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export const ROOT_FORM = 'rootForm';
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXZlc3QtZm9ybXMvc3JjL2xpYi9jb25zdGFudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBST09UX0ZPUk0gPSAncm9vdEZvcm0nO1xuIl19
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Directive, inject } from '@angular/core';
|
|
2
|
-
import { NG_ASYNC_VALIDATORS } from '@angular/forms';
|
|
1
|
+
import { Directive, inject, input } from '@angular/core';
|
|
2
|
+
import { NG_ASYNC_VALIDATORS, } from '@angular/forms';
|
|
3
3
|
import { FormDirective } from './form.directive';
|
|
4
4
|
import { getFormGroupField } from '../utils/form-utils';
|
|
5
5
|
import * as i0 from "@angular/core";
|
|
@@ -9,16 +9,21 @@ import * as i0 from "@angular/core";
|
|
|
9
9
|
*/
|
|
10
10
|
export class FormModelGroupDirective {
|
|
11
11
|
constructor() {
|
|
12
|
+
this.validationOptions = input({ debounceTime: 0 });
|
|
12
13
|
this.formDirective = inject(FormDirective);
|
|
13
14
|
}
|
|
14
15
|
validate(control) {
|
|
15
16
|
const { ngForm } = this.formDirective;
|
|
16
17
|
const field = getFormGroupField(ngForm.control, control);
|
|
17
|
-
return this.formDirective.createAsyncValidator(field)(control.value);
|
|
18
|
+
return this.formDirective.createAsyncValidator(field, this.validationOptions())(control.value);
|
|
18
19
|
}
|
|
19
20
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: FormModelGroupDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
20
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "
|
|
21
|
-
{
|
|
21
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.0.1", type: FormModelGroupDirective, isStandalone: true, selector: "[ngModelGroup]", inputs: { validationOptions: { classPropertyName: "validationOptions", publicName: "validationOptions", isSignal: true, isRequired: false, transformFunction: null } }, providers: [
|
|
22
|
+
{
|
|
23
|
+
provide: NG_ASYNC_VALIDATORS,
|
|
24
|
+
useExisting: FormModelGroupDirective,
|
|
25
|
+
multi: true,
|
|
26
|
+
},
|
|
22
27
|
], ngImport: i0 }); }
|
|
23
28
|
}
|
|
24
29
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: FormModelGroupDirective, decorators: [{
|
|
@@ -27,8 +32,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImpor
|
|
|
27
32
|
selector: '[ngModelGroup]',
|
|
28
33
|
standalone: true,
|
|
29
34
|
providers: [
|
|
30
|
-
{
|
|
35
|
+
{
|
|
36
|
+
provide: NG_ASYNC_VALIDATORS,
|
|
37
|
+
useExisting: FormModelGroupDirective,
|
|
38
|
+
multi: true,
|
|
39
|
+
},
|
|
31
40
|
],
|
|
32
41
|
}]
|
|
33
42
|
}] });
|
|
34
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1tb2RlbC1ncm91cC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdmVzdC1mb3Jtcy9zcmMvbGliL2RpcmVjdGl2ZXMvZm9ybS1tb2RlbC1ncm91cC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pELE9BQU8sRUFHTCxtQkFBbUIsR0FFcEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFakQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0scUJBQXFCLENBQUM7O0FBR3hEOzs7R0FHRztBQVlILE1BQU0sT0FBTyx1QkFBdUI7SUFYcEM7UUFZUyxzQkFBaUIsR0FBRyxLQUFLLENBQW9CLEVBQUUsWUFBWSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDeEQsa0JBQWEsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7S0FXeEQ7SUFUUSxRQUFRLENBQ2IsT0FBd0I7UUFFeEIsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDdEMsTUFBTSxLQUFLLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN6RCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQzdFLE9BQU8sQ0FBQyxLQUFLLENBQ3lCLENBQUM7SUFDM0MsQ0FBQzs4R0FaVSx1QkFBdUI7a0dBQXZCLHVCQUF1QixxT0FSdkI7WUFDVDtnQkFDRSxPQUFPLEVBQUUsbUJBQW1CO2dCQUM1QixXQUFXLEVBQUUsdUJBQXVCO2dCQUNwQyxLQUFLLEVBQUUsSUFBSTthQUNaO1NBQ0Y7OzJGQUVVLHVCQUF1QjtrQkFYbkMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsZ0JBQWdCO29CQUMxQixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsU0FBUyxFQUFFO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxtQkFBbUI7NEJBQzVCLFdBQVcseUJBQXlCOzRCQUNwQyxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRjtpQkFDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgaW5qZWN0LCBpbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQWJzdHJhY3RDb250cm9sLFxuICBBc3luY1ZhbGlkYXRvcixcbiAgTkdfQVNZTkNfVkFMSURBVE9SUyxcbiAgVmFsaWRhdGlvbkVycm9ycyxcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRm9ybURpcmVjdGl2ZSB9IGZyb20gJy4vZm9ybS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZ2V0Rm9ybUdyb3VwRmllbGQgfSBmcm9tICcuLi91dGlscy9mb3JtLXV0aWxzJztcbmltcG9ydCB7IFZhbGlkYXRpb25PcHRpb25zIH0gZnJvbSAnLi92YWxpZGF0aW9uLW9wdGlvbnMnO1xuXG4vKipcbiAqIEhvb2tzIGludG8gdGhlIG5nTW9kZWxHcm91cCBzZWxlY3RvciBhbmQgdHJpZ2dlcnMgYW4gYXN5bmNocm9ub3VzIHZhbGlkYXRpb24gZm9yIGEgZm9ybSBncm91cFxuICogSXQgd2lsbCB1c2UgYSB2ZXN0IHN1aXRlIGJlaGluZCB0aGUgc2NlbmVzXG4gKi9cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tuZ01vZGVsR3JvdXBdJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfQVNZTkNfVkFMSURBVE9SUyxcbiAgICAgIHVzZUV4aXN0aW5nOiBGb3JtTW9kZWxHcm91cERpcmVjdGl2ZSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIEZvcm1Nb2RlbEdyb3VwRGlyZWN0aXZlIGltcGxlbWVudHMgQXN5bmNWYWxpZGF0b3Ige1xuICBwdWJsaWMgdmFsaWRhdGlvbk9wdGlvbnMgPSBpbnB1dDxWYWxpZGF0aW9uT3B0aW9ucz4oeyBkZWJvdW5jZVRpbWU6IDAgfSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZm9ybURpcmVjdGl2ZSA9IGluamVjdChGb3JtRGlyZWN0aXZlKTtcblxuICBwdWJsaWMgdmFsaWRhdGUoXG4gICAgY29udHJvbDogQWJzdHJhY3RDb250cm9sXG4gICk6IE9ic2VydmFibGU8VmFsaWRhdGlvbkVycm9ycyB8IG51bGw+IHtcbiAgICBjb25zdCB7IG5nRm9ybSB9ID0gdGhpcy5mb3JtRGlyZWN0aXZlO1xuICAgIGNvbnN0IGZpZWxkID0gZ2V0Rm9ybUdyb3VwRmllbGQobmdGb3JtLmNvbnRyb2wsIGNvbnRyb2wpO1xuICAgIHJldHVybiB0aGlzLmZvcm1EaXJlY3RpdmUuY3JlYXRlQXN5bmNWYWxpZGF0b3IoZmllbGQsIHRoaXMudmFsaWRhdGlvbk9wdGlvbnMoKSkoXG4gICAgICBjb250cm9sLnZhbHVlXG4gICAgKSBhcyBPYnNlcnZhYmxlPFZhbGlkYXRpb25FcnJvcnMgfCBudWxsPjtcbiAgfVxufVxuIl19
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Directive, inject } from '@angular/core';
|
|
2
|
-
import { NG_ASYNC_VALIDATORS } from '@angular/forms';
|
|
1
|
+
import { Directive, inject, input } from '@angular/core';
|
|
2
|
+
import { NG_ASYNC_VALIDATORS, } from '@angular/forms';
|
|
3
3
|
import { FormDirective } from './form.directive';
|
|
4
4
|
import { getFormControlField } from '../utils/form-utils';
|
|
5
5
|
import * as i0 from "@angular/core";
|
|
@@ -9,16 +9,21 @@ import * as i0 from "@angular/core";
|
|
|
9
9
|
*/
|
|
10
10
|
export class FormModelDirective {
|
|
11
11
|
constructor() {
|
|
12
|
+
this.validationOptions = input({ debounceTime: 0 });
|
|
12
13
|
this.formDirective = inject(FormDirective);
|
|
13
14
|
}
|
|
14
15
|
validate(control) {
|
|
15
16
|
const { ngForm, suite, formValue } = this.formDirective;
|
|
16
17
|
const field = getFormControlField(ngForm.control, control);
|
|
17
|
-
return this.formDirective.createAsyncValidator(field)(control.getRawValue());
|
|
18
|
+
return this.formDirective.createAsyncValidator(field, this.validationOptions())(control.getRawValue());
|
|
18
19
|
}
|
|
19
20
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: FormModelDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
20
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "
|
|
21
|
-
{
|
|
21
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.0.1", type: FormModelDirective, isStandalone: true, selector: "[ngModel]", inputs: { validationOptions: { classPropertyName: "validationOptions", publicName: "validationOptions", isSignal: true, isRequired: false, transformFunction: null } }, providers: [
|
|
22
|
+
{
|
|
23
|
+
provide: NG_ASYNC_VALIDATORS,
|
|
24
|
+
useExisting: FormModelDirective,
|
|
25
|
+
multi: true,
|
|
26
|
+
},
|
|
22
27
|
], ngImport: i0 }); }
|
|
23
28
|
}
|
|
24
29
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: FormModelDirective, decorators: [{
|
|
@@ -27,8 +32,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImpor
|
|
|
27
32
|
selector: '[ngModel]',
|
|
28
33
|
standalone: true,
|
|
29
34
|
providers: [
|
|
30
|
-
{
|
|
35
|
+
{
|
|
36
|
+
provide: NG_ASYNC_VALIDATORS,
|
|
37
|
+
useExisting: FormModelDirective,
|
|
38
|
+
multi: true,
|
|
39
|
+
},
|
|
31
40
|
],
|
|
32
41
|
}]
|
|
33
42
|
}] });
|
|
34
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1tb2RlbC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdmVzdC1mb3Jtcy9zcmMvbGliL2RpcmVjdGl2ZXMvZm9ybS1tb2RlbC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pELE9BQU8sRUFHTCxtQkFBbUIsR0FFcEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFakQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0scUJBQXFCLENBQUM7O0FBRzFEOzs7R0FHRztBQVlILE1BQU0sT0FBTyxrQkFBa0I7SUFYL0I7UUFZUyxzQkFBaUIsR0FBRyxLQUFLLENBQW9CLEVBQUUsWUFBWSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDeEQsa0JBQWEsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7S0FXeEQ7SUFUUSxRQUFRLENBQ2IsT0FBd0I7UUFFeEIsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUN4RCxNQUFNLEtBQUssR0FBRyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzNELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FDN0UsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUNpQixDQUFDO0lBQzNDLENBQUM7OEdBWlUsa0JBQWtCO2tHQUFsQixrQkFBa0IsZ09BUmxCO1lBQ1Q7Z0JBQ0UsT0FBTyxFQUFFLG1CQUFtQjtnQkFDNUIsV0FBVyxFQUFFLGtCQUFrQjtnQkFDL0IsS0FBSyxFQUFFLElBQUk7YUFDWjtTQUNGOzsyRkFFVSxrQkFBa0I7a0JBWDlCLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLFdBQVc7b0JBQ3JCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixTQUFTLEVBQUU7d0JBQ1Q7NEJBQ0UsT0FBTyxFQUFFLG1CQUFtQjs0QkFDNUIsV0FBVyxvQkFBb0I7NEJBQy9CLEtBQUssRUFBRSxJQUFJO3lCQUNaO3FCQUNGO2lCQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBpbmplY3QsIGlucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBBYnN0cmFjdENvbnRyb2wsXG4gIEFzeW5jVmFsaWRhdG9yLFxuICBOR19BU1lOQ19WQUxJREFUT1JTLFxuICBWYWxpZGF0aW9uRXJyb3JzLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBGb3JtRGlyZWN0aXZlIH0gZnJvbSAnLi9mb3JtLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBnZXRGb3JtQ29udHJvbEZpZWxkIH0gZnJvbSAnLi4vdXRpbHMvZm9ybS11dGlscyc7XG5pbXBvcnQgeyBWYWxpZGF0aW9uT3B0aW9ucyB9IGZyb20gJy4vdmFsaWRhdGlvbi1vcHRpb25zJztcblxuLyoqXG4gKiBIb29rcyBpbnRvIHRoZSBuZ01vZGVsIHNlbGVjdG9yIGFuZCB0cmlnZ2VycyBhbiBhc3luY2hyb25vdXMgdmFsaWRhdGlvbiBmb3IgYSBmb3JtIG1vZGVsXG4gKiBJdCB3aWxsIHVzZSBhIHZlc3Qgc3VpdGUgYmVoaW5kIHRoZSBzY2VuZXNcbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW25nTW9kZWxdJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfQVNZTkNfVkFMSURBVE9SUyxcbiAgICAgIHVzZUV4aXN0aW5nOiBGb3JtTW9kZWxEaXJlY3RpdmUsXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBGb3JtTW9kZWxEaXJlY3RpdmUgaW1wbGVtZW50cyBBc3luY1ZhbGlkYXRvciB7XG4gIHB1YmxpYyB2YWxpZGF0aW9uT3B0aW9ucyA9IGlucHV0PFZhbGlkYXRpb25PcHRpb25zPih7IGRlYm91bmNlVGltZTogMCB9KTtcbiAgcHJpdmF0ZSByZWFkb25seSBmb3JtRGlyZWN0aXZlID0gaW5qZWN0KEZvcm1EaXJlY3RpdmUpO1xuXG4gIHB1YmxpYyB2YWxpZGF0ZShcbiAgICBjb250cm9sOiBBYnN0cmFjdENvbnRyb2xcbiAgKTogT2JzZXJ2YWJsZTxWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbD4ge1xuICAgIGNvbnN0IHsgbmdGb3JtLCBzdWl0ZSwgZm9ybVZhbHVlIH0gPSB0aGlzLmZvcm1EaXJlY3RpdmU7XG4gICAgY29uc3QgZmllbGQgPSBnZXRGb3JtQ29udHJvbEZpZWxkKG5nRm9ybS5jb250cm9sLCBjb250cm9sKTtcbiAgICByZXR1cm4gdGhpcy5mb3JtRGlyZWN0aXZlLmNyZWF0ZUFzeW5jVmFsaWRhdG9yKGZpZWxkLCB0aGlzLnZhbGlkYXRpb25PcHRpb25zKCkpKFxuICAgICAgY29udHJvbC5nZXRSYXdWYWx1ZSgpXG4gICAgKSBhcyBPYnNlcnZhYmxlPFZhbGlkYXRpb25FcnJvcnMgfCBudWxsPjtcbiAgfVxufVxuIl19
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { NgForm, PristineChangeEvent, StatusChangeEvent, ValueChangeEvent } from '@angular/forms';
|
|
3
|
-
import { debounceTime, distinctUntilChanged, filter, map, Observable, of, ReplaySubject,
|
|
4
|
-
import {
|
|
5
|
-
import { cloneDeep, getAllFormErrors, mergeValuesAndRawValues, set } from '../utils/form-utils';
|
|
1
|
+
import { Directive, inject, input, Output } from '@angular/core';
|
|
2
|
+
import { NgForm, PristineChangeEvent, StatusChangeEvent, ValueChangeEvent, } from '@angular/forms';
|
|
3
|
+
import { debounceTime, distinctUntilChanged, filter, map, Observable, of, ReplaySubject, startWith, Subject, switchMap, take, takeUntil, tap, zip, } from 'rxjs';
|
|
4
|
+
import { toObservable } from '@angular/core/rxjs-interop';
|
|
5
|
+
import { cloneDeep, getAllFormErrors, mergeValuesAndRawValues, set, } from '../utils/form-utils';
|
|
6
6
|
import { validateShape } from '../utils/shape-validation';
|
|
7
7
|
import * as i0 from "@angular/core";
|
|
8
8
|
export class FormDirective {
|
|
@@ -37,33 +37,37 @@ export class FormDirective {
|
|
|
37
37
|
* @param v
|
|
38
38
|
*/
|
|
39
39
|
this.validationConfig = input(null);
|
|
40
|
-
this.
|
|
41
|
-
this.statusChanges$ = this.ngForm.form.events.pipe(filter(v => v instanceof StatusChangeEvent), map(v => v.status), distinctUntilChanged());
|
|
40
|
+
this.pending$ = this.ngForm.form.events.pipe(filter((v) => v instanceof StatusChangeEvent), map((v) => v.status), filter((v) => v === 'PENDING'), distinctUntilChanged());
|
|
42
41
|
/**
|
|
43
|
-
*
|
|
44
|
-
* that
|
|
42
|
+
* Emits every time the form status changes in a state
|
|
43
|
+
* that is not PENDING
|
|
44
|
+
* We need this to assure that the form is in 'idle' state
|
|
45
45
|
*/
|
|
46
|
-
this.idle$ = this.
|
|
47
|
-
this.valueChanges$ = this.ngForm.form.events.pipe(filter(v => v instanceof ValueChangeEvent), map(v => v.value), map(() => mergeValuesAndRawValues(this.ngForm.form)));
|
|
46
|
+
this.idle$ = this.ngForm.form.events.pipe(filter((v) => v instanceof StatusChangeEvent), map((v) => v.status), filter((v) => v !== 'PENDING'), distinctUntilChanged());
|
|
48
47
|
/**
|
|
49
48
|
* Triggered as soon as the form value changes
|
|
49
|
+
* Also every time Angular creates a new control or group
|
|
50
|
+
* It also contains the disabled values (raw values)
|
|
50
51
|
*/
|
|
51
|
-
this.formValueChange = this.
|
|
52
|
-
|
|
53
|
-
|
|
52
|
+
this.formValueChange = this.ngForm.form.events.pipe(filter((v) => v instanceof ValueChangeEvent), map((v) => v.value), map(() => mergeValuesAndRawValues(this.ngForm.form)));
|
|
53
|
+
/**
|
|
54
|
+
* Emits an object with all the errors of the form
|
|
55
|
+
* every time a form control or form groups changes its status to valid or invalid
|
|
56
|
+
*/
|
|
57
|
+
this.errorsChange = this.ngForm.form.events.pipe(filter((v) => v instanceof StatusChangeEvent), map((v) => v.status), filter((v) => v !== 'PENDING'), map(() => getAllFormErrors(this.ngForm.form)));
|
|
54
58
|
/**
|
|
55
59
|
* Triggered as soon as the form becomes dirty
|
|
56
60
|
*/
|
|
57
|
-
this.dirtyChange = this.
|
|
58
|
-
this.
|
|
61
|
+
this.dirtyChange = this.ngForm.form.events.pipe(filter((v) => v instanceof PristineChangeEvent), map((v) => !v.pristine), startWith(this.ngForm.form.dirty), distinctUntilChanged());
|
|
62
|
+
this.destroy$$ = new Subject();
|
|
59
63
|
/**
|
|
60
|
-
*
|
|
64
|
+
* Fired when the status of the root form changes.
|
|
61
65
|
*/
|
|
62
|
-
this.
|
|
66
|
+
this.statusChanges$ = this.ngForm.form.statusChanges.pipe(startWith(this.ngForm.form.status), distinctUntilChanged());
|
|
63
67
|
/**
|
|
64
|
-
*
|
|
68
|
+
* Triggered When the form becomes valid but waits until the form is idle
|
|
65
69
|
*/
|
|
66
|
-
this.
|
|
70
|
+
this.validChange = this.statusChanges$.pipe(filter((e) => e === 'VALID' || e === 'INVALID'), map((v) => v === 'VALID'), distinctUntilChanged());
|
|
67
71
|
/**
|
|
68
72
|
* Used to debounce formValues to make sure vest isn't triggered all the time
|
|
69
73
|
*/
|
|
@@ -78,12 +82,14 @@ export class FormDirective {
|
|
|
78
82
|
}
|
|
79
83
|
const streams = Object.keys(conf).map((key) => {
|
|
80
84
|
return this.ngForm?.form.get(key)?.valueChanges.pipe(
|
|
81
|
-
//
|
|
82
|
-
switchMap(() => this.
|
|
85
|
+
// Wait until something is pending
|
|
86
|
+
switchMap(() => this.pending$),
|
|
87
|
+
// Wait until the form is not pending anymore
|
|
88
|
+
switchMap(() => this.idle$), map(() => this.ngForm?.form.get(key)?.value), takeUntil(this.destroy$$), tap((v) => {
|
|
83
89
|
conf[key]?.forEach((path) => {
|
|
84
90
|
this.ngForm?.form.get(path)?.updateValueAndValidity({
|
|
85
91
|
onlySelf: true,
|
|
86
|
-
emitEvent: true
|
|
92
|
+
emitEvent: true,
|
|
87
93
|
});
|
|
88
94
|
});
|
|
89
95
|
}));
|
|
@@ -95,7 +101,7 @@ export class FormDirective {
|
|
|
95
101
|
* Trigger shape validations if the form gets updated
|
|
96
102
|
* This is how we can throw run-time errors
|
|
97
103
|
*/
|
|
98
|
-
this.
|
|
104
|
+
this.formValueChange.pipe(takeUntil(this.destroy$$)).subscribe((v) => {
|
|
99
105
|
if (this.formShape()) {
|
|
100
106
|
validateShape(v, this.formShape());
|
|
101
107
|
}
|
|
@@ -111,11 +117,10 @@ export class FormDirective {
|
|
|
111
117
|
* This will feed the formValueCache, debounce it till the next tick
|
|
112
118
|
* and create an asynchronous validator that runs a vest suite
|
|
113
119
|
* @param field
|
|
114
|
-
* @param
|
|
115
|
-
* @param suite
|
|
120
|
+
* @param validationOptions
|
|
116
121
|
* @returns an asynchronous validator function
|
|
117
122
|
*/
|
|
118
|
-
createAsyncValidator(field) {
|
|
123
|
+
createAsyncValidator(field, validationOptions) {
|
|
119
124
|
if (!this.suite()) {
|
|
120
125
|
return () => of(null);
|
|
121
126
|
}
|
|
@@ -129,7 +134,7 @@ export class FormDirective {
|
|
|
129
134
|
this.formValueCache[field] = {
|
|
130
135
|
sub$$: new ReplaySubject(1), // Keep track of the last model
|
|
131
136
|
};
|
|
132
|
-
this.formValueCache[field].debounced = this.formValueCache[field].sub$$.pipe(debounceTime(
|
|
137
|
+
this.formValueCache[field].debounced = this.formValueCache[field].sub$$.pipe(debounceTime(validationOptions.debounceTime));
|
|
133
138
|
}
|
|
134
139
|
// Next the latest model in the cache for a certain field
|
|
135
140
|
this.formValueCache[field].sub$$.next(mod);
|
|
@@ -139,15 +144,18 @@ export class FormDirective {
|
|
|
139
144
|
return new Observable((observer) => {
|
|
140
145
|
this.suite()(mod, field).done((result) => {
|
|
141
146
|
const errors = result.getErrors()[field];
|
|
142
|
-
observer.next(
|
|
147
|
+
observer.next(errors ? { error: errors[0], errors } : null);
|
|
143
148
|
observer.complete();
|
|
144
149
|
});
|
|
145
150
|
});
|
|
146
|
-
}),
|
|
151
|
+
}), takeUntil(this.destroy$$));
|
|
147
152
|
};
|
|
148
153
|
}
|
|
154
|
+
ngOnDestroy() {
|
|
155
|
+
this.destroy$$.next();
|
|
156
|
+
}
|
|
149
157
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: FormDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
150
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.0.1", type: FormDirective, isStandalone: true, selector: "form[scVestForm]", inputs: { formValue: { classPropertyName: "formValue", publicName: "formValue", isSignal: true, isRequired: false, transformFunction: null }, suite: { classPropertyName: "suite", publicName: "suite", isSignal: true, isRequired: false, transformFunction: null }, formShape: { classPropertyName: "formShape", publicName: "formShape", isSignal: true, isRequired: false, transformFunction: null }, validationConfig: { classPropertyName: "validationConfig", publicName: "validationConfig", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { formValueChange: "formValueChange",
|
|
158
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.0.1", type: FormDirective, isStandalone: true, selector: "form[scVestForm]", inputs: { formValue: { classPropertyName: "formValue", publicName: "formValue", isSignal: true, isRequired: false, transformFunction: null }, suite: { classPropertyName: "suite", publicName: "suite", isSignal: true, isRequired: false, transformFunction: null }, formShape: { classPropertyName: "formShape", publicName: "formShape", isSignal: true, isRequired: false, transformFunction: null }, validationConfig: { classPropertyName: "validationConfig", publicName: "validationConfig", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { formValueChange: "formValueChange", errorsChange: "errorsChange", dirtyChange: "dirtyChange", validChange: "validChange" }, ngImport: i0 }); }
|
|
151
159
|
}
|
|
152
160
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: FormDirective, decorators: [{
|
|
153
161
|
type: Directive,
|
|
@@ -157,11 +165,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImpor
|
|
|
157
165
|
}]
|
|
158
166
|
}], ctorParameters: () => [], propDecorators: { formValueChange: [{
|
|
159
167
|
type: Output
|
|
168
|
+
}], errorsChange: [{
|
|
169
|
+
type: Output
|
|
160
170
|
}], dirtyChange: [{
|
|
161
171
|
type: Output
|
|
162
172
|
}], validChange: [{
|
|
163
173
|
type: Output
|
|
164
|
-
}], errorsChange: [{
|
|
165
|
-
type: Output
|
|
166
174
|
}] } });
|
|
167
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdmVzdC1mb3Jtcy9zcmMvbGliL2RpcmVjdGl2ZXMvZm9ybS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0UsT0FBTyxFQUVILE1BQU0sRUFDTixtQkFBbUIsRUFDbkIsaUJBQWlCLEVBRWpCLGdCQUFnQixFQUNuQixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFDTCxZQUFZLEVBQ1osb0JBQW9CLEVBQ3BCLE1BQU0sRUFDTixHQUFHLEVBQ0gsVUFBVSxFQUNWLEVBQUUsRUFDRixhQUFhLEVBQUUsV0FBVyxFQUMxQixTQUFTLEVBQ1QsSUFBSSxFQUNKLEdBQUcsRUFDSCxHQUFHLEVBQ0osTUFBTSxNQUFNLENBQUM7QUFFZCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFOUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSx1QkFBdUIsRUFBRSxHQUFHLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNoRyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7O0FBTTFELE1BQU0sT0FBTyxhQUFhO0lBeUd0QjtRQXhHZ0IsV0FBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBRXpFOztXQUVHO1FBQ2EsY0FBUyxHQUFHLEtBQUssQ0FBVyxJQUFJLENBQUMsQ0FBQztRQUVsRDs7V0FFRztRQUNhLFVBQUssR0FBRyxLQUFLLENBQXdFLElBQUksQ0FBQyxDQUFDO1FBRTNHOzs7OztXQUtH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QUFJLENBQUMsQ0FBQyxDQUFDO3dCQUM5RCxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ3hCLENBQUMsQ0FBQyxDQUFDO2dCQUNQLENBQUMsQ0FBd0MsQ0FBQztZQUM5QyxDQUFDLENBQUMsRUFDRixrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQ3RDLENBQUM7UUFDTixDQUFDLENBQUM7SUFDTixDQUFDOzhHQTNNUSxhQUFhO2tHQUFiLGFBQWE7OzJGQUFiLGFBQWE7a0JBSnpCLFNBQVM7bUJBQUM7b0JBQ1AsUUFBUSxFQUFFLGtCQUFrQjtvQkFDNUIsVUFBVSxFQUFFLElBQUk7aUJBQ25CO3dEQThENkIsZUFBZTtzQkFBeEMsTUFBTTtnQkFZbUIsV0FBVztzQkFBcEMsTUFBTTtnQkFZbUIsV0FBVztzQkFBcEMsTUFBTTtnQkFLbUIsWUFBWTtzQkFBckMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERlc3Ryb3lSZWYsIERpcmVjdGl2ZSwgaW5qZWN0LCBpbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIEFzeW5jVmFsaWRhdG9yRm4sXG4gICAgTmdGb3JtLFxuICAgIFByaXN0aW5lQ2hhbmdlRXZlbnQsXG4gICAgU3RhdHVzQ2hhbmdlRXZlbnQsXG4gICAgVmFsaWRhdGlvbkVycm9ycyxcbiAgICBWYWx1ZUNoYW5nZUV2ZW50XG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gIGRlYm91bmNlVGltZSxcbiAgZGlzdGluY3RVbnRpbENoYW5nZWQsXG4gIGZpbHRlcixcbiAgbWFwLFxuICBPYnNlcnZhYmxlLFxuICBvZixcbiAgUmVwbGF5U3ViamVjdCwgc2hhcmVSZXBsYXksXG4gIHN3aXRjaE1hcCxcbiAgdGFrZSxcbiAgdGFwLFxuICB6aXBcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBTdGF0aWNTdWl0ZSB9IGZyb20gJ3Zlc3QnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkLCB0b09ic2VydmFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBEZWVwUmVxdWlyZWQgfSBmcm9tICcuLi91dGlscy9kZWVwLXJlcXVpcmVkJztcbmltcG9ydCB7IGNsb25lRGVlcCwgZ2V0QWxsRm9ybUVycm9ycywgbWVyZ2VWYWx1ZXNBbmRSYXdWYWx1ZXMsIHNldCB9IGZyb20gJy4uL3V0aWxzL2Zvcm0tdXRpbHMnO1xuaW1wb3J0IHsgdmFsaWRhdGVTaGFwZSB9IGZyb20gJy4uL3V0aWxzL3NoYXBlLXZhbGlkYXRpb24nO1xuXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ2Zvcm1bc2NWZXN0Rm9ybV0nLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG59KVxuZXhwb3J0IGNsYXNzIEZvcm1EaXJlY3RpdmU8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgbmdGb3JtID0gaW5qZWN0KE5nRm9ybSwgeyBzZWxmOiB0cnVlLCBvcHRpb25hbDogZmFsc2UgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIGZvcm0sIHRoaXMgaXMgbmVlZGVkIGZvciB0aGUgdmFsaWRhdGlvbiBwYXJ0XG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IGZvcm1WYWx1ZSA9IGlucHV0PFQgfCBudWxsPihudWxsKTtcblxuICAgIC8qKlxuICAgICAqIFN0YXRpYyB2ZXN0IHN1aXRlIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGZlZWQgb3VyIGFuZ3VsYXIgdmFsaWRhdG9yc1xuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBzdWl0ZSA9IGlucHV0PFN0YXRpY1N1aXRlPHN0cmluZywgc3RyaW5nLCAobW9kZWw6IFQsIGZpZWxkOiBzdHJpbmcpID0+IHZvaWQ+IHwgbnVsbD4obnVsbCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2hhcGUgb2Ygb3VyIGZvcm0gbW9kZWwuIFRoaXMgaXMgYSBkZWVwIHJlcXVpcmVkIHZlcnNpb24gb2YgdGhlIGZvcm0gbW9kZWxcbiAgICAgKiBUaGUgZ29hbCBpcyB0byBhZGQgZGVmYXVsdCB2YWx1ZXMgdG8gdGhlIHNoYXBlIHNvIHdoZW4gdGhlIHRlbXBsYXRlLWRyaXZlbiBmb3JtXG4gICAgICogY29udGFpbnMgdmFsdWVzIHRoYXQgc2hvdWxkbid0IGJlIHRoZXJlICh0eXBvJ3MpIHRoYXQgdGhlIGRldmVsb3BlciBnZXRzIHJ1bi10aW1lXG4gICAgICogZXJyb3JzIGluIGRldiBtb2RlXG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IGZvcm1TaGFwZSA9IGlucHV0PERlZXBSZXF1aXJlZDxUPiB8IG51bGw+KG51bGwpO1xuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgdmFsaWRhdGlvbiBjb25maWcgd2hpY2ggaXMgYSBkeW5hbWljIG9iamVjdCB0aGF0IHdpbGwgYmUgdXNlZCB0b1xuICAgICAqIHRyaWdnZXIgdmFsaWRhdGlvbnMgb24gdGhlIGRlcGVuZGFudCBmaWVsZHNcbiAgICAgKiBFZzogYGBgdHlwZXNjcmlwdFxuICAgICAqIHZhbGlkYXRpb25Db25maWcgPSB7XG4gICAgICogICAgICdwYXNzd29yZHMucGFzc3dvcmQnOiBbJ3Bhc3N3b3Jkcy5jb25maXJtUGFzc3dvcmQnXVxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoaXMgd2lsbCB0cmlnZ2VyIHRoZSB1cGRhdGVWYWx1ZUFuZFZhbGlkaXR5IG9uIHBhc3N3b3Jkcy5jb25maXJtUGFzc3dvcmQgZXZlcnkgdGltZSB0aGUgcGFzc3dvcmRzLnBhc3N3b3JkIGdldHMgYSBuZXcgdmFsdWVcbiAgICAgKlxuICAgICAqIEBwYXJhbSB2XG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IHZhbGlkYXRpb25Db25maWcgPSBpbnB1dDx7IFtrZXk6IHN0cmluZ106IHN0cmluZ1tdIH0gfCBudWxsPihudWxsKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG4gICAgcHJpdmF0ZSByZWFkb25seSBzdGF0dXNDaGFuZ2VzJCA9IHRoaXMubmdGb3JtLmZvcm0uZXZlbnRzLnBpcGUoXG4gICAgICAgIGZpbHRlcih2ID0+IHYgaW5zdGFuY2VvZiBTdGF0dXNDaGFuZ2VFdmVudCksXG4gICAgICAgIG1hcCh2ID0+ICh2IGFzIFN0YXR1c0NoYW5nZUV2ZW50KS5zdGF0dXMpLFxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpXG4gICAgKTtcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gdGhlIGZvcm0gaXMgaWRsZS4gVGhpcyBmaXhlcyB0aGUgUEVORElORyBzdGF0ZSBpc3N1ZXNcbiAgICAgKiB0aGF0IGFyZSBpbnRyb2R1Y2VkIGR1ZSB0byB0aGUgbmF0dXJlIG9mIGFzeW5jaHJvbm91cyB2YWxpZGF0aW9uc1xuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBpZGxlJCA9IHRoaXMuc3RhdHVzQ2hhbmdlcyQucGlwZShcbiAgICAgICAgZmlsdGVyKHYgPT4gdiAhPT0gJ1BFTkRJTkcnKSxcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgc2hhcmVSZXBsYXkoMSlcbiAgICApO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSB2YWx1ZUNoYW5nZXMkID0gdGhpcy5uZ0Zvcm0uZm9ybS5ldmVudHMucGlwZShcbiAgICAgICAgZmlsdGVyKHYgPT4gdiBpbnN0YW5jZW9mIFZhbHVlQ2hhbmdlRXZlbnQpLFxuICAgICAgICBtYXAodiA9PiAodiBhcyBWYWx1ZUNoYW5nZUV2ZW50PGFueT4pLnZhbHVlKSxcbiAgICAgICAgbWFwKCgpID0+IG1lcmdlVmFsdWVzQW5kUmF3VmFsdWVzPFQ+KHRoaXMubmdGb3JtLmZvcm0pKVxuICAgICk7XG5cbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgYXMgc29vbiBhcyB0aGUgZm9ybSB2YWx1ZSBjaGFuZ2VzXG4gICAgICovXG4gICAgQE91dHB1dCgpIHB1YmxpYyByZWFkb25seSBmb3JtVmFsdWVDaGFuZ2UgPSB0aGlzLnZhbHVlQ2hhbmdlcyQucGlwZShcbiAgICAgIGRlYm91bmNlVGltZSgwKS8vIHdhaXQgdW50aWwgYWxsIGZvcm0gZWxlbWVudHMgYXJlIHJlbmRlcmVkXG4gICAgKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRpcnR5Q2hhbmdlcyQgPSB0aGlzLm5nRm9ybS5mb3JtLmV2ZW50cy5waXBlKFxuICAgICAgICBmaWx0ZXIodiA9PiB2IGluc3RhbmNlb2YgUHJpc3RpbmVDaGFuZ2VFdmVudCksXG4gICAgICAgIG1hcCh2ID0+ICEodiBhcyBQcmlzdGluZUNoYW5nZUV2ZW50KS5wcmlzdGluZSksXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcbiAgICApO1xuXG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIGFzIHNvb24gYXMgdGhlIGZvcm0gYmVjb21lcyBkaXJ0eVxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBwdWJsaWMgcmVhZG9ubHkgZGlydHlDaGFuZ2UgPSB0aGlzLmRpcnR5Q2hhbmdlcyQ7XG4gICAgcHJpdmF0ZSByZWFkb25seSB2YWxpZENoYW5nZXMkID0gdGhpcy5zdGF0dXNDaGFuZ2VzJC5waXBlKFxuICAgICAgICBmaWx0ZXIoZSA9PiBlID09PSAnVkFMSUQnIHx8IGUgPT09ICdJTlZBTElEJyksXG4gICAgICAgIG1hcCh2ID0+IHYgPT09ICdWQUxJRCcpLFxuICAgICAgICBzd2l0Y2hNYXAoKHYpID0+IHRoaXMuaWRsZSQpLFxuICAgICAgICBtYXAoKCkgPT4gdGhpcy5uZ0Zvcm0/LmZvcm0udmFsaWQpLFxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICk7XG5cbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgV2hlbiB0aGUgZm9ybSBiZWNvbWVzIHZhbGlkIGJ1dCB3YWl0cyB1bnRpbCB0aGUgZm9ybSBpcyBpZGxlXG4gICAgICovXG4gICAgQE91dHB1dCgpIHB1YmxpYyByZWFkb25seSB2YWxpZENoYW5nZSA9IHRoaXMudmFsaWRDaGFuZ2VzJDtcblxuICAgIC8qKlxuICAgICAqIEVtaXRzIGFuIG9iamVjdCB3aXRoIGFsbCB0aGUgZXJyb3JzIG9mIHRoZSBmb3JtXG4gICAgICovXG4gICAgQE91dHB1dCgpIHB1YmxpYyByZWFkb25seSBlcnJvcnNDaGFuZ2UgPSB0aGlzLnZhbHVlQ2hhbmdlcyQucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuaWRsZSQpLFxuICAgICAgICBtYXAoKCkgPT4gZ2V0QWxsRm9ybUVycm9ycyh0aGlzLm5nRm9ybS5mb3JtKSlcbiAgICApO1xuXG4gICAgLyoqXG4gICAgICogVXNlZCB0byBkZWJvdW5jZSBmb3JtVmFsdWVzIHRvIG1ha2Ugc3VyZSB2ZXN0IGlzbid0IHRyaWdnZXJlZCBhbGwgdGhlIHRpbWVcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGZvcm1WYWx1ZUNhY2hlOiB7XG4gICAgICAgIFtmaWVsZDogc3RyaW5nXTogUGFydGlhbDx7XG4gICAgICAgICAgICBzdWIkJDogUmVwbGF5U3ViamVjdDx1bmtub3duPjtcbiAgICAgICAgICAgIGRlYm91bmNlZDogT2JzZXJ2YWJsZTxhbnk+O1xuICAgICAgICB9PjtcbiAgICB9ID0ge307XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8vIFdoZW4gdGhlIHZhbGlkYXRpb24gY29uZmlnIGNoYW5nZXNcbiAgICAgICAgLy8gTGlzdGVuIHRvIGNoYW5nZXMgb2YgdGhlIGxlZnQtc2lkZSBvZiB0aGUgY29uZmlnIGFuZCB0cmlnZ2VyIHRoZSB1cGRhdGVWYWx1ZUFuZFZhbGlkaXR5XG4gICAgICAgIC8vIGZ1bmN0aW9uIG9uIHRoZSBkZXBlbmRhbnQgY29udHJvbHMgb3IgZ3JvdXBzIGF0IHRoZSByaWdodC1zaWRlIG9mIHRoZSBjb25maWdcbiAgICAgICAgdG9PYnNlcnZhYmxlKHRoaXMudmFsaWRhdGlvbkNvbmZpZylcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIGZpbHRlcigoY29uZikgPT4gISFjb25mKSxcbiAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKGNvbmYpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjb25mKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyZWFtcyA9IE9iamVjdC5rZXlzKGNvbmYpLm1hcCgoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5uZ0Zvcm0/LmZvcm0uZ2V0KGtleSk/LnZhbHVlQ2hhbmdlcy5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdhaXQgdW50aWwgdGhlIGZvcm0gaXMgaWRsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLmlkbGUkKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAoKCkgPT4gdGhpcy5uZ0Zvcm0/LmZvcm0uZ2V0KGtleSk/LnZhbHVlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXAoKHYpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZltrZXldPy5mb3JFYWNoKChwYXRoOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmdGb3JtPy5mb3JtLmdldChwYXRoKT8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seVNlbGY6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdEV2ZW50OiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHppcChzdHJlYW1zKTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVHJpZ2dlciBzaGFwZSB2YWxpZGF0aW9ucyBpZiB0aGUgZm9ybSBnZXRzIHVwZGF0ZWRcbiAgICAgICAgICogVGhpcyBpcyBob3cgd2UgY2FuIHRocm93IHJ1bi10aW1lIGVycm9yc1xuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZXMkLnBpcGUoXG4gICAgICAgICAgICBzd2l0Y2hNYXAoKHYpID0+IHRoaXMuaWRsZSQucGlwZShtYXAoKCkgPT4gdikpKSxcbiAgICAgICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpXG4gICAgICAgICkuc3Vic2NyaWJlKHYgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZm9ybVNoYXBlKCkpIHtcbiAgICAgICAgICAgICAgICB2YWxpZGF0ZVNoYXBlKHYsIHRoaXMuZm9ybVNoYXBlKCkgYXMgRGVlcFJlcXVpcmVkPFQ+KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIE1hcmsgYWxsIHRoZSBmaWVsZHMgYXMgdG91Y2hlZCB3aGVuIHRoZSBmb3JtIGlzIHN1Ym1pdHRlZFxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5uZ0Zvcm0ubmdTdWJtaXQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMubmdGb3JtLmZvcm0ubWFya0FsbEFzVG91Y2hlZCgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIFRoaXMgd2lsbCBmZWVkIHRoZSBmb3JtVmFsdWVDYWNoZSwgZGVib3VuY2UgaXQgdGlsbCB0aGUgbmV4dCB0aWNrXG4gICAgICogYW5kIGNyZWF0ZSBhbiBhc3luY2hyb25vdXMgdmFsaWRhdG9yIHRoYXQgcnVucyBhIHZlc3Qgc3VpdGVcbiAgICAgKiBAcGFyYW0gZmllbGRcbiAgICAgKiBAcGFyYW0gbW9kZWxcbiAgICAgKiBAcGFyYW0gc3VpdGVcbiAgICAgKiBAcmV0dXJucyBhbiBhc3luY2hyb25vdXMgdmFsaWRhdG9yIGZ1bmN0aW9uXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZUFzeW5jVmFsaWRhdG9yKFxuICAgICAgICBmaWVsZDogc3RyaW5nXG4gICAgKTogQXN5bmNWYWxpZGF0b3JGbiB7XG4gICAgICAgIGlmICghdGhpcy5zdWl0ZSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gKCkgPT4gb2YobnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZm9ybVZhbHVlKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBtb2QgPSBjbG9uZURlZXAodGhpcy5mb3JtVmFsdWUoKSBhcyBUKTtcbiAgICAgICAgICAgIHNldChtb2QgYXMgb2JqZWN0LCBmaWVsZCwgdmFsdWUpOyAvLyBVcGRhdGUgdGhlIHByb3BlcnR5IHdpdGggcGF0aFxuICAgICAgICAgICAgaWYgKCF0aGlzLmZvcm1WYWx1ZUNhY2hlW2ZpZWxkXSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybVZhbHVlQ2FjaGVbZmllbGRdID0ge1xuICAgICAgICAgICAgICAgICAgICBzdWIkJDogbmV3IFJlcGxheVN1YmplY3QoMSksIC8vIEtlZXAgdHJhY2sgb2YgdGhlIGxhc3QgbW9kZWxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybVZhbHVlQ2FjaGVbZmllbGRdLmRlYm91bmNlZCA9IHRoaXMuZm9ybVZhbHVlQ2FjaGVbZmllbGRdLnN1YiQkIS5waXBlKGRlYm91bmNlVGltZSgwKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBOZXh0IHRoZSBsYXRlc3QgbW9kZWwgaW4gdGhlIGNhY2hlIGZvciBhIGNlcnRhaW4gZmllbGRcbiAgICAgICAgICAgIHRoaXMuZm9ybVZhbHVlQ2FjaGVbZmllbGRdLnN1YiQkIS5uZXh0KG1vZCk7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZvcm1WYWx1ZUNhY2hlW2ZpZWxkXS5kZWJvdW5jZWQhLnBpcGUoXG4gICAgICAgICAgICAgICAgLy8gV2hlbiBkZWJvdW5jZWQsIHRha2UgdGhlIGxhdGVzdCB2YWx1ZSBhbmQgcGVyZm9ybSB0aGUgYXN5bmNocm9ub3VzIHZlc3QgdmFsaWRhdGlvblxuICAgICAgICAgICAgICAgIHRha2UoMSksXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdWl0ZSgpIShtb2QsIGZpZWxkKS5kb25lKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvcnMgPSByZXN1bHQuZ2V0RXJyb3JzKClbZmllbGRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQoKGVycm9ycyA/IHsgZXJyb3I6IGVycm9yc1swXSwgZXJyb3JzIH0gOiBudWxsKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KSBhcyBPYnNlcnZhYmxlPFZhbGlkYXRpb25FcnJvcnMgfCBudWxsPjtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH07XG4gICAgfVxufVxuIl19
|
|
175
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdmVzdC1mb3Jtcy9zcmMvbGliL2RpcmVjdGl2ZXMvZm9ybS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFhLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RSxPQUFPLEVBRUwsTUFBTSxFQUNOLG1CQUFtQixFQUNuQixpQkFBaUIsRUFFakIsZ0JBQWdCLEdBQ2pCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUNMLFlBQVksRUFDWixvQkFBb0IsRUFDcEIsTUFBTSxFQUNOLEdBQUcsRUFDSCxVQUFVLEVBQ1YsRUFBRSxFQUNGLGFBQWEsRUFDYixTQUFTLEVBQ1QsT0FBTyxFQUNQLFNBQVMsRUFDVCxJQUFJLEVBQ0osU0FBUyxFQUNULEdBQUcsRUFDSCxHQUFHLEdBQ0osTUFBTSxNQUFNLENBQUM7QUFFZCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFMUQsT0FBTyxFQUNMLFNBQVMsRUFDVCxnQkFBZ0IsRUFDaEIsdUJBQXVCLEVBQ3ZCLEdBQUcsR0FDSixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7QUFPMUQsTUFBTSxPQUFPLGFBQWE7SUF5SHhCO1FBeEhnQixXQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFFekU7O1dBRUc7UUFDYSxjQUFTLEdBQUcsS0FBSyxDQUFXLElBQUksQ0FBQyxDQUFDO1FBRWxEOztXQUVHO1FBQ2EsVUFBSyxHQUFHLEtBQUssQ0FJbkIsSUFBSSxDQUFDLENBQUM7UUFFaEI7Ozs7O1dBS0c7UUFDYSxjQUFTLEdBQUcsS0FBSyxDQUF5QixJQUFJLENBQUMsQ0FBQztRQUVoRTs7Ozs7Ozs7Ozs7O1dBWUc7UUFDYSxxQkFBZ0IsR0FBRyxLQUFLLENBQ3RDLElBQUksQ0FDTCxDQUFDO1FBRWUsYUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ3RELE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxZQUFZLGlCQUFpQixDQUFDLEVBQzdDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUUsQ0FBdUIsQ0FBQyxNQUFNLENBQUMsRUFDM0MsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLEVBQzlCLG9CQUFvQixFQUFFLENBQ3ZCLENBQUM7UUFFRjs7OztXQUlHO1FBQ2EsVUFBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ2xELE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxZQUFZLGlCQUFpQixDQUFDLEVBQzdDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUUsQ0FBdUIsQ0FBQyxNQUFNLENBQUMsRUFDM0MsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLEVBQzlCLG9CQUFvQixFQUFFLENBQ3ZCLENBQUM7UUFFRjs7OztXQUlHO1FBQ3VCLG9CQUFlLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDdEUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFlBQVksZ0JBQWdCLENBQUMsRUFDNUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBRSxDQUEyQixDQUFDLEtBQUssQ0FBQyxFQUM5QyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsdUJBQXVCLENBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUN4RCxDQUFDO1FBRUY7OztXQUdHO1FBQ3VCLGlCQUFZLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDbkUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFlBQVksaUJBQWlCLENBQUMsRUFDN0MsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBRSxDQUF1QixDQUFDLE1BQU0sQ0FBQyxFQUMzQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsRUFDOUIsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FDOUMsQ0FBQztRQUVGOztXQUVHO1FBQ3VCLGdCQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDbEUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFlBQVksbUJBQW1CLENBQUMsRUFDL0MsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFFLENBQXlCLENBQUMsUUFBUSxDQUFDLEVBQ2hELFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFDakMsb0JBQW9CLEVBQUUsQ0FDdkIsQ0FBQztRQUNlLGNBQVMsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBRWpEOztXQUVHO1FBQ2MsbUJBQWMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUNuRSxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQ2xDLG9CQUFvQixFQUFFLENBQ3ZCLENBQUM7UUFFRjs7V0FFRztRQUN1QixnQkFBVyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUM5RCxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxPQUFPLElBQUksQ0FBQyxLQUFLLFNBQVMsQ0FBQyxFQUMvQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxPQUFPLENBQUMsRUFDekIsb0JBQW9CLEVBQUUsQ0FDdkIsQ0FBQztRQUVGOztXQUVHO1FBQ2MsbUJBQWMsR0FLM0IsRUFBRSxDQUFDO1FBR0wscUNBQXFDO1FBQ3JDLDBGQUEwRjtRQUMxRiwrRUFBK0U7UUFDL0UsWUFBWSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQzthQUNoQyxJQUFJLENBQ0gsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQ3hCLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDVixPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsQixDQUFDO1lBQ0QsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDNUMsT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsWUFBWSxDQUFDLElBQUk7Z0JBQ2xELGtDQUFrQztnQkFDbEMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7Z0JBQzlCLDZDQUE2QztnQkFDN0MsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFDM0IsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLENBQUMsRUFDNUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFDekIsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7b0JBQ1IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLElBQVksRUFBRSxFQUFFO3dCQUNsQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsc0JBQXNCLENBQUM7NEJBQ2xELFFBQVEsRUFBRSxJQUFJOzRCQUNkLFNBQVMsRUFBRSxJQUFJO3lCQUNoQixDQUFDLENBQUM7b0JBQ0wsQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQyxDQUFDLENBQ0gsQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdEIsQ0FBQyxDQUFDLENBQ0g7YUFDQSxTQUFTLEVBQUUsQ0FBQztRQUVmOzs7V0FHRztRQUNILElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUNuRSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDO2dCQUNyQixhQUFhLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQXFCLENBQUMsQ0FBQztZQUN4RCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSDs7V0FFRztRQUNILElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDbEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN0QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxvQkFBb0IsQ0FBQyxLQUFhLEVBQUUsaUJBQW9DO1FBQzdFLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUNsQixPQUFPLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4QixDQUFDO1FBQ0QsT0FBTyxDQUFDLEtBQVUsRUFBRSxFQUFFO1lBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQztnQkFDdEIsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbEIsQ0FBQztZQUNELE1BQU0sR0FBRyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFPLENBQUMsQ0FBQztZQUM3QyxHQUFHLENBQUMsR0FBYSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLGdDQUFnQztZQUNsRSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUNoQyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxHQUFHO29CQUMzQixLQUFLLEVBQUUsSUFBSSxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsK0JBQStCO2lCQUM3RCxDQUFDO2dCQUNGLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQ3hELEtBQUssQ0FDSixDQUFDLEtBQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDaEUsQ0FBQztZQUNELHlEQUF5RDtZQUN6RCxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFNUMsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLFNBQVUsQ0FBQyxJQUFJO1lBQy9DLHFGQUFxRjtZQUNyRixJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQ1AsU0FBUyxDQUFDLEdBQUcsRUFBRTtnQkFDYixPQUFPLElBQUksVUFBVSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7b0JBQ2pDLElBQUksQ0FBQyxLQUFLLEVBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7d0JBQ3hDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDekMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQzVELFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDdEIsQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQyxDQUF3QyxDQUFDO1lBQzVDLENBQUMsQ0FBQyxFQUNGLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQzFCLENBQUM7UUFDSixDQUFDLENBQUM7SUFDSixDQUFDO0lBRU0sV0FBVztRQUNoQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3hCLENBQUM7OEdBNU5VLGFBQWE7a0dBQWIsYUFBYTs7MkZBQWIsYUFBYTtrQkFKekIsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsa0JBQWtCO29CQUM1QixVQUFVLEVBQUUsSUFBSTtpQkFDakI7d0RBbUUyQixlQUFlO3NCQUF4QyxNQUFNO2dCQVVtQixZQUFZO3NCQUFyQyxNQUFNO2dCQVVtQixXQUFXO3NCQUFwQyxNQUFNO2dCQW1CbUIsV0FBVztzQkFBcEMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgaW5qZWN0LCBpbnB1dCwgT25EZXN0cm95LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEFzeW5jVmFsaWRhdG9yRm4sXG4gIE5nRm9ybSxcbiAgUHJpc3RpbmVDaGFuZ2VFdmVudCxcbiAgU3RhdHVzQ2hhbmdlRXZlbnQsXG4gIFZhbGlkYXRpb25FcnJvcnMsXG4gIFZhbHVlQ2hhbmdlRXZlbnQsXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gIGRlYm91bmNlVGltZSxcbiAgZGlzdGluY3RVbnRpbENoYW5nZWQsXG4gIGZpbHRlcixcbiAgbWFwLFxuICBPYnNlcnZhYmxlLFxuICBvZixcbiAgUmVwbGF5U3ViamVjdCxcbiAgc3RhcnRXaXRoLFxuICBTdWJqZWN0LFxuICBzd2l0Y2hNYXAsXG4gIHRha2UsXG4gIHRha2VVbnRpbCxcbiAgdGFwLFxuICB6aXAsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgU3RhdGljU3VpdGUgfSBmcm9tICd2ZXN0JztcbmltcG9ydCB7IHRvT2JzZXJ2YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IERlZXBSZXF1aXJlZCB9IGZyb20gJy4uL3V0aWxzL2RlZXAtcmVxdWlyZWQnO1xuaW1wb3J0IHtcbiAgY2xvbmVEZWVwLFxuICBnZXRBbGxGb3JtRXJyb3JzLFxuICBtZXJnZVZhbHVlc0FuZFJhd1ZhbHVlcyxcbiAgc2V0LFxufSBmcm9tICcuLi91dGlscy9mb3JtLXV0aWxzJztcbmltcG9ydCB7IHZhbGlkYXRlU2hhcGUgfSBmcm9tICcuLi91dGlscy9zaGFwZS12YWxpZGF0aW9uJztcbmltcG9ydCB7IFZhbGlkYXRpb25PcHRpb25zIH0gZnJvbSAnLi92YWxpZGF0aW9uLW9wdGlvbnMnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdmb3JtW3NjVmVzdEZvcm1dJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgRm9ybURpcmVjdGl2ZTxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4gaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBwdWJsaWMgcmVhZG9ubHkgbmdGb3JtID0gaW5qZWN0KE5nRm9ybSwgeyBzZWxmOiB0cnVlLCBvcHRpb25hbDogZmFsc2UgfSk7XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSBvZiB0aGUgZm9ybSwgdGhpcyBpcyBuZWVkZWQgZm9yIHRoZSB2YWxpZGF0aW9uIHBhcnRcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBmb3JtVmFsdWUgPSBpbnB1dDxUIHwgbnVsbD4obnVsbCk7XG5cbiAgLyoqXG4gICAqIFN0YXRpYyB2ZXN0IHN1aXRlIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGZlZWQgb3VyIGFuZ3VsYXIgdmFsaWRhdG9yc1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHN1aXRlID0gaW5wdXQ8U3RhdGljU3VpdGU8XG4gICAgc3RyaW5nLFxuICAgIHN0cmluZyxcbiAgICAobW9kZWw6IFQsIGZpZWxkOiBzdHJpbmcpID0+IHZvaWRcbiAgPiB8IG51bGw+KG51bGwpO1xuXG4gIC8qKlxuICAgKiBUaGUgc2hhcGUgb2Ygb3VyIGZvcm0gbW9kZWwuIFRoaXMgaXMgYSBkZWVwIHJlcXVpcmVkIHZlcnNpb24gb2YgdGhlIGZvcm0gbW9kZWxcbiAgICogVGhlIGdvYWwgaXMgdG8gYWRkIGRlZmF1bHQgdmFsdWVzIHRvIHRoZSBzaGFwZSBzbyB3aGVuIHRoZSB0ZW1wbGF0ZS1kcml2ZW4gZm9ybVxuICAgKiBjb250YWlucyB2YWx1ZXMgdGhhdCBzaG91bGRuJ3QgYmUgdGhlcmUgKHR5cG8ncykgdGhhdCB0aGUgZGV2ZWxvcGVyIGdldHMgcnVuLXRpbWVcbiAgICogZXJyb3JzIGluIGRldiBtb2RlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZm9ybVNoYXBlID0gaW5wdXQ8RGVlcFJlcXVpcmVkPFQ+IHwgbnVsbD4obnVsbCk7XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIHZhbGlkYXRpb24gY29uZmlnIHdoaWNoIGlzIGEgZHluYW1pYyBvYmplY3QgdGhhdCB3aWxsIGJlIHVzZWQgdG9cbiAgICogdHJpZ2dlciB2YWxpZGF0aW9ucyBvbiB0aGUgZGVwZW5kYW50IGZpZWxkc1xuICAgKiBFZzogYGBgdHlwZXNjcmlwdFxuICAgKiB2YWxpZGF0aW9uQ29uZmlnID0ge1xuICAgKiAgICAgJ3Bhc3N3b3Jkcy5wYXNzd29yZCc6IFsncGFzc3dvcmRzLmNvbmZpcm1QYXNzd29yZCddXG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIFRoaXMgd2lsbCB0cmlnZ2VyIHRoZSB1cGRhdGVWYWx1ZUFuZFZhbGlkaXR5IG9uIHBhc3N3b3Jkcy5jb25maXJtUGFzc3dvcmQgZXZlcnkgdGltZSB0aGUgcGFzc3dvcmRzLnBhc3N3b3JkIGdldHMgYSBuZXcgdmFsdWVcbiAgICpcbiAgICogQHBhcmFtIHZcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB2YWxpZGF0aW9uQ29uZmlnID0gaW5wdXQ8eyBba2V5OiBzdHJpbmddOiBzdHJpbmdbXSB9IHwgbnVsbD4oXG4gICAgbnVsbFxuICApO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgcGVuZGluZyQgPSB0aGlzLm5nRm9ybS5mb3JtLmV2ZW50cy5waXBlKFxuICAgIGZpbHRlcigodikgPT4gdiBpbnN0YW5jZW9mIFN0YXR1c0NoYW5nZUV2ZW50KSxcbiAgICBtYXAoKHYpID0+ICh2IGFzIFN0YXR1c0NoYW5nZUV2ZW50KS5zdGF0dXMpLFxuICAgIGZpbHRlcigodikgPT4gdiA9PT0gJ1BFTkRJTkcnKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpXG4gICk7XG5cbiAgLyoqXG4gICAqIEVtaXRzIGV2ZXJ5IHRpbWUgdGhlIGZvcm0gc3RhdHVzIGNoYW5nZXMgaW4gYSBzdGF0ZVxuICAgKiB0aGF0IGlzIG5vdCBQRU5ESU5HXG4gICAqIFdlIG5lZWQgdGhpcyB0byBhc3N1cmUgdGhhdCB0aGUgZm9ybSBpcyBpbiAnaWRsZScgc3RhdGVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpZGxlJCA9IHRoaXMubmdGb3JtLmZvcm0uZXZlbnRzLnBpcGUoXG4gICAgZmlsdGVyKCh2KSA9PiB2IGluc3RhbmNlb2YgU3RhdHVzQ2hhbmdlRXZlbnQpLFxuICAgIG1hcCgodikgPT4gKHYgYXMgU3RhdHVzQ2hhbmdlRXZlbnQpLnN0YXR1cyksXG4gICAgZmlsdGVyKCh2KSA9PiB2ICE9PSAnUEVORElORycpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcbiAgKTtcblxuICAvKipcbiAgICogVHJpZ2dlcmVkIGFzIHNvb24gYXMgdGhlIGZvcm0gdmFsdWUgY2hhbmdlc1xuICAgKiBBbHNvIGV2ZXJ5IHRpbWUgQW5ndWxhciBjcmVhdGVzIGEgbmV3IGNvbnRyb2wgb3IgZ3JvdXBcbiAgICogSXQgYWxzbyBjb250YWlucyB0aGUgZGlzYWJsZWQgdmFsdWVzIChyYXcgdmFsdWVzKVxuICAgKi9cbiAgQE91dHB1dCgpIHB1YmxpYyByZWFkb25seSBmb3JtVmFsdWVDaGFuZ2UgPSB0aGlzLm5nRm9ybS5mb3JtLmV2ZW50cy5waXBlKFxuICAgIGZpbHRlcigodikgPT4gdiBpbnN0YW5jZW9mIFZhbHVlQ2hhbmdlRXZlbnQpLFxuICAgIG1hcCgodikgPT4gKHYgYXMgVmFsdWVDaGFuZ2VFdmVudDxhbnk+KS52YWx1ZSksXG4gICAgbWFwKCgpID0+IG1lcmdlVmFsdWVzQW5kUmF3VmFsdWVzPFQ+KHRoaXMubmdGb3JtLmZvcm0pKVxuICApO1xuXG4gIC8qKlxuICAgKiBFbWl0cyBhbiBvYmplY3Qgd2l0aCBhbGwgdGhlIGVycm9ycyBvZiB0aGUgZm9ybVxuICAgKiBldmVyeSB0aW1lIGEgZm9ybSBjb250cm9sIG9yIGZvcm0gZ3JvdXBzIGNoYW5nZXMgaXRzIHN0YXR1cyB0byB2YWxpZCBvciBpbnZhbGlkXG4gICAqL1xuICBAT3V0cHV0KCkgcHVibGljIHJlYWRvbmx5IGVycm9yc0NoYW5nZSA9IHRoaXMubmdGb3JtLmZvcm0uZXZlbnRzLnBpcGUoXG4gICAgZmlsdGVyKCh2KSA9PiB2IGluc3RhbmNlb2YgU3RhdHVzQ2hhbmdlRXZlbnQpLFxuICAgIG1hcCgodikgPT4gKHYgYXMgU3RhdHVzQ2hhbmdlRXZlbnQpLnN0YXR1cyksXG4gICAgZmlsdGVyKCh2KSA9PiB2ICE9PSAnUEVORElORycpLFxuICAgIG1hcCgoKSA9PiBnZXRBbGxGb3JtRXJyb3JzKHRoaXMubmdGb3JtLmZvcm0pKVxuICApO1xuXG4gIC8qKlxuICAgKiBUcmlnZ2VyZWQgYXMgc29vbiBhcyB0aGUgZm9ybSBiZWNvbWVzIGRpcnR5XG4gICAqL1xuICBAT3V0cHV0KCkgcHVibGljIHJlYWRvbmx5IGRpcnR5Q2hhbmdlID0gdGhpcy5uZ0Zvcm0uZm9ybS5ldmVudHMucGlwZShcbiAgICBmaWx0ZXIoKHYpID0+IHYgaW5zdGFuY2VvZiBQcmlzdGluZUNoYW5nZUV2ZW50KSxcbiAgICBtYXAoKHYpID0+ICEodiBhcyBQcmlzdGluZUNoYW5nZUV2ZW50KS5wcmlzdGluZSksXG4gICAgc3RhcnRXaXRoKHRoaXMubmdGb3JtLmZvcm0uZGlydHkpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcbiAgKTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95JCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIC8qKlxuICAgKiBGaXJlZCB3aGVuIHRoZSBzdGF0dXMgb2YgdGhlIHJvb3QgZm9ybSBjaGFuZ2VzLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzdGF0dXNDaGFuZ2VzJCA9IHRoaXMubmdGb3JtLmZvcm0uc3RhdHVzQ2hhbmdlcy5waXBlKFxuICAgIHN0YXJ0V2l0aCh0aGlzLm5nRm9ybS5mb3JtLnN0YXR1cyksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuICApO1xuXG4gIC8qKlxuICAgKiBUcmlnZ2VyZWQgV2hlbiB0aGUgZm9ybSBiZWNvbWVzIHZhbGlkIGJ1dCB3YWl0cyB1bnRpbCB0aGUgZm9ybSBpcyBpZGxlXG4gICAqL1xuICBAT3V0cHV0KCkgcHVibGljIHJlYWRvbmx5IHZhbGlkQ2hhbmdlID0gdGhpcy5zdGF0dXNDaGFuZ2VzJC5waXBlKFxuICAgIGZpbHRlcigoZSkgPT4gZSA9PT0gJ1ZBTElEJyB8fCBlID09PSAnSU5WQUxJRCcpLFxuICAgIG1hcCgodikgPT4gdiA9PT0gJ1ZBTElEJyksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuICApO1xuXG4gIC8qKlxuICAgKiBVc2VkIHRvIGRlYm91bmNlIGZvcm1WYWx1ZXMgdG8gbWFrZSBzdXJlIHZlc3QgaXNuJ3QgdHJpZ2dlcmVkIGFsbCB0aGUgdGltZVxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBmb3JtVmFsdWVDYWNoZToge1xuICAgIFtmaWVsZDogc3RyaW5nXTogUGFydGlhbDx7XG4gICAgICBzdWIkJDogUmVwbGF5U3ViamVjdDx1bmtub3duPjtcbiAgICAgIGRlYm91bmNlZDogT2JzZXJ2YWJsZTxhbnk+O1xuICAgIH0+O1xuICB9ID0ge307XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIFdoZW4gdGhlIHZhbGlkYXRpb24gY29uZmlnIGNoYW5nZXNcbiAgICAvLyBMaXN0ZW4gdG8gY2hhbmdlcyBvZiB0aGUgbGVmdC1zaWRlIG9mIHRoZSBjb25maWcgYW5kIHRyaWdnZXIgdGhlIHVwZGF0ZVZhbHVlQW5kVmFsaWRpdHlcbiAgICAvLyBmdW5jdGlvbiBvbiB0aGUgZGVwZW5kYW50IGNvbnRyb2xzIG9yIGdyb3VwcyBhdCB0aGUgcmlnaHQtc2lkZSBvZiB0aGUgY29uZmlnXG4gICAgdG9PYnNlcnZhYmxlKHRoaXMudmFsaWRhdGlvbkNvbmZpZylcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoKGNvbmYpID0+ICEhY29uZiksXG4gICAgICAgIHN3aXRjaE1hcCgoY29uZikgPT4ge1xuICAgICAgICAgIGlmICghY29uZikge1xuICAgICAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBzdHJlYW1zID0gT2JqZWN0LmtleXMoY29uZikubWFwKChrZXkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm5nRm9ybT8uZm9ybS5nZXQoa2V5KT8udmFsdWVDaGFuZ2VzLnBpcGUoXG4gICAgICAgICAgICAgIC8vIFdhaXQgdW50aWwgc29tZXRoaW5nIGlzIHBlbmRpbmdcbiAgICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMucGVuZGluZyQpLFxuICAgICAgICAgICAgICAvLyBXYWl0IHVudGlsIHRoZSBmb3JtIGlzIG5vdCBwZW5kaW5nIGFueW1vcmVcbiAgICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuaWRsZSQpLFxuICAgICAgICAgICAgICBtYXAoKCkgPT4gdGhpcy5uZ0Zvcm0/LmZvcm0uZ2V0KGtleSk/LnZhbHVlKSxcbiAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQkKSxcbiAgICAgICAgICAgICAgdGFwKCh2KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uZltrZXldPy5mb3JFYWNoKChwYXRoOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICAgIHRoaXMubmdGb3JtPy5mb3JtLmdldChwYXRoKT8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7XG4gICAgICAgICAgICAgICAgICAgIG9ubHlTZWxmOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBlbWl0RXZlbnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHppcChzdHJlYW1zKTtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcblxuICAgIC8qKlxuICAgICAqIFRyaWdnZXIgc2hhcGUgdmFsaWRhdGlvbnMgaWYgdGhlIGZvcm0gZ2V0cyB1cGRhdGVkXG4gICAgICogVGhpcyBpcyBob3cgd2UgY2FuIHRocm93IHJ1bi10aW1lIGVycm9yc1xuICAgICAqL1xuICAgIHRoaXMuZm9ybVZhbHVlQ2hhbmdlLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQkKSkuc3Vic2NyaWJlKCh2KSA9PiB7XG4gICAgICBpZiAodGhpcy5mb3JtU2hhcGUoKSkge1xuICAgICAgICB2YWxpZGF0ZVNoYXBlKHYsIHRoaXMuZm9ybVNoYXBlKCkgYXMgRGVlcFJlcXVpcmVkPFQ+KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIE1hcmsgYWxsIHRoZSBmaWVsZHMgYXMgdG91Y2hlZCB3aGVuIHRoZSBmb3JtIGlzIHN1Ym1pdHRlZFxuICAgICAqL1xuICAgIHRoaXMubmdGb3JtLm5nU3VibWl0LnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLm5nRm9ybS5mb3JtLm1hcmtBbGxBc1RvdWNoZWQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIHdpbGwgZmVlZCB0aGUgZm9ybVZhbHVlQ2FjaGUsIGRlYm91bmNlIGl0IHRpbGwgdGhlIG5leHQgdGlja1xuICAgKiBhbmQgY3JlYXRlIGFuIGFzeW5jaHJvbm91cyB2YWxpZGF0b3IgdGhhdCBydW5zIGEgdmVzdCBzdWl0ZVxuICAgKiBAcGFyYW0gZmllbGRcbiAgICogQHBhcmFtIHZhbGlkYXRpb25PcHRpb25zXG4gICAqIEByZXR1cm5zIGFuIGFzeW5jaHJvbm91cyB2YWxpZGF0b3IgZnVuY3Rpb25cbiAgICovXG4gIHB1YmxpYyBjcmVhdGVBc3luY1ZhbGlkYXRvcihmaWVsZDogc3RyaW5nLCB2YWxpZGF0aW9uT3B0aW9uczogVmFsaWRhdGlvbk9wdGlvbnMpOiBBc3luY1ZhbGlkYXRvckZuIHtcbiAgICBpZiAoIXRoaXMuc3VpdGUoKSkge1xuICAgICAgcmV0dXJuICgpID0+IG9mKG51bGwpO1xuICAgIH1cbiAgICByZXR1cm4gKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgIGlmICghdGhpcy5mb3JtVmFsdWUoKSkge1xuICAgICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgICB9XG4gICAgICBjb25zdCBtb2QgPSBjbG9uZURlZXAodGhpcy5mb3JtVmFsdWUoKSBhcyBUKTtcbiAgICAgIHNldChtb2QgYXMgb2JqZWN0LCBmaWVsZCwgdmFsdWUpOyAvLyBVcGRhdGUgdGhlIHByb3BlcnR5IHdpdGggcGF0aFxuICAgICAgaWYgKCF0aGlzLmZvcm1WYWx1ZUNhY2hlW2ZpZWxkXSkge1xuICAgICAgICB0aGlzLmZvcm1WYWx1ZUNhY2hlW2ZpZWxkXSA9IHtcbiAgICAgICAgICBzdWIkJDogbmV3IFJlcGxheVN1YmplY3QoMSksIC8vIEtlZXAgdHJhY2sgb2YgdGhlIGxhc3QgbW9kZWxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5mb3JtVmFsdWVDYWNoZVtmaWVsZF0uZGVib3VuY2VkID0gdGhpcy5mb3JtVmFsdWVDYWNoZVtcbiAgICAgICAgICBmaWVsZFxuICAgICAgICAgIF0uc3ViJCQhLnBpcGUoZGVib3VuY2VUaW1lKHZhbGlkYXRpb25PcHRpb25zLmRlYm91bmNlVGltZSkpO1xuICAgICAgfVxuICAgICAgLy8gTmV4dCB0aGUgbGF0ZXN0IG1vZGVsIGluIHRoZSBjYWNoZSBmb3IgYSBjZXJ0YWluIGZpZWxkXG4gICAgICB0aGlzLmZvcm1WYWx1ZUNhY2hlW2ZpZWxkXS5zdWIkJCEubmV4dChtb2QpO1xuXG4gICAgICByZXR1cm4gdGhpcy5mb3JtVmFsdWVDYWNoZVtmaWVsZF0uZGVib3VuY2VkIS5waXBlKFxuICAgICAgICAvLyBXaGVuIGRlYm91bmNlZCwgdGFrZSB0aGUgbGF0ZXN0IHZhbHVlIGFuZCBwZXJmb3JtIHRoZSBhc3luY2hyb25vdXMgdmVzdCB2YWxpZGF0aW9uXG4gICAgICAgIHRha2UoMSksXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcikgPT4ge1xuICAgICAgICAgICAgdGhpcy5zdWl0ZSgpIShtb2QsIGZpZWxkKS5kb25lKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgZXJyb3JzID0gcmVzdWx0LmdldEVycm9ycygpW2ZpZWxkXTtcbiAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChlcnJvcnMgPyB7IGVycm9yOiBlcnJvcnNbMF0sIGVycm9ycyB9IDogbnVsbCk7XG4gICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KSBhcyBPYnNlcnZhYmxlPFZhbGlkYXRpb25FcnJvcnMgfCBudWxsPjtcbiAgICAgICAgfSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkJClcbiAgICAgICk7XG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkJC5uZXh0KCk7XG4gIH1cbn1cbiJdfQ==
|