@serve.zone/dcrouter 17.7.1 → 17.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/deno.json +1 -1
  2. package/dist_serve/bundle.js +712 -709
  3. package/dist_ts/00_commitinfo_data.js +1 -1
  4. package/dist_ts/classes.dcrouter.d.ts +2 -0
  5. package/dist_ts/classes.dcrouter.js +23 -1
  6. package/dist_ts/config/classes.db-seeder.js +9 -1
  7. package/dist_ts/config/classes.gateway-client-manager.js +3 -1
  8. package/dist_ts/config/helpers.http-redirects.js +28 -1
  9. package/dist_ts/config/helpers.special-forwards.js +12 -9
  10. package/dist_ts/db/documents/classes.cached.email.d.ts +7 -0
  11. package/dist_ts/db/documents/classes.cached.email.js +52 -2
  12. package/dist_ts/db/documents/classes.webpush-admission.doc.d.ts +19 -0
  13. package/dist_ts/db/documents/classes.webpush-admission.doc.js +124 -0
  14. package/dist_ts/db/documents/classes.webpush-binding.doc.d.ts +65 -0
  15. package/dist_ts/db/documents/classes.webpush-binding.doc.js +205 -0
  16. package/dist_ts/db/documents/classes.webpush-spool.doc.d.ts +44 -0
  17. package/dist_ts/db/documents/classes.webpush-spool.doc.js +277 -0
  18. package/dist_ts/db/documents/index.d.ts +3 -0
  19. package/dist_ts/db/documents/index.js +5 -1
  20. package/dist_ts/email/classes.accepted-email-spool.d.ts +5 -0
  21. package/dist_ts/email/classes.accepted-email-spool.js +28 -3
  22. package/dist_ts/email/classes.email-route-builder.js +5 -1
  23. package/dist_ts/email/classes.workapp-mail-manager.d.ts +5 -1
  24. package/dist_ts/email/classes.workapp-mail-manager.js +87 -12
  25. package/dist_ts/index.d.ts +1 -0
  26. package/dist_ts/index.js +3 -1
  27. package/dist_ts/opsserver/classes.opsserver.d.ts +2 -0
  28. package/dist_ts/opsserver/classes.opsserver.js +5 -1
  29. package/dist_ts/opsserver/handlers/gatewayclient.handler.js +33 -6
  30. package/dist_ts/opsserver/handlers/index.d.ts +2 -0
  31. package/dist_ts/opsserver/handlers/index.js +3 -1
  32. package/dist_ts/opsserver/handlers/webpush-app.handler.d.ts +9 -0
  33. package/dist_ts/opsserver/handlers/webpush-app.handler.js +66 -0
  34. package/dist_ts/opsserver/handlers/webpush-control.handler.d.ts +14 -0
  35. package/dist_ts/opsserver/handlers/webpush-control.handler.js +163 -0
  36. package/dist_ts/plugins.d.ts +5 -2
  37. package/dist_ts/plugins.js +6 -3
  38. package/dist_ts/remoteingress/edge-derivation-routes.js +5 -1
  39. package/dist_ts/security/classes.route-policy-augmenter.d.ts +10 -6
  40. package/dist_ts/security/classes.route-policy-augmenter.js +65 -51
  41. package/dist_ts/webpush/classes.webpush-crypto.d.ts +38 -0
  42. package/dist_ts/webpush/classes.webpush-crypto.js +231 -0
  43. package/dist_ts/webpush/classes.webpush-manager.d.ts +153 -0
  44. package/dist_ts/webpush/classes.webpush-manager.js +2374 -0
  45. package/dist_ts/webpush/classes.webpush-transport.d.ts +45 -0
  46. package/dist_ts/webpush/classes.webpush-transport.js +161 -0
  47. package/dist_ts/webpush/helpers.webpush-endpoint.d.ts +21 -0
  48. package/dist_ts/webpush/helpers.webpush-endpoint.js +111 -0
  49. package/dist_ts/webpush/index.d.ts +4 -0
  50. package/dist_ts/webpush/index.js +5 -0
  51. package/dist_ts/webpush/webpush-indexes.d.ts +11 -0
  52. package/dist_ts/webpush/webpush-indexes.js +123 -0
  53. package/dist_ts_interfaces/data/remoteingress.d.ts +14 -2
  54. package/dist_ts_interfaces/data/route-management.d.ts +2 -0
  55. package/dist_ts_interfaces/data/route-management.js +1 -1
  56. package/dist_ts_migrations/index.js +285 -11
  57. package/dist_ts_web/00_commitinfo_data.js +1 -1
  58. package/dist_ts_web/elements/network/ops-view-routes.js +41 -1
  59. package/dist_ts_web/elements/network/special-forward-dialog.js +2 -2
  60. package/package.json +14 -10
  61. package/readme.md +27 -0
  62. package/third-party-notices.md +37 -0
  63. package/ts/00_commitinfo_data.ts +1 -1
  64. package/ts/classes.dcrouter.ts +29 -0
  65. package/ts/config/classes.db-seeder.ts +8 -0
  66. package/ts/config/classes.gateway-client-manager.ts +2 -0
  67. package/ts/config/helpers.http-redirects.ts +31 -1
  68. package/ts/config/helpers.special-forwards.ts +11 -8
  69. package/ts/db/documents/classes.cached.email.ts +47 -0
  70. package/ts/db/documents/classes.webpush-admission.doc.ts +48 -0
  71. package/ts/db/documents/classes.webpush-binding.doc.ts +147 -0
  72. package/ts/db/documents/classes.webpush-spool.doc.ts +136 -0
  73. package/ts/db/documents/index.ts +5 -0
  74. package/ts/email/classes.accepted-email-spool.ts +41 -2
  75. package/ts/email/classes.email-route-builder.ts +4 -0
  76. package/ts/email/classes.workapp-mail-manager.ts +97 -10
  77. package/ts/index.ts +3 -0
  78. package/ts/opsserver/classes.opsserver.ts +4 -0
  79. package/ts/opsserver/handlers/gatewayclient.handler.ts +34 -4
  80. package/ts/opsserver/handlers/index.ts +2 -0
  81. package/ts/opsserver/handlers/webpush-app.handler.ts +105 -0
  82. package/ts/opsserver/handlers/webpush-control.handler.ts +257 -0
  83. package/ts/plugins.ts +6 -0
  84. package/ts/remoteingress/edge-derivation-routes.ts +4 -0
  85. package/ts/security/classes.route-policy-augmenter.ts +70 -57
  86. package/ts/webpush/classes.webpush-crypto.ts +306 -0
  87. package/ts/webpush/classes.webpush-manager.ts +3173 -0
  88. package/ts/webpush/classes.webpush-transport.ts +241 -0
  89. package/ts/webpush/helpers.webpush-endpoint.ts +150 -0
  90. package/ts/webpush/index.ts +4 -0
  91. package/ts/webpush/webpush-indexes.ts +141 -0
  92. package/ts_web/00_commitinfo_data.ts +1 -1
  93. package/ts_web/elements/network/ops-view-routes.ts +38 -0
  94. package/ts_web/elements/network/special-forward-dialog.ts +1 -1
