@things-factory/email-base 10.1.278 → 10.1.280
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/package.json +17 -4
- package/CHANGELOG.md +0 -8
- package/dist-server/controllers/app-brand.js.map +0 -1
- package/dist-server/controllers/email.js.map +0 -1
- package/dist-server/controllers/index.js.map +0 -1
- package/dist-server/controllers/mail-form.js.map +0 -1
- package/dist-server/index.js.map +0 -1
- package/dist-server/routes.js.map +0 -1
- package/dist-server/tsconfig.tsbuildinfo +0 -1
- package/tests/mail-form.test.ts +0 -149
package/package.json
CHANGED
|
@@ -1,7 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@things-factory/email-base",
|
|
3
|
-
"version": "10.1.
|
|
3
|
+
"version": "10.1.280",
|
|
4
4
|
"main": "dist-server/index.js",
|
|
5
|
+
"files": [
|
|
6
|
+
"README.md",
|
|
7
|
+
"dist-server",
|
|
8
|
+
"things-factory.config.js",
|
|
9
|
+
"!**/*.map",
|
|
10
|
+
"!**/*.test.*",
|
|
11
|
+
"!**/*.spec.*",
|
|
12
|
+
"!**/test/**",
|
|
13
|
+
"!**/tests/**",
|
|
14
|
+
"!**/__tests__/**",
|
|
15
|
+
"!**/*.tsbuildinfo",
|
|
16
|
+
"!**/.DS_Store"
|
|
17
|
+
],
|
|
5
18
|
"things-factory": true,
|
|
6
19
|
"author": "",
|
|
7
20
|
"description": "Module to send email using SMTP configuration.",
|
|
@@ -23,13 +36,13 @@
|
|
|
23
36
|
"migration:create": "node ./node_modules/typeorm/cli.js migration:create"
|
|
24
37
|
},
|
|
25
38
|
"dependencies": {
|
|
26
|
-
"@things-factory/env": "^10.1.
|
|
27
|
-
"@things-factory/shell": "^10.1.
|
|
39
|
+
"@things-factory/env": "^10.1.280",
|
|
40
|
+
"@things-factory/shell": "^10.1.280",
|
|
28
41
|
"marked": "^15.0.0",
|
|
29
42
|
"nodemailer": "^6.9.13"
|
|
30
43
|
},
|
|
31
44
|
"devDependencies": {
|
|
32
45
|
"@types/nodemailer": "^6.4.14"
|
|
33
46
|
},
|
|
34
|
-
"gitHead": "
|
|
47
|
+
"gitHead": "14ce4b7f5957272d63115af316a7dc1ab030e152"
|
|
35
48
|
}
|
package/CHANGELOG.md
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
# Changelog
|
|
2
|
-
|
|
3
|
-
All notable changes to this project will be documented in this file.
|
|
4
|
-
|
|
5
|
-
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
|
|
6
|
-
and adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
|
|
7
|
-
|
|
8
|
-
<!-- ## [Unreleased] -->
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"app-brand.js","sourceRoot":"","sources":["../../server/controllers/app-brand.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Whose mail it is - the application's brand name, tagline and colour, read from its web manifest\n * (`assets/manifest.json`), the one identity file every application ships and the image keeps. `name` is the brand\n * name; `tagline` and `brand_color` are the application's own members (a browser passes over members it does not\n * know); with no `brand_color` the manifest's `theme_color` stands in. Read once.\n */\nimport fs from 'fs'\nimport path from 'path'\n\nimport { appRootPath } from '@things-factory/env'\n\nexport type AppBrand = {\n name: string\n tagline?: string\n /** `#rrggbb`. */\n color: string\n}\n\n/** What the mails had before an application said its own. */\nexport const DEFAULT_BRAND: AppBrand = { name: 'Operato', color: '#22a6a7' }\n\nconst HEX = /^#(?:[0-9a-f]{3}|[0-9a-f]{6})$/i\n\n/** A 3-digit colour as its 6 digits; anything not a hex colour is not a colour. */\nfunction hexOf(value: unknown): string | undefined {\n if (typeof value !== 'string' || !HEX.test(value.trim())) return undefined\n const hex = value.trim().toLowerCase()\n return hex.length === 4 ? `#${[...hex.slice(1)].map(digit => digit + digit).join('')}` : hex\n}\n\nconst textOf = (value: unknown) => (typeof value === 'string' && value.trim() ? value.trim() : undefined)\n\n/** The brand a manifest declares, each part it leaves out the default's. */\nexport function brandOf(manifest: any): AppBrand {\n return {\n name: textOf(manifest?.name) ?? DEFAULT_BRAND.name,\n tagline: textOf(manifest?.tagline),\n color: hexOf(manifest?.brand_color) ?? hexOf(manifest?.theme_color) ?? DEFAULT_BRAND.color\n }\n}\n\n/**\n * The text colour on `color`: white while it keeps 3:1 against it - the band and the button carry large bold text\n * (WCAG 1.4.3) - black below that.\n */\nexport function textColorOn(color: string): '#000000' | '#ffffff' {\n const channel = (at: number) => {\n const value = parseInt(color.slice(at, at + 2), 16) / 255\n return value <= 0.03928 ? value / 12.92 : ((value + 0.055) / 1.055) ** 2.4\n }\n const luminance = 0.2126 * channel(1) + 0.7152 * channel(3) + 0.0722 * channel(5)\n return 1.05 / (luminance + 0.05) >= 3 ? '#ffffff' : '#000000'\n}\n\nlet read: AppBrand | undefined\n\n/** The running application's brand; the default when it ships no manifest or one that cannot be read. */\nexport function appBrand(): AppBrand {\n if (!read) {\n try {\n read = brandOf(JSON.parse(fs.readFileSync(path.resolve(appRootPath, 'assets', 'manifest.json'), 'utf8')))\n } catch {\n read = DEFAULT_BRAND\n }\n }\n return read\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"email.js","sourceRoot":"","sources":["../../server/controllers/email.ts"],"names":[],"mappings":";;AAYA,8BA8BC;;AA1CD,oEAAmC;AAEnC,6CAA4C;AAE5C;;;;;;;GAOG;AACI,KAAK,UAAU,SAAS,CAAC,EAC9B,MAAM,EACN,QAAQ,EACR,OAAO,EACP,OAAO,EAMR;IACC,IAAI,SAAS,GAAG,YAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IAEnC,IAAI,CAAC;QACH,IAAI,WAAW,GAAG,oBAAU,CAAC,eAAe,CAAC;YAC3C,GAAG,SAAS;SACb,CAAC,CAAA;QAEF,IAAI,WAAW,GAAG;YAChB,IAAI,EAAE,MAAM,IAAI,SAAS,CAAC,MAAM,IAAI,SAAS,CAAC,IAAI,EAAE,IAAI;YACxD,EAAE,EAAE,QAAQ;YACZ,OAAO;YACP,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,OAAO;SACd,CAAA;QAED,OAAO,MAAM,WAAW,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,CAAA;IACtD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IAChB,CAAC;AACH,CAAC","sourcesContent":["import nodemailer from 'nodemailer'\n\nimport { config } from '@things-factory/env'\n\n/**\n * sendEmail({\n * sender: 'No reply <noreply@hatiolab.com>',\n * receiver: 'someone@email.com',\n * subject: 'Subject',\n * content: 'Content'\n * })\n */\nexport async function sendEmail({\n sender,\n receiver,\n subject,\n content\n}: {\n sender?: string\n receiver: string\n subject: string\n content: string\n}) {\n var emailInfo = config.get('email')\n\n try {\n var transporter = nodemailer.createTransport({\n ...emailInfo\n })\n\n var mailOptions = {\n from: sender || emailInfo.sender || emailInfo.auth?.user,\n to: receiver,\n subject,\n text: content,\n html: content\n }\n\n return await transporter.sendMail(mailOptions, null)\n } catch (e) {\n console.log(e)\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/controllers/index.ts"],"names":[],"mappings":";;;AAAA,kDAAuB;AACvB,sDAA2B;AAC3B,sDAA2B","sourcesContent":["export * from './email'\nexport * from './mail-form'\nexport * from './app-brand'\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mail-form.js","sourceRoot":"","sources":["../../server/controllers/mail-form.ts"],"names":[],"mappings":"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","sourcesContent":["import { Marked } from 'marked'\n\nimport { DEFAULT_BRAND, textColorOn, type AppBrand } from './app-brand.js'\n\n/**\n * What a mail says to one person, in their language: the subject (the band), the body, the button's words, and the\n * note that stands in for the button when there is no link.\n */\nexport type MailWords = { subject: string; body: string; action: string; note?: string }\n\n/** The language a mail to a person is written in: theirs, else the fallback, else English - as `ko`, never `ko-KR`. */\nexport function languageOf(locale: string | null | undefined, fallback: string | null | undefined): string {\n return String(locale || fallback || 'en')\n .split(/[-_]/)[0]\n .toLowerCase()\n}\n\n/** Every value goes into the HTML through this - a subject like `<b>` or `A&B` stays text. */\nexport function escapeHtml(value: unknown): string {\n return String(value ?? '')\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n}\n\n/** The schemes a link in a mail may take; anything else is shown as its text. */\nconst SAFE_PROTOCOLS = new Set(['http:', 'https:', 'mailto:'])\nconst NO_BASE = 'https://no-base.invalid/'\n\n/**\n * Where a link in a mail may go: http(s) and mailto as written, and an address of the app (no scheme) under `base`,\n * the domain's own address. With no base an app address has nowhere to go and is dropped, as is every other scheme -\n * `javascript:` in any spelling the URL parser reads as one.\n */\nexport function safeMailHref(href: string | null | undefined, base?: string): string | undefined {\n const raw = String(href ?? '').trim()\n if (!raw) return undefined\n\n let url: URL\n try {\n url = new URL(raw, base || NO_BASE)\n } catch {\n return undefined\n }\n\n if (!SAFE_PROTOCOLS.has(url.protocol)) return undefined\n if (url.origin === new URL(NO_BASE).origin) return undefined\n return url.href\n}\n\n/**\n * Markdown as mail HTML, rendered here on the server. Raw HTML in the text is shown as text, never as markup; a link or\n * an image becomes a link only to an address `safeMailHref` allows, and an image is not loaded - it is shown as a\n * link with its alt text, so a mail does not fetch from wherever its writer pointed.\n */\nexport function renderMailMarkdown(markdown: string, base?: string): string {\n const marked = new Marked({\n gfm: true,\n breaks: true,\n async: false,\n renderer: {\n html({ text }) {\n return escapeHtml(text)\n },\n link({ href, title, tokens }) {\n const label = this.parser.parseInline(tokens)\n const safe = safeMailHref(href, base)\n return safe ? `<a href=\"${escapeHtml(safe)}\"${title ? ` title=\"${escapeHtml(title)}\"` : ''}>${label}</a>` : label\n },\n image({ href, text }) {\n const safe = safeMailHref(href, base)\n return safe ? `<a href=\"${escapeHtml(safe)}\">${escapeHtml(text || safe)}</a>` : escapeHtml(text)\n }\n }\n })\n\n return marked.parse(String(markdown ?? '')) as string\n}\n\n/**\n * The one mail every module sends - a notice (ADR-0164) and the account mails alike, so a person knows the sender. The\n * head names the application that sends it with its tagline, and the band and button are in its brand colour\n * (`appBrand`). Without a link (a notice sent with no request to take the address from) the button gives way to the note.\n */\nexport function mailForm({\n lang,\n words,\n link,\n format = 'text',\n base,\n brand = DEFAULT_BRAND\n}: {\n lang: string\n words: MailWords\n link?: string\n /** How the body is written - an announcement's is Markdown; a text body keeps its line breaks. */\n format?: 'text' | 'markdown'\n /** The domain's address, under which an app address in a Markdown body is resolved. */\n base?: string\n /** The application sending it. */\n brand?: AppBrand\n}) {\n const color = escapeHtml(brand.color)\n const onColor = textColorOn(brand.color)\n /*\n * Laid out as tables, each colour on its cell as `bgcolor` as well as in its style: mail programs drop a box's\n * margins and backgrounds, and one in dark mode repaints what it was not told is light - so the mail says it is light.\n */\n const action = link\n ? `<table role=\"presentation\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"border-collapse:separate\">\n <tr>\n <td bgcolor=\"${color}\" style=\"background-color:${color};border-radius:7px;padding:8px 16px\">\n <a href=\"${escapeHtml(link)}\" style=\"color:${onColor};font-size:18px;font-weight:bold;text-decoration:none\"\n ><font color=\"${onColor}\">${escapeHtml(words.action)}</font></a\n >\n </td>\n </tr>\n </table>`\n : `<span style=\"color:#555555\">${escapeHtml(words.note ?? '')}</span>`\n\n return `\n <html lang=\"${escapeHtml(lang)}\">\n <head>\n <meta charset=\"utf-8\" />\n <meta name=\"color-scheme\" content=\"light\" />\n <meta name=\"supported-color-schemes\" content=\"light\" />\n <title>${escapeHtml(words.subject)}</title>\n <meta name=\"author\" content=\"hatiolab\" />\n <meta name=\"google\" content=\"notranslate\"/>\n <style>:root { color-scheme: light; supported-color-schemes: light; }</style>\n </head>\n\n <body style=\"margin:0;padding:0\" bgcolor=\"#f6f6f6\">\n <table role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" bgcolor=\"#f6f6f6\" style=\"background-color:#f6f6f6;border-collapse:collapse\">\n <!--header begin-->\n <tr>\n <td bgcolor=\"#ffffff\" style=\"background-color:#ffffff;border-top:2px solid ${color};padding:10px 20px\">\n <table role=\"presentation\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\">\n <tr>\n <td style=\"font-size:20px;font-weight:bold;color:#1f2933;white-space:nowrap\">${escapeHtml(brand.name)}</td>${\n brand.tagline\n ? `\n <td style=\"padding-left:12px;font-size:13px;color:#6b7280\"> ${escapeHtml(brand.tagline)}</td>`\n : ''\n }\n </tr>\n </table>\n </td>\n </tr>\n <!--header end-->\n\n <!--title begin-->\n <tr>\n <td bgcolor=\"${color}\" style=\"background-color:${color};padding:14px 20px 12px 20px;color:${onColor};font-size:24px;font-weight:bold\"\n ><font color=\"${onColor}\">${escapeHtml(words.subject)}</font></td\n >\n </tr>\n <!--title end-->\n\n <!--body begin-->\n <tr>\n <td style=\"padding:10px 20px;line-height:1.5;font-size:16px;color:#1f2933\">${\n format === 'markdown' ? renderMailMarkdown(words.body, base) : `<div style=\"white-space:pre-line\">${escapeHtml(words.body)}</div>`\n }</td>\n </tr>\n <tr>\n <td style=\"padding:6px 20px 20px 20px;font-size:16px\">\n ${action}\n </td>\n </tr>\n <!--body end-->\n\n <!--footer begin-->\n <tr>\n <td style=\"border-top:1px solid #e5e7eb;padding:10px 20px 14px 20px;font-size:12px;color:#6b7280\"\n ><font color=\"#6b7280\">Copyright © HatioLab Inc. All rights reserved.</font></td\n >\n </tr>\n <!--footer end-->\n </table>\n </body>\n </html>\n `\n}\n"]}
|
package/dist-server/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../server/index.ts"],"names":[],"mappings":";;;AAAA,wDAA6B;AAE7B,oBAAiB","sourcesContent":["export * from './controllers'\n\nimport './routes'\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../server/routes.ts"],"names":[],"mappings":"","sourcesContent":[""]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"fileNames":["../../../node_modules/typescript/lib/lib.es5.d.ts","../../../node_modules/typescript/lib/lib.es2015.d.ts","../../../node_modules/typescript/lib/lib.es2016.d.ts","../../../node_modules/typescript/lib/lib.es2017.d.ts","../../../node_modules/typescript/lib/lib.es2018.d.ts","../../../node_modules/typescript/lib/lib.es2019.d.ts","../../../node_modules/typescript/lib/lib.es2020.d.ts","../../../node_modules/typescript/lib/lib.es2021.d.ts","../../../node_modules/typescript/lib/lib.es2022.d.ts","../../../node_modules/typescript/lib/lib.dom.d.ts","../../../node_modules/typescript/lib/lib.dom.iterable.d.ts","../../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../../node_modules/typescript/lib/lib.es2021.promise.d.ts","../../../node_modules/typescript/lib/lib.es2021.string.d.ts","../../../node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../../node_modules/typescript/lib/lib.es2021.intl.d.ts","../../../node_modules/typescript/lib/lib.es2022.array.d.ts","../../../node_modules/typescript/lib/lib.es2022.error.d.ts","../../../node_modules/typescript/lib/lib.es2022.intl.d.ts","../../../node_modules/typescript/lib/lib.es2022.object.d.ts","../../../node_modules/typescript/lib/lib.es2022.string.d.ts","../../../node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../../node_modules/typescript/lib/lib.esnext.disposable.d.ts","../../../node_modules/typescript/lib/lib.esnext.float16.d.ts","../../../node_modules/typescript/lib/lib.decorators.d.ts","../../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../../node_modules/tslib/tslib.d.ts","../../../node_modules/@types/node/globals.typedarray.d.ts","../../../node_modules/@types/node/buffer.buffer.d.ts","../../../node_modules/@types/node/globals.d.ts","../../../node_modules/@types/node/web-globals/abortcontroller.d.ts","../../../node_modules/@types/node/web-globals/blob.d.ts","../../../node_modules/@types/node/web-globals/console.d.ts","../../../node_modules/@types/node/web-globals/crypto.d.ts","../../../node_modules/@types/node/web-globals/domexception.d.ts","../../../node_modules/@types/node/web-globals/encoding.d.ts","../../../node_modules/@types/node/web-globals/events.d.ts","../../../node_modules/undici-types/utility.d.ts","../../../node_modules/undici-types/header.d.ts","../../../node_modules/undici-types/readable.d.ts","../../../node_modules/undici-types/fetch.d.ts","../../../node_modules/undici-types/formdata.d.ts","../../../node_modules/undici-types/connector.d.ts","../../../node_modules/undici-types/client-stats.d.ts","../../../node_modules/undici-types/client.d.ts","../../../node_modules/undici-types/errors.d.ts","../../../node_modules/undici-types/dispatcher.d.ts","../../../node_modules/undici-types/global-dispatcher.d.ts","../../../node_modules/undici-types/global-origin.d.ts","../../../node_modules/undici-types/pool-stats.d.ts","../../../node_modules/undici-types/pool.d.ts","../../../node_modules/undici-types/handlers.d.ts","../../../node_modules/undici-types/balanced-pool.d.ts","../../../node_modules/undici-types/round-robin-pool.d.ts","../../../node_modules/undici-types/h2c-client.d.ts","../../../node_modules/undici-types/agent.d.ts","../../../node_modules/undici-types/dispatcher1-wrapper.d.ts","../../../node_modules/undici-types/mock-interceptor.d.ts","../../../node_modules/undici-types/mock-call-history.d.ts","../../../node_modules/undici-types/mock-agent.d.ts","../../../node_modules/undici-types/mock-client.d.ts","../../../node_modules/undici-types/mock-pool.d.ts","../../../node_modules/undici-types/snapshot-agent.d.ts","../../../node_modules/undici-types/mock-errors.d.ts","../../../node_modules/undici-types/proxy-agent.d.ts","../../../node_modules/undici-types/socks5-proxy-agent.d.ts","../../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../../node_modules/undici-types/retry-handler.d.ts","../../../node_modules/undici-types/retry-agent.d.ts","../../../node_modules/undici-types/api.d.ts","../../../node_modules/undici-types/cache-interceptor.d.ts","../../../node_modules/undici-types/interceptors.d.ts","../../../node_modules/undici-types/util.d.ts","../../../node_modules/undici-types/cookies.d.ts","../../../node_modules/undici-types/patch.d.ts","../../../node_modules/undici-types/websocket.d.ts","../../../node_modules/undici-types/eventsource.d.ts","../../../node_modules/undici-types/diagnostics-channel.d.ts","../../../node_modules/undici-types/content-type.d.ts","../../../node_modules/undici-types/cache.d.ts","../../../node_modules/undici-types/index.d.ts","../../../node_modules/@types/node/web-globals/fetch.d.ts","../../../node_modules/@types/node/web-globals/importmeta.d.ts","../../../node_modules/@types/node/web-globals/messaging.d.ts","../../../node_modules/@types/node/web-globals/navigator.d.ts","../../../node_modules/@types/node/web-globals/performance.d.ts","../../../node_modules/@types/node/web-globals/storage.d.ts","../../../node_modules/@types/node/web-globals/streams.d.ts","../../../node_modules/@types/node/web-globals/timers.d.ts","../../../node_modules/@types/node/web-globals/url.d.ts","../../../node_modules/@types/node/assert.d.ts","../../../node_modules/@types/node/assert/strict.d.ts","../../../node_modules/@types/node/async_hooks.d.ts","../../../node_modules/@types/node/buffer.d.ts","../../../node_modules/@types/node/child_process.d.ts","../../../node_modules/@types/node/cluster.d.ts","../../../node_modules/@types/node/console.d.ts","../../../node_modules/@types/node/constants.d.ts","../../../node_modules/@types/node/crypto.d.ts","../../../node_modules/@types/node/dgram.d.ts","../../../node_modules/@types/node/diagnostics_channel.d.ts","../../../node_modules/@types/node/dns.d.ts","../../../node_modules/@types/node/dns/promises.d.ts","../../../node_modules/@types/node/domain.d.ts","../../../node_modules/@types/node/events.d.ts","../../../node_modules/@types/node/ffi.d.ts","../../../node_modules/@types/node/fs.d.ts","../../../node_modules/@types/node/fs/promises.d.ts","../../../node_modules/@types/node/http.d.ts","../../../node_modules/@types/node/http2.d.ts","../../../node_modules/@types/node/https.d.ts","../../../node_modules/@types/node/inspector.d.ts","../../../node_modules/@types/node/inspector.generated.d.ts","../../../node_modules/@types/node/inspector/promises.d.ts","../../../node_modules/@types/node/module.d.ts","../../../node_modules/@types/node/net.d.ts","../../../node_modules/buffer/index.d.ts","../../../node_modules/@types/node/os.d.ts","../../../node_modules/@types/node/path.d.ts","../../../node_modules/@types/node/path/posix.d.ts","../../../node_modules/@types/node/path/win32.d.ts","../../../node_modules/@types/node/perf_hooks.d.ts","../../../node_modules/@types/node/process.d.ts","../../../node_modules/@types/node/punycode.d.ts","../../../node_modules/@types/node/querystring.d.ts","../../../node_modules/@types/node/quic.d.ts","../../../node_modules/@types/node/readline.d.ts","../../../node_modules/@types/node/readline/promises.d.ts","../../../node_modules/@types/node/repl.d.ts","../../../node_modules/@types/node/sea.d.ts","../../../node_modules/@types/node/sqlite.d.ts","../../../node_modules/@types/node/stream.d.ts","../../../node_modules/@types/node/stream/consumers.d.ts","../../../node_modules/@types/node/stream/iter.d.ts","../../../node_modules/@types/node/stream/promises.d.ts","../../../node_modules/@types/node/stream/web.d.ts","../../../node_modules/@types/node/string_decoder.d.ts","../../../node_modules/@types/node/test.d.ts","../../../node_modules/@types/node/test/reporters.d.ts","../../../node_modules/@types/node/timers.d.ts","../../../node_modules/@types/node/timers/promises.d.ts","../../../node_modules/@types/node/tls.d.ts","../../../node_modules/@types/node/trace_events.d.ts","../../../node_modules/@types/node/tty.d.ts","../../../node_modules/@types/node/url.d.ts","../../../node_modules/@types/node/util.d.ts","../../../node_modules/@types/node/util/types.d.ts","../../../node_modules/@types/node/v8.d.ts","../../../node_modules/@types/node/vfs.d.ts","../../../node_modules/@types/node/vm.d.ts","../../../node_modules/@types/node/wasi.d.ts","../../../node_modules/@types/node/worker_threads.d.ts","../../../node_modules/@types/node/zlib.d.ts","../../../node_modules/@types/node/zlib/iter.d.ts","../../../node_modules/@types/node/index.d.ts","../../../node_modules/@types/nodemailer/lib/dkim/index.d.ts","../../../node_modules/@types/nodemailer/lib/mailer/mail-message.d.ts","../../../node_modules/@types/nodemailer/lib/xoauth2/index.d.ts","../../../node_modules/@types/nodemailer/lib/mailer/index.d.ts","../../../node_modules/@types/nodemailer/lib/mime-node/index.d.ts","../../../node_modules/@types/nodemailer/lib/smtp-connection/index.d.ts","../../../node_modules/@types/nodemailer/lib/shared/index.d.ts","../../../node_modules/@types/nodemailer/lib/json-transport/index.d.ts","../../../node_modules/@types/nodemailer/lib/sendmail-transport/index.d.ts","../../../node_modules/@types/nodemailer/lib/ses-transport/index.d.ts","../../../node_modules/@types/nodemailer/lib/smtp-pool/index.d.ts","../../../node_modules/@types/nodemailer/lib/smtp-transport/index.d.ts","../../../node_modules/@types/nodemailer/lib/stream-transport/index.d.ts","../../../node_modules/@types/nodemailer/index.d.ts","../../env/dist/dependency-graph.d.ts","../../env/dist/dependency-order.d.ts","../../env/dist/scene-modules.d.ts","../../env/dist/operato-modules.d.ts","../../env/dist/config.d.ts","../../../node_modules/@types/triple-beam/index.d.ts","../../../node_modules/logform/index.d.ts","../../../node_modules/winston-transport/index.d.ts","../../../node_modules/winston/lib/winston/config/index.d.ts","../../../node_modules/winston/lib/winston/transports/index.d.ts","../../../node_modules/winston/index.d.ts","../../../node_modules/winston-daily-rotate-file/index.d.ts","../../env/dist/logger.d.ts","../../env/dist/module-manifest.d.ts","../../env/dist/module-loader.d.ts","../../env/dist/app-root-path.d.ts","../../env/dist/app-package.d.ts","../../env/dist/translations.d.ts","../../env/dist/index.d.ts","../server/controllers/email.ts","../../../node_modules/marked/lib/marked.d.ts","../server/controllers/app-brand.ts","../server/controllers/mail-form.ts","../server/controllers/index.ts","../server/routes.ts","../server/index.ts","../../../node_modules/@jest/expect-utils/build/index.d.ts","../../../node_modules/chalk/index.d.ts","../../../node_modules/@sinclair/typebox/typebox.d.ts","../../../node_modules/@jest/schemas/build/index.d.ts","../../../node_modules/pretty-format/build/index.d.ts","../../../node_modules/jest-diff/build/index.d.ts","../../../node_modules/jest-matcher-utils/build/index.d.ts","../../../node_modules/expect/build/index.d.ts","../../../node_modules/@types/jest/index.d.ts"],"fileIdsList":[[64,129,137,142,145,147,148,149,162],[64,129,137,142,145,147,148,149,162,233],[64,129,137,142,145,147,148,149,162,235,238],[64,126,127,129,137,142,145,147,148,149,162],[64,128,129,137,142,145,147,148,149,162],[129,137,142,145,147,148,149,162],[64,129,137,142,145,147,148,149,162,171],[64,129,130,135,137,140,142,145,147,148,149,151,162,167,180],[64,129,130,131,137,140,142,145,147,148,149,162],[64,129,132,137,142,145,147,148,149,162,181],[64,129,133,134,137,142,145,147,148,149,153,162],[64,129,134,137,142,145,147,148,149,162,167,177],[64,129,135,137,140,142,145,147,148,149,151,162],[64,128,129,136,137,142,145,147,148,149,162],[64,129,137,138,142,145,147,148,149,162],[64,129,137,139,140,142,145,147,148,149,162],[64,128,129,137,140,142,145,147,148,149,162],[64,129,137,140,142,143,145,147,148,149,162,167,180],[64,129,137,140,142,143,145,147,148,149,162,169,171],[64,116,129,137,140,142,144,145,147,148,149,151,162,167,180],[64,129,137,140,142,144,145,147,148,149,151,162,167,177,180],[64,129,137,142,144,145,146,147,148,149,162,167,177,180],[63,64,65,66,67,68,69,70,71,72,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189],[64,129,137,140,142,145,147,148,149,162],[64,129,137,142,145,147,149,162],[64,129,137,142,145,147,148,149,150,162,180],[64,129,137,140,142,145,147,148,149,151,162,167],[64,129,137,142,145,147,148,149,153,162],[64,129,137,142,145,147,148,149,154,162],[64,129,137,140,142,145,147,148,149,157,162],[64,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188],[64,129,137,142,145,147,148,149,159,162],[64,129,137,142,145,147,148,149,160,162],[64,129,134,137,142,143,145,147,148,149,151,162,169,177],[64,129,137,140,142,145,147,148,149,162,163],[64,129,137,142,145,147,148,149,162,164,181,185],[64,129,137,140,142,145,147,148,149,162,167,169,170,171],[64,129,137,142,145,147,148,149,162,168,171],[64,129,137,140,142,145,147,148,149,162,167,169],[64,129,137,140,142,145,147,148,149,162,167,170,171],[64,129,137,142,145,147,148,149,162,171,181],[64,129,137,142,145,147,148,149,162,172],[64,126,129,137,142,145,147,148,149,162,167,174,180],[64,129,137,142,145,147,148,149,162,167,173],[64,129,137,140,142,145,147,148,149,162,175,176],[64,129,137,142,145,147,148,149,162,175,176],[64,129,134,137,142,145,147,148,149,151,162,167,177],[64,129,137,142,145,147,148,149,162,178],[64,129,137,142,145,147,148,149,151,162,179],[64,129,137,142,144,145,147,148,149,160,162,180],[64,129,137,142,145,147,148,149,162,181,182],[64,129,134,137,142,145,147,148,149,162,182],[64,129,137,142,145,147,148,149,162,167,183],[64,129,137,142,143,145,147,148,149,162],[64,129,137,142,145,147,148,149,150,162,185],[64,129,137,142,145,147,148,149,162,186],[64,129,132,137,142,145,147,148,149,162],[64,129,134,137,142,145,147,148,149,162],[64,129,137,142,145,147,148,149,162,181],[64,116,129,137,142,145,147,148,149,162],[64,129,137,142,145,147,148,149,162,180],[64,129,137,142,145,147,148,149,162,187],[64,129,137,142,145,147,148,149,157,162],[64,129,137,142,145,147,148,149,162,176],[64,116,129,137,140,142,143,145,147,148,149,151,157,162,167,171,180,183,185,187],[64,129,137,142,145,147,148,149,162,167,188],[64,129,137,142,145,147,148,149,162,169,189],[64,129,137,142,145,147,148,149,162,190,192,194,198,199,200,201,202,203],[64,129,137,142,145,147,148,149,162,167,190],[64,129,137,140,142,145,147,148,149,162,190,192,194,195,197,204],[64,129,137,140,142,145,147,148,149,151,162,167,180,190,191,192,193,195,196,197,204],[64,129,137,142,145,147,148,149,162,167,190,194,195],[64,129,137,142,145,147,148,149,162,167,190,194],[64,129,137,142,145,147,148,149,162,190,192,194,195,197,204],[64,129,137,142,145,147,148,149,162,167,190,196],[64,129,137,140,142,145,147,148,149,151,162,167,177,190,193,195,197],[64,129,137,140,142,145,147,148,149,162,190,192,194,195,196,197,204],[64,129,137,140,142,145,147,148,149,162,167,190,192,193,194,195,196,197,204],[64,129,137,140,142,145,147,148,149,162,167,190,192,194,195,197,204],[64,129,137,142,144,145,147,148,149,162,167,190,197],[64,129,137,142,145,147,148,149,162,231,237],[64,129,137,142,145,147,148,149,162,235],[64,129,137,142,145,147,148,149,162,232,236],[64,129,137,142,145,147,148,149,162,210],[64,129,137,142,145,147,148,149,162,234],[64,79,82,85,86,129,137,142,145,147,148,149,162,180],[64,82,129,137,142,145,147,148,149,162,167,180],[64,82,86,129,137,142,145,147,148,149,162,180],[64,129,137,142,145,147,148,149,162,167],[64,76,129,137,142,145,147,148,149,162],[64,80,129,137,142,145,147,148,149,162],[64,78,79,82,129,137,142,145,147,148,149,162,180],[64,129,137,142,145,147,148,149,151,162,177],[64,129,137,142,145,147,148,149,162,190],[64,76,129,137,142,145,147,148,149,162,190],[64,78,82,129,137,142,145,147,148,149,151,162,180],[64,73,74,75,77,81,129,137,140,142,145,147,148,149,162,167,180],[64,82,129,137,142,145,147,148,149,162],[64,82,91,100,129,137,142,145,147,148,149,162],[64,74,80,129,137,142,145,147,148,149,162],[64,82,110,111,129,137,142,145,147,148,149,162],[64,74,77,82,129,137,142,145,147,148,149,162,171,180,190],[64,78,82,129,137,142,145,147,148,149,162,180],[64,73,129,137,142,145,147,148,149,162],[64,76,77,78,80,81,82,83,84,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,111,112,113,114,115,129,137,142,145,147,148,149,162],[64,82,103,106,129,137,142,145,147,148,149,162],[64,82,91,93,94,129,137,142,145,147,148,149,162],[64,80,82,93,95,129,137,142,145,147,148,149,162],[64,81,129,137,142,145,147,148,149,162],[64,74,76,82,129,137,142,145,147,148,149,162],[64,82,86,93,95,129,137,142,145,147,148,149,162],[64,86,129,137,142,145,147,148,149,162],[64,80,82,85,129,137,142,145,147,148,149,162,180],[64,74,78,82,91,129,137,142,145,147,148,149,162],[64,82,103,129,137,142,145,147,148,149,162],[64,95,129,137,142,145,147,148,149,162],[64,74,78,82,86,129,137,142,145,147,148,149,162],[64,76,82,110,129,137,142,145,147,148,149,162,171,187,190],[64,129,137,142,145,147,148,149,162,212,214],[64,129,137,142,145,147,148,149,162,167,190,211],[64,129,137,142,145,147,148,149,162,167,190,211,212,213,214],[64,129,137,142,144,145,147,148,149,162,190,212],[62,64,129,137,142,145,147,148,149,154,162,223],[62,64,129,137,142,145,147,148,149,162,204,223],[62,64,129,137,142,145,147,148,149,162,224,226,227],[62,64,129,137,142,145,147,148,149,162,225,226],[62,64,129,137,142,145,147,148,149,162,228],[64,129,137,142,145,147,148,149,162,205,206,207,208,209,217,218,219,220,221,222],[64,129,137,142,145,147,148,149,162,215,216],[64,129,137,142,145,147,148,149,162,218]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"196cb558a13d4533a5163286f30b0509ce0210e4b316c56c38d4c0fd2fb38405","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"38fc716135a3a6f39a6d656dff26da7404c375b61fdfde3913109214e4ca4008","impliedFormat":1},{"version":"0ccdaa19852d25ecd84eec365c3bfa16e7859cadecf6e9ca6d0dbbbee439743f","affectsGlobalScope":true,"impliedFormat":1},{"version":"f9b68a1c3f8f45b4c199fa5b3ac09497230cb8f2f0cdcfebe5817b30b836a64a","affectsGlobalScope":true,"impliedFormat":1},{"version":"f53a7652392cf26ebbe4e29fd0672aa87c93bd6d0241289c13fab87b9ac35c8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"e5e01375c9e124a83b52ee4b3244ed1a4d214a6cfb54ac73e164a823a4a7860a","affectsGlobalScope":true,"impliedFormat":1},{"version":"f90ae2bbce1505e67f2f6502392e318f5714bae82d2d969185c4a6cecc8af2fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"4b58e207b93a8f1c88bbf2a95ddc686ac83962b13830fe8ad3f404ffc7051fb4","affectsGlobalScope":true,"impliedFormat":1},{"version":"1fefabcb2b06736a66d2904074d56268753654805e829989a46a0161cd8412c5","affectsGlobalScope":true,"impliedFormat":1},{"version":"b00a630557d1622ad312633bdbfbdb9c6b7220d948dca9f899db30679f160074","affectsGlobalScope":true,"impliedFormat":1},{"version":"c18a99f01eb788d849ad032b31cafd49de0b19e083fe775370834c5675d7df8e","affectsGlobalScope":true,"impliedFormat":1},{"version":"5247874c2a23b9a62d178ae84f2db6a1d54e6c9a2e7e057e178cc5eea13757fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"cdcf9ea426ad970f96ac930cd176d5c69c6c24eebd9fc580e1572d6c6a88f62c","impliedFormat":1},{"version":"88809d6c1b9c78d04a133646a6feb926def05a8774c308c7c93bc32ee163d271","impliedFormat":1},{"version":"156a859e21ef3244d13afeeba4e49760a6afa035c149dda52f0c45ea8903b338","impliedFormat":1},{"version":"21d7fab00c101ddf754b392e11534e6b20c6bda269b2ccbcdf3453cbe21d8a39","impliedFormat":1},{"version":"615754924717c0b1e293e083b83503c0a872717ad5aa60ed7f1a699eb1b4ea5c","impliedFormat":1},{"version":"d3c85d4dde1a4918009e37426ee4a940cbbd4100e2e74d03e2de0d50a77bb488","impliedFormat":1},{"version":"68834d631c8838c715f225509cfc3927913b9cc7a4870460b5b60c8dbdb99baf","impliedFormat":1},{"version":"60e3ba4b2d24548107060e5d13bffafbbbaa53d001c07bbe40386deda569b5e8","impliedFormat":1},{"version":"a712be2c8cbe0154bd17d1d7bff503d7c04331e0745eb9eea3d303e0e5d9401e","impliedFormat":1},{"version":"25bd6ae1b97ea991433337310fc406cc7c9f271b67b7c79dd24eee384759f3d4","impliedFormat":1},{"version":"ea6bc8de8b59f90a7a3960005fd01988f98fd0784e14bc6922dde2e93305ec7d","impliedFormat":1},{"version":"36107995674b29284a115e21a0618c4c2751b32a8766dd4cb3ba740308b16d59","impliedFormat":1},{"version":"914a0ae30d96d71915fc519ccb4efbf2b62c0ddfb3a3fc6129151076bc01dc60","impliedFormat":1},{"version":"38004e6801340cb890afb8cb5a9fc8972297e7f88ab94026e4b0b3c61fb32f8a","impliedFormat":1},{"version":"4ca7fb8f6018ea836b1ad24f67d5e7c2cf7410af7462e0ccc90b012944f5d7ae","impliedFormat":1},{"version":"4d327f7d72ad0918275cea3eee49a6a8dc8114ae1d5b7f3f5d0774de75f7439a","impliedFormat":1},{"version":"149f9a9e7f04e67afa0e2a49fc0ff421035c01d6b793cfcae7d2e9f6819431e2","impliedFormat":1},{"version":"e8a9dfa4c75ef6d25df8b40eaa9c31e0a69452aaf2ced4a3f4215dbdbaa876f4","impliedFormat":1},{"version":"a70af845a2eb9dd6e2723e319e14ea7fb28b129ec1361c21509b49305448c323","impliedFormat":1},{"version":"b53dc572d4f187904207ae1166652de47aab8eeb00c254d009cb226863076b56","impliedFormat":1},{"version":"57354d2f022ed64ede57b2e052306dd076a138b551abc7d30ef5e6718ce2f76a","impliedFormat":1},{"version":"0b6e25234b4eec6ed96ab138d96eb70b135690d7dd01f3dd8a8ab291c35a683a","impliedFormat":1},{"version":"9666f2f84b985b62400d2e5ab0adae9ff44de9b2a34803c2c5bd3c8325b17dc0","impliedFormat":1},{"version":"40cd35c95e9cf22cfa5bd84e96408b6fcbca55295f4ff822390abb11afbc3dca","impliedFormat":1},{"version":"b1616b8959bf557feb16369c6124a97a0e74ed6f49d1df73bb4b9ddf68acf3f3","impliedFormat":1},{"version":"f501234c5aeeeb5d7659412335227466aaacf30b952372d60afeb21c02c96348","impliedFormat":1},{"version":"40b463c6766ca1b689bfcc46d26b5e295954f32ad43e37ee6953c0a677e4ae2b","impliedFormat":1},{"version":"358f74dc35927dc88ea86dd201a2b98e701c281615e6b30a4c153eb0bb90ef71","impliedFormat":1},{"version":"8b91ff5bb912be3ea213cbcf0075aace1f5d4ff249a0d227ed673868cb7bfabc","impliedFormat":1},{"version":"80aae6afc67faa5ac0b32b5b8bc8cc9f7fa299cff15cf09cc2e11fd28c6ae29e","impliedFormat":1},{"version":"f473cd2288991ff3221165dcf73cd5d24da30391f87e85b3dd4d0450c787a391","impliedFormat":1},{"version":"499e5b055a5aba1e1998f7311a6c441a369831c70905cc565ceac93c28083d53","impliedFormat":1},{"version":"8aee8b6d4f9f62cf3776cda1305fb18763e2aade7e13cea5bbe699112df85214","impliedFormat":1},{"version":"98498b101803bb3dde9f76a56e65c14b75db1cc8bec5f4db72be541570f74fc5","impliedFormat":1},{"version":"706abfbafe0ed5f685357375e89bbf48879549ea1772185d77d15f587c5c9400","impliedFormat":1},{"version":"5d0375ca7310efb77e3ef18d068d53784faf62705e0ad04569597ae0e755c401","impliedFormat":1},{"version":"013ff793053d33a15be4614efdd6c50247bbf0b26d6bc58ba338622a7441b543","impliedFormat":1},{"version":"addf417b9eb3f938fddf8d81e96393a165e4be0d4a8b6402292f9c634b1cb00d","impliedFormat":1},{"version":"436d7b4543b340b0f3eef4310d524242e41369b9652aa9c70428767c4dcac455","impliedFormat":1},{"version":"adf27937dba6af9f08a68c5b1d3fce0ca7d4b960c57e6d6c844e7d1a8e53adae","impliedFormat":1},{"version":"12950411eeab8563b349cb7959543d92d8d02c289ed893d78499a19becb5a8cc","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"e99963ae1e3a48ca7a7958c02f3e88bb963eb7978c28b68ae6b8c9f03309d83c","impliedFormat":1},{"version":"c3f5289820990ab66b70c7fb5b63cb674001009ff84b13de40619619a9c8175f","affectsGlobalScope":true,"impliedFormat":1},{"version":"b3275d55fac10b799c9546804126239baf020d220136163f763b55a74e50e750","affectsGlobalScope":true,"impliedFormat":1},{"version":"fa68a0a3b7cb32c00e39ee3cd31f8f15b80cac97dce51b6ee7fc14a1e8deb30b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1cf059eaf468efcc649f8cf6075d3cb98e9a35a0fe9c44419ec3d2f5428d7123","affectsGlobalScope":true,"impliedFormat":1},{"version":"6c36e755bced82df7fb6ce8169265d0a7bb046ab4e2cb6d0da0cb72b22033e89","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"279d0cc1a72879918854265c3405369aa2d4d23509b8694ea102995b298cc5e2","affectsGlobalScope":true,"impliedFormat":1},{"version":"90e85f9bc549dfe2b5749b45fe734144e96cd5d04b38eae244028794e142a77e","affectsGlobalScope":true,"impliedFormat":1},{"version":"e0a5deeb610b2a50a6350bd23df6490036a1773a8a71d70f2f9549ab009e67ee","affectsGlobalScope":true,"impliedFormat":1},{"version":"594ae90cacd813fa392ff80d2e0a8eff4e41f4a136329a940e321399dd8895b4","impliedFormat":1},{"version":"d1f333ade8ff35a409b4984e1f11956fe11c61855b0c7e9b59f0313e48b40c4a","impliedFormat":1},{"version":"0224aa4b3464895d69c413a640a19ac2166778a74eb5eb3b36b021c72d42b274","impliedFormat":1},{"version":"575aa163c4c32e5b82e0e99b1f9f80806e1d78bfa259706e05139251c022277b","affectsGlobalScope":true,"impliedFormat":1},{"version":"7fb21326854faaa31ef02c9d51629fb6acedacb9396e74bf22ff8409441ea9ae","impliedFormat":1},{"version":"2fbf504c4791f9d32cd766cfe6b605bcda63289b925401953a7900db9af85348","impliedFormat":1},{"version":"ed0fb633cae35948d9e144004299a4bdf1ab912667c787b7fbffcd6d8c7b92a2","impliedFormat":1},{"version":"1678b04557dca52feab73cc67610918a7f5e25bfdba3e7fa081acd625d93106d","impliedFormat":1},{"version":"9019e48ace02a7f39315d84261f4a3dd23b7a3b1f6584e694001ac93971791b7","impliedFormat":1},{"version":"2f78692a85ada51c8f0988184d34d28436c1040e8ccf0758ba70d4b32b9776ad","impliedFormat":1},{"version":"97581dc7099ef3d844c83706d53a7ecf895c0e867fbf6b9dc035bb3080f677bd","impliedFormat":1},{"version":"e494b286c8e27c52f8c7f945aa80ff223f2a3cd4f7a2619fa8991f1459e26f07","impliedFormat":1},{"version":"f54f5f9e10bbceba7515dfad0ffc89dffdb8d749d0604594c57a725cf6d79c20","impliedFormat":1},{"version":"41d17e1ad9a002feb11c8cdd2777e5bbc0cdb1e3f595d237e4dded0b6949983b","impliedFormat":1},{"version":"8c7e618c2a91ea7f6b5cca272a295864e92c16413be8fc56a943e8c7d5320011","affectsGlobalScope":true,"impliedFormat":1},{"version":"13f487e411f9657df0e76572e500c1209b8fe95ee3b4cc6e6e7913c15f56207d","impliedFormat":1},{"version":"9d37b8a9678efbcdf38238b59ce8e6f7db70aba1a516f3a4a671a301dbacfb3d","impliedFormat":1},{"version":"a47a792b8cff71443be8dfb199f2b77e102a7bf9d4f90c18059f05d9af2d7413","impliedFormat":1},{"version":"ad50512520720d10294c629cb4e2df23891c3fcbeaca00fbfb9e6bbea65f3dd6","impliedFormat":1},{"version":"189769511b45c93b23ba76069f7701d3b631cfbedc1eb94c7753486c78736f78","impliedFormat":1},{"version":"2c2bdaa1d8ead9f68628d6d9d250e46ee8e81aa4898b4769a36956ae15e060fe","impliedFormat":1},{"version":"ba389fd3d7fba6670e97bc82eb12469dcb371d22f24e63859c1df5a083c823ed","impliedFormat":1},{"version":"5ff4433a2deae4f85ab1377e90a7554ce6b47ae51c69a84ca30a6e22fae85834","impliedFormat":1},{"version":"82b91e4e42e6c41bc7fc1b6c2dc5eba6a2ba98375eb1f210e6ff6bba2d54177e","impliedFormat":1},{"version":"97234c5303866576f913d0ccae7d58d6322d9e803c7bf1228a3fda46ab8087b2","affectsGlobalScope":true,"impliedFormat":1},{"version":"961dec547748827cb6b45f6fdc66273f7bacd9c73103c6779f070f2fd07f23f9","impliedFormat":1},{"version":"4967529644e391115ca5592184d4b63980569adf60ee685f968fd59ab1557188","impliedFormat":1},{"version":"73eeb740dacc45adc607a4f59f90fa9dbe2717d93d82f115f45f34e18f8d644a","impliedFormat":1},{"version":"ec501101c2a96133a6c695f934c8f6642149cc728571b29cbb7b770984c1088e","impliedFormat":1},{"version":"b214ebcf76c51b115453f69729ee8aa7b7f8eccdae2a922b568a45c2d7ff52f7","impliedFormat":1},{"version":"429c9cdfa7d126255779efd7e6d9057ced2d69c81859bbab32073bad52e9ba76","impliedFormat":1},{"version":"d251cda16f3f6a3e07f07c9e6e823ef6c583c63f653eb8777dafa749a78298e3","impliedFormat":1},{"version":"361939136b496a38b3e6b7be750bbb6998ef289bb8dd304c673138542ca16137","affectsGlobalScope":true,"impliedFormat":1},{"version":"230763250f20449fa7b3c9273e1967adb0023dc890d4be1553faca658ee65971","impliedFormat":1},{"version":"c3e9078b60cb329d1221f5878e88cecfa3e74460550e605a58fcfb41a66029ff","impliedFormat":1},{"version":"89e2568ebc2ec1e4149384b105e80e8bbf41eb4d711547f1121f4f628028de96","impliedFormat":1},{"version":"441b9bb09013654aa3d050e68b06464d8959b473e85868249d9d18f692acd35b","impliedFormat":1},{"version":"bc18a1991ba681f03e13285fa1d7b99b03b67ee671b7bc936254467177543890","impliedFormat":1},{"version":"55246f15e33ff1e2e9e679b25fa9790a48db55dc63d567fe25fac8b6a0efe911","impliedFormat":1},{"version":"fa94bbf532b7af8f394b95fa310980d6e20bd2d4c871c6a6cb9f70f03750a44b","impliedFormat":1},{"version":"925734f303b7f0cc111d42aeb21781d38a79e6d5ac05b2b1400cd1861a75d27b","impliedFormat":1},{"version":"5b26c4dd672d88336bb929787c9bfb55119e80ba89ec6dc923da1c063892843e","affectsGlobalScope":true,"impliedFormat":1},{"version":"7fa2214bb0d64701bc6f9ce8cde2fd2ff8c571e0b23065fa04a8a5a6beb91511","impliedFormat":1},{"version":"7286e4e5f80c0b1ab16addbdbbc9dd47fbae1c42034189261177b84d745cde3b","impliedFormat":1},{"version":"f12624a4a8d042b68914eac1b0a16571fc1c523173fcdf2517c65d191bd5a86c","impliedFormat":1},{"version":"cd2a656ba1d250c2002190b683e3826bf4362b6919450bc0f9bbf5612ebad837","impliedFormat":1},{"version":"841983e39bd4cbb463be385e92fda11057cab368bf27100a801c492f1d86cbaa","impliedFormat":1},{"version":"3e221ff0522e6ff95aa74a5211126aaf4d7e85ed8c8ff19290d591ad4bef988f","impliedFormat":1},{"version":"7da83f6429c6298ebf2be43d296b56ecfc94c9c28f5471b2f23b87545b914cea","impliedFormat":1},{"version":"e4156ddb25aa0e3b5303d372f26957b36778f0f6bbd4326359269873295e3058","affectsGlobalScope":true,"impliedFormat":1},{"version":"cc1b433a84cae05ddc5672d4823170af78606ad21ecef60dbc4570190cbf1357","impliedFormat":1},{"version":"751048d4aa67e20e5ecd2692340ea0d19bae42a20cc651d6f56d095e411ce3ac","impliedFormat":1},{"version":"7f78cfb2b343838612c192cb251746e3a7c62ac7675726a47e130d9b213f6580","impliedFormat":1},{"version":"aed8f3e5c7e53462565eedf34a9bcb700393cb2c1ab0c768602b929c3ed3145d","impliedFormat":1},{"version":"8e2577e7262051fd3c5bd6ca2b2056d358ff8853565720f92455860824c25188","impliedFormat":1},{"version":"fb12cb2de38cc8b89e38ece1014b4ae1047cd89b8dd248c64adc1c53c358ca02","impliedFormat":1},{"version":"bb9dbb4b2ad81e3e71ec5ba4314973718555b9d04ba2a17dfbf875efecb8e2c0","impliedFormat":1},{"version":"9021dc5be8f3a87af5cede29221188a6497e2092b6889e0be212ef6b6b7153e9","impliedFormat":1},{"version":"4a8c8fd951d9fd9e0775f0aae8ed1f8b528204e24a2600bea3a1228ea83de52c","impliedFormat":1},{"version":"5b9cc0c724a8ebc7a873ab8e73c20b2416cef04b9e9d7f95ef1fa0fdcd4e0ec8","impliedFormat":1},{"version":"99ab6d0d660ce4d21efb52288a39fd35bb3f556980ec5463b1ae8f304a3bbc85","impliedFormat":1},{"version":"80a4b7023a2cc9f14d3f2e4635d6615ab3eff4b5b3630f62a8e73992fdd8cdb9","impliedFormat":1},{"version":"cd0d57a97c2f15c6dd6366e4d1fbf2e3accff61a8ad0f1021065723e1470e61f","impliedFormat":1},{"version":"afa1c49f8e559e413d57343339db857d2a8159435cf9cf7d4deb41718fff1b88","impliedFormat":1},{"version":"c46f111af647c4134ae869653130610d62da321f90ebf19e186a3ea4bed79350","impliedFormat":1},{"version":"6825eb4d1c8beb77e9ed6681c830326a15ebf52b171f83ffbca1b1574c90a3b0","impliedFormat":1},{"version":"1741975791f9be7f803a826457273094096e8bba7a50f8fa960d5ed2328cdbcc","impliedFormat":1},{"version":"6ec0d1c15d14d63d08ccb10d09d839bf8a724f6b4b9ed134a3ab5042c54a7721","impliedFormat":1},{"version":"1a7ef36e015291ad5d04a7da46a1ac84b1bbbdaea7045a8897337da3b9790d39","impliedFormat":1},{"version":"b61028c5e29a0691e91a03fa2c4501ea7ed27f8fa536286dc2887a39a38b6c44","impliedFormat":1},{"version":"a4bf154e0f9d56112713c3a7d2d60c85d667cae17e69f7869a32578881b652a8","impliedFormat":1},{"version":"d5f65e3a5277cbd0b2c89da26703c5879cc428da7ca816d1d1fcdfd7c0a2500e","impliedFormat":1},{"version":"c784a9f75a6f27cf8c43cc9a12c66d68d3beb2e7376e1babfae5ae4998ffbc4a","impliedFormat":1},{"version":"feb4c51948d875fdbbaa402dad77ee40cf1752b179574094b613d8ad98921ce1","impliedFormat":1},{"version":"317b7ae63ce71d55154f5e410e0213ddfb07b6fd5251f8999783d1283ec5ed19","impliedFormat":1},{"version":"b457d606cabde6ea3b0bc32c23dc0de1c84bb5cb06d9e101f7076440fc244727","impliedFormat":1},{"version":"859cf43771b68e589bb12c6e5cde3edcde4b530c7d324f455af2b9e61d4f4768","impliedFormat":1},{"version":"9faa2661daa32d2369ec31e583df91fd556f74bcbd036dab54184303dee4f311","impliedFormat":1},{"version":"ba2e5b6da441b8cf9baddc30520c59dc3ab47ad3674f6cb51f64e7e1f662df12","impliedFormat":1},"61da60198d58f00210a34b39a0625a136ae63d7cf42500e764b91b2e5e2dbdcb","4c11afc0bcf5ad4cb8351103476e6e8076ad11f563ae65a94a14b94d158d046a","2ffaa1f7886d57fe801bd41337521c661ee17d657d1004e504d5422f62cfd23c","738433a0f2e73b2ba4ebbcaa6487030e0b8aa64e65813a160e1b845e20338d9c","972608570a8b1d91ef22149c069a5c29d75d00b4131e2697ea6d42302d3548b9",{"version":"908217c4f2244ec402b73533ebfcc46d6dcd34fc1c807ff403d7f98702abb3bc","impliedFormat":1},{"version":"1bc5991c91bf4be8b59db501ed284a34945d95abe9b7451d02ea001f7c5621a9","impliedFormat":1},{"version":"d8b8a5a6bf623239d5374ad4a7ff6f3b195ab5ee61293f59f1957e90d2a22809","impliedFormat":1},{"version":"35d283eca7dc0a0c7b099f5fbbf0678b87f3d837572cd5e539ba297ad9837e68","impliedFormat":1},{"version":"1c8384a195a2d931cf6e2b8f656acf558ca649a3f74922d86b95889f49a7f7c5","impliedFormat":1},{"version":"cd11655f57a3558dfcee05a6e78c026f9dfd30535eaf124439c5e88a5617359b","impliedFormat":1},{"version":"83a328cba2f47fc5a948eac394ae2ef2a5a0d26dd366ab373d2c2178bbdcd36c","impliedFormat":1},"2aafbaf6ace811133c4858f9184a6597866fbccb89eb6f1b9c4247e87d0bbfed","a113891e4f35eb4f1938fe7fcd813ce6440d020c0e183dbbdf289a6aad7a0407","5b44eaa08688d8e16c633bb23e213a6830de959c9a1f807794357253f0e5fd8e","9e795af82140c310a86279c6f0079d8de3b4db03b4d9476267aa8703a9b7d7a7","46a0b34e1264c4d25ca6646ff0e6cfaa7275ea1ae5a6bc23d4dfd84edf2f2b2e","5b1384e530397bf7e68ba0beccbb483ec8e23d9dbbcc2ffd571443690602b255","7c5f9e3c28280e04e58031d3c4a15caf8351402e47c90d9c34ec715fc1ae2c21",{"version":"ddd9690e5eb0da896285e27869923dfa807cf329a8a5f0d8e0934fcc0318346e","signature":"64a2fe0e1333ffa351371e9987c4f2e723a1c24e912ba9624486f44ed8b95827"},{"version":"2f9501a28443c63187a4a868f2e33807640191569144bc65c9127ed0a6ee9f3b","impliedFormat":99},{"version":"6e509c7c1ae1dbb5d8815a672a39754b44fc173d01115aa4d1724e8f390bcff1","signature":"0adb0749f66ed3d2040b6d531e2bbe098c2de11ace647a6696e459224c64cc7c"},{"version":"5828b3c423198b64f82ed3a960376fbfbf7d4c4b2a645d806133f78fc0fd771a","signature":"b13e8afce522e651c5fbbf730ceaf970fdcfabb8756c4e65b461d9be5ed5fbfc"},{"version":"e6f32c78fa8476e39d2b5c0b7ea7d92895632689b8e4d9e4253faed5ef412e7a","signature":"753fa6bf14f03e9d1ca5e688585b409dc386f2faf0a0a077f9e60b6ecdc10cd1"},"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",{"version":"2fe67332cbd295f073c798d6386873d080b485a29e9d12b634751bb3bade66ea","signature":"5b571b5817e23753a77028b78c4f47a9bc00593bb804a12d5ccda6bf2005d15b"},{"version":"cdcc132f207d097d7d3aa75615ab9a2e71d6a478162dde8b67f88ea19f3e54de","impliedFormat":1},{"version":"0d14fa22c41fdc7277e6f71473b20ebc07f40f00e38875142335d5b63cdfc9d2","impliedFormat":1},{"version":"e1028394c1cf96d5d057ecc647e31e457b919092f882ed0c7092152b077fed9d","impliedFormat":1},{"version":"f315e1e65a1f80992f0509e84e4ae2df15ecd9ef73df975f7c98813b71e4c8da","impliedFormat":1},{"version":"5b9586e9b0b6322e5bfbd2c29bd3b8e21ab9d871f82346cb71020e3d84bae73e","impliedFormat":1},{"version":"3e70a7e67c2cb16f8cd49097360c0309fe9d1e3210ff9222e9dac1f8df9d4fb6","impliedFormat":1},{"version":"ab68d2a3e3e8767c3fba8f80de099a1cfc18c0de79e42cb02ae66e22dfe14a66","impliedFormat":1},{"version":"d96cc6598148bf1a98fb2e8dcf01c63a4b3558bdaec6ef35e087fd0562eb40ec","impliedFormat":1},{"version":"f8db4fea512ab759b2223b90ecbbe7dae919c02f8ce95ec03f7fb1cf757cfbeb","affectsGlobalScope":true,"impliedFormat":1}],"root":[224,[226,230]],"options":{"allowJs":true,"allowSyntheticDefaultImports":true,"declaration":true,"emitDecoratorMetadata":true,"esModuleInterop":true,"experimentalDecorators":true,"importHelpers":true,"inlineSources":true,"module":1,"noEmitOnError":true,"noImplicitAny":false,"outDir":"./","skipLibCheck":true,"sourceMap":true,"strict":false,"target":9,"useDefineForClassFields":false},"referencedMap":[[231,1],[234,2],[233,1],[239,3],[126,4],[127,4],[128,5],[64,6],[129,7],[130,8],[131,9],[132,10],[133,11],[134,12],[135,13],[136,14],[137,15],[138,15],[139,16],[140,17],[141,1],[142,18],[143,19],[65,1],[63,1],[144,20],[145,21],[146,22],[190,23],[147,24],[148,25],[149,24],[150,26],[151,27],[153,28],[154,29],[155,29],[156,29],[157,30],[158,31],[159,32],[160,33],[161,34],[162,35],[163,35],[164,36],[165,1],[166,1],[167,37],[168,38],[169,39],[170,40],[171,41],[172,42],[173,43],[174,44],[175,45],[176,46],[177,47],[178,48],[179,49],[180,50],[181,51],[182,52],[183,53],[184,54],[185,55],[186,56],[66,24],[67,1],[68,57],[69,58],[70,1],[71,59],[72,1],[117,60],[118,61],[119,62],[120,62],[121,63],[122,1],[123,7],[124,64],[125,61],[187,65],[188,66],[189,67],[204,68],[191,69],[198,70],[194,71],[192,72],[195,73],[199,74],[200,70],[197,75],[196,76],[201,77],[202,78],[203,79],[193,80],[210,1],[152,1],[232,1],[238,81],[236,82],[237,83],[211,84],[225,1],[235,85],[62,1],[60,1],[61,1],[10,1],[11,1],[13,1],[12,1],[2,1],[14,1],[15,1],[16,1],[17,1],[18,1],[19,1],[20,1],[21,1],[3,1],[22,1],[23,1],[4,1],[24,1],[28,1],[25,1],[26,1],[27,1],[29,1],[30,1],[31,1],[5,1],[32,1],[33,1],[34,1],[35,1],[6,1],[39,1],[36,1],[37,1],[38,1],[40,1],[7,1],[41,1],[46,1],[47,1],[42,1],[43,1],[44,1],[45,1],[8,1],[51,1],[48,1],[49,1],[50,1],[52,1],[9,1],[53,1],[54,1],[55,1],[57,1],[56,1],[1,1],[58,1],[59,1],[91,86],[105,87],[88,88],[106,89],[115,90],[79,91],[80,92],[78,93],[114,94],[109,95],[113,96],[82,97],[92,98],[102,99],[81,100],[112,101],[76,102],[77,95],[83,98],[84,1],[90,103],[87,98],[74,104],[116,105],[107,106],[95,107],[94,98],[96,108],[99,109],[93,110],[97,111],[110,94],[85,112],[86,113],[100,114],[75,89],[104,115],[103,98],[89,113],[98,116],[101,117],[108,1],[73,1],[111,118],[216,119],[212,120],[215,121],[213,94],[214,122],[226,123],[224,124],[228,125],[227,126],[230,127],[229,1],[221,1],[220,1],[209,1],[205,1],[206,1],[223,128],[217,129],[219,130],[218,1],[208,1],[207,1],[222,1]],"version":"5.9.3"}
|
package/tests/mail-form.test.ts
DELETED
|
@@ -1,149 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* The one mail every module sends (email-base): the application's brand at the head, the subject in a band of its
|
|
3
|
-
* colour, the body, one button, and a quiet foot - laid out so mail programs that drop styles keep it.
|
|
4
|
-
*/
|
|
5
|
-
import { brandOf, DEFAULT_BRAND, textColorOn } from '../server/controllers/app-brand'
|
|
6
|
-
import { escapeHtml, languageOf, mailForm, renderMailMarkdown, safeMailHref } from '../server/controllers/mail-form'
|
|
7
|
-
|
|
8
|
-
describe('the language of a mail', () => {
|
|
9
|
-
test('a person reads their language; a person without one reads the fallback', () => {
|
|
10
|
-
expect(languageOf('ko-KR', 'en')).toBe('ko')
|
|
11
|
-
expect(languageOf('zh_CN', 'en')).toBe('zh')
|
|
12
|
-
expect(languageOf(null, 'ko-KR')).toBe('ko')
|
|
13
|
-
expect(languageOf(undefined, undefined)).toBe('en')
|
|
14
|
-
})
|
|
15
|
-
})
|
|
16
|
-
|
|
17
|
-
describe('what a mail carries', () => {
|
|
18
|
-
const words = { subject: '[결재 요청] <b>A&B</b>', body: 'line "one"\nline two', action: '열기', note: '결재함에서 확인' }
|
|
19
|
-
|
|
20
|
-
test('the mail shows values as text', () => {
|
|
21
|
-
const html = mailForm({ lang: 'ko', words, link: 'https://x.example/a?b=1&c="2"' })
|
|
22
|
-
|
|
23
|
-
expect(html).toContain('<b>A&B</b>')
|
|
24
|
-
expect(html).not.toContain('<b>A&B</b>')
|
|
25
|
-
expect(html).toContain('href="https://x.example/a?b=1&c="2""')
|
|
26
|
-
expect(escapeHtml(`'`)).toBe(''')
|
|
27
|
-
})
|
|
28
|
-
|
|
29
|
-
test('with no link the mail shows the note instead of a button', () => {
|
|
30
|
-
const html = mailForm({ lang: 'ko', words })
|
|
31
|
-
|
|
32
|
-
expect(html).not.toContain('href=')
|
|
33
|
-
expect(html).toContain('결재함에서 확인')
|
|
34
|
-
})
|
|
35
|
-
|
|
36
|
-
})
|
|
37
|
-
|
|
38
|
-
describe('a Markdown body', () => {
|
|
39
|
-
const BASE = 'https://office.example.com/domain/hatiolab/'
|
|
40
|
-
|
|
41
|
-
test('it is rendered as mail HTML', () => {
|
|
42
|
-
const html = renderMailMarkdown('# Title\n\n**bold** and a list:\n\n- one\n- two', BASE)
|
|
43
|
-
|
|
44
|
-
expect(html).toContain('<h1>Title</h1>')
|
|
45
|
-
expect(html).toContain('<strong>bold</strong>')
|
|
46
|
-
expect(html).toContain('<li>one</li>')
|
|
47
|
-
})
|
|
48
|
-
|
|
49
|
-
test('raw HTML is shown as text, never as markup', () => {
|
|
50
|
-
const html = renderMailMarkdown('<script>alert(1)</script>\n\nhi <img src=x onerror=alert(1)> <b>b</b>', BASE)
|
|
51
|
-
|
|
52
|
-
expect(html).not.toMatch(/<script|<img|<b>/)
|
|
53
|
-
expect(html).toContain('<script>')
|
|
54
|
-
})
|
|
55
|
-
|
|
56
|
-
test('links go to http(s), mailto and app addresses only', () => {
|
|
57
|
-
expect(safeMailHref('https://hatiolab.com/a', BASE)).toBe('https://hatiolab.com/a')
|
|
58
|
-
expect(safeMailHref('mailto:hr@hatiolab.com', BASE)).toBe('mailto:hr@hatiolab.com')
|
|
59
|
-
expect(safeMailHref('announcement-view?id=1', BASE)).toBe(`${BASE}announcement-view?id=1`)
|
|
60
|
-
|
|
61
|
-
for (const bad of ['javascript:alert(1)', ' JaVaScRiPt:alert(1)', 'java\tscript:alert(1)', 'data:text/html,<b>x</b>', 'vbscript:x', 'file:///etc/passwd']) {
|
|
62
|
-
expect(safeMailHref(bad, BASE)).toBeUndefined()
|
|
63
|
-
}
|
|
64
|
-
})
|
|
65
|
-
|
|
66
|
-
test('an app address has nowhere to go without the domain’s address', () => {
|
|
67
|
-
expect(safeMailHref('announcement-view?id=1')).toBeUndefined()
|
|
68
|
-
expect(safeMailHref('https://hatiolab.com/a')).toBe('https://hatiolab.com/a')
|
|
69
|
-
})
|
|
70
|
-
|
|
71
|
-
test('a link that is not allowed keeps its text and loses its address; an image is a link, never loaded', () => {
|
|
72
|
-
const html = renderMailMarkdown('[click](javascript:alert(1)) [form](announcement-view?id=1) ', BASE)
|
|
73
|
-
|
|
74
|
-
expect(html).not.toContain('javascript:')
|
|
75
|
-
expect(html).toContain('click')
|
|
76
|
-
expect(html).toContain(`<a href="${BASE}announcement-view?id=1">form</a>`)
|
|
77
|
-
expect(html).not.toContain('<img')
|
|
78
|
-
expect(html).toContain('<a href="https://cdn.example.com/l.png">logo</a>')
|
|
79
|
-
})
|
|
80
|
-
|
|
81
|
-
})
|
|
82
|
-
|
|
83
|
-
describe('whose mail it is', () => {
|
|
84
|
-
const words = { subject: '[공지] 점검', body: '본문', action: '열기', note: '알림함에서 확인' }
|
|
85
|
-
|
|
86
|
-
test('the brand is the manifest\'s name, tagline and brand colour; the theme colour stands in for a missing brand colour', () => {
|
|
87
|
-
expect(brandOf({ name: 'operato office', tagline: 'Reimagining Business.', brand_color: '#059669', theme_color: '#262e38' })).toEqual({
|
|
88
|
-
name: 'operato office',
|
|
89
|
-
tagline: 'Reimagining Business.',
|
|
90
|
-
color: '#059669'
|
|
91
|
-
})
|
|
92
|
-
expect(brandOf({ name: 'Operato Plant', theme_color: '#0E8A56' })).toEqual({ name: 'Operato Plant', tagline: undefined, color: '#0e8a56' })
|
|
93
|
-
expect(brandOf({ name: ' ', brand_color: 'green', theme_color: '#abc' })).toEqual({ name: DEFAULT_BRAND.name, tagline: undefined, color: '#aabbcc' })
|
|
94
|
-
expect(brandOf(undefined)).toEqual({ name: DEFAULT_BRAND.name, tagline: undefined, color: DEFAULT_BRAND.color })
|
|
95
|
-
})
|
|
96
|
-
|
|
97
|
-
test('the text on the brand colour is white while it keeps 3:1, black below', () => {
|
|
98
|
-
expect(textColorOn('#059669')).toBe('#ffffff')
|
|
99
|
-
expect(textColorOn('#262e38')).toBe('#ffffff')
|
|
100
|
-
expect(textColorOn('#34d399')).toBe('#000000')
|
|
101
|
-
expect(textColorOn('#ffffff')).toBe('#000000')
|
|
102
|
-
})
|
|
103
|
-
|
|
104
|
-
test('the mail names the application and its tagline, and its band and button are the brand colour - no logo image', () => {
|
|
105
|
-
const brand = { name: 'operato <office>', tagline: 'Reimagining Business.', color: '#059669' }
|
|
106
|
-
const html = mailForm({ lang: 'ko', words, link: 'https://x.example/a', brand })
|
|
107
|
-
|
|
108
|
-
expect(html).toContain('operato <office>')
|
|
109
|
-
expect(html).toContain('Reimagining Business.')
|
|
110
|
-
expect(html).not.toContain('<img')
|
|
111
|
-
expect(html).not.toContain('#22a6a7')
|
|
112
|
-
expect(html).not.toContain('#3d5874')
|
|
113
|
-
expect(html).toContain('Copyright © HatioLab Inc. All rights reserved.')
|
|
114
|
-
expect(html.match(/background-color:#059669/g)).toHaveLength(2)
|
|
115
|
-
expect(html).toContain('border-top:2px solid #059669')
|
|
116
|
-
|
|
117
|
-
const plain = mailForm({ lang: 'ko', words })
|
|
118
|
-
expect(plain).toContain(`>${DEFAULT_BRAND.name}<`)
|
|
119
|
-
expect(plain).toContain(`background-color:${DEFAULT_BRAND.color}`)
|
|
120
|
-
})
|
|
121
|
-
|
|
122
|
-
test('the colours hold where a mail program drops styles: each sits on its table cell as bgcolor, the mail says it is light, the tagline has its own cell', () => {
|
|
123
|
-
const brand = { name: 'operato office', tagline: 'Reimagining Business.', color: '#059669' }
|
|
124
|
-
const html = mailForm({ lang: 'ko', words, link: 'https://x.example/a', brand })
|
|
125
|
-
|
|
126
|
-
expect(html).toContain('<meta name="color-scheme" content="light" />')
|
|
127
|
-
expect(html.match(/<td bgcolor="#059669"/g)).toHaveLength(2)
|
|
128
|
-
expect(html).toContain('<td bgcolor="#ffffff"')
|
|
129
|
-
expect(html.match(/<td bgcolor=/g)).toHaveLength(3)
|
|
130
|
-
expect(html).toMatch(/operato office<\/td>\s*<td[^>]*> Reimagining Business\.<\/td>/)
|
|
131
|
-
expect(html).not.toMatch(/margin-left/)
|
|
132
|
-
expect(html).not.toMatch(/<div style="background-color/)
|
|
133
|
-
})
|
|
134
|
-
|
|
135
|
-
})
|
|
136
|
-
|
|
137
|
-
describe('the subject band', () => {
|
|
138
|
-
/*
|
|
139
|
-
* Use equal horizontal insets so mail subjects remain centered on narrow screens.
|
|
140
|
-
*/
|
|
141
|
-
test('the subject is inset alike on both sides, as the head and the body are', () => {
|
|
142
|
-
const html = mailForm({ lang: 'ko', words: { subject: '공지', body: '본문', action: '열기' } })
|
|
143
|
-
const band = /<!--title begin-->[\s\S]*?padding:(\d+)px (\d+)px (\d+)px (\d+)px/.exec(html)
|
|
144
|
-
expect(band).not.toBeNull()
|
|
145
|
-
const [, , right, , left] = band!
|
|
146
|
-
expect(left).toBe(right)
|
|
147
|
-
expect(left).toBe('20')
|
|
148
|
-
})
|
|
149
|
-
})
|