@dbx-tools/shared-auth 0.9.133 → 0.9.138

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/index.ts CHANGED
@@ -3,7 +3,7 @@
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
 
5
5
  export const PACKAGE_IDENTIFIER = "@dbx-tools/shared-auth";
6
- export const PACKAGE_VERSION = "0.9.133";
6
+ export const PACKAGE_VERSION = "0.9.138";
7
7
  export * as auth from "./src/auth.ts";
8
8
  export * as browser from "./src/browser.ts";
9
9
  export * as client from "./src/client.ts";
package/lib/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export declare const PACKAGE_IDENTIFIER = "@dbx-tools/shared-auth";
2
- export declare const PACKAGE_VERSION = "0.9.133";
2
+ export declare const PACKAGE_VERSION = "0.9.138";
3
3
  export * as auth from "./src/auth.ts";
4
4
  export * as browser from "./src/browser.ts";
5
5
  export * as client from "./src/client.ts";
package/lib/index.js CHANGED
@@ -2,7 +2,7 @@
2
2
  // Regenerated from the exporting modules in ./src.
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
  export const PACKAGE_IDENTIFIER = "@dbx-tools/shared-auth";
5
- export const PACKAGE_VERSION = "0.9.133";
5
+ export const PACKAGE_VERSION = "0.9.138";
6
6
  export * as auth from "./src/auth.js";
7
7
  export * as browser from "./src/browser.js";
8
8
  export * as client from "./src/client.js";
@@ -14,4 +14,4 @@ export { RUNTIME_AUTH_TYPE, databricksAuthClientInfoSchema } from "./src/client.
14
14
  export { AuthType, TargetKind } from "./src/config.js";
15
15
  export { authTypeSchema, targetKindSchema } from "./src/config-schema.js";
16
16
  export { databricksProfileSummarySchema, databricksProfileListSchema, databricksProfileSelectionSchema } from "./src/profile.js";
17
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyx3QkFBd0IsQ0FBQztBQUMzRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxJQUFJLE1BQU0sZUFBZSxDQUFDO0FBQ3RDLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxZQUFZLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsY0FBYyxFQUFFLG1CQUFtQixFQUFFLGlCQUFpQixFQUFFLHVCQUF1QixFQUFFLGdCQUFnQixFQUFFLHNCQUFzQixFQUFFLHNCQUFzQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR3BNLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSw4QkFBOEIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXBGLE9BQU8sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzFFLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSwyQkFBMkIsRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLGtCQUFrQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR0VORVJBVEVEIGJ5IHByb2plbiB3YXRjaCAtIERPIE5PVCBFRElULlxuLy8gUmVnZW5lcmF0ZWQgZnJvbSB0aGUgZXhwb3J0aW5nIG1vZHVsZXMgaW4gLi9zcmMuXG4vLyBIYW5kIGVkaXRzIGFyZSBvdmVyd3JpdHRlbiBvbiB0aGUgbmV4dCB3YXRjaDsgdGhpcyBmaWxlIGlzIHJlYWQtb25seS5cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfSURFTlRJRklFUiA9IFwiQGRieC10b29scy9zaGFyZWQtYXV0aFwiO1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9IFwiMC45LjEzM1wiO1xuZXhwb3J0ICogYXMgYXV0aCBmcm9tIFwiLi9zcmMvYXV0aC50c1wiO1xuZXhwb3J0ICogYXMgYnJvd3NlciBmcm9tIFwiLi9zcmMvYnJvd3Nlci50c1wiO1xuZXhwb3J0ICogYXMgY2xpZW50IGZyb20gXCIuL3NyYy9jbGllbnQudHNcIjtcbmV4cG9ydCAqIGFzIGNvbmZpZyBmcm9tIFwiLi9zcmMvY29uZmlnLnRzXCI7XG5leHBvcnQgKiBhcyBjb25maWdTY2hlbWEgZnJvbSBcIi4vc3JjL2NvbmZpZy1zY2hlbWEudHNcIjtcbmV4cG9ydCAqIGFzIHByb2ZpbGUgZnJvbSBcIi4vc3JjL3Byb2ZpbGUudHNcIjtcbmV4cG9ydCB7IEFVVEhfQkFTRV9QQVRILCBTRVNTSU9OX0NPT0tJRV9OQU1FLCBhdXRoUmVxdWVzdFNjaGVtYSwgYXV0aFJlcXVlc3RSZXN1bHRTY2hlbWEsIGF1dGhWZXJpZnlTY2hlbWEsIGF1dGhWZXJpZnlSZXN1bHRTY2hlbWEsIGF1dGhMb2dvdXRSZXN1bHRTY2hlbWEsIGF1dGhTdGF0dXNTY2hlbWEgfSBmcm9tIFwiLi9zcmMvYXV0aC50c1wiO1xuZXhwb3J0IHR5cGUgeyBBdXRoUmVxdWVzdCwgQXV0aFJlcXVlc3RSZXN1bHQsIEF1dGhWZXJpZnksIEF1dGhWZXJpZnlSZXN1bHQsIEF1dGhMb2dvdXRSZXN1bHQsIEF1dGhTdGF0dXMgfSBmcm9tIFwiLi9zcmMvYXV0aC50c1wiO1xuZXhwb3J0IHR5cGUgeyBQYXNza2V5T3BlcmF0aW9uIH0gZnJvbSBcIi4vc3JjL2Jyb3dzZXIudHNcIjtcbmV4cG9ydCB7IFJVTlRJTUVfQVVUSF9UWVBFLCBkYXRhYnJpY2tzQXV0aENsaWVudEluZm9TY2hlbWEgfSBmcm9tIFwiLi9zcmMvY2xpZW50LnRzXCI7XG5leHBvcnQgdHlwZSB7IERhdGFicmlja3NBdXRoQ2xpZW50SW5mbyB9IGZyb20gXCIuL3NyYy9jbGllbnQudHNcIjtcbmV4cG9ydCB7IEF1dGhUeXBlLCBUYXJnZXRLaW5kIH0gZnJvbSBcIi4vc3JjL2NvbmZpZy50c1wiO1xuZXhwb3J0IHsgYXV0aFR5cGVTY2hlbWEsIHRhcmdldEtpbmRTY2hlbWEgfSBmcm9tIFwiLi9zcmMvY29uZmlnLXNjaGVtYS50c1wiO1xuZXhwb3J0IHsgZGF0YWJyaWNrc1Byb2ZpbGVTdW1tYXJ5U2NoZW1hLCBkYXRhYnJpY2tzUHJvZmlsZUxpc3RTY2hlbWEsIGRhdGFicmlja3NQcm9maWxlU2VsZWN0aW9uU2NoZW1hIH0gZnJvbSBcIi4vc3JjL3Byb2ZpbGUudHNcIjtcbmV4cG9ydCB0eXBlIHsgRGF0YWJyaWNrc1Byb2ZpbGVTdW1tYXJ5LCBEYXRhYnJpY2tzUHJvZmlsZUxpc3QsIERhdGFicmlja3NQcm9maWxlU2VsZWN0aW9uIH0gZnJvbSBcIi4vc3JjL3Byb2ZpbGUudHNcIjtcbiJdfQ==
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyx3QkFBd0IsQ0FBQztBQUMzRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxJQUFJLE1BQU0sZUFBZSxDQUFDO0FBQ3RDLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxZQUFZLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsY0FBYyxFQUFFLG1CQUFtQixFQUFFLGlCQUFpQixFQUFFLHVCQUF1QixFQUFFLGdCQUFnQixFQUFFLHNCQUFzQixFQUFFLHNCQUFzQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR3BNLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSw4QkFBOEIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXBGLE9BQU8sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzFFLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSwyQkFBMkIsRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLGtCQUFrQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR0VORVJBVEVEIGJ5IHByb2plbiB3YXRjaCAtIERPIE5PVCBFRElULlxuLy8gUmVnZW5lcmF0ZWQgZnJvbSB0aGUgZXhwb3J0aW5nIG1vZHVsZXMgaW4gLi9zcmMuXG4vLyBIYW5kIGVkaXRzIGFyZSBvdmVyd3JpdHRlbiBvbiB0aGUgbmV4dCB3YXRjaDsgdGhpcyBmaWxlIGlzIHJlYWQtb25seS5cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfSURFTlRJRklFUiA9IFwiQGRieC10b29scy9zaGFyZWQtYXV0aFwiO1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9IFwiMC45LjEzOFwiO1xuZXhwb3J0ICogYXMgYXV0aCBmcm9tIFwiLi9zcmMvYXV0aC50c1wiO1xuZXhwb3J0ICogYXMgYnJvd3NlciBmcm9tIFwiLi9zcmMvYnJvd3Nlci50c1wiO1xuZXhwb3J0ICogYXMgY2xpZW50IGZyb20gXCIuL3NyYy9jbGllbnQudHNcIjtcbmV4cG9ydCAqIGFzIGNvbmZpZyBmcm9tIFwiLi9zcmMvY29uZmlnLnRzXCI7XG5leHBvcnQgKiBhcyBjb25maWdTY2hlbWEgZnJvbSBcIi4vc3JjL2NvbmZpZy1zY2hlbWEudHNcIjtcbmV4cG9ydCAqIGFzIHByb2ZpbGUgZnJvbSBcIi4vc3JjL3Byb2ZpbGUudHNcIjtcbmV4cG9ydCB7IEFVVEhfQkFTRV9QQVRILCBTRVNTSU9OX0NPT0tJRV9OQU1FLCBhdXRoUmVxdWVzdFNjaGVtYSwgYXV0aFJlcXVlc3RSZXN1bHRTY2hlbWEsIGF1dGhWZXJpZnlTY2hlbWEsIGF1dGhWZXJpZnlSZXN1bHRTY2hlbWEsIGF1dGhMb2dvdXRSZXN1bHRTY2hlbWEsIGF1dGhTdGF0dXNTY2hlbWEgfSBmcm9tIFwiLi9zcmMvYXV0aC50c1wiO1xuZXhwb3J0IHR5cGUgeyBBdXRoUmVxdWVzdCwgQXV0aFJlcXVlc3RSZXN1bHQsIEF1dGhWZXJpZnksIEF1dGhWZXJpZnlSZXN1bHQsIEF1dGhMb2dvdXRSZXN1bHQsIEF1dGhTdGF0dXMgfSBmcm9tIFwiLi9zcmMvYXV0aC50c1wiO1xuZXhwb3J0IHR5cGUgeyBQYXNza2V5T3BlcmF0aW9uIH0gZnJvbSBcIi4vc3JjL2Jyb3dzZXIudHNcIjtcbmV4cG9ydCB7IFJVTlRJTUVfQVVUSF9UWVBFLCBkYXRhYnJpY2tzQXV0aENsaWVudEluZm9TY2hlbWEgfSBmcm9tIFwiLi9zcmMvY2xpZW50LnRzXCI7XG5leHBvcnQgdHlwZSB7IERhdGFicmlja3NBdXRoQ2xpZW50SW5mbyB9IGZyb20gXCIuL3NyYy9jbGllbnQudHNcIjtcbmV4cG9ydCB7IEF1dGhUeXBlLCBUYXJnZXRLaW5kIH0gZnJvbSBcIi4vc3JjL2NvbmZpZy50c1wiO1xuZXhwb3J0IHsgYXV0aFR5cGVTY2hlbWEsIHRhcmdldEtpbmRTY2hlbWEgfSBmcm9tIFwiLi9zcmMvY29uZmlnLXNjaGVtYS50c1wiO1xuZXhwb3J0IHsgZGF0YWJyaWNrc1Byb2ZpbGVTdW1tYXJ5U2NoZW1hLCBkYXRhYnJpY2tzUHJvZmlsZUxpc3RTY2hlbWEsIGRhdGFicmlja3NQcm9maWxlU2VsZWN0aW9uU2NoZW1hIH0gZnJvbSBcIi4vc3JjL3Byb2ZpbGUudHNcIjtcbmV4cG9ydCB0eXBlIHsgRGF0YWJyaWNrc1Byb2ZpbGVTdW1tYXJ5LCBEYXRhYnJpY2tzUHJvZmlsZUxpc3QsIERhdGFicmlja3NQcm9maWxlU2VsZWN0aW9uIH0gZnJvbSBcIi4vc3JjL3Byb2ZpbGUudHNcIjtcbiJdfQ==
package/lib/src/auth.d.ts CHANGED
@@ -19,6 +19,12 @@ export { AUTH_BASE_PATH };
19
19
  export declare function isAuthPath(path: string): boolean;
20
20
  /** Shared Better Auth session-cookie name used by browser and server packages. */
21
21
  export declare const SESSION_COOKIE_NAME = "dbx-tools-auth";
