@portaidentity/cli 1.7.3 → 1.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.
- package/CHANGELOG.md +18 -0
- package/README.md +125 -105
- package/dist/admin/admin-date-time.d.ts +6 -0
- package/dist/admin/admin-date-time.d.ts.map +1 -0
- package/dist/admin/admin-date-time.js +33 -0
- package/dist/admin/admin-date-time.js.map +1 -0
- package/dist/admin/application-client-features.d.ts +38 -0
- package/dist/admin/application-client-features.d.ts.map +1 -0
- package/dist/admin/application-client-features.js +545 -0
- package/dist/admin/application-client-features.js.map +1 -0
- package/dist/admin/application-controller.d.ts +58 -0
- package/dist/admin/application-controller.d.ts.map +1 -0
- package/dist/admin/application-controller.js +286 -0
- package/dist/admin/application-controller.js.map +1 -0
- package/dist/admin/application-dialogs.d.ts +91 -0
- package/dist/admin/application-dialogs.d.ts.map +1 -0
- package/dist/admin/application-dialogs.js +250 -0
- package/dist/admin/application-dialogs.js.map +1 -0
- package/dist/admin/application-rbac-controller.d.ts +56 -0
- package/dist/admin/application-rbac-controller.d.ts.map +1 -0
- package/dist/admin/application-rbac-controller.js +280 -0
- package/dist/admin/application-rbac-controller.js.map +1 -0
- package/dist/admin/application-rbac-features.d.ts +51 -0
- package/dist/admin/application-rbac-features.d.ts.map +1 -0
- package/dist/admin/application-rbac-features.js +175 -0
- package/dist/admin/application-rbac-features.js.map +1 -0
- package/dist/admin/application-rbac-workspace.d.ts +62 -0
- package/dist/admin/application-rbac-workspace.d.ts.map +1 -0
- package/dist/admin/application-rbac-workspace.js +344 -0
- package/dist/admin/application-rbac-workspace.js.map +1 -0
- package/dist/admin/application-runtime.d.ts +44 -0
- package/dist/admin/application-runtime.d.ts.map +1 -0
- package/dist/admin/application-runtime.js +183 -0
- package/dist/admin/application-runtime.js.map +1 -0
- package/dist/admin/application-service.d.ts +39 -0
- package/dist/admin/application-service.d.ts.map +1 -0
- package/dist/admin/application-service.js +248 -0
- package/dist/admin/application-service.js.map +1 -0
- package/dist/admin/application-state.d.ts +109 -0
- package/dist/admin/application-state.d.ts.map +1 -0
- package/dist/admin/application-state.js +3 -0
- package/dist/admin/application-state.js.map +1 -0
- package/dist/admin/application-workspace.d.ts +77 -0
- package/dist/admin/application-workspace.d.ts.map +1 -0
- package/dist/admin/application-workspace.js +302 -0
- package/dist/admin/application-workspace.js.map +1 -0
- package/dist/admin/application.d.ts +88 -0
- package/dist/admin/application.d.ts.map +1 -0
- package/dist/admin/application.js +932 -0
- package/dist/admin/application.js.map +1 -0
- package/dist/admin/client-authentication-dialog.d.ts +77 -0
- package/dist/admin/client-authentication-dialog.d.ts.map +1 -0
- package/dist/admin/client-authentication-dialog.js +217 -0
- package/dist/admin/client-authentication-dialog.js.map +1 -0
- package/dist/admin/client-controller.d.ts +58 -0
- package/dist/admin/client-controller.d.ts.map +1 -0
- package/dist/admin/client-controller.js +462 -0
- package/dist/admin/client-controller.js.map +1 -0
- package/dist/admin/client-credential-dialogs.d.ts +36 -0
- package/dist/admin/client-credential-dialogs.d.ts.map +1 -0
- package/dist/admin/client-credential-dialogs.js +145 -0
- package/dist/admin/client-credential-dialogs.js.map +1 -0
- package/dist/admin/client-dialogs.d.ts +64 -0
- package/dist/admin/client-dialogs.d.ts.map +1 -0
- package/dist/admin/client-dialogs.js +110 -0
- package/dist/admin/client-dialogs.js.map +1 -0
- package/dist/admin/client-form-scroller.d.ts +17 -0
- package/dist/admin/client-form-scroller.d.ts.map +1 -0
- package/dist/admin/client-form-scroller.js +67 -0
- package/dist/admin/client-form-scroller.js.map +1 -0
- package/dist/admin/client-registration-dialog.d.ts +27 -0
- package/dist/admin/client-registration-dialog.d.ts.map +1 -0
- package/dist/admin/client-registration-dialog.js +195 -0
- package/dist/admin/client-registration-dialog.js.map +1 -0
- package/dist/admin/client-service.d.ts +41 -0
- package/dist/admin/client-service.d.ts.map +1 -0
- package/dist/admin/client-service.js +486 -0
- package/dist/admin/client-service.js.map +1 -0
- package/dist/admin/client-state.d.ts +159 -0
- package/dist/admin/client-state.d.ts.map +1 -0
- package/dist/admin/client-state.js +3 -0
- package/dist/admin/client-state.js.map +1 -0
- package/dist/admin/client-workspace.d.ts +88 -0
- package/dist/admin/client-workspace.d.ts.map +1 -0
- package/dist/admin/client-workspace.js +491 -0
- package/dist/admin/client-workspace.js.map +1 -0
- package/dist/admin/delete-confirmation-layout.d.ts +38 -0
- package/dist/admin/delete-confirmation-layout.d.ts.map +1 -0
- package/dist/admin/delete-confirmation-layout.js +52 -0
- package/dist/admin/delete-confirmation-layout.js.map +1 -0
- package/dist/admin/index.d.ts +64 -0
- package/dist/admin/index.d.ts.map +1 -0
- package/dist/admin/index.js +31 -0
- package/dist/admin/index.js.map +1 -0
- package/dist/admin/organization-controller.d.ts +77 -0
- package/dist/admin/organization-controller.d.ts.map +1 -0
- package/dist/admin/organization-controller.js +472 -0
- package/dist/admin/organization-controller.js.map +1 -0
- package/dist/admin/organization-dialogs.d.ts +63 -0
- package/dist/admin/organization-dialogs.d.ts.map +1 -0
- package/dist/admin/organization-dialogs.js +303 -0
- package/dist/admin/organization-dialogs.js.map +1 -0
- package/dist/admin/organization-service.d.ts +110 -0
- package/dist/admin/organization-service.d.ts.map +1 -0
- package/dist/admin/organization-service.js +548 -0
- package/dist/admin/organization-service.js.map +1 -0
- package/dist/admin/organization-workspace.d.ts +29 -0
- package/dist/admin/organization-workspace.d.ts.map +1 -0
- package/dist/admin/organization-workspace.js +421 -0
- package/dist/admin/organization-workspace.js.map +1 -0
- package/dist/admin/portability-controller.d.ts +83 -0
- package/dist/admin/portability-controller.d.ts.map +1 -0
- package/dist/admin/portability-controller.js +466 -0
- package/dist/admin/portability-controller.js.map +1 -0
- package/dist/admin/portability-service.d.ts +31 -0
- package/dist/admin/portability-service.d.ts.map +1 -0
- package/dist/admin/portability-service.js +51 -0
- package/dist/admin/portability-service.js.map +1 -0
- package/dist/admin/portability-state.d.ts +88 -0
- package/dist/admin/portability-state.d.ts.map +1 -0
- package/dist/admin/portability-state.js +3 -0
- package/dist/admin/portability-state.js.map +1 -0
- package/dist/admin/portability-workspace.d.ts +78 -0
- package/dist/admin/portability-workspace.d.ts.map +1 -0
- package/dist/admin/portability-workspace.js +337 -0
- package/dist/admin/portability-workspace.js.map +1 -0
- package/dist/admin/presentation.d.ts +46 -0
- package/dist/admin/presentation.d.ts.map +1 -0
- package/dist/admin/presentation.js +271 -0
- package/dist/admin/presentation.js.map +1 -0
- package/dist/admin/rbac-dialogs.d.ts +73 -0
- package/dist/admin/rbac-dialogs.d.ts.map +1 -0
- package/dist/admin/rbac-dialogs.js +345 -0
- package/dist/admin/rbac-dialogs.js.map +1 -0
- package/dist/admin/rbac-service.d.ts +47 -0
- package/dist/admin/rbac-service.d.ts.map +1 -0
- package/dist/admin/rbac-service.js +258 -0
- package/dist/admin/rbac-service.js.map +1 -0
- package/dist/admin/rbac-state.d.ts +129 -0
- package/dist/admin/rbac-state.d.ts.map +1 -0
- package/dist/admin/rbac-state.js +136 -0
- package/dist/admin/rbac-state.js.map +1 -0
- package/dist/admin/selectable-read-only-input.d.ts +18 -0
- package/dist/admin/selectable-read-only-input.d.ts.map +1 -0
- package/dist/admin/selectable-read-only-input.js +24 -0
- package/dist/admin/selectable-read-only-input.js.map +1 -0
- package/dist/admin/session-service.d.ts +169 -0
- package/dist/admin/session-service.d.ts.map +1 -0
- package/dist/admin/session-service.js +353 -0
- package/dist/admin/session-service.js.map +1 -0
- package/dist/admin/state.d.ts +301 -0
- package/dist/admin/state.d.ts.map +1 -0
- package/dist/admin/state.js +10 -0
- package/dist/admin/state.js.map +1 -0
- package/dist/admin/system-config-controller.d.ts +58 -0
- package/dist/admin/system-config-controller.d.ts.map +1 -0
- package/dist/admin/system-config-controller.js +218 -0
- package/dist/admin/system-config-controller.js.map +1 -0
- package/dist/admin/system-config-service.d.ts +54 -0
- package/dist/admin/system-config-service.d.ts.map +1 -0
- package/dist/admin/system-config-service.js +180 -0
- package/dist/admin/system-config-service.js.map +1 -0
- package/dist/admin/system-config-state.d.ts +77 -0
- package/dist/admin/system-config-state.d.ts.map +1 -0
- package/dist/admin/system-config-state.js +78 -0
- package/dist/admin/system-config-state.js.map +1 -0
- package/dist/admin/system-config-workspace.d.ts +47 -0
- package/dist/admin/system-config-workspace.d.ts.map +1 -0
- package/dist/admin/system-config-workspace.js +217 -0
- package/dist/admin/system-config-workspace.js.map +1 -0
- package/dist/admin/user-controller-types.d.ts +67 -0
- package/dist/admin/user-controller-types.d.ts.map +1 -0
- package/dist/admin/user-controller-types.js +3 -0
- package/dist/admin/user-controller-types.js.map +1 -0
- package/dist/admin/user-controller.d.ts +6 -0
- package/dist/admin/user-controller.d.ts.map +1 -0
- package/dist/admin/user-controller.js +674 -0
- package/dist/admin/user-controller.js.map +1 -0
- package/dist/admin/user-dialog-fields.d.ts +44 -0
- package/dist/admin/user-dialog-fields.d.ts.map +1 -0
- package/dist/admin/user-dialog-fields.js +130 -0
- package/dist/admin/user-dialog-fields.js.map +1 -0
- package/dist/admin/user-dialogs.d.ts +66 -0
- package/dist/admin/user-dialogs.d.ts.map +1 -0
- package/dist/admin/user-dialogs.js +374 -0
- package/dist/admin/user-dialogs.js.map +1 -0
- package/dist/admin/user-role-controller.d.ts +82 -0
- package/dist/admin/user-role-controller.d.ts.map +1 -0
- package/dist/admin/user-role-controller.js +337 -0
- package/dist/admin/user-role-controller.js.map +1 -0
- package/dist/admin/user-role-dialog.d.ts +94 -0
- package/dist/admin/user-role-dialog.d.ts.map +1 -0
- package/dist/admin/user-role-dialog.js +265 -0
- package/dist/admin/user-role-dialog.js.map +1 -0
- package/dist/admin/user-service-types.d.ts +100 -0
- package/dist/admin/user-service-types.d.ts.map +1 -0
- package/dist/admin/user-service-types.js +3 -0
- package/dist/admin/user-service-types.js.map +1 -0
- package/dist/admin/user-service.d.ts +14 -0
- package/dist/admin/user-service.d.ts.map +1 -0
- package/dist/admin/user-service.js +612 -0
- package/dist/admin/user-service.js.map +1 -0
- package/dist/admin/user-state.d.ts +158 -0
- package/dist/admin/user-state.d.ts.map +1 -0
- package/dist/admin/user-state.js +3 -0
- package/dist/admin/user-state.js.map +1 -0
- package/dist/admin/user-workspace.d.ts +65 -0
- package/dist/admin/user-workspace.d.ts.map +1 -0
- package/dist/admin/user-workspace.js +366 -0
- package/dist/admin/user-workspace.js.map +1 -0
- package/dist/auth/browser-flow.d.ts +27 -1
- package/dist/auth/browser-flow.d.ts.map +1 -1
- package/dist/auth/browser-flow.js +55 -33
- package/dist/auth/browser-flow.js.map +1 -1
- package/dist/auth/callback-server.d.ts.map +1 -1
- package/dist/auth/callback-server.js +5 -9
- package/dist/auth/callback-server.js.map +1 -1
- package/dist/auth/id-token-verifier.d.ts +39 -0
- package/dist/auth/id-token-verifier.d.ts.map +1 -0
- package/dist/auth/id-token-verifier.js +104 -0
- package/dist/auth/id-token-verifier.js.map +1 -0
- package/dist/auth/login-coordinator.d.ts +72 -0
- package/dist/auth/login-coordinator.d.ts.map +1 -0
- package/dist/auth/login-coordinator.js +190 -0
- package/dist/auth/login-coordinator.js.map +1 -0
- package/dist/auth/metadata.d.ts +2 -1
- package/dist/auth/metadata.d.ts.map +1 -1
- package/dist/auth/metadata.js +67 -6
- package/dist/auth/metadata.js.map +1 -1
- package/dist/auth/types.d.ts +14 -0
- package/dist/auth/types.d.ts.map +1 -1
- package/dist/client-factory.d.ts.map +1 -1
- package/dist/client-factory.js +15 -2
- package/dist/client-factory.js.map +1 -1
- package/dist/commands/admin.d.ts +22 -0
- package/dist/commands/admin.d.ts.map +1 -0
- package/dist/commands/admin.js +112 -0
- package/dist/commands/admin.js.map +1 -0
- package/dist/commands/app-claim.d.ts.map +1 -1
- package/dist/commands/app-claim.js +11 -4
- package/dist/commands/app-claim.js.map +1 -1
- package/dist/commands/app-module.d.ts.map +1 -1
- package/dist/commands/app-module.js +61 -12
- package/dist/commands/app-module.js.map +1 -1
- package/dist/commands/app-permission.d.ts.map +1 -1
- package/dist/commands/app-permission.js +66 -24
- package/dist/commands/app-permission.js.map +1 -1
- package/dist/commands/app-role.d.ts.map +1 -1
- package/dist/commands/app-role.js +48 -27
- package/dist/commands/app-role.js.map +1 -1
- package/dist/commands/app.d.ts.map +1 -1
- package/dist/commands/app.js +37 -25
- package/dist/commands/app.js.map +1 -1
- package/dist/commands/bulk.d.ts.map +1 -1
- package/dist/commands/bulk.js +9 -2
- package/dist/commands/bulk.js.map +1 -1
- package/dist/commands/client-secret.d.ts.map +1 -1
- package/dist/commands/client-secret.js +12 -6
- package/dist/commands/client-secret.js.map +1 -1
- package/dist/commands/client.d.ts +3 -2
- package/dist/commands/client.d.ts.map +1 -1
- package/dist/commands/client.js +102 -43
- package/dist/commands/client.js.map +1 -1
- package/dist/commands/config.d.ts +4 -0
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +68 -7
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/export.d.ts +6 -0
- package/dist/commands/export.d.ts.map +1 -0
- package/dist/commands/export.js +182 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/import.d.ts +6 -0
- package/dist/commands/import.d.ts.map +1 -0
- package/dist/commands/import.js +142 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/keys.d.ts.map +1 -1
- package/dist/commands/keys.js +11 -4
- package/dist/commands/keys.js.map +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +24 -10
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/org.d.ts +2 -4
- package/dist/commands/org.d.ts.map +1 -1
- package/dist/commands/org.js +16 -76
- package/dist/commands/org.js.map +1 -1
- package/dist/commands/user-role.d.ts.map +1 -1
- package/dist/commands/user-role.js +19 -14
- package/dist/commands/user-role.js.map +1 -1
- package/dist/commands/user.d.ts +3 -2
- package/dist/commands/user.d.ts.map +1 -1
- package/dist/commands/user.js +47 -71
- package/dist/commands/user.js.map +1 -1
- package/dist/commands/version.d.ts +1 -1
- package/dist/commands/version.js +1 -1
- package/dist/credential-lock.d.ts +20 -0
- package/dist/credential-lock.d.ts.map +1 -0
- package/dist/credential-lock.js +130 -0
- package/dist/credential-lock.js.map +1 -0
- package/dist/credential-store.d.ts +14 -0
- package/dist/credential-store.d.ts.map +1 -1
- package/dist/credential-store.js +114 -3
- package/dist/credential-store.js.map +1 -1
- package/dist/error-handler.d.ts.map +1 -1
- package/dist/error-handler.js +2 -0
- package/dist/error-handler.js.map +1 -1
- package/dist/global-options.d.ts +8 -0
- package/dist/global-options.d.ts.map +1 -1
- package/dist/global-options.js +19 -8
- package/dist/global-options.js.map +1 -1
- package/dist/index.js +7 -5
- package/dist/index.js.map +1 -1
- package/dist/output.d.ts +11 -0
- package/dist/output.d.ts.map +1 -1
- package/dist/output.js +25 -6
- package/dist/output.js.map +1 -1
- package/dist/prompt.d.ts +2 -2
- package/dist/prompt.d.ts.map +1 -1
- package/dist/prompt.js +27 -7
- package/dist/prompt.js.map +1 -1
- package/package.json +7 -3
- package/dist/commands/gui.d.ts +0 -21
- package/dist/commands/gui.d.ts.map +0 -1
- package/dist/commands/gui.js +0 -67
- package/dist/commands/gui.js.map +0 -1
- package/dist/commands/provision.d.ts +0 -47
- package/dist/commands/provision.d.ts.map +0 -1
- package/dist/commands/provision.js +0 -444
- package/dist/commands/provision.js.map +0 -1
|
@@ -0,0 +1,462 @@
|
|
|
1
|
+
/** Operation, context, and plaintext ownership for selected-organization clients. */
|
|
2
|
+
/** Creates the feature-specific selected-organization client controller. */
|
|
3
|
+
export function createAdminClientController(options) {
|
|
4
|
+
let sessionEpoch = -1;
|
|
5
|
+
let organizationId;
|
|
6
|
+
let generation = 0;
|
|
7
|
+
let operation;
|
|
8
|
+
let mutationDispatched = false;
|
|
9
|
+
let projection;
|
|
10
|
+
let recoveryRequired = false;
|
|
11
|
+
let disposed = false;
|
|
12
|
+
/** Publishes only while this controller still belongs to the application. */
|
|
13
|
+
const publish = (state) => {
|
|
14
|
+
if (!disposed)
|
|
15
|
+
options.publishState(state);
|
|
16
|
+
};
|
|
17
|
+
/** Keeps the earlier list-only retained-state shape compatible with existing callers. */
|
|
18
|
+
const previous = () => projection?.kind === 'list' ? projection.clients : projection;
|
|
19
|
+
/** Publishes the fixed reconciliation state without retaining plaintext. */
|
|
20
|
+
const requireReconciliation = (owner) => {
|
|
21
|
+
recoveryRequired = true;
|
|
22
|
+
options.setRecoveryRequired?.(true);
|
|
23
|
+
const retained = previous();
|
|
24
|
+
publish({
|
|
25
|
+
kind: 'indeterminate',
|
|
26
|
+
organizationId: owner,
|
|
27
|
+
...(retained ? { previous: retained } : {}),
|
|
28
|
+
});
|
|
29
|
+
};
|
|
30
|
+
/** Clears ownership and records uncertainty only after a mutation was dispatched. */
|
|
31
|
+
const cancel = (reconcileDispatchedMutation = false) => {
|
|
32
|
+
const uncertainOwner = reconcileDispatchedMutation && mutationDispatched ? organizationId : undefined;
|
|
33
|
+
generation += 1;
|
|
34
|
+
operation?.abort();
|
|
35
|
+
operation = undefined;
|
|
36
|
+
mutationDispatched = false;
|
|
37
|
+
if (uncertainOwner)
|
|
38
|
+
requireReconciliation(uncertainOwner);
|
|
39
|
+
};
|
|
40
|
+
/** Returns true only for the current organization/session continuation. */
|
|
41
|
+
const owns = (capturedGeneration, capturedOrganization, controller) => !disposed &&
|
|
42
|
+
generation === capturedGeneration &&
|
|
43
|
+
organizationId === capturedOrganization &&
|
|
44
|
+
operation === controller &&
|
|
45
|
+
!controller.signal.aborted;
|
|
46
|
+
/** Clears state and enters authentication after a definite session failure. */
|
|
47
|
+
const sessionInvalid = () => {
|
|
48
|
+
cancel();
|
|
49
|
+
projection = undefined;
|
|
50
|
+
recoveryRequired = false;
|
|
51
|
+
options.setRecoveryRequired?.(false);
|
|
52
|
+
publish({ kind: 'closed' });
|
|
53
|
+
options.requestAuthentication();
|
|
54
|
+
};
|
|
55
|
+
/** Publishes one fixed safe failure while preserving validated content. */
|
|
56
|
+
const publishFailure = (owner, result) => {
|
|
57
|
+
const retained = previous();
|
|
58
|
+
publish({
|
|
59
|
+
kind: 'failure',
|
|
60
|
+
organizationId: owner,
|
|
61
|
+
failure: result.failure,
|
|
62
|
+
...(retained ? { previous: retained } : {}),
|
|
63
|
+
});
|
|
64
|
+
};
|
|
65
|
+
/** Loads the complete catalog for the current selected organization. */
|
|
66
|
+
const load = async () => {
|
|
67
|
+
if (disposed || operation || !organizationId)
|
|
68
|
+
return;
|
|
69
|
+
const current = options.readState();
|
|
70
|
+
const operations = options.readOperations();
|
|
71
|
+
if (current.kind !== 'authenticated' ||
|
|
72
|
+
current.organization?.id !== organizationId ||
|
|
73
|
+
!current.capabilities.canReadClients ||
|
|
74
|
+
!operations?.listAll)
|
|
75
|
+
return;
|
|
76
|
+
const owner = organizationId;
|
|
77
|
+
const controller = new AbortController();
|
|
78
|
+
operation = controller;
|
|
79
|
+
const capturedGeneration = ++generation;
|
|
80
|
+
const retained = previous();
|
|
81
|
+
publish({
|
|
82
|
+
kind: 'loading',
|
|
83
|
+
organizationId: owner,
|
|
84
|
+
...(retained ? { previous: retained } : {}),
|
|
85
|
+
});
|
|
86
|
+
try {
|
|
87
|
+
const result = await operations.listAll(owner);
|
|
88
|
+
if (!owns(capturedGeneration, owner, controller) || !result)
|
|
89
|
+
return;
|
|
90
|
+
if (result.kind === 'session-invalid') {
|
|
91
|
+
sessionInvalid();
|
|
92
|
+
}
|
|
93
|
+
else if (result.kind === 'success') {
|
|
94
|
+
projection = { kind: 'list', organizationId: owner, clients: result.value };
|
|
95
|
+
recoveryRequired = false;
|
|
96
|
+
options.setRecoveryRequired?.(false);
|
|
97
|
+
publish(projection);
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
publish({
|
|
101
|
+
kind: 'failure',
|
|
102
|
+
organizationId: owner,
|
|
103
|
+
failure: result.failure,
|
|
104
|
+
...(retained ? { previous: retained } : {}),
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
finally {
|
|
109
|
+
if (operation === controller)
|
|
110
|
+
operation = undefined;
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
/** Loads one client while preserving its complete parent catalog. */
|
|
114
|
+
const select = async (clientId) => {
|
|
115
|
+
if (disposed || operation || !organizationId)
|
|
116
|
+
return;
|
|
117
|
+
const current = options.readState();
|
|
118
|
+
const operations = options.readOperations();
|
|
119
|
+
if (current.kind !== 'authenticated' ||
|
|
120
|
+
current.organization?.id !== organizationId ||
|
|
121
|
+
!current.capabilities.canReadClients ||
|
|
122
|
+
!operations?.get)
|
|
123
|
+
return;
|
|
124
|
+
const owner = organizationId;
|
|
125
|
+
const controller = new AbortController();
|
|
126
|
+
operation = controller;
|
|
127
|
+
const capturedGeneration = ++generation;
|
|
128
|
+
const retained = previous();
|
|
129
|
+
publish({
|
|
130
|
+
kind: 'loading',
|
|
131
|
+
organizationId: owner,
|
|
132
|
+
...(retained ? { previous: retained } : {}),
|
|
133
|
+
});
|
|
134
|
+
try {
|
|
135
|
+
const result = await operations.get(owner, clientId);
|
|
136
|
+
if (!owns(capturedGeneration, owner, controller) || !result)
|
|
137
|
+
return;
|
|
138
|
+
if (result.kind === 'session-invalid') {
|
|
139
|
+
sessionInvalid();
|
|
140
|
+
}
|
|
141
|
+
else if (result.kind === 'failure') {
|
|
142
|
+
publish({
|
|
143
|
+
kind: 'failure',
|
|
144
|
+
organizationId: owner,
|
|
145
|
+
failure: result.failure,
|
|
146
|
+
...(retained ? { previous: retained } : {}),
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
projection = {
|
|
151
|
+
kind: 'detail',
|
|
152
|
+
organizationId: owner,
|
|
153
|
+
clients: projection?.clients ?? [result.value.client],
|
|
154
|
+
client: result.value.client,
|
|
155
|
+
applicationName: current.capabilities.canReadApplications
|
|
156
|
+
? options.resolveApplicationName?.(result.value.client.applicationId)
|
|
157
|
+
: undefined,
|
|
158
|
+
etag: result.value.etag,
|
|
159
|
+
secrets: [],
|
|
160
|
+
};
|
|
161
|
+
recoveryRequired = false;
|
|
162
|
+
options.setRecoveryRequired?.(false);
|
|
163
|
+
publish(projection);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
finally {
|
|
167
|
+
if (operation === controller)
|
|
168
|
+
operation = undefined;
|
|
169
|
+
}
|
|
170
|
+
};
|
|
171
|
+
/** Loads metadata only for the currently selected confidential client. */
|
|
172
|
+
const loadSecrets = async (clientId) => {
|
|
173
|
+
if (disposed ||
|
|
174
|
+
operation ||
|
|
175
|
+
!organizationId ||
|
|
176
|
+
!projection ||
|
|
177
|
+
projection.kind === 'list' ||
|
|
178
|
+
projection.client.id !== clientId ||
|
|
179
|
+
projection.client.clientType !== 'confidential')
|
|
180
|
+
return;
|
|
181
|
+
const current = options.readState();
|
|
182
|
+
const operations = options.readOperations();
|
|
183
|
+
if (current.kind !== 'authenticated' ||
|
|
184
|
+
current.organization?.id !== organizationId ||
|
|
185
|
+
!current.capabilities.canReadClients ||
|
|
186
|
+
!operations?.listSecrets)
|
|
187
|
+
return;
|
|
188
|
+
const owner = organizationId;
|
|
189
|
+
const retained = projection;
|
|
190
|
+
const controller = new AbortController();
|
|
191
|
+
operation = controller;
|
|
192
|
+
const capturedGeneration = ++generation;
|
|
193
|
+
publish({ kind: 'loading', organizationId: owner, previous: retained });
|
|
194
|
+
try {
|
|
195
|
+
const result = await operations.listSecrets(owner, clientId);
|
|
196
|
+
if (!owns(capturedGeneration, owner, controller) || !result)
|
|
197
|
+
return;
|
|
198
|
+
if (result.kind === 'session-invalid') {
|
|
199
|
+
sessionInvalid();
|
|
200
|
+
}
|
|
201
|
+
else if (result.kind === 'failure') {
|
|
202
|
+
publish({
|
|
203
|
+
kind: 'failure',
|
|
204
|
+
organizationId: owner,
|
|
205
|
+
failure: result.failure,
|
|
206
|
+
previous: retained,
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
projection = {
|
|
211
|
+
kind: 'secrets',
|
|
212
|
+
organizationId: owner,
|
|
213
|
+
clients: retained.clients,
|
|
214
|
+
client: retained.client,
|
|
215
|
+
applicationName: retained.applicationName,
|
|
216
|
+
etag: retained.etag,
|
|
217
|
+
secrets: result.value,
|
|
218
|
+
};
|
|
219
|
+
recoveryRequired = false;
|
|
220
|
+
options.setRecoveryRequired?.(false);
|
|
221
|
+
publish(projection);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
finally {
|
|
225
|
+
if (operation === controller)
|
|
226
|
+
operation = undefined;
|
|
227
|
+
}
|
|
228
|
+
};
|
|
229
|
+
/** Reloads whichever validated projection is currently retained. */
|
|
230
|
+
const reload = () => {
|
|
231
|
+
if (projection?.kind === 'secrets')
|
|
232
|
+
return loadSecrets(projection.client.id);
|
|
233
|
+
if (projection?.kind === 'detail')
|
|
234
|
+
return select(projection.client.id);
|
|
235
|
+
return load();
|
|
236
|
+
};
|
|
237
|
+
/** Checks the exact retained parent and operation eligibility before dispatch. */
|
|
238
|
+
const ownsMutableTarget = (clientId, mode, secretId) => {
|
|
239
|
+
// Earlier direct lifecycle callers are retained; the service and server still recheck ownership
|
|
240
|
+
// and lifecycle state. New configuration and secret paths fail closed until detail is loaded.
|
|
241
|
+
if (!projection)
|
|
242
|
+
return mode === 'lifecycle';
|
|
243
|
+
const client = projection.clients.find((candidate) => candidate.id === clientId);
|
|
244
|
+
if (!client)
|
|
245
|
+
return false;
|
|
246
|
+
if (mode === 'lifecycle')
|
|
247
|
+
return true;
|
|
248
|
+
if (projection.kind === 'list' || projection.client.id !== clientId)
|
|
249
|
+
return false;
|
|
250
|
+
if (mode === 'update')
|
|
251
|
+
return true;
|
|
252
|
+
if (client.clientType !== 'confidential')
|
|
253
|
+
return false;
|
|
254
|
+
if (mode === 'generate')
|
|
255
|
+
return true;
|
|
256
|
+
return (projection.kind === 'secrets' &&
|
|
257
|
+
secretId !== undefined &&
|
|
258
|
+
projection.secrets.some((secret) => secret.id === secretId && secret.clientId === clientId && secret.status === 'active'));
|
|
259
|
+
};
|
|
260
|
+
/** Requires active organization context and application-read capability for client creation. */
|
|
261
|
+
const canCreateInContext = () => {
|
|
262
|
+
const current = options.readState();
|
|
263
|
+
return (current.kind === 'authenticated' &&
|
|
264
|
+
current.organization?.id === organizationId &&
|
|
265
|
+
current.organization?.status === 'active' &&
|
|
266
|
+
current.capabilities.canReadApplications);
|
|
267
|
+
};
|
|
268
|
+
/** Finishes one plaintext presentation and then performs its authoritative read. */
|
|
269
|
+
const finishPresentation = async (presentation, owner, controller, reloadAfter) => {
|
|
270
|
+
try {
|
|
271
|
+
await presentation;
|
|
272
|
+
}
|
|
273
|
+
catch {
|
|
274
|
+
if (owns(generation, owner, controller)) {
|
|
275
|
+
operation = undefined;
|
|
276
|
+
requireReconciliation(owner);
|
|
277
|
+
mutationDispatched = false;
|
|
278
|
+
}
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
if (!owns(generation, owner, controller))
|
|
282
|
+
return;
|
|
283
|
+
operation = undefined;
|
|
284
|
+
await reloadAfter();
|
|
285
|
+
mutationDispatched = false;
|
|
286
|
+
};
|
|
287
|
+
/** Enriches a returned secret with authoritative display identity before handoff. */
|
|
288
|
+
const presentationValue = (value) => {
|
|
289
|
+
if ('client' in value) {
|
|
290
|
+
if (!value.secret)
|
|
291
|
+
return undefined;
|
|
292
|
+
return {
|
|
293
|
+
...value.secret,
|
|
294
|
+
clientName: value.client.clientName,
|
|
295
|
+
oidcClientId: value.client.clientId,
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
const retained = projection;
|
|
299
|
+
if (!retained || retained.kind === 'list' || retained.client.id !== value.clientId)
|
|
300
|
+
return undefined;
|
|
301
|
+
return {
|
|
302
|
+
...value,
|
|
303
|
+
clientName: retained.client.clientName,
|
|
304
|
+
oidcClientId: retained.client.clientId,
|
|
305
|
+
};
|
|
306
|
+
};
|
|
307
|
+
/** Reloads after a known mutation while retaining cancellation reconciliation ownership. */
|
|
308
|
+
const finishReload = async (reloadAfter) => {
|
|
309
|
+
await reloadAfter();
|
|
310
|
+
mutationDispatched = false;
|
|
311
|
+
};
|
|
312
|
+
/** Applies one mutation result and synchronously hands transient plaintext to its presenter. */
|
|
313
|
+
const finishMutation = async (result, owner, controller, reloadAfter, reloadOnFailure) => {
|
|
314
|
+
if (result.kind === 'session-invalid') {
|
|
315
|
+
sessionInvalid();
|
|
316
|
+
return;
|
|
317
|
+
}
|
|
318
|
+
if (result.kind === 'outcome-unknown') {
|
|
319
|
+
operation = undefined;
|
|
320
|
+
requireReconciliation(owner);
|
|
321
|
+
mutationDispatched = false;
|
|
322
|
+
return;
|
|
323
|
+
}
|
|
324
|
+
if (result.kind === 'failure') {
|
|
325
|
+
if (reloadOnFailure) {
|
|
326
|
+
const selectedClientId = projection && projection.kind !== 'list' ? projection.client.id : undefined;
|
|
327
|
+
operation = undefined;
|
|
328
|
+
if (selectedClientId)
|
|
329
|
+
await select(selectedClientId);
|
|
330
|
+
else
|
|
331
|
+
await load();
|
|
332
|
+
}
|
|
333
|
+
if (organizationId === owner)
|
|
334
|
+
publishFailure(owner, result);
|
|
335
|
+
mutationDispatched = false;
|
|
336
|
+
return;
|
|
337
|
+
}
|
|
338
|
+
if (result.kind !== 'success') {
|
|
339
|
+
mutationDispatched = false;
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
const value = 'value' in result ? result.value : undefined;
|
|
343
|
+
const secret = value ? presentationValue(value) : undefined;
|
|
344
|
+
if (value && ('plaintext' in value || ('secret' in value && value.secret)) && !secret) {
|
|
345
|
+
operation = undefined;
|
|
346
|
+
requireReconciliation(owner);
|
|
347
|
+
mutationDispatched = false;
|
|
348
|
+
return;
|
|
349
|
+
}
|
|
350
|
+
if (secret) {
|
|
351
|
+
if (!options.presentSecret) {
|
|
352
|
+
operation = undefined;
|
|
353
|
+
requireReconciliation(owner);
|
|
354
|
+
mutationDispatched = false;
|
|
355
|
+
return;
|
|
356
|
+
}
|
|
357
|
+
try {
|
|
358
|
+
return finishPresentation(options.presentSecret(secret, controller.signal), owner, controller, () => reloadAfter(value));
|
|
359
|
+
}
|
|
360
|
+
catch {
|
|
361
|
+
operation = undefined;
|
|
362
|
+
requireReconciliation(owner);
|
|
363
|
+
mutationDispatched = false;
|
|
364
|
+
return;
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
operation = undefined;
|
|
368
|
+
await finishReload(() => reloadAfter(value));
|
|
369
|
+
};
|
|
370
|
+
/** Runs one client or secret mutation with fresh context and capability checks. */
|
|
371
|
+
const mutate = async (capability, invoke, reloadAfter, confirm, precondition, reloadOnFailure = false) => {
|
|
372
|
+
if (disposed || operation || recoveryRequired || !organizationId)
|
|
373
|
+
return;
|
|
374
|
+
const initial = options.readState();
|
|
375
|
+
if (initial.kind !== 'authenticated' ||
|
|
376
|
+
initial.organization?.id !== organizationId ||
|
|
377
|
+
!initial.capabilities[capability] ||
|
|
378
|
+
(precondition && !precondition()))
|
|
379
|
+
return;
|
|
380
|
+
const owner = organizationId;
|
|
381
|
+
const controller = new AbortController();
|
|
382
|
+
operation = controller;
|
|
383
|
+
const capturedGeneration = ++generation;
|
|
384
|
+
let handedOff = false;
|
|
385
|
+
try {
|
|
386
|
+
if (confirm &&
|
|
387
|
+
(!(await confirm(controller.signal)) || !owns(capturedGeneration, owner, controller)))
|
|
388
|
+
return;
|
|
389
|
+
const current = options.readState();
|
|
390
|
+
const operations = options.readOperations();
|
|
391
|
+
if (current.kind !== 'authenticated' ||
|
|
392
|
+
current.organization?.id !== owner ||
|
|
393
|
+
!current.capabilities[capability] ||
|
|
394
|
+
!operations ||
|
|
395
|
+
(precondition && !precondition()))
|
|
396
|
+
return;
|
|
397
|
+
mutationDispatched = true;
|
|
398
|
+
const result = await invoke(operations, controller.signal, owner);
|
|
399
|
+
if (!owns(capturedGeneration, owner, controller))
|
|
400
|
+
return;
|
|
401
|
+
const completion = finishMutation(result, owner, controller, reloadAfter, reloadOnFailure);
|
|
402
|
+
handedOff = true;
|
|
403
|
+
return completion;
|
|
404
|
+
}
|
|
405
|
+
finally {
|
|
406
|
+
if (!handedOff && operation === controller) {
|
|
407
|
+
operation = undefined;
|
|
408
|
+
mutationDispatched = false;
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
};
|
|
412
|
+
return {
|
|
413
|
+
syncContext(state, nextSessionEpoch) {
|
|
414
|
+
if (disposed)
|
|
415
|
+
return;
|
|
416
|
+
const nextOrganization = state.kind === 'authenticated' ? state.organization?.id : undefined;
|
|
417
|
+
const changed = state.kind !== 'authenticated' ||
|
|
418
|
+
(sessionEpoch >= 0 && sessionEpoch !== nextSessionEpoch) ||
|
|
419
|
+
organizationId !== nextOrganization;
|
|
420
|
+
if (changed) {
|
|
421
|
+
cancel();
|
|
422
|
+
projection = undefined;
|
|
423
|
+
recoveryRequired = false;
|
|
424
|
+
options.setRecoveryRequired?.(false);
|
|
425
|
+
publish({ kind: 'closed' });
|
|
426
|
+
}
|
|
427
|
+
sessionEpoch = state.kind === 'authenticated' ? nextSessionEpoch : -1;
|
|
428
|
+
organizationId = nextOrganization;
|
|
429
|
+
},
|
|
430
|
+
load,
|
|
431
|
+
select,
|
|
432
|
+
reload,
|
|
433
|
+
create: (input) => mutate('canCreateClients', (operations, _signal, owner) => operations.create?.(owner, input) ?? Promise.resolve({ kind: 'cancelled' }), (value) => (value && 'client' in value ? select(value.client.id) : load()), undefined, canCreateInContext),
|
|
434
|
+
update: (clientId, input, etag) => mutate('canUpdateClients', (operations, signal, owner) => operations.update?.(owner, clientId, input, etag, signal) ??
|
|
435
|
+
Promise.resolve({ kind: 'cancelled' }), () => select(clientId), undefined, () => ownsMutableTarget(clientId, 'update')),
|
|
436
|
+
activate: (clientId, confirm) => mutate('canUpdateClients', (operations, signal, owner) => operations.activate?.(owner, clientId, signal) ?? Promise.resolve({ kind: 'cancelled' }), () => select(clientId), confirm, () => ownsMutableTarget(clientId, 'lifecycle')),
|
|
437
|
+
deactivate: (clientId, confirm) => mutate('canUpdateClients', (operations, signal, owner) => operations.deactivate?.(owner, clientId, signal) ??
|
|
438
|
+
Promise.resolve({ kind: 'cancelled' }), () => select(clientId), confirm, () => ownsMutableTarget(clientId, 'lifecycle')),
|
|
439
|
+
delete: (clientId, confirm) => mutate('canDeleteClients', (operations, signal, owner) => operations.delete?.(owner, clientId, signal) ?? Promise.resolve({ kind: 'cancelled' }), load, confirm, () => ownsMutableTarget(clientId, 'lifecycle'), true),
|
|
440
|
+
loadSecrets,
|
|
441
|
+
generateSecret: (clientId, input) => mutate('canUpdateClients', (operations, signal, owner) => operations.generateSecret?.(owner, clientId, input, signal) ??
|
|
442
|
+
Promise.resolve({ kind: 'cancelled' }), () => loadSecrets(clientId), undefined, () => ownsMutableTarget(clientId, 'generate')),
|
|
443
|
+
revokeSecret: (clientId, secretId, confirm) => mutate('canRevokeClientSecrets', (operations, signal, owner) => operations.revokeSecret?.(owner, clientId, secretId, signal) ??
|
|
444
|
+
Promise.resolve({ kind: 'cancelled' }), () => loadSecrets(clientId), confirm, () => ownsMutableTarget(clientId, 'revoke-secret', secretId)),
|
|
445
|
+
cancelActiveOperation: () => cancel(true),
|
|
446
|
+
handleRecoverableGeometry(recoverable) {
|
|
447
|
+
if (!recoverable)
|
|
448
|
+
cancel(true);
|
|
449
|
+
},
|
|
450
|
+
dispose() {
|
|
451
|
+
if (disposed)
|
|
452
|
+
return;
|
|
453
|
+
cancel();
|
|
454
|
+
disposed = true;
|
|
455
|
+
projection = undefined;
|
|
456
|
+
recoveryRequired = false;
|
|
457
|
+
options.setRecoveryRequired?.(false);
|
|
458
|
+
options.publishState({ kind: 'closed' });
|
|
459
|
+
},
|
|
460
|
+
};
|
|
461
|
+
}
|
|
462
|
+
//# sourceMappingURL=client-controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-controller.js","sourceRoot":"","sources":["../../src/admin/client-controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/** Focused OIDC client credential dialogs and their shared secret-expiry composition. */
|
|
2
|
+
import type { GenerateSecretInput } from '@portaidentity/sdk';
|
|
3
|
+
import { Group } from '@jsvision/ui';
|
|
4
|
+
import type { EventLoop, ModalDialogHost } from '@jsvision/ui';
|
|
5
|
+
import type { AdminClient } from './client-state.js';
|
|
6
|
+
/** Exact warning shown when an administrator chooses a non-expiring secret. */
|
|
7
|
+
export declare const NEVER_SECRET_EXPIRY_WARNING = "This secret will remain valid until it is deleted. Regular rotation is recommended.";
|
|
8
|
+
/** Non-blocking warning shown for a selected date beyond the 24-month preset boundary. */
|
|
9
|
+
export declare const LONG_SECRET_EXPIRY_WARNING = "This secret expires after 24 months. Regular rotation is recommended.";
|
|
10
|
+
/** Feature-local expiry fields shared by registration and credential generation. */
|
|
11
|
+
export interface ClientSecretExpiryFields {
|
|
12
|
+
/** Layout DSL content containing the choice, optional calendar, and warning. */
|
|
13
|
+
readonly content: Group;
|
|
14
|
+
/** Returns whether the selected choice contains a valid future civil date. */
|
|
15
|
+
readonly isValid: () => boolean;
|
|
16
|
+
/** Serializes the selected date, or omits expiry when Never is selected. */
|
|
17
|
+
readonly expiresAt: () => string | undefined;
|
|
18
|
+
}
|
|
19
|
+
/** Modal host needed for abort-driven credential-dialog closure. */
|
|
20
|
+
export interface ClientCredentialDialogHost extends ModalDialogHost {
|
|
21
|
+
/** Event loop that can synchronously close an owned modal. */
|
|
22
|
+
readonly loop: ModalDialogHost['loop'] & Pick<EventLoop, 'endModal'>;
|
|
23
|
+
}
|
|
24
|
+
/** Result of the focused client-secret generation form. */
|
|
25
|
+
export type GenerateClientSecretDialogResult = {
|
|
26
|
+
readonly kind: 'generate';
|
|
27
|
+
readonly clientId: string;
|
|
28
|
+
readonly input?: GenerateSecretInput;
|
|
29
|
+
} | {
|
|
30
|
+
readonly kind: 'cancel';
|
|
31
|
+
};
|
|
32
|
+
/** Creates one complete calendar-based secret-expiry selector with a six-month default. */
|
|
33
|
+
export declare function createClientSecretExpiryFields(now?: Date): ClientSecretExpiryFields;
|
|
34
|
+
/** Opens focused label and calendar expiry controls for a new client secret. */
|
|
35
|
+
export declare function showGenerateClientSecretDialog(host: ClientCredentialDialogHost, operationSignal: AbortSignal, client: AdminClient): Promise<GenerateClientSecretDialogResult>;
|
|
36
|
+
//# sourceMappingURL=client-credential-dialogs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-credential-dialogs.d.ts","sourceRoot":"","sources":["../../src/admin/client-credential-dialogs.ts"],"names":[],"mappings":"AAAA,yFAAyF;AAEzF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,OAAO,EAcL,KAAK,EASN,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAgB,SAAS,EAAE,eAAe,EAAU,MAAM,cAAc,CAAC;AAGrF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD,+EAA+E;AAC/E,eAAO,MAAM,2BAA2B,wFAC+C,CAAC;AAExF,0FAA0F;AAC1F,eAAO,MAAM,0BAA0B,0EACkC,CAAC;AAiB1E,oFAAoF;AACpF,MAAM,WAAW,wBAAwB;IACvC,gFAAgF;IAChF,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;IACxB,8EAA8E;IAC9E,QAAQ,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC;IAChC,4EAA4E;IAC5E,QAAQ,CAAC,SAAS,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;CAC9C;AAED,oEAAoE;AACpE,MAAM,WAAW,0BAA2B,SAAQ,eAAe;IACjE,8DAA8D;IAC9D,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;CACtE;AAED,2DAA2D;AAC3D,MAAM,MAAM,gCAAgC,GACxC;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,mBAAmB,CAAA;CAAE,GAC9F;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC;AAyChC,2FAA2F;AAC3F,wBAAgB,8BAA8B,CAAC,GAAG,GAAE,IAAiB,GAAG,wBAAwB,CA8D/F;AAgCD,gFAAgF;AAChF,wBAAsB,8BAA8B,CAClD,IAAI,EAAE,0BAA0B,EAChC,eAAe,EAAE,WAAW,EAC5B,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,gCAAgC,CAAC,CAmD3C"}
|