@atlasauth/angular 0.7.0 → 0.9.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.
Files changed (39) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/dist/esm2022/lib/appearance.mjs +1 -1
  3. package/dist/esm2022/lib/atlas.service.mjs +45 -4
  4. package/dist/esm2022/lib/atlas.ui.mjs +3 -1
  5. package/dist/esm2022/lib/components/attempt-flow.component.mjs +398 -8
  6. package/dist/esm2022/lib/components/flow-controller.mjs +127 -7
  7. package/dist/esm2022/lib/components/impersonation-banner.component.mjs +75 -0
  8. package/dist/esm2022/lib/components/organization-audit-log.component.mjs +115 -0
  9. package/dist/esm2022/lib/components/organization-audit-log.mjs +40 -0
  10. package/dist/esm2022/lib/components/organization-profile.component.mjs +602 -27
  11. package/dist/esm2022/lib/components/recovery-codes.component.mjs +122 -0
  12. package/dist/esm2022/lib/components/sign-in.component.mjs +85 -4
  13. package/dist/esm2022/lib/components/sign-up-form.component.mjs +69 -6
  14. package/dist/esm2022/lib/components/sign-up.component.mjs +83 -7
  15. package/dist/esm2022/lib/i18n.mjs +60 -1
  16. package/dist/esm2022/lib/provide-atlas.mjs +3 -2
  17. package/dist/esm2022/lib/types.mjs +1 -1
  18. package/dist/esm2022/lib/version.mjs +2 -2
  19. package/dist/esm2022/public-api.mjs +4 -1
  20. package/dist/fesm2022/atlasauth-angular.mjs +1798 -65
  21. package/dist/fesm2022/atlasauth-angular.mjs.map +1 -1
  22. package/dist/lib/appearance.d.ts +1 -1
  23. package/dist/lib/atlas.service.d.ts +24 -2
  24. package/dist/lib/atlas.ui.d.ts +2 -1
  25. package/dist/lib/components/attempt-flow.component.d.ts +60 -3
  26. package/dist/lib/components/flow-controller.d.ts +65 -2
  27. package/dist/lib/components/impersonation-banner.component.d.ts +27 -0
  28. package/dist/lib/components/organization-audit-log.component.d.ts +34 -0
  29. package/dist/lib/components/organization-audit-log.d.ts +25 -0
  30. package/dist/lib/components/organization-profile.component.d.ts +55 -6
  31. package/dist/lib/components/recovery-codes.component.d.ts +26 -0
  32. package/dist/lib/components/sign-in.component.d.ts +11 -1
  33. package/dist/lib/components/sign-up-form.component.d.ts +11 -1
  34. package/dist/lib/components/sign-up.component.d.ts +13 -0
  35. package/dist/lib/provide-atlas.d.ts +2 -1
  36. package/dist/lib/types.d.ts +6 -0
  37. package/dist/lib/version.d.ts +1 -1
  38. package/dist/public-api.d.ts +4 -0
  39. package/package.json +3 -3
