@dbx-tools/email 0.9.153 → 0.9.157
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 +8 -8
- package/lib/index.d.ts +8 -8
- package/lib/index.js +9 -9
- package/lib/src/config.d.ts +1 -1
- package/lib/src/config.js +19 -21
- package/lib/src/email-html.d.ts +0 -3
- package/lib/src/email-html.js +1 -4
- package/lib/src/markdown.d.ts +0 -2
- package/lib/src/markdown.js +2 -4
- package/lib/src/outbox.d.ts +2 -2
- package/lib/src/outbox.js +3 -3
- package/lib/src/plugin.js +10 -10
- package/lib/src/sender.js +7 -7
- package/lib/src/tool.d.ts +2 -2
- package/lib/src/tool.js +7 -7
- package/lib/src/transport.js +5 -5
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -96
- package/src/config.ts +18 -27
- package/src/email-html.ts +0 -4
- package/src/markdown.ts +1 -4
- package/src/outbox.ts +4 -4
- package/src/plugin.ts +9 -10
- package/src/sender.ts +6 -6
- package/src/tool.ts +12 -7
- package/src/transport.ts +5 -5
- package/exports.ts +0 -2
- package/lib/exports.d.ts +0 -2
- package/lib/exports.js +0 -3
- package/lib/src/brand.d.ts +0 -10
- package/lib/src/brand.js +0 -10
- package/src/brand.ts +0 -14
package/index.ts
CHANGED
|
@@ -3,8 +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/email";
|
|
6
|
-
export const PACKAGE_VERSION = "0.9.
|
|
7
|
-
export * as brand from "./src/brand.ts";
|
|
6
|
+
export const PACKAGE_VERSION = "0.9.157";
|
|
8
7
|
export * as config from "./src/config.ts";
|
|
9
8
|
export * as defaults from "./src/defaults.ts";
|
|
10
9
|
export * as emailHtml from "./src/email-html.ts";
|
|
@@ -14,16 +13,17 @@ export * as plugin from "./src/plugin.ts";
|
|
|
14
13
|
export * as sender from "./src/sender.ts";
|
|
15
14
|
export * as tool from "./src/tool.ts";
|
|
16
15
|
export * as transport from "./src/transport.ts";
|
|
17
|
-
export { DEFAULT_SMTP_PORT, IMPLICIT_TLS_SMTP_PORT, EMAIL_CONFIG_SCHEMA } from "./src/config.ts";
|
|
16
|
+
export { DEFAULT_SMTP_PORT, IMPLICIT_TLS_SMTP_PORT, EMAIL_CONFIG_SCHEMA, resolveEmailConfig } from "./src/config.ts";
|
|
18
17
|
export type { SenderPolicy, SmtpConfig, EmailPluginConfig, ResolvedSender, ResolvedSmtpConfig, ResolvedFileConfig, ResolvedEmailConfig } from "./src/config.ts";
|
|
19
18
|
export { SEND_TIMEOUT_MS, VERIFY_TIMEOUT_MS, VERIFY_ATTEMPTS, MAX_ATTACHMENT_BYTES, MAX_ATTACHMENTS_TOTAL_BYTES, MAX_ATTACHMENT_COUNT, MAX_BODY_CHARS, EMAIL_SEND_SETTINGS, EMAIL_VERIFY_SETTINGS, EMAIL_SENDERS_SETTINGS } from "./src/defaults.ts";
|
|
20
19
|
export type { EmailExecuteConfig, EmailExecutionSettings } from "./src/defaults.ts";
|
|
21
|
-
export {
|
|
20
|
+
export { renderEmailHtml, renderEmailText, renderEmail } from "./src/email-html.ts";
|
|
22
21
|
export type { EmailHtmlOptions } from "./src/email-html.ts";
|
|
23
|
-
export {
|
|
22
|
+
export { markdownToHtml } from "./src/markdown.ts";
|
|
23
|
+
export { writeOutboxEmail } from "./src/outbox.ts";
|
|
24
24
|
export { EmailPlugin, email } from "./src/plugin.ts";
|
|
25
|
-
export { SYSTEM_SENDER_LOCAL_PART } from "./src/sender.ts";
|
|
26
|
-
export { SEND_EMAIL_DESCRIPTION } from "./src/tool.ts";
|
|
25
|
+
export { deriveSenderAddress, parseAllowedSenders, isSenderAllowed, assertSenderAllowed, SYSTEM_SENDER_LOCAL_PART, systemSenderAddress, resolveSystemSenderAddress, resolveSenderAddress, listSenderOptions } from "./src/sender.ts";
|
|
26
|
+
export { SEND_EMAIL_DESCRIPTION, emailTool } from "./src/tool.ts";
|
|
27
27
|
export type { EmailToolOptions } from "./src/tool.ts";
|
|
28
|
+
export { getEmailRuntime, setEmailExecutor, resetEmailRuntime, executeWrite, verifyEmailTransport, sendEmail } from "./src/transport.ts";
|
|
28
29
|
export type { EmailExecutor, EmailRuntime, SendEmailOptions } from "./src/transport.ts";
|
|
29
|
-
export * from "./exports.ts";
|
package/lib/index.d.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
export declare const PACKAGE_IDENTIFIER = "@dbx-tools/email";
|
|
2
|
-
export declare const PACKAGE_VERSION = "0.9.
|
|
3
|
-
export * as brand from "./src/brand.ts";
|
|
2
|
+
export declare const PACKAGE_VERSION = "0.9.157";
|
|
4
3
|
export * as config from "./src/config.ts";
|
|
5
4
|
export * as defaults from "./src/defaults.ts";
|
|
6
5
|
export * as emailHtml from "./src/email-html.ts";
|
|
@@ -10,16 +9,17 @@ export * as plugin from "./src/plugin.ts";
|
|
|
10
9
|
export * as sender from "./src/sender.ts";
|
|
11
10
|
export * as tool from "./src/tool.ts";
|
|
12
11
|
export * as transport from "./src/transport.ts";
|
|
13
|
-
export { DEFAULT_SMTP_PORT, IMPLICIT_TLS_SMTP_PORT, EMAIL_CONFIG_SCHEMA } from "./src/config.ts";
|
|
12
|
+
export { DEFAULT_SMTP_PORT, IMPLICIT_TLS_SMTP_PORT, EMAIL_CONFIG_SCHEMA, resolveEmailConfig } from "./src/config.ts";
|
|
14
13
|
export type { SenderPolicy, SmtpConfig, EmailPluginConfig, ResolvedSender, ResolvedSmtpConfig, ResolvedFileConfig, ResolvedEmailConfig } from "./src/config.ts";
|
|
15
14
|
export { SEND_TIMEOUT_MS, VERIFY_TIMEOUT_MS, VERIFY_ATTEMPTS, MAX_ATTACHMENT_BYTES, MAX_ATTACHMENTS_TOTAL_BYTES, MAX_ATTACHMENT_COUNT, MAX_BODY_CHARS, EMAIL_SEND_SETTINGS, EMAIL_VERIFY_SETTINGS, EMAIL_SENDERS_SETTINGS } from "./src/defaults.ts";
|
|
16
15
|
export type { EmailExecuteConfig, EmailExecutionSettings } from "./src/defaults.ts";
|
|
17
|
-
export {
|
|
16
|
+
export { renderEmailHtml, renderEmailText, renderEmail } from "./src/email-html.ts";
|
|
18
17
|
export type { EmailHtmlOptions } from "./src/email-html.ts";
|
|
19
|
-
export {
|
|
18
|
+
export { markdownToHtml } from "./src/markdown.ts";
|
|
19
|
+
export { writeOutboxEmail } from "./src/outbox.ts";
|
|
20
20
|
export { EmailPlugin, email } from "./src/plugin.ts";
|
|
21
|
-
export { SYSTEM_SENDER_LOCAL_PART } from "./src/sender.ts";
|
|
22
|
-
export { SEND_EMAIL_DESCRIPTION } from "./src/tool.ts";
|
|
21
|
+
export { deriveSenderAddress, parseAllowedSenders, isSenderAllowed, assertSenderAllowed, SYSTEM_SENDER_LOCAL_PART, systemSenderAddress, resolveSystemSenderAddress, resolveSenderAddress, listSenderOptions } from "./src/sender.ts";
|
|
22
|
+
export { SEND_EMAIL_DESCRIPTION, emailTool } from "./src/tool.ts";
|
|
23
23
|
export type { EmailToolOptions } from "./src/tool.ts";
|
|
24
|
+
export { getEmailRuntime, setEmailExecutor, resetEmailRuntime, executeWrite, verifyEmailTransport, sendEmail } from "./src/transport.ts";
|
|
24
25
|
export type { EmailExecutor, EmailRuntime, SendEmailOptions } from "./src/transport.ts";
|
|
25
|
-
export * from "./exports.ts";
|
package/lib/index.js
CHANGED
|
@@ -2,8 +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/email";
|
|
5
|
-
export const PACKAGE_VERSION = "0.9.
|
|
6
|
-
export * as brand from "./src/brand.js";
|
|
5
|
+
export const PACKAGE_VERSION = "0.9.157";
|
|
7
6
|
export * as config from "./src/config.js";
|
|
8
7
|
export * as defaults from "./src/defaults.js";
|
|
9
8
|
export * as emailHtml from "./src/email-html.js";
|
|
@@ -13,12 +12,13 @@ export * as plugin from "./src/plugin.js";
|
|
|
13
12
|
export * as sender from "./src/sender.js";
|
|
14
13
|
export * as tool from "./src/tool.js";
|
|
15
14
|
export * as transport from "./src/transport.js";
|
|
16
|
-
export { DEFAULT_SMTP_PORT, IMPLICIT_TLS_SMTP_PORT, EMAIL_CONFIG_SCHEMA } from "./src/config.js";
|
|
15
|
+
export { DEFAULT_SMTP_PORT, IMPLICIT_TLS_SMTP_PORT, EMAIL_CONFIG_SCHEMA, resolveEmailConfig } from "./src/config.js";
|
|
17
16
|
export { SEND_TIMEOUT_MS, VERIFY_TIMEOUT_MS, VERIFY_ATTEMPTS, MAX_ATTACHMENT_BYTES, MAX_ATTACHMENTS_TOTAL_BYTES, MAX_ATTACHMENT_COUNT, MAX_BODY_CHARS, EMAIL_SEND_SETTINGS, EMAIL_VERIFY_SETTINGS, EMAIL_SENDERS_SETTINGS } from "./src/defaults.js";
|
|
18
|
-
export {
|
|
19
|
-
export {
|
|
17
|
+
export { renderEmailHtml, renderEmailText, renderEmail } from "./src/email-html.js";
|
|
18
|
+
export { markdownToHtml } from "./src/markdown.js";
|
|
19
|
+
export { writeOutboxEmail } from "./src/outbox.js";
|
|
20
20
|
export { EmailPlugin, email } from "./src/plugin.js";
|
|
21
|
-
export { SYSTEM_SENDER_LOCAL_PART } from "./src/sender.js";
|
|
22
|
-
export { SEND_EMAIL_DESCRIPTION } from "./src/tool.js";
|
|
23
|
-
export
|
|
24
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
21
|
+
export { deriveSenderAddress, parseAllowedSenders, isSenderAllowed, assertSenderAllowed, SYSTEM_SENDER_LOCAL_PART, systemSenderAddress, resolveSystemSenderAddress, resolveSenderAddress, listSenderOptions } from "./src/sender.js";
|
|
22
|
+
export { SEND_EMAIL_DESCRIPTION, emailTool } from "./src/tool.js";
|
|
23
|
+
export { getEmailRuntime, setEmailExecutor, resetEmailRuntime, executeWrite, verifyEmailTransport, sendEmail } from "./src/transport.js";
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQztBQUNyRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEtBQUssU0FBUyxNQUFNLHFCQUFxQixDQUFDO0FBQ2pELE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLElBQUksTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxLQUFLLFNBQVMsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsc0JBQXNCLEVBQUUsbUJBQW1CLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVySCxPQUFPLEVBQUUsZUFBZSxFQUFFLGlCQUFpQixFQUFFLGVBQWUsRUFBRSxvQkFBb0IsRUFBRSwyQkFBMkIsRUFBRSxvQkFBb0IsRUFBRSxjQUFjLEVBQUUsbUJBQW1CLEVBQUUscUJBQXFCLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVyUCxPQUFPLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxXQUFXLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVwRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLG1CQUFtQixFQUFFLHdCQUF3QixFQUFFLG1CQUFtQixFQUFFLDBCQUEwQixFQUFFLG9CQUFvQixFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDck8sT0FBTyxFQUFFLHNCQUFzQixFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVsRSxPQUFPLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX0lERU5USUZJRVIgPSBcIkBkYngtdG9vbHMvZW1haWxcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX1ZFUlNJT04gPSBcIjAuOS4xNTdcIjtcbmV4cG9ydCAqIGFzIGNvbmZpZyBmcm9tIFwiLi9zcmMvY29uZmlnLnRzXCI7XG5leHBvcnQgKiBhcyBkZWZhdWx0cyBmcm9tIFwiLi9zcmMvZGVmYXVsdHMudHNcIjtcbmV4cG9ydCAqIGFzIGVtYWlsSHRtbCBmcm9tIFwiLi9zcmMvZW1haWwtaHRtbC50c1wiO1xuZXhwb3J0ICogYXMgbWFya2Rvd24gZnJvbSBcIi4vc3JjL21hcmtkb3duLnRzXCI7XG5leHBvcnQgKiBhcyBvdXRib3ggZnJvbSBcIi4vc3JjL291dGJveC50c1wiO1xuZXhwb3J0ICogYXMgcGx1Z2luIGZyb20gXCIuL3NyYy9wbHVnaW4udHNcIjtcbmV4cG9ydCAqIGFzIHNlbmRlciBmcm9tIFwiLi9zcmMvc2VuZGVyLnRzXCI7XG5leHBvcnQgKiBhcyB0b29sIGZyb20gXCIuL3NyYy90b29sLnRzXCI7XG5leHBvcnQgKiBhcyB0cmFuc3BvcnQgZnJvbSBcIi4vc3JjL3RyYW5zcG9ydC50c1wiO1xuZXhwb3J0IHsgREVGQVVMVF9TTVRQX1BPUlQsIElNUExJQ0lUX1RMU19TTVRQX1BPUlQsIEVNQUlMX0NPTkZJR19TQ0hFTUEsIHJlc29sdmVFbWFpbENvbmZpZyB9IGZyb20gXCIuL3NyYy9jb25maWcudHNcIjtcbmV4cG9ydCB0eXBlIHsgU2VuZGVyUG9saWN5LCBTbXRwQ29uZmlnLCBFbWFpbFBsdWdpbkNvbmZpZywgUmVzb2x2ZWRTZW5kZXIsIFJlc29sdmVkU210cENvbmZpZywgUmVzb2x2ZWRGaWxlQ29uZmlnLCBSZXNvbHZlZEVtYWlsQ29uZmlnIH0gZnJvbSBcIi4vc3JjL2NvbmZpZy50c1wiO1xuZXhwb3J0IHsgU0VORF9USU1FT1VUX01TLCBWRVJJRllfVElNRU9VVF9NUywgVkVSSUZZX0FUVEVNUFRTLCBNQVhfQVRUQUNITUVOVF9CWVRFUywgTUFYX0FUVEFDSE1FTlRTX1RPVEFMX0JZVEVTLCBNQVhfQVRUQUNITUVOVF9DT1VOVCwgTUFYX0JPRFlfQ0hBUlMsIEVNQUlMX1NFTkRfU0VUVElOR1MsIEVNQUlMX1ZFUklGWV9TRVRUSU5HUywgRU1BSUxfU0VOREVSU19TRVRUSU5HUyB9IGZyb20gXCIuL3NyYy9kZWZhdWx0cy50c1wiO1xuZXhwb3J0IHR5cGUgeyBFbWFpbEV4ZWN1dGVDb25maWcsIEVtYWlsRXhlY3V0aW9uU2V0dGluZ3MgfSBmcm9tIFwiLi9zcmMvZGVmYXVsdHMudHNcIjtcbmV4cG9ydCB7IHJlbmRlckVtYWlsSHRtbCwgcmVuZGVyRW1haWxUZXh0LCByZW5kZXJFbWFpbCB9IGZyb20gXCIuL3NyYy9lbWFpbC1odG1sLnRzXCI7XG5leHBvcnQgdHlwZSB7IEVtYWlsSHRtbE9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvZW1haWwtaHRtbC50c1wiO1xuZXhwb3J0IHsgbWFya2Rvd25Ub0h0bWwgfSBmcm9tIFwiLi9zcmMvbWFya2Rvd24udHNcIjtcbmV4cG9ydCB7IHdyaXRlT3V0Ym94RW1haWwgfSBmcm9tIFwiLi9zcmMvb3V0Ym94LnRzXCI7XG5leHBvcnQgeyBFbWFpbFBsdWdpbiwgZW1haWwgfSBmcm9tIFwiLi9zcmMvcGx1Z2luLnRzXCI7XG5leHBvcnQgeyBkZXJpdmVTZW5kZXJBZGRyZXNzLCBwYXJzZUFsbG93ZWRTZW5kZXJzLCBpc1NlbmRlckFsbG93ZWQsIGFzc2VydFNlbmRlckFsbG93ZWQsIFNZU1RFTV9TRU5ERVJfTE9DQUxfUEFSVCwgc3lzdGVtU2VuZGVyQWRkcmVzcywgcmVzb2x2ZVN5c3RlbVNlbmRlckFkZHJlc3MsIHJlc29sdmVTZW5kZXJBZGRyZXNzLCBsaXN0U2VuZGVyT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9zZW5kZXIudHNcIjtcbmV4cG9ydCB7IFNFTkRfRU1BSUxfREVTQ1JJUFRJT04sIGVtYWlsVG9vbCB9IGZyb20gXCIuL3NyYy90b29sLnRzXCI7XG5leHBvcnQgdHlwZSB7IEVtYWlsVG9vbE9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvdG9vbC50c1wiO1xuZXhwb3J0IHsgZ2V0RW1haWxSdW50aW1lLCBzZXRFbWFpbEV4ZWN1dG9yLCByZXNldEVtYWlsUnVudGltZSwgZXhlY3V0ZVdyaXRlLCB2ZXJpZnlFbWFpbFRyYW5zcG9ydCwgc2VuZEVtYWlsIH0gZnJvbSBcIi4vc3JjL3RyYW5zcG9ydC50c1wiO1xuZXhwb3J0IHR5cGUgeyBFbWFpbEV4ZWN1dG9yLCBFbWFpbFJ1bnRpbWUsIFNlbmRFbWFpbE9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvdHJhbnNwb3J0LnRzXCI7XG4iXX0=
|
package/lib/src/config.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type BasePluginConfig } from "@databricks/appkit";
|
|
2
|
+
import { type EmailBrand } from "@dbx-tools/shared-email-template";
|
|
2
3
|
import type { JSONSchema7 } from "json-schema";
|
|
3
|
-
import { type EmailBrand } from "./brand.ts";
|
|
4
4
|
/** SMTP submission port used when none is configured. */
|
|
5
5
|
export declare const DEFAULT_SMTP_PORT = 587;
|
|
6
6
|
/** SMTP port that implies a TLS-on-connect socket rather than STARTTLS. */
|
package/lib/src/config.js
CHANGED
|
@@ -26,9 +26,9 @@
|
|
|
26
26
|
*/
|
|
27
27
|
import { resolve } from "node:path";
|
|
28
28
|
import { ConfigurationError, ValidationError } from "@databricks/appkit";
|
|
29
|
-
import { configUtils } from "@dbx-tools/core";
|
|
30
|
-
import {
|
|
31
|
-
import { defaultEmailBrand } from "
|
|
29
|
+
import { configUtils, boolean, ENV_ONLY, text, string } from "@dbx-tools/core";
|
|
30
|
+
import { optional } from "@dbx-tools/shared-core";
|
|
31
|
+
import { defaultEmailBrand } from "@dbx-tools/shared-email-template";
|
|
32
32
|
import { isSenderAllowed, parseAllowedSenders, systemSenderAddress } from "./sender.js";
|
|
33
33
|
/** SMTP submission port used when none is configured. */
|
|
34
34
|
export const DEFAULT_SMTP_PORT = 587;
|
|
@@ -122,12 +122,11 @@ export const EMAIL_CONFIG_SCHEMA = {
|
|
|
122
122
|
};
|
|
123
123
|
/** Parse the `SMTP_SECURE` env / config flag, defaulting by port. */
|
|
124
124
|
function resolveSecure(flag, port) {
|
|
125
|
-
return
|
|
126
|
-
port === IMPLICIT_TLS_SMTP_PORT);
|
|
125
|
+
return boolean(flag, "SMTP_SECURE", ENV_ONLY) ?? port === IMPLICIT_TLS_SMTP_PORT;
|
|
127
126
|
}
|
|
128
127
|
/** Parse the `EMAIL_SENDER_POLICY` env / config value, defaulting to deny-by-default. */
|
|
129
128
|
function resolveSenderPolicy(policy) {
|
|
130
|
-
const raw = policy ??
|
|
129
|
+
const raw = policy ?? text("EMAIL_SENDER_POLICY", ENV_ONLY)?.toLowerCase();
|
|
131
130
|
if (raw === "unrestricted")
|
|
132
131
|
return "unrestricted";
|
|
133
132
|
if (raw === undefined || raw === "" || raw === "allowlist")
|
|
@@ -159,7 +158,7 @@ function impliedSenderPatterns(sender) {
|
|
|
159
158
|
}
|
|
160
159
|
/** Whether `EMAIL_OUTBOX_MODE` explicitly opts into the file/outbox fallback. */
|
|
161
160
|
function isOutboxModeEnabled() {
|
|
162
|
-
return
|
|
161
|
+
return boolean(undefined, "EMAIL_OUTBOX_MODE", ENV_ONLY) ?? false;
|
|
163
162
|
}
|
|
164
163
|
const SMTP_REQUIRED_FIELDS = ["SMTP_HOST", "SMTP_USER", "SMTP_PASSWORD"];
|
|
165
164
|
/** List env keys for SMTP fields that are unset in the resolved credential set. */
|
|
@@ -188,21 +187,21 @@ function missingSmtpFields(host, user, pass) {
|
|
|
188
187
|
*/
|
|
189
188
|
export function resolveEmailConfig(config = {}) {
|
|
190
189
|
const smtp = config.smtp ?? {};
|
|
191
|
-
const host =
|
|
192
|
-
const user =
|
|
193
|
-
const pass =
|
|
194
|
-
const domain =
|
|
195
|
-
const from =
|
|
196
|
-
const systemFrom =
|
|
190
|
+
const host = string(smtp.host, "SMTP_HOST", ENV_ONLY);
|
|
191
|
+
const user = string(smtp.user, "SMTP_USER", ENV_ONLY);
|
|
192
|
+
const pass = string(smtp.password, "SMTP_PASSWORD", ENV_ONLY);
|
|
193
|
+
const domain = string(config.domain, "EMAIL_DOMAIN", ENV_ONLY);
|
|
194
|
+
const from = string(config.from, "EMAIL_FROM", ENV_ONLY);
|
|
195
|
+
const systemFrom = string(config.systemFrom, "EMAIL_SYSTEM_FROM", ENV_ONLY);
|
|
197
196
|
const senderPolicy = resolveSenderPolicy(config.senderPolicy);
|
|
198
|
-
const configuredSenders = parseAllowedSenders(config.allowedSenders ??
|
|
197
|
+
const configuredSenders = parseAllowedSenders(config.allowedSenders ?? text("EMAIL_ALLOWED_SENDERS", ENV_ONLY));
|
|
199
198
|
const allowedSenders = configuredSenders.length > 0 || senderPolicy === "unrestricted"
|
|
200
199
|
? configuredSenders
|
|
201
200
|
: impliedSenderPatterns({ domain, from, systemFrom });
|
|
202
201
|
const sender = {
|
|
203
|
-
...
|
|
204
|
-
...
|
|
205
|
-
...
|
|
202
|
+
...optional("domain", domain),
|
|
203
|
+
...optional("from", from),
|
|
204
|
+
...optional("systemFrom", systemFrom),
|
|
206
205
|
allowedSenders,
|
|
207
206
|
senderPolicy,
|
|
208
207
|
brand: config.brand ?? defaultEmailBrand,
|
|
@@ -216,7 +215,7 @@ export function resolveEmailConfig(config = {}) {
|
|
|
216
215
|
if (!domain && !from && !systemFrom) {
|
|
217
216
|
throw ConfigurationError.resourceNotFound("Email sender source", "Set EMAIL_DOMAIN to derive <user-local-part>@<domain> (and no-reply@<domain> for system mail), or EMAIL_FROM for a fixed address.");
|
|
218
217
|
}
|
|
219
|
-
const port = configUtils.port(smtp.port, "SMTP_PORT", DEFAULT_SMTP_PORT,
|
|
218
|
+
const port = configUtils.port(smtp.port, "SMTP_PORT", DEFAULT_SMTP_PORT, ENV_ONLY);
|
|
220
219
|
return {
|
|
221
220
|
mode: "smtp",
|
|
222
221
|
host: host,
|
|
@@ -229,8 +228,7 @@ export function resolveEmailConfig(config = {}) {
|
|
|
229
228
|
if (!isOutboxModeEnabled()) {
|
|
230
229
|
throw ConfigurationError.invalidConnection("SMTP", `Set ${SMTP_REQUIRED_FIELDS.join(", ")}, or EMAIL_OUTBOX_MODE=1 to write messages to a local outbox instead.`);
|
|
231
230
|
}
|
|
232
|
-
const outDir = resolve(
|
|
233
|
-
resolve(process.cwd(), "tmp"));
|
|
231
|
+
const outDir = resolve(string(config.outDir, "EMAIL_OUTBOX_DIR", ENV_ONLY) ?? resolve(process.cwd(), "tmp"));
|
|
234
232
|
return { mode: "file", outDir, ...sender };
|
|
235
233
|
}
|
|
236
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlCRztBQUNILE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDcEMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGVBQWUsRUFBeUIsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDOUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRWhELE9BQU8sRUFBRSxpQkFBaUIsRUFBbUIsTUFBTSxZQUFZLENBQUM7QUFDaEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUV4Rix5REFBeUQ7QUFDekQsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsR0FBRyxDQUFDO0FBRXJDLDJFQUEyRTtBQUMzRSxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxHQUFHLENBQUM7QUEwSTFDLCtEQUErRDtBQUMvRCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBZ0I7SUFDOUMsSUFBSSxFQUFFLFFBQVE7SUFDZCxVQUFVLEVBQUU7UUFDVixJQUFJLEVBQUU7WUFDSixJQUFJLEVBQUUsUUFBUTtZQUNkLFdBQVcsRUFBRSwwREFBMEQ7WUFDdkUsVUFBVSxFQUFFO2dCQUNWLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLG1DQUFtQyxFQUFFO2dCQUMxRSxJQUFJLEVBQUU7b0JBQ0osSUFBSSxFQUFFLFFBQVE7b0JBQ2QsV0FBVyxFQUFFLDZDQUE2QyxpQkFBaUIsR0FBRztpQkFDL0U7Z0JBQ0QsTUFBTSxFQUFFO29CQUNOLElBQUksRUFBRSxTQUFTO29CQUNmLFdBQVcsRUFBRSw2REFB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QztJQUNGLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLE1BQU0sRUFBRSxDQUFDO0FBQzdDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNNVFAgY29uZmlndXJhdGlvbiBmb3IgdGhlIGVtYWlsIHBsdWdpbjogdGhlIHR5cGVkXG4gKiB7QGxpbmsgRW1haWxQbHVnaW5Db25maWd9ICh0aGUgcGx1Z2luJ3Mgc2xpY2Ugb2YgQXBwS2l0IGNvbmZpZyksIHRoZVxuICogSlNPTiBTY2hlbWEgdGhlIG1hbmlmZXN0IHB1Ymxpc2hlcyBmb3IgaXQsIGFuZCB7QGxpbmsgcmVzb2x2ZUVtYWlsQ29uZmlnfVxuICogd2hpY2ggbGF5ZXJzIHRoYXQgY29uZmlnIG92ZXIgZW52aXJvbm1lbnQgZGVmYXVsdHMgaW50byB0aGUgY29uY3JldGVcbiAqIHtAbGluayBSZXNvbHZlZEVtYWlsQ29uZmlnfSB0aGUgcnVudGltZSBuZWVkcy5cbiAqXG4gKiBUd28gbW9kZXMgZmFsbCBvdXQgb2YgdGhlIHJlc29sdXRpb24uIFdoZW4gU01UUCBjcmVkZW50aWFscyAoaG9zdCArXG4gKiB1c2VyICsgcGFzc3dvcmQpIGFyZSBhbGwgcHJlc2VudCBpdCByZXNvbHZlcyB0byBgbW9kZTogXCJzbXRwXCJgIGFuZFxuICogbWFpbCBpcyBzZW50IGZvciByZWFsLiBXaGVuIHRoZXkgYXJlIGFic2VudCBhbmQgYEVNQUlMX09VVEJPWF9NT0RFYFxuICogaXMgZXhwbGljaXRseSBlbmFibGVkIGl0IHJlc29sdmVzIHRvIGBtb2RlOiBcImZpbGVcImAgKGFuIFwib3V0Ym94XCIpXG4gKiBhbmQgZWFjaCBtZXNzYWdlIGlzIHdyaXR0ZW4gdG8gZGlzayBhcyBIVE1MIGluc3RlYWQgb2Ygc2VudC4gQW55XG4gKiBwYXJ0aWFsIFNNVFAgY29uZmlndXJhdGlvbiBvciBhIHNlbmQgYXR0ZW1wdCB3aXRoIG5vIGNyZWRlbnRpYWxzIGFuZFxuICogbm8gb3V0Ym94IG9wdC1pbiB0aHJvd3MuXG4gKlxuICogUHJlY2VkZW5jZSBwZXIgZmllbGQ6IGV4cGxpY2l0IHBsdWdpbiBjb25maWcgd2lucywgdGhlbiB0aGUgbWF0Y2hpbmdcbiAqIGVudmlyb25tZW50IHZhcmlhYmxlLiBFbnYgbmFtZXMgYXJlIHVucHJlZml4ZWQgYmVjYXVzZSB0aGUgYXBwIHRhbGtzXG4gKiB0byBhIHNpbmdsZSBTTVRQIHNlcnZlciAoZS5nLiBTTVRQMkdPKTogYFNNVFBfSE9TVGAsIGBTTVRQX1BPUlRgLFxuICogYFNNVFBfU0VDVVJFYCwgYFNNVFBfVVNFUmAsIGBTTVRQX1BBU1NXT1JEYCwgcGx1cyBgRU1BSUxfRE9NQUlOYCBmb3JcbiAqIHRoZSBkZXJpdmVkIHNlbmRlcidzIGRvbWFpbiwgYEVNQUlMX0ZST01gIGZvciBhbiBleHBsaWNpdCBvdmVycmlkZSxcbiAqIGBFTUFJTF9TWVNURU1fRlJPTWAgZm9yIHRoZSBkby1ub3QtcmVwbHkgYWRkcmVzcyBzeXN0ZW0gbWFpbCBzZW5kcyBmcm9tLFxuICogYEVNQUlMX1NFTkRFUl9QT0xJQ1lgIGZvciB0aGUgc2VuZGVyIHJlc3RyaWN0aW9uIG1vZGUsIGFuZFxuICogYEVNQUlMX09VVEJPWF9ESVJgIGZvciB0aGUgb3V0Ym94IGRpcmVjdG9yeS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cbmltcG9ydCB7IHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBDb25maWd1cmF0aW9uRXJyb3IsIFZhbGlkYXRpb25FcnJvciwgdHlwZSBCYXNlUGx1Z2luQ29uZmlnIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgY29uZmlnVXRpbHMgfSBmcm9tIFwiQGRieC10b29scy9jb3JlXCI7XG5pbXBvcnQgeyBvYmplY3QgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBKU09OU2NoZW1hNyB9IGZyb20gXCJqc29uLXNjaGVtYVwiO1xuaW1wb3J0IHsgZGVmYXVsdEVtYWlsQnJhbmQsIHR5cGUgRW1haWxCcmFuZCB9IGZyb20gXCIuL2JyYW5kLnRzXCI7XG5pbXBvcnQgeyBpc1NlbmRlckFsbG93ZWQsIHBhcnNlQWxsb3dlZFNlbmRlcnMsIHN5c3RlbVNlbmRlckFkZHJlc3MgfSBmcm9tIFwiLi9zZW5kZXIudHNcIjtcblxuLyoqIFNNVFAgc3VibWlzc2lvbiBwb3J0IHVzZWQgd2hlbiBub25lIGlzIGNvbmZpZ3VyZWQuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9TTVRQX1BPUlQgPSA1ODc7XG5cbi8qKiBTTVRQIHBvcnQgdGhhdCBpbXBsaWVzIGEgVExTLW9uLWNvbm5lY3Qgc29ja2V0IHJhdGhlciB0aGFuIFNUQVJUVExTLiAqL1xuZXhwb3J0IGNvbnN0IElNUExJQ0lUX1RMU19TTVRQX1BPUlQgPSA0NjU7XG5cbi8qKlxuICogSG93IHRoZSBzZW5kZXIgKGBGcm9tYCkgYWRkcmVzcyBpcyByZXN0cmljdGVkLlxuICpcbiAqIGBcImFsbG93bGlzdFwiYCBpcyB0aGUgZGVmYXVsdCBhbmQgdGhlIGRlbnktYnktZGVmYXVsdCBwb3N0dXJlOiBhIHNlbmQgaXNcbiAqIHBlcm1pdHRlZCBvbmx5IGZyb20gYW4gYWRkcmVzcyB0aGUgY29uZmlndXJhdGlvbiBuYW1lcywgZWl0aGVyIHRocm91Z2hcbiAqIHtAbGluayBFbWFpbFBsdWdpbkNvbmZpZy5hbGxvd2VkU2VuZGVyc30gb3IsIHdoZW4gdGhhdCBpcyBlbXB0eSwgdGhyb3VnaFxuICogdGhlIGNvbmZpZ3VyZWQgc2VuZGVyIHNvdXJjZSAoe0BsaW5rIEVtYWlsUGx1Z2luQ29uZmlnLmZyb219IGFzIGFuIGV4YWN0XG4gKiBhZGRyZXNzLCB7QGxpbmsgRW1haWxQbHVnaW5Db25maWcuZG9tYWlufSBhcyBhIGAqQGRvbWFpbmAgd2lsZGNhcmQpLlxuICpcbiAqIGBcInVucmVzdHJpY3RlZFwiYCBpcyB0aGUgZXhwbGljaXQgb3B0LW91dDogYW55IGBGcm9tYCBhIGNhbGxlciBzdXBwbGllcyBpc1xuICogYWNjZXB0ZWQuIE9ubHkgcmVhY2ggZm9yIGl0IHdoZW4gYW4gdXBzdHJlYW0gc3lzdGVtIGFscmVhZHkgdmV0cyB0aGVcbiAqIHNlbmRlci5cbiAqL1xuZXhwb3J0IHR5cGUgU2VuZGVyUG9saWN5ID0gXCJhbGxvd2xpc3RcIiB8IFwidW5yZXN0cmljdGVkXCI7XG5cbi8qKiBTTVRQIGNvbm5lY3Rpb24gKyBjcmVkZW50aWFscy4gQWxsIGZpZWxkcyBmYWxsIGJhY2sgdG8gZW52IHdoZW4gdW5zZXQuICovXG5leHBvcnQgaW50ZXJmYWNlIFNtdHBDb25maWcge1xuICAvKiogU01UUCBzZXJ2ZXIgaG9zdG5hbWUgKGBTTVRQX0hPU1RgKS4gKi9cbiAgaG9zdD86IHN0cmluZztcbiAgLyoqIFNNVFAgc2VydmVyIHBvcnQgKGBTTVRQX1BPUlRgKS4gRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfU01UUF9QT1JUfS4gKi9cbiAgcG9ydD86IG51bWJlcjtcbiAgLyoqXG4gICAqIFVzZSBhIFRMUy1vbi1jb25uZWN0IHNvY2tldCAoYFNNVFBfU0VDVVJFYCkuIERlZmF1bHRzIHRvXG4gICAqIGBwb3J0ID09PSBgIHtAbGluayBJTVBMSUNJVF9UTFNfU01UUF9QT1JUfS5cbiAgICovXG4gIHNlY3VyZT86IGJvb2xlYW47XG4gIC8qKiBTTVRQIGF1dGggdXNlcm5hbWUgKGBTTVRQX1VTRVJgKS4gKi9cbiAgdXNlcj86IHN0cmluZztcbiAgLyoqIFNNVFAgYXV0aCBwYXNzd29yZCAvIEFQSSBrZXkgKGBTTVRQX1BBU1NXT1JEYCkuICovXG4gIHBhc3N3b3JkPzogc3RyaW5nO1xufVxuXG4vKiogQXBwS2l0IGNvbmZpZyBhY2NlcHRlZCBieSB0aGUgZW1haWwgcGx1Z2luLiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbWFpbFBsdWdpbkNvbmZpZyBleHRlbmRzIEJhc2VQbHVnaW5Db25maWcge1xuICAvKiogU01UUCBjb25uZWN0aW9uICsgY3JlZGVudGlhbHMuIE9taXQgdG8gcnVuIGluIGZpbGUvb3V0Ym94IG1vZGUuICovXG4gIHNtdHA/OiBTbXRwQ29uZmlnO1xuICAvKipcbiAgICogRG9tYWluIHVzZWQgdG8gYnVpbGQgdGhlIHNlbmRlciBhZGRyZXNzIGZyb20gdGhlIG9uLWJlaGFsZi1vZiB1c2VyXG4gICAqIChgPGxvY2FsLXBhcnQ+QDxkb21haW4+YCkuIEZhbGxzIGJhY2sgdG8gYEVNQUlMX0RPTUFJTmAuIFJlcXVpcmVkIGluXG4gICAqIFNNVFAgbW9kZSB1bmxlc3Mge0BsaW5rIGZyb219IGlzIHNldDsgb3B0aW9uYWwgaW4gZmlsZSBtb2RlICh0aGVcbiAgICogb3V0Ym94IGZhbGxzIGJhY2sgdG8gdGhlIHVzZXIncyBvd24gZW1haWwgYWRkcmVzcykuXG4gICAqL1xuICBkb21haW4/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBFeHBsaWNpdCBgRnJvbWAgYWRkcmVzcywgT1BUSU9OQUwuIFdoZW4gc2V0LCB0aGUgc2VuZGVyIGlzIHVzZWQgdmVyYmF0aW1cbiAgICogYW5kIHRoZSBwZXItdXNlciBkZXJpdmF0aW9uIGlzIHNraXBwZWQuIEZhbGxzIGJhY2sgdG8gYEVNQUlMX0ZST01gLlxuICAgKlxuICAgKiBMZWF2ZSBpdCB1bnNldCBpbiBtb3N0IGRlcGxveW1lbnRzOiB7QGxpbmsgZG9tYWlufSBhbG9uZSBpcyBlbm91Z2gsIGFuZFxuICAgKiBtYWlsIHRoZW4gY29tZXMgZnJvbSB0aGUgYWRkcmVzcyBvZiB0aGUgcGVyc29uIHdobyBjYXVzZWQgaXQsIHdoaWNoIGlzIHdoYXRcbiAgICogYSByZWNpcGllbnQgZXhwZWN0cyB0byBiZSBhYmxlIHRvIHJlcGx5IHRvLlxuICAgKi9cbiAgZnJvbT86IHN0cmluZztcbiAgLyoqXG4gICAqIGBGcm9tYCBmb3IgU1lTVEVNIG1haWwgLSBhIHNlbmQgd2l0aCBubyBvbi1iZWhhbGYtb2YgdXNlciwgc3VjaCBhcyBhXG4gICAqIHNpZ24taW4gY29kZSBvciBhIHBhc3N3b3JkIHJlc2V0LiBGYWxscyBiYWNrIHRvIGBFTUFJTF9TWVNURU1fRlJPTWAsIHRoZW5cbiAgICogdG8gYG5vLXJlcGx5QDxkb21haW4+YCwgdGhlbiB0byB7QGxpbmsgZnJvbX0uXG4gICAqXG4gICAqIE1hY2hpbmUgbWFpbCBnZXRzIGEgZG8tbm90LXJlcGx5IGFkZHJlc3MgYnkgZGVmYXVsdCBiZWNhdXNlIGEgcmVwbHkgdG8gaXRcbiAgICogcmVhY2hlcyBub2JvZHkuIFNldCB0aGlzIHRvIHJvdXRlIHRob3NlIHJlcGxpZXMgc29tZXdoZXJlIHJlYWwgKGEgbW9uaXRvcmVkXG4gICAqIGBzdXBwb3J0QGApIG9yIHRvIHNwZWxsIHRoZSBsb2NhbCBwYXJ0IGRpZmZlcmVudGx5IChgZG9ub3RyZXBseUBgKS5cbiAgICovXG4gIHN5c3RlbUZyb20/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBEaXJlY3RvcnkgZm9yIHRoZSBmaWxlL291dGJveCBmYWxsYmFjay4gRmFsbHMgYmFjayB0b1xuICAgKiBgRU1BSUxfT1VUQk9YX0RJUmAsIHRoZW4gYDxjd2Q+L3RtcGAuIE9ubHkgdXNlZCB3aGVuIFNNVFBcbiAgICogY3JlZGVudGlhbHMgYXJlIGFic2VudC5cbiAgICovXG4gIG91dERpcj86IHN0cmluZztcbiAgLyoqXG4gICAqIEFsbG93LWxpc3QgcmVzdHJpY3RpbmcgdGhlIHNlbmRlciAoYEZyb21gKSBhZGRyZXNzLiBFYWNoIGVudHJ5IGlzIGFuXG4gICAqIGV4YWN0IGFkZHJlc3MgKGB1c2VyQGRvbWFpbi5jb21gKSwgYSBkb21haW4gd2lsZGNhcmQgKGAqQGRvbWFpbi5jb21gXG4gICAqIG9yIHRoZSBiYXJlIGBkb21haW4uY29tYCwgbWF0Y2hpbmcgYW55IGxvY2FsIHBhcnQgb24gdGhhdCBkb21haW4pLCBvclxuICAgKiBgKmAgKGFueSkuIEEgcmVzb2x2ZWQgLyBjaG9zZW4gc2VuZGVyIHRoYXQgbWF0Y2hlcyBubyBlbnRyeSBpc1xuICAgKiByZWplY3RlZCBhdCBzZW5kIHRpbWUuIEFjY2VwdHMgYSBgc3RyaW5nW11gIG9yIGEgc2luZ2xlIGNvbW1hLSAvXG4gICAqIHdoaXRlc3BhY2Utc2VwYXJhdGVkIHN0cmluZzsgZmFsbHMgYmFjayB0byBgRU1BSUxfQUxMT1dFRF9TRU5ERVJTYC5cbiAgICogV2hlbiBlbXB0eSwgdGhlIHtAbGluayBzZW5kZXJQb2xpY3l9IGRlY2lkZXMgd2hhdCBpcyBwZXJtaXR0ZWQuXG4gICAqL1xuICBhbGxvd2VkU2VuZGVycz86IHN0cmluZyB8IHN0cmluZ1tdO1xuICAvKipcbiAgICogSG93IHRoZSBzZW5kZXIgYWRkcmVzcyBpcyByZXN0cmljdGVkIHdoZW4ge0BsaW5rIGFsbG93ZWRTZW5kZXJzfSBpc1xuICAgKiBlbXB0eSAoYEVNQUlMX1NFTkRFUl9QT0xJQ1lgKS4gRGVmYXVsdHMgdG8gYFwiYWxsb3dsaXN0XCJgLCB3aGljaFxuICAgKiBuYXJyb3dzIHNlbmRzIHRvIHRoZSBjb25maWd1cmVkIHNlbmRlciBzb3VyY2UuIFNlZVxuICAgKiB7QGxpbmsgU2VuZGVyUG9saWN5fS5cbiAgICovXG4gIHNlbmRlclBvbGljeT86IFNlbmRlclBvbGljeTtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGJyYW5kIHN0eWxpbmcgYXBwbGllZCB0byBldmVyeSByZW5kZXJlZCBtZXNzYWdlLiBPbWl0IHRvIHVzZSB0aGVcbiAgICogcmVwb3NpdG9yeSdzIGRieC10b29scyBicmFuZC4gUGFzcyB7QGxpbmsgZW1haWxCcmFuZEZyb21Db250ZXh0fSB0byBkZXJpdmVcbiAgICogYSBjdXN0b20gdmFsdWUgZnJvbSBhIHNoYXJlZCBgQnJhbmRDb250ZXh0YC5cbiAgICovXG4gIGJyYW5kPzogRW1haWxCcmFuZDtcbn1cblxuLyoqIENvbmZpZyBzaGFyZWQgYnkgYm90aCByZXNvbHZlZCBtb2Rlcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRTZW5kZXIge1xuICAvKiogU2VuZGVyIGRvbWFpbjsgcHJlc2VudCB3aGVuZXZlciB7QGxpbmsgZnJvbX0gaXMgYWJzZW50LiAqL1xuICBkb21haW4/OiBzdHJpbmc7XG4gIC8qKiBFeHBsaWNpdCBzZW5kZXIgb3ZlcnJpZGU7IHByZXNlbnQgc2tpcHMgcGVyLXVzZXIgZGVyaXZhdGlvbi4gKi9cbiAgZnJvbT86IHN0cmluZztcbiAgLyoqXG4gICAqIEV4cGxpY2l0IGRvLW5vdC1yZXBseSBzZW5kZXIgZm9yIHN5c3RlbSBtYWlsLiBBYnNlbnQgbWVhbnMgaXQgaXMgZGVyaXZlZCAtXG4gICAqIHNlZSB7QGxpbmsgc3lzdGVtU2VuZGVyQWRkcmVzc30uXG4gICAqL1xuICBzeXN0ZW1Gcm9tPzogc3RyaW5nO1xuICAvKipcbiAgICogRWZmZWN0aXZlIHNlbmRlciBhbGxvdy1saXN0OiB0aGUgY29uZmlndXJlZCBwYXR0ZXJucyB3aGVuIGFueSB3ZXJlXG4gICAqIGdpdmVuLCBlbHNlIHRoZSBwYXR0ZXJucyBpbXBsaWVkIGJ5IHRoZSBzZW5kZXIgc291cmNlIHVuZGVyIGFuXG4gICAqIGBcImFsbG93bGlzdFwiYCBwb2xpY3kuIEVtcHR5IG1lYW5zIHVuZW5mb3JjZWFibGUgKGFuIGBcInVucmVzdHJpY3RlZFwiYFxuICAgKiBwb2xpY3ksIG9yIGFuIG91dGJveCB3aXRoIG5vIHNlbmRlciBzb3VyY2UgdG8gbmFycm93IHRvKS5cbiAgICovXG4gIGFsbG93ZWRTZW5kZXJzOiBzdHJpbmdbXTtcbiAgLyoqIFRoZSByZXN0cmljdGlvbiBtb2RlIHRoZSBhbGxvdy1saXN0IHdhcyByZXNvbHZlZCB1bmRlci4gKi9cbiAgc2VuZGVyUG9saWN5OiBTZW5kZXJQb2xpY3k7XG4gIC8qKiBCcmFuZCBzdHlsaW5nIGFwcGxpZWQgdG8gcmVuZGVyZWQgSFRNTC4gKi9cbiAgYnJhbmQ6IEVtYWlsQnJhbmQ7XG59XG5cbi8qKiBSZXNvbHZlZCBjb25maWcgZm9yIHJlYWwgU01UUCBkZWxpdmVyeS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRTbXRwQ29uZmlnIGV4dGVuZHMgUmVzb2x2ZWRTZW5kZXIge1xuICBtb2RlOiBcInNtdHBcIjtcbiAgaG9zdDogc3RyaW5nO1xuICBwb3J0OiBudW1iZXI7XG4gIHNlY3VyZTogYm9vbGVhbjtcbiAgYXV0aDogeyB1c2VyOiBzdHJpbmc7IHBhc3M6IHN0cmluZyB9O1xufVxuXG4vKiogUmVzb2x2ZWQgY29uZmlnIGZvciB0aGUgZmlsZS9vdXRib3ggZmFsbGJhY2sgKG5vIFNNVFAgY3JlZGVudGlhbHMpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZEZpbGVDb25maWcgZXh0ZW5kcyBSZXNvbHZlZFNlbmRlciB7XG4gIG1vZGU6IFwiZmlsZVwiO1xuICAvKiogQWJzb2x1dGUgZGlyZWN0b3J5IG1lc3NhZ2VzIGFyZSB3cml0dGVuIHVuZGVyLiAqL1xuICBvdXREaXI6IHN0cmluZztcbn1cblxuLyoqIENvbmNyZXRlLCB2YWxpZGF0ZWQgY29uZmlnIHRoZSBydW50aW1lIGRpc3BhdGNoZXMgdGhyb3VnaC4gKi9cbmV4cG9ydCB0eXBlIFJlc29sdmVkRW1haWxDb25maWcgPSBSZXNvbHZlZFNtdHBDb25maWcgfCBSZXNvbHZlZEZpbGVDb25maWc7XG5cbi8qKiBKU09OIFNjaGVtYSBwdWJsaXNoZWQgb24gdGhlIG1hbmlmZXN0J3MgYGNvbmZpZy5zY2hlbWFgLiAqL1xuZXhwb3J0IGNvbnN0IEVNQUlMX0NPTkZJR19TQ0hFTUE6IEpTT05TY2hlbWE3ID0ge1xuICB0eXBlOiBcIm9iamVjdFwiLFxuICBwcm9wZXJ0aWVzOiB7XG4gICAgc210cDoge1xuICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlNNVFAgY29ubmVjdGlvbiBhbmQgY3JlZGVudGlhbHMgKGVudiBmYWxsYmFja3M6IFNNVFBfKikuXCIsXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIGhvc3Q6IHsgdHlwZTogXCJzdHJpbmdcIiwgZGVzY3JpcHRpb246IFwiU01UUCBzZXJ2ZXIgaG9zdG5hbWUgKFNNVFBfSE9TVCkuXCIgfSxcbiAgICAgICAgcG9ydDoge1xuICAgICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgZGVzY3JpcHRpb246IGBTTVRQIHNlcnZlciBwb3J0IChTTVRQX1BPUlQpLiBEZWZhdWx0cyB0byAke0RFRkFVTFRfU01UUF9QT1JUfS5gLFxuICAgICAgICB9LFxuICAgICAgICBzZWN1cmU6IHtcbiAgICAgICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgICAgICBkZXNjcmlwdGlvbjogYFRMUy1vbi1jb25uZWN0IHNvY2tldCAoU01UUF9TRUNVUkUpLiBEZWZhdWx0cyB0byBwb3J0ID09PSAke0lNUExJQ0lUX1RMU19TTVRQX1BPUlR9LmAsXG4gICAgICAgIH0sXG4gICAgICAgIHVzZXI6IHsgdHlwZTogXCJzdHJpbmdcIiwgZGVzY3JpcHRpb246IFwiU01UUCBhdXRoIHVzZXJuYW1lIChTTVRQX1VTRVIpLlwiIH0sXG4gICAgICAgIHBhc3N3b3JkOiB7XG4gICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICBkZXNjcmlwdGlvbjogXCJTTVRQIGF1dGggcGFzc3dvcmQgLyBBUEkga2V5IChTTVRQX1BBU1NXT1JEKS5cIixcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBkb21haW46IHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJEb21haW4gZm9yIHRoZSBkZXJpdmVkIHNlbmRlciBhZGRyZXNzICg8dXNlci1sb2NhbC1wYXJ0PkA8ZG9tYWluPikuIEZhbGxzIGJhY2sgdG8gRU1BSUxfRE9NQUlOLlwiLFxuICAgIH0sXG4gICAgZnJvbToge1xuICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIk9wdGlvbmFsIGV4cGxpY2l0IEZyb20gYWRkcmVzczsgc2tpcHMgcGVyLXVzZXIgZGVyaXZhdGlvbi4gRmFsbHMgYmFjayB0byBFTUFJTF9GUk9NLlwiLFxuICAgIH0sXG4gICAgc3lzdGVtRnJvbToge1xuICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIkZyb20gZm9yIHN5c3RlbSBtYWlsIChubyBvbi1iZWhhbGYtb2YgdXNlciwgZS5nLiBhIHNpZ24taW4gY29kZSkuIEZhbGxzIGJhY2sgdG8gRU1BSUxfU1lTVEVNX0ZST00sIHRoZW4gbm8tcmVwbHlAPGRvbWFpbj4sIHRoZW4gZnJvbS5cIixcbiAgICB9LFxuICAgIG91dERpcjoge1xuICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIkRpcmVjdG9yeSBmb3IgdGhlIGZpbGUvb3V0Ym94IGZhbGxiYWNrIHdoZW4gU01UUCBpcyB1bmNvbmZpZ3VyZWQuIEZhbGxzIGJhY2sgdG8gRU1BSUxfT1VUQk9YX0RJUiwgdGhlbiA8Y3dkPi90bXAuXCIsXG4gICAgfSxcbiAgICBhbGxvd2VkU2VuZGVyczoge1xuICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgaXRlbXM6IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdBbGxvdy1saXN0IG9mIHBlcm1pdHRlZCBzZW5kZXIgKEZyb20pIHBhdHRlcm5zOiBleGFjdCBhZGRyZXNzZXMgKFwidXNlckBkb21haW4uY29tXCIpLCBkb21haW4gd2lsZGNhcmRzIChcIipAZG9tYWluLmNvbVwiKSwgb3IgXCIqXCIuIEFsc28gYWNjZXB0cyBhIGNvbW1hL3NwYWNlLXNlcGFyYXRlZCBzdHJpbmcuIEZhbGxzIGJhY2sgdG8gRU1BSUxfQUxMT1dFRF9TRU5ERVJTLiBXaGVuIGVtcHR5LCBzZW5kZXJQb2xpY3kgZGVjaWRlcy4nLFxuICAgIH0sXG4gICAgc2VuZGVyUG9saWN5OiB7XG4gICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgZW51bTogW1wiYWxsb3dsaXN0XCIsIFwidW5yZXN0cmljdGVkXCJdLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdIb3cgdGhlIHNlbmRlciBpcyByZXN0cmljdGVkIHdoZW4gYWxsb3dlZFNlbmRlcnMgaXMgZW1wdHkgKEVNQUlMX1NFTkRFUl9QT0xJQ1kpLiBcImFsbG93bGlzdFwiIChkZWZhdWx0KSBuYXJyb3dzIHNlbmRzIHRvIHRoZSBjb25maWd1cmVkIHNlbmRlciBzb3VyY2U7IFwidW5yZXN0cmljdGVkXCIgYWNjZXB0cyBhbnkgRnJvbS4nLFxuICAgIH0sXG4gICAgYnJhbmQ6IHtcbiAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJCcmFuZCBzdHlsaW5nIGFwcGxpZWQgdG8gZXZlcnkgUmVhY3QgRW1haWwgbWVzc2FnZS4gT21pdCB0byB1c2UgdGhlIGRieC10b29scyBicmFuZC5cIixcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgYWNjZW50OiB7XG4gICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ0hlYWRlci1iYW5kIGJhY2tncm91bmQgYW5kIGJvZHkgbGluayBjb2xvciAoZS5nLiBcIiNGRjM2MjFcIikuJyxcbiAgICAgICAgfSxcbiAgICAgICAgb25BY2NlbnQ6IHtcbiAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlRleHQgYW5kIGxvZ28gY29sb3IgcmVuZGVyZWQgb24gdGhlIGFjY2VudCBiYW5kLiBEZWZhdWx0cyB0byB3aGl0ZS5cIixcbiAgICAgICAgfSxcbiAgICAgICAgZm9udEZhbWlseToge1xuICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgZGVzY3JpcHRpb246ICdCb2R5IGZvbnQgc3RhY2sgKGUuZy4gXCJJbnRlciwgdWktc2Fucy1zZXJpZiwgc3lzdGVtLXVpLCBzYW5zLXNlcmlmXCIpLicsXG4gICAgICAgIH0sXG4gICAgICAgIG5hbWU6IHtcbiAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlByb2R1Y3QgLyBkaXNwbGF5IG5hbWUgdXNlZCBhcyB0aGUgaGVhZGVyIHRleHQgYW5kIHRoZSBsb2dvIGFsdCB0ZXh0LlwiLFxuICAgICAgICB9LFxuICAgICAgICBsb2dvVXJsOiB7XG4gICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgIFwiTG9nbyBpbWFnZSBmb3IgdGhlIGhlYWRlciBiYW5kLiBPbmx5IGFuIGh0dHAocyk6IG9yIGRhdGE6IFVSTCByZW5kZXJzOyBvdGhlciB2YWx1ZXMgYXJlIGRyb3BwZWQgYmVjYXVzZSBhIG1haWwgY2xpZW50IGNhbm5vdCBsb2FkIHRoZW0uXCIsXG4gICAgICAgIH0sXG4gICAgICAgIGJhY2tncm91bmQ6IHsgdHlwZTogXCJzdHJpbmdcIiwgZGVzY3JpcHRpb246IFwiSW5ib3ggY2FudmFzIGNvbG9yLlwiIH0sXG4gICAgICAgIHN1cmZhY2U6IHsgdHlwZTogXCJzdHJpbmdcIiwgZGVzY3JpcHRpb246IFwiTWVzc2FnZS1jYXJkIGNvbG9yLlwiIH0sXG4gICAgICAgIGZvcmVncm91bmQ6IHsgdHlwZTogXCJzdHJpbmdcIiwgZGVzY3JpcHRpb246IFwiUHJpbWFyeSB0ZXh0IGNvbG9yLlwiIH0sXG4gICAgICAgIG11dGVkOiB7IHR5cGU6IFwic3RyaW5nXCIsIGRlc2NyaXB0aW9uOiBcIlNlY29uZGFyeSB0ZXh0IGNvbG9yLlwiIH0sXG4gICAgICAgIGJvcmRlcjogeyB0eXBlOiBcInN0cmluZ1wiLCBkZXNjcmlwdGlvbjogXCJCb3JkZXIgYW5kIGRpdmlkZXIgY29sb3IuXCIgfSxcbiAgICAgICAgdGFnbGluZTogeyB0eXBlOiBcInN0cmluZ1wiLCBkZXNjcmlwdGlvbjogXCJGb290ZXIgcHJvZHVjdCBsaW5lLlwiIH0sXG4gICAgICAgIHdlYnNpdGU6IHsgdHlwZTogXCJzdHJpbmdcIiwgZGVzY3JpcHRpb246IFwiT3B0aW9uYWwgZm9vdGVyIHdlYnNpdGUgVVJMLlwiIH0sXG4gICAgICB9LFxuICAgICAgcmVxdWlyZWQ6IFtcImFjY2VudFwiLCBcImZvbnRGYW1pbHlcIl0sXG4gICAgfSxcbiAgfSxcbn07XG5cbi8qKiBQYXJzZSB0aGUgYFNNVFBfU0VDVVJFYCBlbnYgLyBjb25maWcgZmxhZywgZGVmYXVsdGluZyBieSBwb3J0LiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVNlY3VyZShmbGFnOiBib29sZWFuIHwgdW5kZWZpbmVkLCBwb3J0OiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBjb25maWdVdGlscy5ib29sZWFuKGZsYWcsIFwiU01UUF9TRUNVUkVcIiwgY29uZmlnVXRpbHMuRU5WX09OTFkpID8/XG4gICAgcG9ydCA9PT0gSU1QTElDSVRfVExTX1NNVFBfUE9SVFxuICApO1xufVxuXG4vKiogUGFyc2UgdGhlIGBFTUFJTF9TRU5ERVJfUE9MSUNZYCBlbnYgLyBjb25maWcgdmFsdWUsIGRlZmF1bHRpbmcgdG8gZGVueS1ieS1kZWZhdWx0LiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVNlbmRlclBvbGljeShwb2xpY3k6IFNlbmRlclBvbGljeSB8IHVuZGVmaW5lZCk6IFNlbmRlclBvbGljeSB7XG4gIGNvbnN0IHJhdyA9XG4gICAgcG9saWN5ID8/IGNvbmZpZ1V0aWxzLnRleHQoXCJFTUFJTF9TRU5ERVJfUE9MSUNZXCIsIGNvbmZpZ1V0aWxzLkVOVl9PTkxZKT8udG9Mb3dlckNhc2UoKTtcbiAgaWYgKHJhdyA9PT0gXCJ1bnJlc3RyaWN0ZWRcIikgcmV0dXJuIFwidW5yZXN0cmljdGVkXCI7XG4gIGlmIChyYXcgPT09IHVuZGVmaW5lZCB8fCByYXcgPT09IFwiXCIgfHwgcmF3ID09PSBcImFsbG93bGlzdFwiKSByZXR1cm4gXCJhbGxvd2xpc3RcIjtcbiAgdGhyb3cgVmFsaWRhdGlvbkVycm9yLmludmFsaWRWYWx1ZShcInNlbmRlclBvbGljeVwiLCByYXcsICdcImFsbG93bGlzdFwiIG9yIFwidW5yZXN0cmljdGVkXCInKTtcbn1cblxuLyoqXG4gKiBFZmZlY3RpdmUgYWxsb3ctbGlzdCBmb3IgYW4gYFwiYWxsb3dsaXN0XCJgIHBvbGljeSB3aXRoIG5vIGV4cGxpY2l0IHBhdHRlcm5zOlxuICogdGhlIHNlbmRlciBzb3VyY2UgaXRzZWxmLCBzbyBhIGNvbmZpZ3VyZWQgZG9tYWluIG9yIGZpeGVkIGFkZHJlc3MgaXMgdGhlXG4gKiBib3VuZGFyeSByYXRoZXIgdGhhbiBcImFueXRoaW5nIGdvZXNcIi4gWWllbGRzIG5vdGhpbmcgd2hlbiBuZWl0aGVyIGlzIHNldCxcbiAqIHdoaWNoIG9ubHkgaGFwcGVucyBpbiBvdXRib3ggbW9kZSAod2hlcmUgdGhlIHNlbmRlciBmYWxscyBiYWNrIHRvIHRoZVxuICogb24tYmVoYWxmLW9mIHVzZXIncyBvd24gYWRkcmVzcyBhbmQgY2Fubm90IGJlIGVudW1lcmF0ZWQgdXAgZnJvbnQpLlxuICovXG5mdW5jdGlvbiBpbXBsaWVkU2VuZGVyUGF0dGVybnMoc2VuZGVyOiB7XG4gIGRvbWFpbj86IHN0cmluZztcbiAgZnJvbT86IHN0cmluZztcbiAgc3lzdGVtRnJvbT86IHN0cmluZztcbn0pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHBhdHRlcm5zOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAoc2VuZGVyLmZyb20pIHBhdHRlcm5zLnB1c2goc2VuZGVyLmZyb20udHJpbSgpLnRvTG93ZXJDYXNlKCkpO1xuICBpZiAoc2VuZGVyLmRvbWFpbikgcGF0dGVybnMucHVzaChgKkAke3NlbmRlci5kb21haW4udHJpbSgpLnRvTG93ZXJDYXNlKCl9YCk7XG4gIC8vIFRoZSBzeXN0ZW0gc2VuZGVyIHRvbywgd2hlbiB0aGUgcGF0dGVybnMgYWJvdmUgZG8gbm90IGFscmVhZHkgY292ZXIgaXQ6IGl0XG4gIC8vIGlzIGFuIGFkZHJlc3MgdGhpcyBhcHAgU0VORFMgZnJvbSwgc28gYSBsaXN0IGRlcml2ZWQgZnJvbSB0aGUgc2VuZGVyIHNvdXJjZVxuICAvLyBoYXMgdG8gcGVybWl0IGl0LCBvciB0aGUgdmVyeSBwb2xpY3kgbWVhbnQgdG8gZGVzY3JpYmUgdGhlIGFwcCdzIG93biBzZW5kZXJzXG4gIC8vIGRlbmllcyBpdHMgc2lnbi1pbiBtYWlsLiBVc3VhbGx5IHJlZHVuZGFudCAoYCpAZG9tYWluYCBhbHJlYWR5IG1hdGNoZXNcbiAgLy8gYG5vLXJlcGx5QGRvbWFpbmApIC0gaXQgbWF0dGVycyBmb3IgYSBgc3lzdGVtRnJvbWAgb24gYW5vdGhlciBkb21haW4uXG4gIGNvbnN0IHN5c3RlbSA9IHN5c3RlbVNlbmRlckFkZHJlc3Moc2VuZGVyKT8udG9Mb3dlckNhc2UoKTtcbiAgaWYgKHN5c3RlbSAmJiAhaXNTZW5kZXJBbGxvd2VkKHN5c3RlbSwgcGF0dGVybnMpKSBwYXR0ZXJucy5wdXNoKHN5c3RlbSk7XG4gIHJldHVybiBwYXR0ZXJucztcbn1cblxuLyoqIFdoZXRoZXIgYEVNQUlMX09VVEJPWF9NT0RFYCBleHBsaWNpdGx5IG9wdHMgaW50byB0aGUgZmlsZS9vdXRib3ggZmFsbGJhY2suICovXG5mdW5jdGlvbiBpc091dGJveE1vZGVFbmFibGVkKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29uZmlnVXRpbHMuYm9vbGVhbih1bmRlZmluZWQsIFwiRU1BSUxfT1VUQk9YX01PREVcIiwgY29uZmlnVXRpbHMuRU5WX09OTFkpID8/IGZhbHNlO1xufVxuXG5jb25zdCBTTVRQX1JFUVVJUkVEX0ZJRUxEUyA9IFtcIlNNVFBfSE9TVFwiLCBcIlNNVFBfVVNFUlwiLCBcIlNNVFBfUEFTU1dPUkRcIl0gYXMgY29uc3Q7XG5cbi8qKiBMaXN0IGVudiBrZXlzIGZvciBTTVRQIGZpZWxkcyB0aGF0IGFyZSB1bnNldCBpbiB0aGUgcmVzb2x2ZWQgY3JlZGVudGlhbCBzZXQuICovXG5mdW5jdGlvbiBtaXNzaW5nU210cEZpZWxkcyhcbiAgaG9zdDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICB1c2VyOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHBhc3M6IHN0cmluZyB8IHVuZGVmaW5lZCxcbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgdmFsdWVzID0gW2hvc3QsIHVzZXIsIHBhc3NdIGFzIGNvbnN0O1xuICByZXR1cm4gU01UUF9SRVFVSVJFRF9GSUVMRFMuZmlsdGVyKChfLCBpbmRleCkgPT4gIXZhbHVlc1tpbmRleF0pO1xufVxuXG4vKipcbiAqIFJlc29sdmUgcGx1Z2luIGNvbmZpZyBvdmVyIGVudmlyb25tZW50IGRlZmF1bHRzLlxuICpcbiAqIFdoZW4gU01UUCBob3N0ICsgdXNlciArIHBhc3N3b3JkIGFyZSBhbGwgcHJlc2VudCwgcmV0dXJucyBgbW9kZTpcbiAqIFwic210cFwiYCBmb3IgcmVhbCBkZWxpdmVyeSAoYW5kIHRocm93cyBpZiBubyBzZW5kZXIgc291cmNlIC0gZG9tYWluLFxuICogZnJvbSwgb3Igc3lzdGVtRnJvbSAtIGlzIGNvbmZpZ3VyZWQsIHNpbmNlIFNNVFAgY2FuJ3QgZGVyaXZlIG9uZSBmcm9tXG4gKiBub3RoaW5nOyBgZG9tYWluYCBhbG9uZSBpcyB0aGUgaW50ZW5kZWQgbWluaW11bSkuXG4gKiBXaGVuIGFsbCB0aHJlZSBhcmUgYWJzZW50IGFuZCBgRU1BSUxfT1VUQk9YX01PREVgIGlzIGVuYWJsZWQsIHJldHVybnNcbiAqIGBtb2RlOiBcImZpbGVcImAgc28gdGhlIHJ1bnRpbWUgd3JpdGVzIG1lc3NhZ2VzIHRvIHRoZSBvdXRib3ggZGlyZWN0b3J5XG4gKiBmb3IgbG9jYWwgdGVzdGluZzsgaW4gdGhhdCBtb2RlIGEgc2VuZGVyIHNvdXJjZSBpcyBvcHRpb25hbCAodGhlXG4gKiBvdXRib3ggZmFsbHMgYmFjayB0byB0aGUgT0JPIHVzZXIncyBvd24gYWRkcmVzcykuIFBhcnRpYWwgU01UUFxuICogY29uZmlndXJhdGlvbiBvciBhIHNlbmQgd2l0aCBubyBjcmVkZW50aWFscyBhbmQgbm8gb3V0Ym94IG9wdC1pblxuICogdGhyb3dzLlxuICpcbiAqIFRoZSBzZW5kZXIgYWxsb3ctbGlzdCBpcyByZXNvbHZlZCBoZXJlIHRvbzogdW5kZXIgdGhlIGRlZmF1bHRcbiAqIGBcImFsbG93bGlzdFwiYCBwb2xpY3kgYW4gZW1wdHkgbGlzdCBpcyBmaWxsZWQgaW4gZnJvbSB0aGUgc2VuZGVyIHNvdXJjZSxcbiAqIHNvIGEgZGVwbG95bWVudCB0aGF0IG9ubHkgc2V0cyBgRU1BSUxfRE9NQUlOYCBzdGlsbCByZWplY3RzIGEgYEZyb21gIG9uXG4gKiBhbnkgb3RoZXIgZG9tYWluLiBTZWUge0BsaW5rIFNlbmRlclBvbGljeX0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRW1haWxDb25maWcoY29uZmlnOiBFbWFpbFBsdWdpbkNvbmZpZyA9IHt9KTogUmVzb2x2ZWRFbWFpbENvbmZpZyB7XG4gIGNvbnN0IHNtdHAgPSBjb25maWcuc210cCA/PyB7fTtcbiAgY29uc3QgaG9zdCA9IGNvbmZpZ1V0aWxzLnN0cmluZyhzbXRwLmhvc3QsIFwiU01UUF9IT1NUXCIsIGNvbmZpZ1V0aWxzLkVOVl9PTkxZKTtcbiAgY29uc3QgdXNlciA9IGNvbmZpZ1V0aWxzLnN0cmluZyhzbXRwLnVzZXIsIFwiU01UUF9VU0VSXCIsIGNvbmZpZ1V0aWxzLkVOVl9PTkxZKTtcbiAgY29uc3QgcGFzcyA9IGNvbmZpZ1V0aWxzLnN0cmluZyhzbXRwLnBhc3N3b3JkLCBcIlNNVFBfUEFTU1dPUkRcIiwgY29uZmlnVXRpbHMuRU5WX09OTFkpO1xuICBjb25zdCBkb21haW4gPSBjb25maWdVdGlscy5zdHJpbmcoY29uZmlnLmRvbWFpbiwgXCJFTUFJTF9ET01BSU5cIiwgY29uZmlnVXRpbHMuRU5WX09OTFkpO1xuICBjb25zdCBmcm9tID0gY29uZmlnVXRpbHMuc3RyaW5nKGNvbmZpZy5mcm9tLCBcIkVNQUlMX0ZST01cIiwgY29uZmlnVXRpbHMuRU5WX09OTFkpO1xuICBjb25zdCBzeXN0ZW1Gcm9tID0gY29uZmlnVXRpbHMuc3RyaW5nKFxuICAgIGNvbmZpZy5zeXN0ZW1Gcm9tLFxuICAgIFwiRU1BSUxfU1lTVEVNX0ZST01cIixcbiAgICBjb25maWdVdGlscy5FTlZfT05MWSxcbiAgKTtcbiAgY29uc3Qgc2VuZGVyUG9saWN5ID0gcmVzb2x2ZVNlbmRlclBvbGljeShjb25maWcuc2VuZGVyUG9saWN5KTtcbiAgY29uc3QgY29uZmlndXJlZFNlbmRlcnMgPSBwYXJzZUFsbG93ZWRTZW5kZXJzKFxuICAgIGNvbmZpZy5hbGxvd2VkU2VuZGVycyA/PyBjb25maWdVdGlscy50ZXh0KFwiRU1BSUxfQUxMT1dFRF9TRU5ERVJTXCIsIGNvbmZpZ1V0aWxzLkVOVl9PTkxZKSxcbiAgKTtcbiAgY29uc3QgYWxsb3dlZFNlbmRlcnMgPVxuICAgIGNvbmZpZ3VyZWRTZW5kZXJzLmxlbmd0aCA+IDAgfHwgc2VuZGVyUG9saWN5ID09PSBcInVucmVzdHJpY3RlZFwiXG4gICAgICA/IGNvbmZpZ3VyZWRTZW5kZXJzXG4gICAgICA6IGltcGxpZWRTZW5kZXJQYXR0ZXJucyh7IGRvbWFpbiwgZnJvbSwgc3lzdGVtRnJvbSB9KTtcbiAgY29uc3Qgc2VuZGVyOiBSZXNvbHZlZFNlbmRlciA9IHtcbiAgICAuLi5vYmplY3Qub3B0aW9uYWwoXCJkb21haW5cIiwgZG9tYWluKSxcbiAgICAuLi5vYmplY3Qub3B0aW9uYWwoXCJmcm9tXCIsIGZyb20pLFxuICAgIC4uLm9iamVjdC5vcHRpb25hbChcInN5c3RlbUZyb21cIiwgc3lzdGVtRnJvbSksXG4gICAgYWxsb3dlZFNlbmRlcnMsXG4gICAgc2VuZGVyUG9saWN5LFxuICAgIGJyYW5kOiBjb25maWcuYnJhbmQgPz8gZGVmYXVsdEVtYWlsQnJhbmQsXG4gIH07XG5cbiAgY29uc3QgaGFzQWxsU210cCA9IEJvb2xlYW4oaG9zdCAmJiB1c2VyICYmIHBhc3MpO1xuICBjb25zdCBoYXNBbnlTbXRwID0gQm9vbGVhbihob3N0IHx8IHVzZXIgfHwgcGFzcyk7XG5cbiAgaWYgKGhhc0FueVNtdHAgJiYgIWhhc0FsbFNtdHApIHtcbiAgICB0aHJvdyBWYWxpZGF0aW9uRXJyb3IubWlzc2luZ0VudlZhcnMobWlzc2luZ1NtdHBGaWVsZHMoaG9zdCwgdXNlciwgcGFzcykpO1xuICB9XG5cbiAgaWYgKGhhc0FsbFNtdHApIHtcbiAgICBpZiAoIWRvbWFpbiAmJiAhZnJvbSAmJiAhc3lzdGVtRnJvbSkge1xuICAgICAgdGhyb3cgQ29uZmlndXJhdGlvbkVycm9yLnJlc291cmNlTm90Rm91bmQoXG4gICAgICAgIFwiRW1haWwgc2VuZGVyIHNvdXJjZVwiLFxuICAgICAgICBcIlNldCBFTUFJTF9ET01BSU4gdG8gZGVyaXZlIDx1c2VyLWxvY2FsLXBhcnQ+QDxkb21haW4+IChhbmQgbm8tcmVwbHlAPGRvbWFpbj4gZm9yIHN5c3RlbSBtYWlsKSwgb3IgRU1BSUxfRlJPTSBmb3IgYSBmaXhlZCBhZGRyZXNzLlwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgcG9ydCA9IGNvbmZpZ1V0aWxzLnBvcnQoc210cC5wb3J0LCBcIlNNVFBfUE9SVFwiLCBERUZBVUxUX1NNVFBfUE9SVCwgY29uZmlnVXRpbHMuRU5WX09OTFkpO1xuICAgIHJldHVybiB7XG4gICAgICBtb2RlOiBcInNtdHBcIixcbiAgICAgIGhvc3Q6IGhvc3QhLFxuICAgICAgcG9ydCxcbiAgICAgIHNlY3VyZTogcmVzb2x2ZVNlY3VyZShzbXRwLnNlY3VyZSwgcG9ydCksXG4gICAgICBhdXRoOiB7IHVzZXI6IHVzZXIhLCBwYXNzOiBwYXNzISB9LFxuICAgICAgLi4uc2VuZGVyLFxuICAgIH07XG4gIH1cblxuICBpZiAoIWlzT3V0Ym94TW9kZUVuYWJsZWQoKSkge1xuICAgIHRocm93IENvbmZpZ3VyYXRpb25FcnJvci5pbnZhbGlkQ29ubmVjdGlvbihcbiAgICAgIFwiU01UUFwiLFxuICAgICAgYFNldCAke1NNVFBfUkVRVUlSRURfRklFTERTLmpvaW4oXCIsIFwiKX0sIG9yIEVNQUlMX09VVEJPWF9NT0RFPTEgdG8gd3JpdGUgbWVzc2FnZXMgdG8gYSBsb2NhbCBvdXRib3ggaW5zdGVhZC5gLFxuICAgICk7XG4gIH1cblxuICBjb25zdCBvdXREaXIgPSByZXNvbHZlKFxuICAgIGNvbmZpZ1V0aWxzLnN0cmluZyhjb25maWcub3V0RGlyLCBcIkVNQUlMX09VVEJPWF9ESVJcIiwgY29uZmlnVXRpbHMuRU5WX09OTFkpID8/XG4gICAgICByZXNvbHZlKHByb2Nlc3MuY3dkKCksIFwidG1wXCIpLFxuICApO1xuICByZXR1cm4geyBtb2RlOiBcImZpbGVcIiwgb3V0RGlyLCAuLi5zZW5kZXIgfTtcbn1cbiJdfQ==
|
|
234
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlCRztBQUNILE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDcEMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGVBQWUsRUFBeUIsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRyxPQUFPLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9FLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsaUJBQWlCLEVBQW1CLE1BQU0sa0NBQWtDLENBQUM7QUFFdEYsT0FBTyxFQUFFLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUV4Rix5REFBeUQ7QUFDekQsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsR0FBRyxDQUFDO0FBRXJDLDJFQUEyRTtBQUMzRSxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxHQUFHLENBQUM7QUEwSTFDLCtEQUErRDtBQUMvRCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBZ0I7SUFDOUMsSUFBSSxFQUFFLFFBQVE7SUFDZCxVQUFVLEVBQUU7UUFDVixJQUFJLEVBQUU7WUFDSixJQUFJLEVBQUUsUUFBUTtZQUNkLFdBQVcsRUFBRSwwREFBMEQ7WUFDdkUsVUFBVSxFQUFFO2dCQUNWLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLG1DQUFtQyxFQUFFO2dCQUMxRSxJQUFJLEVBQUU7b0JBQ0osSUFBSSxFQUFFLFFBQVE7b0JBQ2QsV0FBVyxFQUFFLDZDQUE2QyxpQkFBaUIsR0FBRztpQkFDL0U7Z0JBQ0QsTUFBTSxFQUFF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LGtCQUFrQixDQUFDLGdCQUFnQixDQUN2QyxxQkFBcUIsRUFDckIsbUlBQW1JLENBQ3BJLENBQUM7UUFDSixDQUFDO1FBQ0QsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNuRixPQUFPO1lBQ0wsSUFBSSxFQUFFLE1BQU07WUFDWixJQUFJLEVBQUUsSUFBSztZQUNYLElBQUk7WUFDSixNQUFNLEVBQUUsYUFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDO1lBQ3hDLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxJQUFLLEVBQUUsSUFBSSxFQUFFLElBQUssRUFBRTtZQUNsQyxHQUFHLE1BQU07U0FDVixDQUFDO0lBQ0osQ0FBQztJQUVELElBQUksQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLENBQUM7UUFDM0IsTUFBTSxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FDeEMsTUFBTSxFQUNOLE9BQU8sb0JBQW9CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyx1RUFBdUUsQ0FDOUcsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQ3BCLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLGtCQUFrQixFQUFFLFFBQVEsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQ3JGLENBQUM7SUFDRixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxNQUFNLEVBQUUsQ0FBQztBQUM3QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTTVRQIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBlbWFpbCBwbHVnaW46IHRoZSB0eXBlZFxuICoge0BsaW5rIEVtYWlsUGx1Z2luQ29uZmlnfSAodGhlIHBsdWdpbidzIHNsaWNlIG9mIEFwcEtpdCBjb25maWcpLCB0aGVcbiAqIEpTT04gU2NoZW1hIHRoZSBtYW5pZmVzdCBwdWJsaXNoZXMgZm9yIGl0LCBhbmQge0BsaW5rIHJlc29sdmVFbWFpbENvbmZpZ31cbiAqIHdoaWNoIGxheWVycyB0aGF0IGNvbmZpZyBvdmVyIGVudmlyb25tZW50IGRlZmF1bHRzIGludG8gdGhlIGNvbmNyZXRlXG4gKiB7QGxpbmsgUmVzb2x2ZWRFbWFpbENvbmZpZ30gdGhlIHJ1bnRpbWUgbmVlZHMuXG4gKlxuICogVHdvIG1vZGVzIGZhbGwgb3V0IG9mIHRoZSByZXNvbHV0aW9uLiBXaGVuIFNNVFAgY3JlZGVudGlhbHMgKGhvc3QgK1xuICogdXNlciArIHBhc3N3b3JkKSBhcmUgYWxsIHByZXNlbnQgaXQgcmVzb2x2ZXMgdG8gYG1vZGU6IFwic210cFwiYCBhbmRcbiAqIG1haWwgaXMgc2VudCBmb3IgcmVhbC4gV2hlbiB0aGV5IGFyZSBhYnNlbnQgYW5kIGBFTUFJTF9PVVRCT1hfTU9ERWBcbiAqIGlzIGV4cGxpY2l0bHkgZW5hYmxlZCBpdCByZXNvbHZlcyB0byBgbW9kZTogXCJmaWxlXCJgIChhbiBcIm91dGJveFwiKVxuICogYW5kIGVhY2ggbWVzc2FnZSBpcyB3cml0dGVuIHRvIGRpc2sgYXMgSFRNTCBpbnN0ZWFkIG9mIHNlbnQuIEFueVxuICogcGFydGlhbCBTTVRQIGNvbmZpZ3VyYXRpb24gb3IgYSBzZW5kIGF0dGVtcHQgd2l0aCBubyBjcmVkZW50aWFscyBhbmRcbiAqIG5vIG91dGJveCBvcHQtaW4gdGhyb3dzLlxuICpcbiAqIFByZWNlZGVuY2UgcGVyIGZpZWxkOiBleHBsaWNpdCBwbHVnaW4gY29uZmlnIHdpbnMsIHRoZW4gdGhlIG1hdGNoaW5nXG4gKiBlbnZpcm9ubWVudCB2YXJpYWJsZS4gRW52IG5hbWVzIGFyZSB1bnByZWZpeGVkIGJlY2F1c2UgdGhlIGFwcCB0YWxrc1xuICogdG8gYSBzaW5nbGUgU01UUCBzZXJ2ZXIgKGUuZy4gU01UUDJHTyk6IGBTTVRQX0hPU1RgLCBgU01UUF9QT1JUYCxcbiAqIGBTTVRQX1NFQ1VSRWAsIGBTTVRQX1VTRVJgLCBgU01UUF9QQVNTV09SRGAsIHBsdXMgYEVNQUlMX0RPTUFJTmAgZm9yXG4gKiB0aGUgZGVyaXZlZCBzZW5kZXIncyBkb21haW4sIGBFTUFJTF9GUk9NYCBmb3IgYW4gZXhwbGljaXQgb3ZlcnJpZGUsXG4gKiBgRU1BSUxfU1lTVEVNX0ZST01gIGZvciB0aGUgZG8tbm90LXJlcGx5IGFkZHJlc3Mgc3lzdGVtIG1haWwgc2VuZHMgZnJvbSxcbiAqIGBFTUFJTF9TRU5ERVJfUE9MSUNZYCBmb3IgdGhlIHNlbmRlciByZXN0cmljdGlvbiBtb2RlLCBhbmRcbiAqIGBFTUFJTF9PVVRCT1hfRElSYCBmb3IgdGhlIG91dGJveCBkaXJlY3RvcnkuXG4gKlxuICogQG1vZHVsZVxuICovXG5pbXBvcnQgeyByZXNvbHZlIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgQ29uZmlndXJhdGlvbkVycm9yLCBWYWxpZGF0aW9uRXJyb3IsIHR5cGUgQmFzZVBsdWdpbkNvbmZpZyB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGNvbmZpZ1V0aWxzLCBib29sZWFuLCBFTlZfT05MWSwgdGV4dCwgc3RyaW5nIH0gZnJvbSBcIkBkYngtdG9vbHMvY29yZVwiO1xuaW1wb3J0IHsgb3B0aW9uYWwgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgZGVmYXVsdEVtYWlsQnJhbmQsIHR5cGUgRW1haWxCcmFuZCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1lbWFpbC10ZW1wbGF0ZVwiO1xuaW1wb3J0IHR5cGUgeyBKU09OU2NoZW1hNyB9IGZyb20gXCJqc29uLXNjaGVtYVwiO1xuaW1wb3J0IHsgaXNTZW5kZXJBbGxvd2VkLCBwYXJzZUFsbG93ZWRTZW5kZXJzLCBzeXN0ZW1TZW5kZXJBZGRyZXNzIH0gZnJvbSBcIi4vc2VuZGVyLnRzXCI7XG5cbi8qKiBTTVRQIHN1Ym1pc3Npb24gcG9ydCB1c2VkIHdoZW4gbm9uZSBpcyBjb25maWd1cmVkLiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfU01UUF9QT1JUID0gNTg3O1xuXG4vKiogU01UUCBwb3J0IHRoYXQgaW1wbGllcyBhIFRMUy1vbi1jb25uZWN0IHNvY2tldCByYXRoZXIgdGhhbiBTVEFSVFRMUy4gKi9cbmV4cG9ydCBjb25zdCBJTVBMSUNJVF9UTFNfU01UUF9QT1JUID0gNDY1O1xuXG4vKipcbiAqIEhvdyB0aGUgc2VuZGVyIChgRnJvbWApIGFkZHJlc3MgaXMgcmVzdHJpY3RlZC5cbiAqXG4gKiBgXCJhbGxvd2xpc3RcImAgaXMgdGhlIGRlZmF1bHQgYW5kIHRoZSBkZW55LWJ5LWRlZmF1bHQgcG9zdHVyZTogYSBzZW5kIGlzXG4gKiBwZXJtaXR0ZWQgb25seSBmcm9tIGFuIGFkZHJlc3MgdGhlIGNvbmZpZ3VyYXRpb24gbmFtZXMsIGVpdGhlciB0aHJvdWdoXG4gKiB7QGxpbmsgRW1haWxQbHVnaW5Db25maWcuYWxsb3dlZFNlbmRlcnN9IG9yLCB3aGVuIHRoYXQgaXMgZW1wdHksIHRocm91Z2hcbiAqIHRoZSBjb25maWd1cmVkIHNlbmRlciBzb3VyY2UgKHtAbGluayBFbWFpbFBsdWdpbkNvbmZpZy5mcm9tfSBhcyBhbiBleGFjdFxuICogYWRkcmVzcywge0BsaW5rIEVtYWlsUGx1Z2luQ29uZmlnLmRvbWFpbn0gYXMgYSBgKkBkb21haW5gIHdpbGRjYXJkKS5cbiAqXG4gKiBgXCJ1bnJlc3RyaWN0ZWRcImAgaXMgdGhlIGV4cGxpY2l0IG9wdC1vdXQ6IGFueSBgRnJvbWAgYSBjYWxsZXIgc3VwcGxpZXMgaXNcbiAqIGFjY2VwdGVkLiBPbmx5IHJlYWNoIGZvciBpdCB3aGVuIGFuIHVwc3RyZWFtIHN5c3RlbSBhbHJlYWR5IHZldHMgdGhlXG4gKiBzZW5kZXIuXG4gKi9cbmV4cG9ydCB0eXBlIFNlbmRlclBvbGljeSA9IFwiYWxsb3dsaXN0XCIgfCBcInVucmVzdHJpY3RlZFwiO1xuXG4vKiogU01UUCBjb25uZWN0aW9uICsgY3JlZGVudGlhbHMuIEFsbCBmaWVsZHMgZmFsbCBiYWNrIHRvIGVudiB3aGVuIHVuc2V0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBTbXRwQ29uZmlnIHtcbiAgLyoqIFNNVFAgc2VydmVyIGhvc3RuYW1lIChgU01UUF9IT1NUYCkuICovXG4gIGhvc3Q/OiBzdHJpbmc7XG4gIC8qKiBTTVRQIHNlcnZlciBwb3J0IChgU01UUF9QT1JUYCkuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX1NNVFBfUE9SVH0uICovXG4gIHBvcnQ/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBVc2UgYSBUTFMtb24tY29ubmVjdCBzb2NrZXQgKGBTTVRQX1NFQ1VSRWApLiBEZWZhdWx0cyB0b1xuICAgKiBgcG9ydCA9PT0gYCB7QGxpbmsgSU1QTElDSVRfVExTX1NNVFBfUE9SVH0uXG4gICAqL1xuICBzZWN1cmU/OiBib29sZWFuO1xuICAvKiogU01UUCBhdXRoIHVzZXJuYW1lIChgU01UUF9VU0VSYCkuICovXG4gIHVzZXI/OiBzdHJpbmc7XG4gIC8qKiBTTVRQIGF1dGggcGFzc3dvcmQgLyBBUEkga2V5IChgU01UUF9QQVNTV09SRGApLiAqL1xuICBwYXNzd29yZD86IHN0cmluZztcbn1cblxuLyoqIEFwcEtpdCBjb25maWcgYWNjZXB0ZWQgYnkgdGhlIGVtYWlsIHBsdWdpbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW1haWxQbHVnaW5Db25maWcgZXh0ZW5kcyBCYXNlUGx1Z2luQ29uZmlnIHtcbiAgLyoqIFNNVFAgY29ubmVjdGlvbiArIGNyZWRlbnRpYWxzLiBPbWl0IHRvIHJ1biBpbiBmaWxlL291dGJveCBtb2RlLiAqL1xuICBzbXRwPzogU210cENvbmZpZztcbiAgLyoqXG4gICAqIERvbWFpbiB1c2VkIHRvIGJ1aWxkIHRoZSBzZW5kZXIgYWRkcmVzcyBmcm9tIHRoZSBvbi1iZWhhbGYtb2YgdXNlclxuICAgKiAoYDxsb2NhbC1wYXJ0PkA8ZG9tYWluPmApLiBGYWxscyBiYWNrIHRvIGBFTUFJTF9ET01BSU5gLiBSZXF1aXJlZCBpblxuICAgKiBTTVRQIG1vZGUgdW5sZXNzIHtAbGluayBmcm9tfSBpcyBzZXQ7IG9wdGlvbmFsIGluIGZpbGUgbW9kZSAodGhlXG4gICAqIG91dGJveCBmYWxscyBiYWNrIHRvIHRoZSB1c2VyJ3Mgb3duIGVtYWlsIGFkZHJlc3MpLlxuICAgKi9cbiAgZG9tYWluPzogc3RyaW5nO1xuICAvKipcbiAgICogRXhwbGljaXQgYEZyb21gIGFkZHJlc3MsIE9QVElPTkFMLiBXaGVuIHNldCwgdGhlIHNlbmRlciBpcyB1c2VkIHZlcmJhdGltXG4gICAqIGFuZCB0aGUgcGVyLXVzZXIgZGVyaXZhdGlvbiBpcyBza2lwcGVkLiBGYWxscyBiYWNrIHRvIGBFTUFJTF9GUk9NYC5cbiAgICpcbiAgICogTGVhdmUgaXQgdW5zZXQgaW4gbW9zdCBkZXBsb3ltZW50czoge0BsaW5rIGRvbWFpbn0gYWxvbmUgaXMgZW5vdWdoLCBhbmRcbiAgICogbWFpbCB0aGVuIGNvbWVzIGZyb20gdGhlIGFkZHJlc3Mgb2YgdGhlIHBlcnNvbiB3aG8gY2F1c2VkIGl0LCB3aGljaCBpcyB3aGF0XG4gICAqIGEgcmVjaXBpZW50IGV4cGVjdHMgdG8gYmUgYWJsZSB0byByZXBseSB0by5cbiAgICovXG4gIGZyb20/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBgRnJvbWAgZm9yIFNZU1RFTSBtYWlsIC0gYSBzZW5kIHdpdGggbm8gb24tYmVoYWxmLW9mIHVzZXIsIHN1Y2ggYXMgYVxuICAgKiBzaWduLWluIGNvZGUgb3IgYSBwYXNzd29yZCByZXNldC4gRmFsbHMgYmFjayB0byBgRU1BSUxfU1lTVEVNX0ZST01gLCB0aGVuXG4gICAqIHRvIGBuby1yZXBseUA8ZG9tYWluPmAsIHRoZW4gdG8ge0BsaW5rIGZyb219LlxuICAgKlxuICAgKiBNYWNoaW5lIG1haWwgZ2V0cyBhIGRvLW5vdC1yZXBseSBhZGRyZXNzIGJ5IGRlZmF1bHQgYmVjYXVzZSBhIHJlcGx5IHRvIGl0XG4gICAqIHJlYWNoZXMgbm9ib2R5LiBTZXQgdGhpcyB0byByb3V0ZSB0aG9zZSByZXBsaWVzIHNvbWV3aGVyZSByZWFsIChhIG1vbml0b3JlZFxuICAgKiBgc3VwcG9ydEBgKSBvciB0byBzcGVsbCB0aGUgbG9jYWwgcGFydCBkaWZmZXJlbnRseSAoYGRvbm90cmVwbHlAYCkuXG4gICAqL1xuICBzeXN0ZW1Gcm9tPzogc3RyaW5nO1xuICAvKipcbiAgICogRGlyZWN0b3J5IGZvciB0aGUgZmlsZS9vdXRib3ggZmFsbGJhY2suIEZhbGxzIGJhY2sgdG9cbiAgICogYEVNQUlMX09VVEJPWF9ESVJgLCB0aGVuIGA8Y3dkPi90bXBgLiBPbmx5IHVzZWQgd2hlbiBTTVRQXG4gICAqIGNyZWRlbnRpYWxzIGFyZSBhYnNlbnQuXG4gICAqL1xuICBvdXREaXI/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBbGxvdy1saXN0IHJlc3RyaWN0aW5nIHRoZSBzZW5kZXIgKGBGcm9tYCkgYWRkcmVzcy4gRWFjaCBlbnRyeSBpcyBhblxuICAgKiBleGFjdCBhZGRyZXNzIChgdXNlckBkb21haW4uY29tYCksIGEgZG9tYWluIHdpbGRjYXJkIChgKkBkb21haW4uY29tYFxuICAgKiBvciB0aGUgYmFyZSBgZG9tYWluLmNvbWAsIG1hdGNoaW5nIGFueSBsb2NhbCBwYXJ0IG9uIHRoYXQgZG9tYWluKSwgb3JcbiAgICogYCpgIChhbnkpLiBBIHJlc29sdmVkIC8gY2hvc2VuIHNlbmRlciB0aGF0IG1hdGNoZXMgbm8gZW50cnkgaXNcbiAgICogcmVqZWN0ZWQgYXQgc2VuZCB0aW1lLiBBY2NlcHRzIGEgYHN0cmluZ1tdYCBvciBhIHNpbmdsZSBjb21tYS0gL1xuICAgKiB3aGl0ZXNwYWNlLXNlcGFyYXRlZCBzdHJpbmc7IGZhbGxzIGJhY2sgdG8gYEVNQUlMX0FMTE9XRURfU0VOREVSU2AuXG4gICAqIFdoZW4gZW1wdHksIHRoZSB7QGxpbmsgc2VuZGVyUG9saWN5fSBkZWNpZGVzIHdoYXQgaXMgcGVybWl0dGVkLlxuICAgKi9cbiAgYWxsb3dlZFNlbmRlcnM/OiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIEhvdyB0aGUgc2VuZGVyIGFkZHJlc3MgaXMgcmVzdHJpY3RlZCB3aGVuIHtAbGluayBhbGxvd2VkU2VuZGVyc30gaXNcbiAgICogZW1wdHkgKGBFTUFJTF9TRU5ERVJfUE9MSUNZYCkuIERlZmF1bHRzIHRvIGBcImFsbG93bGlzdFwiYCwgd2hpY2hcbiAgICogbmFycm93cyBzZW5kcyB0byB0aGUgY29uZmlndXJlZCBzZW5kZXIgc291cmNlLiBTZWVcbiAgICoge0BsaW5rIFNlbmRlclBvbGljeX0uXG4gICAqL1xuICBzZW5kZXJQb2xpY3k/OiBTZW5kZXJQb2xpY3k7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBicmFuZCBzdHlsaW5nIGFwcGxpZWQgdG8gZXZlcnkgcmVuZGVyZWQgbWVzc2FnZS4gT21pdCB0byB1c2UgdGhlXG4gICAqIHJlcG9zaXRvcnkncyBkYngtdG9vbHMgYnJhbmQuIFBhc3Mge0BsaW5rIGVtYWlsQnJhbmRGcm9tQ29udGV4dH0gdG8gZGVyaXZlXG4gICAqIGEgY3VzdG9tIHZhbHVlIGZyb20gYSBzaGFyZWQgYEJyYW5kQ29udGV4dGAuXG4gICAqL1xuICBicmFuZD86IEVtYWlsQnJhbmQ7XG59XG5cbi8qKiBDb25maWcgc2hhcmVkIGJ5IGJvdGggcmVzb2x2ZWQgbW9kZXMuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkU2VuZGVyIHtcbiAgLyoqIFNlbmRlciBkb21haW47IHByZXNlbnQgd2hlbmV2ZXIge0BsaW5rIGZyb219IGlzIGFic2VudC4gKi9cbiAgZG9tYWluPzogc3RyaW5nO1xuICAvKiogRXhwbGljaXQgc2VuZGVyIG92ZXJyaWRlOyBwcmVzZW50IHNraXBzIHBlci11c2VyIGRlcml2YXRpb24uICovXG4gIGZyb20/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBFeHBsaWNpdCBkby1ub3QtcmVwbHkgc2VuZGVyIGZvciBzeXN0ZW0gbWFpbC4gQWJzZW50IG1lYW5zIGl0IGlzIGRlcml2ZWQgLVxuICAgKiBzZWUge0BsaW5rIHN5c3RlbVNlbmRlckFkZHJlc3N9LlxuICAgKi9cbiAgc3lzdGVtRnJvbT86IHN0cmluZztcbiAgLyoqXG4gICAqIEVmZmVjdGl2ZSBzZW5kZXIgYWxsb3ctbGlzdDogdGhlIGNvbmZpZ3VyZWQgcGF0dGVybnMgd2hlbiBhbnkgd2VyZVxuICAgKiBnaXZlbiwgZWxzZSB0aGUgcGF0dGVybnMgaW1wbGllZCBieSB0aGUgc2VuZGVyIHNvdXJjZSB1bmRlciBhblxuICAgKiBgXCJhbGxvd2xpc3RcImAgcG9saWN5LiBFbXB0eSBtZWFucyB1bmVuZm9yY2VhYmxlIChhbiBgXCJ1bnJlc3RyaWN0ZWRcImBcbiAgICogcG9saWN5LCBvciBhbiBvdXRib3ggd2l0aCBubyBzZW5kZXIgc291cmNlIHRvIG5hcnJvdyB0bykuXG4gICAqL1xuICBhbGxvd2VkU2VuZGVyczogc3RyaW5nW107XG4gIC8qKiBUaGUgcmVzdHJpY3Rpb24gbW9kZSB0aGUgYWxsb3ctbGlzdCB3YXMgcmVzb2x2ZWQgdW5kZXIuICovXG4gIHNlbmRlclBvbGljeTogU2VuZGVyUG9saWN5O1xuICAvKiogQnJhbmQgc3R5bGluZyBhcHBsaWVkIHRvIHJlbmRlcmVkIEhUTUwuICovXG4gIGJyYW5kOiBFbWFpbEJyYW5kO1xufVxuXG4vKiogUmVzb2x2ZWQgY29uZmlnIGZvciByZWFsIFNNVFAgZGVsaXZlcnkuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkU210cENvbmZpZyBleHRlbmRzIFJlc29sdmVkU2VuZGVyIHtcbiAgbW9kZTogXCJzbXRwXCI7XG4gIGhvc3Q6IHN0cmluZztcbiAgcG9ydDogbnVtYmVyO1xuICBzZWN1cmU6IGJvb2xlYW47XG4gIGF1dGg6IHsgdXNlcjogc3RyaW5nOyBwYXNzOiBzdHJpbmcgfTtcbn1cblxuLyoqIFJlc29sdmVkIGNvbmZpZyBmb3IgdGhlIGZpbGUvb3V0Ym94IGZhbGxiYWNrIChubyBTTVRQIGNyZWRlbnRpYWxzKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRGaWxlQ29uZmlnIGV4dGVuZHMgUmVzb2x2ZWRTZW5kZXIge1xuICBtb2RlOiBcImZpbGVcIjtcbiAgLyoqIEFic29sdXRlIGRpcmVjdG9yeSBtZXNzYWdlcyBhcmUgd3JpdHRlbiB1bmRlci4gKi9cbiAgb3V0RGlyOiBzdHJpbmc7XG59XG5cbi8qKiBDb25jcmV0ZSwgdmFsaWRhdGVkIGNvbmZpZyB0aGUgcnVudGltZSBkaXNwYXRjaGVzIHRocm91Z2guICovXG5leHBvcnQgdHlwZSBSZXNvbHZlZEVtYWlsQ29uZmlnID0gUmVzb2x2ZWRTbXRwQ29uZmlnIHwgUmVzb2x2ZWRGaWxlQ29uZmlnO1xuXG4vKiogSlNPTiBTY2hlbWEgcHVibGlzaGVkIG9uIHRoZSBtYW5pZmVzdCdzIGBjb25maWcuc2NoZW1hYC4gKi9cbmV4cG9ydCBjb25zdCBFTUFJTF9DT05GSUdfU0NIRU1BOiBKU09OU2NoZW1hNyA9IHtcbiAgdHlwZTogXCJvYmplY3RcIixcbiAgcHJvcGVydGllczoge1xuICAgIHNtdHA6IHtcbiAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJTTVRQIGNvbm5lY3Rpb24gYW5kIGNyZWRlbnRpYWxzIChlbnYgZmFsbGJhY2tzOiBTTVRQXyopLlwiLFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBob3N0OiB7IHR5cGU6IFwic3RyaW5nXCIsIGRlc2NyaXB0aW9uOiBcIlNNVFAgc2VydmVyIGhvc3RuYW1lIChTTVRQX0hPU1QpLlwiIH0sXG4gICAgICAgIHBvcnQ6IHtcbiAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBgU01UUCBzZXJ2ZXIgcG9ydCAoU01UUF9QT1JUKS4gRGVmYXVsdHMgdG8gJHtERUZBVUxUX1NNVFBfUE9SVH0uYCxcbiAgICAgICAgfSxcbiAgICAgICAgc2VjdXJlOiB7XG4gICAgICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICAgICAgZGVzY3JpcHRpb246IGBUTFMtb24tY29ubmVjdCBzb2NrZXQgKFNNVFBfU0VDVVJFKS4gRGVmYXVsdHMgdG8gcG9ydCA9PT0gJHtJTVBMSUNJVF9UTFNfU01UUF9QT1JUfS5gLFxuICAgICAgICB9LFxuICAgICAgICB1c2VyOiB7IHR5cGU6IFwic3RyaW5nXCIsIGRlc2NyaXB0aW9uOiBcIlNNVFAgYXV0aCB1c2VybmFtZSAoU01UUF9VU0VSKS5cIiB9LFxuICAgICAgICBwYXNzd29yZDoge1xuICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgZGVzY3JpcHRpb246IFwiU01UUCBhdXRoIHBhc3N3b3JkIC8gQVBJIGtleSAoU01UUF9QQVNTV09SRCkuXCIsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgZG9tYWluOiB7XG4gICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiRG9tYWluIGZvciB0aGUgZGVyaXZlZCBzZW5kZXIgYWRkcmVzcyAoPHVzZXItbG9jYWwtcGFydD5APGRvbWFpbj4pLiBGYWxscyBiYWNrIHRvIEVNQUlMX0RPTUFJTi5cIixcbiAgICB9LFxuICAgIGZyb206IHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJPcHRpb25hbCBleHBsaWNpdCBGcm9tIGFkZHJlc3M7IHNraXBzIHBlci11c2VyIGRlcml2YXRpb24uIEZhbGxzIGJhY2sgdG8gRU1BSUxfRlJPTS5cIixcbiAgICB9LFxuICAgIHN5c3RlbUZyb206IHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJGcm9tIGZvciBzeXN0ZW0gbWFpbCAobm8gb24tYmVoYWxmLW9mIHVzZXIsIGUuZy4gYSBzaWduLWluIGNvZGUpLiBGYWxscyBiYWNrIHRvIEVNQUlMX1NZU1RFTV9GUk9NLCB0aGVuIG5vLXJlcGx5QDxkb21haW4+LCB0aGVuIGZyb20uXCIsXG4gICAgfSxcbiAgICBvdXREaXI6IHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJEaXJlY3RvcnkgZm9yIHRoZSBmaWxlL291dGJveCBmYWxsYmFjayB3aGVuIFNNVFAgaXMgdW5jb25maWd1cmVkLiBGYWxscyBiYWNrIHRvIEVNQUlMX09VVEJPWF9ESVIsIHRoZW4gPGN3ZD4vdG1wLlwiLFxuICAgIH0sXG4gICAgYWxsb3dlZFNlbmRlcnM6IHtcbiAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgIGl0ZW1zOiB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAnQWxsb3ctbGlzdCBvZiBwZXJtaXR0ZWQgc2VuZGVyIChGcm9tKSBwYXR0ZXJuczogZXhhY3QgYWRkcmVzc2VzIChcInVzZXJAZG9tYWluLmNvbVwiKSwgZG9tYWluIHdpbGRjYXJkcyAoXCIqQGRvbWFpbi5jb21cIiksIG9yIFwiKlwiLiBBbHNvIGFjY2VwdHMgYSBjb21tYS9zcGFjZS1zZXBhcmF0ZWQgc3RyaW5nLiBGYWxscyBiYWNrIHRvIEVNQUlMX0FMTE9XRURfU0VOREVSUy4gV2hlbiBlbXB0eSwgc2VuZGVyUG9saWN5IGRlY2lkZXMuJyxcbiAgICB9LFxuICAgIHNlbmRlclBvbGljeToge1xuICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgIGVudW06IFtcImFsbG93bGlzdFwiLCBcInVucmVzdHJpY3RlZFwiXSxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAnSG93IHRoZSBzZW5kZXIgaXMgcmVzdHJpY3RlZCB3aGVuIGFsbG93ZWRTZW5kZXJzIGlzIGVtcHR5IChFTUFJTF9TRU5ERVJfUE9MSUNZKS4gXCJhbGxvd2xpc3RcIiAoZGVmYXVsdCkgbmFycm93cyBzZW5kcyB0byB0aGUgY29uZmlndXJlZCBzZW5kZXIgc291cmNlOyBcInVucmVzdHJpY3RlZFwiIGFjY2VwdHMgYW55IEZyb20uJyxcbiAgICB9LFxuICAgIGJyYW5kOiB7XG4gICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiQnJhbmQgc3R5bGluZyBhcHBsaWVkIHRvIGV2ZXJ5IFJlYWN0IEVtYWlsIG1lc3NhZ2UuIE9taXQgdG8gdXNlIHRoZSBkYngtdG9vbHMgYnJhbmQuXCIsXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIGFjY2VudDoge1xuICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgZGVzY3JpcHRpb246ICdIZWFkZXItYmFuZCBiYWNrZ3JvdW5kIGFuZCBib2R5IGxpbmsgY29sb3IgKGUuZy4gXCIjRkYzNjIxXCIpLicsXG4gICAgICAgIH0sXG4gICAgICAgIG9uQWNjZW50OiB7XG4gICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICBkZXNjcmlwdGlvbjogXCJUZXh0IGFuZCBsb2dvIGNvbG9yIHJlbmRlcmVkIG9uIHRoZSBhY2NlbnQgYmFuZC4gRGVmYXVsdHMgdG8gd2hpdGUuXCIsXG4gICAgICAgIH0sXG4gICAgICAgIGZvbnRGYW1pbHk6IHtcbiAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnQm9keSBmb250IHN0YWNrIChlLmcuIFwiSW50ZXIsIHVpLXNhbnMtc2VyaWYsIHN5c3RlbS11aSwgc2Fucy1zZXJpZlwiKS4nLFxuICAgICAgICB9LFxuICAgICAgICBuYW1lOiB7XG4gICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICBkZXNjcmlwdGlvbjogXCJQcm9kdWN0IC8gZGlzcGxheSBuYW1lIHVzZWQgYXMgdGhlIGhlYWRlciB0ZXh0IGFuZCB0aGUgbG9nbyBhbHQgdGV4dC5cIixcbiAgICAgICAgfSxcbiAgICAgICAgbG9nb1VybDoge1xuICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgICBcIkxvZ28gaW1hZ2UgZm9yIHRoZSBoZWFkZXIgYmFuZC4gT25seSBhbiBodHRwKHMpOiBvciBkYXRhOiBVUkwgcmVuZGVyczsgb3RoZXIgdmFsdWVzIGFyZSBkcm9wcGVkIGJlY2F1c2UgYSBtYWlsIGNsaWVudCBjYW5ub3QgbG9hZCB0aGVtLlwiLFxuICAgICAgICB9LFxuICAgICAgICBiYWNrZ3JvdW5kOiB7IHR5cGU6IFwic3RyaW5nXCIsIGRlc2NyaXB0aW9uOiBcIkluYm94IGNhbnZhcyBjb2xvci5cIiB9LFxuICAgICAgICBzdXJmYWNlOiB7IHR5cGU6IFwic3RyaW5nXCIsIGRlc2NyaXB0aW9uOiBcIk1lc3NhZ2UtY2FyZCBjb2xvci5cIiB9LFxuICAgICAgICBmb3JlZ3JvdW5kOiB7IHR5cGU6IFwic3RyaW5nXCIsIGRlc2NyaXB0aW9uOiBcIlByaW1hcnkgdGV4dCBjb2xvci5cIiB9LFxuICAgICAgICBtdXRlZDogeyB0eXBlOiBcInN0cmluZ1wiLCBkZXNjcmlwdGlvbjogXCJTZWNvbmRhcnkgdGV4dCBjb2xvci5cIiB9LFxuICAgICAgICBib3JkZXI6IHsgdHlwZTogXCJzdHJpbmdcIiwgZGVzY3JpcHRpb246IFwiQm9yZGVyIGFuZCBkaXZpZGVyIGNvbG9yLlwiIH0sXG4gICAgICAgIHRhZ2xpbmU6IHsgdHlwZTogXCJzdHJpbmdcIiwgZGVzY3JpcHRpb246IFwiRm9vdGVyIHByb2R1Y3QgbGluZS5cIiB9LFxuICAgICAgICB3ZWJzaXRlOiB7IHR5cGU6IFwic3RyaW5nXCIsIGRlc2NyaXB0aW9uOiBcIk9wdGlvbmFsIGZvb3RlciB3ZWJzaXRlIFVSTC5cIiB9LFxuICAgICAgfSxcbiAgICAgIHJlcXVpcmVkOiBbXCJhY2NlbnRcIiwgXCJmb250RmFtaWx5XCJdLFxuICAgIH0sXG4gIH0sXG59O1xuXG4vKiogUGFyc2UgdGhlIGBTTVRQX1NFQ1VSRWAgZW52IC8gY29uZmlnIGZsYWcsIGRlZmF1bHRpbmcgYnkgcG9ydC4gKi9cbmZ1bmN0aW9uIHJlc29sdmVTZWN1cmUoZmxhZzogYm9vbGVhbiB8IHVuZGVmaW5lZCwgcG9ydDogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiBib29sZWFuKGZsYWcsIFwiU01UUF9TRUNVUkVcIiwgRU5WX09OTFkpID8/IHBvcnQgPT09IElNUExJQ0lUX1RMU19TTVRQX1BPUlQ7XG59XG5cbi8qKiBQYXJzZSB0aGUgYEVNQUlMX1NFTkRFUl9QT0xJQ1lgIGVudiAvIGNvbmZpZyB2YWx1ZSwgZGVmYXVsdGluZyB0byBkZW55LWJ5LWRlZmF1bHQuICovXG5mdW5jdGlvbiByZXNvbHZlU2VuZGVyUG9saWN5KHBvbGljeTogU2VuZGVyUG9saWN5IHwgdW5kZWZpbmVkKTogU2VuZGVyUG9saWN5IHtcbiAgY29uc3QgcmF3ID0gcG9saWN5ID8/IHRleHQoXCJFTUFJTF9TRU5ERVJfUE9MSUNZXCIsIEVOVl9PTkxZKT8udG9Mb3dlckNhc2UoKTtcbiAgaWYgKHJhdyA9PT0gXCJ1bnJlc3RyaWN0ZWRcIikgcmV0dXJuIFwidW5yZXN0cmljdGVkXCI7XG4gIGlmIChyYXcgPT09IHVuZGVmaW5lZCB8fCByYXcgPT09IFwiXCIgfHwgcmF3ID09PSBcImFsbG93bGlzdFwiKSByZXR1cm4gXCJhbGxvd2xpc3RcIjtcbiAgdGhyb3cgVmFsaWRhdGlvbkVycm9yLmludmFsaWRWYWx1ZShcInNlbmRlclBvbGljeVwiLCByYXcsICdcImFsbG93bGlzdFwiIG9yIFwidW5yZXN0cmljdGVkXCInKTtcbn1cblxuLyoqXG4gKiBFZmZlY3RpdmUgYWxsb3ctbGlzdCBmb3IgYW4gYFwiYWxsb3dsaXN0XCJgIHBvbGljeSB3aXRoIG5vIGV4cGxpY2l0IHBhdHRlcm5zOlxuICogdGhlIHNlbmRlciBzb3VyY2UgaXRzZWxmLCBzbyBhIGNvbmZpZ3VyZWQgZG9tYWluIG9yIGZpeGVkIGFkZHJlc3MgaXMgdGhlXG4gKiBib3VuZGFyeSByYXRoZXIgdGhhbiBcImFueXRoaW5nIGdvZXNcIi4gWWllbGRzIG5vdGhpbmcgd2hlbiBuZWl0aGVyIGlzIHNldCxcbiAqIHdoaWNoIG9ubHkgaGFwcGVucyBpbiBvdXRib3ggbW9kZSAod2hlcmUgdGhlIHNlbmRlciBmYWxscyBiYWNrIHRvIHRoZVxuICogb24tYmVoYWxmLW9mIHVzZXIncyBvd24gYWRkcmVzcyBhbmQgY2Fubm90IGJlIGVudW1lcmF0ZWQgdXAgZnJvbnQpLlxuICovXG5mdW5jdGlvbiBpbXBsaWVkU2VuZGVyUGF0dGVybnMoc2VuZGVyOiB7XG4gIGRvbWFpbj86IHN0cmluZztcbiAgZnJvbT86IHN0cmluZztcbiAgc3lzdGVtRnJvbT86IHN0cmluZztcbn0pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHBhdHRlcm5zOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAoc2VuZGVyLmZyb20pIHBhdHRlcm5zLnB1c2goc2VuZGVyLmZyb20udHJpbSgpLnRvTG93ZXJDYXNlKCkpO1xuICBpZiAoc2VuZGVyLmRvbWFpbikgcGF0dGVybnMucHVzaChgKkAke3NlbmRlci5kb21haW4udHJpbSgpLnRvTG93ZXJDYXNlKCl9YCk7XG4gIC8vIFRoZSBzeXN0ZW0gc2VuZGVyIHRvbywgd2hlbiB0aGUgcGF0dGVybnMgYWJvdmUgZG8gbm90IGFscmVhZHkgY292ZXIgaXQ6IGl0XG4gIC8vIGlzIGFuIGFkZHJlc3MgdGhpcyBhcHAgU0VORFMgZnJvbSwgc28gYSBsaXN0IGRlcml2ZWQgZnJvbSB0aGUgc2VuZGVyIHNvdXJjZVxuICAvLyBoYXMgdG8gcGVybWl0IGl0LCBvciB0aGUgdmVyeSBwb2xpY3kgbWVhbnQgdG8gZGVzY3JpYmUgdGhlIGFwcCdzIG93biBzZW5kZXJzXG4gIC8vIGRlbmllcyBpdHMgc2lnbi1pbiBtYWlsLiBVc3VhbGx5IHJlZHVuZGFudCAoYCpAZG9tYWluYCBhbHJlYWR5IG1hdGNoZXNcbiAgLy8gYG5vLXJlcGx5QGRvbWFpbmApIC0gaXQgbWF0dGVycyBmb3IgYSBgc3lzdGVtRnJvbWAgb24gYW5vdGhlciBkb21haW4uXG4gIGNvbnN0IHN5c3RlbSA9IHN5c3RlbVNlbmRlckFkZHJlc3Moc2VuZGVyKT8udG9Mb3dlckNhc2UoKTtcbiAgaWYgKHN5c3RlbSAmJiAhaXNTZW5kZXJBbGxvd2VkKHN5c3RlbSwgcGF0dGVybnMpKSBwYXR0ZXJucy5wdXNoKHN5c3RlbSk7XG4gIHJldHVybiBwYXR0ZXJucztcbn1cblxuLyoqIFdoZXRoZXIgYEVNQUlMX09VVEJPWF9NT0RFYCBleHBsaWNpdGx5IG9wdHMgaW50byB0aGUgZmlsZS9vdXRib3ggZmFsbGJhY2suICovXG5mdW5jdGlvbiBpc091dGJveE1vZGVFbmFibGVkKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gYm9vbGVhbih1bmRlZmluZWQsIFwiRU1BSUxfT1VUQk9YX01PREVcIiwgRU5WX09OTFkpID8/IGZhbHNlO1xufVxuXG5jb25zdCBTTVRQX1JFUVVJUkVEX0ZJRUxEUyA9IFtcIlNNVFBfSE9TVFwiLCBcIlNNVFBfVVNFUlwiLCBcIlNNVFBfUEFTU1dPUkRcIl0gYXMgY29uc3Q7XG5cbi8qKiBMaXN0IGVudiBrZXlzIGZvciBTTVRQIGZpZWxkcyB0aGF0IGFyZSB1bnNldCBpbiB0aGUgcmVzb2x2ZWQgY3JlZGVudGlhbCBzZXQuICovXG5mdW5jdGlvbiBtaXNzaW5nU210cEZpZWxkcyhcbiAgaG9zdDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICB1c2VyOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHBhc3M6IHN0cmluZyB8IHVuZGVmaW5lZCxcbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgdmFsdWVzID0gW2hvc3QsIHVzZXIsIHBhc3NdIGFzIGNvbnN0O1xuICByZXR1cm4gU01UUF9SRVFVSVJFRF9GSUVMRFMuZmlsdGVyKChfLCBpbmRleCkgPT4gIXZhbHVlc1tpbmRleF0pO1xufVxuXG4vKipcbiAqIFJlc29sdmUgcGx1Z2luIGNvbmZpZyBvdmVyIGVudmlyb25tZW50IGRlZmF1bHRzLlxuICpcbiAqIFdoZW4gU01UUCBob3N0ICsgdXNlciArIHBhc3N3b3JkIGFyZSBhbGwgcHJlc2VudCwgcmV0dXJucyBgbW9kZTpcbiAqIFwic210cFwiYCBmb3IgcmVhbCBkZWxpdmVyeSAoYW5kIHRocm93cyBpZiBubyBzZW5kZXIgc291cmNlIC0gZG9tYWluLFxuICogZnJvbSwgb3Igc3lzdGVtRnJvbSAtIGlzIGNvbmZpZ3VyZWQsIHNpbmNlIFNNVFAgY2FuJ3QgZGVyaXZlIG9uZSBmcm9tXG4gKiBub3RoaW5nOyBgZG9tYWluYCBhbG9uZSBpcyB0aGUgaW50ZW5kZWQgbWluaW11bSkuXG4gKiBXaGVuIGFsbCB0aHJlZSBhcmUgYWJzZW50IGFuZCBgRU1BSUxfT1VUQk9YX01PREVgIGlzIGVuYWJsZWQsIHJldHVybnNcbiAqIGBtb2RlOiBcImZpbGVcImAgc28gdGhlIHJ1bnRpbWUgd3JpdGVzIG1lc3NhZ2VzIHRvIHRoZSBvdXRib3ggZGlyZWN0b3J5XG4gKiBmb3IgbG9jYWwgdGVzdGluZzsgaW4gdGhhdCBtb2RlIGEgc2VuZGVyIHNvdXJjZSBpcyBvcHRpb25hbCAodGhlXG4gKiBvdXRib3ggZmFsbHMgYmFjayB0byB0aGUgT0JPIHVzZXIncyBvd24gYWRkcmVzcykuIFBhcnRpYWwgU01UUFxuICogY29uZmlndXJhdGlvbiBvciBhIHNlbmQgd2l0aCBubyBjcmVkZW50aWFscyBhbmQgbm8gb3V0Ym94IG9wdC1pblxuICogdGhyb3dzLlxuICpcbiAqIFRoZSBzZW5kZXIgYWxsb3ctbGlzdCBpcyByZXNvbHZlZCBoZXJlIHRvbzogdW5kZXIgdGhlIGRlZmF1bHRcbiAqIGBcImFsbG93bGlzdFwiYCBwb2xpY3kgYW4gZW1wdHkgbGlzdCBpcyBmaWxsZWQgaW4gZnJvbSB0aGUgc2VuZGVyIHNvdXJjZSxcbiAqIHNvIGEgZGVwbG95bWVudCB0aGF0IG9ubHkgc2V0cyBgRU1BSUxfRE9NQUlOYCBzdGlsbCByZWplY3RzIGEgYEZyb21gIG9uXG4gKiBhbnkgb3RoZXIgZG9tYWluLiBTZWUge0BsaW5rIFNlbmRlclBvbGljeX0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRW1haWxDb25maWcoY29uZmlnOiBFbWFpbFBsdWdpbkNvbmZpZyA9IHt9KTogUmVzb2x2ZWRFbWFpbENvbmZpZyB7XG4gIGNvbnN0IHNtdHAgPSBjb25maWcuc210cCA/PyB7fTtcbiAgY29uc3QgaG9zdCA9IHN0cmluZyhzbXRwLmhvc3QsIFwiU01UUF9IT1NUXCIsIEVOVl9PTkxZKTtcbiAgY29uc3QgdXNlciA9IHN0cmluZyhzbXRwLnVzZXIsIFwiU01UUF9VU0VSXCIsIEVOVl9PTkxZKTtcbiAgY29uc3QgcGFzcyA9IHN0cmluZyhzbXRwLnBhc3N3b3JkLCBcIlNNVFBfUEFTU1dPUkRcIiwgRU5WX09OTFkpO1xuICBjb25zdCBkb21haW4gPSBzdHJpbmcoY29uZmlnLmRvbWFpbiwgXCJFTUFJTF9ET01BSU5cIiwgRU5WX09OTFkpO1xuICBjb25zdCBmcm9tID0gc3RyaW5nKGNvbmZpZy5mcm9tLCBcIkVNQUlMX0ZST01cIiwgRU5WX09OTFkpO1xuICBjb25zdCBzeXN0ZW1Gcm9tID0gc3RyaW5nKGNvbmZpZy5zeXN0ZW1Gcm9tLCBcIkVNQUlMX1NZU1RFTV9GUk9NXCIsIEVOVl9PTkxZKTtcbiAgY29uc3Qgc2VuZGVyUG9saWN5ID0gcmVzb2x2ZVNlbmRlclBvbGljeShjb25maWcuc2VuZGVyUG9saWN5KTtcbiAgY29uc3QgY29uZmlndXJlZFNlbmRlcnMgPSBwYXJzZUFsbG93ZWRTZW5kZXJzKFxuICAgIGNvbmZpZy5hbGxvd2VkU2VuZGVycyA/PyB0ZXh0KFwiRU1BSUxfQUxMT1dFRF9TRU5ERVJTXCIsIEVOVl9PTkxZKSxcbiAgKTtcbiAgY29uc3QgYWxsb3dlZFNlbmRlcnMgPVxuICAgIGNvbmZpZ3VyZWRTZW5kZXJzLmxlbmd0aCA+IDAgfHwgc2VuZGVyUG9saWN5ID09PSBcInVucmVzdHJpY3RlZFwiXG4gICAgICA/IGNvbmZpZ3VyZWRTZW5kZXJzXG4gICAgICA6IGltcGxpZWRTZW5kZXJQYXR0ZXJucyh7IGRvbWFpbiwgZnJvbSwgc3lzdGVtRnJvbSB9KTtcbiAgY29uc3Qgc2VuZGVyOiBSZXNvbHZlZFNlbmRlciA9IHtcbiAgICAuLi5vcHRpb25hbChcImRvbWFpblwiLCBkb21haW4pLFxuICAgIC4uLm9wdGlvbmFsKFwiZnJvbVwiLCBmcm9tKSxcbiAgICAuLi5vcHRpb25hbChcInN5c3RlbUZyb21cIiwgc3lzdGVtRnJvbSksXG4gICAgYWxsb3dlZFNlbmRlcnMsXG4gICAgc2VuZGVyUG9saWN5LFxuICAgIGJyYW5kOiBjb25maWcuYnJhbmQgPz8gZGVmYXVsdEVtYWlsQnJhbmQsXG4gIH07XG5cbiAgY29uc3QgaGFzQWxsU210cCA9IEJvb2xlYW4oaG9zdCAmJiB1c2VyICYmIHBhc3MpO1xuICBjb25zdCBoYXNBbnlTbXRwID0gQm9vbGVhbihob3N0IHx8IHVzZXIgfHwgcGFzcyk7XG5cbiAgaWYgKGhhc0FueVNtdHAgJiYgIWhhc0FsbFNtdHApIHtcbiAgICB0aHJvdyBWYWxpZGF0aW9uRXJyb3IubWlzc2luZ0VudlZhcnMobWlzc2luZ1NtdHBGaWVsZHMoaG9zdCwgdXNlciwgcGFzcykpO1xuICB9XG5cbiAgaWYgKGhhc0FsbFNtdHApIHtcbiAgICBpZiAoIWRvbWFpbiAmJiAhZnJvbSAmJiAhc3lzdGVtRnJvbSkge1xuICAgICAgdGhyb3cgQ29uZmlndXJhdGlvbkVycm9yLnJlc291cmNlTm90Rm91bmQoXG4gICAgICAgIFwiRW1haWwgc2VuZGVyIHNvdXJjZVwiLFxuICAgICAgICBcIlNldCBFTUFJTF9ET01BSU4gdG8gZGVyaXZlIDx1c2VyLWxvY2FsLXBhcnQ+QDxkb21haW4+IChhbmQgbm8tcmVwbHlAPGRvbWFpbj4gZm9yIHN5c3RlbSBtYWlsKSwgb3IgRU1BSUxfRlJPTSBmb3IgYSBmaXhlZCBhZGRyZXNzLlwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgcG9ydCA9IGNvbmZpZ1V0aWxzLnBvcnQoc210cC5wb3J0LCBcIlNNVFBfUE9SVFwiLCBERUZBVUxUX1NNVFBfUE9SVCwgRU5WX09OTFkpO1xuICAgIHJldHVybiB7XG4gICAgICBtb2RlOiBcInNtdHBcIixcbiAgICAgIGhvc3Q6IGhvc3QhLFxuICAgICAgcG9ydCxcbiAgICAgIHNlY3VyZTogcmVzb2x2ZVNlY3VyZShzbXRwLnNlY3VyZSwgcG9ydCksXG4gICAgICBhdXRoOiB7IHVzZXI6IHVzZXIhLCBwYXNzOiBwYXNzISB9LFxuICAgICAgLi4uc2VuZGVyLFxuICAgIH07XG4gIH1cblxuICBpZiAoIWlzT3V0Ym94TW9kZUVuYWJsZWQoKSkge1xuICAgIHRocm93IENvbmZpZ3VyYXRpb25FcnJvci5pbnZhbGlkQ29ubmVjdGlvbihcbiAgICAgIFwiU01UUFwiLFxuICAgICAgYFNldCAke1NNVFBfUkVRVUlSRURfRklFTERTLmpvaW4oXCIsIFwiKX0sIG9yIEVNQUlMX09VVEJPWF9NT0RFPTEgdG8gd3JpdGUgbWVzc2FnZXMgdG8gYSBsb2NhbCBvdXRib3ggaW5zdGVhZC5gLFxuICAgICk7XG4gIH1cblxuICBjb25zdCBvdXREaXIgPSByZXNvbHZlKFxuICAgIHN0cmluZyhjb25maWcub3V0RGlyLCBcIkVNQUlMX09VVEJPWF9ESVJcIiwgRU5WX09OTFkpID8/IHJlc29sdmUocHJvY2Vzcy5jd2QoKSwgXCJ0bXBcIiksXG4gICk7XG4gIHJldHVybiB7IG1vZGU6IFwiZmlsZVwiLCBvdXREaXIsIC4uLnNlbmRlciB9O1xufVxuIl19
|
package/lib/src/email-html.d.ts
CHANGED
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
/** Node rendering adapters for the shared React Email document. @module */
|
|
2
|
-
import { stringUtils } from "@dbx-tools/shared-core";
|
|
3
2
|
import { type EmailDocumentProps } from "@dbx-tools/shared-email-template";
|
|
4
|
-
/** Escape HTML-significant characters (re-exported from shared-core). */
|
|
5
|
-
export declare const escapeHtml: typeof stringUtils.escapeHtml;
|
|
6
3
|
/** Options accepted by the shared React Email document. */
|
|
7
4
|
export type EmailHtmlOptions = EmailDocumentProps;
|
|
8
5
|
/** Render a complete responsive React Email document. */
|
package/lib/src/email-html.js
CHANGED
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
/** Node rendering adapters for the shared React Email document. @module */
|
|
2
|
-
import { stringUtils } from "@dbx-tools/shared-core";
|
|
3
2
|
import { EmailDocument } from "@dbx-tools/shared-email-template";
|
|
4
3
|
import { render } from "@react-email/render";
|
|
5
4
|
import { createElement } from "react";
|
|
6
|
-
/** Escape HTML-significant characters (re-exported from shared-core). */
|
|
7
|
-
export const escapeHtml = stringUtils.escapeHtml;
|
|
8
5
|
/** Render a complete responsive React Email document. */
|
|
9
6
|
export async function renderEmailHtml(options) {
|
|
10
7
|
return render(createElement(EmailDocument, options), { pretty: true });
|
|
@@ -22,4 +19,4 @@ export async function renderEmail(options) {
|
|
|
22
19
|
]);
|
|
23
20
|
return { html, text };
|
|
24
21
|
}
|
|
25
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1haWwtaHRtbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbWFpbC1odG1sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDJFQUEyRTtBQUMzRSxPQUFPLEVBQUUsYUFBYSxFQUEyQixNQUFNLGtDQUFrQyxDQUFDO0FBQzFGLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBS3RDLHlEQUF5RDtBQUN6RCxNQUFNLENBQUMsS0FBSyxVQUFVLGVBQWUsQ0FBQyxPQUF5QjtJQUM3RCxPQUFPLE1BQU0sQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFDekUsQ0FBQztBQUVELDBFQUEwRTtBQUMxRSxNQUFNLENBQUMsS0FBSyxVQUFVLGVBQWUsQ0FBQyxPQUF5QjtJQUM3RCxPQUFPLE1BQU0sQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFDNUUsQ0FBQztBQUVELGdGQUFnRjtBQUNoRixNQUFNLENBQUMsS0FBSyxVQUFVLFdBQVcsQ0FDL0IsT0FBeUI7SUFFekIsTUFBTSxPQUFPLEdBQUcsYUFBYSxDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN0RCxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQztRQUNyQyxNQUFNLENBQUMsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDO1FBQ2pDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUM7S0FDckMsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUN4QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIE5vZGUgcmVuZGVyaW5nIGFkYXB0ZXJzIGZvciB0aGUgc2hhcmVkIFJlYWN0IEVtYWlsIGRvY3VtZW50LiBAbW9kdWxlICovXG5pbXBvcnQgeyBFbWFpbERvY3VtZW50LCB0eXBlIEVtYWlsRG9jdW1lbnRQcm9wcyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1lbWFpbC10ZW1wbGF0ZVwiO1xuaW1wb3J0IHsgcmVuZGVyIH0gZnJvbSBcIkByZWFjdC1lbWFpbC9yZW5kZXJcIjtcbmltcG9ydCB7IGNyZWF0ZUVsZW1lbnQgfSBmcm9tIFwicmVhY3RcIjtcblxuLyoqIE9wdGlvbnMgYWNjZXB0ZWQgYnkgdGhlIHNoYXJlZCBSZWFjdCBFbWFpbCBkb2N1bWVudC4gKi9cbmV4cG9ydCB0eXBlIEVtYWlsSHRtbE9wdGlvbnMgPSBFbWFpbERvY3VtZW50UHJvcHM7XG5cbi8qKiBSZW5kZXIgYSBjb21wbGV0ZSByZXNwb25zaXZlIFJlYWN0IEVtYWlsIGRvY3VtZW50LiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbmRlckVtYWlsSHRtbChvcHRpb25zOiBFbWFpbEh0bWxPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgcmV0dXJuIHJlbmRlcihjcmVhdGVFbGVtZW50KEVtYWlsRG9jdW1lbnQsIG9wdGlvbnMpLCB7IHByZXR0eTogdHJ1ZSB9KTtcbn1cblxuLyoqIFJlbmRlciB0aGUgc2FtZSBSZWFjdCBFbWFpbCBkb2N1bWVudCBhcyBpdHMgcGxhaW4tdGV4dCBhbHRlcm5hdGl2ZS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW5kZXJFbWFpbFRleHQob3B0aW9uczogRW1haWxIdG1sT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHJldHVybiByZW5kZXIoY3JlYXRlRWxlbWVudChFbWFpbERvY3VtZW50LCBvcHRpb25zKSwgeyBwbGFpblRleHQ6IHRydWUgfSk7XG59XG5cbi8qKiBSZW5kZXIgYm90aCBNSU1FIGFsdGVybmF0aXZlcyBmcm9tIG9uZSBzaGFyZWQgUmVhY3QgRW1haWwgY29tcG9uZW50IHRyZWUuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVuZGVyRW1haWwoXG4gIG9wdGlvbnM6IEVtYWlsSHRtbE9wdGlvbnMsXG4pOiBQcm9taXNlPHsgaHRtbDogc3RyaW5nOyB0ZXh0OiBzdHJpbmcgfT4ge1xuICBjb25zdCBlbGVtZW50ID0gY3JlYXRlRWxlbWVudChFbWFpbERvY3VtZW50LCBvcHRpb25zKTtcbiAgY29uc3QgW2h0bWwsIHRleHRdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIHJlbmRlcihlbGVtZW50LCB7IHByZXR0eTogdHJ1ZSB9KSxcbiAgICByZW5kZXIoZWxlbWVudCwgeyBwbGFpblRleHQ6IHRydWUgfSksXG4gIF0pO1xuICByZXR1cm4geyBodG1sLCB0ZXh0IH07XG59XG4iXX0=
|
package/lib/src/markdown.d.ts
CHANGED
package/lib/src/markdown.js
CHANGED
|
@@ -1,13 +1,11 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/** Node rendering helper backed by the shared React Email body. @module */
|
|
2
2
|
import { EmailBody, normalizeEmailMarkdown } from "@dbx-tools/shared-email-template";
|
|
3
3
|
import { render } from "@react-email/render";
|
|
4
4
|
import { createElement } from "react";
|
|
5
|
-
/** Normalize indentation in authored content. */
|
|
6
|
-
export const normalizeMarkdown = normalizeEmailMarkdown;
|
|
7
5
|
/** Render a standalone message body through React Email. */
|
|
8
6
|
export async function markdownToHtml(body) {
|
|
9
7
|
return render(createElement(EmailBody, { body: normalizeEmailMarkdown(body) }), {
|
|
10
8
|
pretty: true,
|
|
11
9
|
});
|
|
12
10
|
}
|
|
13
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFya2Rvd24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWFya2Rvd24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsMkVBQTJFO0FBQzNFLE9BQU8sRUFBRSxTQUFTLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNyRixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUV0Qyw0REFBNEQ7QUFDNUQsTUFBTSxDQUFDLEtBQUssVUFBVSxjQUFjLENBQUMsSUFBWTtJQUMvQyxPQUFPLE1BQU0sQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLEVBQUUsSUFBSSxFQUFFLHNCQUFzQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRTtRQUM5RSxNQUFNLEVBQUUsSUFBSTtLQUNiLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogTm9kZSByZW5kZXJpbmcgaGVscGVyIGJhY2tlZCBieSB0aGUgc2hhcmVkIFJlYWN0IEVtYWlsIGJvZHkuIEBtb2R1bGUgKi9cbmltcG9ydCB7IEVtYWlsQm9keSwgbm9ybWFsaXplRW1haWxNYXJrZG93biB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1lbWFpbC10ZW1wbGF0ZVwiO1xuaW1wb3J0IHsgcmVuZGVyIH0gZnJvbSBcIkByZWFjdC1lbWFpbC9yZW5kZXJcIjtcbmltcG9ydCB7IGNyZWF0ZUVsZW1lbnQgfSBmcm9tIFwicmVhY3RcIjtcblxuLyoqIFJlbmRlciBhIHN0YW5kYWxvbmUgbWVzc2FnZSBib2R5IHRocm91Z2ggUmVhY3QgRW1haWwuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbWFya2Rvd25Ub0h0bWwoYm9keTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgcmV0dXJuIHJlbmRlcihjcmVhdGVFbGVtZW50KEVtYWlsQm9keSwgeyBib2R5OiBub3JtYWxpemVFbWFpbE1hcmtkb3duKGJvZHkpIH0pLCB7XG4gICAgcHJldHR5OiB0cnVlLFxuICB9KTtcbn1cbiJdfQ==
|
package/lib/src/outbox.d.ts
CHANGED
|
@@ -13,11 +13,11 @@
|
|
|
13
13
|
* @module
|
|
14
14
|
*/
|
|
15
15
|
import type { EmailMessage } from "@dbx-tools/shared-email";
|
|
16
|
-
import type { EmailBrand } from "
|
|
16
|
+
import type { EmailBrand } from "@dbx-tools/shared-email-template";
|
|
17
17
|
import { type EmailHtmlOptions } from "./email-html.ts";
|
|
18
18
|
/**
|
|
19
19
|
* Write one message as HTML under `<dir>/<from>/` and return the
|
|
20
20
|
* absolute path. The per-sender folder mirrors the SMTP `From`, so test
|
|
21
21
|
* output groups by who the message would have been sent as.
|
|
22
22
|
*/
|
|
23
|
-
export declare function writeOutboxEmail(message: EmailMessage, from: string, dir: string, brand?: EmailBrand, presentation?: Pick<EmailHtmlOptions, "heading" | "preview"
|
|
23
|
+
export declare function writeOutboxEmail(message: EmailMessage, from: string, dir: string, brand?: EmailBrand, presentation?: Partial<Pick<EmailHtmlOptions, "heading" | "preview">>): Promise<string>;
|
package/lib/src/outbox.js
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
*/
|
|
15
15
|
import { mkdir, writeFile } from "node:fs/promises";
|
|
16
16
|
import { join, resolve } from "node:path";
|
|
17
|
-
import {
|
|
17
|
+
import { toSlugWithOptions } from "@dbx-tools/shared-core";
|
|
18
18
|
import { renderEmailHtml } from "./email-html.js";
|
|
19
19
|
/**
|
|
20
20
|
* Longest subject slug kept in an outbox file name, leaving room for the
|
|
@@ -23,7 +23,7 @@ import { renderEmailHtml } from "./email-html.js";
|
|
|
23
23
|
const SUBJECT_SLUG_MAX_LENGTH = 48;
|
|
24
24
|
/** Filesystem-safe slug of the subject for the file name. */
|
|
25
25
|
function subjectSlug(subject) {
|
|
26
|
-
return
|
|
26
|
+
return toSlugWithOptions({ maxLength: SUBJECT_SLUG_MAX_LENGTH }, subject) || "email";
|
|
27
27
|
}
|
|
28
28
|
/** The envelope rows shown above the body in the preview file. */
|
|
29
29
|
function headerRows(message, from) {
|
|
@@ -59,4 +59,4 @@ export async function writeOutboxEmail(message, from, dir, brand, presentation)
|
|
|
59
59
|
await writeFile(path, html, "utf8");
|
|
60
60
|
return path;
|
|
61
61
|
}
|
|
62
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
62
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0Ym94LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL291dGJveC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7OztHQWFHO0FBRUgsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUMxQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUczRCxPQUFPLEVBQUUsZUFBZSxFQUF5QixNQUFNLGlCQUFpQixDQUFDO0FBRXpFOzs7R0FHRztBQUNILE1BQU0sdUJBQXVCLEdBQUcsRUFBRSxDQUFDO0FBRW5DLDZEQUE2RDtBQUM3RCxTQUFTLFdBQVcsQ0FBQyxPQUFlO0lBQ2xDLE9BQU8saUJBQWlCLENBQUMsRUFBRSxTQUFTLEVBQUUsdUJBQXVCLEVBQUUsRUFBRSxPQUFPLENBQUMsSUFBSSxPQUFPLENBQUM7QUFDdkYsQ0FBQztBQUVELGtFQUFrRTtBQUNsRSxTQUFTLFVBQVUsQ0FBQyxPQUFxQixFQUFFLElBQVk7SUFDckQsTUFBTSxJQUFJLEdBQWlEO1FBQ3pELENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQztRQUNkLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdCLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlCLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hDLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUM7UUFDNUIsQ0FBQyxhQUFhLEVBQUUsT0FBTyxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0UsQ0FBQyxNQUFNLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztLQUNuQyxDQUFDO0lBQ0YsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUEyQixFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEUsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGdCQUFnQixDQUNwQyxPQUFxQixFQUNyQixJQUFZLEVBQ1osR0FBVyxFQUNYLEtBQWtCLEVBQ2xCLFlBQXFFO0lBRXJFLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDbEMsTUFBTSxLQUFLLENBQUMsTUFBTSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDekMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxXQUFXLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNoRixNQUFNLElBQUksR0FBRyxNQUFNLGVBQWUsQ0FBQztRQUNqQyxPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87UUFDeEIsT0FBTyxFQUFFLFVBQVUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDO1FBQ2xDLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtRQUNsQixNQUFNLEVBQUUsb0ZBQW9GO1FBQzVGLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMzQixHQUFHLENBQUMsWUFBWSxFQUFFLE9BQU8sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2pGLEdBQUcsQ0FBQyxZQUFZLEVBQUUsT0FBTyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7S0FDbEYsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxTQUFTLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNwQyxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEZpbGVzeXN0ZW0gb3V0Ym94IGZvciB0aGUgbm8tU01UUCBmYWxsYmFjazoge0BsaW5rIHdyaXRlT3V0Ym94RW1haWx9XG4gKiBwZXJzaXN0cyBvbmUgZHJhZnRlZCBtZXNzYWdlIGFzIGEgc3RhbmRhbG9uZSBIVE1MIGZpbGUgdW5kZXJcbiAqIGA8ZGlyPi88ZnJvbT4vPHRpbWVzdGFtcD4tPHN1YmplY3Qtc2x1Zz4uaHRtbGAgaW5zdGVhZCBvZiBzZW5kaW5nIGl0LlxuICogVGhpcyBsZXRzIHRoZSBhcHByb3ZhbCBmbG93IGFuZCBhZ2VudHMgYmUgZXhlcmNpc2VkIGVuZC10by1lbmQgd2l0aFxuICogemVybyBlbWFpbCBjb25maWd1cmF0aW9uIC0gb3BlbiB0aGUgZmlsZSBpbiBhIGJyb3dzZXIgdG8gc2VlIGV4YWN0bHlcbiAqIHdoYXQgd291bGQgaGF2ZSBnb25lIG91dCAodGhlIEhUTUwgbWF0Y2hlcyB0aGUgU01UUCBzZW5kLCBoZWFkZXJzXG4gKiB0YWJsZSBhc2lkZSkuIFRoZSBib2R5IGlzIHJlbmRlcmVkICsgc3R5bGUtaW5saW5lZCBieVxuICoge0BsaW5rIHJlbmRlckVtYWlsSHRtbH0uIEF0dGFjaG1lbnRzIGFyZSBsaXN0ZWQgYnkgZmlsZW5hbWUgaW4gdGhlXG4gKiBoZWFkZXIgdGFibGUgYnV0IG5vdCB3cml0dGVuIHRvIGRpc2sgLSB0aGUgb3V0Ym94IHByZXZpZXdzIHRoZVxuICogZW52ZWxvcGUsIGl0IGRvZXNuJ3QgcmVwcm9kdWNlIHRoZSB3aXJlIHBheWxvYWQuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IG1rZGlyLCB3cml0ZUZpbGUgfSBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHsgam9pbiwgcmVzb2x2ZSB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IHRvU2x1Z1dpdGhPcHRpb25zIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB0eXBlIHsgRW1haWxNZXNzYWdlIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWVtYWlsXCI7XG5pbXBvcnQgdHlwZSB7IEVtYWlsQnJhbmQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtZW1haWwtdGVtcGxhdGVcIjtcbmltcG9ydCB7IHJlbmRlckVtYWlsSHRtbCwgdHlwZSBFbWFpbEh0bWxPcHRpb25zIH0gZnJvbSBcIi4vZW1haWwtaHRtbC50c1wiO1xuXG4vKipcbiAqIExvbmdlc3Qgc3ViamVjdCBzbHVnIGtlcHQgaW4gYW4gb3V0Ym94IGZpbGUgbmFtZSwgbGVhdmluZyByb29tIGZvciB0aGVcbiAqIHRpbWVzdGFtcCBwcmVmaXggYW5kIGV4dGVuc2lvbiBpbnNpZGUgY29tbW9uIGZpbGVzeXN0ZW0gbmFtZSBsaW1pdHMuXG4gKi9cbmNvbnN0IFNVQkpFQ1RfU0xVR19NQVhfTEVOR1RIID0gNDg7XG5cbi8qKiBGaWxlc3lzdGVtLXNhZmUgc2x1ZyBvZiB0aGUgc3ViamVjdCBmb3IgdGhlIGZpbGUgbmFtZS4gKi9cbmZ1bmN0aW9uIHN1YmplY3RTbHVnKHN1YmplY3Q6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0b1NsdWdXaXRoT3B0aW9ucyh7IG1heExlbmd0aDogU1VCSkVDVF9TTFVHX01BWF9MRU5HVEggfSwgc3ViamVjdCkgfHwgXCJlbWFpbFwiO1xufVxuXG4vKiogVGhlIGVudmVsb3BlIHJvd3Mgc2hvd24gYWJvdmUgdGhlIGJvZHkgaW4gdGhlIHByZXZpZXcgZmlsZS4gKi9cbmZ1bmN0aW9uIGhlYWRlclJvd3MobWVzc2FnZTogRW1haWxNZXNzYWdlLCBmcm9tOiBzdHJpbmcpOiBBcnJheTxyZWFkb25seSBbc3RyaW5nLCBzdHJpbmddPiB7XG4gIGNvbnN0IHJvd3M6IEFycmF5PHJlYWRvbmx5IFtzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZF0+ID0gW1xuICAgIFtcIkZyb21cIiwgZnJvbV0sXG4gICAgW1wiVG9cIiwgbWVzc2FnZS50by5qb2luKFwiLCBcIildLFxuICAgIFtcIkNjXCIsIG1lc3NhZ2UuY2M/LmpvaW4oXCIsIFwiKV0sXG4gICAgW1wiQmNjXCIsIG1lc3NhZ2UuYmNjPy5qb2luKFwiLCBcIildLFxuICAgIFtcIlN1YmplY3RcIiwgbWVzc2FnZS5zdWJqZWN0XSxcbiAgICBbXCJBdHRhY2htZW50c1wiLCBtZXNzYWdlLmF0dGFjaG1lbnRzPy5tYXAoKGF0dCkgPT4gYXR0LmZpbGVuYW1lKS5qb2luKFwiLCBcIildLFxuICAgIFtcIkRhdGVcIiwgbmV3IERhdGUoKS50b0lTT1N0cmluZygpXSxcbiAgXTtcbiAgcmV0dXJuIHJvd3MuZmlsdGVyKChyb3cpOiByb3cgaXMgW3N0cmluZywgc3RyaW5nXSA9PiBCb29sZWFuKHJvd1sxXSkpO1xufVxuXG4vKipcbiAqIFdyaXRlIG9uZSBtZXNzYWdlIGFzIEhUTUwgdW5kZXIgYDxkaXI+Lzxmcm9tPi9gIGFuZCByZXR1cm4gdGhlXG4gKiBhYnNvbHV0ZSBwYXRoLiBUaGUgcGVyLXNlbmRlciBmb2xkZXIgbWlycm9ycyB0aGUgU01UUCBgRnJvbWAsIHNvIHRlc3RcbiAqIG91dHB1dCBncm91cHMgYnkgd2hvIHRoZSBtZXNzYWdlIHdvdWxkIGhhdmUgYmVlbiBzZW50IGFzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JpdGVPdXRib3hFbWFpbChcbiAgbWVzc2FnZTogRW1haWxNZXNzYWdlLFxuICBmcm9tOiBzdHJpbmcsXG4gIGRpcjogc3RyaW5nLFxuICBicmFuZD86IEVtYWlsQnJhbmQsXG4gIHByZXNlbnRhdGlvbj86IFBhcnRpYWw8UGljazxFbWFpbEh0bWxPcHRpb25zLCBcImhlYWRpbmdcIiB8IFwicHJldmlld1wiPj4sXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBmb2xkZXIgPSByZXNvbHZlKGRpciwgZnJvbSk7XG4gIGF3YWl0IG1rZGlyKGZvbGRlciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGNvbnN0IHBhdGggPSBqb2luKGZvbGRlciwgYCR7RGF0ZS5ub3coKX0tJHtzdWJqZWN0U2x1ZyhtZXNzYWdlLnN1YmplY3QpfS5odG1sYCk7XG4gIGNvbnN0IGh0bWwgPSBhd2FpdCByZW5kZXJFbWFpbEh0bWwoe1xuICAgIHN1YmplY3Q6IG1lc3NhZ2Uuc3ViamVjdCxcbiAgICBoZWFkZXJzOiBoZWFkZXJSb3dzKG1lc3NhZ2UsIGZyb20pLFxuICAgIGJvZHk6IG1lc3NhZ2UuYm9keSxcbiAgICBmb290ZXI6IFwiTG9jYWwgb3V0Ym94IHByZXZpZXcgLSB3cml0dGVuIHRvIGRpc2ssIG5vdCBzZW50IChubyBTTVRQIGNyZWRlbnRpYWxzIGNvbmZpZ3VyZWQpLlwiLFxuICAgIC4uLihicmFuZCA/IHsgYnJhbmQgfSA6IHt9KSxcbiAgICAuLi4ocHJlc2VudGF0aW9uPy5oZWFkaW5nICE9PSB1bmRlZmluZWQgPyB7IGhlYWRpbmc6IHByZXNlbnRhdGlvbi5oZWFkaW5nIH0gOiB7fSksXG4gICAgLi4uKHByZXNlbnRhdGlvbj8ucHJldmlldyAhPT0gdW5kZWZpbmVkID8geyBwcmV2aWV3OiBwcmVzZW50YXRpb24ucHJldmlldyB9IDoge30pLFxuICB9KTtcbiAgYXdhaXQgd3JpdGVGaWxlKHBhdGgsIGh0bWwsIFwidXRmOFwiKTtcbiAgcmV0dXJuIHBhdGg7XG59XG4iXX0=
|