22
+ /**
23
+ * Build a passkey display name from an optional prefix and the humanized first
24
+ * hostname label. For example, `DBX Tools` and `demo.apps.example.com` produce
25
+ * `DBX Tools Demo`.
26
+ */
27
+ export declare function passkeyDisplayName(prefix: string | undefined, hostname: string): string | undefined;
22
28
  export declare const authRequestSchema: z.ZodObject<{
23
29
  email: z.ZodString;
24
30
  }, z.core.$strip>;
@@ -48,5 +54,6 @@ export declare const authStatusSchema: z.ZodObject<{
48
54
  email: z.ZodOptional<z.ZodString>;
49
55
  enabled: z.ZodBoolean;
50
56
  passkeysEnabled: z.ZodOptional<z.ZodBoolean>;
57
+ passkeyNamePrefix: z.ZodOptional<z.ZodString>;
51
58
  }, z.core.$strip>;
52
59
  export type AuthStatus = z.infer<typeof authStatusSchema>;
package/lib/src/auth.js CHANGED
@@ -7,6 +7,7 @@
7
7
  *
8
8
  * @module
9
9
  */
10
+ import { stringUtils } from "@dbx-tools/shared-core";
10
11
  import { z } from "zod";
11
12
  import { AUTH_BASE_PATH } from "./_route.js";
12
13
  export { AUTH_BASE_PATH };
@@ -22,6 +23,22 @@ export function isAuthPath(path) {
22
23
  }
23
24
  /** Shared Better Auth session-cookie name used by browser and server packages. */
24
25
  export const SESSION_COOKIE_NAME = "dbx-tools-auth";
26
+ /**
27
+ * Build a passkey display name from an optional prefix and the humanized first
28
+ * hostname label. For example, `DBX Tools` and `demo.apps.example.com` produce
29
+ * `DBX Tools Demo`.
30
+ */
31
+ export function passkeyDisplayName(prefix, hostname) {
32
+ const normalizedPrefix = stringUtils.trimToNull(prefix);
33
+ const subdomain = stringUtils.trimToNull(hostname)?.split(".", 1)[0];
34
+ const suffix = subdomain ? stringUtils.toLabel(subdomain) : undefined;
35
+ if (!normalizedPrefix)
36
+ return suffix;
37
+ if (!suffix || normalizedPrefix.toLowerCase().endsWith(suffix.toLowerCase())) {
38
+ return normalizedPrefix;
39
+ }
40
+ return `${normalizedPrefix} ${suffix}`;
41
+ }
25
42
  export const authRequestSchema = z
26
43
  .object({
27
44
  email: z.string().describe("Address to email a one-time code to, if it is authorized."),
@@ -57,6 +74,10 @@ export const authStatusSchema = z
57
74
  email: z.string().optional().describe("Signed-in address when a session exists."),
58
75
  enabled: z.boolean().describe("True when the passwordless gate is configured."),
59
76
  passkeysEnabled: z.boolean().optional().describe("True when WebAuthn passkeys are available."),
77
+ passkeyNamePrefix: z
78
+ .string()
79
+ .optional()
80
+ .describe("Configured prefix for humanized passkey display names."),
60
81
  })
61
82
  .describe("Gate availability, session identity, and optional passkey capability.");