@@ -0,0 +1,45 @@
1
+ import * as plugins from '../plugins.js';
2
+ import { type TWebPushDnsLookup } from './helpers.webpush-endpoint.js';
3
+ export interface IWebPushTransportRequest {
4
+ subscription: plugins.webpush.PushSubscription;
5
+ payload: string;
6
+ ttlSeconds: number;
7
+ urgency: plugins.webpush.Urgency;
8
+ topic?: string;
9
+ vapid: {
10
+ subject: string;
11
+ publicKey: string;
12
+ privateKey: string;
13
+ };
14
+ }
15
+ export interface IWebPushTransportResponse {
16
+ statusCode: number;
17
+ retryAfter?: string;
18
+ }
19
+ export interface IWebPushTransport {
20
+ send(requestArg: IWebPushTransportRequest): Promise<IWebPushTransportResponse>;
21
+ }
22
+ export type TWebPushTransportErrorCode = 'PUSH_DNS_TIMEOUT' | 'PUSH_REQUEST_TIMEOUT' | 'PUSH_RESPONSE_TOO_LARGE' | 'PUSH_RESPONSE_INVALID' | 'PUSH_NETWORK_ERROR';
23
+ export declare class WebPushTransportError extends Error {
24
+ readonly code: TWebPushTransportErrorCode;
25
+ constructor(code: TWebPushTransportErrorCode, optionsArg?: {
26
+ cause?: unknown;
27
+ });
28
+ }
29
+ export interface IWebPushHttpTransportOptions {
30
+ dnsLookup?: TWebPushDnsLookup;
31
+ dnsTimeoutMs?: number;
32
+ connectTimeoutMs?: number;
33
+ requestTimeoutMs?: number;
34
+ maxResponseBytes?: number;
35
+ }
36
+ export declare class WebPushHttpTransport implements IWebPushTransport {
37
+ private readonly dnsLookup?;
38
+ private readonly dnsTimeoutMs;
39
+ private readonly connectTimeoutMs;
40
+ private readonly requestTimeoutMs;
41
+ private readonly maxResponseBytes;
42
+ constructor(optionsArg?: IWebPushHttpTransportOptions);
43
+ send(requestArg: IWebPushTransportRequest): Promise<IWebPushTransportResponse>;
44
+ private normalizePositiveInteger;
45
+ }
@@ -0,0 +1,161 @@
1
+ import * as plugins from '../plugins.js';
2
+ import { createPinnedWebPushAgent, resolveWebPushEndpoint, WebPushEndpointPolicyError, } from './helpers.webpush-endpoint.js';
3
+ export class WebPushTransportError extends Error {
4
+ code;
5
+ constructor(code, optionsArg = {}) {
6
+ super(code, optionsArg);
7
+ this.code = code;
8
+ this.name = 'WebPushTransportError';
9
+ }
10
+ }
11
+ const normalizeRetryAfter = (valueArg) => {
12
+ if (Array.isArray(valueArg))
13
+ return valueArg[0]?.slice(0, 128);
14
+ return typeof valueArg === 'string' ? valueArg.slice(0, 128) : undefined;
15
+ };
16
+ export class WebPushHttpTransport {
17
+ dnsLookup;
18
+ dnsTimeoutMs;
19
+ connectTimeoutMs;
20
+ requestTimeoutMs;
21
+ maxResponseBytes;
22
+ constructor(optionsArg = {}) {
23
+ this.dnsLookup = optionsArg.dnsLookup;
24
+ this.dnsTimeoutMs = this.normalizePositiveInteger(optionsArg.dnsTimeoutMs, 5_000, 'dnsTimeoutMs');
25
+ this.connectTimeoutMs = this.normalizePositiveInteger(optionsArg.connectTimeoutMs, 10_000, 'connectTimeoutMs');
26
+ this.requestTimeoutMs = this.normalizePositiveInteger(optionsArg.requestTimeoutMs, 15_000, 'requestTimeoutMs');
27
+ this.maxResponseBytes = this.normalizePositiveInteger(optionsArg.maxResponseBytes, 16_384, 'maxResponseBytes');
28
+ }
29
+ async send(requestArg) {
30
+ const sendDeadline = Date.now() + this.requestTimeoutMs;
31
+ let resolved;
32
+ try {
33
+ resolved = await new Promise((resolve, reject) => {
34
+ let settled = false;
35
+ const settle = (errorArg, valueArg) => {
36
+ if (settled)
37
+ return;
38
+ settled = true;
39
+ clearTimeout(timer);
40
+ if (errorArg)
41
+ reject(errorArg);
42
+ else
43
+ resolve(valueArg);
44
+ };
45
+ const timer = setTimeout(() => {
46
+ settle(new WebPushTransportError('PUSH_DNS_TIMEOUT'));
47
+ }, Math.min(this.dnsTimeoutMs, this.requestTimeoutMs));
48
+ resolveWebPushEndpoint(requestArg.subscription.endpoint, this.dnsLookup).then((valueArg) => settle(null, valueArg), (errorArg) => settle(errorArg));
49
+ });
50
+ }
51
+ catch (error) {
52
+ if (error instanceof WebPushEndpointPolicyError)
53
+ throw error;
54
+ if (error instanceof WebPushTransportError)
55
+ throw error;
56
+ throw new WebPushTransportError('PUSH_NETWORK_ERROR', { cause: error });
57
+ }
58
+ const remainingRequestTimeoutMs = sendDeadline - Date.now();
59
+ if (remainingRequestTimeoutMs <= 0) {
60
+ throw new WebPushTransportError('PUSH_REQUEST_TIMEOUT');
61
+ }
62
+ const agent = createPinnedWebPushAgent(resolved);
63
+ try {
64
+ const requestDetails = plugins.webpush.generateRequestDetails(requestArg.subscription, requestArg.payload, {
65
+ TTL: requestArg.ttlSeconds,
66
+ contentEncoding: 'aes128gcm',
67
+ urgency: requestArg.urgency,
68
+ ...(requestArg.topic ? { topic: requestArg.topic } : {}),
69
+ vapidDetails: requestArg.vapid,
70
+ });
71
+ if (requestDetails.method !== 'POST'
72
+ || requestDetails.endpoint !== requestArg.subscription.endpoint
73
+ || !Buffer.isBuffer(requestDetails.body)) {
74
+ throw new WebPushTransportError('PUSH_RESPONSE_INVALID');
75
+ }
76
+ return await new Promise((resolve, reject) => {
77
+ let settled = false;
78
+ let requestTimer;
79
+ const settle = (errorArg, responseArg) => {
80
+ if (settled)
81
+ return;
82
+ settled = true;
83
+ if (requestTimer)
84
+ clearTimeout(requestTimer);
85
+ if (errorArg)
86
+ reject(errorArg);
87
+ else
88
+ resolve(responseArg);
89
+ };
90
+ const pushRequest = plugins.https.request({
91
+ protocol: 'https:',
92
+ hostname: resolved.hostname,
93
+ servername: resolved.hostname,
94
+ port: 443,
95
+ path: `${resolved.url.pathname}${resolved.url.search}`,
96
+ method: 'POST',
97
+ headers: requestDetails.headers,
98
+ agent,
99
+ timeout: Math.min(this.connectTimeoutMs, remainingRequestTimeoutMs),
100
+ maxHeaderSize: 16_384,
101
+ setHost: true,
102
+ }, (pushResponse) => {
103
+ let responseBytes = 0;
104
+ pushResponse.on('data', (chunkArg) => {
105
+ responseBytes += Buffer.byteLength(chunkArg);
106
+ if (responseBytes > this.maxResponseBytes) {
107
+ const error = new WebPushTransportError('PUSH_RESPONSE_TOO_LARGE');
108
+ settle(error);
109
+ pushResponse.destroy(error);
110
+ pushRequest.destroy(error);
111
+ }
112
+ });
113
+ pushResponse.once('end', () => {
114
+ const statusCode = pushResponse.statusCode;
115
+ if (!Number.isSafeInteger(statusCode) || statusCode < 100 || statusCode > 599) {
116
+ settle(new WebPushTransportError('PUSH_RESPONSE_INVALID'));
117
+ return;
118
+ }
119
+ settle(null, {
120
+ statusCode: statusCode,
121
+ retryAfter: normalizeRetryAfter(pushResponse.headers['retry-after']),
122
+ });
123
+ });
124
+ pushResponse.once('error', (errorArg) => {
125
+ settle(errorArg instanceof WebPushTransportError
126
+ ? errorArg
127
+ : new WebPushTransportError('PUSH_NETWORK_ERROR', { cause: errorArg }));
128
+ });
129
+ });
130
+ pushRequest.once('timeout', () => {
131
+ const error = new WebPushTransportError('PUSH_REQUEST_TIMEOUT');
132
+ settle(error);
133
+ pushRequest.destroy(error);
134
+ });
135
+ pushRequest.once('error', (errorArg) => {
136
+ settle(errorArg instanceof WebPushTransportError
137
+ ? errorArg
138
+ : new WebPushTransportError('PUSH_NETWORK_ERROR', { cause: errorArg }));
139
+ });
140
+ requestTimer = setTimeout(() => {
141
+ const error = new WebPushTransportError('PUSH_REQUEST_TIMEOUT');
142
+ settle(error);
143
+ pushRequest.destroy(error);
144
+ }, remainingRequestTimeoutMs);
145
+ requestTimer.unref();
146
+ pushRequest.end(requestDetails.body);
147
+ });
148
+ }
149
+ finally {
150
+ agent.destroy();
151
+ }
152
+ }
153
+ normalizePositiveInteger(valueArg, defaultArg, labelArg) {
154
+ const value = valueArg ?? defaultArg;
155
+ if (!Number.isSafeInteger(value) || value <= 0) {
156
+ throw new Error(`Web Push transport ${labelArg} must be a positive integer`);
157
+ }
158
+ return value;
159
+ }
160
+ }
161
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy53ZWJwdXNoLXRyYW5zcG9ydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL3dlYnB1c2gvY2xhc3Nlcy53ZWJwdXNoLXRyYW5zcG9ydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQ0wsd0JBQXdCLEVBQ3hCLHNCQUFzQixFQUN0QiwwQkFBMEIsR0FFM0IsTUFBTSwrQkFBK0IsQ0FBQztBQStCdkMsTUFBTSxPQUFPLHFCQUFzQixTQUFRLEtBQUs7SUFFNUI7SUFEbEIsWUFDa0IsSUFBZ0MsRUFDaEQsYUFBa0MsRUFBRTtRQUVwQyxLQUFLLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBSFIsU0FBSSxHQUFKLElBQUksQ0FBNEI7UUFJaEQsSUFBSSxDQUFDLElBQUksR0FBRyx1QkFBdUIsQ0FBQztJQUN0QyxDQUFDO0NBQ0Y7QUFVRCxNQUFNLG1CQUFtQixHQUFHLENBQUMsUUFBdUMsRUFBc0IsRUFBRTtJQUMxRixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO1FBQUUsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUMvRCxPQUFPLE9BQU8sUUFBUSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUMzRSxDQUFDLENBQUM7QUFFRixNQUFNLE9BQU8sb0JBQW9CO0lBQ2QsU0FBUyxDQUFxQjtJQUM5QixZQUFZLENBQVM7SUFDckIsZ0JBQWdCLENBQVM7SUFDekIsZ0JBQWdCLENBQVM7SUFDekIsZ0JBQWdCLENBQVM7SUFFMUMsWUFBbUIsYUFBMkMsRUFBRTtRQUM5RCxJQUFJLENBQUMsU0FBUyxHQUFHLFVBQVUs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
@@ -0,0 +1,21 @@
1
+ import * as plugins from '../plugins.js';
2
+ export type TWebPushEndpointPolicyErrorCode = 'ENDPOINT_URL_INVALID' | 'ENDPOINT_SCHEME_INVALID' | 'ENDPOINT_PORT_INVALID' | 'ENDPOINT_AUTHORITY_INVALID' | 'ENDPOINT_FRAGMENT_INVALID' | 'ENDPOINT_IP_LITERAL_FORBIDDEN' | 'ENDPOINT_DNS_EMPTY' | 'ENDPOINT_DNS_UNSAFE';
3
+ export declare class WebPushEndpointPolicyError extends Error {
4
+ readonly code: TWebPushEndpointPolicyErrorCode;
5
+ constructor(code: TWebPushEndpointPolicyErrorCode);
6
+ }
7
+ export interface IWebPushDnsAddress {
8
+ address: string;
9
+ family: number;
10
+ }
11
+ export type TWebPushDnsLookup = (hostnameArg: string) => Promise<IWebPushDnsAddress[]>;
12
+ export interface IWebPushResolvedEndpoint {
13
+ url: URL;
14
+ hostname: string;
15
+ address: string;
16
+ family: 4 | 6;
17
+ }
18
+ export declare function isGloballyRoutableWebPushAddress(addressArg: string): boolean;
19
+ export declare function parseWebPushEndpoint(endpointArg: string): URL;
20
+ export declare function resolveWebPushEndpoint(endpointArg: string, lookupArg?: TWebPushDnsLookup): Promise<IWebPushResolvedEndpoint>;
21
+ export declare function createPinnedWebPushAgent(resolvedArg: IWebPushResolvedEndpoint): InstanceType<typeof plugins.https.Agent>;
@@ -0,0 +1,111 @@
1
+ import * as plugins from '../plugins.js';
2
+ export class WebPushEndpointPolicyError extends Error {
3
+ code;
4
+ constructor(code) {
5
+ super(code);
6
+ this.code = code;
7
+ this.name = 'WebPushEndpointPolicyError';
8
+ }
9
+ }
10
+ const defaultDnsLookup = async (hostnameArg) => {
11
+ return await plugins.dns.promises.lookup(hostnameArg, {
12
+ all: true,
13
+ verbatim: true,
14
+ });
15
+ };
16
+ export function isGloballyRoutableWebPushAddress(addressArg) {
17
+ const family = plugins.net.isIP(addressArg);
18
+ if (family !== 4 && family !== 6)
19
+ return false;
20
+ try {
21
+ const parsed = plugins.ipaddr.parse(addressArg);
22
+ if (parsed.kind() === 'ipv6'
23
+ && 'isIPv4MappedAddress' in parsed
24
+ && parsed.isIPv4MappedAddress())
25
+ return false;
26
+ return parsed.range() === 'unicast';
27
+ }
28
+ catch {
29
+ return false;
30
+ }
31
+ }
32
+ export function parseWebPushEndpoint(endpointArg) {
33
+ if (typeof endpointArg !== 'string' || endpointArg.length === 0 || endpointArg.length > 4096) {
34
+ throw new WebPushEndpointPolicyError('ENDPOINT_URL_INVALID');
35
+ }
36
+ let endpoint;
37
+ try {
38
+ endpoint = new URL(endpointArg);
39
+ }
40
+ catch {
41
+ throw new WebPushEndpointPolicyError('ENDPOINT_URL_INVALID');
42
+ }
43
+ if (endpoint.protocol !== 'https:') {
44
+ throw new WebPushEndpointPolicyError('ENDPOINT_SCHEME_INVALID');
45
+ }
46
+ if (endpoint.port && endpoint.port !== '443') {
47
+ throw new WebPushEndpointPolicyError('ENDPOINT_PORT_INVALID');
48
+ }
49
+ if (endpoint.username || endpoint.password || !endpoint.hostname) {
50
+ throw new WebPushEndpointPolicyError('ENDPOINT_AUTHORITY_INVALID');
51
+ }
52
+ if (endpoint.hash) {
53
+ throw new WebPushEndpointPolicyError('ENDPOINT_FRAGMENT_INVALID');
54
+ }
55
+ const hostname = endpoint.hostname.startsWith('[') && endpoint.hostname.endsWith(']')
56
+ ? endpoint.hostname.slice(1, -1)
57
+ : endpoint.hostname;
58
+ if (plugins.net.isIP(hostname) !== 0) {
59
+ throw new WebPushEndpointPolicyError('ENDPOINT_IP_LITERAL_FORBIDDEN');
60
+ }
61
+ return endpoint;
62
+ }
63
+ export async function resolveWebPushEndpoint(endpointArg, lookupArg = defaultDnsLookup) {
64
+ const url = parseWebPushEndpoint(endpointArg);
65
+ const hostname = url.hostname.toLowerCase();
66
+ const answers = await lookupArg(hostname);
67
+ if (!Array.isArray(answers) || answers.length === 0) {
68
+ throw new WebPushEndpointPolicyError('ENDPOINT_DNS_EMPTY');
69
+ }
70
+ const normalized = answers.map((answerArg) => ({
71
+ address: String(answerArg.address || '').trim(),
72
+ family: plugins.net.isIP(String(answerArg.address || '').trim()),
73
+ }));
74
+ if (normalized.some((answerArg) => ((answerArg.family !== 4 && answerArg.family !== 6)
75
+ || !isGloballyRoutableWebPushAddress(answerArg.address)))) {
76
+ throw new WebPushEndpointPolicyError('ENDPOINT_DNS_UNSAFE');
77
+ }
78
+ const unique = Array.from(new Map(normalized.map((answerArg) => [`${answerArg.family}:${answerArg.address}`, answerArg])).values());
79
+ const selected = unique[0];
80
+ return {
81
+ url,
82
+ hostname,
83
+ address: selected.address,
84
+ family: selected.family,
85
+ };
86
+ }
87
+ export function createPinnedWebPushAgent(resolvedArg) {
88
+ const lookup = (hostnameArg, optionsArg, callbackArg) => {
89
+ if (hostnameArg.toLowerCase() !== resolvedArg.hostname) {
90
+ const error = new Error('Pinned Web Push agent hostname mismatch');
91
+ error.code = 'EHOSTUNREACH';
92
+ callbackArg(error, '', 0);
93
+ return;
94
+ }
95
+ if (optionsArg.all) {
96
+ callbackArg(null, [{
97
+ address: resolvedArg.address,
98
+ family: resolvedArg.family,
99
+ }]);
100
+ return;
101
+ }
102
+ callbackArg(null, resolvedArg.address, resolvedArg.family);
103
+ };
104
+ return new plugins.https.Agent({
105
+ keepAlive: false,
106
+ maxSockets: 1,
107
+ maxFreeSockets: 0,
108
+ lookup,
109
+ });
110
+ }
111
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy53ZWJwdXNoLWVuZHBvaW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvd2VicHVzaC9oZWxwZXJzLndlYnB1c2gtZW5kcG9pbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLE9BQU8sTUFBTSxlQUFlLENBQUM7QUFZekMsTUFBTSxPQUFPLDBCQUEyQixTQUFRLEtBQUs7SUFDaEI7SUFBbkMsWUFBbUMsSUFBcUM7UUFDdEUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRHFCLFNBQUksR0FBSixJQUFJLENBQWlDO1FBRXRFLElBQUksQ0FBQyxJQUFJLEdBQUcsNEJBQTRCLENBQUM7SUFDM0MsQ0FBQztDQUNGO0FBa0JELE1BQU0sZ0JBQWdCLEdBQXNCLEtBQUssRUFBRSxXQUFXLEVBQUUsRUFBRTtJQUNoRSxPQUFPLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRTtRQUNwRCxHQUFHLEVBQUUsSUFBSTtRQUNULFFBQVEsRUFBRSxJQUFJO0tBQ2YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBRUYsTUFBTSxVQUFVLGdDQUFnQyxDQUFDLFVBQWtCO0lBQ2pFLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzVDLElBQUksTUFBTSxLQUFLLENBQUMsSUFBSSxNQUFNLEtBQUssQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQy9DLElBQUksQ0FBQztRQUNILE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hELElBQ0UsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLE1BQU07ZUFDckIscUJBQXFCLElBQUksTUFBTTtlQUMvQixNQUFNLENBQUMsbUJBQW1CLEVBQUU7WUFDL0IsT0FBTyxLQUFLLENBQUM7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
@@ -0,0 +1,4 @@
1
+ export * from './classes.webpush-crypto.js';
2
+ export * from './classes.webpush-manager.js';
3
+ export * from './classes.webpush-transport.js';
4
+ export * from './helpers.webpush-endpoint.js';
@@ -0,0 +1,5 @@
1
+ export * from './classes.webpush-crypto.js';
2
+ export * from './classes.webpush-manager.js';
3
+ export * from './classes.webpush-transport.js';
4
+ export * from './helpers.webpush-endpoint.js';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy93ZWJwdXNoL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYyw4QkFBOEIsQ0FBQztBQUM3QyxjQUFjLGdDQUFnQyxDQUFDO0FBQy9DLGNBQWMsK0JBQStCLENBQUMifQ==
@@ -0,0 +1,11 @@
1
+ export type TWebPushIndexCollection = 'WebPushBindingDoc' | 'WebPushAdmissionDoc' | 'WebPushSpoolDoc';
2
+ export interface IWebPushIndexSpecification {
3
+ collection: TWebPushIndexCollection;
4
+ name: string;
5
+ key: Record<string, 1 | -1>;
6
+ unique?: true;
7
+ expireAfterSeconds?: number;
8
+ partialFilterExpression?: Record<string, unknown>;
9
+ }
10
+ export declare const webPushIndexSpecifications: IWebPushIndexSpecification[];
11
+ export declare function getWebPushIndexSpecifications(collectionArg: TWebPushIndexCollection): IWebPushIndexSpecification[];
@@ -0,0 +1,123 @@
1
+ export const webPushIndexSpecifications = [
2
+ {
3
+ collection: 'WebPushBindingDoc',
4
+ name: 'web_push_binding_id_unique',
5
+ key: { id: 1 },
6
+ unique: true,
7
+ },
8
+ {
9
+ collection: 'WebPushBindingDoc',
10
+ name: 'web_push_binding_owner_unique',
11
+ key: {
12
+ ownerGatewayClientType: 1,
13
+ ownerGatewayClientId: 1,
14
+ ownerAppInstanceId: 1,
15
+ },
16
+ unique: true,
17
+ },
18
+ {
19
+ collection: 'WebPushBindingDoc',
20
+ name: 'web_push_binding_credential_unique',
21
+ key: { 'credential.id': 1 },
22
+ unique: true,
23
+ },
24
+ {
25
+ collection: 'WebPushBindingDoc',
26
+ name: 'web_push_binding_previous_credential_lookup',
27
+ key: { 'previousCredentials.id': 1 },
28
+ },
29
+ {
30
+ collection: 'WebPushBindingDoc',
31
+ name: 'web_push_binding_previous_credential_cleanup',
32
+ key: { 'previousCredentials.validUntil': 1 },
33
+ },
34
+ {
35
+ collection: 'WebPushBindingDoc',
36
+ name: 'web_push_binding_rotation_recovery_cleanup',
37
+ key: { 'credentialRotationRecovery.expiresAt': 1 },
38
+ },
39
+ {
40
+ collection: 'WebPushBindingDoc',
41
+ name: 'web_push_binding_vapid_status_cleanup',
42
+ key: { 'vapidKeys.status': 1 },
43
+ },
44
+ {
45
+ collection: 'WebPushBindingDoc',
46
+ name: 'web_push_binding_vapid_retire_after_cleanup',
47
+ key: { 'vapidKeys.retireAfter': 1 },
48
+ },
49
+ {
50
+ collection: 'WebPushBindingDoc',
51
+ name: 'web_push_binding_disabled_cleanup',
52
+ key: { enabled: 1, lifecycleGeneration: 1 },
53
+ },
54
+ {
55
+ collection: 'WebPushBindingDoc',
56
+ name: 'web_push_binding_deleted_cleanup',
57
+ key: { deletedAt: 1, lifecycleGeneration: 1 },
58
+ },
59
+ {
60
+ collection: 'WebPushAdmissionDoc',
61
+ name: 'web_push_admission_binding_unique',
62
+ key: { bindingId: 1, lifecycleGeneration: 1 },
63
+ unique: true,
64
+ },
65
+ {
66
+ collection: 'WebPushAdmissionDoc',
67
+ name: 'web_push_admission_ttl',
68
+ key: { purgeAt: 1 },
69
+ expireAfterSeconds: 0,
70
+ },
71
+ {
72
+ collection: 'WebPushSpoolDoc',
73
+ name: 'web_push_spool_id_unique',
74
+ key: { id: 1 },
75
+ unique: true,
76
+ },
77
+ {
78
+ collection: 'WebPushSpoolDoc',
79
+ name: 'web_push_spool_idempotency_unique',
80
+ key: {
81
+ bindingId: 1,
82
+ lifecycleGeneration: 1,
83
+ credentialId: 1,
84
+ idempotencyKeyDigest: 1,
85
+ },
86
+ unique: true,
87
+ },
88
+ {
89
+ collection: 'WebPushSpoolDoc',
90
+ name: 'web_push_spool_delivery_scan',
91
+ key: { state: 1, nextAttemptAt: 1, leaseExpiresAt: 1 },
92
+ },
93
+ {
94
+ collection: 'WebPushSpoolDoc',
95
+ name: 'web_push_spool_cancellation_scan',
96
+ key: { bindingId: 1, lifecycleGeneration: 1, subscriptionId: 1, state: 1 },
97
+ },
98
+ {
99
+ collection: 'WebPushSpoolDoc',
100
+ name: 'web_push_spool_cancelled_lease_scan',
101
+ key: { state: 1, cancelRequestedAt: 1, leaseExpiresAt: 1, id: 1 },
102
+ },
103
+ {
104
+ collection: 'WebPushSpoolDoc',
105
+ name: 'web_push_spool_lifecycle_drain_scan',
106
+ key: { bindingId: 1, lifecycleGeneration: 1, state: 1, leaseExpiresAt: 1 },
107
+ },
108
+ {
109
+ collection: 'WebPushSpoolDoc',
110
+ name: 'web_push_spool_vapid_retirement_scan',
111
+ key: { bindingId: 1, lifecycleGeneration: 1, vapidKeyId: 1, state: 1 },
112
+ },
113
+ {
114
+ collection: 'WebPushSpoolDoc',
115
+ name: 'web_push_spool_terminal_ttl',
116
+ key: { purgeAt: 1 },
117
+ expireAfterSeconds: 0,
118
+ },
119
+ ];
120
+ export function getWebPushIndexSpecifications(collectionArg) {
121
+ return webPushIndexSpecifications.filter((specificationArg) => specificationArg.collection === collectionArg);
122
+ }
123
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2VicHVzaC1pbmRleGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvd2VicHVzaC93ZWJwdXNoLWluZGV4ZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBY0EsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQWlDO0lBQ3RFO1FBQ0UsVUFBVSxFQUFFLG1CQUFtQjtRQUMvQixJQUFJLEVBQUUsNEJBQTRCO1FBQ2xDLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUU7UUFDZCxNQUFNLEVBQUUsSUFBSTtLQUNiO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsbUJBQW1CO1FBQy9CLElBQUksRUFBRSwrQkFBK0I7UUFDckMsR0FBRyxFQUFFO1lBQ0gsc0JBQXNCLEVBQUUsQ0FBQztZQUN6QixvQkFBb0IsRUFBRSxDQUFDO1lBQ3ZCLGtCQUFrQixFQUFFLENBQUM7U0FDdEI7UUFDRCxNQUFNLEVBQUUsSUFBSTtLQUNiO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsbUJBQW1CO1FBQy9CLElBQUksRUFBRSxvQ0FBb0M7UUFDMUMsR0FBRyxFQUFFLEVBQUUsZUFBZSxFQUFFLENBQUMsRUFBRTtRQUMzQixNQUFNLEVBQUUsSUFBSTtLQUNiO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsbUJBQW1CO1FBQy9CLElBQUksRUFBRSw2Q0FBNkM7UUFDbkQsR0FBRyxFQUFFLEVBQUUsd0JBQXdCLEVBQUUsQ0FBQyxFQUFFO0tBQ3JDO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsbUJBQW1CO1FBQy9CLElBQUksRUFBRSw4Q0FBOEM7UUFDcEQsR0FBRyxFQUFFLEVBQUUsZ0NBQWdDLEVBQUUsQ0FBQyxFQUFFO0tBQzdDO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsbUJBQW1CO1FBQy9CLElBQUksRUFBRSw0Q0FBNEM7UUFDbEQsR0FBRyxFQUFFLEVBQUUsc0NBQXNDLEVBQUUsQ0FBQyxFQUFFO0tBQ25EO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsbUJBQW1CO1FBQy9CLElBQUksRUFBRSx1Q0FBdUM7UUFDN0MsR0FBRyxFQUFFLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxFQUFFO0tBQy9CO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsbUJBQW1CO1FBQy9CLElBQUksRUFBRSw2Q0FBNkM7UUFDbkQsR0FBRyxFQUFFLEVBQUUsdUJBQXVCLEVBQUUsQ0FBQyxFQUFFO0tBQ3BDO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsbUJBQW1CO1FBQy9CLElBQUksRUFBRSxtQ0FBbUM7UUFDekMsR0FBRyxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxtQkFBbUIsRUFBRSxDQUFDLEVBQUU7S0FDNUM7SUFDRDtRQUNFLFVBQVUsRUFBRSxtQkFBbUI7UUFDL0IsSUFBSSxFQUFFLGtDQUFrQztRQUN4QyxHQUFHLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLG1CQUFtQixFQUFFLENBQUMsRUFBRTtLQUM5QztJQUNEO1FBQ0UsVUFBVSxFQUFFLHFCQUFxQjtRQUNqQyxJQUFJLEVBQUUsbUNBQW1DO1FBQ3pDLEdBQUcsRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQyxFQUFFO1FBQzdDLE1BQU0sRUFBRSxJQUFJO0tBQ2I7SUFDRDtRQUNFLFVBQVUsRUFBRSxxQkFBcUI7UUFDakMsSUFBSSxFQUFFLHdCQUF3QjtRQUM5QixHQUFHLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFO1FBQ25CLGtCQUFrQixFQUFFLENBQUM7S0FDdEI7SUFDRDtRQUNFLFVBQVUsRUFBRSxpQkFBaUI7UUFDN0IsSUFBSSxFQUFFLDBCQUEwQjtRQUNoQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1FBQ2QsTUFBTSxFQUFFLElBQUk7S0FDYjtJQUNEO1FBQ0UsVUFBVSxFQUFFLGlCQUFpQjtRQUM3QixJQUFJLEVBQUUsbUNBQW1DO1FBQ3pDLEdBQUcsRUFBRTtZQUNILFNBQVMsRUFBRSxDQUFDO1lBQ1osbUJBQW1CLEVBQUUsQ0FBQztZQUN0QixZQUFZLEVBQUUsQ0FBQztZQUNmLG9CQUFvQixFQUFFLENBQUM7U0FDeEI7UUFDRCxNQUFNLEVBQUUsSUFBSTtLQUNiO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsaUJBQWlCO1FBQzdCLElBQUksRUFBRSw4QkFBOEI7UUFDcEMsR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxhQUFhLEVBQUUsQ0FBQyxFQUFFLGNBQWMsRUFBRSxDQUFDLEVBQUU7S0FDdkQ7SUFDRDtRQUNFLFVBQVUsRUFBRSxpQkFBaUI7UUFDN0IsSUFBSSxFQUFFLGtDQUFrQztRQUN4QyxHQUFHLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLG1CQUFtQixFQUFFLENBQUMsRUFBRSxjQUFjLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUU7S0FDM0U7SUFDRDtRQUNFLFVBQVUsRUFBRSxpQkFBaUI7UUFDN0IsSUFBSSxFQUFFLHFDQUFxQztRQUMzQyxHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLGlCQUFpQixFQUFFLENBQUMsRUFBRSxjQUFjLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUU7S0FDbEU7SUFDRDtRQUNFLFVBQVUsRUFBRSxpQkFBaUI7UUFDN0IsSUFBSSxFQUFFLHFDQUFxQztRQUMzQyxHQUFHLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLG1CQUFtQixFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLGNBQWMsRUFBRSxDQUFDLEVBQUU7S0FDM0U7SUFDRDtRQUNFLFVBQVUsRUFBRSxpQkFBaUI7UUFDN0IsSUFBSSxFQUFFLHNDQUFzQztRQUM1QyxHQUFHLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLG1CQUFtQixFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUU7S0FDdkU7SUFDRDtRQUNFLFVBQVUsRUFBRSxpQkFBaUI7UUFDN0IsSUFBSSxFQUFFLDZCQUE2QjtRQUNuQyxHQUFHLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFO1FBQ25CLGtCQUFrQixFQUFFLENBQUM7S0FDdEI7Q0FDRixDQUFDO0FBRUYsTUFBTSxVQUFVLDZCQUE2QixDQUMzQyxhQUFzQztJQUV0QyxPQUFPLDBCQUEwQixDQUFDLE1BQU0sQ0FDdEMsQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxLQUFLLGFBQWEsQ0FDcEUsQ0FBQztBQUNKLENBQUMifQ==
@@ -148,14 +148,26 @@ export interface IRouteRemoteIngress {
148
148
  * When absent, the route applies to all edges. */
149
149
  edgeFilter?: string[];
150
150
  }
