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 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
- ### Form arrays
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
+ [![course.jpeg](course.jpeg)](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, DestroyRef, HostBinding, inject } from '@angular/core';
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
- get control() {
18
- return this.ngModelGroup ? this.ngModelGroup.control : this.ngModel?.control;
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)), takeUntilDestroyed(this.destroyRef))
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbC13cmFwcGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC12ZXN0LWZvcm1zL3NyYy9saWIvY29tcG9uZW50cy9jb250cm9sLXdyYXBwZXIvY29udHJvbC13cmFwcGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC12ZXN0LWZvcm1zL3NyYy9saWIvY29tcG9uZW50cy9jb250cm9sLXdyYXBwZXIvY29udHJvbC13cmFwcGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFSCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxZQUFZLEVBQ1osVUFBVSxFQUNWLFdBQVcsRUFDWCxNQUFNLEVBQ1QsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFtQixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQzs7QUFTaEUsTUFBTSxPQUFPLHVCQUF1QjtJQVBwQztRQVFxQixVQUFLLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDbEMsa0JBQWEsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDdEMsZUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUdqQyxpQkFBWSxHQUF3QixNQUFNLENBQUMsWUFBWSxFQUFFO1lBQ3JFLFFBQVEsRUFBRSxJQUFJO1lBQ2QsSUFBSSxFQUFFLElBQUk7U0FDYixDQUFDLENBQUM7S0F1Q047SUFqQ0csSUFBWSxPQUFPO1FBQ2YsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUM7SUFDakYsQ0FBQztJQUVELElBQ1csT0FBTztRQUNkLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNoRCxDQUFDO0lBRUQsSUFBVyxNQUFNO1FBQ2IsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDO1lBQ3hCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUM5QixDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMxRCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFTSxlQUFlO1FBQ2xCLDhCQUE4QjtRQUM5Qiw0REFBNEQ7UUFDNUQsb0RBQW9EO1FBQ3BELDREQUE0RDtRQUM1RCxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUs7YUFDbkIsSUFBSSxDQUNELFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLE9BQU8sRUFBRSxNQUFNLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQy9ELFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsRUFDM0Msa0JBQWtCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUN0QzthQUNBLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDWixJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzlCLENBQUMsQ0FBQyxDQUFDO0lBQ1gsQ0FBQzs4R0EvQ1EsdUJBQXVCO2tHQUF2Qix1QkFBdUIsb01BS2xCLE9BQU8sZ0RDNUJ6Qiw2VEFZQTs7MkZEV2EsdUJBQXVCO2tCQVBuQyxTQUFTOytCQUNJLHNCQUFzQixjQUNwQixJQUFJLG1CQUdDLHVCQUF1QixDQUFDLE1BQU07OEJBT2pCLE9BQU87c0JBQXBDLFlBQVk7dUJBQUMsT0FBTztnQkFlVixPQUFPO3NCQURqQixXQUFXO3VCQUFDLG1DQUFtQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgQ29udGVudENoaWxkLFxuICAgIERlc3Ryb3lSZWYsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgaW5qZWN0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIE5nTW9kZWwsIE5nTW9kZWxHcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IG1lcmdlV2l0aCwgb2YsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgRm9ybURpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvZm9ybS5kaXJlY3RpdmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ1tzYy1jb250cm9sLXdyYXBwZXJdJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9jb250cm9sLXdyYXBwZXIuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2NvbnRyb2wtd3JhcHBlci5jb21wb25lbnQuc2NzcyddLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIENvbnRyb2xXcmFwcGVyQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBjZFJlZiA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG4gICAgcHJpdmF0ZSByZWFkb25seSBmb3JtRGlyZWN0aXZlID0gaW5qZWN0KEZvcm1EaXJlY3RpdmUpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcblxuICAgIEBDb250ZW50Q2hpbGQoTmdNb2RlbCkgcHVibGljIG5nTW9kZWw/OiBOZ01vZGVsOyAvLyBPcHRpb25hbCBuZ01vZGVsXG4gICAgcHVibGljIHJlYWRvbmx5IG5nTW9kZWxHcm91cDogTmdNb2RlbEdyb3VwIHwgbnVsbCA9IGluamVjdChOZ01vZGVsR3JvdXAsIHtcbiAgICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgICAgIHNlbGY6IHRydWUsXG4gICAgfSk7XG5cblxuICAgIC8vIENhY2hlIHRoZSBwcmV2aW91cyBlcnJvciB0byBhdm9pZCAnZmxpY2tlcmluZydcbiAgICBwcml2YXRlIHByZXZpb3VzRXJyb3I/OiBzdHJpbmdbXTtcblxuICAgIHByaXZhdGUgZ2V0IGNvbnRyb2woKTogQWJzdHJhY3RDb250cm9sIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmdNb2RlbEdyb3VwID8gdGhpcy5uZ01vZGVsR3JvdXAuY29udHJvbCA6IHRoaXMubmdNb2RlbD8uY29udHJvbDtcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLnNjLWNvbnRyb2wtd3JhcHBlci0taW52YWxpZCcpXG4gICAgcHVibGljIGdldCBpbnZhbGlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sPy50b3VjaGVkICYmIHRoaXMuZXJyb3JzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZXJyb3JzKCk6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgaWYgKHRoaXMuY29udHJvbD8ucGVuZGluZykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJldmlvdXNFcnJvcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucHJldmlvdXNFcnJvciA9IHRoaXMuY29udHJvbD8uZXJyb3JzPy5bJ2Vycm9ycyddO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2w/LmVycm9ycz8uWydlcnJvcnMnXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgICAgICAvLyBXYWl0IHVudGlsIHRoZSBmb3JtIGlzIGlkbGVcbiAgICAgICAgLy8gVGhlbiwgbGlzdGVuIHRvIGFsbCBldmVudHMgb2YgdGhlIG5nTW9kZWxHcm91cCBvciBuZ01vZGVsXG4gICAgICAgIC8vIGFuZCBtYXJrIHRoZSBjb21wb25lbnQgYW5kIGl0cyBhbmNlc3RvcnMgYXMgZGlydHlcbiAgICAgICAgLy8gVGhpcyBhbGxvd3MgdXMgdG8gdXNlIHRoZSBPblB1c2ggQ2hhbmdlRGV0ZWN0aW9uIFN0cmF0ZWd5XG4gICAgICAgIHRoaXMuZm9ybURpcmVjdGl2ZS5pZGxlJFxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMubmdNb2RlbEdyb3VwPy5jb250cm9sPy5ldmVudHMgfHwgb2YobnVsbCkpLFxuICAgICAgICAgICAgICAgIG1lcmdlV2l0aCh0aGlzLmNvbnRyb2w/LmV2ZW50cyB8fCBvZihudWxsKSksXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZilcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2RSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwic2MtY29udHJvbC13cmFwcGVyXCI+XG4gIDxkaXYgY2xhc3M9XCJzYy1jb250cm9sLXdyYXBwZXJfX2NvbnRlbnRcIj5cbiAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwic2MtY29udHJvbC13cmFwcGVyX19lcnJvcnNcIj5cbiAgICA8dWwgW2hpZGRlbl09XCIhaW52YWxpZFwiPlxuICAgICAgQGZvciAoZXJyb3Igb2YgZXJyb3JzOyB0cmFjayBlcnJvcikge1xuICAgICAgICA8bGk+e3sgZXJyb3IgfX08L2xpPlxuICAgICAgfVxuICAgIDwvdWw+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXZlc3QtZm9ybXMvc3JjL2xpYi9jb25zdGFudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBST09UX0ZPUk0gPSAncm9vdEZvcm0nOyJdfQ==
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: "14.0.0", version: "18.0.1", type: FormModelGroupDirective, isStandalone: true, selector: "[ngModelGroup]", providers: [
21
- { provide: NG_ASYNC_VALIDATORS, useExisting: FormModelGroupDirective, multi: true },
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
- { provide: NG_ASYNC_VALIDATORS, useExisting: FormModelGroupDirective, multi: true },
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1tb2RlbC1ncm91cC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdmVzdC1mb3Jtcy9zcmMvbGliL2RpcmVjdGl2ZXMvZm9ybS1tb2RlbC1ncm91cC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEQsT0FBTyxFQUFtQyxtQkFBbUIsRUFBb0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4RyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFakQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0scUJBQXFCLENBQUM7O0FBRXhEOzs7R0FHRztBQVFILE1BQU0sT0FBTyx1QkFBdUI7SUFQcEM7UUFRbUIsa0JBQWEsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7S0FPeEQ7SUFMUSxRQUFRLENBQUMsT0FBd0I7UUFDdEMsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDdEMsTUFBTSxLQUFLLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN6RCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBd0MsQ0FBQTtJQUM3RyxDQUFDOzhHQVBVLHVCQUF1QjtrR0FBdkIsdUJBQXVCLDZEQUp2QjtZQUNULEVBQUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLFdBQVcsRUFBRSx1QkFBdUIsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO1NBQ3BGOzsyRkFFVSx1QkFBdUI7a0JBUG5DLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGdCQUFnQjtvQkFDMUIsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFNBQVMsRUFBRTt3QkFDVCxFQUFFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxXQUFXLHlCQUF5QixFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7cUJBQ3BGO2lCQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgQXN5bmNWYWxpZGF0b3IsIE5HX0FTWU5DX1ZBTElEQVRPUlMsIFZhbGlkYXRpb25FcnJvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBGb3JtRGlyZWN0aXZlIH0gZnJvbSAnLi9mb3JtLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBnZXRGb3JtR3JvdXBGaWVsZCB9IGZyb20gJy4uL3V0aWxzL2Zvcm0tdXRpbHMnO1xuXG4vKipcbiAqIEhvb2tzIGludG8gdGhlIG5nTW9kZWxHcm91cCBzZWxlY3RvciBhbmQgdHJpZ2dlcnMgYW4gYXN5bmNocm9ub3VzIHZhbGlkYXRpb24gZm9yIGEgZm9ybSBncm91cFxuICogSXQgd2lsbCB1c2UgYSB2ZXN0IHN1aXRlIGJlaGluZCB0aGUgc2NlbmVzXG4gKi9cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tuZ01vZGVsR3JvdXBdJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgcHJvdmlkZXJzOiBbXG4gICAgeyBwcm92aWRlOiBOR19BU1lOQ19WQUxJREFUT1JTLCB1c2VFeGlzdGluZzogRm9ybU1vZGVsR3JvdXBEaXJlY3RpdmUsIG11bHRpOiB0cnVlIH0sXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIEZvcm1Nb2RlbEdyb3VwRGlyZWN0aXZlIGltcGxlbWVudHMgQXN5bmNWYWxpZGF0b3Ige1xuICBwcml2YXRlIHJlYWRvbmx5IGZvcm1EaXJlY3RpdmUgPSBpbmplY3QoRm9ybURpcmVjdGl2ZSk7XG5cbiAgcHVibGljIHZhbGlkYXRlKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IE9ic2VydmFibGU8VmFsaWRhdGlvbkVycm9ycyB8IG51bGw+IHtcbiAgICBjb25zdCB7IG5nRm9ybSB9ID0gdGhpcy5mb3JtRGlyZWN0aXZlO1xuICAgIGNvbnN0IGZpZWxkID0gZ2V0Rm9ybUdyb3VwRmllbGQobmdGb3JtLmNvbnRyb2wsIGNvbnRyb2wpO1xuICAgIHJldHVybiB0aGlzLmZvcm1EaXJlY3RpdmUuY3JlYXRlQXN5bmNWYWxpZGF0b3IoZmllbGQpKGNvbnRyb2wudmFsdWUpIGFzIE9ic2VydmFibGU8VmFsaWRhdGlvbkVycm9ycyB8IG51bGw+XG4gIH1cbn1cbiJdfQ==
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: "14.0.0", version: "18.0.1", type: FormModelDirective, isStandalone: true, selector: "[ngModel]", providers: [
21
- { provide: NG_ASYNC_VALIDATORS, useExisting: FormModelDirective, multi: true },
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
- { provide: NG_ASYNC_VALIDATORS, useExisting: FormModelDirective, multi: true },
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1tb2RlbC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdmVzdC1mb3Jtcy9zcmMvbGliL2RpcmVjdGl2ZXMvZm9ybS1tb2RlbC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEQsT0FBTyxFQUFtQyxtQkFBbUIsRUFBb0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4RyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFakQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0scUJBQXFCLENBQUM7O0FBRTFEOzs7R0FHRztBQVFILE1BQU0sT0FBTyxrQkFBa0I7SUFQL0I7UUFRbUIsa0JBQWEsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7S0FNeEQ7SUFMUSxRQUFRLENBQUMsT0FBd0I7UUFDdEMsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUN4RCxNQUFNLEtBQUssR0FBRyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzNELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQXdDLENBQUE7SUFDckgsQ0FBQzs4R0FOVSxrQkFBa0I7a0dBQWxCLGtCQUFrQix3REFKbEI7WUFDVCxFQUFFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxXQUFXLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtTQUMvRTs7MkZBRVUsa0JBQWtCO2tCQVA5QixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxXQUFXO29CQUNyQixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsU0FBUyxFQUFFO3dCQUNULEVBQUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLFdBQVcsb0JBQW9CLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtxQkFDL0U7aUJBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBBc3luY1ZhbGlkYXRvciwgTkdfQVNZTkNfVkFMSURBVE9SUywgVmFsaWRhdGlvbkVycm9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEZvcm1EaXJlY3RpdmUgfSBmcm9tICcuL2Zvcm0uZGlyZWN0aXZlJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGdldEZvcm1Db250cm9sRmllbGQgfSBmcm9tICcuLi91dGlscy9mb3JtLXV0aWxzJztcblxuLyoqXG4gKiBIb29rcyBpbnRvIHRoZSBuZ01vZGVsIHNlbGVjdG9yIGFuZCB0cmlnZ2VycyBhbiBhc3luY2hyb25vdXMgdmFsaWRhdGlvbiBmb3IgYSBmb3JtIG1vZGVsXG4gKiBJdCB3aWxsIHVzZSBhIHZlc3Qgc3VpdGUgYmVoaW5kIHRoZSBzY2VuZXNcbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW25nTW9kZWxdJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgcHJvdmlkZXJzOiBbXG4gICAgeyBwcm92aWRlOiBOR19BU1lOQ19WQUxJREFUT1JTLCB1c2VFeGlzdGluZzogRm9ybU1vZGVsRGlyZWN0aXZlLCBtdWx0aTogdHJ1ZSB9LFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBGb3JtTW9kZWxEaXJlY3RpdmUgaW1wbGVtZW50cyBBc3luY1ZhbGlkYXRvciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZm9ybURpcmVjdGl2ZSA9IGluamVjdChGb3JtRGlyZWN0aXZlKTtcbiAgcHVibGljIHZhbGlkYXRlKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IE9ic2VydmFibGU8VmFsaWRhdGlvbkVycm9ycyB8IG51bGw+IHtcbiAgICBjb25zdCB7IG5nRm9ybSwgc3VpdGUsIGZvcm1WYWx1ZSB9ID0gdGhpcy5mb3JtRGlyZWN0aXZlO1xuICAgIGNvbnN0IGZpZWxkID0gZ2V0Rm9ybUNvbnRyb2xGaWVsZChuZ0Zvcm0uY29udHJvbCwgY29udHJvbCk7XG4gICAgcmV0dXJuIHRoaXMuZm9ybURpcmVjdGl2ZS5jcmVhdGVBc3luY1ZhbGlkYXRvcihmaWVsZCkoY29udHJvbC5nZXRSYXdWYWx1ZSgpKSBhcyBPYnNlcnZhYmxlPFZhbGlkYXRpb25FcnJvcnMgfCBudWxsPlxuICB9XG59XG4iXX0=
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1tb2RlbC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdmVzdC1mb3Jtcy9zcmMvbGliL2RpcmVjdGl2ZXMvZm9ybS1tb2RlbC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pELE9BQU8sRUFHTCxtQkFBbUIsR0FFcEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFakQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0scUJBQXFCLENBQUM7O0FBRzFEOzs7R0FHRztBQVlILE1BQU0sT0FBTyxrQkFBa0I7SUFYL0I7UUFZUyxzQkFBaUIsR0FBRyxLQUFLLENBQW9CLEVBQUUsWUFBWSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDeEQsa0JBQWEsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7S0FXeEQ7SUFUUSxRQUFRLENBQ2IsT0FBd0I7UUFFeEIsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUN4RCxNQUFNLEtBQUssR0FBRyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzNELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FDN0UsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUNpQixDQUFDO0lBQzNDLENBQUM7OEdBWlUsa0JBQWtCO2tHQUFsQixrQkFBa0IsZ09BUmxCO1lBQ1Q7Z0JBQ0UsT0FBTyxFQUFFLG1CQUFtQjtnQkFDNUIsV0FBVyxFQUFFLGtCQUFrQjtnQkFDL0IsS0FBSyxFQUFFLElBQUk7YUFDWjtTQUNGOzsyRkFFVSxrQkFBa0I7a0JBWDlCLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLFdBQVc7b0JBQ3JCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixTQUFTLEVBQUU7d0JBQ1Q7NEJBQ0UsT0FBTyxFQUFFLG1CQUFtQjs0QkFDNUIsV0FBVyxvQkFBb0I7NEJBQy9CLEtBQUssRUFBRSxJQUFJO3lCQUNaO3FCQUNGO2lCQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBpbmplY3QsIGlucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBBYnN0cmFjdENvbnRyb2wsXG4gIEFzeW5jVmFsaWRhdG9yLFxuICBOR19BU1lOQ19WQUxJREFUT1JTLFxuICBWYWxpZGF0aW9uRXJyb3JzLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBGb3JtRGlyZWN0aXZlIH0gZnJvbSAnLi9mb3JtLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBnZXRGb3JtQ29udHJvbEZpZWxkIH0gZnJvbSAnLi4vdXRpbHMvZm9ybS11dGlscyc7XG5pbXBvcnQgeyBWYWxpZGF0aW9uT3B0aW9ucyB9IGZyb20gJy4vdmFsaWRhdGlvbi1vcHRpb25zJztcblxuLyoqXG4gKiBIb29rcyBpbnRvIHRoZSBuZ01vZGVsIHNlbGVjdG9yIGFuZCB0cmlnZ2VycyBhbiBhc3luY2hyb25vdXMgdmFsaWRhdGlvbiBmb3IgYSBmb3JtIG1vZGVsXG4gKiBJdCB3aWxsIHVzZSBhIHZlc3Qgc3VpdGUgYmVoaW5kIHRoZSBzY2VuZXNcbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW25nTW9kZWxdJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfQVNZTkNfVkFMSURBVE9SUyxcbiAgICAgIHVzZUV4aXN0aW5nOiBGb3JtTW9kZWxEaXJlY3RpdmUsXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBGb3JtTW9kZWxEaXJlY3RpdmUgaW1wbGVtZW50cyBBc3luY1ZhbGlkYXRvciB7XG4gIHB1YmxpYyB2YWxpZGF0aW9uT3B0aW9ucyA9IGlucHV0PFZhbGlkYXRpb25PcHRpb25zPih7IGRlYm91bmNlVGltZTogMCB9KTtcbiAgcHJpdmF0ZSByZWFkb25seSBmb3JtRGlyZWN0aXZlID0gaW5qZWN0KEZvcm1EaXJlY3RpdmUpO1xuXG4gIHB1YmxpYyB2YWxpZGF0ZShcbiAgICBjb250cm9sOiBBYnN0cmFjdENvbnRyb2xcbiAgKTogT2JzZXJ2YWJsZTxWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbD4ge1xuICAgIGNvbnN0IHsgbmdGb3JtLCBzdWl0ZSwgZm9ybVZhbHVlIH0gPSB0aGlzLmZvcm1EaXJlY3RpdmU7XG4gICAgY29uc3QgZmllbGQgPSBnZXRGb3JtQ29udHJvbEZpZWxkKG5nRm9ybS5jb250cm9sLCBjb250cm9sKTtcbiAgICByZXR1cm4gdGhpcy5mb3JtRGlyZWN0aXZlLmNyZWF0ZUFzeW5jVmFsaWRhdG9yKGZpZWxkLCB0aGlzLnZhbGlkYXRpb25PcHRpb25zKCkpKFxuICAgICAgY29udHJvbC5nZXRSYXdWYWx1ZSgpXG4gICAgKSBhcyBPYnNlcnZhYmxlPFZhbGlkYXRpb25FcnJvcnMgfCBudWxsPjtcbiAgfVxufVxuIl19
@@ -1,8 +1,8 @@
1
- import { DestroyRef, 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, shareReplay, switchMap, take, tap, zip } from 'rxjs';
4
- import { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';
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.destroyRef = inject(DestroyRef);
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
- * Fired when the form is idle. This fixes the PENDING state issues
44
- * that are introduced due to the nature of asynchronous validations
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.statusChanges$.pipe(filter(v => v !== 'PENDING'), distinctUntilChanged(), shareReplay(1));
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.valueChanges$.pipe(debounceTime(0) // wait until all form elements are rendered
52
- );
53
- this.dirtyChanges$ = this.ngForm.form.events.pipe(filter(v => v instanceof PristineChangeEvent), map(v => !v.pristine), distinctUntilChanged());
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.dirtyChanges$;
58
- this.validChanges$ = this.statusChanges$.pipe(filter(e => e === 'VALID' || e === 'INVALID'), map(v => v === 'VALID'), switchMap((v) => this.idle$), map(() => this.ngForm?.form.valid), distinctUntilChanged());
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
- * Triggered When the form becomes valid but waits until the form is idle
64
+ * Fired when the status of the root form changes.
61
65
  */
62
- this.validChange = this.validChanges$;
66
+ this.statusChanges$ = this.ngForm.form.statusChanges.pipe(startWith(this.ngForm.form.status), distinctUntilChanged());
63
67
  /**
64
- * Emits an object with all the errors of the form
68
+ * Triggered When the form becomes valid but waits until the form is idle
65
69
  */
66
- this.errorsChange = this.valueChanges$.pipe(switchMap(() => this.idle$), map(() => getAllFormErrors(this.ngForm.form)));
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
- // wait until the form is idle
82
- switchMap(() => this.idle$), map(() => this.ngForm?.form.get(key)?.value), takeUntilDestroyed(this.destroyRef), tap((v) => {
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.valueChanges$.pipe(switchMap((v) => this.idle$.pipe(map(() => v))), takeUntilDestroyed(this.destroyRef)).subscribe(v => {
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 model
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(0));
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((errors ? { error: errors[0], errors } : null));
147
+ observer.next(errors ? { error: errors[0], errors } : null);
143
148
  observer.complete();
144
149
  });
145
150
  });
146
- }), takeUntilDestroyed(this.destroyRef));
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", dirtyChange: "dirtyChange", validChange: "validChange", errorsChange: "errorsChange" }, ngImport: i0 }); }
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdmVzdC1mb3Jtcy9zcmMvbGliL2RpcmVjdGl2ZXMvZm9ybS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0UsT0FBTyxFQUVILE1BQU0sRUFDTixtQkFBbUIsRUFDbkIsaUJBQWlCLEVBRWpCLGdCQUFnQixFQUNuQixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFDTCxZQUFZLEVBQ1osb0JBQW9CLEVBQ3BCLE1BQU0sRUFDTixHQUFHLEVBQ0gsVUFBVSxFQUNWLEVBQUUsRUFDRixhQUFhLEVBQUUsV0FBVyxFQUMxQixTQUFTLEVBQ1QsSUFBSSxFQUNKLEdBQUcsRUFDSCxHQUFHLEVBQ0osTUFBTSxNQUFNLENBQUM7QUFFZCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFOUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSx1QkFBdUIsRUFBRSxHQUFHLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNoRyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7O0FBTTFELE1BQU0sT0FBTyxhQUFhO0lBeUd0QjtRQXhHZ0IsV0FBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBRXpFOztXQUVHO1FBQ2EsY0FBUyxHQUFHLEtBQUssQ0FBVyxJQUFJLENBQUMsQ0FBQztRQUVsRDs7V0FFRztRQUNhLFVBQUssR0FBRyxLQUFLLENBQXdFLElBQUksQ0FBQyxDQUFDO1FBRTNHOzs7OztXQUtHO1FBQ2EsY0FBUyxHQUFHLEtBQUssQ0FBeUIsSUFBSSxDQUFDLENBQUM7UUFFaEU7Ozs7Ozs7Ozs7OztXQVlHO1FBQ2EscUJBQWdCLEdBQUcsS0FBSyxDQUFxQyxJQUFJLENBQUMsQ0FBQztRQUNsRSxlQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hDLG1CQUFjLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDMUQsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxZQUFZLGlCQUFpQixDQUFDLEVBQzNDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFFLENBQXVCLENBQUMsTUFBTSxDQUFDLEVBQ3pDLG9CQUFvQixFQUFFLENBQ3pCLENBQUM7UUFFRjs7O1dBR0c7UUFDYSxVQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQzVDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsRUFDNUIsb0JBQW9CLEVBQUUsRUFDdEIsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUNqQixDQUFDO1FBRWUsa0JBQWEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUN6RCxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFlBQVksZ0JBQWdCLENBQUMsRUFDMUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUUsQ0FBMkIsQ0FBQyxLQUFLLENBQUMsRUFDNUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLHVCQUF1QixDQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FDMUQsQ0FBQztRQUVGOztXQUVHO1FBQ3VCLG9CQUFlLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQ2pFLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQSw0Q0FBNEM7U0FDNUQsQ0FBQztRQUNlLGtCQUFhLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDekQsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxZQUFZLG1CQUFtQixDQUFDLEVBQzdDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUUsQ0FBeUIsQ0FBQyxRQUFRLENBQUMsRUFDOUMsb0JBQW9CLEVBQUUsQ0FDekIsQ0FBQztRQUVGOztXQUVHO1FBQ3VCLGdCQUFXLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUMxQyxrQkFBYSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUNyRCxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssT0FBTyxJQUFJLENBQUMsS0FBSyxTQUFTLENBQUMsRUFDN0MsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLE9BQU8sQ0FBQyxFQUN2QixTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFDNUIsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUNsQyxvQkFBb0IsRUFBRSxDQUN6QixDQUFDO1FBRUY7O1dBRUc7UUFDdUIsZ0JBQVcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBRTNEOztXQUVHO1FBQ3VCLGlCQUFZLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQzVELFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQzNCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQ2hELENBQUM7UUFFRjs7V0FFRztRQUNjLG1CQUFjLEdBSzNCLEVBQUUsQ0FBQztRQUdILHFDQUFxQztRQUNyQywwRkFBMEY7UUFDMUYsK0VBQStFO1FBQy9FLFlBQVksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7YUFDOUIsSUFBSSxDQUNELE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUN4QixTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNmLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDUixPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNwQixDQUFDO1lBQ0QsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDMUMsT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsWUFBWSxDQUFDLElBQUk7Z0JBQ2hELDhCQUE4QjtnQkFDOUIsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFDM0IsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLENBQUMsRUFDNUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUNuQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtvQkFDTixJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBWSxFQUFFLEVBQUU7d0JBQ2hDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxzQkFBc0IsQ0FBQzs0QkFDaEQsUUFBUSxFQUFFLElBQUk7NEJBQ2QsU0FBUyxFQUFFLElBQUk7eUJBQ2xCLENBQUMsQ0FBQztvQkFDUCxDQUFDLENBQUMsQ0FBQztnQkFDUCxDQUFDLENBQUMsQ0FDTCxDQUFDO1lBQ04sQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN4QixDQUFDLENBQUMsQ0FDTDthQUNBLFNBQVMsRUFBRSxDQUFDO1FBRWpCOzs7V0FHRztRQUNILElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUNuQixTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQy9DLGtCQUFrQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FDdEMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDWixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDO2dCQUNuQixhQUFhLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQXFCLENBQUMsQ0FBQztZQUMxRCxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSDs7V0FFRztRQUNILElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDaEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN4QyxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFHRDs7Ozs7OztPQU9HO0lBQ0ksb0JBQW9CLENBQ3ZCLEtBQWE7UUFFYixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDaEIsT0FBTyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUIsQ0FBQztRQUNELE9BQU8sQ0FBQyxLQUFVLEVBQUUsRUFBRTtZQUNsQixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUM7Z0JBQ3BCLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3BCLENBQUM7WUFDRCxNQUFNLEdBQUcsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBTyxDQUFDLENBQUM7WUFDN0MsR0FBRyxDQUFDLEdBQWEsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxnQ0FBZ0M7WUFDbEUsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDOUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsR0FBRztvQkFDekIsS0FBSyxFQUFFLElBQUksYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLCtCQUErQjtpQkFDL0QsQ0FBQztnQkFDRixJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkcsQ0FBQztZQUNELHlEQUF5RDtZQUN6RCxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFNUMsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLFNBQVUsQ0FBQyxJQUFJO1lBQzdDLHFGQUFxRjtZQUNyRixJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQ1AsU0FBUyxDQUFDLEdBQUcsRUFBRTtnQkFDWCxPQUFPLElBQUksVUFBVSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7b0JBQy9CLElBQUksQ0FBQyxLQUFLLEVBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7d0JBQ3RDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDekMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO3dCQUM5RCxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ3hCLENBQUMsQ0FBQyxDQUFDO2dCQUNQLENBQUMsQ0FBd0MsQ0FBQztZQUM5QyxDQUFDLENBQUMsRUFDRixrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQ3RDLENBQUM7UUFDTixDQUFDLENBQUM7SUFDTixDQUFDOzhHQTNNUSxhQUFhO2tHQUFiLGFBQWE7OzJGQUFiLGFBQWE7a0JBSnpCLFNBQVM7bUJBQUM7b0JBQ1AsUUFBUSxFQUFFLGtCQUFrQjtvQkFDNUIsVUFBVSxFQUFFLElBQUk7aUJBQ25CO3dEQThENkIsZUFBZTtzQkFBeEMsTUFBTTtnQkFZbUIsV0FBVztzQkFBcEMsTUFBTTtnQkFZbUIsV0FBVztzQkFBcEMsTUFBTTtnQkFLbUIsWUFBWTtzQkFBckMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERlc3Ryb3lSZWYsIERpcmVjdGl2ZSwgaW5qZWN0LCBpbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIEFzeW5jVmFsaWRhdG9yRm4sXG4gICAgTmdGb3JtLFxuICAgIFByaXN0aW5lQ2hhbmdlRXZlbnQsXG4gICAgU3RhdHVzQ2hhbmdlRXZlbnQsXG4gICAgVmFsaWRhdGlvbkVycm9ycyxcbiAgICBWYWx1ZUNoYW5nZUV2ZW50XG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gIGRlYm91bmNlVGltZSxcbiAgZGlzdGluY3RVbnRpbENoYW5nZWQsXG4gIGZpbHRlcixcbiAgbWFwLFxuICBPYnNlcnZhYmxlLFxuICBvZixcbiAgUmVwbGF5U3ViamVjdCwgc2hhcmVSZXBsYXksXG4gIHN3aXRjaE1hcCxcbiAgdGFrZSxcbiAgdGFwLFxuICB6aXBcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBTdGF0aWNTdWl0ZSB9IGZyb20gJ3Zlc3QnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkLCB0b09ic2VydmFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBEZWVwUmVxdWlyZWQgfSBmcm9tICcuLi91dGlscy9kZWVwLXJlcXVpcmVkJztcbmltcG9ydCB7IGNsb25lRGVlcCwgZ2V0QWxsRm9ybUVycm9ycywgbWVyZ2VWYWx1ZXNBbmRSYXdWYWx1ZXMsIHNldCB9IGZyb20gJy4uL3V0aWxzL2Zvcm0tdXRpbHMnO1xuaW1wb3J0IHsgdmFsaWRhdGVTaGFwZSB9IGZyb20gJy4uL3V0aWxzL3NoYXBlLXZhbGlkYXRpb24nO1xuXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ2Zvcm1bc2NWZXN0Rm9ybV0nLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG59KVxuZXhwb3J0IGNsYXNzIEZvcm1EaXJlY3RpdmU8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdmVzdC1mb3Jtcy9zcmMvbGliL2RpcmVjdGl2ZXMvZm9ybS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFhLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RSxPQUFPLEVBRUwsTUFBTSxFQUNOLG1CQUFtQixFQUNuQixpQkFBaUIsRUFFakIsZ0JBQWdCLEdBQ2pCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUNMLFlBQVksRUFDWixvQkFBb0IsRUFDcEIsTUFBTSxFQUNOLEdBQUcsRUFDSCxVQUFVLEVBQ1YsRUFBRSxFQUNGLGFBQWEsRUFDYixTQUFTLEVBQ1QsT0FBTyxFQUNQLFNBQVMsRUFDVCxJQUFJLEVBQ0osU0FBUyxFQUNULEdBQUcsRUFDSCxHQUFHLEdBQ0osTUFBTSxNQUFNLENBQUM7QUFFZCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFMUQsT0FBTyxFQUNMLFNBQVMsRUFDVCxnQkFBZ0IsRUFDaEIsdUJBQXVCLEVBQ3ZCLEdBQUcsR0FDSixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7QUFPMUQsTUFBTSxPQUFPLGFBQWE7SUF5SHhCO1FBeEhnQixXQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFFekU7O1dBRUc7UUFDYSxjQUFTLEdBQUcsS0FBSyxDQUFXLElBQUksQ0FBQyxDQUFDO1FBRWxEOztXQUVHO1FBQ2EsVUFBSyxHQUFHLEtBQUssQ0FJbkIsSUFBSSxDQUFDLENBQUM7UUFFaEI7Ozs7O1dBS0c7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b0JBQ2pDLElBQUksQ0FBQyxLQUFLLEVBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7d0JBQ3hDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDekMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQzVELFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDdEIsQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQyxDQUF3QyxDQUFDO1lBQzVDLENBQUMsQ0FBQyxFQUNGLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQzFCLENBQUM7UUFDSixDQUFDLENBQUM7SUFDSixDQUFDO0lBRU0sV0FBVztRQUNoQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3hCLENBQUM7OEdBNU5VLGFBQWE7a0dBQWIsYUFBYTs7MkZBQWIsYUFBYTtrQkFKekIsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsa0JBQWtCO29CQUM1QixVQUFVLEVBQUUsSUFBSTtpQkFDakI7d0RBbUUyQixlQUFlO3NCQUF4QyxNQUFNO2dCQVVtQixZQUFZO3NCQUFyQyxNQUFNO2dCQVVtQixXQUFXO3NCQUFwQyxNQUFNO2dCQW1CbUIsV0FBVztzQkFBcEMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgaW5qZWN0LCBpbnB1dCwgT25EZXN0cm95LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEFzeW5jVmFsaWRhdG9yRm4sXG4gIE5nRm9ybSxcbiAgUHJpc3RpbmVDaGFuZ2VFdmVudCxcbiAgU3RhdHVzQ2hhbmdlRXZlbnQsXG4gIFZhbGlkYXRpb25FcnJvcnMsXG4gIFZhbHVlQ2hhbmdlRXZlbnQsXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gIGRlYm91bmNlVGltZSxcbiAgZGlzdGluY3RVbnRpbENoYW5nZWQsXG4gIGZpbHRlcixcbiAgbWFwLFxuICBPYnNlcnZhYmxlLFxuICBvZixcbiAgUmVwbGF5U3ViamVjdCxcbiAgc3RhcnRXaXRoLFxuICBTdWJqZWN0LFxuICBzd2l0Y2hNYXAsXG4gIHRha2UsXG4gIHRha2VVbnRpbCxcbiAgdGFwLFxuICB6aXAsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgU3RhdGljU3VpdGUgfSBmcm9tICd2ZXN0JztcbmltcG9ydCB7IHRvT2JzZXJ2YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IERlZXBSZXF1aXJlZCB9IGZyb20gJy4uL3V0aWxzL2RlZXAtcmVxdWlyZWQnO1xuaW1wb3J0IHtcbiAgY2xvbmVEZWVwLFxuICBnZXRBbGxGb3JtRXJyb3JzLFxuICBtZXJnZVZhbHVlc0FuZFJhd1ZhbHVlcyxcbiAgc2V0LFxufSBmcm9tICcuLi91dGlscy9mb3JtLXV0aWxzJztcbmltcG9ydCB7IHZhbGlkYXRlU2hhcGUgfSBmcm9tICcuLi91dGlscy9zaGFwZS12YWxpZGF0aW9uJztcbmltcG9ydCB7IFZhbGlkYXRpb25PcHRpb25zIH0gZnJvbSAnLi92YWxpZGF0aW9uLW9wdGlvbnMnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdmb3JtW3NjVmVzdEZvcm1dJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgRm9ybURpcmVjdGl2ZTxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4gaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBwdWJsaWMgcmVhZG9ubHkgbmdGb3JtID0gaW5qZWN0KE5nRm9ybSwgeyBzZWxmOiB0cnVlLCBvcHRpb25hbDogZmFsc2UgfSk7XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSBvZiB0aGUgZm9ybSwgdGhpcyBpcyBuZWVkZWQgZm9yIHRoZSB2YWxpZGF0aW9uIHBhcnRcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBmb3JtVmFsdWUgPSBpbnB1dDxUIHwgbnVsbD4obnVsbCk7XG5cbiAgLyoqXG4gICAqIFN0YXRpYyB2ZXN0IHN1aXRlIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGZlZWQgb3VyIGFuZ3VsYXIgdmFsaWRhdG9yc1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHN1aXRlID0gaW5wdXQ8U3RhdGljU3VpdGU8XG4gICAgc3RyaW5nLFxuICAgIHN0cmluZyxcbiAgICAobW9kZWw6IFQsIGZpZWxkOiBzdHJpbmcpID0+IHZvaWRcbiAgPiB8IG51bGw+KG51bGwpO1xuXG4gIC8qKlxuICAgKiBUaGUgc2hhcGUgb2Ygb3VyIGZvcm0gbW9kZWwuIFRoaXMgaXMgYSBkZWVwIHJlcXVpcmVkIHZlcnNpb24gb2YgdGhlIGZvcm0gbW9kZWxcbiAgICogVGhlIGdvYWwgaXMgdG8gYWRkIGRlZmF1bHQgdmFsdWVzIHRvIHRoZSBzaGFwZSBzbyB3aGVuIHRoZSB0ZW1wbGF0ZS1kcml2ZW4gZm9ybVxuICAgKiBjb250YWlucyB2YWx1ZXMgdGhhdCBzaG91bGRuJ3QgYmUgdGhlcmUgKHR5cG8ncykgdGhhdCB0aGUgZGV2ZWxvcGVyIGdldHMgcnVuLXRpbWVcbiAgICogZXJyb3JzIGluIGRldiBtb2RlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZm9ybVNoYXBlID0gaW5wdXQ8RGVlcFJlcXVpcmVkPFQ+IHwgbnVsbD4obnVsbCk7XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIHZhbGlkYXRpb24gY29uZmlnIHdoaWNoIGlzIGEgZHluYW1pYyBvYmplY3QgdGhhdCB3aWxsIGJlIHVzZWQgdG9cbiAgICogdHJpZ2dlciB2YWxpZGF0aW9ucyBvbiB0aGUgZGVwZW5kYW50IGZpZWxkc1xuICAgKiBFZzogYGBgdHlwZXNjcmlwdFxuICAgKiB2YWxpZGF0aW9uQ29uZmlnID0ge1xuICAgKiAgICAgJ3Bhc3N3b3Jkcy5wYXNzd29yZCc6IFsncGFzc3dvcmRzLmNvbmZpcm1QYXNzd29yZCddXG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIFRoaXMgd2lsbCB0cmlnZ2VyIHRoZSB1cGRhdGVWYWx1ZUFuZFZhbGlkaXR5IG9uIHBhc3N3b3Jkcy5jb25maXJtUGFzc3dvcmQgZXZlcnkgdGltZSB0aGUgcGFzc3dvcmRzLnBhc3N3b3JkIGdldHMgYSBuZXcgdmFsdWVcbiAgICpcbiAgICogQHBhcmFtIHZcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB2YWxpZGF0aW9uQ29uZmlnID0gaW5wdXQ8eyBba2V5OiBzdHJpbmddOiBzdHJpbmdbXSB9IHwgbnVsbD4oXG4gICAgbnVsbFxuICApO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgcGVuZGluZyQgPSB0aGlzLm5nRm9ybS5mb3JtLmV2ZW50cy5waXBlKFxuICAgIGZpbHRlcigodikgPT4gdiBpbnN0YW5jZW9mIFN0YXR1c0NoYW5nZUV2ZW50KSxcbiAgICBtYXAoKHYpID0+ICh2IGFzIFN0YXR1c0NoYW5nZUV2ZW50KS5zdGF0dXMpLFxuICAgIGZpbHRlcigodikgPT4gdiA9PT0gJ1BFTkRJTkcnKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpXG4gICk7XG5cbiAgLyoqXG4gICAqIEVtaXRzIGV2ZXJ5IHRpbWUgdGhlIGZvcm0gc3RhdHVzIGNoYW5nZXMgaW4gYSBzdGF0ZVxuICAgKiB0aGF0IGlzIG5vdCBQRU5ESU5HXG4gICAqIFdlIG5lZWQgdGhpcyB0byBhc3N1cmUgdGhhdCB0aGUgZm9ybSBpcyBpbiAnaWRsZScgc3RhdGVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpZGxlJCA9IHRoaXMubmdGb3JtLmZvcm0uZXZlbnRzLnBpcGUoXG4gICAgZmlsdGVyKCh2KSA9PiB2IGluc3RhbmNlb2YgU3RhdHVzQ2hhbmdlRXZlbnQpLFxuICAgIG1hcCgodikgPT4gKHYgYXMgU3RhdHVzQ2hhbmdlRXZlbnQpLnN0YXR1cyksXG4gICAgZmlsdGVyKCh2KSA9PiB2ICE9PSAnUEVORElORycpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcbiAgKTtcblxuICAvKipcbiAgICogVHJpZ2dlcmVkIGFzIHNvb24gYXMgdGhlIGZvcm0gdmFsdWUgY2hhbmdlc1xuICAgKiBBbHNvIGV2ZXJ5IHRpbWUgQW5ndWxhciBjcmVhdGVzIGEgbmV3IGNvbnRyb2wgb3IgZ3JvdXBcbiAgICogSXQgYWxzbyBjb250YWlucyB0aGUgZGlzYWJsZWQgdmFsdWVzIChyYXcgdmFsdWVzKVxuICAgKi9cbiAgQE91dHB1dCgpIHB1YmxpYyByZWFkb25seSBmb3JtVmFsdWVDaGFuZ2UgPSB0aGlzLm5nRm9ybS5mb3JtLmV2ZW50cy5waXBlKFxuICAgIGZpbHRlcigodikgPT4gdiBpbnN0YW5jZW9mIFZhbHVlQ2hhbmdlRXZlbnQpLFxuICAgIG1hcCgodikgPT4gKHYgYXMgVmFsdWVDaGFuZ2VFdmVudDxhbnk+KS52YWx1ZSksXG4gICAgbWFwKCgpID0+IG1lcmdlVmFsdWVzQW5kUmF3VmFsdWVzPFQ+KHRoaXMubmdGb3JtLmZvcm0pKVxuICApO1xuXG4gIC8qKlxuICAgKiBFbWl0cyBhbiBvYmplY3Qgd2l0aCBhbGwgdGhlIGVycm9ycyBvZiB0aGUgZm9ybVxuICAgKiBldmVyeSB0aW1lIGEgZm9ybSBjb250cm9sIG9yIGZvcm0gZ3JvdXBzIGNoYW5nZXMgaXRzIHN0YXR1cyB0byB2YWxpZCBvciBpbnZhbGlkXG4gICAqL1xuICBAT3V0cHV0KCkgcHVibGljIHJlYWRvbmx5IGVycm9yc0NoYW5nZSA9IHRoaXMubmdGb3JtLmZvcm0uZXZlbnRzLnBpcGUoXG4gICAgZmlsdGVyKCh2KSA9PiB2IGluc3RhbmNlb2YgU3RhdHVzQ2hhbmdlRXZlbnQpLFxuICAgIG1hcCgodikgPT4gKHYgYXMgU3RhdHVzQ2hhbmdlRXZlbnQpLnN0YXR1cyksXG4gICAgZmlsdGVyKCh2KSA9PiB2ICE9PSAnUEVORElORycpLFxuICAgIG1hcCgoKSA9PiBnZXRBbGxGb3JtRXJyb3JzKHRoaXMubmdGb3JtLmZvcm0pKVxuICApO1xuXG4gIC8qKlxuICAgKiBUcmlnZ2VyZWQgYXMgc29vbiBhcyB0aGUgZm9ybSBiZWNvbWVzIGRpcnR5XG4gICAqL1xuICBAT3V0cHV0KCkgcHVibGljIHJlYWRvbmx5IGRpcnR5Q2hhbmdlID0gdGhpcy5uZ0Zvcm0uZm9ybS5ldmVudHMucGlwZShcbiAgICBmaWx0ZXIoKHYpID0+IHYgaW5zdGFuY2VvZiBQcmlzdGluZUNoYW5nZUV2ZW50KSxcbiAgICBtYXAoKHYpID0+ICEodiBhcyBQcmlzdGluZUNoYW5nZUV2ZW50KS5wcmlzdGluZSksXG4gICAgc3RhcnRXaXRoKHRoaXMubmdGb3JtLmZvcm0uZGlydHkpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcbiAgKTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95JCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIC8qKlxuICAgKiBGaXJlZCB3aGVuIHRoZSBzdGF0dXMgb2YgdGhlIHJvb3QgZm9ybSBjaGFuZ2VzLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzdGF0dXNDaGFuZ2VzJCA9IHRoaXMubmdGb3JtLmZvcm0uc3RhdHVzQ2hhbmdlcy5waXBlKFxuICAgIHN0YXJ0V2l0aCh0aGlzLm5nRm9ybS5mb3JtLnN0YXR1cyksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuICApO1xuXG4gIC8qKlxuICAgKiBUcmlnZ2VyZWQgV2hlbiB0aGUgZm9ybSBiZWNvbWVzIHZhbGlkIGJ1dCB3YWl0cyB1bnRpbCB0aGUgZm9ybSBpcyBpZGxlXG4gICAqL1xuICBAT3V0cHV0KCkgcHVibGljIHJlYWRvbmx5IHZhbGlkQ2hhbmdlID0gdGhpcy5zdGF0dXNDaGFuZ2VzJC5waXBlKFxuICAgIGZpbHRlcigoZSkgPT4gZSA9PT0gJ1ZBTElEJyB8fCBlID09PSAnSU5WQUxJRCcpLFxuICAgIG1hcCgodikgPT4gdiA9PT0gJ1ZBTElEJyksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuICApO1xuXG4gIC8qKlxuICAgKiBVc2VkIHRvIGRlYm91bmNlIGZvcm1WYWx1ZXMgdG8gbWFrZSBzdXJlIHZlc3QgaXNuJ3QgdHJpZ2dlcmVkIGFsbCB0aGUgdGltZVxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBmb3JtVmFsdWVDYWNoZToge1xuICAgIFtmaWVsZDogc3RyaW5nXTogUGFydGlhbDx7XG4gICAgICBzdWIkJDogUmVwbGF5U3ViamVjdDx1bmtub3duPjtcbiAgICAgIGRlYm91bmNlZDogT2JzZXJ2YWJsZTxhbnk+O1xuICAgIH0+O1xuICB9ID0ge307XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIFdoZW4gdGhlIHZhbGlkYXRpb24gY29uZmlnIGNoYW5nZXNcbiAgICAvLyBMaXN0ZW4gdG8gY2hhbmdlcyBvZiB0aGUgbGVmdC1zaWRlIG9mIHRoZSBjb25maWcgYW5kIHRyaWdnZXIgdGhlIHVwZGF0ZVZhbHVlQW5kVmFsaWRpdHlcbiAgICAvLyBmdW5jdGlvbiBvbiB0aGUgZGVwZW5kYW50IGNvbnRyb2xzIG9yIGdyb3VwcyBhdCB0aGUgcmlnaHQtc2lkZSBvZiB0aGUgY29uZmlnXG4gICAgdG9PYnNlcnZhYmxlKHRoaXMudmFsaWRhdGlvbkNvbmZpZylcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoKGNvbmYpID0+ICEhY29uZiksXG4gICAgICAgIHN3aXRjaE1hcCgoY29uZikgPT4ge1xuICAgICAgICAgIGlmICghY29uZikge1xuICAgICAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBzdHJlYW1zID0gT2JqZWN0LmtleXMoY29uZikubWFwKChrZXkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm5nRm9ybT8uZm9ybS5nZXQoa2V5KT8udmFsdWVDaGFuZ2VzLnBpcGUoXG4gICAgICAgICAgICAgIC8vIFdhaXQgdW50aWwgc29tZXRoaW5nIGlzIHBlbmRpbmdcbiAgICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMucGVuZGluZyQpLFxuICAgICAgICAgICAgICAvLyBXYWl0IHVudGlsIHRoZSBmb3JtIGlzIG5vdCBwZW5kaW5nIGFueW1vcmVcbiAgICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuaWRsZSQpLFxuICAgICAgICAgICAgICBtYXAoKCkgPT4gdGhpcy5uZ0Zvcm0/LmZvcm0uZ2V0KGtleSk/LnZhbHVlKSxcbiAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQkKSxcbiAgICAgICAgICAgICAgdGFwKCh2KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uZltrZXldPy5mb3JFYWNoKChwYXRoOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICAgIHRoaXMubmdGb3JtPy5mb3JtLmdldChwYXRoKT8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7XG4gICAgICAgICAgICAgICAgICAgIG9ubHlTZWxmOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBlbWl0RXZlbnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHppcChzdHJlYW1zKTtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcblxuICAgIC8qKlxuICAgICAqIFRyaWdnZXIgc2hhcGUgdmFsaWRhdGlvbnMgaWYgdGhlIGZvcm0gZ2V0cyB1cGRhdGVkXG4gICAgICogVGhpcyBpcyBob3cgd2UgY2FuIHRocm93IHJ1bi10aW1lIGVycm9yc1xuICAgICAqL1xuICAgIHRoaXMuZm9ybVZhbHVlQ2hhbmdlLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQkKSkuc3Vic2NyaWJlKCh2KSA9PiB7XG4gICAgICBpZiAodGhpcy5mb3JtU2hhcGUoKSkge1xuICAgICAgICB2YWxpZGF0ZVNoYXBlKHYsIHRoaXMuZm9ybVNoYXBlKCkgYXMgRGVlcFJlcXVpcmVkPFQ+KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIE1hcmsgYWxsIHRoZSBmaWVsZHMgYXMgdG91Y2hlZCB3aGVuIHRoZSBmb3JtIGlzIHN1Ym1pdHRlZFxuICAgICAqL1xuICAgIHRoaXMubmdGb3JtLm5nU3VibWl0LnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLm5nRm9ybS5mb3JtLm1hcmtBbGxBc1RvdWNoZWQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIHdpbGwgZmVlZCB0aGUgZm9ybVZhbHVlQ2FjaGUsIGRlYm91bmNlIGl0IHRpbGwgdGhlIG5leHQgdGlja1xuICAgKiBhbmQgY3JlYXRlIGFuIGFzeW5jaHJvbm91cyB2YWxpZGF0b3IgdGhhdCBydW5zIGEgdmVzdCBzdWl0ZVxuICAgKiBAcGFyYW0gZmllbGRcbiAgICogQHBhcmFtIHZhbGlkYXRpb25PcHRpb25zXG4gICAqIEByZXR1cm5zIGFuIGFzeW5jaHJvbm91cyB2YWxpZGF0b3IgZnVuY3Rpb25cbiAgICovXG4gIHB1YmxpYyBjcmVhdGVBc3luY1ZhbGlkYXRvcihmaWVsZDogc3RyaW5nLCB2YWxpZGF0aW9uT3B0aW9uczogVmFsaWRhdGlvbk9wdGlvbnMpOiBBc3luY1ZhbGlkYXRvckZuIHtcbiAgICBpZiAoIXRoaXMuc3VpdGUoKSkge1xuICAgICAgcmV0dXJuICgpID0+IG9mKG51bGwpO1xuICAgIH1cbiAgICByZXR1cm4gKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgIGlmICghdGhpcy5mb3JtVmFsdWUoKSkge1xuICAgICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgICB9XG4gICAgICBjb25zdCBtb2QgPSBjbG9uZURlZXAodGhpcy5mb3JtVmFsdWUoKSBhcyBUKTtcbiAgICAgIHNldChtb2QgYXMgb2JqZWN0LCBmaWVsZCwgdmFsdWUpOyAvLyBVcGRhdGUgdGhlIHByb3BlcnR5IHdpdGggcGF0aFxuICAgICAgaWYgKCF0aGlzLmZvcm1WYWx1ZUNhY2hlW2ZpZWxkXSkge1xuICAgICAgICB0aGlzLmZvcm1WYWx1ZUNhY2hlW2ZpZWxkXSA9IHtcbiAgICAgICAgICBzdWIkJDogbmV3IFJlcGxheVN1YmplY3QoMSksIC8vIEtlZXAgdHJhY2sgb2YgdGhlIGxhc3QgbW9kZWxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5mb3JtVmFsdWVDYWNoZVtmaWVsZF0uZGVib3VuY2VkID0gdGhpcy5mb3JtVmFsdWVDYWNoZVtcbiAgICAgICAgICBmaWVsZFxuICAgICAgICAgIF0uc3ViJCQhLnBpcGUoZGVib3VuY2VUaW1lKHZhbGlkYXRpb25PcHRpb25zLmRlYm91bmNlVGltZSkpO1xuICAgICAgfVxuICAgICAgLy8gTmV4dCB0aGUgbGF0ZXN0IG1vZGVsIGluIHRoZSBjYWNoZSBmb3IgYSBjZXJ0YWluIGZpZWxkXG4gICAgICB0aGlzLmZvcm1WYWx1ZUNhY2hlW2ZpZWxkXS5zdWIkJCEubmV4dChtb2QpO1xuXG4gICAgICByZXR1cm4gdGhpcy5mb3JtVmFsdWVDYWNoZVtmaWVsZF0uZGVib3VuY2VkIS5waXBlKFxuICAgICAgICAvLyBXaGVuIGRlYm91bmNlZCwgdGFrZSB0aGUgbGF0ZXN0IHZhbHVlIGFuZCBwZXJmb3JtIHRoZSBhc3luY2hyb25vdXMgdmVzdCB2YWxpZGF0aW9uXG4gICAgICAgIHRha2UoMSksXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcikgPT4ge1xuICAgICAgICAgICAgdGhpcy5zdWl0ZSgpIShtb2QsIGZpZWxkKS5kb25lKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgZXJyb3JzID0gcmVzdWx0LmdldEVycm9ycygpW2ZpZWxkXTtcbiAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChlcnJvcnMgPyB7IGVycm9yOiBlcnJvcnNbMF0sIGVycm9ycyB9IDogbnVsbCk7XG4gICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KSBhcyBPYnNlcnZhYmxlPFZhbGlkYXRpb25FcnJvcnMgfCBudWxsPjtcbiAgICAgICAgfSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkJClcbiAgICAgICk7XG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkJC5uZXh0KCk7XG4gIH1cbn1cbiJdfQ==