62
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hdXRoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUV4QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTdDLE9BQU8sRUFBRSxjQUFjLEVBQUUsQ0FBQztBQUUxQjs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxVQUFVLENBQUMsSUFBWTtJQUNyQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUM7SUFDL0MsT0FBTyxRQUFRLEtBQUssY0FBYyxJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsR0FBRyxjQUFjLEdBQUcsQ0FBQyxDQUFDO0FBQ2xGLENBQUM7QUFFRCxrRkFBa0Y7QUFDbEYsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsZ0JBQWdCLENBQUM7QUFFcEQsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsQ0FBQztLQUMvQixNQUFNLENBQUM7SUFDTixLQUFLLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQywyREFBMkQsQ0FBQztDQUN4RixDQUFDO0tBQ0QsUUFBUSxDQUFDLG1EQUFtRCxDQUFDLENBQUM7QUFJakUsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsQ0FBQztLQUNyQyxNQUFNLENBQUM7SUFDTixFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsd0RBQXdELENBQUM7SUFDdEYsVUFBVSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsaURBQWlELENBQUM7Q0FDOUYsQ0FBQztLQUNELFFBQVEsQ0FBQyxxRUFBcUUsQ0FBQyxDQUFDO0FBSW5GLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLENBQUM7S0FDOUIsTUFBTSxDQUFDO0lBQ04sS0FBSyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsMENBQTBDLENBQUM7SUFDdEUsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMscURBQXFELENBQUM7Q0FDakYsQ0FBQztLQUNELFFBQVEsQ0FBQywwREFBMEQsQ0FBQyxDQUFDO0FBSXhFLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLENBQUM7S0FDcEMsTUFBTSxDQUFDO0lBQ04sRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMsNERBQTRELENBQUM7SUFDdEYsVUFBVSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsNkNBQTZDLENBQUM7Q0FDMUYsQ0FBQztLQUNELFFBQVEsQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO0FBSTlELE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLENBQUM7S0FDcEMsTUFBTSxDQUFDO0lBQ04sRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMsMkNBQTJDLENBQUM7SUFDckUsVUFBVSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsaURBQWlELENBQUM7Q0FDbkYsQ0FBQztLQUNELFFBQVEsQ0FBQyw0REFBNEQsQ0FBQyxDQUFDO0FBSTFFLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLENBQUM7S0FDOUIsTUFBTSxDQUFDO0lBQ04sYUFBYSxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMsOENBQThDLENBQUM7SUFDbkYsS0FBSyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsMENBQTBDLENBQUM7SUFDakYsT0FBTyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMsZ0RBQWdELENBQUM7SUFDL0UsZUFBZSxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsNENBQTRDLENBQUM7Q0FDL0YsQ0FBQztLQUNELFFBQVEsQ0FBQyx1RUFBdUUsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCcm93c2VyLXNhZmUgcGFzc3dvcmRsZXNzIGF1dGhlbnRpY2F0aW9uIHdpcmUgY29udHJhY3RzLlxuICpcbiAqIEJldHRlciBBdXRoIG93bnMgaXRzIG5hdGl2ZSBlbmRwb2ludCBwYXlsb2Fkcy4gVGhlc2Ugc2NoZW1hcyBjb3ZlciB0aGVcbiAqIGRieC10b29scyBjb21wYXRpYmlsaXR5IGFuZCBnYXRlLXN0YXR1cyBzdXJmYWNlIHNoYXJlZCBieSB0dW5uZWwgdHJhbnNwb3J0c1xuICogYW5kIFJlYWN0IGhvc3RzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyBBVVRIX0JBU0VfUEFUSCB9IGZyb20gXCIuL19yb3V0ZS50c1wiO1xuXG5leHBvcnQgeyBBVVRIX0JBU0VfUEFUSCB9O1xuXG4vKipcbiAqIFRydWUgb25seSBmb3IgdGhlIGF1dGggbW91bnQgaXRzZWxmIG9yIG9uZSBvZiBpdHMgZGVzY2VuZGFudHMuXG4gKlxuICogU2VnbWVudC1hd2FyZSBtYXRjaGluZyBwcmV2ZW50cyBsb29rYWxpa2UgYXBwbGljYXRpb24gcm91dGVzIHN1Y2ggYXNcbiAqIGAvYXBpL2VtYWlsL2F1dGh6YCBmcm9tIGJlaW5nIHRyZWF0ZWQgYXMgcHVibGljIGF1dGhlbnRpY2F0aW9uIGVuZHBvaW50cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQXV0aFBhdGgocGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhdGhuYW1lID0gcGF0aC5zcGxpdChcIj9cIiwgMSlbMF0gPz8gcGF0aDtcbiAgcmV0dXJuIHBhdGhuYW1lID09PSBBVVRIX0JBU0VfUEFUSCB8fCBwYXRobmFtZS5zdGFydHNXaXRoKGAke0FVVEhfQkFTRV9QQVRIfS9gKTtcbn1cblxuLyoqIFNoYXJlZCBCZXR0ZXIgQXV0aCBzZXNzaW9uLWNvb2tpZSBuYW1lIHVzZWQgYnkgYnJvd3NlciBhbmQgc2VydmVyIHBhY2thZ2VzLiAqL1xuZXhwb3J0IGNvbnN0IFNFU1NJT05fQ09PS0lFX05BTUUgPSBcImRieC10b29scy1hdXRoXCI7XG5cbmV4cG9ydCBjb25zdCBhdXRoUmVxdWVzdFNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgZW1haWw6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJBZGRyZXNzIHRvIGVtYWlsIGEgb25lLXRpbWUgY29kZSB0bywgaWYgaXQgaXMgYXV0aG9yaXplZC5cIiksXG4gIH0pXG4gIC5kZXNjcmliZShcIlZhbGlkYXRlZCByZXF1ZXN0IGZvciBhbiBlbWFpbCBvbmUtdGltZSBwYXNzd29yZC5cIik7XG5cbmV4cG9ydCB0eXBlIEF1dGhSZXF1ZXN0ID0gei5pbmZlcjx0eXBlb2YgYXV0aFJlcXVlc3RTY2hlbWE+O1xuXG5leHBvcnQgY29uc3QgYXV0aFJlcXVlc3RSZXN1bHRTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIG9rOiB6LmxpdGVyYWwodHJ1ZSkuZGVzY3JpYmUoXCJBbHdheXMgdHJ1ZSBmb3IgYW4gYWNjZXB0ZWQgb25lLXRpbWUtcGFzc3dvcmQgcmVxdWVzdC5cIiksXG4gICAgcmV0cnlBZnRlcjogei5udW1iZXIoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiU2Vjb25kcyB0byB3YWl0IGJlZm9yZSByZXF1ZXN0aW5nIGFub3RoZXIgY29kZS5cIiksXG4gIH0pXG4gIC5kZXNjcmliZShcIkFjY2VwdGVkIG9uZS10aW1lLXBhc3N3b3JkIHJlcXVlc3QgcmVzdWx0IGFuZCBvcHRpb25hbCByZXRyeSBkZWxheS5cIik7XG5cbmV4cG9ydCB0eXBlIEF1dGhSZXF1ZXN0UmVzdWx0ID0gei5pbmZlcjx0eXBlb2YgYXV0aFJlcXVlc3RSZXN1bHRTY2hlbWE+O1xuXG5leHBvcnQgY29uc3QgYXV0aFZlcmlmeVNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgZW1haWw6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJBZGRyZXNzIHRoYXQgcmVjZWl2ZWQgdGhlIG9uZS10aW1lIGNvZGUuXCIpLFxuICAgIGNvZGU6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJPbmUtdGltZSBwYXNzd29yZCBzdWJtaXR0ZWQgdG8gZXN0YWJsaXNoIGEgc2Vzc2lvbi5cIiksXG4gIH0pXG4gIC5kZXNjcmliZShcIkVtYWlsIGFkZHJlc3MgYW5kIGNvZGUgc3VibWl0dGVkIHRvIGVzdGFibGlzaCBhIHNlc3Npb24uXCIpO1xuXG5leHBvcnQgdHlwZSBBdXRoVmVyaWZ5ID0gei5pbmZlcjx0eXBlb2YgYXV0aFZlcmlmeVNjaGVtYT47XG5cbmV4cG9ydCBjb25zdCBhdXRoVmVyaWZ5UmVzdWx0U2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICBvazogei5ib29sZWFuKCkuZGVzY3JpYmUoXCJUcnVlIHdoZW4gdGhlIGNvZGUgd2FzIGFjY2VwdGVkIGFuZCBhIHNlc3Npb24gd2FzIGNyZWF0ZWQuXCIpLFxuICAgIHJldHJ5QWZ0ZXI6IHoubnVtYmVyKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIlNlY29uZHMgdG8gd2FpdCBiZWZvcmUgdHJ5aW5nIGFub3RoZXIgY29kZS5cIiksXG4gIH0pXG4gIC5kZXNjcmliZShcIlZlcmlmaWNhdGlvbiBvdXRjb21lIGFuZCBvcHRpb25hbCByZXRyeSBkZWxheS5cIik7XG5cbmV4cG9ydCB0eXBlIEF1dGhWZXJpZnlSZXN1bHQgPSB6LmluZmVyPHR5cGVvZiBhdXRoVmVyaWZ5UmVzdWx0U2NoZW1hPjtcblxuZXhwb3J0IGNvbnN0IGF1dGhMb2dvdXRSZXN1bHRTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIG9rOiB6LmJvb2xlYW4oKS5kZXNjcmliZShcIlRydWUgd2hlbiB0aGUgc2Vzc2lvbiBjb29raWUgd2FzIGNsZWFyZWQuXCIpLFxuICAgIHJlZGlyZWN0VG86IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJWYWxpZGF0ZWQgc2FtZS1vcmlnaW4gZGVzdGluYXRpb24gYWZ0ZXIgbG9nb3V0LlwiKSxcbiAgfSlcbiAgLmRlc2NyaWJlKFwiTG9nb3V0IG91dGNvbWUgcGx1cyB0aGUgdmFsaWRhdGVkIHNhbWUtb3JpZ2luIGRlc3RpbmF0aW9uLlwiKTtcblxuZXhwb3J0IHR5cGUgQXV0aExvZ291dFJlc3VsdCA9IHouaW5mZXI8dHlwZW9mIGF1dGhMb2dvdXRSZXN1bHRTY2hlbWE+O1xuXG5leHBvcnQgY29uc3QgYXV0aFN0YXR1c1NjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgYXV0aGVudGljYXRlZDogei5ib29sZWFuKCkuZGVzY3JpYmUoXCJUcnVlIHdoZW4gdGhlIGJyb3dzZXIgaG9sZHMgYSB2YWxpZCBzZXNzaW9uLlwiKSxcbiAgICBlbWFpbDogei5zdHJpbmcoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiU2lnbmVkLWluIGFkZHJlc3Mgd2hlbiBhIHNlc3Npb24gZXhpc3RzLlwiKSxcbiAgICBlbmFibGVkOiB6LmJvb2xlYW4oKS5kZXNjcmliZShcIlRydWUgd2hlbiB0aGUgcGFzc3dvcmRsZXNzIGdhdGUgaXMgY29uZmlndXJlZC5cIiksXG4gICAgcGFzc2tleXNFbmFibGVkOiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiVHJ1ZSB3aGVuIFdlYkF1dGhuIHBhc3NrZXlzIGFyZSBhdmFpbGFibGUuXCIpLFxuICB9KVxuICAuZGVzY3JpYmUoXCJHYXRlIGF2YWlsYWJpbGl0eSwgc2Vzc2lvbiBpZGVudGl0eSwgYW5kIG9wdGlvbmFsIHBhc3NrZXkgY2FwYWJpbGl0eS5cIik7XG5cbmV4cG9ydCB0eXBlIEF1dGhTdGF0dXMgPSB6LmluZmVyPHR5cGVvZiBhdXRoU3RhdHVzU2NoZW1hPjtcbiJdfQ==
83
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hdXRoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFFeEIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUU3QyxPQUFPLEVBQUUsY0FBYyxFQUFFLENBQUM7QUFFMUI7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsVUFBVSxDQUFDLElBQVk7SUFDckMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDO0lBQy9DLE9BQU8sUUFBUSxLQUFLLGNBQWMsSUFBSSxRQUFRLENBQUMsVUFBVSxDQUFDLEdBQUcsY0FBYyxHQUFHLENBQUMsQ0FBQztBQUNsRixDQUFDO0FBRUQsa0ZBQWtGO0FBQ2xGLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLGdCQUFnQixDQUFDO0FBRXBEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQ2hDLE1BQTBCLEVBQzFCLFFBQWdCO0lBRWhCLE1BQU0sZ0JBQWdCLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN4RCxNQUFNLFNBQVMsR0FBRyxXQUFXLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckUsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDdEUsSUFBSSxDQUFDLGdCQUFnQjtRQUFFLE9BQU8sTUFBTSxDQUFDO0lBQ3JDLElBQUksQ0FBQyxNQUFNLElBQUksZ0JBQWdCLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDN0UsT0FBTyxnQkFBZ0IsQ0FBQztJQUMxQixDQUFDO0lBQ0QsT0FBTyxHQUFHLGdCQUFnQixJQUFJLE1BQU0sRUFBRSxDQUFDO0FBQ3pDLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxDQUFDO0tBQy9CLE1BQU0sQ0FBQztJQUNOLEtBQUssRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLDJEQUEyRCxDQUFDO0NBQ3hGLENBQUM7S0FDRCxRQUFRLENBQUMsbURBQW1ELENBQUMsQ0FBQztBQUlqRSxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxDQUFDO0tBQ3JDLE1BQU0sQ0FBQztJQUNOLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyx3REFBd0QsQ0FBQztJQUN0RixVQUFVLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxpREFBaUQsQ0FBQztDQUM5RixDQUFDO0tBQ0QsUUFBUSxDQUFDLHFFQUFxRSxDQUFDLENBQUM7QUFJbkYsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQztLQUM5QixNQUFNLENBQUM7SUFDTixLQUFLLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQywwQ0FBMEMsQ0FBQztJQUN0RSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxxREFBcUQsQ0FBQztDQUNqRixDQUFDO0tBQ0QsUUFBUSxDQUFDLDBEQUEwRCxDQUFDLENBQUM7QUFJeEUsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQztLQUNwQyxNQUFNLENBQUM7SUFDTixFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyw0REFBNEQsQ0FBQztJQUN0RixVQUFVLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyw2Q0FBNkMsQ0FBQztDQUMxRixDQUFDO0tBQ0QsUUFBUSxDQUFDLGdEQUFnRCxDQUFDLENBQUM7QUFJOUQsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQztLQUNwQyxNQUFNLENBQUM7SUFDTixFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQywyQ0FBMkMsQ0FBQztJQUNyRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxpREFBaUQsQ0FBQztDQUNuRixDQUFDO0tBQ0QsUUFBUSxDQUFDLDREQUE0RCxDQUFDLENBQUM7QUFJMUUsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQztLQUM5QixNQUFNLENBQUM7SUFDTixhQUFhLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyw4Q0FBOEMsQ0FBQztJQUNuRixLQUFLLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQywwQ0FBMEMsQ0FBQztJQUNqRixPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyxnREFBZ0QsQ0FBQztJQUMvRSxlQUFlLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyw0Q0FBNEMsQ0FBQztJQUM5RixpQkFBaUIsRUFBRSxDQUFDO1NBQ2pCLE1BQU0sRUFBRTtTQUNSLFFBQVEsRUFBRTtTQUNWLFFBQVEsQ0FBQyx3REFBd0QsQ0FBQztDQUN0RSxDQUFDO0tBQ0QsUUFBUSxDQUFDLHVFQUF1RSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEJyb3dzZXItc2FmZSBwYXNzd29yZGxlc3MgYXV0aGVudGljYXRpb24gd2lyZSBjb250cmFjdHMuXG4gKlxuICogQmV0dGVyIEF1dGggb3ducyBpdHMgbmF0aXZlIGVuZHBvaW50IHBheWxvYWRzLiBUaGVzZSBzY2hlbWFzIGNvdmVyIHRoZVxuICogZGJ4LXRvb2xzIGNvbXBhdGliaWxpdHkgYW5kIGdhdGUtc3RhdHVzIHN1cmZhY2Ugc2hhcmVkIGJ5IHR1bm5lbCB0cmFuc3BvcnRzXG4gKiBhbmQgUmVhY3QgaG9zdHMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IHN0cmluZ1V0aWxzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbmltcG9ydCB7IEFVVEhfQkFTRV9QQVRIIH0gZnJvbSBcIi4vX3JvdXRlLnRzXCI7XG5cbmV4cG9ydCB7IEFVVEhfQkFTRV9QQVRIIH07XG5cbi8qKlxuICogVHJ1ZSBvbmx5IGZvciB0aGUgYXV0aCBtb3VudCBpdHNlbGYgb3Igb25lIG9mIGl0cyBkZXNjZW5kYW50cy5cbiAqXG4gKiBTZWdtZW50LWF3YXJlIG1hdGNoaW5nIHByZXZlbnRzIGxvb2thbGlrZSBhcHBsaWNhdGlvbiByb3V0ZXMgc3VjaCBhc1xuICogYC9hcGkvZW1haWwvYXV0aHpgIGZyb20gYmVpbmcgdHJlYXRlZCBhcyBwdWJsaWMgYXV0aGVudGljYXRpb24gZW5kcG9pbnRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNBdXRoUGF0aChwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcGF0aG5hbWUgPSBwYXRoLnNwbGl0KFwiP1wiLCAxKVswXSA/PyBwYXRoO1xuICByZXR1cm4gcGF0aG5hbWUgPT09IEFVVEhfQkFTRV9QQVRIIHx8IHBhdGhuYW1lLnN0YXJ0c1dpdGgoYCR7QVVUSF9CQVNFX1BBVEh9L2ApO1xufVxuXG4vKiogU2hhcmVkIEJldHRlciBBdXRoIHNlc3Npb24tY29va2llIG5hbWUgdXNlZCBieSBicm93c2VyIGFuZCBzZXJ2ZXIgcGFja2FnZXMuICovXG5leHBvcnQgY29uc3QgU0VTU0lPTl9DT09LSUVfTkFNRSA9IFwiZGJ4LXRvb2xzLWF1dGhcIjtcblxuLyoqXG4gKiBCdWlsZCBhIHBhc3NrZXkgZGlzcGxheSBuYW1lIGZyb20gYW4gb3B0aW9uYWwgcHJlZml4IGFuZCB0aGUgaHVtYW5pemVkIGZpcnN0XG4gKiBob3N0bmFtZSBsYWJlbC4gRm9yIGV4YW1wbGUsIGBEQlggVG9vbHNgIGFuZCBgZGVtby5hcHBzLmV4YW1wbGUuY29tYCBwcm9kdWNlXG4gKiBgREJYIFRvb2xzIERlbW9gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFzc2tleURpc3BsYXlOYW1lKFxuICBwcmVmaXg6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgaG9zdG5hbWU6IHN0cmluZyxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRQcmVmaXggPSBzdHJpbmdVdGlscy50cmltVG9OdWxsKHByZWZpeCk7XG4gIGNvbnN0IHN1YmRvbWFpbiA9IHN0cmluZ1V0aWxzLnRyaW1Ub051bGwoaG9zdG5hbWUpPy5zcGxpdChcIi5cIiwgMSlbMF07XG4gIGNvbnN0IHN1ZmZpeCA9IHN1YmRvbWFpbiA/IHN0cmluZ1V0aWxzLnRvTGFiZWwoc3ViZG9tYWluKSA6IHVuZGVmaW5lZDtcbiAgaWYgKCFub3JtYWxpemVkUHJlZml4KSByZXR1cm4gc3VmZml4O1xuICBpZiAoIXN1ZmZpeCB8fCBub3JtYWxpemVkUHJlZml4LnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoc3VmZml4LnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRQcmVmaXg7XG4gIH1cbiAgcmV0dXJuIGAke25vcm1hbGl6ZWRQcmVmaXh9ICR7c3VmZml4fWA7XG59XG5cbmV4cG9ydCBjb25zdCBhdXRoUmVxdWVzdFNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgZW1haWw6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJBZGRyZXNzIHRvIGVtYWlsIGEgb25lLXRpbWUgY29kZSB0bywgaWYgaXQgaXMgYXV0aG9yaXplZC5cIiksXG4gIH0pXG4gIC5kZXNjcmliZShcIlZhbGlkYXRlZCByZXF1ZXN0IGZvciBhbiBlbWFpbCBvbmUtdGltZSBwYXNzd29yZC5cIik7XG5cbmV4cG9ydCB0eXBlIEF1dGhSZXF1ZXN0ID0gei5pbmZlcjx0eXBlb2YgYXV0aFJlcXVlc3RTY2hlbWE+O1xuXG5leHBvcnQgY29uc3QgYXV0aFJlcXVlc3RSZXN1bHRTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIG9rOiB6LmxpdGVyYWwodHJ1ZSkuZGVzY3JpYmUoXCJBbHdheXMgdHJ1ZSBmb3IgYW4gYWNjZXB0ZWQgb25lLXRpbWUtcGFzc3dvcmQgcmVxdWVzdC5cIiksXG4gICAgcmV0cnlBZnRlcjogei5udW1iZXIoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiU2Vjb25kcyB0byB3YWl0IGJlZm9yZSByZXF1ZXN0aW5nIGFub3RoZXIgY29kZS5cIiksXG4gIH0pXG4gIC5kZXNjcmliZShcIkFjY2VwdGVkIG9uZS10aW1lLXBhc3N3b3JkIHJlcXVlc3QgcmVzdWx0IGFuZCBvcHRpb25hbCByZXRyeSBkZWxheS5cIik7XG5cbmV4cG9ydCB0eXBlIEF1dGhSZXF1ZXN0UmVzdWx0ID0gei5pbmZlcjx0eXBlb2YgYXV0aFJlcXVlc3RSZXN1bHRTY2hlbWE+O1xuXG5leHBvcnQgY29uc3QgYXV0aFZlcmlmeVNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgZW1haWw6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJBZGRyZXNzIHRoYXQgcmVjZWl2ZWQgdGhlIG9uZS10aW1lIGNvZGUuXCIpLFxuICAgIGNvZGU6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJPbmUtdGltZSBwYXNzd29yZCBzdWJtaXR0ZWQgdG8gZXN0YWJsaXNoIGEgc2Vzc2lvbi5cIiksXG4gIH0pXG4gIC5kZXNjcmliZShcIkVtYWlsIGFkZHJlc3MgYW5kIGNvZGUgc3VibWl0dGVkIHRvIGVzdGFibGlzaCBhIHNlc3Npb24uXCIpO1xuXG5leHBvcnQgdHlwZSBBdXRoVmVyaWZ5ID0gei5pbmZlcjx0eXBlb2YgYXV0aFZlcmlmeVNjaGVtYT47XG5cbmV4cG9ydCBjb25zdCBhdXRoVmVyaWZ5UmVzdWx0U2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICBvazogei5ib29sZWFuKCkuZGVzY3JpYmUoXCJUcnVlIHdoZW4gdGhlIGNvZGUgd2FzIGFjY2VwdGVkIGFuZCBhIHNlc3Npb24gd2FzIGNyZWF0ZWQuXCIpLFxuICAgIHJldHJ5QWZ0ZXI6IHoubnVtYmVyKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIlNlY29uZHMgdG8gd2FpdCBiZWZvcmUgdHJ5aW5nIGFub3RoZXIgY29kZS5cIiksXG4gIH0pXG4gIC5kZXNjcmliZShcIlZlcmlmaWNhdGlvbiBvdXRjb21lIGFuZCBvcHRpb25hbCByZXRyeSBkZWxheS5cIik7XG5cbmV4cG9ydCB0eXBlIEF1dGhWZXJpZnlSZXN1bHQgPSB6LmluZmVyPHR5cGVvZiBhdXRoVmVyaWZ5UmVzdWx0U2NoZW1hPjtcblxuZXhwb3J0IGNvbnN0IGF1dGhMb2dvdXRSZXN1bHRTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIG9rOiB6LmJvb2xlYW4oKS5kZXNjcmliZShcIlRydWUgd2hlbiB0aGUgc2Vzc2lvbiBjb29raWUgd2FzIGNsZWFyZWQuXCIpLFxuICAgIHJlZGlyZWN0VG86IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJWYWxpZGF0ZWQgc2FtZS1vcmlnaW4gZGVzdGluYXRpb24gYWZ0ZXIgbG9nb3V0LlwiKSxcbiAgfSlcbiAgLmRlc2NyaWJlKFwiTG9nb3V0IG91dGNvbWUgcGx1cyB0aGUgdmFsaWRhdGVkIHNhbWUtb3JpZ2luIGRlc3RpbmF0aW9uLlwiKTtcblxuZXhwb3J0IHR5cGUgQXV0aExvZ291dFJlc3VsdCA9IHouaW5mZXI8dHlwZW9mIGF1dGhMb2dvdXRSZXN1bHRTY2hlbWE+O1xuXG5leHBvcnQgY29uc3QgYXV0aFN0YXR1c1NjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgYXV0aGVudGljYXRlZDogei5ib29sZWFuKCkuZGVzY3JpYmUoXCJUcnVlIHdoZW4gdGhlIGJyb3dzZXIgaG9sZHMgYSB2YWxpZCBzZXNzaW9uLlwiKSxcbiAgICBlbWFpbDogei5zdHJpbmcoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiU2lnbmVkLWluIGFkZHJlc3Mgd2hlbiBhIHNlc3Npb24gZXhpc3RzLlwiKSxcbiAgICBlbmFibGVkOiB6LmJvb2xlYW4oKS5kZXNjcmliZShcIlRydWUgd2hlbiB0aGUgcGFzc3dvcmRsZXNzIGdhdGUgaXMgY29uZmlndXJlZC5cIiksXG4gICAgcGFzc2tleXNFbmFibGVkOiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiVHJ1ZSB3aGVuIFdlYkF1dGhuIHBhc3NrZXlzIGFyZSBhdmFpbGFibGUuXCIpLFxuICAgIHBhc3NrZXlOYW1lUHJlZml4OiB6XG4gICAgICAuc3RyaW5nKClcbiAgICAgIC5vcHRpb25hbCgpXG4gICAgICAuZGVzY3JpYmUoXCJDb25maWd1cmVkIHByZWZpeCBmb3IgaHVtYW5pemVkIHBhc3NrZXkgZGlzcGxheSBuYW1lcy5cIiksXG4gIH0pXG4gIC5kZXNjcmliZShcIkdhdGUgYXZhaWxhYmlsaXR5LCBzZXNzaW9uIGlkZW50aXR5LCBhbmQgb3B0aW9uYWwgcGFzc2tleSBjYXBhYmlsaXR5LlwiKTtcblxuZXhwb3J0IHR5cGUgQXV0aFN0YXR1cyA9IHouaW5mZXI8dHlwZW9mIGF1dGhTdGF0dXNTY2hlbWE+O1xuIl19
@@ -8,7 +8,7 @@
8
8
  * @module