@@ -0,0 +1,122 @@
1
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, Output, inject, } from '@angular/core';
2
+ import { canDownloadRecoveryCodes, copyRecoveryCodes, downloadRecoveryCodes } from '@atlasauth/js';
3
+ import { AtlasService } from '../atlas.service';
4
+ import { classFor } from '../appearance';
5
+ import { translate } from '../i18n';
6
+ import * as i0 from "@angular/core";
7
+ /**
8
+ * The recovery codes a mid-sign-in MFA enrolment came with, shown once before
9
+ * the sign-in finishes: copy them, download them as a .txt file, then
10
+ * "I've saved my codes" (`saved`) exchanges the ticket. The codes live only in
11
+ * the flow controller's memory and are forgotten once saved.
12
+ */
13
+ export class RecoveryCodesComponent {
14
+ atlas = inject(AtlasService);
15
+ cdr = inject(ChangeDetectorRef);
16
+ codes = [];
17
+ busy = false;
18
+ saved = new EventEmitter();
19
+ canCopy = typeof navigator !== 'undefined' && !!navigator.clipboard?.writeText;
20
+ canDownload = canDownloadRecoveryCodes();
21
+ copied = false;
22
+ ngOnChanges() {
23
+ this.copied = false;
24
+ }
25
+ t(key) {
26
+ return translate(this.atlas.localization, key);
27
+ }
28
+ cls(key, base) {
29
+ return classFor(key, this.atlas.appearance, base);
30
+ }
31
+ copy() {
32
+ void copyRecoveryCodes(this.codes).then((ok) => {
33
+ this.copied = ok;
34
+ this.cdr.markForCheck();
35
+ });
36
+ }
37
+ download() {
38
+ downloadRecoveryCodes(this.codes);
39
+ }
40
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: RecoveryCodesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
41
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: RecoveryCodesComponent, isStandalone: true, selector: "atlas-recovery-codes", inputs: { codes: "codes", busy: "busy" }, outputs: { saved: "saved" }, usesOnChanges: true, ngImport: i0, template: `
42
+ <div [class]="cls('card', 'atlas-card')" data-atlas="recovery-codes">
43
+ <h1 [class]="cls('headerTitle', 'atlas-title')">{{ t('mfa.recoveryCodesTitle') }}</h1>
44
+ <p class="atlas-text">{{ t('mfa.recoveryCodesHelp') }}</p>
45
+ <ul
46
+ class="atlas-recovery-codes"
47
+ data-atlas="recovery-codes-list"
48
+ style="list-style:none;padding:0;margin:8px 0 12px;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:6px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;text-align:center"
49
+ >
50
+ @for (code of codes; track code) {
51
+ <li><code>{{ code }}</code></li>
52
+ }
53
+ </ul>
54
+ <div class="atlas-alternatives">
55
+ @if (canCopy) {
56
+ <button [class]="cls('formButtonSecondary', 'atlas-button-secondary')" type="button" data-atlas="recovery-codes-copy" (click)="copy()">
57
+ {{ t('mfa.recoveryCodesCopy') }}
58
+ </button>
59
+ }
60
+ @if (canDownload) {
61
+ <button [class]="cls('formButtonSecondary', 'atlas-button-secondary')" type="button" data-atlas="recovery-codes-download" (click)="download()">
62
+ {{ t('mfa.recoveryCodesDownload') }}
63
+ </button>
64
+ }
65
+ </div>
66
+ @if (copied) {
67
+ <p class="atlas-text" aria-live="polite" data-atlas="recovery-codes-copied">{{ t('mfa.recoveryCodesCopied') }}</p>
68
+ }
69
+ <button [class]="cls('formButtonPrimary', 'atlas-button')" type="button" data-atlas="recovery-codes-saved" [disabled]="busy" (click)="saved.emit()">
70
+ {{ t('mfa.recoveryCodesSaved') }}
71
+ </button>
72
+ </div>
73
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
74
+ }
75
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: RecoveryCodesComponent, decorators: [{
76
+ type: Component,
77
+ args: [{
78
+ selector: 'atlas-recovery-codes',
79
+ standalone: true,
80
+ changeDetection: ChangeDetectionStrategy.OnPush,
81
+ template: `
82
+ <div [class]="cls('card', 'atlas-card')" data-atlas="recovery-codes">
83
+ <h1 [class]="cls('headerTitle', 'atlas-title')">{{ t('mfa.recoveryCodesTitle') }}</h1>
84
+ <p class="atlas-text">{{ t('mfa.recoveryCodesHelp') }}</p>
85
+ <ul
86
+ class="atlas-recovery-codes"
87
+ data-atlas="recovery-codes-list"
88
+ style="list-style:none;padding:0;margin:8px 0 12px;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:6px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;text-align:center"
89
+ >
90
+ @for (code of codes; track code) {
91
+ <li><code>{{ code }}</code></li>
92
+ }
93
+ </ul>
94
+ <div class="atlas-alternatives">
95
+ @if (canCopy) {
96
+ <button [class]="cls('formButtonSecondary', 'atlas-button-secondary')" type="button" data-atlas="recovery-codes-copy" (click)="copy()">
97
+ {{ t('mfa.recoveryCodesCopy') }}
98
+ </button>
99
+ }
100
+ @if (canDownload) {
101
+ <button [class]="cls('formButtonSecondary', 'atlas-button-secondary')" type="button" data-atlas="recovery-codes-download" (click)="download()">
102
+ {{ t('mfa.recoveryCodesDownload') }}
103
+ </button>
104
+ }
105
+ </div>
106
+ @if (copied) {
107
+ <p class="atlas-text" aria-live="polite" data-atlas="recovery-codes-copied">{{ t('mfa.recoveryCodesCopied') }}</p>
108
+ }
109
+ <button [class]="cls('formButtonPrimary', 'atlas-button')" type="button" data-atlas="recovery-codes-saved" [disabled]="busy" (click)="saved.emit()">
110
+ {{ t('mfa.recoveryCodesSaved') }}
111
+ </button>
112
+ </div>
113
+ `,
114
+ }]
115
+ }], propDecorators: { codes: [{
116
+ type: Input
117
+ }], busy: [{
118
+ type: Input
119
+ }], saved: [{
120
+ type: Output
121
+ }] } });
122
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3ZlcnktY29kZXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL3JlY292ZXJ5LWNvZGVzLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBQ04sTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxpQkFBaUIsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFFBQVEsRUFBbUIsTUFBTSxlQUFlLENBQUM7QUFDMUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFNBQVMsQ0FBQzs7QUFFcEM7Ozs7O0dBS0c7QUF1Q0gsTUFBTSxPQUFPLHNCQUFzQjtJQUNoQixLQUFLLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzdCLEdBQUcsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUV4QyxLQUFLLEdBQWEsRUFBRSxDQUFDO0lBQ3JCLElBQUksR0FBRyxLQUFLLENBQUM7SUFDWixLQUFLLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztJQUV4QixPQUFPLEdBQUcsT0FBTyxTQUFTLEtBQUssV0FBVyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQztJQUMvRSxXQUFXLEdBQUcsd0JBQXdCLEVBQUUsQ0FBQztJQUNsRCxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBRXpCLFdBQVc7UUFDVCxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUN0QixDQUFDO0lBRVMsQ0FBQyxDQUFDLEdBQVc7UUFDckIsT0FBTyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVTLEdBQUcsQ0FBQyxHQUFlLEVBQUUsSUFBWTtRQUN6QyxPQUFPLFFBQVEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVTLElBQUk7UUFDWixLQUFLLGlCQUFpQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRTtZQUM3QyxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztZQUNqQixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzFCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVTLFFBQVE7UUFDaEIscUJBQXFCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BDLENBQUM7d0dBakNVLHNCQUFzQjs0RkFBdEIsc0JBQXNCLDRLQWxDdkI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ0NUOzs0RkFFVSxzQkFBc0I7a0JBdENsQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxzQkFBc0I7b0JBQ2hDLFVBQVUsRUFBRSxJQUFJO29CQUNoQixlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtvQkFDL0MsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWdDVDtpQkFDRjs4QkFLVSxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNJLEtBQUs7c0JBQWQsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE91dHB1dCxcbiAgaW5qZWN0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGNhbkRvd25sb2FkUmVjb3ZlcnlDb2RlcywgY29weVJlY292ZXJ5Q29kZXMsIGRvd25sb2FkUmVjb3ZlcnlDb2RlcyB9IGZyb20gJ0BhdGxhc2F1dGgvanMnO1xuaW1wb3J0IHsgQXRsYXNTZXJ2aWNlIH0gZnJvbSAnLi4vYXRsYXMuc2VydmljZSc7XG5pbXBvcnQgeyBjbGFzc0ZvciwgdHlwZSBFbGVtZW50S2V5IH0gZnJvbSAnLi4vYXBwZWFyYW5jZSc7XG5pbXBvcnQgeyB0cmFuc2xhdGUgfSBmcm9tICcuLi9pMThuJztcblxuLyoqXG4gKiBUaGUgcmVjb3ZlcnkgY29kZXMgYSBtaWQtc2lnbi1pbiBNRkEgZW5yb2xtZW50IGNhbWUgd2l0aCwgc2hvd24gb25jZSBiZWZvcmVcbiAqIHRoZSBzaWduLWluIGZpbmlzaGVzOiBjb3B5IHRoZW0sIGRvd25sb2FkIHRoZW0gYXMgYSAudHh0IGZpbGUsIHRoZW5cbiAqIFwiSSd2ZSBzYXZlZCBteSBjb2Rlc1wiIChgc2F2ZWRgKSBleGNoYW5nZXMgdGhlIHRpY2tldC4gVGhlIGNvZGVzIGxpdmUgb25seSBpblxuICogdGhlIGZsb3cgY29udHJvbGxlcidzIG1lbW9yeSBhbmQgYXJlIGZvcmdvdHRlbiBvbmNlIHNhdmVkLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhdGxhcy1yZWNvdmVyeS1jb2RlcycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgW2NsYXNzXT1cImNscygnY2FyZCcsICdhdGxhcy1jYXJkJylcIiBkYXRhLWF0bGFzPVwicmVjb3ZlcnktY29kZXNcIj5cbiAgICAgIDxoMSBbY2xhc3NdPVwiY2xzKCdoZWFkZXJUaXRsZScsICdhdGxhcy10aXRsZScpXCI+e3sgdCgnbWZhLnJlY292ZXJ5Q29kZXNUaXRsZScpIH19PC9oMT5cbiAgICAgIDxwIGNsYXNzPVwiYXRsYXMtdGV4dFwiPnt7IHQoJ21mYS5yZWNvdmVyeUNvZGVzSGVscCcpIH19PC9wPlxuICAgICAgPHVsXG4gICAgICAgIGNsYXNzPVwiYXRsYXMtcmVjb3ZlcnktY29kZXNcIlxuICAgICAgICBkYXRhLWF0bGFzPVwicmVjb3ZlcnktY29kZXMtbGlzdFwiXG4gICAgICAgIHN0eWxlPVwibGlzdC1zdHlsZTpub25lO3BhZGRpbmc6MDttYXJnaW46OHB4IDAgMTJweDtkaXNwbGF5OmdyaWQ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOnJlcGVhdCgyLG1pbm1heCgwLDFmcikpO2dhcDo2cHg7Zm9udC1mYW1pbHk6dWktbW9ub3NwYWNlLFNGTW9uby1SZWd1bGFyLE1lbmxvLG1vbm9zcGFjZTt0ZXh0LWFsaWduOmNlbnRlclwiXG4gICAgICA+XG4gICAgICAgIEBmb3IgKGNvZGUgb2YgY29kZXM7IHRyYWNrIGNvZGUpIHtcbiAgICAgICAgICA8bGk+PGNvZGU+e3sgY29kZSB9fTwvY29kZT48L2xpPlxuICAgICAgICB9XG4gICAgICA8L3VsPlxuICAgICAgPGRpdiBjbGFzcz1cImF0bGFzLWFsdGVybmF0aXZlc1wiPlxuICAgICAgICBAaWYgKGNhbkNvcHkpIHtcbiAgICAgICAgICA8YnV0dG9uIFtjbGFzc109XCJjbHMoJ2Zvcm1CdXR0b25TZWNvbmRhcnknLCAnYXRsYXMtYnV0dG9uLXNlY29uZGFyeScpXCIgdHlwZT1cImJ1dHRvblwiIGRhdGEtYXRsYXM9XCJyZWNvdmVyeS1jb2Rlcy1jb3B5XCIgKGNsaWNrKT1cImNvcHkoKVwiPlxuICAgICAgICAgICAge3sgdCgnbWZhLnJlY292ZXJ5Q29kZXNDb3B5JykgfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuICAgICAgICBAaWYgKGNhbkRvd25sb2FkKSB7XG4gICAgICAgICAgPGJ1dHRvbiBbY2xhc3NdPVwiY2xzKCdmb3JtQnV0dG9uU2Vjb25kYXJ5JywgJ2F0bGFzLWJ1dHRvbi1zZWNvbmRhcnknKVwiIHR5cGU9XCJidXR0b25cIiBkYXRhLWF0bGFzPVwicmVjb3ZlcnktY29kZXMtZG93bmxvYWRcIiAoY2xpY2spPVwiZG93bmxvYWQoKVwiPlxuICAgICAgICAgICAge3sgdCgnbWZhLnJlY292ZXJ5Q29kZXNEb3dubG9hZCcpIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgICAgQGlmIChjb3BpZWQpIHtcbiAgICAgICAgPHAgY2xhc3M9XCJhdGxhcy10ZXh0XCIgYXJpYS1saXZlPVwicG9saXRlXCIgZGF0YS1hdGxhcz1cInJlY292ZXJ5LWNvZGVzLWNvcGllZFwiPnt7IHQoJ21mYS5yZWNvdmVyeUNvZGVzQ29waWVkJykgfX08L3A+XG4gICAgICB9XG4gICAgICA8YnV0dG9uIFtjbGFzc109XCJjbHMoJ2Zvcm1CdXR0b25QcmltYXJ5JywgJ2F0bGFzLWJ1dHRvbicpXCIgdHlwZT1cImJ1dHRvblwiIGRhdGEtYXRsYXM9XCJyZWNvdmVyeS1jb2Rlcy1zYXZlZFwiIFtkaXNhYmxlZF09XCJidXN5XCIgKGNsaWNrKT1cInNhdmVkLmVtaXQoKVwiPlxuICAgICAgICB7eyB0KCdtZmEucmVjb3ZlcnlDb2Rlc1NhdmVkJykgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICBgLFxufSlcbmV4cG9ydCBjbGFzcyBSZWNvdmVyeUNvZGVzQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgcHJpdmF0ZSByZWFkb25seSBhdGxhcyA9IGluamVjdChBdGxhc1NlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG5cbiAgQElucHV0KCkgY29kZXM6IHN0cmluZ1tdID0gW107XG4gIEBJbnB1dCgpIGJ1c3kgPSBmYWxzZTtcbiAgQE91dHB1dCgpIHNhdmVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBjYW5Db3B5ID0gdHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgISFuYXZpZ2F0b3IuY2xpcGJvYXJkPy53cml0ZVRleHQ7XG4gIHByb3RlY3RlZCByZWFkb25seSBjYW5Eb3dubG9hZCA9IGNhbkRvd25sb2FkUmVjb3ZlcnlDb2RlcygpO1xuICBwcm90ZWN0ZWQgY29waWVkID0gZmFsc2U7XG5cbiAgbmdPbkNoYW5nZXMoKTogdm9pZCB7XG4gICAgdGhpcy5jb3BpZWQgPSBmYWxzZTtcbiAgfVxuXG4gIHByb3RlY3RlZCB0KGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdHJhbnNsYXRlKHRoaXMuYXRsYXMubG9jYWxpemF0aW9uLCBrZXkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNscyhrZXk6IEVsZW1lbnRLZXksIGJhc2U6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNsYXNzRm9yKGtleSwgdGhpcy5hdGxhcy5hcHBlYXJhbmNlLCBiYXNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb3B5KCk6IHZvaWQge1xuICAgIHZvaWQgY29weVJlY292ZXJ5Q29kZXModGhpcy5jb2RlcykudGhlbigob2spID0+IHtcbiAgICAgIHRoaXMuY29waWVkID0gb2s7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBkb3dubG9hZCgpOiB2b2lkIHtcbiAgICBkb3dubG9hZFJlY292ZXJ5Q29kZXModGhpcy5jb2Rlcyk7XG4gIH1cbn1cbiJdfQ==
@@ -1,7 +1,9 @@
1
1
  import { ChangeDetectionStrategy, Component, Input, inject, } from '@angular/core';
2
+ import { lastUsedMethodLabel, signUp as hostedSignUp } from '@atlasauth/js';
2
3
  import { AtlasService } from '../atlas.service';
3
4
  import { translate } from '../i18n';
4
5
  import { AttemptFlowComponent } from './attempt-flow.component';
6
+ import { RecoveryCodesComponent } from './recovery-codes.component';
5
7
  import { AtlasFlowController } from './flow-controller';
6
8
  import * as i0 from "@angular/core";
7
9
  /**
@@ -18,6 +20,37 @@ export class SignInComponent {
18
20
  atlas = inject(AtlasService);
19
21
  /** Where to send the user once the flow completes. Reserved for host routing. */
20
22
  afterUrl;
23
+ /**
24
+ * Where "No account? Sign up" goes. Default: the instance's hosted sign-up
25
+ * page (carrying the visitor's referral). `null` hides it. Always shown, never
26
+ * only after a failed sign-in, so it says nothing about whether an email has an account.
27
+ */
28
+ signUpUrl;
29
+ t(key) {
30
+ return translate(this.atlas.localization, key);
31
+ }
32
+ /** "Last used: Password" on the identifier step, when the instance shows the hint. */
33
+ lastUsedLabel() {
34
+ if (this.flow.state().attempt)
35
+ return null;
36
+ return lastUsedMethodLabel(this.flow.lastMethod(), (key) => this.t(key));
37
+ }
38
+ signUpHref() {
39
+ if (this.signUpUrl === null)
40
+ return null;
41
+ if (this.signUpUrl)
42
+ return this.signUpUrl;
43
+ try {
44
+ return hostedSignUp({
45
+ frontendApi: this.atlas.frontendApi,
46
+ redirectUrl: this.afterUrl ?? (typeof window !== 'undefined' ? window.location.href : undefined),
47
+ navigate: false,
48
+ });
49
+ }
50
+ catch {
51
+ return null;
52
+ }
53
+ }
21
54
  flow = new AtlasFlowController(this.atlas.createFapiClient(), () => this.atlas.reload(),
22
55
  // Resume mid-flow if an OAuth redirect came back owing a second factor.
23
56
  this.atlas.pendingAttempt, (key) => translate(this.atlas.localization, key));
@@ -34,19 +67,42 @@ export class SignInComponent {
34
67
  this.flow.destroy();
35
68
  }
36
69
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SignInComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
37
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SignInComponent, isStandalone: true, selector: "atlas-sign-in", inputs: { afterUrl: "afterUrl" }, ngImport: i0, template: `
70
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: SignInComponent, isStandalone: true, selector: "atlas-sign-in", inputs: { afterUrl: "afterUrl", signUpUrl: "signUpUrl" }, ngImport: i0, template: `
71
+ @if (lastUsedLabel(); as label) {
72
+ <p class="atlas-text atlas-last-used-hint" data-atlas="last-used" [attr.data-atlas-method]="flow.lastMethod()">
73
+ {{ t('signIn.lastUsed') }}: {{ label }}
74
+ </p>
75
+ }
76
+ @if (flow.recoveryCodes(); as codes) {
77
+ <atlas-recovery-codes [codes]="codes" [busy]="flow.state().busy" (saved)="flow.saveRecoveryCodes()"></atlas-recovery-codes>
78
+ } @else {
38
79
  <atlas-attempt-flow
39
80
  [attempt]="flow.state().attempt"
40
81
  [busy]="flow.state().busy"
41
82
  [errors]="flow.state().errors"
83
+ [sessionKept]="flow.state().sessionKept"
42
84
  titleKey="signIn.title"
43
85
  [captcha]="flow.captchaDrawn() ? flow.captcha : null"
44
86
  [firstFactors]="flow.firstFactors()"
45
87
  [preparedFactor]="flow.preparedFactor()"
88
+ [offerEmailSecondFactor]="flow.settings()?.account?.emailSecondFactor === true"
89
+ [emailedSecondFactor]="flow.emailSecondFactor()"
46
90
  (submitFlow)="flow.submit($event)"
47
91
  (chooseFactor)="flow.prepare($event)"
92
+ [offerSmsSecondFactor]="flow.settings() !== null && flow.mfaChoices().sms"
93
+ [textedSecondFactor]="flow.smsSecondFactor()"
94
+ [enrollment]="flow.enrollment"
95
+ [enrollmentState]="flow.enrollmentState()"
96
+ (emailSecondFactor)="flow.sendEmailSecondFactor()"
97
+ (smsSecondFactor)="flow.sendSmsSecondFactor()"
48
98
  ></atlas-attempt-flow>
49
- `, isInline: true, dependencies: [{ kind: "component", type: AttemptFlowComponent, selector: "atlas-attempt-flow", inputs: ["attempt", "busy", "errors", "titleKey", "captcha", "firstFactors", "preparedFactor"], outputs: ["submitFlow", "chooseFactor"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
99
+ }
100
+ @if (flow.state().attempt?.status !== 'complete' && signUpHref(); as href) {
101
+ <p class="atlas-footer" data-atlas-sign-up-prompt="">
102
+ {{ t('signIn.noAccount') }} <a class="atlas-link" [href]="href">{{ t('signIn.signUpLink') }}</a>
103
+ </p>
104
+ }
105
+ `, isInline: true, dependencies: [{ kind: "component", type: AttemptFlowComponent, selector: "atlas-attempt-flow", inputs: ["attempt", "busy", "errors", "sessionKept", "titleKey", "captcha", "firstFactors", "preparedFactor", "offerEmailSecondFactor", "emailedSecondFactor", "offerSmsSecondFactor", "textedSecondFactor", "enrollment", "enrollmentState", "emailVerification"], outputs: ["submitFlow", "chooseFactor", "emailSecondFactor", "smsSecondFactor", "resend"] }, { kind: "component", type: RecoveryCodesComponent, selector: "atlas-recovery-codes", inputs: ["codes", "busy"], outputs: ["saved"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
50
106
  }
51
107
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SignInComponent, decorators: [{
52
108
  type: Component,
@@ -54,22 +110,47 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
54
110
  selector: 'atlas-sign-in',
55
111
  standalone: true,
56
112
  changeDetection: ChangeDetectionStrategy.OnPush,
57
- imports: [AttemptFlowComponent],
113
+ imports: [AttemptFlowComponent, RecoveryCodesComponent],
58
114
  template: `
115
+ @if (lastUsedLabel(); as label) {
116
+ <p class="atlas-text atlas-last-used-hint" data-atlas="last-used" [attr.data-atlas-method]="flow.lastMethod()">
117
+ {{ t('signIn.lastUsed') }}: {{ label }}
118
+ </p>
119
+ }
120
+ @if (flow.recoveryCodes(); as codes) {
121
+ <atlas-recovery-codes [codes]="codes" [busy]="flow.state().busy" (saved)="flow.saveRecoveryCodes()"></atlas-recovery-codes>
122
+ } @else {
59
123
  <atlas-attempt-flow
60
124
  [attempt]="flow.state().attempt"
61
125
  [busy]="flow.state().busy"
62
126
  [errors]="flow.state().errors"
127
+ [sessionKept]="flow.state().sessionKept"
63
128
  titleKey="signIn.title"
64
129
  [captcha]="flow.captchaDrawn() ? flow.captcha : null"
65
130
  [firstFactors]="flow.firstFactors()"
66
131
  [preparedFactor]="flow.preparedFactor()"
132
+ [offerEmailSecondFactor]="flow.settings()?.account?.emailSecondFactor === true"
133
+ [emailedSecondFactor]="flow.emailSecondFactor()"
67
134
  (submitFlow)="flow.submit($event)"
68
135
  (chooseFactor)="flow.prepare($event)"
136
+ [offerSmsSecondFactor]="flow.settings() !== null && flow.mfaChoices().sms"
137
+ [textedSecondFactor]="flow.smsSecondFactor()"
138
+ [enrollment]="flow.enrollment"
139
+ [enrollmentState]="flow.enrollmentState()"
140
+ (emailSecondFactor)="flow.sendEmailSecondFactor()"
141
+ (smsSecondFactor)="flow.sendSmsSecondFactor()"
69
142
  ></atlas-attempt-flow>
143
+ }
144
+ @if (flow.state().attempt?.status !== 'complete' && signUpHref(); as href) {
145
+ <p class="atlas-footer" data-atlas-sign-up-prompt="">
146
+ {{ t('signIn.noAccount') }} <a class="atlas-link" [href]="href">{{ t('signIn.signUpLink') }}</a>
147
+ </p>
148
+ }
70
149
  `,
71
150
  }]
72
151
  }], propDecorators: { afterUrl: [{
73
152
  type: Input
153
+ }], signUpUrl: [{
154
+ type: Input
74
155
  }] } });
75
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbi1pbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvc2lnbi1pbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsS0FBSyxFQUdMLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNwQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7QUFFeEQ7Ozs7Ozs7OztHQVNHO0FBb0JILE1BQU0sT0FBTyxlQUFlO0lBQ1QsS0FBSyxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUU5QyxpRkFBaUY7SUFDeEUsUUFBUSxDQUFVO0lBRVIsSUFBSSxHQUFHLElBQUksbUJBQW1CLENBQy9DLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsRUFDN0IsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUU7SUFDekIsd0VBQXdFO0lBQ3hFLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUN6QixDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUNqRCxDQUFDO0lBRUYsUUFBUTtRQUNOLDRFQUE0RTtRQUM1RSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3hCLDRFQUE0RTtRQUM1RSx5RUFBeUU7UUFDekUsMkNBQTJDO1FBQzNDLElBQUksT0FBTyxNQUFNLEtBQUssV0FBVztZQUFFLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUNuRSxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDdEIsQ0FBQzt3R0F6QlUsZUFBZTs0RkFBZixlQUFlLDJHQWRoQjs7Ozs7Ozs7Ozs7O0dBWVQsNERBYlMsb0JBQW9COzs0RkFlbkIsZUFBZTtrQkFuQjNCLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGVBQWU7b0JBQ3pCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtvQkFDL0MsT0FBTyxFQUFFLENBQUMsb0JBQW9CLENBQUM7b0JBQy9CLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7O0dBWVQ7aUJBQ0Y7OEJBS1UsUUFBUTtzQkFBaEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgaW5qZWN0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEF0bGFzU2VydmljZSB9IGZyb20gJy4uL2F0bGFzLnNlcnZpY2UnO1xuaW1wb3J0IHsgdHJhbnNsYXRlIH0gZnJvbSAnLi4vaTE4bic7XG5pbXBvcnQgeyBBdHRlbXB0Rmxvd0NvbXBvbmVudCB9IGZyb20gJy4vYXR0ZW1wdC1mbG93LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBdGxhc0Zsb3dDb250cm9sbGVyIH0gZnJvbSAnLi9mbG93LWNvbnRyb2xsZXInO1xuXG4vKipcbiAqIGA8YXRsYXMtc2lnbi1pbj5gIOKAlCB0aGUgZnVsbCwgbXVsdGktc3RlcCBzaWduLWluIGZsb3cgZHJpdmVuIGVudGlyZWx5IGJ5IHRoZVxuICogc2VydmVyLXNpZGUgYXR0ZW1wdCBzdGF0dXMuIFRoZSBBbmd1bGFyIHBlZXIgb2YgUmVhY3QncyBgPFNpZ25Jbi8+YC4gRHJhd3MgdGhlXG4gKiBpbnN0YW5jZSdzIHNpZ24taW4gY2FwdGNoYSB3aGVuIGl0IGlzIHJlcXVpcmVkIChhbHdheXMtb24sIG9yIGFcbiAqIGBuZWVkc19jYXB0Y2hhYCBjaGFsbGVuZ2UpLlxuICpcbiAqIGBgYGh0bWxcbiAqIDxhdGxhcy1zaWduLWluICphdGxhc1NpZ25lZE91dCBhZnRlclVybD1cIi9kYXNoYm9hcmRcIj48L2F0bGFzLXNpZ24taW4+XG4gKiBgYGBcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXRsYXMtc2lnbi1pbicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBpbXBvcnRzOiBbQXR0ZW1wdEZsb3dDb21wb25lbnRdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxhdGxhcy1hdHRlbXB0LWZsb3dcbiAgICAgIFthdHRlbXB0XT1cImZsb3cuc3RhdGUoKS5hdHRlbXB0XCJcbiAgICAgIFtidXN5XT1cImZsb3cuc3RhdGUoKS5idXN5XCJcbiAgICAgIFtlcnJvcnNdPVwiZmxvdy5zdGF0ZSgpLmVycm9yc1wiXG4gICAgICB0aXRsZUtleT1cInNpZ25Jbi50aXRsZVwiXG4gICAgICBbY2FwdGNoYV09XCJmbG93LmNhcHRjaGFEcmF3bigpID8gZmxvdy5jYXB0Y2hhIDogbnVsbFwiXG4gICAgICBbZmlyc3RGYWN0b3JzXT1cImZsb3cuZmlyc3RGYWN0b3JzKClcIlxuICAgICAgW3ByZXBhcmVkRmFjdG9yXT1cImZsb3cucHJlcGFyZWRGYWN0b3IoKVwiXG4gICAgICAoc3VibWl0Rmxvdyk9XCJmbG93LnN1Ym1pdCgkZXZlbnQpXCJcbiAgICAgIChjaG9vc2VGYWN0b3IpPVwiZmxvdy5wcmVwYXJlKCRldmVudClcIlxuICAgID48L2F0bGFzLWF0dGVtcHQtZmxvdz5cbiAgYCxcbn0pXG5leHBvcnQgY2xhc3MgU2lnbkluQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIHJlYWRvbmx5IGF0bGFzID0gaW5qZWN0KEF0bGFzU2VydmljZSk7XG5cbiAgLyoqIFdoZXJlIHRvIHNlbmQgdGhlIHVzZXIgb25jZSB0aGUgZmxvdyBjb21wbGV0ZXMuIFJlc2VydmVkIGZvciBob3N0IHJvdXRpbmcuICovXG4gIEBJbnB1dCgpIGFmdGVyVXJsPzogc3RyaW5nO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBmbG93ID0gbmV3IEF0bGFzRmxvd0NvbnRyb2xsZXIoXG4gICAgdGhpcy5hdGxhcy5jcmVhdGVGYXBpQ2xpZW50KCksXG4gICAgKCkgPT4gdGhpcy5hdGxhcy5yZWxvYWQoKSxcbiAgICAvLyBSZXN1bWUgbWlkLWZsb3cgaWYgYW4gT0F1dGggcmVkaXJlY3QgY2FtZSBiYWNrIG93aW5nIGEgc2Vjb25kIGZhY3Rvci5cbiAgICB0aGlzLmF0bGFzLnBlbmRpbmdBdHRlbXB0LFxuICAgIChrZXkpID0+IHRyYW5zbGF0ZSh0aGlzLmF0bGFzLmxvY2FsaXphdGlvbiwga2V5KSxcbiAgKTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyBJZiBzZWVkZWQgZnJvbSBhIHBlbmRpbmcgYXR0ZW1wdCB0aGF0IGlzIGFscmVhZHkgcG9sbGFibGUsIHN0YXJ0IHBvbGxpbmcuXG4gICAgdGhpcy5mbG93LnN5bmNQb2xsaW5nKCk7XG4gICAgLy8gwqc1IHRoZSBpbnN0YW5jZSdzIGNhcHRjaGEgc2V0dGluZ3MgKHN3aXRjaGluZyBjYXB0Y2hhIG9uIGluIHRoZSBkYXNoYm9hcmRcbiAgICAvLyBkcmF3cyBpdCBoZXJlIHdpdGggbm8gY29kZSBjaGFuZ2UpIGFuZCBlbWFpbCBkZWxpdmVyeSAobm8gZW1haWxlZC1jb2RlXG4gICAgLy8gb3B0aW9uIHdoaWxlIHRoZSBhcHAgY2Fubm90IHNlbmQgZW1haWwpLlxuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykgdm9pZCB0aGlzLmZsb3cubG9hZFNldHRpbmdzKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmZsb3cuZGVzdHJveSgpO1xuICB9XG59XG4iXX0=
156
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbi1pbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvc2lnbi1pbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsS0FBSyxFQUdMLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxJQUFJLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNwQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7QUFFeEQ7Ozs7Ozs7OztHQVNHO0FBMkNILE1BQU0sT0FBTyxlQUFlO0lBQ1QsS0FBSyxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUU5QyxpRkFBaUY7SUFDeEUsUUFBUSxDQUFVO0lBQzNCOzs7O09BSUc7SUFDTSxTQUFTLENBQWlCO0lBRXpCLENBQUMsQ0FBQyxHQUFXO1FBQ3JCLE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRCxzRkFBc0Y7SUFDNUUsYUFBYTtRQUNyQixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsT0FBTztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQzNDLE9BQU8sbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFFUyxVQUFVO1FBQ2xCLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxJQUFJO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDekMsSUFBSSxJQUFJLENBQUMsU0FBUztZQUFFLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUMxQyxJQUFJLENBQUM7WUFDSCxPQUFPLFlBQVksQ0FBQztnQkFDbEIsV0FBVyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVztnQkFDbkMsV0FBVyxFQUFFLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxPQUFPLE1BQU0sS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7Z0JBQ2hHLFFBQVEsRUFBRSxLQUFLO2FBQ2hCLENBQUMsQ0FBQztRQUNMLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDO0lBRWtCLElBQUksR0FBRyxJQUFJLG1CQUFtQixDQUMvQyxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUFFLEVBQzdCLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFO0lBQ3pCLHdFQUF3RTtJQUN4RSxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFDekIsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsQ0FDakQsQ0FBQztJQUVGLFFBQVE7UUFDTiw0RUFBNEU7UUFDNUUsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN4Qiw0RUFBNEU7UUFDNUUseUVBQXlFO1FBQ3pFLDJDQUEyQztRQUMzQyxJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVc7WUFBRSxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDbkUsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3RCLENBQUM7d0dBdkRVLGVBQWU7NEZBQWYsZUFBZSxtSUFyQ2hCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1DVCw0REFwQ1Msb0JBQW9CLDhaQUFFLHNCQUFzQjs7NEZBc0MzQyxlQUFlO2tCQTFDM0IsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsZUFBZTtvQkFDekIsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO29CQUMvQyxPQUFPLEVBQUUsQ0FBQyxvQkFBb0IsRUFBRSxzQkFBc0IsQ0FBQztvQkFDdkQsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1DVDtpQkFDRjs4QkFLVSxRQUFRO3NCQUFoQixLQUFLO2dCQU1HLFNBQVM7c0JBQWpCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIGluamVjdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBsYXN0VXNlZE1ldGhvZExhYmVsLCBzaWduVXAgYXMgaG9zdGVkU2lnblVwIH0gZnJvbSAnQGF0bGFzYXV0aC9qcyc7XG5pbXBvcnQgeyBBdGxhc1NlcnZpY2UgfSBmcm9tICcuLi9hdGxhcy5zZXJ2aWNlJztcbmltcG9ydCB7IHRyYW5zbGF0ZSB9IGZyb20gJy4uL2kxOG4nO1xuaW1wb3J0IHsgQXR0ZW1wdEZsb3dDb21wb25lbnQgfSBmcm9tICcuL2F0dGVtcHQtZmxvdy5jb21wb25lbnQnO1xuaW1wb3J0IHsgUmVjb3ZlcnlDb2Rlc0NvbXBvbmVudCB9IGZyb20gJy4vcmVjb3ZlcnktY29kZXMuY29tcG9uZW50JztcbmltcG9ydCB7IEF0bGFzRmxvd0NvbnRyb2xsZXIgfSBmcm9tICcuL2Zsb3ctY29udHJvbGxlcic7XG5cbi8qKlxuICogYDxhdGxhcy1zaWduLWluPmAg4oCUIHRoZSBmdWxsLCBtdWx0aS1zdGVwIHNpZ24taW4gZmxvdyBkcml2ZW4gZW50aXJlbHkgYnkgdGhlXG4gKiBzZXJ2ZXItc2lkZSBhdHRlbXB0IHN0YXR1cy4gVGhlIEFuZ3VsYXIgcGVlciBvZiBSZWFjdCdzIGA8U2lnbkluLz5gLiBEcmF3cyB0aGVcbiAqIGluc3RhbmNlJ3Mgc2lnbi1pbiBjYXB0Y2hhIHdoZW4gaXQgaXMgcmVxdWlyZWQgKGFsd2F5cy1vbiwgb3IgYVxuICogYG5lZWRzX2NhcHRjaGFgIGNoYWxsZW5nZSkuXG4gKlxuICogYGBgaHRtbFxuICogPGF0bGFzLXNpZ24taW4gKmF0bGFzU2lnbmVkT3V0IGFmdGVyVXJsPVwiL2Rhc2hib2FyZFwiPjwvYXRsYXMtc2lnbi1pbj5cbiAqIGBgYFxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhdGxhcy1zaWduLWluJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGltcG9ydHM6IFtBdHRlbXB0Rmxvd0NvbXBvbmVudCwgUmVjb3ZlcnlDb2Rlc0NvbXBvbmVudF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgQGlmIChsYXN0VXNlZExhYmVsKCk7IGFzIGxhYmVsKSB7XG4gICAgICA8cCBjbGFzcz1cImF0bGFzLXRleHQgYXRsYXMtbGFzdC11c2VkLWhpbnRcIiBkYXRhLWF0bGFzPVwibGFzdC11c2VkXCIgW2F0dHIuZGF0YS1hdGxhcy1tZXRob2RdPVwiZmxvdy5sYXN0TWV0aG9kKClcIj5cbiAgICAgICAge3sgdCgnc2lnbkluLmxhc3RVc2VkJykgfX06IHt7IGxhYmVsIH19XG4gICAgICA8L3A+XG4gICAgfVxuICAgIEBpZiAoZmxvdy5yZWNvdmVyeUNvZGVzKCk7IGFzIGNvZGVzKSB7XG4gICAgICA8YXRsYXMtcmVjb3ZlcnktY29kZXMgW2NvZGVzXT1cImNvZGVzXCIgW2J1c3ldPVwiZmxvdy5zdGF0ZSgpLmJ1c3lcIiAoc2F2ZWQpPVwiZmxvdy5zYXZlUmVjb3ZlcnlDb2RlcygpXCI+PC9hdGxhcy1yZWNvdmVyeS1jb2Rlcz5cbiAgICB9IEBlbHNlIHtcbiAgICA8YXRsYXMtYXR0ZW1wdC1mbG93XG4gICAgICBbYXR0ZW1wdF09XCJmbG93LnN0YXRlKCkuYXR0ZW1wdFwiXG4gICAgICBbYnVzeV09XCJmbG93LnN0YXRlKCkuYnVzeVwiXG4gICAgICBbZXJyb3JzXT1cImZsb3cuc3RhdGUoKS5lcnJvcnNcIlxuICAgICAgW3Nlc3Npb25LZXB0XT1cImZsb3cuc3RhdGUoKS5zZXNzaW9uS2VwdFwiXG4gICAgICB0aXRsZUtleT1cInNpZ25Jbi50aXRsZVwiXG4gICAgICBbY2FwdGNoYV09XCJmbG93LmNhcHRjaGFEcmF3bigpID8gZmxvdy5jYXB0Y2hhIDogbnVsbFwiXG4gICAgICBbZmlyc3RGYWN0b3JzXT1cImZsb3cuZmlyc3RGYWN0b3JzKClcIlxuICAgICAgW3ByZXBhcmVkRmFjdG9yXT1cImZsb3cucHJlcGFyZWRGYWN0b3IoKVwiXG4gICAgICBbb2ZmZXJFbWFpbFNlY29uZEZhY3Rvcl09XCJmbG93LnNldHRpbmdzKCk/LmFjY291bnQ/LmVtYWlsU2Vjb25kRmFjdG9yID09PSB0cnVlXCJcbiAgICAgIFtlbWFpbGVkU2Vjb25kRmFjdG9yXT1cImZsb3cuZW1haWxTZWNvbmRGYWN0b3IoKVwiXG4gICAgICAoc3VibWl0Rmxvdyk9XCJmbG93LnN1Ym1pdCgkZXZlbnQpXCJcbiAgICAgIChjaG9vc2VGYWN0b3IpPVwiZmxvdy5wcmVwYXJlKCRldmVudClcIlxuICAgICAgW29mZmVyU21zU2Vjb25kRmFjdG9yXT1cImZsb3cuc2V0dGluZ3MoKSAhPT0gbnVsbCAmJiBmbG93Lm1mYUNob2ljZXMoKS5zbXNcIlxuICAgICAgW3RleHRlZFNlY29uZEZhY3Rvcl09XCJmbG93LnNtc1NlY29uZEZhY3RvcigpXCJcbiAgICAgIFtlbnJvbGxtZW50XT1cImZsb3cuZW5yb2xsbWVudFwiXG4gICAgICBbZW5yb2xsbWVudFN0YXRlXT1cImZsb3cuZW5yb2xsbWVudFN0YXRlKClcIlxuICAgICAgKGVtYWlsU2Vjb25kRmFjdG9yKT1cImZsb3cuc2VuZEVtYWlsU2Vjb25kRmFjdG9yKClcIlxuICAgICAgKHNtc1NlY29uZEZhY3Rvcik9XCJmbG93LnNlbmRTbXNTZWNvbmRGYWN0b3IoKVwiXG4gICAgPjwvYXRsYXMtYXR0ZW1wdC1mbG93PlxuICAgIH1cbiAgICBAaWYgKGZsb3cuc3RhdGUoKS5hdHRlbXB0Py5zdGF0dXMgIT09ICdjb21wbGV0ZScgJiYgc2lnblVwSHJlZigpOyBhcyBocmVmKSB7XG4gICAgICA8cCBjbGFzcz1cImF0bGFzLWZvb3RlclwiIGRhdGEtYXRsYXMtc2lnbi11cC1wcm9tcHQ9XCJcIj5cbiAgICAgICAge3sgdCgnc2lnbkluLm5vQWNjb3VudCcpIH19IDxhIGNsYXNzPVwiYXRsYXMtbGlua1wiIFtocmVmXT1cImhyZWZcIj57eyB0KCdzaWduSW4uc2lnblVwTGluaycpIH19PC9hPlxuICAgICAgPC9wPlxuICAgIH1cbiAgYCxcbn0pXG5leHBvcnQgY2xhc3MgU2lnbkluQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIHJlYWRvbmx5IGF0bGFzID0gaW5qZWN0KEF0bGFzU2VydmljZSk7XG5cbiAgLyoqIFdoZXJlIHRvIHNlbmQgdGhlIHVzZXIgb25jZSB0aGUgZmxvdyBjb21wbGV0ZXMuIFJlc2VydmVkIGZvciBob3N0IHJvdXRpbmcuICovXG4gIEBJbnB1dCgpIGFmdGVyVXJsPzogc3RyaW5nO1xuICAvKipcbiAgICogV2hlcmUgXCJObyBhY2NvdW50PyBTaWduIHVwXCIgZ29lcy4gRGVmYXVsdDogdGhlIGluc3RhbmNlJ3MgaG9zdGVkIHNpZ24tdXBcbiAgICogcGFnZSAoY2FycnlpbmcgdGhlIHZpc2l0b3IncyByZWZlcnJhbCkuIGBudWxsYCBoaWRlcyBpdC4gQWx3YXlzIHNob3duLCBuZXZlclxuICAgKiBvbmx5IGFmdGVyIGEgZmFpbGVkIHNpZ24taW4sIHNvIGl0IHNheXMgbm90aGluZyBhYm91dCB3aGV0aGVyIGFuIGVtYWlsIGhhcyBhbiBhY2NvdW50LlxuICAgKi9cbiAgQElucHV0KCkgc2lnblVwVXJsPzogc3RyaW5nIHwgbnVsbDtcblxuICBwcm90ZWN0ZWQgdChrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRyYW5zbGF0ZSh0aGlzLmF0bGFzLmxvY2FsaXphdGlvbiwga2V5KTtcbiAgfVxuXG4gIC8qKiBcIkxhc3QgdXNlZDogUGFzc3dvcmRcIiBvbiB0aGUgaWRlbnRpZmllciBzdGVwLCB3aGVuIHRoZSBpbnN0YW5jZSBzaG93cyB0aGUgaGludC4gKi9cbiAgcHJvdGVjdGVkIGxhc3RVc2VkTGFiZWwoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKHRoaXMuZmxvdy5zdGF0ZSgpLmF0dGVtcHQpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBsYXN0VXNlZE1ldGhvZExhYmVsKHRoaXMuZmxvdy5sYXN0TWV0aG9kKCksIChrZXkpID0+IHRoaXMudChrZXkpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzaWduVXBIcmVmKCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICh0aGlzLnNpZ25VcFVybCA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgaWYgKHRoaXMuc2lnblVwVXJsKSByZXR1cm4gdGhpcy5zaWduVXBVcmw7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBob3N0ZWRTaWduVXAoe1xuICAgICAgICBmcm9udGVuZEFwaTogdGhpcy5hdGxhcy5mcm9udGVuZEFwaSxcbiAgICAgICAgcmVkaXJlY3RVcmw6IHRoaXMuYWZ0ZXJVcmwgPz8gKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93LmxvY2F0aW9uLmhyZWYgOiB1bmRlZmluZWQpLFxuICAgICAgICBuYXZpZ2F0ZTogZmFsc2UsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCByZWFkb25seSBmbG93ID0gbmV3IEF0bGFzRmxvd0NvbnRyb2xsZXIoXG4gICAgdGhpcy5hdGxhcy5jcmVhdGVGYXBpQ2xpZW50KCksXG4gICAgKCkgPT4gdGhpcy5hdGxhcy5yZWxvYWQoKSxcbiAgICAvLyBSZXN1bWUgbWlkLWZsb3cgaWYgYW4gT0F1dGggcmVkaXJlY3QgY2FtZSBiYWNrIG93aW5nIGEgc2Vjb25kIGZhY3Rvci5cbiAgICB0aGlzLmF0bGFzLnBlbmRpbmdBdHRlbXB0LFxuICAgIChrZXkpID0+IHRyYW5zbGF0ZSh0aGlzLmF0bGFzLmxvY2FsaXphdGlvbiwga2V5KSxcbiAgKTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyBJZiBzZWVkZWQgZnJvbSBhIHBlbmRpbmcgYXR0ZW1wdCB0aGF0IGlzIGFscmVhZHkgcG9sbGFibGUsIHN0YXJ0IHBvbGxpbmcuXG4gICAgdGhpcy5mbG93LnN5bmNQb2xsaW5nKCk7XG4gICAgLy8gwqc1IHRoZSBpbnN0YW5jZSdzIGNhcHRjaGEgc2V0dGluZ3MgKHN3aXRjaGluZyBjYXB0Y2hhIG9uIGluIHRoZSBkYXNoYm9hcmRcbiAgICAvLyBkcmF3cyBpdCBoZXJlIHdpdGggbm8gY29kZSBjaGFuZ2UpIGFuZCBlbWFpbCBkZWxpdmVyeSAobm8gZW1haWxlZC1jb2RlXG4gICAgLy8gb3B0aW9uIHdoaWxlIHRoZSBhcHAgY2Fubm90IHNlbmQgZW1haWwpLlxuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykgdm9pZCB0aGlzLmZsb3cubG9hZFNldHRpbmdzKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmZsb3cuZGVzdHJveSgpO1xuICB9XG59XG4iXX0=
@@ -19,6 +19,12 @@ export class SignUpFormComponent {
19
19
  busy = false;
20
20
  errors = [];
21
21
  captcha = null;
22
+ /** Passkey-only sign-up: no password field; the email per the instance's mode. */
23
+ passkey = null;
24
+ /** Whether the password / passkey toggle is shown (both are offered). */
25
+ switchable = false;
26
+ /** The user asked for the other sign-up method. */
27
+ switchMode = new EventEmitter();
22
28
  /** Emits the typed values and the consent tick when the form is submitted. */
23
29
  submitSignUp = new EventEmitter();
24
30
  values = {};
@@ -40,8 +46,17 @@ export class SignUpFormComponent {
40
46
  }
41
47
  /** Email + password sign-up cannot complete: the app cannot send the verification email. */
42
48
  emailUnavailable() {
49
+ // A passkey sign-up that collects no email (or an unproven one) sends no mail.
50
+ if (this.passkey && this.passkey.email !== 'required')
51
+ return false;
43
52
  return this.settings?.emailDelivery?.passwordSignUp === false;
44
53
  }
54
+ showEmail() {
55
+ return !this.passkey || this.passkey.email !== 'off';
56
+ }
57
+ emailRequired() {
58
+ return !this.passkey || this.passkey.email === 'required';
59
+ }
45
60
  fields() {
46
61
  return this.settings?.signUpFields ?? [];
47
62
  }
@@ -88,7 +103,7 @@ export class SignUpFormComponent {
88
103
  });
89
104
  }
90
105
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SignUpFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
91
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: SignUpFormComponent, isStandalone: true, selector: "atlas-sign-up-form", inputs: { settings: "settings", busy: "busy", errors: "errors", captcha: "captcha" }, outputs: { submitSignUp: "submitSignUp" }, ngImport: i0, template: `
106
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: SignUpFormComponent, isStandalone: true, selector: "atlas-sign-up-form", inputs: { settings: "settings", busy: "busy", errors: "errors", captcha: "captcha", passkey: "passkey", switchable: "switchable" }, outputs: { switchMode: "switchMode", submitSignUp: "submitSignUp" }, ngImport: i0, template: `
92
107
  <div [class]="cls('card', 'atlas-card')">
93
108
  <h1 [class]="cls('headerTitle', 'atlas-title')">{{ t('signUp.title') }}</h1>
94
109
 
@@ -177,14 +192,17 @@ export class SignUpFormComponent {
177
192
  }
178
193
  }
179
194
 
195
+ @if (showEmail()) {
180
196
  <label [class]="cls('formField', 'atlas-field')">
181
- <span [class]="cls('formFieldLabel', 'atlas-field-label')">{{ t('signUp.emailLabel') }}</span>
197
+ <span [class]="cls('formFieldLabel', 'atlas-field-label')">{{
198
+ emailRequired() ? t('signUp.emailLabel') : t('signUp.optionalField', { label: t('signUp.emailLabel') })
199
+ }}</span>
182
200
  <input
183
201
  [class]="cls('formFieldInput', 'atlas-input')"
184
202
  type="email"
185
203
  name="email"
186
204
  autocomplete="email"
187
- required
205
+ [required]="emailRequired()"
188
206
  [value]="values['email'] ?? ''"
189
207
  (input)="setValue('email', $any($event.target).value)"
190
208
  />
@@ -192,7 +210,11 @@ export class SignUpFormComponent {
192
210
  <span [class]="cls('formFieldError', 'atlas-error')">{{ errorText(error) }}</span>
193
211
  }
194
212
  </label>
213
+ }
195
214
 
215
+ @if (passkey) {
216
+ <p class="atlas-text">{{ t('signUp.passkeyIntro') }}</p>
217
+ } @else {
196
218
  <label [class]="cls('formField', 'atlas-field')">
197
219
  <span [class]="cls('formFieldLabel', 'atlas-field-label')">{{ t('signUp.passwordLabel') }}</span>
198
220
  <input
@@ -208,6 +230,7 @@ export class SignUpFormComponent {
208
230
  <span [class]="cls('formFieldError', 'atlas-error')">{{ errorText(error) }}</span>
209
231
  }
210
232
  </label>
233
+ }
211
234
 
212
235
  @if (showLegal()) {
213
236
  <label [class]="cls('formField', 'atlas-consent')">
@@ -248,6 +271,19 @@ export class SignUpFormComponent {
248
271
  >
249
272
  {{ t('signUp.submit') }}
250
273
  </button>
274
+ @if (switchable) {
275
+ <div class="atlas-alternatives">
276
+ <button
277
+ type="button"
278
+ [class]="cls('formButtonSecondary', 'atlas-button-secondary')"
279
+ [attr.data-atlas-sign-up-mode]="passkey ? 'password' : 'passkey'"
280
+ [disabled]="busy"
281
+ (click)="switchMode.emit()"
282
+ >
283
+ {{ t(passkey ? 'signUp.passwordOption' : 'signUp.passkeyOption') }}
284
+ </button>
285
+ </div>
286
+ }
251
287
  </form>
252
288
  }
253
289
  </div>
@@ -349,14 +385,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
349
385
  }
350
386
  }
351
387
 
388
+ @if (showEmail()) {
352
389
  <label [class]="cls('formField', 'atlas-field')">
353
- <span [class]="cls('formFieldLabel', 'atlas-field-label')">{{ t('signUp.emailLabel') }}</span>
390
+ <span [class]="cls('formFieldLabel', 'atlas-field-label')">{{
391
+ emailRequired() ? t('signUp.emailLabel') : t('signUp.optionalField', { label: t('signUp.emailLabel') })
392
+ }}</span>
354
393
  <input
355
394
  [class]="cls('formFieldInput', 'atlas-input')"
356
395
  type="email"
357
396
  name="email"
358
397
  autocomplete="email"
359
- required
398
+ [required]="emailRequired()"
360
399
  [value]="values['email'] ?? ''"
361
400
  (input)="setValue('email', $any($event.target).value)"
362
401
  />
@@ -364,7 +403,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
364
403
  <span [class]="cls('formFieldError', 'atlas-error')">{{ errorText(error) }}</span>
365
404
  }
366
405
  </label>
406
+ }
367
407
 
408
+ @if (passkey) {
409
+ <p class="atlas-text">{{ t('signUp.passkeyIntro') }}</p>
410
+ } @else {
368
411
  <label [class]="cls('formField', 'atlas-field')">
369
412
  <span [class]="cls('formFieldLabel', 'atlas-field-label')">{{ t('signUp.passwordLabel') }}</span>
370
413
  <input
@@ -380,6 +423,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
380
423
  <span [class]="cls('formFieldError', 'atlas-error')">{{ errorText(error) }}</span>
381
424
  }
382
425
  </label>
426
+ }
383
427
 
384
428
  @if (showLegal()) {
385
429
  <label [class]="cls('formField', 'atlas-consent')">
@@ -420,6 +464,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
420
464
  >
421
465
  {{ t('signUp.submit') }}
422
466
  </button>
467
+ @if (switchable) {
468
+ <div class="atlas-alternatives">
469
+ <button
470
+ type="button"
471
+ [class]="cls('formButtonSecondary', 'atlas-button-secondary')"
472
+ [attr.data-atlas-sign-up-mode]="passkey ? 'password' : 'passkey'"
473
+ [disabled]="busy"
474
+ (click)="switchMode.emit()"
475
+ >
476
+ {{ t(passkey ? 'signUp.passwordOption' : 'signUp.passkeyOption') }}
477
+ </button>
478
+ </div>
479
+ }
423
480
  </form>
424
481
  }
425
482
  </div>
@@ -433,7 +490,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
433
490
  type: Input
434
491
  }], captcha: [{
435
492
  type: Input
493
+ }], passkey: [{
494
+ type: Input
495
+ }], switchable: [{
496
+ type: Input
497
+ }], switchMode: [{
498
+ type: Output
436
499
  }], submitSignUp: [{
437
500
  type: Output
438
501
  }] } });
439
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbi11cC1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9zaWduLXVwLWZvcm0uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUNOLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wscUJBQXFCLEdBS3RCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsUUFBUSxFQUFtQixNQUFNLGVBQWUsQ0FBQztBQUMxRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3BDLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDOztBQVFqRjs7Ozs7OztHQU9HO0FBMktILE1BQU0sT0FBTyxtQkFBbUI7SUFDYixLQUFLLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBRXJDLFFBQVEsR0FBNEIsSUFBSSxDQUFDO0lBQ3pDLElBQUksR0FBRyxLQUFLLENBQUM7SUFDYixNQUFNLEdBQWlCLEVBQUUsQ0FBQztJQUMxQixPQUFPLEdBQTZCLElBQUksQ0FBQztJQUVsRCw4RUFBOEU7SUFDcEUsWUFBWSxHQUFHLElBQUksWUFBWSxFQUFvQixDQUFDO0lBRXBELE1BQU0sR0FBMkIsRUFBRSxDQUFDO0lBQ3BDLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFFZixDQUFDLENBQUMsR0FBVyxFQUFFLElBQTZCO1FBQ3BELE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsMEZBQTBGO0lBQ2hGLFNBQVMsQ0FB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Ozs0RkFzS3hCLG1CQUFtQjtrQkExSy9CLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLG9CQUFvQjtvQkFDOUIsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO29CQUMvQyxPQUFPLEVBQUUsQ0FBQyx5QkFBeUIsQ0FBQztvQkFDcEMsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUtUO2lCQUNGOzhCQUlVLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBR0ksWUFBWTtzQkFBckIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgaW5qZWN0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIGxvY2FsaXplZEVycm9yTWVzc2FnZSxcbiAgdHlwZSBDYXB0Y2hhQ29udHJvbGxlcixcbiAgdHlwZSBGaWVsZEVycm9yLFxuICB0eXBlIEluc3RhbmNlU2V0dGluZ3MsXG4gIHR5cGUgUHVibGljU2lnblVwRmllbGQsXG59IGZyb20gJ0BhdGxhc2F1dGgvanMnO1xuaW1wb3J0IHsgQXRsYXNTZXJ2aWNlIH0gZnJvbSAnLi4vYXRsYXMuc2VydmljZSc7XG5pbXBvcnQgeyBjbGFzc0ZvciwgdHlwZSBFbGVtZW50S2V5IH0gZnJvbSAnLi4vYXBwZWFyYW5jZSc7XG5pbXBvcnQgeyB0cmFuc2xhdGUgfSBmcm9tICcuLi9pMThuJztcbmltcG9ydCB7IEF0bGFzQ2FwdGNoYVNsb3REaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL2NhcHRjaGEtc2xvdC5kaXJlY3RpdmUnO1xuXG4vKiogV2hhdCB0aGUgY3JlYXRlLWFjY291bnQgZm9ybSBlbWl0czogdGhlIHZhbHVlcyB0eXBlZCBwbHVzIHRoZSBjb25zZW50IHRpY2suICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25VcEZvcm1TdWJtaXQge1xuICB2YWx1ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGNvbnNlbnQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogVGhlIGNyZWF0ZS1hY2NvdW50IHN0ZXAgb2YgYDxhdGxhcy1zaWduLXVwPmA6IHRoZSBpbnN0YW5jZSdzIGNvbmZpZ3VyZWQgZXh0cmFcbiAqIGZpZWxkcywgZW1haWwgKyBwYXNzd29yZCwgdGhlIGxlZ2FsLWNvbnNlbnQgcm93IGFuZCDigJQgd2hlbiB0aGUgaW5zdGFuY2VcbiAqIHJlcXVpcmVzIG9uZSBvbiBzaWduLXVwIOKAlCB0aGUgY2FwdGNoYSB3aWRnZXQuIFZhbHVlcyBsaXZlIG9uIHRoZSBjb21wb25lbnQgc29cbiAqIGEgcmVmdXNlZCBzdWJtaXQgbmV2ZXIgY2xlYXJzIHRoZW0uIFdoZW4gdGhlIGFwcCBjYW5ub3Qgc2VuZCB0aGUgdmVyaWZpY2F0aW9uXG4gKiBlbWFpbCAoYHNldHRpbmdzLmVtYWlsRGVsaXZlcnkucGFzc3dvcmRTaWduVXAgPT09IGZhbHNlYCkgaXQgc2hvd3MgdGhlXG4gKiBgc2lnblVwLmVtYWlsVW5hdmFpbGFibGVgIG5vdGljZSBpbnN0ZWFkIG9mIHRoZSBmb3JtLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhdGxhcy1zaWduLXVwLWZvcm0nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW1wb3J0czogW0F0bGFzQ2FwdGNoYVNsb3REaXJlY3RpdmVdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgW2NsYXNzXT1cImNscygnY2FyZCcsICdhdGxhcy1jYXJkJylcIj5cbiAgICAgIDxoMSBbY2xhc3NdPVwiY2xzKCdoZWFkZXJUaXRsZScsICdhdGxhcy10aXRsZScpXCI+e3sgdCgnc2lnblVwLnRpdGxlJykgfX08L2gxPlxuXG4gICAgICBAaWYgKGVtYWlsVW5hdmFpbGFibGUoKSkge1xuICAgICAgICA8IS0tIFRoZSBhcHAgY2Fubm90IHNlbmQgdGhlIHZlcmlmaWNhdGlvbiBlbWFpbCwgc28gYW4gZW1haWwgKyBwYXNzd29yZFxuICAgICAgICAgICAgIHNpZ24tdXAgY291bGQgbmV2ZXIgY29tcGxldGU6IHNheSBzbyBpbnN0ZWFkIG9mIG9mZmVyaW5nIHRoZSBmb3JtLiAtLT5cbiAgICAgICAgPHAgW2NsYXNzXT1cImNscygnZm9ybUZpZWxkRXJyb3InLCAnYXRsYXMtZXJyb3InKVwiIHJvbGU9XCJhbGVydFwiIGRhdGEtYXRsYXMtZW1haWwtdW5hdmFpbGFibGU9XCJcIj5cbiAgICAgICAgICB7eyB0KCdzaWduVXAuZW1haWxVbmF2YWlsYWJsZScpIH19XG4gICAgICAgIDwvcD5cbiAgICAgIH0gQGVsc2Uge1xuICAgICAgQGZvciAoZXJyb3Igb2YgZm9ybUVycm9ycygpOyB0cmFjayBlcnJvci5jb2RlKSB7XG4gICAgICAgIDxwIFtjbGFzc109XCJjbHMoJ2Zvcm1GaWVsZEVycm9yJywgJ2F0bGFzLWVycm9yJylcIiByb2xlPVwiYWxlcnRcIj57eyBlcnJvclRleHQoZXJyb3IpIH19PC9wPlxuICAgICAgfVxuXG4gICAgICA8Zm9ybSAoc3VibWl0KT1cIm9uU3VibWl0KCRldmVudClcIj5cbiAgICAgICAgQGZvciAoZiBvZiBmaWVsZHMoKTsgdHJhY2sgZi5rZXkpIHtcbiAgICAgICAgICBAaWYgKGYudHlwZSA9PT0gJ3JhZGlvJyB8fCBmLnR5cGUgPT09ICdtdWx0aXNlbGVjdCcpIHtcbiAgICAgICAgICAgIDxkaXYgW2NsYXNzXT1cImNscygnZm9ybUZpZWxkJywgJ2F0bGFzLWZpZWxkJylcIj5cbiAgICAgICAgICAgICAgPHNwYW4gW2NsYXNzXT1cImNscygnZm9ybUZpZWxkTGFiZWwnLCAnYXRsYXMtZmllbGQtbGFiZWwnKVwiPnt7IGxhYmVsKGYpIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImF0bGFzLWNob2ljZXNcIj5cbiAgICAgICAgICAgICAgICBAZm9yIChvIG9mIGYub3B0aW9uczsgdHJhY2sgbykge1xuICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYXRsYXMtY2hvaWNlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgIFt0eXBlXT1cImYudHlwZSA9PT0gJ3JhZGlvJyA/ICdyYWRpbycgOiAnY2hlY2tib3gnXCJcbiAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5uYW1lXT1cImYua2V5XCJcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwib1wiXG4gICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwicGlja2VkKGYua2V5KS5pbmNsdWRlcyhvKVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGUoZiwgbywgJGFueSgkZXZlbnQudGFyZ2V0KS5jaGVja2VkKVwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIHt7IG8gfX1cbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIEBmb3IgKGVycm9yIG9mIGZpZWxkRXJyb3JzRm9yKGYua2V5KTsgdHJhY2sgZXJyb3IuY29kZSkge1xuICAgICAgICAgICAgICAgIDxzcGFuIFtjbGFzc109XCJjbHMoJ2Zvcm1GaWVsZEVycm9yJywgJ2F0bGFzLWVycm9yJylcIj57eyBlcnJvclRleHQoZXJyb3IpIH19PC9zcGFuPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgIDxsYWJlbCBbY2xhc3NdPVwiY2xzKCdmb3JtRmllbGQnLCAnYXRsYXMtZmllbGQnKVwiPlxuICAgICAgICAgICAgICA8c3BhbiBbY2xhc3NdPVwiY2xzKCdmb3JtRmllbGRMYWJlbCcsICdhdGxhcy1maWVsZC1sYWJlbCcpXCI+e3sgbGFiZWwoZikgfX08L3NwYW4+XG4gICAgICAgICAgICAgIEBpZiAoZi50eXBlID09PSAnY2hlY2tib3gnKSB7XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIubmFtZV09XCJmLmtleVwiXG4gICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJ2YWx1ZXNbZi5rZXldID09PSAndHJ1ZSdcIlxuICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJzZXRWYWx1ZShmLmtleSwgJGFueSgkZXZlbnQudGFyZ2V0KS5jaGVja2VkID8gJ3RydWUnIDogJycpXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICB9IEBlbHNlIGlmIChmLnR5cGUgPT09ICdzZWxlY3QnKSB7XG4gICAgICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImNscygnZm9ybUZpZWxkSW5wdXQnLCAnYXRsYXMtaW5wdXQnKVwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5uYW1lXT1cImYua2V5XCJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ2YWx1ZXNbZi5rZXldID8/ICcnXCJcbiAgICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJmLnJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwic2V0VmFsdWUoZi5rZXksICRhbnkoJGV2ZW50LnRhcmdldCkudmFsdWUpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+e3sgZi5wbGFjZWhvbGRlciA/PyB0KCdzaWduVXAuc2VsZWN0UGxhY2Vob2xkZXInKSB9fTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgQGZvciAobyBvZiBmLm9wdGlvbnM7IHRyYWNrIG8pIHtcbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwib1wiPnt7IG8gfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgfSBAZWxzZSBpZiAoZi50eXBlID09PSAndGV4dGFyZWEnKSB7XG4gICAgICAgICAgICAgICAgPHRleHRhcmVhXG4gICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiY2xzKCdmb3JtRmllbGRJbnB1dCcsICdhdGxhcy1pbnB1dCcpXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLm5hbWVdPVwiZi5rZXlcIlxuICAgICAgICAgICAgICAgICAgcm93cz1cIjNcIlxuICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInZhbHVlc1tmLmtleV0gPz8gJydcIlxuICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cImYucmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIucGxhY2Vob2xkZXJdPVwiZi5wbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgICAgICAoaW5wdXQpPVwic2V0VmFsdWUoZi5rZXksICRhbnkoJGV2ZW50LnRhcmdldCkudmFsdWUpXCJcbiAgICAgICAgICAgICAgICA+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiY2xzKCdmb3JtRmllbGRJbnB1dCcsICdhdGxhcy1pbnB1dCcpXCJcbiAgICAgICAgICAgICAgICAgIFt0eXBlXT1cImlucHV0VHlwZShmKVwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5uYW1lXT1cImYua2V5XCJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ2YWx1ZXNbZi5rZXldID8/ICcnXCJcbiAgICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJmLnJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLnBsYWNlaG9sZGVyXT1cImYucGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICAgICAgKGlucHV0KT1cInNldFZhbHVlKGYua2V5LCAkYW55KCRldmVudC50YXJnZXQpLnZhbHVlKVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBAZm9yIChlcnJvciBvZiBmaWVsZEVycm9yc0ZvcihmLmtleSk7IHRyYWNrIGVycm9yLmNvZGUpIHtcbiAgICAgICAgICAgICAgICA8c3BhbiBbY2xhc3NdPVwiY2xzKCdmb3JtRmllbGRFcnJvcicsICdhdGxhcy1lcnJvcicpXCI+e3sgZXJyb3JUZXh0KGVycm9yKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICA8bGFiZWwgW2NsYXNzXT1cImNscygnZm9ybUZpZWxkJywgJ2F0bGFzLWZpZWxkJylcIj5cbiAgICAgICAgICA8c3BhbiBbY2xhc3NdPVwiY2xzKCdmb3JtRmllbGRMYWJlbCcsICdhdGxhcy1maWVsZC1sYWJlbCcpXCI+e3sgdCgnc2lnblVwLmVtYWlsTGFiZWwnKSB9fTwvc3Bhbj5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIFtjbGFzc109XCJjbHMoJ2Zvcm1GaWVsZElucHV0JywgJ2F0bGFzLWlucHV0JylcIlxuICAgICAgICAgICAgdHlwZT1cImVtYWlsXCJcbiAgICAgICAgICAgIG5hbWU9XCJlbWFpbFwiXG4gICAgICAgICAgICBhdXRvY29tcGxldGU9XCJlbWFpbFwiXG4gICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgW3ZhbHVlXT1cInZhbHVlc1snZW1haWwnXSA/PyAnJ1wiXG4gICAgICAgICAgICAoaW5wdXQpPVwic2V0VmFsdWUoJ2VtYWlsJywgJGFueSgkZXZlbnQudGFyZ2V0KS52YWx1ZSlcIlxuICAgICAgICAgIC8+XG4gICAgICAgICAgQGZvciAoZXJyb3Igb2YgZmllbGRFcnJvcnNGb3IoJ2VtYWlsJyk7IHRyYWNrIGVycm9yLmNvZGUpIHtcbiAgICAgICAgICAgIDxzcGFuIFtjbGFzc109XCJjbHMoJ2Zvcm1GaWVsZEVycm9yJywgJ2F0bGFzLWVycm9yJylcIj57eyBlcnJvclRleHQoZXJyb3IpIH19PC9zcGFuPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9sYWJlbD5cblxuICAgICAgICA8bGFiZWwgW2NsYXNzXT1cImNscygnZm9ybUZpZWxkJywgJ2F0bGFzLWZpZWxkJylcIj5cbiAgICAgICAgICA8c3BhbiBbY2xhc3NdPVwiY2xzKCdmb3JtRmllbGRMYWJlbCcsICdhdGxhcy1maWVsZC1sYWJlbCcpXCI+e3sgdCgnc2lnblVwLnBhc3N3b3JkTGFiZWwnKSB9fTwvc3Bhbj5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIFtjbGFzc109XCJjbHMoJ2Zvcm1GaWVsZElucHV0JywgJ2F0bGFzLWlucHV0JylcIlxuICAgICAgICAgICAgdHlwZT1cInBhc3N3b3JkXCJcbiAgICAgICAgICAgIG5hbWU9XCJwYXNzd29yZFwiXG4gICAgICAgICAgICBhdXRvY29tcGxldGU9XCJuZXctcGFzc3dvcmRcIlxuICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgIFt2YWx1ZV09XCJ2YWx1ZXNbJ3Bhc3N3b3JkJ10gPz8gJydcIlxuICAgICAgICAgICAgKGlucHV0KT1cInNldFZhbHVlKCdwYXNzd29yZCcsICRhbnkoJGV2ZW50LnRhcmdldCkudmFsdWUpXCJcbiAgICAgICAgICAvPlxuICAgICAgICAgIEBmb3IgKGVycm9yIG9mIGZpZWxkRXJyb3JzRm9yKCdwYXNzd29yZCcpOyB0cmFjayBlcnJvci5jb2RlKSB7XG4gICAgICAgICAgICA8c3BhbiBbY2xhc3NdPVwiY2xzKCdmb3JtRmllbGRFcnJvcicsICdhdGxhcy1lcnJvcicpXCI+e3sgZXJyb3JUZXh0KGVycm9yKSB9fTwvc3Bhbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvbGFiZWw+XG5cbiAgICAgICAgQGlmIChzaG93TGVnYWwoKSkge1xuICAgICAgICAgIDxsYWJlbCBbY2xhc3NdPVwiY2xzKCdmb3JtRmllbGQnLCAnYXRsYXMtY29uc2VudCcpXCI+XG4gICAgICAgICAgICBAaWYgKHNldHRpbmdzPy5sZWdhbD8ucmVxdWlyZWQpIHtcbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICBuYW1lPVwiY29uc2VudFwiXG4gICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiYWdyZWVkXCJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImFncmVlZCA9ICRhbnkoJGV2ZW50LnRhcmdldCkuY2hlY2tlZFwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImF0bGFzLXRleHRcIj5cbiAgICAgICAgICAgICAge3sgdChzZXR0aW5ncz8ubGVnYWw/LnJlcXVpcmVkID8gJ3NpZ25VcC5jb25zZW50QWdyZWUnIDogJ3NpZ25VcC5jb25zZW50Tm90aWNlJykgfX1cbiAgICAgICAgICAgICAgQGlmIChzZXR0aW5ncz8ubGVnYWw/LnRlcm1zVXJsOyBhcyB0ZXJtcykge1xuICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiYXRsYXMtbGlua1wiIFtocmVmXT1cInRlcm1zXCIgdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiPnt7IHQoJ3NpZ25VcC50ZXJtcycpIH19PC9hPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIEBpZiAoc2V0dGluZ3M/LmxlZ2FsPy50ZXJtc1VybCAmJiBzZXR0aW5ncz8ubGVnYWw/LnByaXZhY3lVcmwpIHtcbiAgICAgICAgICAgICAgICB7eyB0KCdzaWduVXAuYW5kJykgfX1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBAaWYgKHNldHRpbmdzPy5sZWdhbD8ucHJpdmFjeVVybDsgYXMgcHJpdmFjeSkge1xuICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiYXRsYXMtbGlua1wiIFtocmVmXT1cInByaXZhY3lcIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCI+e3sgdCgnc2lnblVwLnByaXZhY3knKSB9fTwvYT5cbiAgICAgICAgICAgICAgfS5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIEBmb3IgKGVycm9yIG9mIGZpZWxkRXJyb3JzRm9yKCdjb25zZW50Jyk7IHRyYWNrIGVycm9yLmNvZGUpIHtcbiAgICAgICAgICAgICAgPHNwYW4gW2NsYXNzXT1cImNscygnZm9ybUZpZWxkRXJyb3InLCAnYXRsYXMtZXJyb3InKVwiPnt7IGVycm9yVGV4dChlcnJvcikgfX08L3NwYW4+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgfVxuXG4gICAgICAgIEBpZiAoY2FwdGNoYSkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdGxhcy1jYXB0Y2hhXCIgZGF0YS1hdGxhcy1jYXB0Y2hhPVwiXCIgW2F0bGFzQ2FwdGNoYVNsb3RdPVwiY2FwdGNoYVwiPjwvZGl2PlxuICAgICAgICB9XG5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIFtjbGFzc109XCJjbHMoJ2Zvcm1CdXR0b25QcmltYXJ5JywgJ2F0bGFzLWJ1dHRvbicpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiYnVzeSB8fCAhY29uc2VudE9rKClcIlxuICAgICAgICAgIHR5cGU9XCJzdWJtaXRcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgdCgnc2lnblVwLnN1Ym1pdCcpIH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9mb3JtPlxuICAgICAgfVxuICAgIDwvZGl2PlxuICBgLFxufSlcbmV4cG9ydCBjbGFzcyBTaWduVXBGb3JtQ29tcG9uZW50IHtcbiAgcHJpdmF0ZSByZWFkb25seSBhdGxhcyA9IGluamVjdChBdGxhc1NlcnZpY2UpO1xuXG4gIEBJbnB1dCgpIHNldHRpbmdzOiBJbnN0YW5jZVNldHRpbmdzIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIGJ1c3kgPSBmYWxzZTtcbiAgQElucHV0KCkgZXJyb3JzOiBGaWVsZEVycm9yW10gPSBbXTtcbiAgQElucHV0KCkgY2FwdGNoYTogQ2FwdGNoYUNvbnRyb2xsZXIgfCBudWxsID0gbnVsbDtcblxuICAvKiogRW1pdHMgdGhlIHR5cGVkIHZhbHVlcyBhbmQgdGhlIGNvbnNlbnQgdGljayB3aGVuIHRoZSBmb3JtIGlzIHN1Ym1pdHRlZC4gKi9cbiAgQE91dHB1dCgpIHN1Ym1pdFNpZ25VcCA9IG5ldyBFdmVudEVtaXR0ZXI8U2lnblVwRm9ybVN1Ym1pdD4oKTtcblxuICBwcm90ZWN0ZWQgdmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIHByb3RlY3RlZCBhZ3JlZWQgPSBmYWxzZTtcblxuICBwcm90ZWN0ZWQgdChrZXk6IHN0cmluZywgdmFycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiBzdHJpbmcge1xuICAgIHJldHVybiB0cmFuc2xhdGUodGhpcy5hdGxhcy5sb2NhbGl6YXRpb24sIGtleSwgdmFycyk7XG4gIH1cblxuICAvKiogQSBzZXJ2ZXIgZXJyb3IgaW4gdGhlIGFwcCdzIGxhbmd1YWdlIChgZXJyb3IuPHJlYXNvbj5gLCBlbHNlIHRoZSBzZXJ2ZXIncyBtZXNzYWdlKS4gKi9cbiAgcHJvdGVjdGVkIGVycm9yVGV4dChlcnJvcjogRmllbGRFcnJvcik6IHN0cmluZyB7XG4gICAgLy8gYGVycm9yTG9jYWxpemF0aW9uYCBpcyByZWFkIGRlZmVuc2l2ZWx5OiBhIHN0YW5kLWluIHNlcnZpY2UgbWF5IGxhY2sgaXQuXG4gICAgY29uc3QgbGF5ZXIgPSAodGhpcy5hdGxhcyBhcyB7IGVycm9yTG9jYWxpemF0aW9uPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB9KS5lcnJvckxvY2FsaXphdGlvbjtcbiAgICByZXR1cm4gbG9jYWxpemVkRXJyb3JNZXNzYWdlKGVycm9yLCBsYXllciA/PyB0aGlzLmF0bGFzLmxvY2FsaXphdGlvbiwgdGhpcy5hdGxhcy5sb2NhbGl6YXRpb24pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNscyhrZXk6IEVsZW1lbnRLZXksIGJhc2U6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNsYXNzRm9yKGtleSwgdGhpcy5hdGxhcy5hcHBlYXJhbmNlLCBiYXNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRWYWx1ZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlcyA9IHsgLi4udGhpcy52YWx1ZXMsIFtuYW1lXTogdmFsdWUgfTtcbiAgfVxuXG4gIC8qKiBFbWFpbCArIHBhc3N3b3JkIHNpZ24tdXAgY2Fubm90IGNvbXBsZXRlOiB0aGUgYXBwIGNhbm5vdCBzZW5kIHRoZSB2ZXJpZmljYXRpb24gZW1haWwuICovXG4gIHByb3RlY3RlZCBlbWFpbFVuYXZhaWxhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNldHRpbmdzPy5lbWFpbERlbGl2ZXJ5Py5wYXNzd29yZFNpZ25VcCA9PT0gZmFsc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgZmllbGRzKCk6IFB1YmxpY1NpZ25VcEZpZWxkW10ge1xuICAgIHJldHVybiB0aGlzLnNldHRpbmdzPy5zaWduVXBGaWVsZHMgPz8gW107XG4gIH1cblxuICBwcm90ZWN0ZWQgbGFiZWwoZjogUHVibGljU2lnblVwRmllbGQpOiBzdHJpbmcge1xuICAgIHJldHVybiBmLnJlcXVpcmVkID8gZi5sYWJlbCA6IHRoaXMudCgnc2lnblVwLm9wdGlvbmFsRmllbGQnLCB7IGxhYmVsOiBmLmxhYmVsIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGlucHV0VHlwZShmOiBQdWJsaWNTaWduVXBGaWVsZCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFsnZW1haWwnLCAndGVsJywgJ3VybCcsICdudW1iZXInLCAnZGF0ZSddLmluY2x1ZGVzKGYudHlwZSkgPyBmLnR5cGUgOiAndGV4dCc7XG4gIH1cblxuICAvKiogU2FtZSBlbmNvZGluZyBhcyBSZWFjdCwgdGhlIGVtYmVkIHdpZGdldCBhbmQgdGhlIGhvc3RlZCBwYWdlOiBvbmUgdmFsdWUsXG4gICAqICBvciBhIGNvbW1hLWpvaW5lZCBsaXN0IGZvciBtdWx0aXNlbGVjdC4gKi9cbiAgcHJvdGVjdGVkIHBpY2tlZChrZXk6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMudmFsdWVzW2tleV07XG4gICAgcmV0dXJuIHZhbHVlID8gdmFsdWUuc3BsaXQoJywgJykgOiBbXTtcbiAgfVxuXG4gIHByb3RlY3RlZCB0b2dnbGUoZjogUHVibGljU2lnblVwRmllbGQsIG9wdGlvbjogc3RyaW5nLCBvbjogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChmLnR5cGUgPT09ICdyYWRpbycpIHtcbiAgICAgIHRoaXMuc2V0VmFsdWUoZi5rZXksIG9wdGlvbik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnBpY2tlZChmLmtleSk7XG4gICAgdGhpcy5zZXRWYWx1ZShmLmtleSwgKG9uID8gWy4uLmN1cnJlbnQsIG9wdGlvbl0gOiBjdXJyZW50LmZpbHRlcigocCkgPT4gcCAhPT0gb3B0aW9uKSkuam9pbignLCAnKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2hvd0xlZ2FsKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGxlZ2FsID0gdGhpcy5zZXR0aW5ncz8ubGVnYWw7XG4gICAgcmV0dXJuICEhbGVnYWwgJiYgKCEhbGVnYWwudGVybXNVcmwgfHwgISFsZWdhbC5wcml2YWN5VXJsKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb25zZW50T2soKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLnNldHRpbmdzPy5sZWdhbD8ucmVxdWlyZWQgfHwgdGhpcy5hZ3JlZWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgZm9ybUVycm9ycygpOiBGaWVsZEVycm9yW10ge1xuICAgIHJldHVybiB0aGlzLmVycm9ycy5maWx0ZXIoKGVycm9yKSA9PiAhZXJyb3IucGFyYW0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGZpZWxkRXJyb3JzRm9yKG5hbWU6IHN0cmluZyk6IEZpZWxkRXJyb3JbXSB7XG4gICAgcmV0dXJuIHRoaXMuZXJyb3JzLmZpbHRlcigoZXJyb3IpID0+IGVycm9yLnBhcmFtID09PSBuYW1lKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblN1Ym1pdChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGlmICh0aGlzLmVtYWlsVW5hdmFpbGFibGUoKSB8fCAhdGhpcy5jb25zZW50T2soKSkgcmV0dXJuO1xuICAgIHRoaXMuc3VibWl0U2lnblVwLmVtaXQoe1xuICAgICAgdmFsdWVzOiB7IC4uLnRoaXMudmFsdWVzIH0sXG4gICAgICBjb25zZW50OiB0aGlzLnNldHRpbmdzPy5sZWdhbD8ucmVxdWlyZWQgPyB0aGlzLmFncmVlZCA6IHRydWUsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
502
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbi11cC1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9zaWduLXVwLWZvcm0uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUNOLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wscUJBQXFCLEdBS3RCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsUUFBUSxFQUFtQixNQUFNLGVBQWUsQ0FBQztBQUMxRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3BDLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDOztBQVFqRjs7Ozs7OztHQU9HO0FBZ01ILE1BQU0sT0FBTyxtQkFBbUI7SUFDYixLQUFLLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBRXJDLFFBQVEsR0FBNEIsSUFBSSxDQUFDO0lBQ3pDLElBQUksR0FBRyxLQUFLLENBQUM7SUFDYixNQUFNLEdBQWlCLEVBQUUsQ0FBQztJQUMxQixPQUFPLEdBQTZCLElBQUksQ0FBQztJQUNsRCxrRkFBa0Y7SUFDekUsT0FBTyxHQUFzRCxJQUFJLENBQUM7SUFDM0UseUVBQXlFO0lBQ2hFLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDNUIsbURBQW1EO0lBQ3pDLFVBQVUsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO0lBRWhELDhFQUE4RTtJQUNwRSxZQUFZLEdBQUcsSUFBSSxZQUFZLEVBQW9CLENBQUM7SUFFcEQsTUFBTSxHQUEyQixFQUFFLENBQUM7SUFDcEMsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUVmLENBQUMsQ0FBQyxH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QU87c0JBQWYsS0FBSztnQkFFRyxVQUFVO3NCQUFsQixLQUFLO2dCQUVJLFVBQVU7c0JBQW5CLE1BQU07Z0JBR0csWUFBWTtzQkFBckIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgaW5qZWN0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIGxvY2FsaXplZEVycm9yTWVzc2FnZSxcbiAgdHlwZSBDYXB0Y2hhQ29udHJvbGxlcixcbiAgdHlwZSBGaWVsZEVycm9yLFxuICB0eXBlIEluc3RhbmNlU2V0dGluZ3MsXG4gIHR5cGUgUHVibGljU2lnblVwRmllbGQsXG59IGZyb20gJ0BhdGxhc2F1dGgvanMnO1xuaW1wb3J0IHsgQXRsYXNTZXJ2aWNlIH0gZnJvbSAnLi4vYXRsYXMuc2VydmljZSc7XG5pbXBvcnQgeyBjbGFzc0ZvciwgdHlwZSBFbGVtZW50S2V5IH0gZnJvbSAnLi4vYXBwZWFyYW5jZSc7XG5pbXBvcnQgeyB0cmFuc2xhdGUgfSBmcm9tICcuLi9pMThuJztcbmltcG9ydCB7IEF0bGFzQ2FwdGNoYVNsb3REaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL2NhcHRjaGEtc2xvdC5kaXJlY3RpdmUnO1xuXG4vKiogV2hhdCB0aGUgY3JlYXRlLWFjY291bnQgZm9ybSBlbWl0czogdGhlIHZhbHVlcyB0eXBlZCBwbHVzIHRoZSBjb25zZW50IHRpY2suICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25VcEZvcm1TdWJtaXQge1xuICB2YWx1ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGNvbnNlbnQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogVGhlIGNyZWF0ZS1hY2NvdW50IHN0ZXAgb2YgYDxhdGxhcy1zaWduLXVwPmA6IHRoZSBpbnN0YW5jZSdzIGNvbmZpZ3VyZWQgZXh0cmFcbiAqIGZpZWxkcywgZW1haWwgKyBwYXNzd29yZCwgdGhlIGxlZ2FsLWNvbnNlbnQgcm93IGFuZCDigJQgd2hlbiB0aGUgaW5zdGFuY2VcbiAqIHJlcXVpcmVzIG9uZSBvbiBzaWduLXVwIOKAlCB0aGUgY2FwdGNoYSB3aWRnZXQuIFZhbHVlcyBsaXZlIG9uIHRoZSBjb21wb25lbnQgc29cbiAqIGEgcmVmdXNlZCBzdWJtaXQgbmV2ZXIgY2xlYXJzIHRoZW0uIFdoZW4gdGhlIGFwcCBjYW5ub3Qgc2VuZCB0aGUgdmVyaWZpY2F0aW9uXG4gKiBlbWFpbCAoYHNldHRpbmdzLmVtYWlsRGVsaXZlcnkucGFzc3dvcmRTaWduVXAgPT09IGZhbHNlYCkgaXQgc2hvd3MgdGhlXG4gKiBgc2lnblVwLmVtYWlsVW5hdmFpbGFibGVgIG5vdGljZSBpbnN0ZWFkIG9mIHRoZSBmb3JtLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhdGxhcy1zaWduLXVwLWZvcm0nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW1wb3J0czogW0F0bGFzQ2FwdGNoYVNsb3REaXJlY3RpdmVdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgW2NsYXNzXT1cImNscygnY2FyZCcsICdhdGxhcy1jYXJkJylcIj5cbiAgICAgIDxoMSBbY2xhc3NdPVwiY2xzKCdoZWFkZXJUaXRsZScsICdhdGxhcy10aXRsZScpXCI+e3sgdCgnc2lnblVwLnRpdGxlJykgfX08L2gxPlxuXG4gICAgICBAaWYgKGVtYWlsVW5hdmFpbGFibGUoKSkge1xuICAgICAgICA8IS0tIFRoZSBhcHAgY2Fubm90IHNlbmQgdGhlIHZlcmlmaWNhdGlvbiBlbWFpbCwgc28gYW4gZW1haWwgKyBwYXNzd29yZFxuICAgICAgICAgICAgIHNpZ24tdXAgY291bGQgbmV2ZXIgY29tcGxldGU6IHNheSBzbyBpbnN0ZWFkIG9mIG9mZmVyaW5nIHRoZSBmb3JtLiAtLT5cbiAgICAgICAgPHAgW2NsYXNzXT1cImNscygnZm9ybUZpZWxkRXJyb3InLCAnYXRsYXMtZXJyb3InKVwiIHJvbGU9XCJhbGVydFwiIGRhdGEtYXRsYXMtZW1haWwtdW5hdmFpbGFibGU9XCJcIj5cbiAgICAgICAgICB7eyB0KCdzaWduVXAuZW1haWxVbmF2YWlsYWJsZScpIH19XG4gICAgICAgIDwvcD5cbiAgICAgIH0gQGVsc2Uge1xuICAgICAgQGZvciAoZXJyb3Igb2YgZm9ybUVycm9ycygpOyB0cmFjayBlcnJvci5jb2RlKSB7XG4gICAgICAgIDxwIFtjbGFzc109XCJjbHMoJ2Zvcm1GaWVsZEVycm9yJywgJ2F0bGFzLWVycm9yJylcIiByb2xlPVwiYWxlcnRcIj57eyBlcnJvclRleHQoZXJyb3IpIH19PC9wPlxuICAgICAgfVxuXG4gICAgICA8Zm9ybSAoc3VibWl0KT1cIm9uU3VibWl0KCRldmVudClcIj5cbiAgICAgICAgQGZvciAoZiBvZiBmaWVsZHMoKTsgdHJhY2sgZi5rZXkpIHtcbiAgICAgICAgICBAaWYgKGYudHlwZSA9PT0gJ3JhZGlvJyB8fCBmLnR5cGUgPT09ICdtdWx0aXNlbGVjdCcpIHtcbiAgICAgICAgICAgIDxkaXYgW2NsYXNzXT1cImNscygnZm9ybUZpZWxkJywgJ2F0bGFzLWZpZWxkJylcIj5cbiAgICAgICAgICAgICAgPHNwYW4gW2NsYXNzXT1cImNscygnZm9ybUZpZWxkTGFiZWwnLCAnYXRsYXMtZmllbGQtbGFiZWwnKVwiPnt7IGxhYmVsKGYpIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImF0bGFzLWNob2ljZXNcIj5cbiAgICAgICAgICAgICAgICBAZm9yIChvIG9mIGYub3B0aW9uczsgdHJhY2sgbykge1xuICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYXRsYXMtY2hvaWNlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgIFt0eXBlXT1cImYudHlwZSA9PT0gJ3JhZGlvJyA/ICdyYWRpbycgOiAnY2hlY2tib3gnXCJcbiAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5uYW1lXT1cImYua2V5XCJcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwib1wiXG4gICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwicGlja2VkKGYua2V5KS5pbmNsdWRlcyhvKVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGUoZiwgbywgJGFueSgkZXZlbnQudGFyZ2V0KS5jaGVja2VkKVwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIHt7IG8gfX1cbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIEBmb3IgKGVycm9yIG9mIGZpZWxkRXJyb3JzRm9yKGYua2V5KTsgdHJhY2sgZXJyb3IuY29kZSkge1xuICAgICAgICAgICAgICAgIDxzcGFuIFtjbGFzc109XCJjbHMoJ2Zvcm1GaWVsZEVycm9yJywgJ2F0bGFzLWVycm9yJylcIj57eyBlcnJvclRleHQoZXJyb3IpIH19PC9zcGFuPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgIDxsYWJlbCBbY2xhc3NdPVwiY2xzKCdmb3JtRmllbGQnLCAnYXRsYXMtZmllbGQnKVwiPlxuICAgICAgICAgICAgICA8c3BhbiBbY2xhc3NdPVwiY2xzKCdmb3JtRmllbGRMYWJlbCcsICdhdGxhcy1maWVsZC1sYWJlbCcpXCI+e3sgbGFiZWwoZikgfX08L3NwYW4+XG4gICAgICAgICAgICAgIEBpZiAoZi50eXBlID09PSAnY2hlY2tib3gnKSB7XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIubmFtZV09XCJmLmtleVwiXG4gICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJ2YWx1ZXNbZi5rZXldID09PSAndHJ1ZSdcIlxuICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJzZXRWYWx1ZShmLmtleSwgJGFueSgkZXZlbnQudGFyZ2V0KS5jaGVja2VkID8gJ3RydWUnIDogJycpXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICB9IEBlbHNlIGlmIChmLnR5cGUgPT09ICdzZWxlY3QnKSB7XG4gICAgICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImNscygnZm9ybUZpZWxkSW5wdXQnLCAnYXRsYXMtaW5wdXQnKVwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5uYW1lXT1cImYua2V5XCJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ2YWx1ZXNbZi5rZXldID8/ICcnXCJcbiAgICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJmLnJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwic2V0VmFsdWUoZi5rZXksICRhbnkoJGV2ZW50LnRhcmdldCkudmFsdWUpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+e3sgZi5wbGFjZWhvbGRlciA/PyB0KCdzaWduVXAuc2VsZWN0UGxhY2Vob2xkZXInKSB9fTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgQGZvciAobyBvZiBmLm9wdGlvbnM7IHRyYWNrIG8pIHtcbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwib1wiPnt7IG8gfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgfSBAZWxzZSBpZiAoZi50eXBlID09PSAndGV4dGFyZWEnKSB7XG4gICAgICAgICAgICAgICAgPHRleHRhcmVhXG4gICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiY2xzKCdmb3JtRmllbGRJbnB1dCcsICdhdGxhcy1pbnB1dCcpXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLm5hbWVdPVwiZi5rZXlcIlxuICAgICAgICAgICAgICAgICAgcm93cz1cIjNcIlxuICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInZhbHVlc1tmLmtleV0gPz8gJydcIlxuICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cImYucmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIucGxhY2Vob2xkZXJdPVwiZi5wbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgICAgICAoaW5wdXQpPVwic2V0VmFsdWUoZi5rZXksICRhbnkoJGV2ZW50LnRhcmdldCkudmFsdWUpXCJcbiAgICAgICAgICAgICAgICA+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiY2xzKCdmb3JtRmllbGRJbnB1dCcsICdhdGxhcy1pbnB1dCcpXCJcbiAgICAgICAgICAgICAgICAgIFt0eXBlXT1cImlucHV0VHlwZShmKVwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5uYW1lXT1cImYua2V5XCJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ2YWx1ZXNbZi5rZXldID8/ICcnXCJcbiAgICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJmLnJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLnBsYWNlaG9sZGVyXT1cImYucGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICAgICAgKGlucHV0KT1cInNldFZhbHVlKGYua2V5LCAkYW55KCRldmVudC50YXJnZXQpLnZhbHVlKVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBAZm9yIChlcnJvciBvZiBmaWVsZEVycm9yc0ZvcihmLmtleSk7IHRyYWNrIGVycm9yLmNvZGUpIHtcbiAgICAgICAgICAgICAgICA8c3BhbiBbY2xhc3NdPVwiY2xzKCdmb3JtRmllbGRFcnJvcicsICdhdGxhcy1lcnJvcicpXCI+e3sgZXJyb3JUZXh0KGVycm9yKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBAaWYgKHNob3dFbWFpbCgpKSB7XG4gICAgICAgIDxsYWJlbCBbY2xhc3NdPVwiY2xzKCdmb3JtRmllbGQnLCAnYXRsYXMtZmllbGQnKVwiPlxuICAgICAgICAgIDxzcGFuIFtjbGFzc109XCJjbHMoJ2Zvcm1GaWVsZExhYmVsJywgJ2F0bGFzLWZpZWxkLWxhYmVsJylcIj57e1xuICAgICAgICAgICAgZW1haWxSZXF1aXJlZCgpID8gdCgnc2lnblVwLmVtYWlsTGFiZWwnKSA6IHQoJ3NpZ25VcC5vcHRpb25hbEZpZWxkJywgeyBsYWJlbDogdCgnc2lnblVwLmVtYWlsTGFiZWwnKSB9KVxuICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgW2NsYXNzXT1cImNscygnZm9ybUZpZWxkSW5wdXQnLCAnYXRsYXMtaW5wdXQnKVwiXG4gICAgICAgICAgICB0eXBlPVwiZW1haWxcIlxuICAgICAgICAgICAgbmFtZT1cImVtYWlsXCJcbiAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cImVtYWlsXCJcbiAgICAgICAgICAgIFtyZXF1aXJlZF09XCJlbWFpbFJlcXVpcmVkKClcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cInZhbHVlc1snZW1haWwnXSA/PyAnJ1wiXG4gICAgICAgICAgICAoaW5wdXQpPVwic2V0VmFsdWUoJ2VtYWlsJywgJGFueSgkZXZlbnQudGFyZ2V0KS52YWx1ZSlcIlxuICAgICAgICAgIC8+XG4gICAgICAgICAgQGZvciAoZXJyb3Igb2YgZmllbGRFcnJvcnNGb3IoJ2VtYWlsJyk7IHRyYWNrIGVycm9yLmNvZGUpIHtcbiAgICAgICAgICAgIDxzcGFuIFtjbGFzc109XCJjbHMoJ2Zvcm1GaWVsZEVycm9yJywgJ2F0bGFzLWVycm9yJylcIj57eyBlcnJvclRleHQoZXJyb3IpIH19PC9zcGFuPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgfVxuXG4gICAgICAgIEBpZiAocGFzc2tleSkge1xuICAgICAgICAgIDxwIGNsYXNzPVwiYXRsYXMtdGV4dFwiPnt7IHQoJ3NpZ25VcC5wYXNza2V5SW50cm8nKSB9fTwvcD5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDxsYWJlbCBbY2xhc3NdPVwiY2xzKCdmb3JtRmllbGQnLCAnYXRsYXMtZmllbGQnKVwiPlxuICAgICAgICAgIDxzcGFuIFtjbGFzc109XCJjbHMoJ2Zvcm1GaWVsZExhYmVsJywgJ2F0bGFzLWZpZWxkLWxhYmVsJylcIj57eyB0KCdzaWduVXAucGFzc3dvcmRMYWJlbCcpIH19PC9zcGFuPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgW2NsYXNzXT1cImNscygnZm9ybUZpZWxkSW5wdXQnLCAnYXRsYXMtaW5wdXQnKVwiXG4gICAgICAgICAgICB0eXBlPVwicGFzc3dvcmRcIlxuICAgICAgICAgICAgbmFtZT1cInBhc3N3b3JkXCJcbiAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm5ldy1wYXNzd29yZFwiXG4gICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgW3ZhbHVlXT1cInZhbHVlc1sncGFzc3dvcmQnXSA/PyAnJ1wiXG4gICAgICAgICAgICAoaW5wdXQpPVwic2V0VmFsdWUoJ3Bhc3N3b3JkJywgJGFueSgkZXZlbnQudGFyZ2V0KS52YWx1ZSlcIlxuICAgICAgICAgIC8+XG4gICAgICAgICAgQGZvciAoZXJyb3Igb2YgZmllbGRFcnJvcnNGb3IoJ3Bhc3N3b3JkJyk7IHRyYWNrIGVycm9yLmNvZGUpIHtcbiAgICAgICAgICAgIDxzcGFuIFtjbGFzc109XCJjbHMoJ2Zvcm1GaWVsZEVycm9yJywgJ2F0bGFzLWVycm9yJylcIj57eyBlcnJvclRleHQoZXJyb3IpIH19PC9zcGFuPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgfVxuXG4gICAgICAgIEBpZiAoc2hvd0xlZ2FsKCkpIHtcbiAgICAgICAgICA8bGFiZWwgW2NsYXNzXT1cImNscygnZm9ybUZpZWxkJywgJ2F0bGFzLWNvbnNlbnQnKVwiPlxuICAgICAgICAgICAgQGlmIChzZXR0aW5ncz8ubGVnYWw/LnJlcXVpcmVkKSB7XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgbmFtZT1cImNvbnNlbnRcIlxuICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImFncmVlZFwiXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJhZ3JlZWQgPSAkYW55KCRldmVudC50YXJnZXQpLmNoZWNrZWRcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhdGxhcy10ZXh0XCI+XG4gICAgICAgICAgICAgIHt7IHQoc2V0dGluZ3M/LmxlZ2FsPy5yZXF1aXJlZCA/ICdzaWduVXAuY29uc2VudEFncmVlJyA6ICdzaWduVXAuY29uc2VudE5vdGljZScpIH19XG4gICAgICAgICAgICAgIEBpZiAoc2V0dGluZ3M/LmxlZ2FsPy50ZXJtc1VybDsgYXMgdGVybXMpIHtcbiAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImF0bGFzLWxpbmtcIiBbaHJlZl09XCJ0ZXJtc1wiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIj57eyB0KCdzaWduVXAudGVybXMnKSB9fTwvYT5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBAaWYgKHNldHRpbmdzPy5sZWdhbD8udGVybXNVcmwgJiYgc2V0dGluZ3M/LmxlZ2FsPy5wcml2YWN5VXJsKSB7XG4gICAgICAgICAgICAgICAge3sgdCgnc2lnblVwLmFuZCcpIH19XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgQGlmIChzZXR0aW5ncz8ubGVnYWw/LnByaXZhY3lVcmw7IGFzIHByaXZhY3kpIHtcbiAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImF0bGFzLWxpbmtcIiBbaHJlZl09XCJwcml2YWN5XCIgdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiPnt7IHQoJ3NpZ25VcC5wcml2YWN5JykgfX08L2E+XG4gICAgICAgICAgICAgIH0uXG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICBAZm9yIChlcnJvciBvZiBmaWVsZEVycm9yc0ZvcignY29uc2VudCcpOyB0cmFjayBlcnJvci5jb2RlKSB7XG4gICAgICAgICAgICAgIDxzcGFuIFtjbGFzc109XCJjbHMoJ2Zvcm1GaWVsZEVycm9yJywgJ2F0bGFzLWVycm9yJylcIj57eyBlcnJvclRleHQoZXJyb3IpIH19PC9zcGFuPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIH1cblxuICAgICAgICBAaWYgKGNhcHRjaGEpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXRsYXMtY2FwdGNoYVwiIGRhdGEtYXRsYXMtY2FwdGNoYT1cIlwiIFthdGxhc0NhcHRjaGFTbG90XT1cImNhcHRjaGFcIj48L2Rpdj5cbiAgICAgICAgfVxuXG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBbY2xhc3NdPVwiY2xzKCdmb3JtQnV0dG9uUHJpbWFyeScsICdhdGxhcy1idXR0b24nKVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImJ1c3kgfHwgIWNvbnNlbnRPaygpXCJcbiAgICAgICAgICB0eXBlPVwic3VibWl0XCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IHQoJ3NpZ25VcC5zdWJtaXQnKSB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgQGlmIChzd2l0Y2hhYmxlKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImF0bGFzLWFsdGVybmF0aXZlc1wiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgW2NsYXNzXT1cImNscygnZm9ybUJ1dHRvblNlY29uZGFyeScsICdhdGxhcy1idXR0b24tc2Vjb25kYXJ5JylcIlxuICAgICAgICAgICAgICBbYXR0ci5kYXRhLWF0bGFzLXNpZ24tdXAtbW9kZV09XCJwYXNza2V5ID8gJ3Bhc3N3b3JkJyA6ICdwYXNza2V5J1wiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJidXN5XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInN3aXRjaE1vZGUuZW1pdCgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgdChwYXNza2V5ID8gJ3NpZ25VcC5wYXNzd29yZE9wdGlvbicgOiAnc2lnblVwLnBhc3NrZXlPcHRpb24nKSB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIDwvZm9ybT5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgYCxcbn0pXG5leHBvcnQgY2xhc3MgU2lnblVwRm9ybUNvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXRsYXMgPSBpbmplY3QoQXRsYXNTZXJ2aWNlKTtcblxuICBASW5wdXQoKSBzZXR0aW5nczogSW5zdGFuY2VTZXR0aW5ncyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBidXN5ID0gZmFsc2U7XG4gIEBJbnB1dCgpIGVycm9yczogRmllbGRFcnJvcltdID0gW107XG4gIEBJbnB1dCgpIGNhcHRjaGE6IENhcHRjaGFDb250cm9sbGVyIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBQYXNza2V5LW9ubHkgc2lnbi11cDogbm8gcGFzc3dvcmQgZmllbGQ7IHRoZSBlbWFpbCBwZXIgdGhlIGluc3RhbmNlJ3MgbW9kZS4gKi9cbiAgQElucHV0KCkgcGFzc2tleTogeyBlbWFpbDogJ29mZicgfCAnb3B0aW9uYWwnIHwgJ3JlcXVpcmVkJyB9IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBXaGV0aGVyIHRoZSBwYXNzd29yZCAvIHBhc3NrZXkgdG9nZ2xlIGlzIHNob3duIChib3RoIGFyZSBvZmZlcmVkKS4gKi9cbiAgQElucHV0KCkgc3dpdGNoYWJsZSA9IGZhbHNlO1xuICAvKiogVGhlIHVzZXIgYXNrZWQgZm9yIHRoZSBvdGhlciBzaWduLXVwIG1ldGhvZC4gKi9cbiAgQE91dHB1dCgpIHN3aXRjaE1vZGUgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgLyoqIEVtaXRzIHRoZSB0eXBlZCB2YWx1ZXMgYW5kIHRoZSBjb25zZW50IHRpY2sgd2hlbiB0aGUgZm9ybSBpcyBzdWJtaXR0ZWQuICovXG4gIEBPdXRwdXQoKSBzdWJtaXRTaWduVXAgPSBuZXcgRXZlbnRFbWl0dGVyPFNpZ25VcEZvcm1TdWJtaXQ+KCk7XG5cbiAgcHJvdGVjdGVkIHZhbHVlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBwcm90ZWN0ZWQgYWdyZWVkID0gZmFsc2U7XG5cbiAgcHJvdGVjdGVkIHQoa2V5OiBzdHJpbmcsIHZhcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogc3RyaW5nIHtcbiAgICByZXR1cm4gdHJhbnNsYXRlKHRoaXMuYXRsYXMubG9jYWxpemF0aW9uLCBrZXksIHZhcnMpO1xuICB9XG5cbiAgLyoqIEEgc2VydmVyIGVycm9yIGluIHRoZSBhcHAncyBsYW5ndWFnZSAoYGVycm9yLjxyZWFzb24+YCwgZWxzZSB0aGUgc2VydmVyJ3MgbWVzc2FnZSkuICovXG4gIHByb3RlY3RlZCBlcnJvclRleHQoZXJyb3I6IEZpZWxkRXJyb3IpOiBzdHJpbmcge1xuICAgIC8vIGBlcnJvckxvY2FsaXphdGlvbmAgaXMgcmVhZCBkZWZlbnNpdmVseTogYSBzdGFuZC1pbiBzZXJ2aWNlIG1heSBsYWNrIGl0LlxuICAgIGNvbnN0IGxheWVyID0gKHRoaXMuYXRsYXMgYXMgeyBlcnJvckxvY2FsaXphdGlvbj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfSkuZXJyb3JMb2NhbGl6YXRpb247XG4gICAgcmV0dXJuIGxvY2FsaXplZEVycm9yTWVzc2FnZShlcnJvciwgbGF5ZXIgPz8gdGhpcy5hdGxhcy5sb2NhbGl6YXRpb24sIHRoaXMuYXRsYXMubG9jYWxpemF0aW9uKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbHMoa2V5OiBFbGVtZW50S2V5LCBiYXNlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBjbGFzc0ZvcihrZXksIHRoaXMuYXRsYXMuYXBwZWFyYW5jZSwgYmFzZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0VmFsdWUobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZXMgPSB7IC4uLnRoaXMudmFsdWVzLCBbbmFtZV06IHZhbHVlIH07XG4gIH1cblxuICAvKiogRW1haWwgKyBwYXNzd29yZCBzaWduLXVwIGNhbm5vdCBjb21wbGV0ZTogdGhlIGFwcCBjYW5ub3Qgc2VuZCB0aGUgdmVyaWZpY2F0aW9uIGVtYWlsLiAqL1xuICBwcm90ZWN0ZWQgZW1haWxVbmF2YWlsYWJsZSgpOiBib29sZWFuIHtcbiAgICAvLyBBIHBhc3NrZXkgc2lnbi11cCB0aGF0IGNvbGxlY3RzIG5vIGVtYWlsIChvciBhbiB1bnByb3ZlbiBvbmUpIHNlbmRzIG5vIG1haWwuXG4gICAgaWYgKHRoaXMucGFzc2tleSAmJiB0aGlzLnBhc3NrZXkuZW1haWwgIT09ICdyZXF1aXJlZCcpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5zZXR0aW5ncz8uZW1haWxEZWxpdmVyeT8ucGFzc3dvcmRTaWduVXAgPT09IGZhbHNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNob3dFbWFpbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMucGFzc2tleSB8fCB0aGlzLnBhc3NrZXkuZW1haWwgIT09ICdvZmYnO1xuICB9XG5cbiAgcHJvdGVjdGVkIGVtYWlsUmVxdWlyZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLnBhc3NrZXkgfHwgdGhpcy5wYXNza2V5LmVtYWlsID09PSAncmVxdWlyZWQnO1xuICB9XG5cbiAgcHJvdGVjdGVkIGZpZWxkcygpOiBQdWJsaWNTaWduVXBGaWVsZFtdIHtcbiAgICByZXR1cm4gdGhpcy5zZXR0aW5ncz8uc2lnblVwRmllbGRzID8/IFtdO1xuICB9XG5cbiAgcHJvdGVjdGVkIGxhYmVsKGY6IFB1YmxpY1NpZ25VcEZpZWxkKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZi5yZXF1aXJlZCA/IGYubGFiZWwgOiB0aGlzLnQoJ3NpZ25VcC5vcHRpb25hbEZpZWxkJywgeyBsYWJlbDogZi5sYWJlbCB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpbnB1dFR5cGUoZjogUHVibGljU2lnblVwRmllbGQpOiBzdHJpbmcge1xuICAgIHJldHVybiBbJ2VtYWlsJywgJ3RlbCcsICd1cmwnLCAnbnVtYmVyJywgJ2RhdGUnXS5pbmNsdWRlcyhmLnR5cGUpID8gZi50eXBlIDogJ3RleHQnO1xuICB9XG5cbiAgLyoqIFNhbWUgZW5jb2RpbmcgYXMgUmVhY3QsIHRoZSBlbWJlZCB3aWRnZXQgYW5kIHRoZSBob3N0ZWQgcGFnZTogb25lIHZhbHVlLFxuICAgKiAgb3IgYSBjb21tYS1qb2luZWQgbGlzdCBmb3IgbXVsdGlzZWxlY3QuICovXG4gIHByb3RlY3RlZCBwaWNrZWQoa2V5OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLnZhbHVlc1trZXldO1xuICAgIHJldHVybiB2YWx1ZSA/IHZhbHVlLnNwbGl0KCcsICcpIDogW107XG4gIH1cblxuICBwcm90ZWN0ZWQgdG9nZ2xlKGY6IFB1YmxpY1NpZ25VcEZpZWxkLCBvcHRpb246IHN0cmluZywgb246IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoZi50eXBlID09PSAncmFkaW8nKSB7XG4gICAgICB0aGlzLnNldFZhbHVlKGYua2V5LCBvcHRpb24pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5waWNrZWQoZi5rZXkpO1xuICAgIHRoaXMuc2V0VmFsdWUoZi5rZXksIChvbiA/IFsuLi5jdXJyZW50LCBvcHRpb25dIDogY3VycmVudC5maWx0ZXIoKHApID0+IHAgIT09IG9wdGlvbikpLmpvaW4oJywgJykpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNob3dMZWdhbCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBsZWdhbCA9IHRoaXMuc2V0dGluZ3M/LmxlZ2FsO1xuICAgIHJldHVybiAhIWxlZ2FsICYmICghIWxlZ2FsLnRlcm1zVXJsIHx8ICEhbGVnYWwucHJpdmFjeVVybCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY29uc2VudE9rKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5zZXR0aW5ncz8ubGVnYWw/LnJlcXVpcmVkIHx8IHRoaXMuYWdyZWVkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGZvcm1FcnJvcnMoKTogRmllbGRFcnJvcltdIHtcbiAgICByZXR1cm4gdGhpcy5lcnJvcnMuZmlsdGVyKChlcnJvcikgPT4gIWVycm9yLnBhcmFtKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBmaWVsZEVycm9yc0ZvcihuYW1lOiBzdHJpbmcpOiBGaWVsZEVycm9yW10ge1xuICAgIHJldHVybiB0aGlzLmVycm9ycy5maWx0ZXIoKGVycm9yKSA9PiBlcnJvci5wYXJhbSA9PT0gbmFtZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25TdWJtaXQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBpZiAodGhpcy5lbWFpbFVuYXZhaWxhYmxlKCkgfHwgIXRoaXMuY29uc2VudE9rKCkpIHJldHVybjtcbiAgICB0aGlzLnN1Ym1pdFNpZ25VcC5lbWl0KHtcbiAgICAgIHZhbHVlczogeyAuLi50aGlzLnZhbHVlcyB9LFxuICAgICAgY29uc2VudDogdGhpcy5zZXR0aW5ncz8ubGVnYWw/LnJlcXVpcmVkID8gdGhpcy5hZ3JlZWQgOiB0cnVlLFxuICAgIH0pO1xuICB9XG59XG4iXX0=