@atlasauth/angular 0.2.1 → 0.4.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.
@@ -0,0 +1,432 @@
1
+ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, inject, } from '@angular/core';
2
+ import { AtlasService } from '../atlas.service';
3
+ import { classFor } from '../appearance';
4
+ import { translate } from '../i18n';
5
+ import { AtlasCaptchaSlotDirective } from '../directives/captcha-slot.directive';
6
+ import * as i0 from "@angular/core";
7
+ /**
8
+ * The create-account step of `<atlas-sign-up>`: the instance's configured extra
9
+ * fields, email + password, the legal-consent row and — when the instance
10
+ * requires one on sign-up — the captcha widget. Values live on the component so
11
+ * a refused submit never clears them. When the app cannot send the verification
12
+ * email (`settings.emailDelivery.passwordSignUp === false`) it shows the
13
+ * `signUp.emailUnavailable` notice instead of the form.
14
+ */
15
+ export class SignUpFormComponent {
16
+ atlas = inject(AtlasService);
17
+ settings = null;
18
+ busy = false;
19
+ errors = [];
20
+ captcha = null;
21
+ /** Emits the typed values and the consent tick when the form is submitted. */
22
+ submitSignUp = new EventEmitter();
23
+ values = {};
24
+ agreed = false;
25
+ t(key, vars) {
26
+ return translate(this.atlas.localization, key, vars);
27
+ }
28
+ cls(key, base) {
29
+ return classFor(key, this.atlas.appearance, base);
30
+ }
31
+ setValue(name, value) {
32
+ this.values = { ...this.values, [name]: value };
33
+ }
34
+ /** Email + password sign-up cannot complete: the app cannot send the verification email. */
35
+ emailUnavailable() {
36
+ return this.settings?.emailDelivery?.passwordSignUp === false;
37
+ }
38
+ fields() {
39
+ return this.settings?.signUpFields ?? [];
40
+ }
41
+ label(f) {
42
+ return f.required ? f.label : this.t('signUp.optionalField', { label: f.label });
43
+ }
44
+ inputType(f) {
45
+ return ['email', 'tel', 'url', 'number', 'date'].includes(f.type) ? f.type : 'text';
46
+ }
47
+ /** Same encoding as React, the embed widget and the hosted page: one value,
48
+ * or a comma-joined list for multiselect. */
49
+ picked(key) {
50
+ const value = this.values[key];
51
+ return value ? value.split(', ') : [];
52
+ }
53
+ toggle(f, option, on) {
54
+ if (f.type === 'radio') {
55
+ this.setValue(f.key, option);
56
+ return;
57
+ }
58
+ const current = this.picked(f.key);
59
+ this.setValue(f.key, (on ? [...current, option] : current.filter((p) => p !== option)).join(', '));
60
+ }
61
+ showLegal() {
62
+ const legal = this.settings?.legal;
63
+ return !!legal && (!!legal.termsUrl || !!legal.privacyUrl);
64
+ }
65
+ consentOk() {
66
+ return !this.settings?.legal?.required || this.agreed;
67
+ }
68
+ formErrors() {
69
+ return this.errors.filter((error) => !error.param);
70
+ }
71
+ fieldErrorsFor(name) {
72
+ return this.errors.filter((error) => error.param === name);
73
+ }
74
+ onSubmit(event) {
75
+ event.preventDefault();
76
+ if (this.emailUnavailable() || !this.consentOk())
77
+ return;
78
+ this.submitSignUp.emit({
79
+ values: { ...this.values },
80
+ consent: this.settings?.legal?.required ? this.agreed : true,
81
+ });
82
+ }
83
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SignUpFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
84
+ 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: `
85
+ <div [class]="cls('card', 'atlas-card')">
86
+ <h1 [class]="cls('headerTitle', 'atlas-title')">{{ t('signUp.title') }}</h1>
87
+
88
+ @if (emailUnavailable()) {
89
+ <!-- The app cannot send the verification email, so an email + password
90
+ sign-up could never complete: say so instead of offering the form. -->
91
+ <p [class]="cls('formFieldError', 'atlas-error')" role="alert" data-atlas-email-unavailable="">
92
+ {{ t('signUp.emailUnavailable') }}
93
+ </p>
94
+ } @else {
95
+ @for (error of formErrors(); track error.code) {
96
+ <p [class]="cls('formFieldError', 'atlas-error')" role="alert">{{ error.message }}</p>
97
+ }
98
+
99
+ <form (submit)="onSubmit($event)">
100
+ @for (f of fields(); track f.key) {
101
+ @if (f.type === 'radio' || f.type === 'multiselect') {
102
+ <div [class]="cls('formField', 'atlas-field')">
103
+ <span [class]="cls('formFieldLabel', 'atlas-field-label')">{{ label(f) }}</span>
104
+ <span class="atlas-choices">
105
+ @for (o of f.options; track o) {
106
+ <label class="atlas-choice">
107
+ <input
108
+ [type]="f.type === 'radio' ? 'radio' : 'checkbox'"
109
+ [attr.name]="f.key"
110
+ [value]="o"
111
+ [checked]="picked(f.key).includes(o)"
112
+ (change)="toggle(f, o, $any($event.target).checked)"
113
+ />
114
+ {{ o }}
115
+ </label>
116
+ }
117
+ </span>
118
+ @for (error of fieldErrorsFor(f.key); track error.code) {
119
+ <span [class]="cls('formFieldError', 'atlas-error')">{{ error.message }}</span>
120
+ }
121
+ </div>
122
+ } @else {
123
+ <label [class]="cls('formField', 'atlas-field')">
124
+ <span [class]="cls('formFieldLabel', 'atlas-field-label')">{{ label(f) }}</span>
125
+ @if (f.type === 'checkbox') {
126
+ <input
127
+ type="checkbox"
128
+ [attr.name]="f.key"
129
+ [checked]="values[f.key] === 'true'"
130
+ (change)="setValue(f.key, $any($event.target).checked ? 'true' : '')"
131
+ />
132
+ } @else if (f.type === 'select') {
133
+ <select
134
+ [class]="cls('formFieldInput', 'atlas-input')"
135
+ [attr.name]="f.key"
136
+ [value]="values[f.key] ?? ''"
137
+ [required]="f.required"
138
+ (change)="setValue(f.key, $any($event.target).value)"
139
+ >
140
+ <option value="">{{ f.placeholder ?? t('signUp.selectPlaceholder') }}</option>
141
+ @for (o of f.options; track o) {
142
+ <option [value]="o">{{ o }}</option>
143
+ }
144
+ </select>
145
+ } @else if (f.type === 'textarea') {
146
+ <textarea
147
+ [class]="cls('formFieldInput', 'atlas-input')"
148
+ [attr.name]="f.key"
149
+ rows="3"
150
+ [value]="values[f.key] ?? ''"
151
+ [required]="f.required"
152
+ [attr.placeholder]="f.placeholder"
153
+ (input)="setValue(f.key, $any($event.target).value)"
154
+ ></textarea>
155
+ } @else {
156
+ <input
157
+ [class]="cls('formFieldInput', 'atlas-input')"
158
+ [type]="inputType(f)"
159
+ [attr.name]="f.key"
160
+ [value]="values[f.key] ?? ''"
161
+ [required]="f.required"
162
+ [attr.placeholder]="f.placeholder"
163
+ (input)="setValue(f.key, $any($event.target).value)"
164
+ />
165
+ }
166
+ @for (error of fieldErrorsFor(f.key); track error.code) {
167
+ <span [class]="cls('formFieldError', 'atlas-error')">{{ error.message }}</span>
168
+ }
169
+ </label>
170
+ }
171
+ }
172
+
173
+ <label [class]="cls('formField', 'atlas-field')">
174
+ <span [class]="cls('formFieldLabel', 'atlas-field-label')">{{ t('signUp.emailLabel') }}</span>
175
+ <input
176
+ [class]="cls('formFieldInput', 'atlas-input')"
177
+ type="email"
178
+ name="email"
179
+ autocomplete="email"
180
+ required
181
+ [value]="values['email'] ?? ''"
182
+ (input)="setValue('email', $any($event.target).value)"
183
+ />
184
+ @for (error of fieldErrorsFor('email'); track error.code) {
185
+ <span [class]="cls('formFieldError', 'atlas-error')">{{ error.message }}</span>
186
+ }
187
+ </label>
188
+
189
+ <label [class]="cls('formField', 'atlas-field')">
190
+ <span [class]="cls('formFieldLabel', 'atlas-field-label')">{{ t('signUp.passwordLabel') }}</span>
191
+ <input
192
+ [class]="cls('formFieldInput', 'atlas-input')"
193
+ type="password"
194
+ name="password"
195
+ autocomplete="new-password"
196
+ required
197
+ [value]="values['password'] ?? ''"
198
+ (input)="setValue('password', $any($event.target).value)"
199
+ />
200
+ @for (error of fieldErrorsFor('password'); track error.code) {
201
+ <span [class]="cls('formFieldError', 'atlas-error')">{{ error.message }}</span>
202
+ }
203
+ </label>
204
+
205
+ @if (showLegal()) {
206
+ <label [class]="cls('formField', 'atlas-consent')">
207
+ @if (settings?.legal?.required) {
208
+ <input
209
+ type="checkbox"
210
+ name="consent"
211
+ [checked]="agreed"
212
+ (change)="agreed = $any($event.target).checked"
213
+ />
214
+ }
215
+ <span class="atlas-text">
216
+ {{ t(settings?.legal?.required ? 'signUp.consentAgree' : 'signUp.consentNotice') }}
217
+ @if (settings?.legal?.termsUrl; as terms) {
218
+ <a class="atlas-link" [href]="terms" target="_blank" rel="noopener noreferrer">{{ t('signUp.terms') }}</a>
219
+ }
220
+ @if (settings?.legal?.termsUrl && settings?.legal?.privacyUrl) {
221
+ {{ t('signUp.and') }}
222
+ }
223
+ @if (settings?.legal?.privacyUrl; as privacy) {
224
+ <a class="atlas-link" [href]="privacy" target="_blank" rel="noopener noreferrer">{{ t('signUp.privacy') }}</a>
225
+ }.
226
+ </span>
227
+ @for (error of fieldErrorsFor('consent'); track error.code) {
228
+ <span [class]="cls('formFieldError', 'atlas-error')">{{ error.message }}</span>
229
+ }
230
+ </label>
231
+ }
232
+
233
+ @if (captcha) {
234
+ <div class="atlas-captcha" data-atlas-captcha="" [atlasCaptchaSlot]="captcha"></div>
235
+ }
236
+
237
+ <button
238
+ [class]="cls('formButtonPrimary', 'atlas-button')"
239
+ [disabled]="busy || !consentOk()"
240
+ type="submit"
241
+ >
242
+ {{ t('signUp.submit') }}
243
+ </button>
244
+ </form>
245
+ }
246
+ </div>
247
+ `, isInline: true, dependencies: [{ kind: "directive", type: AtlasCaptchaSlotDirective, selector: "[atlasCaptchaSlot]", inputs: ["atlasCaptchaSlot"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
248
+ }
249
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SignUpFormComponent, decorators: [{
250
+ type: Component,
251
+ args: [{
252
+ selector: 'atlas-sign-up-form',
253
+ standalone: true,
254
+ changeDetection: ChangeDetectionStrategy.OnPush,
255
+ imports: [AtlasCaptchaSlotDirective],
256
+ template: `
257
+ <div [class]="cls('card', 'atlas-card')">
258
+ <h1 [class]="cls('headerTitle', 'atlas-title')">{{ t('signUp.title') }}</h1>
259
+
260
+ @if (emailUnavailable()) {
261
+ <!-- The app cannot send the verification email, so an email + password
262
+ sign-up could never complete: say so instead of offering the form. -->
263
+ <p [class]="cls('formFieldError', 'atlas-error')" role="alert" data-atlas-email-unavailable="">
264
+ {{ t('signUp.emailUnavailable') }}
265
+ </p>
266
+ } @else {
267
+ @for (error of formErrors(); track error.code) {
268
+ <p [class]="cls('formFieldError', 'atlas-error')" role="alert">{{ error.message }}</p>
269
+ }
270
+
271
+ <form (submit)="onSubmit($event)">
272
+ @for (f of fields(); track f.key) {
273
+ @if (f.type === 'radio' || f.type === 'multiselect') {
274
+ <div [class]="cls('formField', 'atlas-field')">
275
+ <span [class]="cls('formFieldLabel', 'atlas-field-label')">{{ label(f) }}</span>
276
+ <span class="atlas-choices">
277
+ @for (o of f.options; track o) {
278
+ <label class="atlas-choice">
279
+ <input
280
+ [type]="f.type === 'radio' ? 'radio' : 'checkbox'"
281
+ [attr.name]="f.key"
282
+ [value]="o"
283
+ [checked]="picked(f.key).includes(o)"
284
+ (change)="toggle(f, o, $any($event.target).checked)"
285
+ />
286
+ {{ o }}
287
+ </label>
288
+ }
289
+ </span>
290
+ @for (error of fieldErrorsFor(f.key); track error.code) {
291
+ <span [class]="cls('formFieldError', 'atlas-error')">{{ error.message }}</span>
292
+ }
293
+ </div>
294
+ } @else {
295
+ <label [class]="cls('formField', 'atlas-field')">
296
+ <span [class]="cls('formFieldLabel', 'atlas-field-label')">{{ label(f) }}</span>
297
+ @if (f.type === 'checkbox') {
298
+ <input
299
+ type="checkbox"
300
+ [attr.name]="f.key"
301
+ [checked]="values[f.key] === 'true'"
302
+ (change)="setValue(f.key, $any($event.target).checked ? 'true' : '')"
303
+ />
304
+ } @else if (f.type === 'select') {
305
+ <select
306
+ [class]="cls('formFieldInput', 'atlas-input')"
307
+ [attr.name]="f.key"
308
+ [value]="values[f.key] ?? ''"
309
+ [required]="f.required"
310
+ (change)="setValue(f.key, $any($event.target).value)"
311
+ >
312
+ <option value="">{{ f.placeholder ?? t('signUp.selectPlaceholder') }}</option>
313
+ @for (o of f.options; track o) {
314
+ <option [value]="o">{{ o }}</option>
315
+ }
316
+ </select>
317
+ } @else if (f.type === 'textarea') {
318
+ <textarea
319
+ [class]="cls('formFieldInput', 'atlas-input')"
320
+ [attr.name]="f.key"
321
+ rows="3"
322
+ [value]="values[f.key] ?? ''"
323
+ [required]="f.required"
324
+ [attr.placeholder]="f.placeholder"
325
+ (input)="setValue(f.key, $any($event.target).value)"
326
+ ></textarea>
327
+ } @else {
328
+ <input
329
+ [class]="cls('formFieldInput', 'atlas-input')"
330
+ [type]="inputType(f)"
331
+ [attr.name]="f.key"
332
+ [value]="values[f.key] ?? ''"
333
+ [required]="f.required"
334
+ [attr.placeholder]="f.placeholder"
335
+ (input)="setValue(f.key, $any($event.target).value)"
336
+ />
337
+ }
338
+ @for (error of fieldErrorsFor(f.key); track error.code) {
339
+ <span [class]="cls('formFieldError', 'atlas-error')">{{ error.message }}</span>
340
+ }
341
+ </label>
342
+ }
343
+ }
344
+
345
+ <label [class]="cls('formField', 'atlas-field')">
346
+ <span [class]="cls('formFieldLabel', 'atlas-field-label')">{{ t('signUp.emailLabel') }}</span>
347
+ <input
348
+ [class]="cls('formFieldInput', 'atlas-input')"
349
+ type="email"
350
+ name="email"
351
+ autocomplete="email"
352
+ required
353
+ [value]="values['email'] ?? ''"
354
+ (input)="setValue('email', $any($event.target).value)"
355
+ />
356
+ @for (error of fieldErrorsFor('email'); track error.code) {
357
+ <span [class]="cls('formFieldError', 'atlas-error')">{{ error.message }}</span>
358
+ }
359
+ </label>
360
+
361
+ <label [class]="cls('formField', 'atlas-field')">
362
+ <span [class]="cls('formFieldLabel', 'atlas-field-label')">{{ t('signUp.passwordLabel') }}</span>
363
+ <input
364
+ [class]="cls('formFieldInput', 'atlas-input')"
365
+ type="password"
366
+ name="password"
367
+ autocomplete="new-password"
368
+ required
369
+ [value]="values['password'] ?? ''"
370
+ (input)="setValue('password', $any($event.target).value)"
371
+ />
372
+ @for (error of fieldErrorsFor('password'); track error.code) {
373
+ <span [class]="cls('formFieldError', 'atlas-error')">{{ error.message }}</span>
374
+ }
375
+ </label>
376
+
377
+ @if (showLegal()) {
378
+ <label [class]="cls('formField', 'atlas-consent')">
379
+ @if (settings?.legal?.required) {
380
+ <input
381
+ type="checkbox"
382
+ name="consent"
383
+ [checked]="agreed"
384
+ (change)="agreed = $any($event.target).checked"
385
+ />
386
+ }
387
+ <span class="atlas-text">
388
+ {{ t(settings?.legal?.required ? 'signUp.consentAgree' : 'signUp.consentNotice') }}
389
+ @if (settings?.legal?.termsUrl; as terms) {
390
+ <a class="atlas-link" [href]="terms" target="_blank" rel="noopener noreferrer">{{ t('signUp.terms') }}</a>
391
+ }
392
+ @if (settings?.legal?.termsUrl && settings?.legal?.privacyUrl) {
393
+ {{ t('signUp.and') }}
394
+ }
395
+ @if (settings?.legal?.privacyUrl; as privacy) {
396
+ <a class="atlas-link" [href]="privacy" target="_blank" rel="noopener noreferrer">{{ t('signUp.privacy') }}</a>
397
+ }.
398
+ </span>
399
+ @for (error of fieldErrorsFor('consent'); track error.code) {
400
+ <span [class]="cls('formFieldError', 'atlas-error')">{{ error.message }}</span>
401
+ }
402
+ </label>
403
+ }
404
+
405
+ @if (captcha) {
406
+ <div class="atlas-captcha" data-atlas-captcha="" [atlasCaptchaSlot]="captcha"></div>
407
+ }
408
+
409
+ <button
410
+ [class]="cls('formButtonPrimary', 'atlas-button')"
411
+ [disabled]="busy || !consentOk()"
412
+ type="submit"
413
+ >
414
+ {{ t('signUp.submit') }}
415
+ </button>
416
+ </form>
417
+ }
418
+ </div>
419
+ `,
420
+ }]
421
+ }], propDecorators: { settings: [{
422
+ type: Input
423
+ }], busy: [{
424
+ type: Input
425
+ }], errors: [{
426
+ type: Input
427
+ }], captcha: [{
428
+ type: Input
429
+ }], submitSignUp: [{
430
+ type: Output
431
+ }] } });
432
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbi11cC1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9zaWduLXVwLWZvcm0uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUNOLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQU92QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFFBQVEsRUFBbUIsTUFBTSxlQUFlLENBQUM7QUFDMUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNwQyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQzs7QUFRakY7Ozs7Ozs7R0FPRztBQTJLSCxNQUFNLE9BQU8sbUJBQW1CO0lBQ2IsS0FBSyxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUVyQyxRQUFRLEdBQTRCLElBQUksQ0FBQztJQUN6QyxJQUFJLEdBQUcsS0FBSyxDQUFDO0lBQ2IsTUFBTSxHQUFpQixFQUFFLENBQUM7SUFDMUIsT0FBTyxHQUE2QixJQUFJLENBQUM7SUFFbEQsOEVBQThFO0lBQ3BFLFlBQVksR0FBRyxJQUFJLFlBQVksRUFBb0IsQ0FBQztJQUVwRCxNQUFNLEdBQTJCLEVBQUUsQ0FBQztJQUNwQyxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBRWYsQ0FBQyxDQUFDLEdBQVcsRUFBRSxJQUE2QjtRQUNwRCxPQUFPLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVTLEdBQUcsQ0FBQyxHQUFlLEVBQUUsSUFBWTtRQUN6QyxPQUFPLFFBQVEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFD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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUtUO2lCQUNGOzhCQUlVLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBR0ksWUFBWTtzQkFBckIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgaW5qZWN0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB0eXBlIHtcbiAgQ2FwdGNoYUNvbnRyb2xsZXIsXG4gIEZpZWxkRXJyb3IsXG4gIEluc3RhbmNlU2V0dGluZ3MsXG4gIFB1YmxpY1NpZ25VcEZpZWxkLFxufSBmcm9tICdAYXRsYXNhdXRoL2pzJztcbmltcG9ydCB7IEF0bGFzU2VydmljZSB9IGZyb20gJy4uL2F0bGFzLnNlcnZpY2UnO1xuaW1wb3J0IHsgY2xhc3NGb3IsIHR5cGUgRWxlbWVudEtleSB9IGZyb20gJy4uL2FwcGVhcmFuY2UnO1xuaW1wb3J0IHsgdHJhbnNsYXRlIH0gZnJvbSAnLi4vaTE4bic7XG5pbXBvcnQgeyBBdGxhc0NhcHRjaGFTbG90RGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9jYXB0Y2hhLXNsb3QuZGlyZWN0aXZlJztcblxuLyoqIFdoYXQgdGhlIGNyZWF0ZS1hY2NvdW50IGZvcm0gZW1pdHM6IHRoZSB2YWx1ZXMgdHlwZWQgcGx1cyB0aGUgY29uc2VudCB0aWNrLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWduVXBGb3JtU3VibWl0IHtcbiAgdmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBjb25zZW50OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRoZSBjcmVhdGUtYWNjb3VudCBzdGVwIG9mIGA8YXRsYXMtc2lnbi11cD5gOiB0aGUgaW5zdGFuY2UncyBjb25maWd1cmVkIGV4dHJhXG4gKiBmaWVsZHMsIGVtYWlsICsgcGFzc3dvcmQsIHRoZSBsZWdhbC1jb25zZW50IHJvdyBhbmQg4oCUIHdoZW4gdGhlIGluc3RhbmNlXG4gKiByZXF1aXJlcyBvbmUgb24gc2lnbi11cCDigJQgdGhlIGNhcHRjaGEgd2lkZ2V0LiBWYWx1ZXMgbGl2ZSBvbiB0aGUgY29tcG9uZW50IHNvXG4gKiBhIHJlZnVzZWQgc3VibWl0IG5ldmVyIGNsZWFycyB0aGVtLiBXaGVuIHRoZSBhcHAgY2Fubm90IHNlbmQgdGhlIHZlcmlmaWNhdGlvblxuICogZW1haWwgKGBzZXR0aW5ncy5lbWFpbERlbGl2ZXJ5LnBhc3N3b3JkU2lnblVwID09PSBmYWxzZWApIGl0IHNob3dzIHRoZVxuICogYHNpZ25VcC5lbWFpbFVuYXZhaWxhYmxlYCBub3RpY2UgaW5zdGVhZCBvZiB0aGUgZm9ybS5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXRsYXMtc2lnbi11cC1mb3JtJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGltcG9ydHM6IFtBdGxhc0NhcHRjaGFTbG90RGlyZWN0aXZlXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IFtjbGFzc109XCJjbHMoJ2NhcmQnLCAnYXRsYXMtY2FyZCcpXCI+XG4gICAgICA8aDEgW2NsYXNzXT1cImNscygnaGVhZGVyVGl0bGUnLCAnYXRsYXMtdGl0bGUnKVwiPnt7IHQoJ3NpZ25VcC50aXRsZScpIH19PC9oMT5cblxuICAgICAgQGlmIChlbWFpbFVuYXZhaWxhYmxlKCkpIHtcbiAgICAgICAgPCEtLSBUaGUgYXBwIGNhbm5vdCBzZW5kIHRoZSB2ZXJpZmljYXRpb24gZW1haWwsIHNvIGFuIGVtYWlsICsgcGFzc3dvcmRcbiAgICAgICAgICAgICBzaWduLXVwIGNvdWxkIG5ldmVyIGNvbXBsZXRlOiBzYXkgc28gaW5zdGVhZCBvZiBvZmZlcmluZyB0aGUgZm9ybS4gLS0+XG4gICAgICAgIDxwIFtjbGFzc109XCJjbHMoJ2Zvcm1GaWVsZEVycm9yJywgJ2F0bGFzLWVycm9yJylcIiByb2xlPVwiYWxlcnRcIiBkYXRhLWF0bGFzLWVtYWlsLXVuYXZhaWxhYmxlPVwiXCI+XG4gICAgICAgICAge3sgdCgnc2lnblVwLmVtYWlsVW5hdmFpbGFibGUnKSB9fVxuICAgICAgICA8L3A+XG4gICAgICB9IEBlbHNlIHtcbiAgICAgIEBmb3IgKGVycm9yIG9mIGZvcm1FcnJvcnMoKTsgdHJhY2sgZXJyb3IuY29kZSkge1xuICAgICAgICA8cCBbY2xhc3NdPVwiY2xzKCdmb3JtRmllbGRFcnJvcicsICdhdGxhcy1lcnJvcicpXCIgcm9sZT1cImFsZXJ0XCI+e3sgZXJyb3IubWVzc2FnZSB9fTwvcD5cbiAgICAgIH1cblxuICAgICAgPGZvcm0gKHN1Ym1pdCk9XCJvblN1Ym1pdCgkZXZlbnQpXCI+XG4gICAgICAgIEBmb3IgKGYgb2YgZmllbGRzKCk7IHRyYWNrIGYua2V5KSB7XG4gICAgICAgICAgQGlmIChmLnR5cGUgPT09ICdyYWRpbycgfHwgZi50eXBlID09PSAnbXVsdGlzZWxlY3QnKSB7XG4gICAgICAgICAgICA8ZGl2IFtjbGFzc109XCJjbHMoJ2Zvcm1GaWVsZCcsICdhdGxhcy1maWVsZCcpXCI+XG4gICAgICAgICAgICAgIDxzcGFuIFtjbGFzc109XCJjbHMoJ2Zvcm1GaWVsZExhYmVsJywgJ2F0bGFzLWZpZWxkLWxhYmVsJylcIj57eyBsYWJlbChmKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhdGxhcy1jaG9pY2VzXCI+XG4gICAgICAgICAgICAgICAgQGZvciAobyBvZiBmLm9wdGlvbnM7IHRyYWNrIG8pIHtcbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImF0bGFzLWNob2ljZVwiPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICBbdHlwZV09XCJmLnR5cGUgPT09ICdyYWRpbycgPyAncmFkaW8nIDogJ2NoZWNrYm94J1wiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIubmFtZV09XCJmLmtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIm9cIlxuICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cInBpY2tlZChmLmtleSkuaW5jbHVkZXMobylcIlxuICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlKGYsIG8sICRhbnkoJGV2ZW50LnRhcmdldCkuY2hlY2tlZClcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICB7eyBvIH19XG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICBAZm9yIChlcnJvciBvZiBmaWVsZEVycm9yc0ZvcihmLmtleSk7IHRyYWNrIGVycm9yLmNvZGUpIHtcbiAgICAgICAgICAgICAgICA8c3BhbiBbY2xhc3NdPVwiY2xzKCdmb3JtRmllbGRFcnJvcicsICdhdGxhcy1lcnJvcicpXCI+e3sgZXJyb3IubWVzc2FnZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICA8bGFiZWwgW2NsYXNzXT1cImNscygnZm9ybUZpZWxkJywgJ2F0bGFzLWZpZWxkJylcIj5cbiAgICAgICAgICAgICAgPHNwYW4gW2NsYXNzXT1cImNscygnZm9ybUZpZWxkTGFiZWwnLCAnYXRsYXMtZmllbGQtbGFiZWwnKVwiPnt7IGxhYmVsKGYpIH19PC9zcGFuPlxuICAgICAgICAgICAgICBAaWYgKGYudHlwZSA9PT0gJ2NoZWNrYm94Jykge1xuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLm5hbWVdPVwiZi5rZXlcIlxuICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwidmFsdWVzW2Yua2V5XSA9PT0gJ3RydWUnXCJcbiAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwic2V0VmFsdWUoZi5rZXksICRhbnkoJGV2ZW50LnRhcmdldCkuY2hlY2tlZCA/ICd0cnVlJyA6ICcnKVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgfSBAZWxzZSBpZiAoZi50eXBlID09PSAnc2VsZWN0Jykge1xuICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJjbHMoJ2Zvcm1GaWVsZElucHV0JywgJ2F0bGFzLWlucHV0JylcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIubmFtZV09XCJmLmtleVwiXG4gICAgICAgICAgICAgICAgICBbdmFsdWVdPVwidmFsdWVzW2Yua2V5XSA/PyAnJ1wiXG4gICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwiZi5yZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNldFZhbHVlKGYua2V5LCAkYW55KCRldmVudC50YXJnZXQpLnZhbHVlKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPnt7IGYucGxhY2Vob2xkZXIgPz8gdCgnc2lnblVwLnNlbGVjdFBsYWNlaG9sZGVyJykgfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgIEBmb3IgKG8gb2YgZi5vcHRpb25zOyB0cmFjayBvKSB7XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cIm9cIj57eyBvIH19PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgIH0gQGVsc2UgaWYgKGYudHlwZSA9PT0gJ3RleHRhcmVhJykge1xuICAgICAgICAgICAgICAgIDx0ZXh0YXJlYVxuICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImNscygnZm9ybUZpZWxkSW5wdXQnLCAnYXRsYXMtaW5wdXQnKVwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5uYW1lXT1cImYua2V5XCJcbiAgICAgICAgICAgICAgICAgIHJvd3M9XCIzXCJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ2YWx1ZXNbZi5rZXldID8/ICcnXCJcbiAgICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJmLnJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLnBsYWNlaG9sZGVyXT1cImYucGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICAgICAgKGlucHV0KT1cInNldFZhbHVlKGYua2V5LCAkYW55KCRldmVudC50YXJnZXQpLnZhbHVlKVwiXG4gICAgICAgICAgICAgICAgPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImNscygnZm9ybUZpZWxkSW5wdXQnLCAnYXRsYXMtaW5wdXQnKVwiXG4gICAgICAgICAgICAgICAgICBbdHlwZV09XCJpbnB1dFR5cGUoZilcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIubmFtZV09XCJmLmtleVwiXG4gICAgICAgICAgICAgICAgICBbdmFsdWVdPVwidmFsdWVzW2Yua2V5XSA/PyAnJ1wiXG4gICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwiZi5yZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5wbGFjZWhvbGRlcl09XCJmLnBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJzZXRWYWx1ZShmLmtleSwgJGFueSgkZXZlbnQudGFyZ2V0KS52YWx1ZSlcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgQGZvciAoZXJyb3Igb2YgZmllbGRFcnJvcnNGb3IoZi5rZXkpOyB0cmFjayBlcnJvci5jb2RlKSB7XG4gICAgICAgICAgICAgICAgPHNwYW4gW2NsYXNzXT1cImNscygnZm9ybUZpZWxkRXJyb3InLCAnYXRsYXMtZXJyb3InKVwiPnt7IGVycm9yLm1lc3NhZ2UgfX08L3NwYW4+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgPGxhYmVsIFtjbGFzc109XCJjbHMoJ2Zvcm1GaWVsZCcsICdhdGxhcy1maWVsZCcpXCI+XG4gICAgICAgICAgPHNwYW4gW2NsYXNzXT1cImNscygnZm9ybUZpZWxkTGFiZWwnLCAnYXRsYXMtZmllbGQtbGFiZWwnKVwiPnt7IHQoJ3NpZ25VcC5lbWFpbExhYmVsJykgfX08L3NwYW4+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBbY2xhc3NdPVwiY2xzKCdmb3JtRmllbGRJbnB1dCcsICdhdGxhcy1pbnB1dCcpXCJcbiAgICAgICAgICAgIHR5cGU9XCJlbWFpbFwiXG4gICAgICAgICAgICBuYW1lPVwiZW1haWxcIlxuICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwiZW1haWxcIlxuICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgIFt2YWx1ZV09XCJ2YWx1ZXNbJ2VtYWlsJ10gPz8gJydcIlxuICAgICAgICAgICAgKGlucHV0KT1cInNldFZhbHVlKCdlbWFpbCcsICRhbnkoJGV2ZW50LnRhcmdldCkudmFsdWUpXCJcbiAgICAgICAgICAvPlxuICAgICAgICAgIEBmb3IgKGVycm9yIG9mIGZpZWxkRXJyb3JzRm9yKCdlbWFpbCcpOyB0cmFjayBlcnJvci5jb2RlKSB7XG4gICAgICAgICAgICA8c3BhbiBbY2xhc3NdPVwiY2xzKCdmb3JtRmllbGRFcnJvcicsICdhdGxhcy1lcnJvcicpXCI+e3sgZXJyb3IubWVzc2FnZSB9fTwvc3Bhbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvbGFiZWw+XG5cbiAgICAgICAgPGxhYmVsIFtjbGFzc109XCJjbHMoJ2Zvcm1GaWVsZCcsICdhdGxhcy1maWVsZCcpXCI+XG4gICAgICAgICAgPHNwYW4gW2NsYXNzXT1cImNscygnZm9ybUZpZWxkTGFiZWwnLCAnYXRsYXMtZmllbGQtbGFiZWwnKVwiPnt7IHQoJ3NpZ25VcC5wYXNzd29yZExhYmVsJykgfX08L3NwYW4+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBbY2xhc3NdPVwiY2xzKCdmb3JtRmllbGRJbnB1dCcsICdhdGxhcy1pbnB1dCcpXCJcbiAgICAgICAgICAgIHR5cGU9XCJwYXNzd29yZFwiXG4gICAgICAgICAgICBuYW1lPVwicGFzc3dvcmRcIlxuICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwibmV3LXBhc3N3b3JkXCJcbiAgICAgICAgICAgIHJlcXVpcmVkXG4gICAgICAgICAgICBbdmFsdWVdPVwidmFsdWVzWydwYXNzd29yZCddID8/ICcnXCJcbiAgICAgICAgICAgIChpbnB1dCk9XCJzZXRWYWx1ZSgncGFzc3dvcmQnLCAkYW55KCRldmVudC50YXJnZXQpLnZhbHVlKVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICBAZm9yIChlcnJvciBvZiBmaWVsZEVycm9yc0ZvcigncGFzc3dvcmQnKTsgdHJhY2sgZXJyb3IuY29kZSkge1xuICAgICAgICAgICAgPHNwYW4gW2NsYXNzXT1cImNscygnZm9ybUZpZWxkRXJyb3InLCAnYXRsYXMtZXJyb3InKVwiPnt7IGVycm9yLm1lc3NhZ2UgfX08L3NwYW4+XG4gICAgICAgICAgfVxuICAgICAgICA8L2xhYmVsPlxuXG4gICAgICAgIEBpZiAoc2hvd0xlZ2FsKCkpIHtcbiAgICAgICAgICA8bGFiZWwgW2NsYXNzXT1cImNscygnZm9ybUZpZWxkJywgJ2F0bGFzLWNvbnNlbnQnKVwiPlxuICAgICAgICAgICAgQGlmIChzZXR0aW5ncz8ubGVnYWw/LnJlcXVpcmVkKSB7XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgbmFtZT1cImNvbnNlbnRcIlxuICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImFncmVlZFwiXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJhZ3JlZWQgPSAkYW55KCRldmVudC50YXJnZXQpLmNoZWNrZWRcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhdGxhcy10ZXh0XCI+XG4gICAgICAgICAgICAgIHt7IHQoc2V0dGluZ3M/LmxlZ2FsPy5yZXF1aXJlZCA/ICdzaWduVXAuY29uc2VudEFncmVlJyA6ICdzaWduVXAuY29uc2VudE5vdGljZScpIH19XG4gICAgICAgICAgICAgIEBpZiAoc2V0dGluZ3M/LmxlZ2FsPy50ZXJtc1VybDsgYXMgdGVybXMpIHtcbiAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImF0bGFzLWxpbmtcIiBbaHJlZl09XCJ0ZXJtc1wiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIj57eyB0KCdzaWduVXAudGVybXMnKSB9fTwvYT5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBAaWYgKHNldHRpbmdzPy5sZWdhbD8udGVybXNVcmwgJiYgc2V0dGluZ3M/LmxlZ2FsPy5wcml2YWN5VXJsKSB7XG4gICAgICAgICAgICAgICAge3sgdCgnc2lnblVwLmFuZCcpIH19XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgQGlmIChzZXR0aW5ncz8ubGVnYWw/LnByaXZhY3lVcmw7IGFzIHByaXZhY3kpIHtcbiAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImF0bGFzLWxpbmtcIiBbaHJlZl09XCJwcml2YWN5XCIgdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiPnt7IHQoJ3NpZ25VcC5wcml2YWN5JykgfX08L2E+XG4gICAgICAgICAgICAgIH0uXG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICBAZm9yIChlcnJvciBvZiBmaWVsZEVycm9yc0ZvcignY29uc2VudCcpOyB0cmFjayBlcnJvci5jb2RlKSB7XG4gICAgICAgICAgICAgIDxzcGFuIFtjbGFzc109XCJjbHMoJ2Zvcm1GaWVsZEVycm9yJywgJ2F0bGFzLWVycm9yJylcIj57eyBlcnJvci5tZXNzYWdlIH19PC9zcGFuPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIH1cblxuICAgICAgICBAaWYgKGNhcHRjaGEpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXRsYXMtY2FwdGNoYVwiIGRhdGEtYXRsYXMtY2FwdGNoYT1cIlwiIFthdGxhc0NhcHRjaGFTbG90XT1cImNhcHRjaGFcIj48L2Rpdj5cbiAgICAgICAgfVxuXG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBbY2xhc3NdPVwiY2xzKCdmb3JtQnV0dG9uUHJpbWFyeScsICdhdGxhcy1idXR0b24nKVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImJ1c3kgfHwgIWNvbnNlbnRPaygpXCJcbiAgICAgICAgICB0eXBlPVwic3VibWl0XCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IHQoJ3NpZ25VcC5zdWJtaXQnKSB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZm9ybT5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgYCxcbn0pXG5leHBvcnQgY2xhc3MgU2lnblVwRm9ybUNvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXRsYXMgPSBpbmplY3QoQXRsYXNTZXJ2aWNlKTtcblxuICBASW5wdXQoKSBzZXR0aW5nczogSW5zdGFuY2VTZXR0aW5ncyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBidXN5ID0gZmFsc2U7XG4gIEBJbnB1dCgpIGVycm9yczogRmllbGRFcnJvcltdID0gW107XG4gIEBJbnB1dCgpIGNhcHRjaGE6IENhcHRjaGFDb250cm9sbGVyIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIEVtaXRzIHRoZSB0eXBlZCB2YWx1ZXMgYW5kIHRoZSBjb25zZW50IHRpY2sgd2hlbiB0aGUgZm9ybSBpcyBzdWJtaXR0ZWQuICovXG4gIEBPdXRwdXQoKSBzdWJtaXRTaWduVXAgPSBuZXcgRXZlbnRFbWl0dGVyPFNpZ25VcEZvcm1TdWJtaXQ+KCk7XG5cbiAgcHJvdGVjdGVkIHZhbHVlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBwcm90ZWN0ZWQgYWdyZWVkID0gZmFsc2U7XG5cbiAgcHJvdGVjdGVkIHQoa2V5OiBzdHJpbmcsIHZhcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogc3RyaW5nIHtcbiAgICByZXR1cm4gdHJhbnNsYXRlKHRoaXMuYXRsYXMubG9jYWxpemF0aW9uLCBrZXksIHZhcnMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNscyhrZXk6IEVsZW1lbnRLZXksIGJhc2U6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNsYXNzRm9yKGtleSwgdGhpcy5hdGxhcy5hcHBlYXJhbmNlLCBiYXNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRWYWx1ZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlcyA9IHsgLi4udGhpcy52YWx1ZXMsIFtuYW1lXTogdmFsdWUgfTtcbiAgfVxuXG4gIC8qKiBFbWFpbCArIHBhc3N3b3JkIHNpZ24tdXAgY2Fubm90IGNvbXBsZXRlOiB0aGUgYXBwIGNhbm5vdCBzZW5kIHRoZSB2ZXJpZmljYXRpb24gZW1haWwuICovXG4gIHByb3RlY3RlZCBlbWFpbFVuYXZhaWxhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNldHRpbmdzPy5lbWFpbERlbGl2ZXJ5Py5wYXNzd29yZFNpZ25VcCA9PT0gZmFsc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgZmllbGRzKCk6IFB1YmxpY1NpZ25VcEZpZWxkW10ge1xuICAgIHJldHVybiB0aGlzLnNldHRpbmdzPy5zaWduVXBGaWVsZHMgPz8gW107XG4gIH1cblxuICBwcm90ZWN0ZWQgbGFiZWwoZjogUHVibGljU2lnblVwRmllbGQpOiBzdHJpbmcge1xuICAgIHJldHVybiBmLnJlcXVpcmVkID8gZi5sYWJlbCA6IHRoaXMudCgnc2lnblVwLm9wdGlvbmFsRmllbGQnLCB7IGxhYmVsOiBmLmxhYmVsIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGlucHV0VHlwZShmOiBQdWJsaWNTaWduVXBGaWVsZCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFsnZW1haWwnLCAndGVsJywgJ3VybCcsICdudW1iZXInLCAnZGF0ZSddLmluY2x1ZGVzKGYudHlwZSkgPyBmLnR5cGUgOiAndGV4dCc7XG4gIH1cblxuICAvKiogU2FtZSBlbmNvZGluZyBhcyBSZWFjdCwgdGhlIGVtYmVkIHdpZGdldCBhbmQgdGhlIGhvc3RlZCBwYWdlOiBvbmUgdmFsdWUsXG4gICAqICBvciBhIGNvbW1hLWpvaW5lZCBsaXN0IGZvciBtdWx0aXNlbGVjdC4gKi9cbiAgcHJvdGVjdGVkIHBpY2tlZChrZXk6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMudmFsdWVzW2tleV07XG4gICAgcmV0dXJuIHZhbHVlID8gdmFsdWUuc3BsaXQoJywgJykgOiBbXTtcbiAgfVxuXG4gIHByb3RlY3RlZCB0b2dnbGUoZjogUHVibGljU2lnblVwRmllbGQsIG9wdGlvbjogc3RyaW5nLCBvbjogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChmLnR5cGUgPT09ICdyYWRpbycpIHtcbiAgICAgIHRoaXMuc2V0VmFsdWUoZi5rZXksIG9wdGlvbik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnBpY2tlZChmLmtleSk7XG4gICAgdGhpcy5zZXRWYWx1ZShmLmtleSwgKG9uID8gWy4uLmN1cnJlbnQsIG9wdGlvbl0gOiBjdXJyZW50LmZpbHRlcigocCkgPT4gcCAhPT0gb3B0aW9uKSkuam9pbignLCAnKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2hvd0xlZ2FsKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGxlZ2FsID0gdGhpcy5zZXR0aW5ncz8ubGVnYWw7XG4gICAgcmV0dXJuICEhbGVnYWwgJiYgKCEhbGVnYWwudGVybXNVcmwgfHwgISFsZWdhbC5wcml2YWN5VXJsKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb25zZW50T2soKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLnNldHRpbmdzPy5sZWdhbD8ucmVxdWlyZWQgfHwgdGhpcy5hZ3JlZWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgZm9ybUVycm9ycygpOiBGaWVsZEVycm9yW10ge1xuICAgIHJldHVybiB0aGlzLmVycm9ycy5maWx0ZXIoKGVycm9yKSA9PiAhZXJyb3IucGFyYW0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGZpZWxkRXJyb3JzRm9yKG5hbWU6IHN0cmluZyk6IEZpZWxkRXJyb3JbXSB7XG4gICAgcmV0dXJuIHRoaXMuZXJyb3JzLmZpbHRlcigoZXJyb3IpID0+IGVycm9yLnBhcmFtID09PSBuYW1lKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblN1Ym1pdChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGlmICh0aGlzLmVtYWlsVW5hdmFpbGFibGUoKSB8fCAhdGhpcy5jb25zZW50T2soKSkgcmV0dXJuO1xuICAgIHRoaXMuc3VibWl0U2lnblVwLmVtaXQoe1xuICAgICAgdmFsdWVzOiB7IC4uLnRoaXMudmFsdWVzIH0sXG4gICAgICBjb25zZW50OiB0aGlzLnNldHRpbmdzPy5sZWdhbD8ucmVxdWlyZWQgPyB0aGlzLmFncmVlZCA6IHRydWUsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -1,12 +1,17 @@
1
1
  import { ChangeDetectionStrategy, Component, Input, inject, } from '@angular/core';
2
2
  import { AtlasService } from '../atlas.service';
3
+ import { translate } from '../i18n';
3
4
  import { AttemptFlowComponent } from './attempt-flow.component';
5
+ import { SignUpFormComponent } from './sign-up-form.component';
4
6
  import { AtlasFlowController } from './flow-controller';
5
7
  import * as i0 from "@angular/core";
6
8
  /**
7
- * `<atlas-sign-up>` — the full, server-driven sign-up flow. The Angular peer of
8
- * React's `<SignUp/>`. It shares the exact flow engine with `<atlas-sign-in>`;
9
- * only the title differs, because the sequence of steps is decided by the server.
9
+ * `<atlas-sign-up>` — creates an account. The Angular peer of React's
10
+ * `<SignUp/>`. The first step is the create-account form (the instance's
11
+ * configured fields, email, password, legal consent and — when required — the
12
+ * captcha), which POSTs `/v1/client/sign_ups`; from there it shares the flow
13
+ * engine with `<atlas-sign-in>` (the emailed-code step, then the ticket
14
+ * exchange), because the sequence of steps is decided by the server.
10
15
  *
11
16
  * ```html
12
17
  * <atlas-sign-up *atlasSignedOut></atlas-sign-up>
@@ -16,20 +21,35 @@ export class SignUpComponent {
16
21
  atlas = inject(AtlasService);
17
22
  /** Where to send the user once the flow completes. Reserved for host routing. */
18
23
  afterUrl;
19
- flow = new AtlasFlowController(this.atlas.createFapiClient(), () => this.atlas.reload(), this.atlas.pendingAttempt);
24
+ flow = new AtlasFlowController(this.atlas.createFapiClient(), () => this.atlas.reload(), this.atlas.pendingAttempt, (key) => translate(this.atlas.localization, key));
25
+ ngOnInit() {
26
+ // §5 the instance's sign-up fields, consent policy and captcha settings.
27
+ if (typeof window !== 'undefined')
28
+ void this.flow.loadSettings();
29
+ }
20
30
  ngOnDestroy() {
21
31
  this.flow.destroy();
22
32
  }
23
33
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SignUpComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
24
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SignUpComponent, isStandalone: true, selector: "atlas-sign-up", inputs: { afterUrl: "afterUrl" }, ngImport: i0, template: `
25
- <atlas-attempt-flow
26
- [attempt]="flow.state().attempt"
27
- [busy]="flow.state().busy"
28
- [errors]="flow.state().errors"
29
- titleKey="signUp.title"
30
- (submitFlow)="flow.submit($event)"
31
- ></atlas-attempt-flow>
32
- `, isInline: true, dependencies: [{ kind: "component", type: AttemptFlowComponent, selector: "atlas-attempt-flow", inputs: ["attempt", "busy", "errors", "titleKey"], outputs: ["submitFlow"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
34
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: SignUpComponent, isStandalone: true, selector: "atlas-sign-up", inputs: { afterUrl: "afterUrl" }, ngImport: i0, template: `
35
+ @if (flow.state().attempt) {
36
+ <atlas-attempt-flow
37
+ [attempt]="flow.state().attempt"
38
+ [busy]="flow.state().busy"
39
+ [errors]="flow.state().errors"
40
+ titleKey="signUp.title"
41
+ (submitFlow)="flow.submit($event)"
42
+ ></atlas-attempt-flow>
43
+ } @else {
44
+ <atlas-sign-up-form
45
+ [settings]="flow.settings()"
46
+ [busy]="flow.state().busy"
47
+ [errors]="flow.state().errors"
48
+ [captcha]="flow.signUpCaptchaDrawn() ? flow.signUpCaptcha : null"
49
+ (submitSignUp)="flow.create($event.values, $event.consent)"
50
+ ></atlas-sign-up-form>
51
+ }
52
+ `, isInline: true, dependencies: [{ kind: "component", type: AttemptFlowComponent, selector: "atlas-attempt-flow", inputs: ["attempt", "busy", "errors", "titleKey", "captcha", "firstFactors", "preparedFactor"], outputs: ["submitFlow", "chooseFactor"] }, { kind: "component", type: SignUpFormComponent, selector: "atlas-sign-up-form", inputs: ["settings", "busy", "errors", "captcha"], outputs: ["submitSignUp"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
33
53
  }
34
54
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SignUpComponent, decorators: [{
35
55
  type: Component,
@@ -37,18 +57,28 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
37
57
  selector: 'atlas-sign-up',
38
58
  standalone: true,
39
59
  changeDetection: ChangeDetectionStrategy.OnPush,
40
- imports: [AttemptFlowComponent],
60
+ imports: [AttemptFlowComponent, SignUpFormComponent],
41
61
  template: `
42
- <atlas-attempt-flow
43
- [attempt]="flow.state().attempt"
44
- [busy]="flow.state().busy"
45
- [errors]="flow.state().errors"
46
- titleKey="signUp.title"
47
- (submitFlow)="flow.submit($event)"
48
- ></atlas-attempt-flow>
62
+ @if (flow.state().attempt) {
63
+ <atlas-attempt-flow
64
+ [attempt]="flow.state().attempt"
65
+ [busy]="flow.state().busy"
66
+ [errors]="flow.state().errors"
67
+ titleKey="signUp.title"
68
+ (submitFlow)="flow.submit($event)"
69
+ ></atlas-attempt-flow>
70
+ } @else {
71
+ <atlas-sign-up-form
72
+ [settings]="flow.settings()"
73
+ [busy]="flow.state().busy"
74
+ [errors]="flow.state().errors"
75
+ [captcha]="flow.signUpCaptchaDrawn() ? flow.signUpCaptcha : null"
76
+ (submitSignUp)="flow.create($event.values, $event.consent)"
77
+ ></atlas-sign-up-form>
78
+ }
49
79
  `,
50
80
  }]
51
81
  }], propDecorators: { afterUrl: [{
52
82
  type: Input
53
83
  }] } });
54
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbi11cC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvc2lnbi11cC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsS0FBSyxFQUVMLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDaEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7O0FBRXhEOzs7Ozs7OztHQVFHO0FBZ0JILE1BQU0sT0FBTyxlQUFlO0lBQ1QsS0FBSyxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUU5QyxpRkFBaUY7SUFDeEUsUUFBUSxDQUFVO0lBRVIsSUFBSSxHQUFHLElBQUksbUJBQW1CLENBQy9DLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsRUFDN0IsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsRUFDekIsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQzFCLENBQUM7SUFFRixXQUFXO1FBQ1QsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUN0QixDQUFDO3dHQWRVLGVBQWU7NEZBQWYsZUFBZSwyR0FWaEI7Ozs7Ozs7O0dBUVQsNERBVFMsb0JBQW9COzs0RkFXbkIsZUFBZTtrQkFmM0IsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsZUFBZTtvQkFDekIsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO29CQUMvQyxPQUFPLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQztvQkFDL0IsUUFBUSxFQUFFOzs7Ozs7OztHQVFUO2lCQUNGOzhCQUtVLFFBQVE7c0JBQWhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBpbmplY3QsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQXRsYXNTZXJ2aWNlIH0gZnJvbSAnLi4vYXRsYXMuc2VydmljZSc7XG5pbXBvcnQgeyBBdHRlbXB0Rmxvd0NvbXBvbmVudCB9IGZyb20gJy4vYXR0ZW1wdC1mbG93LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBdGxhc0Zsb3dDb250cm9sbGVyIH0gZnJvbSAnLi9mbG93LWNvbnRyb2xsZXInO1xuXG4vKipcbiAqIGA8YXRsYXMtc2lnbi11cD5gIOKAlCB0aGUgZnVsbCwgc2VydmVyLWRyaXZlbiBzaWduLXVwIGZsb3cuIFRoZSBBbmd1bGFyIHBlZXIgb2ZcbiAqIFJlYWN0J3MgYDxTaWduVXAvPmAuIEl0IHNoYXJlcyB0aGUgZXhhY3QgZmxvdyBlbmdpbmUgd2l0aCBgPGF0bGFzLXNpZ24taW4+YDtcbiAqIG9ubHkgdGhlIHRpdGxlIGRpZmZlcnMsIGJlY2F1c2UgdGhlIHNlcXVlbmNlIG9mIHN0ZXBzIGlzIGRlY2lkZWQgYnkgdGhlIHNlcnZlci5cbiAqXG4gKiBgYGBodG1sXG4gKiA8YXRsYXMtc2lnbi11cCAqYXRsYXNTaWduZWRPdXQ+PC9hdGxhcy1zaWduLXVwPlxuICogYGBgXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2F0bGFzLXNpZ24tdXAnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW1wb3J0czogW0F0dGVtcHRGbG93Q29tcG9uZW50XSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8YXRsYXMtYXR0ZW1wdC1mbG93XG4gICAgICBbYXR0ZW1wdF09XCJmbG93LnN0YXRlKCkuYXR0ZW1wdFwiXG4gICAgICBbYnVzeV09XCJmbG93LnN0YXRlKCkuYnVzeVwiXG4gICAgICBbZXJyb3JzXT1cImZsb3cuc3RhdGUoKS5lcnJvcnNcIlxuICAgICAgdGl0bGVLZXk9XCJzaWduVXAudGl0bGVcIlxuICAgICAgKHN1Ym1pdEZsb3cpPVwiZmxvdy5zdWJtaXQoJGV2ZW50KVwiXG4gICAgPjwvYXRsYXMtYXR0ZW1wdC1mbG93PlxuICBgLFxufSlcbmV4cG9ydCBjbGFzcyBTaWduVXBDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBwcml2YXRlIHJlYWRvbmx5IGF0bGFzID0gaW5qZWN0KEF0bGFzU2VydmljZSk7XG5cbiAgLyoqIFdoZXJlIHRvIHNlbmQgdGhlIHVzZXIgb25jZSB0aGUgZmxvdyBjb21wbGV0ZXMuIFJlc2VydmVkIGZvciBob3N0IHJvdXRpbmcuICovXG4gIEBJbnB1dCgpIGFmdGVyVXJsPzogc3RyaW5nO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBmbG93ID0gbmV3IEF0bGFzRmxvd0NvbnRyb2xsZXIoXG4gICAgdGhpcy5hdGxhcy5jcmVhdGVGYXBpQ2xpZW50KCksXG4gICAgKCkgPT4gdGhpcy5hdGxhcy5yZWxvYWQoKSxcbiAgICB0aGlzLmF0bGFzLnBlbmRpbmdBdHRlbXB0LFxuICApO1xuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZmxvdy5kZXN0cm95KCk7XG4gIH1cbn1cbiJdfQ==
84
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbi11cC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvc2lnbi11cC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsS0FBSyxFQUdMLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNwQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7QUFFeEQ7Ozs7Ozs7Ozs7O0dBV0c7QUEwQkgsTUFBTSxPQUFPLGVBQWU7SUFDVCxLQUFLLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBRTlDLGlGQUFpRjtJQUN4RSxRQUFRLENBQVU7SUFFUixJQUFJLEdBQUcsSUFBSSxtQkFBbUIsQ0FDL0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxFQUM3QixHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUN6QixJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFDekIsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsQ0FDakQsQ0FBQztJQUVGLFFBQVE7UUFDTix5RUFBeUU7UUFDekUsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXO1lBQUUsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ25FLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUN0QixDQUFDO3dHQXBCVSxlQUFlOzRGQUFmLGVBQWUsMkdBcEJoQjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JULDREQW5CUyxvQkFBb0Isd01BQUUsbUJBQW1COzs0RkFxQnhDLGVBQWU7a0JBekIzQixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxlQUFlO29CQUN6QixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07b0JBQy9DLE9BQU8sRUFBRSxDQUFDLG9CQUFvQixFQUFFLG1CQUFtQixDQUFDO29CQUNwRCxRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCVDtpQkFDRjs4QkFLVSxRQUFRO3NCQUFoQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBpbmplY3QsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQXRsYXNTZXJ2aWNlIH0gZnJvbSAnLi4vYXRsYXMuc2VydmljZSc7XG5pbXBvcnQgeyB0cmFuc2xhdGUgfSBmcm9tICcuLi9pMThuJztcbmltcG9ydCB7IEF0dGVtcHRGbG93Q29tcG9uZW50IH0gZnJvbSAnLi9hdHRlbXB0LWZsb3cuY29tcG9uZW50JztcbmltcG9ydCB7IFNpZ25VcEZvcm1Db21wb25lbnQgfSBmcm9tICcuL3NpZ24tdXAtZm9ybS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQXRsYXNGbG93Q29udHJvbGxlciB9IGZyb20gJy4vZmxvdy1jb250cm9sbGVyJztcblxuLyoqXG4gKiBgPGF0bGFzLXNpZ24tdXA+YCDigJQgY3JlYXRlcyBhbiBhY2NvdW50LiBUaGUgQW5ndWxhciBwZWVyIG9mIFJlYWN0J3NcbiAqIGA8U2lnblVwLz5gLiBUaGUgZmlyc3Qgc3RlcCBpcyB0aGUgY3JlYXRlLWFjY291bnQgZm9ybSAodGhlIGluc3RhbmNlJ3NcbiAqIGNvbmZpZ3VyZWQgZmllbGRzLCBlbWFpbCwgcGFzc3dvcmQsIGxlZ2FsIGNvbnNlbnQgYW5kIOKAlCB3aGVuIHJlcXVpcmVkIOKAlCB0aGVcbiAqIGNhcHRjaGEpLCB3aGljaCBQT1NUcyBgL3YxL2NsaWVudC9zaWduX3Vwc2A7IGZyb20gdGhlcmUgaXQgc2hhcmVzIHRoZSBmbG93XG4gKiBlbmdpbmUgd2l0aCBgPGF0bGFzLXNpZ24taW4+YCAodGhlIGVtYWlsZWQtY29kZSBzdGVwLCB0aGVuIHRoZSB0aWNrZXRcbiAqIGV4Y2hhbmdlKSwgYmVjYXVzZSB0aGUgc2VxdWVuY2Ugb2Ygc3RlcHMgaXMgZGVjaWRlZCBieSB0aGUgc2VydmVyLlxuICpcbiAqIGBgYGh0bWxcbiAqIDxhdGxhcy1zaWduLXVwICphdGxhc1NpZ25lZE91dD48L2F0bGFzLXNpZ24tdXA+XG4gKiBgYGBcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXRsYXMtc2lnbi11cCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBpbXBvcnRzOiBbQXR0ZW1wdEZsb3dDb21wb25lbnQsIFNpZ25VcEZvcm1Db21wb25lbnRdLFxuICB0ZW1wbGF0ZTogYFxuICAgIEBpZiAoZmxvdy5zdGF0ZSgpLmF0dGVtcHQpIHtcbiAgICAgIDxhdGxhcy1hdHRlbXB0LWZsb3dcbiAgICAgICAgW2F0dGVtcHRdPVwiZmxvdy5zdGF0ZSgpLmF0dGVtcHRcIlxuICAgICAgICBbYnVzeV09XCJmbG93LnN0YXRlKCkuYnVzeVwiXG4gICAgICAgIFtlcnJvcnNdPVwiZmxvdy5zdGF0ZSgpLmVycm9yc1wiXG4gICAgICAgIHRpdGxlS2V5PVwic2lnblVwLnRpdGxlXCJcbiAgICAgICAgKHN1Ym1pdEZsb3cpPVwiZmxvdy5zdWJtaXQoJGV2ZW50KVwiXG4gICAgICA+PC9hdGxhcy1hdHRlbXB0LWZsb3c+XG4gICAgfSBAZWxzZSB7XG4gICAgICA8YXRsYXMtc2lnbi11cC1mb3JtXG4gICAgICAgIFtzZXR0aW5nc109XCJmbG93LnNldHRpbmdzKClcIlxuICAgICAgICBbYnVzeV09XCJmbG93LnN0YXRlKCkuYnVzeVwiXG4gICAgICAgIFtlcnJvcnNdPVwiZmxvdy5zdGF0ZSgpLmVycm9yc1wiXG4gICAgICAgIFtjYXB0Y2hhXT1cImZsb3cuc2lnblVwQ2FwdGNoYURyYXduKCkgPyBmbG93LnNpZ25VcENhcHRjaGEgOiBudWxsXCJcbiAgICAgICAgKHN1Ym1pdFNpZ25VcCk9XCJmbG93LmNyZWF0ZSgkZXZlbnQudmFsdWVzLCAkZXZlbnQuY29uc2VudClcIlxuICAgICAgPjwvYXRsYXMtc2lnbi11cC1mb3JtPlxuICAgIH1cbiAgYCxcbn0pXG5leHBvcnQgY2xhc3MgU2lnblVwQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIHJlYWRvbmx5IGF0bGFzID0gaW5qZWN0KEF0bGFzU2VydmljZSk7XG5cbiAgLyoqIFdoZXJlIHRvIHNlbmQgdGhlIHVzZXIgb25jZSB0aGUgZmxvdyBjb21wbGV0ZXMuIFJlc2VydmVkIGZvciBob3N0IHJvdXRpbmcuICovXG4gIEBJbnB1dCgpIGFmdGVyVXJsPzogc3RyaW5nO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBmbG93ID0gbmV3IEF0bGFzRmxvd0NvbnRyb2xsZXIoXG4gICAgdGhpcy5hdGxhcy5jcmVhdGVGYXBpQ2xpZW50KCksXG4gICAgKCkgPT4gdGhpcy5hdGxhcy5yZWxvYWQoKSxcbiAgICB0aGlzLmF0bGFzLnBlbmRpbmdBdHRlbXB0LFxuICAgIChrZXkpID0+IHRyYW5zbGF0ZSh0aGlzLmF0bGFzLmxvY2FsaXphdGlvbiwga2V5KSxcbiAgKTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyDCpzUgdGhlIGluc3RhbmNlJ3Mgc2lnbi11cCBmaWVsZHMsIGNvbnNlbnQgcG9saWN5IGFuZCBjYXB0Y2hhIHNldHRpbmdzLlxuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykgdm9pZCB0aGlzLmZsb3cubG9hZFNldHRpbmdzKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmZsb3cuZGVzdHJveSgpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,42 @@
1
+ import { Directive, ElementRef, Input, inject } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * `[atlasCaptchaSlot]="controller"` — the element a flow's captcha widget draws
5
+ * into (see `createCaptchaController` in `@atlasauth/js`). Attaches the
6
+ * controller to the host element while it is rendered and detaches it (removing
7
+ * the widget) when it goes away.
8
+ */
9
+ export class AtlasCaptchaSlotDirective {
10
+ host = inject(ElementRef);
11
+ current = null;
12
+ initialized = false;
13
+ set controller(next) {
14
+ if (next === this.current)
15
+ return;
16
+ if (this.initialized)
17
+ this.current?.attach(null);
18
+ this.current = next;
19
+ if (this.initialized)
20
+ this.current?.attach(this.host.nativeElement);
21
+ }
22
+ ngOnInit() {
23
+ this.initialized = true;
24
+ this.current?.attach(this.host.nativeElement);
25
+ }
26
+ ngOnDestroy() {
27
+ this.current?.attach(null);
28
+ }
29
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AtlasCaptchaSlotDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
30
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: AtlasCaptchaSlotDirective, isStandalone: true, selector: "[atlasCaptchaSlot]", inputs: { controller: ["atlasCaptchaSlot", "controller"] }, ngImport: i0 });
31
+ }
32
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AtlasCaptchaSlotDirective, decorators: [{
33
+ type: Directive,
34
+ args: [{
35
+ selector: '[atlasCaptchaSlot]',
36
+ standalone: true,
37
+ }]
38
+ }], propDecorators: { controller: [{
39
+ type: Input,
40
+ args: ['atlasCaptchaSlot']
41
+ }] } });
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FwdGNoYS1zbG90LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvZGlyZWN0aXZlcy9jYXB0Y2hhLXNsb3QuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUd4Rjs7Ozs7R0FLRztBQUtILE1BQU0sT0FBTyx5QkFBeUI7SUFDbkIsSUFBSSxHQUFHLE1BQU0sQ0FBMEIsVUFBVSxDQUFDLENBQUM7SUFDNUQsT0FBTyxHQUE2QixJQUFJLENBQUM7SUFDekMsV0FBVyxHQUFHLEtBQUssQ0FBQztJQUU1QixJQUErQixVQUFVLENBQUMsSUFBOEI7UUFDdEUsSUFBSSxJQUFJLEtBQUssSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPO1FBQ2xDLElBQUksSUFBSSxDQUFDLFdBQVc7WUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUNwQixJQUFJLElBQUksQ0FBQyxXQUFXO1lBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3QixDQUFDO3dHQW5CVSx5QkFBeUI7NEZBQXpCLHlCQUF5Qjs7NEZBQXpCLHlCQUF5QjtrQkFKckMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsb0JBQW9CO29CQUM5QixVQUFVLEVBQUUsSUFBSTtpQkFDakI7OEJBTWdDLFVBQVU7c0JBQXhDLEtBQUs7dUJBQUMsa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHR5cGUgeyBDYXB0Y2hhQ29udHJvbGxlciB9IGZyb20gJ0BhdGxhc2F1dGgvanMnO1xuXG4vKipcbiAqIGBbYXRsYXNDYXB0Y2hhU2xvdF09XCJjb250cm9sbGVyXCJgIOKAlCB0aGUgZWxlbWVudCBhIGZsb3cncyBjYXB0Y2hhIHdpZGdldCBkcmF3c1xuICogaW50byAoc2VlIGBjcmVhdGVDYXB0Y2hhQ29udHJvbGxlcmAgaW4gYEBhdGxhc2F1dGgvanNgKS4gQXR0YWNoZXMgdGhlXG4gKiBjb250cm9sbGVyIHRvIHRoZSBob3N0IGVsZW1lbnQgd2hpbGUgaXQgaXMgcmVuZGVyZWQgYW5kIGRldGFjaGVzIGl0IChyZW1vdmluZ1xuICogdGhlIHdpZGdldCkgd2hlbiBpdCBnb2VzIGF3YXkuXG4gKi9cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1thdGxhc0NhcHRjaGFTbG90XScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG59KVxuZXhwb3J0IGNsYXNzIEF0bGFzQ2FwdGNoYVNsb3REaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgaG9zdCA9IGluamVjdDxFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj4oRWxlbWVudFJlZik7XG4gIHByaXZhdGUgY3VycmVudDogQ2FwdGNoYUNvbnRyb2xsZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBpbml0aWFsaXplZCA9IGZhbHNlO1xuXG4gIEBJbnB1dCgnYXRsYXNDYXB0Y2hhU2xvdCcpIHNldCBjb250cm9sbGVyKG5leHQ6IENhcHRjaGFDb250cm9sbGVyIHwgbnVsbCkge1xuICAgIGlmIChuZXh0ID09PSB0aGlzLmN1cnJlbnQpIHJldHVybjtcbiAgICBpZiAodGhpcy5pbml0aWFsaXplZCkgdGhpcy5jdXJyZW50Py5hdHRhY2gobnVsbCk7XG4gICAgdGhpcy5jdXJyZW50ID0gbmV4dDtcbiAgICBpZiAodGhpcy5pbml0aWFsaXplZCkgdGhpcy5jdXJyZW50Py5hdHRhY2godGhpcy5ob3N0Lm5hdGl2ZUVsZW1lbnQpO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG4gICAgdGhpcy5jdXJyZW50Py5hdHRhY2godGhpcy5ob3N0Lm5hdGl2ZUVsZW1lbnQpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50Py5hdHRhY2gobnVsbCk7XG4gIH1cbn1cbiJdfQ==