9
9
  */
10
10
  import { type Passkey } from "@better-auth/passkey/client";
11
- import type { AuthStatus } from "./auth.ts";
11
+ import { type AuthStatus } from "./auth.ts";
12
12
  export { AUTH_BASE_PATH } from "./_route.ts";
13
13
  export type { Passkey } from "@better-auth/passkey/client";
14
14
  /** A cancellable passkey request and WebAuthn ceremony. */
@@ -18,7 +18,12 @@ export interface PasskeyOperation {
18
18
  }
19
19
  /** Start a passkey sign-in whose lifetime is explicitly owned by the caller. */
20
20
  export declare function beginPasskeySignIn(autoFill?: boolean): PasskeyOperation;
21
- /** Start a passkey registration whose lifetime is explicitly owned by the caller. */
21
+ /** Build a passkey display name for the current browser hostname. */
22
+ export declare function passkeyDisplayName(prefix?: string): string | undefined;
23
+ /**
24
+ * Start a passkey registration whose lifetime is explicitly owned by the caller.
25
+ * The display name defaults to the humanized browser subdomain.
26
+ */
22
27
  export declare function beginPasskeyEnrollment(name?: string): PasskeyOperation;
23
28
  /** Cancel the currently active passkey request and browser ceremony, if any. */
24
29
  export declare function cancelPasskeyOperation(): void;
@@ -12,6 +12,7 @@ import { WebAuthnAbortService } from "@simplewebauthn/browser";
12
12
  import { createAuthClient } from "better-auth/client";
13
13
  import { emailOTPClient } from "better-auth/client/plugins";
14
14
  import { AUTH_BASE_PATH } from "./_route.js";
15
+ import { passkeyDisplayName as formatPasskeyDisplayName } from "./auth.js";
15
16
  export { AUTH_BASE_PATH } from "./_route.js";