151
+ export interface IRouteIngress {
152
+ /** Accept traffic connected directly to the gateway hub listener. */
153
+ directHub: boolean;
154
+ /** Accept authenticated SmartVPN traffic carrying trusted VPN metadata. */
155
+ smartVpn: boolean;
156
+ }
151
157
  /**
152
158
  * Extended route config used within dcrouter.
153
- * Adds optional `remoteIngress` and `vpnOnly` properties to SmartProxy's IRouteConfig.
159
+ * Adds explicit ingress path policy and dcrouter compatibility properties to
160
+ * SmartProxy's IRouteConfig.
154
161
  * SmartProxy ignores unknown properties at runtime.
155
162
  */
156
163
  export type IDcRouterRouteConfig = IRouteConfig & {
164
+ /**
165
+ * Explicit trusted ingress paths. New routes must opt in; direct hub
166
+ * listening is intentionally not a default.
167
+ */
168
+ ingress?: IRouteIngress;
157
169
  remoteIngress?: IRouteRemoteIngress;
158
- /** When true, only VPN clients whose TargetProfile matches this route get access.
170
+ /** Compatibility policy: only VPN clients whose TargetProfile matches this route get access.
159
171
  * Matching is determined by domain overlap, target overlap, or direct routeRef. */
160
172
  vpnOnly?: boolean;
161
173
  };