16
17
  function browserLocation() {
17
18
  return globalThis.location;
@@ -39,7 +40,8 @@ function authStatus(value) {
39
40
  typeof item.authenticated !== "boolean" ||
40
41
  typeof item.enabled !== "boolean" ||
41
42
  (item.email !== undefined && typeof item.email !== "string") ||
42
- (item.passkeysEnabled !== undefined && typeof item.passkeysEnabled !== "boolean")) {
43
+ (item.passkeysEnabled !== undefined && typeof item.passkeysEnabled !== "boolean") ||
44
+ (item.passkeyNamePrefix !== undefined && typeof item.passkeyNamePrefix !== "string")) {
43
45
  throw new Error("Auth status returned an invalid response");
44
46
  }
45
47
  return {
@@ -47,6 +49,9 @@ function authStatus(value) {
47
49
  enabled: item.enabled,
48
50
  ...(typeof item.email === "string" ? { email: item.email } : {}),
49
51
  ...(typeof item.passkeysEnabled === "boolean" ? { passkeysEnabled: item.passkeysEnabled } : {}),
52
+ ...(typeof item.passkeyNamePrefix === "string"
53
+ ? { passkeyNamePrefix: item.passkeyNamePrefix }
54
+ : {}),
50
55
  };
51
56
  }
52
57
  let activePasskeyOperation;
@@ -84,9 +89,17 @@ function beginPasskeyOperation(invoke) {
84
89
  export function beginPasskeySignIn(autoFill = false) {
85
90
  return beginPasskeyOperation((operationClient) => operationClient.signIn.passkey({ autoFill }));
86
91
  }
87
- /** Start a passkey registration whose lifetime is explicitly owned by the caller. */
92
+ /** Build a passkey display name for the current browser hostname. */
93
+ export function passkeyDisplayName(prefix) {
94
+ return formatPasskeyDisplayName(prefix, browserLocation()?.hostname ?? "");
95
+ }
96
+ /**
97
+ * Start a passkey registration whose lifetime is explicitly owned by the caller.
98
+ * The display name defaults to the humanized browser subdomain.
99
+ */
88
100
  export function beginPasskeyEnrollment(name) {
89
- return beginPasskeyOperation((operationClient) => operationClient.passkey.addPasskey(name ? { name } : undefined));
101
+ const passkeyName = name ?? passkeyDisplayName();
102
+ return beginPasskeyOperation((operationClient) => operationClient.passkey.addPasskey(passkeyName ? { name: passkeyName } : undefined));
90
103
  }
91
104
  /** Cancel the currently active passkey request and browser ceremony, if any. */
92
105
  export function cancelPasskeyOperation() {
@@ -147,4 +160,4 @@ export async function removePasskey(id) {
147
160
  const result = await client.passkey.deletePasskey({ id });
148
161
  return result.error === null;
149
162
  }
150
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9icm93c2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFFLGFBQWEsRUFBZ0IsTUFBTSw2QkFBNkIsQ0FBQztBQUMxRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFNUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUc3QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBUTdDLFNBQVMsZUFBZTtJQUN0QixPQUFRLFVBQXdELENBQUMsUUFBUSxDQUFDO0FBQzVFLENBQUM7QUFFRCxTQUFTLE9BQU87SUFDZCxNQUFNLE1BQU0sR0FBRyxlQUFlLEVBQUUsRUFBRSxNQUFNLElBQUksa0JBQWtCLENBQUM7SUFDL0QsT0FBTyxHQUFHLE1BQU0sR0FBRyxjQUFjLEVBQUUsQ0FBQztBQUN0QyxDQUFDO0FBRUQsU0FBUyxhQUFhLENBQUMsTUFBb0I7SUFDekMsT0FBTyxnQkFBZ0IsQ0FBQztRQUN0QixPQUFPLEVBQUUsT0FBTyxFQUFFO1FBQ2xCLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQy9DLE9BQU8sRUFBRSxDQUFDLGNBQWMsRUFBRSxFQUFFLGFBQWEsRUFBRSxDQUFDO0tBQzdDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxNQUFNLE1BQU0sR0FBRyxhQUFhLEVBQUUsQ0FBQztBQUUvQixTQUFTLE1BQU0sQ0FBQyxLQUFjO0lBQzVCLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssS0FBSyxJQUFJO1FBQ2hELENBQUMsQ0FBRSxLQUFpQztRQUNwQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ2hCLENBQUM7QUFFRCxTQUFTLFVBQVUsQ0FBQyxLQUFjO0lBQ2hDLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzQixJQUNFLENBQUMsSUFBSTtRQUNMLE9BQU8sSUFBSSxDQUFDLGFBQWEsS0FBSyxTQUFTO1FBQ3ZDLE9BQU8sSUFBSSxDQUFDLE9BQU8sS0FBSyxTQUFTO1FBQ2pDLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxTQUFTLElBQUksT0FBTyxJQUFJLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQztRQUM1RCxDQUFDLElBQUksQ0FBQyxlQUFlLEtBQUssU0FBUyxJQUFJLE9BQU8sSUFBSSxDQUFDLGVBQWUsS0FBSyxTQUFTLENBQUMsRUFDakYsQ0FBQztRQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBQ0QsT0FBTztRQUNMLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYTtRQUNqQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87UUFDckIsR0FBRyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2hFLEdBQUcsQ0FBQyxPQUFPLElBQUksQ0FBQyxlQUFlLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLGVBQWUsRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztLQUNoRyxDQUFDO0FBQ0osQ0FBQztBQWFELElBQUksc0JBQTBELENBQUM7QUFFL0QsU0FBUyxPQUFPLENBQUMsS0FBYztJQUM3QixPQUFPLEtBQUssWUFBWSxZQUFZLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxZQUFZLENBQUM7QUFDdEUsQ0FBQztBQUVELFNBQVMscUJBQXFCLENBQzVCLE1BQTBGO0lBRTFGLHNCQUFzQixFQUFFLE1BQU0sRUFBRSxDQUFDO0lBRWpDLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sVUFBVSxHQUFHLElBQUksZUFBZSxFQUFFLENBQUM7SUFDekMsSUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ3RCLE1BQU0sTUFBTSxHQUFHLEdBQVMsRUFBRTtRQUN4QixJQUFJLHNCQUFzQixFQUFFLEVBQUUsS0FBSyxFQUFFO1lBQUUsT0FBTztRQUM5QyxzQkFBc0IsR0FBRyxTQUFTLENBQUM7UUFDbkMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUNqQixVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDbkIsb0JBQW9CLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDeEMsQ0FBQyxDQUFDO0lBQ0Ysc0JBQXNCLEdBQUcsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUM7SUFFeEMsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDcEQsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFNBQVMsSUFBSSxRQUFRLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQztTQUN6RCxLQUFLLENBQUMsQ0FBQyxLQUFjLEVBQUUsRUFBRTtRQUN4QixJQUFJLFNBQVMsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDOUMsTUFBTSxLQUFLLENBQUM7SUFDZCxDQUFDLENBQUM7U0FDRCxPQUFPLENBQUMsR0FBRyxFQUFFO1FBQ1osSUFBSSxzQkFBc0IsRUFBRSxFQUFFLEtBQUssRUFBRTtZQUFFLHNCQUFzQixHQUFHLFNBQVMsQ0FBQztJQUM1RSxDQUFDLENBQUMsQ0FBQztJQUVMLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDNUIsQ0FBQztBQUVELGdGQUFnRjtBQUNoRixNQUFNLFVBQVUsa0JBQWtCLENBQUMsUUFBUSxHQUFHLEtBQUs7SUFDakQsT0FBTyxxQkFBcUIsQ0FBQyxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDbEcsQ0FBQztBQUVELHFGQUFxRjtBQUNyRixNQUFNLFVBQVUsc0JBQXNCLENBQUMsSUFBYTtJQUNsRCxPQUFPLHFCQUFxQixDQUFDLENBQUMsZUFBZSxFQUFFLEVBQUUsQ0FDL0MsZUFBZSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FDaEUsQ0FBQztBQUNKLENBQUM7QUFFRCxnRkFBZ0Y7QUFDaEYsTUFBTSxVQUFVLHNCQUFzQjtJQUNwQyxzQkFBc0IsRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUNuQyxDQUFDO0FBRUQsNkVBQTZFO0FBQzdFLE1BQU0sQ0FBQyxLQUFLLFVBQVUsYUFBYTtJQUNqQyxNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLGNBQWMsU0FBUyxFQUFFLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDckYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDaEYsT0FBTyxVQUFVLENBQUMsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUMzQyxDQUFDO0FBRUQsb0ZBQW9GO0FBQ3BGLE1BQU0sQ0FBQyxLQUFLLFVBQVUsTUFBTTtJQUMxQixNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLGNBQWMsU0FBUyxFQUFFO1FBQ3ZELE1BQU0sRUFBRSxNQUFNO1FBQ2QsV0FBVyxFQUFFLFNBQVM7S0FDdkIsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDN0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLElBQUksTUFBTSxFQUFFLEVBQUUsS0FBSyxJQUFJLElBQUksT0FBTyxNQUFNLENBQUMsVUFBVSxLQUFLLFFBQVE7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUMvRixlQUFlLEVBQUUsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzdDLE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVELG1FQUFtRTtBQUNuRSxNQUFNLENBQUMsS0FBSyxVQUFVLGVBQWUsQ0FBQyxLQUFhO0lBQ2pELE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUNyRixPQUFPLE1BQU0sQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDO0FBQy9CLENBQUM7QUFFRCx5RUFBeUU7QUFDekUsTUFBTSxDQUFDLEtBQUssVUFBVSxjQUFjLENBQUMsS0FBYSxFQUFFLEdBQVcsRUFBRSxJQUFZO0lBQzNFLE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDbEUsT0FBTyxNQUFNLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQztBQUMvQixDQUFDO0FBRUQsbUZBQW1GO0FBQ25GLE1BQU0sQ0FBQyxLQUFLLFVBQVUsYUFBYSxDQUFDLFFBQVEsR0FBRyxLQUFLO0lBQ2xELE9BQU8sa0JBQWtCLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDO0FBQzdDLENBQUM7QUFFRCw4REFBOEQ7QUFDOUQsTUFBTSxDQUFDLEtBQUssVUFBVSxVQUFVLENBQUMsSUFBYTtJQUM1QyxPQUFPLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQztBQUM3QyxDQUFDO0FBRUQsb0VBQW9FO0FBQ3BFLE1BQU0sQ0FBQyxLQUFLLFVBQVUsWUFBWTtJQUNoQyxNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUN2RCxJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxJQUFJLCtCQUErQixNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDaEcsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7QUFDM0IsQ0FBQztBQUVELGtDQUFrQztBQUNsQyxNQUFNLENBQUMsS0FBSyxVQUFVLGFBQWEsQ0FBQyxFQUFVLEVBQUUsSUFBWTtJQUMxRCxNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDaEUsT0FBTyxNQUFNLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQztBQUMvQixDQUFDO0FBRUQsa0NBQWtDO0FBQ2xDLE1BQU0sQ0FBQyxLQUFLLFVBQVUsYUFBYSxDQUFDLEVBQVU7SUFDNUMsTUFBTSxNQUFNLEdBQUcsTUFBTSxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDMUQsT0FBTyxNQUFNLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQztBQUMvQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCcm93c2VyLW9ubHkgQmV0dGVyIEF1dGggY2xpZW50IHNoYXJlZCBieSBSZWFjdCBhbmQgdGhlIGhvc3RlZCB0dW5uZWwgbG9naW4uXG4gKlxuICogVGhlIG9wZXJhdGlvbiBoZWxwZXJzIG93biBib3RoIG5ldHdvcmsgY2FuY2VsbGF0aW9uIGFuZCB0aGUgYWN0aXZlIFdlYkF1dGhuXG4gKiBjZXJlbW9ueS4gRWFjaCBvcGVyYXRpb24gY2FycmllcyBhbiBpZGVudGl0eSB0b2tlbiBzbyBjbGVhbnVwIGZyb20gYW4gb2xkZXJcbiAqIFJlYWN0IGVmZmVjdCBjYW5ub3QgY2FuY2VsIGEgbmV3ZXIgbWFudWFsIGF0dGVtcHQuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IHBhc3NrZXlDbGllbnQsIHR5cGUgUGFzc2tleSB9IGZyb20gXCJAYmV0dGVyLWF1dGgvcGFzc2tleS9jbGllbnRcIjtcbmltcG9ydCB7IFdlYkF1dGhuQWJvcnRTZXJ2aWNlIH0gZnJvbSBcIkBzaW1wbGV3ZWJhdXRobi9icm93c2VyXCI7XG5pbXBvcnQgeyBjcmVhdGVBdXRoQ2xpZW50IH0gZnJvbSBcImJldHRlci1hdXRoL2NsaWVudFwiO1xuaW1wb3J0IHsgZW1haWxPVFBDbGllbnQgfSBmcm9tIFwiYmV0dGVyLWF1dGgvY2xpZW50L3BsdWdpbnNcIjtcblxuaW1wb3J0IHsgQVVUSF9CQVNFX1BBVEggfSBmcm9tIFwiLi9fcm91dGUudHNcIjtcbmltcG9ydCB0eXBlIHsgQXV0aFN0YXR1cyB9IGZyb20gXCIuL2F1dGgudHNcIjtcblxuZXhwb3J0IHsgQVVUSF9CQVNFX1BBVEggfSBmcm9tIFwiLi9fcm91dGUudHNcIjtcbmV4cG9ydCB0eXBlIHsgUGFzc2tleSB9IGZyb20gXCJAYmV0dGVyLWF1dGgvcGFzc2tleS9jbGllbnRcIjtcblxuaW50ZXJmYWNlIEJyb3dzZXJMb2NhdGlvbiB7XG4gIHJlYWRvbmx5IG9yaWdpbjogc3RyaW5nO1xuICBhc3NpZ24odXJsOiBzdHJpbmcpOiB2b2lkO1xufVxuXG5mdW5jdGlvbiBicm93c2VyTG9jYXRpb24oKTogQnJvd3NlckxvY2F0aW9uIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIChnbG9iYWxUaGlzIGFzIHVua25vd24gYXMgeyBsb2NhdGlvbj86IEJyb3dzZXJMb2NhdGlvbiB9KS5sb2NhdGlvbjtcbn1cblxuZnVuY3Rpb24gYmFzZVVSTCgpOiBzdHJpbmcge1xuICBjb25zdCBvcmlnaW4gPSBicm93c2VyTG9jYXRpb24oKT8ub3JpZ2luID8/IFwiaHR0cDovL2xvY2FsaG9zdFwiO1xuICByZXR1cm4gYCR7b3JpZ2lufSR7QVVUSF9CQVNFX1BBVEh9YDtcbn1cblxuZnVuY3Rpb24gYnJvd3NlckNsaWVudChzaWduYWw/OiBBYm9ydFNpZ25hbCkge1xuICByZXR1cm4gY3JlYXRlQXV0aENsaWVudCh7XG4gICAgYmFzZVVSTDogYmFzZVVSTCgpLFxuICAgIC4uLihzaWduYWwgPyB7IGZldGNoT3B0aW9uczogeyBzaWduYWwgfSB9IDoge30pLFxuICAgIHBsdWdpbnM6IFtlbWFpbE9UUENsaWVudCgpLCBwYXNza2V5Q2xpZW50KCldLFxuICB9KTtcbn1cblxuY29uc3QgY2xpZW50ID0gYnJvd3NlckNsaWVudCgpO1xuXG5mdW5jdGlvbiByZWNvcmQodmFsdWU6IHVua25vd24pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGxcbiAgICA/ICh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilcbiAgICA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gYXV0aFN0YXR1cyh2YWx1ZTogdW5rbm93bik6IEF1dGhTdGF0dXMge1xuICBjb25zdCBpdGVtID0gcmVjb3JkKHZhbHVlKTtcbiAgaWYgKFxuICAgICFpdGVtIHx8XG4gICAgdHlwZW9mIGl0ZW0uYXV0aGVudGljYXRlZCAhPT0gXCJib29sZWFuXCIgfHxcbiAgICB0eXBlb2YgaXRlbS5lbmFibGVkICE9PSBcImJvb2xlYW5cIiB8fFxuICAgIChpdGVtLmVtYWlsICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGl0ZW0uZW1haWwgIT09IFwic3RyaW5nXCIpIHx8XG4gICAgKGl0ZW0ucGFzc2tleXNFbmFibGVkICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGl0ZW0ucGFzc2tleXNFbmFibGVkICE9PSBcImJvb2xlYW5cIilcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQXV0aCBzdGF0dXMgcmV0dXJuZWQgYW4gaW52YWxpZCByZXNwb25zZVwiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGF1dGhlbnRpY2F0ZWQ6IGl0ZW0uYXV0aGVudGljYXRlZCxcbiAgICBlbmFibGVkOiBpdGVtLmVuYWJsZWQsXG4gICAgLi4uKHR5cGVvZiBpdGVtLmVtYWlsID09PSBcInN0cmluZ1wiID8geyBlbWFpbDogaXRlbS5lbWFpbCB9IDoge30pLFxuICAgIC4uLih0eXBlb2YgaXRlbS5wYXNza2V5c0VuYWJsZWQgPT09IFwiYm9vbGVhblwiID8geyBwYXNza2V5c0VuYWJsZWQ6IGl0ZW0ucGFzc2tleXNFbmFibGVkIH0gOiB7fSksXG4gIH07XG59XG5cbi8qKiBBIGNhbmNlbGxhYmxlIHBhc3NrZXkgcmVxdWVzdCBhbmQgV2ViQXV0aG4gY2VyZW1vbnkuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhc3NrZXlPcGVyYXRpb24ge1xuICByZWFkb25seSByZXN1bHQ6IFByb21pc2U8Ym9vbGVhbj47XG4gIGNhbmNlbCgpOiB2b2lkO1xufVxuXG5pbnRlcmZhY2UgQWN0aXZlUGFzc2tleU9wZXJhdGlvbiB7XG4gIHJlYWRvbmx5IGlkOiBzeW1ib2w7XG4gIGNhbmNlbCgpOiB2b2lkO1xufVxuXG5sZXQgYWN0aXZlUGFzc2tleU9wZXJhdGlvbjogQWN0aXZlUGFzc2tleU9wZXJhdGlvbiB8IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gaXNBYm9ydChlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gZXJyb3IgaW5zdGFuY2VvZiBET01FeGNlcHRpb24gJiYgZXJyb3IubmFtZSA9PT0gXCJBYm9ydEVycm9yXCI7XG59XG5cbmZ1bmN0aW9uIGJlZ2luUGFzc2tleU9wZXJhdGlvbihcbiAgaW52b2tlOiAob3BlcmF0aW9uQ2xpZW50OiBSZXR1cm5UeXBlPHR5cGVvZiBicm93c2VyQ2xpZW50PikgPT4gUHJvbWlzZTx7IGVycm9yOiB1bmtub3duIH0+LFxuKTogUGFzc2tleU9wZXJhdGlvbiB7XG4gIGFjdGl2ZVBhc3NrZXlPcGVyYXRpb24/LmNhbmNlbCgpO1xuXG4gIGNvbnN0IGlkID0gU3ltYm9sKFwicGFzc2tleS1vcGVyYXRpb25cIik7XG4gIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIGxldCBjYW5jZWxsZWQgPSBmYWxzZTtcbiAgY29uc3QgY2FuY2VsID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmIChhY3RpdmVQYXNza2V5T3BlcmF0aW9uPy5pZCAhPT0gaWQpIHJldHVybjtcbiAgICBhY3RpdmVQYXNza2V5T3BlcmF0aW9uID0gdW5kZWZpbmVkO1xuICAgIGNhbmNlbGxlZCA9IHRydWU7XG4gICAgY29udHJvbGxlci5hYm9ydCgpO1xuICAgIFdlYkF1dGhuQWJvcnRTZXJ2aWNlLmNhbmNlbENlcmVtb255KCk7XG4gIH07XG4gIGFjdGl2ZVBhc3NrZXlPcGVyYXRpb24gPSB7IGlkLCBjYW5jZWwgfTtcblxuICBjb25zdCByZXN1bHQgPSBpbnZva2UoYnJvd3NlckNsaWVudChjb250cm9sbGVyLnNpZ25hbCkpXG4gICAgLnRoZW4oKHJlc3BvbnNlKSA9PiAhY2FuY2VsbGVkICYmIHJlc3BvbnNlLmVycm9yID09PSBudWxsKVxuICAgIC5jYXRjaCgoZXJyb3I6IHVua25vd24pID0+IHtcbiAgICAgIGlmIChjYW5jZWxsZWQgfHwgaXNBYm9ydChlcnJvcikpIHJldHVybiBmYWxzZTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pXG4gICAgLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgaWYgKGFjdGl2ZVBhc3NrZXlPcGVyYXRpb24/LmlkID09PSBpZCkgYWN0aXZlUGFzc2tleU9wZXJhdGlvbiA9IHVuZGVmaW5lZDtcbiAgICB9KTtcblxuICByZXR1cm4geyByZXN1bHQsIGNhbmNlbCB9O1xufVxuXG4vKiogU3RhcnQgYSBwYXNza2V5IHNpZ24taW4gd2hvc2UgbGlmZXRpbWUgaXMgZXhwbGljaXRseSBvd25lZCBieSB0aGUgY2FsbGVyLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJlZ2luUGFzc2tleVNpZ25JbihhdXRvRmlsbCA9IGZhbHNlKTogUGFzc2tleU9wZXJhdGlvbiB7XG4gIHJldHVybiBiZWdpblBhc3NrZXlPcGVyYXRpb24oKG9wZXJhdGlvbkNsaWVudCkgPT4gb3BlcmF0aW9uQ2xpZW50LnNpZ25Jbi5wYXNza2V5KHsgYXV0b0ZpbGwgfSkpO1xufVxuXG4vKiogU3RhcnQgYSBwYXNza2V5IHJlZ2lzdHJhdGlvbiB3aG9zZSBsaWZldGltZSBpcyBleHBsaWNpdGx5IG93bmVkIGJ5IHRoZSBjYWxsZXIuICovXG5leHBvcnQgZnVuY3Rpb24gYmVnaW5QYXNza2V5RW5yb2xsbWVudChuYW1lPzogc3RyaW5nKTogUGFzc2tleU9wZXJhdGlvbiB7XG4gIHJldHVybiBiZWdpblBhc3NrZXlPcGVyYXRpb24oKG9wZXJhdGlvbkNsaWVudCkgPT5cbiAgICBvcGVyYXRpb25DbGllbnQucGFzc2tleS5hZGRQYXNza2V5KG5hbWUgPyB7IG5hbWUgfSA6IHVuZGVmaW5lZCksXG4gICk7XG59XG5cbi8qKiBDYW5jZWwgdGhlIGN1cnJlbnRseSBhY3RpdmUgcGFzc2tleSByZXF1ZXN0IGFuZCBicm93c2VyIGNlcmVtb255LCBpZiBhbnkuICovXG5leHBvcnQgZnVuY3Rpb24gY2FuY2VsUGFzc2tleU9wZXJhdGlvbigpOiB2b2lkIHtcbiAgYWN0aXZlUGFzc2tleU9wZXJhdGlvbj8uY2FuY2VsKCk7XG59XG5cbi8qKiBSZWFkIHRoZSBjdXJyZW50IGJyb3dzZXIgc2Vzc2lvbiBzdGF0dXMgZnJvbSB0aGUgc2hhcmVkIGF1dGggZW5kcG9pbnQuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QXV0aFN0YXR1cygpOiBQcm9taXNlPEF1dGhTdGF0dXM+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHtBVVRIX0JBU0VfUEFUSH0vc3RhdHVzYCwgeyBjcmVkZW50aWFsczogXCJpbmNsdWRlXCIgfSk7XG4gIGlmICghcmVzcG9uc2Uub2spIHRocm93IG5ldyBFcnJvcihgQXV0aCBzdGF0dXMgZmFpbGVkIHdpdGggJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gIHJldHVybiBhdXRoU3RhdHVzKGF3YWl0IHJlc3BvbnNlLmpzb24oKSk7XG59XG5cbi8qKiBFbmQgdGhlIGN1cnJlbnQgYnJvd3NlciBzZXNzaW9uIGFuZCBmb2xsb3cgdGhlIHNlcnZlcidzIHNhbWUtb3JpZ2luIHJlZGlyZWN0LiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvZ291dCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHtBVVRIX0JBU0VfUEFUSH0vbG9nb3V0YCwge1xuICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgY3JlZGVudGlhbHM6IFwiaW5jbHVkZVwiLFxuICB9KTtcbiAgY29uc3QgcmVzdWx0ID0gcmVjb3JkKGF3YWl0IHJlc3BvbnNlLmpzb24oKSk7XG4gIGlmICghcmVzcG9uc2Uub2sgfHwgcmVzdWx0Py5vayAhPT0gdHJ1ZSB8fCB0eXBlb2YgcmVzdWx0LnJlZGlyZWN0VG8gIT09IFwic3RyaW5nXCIpIHJldHVybiBmYWxzZTtcbiAgYnJvd3NlckxvY2F0aW9uKCk/LmFzc2lnbihyZXN1bHQucmVkaXJlY3RUbyk7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKiogUmVxdWVzdCBhbiBlbWFpbCBvbmUtdGltZSBwYXNzd29yZCBmb3IgdGhlIHN1cHBsaWVkIGFkZHJlc3MuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVxdWVzdEVtYWlsT3RwKGVtYWlsOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2xpZW50LmVtYWlsT3RwLnNlbmRWZXJpZmljYXRpb25PdHAoeyBlbWFpbCwgdHlwZTogXCJzaWduLWluXCIgfSk7XG4gIHJldHVybiByZXN1bHQuZXJyb3IgPT09IG51bGw7XG59XG5cbi8qKiBWZXJpZnkgYW4gZW1haWwgb25lLXRpbWUgcGFzc3dvcmQgYW5kIGVzdGFibGlzaCBhIGJyb3dzZXIgc2Vzc2lvbi4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB2ZXJpZnlFbWFpbE90cChlbWFpbDogc3RyaW5nLCBvdHA6IHN0cmluZywgbmFtZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNsaWVudC5zaWduSW4uZW1haWxPdHAoeyBlbWFpbCwgb3RwLCBuYW1lIH0pO1xuICByZXR1cm4gcmVzdWx0LmVycm9yID09PSBudWxsO1xufVxuXG4vKiogQXV0aGVudGljYXRlIHdpdGggYSBwYXNza2V5LCBvcHRpb25hbGx5IHVzaW5nIGNvbmRpdGlvbmFsIGJyb3dzZXIgbWVkaWF0aW9uLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNpZ25JblBhc3NrZXkoYXV0b0ZpbGwgPSBmYWxzZSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICByZXR1cm4gYmVnaW5QYXNza2V5U2lnbkluKGF1dG9GaWxsKS5yZXN1bHQ7XG59XG5cbi8qKiBFbnJvbGwgYSBwYXNza2V5IGZvciB0aGUgY3VycmVudCBhdXRoZW50aWNhdGVkIGFjY291bnQuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYWRkUGFzc2tleShuYW1lPzogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHJldHVybiBiZWdpblBhc3NrZXlFbnJvbGxtZW50KG5hbWUpLnJlc3VsdDtcbn1cblxuLyoqIExpc3QgcGFzc2tleXMgZW5yb2xsZWQgZm9yIHRoZSBjdXJyZW50IGF1dGhlbnRpY2F0ZWQgYWNjb3VudC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaXN0UGFzc2tleXMoKTogUHJvbWlzZTxQYXNza2V5W10+IHtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnBhc3NrZXkubGlzdFVzZXJQYXNza2V5cygpO1xuICBpZiAocmVzdWx0LmVycm9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHJlc3VsdC5lcnJvci5tZXNzYWdlID8/IGBQYXNza2V5IGxpc3RpbmcgZmFpbGVkIHdpdGggJHtyZXN1bHQuZXJyb3Iuc3RhdHVzfWApO1xuICB9XG4gIHJldHVybiByZXN1bHQuZGF0YSA/PyBbXTtcbn1cblxuLyoqIFJlbmFtZSBhbiBlbnJvbGxlZCBwYXNza2V5LiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbmFtZVBhc3NrZXkoaWQ6IHN0cmluZywgbmFtZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNsaWVudC5wYXNza2V5LnVwZGF0ZVBhc3NrZXkoeyBpZCwgbmFtZSB9KTtcbiAgcmV0dXJuIHJlc3VsdC5lcnJvciA9PT0gbnVsbDtcbn1cblxuLyoqIFJlbW92ZSBhbiBlbnJvbGxlZCBwYXNza2V5LiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbW92ZVBhc3NrZXkoaWQ6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBjbGllbnQucGFzc2tleS5kZWxldGVQYXNza2V5KHsgaWQgfSk7XG4gIHJldHVybiByZXN1bHQuZXJyb3IgPT09IG51bGw7XG59XG4iXX0=
163
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9icm93c2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFFLGFBQWEsRUFBZ0IsTUFBTSw2QkFBNkIsQ0FBQztBQUMxRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFNUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM3QyxPQUFPLEVBQW1CLGtCQUFrQixJQUFJLHdCQUF3QixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRTVGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFTN0MsU0FBUyxlQUFlO0lBQ3RCLE9BQVEsVUFBd0QsQ0FBQyxRQUFRLENBQUM7QUFDNUUsQ0FBQztBQUVELFNBQVMsT0FBTztJQUNkLE1BQU0sTUFBTSxHQUFHLGVBQWUsRUFBRSxFQUFFLE1BQU0sSUFBSSxrQkFBa0IsQ0FBQztJQUMvRCxPQUFPLEdBQUcsTUFBTSxHQUFHLGNBQWMsRUFBRSxDQUFDO0FBQ3RDLENBQUM7QUFFRCxTQUFTLGFBQWEsQ0FBQyxNQUFvQjtJQUN6QyxPQUFPLGdCQUFnQixDQUFDO1FBQ3RCLE9BQU8sRUFBRSxPQUFPLEVBQUU7UUFDbEIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDL0MsT0FBTyxFQUFFLENBQUMsY0FBYyxFQUFFLEVBQUUsYUFBYSxFQUFFLENBQUM7S0FDN0MsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELE1BQU0sTUFBTSxHQUFHLGFBQWEsRUFBRSxD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Q0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDaEUsT0FBTyxNQUFNLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQztBQUMvQixDQUFDO0FBRUQsa0NBQWtDO0FBQ2xDLE1BQU0sQ0FBQyxLQUFLLFVBQVUsYUFBYSxDQUFDLEVBQVU7SUFDNUMsTUFBTSxNQUFNLEdBQUcsTUFBTSxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDMUQsT0FBTyxNQUFNLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQztBQUMvQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCcm93c2VyLW9ubHkgQmV0dGVyIEF1dGggY2xpZW50IHNoYXJlZCBieSBSZWFjdCBhbmQgdGhlIGhvc3RlZCB0dW5uZWwgbG9naW4uXG4gKlxuICogVGhlIG9wZXJhdGlvbiBoZWxwZXJzIG93biBib3RoIG5ldHdvcmsgY2FuY2VsbGF0aW9uIGFuZCB0aGUgYWN0aXZlIFdlYkF1dGhuXG4gKiBjZXJlbW9ueS4gRWFjaCBvcGVyYXRpb24gY2FycmllcyBhbiBpZGVudGl0eSB0b2tlbiBzbyBjbGVhbnVwIGZyb20gYW4gb2xkZXJcbiAqIFJlYWN0IGVmZmVjdCBjYW5ub3QgY2FuY2VsIGEgbmV3ZXIgbWFudWFsIGF0dGVtcHQuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IHBhc3NrZXlDbGllbnQsIHR5cGUgUGFzc2tleSB9IGZyb20gXCJAYmV0dGVyLWF1dGgvcGFzc2tleS9jbGllbnRcIjtcbmltcG9ydCB7IFdlYkF1dGhuQWJvcnRTZXJ2aWNlIH0gZnJvbSBcIkBzaW1wbGV3ZWJhdXRobi9icm93c2VyXCI7XG5pbXBvcnQgeyBjcmVhdGVBdXRoQ2xpZW50IH0gZnJvbSBcImJldHRlci1hdXRoL2NsaWVudFwiO1xuaW1wb3J0IHsgZW1haWxPVFBDbGllbnQgfSBmcm9tIFwiYmV0dGVyLWF1dGgvY2xpZW50L3BsdWdpbnNcIjtcblxuaW1wb3J0IHsgQVVUSF9CQVNFX1BBVEggfSBmcm9tIFwiLi9fcm91dGUudHNcIjtcbmltcG9ydCB7IHR5cGUgQXV0aFN0YXR1cywgcGFzc2tleURpc3BsYXlOYW1lIGFzIGZvcm1hdFBhc3NrZXlEaXNwbGF5TmFtZSB9IGZyb20gXCIuL2F1dGgudHNcIjtcblxuZXhwb3J0IHsgQVVUSF9CQVNFX1BBVEggfSBmcm9tIFwiLi9fcm91dGUudHNcIjtcbmV4cG9ydCB0eXBlIHsgUGFzc2tleSB9IGZyb20gXCJAYmV0dGVyLWF1dGgvcGFzc2tleS9jbGllbnRcIjtcblxuaW50ZXJmYWNlIEJyb3dzZXJMb2NhdGlvbiB7XG4gIHJlYWRvbmx5IGhvc3RuYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG9yaWdpbjogc3RyaW5nO1xuICBhc3NpZ24odXJsOiBzdHJpbmcpOiB2b2lkO1xufVxuXG5mdW5jdGlvbiBicm93c2VyTG9jYXRpb24oKTogQnJvd3NlckxvY2F0aW9uIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIChnbG9iYWxUaGlzIGFzIHVua25vd24gYXMgeyBsb2NhdGlvbj86IEJyb3dzZXJMb2NhdGlvbiB9KS5sb2NhdGlvbjtcbn1cblxuZnVuY3Rpb24gYmFzZVVSTCgpOiBzdHJpbmcge1xuICBjb25zdCBvcmlnaW4gPSBicm93c2VyTG9jYXRpb24oKT8ub3JpZ2luID8/IFwiaHR0cDovL2xvY2FsaG9zdFwiO1xuICByZXR1cm4gYCR7b3JpZ2lufSR7QVVUSF9CQVNFX1BBVEh9YDtcbn1cblxuZnVuY3Rpb24gYnJvd3NlckNsaWVudChzaWduYWw/OiBBYm9ydFNpZ25hbCkge1xuICByZXR1cm4gY3JlYXRlQXV0aENsaWVudCh7XG4gICAgYmFzZVVSTDogYmFzZVVSTCgpLFxuICAgIC4uLihzaWduYWwgPyB7IGZldGNoT3B0aW9uczogeyBzaWduYWwgfSB9IDoge30pLFxuICAgIHBsdWdpbnM6IFtlbWFpbE9UUENsaWVudCgpLCBwYXNza2V5Q2xpZW50KCldLFxuICB9KTtcbn1cblxuY29uc3QgY2xpZW50ID0gYnJvd3NlckNsaWVudCgpO1xuXG5mdW5jdGlvbiByZWNvcmQodmFsdWU6IHVua25vd24pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGxcbiAgICA/ICh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilcbiAgICA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gYXV0aFN0YXR1cyh2YWx1ZTogdW5rbm93bik6IEF1dGhTdGF0dXMge1xuICBjb25zdCBpdGVtID0gcmVjb3JkKHZhbHVlKTtcbiAgaWYgKFxuICAgICFpdGVtIHx8XG4gICAgdHlwZW9mIGl0ZW0uYXV0aGVudGljYXRlZCAhPT0gXCJib29sZWFuXCIgfHxcbiAgICB0eXBlb2YgaXRlbS5lbmFibGVkICE9PSBcImJvb2xlYW5cIiB8fFxuICAgIChpdGVtLmVtYWlsICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGl0ZW0uZW1haWwgIT09IFwic3RyaW5nXCIpIHx8XG4gICAgKGl0ZW0ucGFzc2tleXNFbmFibGVkICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGl0ZW0ucGFzc2tleXNFbmFibGVkICE9PSBcImJvb2xlYW5cIikgfHxcbiAgICAoaXRlbS5wYXNza2V5TmFtZVByZWZpeCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBpdGVtLnBhc3NrZXlOYW1lUHJlZml4ICE9PSBcInN0cmluZ1wiKVxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBdXRoIHN0YXR1cyByZXR1cm5lZCBhbiBpbnZhbGlkIHJlc3BvbnNlXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgYXV0aGVudGljYXRlZDogaXRlbS5hdXRoZW50aWNhdGVkLFxuICAgIGVuYWJsZWQ6IGl0ZW0uZW5hYmxlZCxcbiAgICAuLi4odHlwZW9mIGl0ZW0uZW1haWwgPT09IFwic3RyaW5nXCIgPyB7IGVtYWlsOiBpdGVtLmVtYWlsIH0gOiB7fSksXG4gICAgLi4uKHR5cGVvZiBpdGVtLnBhc3NrZXlzRW5hYmxlZCA9PT0gXCJib29sZWFuXCIgPyB7IHBhc3NrZXlzRW5hYmxlZDogaXRlbS5wYXNza2V5c0VuYWJsZWQgfSA6IHt9KSxcbiAgICAuLi4odHlwZW9mIGl0ZW0ucGFzc2tleU5hbWVQcmVmaXggPT09IFwic3RyaW5nXCJcbiAgICAgID8geyBwYXNza2V5TmFtZVByZWZpeDogaXRlbS5wYXNza2V5TmFtZVByZWZpeCB9XG4gICAgICA6IHt9KSxcbiAgfTtcbn1cblxuLyoqIEEgY2FuY2VsbGFibGUgcGFzc2tleSByZXF1ZXN0IGFuZCBXZWJBdXRobiBjZXJlbW9ueS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFzc2tleU9wZXJhdGlvbiB7XG4gIHJlYWRvbmx5IHJlc3VsdDogUHJvbWlzZTxib29sZWFuPjtcbiAgY2FuY2VsKCk6IHZvaWQ7XG59XG5cbmludGVyZmFjZSBBY3RpdmVQYXNza2V5T3BlcmF0aW9uIHtcbiAgcmVhZG9ubHkgaWQ6IHN5bWJvbDtcbiAgY2FuY2VsKCk6IHZvaWQ7XG59XG5cbmxldCBhY3RpdmVQYXNza2V5T3BlcmF0aW9uOiBBY3RpdmVQYXNza2V5T3BlcmF0aW9uIHwgdW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpc0Fib3J0KGVycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIERPTUV4Y2VwdGlvbiAmJiBlcnJvci5uYW1lID09PSBcIkFib3J0RXJyb3JcIjtcbn1cblxuZnVuY3Rpb24gYmVnaW5QYXNza2V5T3BlcmF0aW9uKFxuICBpbnZva2U6IChvcGVyYXRpb25DbGllbnQ6IFJldHVyblR5cGU8dHlwZW9mIGJyb3dzZXJDbGllbnQ+KSA9PiBQcm9taXNlPHsgZXJyb3I6IHVua25vd24gfT4sXG4pOiBQYXNza2V5T3BlcmF0aW9uIHtcbiAgYWN0aXZlUGFzc2tleU9wZXJhdGlvbj8uY2FuY2VsKCk7XG5cbiAgY29uc3QgaWQgPSBTeW1ib2woXCJwYXNza2V5LW9wZXJhdGlvblwiKTtcbiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgbGV0IGNhbmNlbGxlZCA9IGZhbHNlO1xuICBjb25zdCBjYW5jZWwgPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKGFjdGl2ZVBhc3NrZXlPcGVyYXRpb24/LmlkICE9PSBpZCkgcmV0dXJuO1xuICAgIGFjdGl2ZVBhc3NrZXlPcGVyYXRpb24gPSB1bmRlZmluZWQ7XG4gICAgY2FuY2VsbGVkID0gdHJ1ZTtcbiAgICBjb250cm9sbGVyLmFib3J0KCk7XG4gICAgV2ViQXV0aG5BYm9ydFNlcnZpY2UuY2FuY2VsQ2VyZW1vbnkoKTtcbiAgfTtcbiAgYWN0aXZlUGFzc2tleU9wZXJhdGlvbiA9IHsgaWQsIGNhbmNlbCB9O1xuXG4gIGNvbnN0IHJlc3VsdCA9IGludm9rZShicm93c2VyQ2xpZW50KGNvbnRyb2xsZXIuc2lnbmFsKSlcbiAgICAudGhlbigocmVzcG9uc2UpID0+ICFjYW5jZWxsZWQgJiYgcmVzcG9uc2UuZXJyb3IgPT09IG51bGwpXG4gICAgLmNhdGNoKChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgaWYgKGNhbmNlbGxlZCB8fCBpc0Fib3J0KGVycm9yKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSlcbiAgICAuZmluYWxseSgoKSA9PiB7XG4gICAgICBpZiAoYWN0aXZlUGFzc2tleU9wZXJhdGlvbj8uaWQgPT09IGlkKSBhY3RpdmVQYXNza2V5T3BlcmF0aW9uID0gdW5kZWZpbmVkO1xuICAgIH0pO1xuXG4gIHJldHVybiB7IHJlc3VsdCwgY2FuY2VsIH07XG59XG5cbi8qKiBTdGFydCBhIHBhc3NrZXkgc2lnbi1pbiB3aG9zZSBsaWZldGltZSBpcyBleHBsaWNpdGx5IG93bmVkIGJ5IHRoZSBjYWxsZXIuICovXG5leHBvcnQgZnVuY3Rpb24gYmVnaW5QYXNza2V5U2lnbkluKGF1dG9GaWxsID0gZmFsc2UpOiBQYXNza2V5T3BlcmF0aW9uIHtcbiAgcmV0dXJuIGJlZ2luUGFzc2tleU9wZXJhdGlvbigob3BlcmF0aW9uQ2xpZW50KSA9PiBvcGVyYXRpb25DbGllbnQuc2lnbkluLnBhc3NrZXkoeyBhdXRvRmlsbCB9KSk7XG59XG5cbi8qKiBCdWlsZCBhIHBhc3NrZXkgZGlzcGxheSBuYW1lIGZvciB0aGUgY3VycmVudCBicm93c2VyIGhvc3RuYW1lLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhc3NrZXlEaXNwbGF5TmFtZShwcmVmaXg/OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gZm9ybWF0UGFzc2tleURpc3BsYXlOYW1lKHByZWZpeCwgYnJvd3NlckxvY2F0aW9uKCk/Lmhvc3RuYW1lID8/IFwiXCIpO1xufVxuXG4vKipcbiAqIFN0YXJ0IGEgcGFzc2tleSByZWdpc3RyYXRpb24gd2hvc2UgbGlmZXRpbWUgaXMgZXhwbGljaXRseSBvd25lZCBieSB0aGUgY2FsbGVyLlxuICogVGhlIGRpc3BsYXkgbmFtZSBkZWZhdWx0cyB0byB0aGUgaHVtYW5pemVkIGJyb3dzZXIgc3ViZG9tYWluLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYmVnaW5QYXNza2V5RW5yb2xsbWVudChuYW1lPzogc3RyaW5nKTogUGFzc2tleU9wZXJhdGlvbiB7XG4gIGNvbnN0IHBhc3NrZXlOYW1lID0gbmFtZSA/PyBwYXNza2V5RGlzcGxheU5hbWUoKTtcbiAgcmV0dXJuIGJlZ2luUGFzc2tleU9wZXJhdGlvbigob3BlcmF0aW9uQ2xpZW50KSA9PlxuICAgIG9wZXJhdGlvbkNsaWVudC5wYXNza2V5LmFkZFBhc3NrZXkocGFzc2tleU5hbWUgPyB7IG5hbWU6IHBhc3NrZXlOYW1lIH0gOiB1bmRlZmluZWQpLFxuICApO1xufVxuXG4vKiogQ2FuY2VsIHRoZSBjdXJyZW50bHkgYWN0aXZlIHBhc3NrZXkgcmVxdWVzdCBhbmQgYnJvd3NlciBjZXJlbW9ueSwgaWYgYW55LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhbmNlbFBhc3NrZXlPcGVyYXRpb24oKTogdm9pZCB7XG4gIGFjdGl2ZVBhc3NrZXlPcGVyYXRpb24/LmNhbmNlbCgpO1xufVxuXG4vKiogUmVhZCB0aGUgY3VycmVudCBicm93c2VyIHNlc3Npb24gc3RhdHVzIGZyb20gdGhlIHNoYXJlZCBhdXRoIGVuZHBvaW50LiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEF1dGhTdGF0dXMoKTogUHJvbWlzZTxBdXRoU3RhdHVzPiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7QVVUSF9CQVNFX1BBVEh9L3N0YXR1c2AsIHsgY3JlZGVudGlhbHM6IFwiaW5jbHVkZVwiIH0pO1xuICBpZiAoIXJlc3BvbnNlLm9rKSB0aHJvdyBuZXcgRXJyb3IoYEF1dGggc3RhdHVzIGZhaWxlZCB3aXRoICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICByZXR1cm4gYXV0aFN0YXR1cyhhd2FpdCByZXNwb25zZS5qc29uKCkpO1xufVxuXG4vKiogRW5kIHRoZSBjdXJyZW50IGJyb3dzZXIgc2Vzc2lvbiBhbmQgZm9sbG93IHRoZSBzZXJ2ZXIncyBzYW1lLW9yaWdpbiByZWRpcmVjdC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2dvdXQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7QVVUSF9CQVNFX1BBVEh9L2xvZ291dGAsIHtcbiAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgIGNyZWRlbnRpYWxzOiBcImluY2x1ZGVcIixcbiAgfSk7XG4gIGNvbnN0IHJlc3VsdCA9IHJlY29yZChhd2FpdCByZXNwb25zZS5qc29uKCkpO1xuICBpZiAoIXJlc3BvbnNlLm9rIHx8IHJlc3VsdD8ub2sgIT09IHRydWUgfHwgdHlwZW9mIHJlc3VsdC5yZWRpcmVjdFRvICE9PSBcInN0cmluZ1wiKSByZXR1cm4gZmFsc2U7XG4gIGJyb3dzZXJMb2NhdGlvbigpPy5hc3NpZ24ocmVzdWx0LnJlZGlyZWN0VG8pO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqIFJlcXVlc3QgYW4gZW1haWwgb25lLXRpbWUgcGFzc3dvcmQgZm9yIHRoZSBzdXBwbGllZCBhZGRyZXNzLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RFbWFpbE90cChlbWFpbDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNsaWVudC5lbWFpbE90cC5zZW5kVmVyaWZpY2F0aW9uT3RwKHsgZW1haWwsIHR5cGU6IFwic2lnbi1pblwiIH0pO1xuICByZXR1cm4gcmVzdWx0LmVycm9yID09PSBudWxsO1xufVxuXG4vKiogVmVyaWZ5IGFuIGVtYWlsIG9uZS10aW1lIHBhc3N3b3JkIGFuZCBlc3RhYmxpc2ggYSBicm93c2VyIHNlc3Npb24uICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdmVyaWZ5RW1haWxPdHAoZW1haWw6IHN0cmluZywgb3RwOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBjbGllbnQuc2lnbkluLmVtYWlsT3RwKHsgZW1haWwsIG90cCwgbmFtZSB9KTtcbiAgcmV0dXJuIHJlc3VsdC5lcnJvciA9PT0gbnVsbDtcbn1cblxuLyoqIEF1dGhlbnRpY2F0ZSB3aXRoIGEgcGFzc2tleSwgb3B0aW9uYWxseSB1c2luZyBjb25kaXRpb25hbCBicm93c2VyIG1lZGlhdGlvbi4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzaWduSW5QYXNza2V5KGF1dG9GaWxsID0gZmFsc2UpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgcmV0dXJuIGJlZ2luUGFzc2tleVNpZ25JbihhdXRvRmlsbCkucmVzdWx0O1xufVxuXG4vKiogRW5yb2xsIGEgcGFzc2tleSBmb3IgdGhlIGN1cnJlbnQgYXV0aGVudGljYXRlZCBhY2NvdW50LiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFkZFBhc3NrZXkobmFtZT86IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICByZXR1cm4gYmVnaW5QYXNza2V5RW5yb2xsbWVudChuYW1lKS5yZXN1bHQ7XG59XG5cbi8qKiBMaXN0IHBhc3NrZXlzIGVucm9sbGVkIGZvciB0aGUgY3VycmVudCBhdXRoZW50aWNhdGVkIGFjY291bnQuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlzdFBhc3NrZXlzKCk6IFByb21pc2U8UGFzc2tleVtdPiB7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNsaWVudC5wYXNza2V5Lmxpc3RVc2VyUGFzc2tleXMoKTtcbiAgaWYgKHJlc3VsdC5lcnJvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihyZXN1bHQuZXJyb3IubWVzc2FnZSA/PyBgUGFzc2tleSBsaXN0aW5nIGZhaWxlZCB3aXRoICR7cmVzdWx0LmVycm9yLnN0YXR1c31gKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0LmRhdGEgPz8gW107XG59XG5cbi8qKiBSZW5hbWUgYW4gZW5yb2xsZWQgcGFzc2tleS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW5hbWVQYXNza2V5KGlkOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBjbGllbnQucGFzc2tleS51cGRhdGVQYXNza2V5KHsgaWQsIG5hbWUgfSk7XG4gIHJldHVybiByZXN1bHQuZXJyb3IgPT09IG51bGw7XG59XG5cbi8qKiBSZW1vdmUgYW4gZW5yb2xsZWQgcGFzc2tleS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW1vdmVQYXNza2V5KGlkOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnBhc3NrZXkuZGVsZXRlUGFzc2tleSh7IGlkIH0pO1xuICByZXR1cm4gcmVzdWx0LmVycm9yID09PSBudWxsO1xufVxuIl19
package/package.json CHANGED
@@ -23,7 +23,7 @@
23
23
  },
24
24
  "dependencies": {
25
25
  "@better-auth/passkey": "1.7.6",
26
- "@dbx-tools/shared-core": "^0.9.133",
26
+ "@dbx-tools/shared-core": "^0.9.138",
27
27
  "@simplewebauthn/browser": "13.3.0",
28
28
  "better-auth": "1.7.6",
29
29
  "zod": "4.3.6"
@@ -70,7 +70,7 @@
70
70
  "./package.json": "./package.json"
71
71
  }
72
72
  },
73
- "version": "0.9.133",
73
+ "version": "0.9.138",
74
74
  "types": "./lib/index.d.ts",
75
75
  "dbxToolsConfig": {
76
76
  "tags": [
package/src/auth.ts CHANGED
@@ -8,6 +8,7 @@
8
8
  * @module
9
9
  */
10
10
 
11
+ import { stringUtils } from "@dbx-tools/shared-core";
11
12
  import { z } from "zod";
12
13
 
13
14
  import { AUTH_BASE_PATH } from "./_route.ts";
@@ -28,6 +29,25 @@ export function isAuthPath(path: string): boolean {
28
29
  /** Shared Better Auth session-cookie name used by browser and server packages. */
29
30
  export const SESSION_COOKIE_NAME = "dbx-tools-auth";
30
31
 
32
+ /**
33
+ * Build a passkey display name from an optional prefix and the humanized first
34
+ * hostname label. For example, `DBX Tools` and `demo.apps.example.com` produce
35
+ * `DBX Tools Demo`.
36
+ */
37
+ export function passkeyDisplayName(
38
+ prefix: string | undefined,
39
+ hostname: string,
40
+ ): string | undefined {
41
+ const normalizedPrefix = stringUtils.trimToNull(prefix);
42
+ const subdomain = stringUtils.trimToNull(hostname)?.split(".", 1)[0];
43
+ const suffix = subdomain ? stringUtils.toLabel(subdomain) : undefined;
44
+ if (!normalizedPrefix) return suffix;
45
+ if (!suffix || normalizedPrefix.toLowerCase().endsWith(suffix.toLowerCase())) {
46
+ return normalizedPrefix;
47
+ }
48
+ return `${normalizedPrefix} ${suffix}`;
49
+ }
50
+
31
51
  export const authRequestSchema = z
32
52
  .object({
33
53
  email: z.string().describe("Address to email a one-time code to, if it is authorized."),
@@ -78,6 +98,10 @@ export const authStatusSchema = z
78
98
  email: z.string().optional().describe("Signed-in address when a session exists."),
79
99
  enabled: z.boolean().describe("True when the passwordless gate is configured."),
80
100
  passkeysEnabled: z.boolean().optional().describe("True when WebAuthn passkeys are available."),
101
+ passkeyNamePrefix: z
102
+ .string()
103
+ .optional()
104
+ .describe("Configured prefix for humanized passkey display names."),
81
105
  })
82
106
  .describe("Gate availability, session identity, and optional passkey capability.");
83
107
 
package/src/browser.ts CHANGED
@@ -14,12 +14,13 @@ import { createAuthClient } from "better-auth/client";
14
14
  import { emailOTPClient } from "better-auth/client/plugins";
15
15
 
16
16
  import { AUTH_BASE_PATH } from "./_route.ts";
17
- import type { AuthStatus } from "./auth.ts";
17
+ import { type AuthStatus, passkeyDisplayName as formatPasskeyDisplayName } from "./auth.ts";
18
18
 
19
19
  export { AUTH_BASE_PATH } from "./_route.ts";
20
20
  export type { Passkey } from "@better-auth/passkey/client";
21
21
 
22
22
  interface BrowserLocation {
23
+ readonly hostname: string;
23
24
  readonly origin: string;
24
25
  assign(url: string): void;
25
26
  }
@@ -56,7 +57,8 @@ function authStatus(value: unknown): AuthStatus {
56
57
  typeof item.authenticated !== "boolean" ||
57
58
  typeof item.enabled !== "boolean" ||
58
59
  (item.email !== undefined && typeof item.email !== "string") ||
59
- (item.passkeysEnabled !== undefined && typeof item.passkeysEnabled !== "boolean")
60
+ (item.passkeysEnabled !== undefined && typeof item.passkeysEnabled !== "boolean") ||
61
+ (item.passkeyNamePrefix !== undefined && typeof item.passkeyNamePrefix !== "string")
60
62
  ) {
61
63
  throw new Error("Auth status returned an invalid response");
62
64
  }
@@ -65,6 +67,9 @@ function authStatus(value: unknown): AuthStatus {
65
67
  enabled: item.enabled,
66
68
  ...(typeof item.email === "string" ? { email: item.email } : {}),
67
69
  ...(typeof item.passkeysEnabled === "boolean" ? { passkeysEnabled: item.passkeysEnabled } : {}),
70
+ ...(typeof item.passkeyNamePrefix === "string"
71
+ ? { passkeyNamePrefix: item.passkeyNamePrefix }
72
+ : {}),
68
73
  };
69
74
  }
70
75
 
@@ -120,10 +125,19 @@ export function beginPasskeySignIn(autoFill = false): PasskeyOperation {
120
125
  return beginPasskeyOperation((operationClient) => operationClient.signIn.passkey({ autoFill }));
121
126
  }
122
127
 
123
- /** Start a passkey registration whose lifetime is explicitly owned by the caller. */
128
+ /** Build a passkey display name for the current browser hostname. */
129
+ export function passkeyDisplayName(prefix?: string): string | undefined {
130
+ return formatPasskeyDisplayName(prefix, browserLocation()?.hostname ?? "");
131
+ }
132
+
133
+ /**
134
+ * Start a passkey registration whose lifetime is explicitly owned by the caller.
135
+ * The display name defaults to the humanized browser subdomain.
136
+ */
124
137
  export function beginPasskeyEnrollment(name?: string): PasskeyOperation {
138
+ const passkeyName = name ?? passkeyDisplayName();
125
139
  return beginPasskeyOperation((operationClient) =>
126
- operationClient.passkey.addPasskey(name ? { name } : undefined),
140
+ operationClient.passkey.addPasskey(passkeyName ? { name: passkeyName } : undefined),
127
141
  );
128
142
  }
129
143