@@ -39,6 +39,8 @@ export interface IApiTokenPolicy {
39
39
  manageMail?: boolean;
40
40
  readCertificates?: boolean;
41
41
  requestCertificates?: boolean;
42
+ readWebPush?: boolean;
43
+ manageWebPush?: boolean;
42
44
  };
43
45
  }
44
46
  export interface IGatewayCredentialLifecycle {
@@ -120,4 +120,4 @@ export function canonicalizeSourceRouteId(routeId) {
120
120
  const sourceVariantIndex = routeId.indexOf(':source:');
121
121
  return sourceVariantIndex === -1 ? routeId : routeId.slice(0, sourceVariantIndex);
122
122
  }
123
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUtbWFuYWdlbWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzX2ludGVyZmFjZXMvZGF0YS9yb3V0ZS1tYW5hZ2VtZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQXFCQSwrRUFBK0U7QUFDL0UsOEJBQThCO0FBQzlCLCtFQUErRTtBQUUvRSxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUc7SUFDNUIsR0FBRztJQUNILGFBQWE7SUFDYixjQUFjO0lBQ2QsYUFBYTtJQUNiLFlBQVk7SUFDWixXQUFXO0lBQ1gsb0JBQW9CO0lBQ3BCLHFCQUFxQjtJQUNyQixlQUFlO0lBQ2YsZ0JBQWdCO0lBQ2hCLGFBQWE7SUFDYixjQUFjO0lBQ2QsbUJBQW1CO0lBQ25CLG9CQUFvQjtJQUNwQixhQUFhO0lBQ2IsZUFBZTtJQUNmLFlBQVk7SUFDWixjQUFjO0lBQ2Qsc0JBQXNCO0lBQ3RCLHVCQUF1QjtJQUN2QixzQkFBc0I7SUFDdEIsdUJBQXVCO0lBQ3ZCLGNBQWM7SUFDZCxlQUFlO0lBQ2Ysb0JBQW9CO0lBQ3BCLHFCQUFxQjtJQUNyQixjQUFjO0lBQ2QsZUFBZTtJQUNmLGtCQUFrQjtJQUNsQixtQkFBbUI7SUFDbkIsa0JBQWtCO0lBQ2xCLG1CQUFtQjtJQUNuQixvQkFBb0I7SUFDcEIscUJBQXFCO0lBQ3JCLHFCQUFxQjtJQUNyQixzQkFBc0I7SUFDdEIsVUFBVTtJQUNWLFdBQVc7SUFDWCxhQUFhO0lBQ2IsY0FBYztJQUNkLHNCQUFzQjtJQUN0Qix1QkFBdUI7SUFDdkIsa0JBQWtCO0lBQ2xCLG1CQUFtQjtDQUNYLENBQUM7QUErRVgsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUc7SUFDOUIsZ0JBQWdCO0lBQ2hCLFFBQVE7SUFDUixhQUFhO0lBQ2IsZ0JBQWdCO0lBQ2hCLEtBQUs7SUFDTCxTQUFTO0NBQ0QsQ0FBQztBQUlYLE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFvQztJQUN4RSxnQkFBZ0IsRUFBRSxnQkFBZ0I7SUFDbEMsTUFBTSxFQUFFLGVBQWU7SUFDdkIsYUFBYSxFQUFFLGFBQWE7SUFDNUIsZ0JBQWdCLEVBQUUsZ0JBQWdCO0lBQ2xDLEdBQUcsRUFBRSxXQUFXO0lBQ2hCLE9BQU8sRUFBRSxVQUFVO0NBQ3BCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBc0M7SUFDNUUsZ0JBQWdCLEVBQUU7UUFDaEIsb0JBQW9CO1FBQ3BCLDBCQUEwQjtRQUMxQiwyQkFBMkI7UUFDM0IsbUJBQW1CO1FBQ25CLHFCQUFxQjtLQUN0QjtJQUNELE1BQU0sRUFBRTtRQUNOLFdBQVc7UUFDWCxZQUFZO1FBQ1osaUJBQWlCO1FBQ2pCLGdCQUFnQjtRQUNoQixRQUFRO1FBQ1IsUUFBUTtRQUNSLE9BQU87UUFDUCxVQUFVO1FBQ1YsY0FBYztLQUNmO0lBQ0QsYUFBYSxFQUFFLEVBQUU7SUFDakIsZ0JBQWdCLEVBQUU7UUFDaEIsWUFBWTtRQUNaLFNBQVM7UUFDVCxXQUFXO1FBQ1gsUUFBUTtRQUNSLFVBQVU7UUFDVixTQUFTO1FBQ1QsZ0JBQWdCO1FBQ2hCLFlBQVk7UUFDWixlQUFlO1FBQ2YsWUFBWTtRQUNaLFlBQVk7UUFDWixlQUFlO1FBQ2YsYUFBYTtRQUNiLFlBQVk7UUFDWixlQUFlO1FBQ2YsY0FBYztRQUNkLGVBQWU7S0FDaEI7SUFDRCxHQUFHLEVBQUU7UUFDSCxZQUFZO1FBQ1osWUFBWTtLQUNiO0lBQ0QsT0FBTyxFQUFFO1FBQ1AsZ0JBQWdCO1FBQ2hCLDBCQUEwQjtLQUMzQjtDQUNGLENBQUM7QUFtREYsK0VBQStFO0FBQy9FLHVCQUF1QjtBQUN2QiwrRUFBK0U7QUFFL0UsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyw0QkFBNEIsQ0FBVSxDQUFDO0FBdUZ6RSxnRkFBZ0Y7QUFDaEYsTUFBTSxVQUFVLHlCQUF5QixDQUFDLE9BQWU7SUFDdkQsTUFBTSxrQkFBa0IsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3ZELE9BQU8sa0JBQWtCLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztBQUNwRixDQUFDIn0=
123
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUtbWFuYWdlbWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzX2ludGVyZmFjZXMvZGF0YS9yb3V0ZS1tYW5hZ2VtZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQXFCQSwrRUFBK0U7QUFDL0UsOEJBQThCO0FBQzlCLCtFQUErRTtBQUUvRSxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUc7SUFDNUIsR0FBRztJQUNILGFBQWE7SUFDYixjQUFjO0lBQ2QsYUFBYTtJQUNiLFlBQVk7SUFDWixXQUFXO0lBQ1gsb0JBQW9CO0lBQ3BCLHFCQUFxQjtJQUNyQixlQUFlO0lBQ2YsZ0JBQWdCO0lBQ2hCLGFBQWE7SUFDYixjQUFjO0lBQ2QsbUJBQW1CO0lBQ25CLG9CQUFvQjtJQUNwQixhQUFhO0lBQ2IsZUFBZTtJQUNmLFlBQVk7SUFDWixjQUFjO0lBQ2Qsc0JBQXNCO0lBQ3RCLHVCQUF1QjtJQUN2QixzQkFBc0I7SUFDdEIsdUJBQXVCO0lBQ3ZCLGNBQWM7SUFDZCxlQUFlO0lBQ2Ysb0JBQW9CO0lBQ3BCLHFCQUFxQjtJQUNyQixjQUFjO0lBQ2QsZUFBZTtJQUNmLGtCQUFrQjtJQUNsQixtQkFBbUI7SUFDbkIsa0JBQWtCO0lBQ2xCLG1CQUFtQjtJQUNuQixvQkFBb0I7SUFDcEIscUJBQXFCO0lBQ3JCLHFCQUFxQjtJQUNyQixzQkFBc0I7SUFDdEIsVUFBVTtJQUNWLFdBQVc7SUFDWCxhQUFhO0lBQ2IsY0FBYztJQUNkLHNCQUFzQjtJQUN0Qix1QkFBdUI7SUFDdkIsa0JBQWtCO0lBQ2xCLG1CQUFtQjtDQUNYLENBQUM7QUFpRlgsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUc7SUFDOUIsZ0JBQWdCO0lBQ2hCLFFBQVE7SUFDUixhQUFhO0lBQ2IsZ0JBQWdCO0lBQ2hCLEtBQUs7SUFDTCxTQUFTO0NBQ0QsQ0FBQztBQUlYLE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFvQztJQUN4RSxnQkFBZ0IsRUFBRSxnQkFBZ0I7SUFDbEMsTUFBTSxFQUFFLGVBQWU7SUFDdkIsYUFBYSxFQUFFLGFBQWE7SUFDNUIsZ0JBQWdCLEVBQUUsZ0JBQWdCO0lBQ2xDLEdBQUcsRUFBRSxXQUFXO0lBQ2hCLE9BQU8sRUFBRSxVQUFVO0NBQ3BCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBc0M7SUFDNUUsZ0JBQWdCLEVBQUU7UUFDaEIsb0JBQW9CO1FBQ3BCLDBCQUEwQjtRQUMxQiwyQkFBMkI7UUFDM0IsbUJBQW1CO1FBQ25CLHFCQUFxQjtLQUN0QjtJQUNELE1BQU0sRUFBRTtRQUNOLFdBQVc7UUFDWCxZQUFZO1FBQ1osaUJBQWlCO1FBQ2pCLGdCQUFnQjtRQUNoQixRQUFRO1FBQ1IsUUFBUTtRQUNSLE9BQU87UUFDUCxVQUFVO1FBQ1YsY0FBYztLQUNmO0lBQ0QsYUFBYSxFQUFFLEVBQUU7SUFDakIsZ0JBQWdCLEVBQUU7UUFDaEIsWUFBWTtRQUNaLFNBQVM7UUFDVCxXQUFXO1FBQ1gsUUFBUTtRQUNSLFVBQVU7UUFDVixTQUFTO1FBQ1QsZ0JBQWdCO1FBQ2hCLFlBQVk7UUFDWixlQUFlO1FBQ2YsWUFBWTtRQUNaLFlBQVk7UUFDWixlQUFlO1FBQ2YsYUFBYTtRQUNiLFlBQVk7UUFDWixlQUFlO1FBQ2YsY0FBYztRQUNkLGVBQWU7S0FDaEI7SUFDRCxHQUFHLEVBQUU7UUFDSCxZQUFZO1FBQ1osWUFBWTtLQUNiO0lBQ0QsT0FBTyxFQUFFO1FBQ1AsZ0JBQWdCO1FBQ2hCLDBCQUEwQjtLQUMzQjtDQUNGLENBQUM7QUFtREYsK0VBQStFO0FBQy9FLHVCQUF1QjtBQUN2QiwrRUFBK0U7QUFFL0UsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyw0QkFBNEIsQ0FBVSxDQUFDO0FBdUZ6RSxnRkFBZ0Y7QUFDaEYsTUFBTSxVQUFVLHlCQUF5QixDQUFDLE9BQWU7SUFDdkQsTUFBTSxrQkFBa0IsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3ZELE9BQU8sa0JBQWtCLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztBQUNwRixDQUFDIn0=