@uengage.io/platform-sdk 0.9.1 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/client.js CHANGED
@@ -3,6 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createClient = createClient;
4
4
  const client_1 = require("./audit/client");
5
5
  const client_2 = require("./business/client");
6
+ const client_3 = require("./zones/client");
7
+ const client_4 = require("./wallet/client");
6
8
  const auth_1 = require("./auth");
7
9
  const token_source_1 = require("./token-source");
8
10
  const errors_1 = require("./errors");
@@ -31,10 +33,20 @@ function buildClient(input) {
31
33
  auth,
32
34
  actorVia: input.actorVia ?? input.serviceId,
33
35
  });
36
+ const zonesClient = (0, client_3.createZonesClient)({ baseUrl, fetchFn: input.fetchFn, auth });
37
+ const walletClient = (0, client_4.createWalletClient)({ baseUrl, fetchFn: input.fetchFn, auth });
34
38
  return {
35
39
  business: businessClient,
36
40
  audit: auditClient,
41
+ zones: zonesClient,
42
+ wallet: walletClient,
37
43
  auth: auth_1.auth,
44
+ getAccessToken: async () => {
45
+ if (!tokenSourceState) {
46
+ throw new errors_1.ConfigError('getAccessToken: no auth mode configured. Pass {serviceId, serviceSecret} | {authToken} | {session}.');
47
+ }
48
+ return (0, token_source_1.getAccessToken)(tokenSourceState);
49
+ },
38
50
  };
39
51
  }
40
52
  const AUTH_MODE_FIELDS = [
@@ -42,7 +54,8 @@ const AUTH_MODE_FIELDS = [
42
54
  'serviceSecret',
43
55
  'scope',
44
56
  'authToken',
45
- 'sessionToken',
57
+ 'session',
58
+ 'tokens',
46
59
  ];
47
60
  /**
48
61
  * Merge env-derived defaults with the caller's explicit input. Any
@@ -64,7 +77,8 @@ function mergeWithEnv(input) {
64
77
  serviceSecret: input.serviceSecret ?? envForMerge.serviceSecret,
65
78
  scope: input.scope ?? envForMerge.scope,
66
79
  authToken: input.authToken ?? envForMerge.authToken,
67
- sessionToken: input.sessionToken ?? envForMerge.sessionToken,
80
+ session: input.session ?? envForMerge.session,
81
+ tokens: input.tokens,
68
82
  actorVia: input.actorVia ?? envForMerge.actorVia,
69
83
  expiryBufferMs: input.expiryBufferMs ?? envForMerge.expiryBufferMs,
70
84
  fetchFn: input.fetchFn,
@@ -77,6 +91,11 @@ function readEnvDefaults() {
77
91
  return {};
78
92
  const e = process.env ?? {};
79
93
  const expiry = e.UENGAGE_EXPIRY_BUFFER_MS ? Number(e.UENGAGE_EXPIRY_BUFFER_MS) : undefined;
94
+ // UENGAGE_SESSION_ID + UENGAGE_SESSION_TOKEN must be paired; either alone is ignored
95
+ // so an env-only setup never produces a half-configured session.
96
+ const session = e.UENGAGE_SESSION_ID && e.UENGAGE_SESSION_TOKEN
97
+ ? { id: e.UENGAGE_SESSION_ID, token: e.UENGAGE_SESSION_TOKEN }
98
+ : undefined;
80
99
  return {
81
100
  baseUrl: e.UENGAGE_BASE_URL,
82
101
  authBaseUrl: e.UENGAGE_AUTH_BASE_URL,
@@ -85,7 +104,7 @@ function readEnvDefaults() {
85
104
  serviceSecret: e.UENGAGE_SERVICE_SECRET,
86
105
  scope: e.UENGAGE_SCOPE,
87
106
  authToken: e.UENGAGE_AUTH_TOKEN,
88
- sessionToken: e.UENGAGE_SESSION_TOKEN,
107
+ session,
89
108
  actorVia: e.UENGAGE_ACTOR_VIA,
90
109
  expiryBufferMs: Number.isFinite(expiry) ? expiry : undefined,
91
110
  };
@@ -100,46 +119,78 @@ function withoutAuthFields(c) {
100
119
  serviceSecret: undefined,
101
120
  scope: undefined,
102
121
  authToken: undefined,
103
- sessionToken: undefined,
122
+ session: undefined,
123
+ tokens: undefined,
104
124
  };
105
125
  }
106
126
  function assertExactlyOneAuthMode(input) {
107
127
  const modes = [];
108
128
  if (input.authToken !== undefined)
109
129
  modes.push('authToken');
110
- if (input.sessionToken !== undefined)
111
- modes.push('sessionToken');
130
+ if (input.session !== undefined)
131
+ modes.push('session');
132
+ if (input.tokens !== undefined)
133
+ modes.push('tokens');
112
134
  if (input.serviceId !== undefined || input.serviceSecret !== undefined) {
113
135
  modes.push('serviceId+serviceSecret');
114
136
  }
115
137
  if (modes.length > 1) {
116
138
  throw new errors_1.ConfigError(`createClient: pick exactly one auth mode. Got ${modes.join(', ')}. ` +
117
- 'Use one of {serviceId, serviceSecret} | {authToken} | {sessionToken}.');
139
+ 'Use one of {serviceId, serviceSecret} | {authToken} | {session} | {tokens}.');
118
140
  }
119
141
  // Zero modes is allowed — caller may want a fully-anonymous client for
120
142
  // public endpoints. The first request that needs auth will surface a
121
143
  // ConfigError downstream.
122
144
  }
123
145
  /**
124
- * POST to the customer auth surface to exchange a legacy session
125
- * token for a fresh access token. Used by `createClient({ sessionToken })`.
146
+ * Probe the business `legacy_session` grant first, fall back to customer
147
+ * on `invalid_grant`. Either surface mints a JWT the SDK doesn't care
148
+ * which side answered.
149
+ *
150
+ * Why probe both: `id` (numeric) overlaps users.userId vs
151
+ * addo_contacts_mapping.id/contactId. Callers usually don't know which
152
+ * table their (id, token) pair belongs to.
126
153
  */
127
- async function exchangeSessionToken(sessionToken, customerAuthBaseUrl, fetchFn) {
128
- const res = await fetchFn(`${customerAuthBaseUrl}/oauth/token`, {
154
+ async function exchangeLegacySession(session, authBaseUrl, customerAuthBaseUrl, fetchFn) {
155
+ const body = new URLSearchParams({
156
+ grant_type: 'legacy_session',
157
+ id: String(session.id),
158
+ token: session.token,
159
+ }).toString();
160
+ const businessRes = await fetchFn(`${authBaseUrl}/oauth/token`, {
129
161
  method: 'POST',
130
162
  headers: { 'content-type': 'application/x-www-form-urlencoded' },
131
- body: new URLSearchParams({
132
- grant_type: 'session_token',
133
- session_token: sessionToken,
134
- }).toString(),
163
+ body,
135
164
  });
136
- if (!res.ok) {
137
- const text = await res.text().catch(() => '');
138
- throw new errors_1.AuthenticationError(`session-token exchange failed: HTTP ${res.status} ${text}`);
165
+ if (businessRes.ok) {
166
+ return parseAccessToken(businessRes);
167
+ }
168
+ if (await isInvalidGrant(businessRes)) {
169
+ const customerRes = await fetchFn(`${customerAuthBaseUrl}/oauth/token`, {
170
+ method: 'POST',
171
+ headers: { 'content-type': 'application/x-www-form-urlencoded' },
172
+ body,
173
+ });
174
+ if (customerRes.ok) {
175
+ return parseAccessToken(customerRes);
176
+ }
177
+ const text = await customerRes.text().catch(() => '');
178
+ throw new errors_1.AuthenticationError(`legacy_session exchange failed on both surfaces: customer HTTP ${customerRes.status} ${text}`);
139
179
  }
180
+ const text = await businessRes.text().catch(() => '');
181
+ throw new errors_1.AuthenticationError(`legacy_session exchange failed: HTTP ${businessRes.status} ${text}`);
182
+ }
183
+ async function isInvalidGrant(res) {
184
+ if (res.status !== 400)
185
+ return false;
186
+ const cloned = res.clone();
187
+ const json = (await cloned.json().catch(() => ({})));
188
+ return json.error === 'invalid_grant';
189
+ }
190
+ async function parseAccessToken(res) {
140
191
  const json = (await res.json());
141
192
  if (!json.access_token) {
142
- throw new errors_1.ConfigError('session-token exchange response missing access_token');
193
+ throw new errors_1.ConfigError('legacy_session exchange response missing access_token');
143
194
  }
144
195
  return json.access_token;
145
196
  }
@@ -152,12 +203,12 @@ function resolveTokenSource(input, baseUrl) {
152
203
  }
153
204
  return (0, token_source_1.makeTokenSourceState)({ kind: 'callback', getToken: input.authToken }, { expiryBufferMs: input.expiryBufferMs, fetchFn: input.fetchFn });
154
205
  }
155
- if (input.sessionToken !== undefined) {
206
+ if (input.session !== undefined) {
156
207
  const customerAuthBaseUrl = input.customerAuthBaseUrl ?? `${baseUrl}/auth/customer`;
157
- const sessionToken = input.sessionToken;
208
+ const session = input.session;
158
209
  return (0, token_source_1.makeTokenSourceState)({
159
210
  kind: 'callback',
160
- getToken: () => exchangeSessionToken(sessionToken, customerAuthBaseUrl, fetchFn),
211
+ getToken: () => exchangeLegacySession(session, authBaseUrl, customerAuthBaseUrl, fetchFn),
161
212
  }, { expiryBufferMs: input.expiryBufferMs, fetchFn: input.fetchFn });
162
213
  }
163
214
  if (input.serviceId && input.serviceSecret) {
@@ -169,6 +220,16 @@ function resolveTokenSource(input, baseUrl) {
169
220
  scope: input.scope,
170
221
  }, { expiryBufferMs: input.expiryBufferMs, fetchFn: input.fetchFn });
171
222
  }
223
+ if (input.tokens) {
224
+ return (0, token_source_1.makeTokenSourceState)({
225
+ kind: 'access-refresh-pair',
226
+ accessToken: input.tokens.accessToken,
227
+ refreshToken: input.tokens.refreshToken,
228
+ expiresAt: Date.now() + input.tokens.expiresIn * 1000,
229
+ clientId: input.tokens.clientId,
230
+ onRotate: input.tokens.onRotate,
231
+ }, { expiryBufferMs: input.expiryBufferMs, fetchFn: input.fetchFn });
232
+ }
172
233
  return undefined;
173
234
  }
174
235
  function warnIfBrowserSecret(config) {
@@ -182,4 +243,4 @@ function warnIfBrowserSecret(config) {
182
243
  'Use `authToken` (a Bearer obtained via OAuth) or `sessionToken` instead.');
183
244
  }
184
245
  }
185
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQWtGQSxvQ0FJQztBQXRGRCwyQ0FBcUU7QUFDckUsOENBQThFO0FBQzlFLGlDQUErQztBQUMvQyxpREFBNkU7QUFDN0UscUNBQTREO0FBc0U1RCxNQUFNLGdCQUFnQixHQUFHLGlDQUFpQyxDQUFDO0FBRTNEOzs7OztHQUtHO0FBQ0gsU0FBZ0IsWUFBWSxDQUFDLFFBQXNCLEVBQUU7SUFDbkQsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25DLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzVCLE9BQU8sV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzdCLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxLQUFtQjtJQUN0QyxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxJQUFJLGdCQUFnQixDQUFDO0lBQ2xELE1BQU0sZ0JBQWdCLEdBQUcsa0JBQWtCLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzVELE1BQU0sSUFBSSxHQUE2QixnQkFBZ0I7UUFDckQsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLEVBQUU7UUFDbkQsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUVkLE1BQU0sY0FBYyxHQUFHLElBQUEsNkJBQW9CLEVBQUMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN2RixNQUFNLFdBQVcsR0FBRyxJQUFBLDBCQUFpQixFQUFDO1FBQ3BDLE9BQU87UUFDUCxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU87UUFDdEIsSUFBSTtRQUNKLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQyxTQUFTO0tBQzVDLENBQUMs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LEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUNqRSxDQUFDO0lBQ0osQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFFRCxTQUFTLG1CQUFtQixDQUFDLE1BQW9CO0lBQy9DLE1BQU0sQ0FBQyxHQUFHLFVBQWlELENBQUM7SUFDNUQsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLENBQUMsTUFBTSxLQUFLLFdBQVcsSUFBSSxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxLQUFLLFdBQVcsQ0FBQztJQUM5RixJQUFJLENBQUMsU0FBUztRQUFFLE9BQU87SUFDdkIsSUFBSSxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDekIsT0FBTyxDQUFDLElBQUksQ0FDVixtRkFBbUY7WUFDakYsK0RBQStEO1lBQy9ELDBFQUEwRSxDQUM3RSxDQUFDO0lBQ0osQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVBdWRpdENsaWVudCwgdHlwZSBBdWRpdENsaWVudCB9IGZyb20gJy4vYXVkaXQvY2xpZW50JztcbmltcG9ydCB7IGNyZWF0ZUJ1c2luZXNzQ2xpZW50LCB0eXBlIEJ1c2luZXNzQ2xpZW50IH0gZnJvbSAnLi9idXNpbmVzcy9jbGllbnQnO1xuaW1wb3J0IHsgYXV0aCBhcyBhdXRoTmFtZXNwYWNlIH0gZnJvbSAnLi9hdXRoJztcbmltcG9ydCB7IG1ha2VUb2tlblNvdXJjZVN0YXRlLCB0eXBlIFRva2VuU291cmNlU3RhdGUgfSBmcm9tICcuL3Rva2VuLXNvdXJjZSc7XG5pbXBvcnQgeyBDb25maWdFcnJvciwgQXV0aGVudGljYXRpb25FcnJvciB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB0eXBlIHsgUGxhdGZvcm1BdXRoIH0gZnJvbSAnLi9jb25maWcnO1xuXG4vKipcbiAqIENhbGxlci1mYWNpbmcgY29uZmlnIGZvciBgY3JlYXRlQ2xpZW50KC4uLilgLlxuICpcbiAqIGBjcmVhdGVDbGllbnQoKWAgKG5vIGFyZ3MpIHJlYWRzIGV2ZXJ5dGhpbmcgZnJvbSB0aGUgc3RhbmRhcmRcbiAqIGBVRU5HQUdFXypgIGVudmlyb25tZW50IHZhcmlhYmxlcyDigJQgY29udmVuaWVudCBmb3IgTGFtYmRhcyB0aGF0XG4gKiBhbHJlYWR5IGhhdmUgdGhlaXIgY29uZmlnIGluamVjdGVkIGJ5IHRoZSBkZXBsb3kgc3RhY2suIEFueSBmaWVsZFxuICogcGFzc2VkIGV4cGxpY2l0bHkgb3ZlcnJpZGVzIHRoZSBtYXRjaGluZyBlbnYgZGVmYXVsdCBmb3IgdGhhdCBvbmVcbiAqIGNhbGwgb25seSAobm8gc2hhcmVkIG11dGFibGUgc3RhdGUsIG5vIHNpbmdsZXRvbikuXG4gKlxuICogQXV0aC1tb2RlIGZpZWxkcyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLiBQaWNrIG9uZTpcbiAqICAgLSBgc2VydmljZUlkYCArIGBzZXJ2aWNlU2VjcmV0YCAgT0F1dGgyIGNsaWVudF9jcmVkZW50aWFscy5cbiAqICAgLSBgYXV0aFRva2VuYCAgICAgICAgICAgICAgICAgICAgc3RhdGljIEJlYXJlciB0b2tlbiwgb3IgYXN5bmNcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgdGhhdCByZXR1cm5zIG9uZS5cbiAqICAgLSBgc2Vzc2lvblRva2VuYCAgICAgICAgICAgICAgICAgbGVnYWN5IGN1c3RvbWVyIHNlc3Npb24gdG9rZW47IHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTREsgZXhjaGFuZ2VzIGl0IHZpYSB0aGUgY3VzdG9tZXJcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aCBzdXJmYWNlIGFuZCBjYWNoZXMgdGhlIEpXVC5cbiAqXG4gKiBQYXNzaW5nIG1vcmUgdGhhbiBvbmUgZXhwbGljaXRseSBpcyBhIGBDb25maWdFcnJvcmAuIFBhc3NpbmcgYW55IG9uZVxuICogb2YgdGhlbSBzdXBwcmVzc2VzIGV2ZXJ5IGVudi1kZXJpdmVkIGF1dGggZGVmYXVsdCwgc28gYSBjYWxsZXInc1xuICogZXhwbGljaXQgb3ZlcnJpZGUgaXMgbmV2ZXIgc2lsZW50bHkgbWVyZ2VkIHdpdGggZW52IGNyZWRlbnRpYWxzIG9mXG4gKiBhIGRpZmZlcmVudCBtb2RlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENsaWVudENvbmZpZyB7XG4gIGJhc2VVcmw/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBdXRoIHN1cmZhY2UgYmFzZSB1c2VkIHRvIGJvb3RzdHJhcCB0aGUgZmlyc3QgY2xpZW50X2NyZWRlbnRpYWxzXG4gICAqIG1pbnQuIERlZmF1bHRzIHRvIGAke2Jhc2VVcmx9L2F1dGgvYnVzaW5lc3NgLlxuICAgKi9cbiAgYXV0aEJhc2VVcmw/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDdXN0b21lciBhdXRoIHN1cmZhY2UgYmFzZSB1c2VkIGJ5IGBzZXNzaW9uVG9rZW5gIGV4Y2hhbmdlcy5cbiAgICogRGVmYXVsdHMgdG8gYCR7YmFzZVVybH0vYXV0aC9jdXN0b21lcmAuXG4gICAqL1xuICBjdXN0b21lckF1dGhCYXNlVXJsPzogc3RyaW5nO1xuXG4gIC8vIOKUgOKUgOKUgCBBdXRoIG1vZGVzIChtdXR1YWxseSBleGNsdXNpdmUpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvKiogT0F1dGgyIGBjbGllbnRfY3JlZGVudGlhbHNgIGNsaWVudElkLiBQYWlyIHdpdGggYHNlcnZpY2VTZWNyZXRgLiAqL1xuICBzZXJ2aWNlSWQ/OiBzdHJpbmc7XG4gIC8qKiBPQXV0aDIgYGNsaWVudF9jcmVkZW50aWFsc2AgY2xpZW50U2VjcmV0LiBQYWlyIHdpdGggYHNlcnZpY2VJZGAuICovXG4gIHNlcnZpY2VTZWNyZXQ/OiBzdHJpbmc7XG4gIC8qKiBTcGFjZS1zZXBhcmF0ZWQgc2NvcGUgbGlzdCB0byByZXF1ZXN0IHdoZW4gbWludGluZyB2aWEgY2xpZW50X2NyZWRlbnRpYWxzLiAqL1xuICBzY29wZT86IHN0cmluZztcbiAgLyoqIFN0YXRpYyBCZWFyZXIgSldULCBvciBhc3luYyBjYWxsYmFjayB0aGF0IHJldHVybnMgb25lLiAqL1xuICBhdXRoVG9rZW4/OiBzdHJpbmcgfCAoKCkgPT4gc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+KTtcbiAgLyoqXG4gICAqIExlZ2FjeSB1RW5nYWdlIHNlc3Npb24gdG9rZW4gKGZyb20gYGFkZG9fY29udGFjdHNfbWFwcGluZy50b2tlbmApLlxuICAgKiBUaGUgU0RLIFBPU1RzIGl0IHRvIGBjdXN0b21lckF1dGhCYXNlVXJsYCB0byBtaW50IGEgSldULCBjYWNoZXMgdGhlXG4gICAqIHJlc3VsdCwgYW5kIHJlLWV4Y2hhbmdlcyBvbiA0MDEgLyBjYWNoZSBtaXNzLlxuICAgKi9cbiAgc2Vzc2lvblRva2VuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTZXJ2aWNlIGlkZW50aWZpZXIgdGhlIGF1ZGl0IGNsaWVudCBzaG91bGQgc3RhbXAgaW50byBgYWN0b3IudmlhYFxuICAgKiBvbiBlbWl0dGVkIGV2ZW50cy4gRGVmYXVsdHMgdG8gYHNlcnZpY2VJZGAgd2hlbiBzZXQ7IG90aGVyd2lzZVxuICAgKiBhdWRpdCBgcmVjb3JkKClgIGNhbGxzIGxvZyBhbiBlcnJvciBhbmQgZHJvcCB0aGUgZXZlbnQuXG4gICAqL1xuICBhY3RvclZpYT86IHN0cmluZztcbiAgZXhwaXJ5QnVmZmVyTXM/OiBudW1iZXI7XG4gIGZldGNoRm4/OiB0eXBlb2YgZmV0Y2g7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxhdGZvcm1DbGllbnQge1xuICBidXNpbmVzczogQnVzaW5lc3NDbGllbnQ7XG4gIGF1ZGl0OiBBdWRpdENsaWVudDtcbiAgYXV0aDogdHlwZW9mIGF1dGhOYW1lc3BhY2U7XG59XG5cbmNvbnN0IERFRkFVTFRfQkFTRV9VUkwgPSAnaHR0cHM6Ly9hcGkucGxhdGZvcm0udWVuZ2FnZS5pbyc7XG5cbi8qKlxuICogQnVpbGQgYSBmcmVzaCwgaXNvbGF0ZWQgY2xpZW50LiBXaXRoIG5vIGFyZ3MsIHJlYWRzIGBVRU5HQUdFXypgXG4gKiBlbnYgdmFyczsgZXhwbGljaXQgZmllbGRzIG92ZXJyaWRlIHBlciBjYWxsLiBFYWNoIGNhbGwgZ2V0cyBpdHMgb3duXG4gKiBUb2tlblNvdXJjZSBzdGF0ZSDigJQgY29uY3VycmVudCBgY3JlYXRlQ2xpZW50KC4uLilgIHVzZSBkb2VzIG5vdFxuICogc3RhbXBlZGUgdGhlIGNhY2hlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ2xpZW50KGlucHV0OiBDbGllbnRDb25maWcgPSB7fSk6IFBsYXRmb3JtQ2xpZW50IHtcbiAgY29uc3QgbWVyZ2VkID0gbWVyZ2VXaXRoRW52KGlucHV0KTtcbiAgd2FybklmQnJvd3NlclNlY3JldChtZXJnZWQpO1xuICByZXR1cm4gYnVpbGRDbGllbnQobWVyZ2VkKTtcbn1cblxuZnVuY3Rpb24gYnVpbGRDbGllbnQoaW5wdXQ6IENsaWVudENvbmZpZyk6IFBsYXRmb3JtQ2xpZW50IHtcbiAgY29uc3QgYmFzZVVybCA9IGlucHV0LmJhc2VVcmwgPz8gREVGQVVMVF9CQVNFX1VSTDtcbiAgY29uc3QgdG9rZW5Tb3VyY2VTdGF0ZSA9IHJlc29sdmVUb2tlblNvdXJjZShpbnB1dCwgYmFzZVVybCk7XG4gIGNvbnN0IGF1dGg6IFBsYXRmb3JtQXV0aCB8IHVuZGVmaW5lZCA9IHRva2VuU291cmNlU3RhdGVcbiAgICA/IHsgdHlwZTogJ3Rva2VuLXNvdXJjZScsIHN0YXRlOiB0b2tlblNvdXJjZVN0YXRlIH1cbiAgICA6IHVuZGVmaW5lZDtcblxuICBjb25zdCBidXNpbmVzc0NsaWVudCA9IGNyZWF0ZUJ1c2luZXNzQ2xpZW50KHsgYmFzZVVybCwgZmV0Y2hGbjogaW5wdXQuZmV0Y2hGbiwgYXV0aCB9KTtcbiAgY29uc3QgYXVkaXRDbGllbnQgPSBjcmVhdGVBdWRpdENsaWVudCh7XG4gICAgYmFzZVVybCxcbiAgICBmZXRjaEZuOiBpbnB1dC5mZXRjaEZuLFxuICAgIGF1dGgsXG4gICAgYWN0b3JWaWE6IGlucHV0LmFjdG9yVmlhID8/IGlucHV0LnNlcnZpY2VJZCxcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBidXNpbmVzczogYnVzaW5lc3NDbGllbnQsXG4gICAgYXVkaXQ6IGF1ZGl0Q2xpZW50LFxuICAgIGF1dGg6IGF1dGhOYW1lc3BhY2UsXG4gIH07XG59XG5cbmNvbnN0IEFVVEhfTU9ERV9GSUVMRFMgPSBbXG4gICdzZXJ2aWNlSWQnLFxuICAnc2VydmljZVNlY3JldCcsXG4gICdzY29wZScsXG4gICdhdXRoVG9rZW4nLFxuICAnc2Vzc2lvblRva2VuJyxcbl0gYXMgY29uc3Q7XG5cbi8qKlxuICogTWVyZ2UgZW52LWRlcml2ZWQgZGVmYXVsdHMgd2l0aCB0aGUgY2FsbGVyJ3MgZXhwbGljaXQgaW5wdXQuIEFueVxuICogZXhwbGljaXQgYXV0aC1tb2RlIGZpZWxkIHN1cHByZXNzZXMgKmFsbCogZW52LWRlcml2ZWQgYXV0aCBkZWZhdWx0cyxcbiAqIHNvIGFuIGV4cGxpY2l0IGB7YXV0aFRva2VufWAgb3ZlcnJpZGUgZG9lc24ndCBhY2NpZGVudGFsbHkgaW5oZXJpdFxuICogYHNlcnZpY2VJZGAvYHNlcnZpY2VTZWNyZXRgIGZyb20gZW52LiBOb24tYXV0aCBmaWVsZHMgZmFsbCB0aHJvdWdoXG4gKiBub3JtYWxseSAoY2FsbGVyIGBiYXNlVXJsYCBvdmVycmlkZXMgZW52IGJhc2VVcmw7IGFic2VudCBpbnB1dCBrZWVwc1xuICogZW52IGJhc2VVcmwpLlxuICovXG5mdW5jdGlvbiBtZXJnZVdpdGhFbnYoaW5wdXQ6IENsaWVudENvbmZpZyk6IENsaWVudENvbmZpZyB7XG4gIGNvbnN0IGVudiA9IHJlYWRFbnZEZWZhdWx0cygpO1xuICBjb25zdCBpbnB1dEhhc0F1dGggPSBpbnB1dEhhc0F1dGhNb2RlKGlucHV0KTtcbiAgY29uc3QgZW52Rm9yTWVyZ2UgPSBpbnB1dEhhc0F1dGggPyB3aXRob3V0QXV0aEZpZWxkcyhlbnYpIDogZW52O1xuXG4gIGNvbnN0IG1lcmdlZDogQ2xpZW50Q29uZmlnID0ge1xuICAgIGJhc2VVcmw6IGlucHV0LmJhc2VVcmwgPz8gZW52Rm9yTWVyZ2UuYmFzZVVybCxcbiAgICBhdXRoQmFzZVVybDogaW5wdXQuYXV0aEJhc2VVcmwgPz8gZW52Rm9yTWVyZ2UuYXV0aEJhc2VVcmwsXG4gICAgY3VzdG9tZXJBdXRoQmFzZVVybDogaW5wdXQuY3VzdG9tZXJBdXRoQmFzZVVybCA/PyBlbnZGb3JNZXJnZS5jdXN0b21lckF1dGhCYXNlVXJsLFxuICAgIHNlcnZpY2VJZDogaW5wdXQuc2VydmljZUlkID8/IGVudkZvck1lcmdlLnNlcnZpY2VJZCxcbiAgICBzZXJ2aWNlU2VjcmV0OiBpbnB1dC5zZXJ2aWNlU2VjcmV0ID8/IGVudkZvck1lcmdlLnNlcnZpY2VTZWNyZXQsXG4gICAgc2NvcGU6IGlucHV0LnNjb3BlID8/IGVudkZvck1lcmdlLnNjb3BlLFxuICAgIGF1dGhUb2tlbjogaW5wdXQuYXV0aFRva2VuID8/IGVudkZvck1lcmdlLmF1dGhUb2tlbixcbiAgICBzZXNzaW9uVG9rZW46IGlucHV0LnNlc3Npb25Ub2tlbiA/PyBlbnZGb3JNZXJnZS5zZXNzaW9uVG9rZW4sXG4gICAgYWN0b3JWaWE6IGlucHV0LmFjdG9yVmlhID8/IGVudkZvck1lcmdlLmFjdG9yVmlhLFxuICAgIGV4cGlyeUJ1ZmZlck1zOiBpbnB1dC5leHBpcnlCdWZmZXJNcyA/PyBlbnZGb3JNZXJnZS5leHBpcnlCdWZmZXJNcyxcbiAgICBmZXRjaEZuOiBpbnB1dC5mZXRjaEZuLFxuICB9O1xuICBhc3NlcnRFeGFjdGx5T25lQXV0aE1vZGUobWVyZ2VkKTtcbiAgcmV0dXJuIG1lcmdlZDtcbn1cblxuZnVuY3Rpb24gcmVhZEVudkRlZmF1bHRzKCk6IENsaWVudENvbmZpZyB7XG4gIGlmICh0eXBlb2YgcHJvY2VzcyA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybiB7fTtcbiAgY29uc3QgZSA9IChwcm9jZXNzIGFzIHsgZW52PzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB9KS5lbnYgPz8ge307XG4gIGNvbnN0IGV4cGlyeSA9IGUuVUVOR0FHRV9FWFBJUllfQlVGRkVSX01TID8gTnVtYmVyKGUuVUVOR0FHRV9FWFBJUllfQlVGRkVSX01TKSA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHtcbiAgICBiYXNlVXJsOiBlLlVFTkdBR0VfQkFTRV9VUkwsXG4gICAgYXV0aEJhc2VVcmw6IGUuVUVOR0FHRV9BVVRIX0JBU0VfVVJMLFxuICAgIGN1c3RvbWVyQXV0aEJhc2VVcmw6IGUuVUVOR0FHRV9DVVNUT01FUl9BVVRIX0JBU0VfVVJMLFxuICAgIHNlcnZpY2VJZDogZS5VRU5HQUdFX1NFUlZJQ0VfSUQsXG4gICAgc2VydmljZVNlY3JldDogZS5VRU5HQUdFX1NFUlZJQ0VfU0VDUkVULFxuICAgIHNjb3BlOiBlLlVFTkdBR0VfU0NPUEUsXG4gICAgYXV0aFRva2VuOiBlLlVFTkdBR0VfQVVUSF9UT0tFTixcbiAgICBzZXNzaW9uVG9rZW46IGUuVUVOR0FHRV9TRVNTSU9OX1RPS0VOLFxuICAgIGFjdG9yVmlhOiBlLlVFTkdBR0VfQUNUT1JfVklBLFxuICAgIGV4cGlyeUJ1ZmZlck1zOiBOdW1iZXIuaXNGaW5pdGUoZXhwaXJ5KSA/IChleHBpcnkgYXMgbnVtYmVyKSA6IHVuZGVmaW5lZCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gaW5wdXRIYXNBdXRoTW9kZShpbnB1dDogQ2xpZW50Q29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiBBVVRIX01PREVfRklFTERTLnNvbWUoKGYpID0+IGlucHV0W2ZdICE9PSB1bmRlZmluZWQpO1xufVxuXG5mdW5jdGlvbiB3aXRob3V0QXV0aEZpZWxkcyhjOiBDbGllbnRDb25maWcpOiBDbGllbnRDb25maWcge1xuICByZXR1cm4ge1xuICAgIC4uLmMsXG4gICAgc2VydmljZUlkOiB1bmRlZmluZWQsXG4gICAgc2VydmljZVNlY3JldDogdW5kZWZpbmVkLFxuICAgIHNjb3BlOiB1bmRlZmluZWQsXG4gICAgYXV0aFRva2VuOiB1bmRlZmluZWQsXG4gICAgc2Vzc2lvblRva2VuOiB1bmRlZmluZWQsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGFzc2VydEV4YWN0bHlPbmVBdXRoTW9kZShpbnB1dDogQ2xpZW50Q29uZmlnKTogdm9pZCB7XG4gIGNvbnN0IG1vZGVzOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAoaW5wdXQuYXV0aFRva2VuICE9PSB1bmRlZmluZWQpIG1vZGVzLnB1c2goJ2F1dGhUb2tlbicpO1xuICBpZiAoaW5wdXQuc2Vzc2lvblRva2VuICE9PSB1bmRlZmluZWQpIG1vZGVzLnB1c2goJ3Nlc3Npb25Ub2tlbicpO1xuICBpZiAoaW5wdXQuc2VydmljZUlkICE9PSB1bmRlZmluZWQgfHwgaW5wdXQuc2VydmljZVNlY3JldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbW9kZXMucHVzaCgnc2VydmljZUlkK3NlcnZpY2VTZWNyZXQnKTtcbiAgfVxuICBpZiAobW9kZXMubGVuZ3RoID4gMSkge1xuICAgIHRocm93IG5ldyBDb25maWdFcnJvcihcbiAgICAgIGBjcmVhdGVDbGllbnQ6IHBpY2sgZXhhY3RseSBvbmUgYXV0aCBtb2RlLiBHb3QgJHttb2Rlcy5qb2luKCcsICcpfS4gYCArXG4gICAgICAgICdVc2Ugb25lIG9mIHtzZXJ2aWNlSWQsIHNlcnZpY2VTZWNyZXR9IHwge2F1dGhUb2tlbn0gfCB7c2Vzc2lvblRva2VufS4nLFxuICAgICk7XG4gIH1cbiAgLy8gWmVybyBtb2RlcyBpcyBhbGxvd2VkIOKAlCBjYWxsZXIgbWF5IHdhbnQgYSBmdWxseS1hbm9ueW1vdXMgY2xpZW50IGZvclxuICAvLyBwdWJsaWMgZW5kcG9pbnRzLiBUaGUgZmlyc3QgcmVxdWVzdCB0aGF0IG5lZWRzIGF1dGggd2lsbCBzdXJmYWNlIGFcbiAgLy8gQ29uZmlnRXJyb3IgZG93bnN0cmVhbS5cbn1cblxuLyoqXG4gKiBQT1NUIHRvIHRoZSBjdXN0b21lciBhdXRoIHN1cmZhY2UgdG8gZXhjaGFuZ2UgYSBsZWdhY3kgc2Vzc2lvblxuICogdG9rZW4gZm9yIGEgZnJlc2ggYWNjZXNzIHRva2VuLiBVc2VkIGJ5IGBjcmVhdGVDbGllbnQoeyBzZXNzaW9uVG9rZW4gfSlgLlxuICovXG5hc3luYyBmdW5jdGlvbiBleGNoYW5nZVNlc3Npb25Ub2tlbihcbiAgc2Vzc2lvblRva2VuOiBzdHJpbmcsXG4gIGN1c3RvbWVyQXV0aEJhc2VVcmw6IHN0cmluZyxcbiAgZmV0Y2hGbjogdHlwZW9mIGZldGNoLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2hGbihgJHtjdXN0b21lckF1dGhCYXNlVXJsfS9vYXV0aC90b2tlbmAsIHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBoZWFkZXJzOiB7ICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyB9LFxuICAgIGJvZHk6IG5ldyBVUkxTZWFyY2hQYXJhbXMoe1xuICAgICAgZ3JhbnRfdHlwZTogJ3Nlc3Npb25fdG9rZW4nLFxuICAgICAgc2Vzc2lvbl90b2tlbjogc2Vzc2lvblRva2VuLFxuICAgIH0pLnRvU3RyaW5nKCksXG4gIH0pO1xuICBpZiAoIXJlcy5vaykge1xuICAgIGNvbnN0IHRleHQgPSBhd2FpdCByZXMudGV4dCgpLmNhdGNoKCgpID0+ICcnKTtcbiAgICB0aHJvdyBuZXcgQXV0aGVudGljYXRpb25FcnJvcihgc2Vzc2lvbi10b2tlbiBleGNoYW5nZSBmYWlsZWQ6IEhUVFAgJHtyZXMuc3RhdHVzfSAke3RleHR9YCk7XG4gIH1cbiAgY29uc3QganNvbiA9IChhd2FpdCByZXMuanNvbigpKSBhcyB7IGFjY2Vzc190b2tlbj86IHN0cmluZyB9O1xuICBpZiAoIWpzb24uYWNjZXNzX3Rva2VuKSB7XG4gICAgdGhyb3cgbmV3IENvbmZpZ0Vycm9yKCdzZXNzaW9uLXRva2VuIGV4Y2hhbmdlIHJlc3BvbnNlIG1pc3NpbmcgYWNjZXNzX3Rva2VuJyk7XG4gIH1cbiAgcmV0dXJuIGpzb24uYWNjZXNzX3Rva2VuO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlVG9rZW5Tb3VyY2UoaW5wdXQ6IENsaWVudENvbmZpZywgYmFzZVVybDogc3RyaW5nKTogVG9rZW5Tb3VyY2VTdGF0ZSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGF1dGhCYXNlVXJsID0gaW5wdXQuYXV0aEJhc2VVcmwgPz8gYCR7YmFzZVVybH0vYXV0aC9idXNpbmVzc2A7XG4gIGNvbnN0IGZldGNoRm4gPSBpbnB1dC5mZXRjaEZuID8/IChnbG9iYWxUaGlzLmZldGNoIGFzIHR5cGVvZiBmZXRjaCk7XG5cbiAgaWYgKGlucHV0LmF1dGhUb2tlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHR5cGVvZiBpbnB1dC5hdXRoVG9rZW4gPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gbWFrZVRva2VuU291cmNlU3RhdGUoXG4gICAgICAgIHsga2luZDogJ3N0YXRpYy1zdHJpbmcnLCB0b2tlbjogaW5wdXQuYXV0aFRva2VuIH0sXG4gICAgICAgIHsgZXhwaXJ5QnVmZmVyTXM6IGlucHV0LmV4cGlyeUJ1ZmZlck1zLCBmZXRjaEZuOiBpbnB1dC5mZXRjaEZuIH0sXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gbWFrZVRva2VuU291cmNlU3RhdGUoXG4gICAgICB7IGtpbmQ6ICdjYWxsYmFjaycsIGdldFRva2VuOiBpbnB1dC5hdXRoVG9rZW4gfSxcbiAgICAgIHsgZXhwaXJ5QnVmZmVyTXM6IGlucHV0LmV4cGlyeUJ1ZmZlck1zLCBmZXRjaEZuOiBpbnB1dC5mZXRjaEZuIH0sXG4gICAgKTtcbiAgfVxuICBpZiAoaW5wdXQuc2Vzc2lvblRva2VuICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBjdXN0b21lckF1dGhCYXNlVXJsID0gaW5wdXQuY3VzdG9tZXJBdXRoQmFzZVVybCA/PyBgJHtiYXNlVXJsfS9hdXRoL2N1c3RvbWVyYDtcbiAgICBjb25zdCBzZXNzaW9uVG9rZW4gPSBpbnB1dC5zZXNzaW9uVG9rZW47XG4gICAgcmV0dXJuIG1ha2VUb2tlblNvdXJjZVN0YXRlKFxuICAgICAge1xuICAgICAgICBraW5kOiAnY2FsbGJhY2snLFxuICAgICAgICBnZXRUb2tlbjogKCkgPT4gZXhjaGFuZ2VTZXNzaW9uVG9rZW4oc2Vzc2lvblRva2VuLCBjdXN0b21lckF1dGhCYXNlVXJsLCBmZXRjaEZuKSxcbiAgICAgIH0sXG4gICAgICB7IGV4cGlyeUJ1ZmZlck1zOiBpbnB1dC5leHBpcnlCdWZmZXJNcywgZmV0Y2hGbjogaW5wdXQuZmV0Y2hGbiB9LFxuICAgICk7XG4gIH1cbiAgaWYgKGlucHV0LnNlcnZpY2VJZCAmJiBpbnB1dC5zZXJ2aWNlU2VjcmV0KSB7XG4gICAgcmV0dXJuIG1ha2VUb2tlblNvdXJjZVN0YXRlKFxuICAgICAge1xuICAgICAgICBraW5kOiAnc2VydmljZS1jcmVkZW50aWFscycsXG4gICAgICAgIGNsaWVudElkOiBpbnB1dC5zZXJ2aWNlSWQsXG4gICAgICAgIGNsaWVudFNlY3JldDogaW5wdXQuc2VydmljZVNlY3JldCxcbiAgICAgICAgYXV0aEJhc2VVcmwsXG4gICAgICAgIHNjb3BlOiBpbnB1dC5zY29wZSxcbiAgICAgIH0sXG4gICAgICB7IGV4cGlyeUJ1ZmZlck1zOiBpbnB1dC5leHBpcnlCdWZmZXJNcywgZmV0Y2hGbjogaW5wdXQuZmV0Y2hGbiB9LFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gd2FybklmQnJvd3NlclNlY3JldChjb25maWc6IENsaWVudENvbmZpZyk6IHZvaWQge1xuICBjb25zdCBnID0gZ2xvYmFsVGhpcyBhcyB7IHdpbmRvdz86IHsgZG9jdW1lbnQ/OiB1bmtub3duIH0gfTtcbiAgY29uc3QgaW5Ccm93c2VyID0gdHlwZW9mIGcud2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZy53aW5kb3cuZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnO1xuICBpZiAoIWluQnJvd3NlcikgcmV0dXJuO1xuICBpZiAoY29uZmlnLnNlcnZpY2VTZWNyZXQpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAnW3VlbmdhZ2UtcGxhdGZvcm0tc2RrXSBzZXJ2aWNlU2VjcmV0IHNob3VsZCBub3QgYmUgdXNlZCBpbiBicm93c2VyIGVudmlyb25tZW50cy4gJyArXG4gICAgICAgICdTZXJ2aWNlIGNyZWRlbnRpYWxzIGluIGJyb3dzZXIgYnVuZGxlcyBhcmUgcHVibGljbHkgdmlzaWJsZS4gJyArXG4gICAgICAgICdVc2UgYGF1dGhUb2tlbmAgKGEgQmVhcmVyIG9idGFpbmVkIHZpYSBPQXV0aCkgb3IgYHNlc3Npb25Ub2tlbmAgaW5zdGVhZC4nLFxuICAgICk7XG4gIH1cbn1cbiJdfQ==
246
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQStIQSxvQ0FJQztBQW5JRCwyQ0FBcUU7QUFDckUsOENBQThFO0FBQzlFLDJDQUFxRTtBQUNyRSw0Q0FBd0U7QUFDeEUsaUNBQStDO0FBQy9DLGlEQUl3QjtBQUN4QixxQ0FBNEQ7QUE2RzVELE1BQU0sZ0JBQWdCLEdBQUcsaUNBQWlDLENBQUM7QUFFM0Q7Ozs7O0dBS0c7QUFDSCxTQUFnQixZQUFZLENBQUMsUUFBc0IsRUFBRTtJQUNuRCxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUIsT0FBTyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDN0IsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLEtBQW1CO0lBQ3RDLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLElBQUksZ0JBQWdCLENBQUM7SUFDbEQsTUFBTSxnQkFBZ0IsR0FBRyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDNUQsTUFBTSxJQUFJLEdBQTZCLGdCQUFnQjtRQUNyRCxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxnQkFBZ0IsRUFBRTtRQUNuRCxDQUFDLENBQUMsU0FBUyxDQUFDO0lBRWQsTUFBTSxjQUFjLEdBQUcsSUFBQSw2QkFBb0IsRUFBQyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZGLE1BQU0sV0FBVyxHQUFHLElBQUEsMEJBQWlCLEVBQUM7UUFDcEMsT0FBTztRQUNQLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTztRQUN0QixJQUFJO1FBQ0osUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRLElBQUks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QjtZQUNFLElBQUksRUFBRSxxQkFBcUI7WUFDM0IsV0FBVyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsV0FBVztZQUNyQyxZQUFZLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxZQUFZO1lBQ3ZDLFNBQVMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsSUFBSTtZQUNyRCxRQUFRLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRO1lBQy9CLFFBQVEsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVE7U0FDaEMsRUFDRCxFQUFFLGNBQWMsRUFBRSxLQUFLLENBQUMsY0FBYyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQ2pFLENBQUM7SUFDSixDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVELFNBQVMsbUJBQW1CLENBQUMsTUFBb0I7SUFDL0MsTUFBTSxDQUFDLEdBQUcsVUFBaUQsQ0FBQztJQUM1RCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsQ0FBQyxNQUFNLEtBQUssV0FBVyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEtBQUssV0FBVyxDQUFDO0lBQzlGLElBQUksQ0FBQyxTQUFTO1FBQUUsT0FBTztJQUN2QixJQUFJLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN6QixPQUFPLENBQUMsSUFBSSxDQUNWLG1GQUFtRjtZQUNqRiwrREFBK0Q7WUFDL0QsMEVBQTBFLENBQzdFLENBQUM7SUFDSixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZUF1ZGl0Q2xpZW50LCB0eXBlIEF1ZGl0Q2xpZW50IH0gZnJvbSAnLi9hdWRpdC9jbGllbnQnO1xuaW1wb3J0IHsgY3JlYXRlQnVzaW5lc3NDbGllbnQsIHR5cGUgQnVzaW5lc3NDbGllbnQgfSBmcm9tICcuL2J1c2luZXNzL2NsaWVudCc7XG5pbXBvcnQgeyBjcmVhdGVab25lc0NsaWVudCwgdHlwZSBab25lc0NsaWVudCB9IGZyb20gJy4vem9uZXMvY2xpZW50JztcbmltcG9ydCB7IGNyZWF0ZVdhbGxldENsaWVudCwgdHlwZSBXYWxsZXRDbGllbnQgfSBmcm9tICcuL3dhbGxldC9jbGllbnQnO1xuaW1wb3J0IHsgYXV0aCBhcyBhdXRoTmFtZXNwYWNlIH0gZnJvbSAnLi9hdXRoJztcbmltcG9ydCB7XG4gIGdldEFjY2Vzc1Rva2VuIGFzIHJlc29sdmVBY2Nlc3NUb2tlbixcbiAgbWFrZVRva2VuU291cmNlU3RhdGUsXG4gIHR5cGUgVG9rZW5Tb3VyY2VTdGF0ZSxcbn0gZnJvbSAnLi90b2tlbi1zb3VyY2UnO1xuaW1wb3J0IHsgQ29uZmlnRXJyb3IsIEF1dGhlbnRpY2F0aW9uRXJyb3IgfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQgdHlwZSB7IFBsYXRmb3JtQXV0aCB9IGZyb20gJy4vY29uZmlnJztcblxuLyoqXG4gKiBDYWxsZXItZmFjaW5nIGNvbmZpZyBmb3IgYGNyZWF0ZUNsaWVudCguLi4pYC5cbiAqXG4gKiBgY3JlYXRlQ2xpZW50KClgIChubyBhcmdzKSByZWFkcyBldmVyeXRoaW5nIGZyb20gdGhlIHN0YW5kYXJkXG4gKiBgVUVOR0FHRV8qYCBlbnZpcm9ubWVudCB2YXJpYWJsZXMg4oCUIGNvbnZlbmllbnQgZm9yIExhbWJkYXMgdGhhdFxuICogYWxyZWFkeSBoYXZlIHRoZWlyIGNvbmZpZyBpbmplY3RlZCBieSB0aGUgZGVwbG95IHN0YWNrLiBBbnkgZmllbGRcbiAqIHBhc3NlZCBleHBsaWNpdGx5IG92ZXJyaWRlcyB0aGUgbWF0Y2hpbmcgZW52IGRlZmF1bHQgZm9yIHRoYXQgb25lXG4gKiBjYWxsIG9ubHkgKG5vIHNoYXJlZCBtdXRhYmxlIHN0YXRlLCBubyBzaW5nbGV0b24pLlxuICpcbiAqIEF1dGgtbW9kZSBmaWVsZHMgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4gUGljayBvbmU6XG4gKiAgIC0gYHNlcnZpY2VJZGAgKyBgc2VydmljZVNlY3JldGAgIE9BdXRoMiBjbGllbnRfY3JlZGVudGlhbHMuXG4gKiAgIC0gYGF1dGhUb2tlbmAgICAgICAgICAgICAgICAgICAgIHN0YXRpYyBCZWFyZXIgdG9rZW4sIG9yIGFzeW5jXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrIHRoYXQgcmV0dXJucyBvbmUuXG4gKiAgIC0gYHNlc3Npb246IHtpZCwgdG9rZW59YCAgICAgICAgIGxlZ2FjeSB1RW5nYWdlIChpZCwgYXBpVG9rZW4pIC9cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlkLCBhZGRvX2NvbnRhY3RzX21hcHBpbmcudG9rZW4pXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhaXIuIFRoZSBTREsgcHJvYmVzIHRoZSBidXNpbmVzc1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlICh1c2VycykgZmlyc3QsIGZhbGxzIGJhY2tcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIGN1c3RvbWVyIHN1cmZhY2VcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFkZG9fY29udGFjdHNfbWFwcGluZykgaWYgdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c2luZXNzIHByb2JlIHJldHVybnNcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGludmFsaWRfZ3JhbnRgLCBhbmQgY2FjaGVzIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRpbmcgSldULlxuICpcbiAqIFBhc3NpbmcgbW9yZSB0aGFuIG9uZSBleHBsaWNpdGx5IGlzIGEgYENvbmZpZ0Vycm9yYC4gUGFzc2luZyBhbnkgb25lXG4gKiBvZiB0aGVtIHN1cHByZXNzZXMgZXZlcnkgZW52LWRlcml2ZWQgYXV0aCBkZWZhdWx0LCBzbyBhIGNhbGxlcidzXG4gKiBleHBsaWNpdCBvdmVycmlkZSBpcyBuZXZlciBzaWxlbnRseSBtZXJnZWQgd2l0aCBlbnYgY3JlZGVudGlhbHMgb2ZcbiAqIGEgZGlmZmVyZW50IG1vZGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpZW50Q29uZmlnIHtcbiAgYmFzZVVybD86IHN0cmluZztcbiAgLyoqXG4gICAqIEF1dGggc3VyZmFjZSBiYXNlIHVzZWQgdG8gYm9vdHN0cmFwIHRoZSBmaXJzdCBjbGllbnRfY3JlZGVudGlhbHNcbiAgICogbWludC4gRGVmYXVsdHMgdG8gYCR7YmFzZVVybH0vYXV0aC9idXNpbmVzc2AuXG4gICAqL1xuICBhdXRoQmFzZVVybD86IHN0cmluZztcbiAgLyoqXG4gICAqIEN1c3RvbWVyIGF1dGggc3VyZmFjZSBiYXNlIHVzZWQgYnkgYHNlc3Npb25gIGV4Y2hhbmdlcy4gRGVmYXVsdHMgdG9cbiAgICogYCR7YmFzZVVybH0vYXV0aC9jdXN0b21lcmAuXG4gICAqL1xuICBjdXN0b21lckF1dGhCYXNlVXJsPzogc3RyaW5nO1xuXG4gIC8vIOKUgOKUgOKUgCBBdXRoIG1vZGVzIChtdXR1YWxseSBleGNsdXNpdmUpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvKiogT0F1dGgyIGBjbGllbnRfY3JlZGVudGlhbHNgIGNsaWVudElkLiBQYWlyIHdpdGggYHNlcnZpY2VTZWNyZXRgLiAqL1xuICBzZXJ2aWNlSWQ/OiBzdHJpbmc7XG4gIC8qKiBPQXV0aDIgYGNsaWVudF9jcmVkZW50aWFsc2AgY2xpZW50U2VjcmV0LiBQYWlyIHdpdGggYHNlcnZpY2VJZGAuICovXG4gIHNlcnZpY2VTZWNyZXQ/OiBzdHJpbmc7XG4gIC8qKiBTcGFjZS1zZXBhcmF0ZWQgc2NvcGUgbGlzdCB0byByZXF1ZXN0IHdoZW4gbWludGluZyB2aWEgY2xpZW50X2NyZWRlbnRpYWxzLiAqL1xuICBzY29wZT86IHN0cmluZztcbiAgLyoqIFN0YXRpYyBCZWFyZXIgSldULCBvciBhc3luYyBjYWxsYmFjayB0aGF0IHJldHVybnMgb25lLiAqL1xuICBhdXRoVG9rZW4/OiBzdHJpbmcgfCAoKCkgPT4gc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+KTtcbiAgLyoqXG4gICAqIExlZ2FjeSB1RW5nYWdlIChpZCwgdG9rZW4pIHBhaXIuIGBpZGAgaXMgYHVzZXJzLnVzZXJJZGAgZm9yIHN0YWZmXG4gICAqIHVzZXJzIChtYXRjaGVkIHZpYSB0aGUgYnVzaW5lc3Mgc3VyZmFjZSkgb3JcbiAgICogYGFkZG9fY29udGFjdHNfbWFwcGluZy5pZGAvYGNvbnRhY3RJZGAgZm9yIGN1c3RvbWVycyAobWF0Y2hlZCB2aWFcbiAgICogdGhlIGN1c3RvbWVyIHN1cmZhY2UpLiBUaGUgU0RLIHByb2JlcyB0aGUgYnVzaW5lc3Mgc3VyZmFjZSBmaXJzdFxuICAgKiBhbmQgZmFsbHMgYmFjayB0byBjdXN0b21lciBvbiBgaW52YWxpZF9ncmFudGAuXG4gICAqL1xuICBzZXNzaW9uPzogeyBpZDogc3RyaW5nIHwgbnVtYmVyOyB0b2tlbjogc3RyaW5nIH07XG4gIC8qKlxuICAgKiBgKGFjY2Vzc1Rva2VuLCByZWZyZXNoVG9rZW4pYCBwYWlyIGZyb20gYSBmaW5pc2hlZCBsb2dpbiBmbG93XG4gICAqIChgYXV0aC5sb2dpbldpdGhQYXNzd29yZCguLi4pYCwgYGF1dGgudmVyaWZ5T3RwKC4uLilgLCBldGMpLiBUaGVcbiAgICogU0RLIHVzZXMgdGhlIGFjY2VzcyB0b2tlbiB1bnRpbCBpdCBleHBpcmVzLCB0aGVuIHJvdGF0ZXMgdmlhXG4gICAqIGBhdXRoLnJlZnJlc2goLi4uKWAgdHJhbnNwYXJlbnRseS4gYG9uUm90YXRlYCBmaXJlcyBhZnRlciBldmVyeVxuICAgKiByb3RhdGlvbiBzbyBjYWxsZXJzIGNhbiBwZXJzaXN0IHRoZSBuZXcgcGFpci5cbiAgICovXG4gIHRva2Vucz86IHtcbiAgICBhY2Nlc3NUb2tlbjogc3RyaW5nO1xuICAgIHJlZnJlc2hUb2tlbjogc3RyaW5nO1xuICAgIC8qKiBBY2Nlc3MgdG9rZW4gVFRMIChzZWNvbmRzKSwgYXMgcmV0dXJuZWQgYnkgdGhlIGF1dGggc3VyZmFjZS4gKi9cbiAgICBleHBpcmVzSW46IG51bWJlcjtcbiAgICAvKiogT0F1dGggY2xpZW50IGlkIHVzZWQgZHVyaW5nIHRoZSBvcmlnaW5hbCBsb2dpbiAocmVxdWlyZWQgYnkgdGhlIHJlZnJlc2ggaGFuZGxlcikuICovXG4gICAgY2xpZW50SWQ6IHN0cmluZztcbiAgICBvblJvdGF0ZT86IChwYWlyOiB7XG4gICAgICBhY2Nlc3NUb2tlbjogc3RyaW5nO1xuICAgICAgcmVmcmVzaFRva2VuOiBzdHJpbmc7XG4gICAgICBleHBpcmVzQXQ6IG51bWJlcjtcbiAgICB9KSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgfTtcblxuICAvKipcbiAgICogU2VydmljZSBpZGVudGlmaWVyIHRoZSBhdWRpdCBjbGllbnQgc2hvdWxkIHN0YW1wIGludG8gYGFjdG9yLnZpYWBcbiAgICogb24gZW1pdHRlZCBldmVudHMuIERlZmF1bHRzIHRvIGBzZXJ2aWNlSWRgIHdoZW4gc2V0OyBvdGhlcndpc2VcbiAgICogYXVkaXQgYHJlY29yZCgpYCBjYWxscyBsb2cgYW4gZXJyb3IgYW5kIGRyb3AgdGhlIGV2ZW50LlxuICAgKi9cbiAgYWN0b3JWaWE/OiBzdHJpbmc7XG4gIGV4cGlyeUJ1ZmZlck1zPzogbnVtYmVyO1xuICBmZXRjaEZuPzogdHlwZW9mIGZldGNoO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXRmb3JtQ2xpZW50IHtcbiAgYnVzaW5lc3M6IEJ1c2luZXNzQ2xpZW50O1xuICBhdWRpdDogQXVkaXRDbGllbnQ7XG4gIHpvbmVzOiBab25lc0NsaWVudDtcbiAgd2FsbGV0OiBXYWxsZXRDbGllbnQ7XG4gIGF1dGg6IHR5cGVvZiBhdXRoTmFtZXNwYWNlO1xuICAvKipcbiAgICogUmVzb2x2ZSB0aGUgY3VycmVudCBhY2Nlc3MgdG9rZW4sIG1pbnRpbmcgdmlhIHRoZSBjb25maWd1cmVkIGF1dGhcbiAgICogbW9kZSBpZiB0aGUgY2FjaGUgaXMgY29sZC4gVXNlZnVsIGZvciBgYXV0aC52ZXJpZnlBY2Nlc3NUb2tlbiguLi4pYFxuICAgKiByb3VuZC10cmlwcyBhbmQgZm9yIGNhbGxlcnMgdGhhdCB3YW50IHRvIGxvZyAvIGZvcndhcmQgdGhlIGJlYXJlclxuICAgKiB0byBhIGRvd25zdHJlYW0gc2VydmljZS5cbiAgICpcbiAgICogVGhyb3dzIGBDb25maWdFcnJvcmAgd2hlbiB0aGUgY2xpZW50IHdhcyBidWlsdCB3aXRoIG5vIGF1dGggbW9kZS5cbiAgICovXG4gIGdldEFjY2Vzc1Rva2VuKCk6IFByb21pc2U8c3RyaW5nPjtcbn1cblxuY29uc3QgREVGQVVMVF9CQVNFX1VSTCA9ICdodHRwczovL2FwaS5wbGF0Zm9ybS51ZW5nYWdlLmlvJztcblxuLyoqXG4gKiBCdWlsZCBhIGZyZXNoLCBpc29sYXRlZCBjbGllbnQuIFdpdGggbm8gYXJncywgcmVhZHMgYFVFTkdBR0VfKmBcbiAqIGVudiB2YXJzOyBleHBsaWNpdCBmaWVsZHMgb3ZlcnJpZGUgcGVyIGNhbGwuIEVhY2ggY2FsbCBnZXRzIGl0cyBvd25cbiAqIFRva2VuU291cmNlIHN0YXRlIOKAlCBjb25jdXJyZW50IGBjcmVhdGVDbGllbnQoLi4uKWAgdXNlIGRvZXMgbm90XG4gKiBzdGFtcGVkZSB0aGUgY2FjaGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDbGllbnQoaW5wdXQ6IENsaWVudENvbmZpZyA9IHt9KTogUGxhdGZvcm1DbGllbnQge1xuICBjb25zdCBtZXJnZWQgPSBtZXJnZVdpdGhFbnYoaW5wdXQpO1xuICB3YXJuSWZCcm93c2VyU2VjcmV0KG1lcmdlZCk7XG4gIHJldHVybiBidWlsZENsaWVudChtZXJnZWQpO1xufVxuXG5mdW5jdGlvbiBidWlsZENsaWVudChpbnB1dDogQ2xpZW50Q29uZmlnKTogUGxhdGZvcm1DbGllbnQge1xuICBjb25zdCBiYXNlVXJsID0gaW5wdXQuYmFzZVVybCA/PyBERUZBVUxUX0JBU0VfVVJMO1xuICBjb25zdCB0b2tlblNvdXJjZVN0YXRlID0gcmVzb2x2ZVRva2VuU291cmNlKGlucHV0LCBiYXNlVXJsKTtcbiAgY29uc3QgYXV0aDogUGxhdGZvcm1BdXRoIHwgdW5kZWZpbmVkID0gdG9rZW5Tb3VyY2VTdGF0ZVxuICAgID8geyB0eXBlOiAndG9rZW4tc291cmNlJywgc3RhdGU6IHRva2VuU291cmNlU3RhdGUgfVxuICAgIDogdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGJ1c2luZXNzQ2xpZW50ID0gY3JlYXRlQnVzaW5lc3NDbGllbnQoeyBiYXNlVXJsLCBmZXRjaEZuOiBpbnB1dC5mZXRjaEZuLCBhdXRoIH0pO1xuICBjb25zdCBhdWRpdENsaWVudCA9IGNyZWF0ZUF1ZGl0Q2xpZW50KHtcbiAgICBiYXNlVXJsLFxuICAgIGZldGNoRm46IGlucHV0LmZldGNoRm4sXG4gICAgYXV0aCxcbiAgICBhY3RvclZpYTogaW5wdXQuYWN0b3JWaWEgPz8gaW5wdXQuc2VydmljZUlkLFxuICB9KTtcbiAgY29uc3Qgem9uZXNDbGllbnQgPSBjcmVhdGVab25lc0NsaWVudCh7IGJhc2VVcmwsIGZldGNoRm46IGlucHV0LmZldGNoRm4sIGF1dGggfSk7XG4gIGNvbnN0IHdhbGxldENsaWVudCA9IGNyZWF0ZVdhbGxldENsaWVudCh7IGJhc2VVcmwsIGZldGNoRm46IGlucHV0LmZldGNoRm4sIGF1dGggfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBidXNpbmVzczogYnVzaW5lc3NDbGllbnQsXG4gICAgYXVkaXQ6IGF1ZGl0Q2xpZW50LFxuICAgIHpvbmVzOiB6b25lc0NsaWVudCxcbiAgICB3YWxsZXQ6IHdhbGxldENsaWVudCxcbiAgICBhdXRoOiBhdXRoTmFtZXNwYWNlLFxuICAgIGdldEFjY2Vzc1Rva2VuOiBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoIXRva2VuU291cmNlU3RhdGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IENvbmZpZ0Vycm9yKFxuICAgICAgICAgICdnZXRBY2Nlc3NUb2tlbjogbm8gYXV0aCBtb2RlIGNvbmZpZ3VyZWQuIFBhc3Mge3NlcnZpY2VJZCwgc2VydmljZVNlY3JldH0gfCB7YXV0aFRva2VufSB8IHtzZXNzaW9ufS4nLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc29sdmVBY2Nlc3NUb2tlbih0b2tlblNvdXJjZVN0YXRlKTtcbiAgICB9LFxuICB9O1xufVxuXG5jb25zdCBBVVRIX01PREVfRklFTERTID0gW1xuICAnc2VydmljZUlkJyxcbiAgJ3NlcnZpY2VTZWNyZXQnLFxuICAnc2NvcGUnLFxuICAnYXV0aFRva2VuJyxcbiAgJ3Nlc3Npb24nLFxuICAndG9rZW5zJyxcbl0gYXMgY29uc3Q7XG5cbi8qKlxuICogTWVyZ2UgZW52LWRlcml2ZWQgZGVmYXVsdHMgd2l0aCB0aGUgY2FsbGVyJ3MgZXhwbGljaXQgaW5wdXQuIEFueVxuICogZXhwbGljaXQgYXV0aC1tb2RlIGZpZWxkIHN1cHByZXNzZXMgKmFsbCogZW52LWRlcml2ZWQgYXV0aCBkZWZhdWx0cyxcbiAqIHNvIGFuIGV4cGxpY2l0IGB7YXV0aFRva2VufWAgb3ZlcnJpZGUgZG9lc24ndCBhY2NpZGVudGFsbHkgaW5oZXJpdFxuICogYHNlcnZpY2VJZGAvYHNlcnZpY2VTZWNyZXRgIGZyb20gZW52LiBOb24tYXV0aCBmaWVsZHMgZmFsbCB0aHJvdWdoXG4gKiBub3JtYWxseSAoY2FsbGVyIGBiYXNlVXJsYCBvdmVycmlkZXMgZW52IGJhc2VVcmw7IGFic2VudCBpbnB1dCBrZWVwc1xuICogZW52IGJhc2VVcmwpLlxuICovXG5mdW5jdGlvbiBtZXJnZVdpdGhFbnYoaW5wdXQ6IENsaWVudENvbmZpZyk6IENsaWVudENvbmZpZyB7XG4gIGNvbnN0IGVudiA9IHJlYWRFbnZEZWZhdWx0cygpO1xuICBjb25zdCBpbnB1dEhhc0F1dGggPSBpbnB1dEhhc0F1dGhNb2RlKGlucHV0KTtcbiAgY29uc3QgZW52Rm9yTWVyZ2UgPSBpbnB1dEhhc0F1dGggPyB3aXRob3V0QXV0aEZpZWxkcyhlbnYpIDogZW52O1xuXG4gIGNvbnN0IG1lcmdlZDogQ2xpZW50Q29uZmlnID0ge1xuICAgIGJhc2VVcmw6IGlucHV0LmJhc2VVcmwgPz8gZW52Rm9yTWVyZ2UuYmFzZVVybCxcbiAgICBhdXRoQmFzZVVybDogaW5wdXQuYXV0aEJhc2VVcmwgPz8gZW52Rm9yTWVyZ2UuYXV0aEJhc2VVcmwsXG4gICAgY3VzdG9tZXJBdXRoQmFzZVVybDogaW5wdXQuY3VzdG9tZXJBdXRoQmFzZVVybCA/PyBlbnZGb3JNZXJnZS5jdXN0b21lckF1dGhCYXNlVXJsLFxuICAgIHNlcnZpY2VJZDogaW5wdXQuc2VydmljZUlkID8/IGVudkZvck1lcmdlLnNlcnZpY2VJZCxcbiAgICBzZXJ2aWNlU2VjcmV0OiBpbnB1dC5zZXJ2aWNlU2VjcmV0ID8/IGVudkZvck1lcmdlLnNlcnZpY2VTZWNyZXQsXG4gICAgc2NvcGU6IGlucHV0LnNjb3BlID8/IGVudkZvck1lcmdlLnNjb3BlLFxuICAgIGF1dGhUb2tlbjogaW5wdXQuYXV0aFRva2VuID8/IGVudkZvck1lcmdlLmF1dGhUb2tlbixcbiAgICBzZXNzaW9uOiBpbnB1dC5zZXNzaW9uID8/IGVudkZvck1lcmdlLnNlc3Npb24sXG4gICAgdG9rZW5zOiBpbnB1dC50b2tlbnMsXG4gICAgYWN0b3JWaWE6IGlucHV0LmFjdG9yVmlhID8/IGVudkZvck1lcmdlLmFjdG9yVmlhLFxuICAgIGV4cGlyeUJ1ZmZlck1zOiBpbnB1dC5leHBpcnlCdWZmZXJNcyA/PyBlbnZGb3JNZXJnZS5leHBpcnlCdWZmZXJNcyxcbiAgICBmZXRjaEZuOiBpbnB1dC5mZXRjaEZuLFxuICB9O1xuICBhc3NlcnRFeGFjdGx5T25lQXV0aE1vZGUobWVyZ2VkKTtcbiAgcmV0dXJuIG1lcmdlZDtcbn1cblxuZnVuY3Rpb24gcmVhZEVudkRlZmF1bHRzKCk6IENsaWVudENvbmZpZyB7XG4gIGlmICh0eXBlb2YgcHJvY2VzcyA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybiB7fTtcbiAgY29uc3QgZSA9IChwcm9jZXNzIGFzIHsgZW52PzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB9KS5lbnYgPz8ge307XG4gIGNvbnN0IGV4cGlyeSA9IGUuVUVOR0FHRV9FWFBJUllfQlVGRkVSX01TID8gTnVtYmVyKGUuVUVOR0FHRV9FWFBJUllfQlVGRkVSX01TKSA6IHVuZGVmaW5lZDtcbiAgLy8gVUVOR0FHRV9TRVNTSU9OX0lEICsgVUVOR0FHRV9TRVNTSU9OX1RPS0VOIG11c3QgYmUgcGFpcmVkOyBlaXRoZXIgYWxvbmUgaXMgaWdub3JlZFxuICAvLyBzbyBhbiBlbnYtb25seSBzZXR1cCBuZXZlciBwcm9kdWNlcyBhIGhhbGYtY29uZmlndXJlZCBzZXNzaW9uLlxuICBjb25zdCBzZXNzaW9uID1cbiAgICBlLlVFTkdBR0VfU0VTU0lPTl9JRCAmJiBlLlVFTkdBR0VfU0VTU0lPTl9UT0tFTlxuICAgICAgPyB7IGlkOiBlLlVFTkdBR0VfU0VTU0lPTl9JRCwgdG9rZW46IGUuVUVOR0FHRV9TRVNTSU9OX1RPS0VOIH1cbiAgICAgIDogdW5kZWZpbmVkO1xuICByZXR1cm4ge1xuICAgIGJhc2VVcmw6IGUuVUVOR0FHRV9CQVNFX1VSTCxcbiAgICBhdXRoQmFzZVVybDogZS5VRU5HQUdFX0FVVEhfQkFTRV9VUkwsXG4gICAgY3VzdG9tZXJBdXRoQmFzZVVybDogZS5VRU5HQUdFX0NVU1RPTUVSX0FVVEhfQkFTRV9VUkwsXG4gICAgc2VydmljZUlkOiBlLlVFTkdBR0VfU0VSVklDRV9JRCxcbiAgICBzZXJ2aWNlU2VjcmV0OiBlLlVFTkdBR0VfU0VSVklDRV9TRUNSRVQsXG4gICAgc2NvcGU6IGUuVUVOR0FHRV9TQ09QRSxcbiAgICBhdXRoVG9rZW46IGUuVUVOR0FHRV9BVVRIX1RPS0VOLFxuICAgIHNlc3Npb24sXG4gICAgYWN0b3JWaWE6IGUuVUVOR0FHRV9BQ1RPUl9WSUEsXG4gICAgZXhwaXJ5QnVmZmVyTXM6IE51bWJlci5pc0Zpbml0ZShleHBpcnkpID8gKGV4cGlyeSBhcyBudW1iZXIpIDogdW5kZWZpbmVkLFxuICB9O1xufVxuXG5mdW5jdGlvbiBpbnB1dEhhc0F1dGhNb2RlKGlucHV0OiBDbGllbnRDb25maWcpOiBib29sZWFuIHtcbiAgcmV0dXJuIEFVVEhfTU9ERV9GSUVMRFMuc29tZSgoZikgPT4gaW5wdXRbZl0gIT09IHVuZGVmaW5lZCk7XG59XG5cbmZ1bmN0aW9uIHdpdGhvdXRBdXRoRmllbGRzKGM6IENsaWVudENvbmZpZyk6IENsaWVudENvbmZpZyB7XG4gIHJldHVybiB7XG4gICAgLi4uYyxcbiAgICBzZXJ2aWNlSWQ6IHVuZGVmaW5lZCxcbiAgICBzZXJ2aWNlU2VjcmV0OiB1bmRlZmluZWQsXG4gICAgc2NvcGU6IHVuZGVmaW5lZCxcbiAgICBhdXRoVG9rZW46IHVuZGVmaW5lZCxcbiAgICBzZXNzaW9uOiB1bmRlZmluZWQsXG4gICAgdG9rZW5zOiB1bmRlZmluZWQsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGFzc2VydEV4YWN0bHlPbmVBdXRoTW9kZShpbnB1dDogQ2xpZW50Q29uZmlnKTogdm9pZCB7XG4gIGNvbnN0IG1vZGVzOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAoaW5wdXQuYXV0aFRva2VuICE9PSB1bmRlZmluZWQpIG1vZGVzLnB1c2goJ2F1dGhUb2tlbicpO1xuICBpZiAoaW5wdXQuc2Vzc2lvbiAhPT0gdW5kZWZpbmVkKSBtb2Rlcy5wdXNoKCdzZXNzaW9uJyk7XG4gIGlmIChpbnB1dC50b2tlbnMgIT09IHVuZGVmaW5lZCkgbW9kZXMucHVzaCgndG9rZW5zJyk7XG4gIGlmIChpbnB1dC5zZXJ2aWNlSWQgIT09IHVuZGVmaW5lZCB8fCBpbnB1dC5zZXJ2aWNlU2VjcmV0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBtb2Rlcy5wdXNoKCdzZXJ2aWNlSWQrc2VydmljZVNlY3JldCcpO1xuICB9XG4gIGlmIChtb2Rlcy5sZW5ndGggPiAxKSB7XG4gICAgdGhyb3cgbmV3IENvbmZpZ0Vycm9yKFxuICAgICAgYGNyZWF0ZUNsaWVudDogcGljayBleGFjdGx5IG9uZSBhdXRoIG1vZGUuIEdvdCAke21vZGVzLmpvaW4oJywgJyl9LiBgICtcbiAgICAgICAgJ1VzZSBvbmUgb2Yge3NlcnZpY2VJZCwgc2VydmljZVNlY3JldH0gfCB7YXV0aFRva2VufSB8IHtzZXNzaW9ufSB8IHt0b2tlbnN9LicsXG4gICAgKTtcbiAgfVxuICAvLyBaZXJvIG1vZGVzIGlzIGFsbG93ZWQg4oCUIGNhbGxlciBtYXkgd2FudCBhIGZ1bGx5LWFub255bW91cyBjbGllbnQgZm9yXG4gIC8vIHB1YmxpYyBlbmRwb2ludHMuIFRoZSBmaXJzdCByZXF1ZXN0IHRoYXQgbmVlZHMgYXV0aCB3aWxsIHN1cmZhY2UgYVxuICAvLyBDb25maWdFcnJvciBkb3duc3RyZWFtLlxufVxuXG4vKipcbiAqIFByb2JlIHRoZSBidXNpbmVzcyBgbGVnYWN5X3Nlc3Npb25gIGdyYW50IGZpcnN0LCBmYWxsIGJhY2sgdG8gY3VzdG9tZXJcbiAqIG9uIGBpbnZhbGlkX2dyYW50YC4gRWl0aGVyIHN1cmZhY2UgbWludHMgYSBKV1Qg4oCUIHRoZSBTREsgZG9lc24ndCBjYXJlXG4gKiB3aGljaCBzaWRlIGFuc3dlcmVkLlxuICpcbiAqIFdoeSBwcm9iZSBib3RoOiBgaWRgIChudW1lcmljKSBvdmVybGFwcyB1c2Vycy51c2VySWQgdnNcbiAqIGFkZG9fY29udGFjdHNfbWFwcGluZy5pZC9jb250YWN0SWQuIENhbGxlcnMgdXN1YWxseSBkb24ndCBrbm93IHdoaWNoXG4gKiB0YWJsZSB0aGVpciAoaWQsIHRva2VuKSBwYWlyIGJlbG9uZ3MgdG8uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGV4Y2hhbmdlTGVnYWN5U2Vzc2lvbihcbiAgc2Vzc2lvbjogeyBpZDogc3RyaW5nIHwgbnVtYmVyOyB0b2tlbjogc3RyaW5nIH0sXG4gIGF1dGhCYXNlVXJsOiBzdHJpbmcsXG4gIGN1c3RvbWVyQXV0aEJhc2VVcmw6IHN0cmluZyxcbiAgZmV0Y2hGbjogdHlwZW9mIGZldGNoLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgYm9keSA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoe1xuICAgIGdyYW50X3R5cGU6ICdsZWdhY3lfc2Vzc2lvbicsXG4gICAgaWQ6IFN0cmluZyhzZXNzaW9uLmlkKSxcbiAgICB0b2tlbjogc2Vzc2lvbi50b2tlbixcbiAgfSkudG9TdHJpbmcoKTtcblxuICBjb25zdCBidXNpbmVzc1JlcyA9IGF3YWl0IGZldGNoRm4oYCR7YXV0aEJhc2VVcmx9L29hdXRoL3Rva2VuYCwge1xuICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgIGhlYWRlcnM6IHsgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnIH0sXG4gICAgYm9keSxcbiAgfSk7XG4gIGlmIChidXNpbmVzc1Jlcy5vaykge1xuICAgIHJldHVybiBwYXJzZUFjY2Vzc1Rva2VuKGJ1c2luZXNzUmVzKTtcbiAgfVxuICBpZiAoYXdhaXQgaXNJbnZhbGlkR3JhbnQoYnVzaW5lc3NSZXMpKSB7XG4gICAgY29uc3QgY3VzdG9tZXJSZXMgPSBhd2FpdCBmZXRjaEZuKGAke2N1c3RvbWVyQXV0aEJhc2VVcmx9L29hdXRoL3Rva2VuYCwge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyB9LFxuICAgICAgYm9keSxcbiAgICB9KTtcbiAgICBpZiAoY3VzdG9tZXJSZXMub2spIHtcbiAgICAgIHJldHVybiBwYXJzZUFjY2Vzc1Rva2VuKGN1c3RvbWVyUmVzKTtcbiAgICB9XG4gICAgY29uc3QgdGV4dCA9IGF3YWl0IGN1c3RvbWVyUmVzLnRleHQoKS5jYXRjaCgoKSA9PiAnJyk7XG4gICAgdGhyb3cgbmV3IEF1dGhlbnRpY2F0aW9uRXJyb3IoXG4gICAgICBgbGVnYWN5X3Nlc3Npb24gZXhjaGFuZ2UgZmFpbGVkIG9uIGJvdGggc3VyZmFjZXM6IGN1c3RvbWVyIEhUVFAgJHtjdXN0b21lclJlcy5zdGF0dXN9ICR7dGV4dH1gLFxuICAgICk7XG4gIH1cbiAgY29uc3QgdGV4dCA9IGF3YWl0IGJ1c2luZXNzUmVzLnRleHQoKS5jYXRjaCgoKSA9PiAnJyk7XG4gIHRocm93IG5ldyBBdXRoZW50aWNhdGlvbkVycm9yKFxuICAgIGBsZWdhY3lfc2Vzc2lvbiBleGNoYW5nZSBmYWlsZWQ6IEhUVFAgJHtidXNpbmVzc1Jlcy5zdGF0dXN9ICR7dGV4dH1gLFxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBpc0ludmFsaWRHcmFudChyZXM6IFJlc3BvbnNlKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGlmIChyZXMuc3RhdHVzICE9PSA0MDApIHJldHVybiBmYWxzZTtcbiAgY29uc3QgY2xvbmVkID0gcmVzLmNsb25lKCk7XG4gIGNvbnN0IGpzb24gPSAoYXdhaXQgY2xvbmVkLmpzb24oKS5jYXRjaCgoKSA9PiAoe30pKSkgYXMgeyBlcnJvcj86IHN0cmluZyB9O1xuICByZXR1cm4ganNvbi5lcnJvciA9PT0gJ2ludmFsaWRfZ3JhbnQnO1xufVxuXG5hc3luYyBmdW5jdGlvbiBwYXJzZUFjY2Vzc1Rva2VuKHJlczogUmVzcG9uc2UpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBqc29uID0gKGF3YWl0IHJlcy5qc29uKCkpIGFzIHsgYWNjZXNzX3Rva2VuPzogc3RyaW5nIH07XG4gIGlmICghanNvbi5hY2Nlc3NfdG9rZW4pIHtcbiAgICB0aHJvdyBuZXcgQ29uZmlnRXJyb3IoJ2xlZ2FjeV9zZXNzaW9uIGV4Y2hhbmdlIHJlc3BvbnNlIG1pc3NpbmcgYWNjZXNzX3Rva2VuJyk7XG4gIH1cbiAgcmV0dXJuIGpzb24uYWNjZXNzX3Rva2VuO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlVG9rZW5Tb3VyY2UoaW5wdXQ6IENsaWVudENvbmZpZywgYmFzZVVybDogc3RyaW5nKTogVG9rZW5Tb3VyY2VTdGF0ZSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGF1dGhCYXNlVXJsID0gaW5wdXQuYXV0aEJhc2VVcmwgPz8gYCR7YmFzZVVybH0vYXV0aC9idXNpbmVzc2A7XG4gIGNvbnN0IGZldGNoRm4gPSBpbnB1dC5mZXRjaEZuID8/IChnbG9iYWxUaGlzLmZldGNoIGFzIHR5cGVvZiBmZXRjaCk7XG5cbiAgaWYgKGlucHV0LmF1dGhUb2tlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHR5cGVvZiBpbnB1dC5hdXRoVG9rZW4gPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gbWFrZVRva2VuU291cmNlU3RhdGUoXG4gICAgICAgIHsga2luZDogJ3N0YXRpYy1zdHJpbmcnLCB0b2tlbjogaW5wdXQuYXV0aFRva2VuIH0sXG4gICAgICAgIHsgZXhwaXJ5QnVmZmVyTXM6IGlucHV0LmV4cGlyeUJ1ZmZlck1zLCBmZXRjaEZuOiBpbnB1dC5mZXRjaEZuIH0sXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gbWFrZVRva2VuU291cmNlU3RhdGUoXG4gICAgICB7IGtpbmQ6ICdjYWxsYmFjaycsIGdldFRva2VuOiBpbnB1dC5hdXRoVG9rZW4gfSxcbiAgICAgIHsgZXhwaXJ5QnVmZmVyTXM6IGlucHV0LmV4cGlyeUJ1ZmZlck1zLCBmZXRjaEZuOiBpbnB1dC5mZXRjaEZuIH0sXG4gICAgKTtcbiAgfVxuICBpZiAoaW5wdXQuc2Vzc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgY3VzdG9tZXJBdXRoQmFzZVVybCA9IGlucHV0LmN1c3RvbWVyQXV0aEJhc2VVcmwgPz8gYCR7YmFzZVVybH0vYXV0aC9jdXN0b21lcmA7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IGlucHV0LnNlc3Npb247XG4gICAgcmV0dXJuIG1ha2VUb2tlblNvdXJjZVN0YXRlKFxuICAgICAge1xuICAgICAgICBraW5kOiAnY2FsbGJhY2snLFxuICAgICAgICBnZXRUb2tlbjogKCkgPT4gZXhjaGFuZ2VMZWdhY3lTZXNzaW9uKHNlc3Npb24sIGF1dGhCYXNlVXJsLCBjdXN0b21lckF1dGhCYXNlVXJsLCBmZXRjaEZuKSxcbiAgICAgIH0sXG4gICAgICB7IGV4cGlyeUJ1ZmZlck1zOiBpbnB1dC5leHBpcnlCdWZmZXJNcywgZmV0Y2hGbjogaW5wdXQuZmV0Y2hGbiB9LFxuICAgICk7XG4gIH1cbiAgaWYgKGlucHV0LnNlcnZpY2VJZCAmJiBpbnB1dC5zZXJ2aWNlU2VjcmV0KSB7XG4gICAgcmV0dXJuIG1ha2VUb2tlblNvdXJjZVN0YXRlKFxuICAgICAge1xuICAgICAgICBraW5kOiAnc2VydmljZS1jcmVkZW50aWFscycsXG4gICAgICAgIGNsaWVudElkOiBpbnB1dC5zZXJ2aWNlSWQsXG4gICAgICAgIGNsaWVudFNlY3JldDogaW5wdXQuc2VydmljZVNlY3JldCxcbiAgICAgICAgYXV0aEJhc2VVcmwsXG4gICAgICAgIHNjb3BlOiBpbnB1dC5zY29wZSxcbiAgICAgIH0sXG4gICAgICB7IGV4cGlyeUJ1ZmZlck1zOiBpbnB1dC5leHBpcnlCdWZmZXJNcywgZmV0Y2hGbjogaW5wdXQuZmV0Y2hGbiB9LFxuICAgICk7XG4gIH1cbiAgaWYgKGlucHV0LnRva2Vucykge1xuICAgIHJldHVybiBtYWtlVG9rZW5Tb3VyY2VTdGF0ZShcbiAgICAgIHtcbiAgICAgICAga2luZDogJ2FjY2Vzcy1yZWZyZXNoLXBhaXInLFxuICAgICAgICBhY2Nlc3NUb2tlbjogaW5wdXQudG9rZW5zLmFjY2Vzc1Rva2VuLFxuICAgICAgICByZWZyZXNoVG9rZW46IGlucHV0LnRva2Vucy5yZWZyZXNoVG9rZW4sXG4gICAgICAgIGV4cGlyZXNBdDogRGF0ZS5ub3coKSArIGlucHV0LnRva2Vucy5leHBpcmVzSW4gKiAxMDAwLFxuICAgICAgICBjbGllbnRJZDogaW5wdXQudG9rZW5zLmNsaWVudElkLFxuICAgICAgICBvblJvdGF0ZTogaW5wdXQudG9rZW5zLm9uUm90YXRlLFxuICAgICAgfSxcbiAgICAgIHsgZXhwaXJ5QnVmZmVyTXM6IGlucHV0LmV4cGlyeUJ1ZmZlck1zLCBmZXRjaEZuOiBpbnB1dC5mZXRjaEZuIH0sXG4gICAgKTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiB3YXJuSWZCcm93c2VyU2VjcmV0KGNvbmZpZzogQ2xpZW50Q29uZmlnKTogdm9pZCB7XG4gIGNvbnN0IGcgPSBnbG9iYWxUaGlzIGFzIHsgd2luZG93PzogeyBkb2N1bWVudD86IHVua25vd24gfSB9O1xuICBjb25zdCBpbkJyb3dzZXIgPSB0eXBlb2YgZy53aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBnLndpbmRvdy5kb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCc7XG4gIGlmICghaW5Ccm93c2VyKSByZXR1cm47XG4gIGlmIChjb25maWcuc2VydmljZVNlY3JldCkge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgICdbdWVuZ2FnZS1wbGF0Zm9ybS1zZGtdIHNlcnZpY2VTZWNyZXQgc2hvdWxkIG5vdCBiZSB1c2VkIGluIGJyb3dzZXIgZW52aXJvbm1lbnRzLiAnICtcbiAgICAgICAgJ1NlcnZpY2UgY3JlZGVudGlhbHMgaW4gYnJvd3NlciBidW5kbGVzIGFyZSBwdWJsaWNseSB2aXNpYmxlLiAnICtcbiAgICAgICAgJ1VzZSBgYXV0aFRva2VuYCAoYSBCZWFyZXIgb2J0YWluZWQgdmlhIE9BdXRoKSBvciBgc2Vzc2lvblRva2VuYCBpbnN0ZWFkLicsXG4gICAgKTtcbiAgfVxufVxuIl19
package/dist/http.d.ts CHANGED
@@ -22,3 +22,25 @@ export interface SignedHeaderParams {
22
22
  * and refreshes on expiry / 401
23
23
  */
24
24
  export declare function buildHeaders(config: PlatformConfig, params: SignedHeaderParams): Promise<Record<string, string>>;
25
+ export interface SendRequestParams {
26
+ method: string;
27
+ /** URL pathname only, without query string. Must match `c.req.path` server-side. */
28
+ path: string;
29
+ /** Fully-qualified URL the fetch is sent to (base + path + querystring). */
30
+ url: string;
31
+ /** Raw JSON body string, or undefined for none. */
32
+ body?: string;
33
+ }
34
+ /**
35
+ * Send a request with the SDK's standard 401-retry-once behaviour.
36
+ *
37
+ * Only retries when auth is `token-source`, since that's the case
38
+ * where the cached token may have expired server-side. HMAC and
39
+ * static bearer 401s mean the auth is misconfigured and a retry
40
+ * would just fail again. Bubble the response so the caller surfaces it.
41
+ *
42
+ * Shared by every namespace client (business, audit, zones, ...) so
43
+ * the retry semantics are uniform. Lifted out of `business/client.ts`
44
+ * with no behaviour change.
45
+ */
46
+ export declare function sendWithAuthRetry(config: PlatformConfig, params: SendRequestParams): Promise<Response>;
package/dist/http.js CHANGED
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.buildHeaders = buildHeaders;
4
+ exports.sendWithAuthRetry = sendWithAuthRetry;
4
5
  const node_crypto_1 = require("node:crypto");
5
6
  const token_source_1 = require("./token-source");
6
7
  const version_1 = require("./version");
@@ -40,4 +41,41 @@ async function buildHeaders(config, params) {
40
41
  headers['authorization'] = `Bearer ${token}`;
41
42
  return headers;
42
43
  }
43
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9odHRwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBOEJBLG9DQXVCQztBQXJERCw2Q0FBeUM7QUFFekMsaURBQWdEO0FBQ2hELHVDQUF3QztBQVV4QyxNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztBQUVyRTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNJLEtBQUssVUFBVSxZQUFZLENBQ2hDLE1BQXNCLEVBQ3RCLE1BQTBCO0lBRTFCLE1BQU0sT0FBTyxHQUEyQjtRQUN0QyxZQUFZLEVBQUUsd0JBQXdCLHFCQUFXLEVBQUU7S0FDcEQsQ0FBQztJQUNGLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxTQUFTO1FBQUUsT0FBTyxDQUFDLGNBQWMsQ0FBQyxHQUFHLGtCQUFrQixDQUFDO0lBQzVFLElBQUksZ0JBQWdCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ3RELE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLElBQUEsd0JBQVUsR0FBRSxDQUFDO0lBQzVDLENBQUM7SUFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUk7UUFBRSxPQUFPLE9BQU8sQ0FBQztJQUVqQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ2xDLE9BQU8sQ0FBQyxlQUFlLENBQUMsR0FBRyxVQUFVLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDekQsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVELHVFQUF1RTtJQUN2RSxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUEsNkJBQWMsRUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RELE9BQU8sQ0FBQyxlQUFlLENBQUMsR0FBRyxVQUFVLEtBQUssRUFBRSxDQUFDO0lBQzdDLE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHR5cGUgeyBQbGF0Zm9ybUNvbmZpZyB9IGZyb20gJy4vY29uZmlnJztcbmltcG9ydCB7IGdldEFjY2Vzc1Rva2VuIH0gZnJvbSAnLi90b2tlbi1zb3VyY2UnO1xuaW1wb3J0IHsgU0RLX1ZFUlNJT04gfSBmcm9tICcuL3ZlcnNpb24nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25lZEhlYWRlclBhcmFtcyB7XG4gIG1ldGhvZDogc3RyaW5nO1xuICAvKiogVVJMIHBhdGhuYW1lIG9ubHksIHdpdGhvdXQgcXVlcnkgc3RyaW5nLiBNdXN0IG1hdGNoIGBjLnJlcS5wYXRoYCBzZXJ2ZXItc2lkZS4gKi9cbiAgcGF0aDogc3RyaW5nO1xuICAvKiogUmF3IEpTT04gYm9keSBzdHJpbmcsIG9yIGVtcHR5IGZvciBub25lLiAqL1xuICBib2R5Pzogc3RyaW5nO1xufVxuXG5jb25zdCBNVVRBVElOR19NRVRIT0RTID0gbmV3IFNldChbJ1BPU1QnLCAnUFVUJywgJ1BBVENIJywgJ0RFTEVURSddKTtcblxuLyoqXG4gKiBCdWlsZCB0aGUgaGVhZGVycyBmb3IgYSByZXF1ZXN0IHRvIHRoZSBwbGF0Zm9ybSBBUEkuXG4gKlxuICogQWRkcyB0aHJlZSBwbGF0Zm9ybS13aWRlIGhlYWRlcnMgYXV0b21hdGljYWxseTpcbiAqICAgLSBgVXNlci1BZ2VudGAgc28gdGhlIGdhdGV3YXkgY2FuIGF0dHJpYnV0ZSB0cmFmZmljIHRvIFNESyB2ZXJzaW9uXG4gKiAgIC0gYElkZW1wb3RlbmN5LUtleWAgKFVVSUQgdjQpIG9uIG11dGF0aW5nIG1ldGhvZHMsIHNvIGNhbGxlcnMgZG9uJ3RcbiAqICAgICBoYXZlIHRvIGdlbmVyYXRlIG9uZSBwZXIgY2FsbFxuICogICAtIGBjb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25gIHdoZW4gYSBib2R5IGlzIHN1cHBsaWVkXG4gKlxuICogQXV0aCBjb21lcyBmcm9tIGBjb25maWcuYXV0aGA6XG4gKiAgIC0gYGJlYXJlcmA6IHRoZSB0b2tlbiBpcyBzZW50IHZlcmJhdGltIChjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yXG4gKiAgICAgZnJlc2huZXNzOyBTREsgdGhyb3dzIFRva2VuRXhwaXJlZEVycm9yIG9uIGxvY2FsLWRldGVjdGVkIGV4cGlyeSlcbiAqICAgLSBgdG9rZW4tc291cmNlYDogU0RLIG1pbnRzICsgY2FjaGVzIHZpYSBPQXV0aDIgY2xpZW50X2NyZWRlbnRpYWxzXG4gKiAgICAgYW5kIHJlZnJlc2hlcyBvbiBleHBpcnkgLyA0MDFcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkSGVhZGVycyhcbiAgY29uZmlnOiBQbGF0Zm9ybUNvbmZpZyxcbiAgcGFyYW1zOiBTaWduZWRIZWFkZXJQYXJhbXMsXG4pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAndXNlci1hZ2VudCc6IGB1ZW5nYWdlLXBsYXRmb3JtLXNkay8ke1NES19WRVJTSU9OfWAsXG4gIH07XG4gIGlmIChwYXJhbXMuYm9keSAhPT0gdW5kZWZpbmVkKSBoZWFkZXJzWydjb250ZW50LXR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcbiAgaWYgKE1VVEFUSU5HX01FVEhPRFMuaGFzKHBhcmFtcy5tZXRob2QudG9VcHBlckNhc2UoKSkpIHtcbiAgICBoZWFkZXJzWydpZGVtcG90ZW5jeS1rZXknXSA9IHJhbmRvbVVVSUQoKTtcbiAgfVxuXG4gIGlmICghY29uZmlnLmF1dGgpIHJldHVybiBoZWFkZXJzO1xuXG4gIGlmIChjb25maWcuYXV0aC50eXBlID09PSAnYmVhcmVyJykge1xuICAgIGhlYWRlcnNbJ2F1dGhvcml6YXRpb24nXSA9IGBCZWFyZXIgJHtjb25maWcuYXV0aC50b2tlbn1gO1xuICAgIHJldHVybiBoZWFkZXJzO1xuICB9XG5cbiAgLy8gdG9rZW4tc291cmNlOiBtaW50ICsgY2FjaGUgKyByZWZyZXNoLWRlZHVwIGhhcHBlbnMgaW4gZ2V0QWNjZXNzVG9rZW5cbiAgY29uc3QgdG9rZW4gPSBhd2FpdCBnZXRBY2Nlc3NUb2tlbihjb25maWcuYXV0aC5zdGF0ZSk7XG4gIGhlYWRlcnNbJ2F1dGhvcml6YXRpb24nXSA9IGBCZWFyZXIgJHt0b2tlbn1gO1xuICByZXR1cm4gaGVhZGVycztcbn1cbiJdfQ==
44
+ /**
45
+ * Send a request with the SDK's standard 401-retry-once behaviour.
46
+ *
47
+ * Only retries when auth is `token-source`, since that's the case
48
+ * where the cached token may have expired server-side. HMAC and
49
+ * static bearer 401s mean the auth is misconfigured and a retry
50
+ * would just fail again. Bubble the response so the caller surfaces it.
51
+ *
52
+ * Shared by every namespace client (business, audit, zones, ...) so
53
+ * the retry semantics are uniform. Lifted out of `business/client.ts`
54
+ * with no behaviour change.
55
+ */
56
+ async function sendWithAuthRetry(config, params) {
57
+ const headers = await buildHeaders(config, {
58
+ method: params.method,
59
+ path: params.path,
60
+ body: params.body,
61
+ });
62
+ const res = await config.fetchFn(params.url, {
63
+ method: params.method,
64
+ headers,
65
+ body: params.body,
66
+ });
67
+ if (res.status !== 401 || config.auth?.type !== 'token-source')
68
+ return res;
69
+ (0, token_source_1.invalidateToken)(config.auth.state);
70
+ const retryHeaders = await buildHeaders(config, {
71
+ method: params.method,
72
+ path: params.path,
73
+ body: params.body,
74
+ });
75
+ return config.fetchFn(params.url, {
76
+ method: params.method,
77
+ headers: retryHeaders,
78
+ body: params.body,
79
+ });
80
+ }
81
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9odHRwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBOEJBLG9DQXVCQztBQXdCRCw4Q0EwQkM7QUF2R0QsNkNBQXlDO0FBRXpDLGlEQUFpRTtBQUNqRSx1Q0FBd0M7QUFVeEMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7QUFFckU7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSSxLQUFLLFVBQVUsWUFBWSxDQUNoQyxNQUFzQixFQUN0QixNQUEwQjtJQUUxQixNQUFNLE9BQU8sR0FBMkI7UUFDdEMsWUFBWSxFQUFFLHdCQUF3QixxQkFBVyxFQUFFO0tBQ3BELENBQUM7SUFDRixJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssU0FBUztRQUFFLE9BQU8sQ0FBQyxjQUFjLENBQUMsR0FBRyxrQkFBa0IsQ0FBQztJQUM1RSxJQUFJLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUN0RCxPQUFPLENBQUMsaUJBQWlCLENBQUMsR0FBRyxJQUFBLHdCQUFVLEdBQUUsQ0FBQztJQUM1QyxDQUFDO0lBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJO1FBQUUsT0FBTyxPQUFPLENBQUM7SUFFakMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNsQyxPQUFPLENBQUMsZUFBZSxDQUFDLEdBQUcsVUFBVSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3pELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRCx1RUFBdUU7SUFDdkUsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFBLDZCQUFjLEVBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0RCxPQUFPLENBQUMsZUFBZSxDQUFDLEdBQUcsVUFBVSxLQUFLLEVBQUUsQ0FBQztJQUM3QyxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDO0FBWUQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSSxLQUFLLFVBQVUsaUJBQWlCLENBQ3JDLE1BQXNCLEVBQ3RCLE1BQXlCO0lBRXpCLE1BQU0sT0FBTyxHQUFHLE1BQU0sWUFBWSxDQUFDLE1BQU0sRUFBRTtRQUN6QyxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07UUFDckIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO1FBQ2pCLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtLQUNsQixDQUFDLENBQUM7SUFDSCxNQUFNLEdBQUcsR0FBRyxNQUFNLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRTtRQUMzQyxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07UUFDckIsT0FBTztRQUNQLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtLQUNsQixDQUFDLENBQUM7SUFDSCxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxLQUFLLGNBQWM7UUFBRSxPQUFPLEdBQUcsQ0FBQztJQUMzRSxJQUFBLDhCQUFlLEVBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuQyxNQUFNLFlBQVksR0FBRyxNQUFNLFlBQVksQ0FBQyxNQUFNLEVBQUU7UUFDOUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO1FBQ3JCLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtRQUNqQixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7S0FDbEIsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7UUFDaEMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO1FBQ3JCLE9BQU8sRUFBRSxZQUFZO1FBQ3JCLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtLQUNsQixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmFuZG9tVVVJRCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB0eXBlIHsgUGxhdGZvcm1Db25maWcgfSBmcm9tICcuL2NvbmZpZyc7XG5pbXBvcnQgeyBnZXRBY2Nlc3NUb2tlbiwgaW52YWxpZGF0ZVRva2VuIH0gZnJvbSAnLi90b2tlbi1zb3VyY2UnO1xuaW1wb3J0IHsgU0RLX1ZFUlNJT04gfSBmcm9tICcuL3ZlcnNpb24nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25lZEhlYWRlclBhcmFtcyB7XG4gIG1ldGhvZDogc3RyaW5nO1xuICAvKiogVVJMIHBhdGhuYW1lIG9ubHksIHdpdGhvdXQgcXVlcnkgc3RyaW5nLiBNdXN0IG1hdGNoIGBjLnJlcS5wYXRoYCBzZXJ2ZXItc2lkZS4gKi9cbiAgcGF0aDogc3RyaW5nO1xuICAvKiogUmF3IEpTT04gYm9keSBzdHJpbmcsIG9yIGVtcHR5IGZvciBub25lLiAqL1xuICBib2R5Pzogc3RyaW5nO1xufVxuXG5jb25zdCBNVVRBVElOR19NRVRIT0RTID0gbmV3IFNldChbJ1BPU1QnLCAnUFVUJywgJ1BBVENIJywgJ0RFTEVURSddKTtcblxuLyoqXG4gKiBCdWlsZCB0aGUgaGVhZGVycyBmb3IgYSByZXF1ZXN0IHRvIHRoZSBwbGF0Zm9ybSBBUEkuXG4gKlxuICogQWRkcyB0aHJlZSBwbGF0Zm9ybS13aWRlIGhlYWRlcnMgYXV0b21hdGljYWxseTpcbiAqICAgLSBgVXNlci1BZ2VudGAgc28gdGhlIGdhdGV3YXkgY2FuIGF0dHJpYnV0ZSB0cmFmZmljIHRvIFNESyB2ZXJzaW9uXG4gKiAgIC0gYElkZW1wb3RlbmN5LUtleWAgKFVVSUQgdjQpIG9uIG11dGF0aW5nIG1ldGhvZHMsIHNvIGNhbGxlcnMgZG9uJ3RcbiAqICAgICBoYXZlIHRvIGdlbmVyYXRlIG9uZSBwZXIgY2FsbFxuICogICAtIGBjb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25gIHdoZW4gYSBib2R5IGlzIHN1cHBsaWVkXG4gKlxuICogQXV0aCBjb21lcyBmcm9tIGBjb25maWcuYXV0aGA6XG4gKiAgIC0gYGJlYXJlcmA6IHRoZSB0b2tlbiBpcyBzZW50IHZlcmJhdGltIChjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yXG4gKiAgICAgZnJlc2huZXNzOyBTREsgdGhyb3dzIFRva2VuRXhwaXJlZEVycm9yIG9uIGxvY2FsLWRldGVjdGVkIGV4cGlyeSlcbiAqICAgLSBgdG9rZW4tc291cmNlYDogU0RLIG1pbnRzICsgY2FjaGVzIHZpYSBPQXV0aDIgY2xpZW50X2NyZWRlbnRpYWxzXG4gKiAgICAgYW5kIHJlZnJlc2hlcyBvbiBleHBpcnkgLyA0MDFcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkSGVhZGVycyhcbiAgY29uZmlnOiBQbGF0Zm9ybUNvbmZpZyxcbiAgcGFyYW1zOiBTaWduZWRIZWFkZXJQYXJhbXMsXG4pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAndXNlci1hZ2VudCc6IGB1ZW5nYWdlLXBsYXRmb3JtLXNkay8ke1NES19WRVJTSU9OfWAsXG4gIH07XG4gIGlmIChwYXJhbXMuYm9keSAhPT0gdW5kZWZpbmVkKSBoZWFkZXJzWydjb250ZW50LXR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcbiAgaWYgKE1VVEFUSU5HX01FVEhPRFMuaGFzKHBhcmFtcy5tZXRob2QudG9VcHBlckNhc2UoKSkpIHtcbiAgICBoZWFkZXJzWydpZGVtcG90ZW5jeS1rZXknXSA9IHJhbmRvbVVVSUQoKTtcbiAgfVxuXG4gIGlmICghY29uZmlnLmF1dGgpIHJldHVybiBoZWFkZXJzO1xuXG4gIGlmIChjb25maWcuYXV0aC50eXBlID09PSAnYmVhcmVyJykge1xuICAgIGhlYWRlcnNbJ2F1dGhvcml6YXRpb24nXSA9IGBCZWFyZXIgJHtjb25maWcuYXV0aC50b2tlbn1gO1xuICAgIHJldHVybiBoZWFkZXJzO1xuICB9XG5cbiAgLy8gdG9rZW4tc291cmNlOiBtaW50ICsgY2FjaGUgKyByZWZyZXNoLWRlZHVwIGhhcHBlbnMgaW4gZ2V0QWNjZXNzVG9rZW5cbiAgY29uc3QgdG9rZW4gPSBhd2FpdCBnZXRBY2Nlc3NUb2tlbihjb25maWcuYXV0aC5zdGF0ZSk7XG4gIGhlYWRlcnNbJ2F1dGhvcml6YXRpb24nXSA9IGBCZWFyZXIgJHt0b2tlbn1gO1xuICByZXR1cm4gaGVhZGVycztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZW5kUmVxdWVzdFBhcmFtcyB7XG4gIG1ldGhvZDogc3RyaW5nO1xuICAvKiogVVJMIHBhdGhuYW1lIG9ubHksIHdpdGhvdXQgcXVlcnkgc3RyaW5nLiBNdXN0IG1hdGNoIGBjLnJlcS5wYXRoYCBzZXJ2ZXItc2lkZS4gKi9cbiAgcGF0aDogc3RyaW5nO1xuICAvKiogRnVsbHktcXVhbGlmaWVkIFVSTCB0aGUgZmV0Y2ggaXMgc2VudCB0byAoYmFzZSArIHBhdGggKyBxdWVyeXN0cmluZykuICovXG4gIHVybDogc3RyaW5nO1xuICAvKiogUmF3IEpTT04gYm9keSBzdHJpbmcsIG9yIHVuZGVmaW5lZCBmb3Igbm9uZS4gKi9cbiAgYm9keT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBTZW5kIGEgcmVxdWVzdCB3aXRoIHRoZSBTREsncyBzdGFuZGFyZCA0MDEtcmV0cnktb25jZSBiZWhhdmlvdXIuXG4gKlxuICogT25seSByZXRyaWVzIHdoZW4gYXV0aCBpcyBgdG9rZW4tc291cmNlYCwgc2luY2UgdGhhdCdzIHRoZSBjYXNlXG4gKiB3aGVyZSB0aGUgY2FjaGVkIHRva2VuIG1heSBoYXZlIGV4cGlyZWQgc2VydmVyLXNpZGUuIEhNQUMgYW5kXG4gKiBzdGF0aWMgYmVhcmVyIDQwMXMgbWVhbiB0aGUgYXV0aCBpcyBtaXNjb25maWd1cmVkIGFuZCBhIHJldHJ5XG4gKiB3b3VsZCBqdXN0IGZhaWwgYWdhaW4uIEJ1YmJsZSB0aGUgcmVzcG9uc2Ugc28gdGhlIGNhbGxlciBzdXJmYWNlcyBpdC5cbiAqXG4gKiBTaGFyZWQgYnkgZXZlcnkgbmFtZXNwYWNlIGNsaWVudCAoYnVzaW5lc3MsIGF1ZGl0LCB6b25lcywgLi4uKSBzb1xuICogdGhlIHJldHJ5IHNlbWFudGljcyBhcmUgdW5pZm9ybS4gTGlmdGVkIG91dCBvZiBgYnVzaW5lc3MvY2xpZW50LnRzYFxuICogd2l0aCBubyBiZWhhdmlvdXIgY2hhbmdlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VuZFdpdGhBdXRoUmV0cnkoXG4gIGNvbmZpZzogUGxhdGZvcm1Db25maWcsXG4gIHBhcmFtczogU2VuZFJlcXVlc3RQYXJhbXMsXG4pOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gIGNvbnN0IGhlYWRlcnMgPSBhd2FpdCBidWlsZEhlYWRlcnMoY29uZmlnLCB7XG4gICAgbWV0aG9kOiBwYXJhbXMubWV0aG9kLFxuICAgIHBhdGg6IHBhcmFtcy5wYXRoLFxuICAgIGJvZHk6IHBhcmFtcy5ib2R5LFxuICB9KTtcbiAgY29uc3QgcmVzID0gYXdhaXQgY29uZmlnLmZldGNoRm4ocGFyYW1zLnVybCwge1xuICAgIG1ldGhvZDogcGFyYW1zLm1ldGhvZCxcbiAgICBoZWFkZXJzLFxuICAgIGJvZHk6IHBhcmFtcy5ib2R5LFxuICB9KTtcbiAgaWYgKHJlcy5zdGF0dXMgIT09IDQwMSB8fCBjb25maWcuYXV0aD8udHlwZSAhPT0gJ3Rva2VuLXNvdXJjZScpIHJldHVybiByZXM7XG4gIGludmFsaWRhdGVUb2tlbihjb25maWcuYXV0aC5zdGF0ZSk7XG4gIGNvbnN0IHJldHJ5SGVhZGVycyA9IGF3YWl0IGJ1aWxkSGVhZGVycyhjb25maWcsIHtcbiAgICBtZXRob2Q6IHBhcmFtcy5tZXRob2QsXG4gICAgcGF0aDogcGFyYW1zLnBhdGgsXG4gICAgYm9keTogcGFyYW1zLmJvZHksXG4gIH0pO1xuICByZXR1cm4gY29uZmlnLmZldGNoRm4ocGFyYW1zLnVybCwge1xuICAgIG1ldGhvZDogcGFyYW1zLm1ldGhvZCxcbiAgICBoZWFkZXJzOiByZXRyeUhlYWRlcnMsXG4gICAgYm9keTogcGFyYW1zLmJvZHksXG4gIH0pO1xufVxuIl19
package/dist/index.d.ts CHANGED
@@ -1,5 +1,7 @@
1
1
  export * from './audit';
2
2
  export * from './business';
3
+ export * from './zones';
4
+ export * from './wallet';
3
5
  export * from './errors';
4
6
  export { auth } from './auth';
5
7
  export type { PkcePair, AuthorizeUrlInput, ExchangeCodeInput, RefreshInput, TokenPair, } from './auth';
package/dist/index.js CHANGED
@@ -17,6 +17,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
17
17
  exports.createClient = exports.DEFAULT_BASE_URL = exports.auth = void 0;
18
18
  __exportStar(require("./audit"), exports);
19
19
  __exportStar(require("./business"), exports);
20
+ __exportStar(require("./zones"), exports);
21
+ __exportStar(require("./wallet"), exports);
20
22
  __exportStar(require("./errors"), exports);
21
23
  var auth_1 = require("./auth");
22
24
  Object.defineProperty(exports, "auth", { enumerable: true, get: function () { return auth_1.auth; } });
@@ -24,4 +26,4 @@ var config_1 = require("./config");
24
26
  Object.defineProperty(exports, "DEFAULT_BASE_URL", { enumerable: true, get: function () { return config_1.DEFAULT_BASE_URL; } });
25
27
  var client_1 = require("./client");
26
28
  Object.defineProperty(exports, "createClient", { enumerable: true, get: function () { return client_1.createClient; } });
27
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwwQ0FBd0I7QUFDeEIsNkNBQTJCO0FBQzNCLDJDQUF5QjtBQUN6QiwrQkFBOEI7QUFBckIsNEZBQUEsSUFBSSxPQUFBO0FBUWIsbUNBTWtCO0FBRGhCLDBHQUFBLGdCQUFnQixPQUFBO0FBRWxCLG1DQUFnRjtBQUF2RSxzR0FBQSxZQUFZLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2F1ZGl0JztcbmV4cG9ydCAqIGZyb20gJy4vYnVzaW5lc3MnO1xuZXhwb3J0ICogZnJvbSAnLi9lcnJvcnMnO1xuZXhwb3J0IHsgYXV0aCB9IGZyb20gJy4vYXV0aCc7XG5leHBvcnQgdHlwZSB7XG4gIFBrY2VQYWlyLFxuICBBdXRob3JpemVVcmxJbnB1dCxcbiAgRXhjaGFuZ2VDb2RlSW5wdXQsXG4gIFJlZnJlc2hJbnB1dCxcbiAgVG9rZW5QYWlyLFxufSBmcm9tICcuL2F1dGgnO1xuZXhwb3J0IHtcbiAgdHlwZSBQbGF0Zm9ybUF1dGgsXG4gIHR5cGUgUGxhdGZvcm1BdXRoSW5wdXQsXG4gIHR5cGUgUGxhdGZvcm1Db25maWcsXG4gIHR5cGUgUGxhdGZvcm1Db25maWdJbnB1dCxcbiAgREVGQVVMVF9CQVNFX1VSTCxcbn0gZnJvbSAnLi9jb25maWcnO1xuZXhwb3J0IHsgY3JlYXRlQ2xpZW50LCB0eXBlIENsaWVudENvbmZpZywgdHlwZSBQbGF0Zm9ybUNsaWVudCB9IGZyb20gJy4vY2xpZW50JztcbiJdfQ==
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwwQ0FBd0I7QUFDeEIsNkNBQTJCO0FBQzNCLDBDQUF3QjtBQUN4QiwyQ0FBeUI7QUFDekIsMkNBQXlCO0FBQ3pCLCtCQUE4QjtBQUFyQiw0RkFBQSxJQUFJLE9BQUE7QUFRYixtQ0FNa0I7QUFEaEIsMEdBQUEsZ0JBQWdCLE9BQUE7QUFFbEIsbUNBQWdGO0FBQXZFLHNHQUFBLFlBQVksT0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vYXVkaXQnO1xuZXhwb3J0ICogZnJvbSAnLi9idXNpbmVzcyc7XG5leHBvcnQgKiBmcm9tICcuL3pvbmVzJztcbmV4cG9ydCAqIGZyb20gJy4vd2FsbGV0JztcbmV4cG9ydCAqIGZyb20gJy4vZXJyb3JzJztcbmV4cG9ydCB7IGF1dGggfSBmcm9tICcuL2F1dGgnO1xuZXhwb3J0IHR5cGUge1xuICBQa2NlUGFpcixcbiAgQXV0aG9yaXplVXJsSW5wdXQsXG4gIEV4Y2hhbmdlQ29kZUlucHV0LFxuICBSZWZyZXNoSW5wdXQsXG4gIFRva2VuUGFpcixcbn0gZnJvbSAnLi9hdXRoJztcbmV4cG9ydCB7XG4gIHR5cGUgUGxhdGZvcm1BdXRoLFxuICB0eXBlIFBsYXRmb3JtQXV0aElucHV0LFxuICB0eXBlIFBsYXRmb3JtQ29uZmlnLFxuICB0eXBlIFBsYXRmb3JtQ29uZmlnSW5wdXQsXG4gIERFRkFVTFRfQkFTRV9VUkwsXG59IGZyb20gJy4vY29uZmlnJztcbmV4cG9ydCB7IGNyZWF0ZUNsaWVudCwgdHlwZSBDbGllbnRDb25maWcsIHR5cGUgUGxhdGZvcm1DbGllbnQgfSBmcm9tICcuL2NsaWVudCc7XG4iXX0=
@@ -26,6 +26,30 @@ export type TokenSource = {
26
26
  clientSecret: string;
27
27
  authBaseUrl: string;
28
28
  scope?: string;
29
+ } | {
30
+ /**
31
+ * Caller hands the SDK a `(accessToken, refreshToken)` pair from
32
+ * a finished login flow (`auth.loginWithPassword(...)`,
33
+ * `auth.verifyOtp(...)`, etc). The SDK serves the access token
34
+ * until it expires, then rotates via `auth.refresh(...)`.
35
+ *
36
+ * `clientId` is the OAuth client id used during the original
37
+ * login — required by the refresh handler. `onRotate` is an
38
+ * optional hook the caller can use to persist the new pair
39
+ * (cookie, secure storage, etc) — fired with every successful
40
+ * rotation.
41
+ */
42
+ kind: 'access-refresh-pair';
43
+ accessToken: string;
44
+ refreshToken: string;
45
+ /** Initial expiry timestamp (ms since epoch). Re-derived from each new access token. */
46
+ expiresAt: number;
47
+ clientId: string;
48
+ onRotate?: (pair: {
49
+ accessToken: string;
50
+ refreshToken: string;
51
+ expiresAt: number;
52
+ }) => void | Promise<void>;
29
53
  };
30
54
  export interface TokenSourceState {
31
55
  source: TokenSource;
@@ -1,4 +1,37 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  Object.defineProperty(exports, "__esModule", { value: true });
3
36
  exports.makeTokenSourceState = makeTokenSourceState;
4
37
  exports.getAccessToken = getAccessToken;
@@ -98,6 +131,37 @@ async function mintToken(state) {
98
131
  expiresAt: ttl > 0 ? Date.now() + ttl : Date.now() + 5 * 60 * 1000,
99
132
  };
100
133
  }
134
+ case 'access-refresh-pair': {
135
+ // First call: serve the seed access token if it hasn't expired.
136
+ // Subsequent calls (or on a stale seed) rotate via auth.refresh().
137
+ const source = state.source;
138
+ if (Date.now() + state.expiryBufferMs < source.expiresAt) {
139
+ return { token: source.accessToken, expiresAt: source.expiresAt };
140
+ }
141
+ // Dynamic import keeps `auth` out of the bundle when this kind isn't used.
142
+ const { refresh } = await Promise.resolve().then(() => __importStar(require('./auth/refresh')));
143
+ const tokens = await refresh({
144
+ accessToken: source.accessToken,
145
+ refreshToken: source.refreshToken,
146
+ clientId: source.clientId,
147
+ });
148
+ if (!tokens.refreshToken) {
149
+ throw new errors_1.ConfigError('refresh response missing refresh_token; cannot rotate again');
150
+ }
151
+ const expiresAt = Date.now() + tokens.expiresIn * 1000;
152
+ // Mutate the source in place so subsequent rotations carry the new pair.
153
+ source.accessToken = tokens.accessToken;
154
+ source.refreshToken = tokens.refreshToken;
155
+ source.expiresAt = expiresAt;
156
+ if (source.onRotate) {
157
+ await source.onRotate({
158
+ accessToken: tokens.accessToken,
159
+ refreshToken: tokens.refreshToken,
160
+ expiresAt,
161
+ });
162
+ }
163
+ return { token: tokens.accessToken, expiresAt };
164
+ }
101
165
  }
102
166
  }
103
167
  function base64(s) {
@@ -108,4 +172,4 @@ function base64(s) {
108
172
  // eslint-disable-next-line no-undef
109
173
  return btoa(s);
110
174
  }
111
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4tc291cmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3Rva2VuLXNvdXJjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQTJDQSxvREFTQztBQU9ELHdDQXNCQztBQU1ELDBDQUVDO0FBekZELHFDQUEwRDtBQUMxRCwwQ0FBMEM7QUF3QzFDLE1BQU0sd0JBQXdCLEdBQUcsSUFBSSxDQUFDO0FBRXRDLFNBQWdCLG9CQUFvQixDQUNsQyxNQUFtQixFQUNuQixVQUErRCxFQUFFO0lBRWpFLE9BQU87UUFDTCxNQUFNO1FBQ04sY0FBYyxFQUFFLE9BQU8sQ0FBQyxjQUFjLElBQUksd0JBQXdCO1FBQ2xFLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTyxJQUFLLFVBQVUsQ0FBQyxLQUFzQjtLQUMvRCxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7O0dBSUc7QUFDSSxLQUFLLFVBQVUsY0FBYyxDQUFDLEtBQXVCO0lBQzFELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUN2QixJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN4RSxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO0lBQzVCLENBQUM7SUFDRCxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNuQixNQUFNLEtBQUssR0FBRyxNQUFNLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFDbkMsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDO0lBQ3JCLENBQUM7SUFDRCxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7UUFDN0MsS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7UUFDbkIsS0FBSyxDQUFDLFFBQVEsR0FBRyxTQUFTLENB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cnJvciB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7IGdldEV4cGlyeSB9IGZyb20gJy4vYXV0aC9pc3N1ZXInO1xuXG4vKipcbiAqIEhvdyB0aGUgU0RLIGdldHMgYSBmcmVzaCBhY2Nlc3MgdG9rZW4uIFRocmVlIHNoYXBlcyBwZXIgdGhlIGJyaWVmOlxuICpcbiAqICAgLSBgc3RhdGljLXN0cmluZ2Ag4oCUIGNhbGxlciBoYW5kcyBpbiBhIHRva2VuIHN0cmluZy4gVXNlZCB1bnRpbCBpdHNcbiAqICAgICBgZXhwYCBoYXMgcGFzc2VkOyBvbiBleHBpcnkgd2UgdGhyb3cgYFRva2VuRXhwaXJlZEVycm9yYCByYXRoZXJcbiAqICAgICB0aGFuIHRyeSB0byByZWZyZXNoICh0aGUgU0RLIGhhcyBubyB3YXkgdG8gcmVmcmVzaCBhIHN0YXRpY1xuICogICAgIGV4dGVybmFsbHktc3VwcGxpZWQgdG9rZW4pLlxuICpcbiAqICAgLSBgY2FsbGJhY2tgIOKAlCBjYWxsZXIgc3VwcGxpZXMgYSBmdW5jdGlvbiB0aGUgU0RLIGNhbGxzIG9uIG1pc3NcbiAqICAgICBhbmQgb24gNDAxIGludmFsaWRhdGlvbi4gVGhlIGNvbnN1bWVyJ3MgbG9naWMgaXMgcmVzcG9uc2libGUgZm9yXG4gKiAgICAgcmVmcmVzaDsgdGhlIFNESyBqdXN0IGNhY2hlcyB0aGUgcmVzdWx0IGJldHdlZW4gaW52b2NhdGlvbnMuXG4gKlxuICogICAtIGBzZXJ2aWNlLWNyZWRlbnRpYWxzYCDigJQgYGNsaWVudF9pZGAgKyBgY2xpZW50X3NlY3JldGAgZm9yIHRoZVxuICogICAgIE9BdXRoMiBgY2xpZW50X2NyZWRlbnRpYWxzYCBncmFudC4gU0RLIG1pbnRzICsgY2FjaGVzOyBvblxuICogICAgIGV4cGlyeSBpdCByZS1taW50cyB3aXRoIHRoZSBzYW1lIGNyZWRlbnRpYWxzLlxuICovXG5leHBvcnQgdHlwZSBUb2tlblNvdXJjZSA9XG4gIHwgeyBraW5kOiAnc3RhdGljLXN0cmluZyc7IHRva2VuOiBzdHJpbmcgfVxuICB8IHsga2luZDogJ2NhbGxiYWNrJzsgZ2V0VG9rZW46ICgpID0+IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPiB9XG4gIHwge1xuICAgICAga2luZDogJ3NlcnZpY2UtY3JlZGVudGlhbHMnO1xuICAgICAgY2xpZW50SWQ6IHN0cmluZztcbiAgICAgIGNsaWVudFNlY3JldDogc3RyaW5nO1xuICAgICAgYXV0aEJhc2VVcmw6IHN0cmluZztcbiAgICAgIHNjb3BlPzogc3RyaW5nO1xuICAgIH07XG5cbmV4cG9ydCBpbnRlcmZhY2UgVG9rZW5Tb3VyY2VTdGF0ZSB7XG4gIHNvdXJjZTogVG9rZW5Tb3VyY2U7XG4gIGNhY2hlZD86IHsgdG9rZW46IHN0cmluZzsgZXhwaXJlc0F0OiBudW1iZXIgfTtcbiAgLyoqIFJlZnJlc2ggZGVkdXA6IGNvbmN1cnJlbnQgcmVxdWVzdHMgc2hhcmUgdGhlIHNhbWUgZmV0Y2guICovXG4gIGluZmxpZ2h0PzogUHJvbWlzZTx7IHRva2VuOiBzdHJpbmc7IGV4cGlyZXNBdDogbnVtYmVyIH0+O1xuICAvKiogQnVmZmVyIChtcykgYmVmb3JlIGBleHBgIGF0IHdoaWNoIHdlIHRyZWF0IGEgdG9rZW4gYXMgZXhwaXJlZC4gKi9cbiAgZXhwaXJ5QnVmZmVyTXM6IG51bWJlcjtcbiAgLyoqIFVzZWQgb25seSBieSB0aGUgc2VydmljZS1jcmVkZW50aWFscyBwYXRoLiAqL1xuICBmZXRjaEZuOiB0eXBlb2YgZmV0Y2g7XG59XG5cbmNvbnN0IERFRkFVTFRfRVhQSVJZX0JVRkZFUl9NUyA9IDUwMDA7XG5cbmV4cG9ydCBmdW5jdGlvbiBtYWtlVG9rZW5Tb3VyY2VTdGF0ZShcbiAgc291cmNlOiBUb2tlblNvdXJjZSxcbiAgb3B0aW9uczogeyBleHBpcnlCdWZmZXJNcz86IG51bWJlcjsgZmV0Y2hGbj86IHR5cGVvZiBmZXRjaCB9ID0ge30sXG4pOiBUb2tlblNvdXJjZVN0YXRlIHtcbiAgcmV0dXJuIHtcbiAgICBzb3VyY2UsXG4gICAgZXhwaXJ5QnVmZmVyTXM6IG9wdGlvbnMuZXhwaXJ5QnVmZmVyTXMgPz8gREVGQVVMVF9FWFBJUllfQlVGRkVSX01TLFxuICAgIGZldGNoRm46IG9wdGlvbnMuZmV0Y2hGbiA/PyAoZ2xvYmFsVGhpcy5mZXRjaCBhcyB0eXBlb2YgZmV0Y2gpLFxuICB9O1xufVxuXG4vKipcbiAqIFJldHVybiBhIGZyZXNoIGFjY2VzcyB0b2tlbiwgdXNpbmcgdGhlIGNhY2hlIHdoZW4gd2FybS4gQ29uY3VycmVudFxuICogY2FsbGVycyBkdXJpbmcgYSByZWZyZXNoIHNoYXJlIHRoZSBpbi1mbGlnaHQgUHJvbWlzZSBzbyB3ZSBkb24ndFxuICogc3RhbXBlZGUgdGhlIGF1dGggc2VydmVyLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QWNjZXNzVG9rZW4oc3RhdGU6IFRva2VuU291cmNlU3RhdGUpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICBpZiAoc3RhdGUuY2FjaGVkICYmIHN0YXRlLmNhY2hlZC5leHBpcmVzQXQgPiBub3cgKyBzdGF0ZS5leHBpcnlCdWZmZXJNcykge1xuICAgIHJldHVybiBzdGF0ZS5jYWNoZWQudG9rZW47XG4gIH1cbiAgaWYgKHN0YXRlLmluZmxpZ2h0KSB7XG4gICAgY29uc3QgZnJlc2ggPSBhd2FpdCBzdGF0ZS5pbmZsaWdodDtcbiAgICByZXR1cm4gZnJlc2gudG9rZW47XG4gIH1cbiAgY29uc3QgaW5mbGlnaHQgPSBtaW50VG9rZW4oc3RhdGUpLnRoZW4oKHJlcykgPT4ge1xuICAgIHN0YXRlLmNhY2hlZCA9IHJlcztcbiAgICBzdGF0ZS5pbmZsaWdodCA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVzO1xuICB9KTtcbiAgc3RhdGUuaW5mbGlnaHQgPSBpbmZsaWdodDtcbiAgdHJ5IHtcbiAgICBjb25zdCBmcmVzaCA9IGF3YWl0IGluZmxpZ2h0O1xuICAgIHJldHVybiBmcmVzaC50b2tlbjtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgc3RhdGUuaW5mbGlnaHQgPSB1bmRlZmluZWQ7XG4gICAgdGhyb3cgZXJyO1xuICB9XG59XG5cbi8qKlxuICogRHJvcCB0aGUgY2FjaGVkIHRva2VuLiBUaGUgbmV4dCBgZ2V0QWNjZXNzVG9rZW5gIHdpbGwgbWludCBvclxuICogcmUtZmV0Y2guIENhbGxlZCBieSB0aGUgcmVxdWVzdCBsYXllciBvbiA0MDEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnZhbGlkYXRlVG9rZW4oc3RhdGU6IFRva2VuU291cmNlU3RhdGUpOiB2b2lkIHtcbiAgc3RhdGUuY2FjaGVkID0gdW5kZWZpbmVkO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtaW50VG9rZW4oc3RhdGU6IFRva2VuU291cmNlU3RhdGUpOiBQcm9taXNlPHsgdG9rZW46IHN0cmluZzsgZXhwaXJlc0F0OiBudW1iZXIgfT4ge1xuICBzd2l0Y2ggKHN0YXRlLnNvdXJjZS5raW5kKSB7XG4gICAgY2FzZSAnc3RhdGljLXN0cmluZyc6IHtcbiAgICAgIGNvbnN0IGV4cCA9IGdldEV4cGlyeShzdGF0ZS5zb3VyY2UudG9rZW4pO1xuICAgICAgaWYgKGV4cCAhPT0gbnVsbCAmJiBleHAgKiAxMDAwIDwgRGF0ZS5ub3coKSArIHN0YXRlLmV4cGlyeUJ1ZmZlck1zKSB7XG4gICAgICAgIHRocm93IG5ldyBUb2tlbkV4cGlyZWRFcnJvcihcbiAgICAgICAgICAnc3RhdGljIGFjY2VzcyB0b2tlbiBoYXMgZXhwaXJlZDsgY29uc3VtZXIgbXVzdCB1cGRhdGUgdGhlIGNvbmZpZyB3aXRoIGEgZnJlc2ggdG9rZW4nLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdG9rZW46IHN0YXRlLnNvdXJjZS50b2tlbixcbiAgICAgICAgLy8gTm8gYGV4cGA/IFRyZWF0IGFzIG9wYXF1ZSBub24tZXhwaXJpbmc7IGNhY2hlIGZvciAxaCB0byBhdm9pZFxuICAgICAgICAvLyByZS11c2luZyB0aGUgc2FtZSBzdHJpbmcgZm9yZXZlciBpbiBjYXNlIHRoZSBpc3N1ZXIgcm90YXRlcy5cbiAgICAgICAgZXhwaXJlc0F0OiBleHAgIT09IG51bGwgPyBleHAgKiAxMDAwIDogRGF0ZS5ub3coKSArIDYwICogNjAgKiAxMDAwLFxuICAgICAgfTtcbiAgICB9XG4gICAgY2FzZSAnY2FsbGJhY2snOiB7XG4gICAgICBjb25zdCB0b2tlbiA9IGF3YWl0IHN0YXRlLnNvdXJjZS5nZXRUb2tlbigpO1xuICAgICAgY29uc3QgZXhwID0gZ2V0RXhwaXJ5KHRva2VuKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRva2VuLFxuICAgICAgICBleHBpcmVzQXQ6IGV4cCAhPT0gbnVsbCA/IGV4cCAqIDEwMDAgOiBEYXRlLm5vdygpICsgNSAqIDYwICogMTAwMCxcbiAgICAgIH07XG4gICAgfVxuICAgIGNhc2UgJ3NlcnZpY2UtY3JlZGVudGlhbHMnOiB7XG4gICAgICBjb25zdCBib2R5ID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7IGdyYW50X3R5cGU6ICdjbGllbnRfY3JlZGVudGlhbHMnIH0pO1xuICAgICAgaWYgKHN0YXRlLnNvdXJjZS5zY29wZSkgYm9keS5zZXQoJ3Njb3BlJywgc3RhdGUuc291cmNlLnNjb3BlKTtcbiAgICAgIGNvbnN0IGJhc2ljID0gYmFzZTY0KGAke3N0YXRlLnNvdXJjZS5jbGllbnRJZH06JHtzdGF0ZS5zb3VyY2UuY2xpZW50U2VjcmV0fWApO1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgc3RhdGUuZmV0Y2hGbihgJHtzdGF0ZS5zb3VyY2UuYXV0aEJhc2VVcmx9L29hdXRoL3Rva2VuYCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyxcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmFzaWMgJHtiYXNpY31gLFxuICAgICAgICB9LFxuICAgICAgICBib2R5OiBib2R5LnRvU3RyaW5nKCksXG4gICAgICB9KTtcbiAgICAgIGlmICghcmVzLm9rKSB7XG4gICAgICAgIGNvbnN0IHRleHQgPSBhd2FpdCByZXMudGV4dCgpO1xuICAgICAgICB0aHJvdyBuZXcgQ29uZmlnRXJyb3IoYGNsaWVudF9jcmVkZW50aWFscyBtaW50IGZhaWxlZDogSFRUUCAke3Jlcy5zdGF0dXN9ICR7dGV4dH1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGpzb24gPSAoYXdhaXQgcmVzLmpzb24oKSkgYXMgeyBhY2Nlc3NfdG9rZW4/OiBzdHJpbmc7IGV4cGlyZXNfaW4/OiBudW1iZXIgfTtcbiAgICAgIGlmICghanNvbi5hY2Nlc3NfdG9rZW4pIHtcbiAgICAgICAgdGhyb3cgbmV3IENvbmZpZ0Vycm9yKCdhdXRoIHNlcnZlciByZXNwb25zZSBtaXNzaW5nIGFjY2Vzc190b2tlbicpO1xuICAgICAgfVxuICAgICAgY29uc3QgdHRsID0gKGpzb24uZXhwaXJlc19pbiA/PyAwKSAqIDEwMDA7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0b2tlbjoganNvbi5hY2Nlc3NfdG9rZW4sXG4gICAgICAgIGV4cGlyZXNBdDogdHRsID4gMCA/IERhdGUubm93KCkgKyB0dGwgOiBEYXRlLm5vdygpICsgNSAqIDYwICogMTAwMCxcbiAgICAgIH07XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGJhc2U2NChzOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBXb3JrcyBpbiBOb2RlIGFuZCBicm93c2VyIChCdWZmZXIgaXMgcG9seWZpbGxlZCB2aWEgQHR5cGVzL25vZGUgYW5kXG4gIC8vIG1vc3QgYnVuZGxlcnM7IGJ0b2EgaXMgYSBmYWxsYmFjayBmb3IgZW52cyB3aXRob3V0IEJ1ZmZlcikuXG4gIGlmICh0eXBlb2YgQnVmZmVyICE9PSAndW5kZWZpbmVkJykgcmV0dXJuIEJ1ZmZlci5mcm9tKHMsICd1dGY4JykudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgcmV0dXJuIGJ0b2Eocyk7XG59XG4iXX0=
175
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4tc291cmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3Rva2VuLXNvdXJjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9FQSxvREFTQztBQU9ELHdDQXNCQztBQU1ELDBDQUVDO0FBbEhELHFDQUEwRDtBQUMxRCwwQ0FBMEM7QUFpRTFDLE1BQU0sd0JBQXdCLEdBQUcsSUFBSSxDQUFDO0FBRXRDLFNBQWdCLG9CQUFvQixDQUNsQyxNQUFtQixFQUNuQixVQUErRCxFQUFFO0lBRWpFLE9BQU87UUFDTCxNQUFNO1FBQ04sY0FBYyxFQUFFLE9BQU8sQ0FBQyxjQUFjLElBQUksd0JBQXdCO1FBQ2xFLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTyxJQUFLLFVBQVUsQ0FBQyxLQUFzQjtLQUMvRCxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7O0dBSUc7QUFDSSxLQUFLLFVBQVUsY0FBYyxDQUFDLEtBQXVCO0lBQzFELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUN2QixJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN4RSxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO0lBQzVCLENBQUM7SUFDRCxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNuQixNQUFNLEtBQUssR0FBRyxNQUFNLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFDbkMsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDO0lBQ3JCLENBQUM7SUFDRCxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7UUFDN0MsS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7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QUksQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3BGLG9DQUFvQztJQUNwQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uZmlnRXJyb3IsIFRva2VuRXhwaXJlZEVycm9yIH0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHsgZ2V0RXhwaXJ5IH0gZnJvbSAnLi9hdXRoL2lzc3Vlcic7XG5cbi8qKlxuICogSG93IHRoZSBTREsgZ2V0cyBhIGZyZXNoIGFjY2VzcyB0b2tlbi4gVGhyZWUgc2hhcGVzIHBlciB0aGUgYnJpZWY6XG4gKlxuICogICAtIGBzdGF0aWMtc3RyaW5nYCDigJQgY2FsbGVyIGhhbmRzIGluIGEgdG9rZW4gc3RyaW5nLiBVc2VkIHVudGlsIGl0c1xuICogICAgIGBleHBgIGhhcyBwYXNzZWQ7IG9uIGV4cGlyeSB3ZSB0aHJvdyBgVG9rZW5FeHBpcmVkRXJyb3JgIHJhdGhlclxuICogICAgIHRoYW4gdHJ5IHRvIHJlZnJlc2ggKHRoZSBTREsgaGFzIG5vIHdheSB0byByZWZyZXNoIGEgc3RhdGljXG4gKiAgICAgZXh0ZXJuYWxseS1zdXBwbGllZCB0b2tlbikuXG4gKlxuICogICAtIGBjYWxsYmFja2Ag4oCUIGNhbGxlciBzdXBwbGllcyBhIGZ1bmN0aW9uIHRoZSBTREsgY2FsbHMgb24gbWlzc1xuICogICAgIGFuZCBvbiA0MDEgaW52YWxpZGF0aW9uLiBUaGUgY29uc3VtZXIncyBsb2dpYyBpcyByZXNwb25zaWJsZSBmb3JcbiAqICAgICByZWZyZXNoOyB0aGUgU0RLIGp1c3QgY2FjaGVzIHRoZSByZXN1bHQgYmV0d2VlbiBpbnZvY2F0aW9ucy5cbiAqXG4gKiAgIC0gYHNlcnZpY2UtY3JlZGVudGlhbHNgIOKAlCBgY2xpZW50X2lkYCArIGBjbGllbnRfc2VjcmV0YCBmb3IgdGhlXG4gKiAgICAgT0F1dGgyIGBjbGllbnRfY3JlZGVudGlhbHNgIGdyYW50LiBTREsgbWludHMgKyBjYWNoZXM7IG9uXG4gKiAgICAgZXhwaXJ5IGl0IHJlLW1pbnRzIHdpdGggdGhlIHNhbWUgY3JlZGVudGlhbHMuXG4gKi9cbmV4cG9ydCB0eXBlIFRva2VuU291cmNlID1cbiAgfCB7IGtpbmQ6ICdzdGF0aWMtc3RyaW5nJzsgdG9rZW46IHN0cmluZyB9XG4gIHwgeyBraW5kOiAnY2FsbGJhY2snOyBnZXRUb2tlbjogKCkgPT4gc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+IH1cbiAgfCB7XG4gICAgICBraW5kOiAnc2VydmljZS1jcmVkZW50aWFscyc7XG4gICAgICBjbGllbnRJZDogc3RyaW5nO1xuICAgICAgY2xpZW50U2VjcmV0OiBzdHJpbmc7XG4gICAgICBhdXRoQmFzZVVybDogc3RyaW5nO1xuICAgICAgc2NvcGU/OiBzdHJpbmc7XG4gICAgfVxuICB8IHtcbiAgICAgIC8qKlxuICAgICAgICogQ2FsbGVyIGhhbmRzIHRoZSBTREsgYSBgKGFjY2Vzc1Rva2VuLCByZWZyZXNoVG9rZW4pYCBwYWlyIGZyb21cbiAgICAgICAqIGEgZmluaXNoZWQgbG9naW4gZmxvdyAoYGF1dGgubG9naW5XaXRoUGFzc3dvcmQoLi4uKWAsXG4gICAgICAgKiBgYXV0aC52ZXJpZnlPdHAoLi4uKWAsIGV0YykuIFRoZSBTREsgc2VydmVzIHRoZSBhY2Nlc3MgdG9rZW5cbiAgICAgICAqIHVudGlsIGl0IGV4cGlyZXMsIHRoZW4gcm90YXRlcyB2aWEgYGF1dGgucmVmcmVzaCguLi4pYC5cbiAgICAgICAqXG4gICAgICAgKiBgY2xpZW50SWRgIGlzIHRoZSBPQXV0aCBjbGllbnQgaWQgdXNlZCBkdXJpbmcgdGhlIG9yaWdpbmFsXG4gICAgICAgKiBsb2dpbiDigJQgcmVxdWlyZWQgYnkgdGhlIHJlZnJlc2ggaGFuZGxlci4gYG9uUm90YXRlYCBpcyBhblxuICAgICAgICogb3B0aW9uYWwgaG9vayB0aGUgY2FsbGVyIGNhbiB1c2UgdG8gcGVyc2lzdCB0aGUgbmV3IHBhaXJcbiAgICAgICAqIChjb29raWUsIHNlY3VyZSBzdG9yYWdlLCBldGMpIOKAlCBmaXJlZCB3aXRoIGV2ZXJ5IHN1Y2Nlc3NmdWxcbiAgICAgICAqIHJvdGF0aW9uLlxuICAgICAgICovXG4gICAgICBraW5kOiAnYWNjZXNzLXJlZnJlc2gtcGFpcic7XG4gICAgICBhY2Nlc3NUb2tlbjogc3RyaW5nO1xuICAgICAgcmVmcmVzaFRva2VuOiBzdHJpbmc7XG4gICAgICAvKiogSW5pdGlhbCBleHBpcnkgdGltZXN0YW1wIChtcyBzaW5jZSBlcG9jaCkuIFJlLWRlcml2ZWQgZnJvbSBlYWNoIG5ldyBhY2Nlc3MgdG9rZW4uICovXG4gICAgICBleHBpcmVzQXQ6IG51bWJlcjtcbiAgICAgIGNsaWVudElkOiBzdHJpbmc7XG4gICAgICBvblJvdGF0ZT86IChwYWlyOiB7XG4gICAgICAgIGFjY2Vzc1Rva2VuOiBzdHJpbmc7XG4gICAgICAgIHJlZnJlc2hUb2tlbjogc3RyaW5nO1xuICAgICAgICBleHBpcmVzQXQ6IG51bWJlcjtcbiAgICAgIH0pID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICAgIH07XG5cbmV4cG9ydCBpbnRlcmZhY2UgVG9rZW5Tb3VyY2VTdGF0ZSB7XG4gIHNvdXJjZTogVG9rZW5Tb3VyY2U7XG4gIGNhY2hlZD86IHsgdG9rZW46IHN0cmluZzsgZXhwaXJlc0F0OiBudW1iZXIgfTtcbiAgLyoqIFJlZnJlc2ggZGVkdXA6IGNvbmN1cnJlbnQgcmVxdWVzdHMgc2hhcmUgdGhlIHNhbWUgZmV0Y2guICovXG4gIGluZmxpZ2h0PzogUHJvbWlzZTx7IHRva2VuOiBzdHJpbmc7IGV4cGlyZXNBdDogbnVtYmVyIH0+O1xuICAvKiogQnVmZmVyIChtcykgYmVmb3JlIGBleHBgIGF0IHdoaWNoIHdlIHRyZWF0IGEgdG9rZW4gYXMgZXhwaXJlZC4gKi9cbiAgZXhwaXJ5QnVmZmVyTXM6IG51bWJlcjtcbiAgLyoqIFVzZWQgb25seSBieSB0aGUgc2VydmljZS1jcmVkZW50aWFscyBwYXRoLiAqL1xuICBmZXRjaEZuOiB0eXBlb2YgZmV0Y2g7XG59XG5cbmNvbnN0IERFRkFVTFRfRVhQSVJZX0JVRkZFUl9NUyA9IDUwMDA7XG5cbmV4cG9ydCBmdW5jdGlvbiBtYWtlVG9rZW5Tb3VyY2VTdGF0ZShcbiAgc291cmNlOiBUb2tlblNvdXJjZSxcbiAgb3B0aW9uczogeyBleHBpcnlCdWZmZXJNcz86IG51bWJlcjsgZmV0Y2hGbj86IHR5cGVvZiBmZXRjaCB9ID0ge30sXG4pOiBUb2tlblNvdXJjZVN0YXRlIHtcbiAgcmV0dXJuIHtcbiAgICBzb3VyY2UsXG4gICAgZXhwaXJ5QnVmZmVyTXM6IG9wdGlvbnMuZXhwaXJ5QnVmZmVyTXMgPz8gREVGQVVMVF9FWFBJUllfQlVGRkVSX01TLFxuICAgIGZldGNoRm46IG9wdGlvbnMuZmV0Y2hGbiA/PyAoZ2xvYmFsVGhpcy5mZXRjaCBhcyB0eXBlb2YgZmV0Y2gpLFxuICB9O1xufVxuXG4vKipcbiAqIFJldHVybiBhIGZyZXNoIGFjY2VzcyB0b2tlbiwgdXNpbmcgdGhlIGNhY2hlIHdoZW4gd2FybS4gQ29uY3VycmVudFxuICogY2FsbGVycyBkdXJpbmcgYSByZWZyZXNoIHNoYXJlIHRoZSBpbi1mbGlnaHQgUHJvbWlzZSBzbyB3ZSBkb24ndFxuICogc3RhbXBlZGUgdGhlIGF1dGggc2VydmVyLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QWNjZXNzVG9rZW4oc3RhdGU6IFRva2VuU291cmNlU3RhdGUpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICBpZiAoc3RhdGUuY2FjaGVkICYmIHN0YXRlLmNhY2hlZC5leHBpcmVzQXQgPiBub3cgKyBzdGF0ZS5leHBpcnlCdWZmZXJNcykge1xuICAgIHJldHVybiBzdGF0ZS5jYWNoZWQudG9rZW47XG4gIH1cbiAgaWYgKHN0YXRlLmluZmxpZ2h0KSB7XG4gICAgY29uc3QgZnJlc2ggPSBhd2FpdCBzdGF0ZS5pbmZsaWdodDtcbiAgICByZXR1cm4gZnJlc2gudG9rZW47XG4gIH1cbiAgY29uc3QgaW5mbGlnaHQgPSBtaW50VG9rZW4oc3RhdGUpLnRoZW4oKHJlcykgPT4ge1xuICAgIHN0YXRlLmNhY2hlZCA9IHJlcztcbiAgICBzdGF0ZS5pbmZsaWdodCA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVzO1xuICB9KTtcbiAgc3RhdGUuaW5mbGlnaHQgPSBpbmZsaWdodDtcbiAgdHJ5IHtcbiAgICBjb25zdCBmcmVzaCA9IGF3YWl0IGluZmxpZ2h0O1xuICAgIHJldHVybiBmcmVzaC50b2tlbjtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgc3RhdGUuaW5mbGlnaHQgPSB1bmRlZmluZWQ7XG4gICAgdGhyb3cgZXJyO1xuICB9XG59XG5cbi8qKlxuICogRHJvcCB0aGUgY2FjaGVkIHRva2VuLiBUaGUgbmV4dCBgZ2V0QWNjZXNzVG9rZW5gIHdpbGwgbWludCBvclxuICogcmUtZmV0Y2guIENhbGxlZCBieSB0aGUgcmVxdWVzdCBsYXllciBvbiA0MDEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnZhbGlkYXRlVG9rZW4oc3RhdGU6IFRva2VuU291cmNlU3RhdGUpOiB2b2lkIHtcbiAgc3RhdGUuY2FjaGVkID0gdW5kZWZpbmVkO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtaW50VG9rZW4oc3RhdGU6IFRva2VuU291cmNlU3RhdGUpOiBQcm9taXNlPHsgdG9rZW46IHN0cmluZzsgZXhwaXJlc0F0OiBudW1iZXIgfT4ge1xuICBzd2l0Y2ggKHN0YXRlLnNvdXJjZS5raW5kKSB7XG4gICAgY2FzZSAnc3RhdGljLXN0cmluZyc6IHtcbiAgICAgIGNvbnN0IGV4cCA9IGdldEV4cGlyeShzdGF0ZS5zb3VyY2UudG9rZW4pO1xuICAgICAgaWYgKGV4cCAhPT0gbnVsbCAmJiBleHAgKiAxMDAwIDwgRGF0ZS5ub3coKSArIHN0YXRlLmV4cGlyeUJ1ZmZlck1zKSB7XG4gICAgICAgIHRocm93IG5ldyBUb2tlbkV4cGlyZWRFcnJvcihcbiAgICAgICAgICAnc3RhdGljIGFjY2VzcyB0b2tlbiBoYXMgZXhwaXJlZDsgY29uc3VtZXIgbXVzdCB1cGRhdGUgdGhlIGNvbmZpZyB3aXRoIGEgZnJlc2ggdG9rZW4nLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdG9rZW46IHN0YXRlLnNvdXJjZS50b2tlbixcbiAgICAgICAgLy8gTm8gYGV4cGA/IFRyZWF0IGFzIG9wYXF1ZSBub24tZXhwaXJpbmc7IGNhY2hlIGZvciAxaCB0byBhdm9pZFxuICAgICAgICAvLyByZS11c2luZyB0aGUgc2FtZSBzdHJpbmcgZm9yZXZlciBpbiBjYXNlIHRoZSBpc3N1ZXIgcm90YXRlcy5cbiAgICAgICAgZXhwaXJlc0F0OiBleHAgIT09IG51bGwgPyBleHAgKiAxMDAwIDogRGF0ZS5ub3coKSArIDYwICogNjAgKiAxMDAwLFxuICAgICAgfTtcbiAgICB9XG4gICAgY2FzZSAnY2FsbGJhY2snOiB7XG4gICAgICBjb25zdCB0b2tlbiA9IGF3YWl0IHN0YXRlLnNvdXJjZS5nZXRUb2tlbigpO1xuICAgICAgY29uc3QgZXhwID0gZ2V0RXhwaXJ5KHRva2VuKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRva2VuLFxuICAgICAgICBleHBpcmVzQXQ6IGV4cCAhPT0gbnVsbCA/IGV4cCAqIDEwMDAgOiBEYXRlLm5vdygpICsgNSAqIDYwICogMTAwMCxcbiAgICAgIH07XG4gICAgfVxuICAgIGNhc2UgJ3NlcnZpY2UtY3JlZGVudGlhbHMnOiB7XG4gICAgICBjb25zdCBib2R5ID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7IGdyYW50X3R5cGU6ICdjbGllbnRfY3JlZGVudGlhbHMnIH0pO1xuICAgICAgaWYgKHN0YXRlLnNvdXJjZS5zY29wZSkgYm9keS5zZXQoJ3Njb3BlJywgc3RhdGUuc291cmNlLnNjb3BlKTtcbiAgICAgIGNvbnN0IGJhc2ljID0gYmFzZTY0KGAke3N0YXRlLnNvdXJjZS5jbGllbnRJZH06JHtzdGF0ZS5zb3VyY2UuY2xpZW50U2VjcmV0fWApO1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgc3RhdGUuZmV0Y2hGbihgJHtzdGF0ZS5zb3VyY2UuYXV0aEJhc2VVcmx9L29hdXRoL3Rva2VuYCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyxcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmFzaWMgJHtiYXNpY31gLFxuICAgICAgICB9LFxuICAgICAgICBib2R5OiBib2R5LnRvU3RyaW5nKCksXG4gICAgICB9KTtcbiAgICAgIGlmICghcmVzLm9rKSB7XG4gICAgICAgIGNvbnN0IHRleHQgPSBhd2FpdCByZXMudGV4dCgpO1xuICAgICAgICB0aHJvdyBuZXcgQ29uZmlnRXJyb3IoYGNsaWVudF9jcmVkZW50aWFscyBtaW50IGZhaWxlZDogSFRUUCAke3Jlcy5zdGF0dXN9ICR7dGV4dH1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGpzb24gPSAoYXdhaXQgcmVzLmpzb24oKSkgYXMgeyBhY2Nlc3NfdG9rZW4/OiBzdHJpbmc7IGV4cGlyZXNfaW4/OiBudW1iZXIgfTtcbiAgICAgIGlmICghanNvbi5hY2Nlc3NfdG9rZW4pIHtcbiAgICAgICAgdGhyb3cgbmV3IENvbmZpZ0Vycm9yKCdhdXRoIHNlcnZlciByZXNwb25zZSBtaXNzaW5nIGFjY2Vzc190b2tlbicpO1xuICAgICAgfVxuICAgICAgY29uc3QgdHRsID0gKGpzb24uZXhwaXJlc19pbiA/PyAwKSAqIDEwMDA7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0b2tlbjoganNvbi5hY2Nlc3NfdG9rZW4sXG4gICAgICAgIGV4cGlyZXNBdDogdHRsID4gMCA/IERhdGUubm93KCkgKyB0dGwgOiBEYXRlLm5vdygpICsgNSAqIDYwICogMTAwMCxcbiAgICAgIH07XG4gICAgfVxuICAgIGNhc2UgJ2FjY2Vzcy1yZWZyZXNoLXBhaXInOiB7XG4gICAgICAvLyBGaXJzdCBjYWxsOiBzZXJ2ZSB0aGUgc2VlZCBhY2Nlc3MgdG9rZW4gaWYgaXQgaGFzbid0IGV4cGlyZWQuXG4gICAgICAvLyBTdWJzZXF1ZW50IGNhbGxzIChvciBvbiBhIHN0YWxlIHNlZWQpIHJvdGF0ZSB2aWEgYXV0aC5yZWZyZXNoKCkuXG4gICAgICBjb25zdCBzb3VyY2UgPSBzdGF0ZS5zb3VyY2U7XG4gICAgICBpZiAoRGF0ZS5ub3coKSArIHN0YXRlLmV4cGlyeUJ1ZmZlck1zIDwgc291cmNlLmV4cGlyZXNBdCkge1xuICAgICAgICByZXR1cm4geyB0b2tlbjogc291cmNlLmFjY2Vzc1Rva2VuLCBleHBpcmVzQXQ6IHNvdXJjZS5leHBpcmVzQXQgfTtcbiAgICAgIH1cbiAgICAgIC8vIER5bmFtaWMgaW1wb3J0IGtlZXBzIGBhdXRoYCBvdXQgb2YgdGhlIGJ1bmRsZSB3aGVuIHRoaXMga2luZCBpc24ndCB1c2VkLlxuICAgICAgY29uc3QgeyByZWZyZXNoIH0gPSBhd2FpdCBpbXBvcnQoJy4vYXV0aC9yZWZyZXNoJyk7XG4gICAgICBjb25zdCB0b2tlbnMgPSBhd2FpdCByZWZyZXNoKHtcbiAgICAgICAgYWNjZXNzVG9rZW46IHNvdXJjZS5hY2Nlc3NUb2tlbixcbiAgICAgICAgcmVmcmVzaFRva2VuOiBzb3VyY2UucmVmcmVzaFRva2VuLFxuICAgICAgICBjbGllbnRJZDogc291cmNlLmNsaWVudElkLFxuICAgICAgfSk7XG4gICAgICBpZiAoIXRva2Vucy5yZWZyZXNoVG9rZW4pIHtcbiAgICAgICAgdGhyb3cgbmV3IENvbmZpZ0Vycm9yKCdyZWZyZXNoIHJlc3BvbnNlIG1pc3NpbmcgcmVmcmVzaF90b2tlbjsgY2Fubm90IHJvdGF0ZSBhZ2FpbicpO1xuICAgICAgfVxuICAgICAgY29uc3QgZXhwaXJlc0F0ID0gRGF0ZS5ub3coKSArIHRva2Vucy5leHBpcmVzSW4gKiAxMDAwO1xuICAgICAgLy8gTXV0YXRlIHRoZSBzb3VyY2UgaW4gcGxhY2Ugc28gc3Vic2VxdWVudCByb3RhdGlvbnMgY2FycnkgdGhlIG5ldyBwYWlyLlxuICAgICAgc291cmNlLmFjY2Vzc1Rva2VuID0gdG9rZW5zLmFjY2Vzc1Rva2VuO1xuICAgICAgc291cmNlLnJlZnJlc2hUb2tlbiA9IHRva2Vucy5yZWZyZXNoVG9rZW47XG4gICAgICBzb3VyY2UuZXhwaXJlc0F0ID0gZXhwaXJlc0F0O1xuICAgICAgaWYgKHNvdXJjZS5vblJvdGF0ZSkge1xuICAgICAgICBhd2FpdCBzb3VyY2Uub25Sb3RhdGUoe1xuICAgICAgICAgIGFjY2Vzc1Rva2VuOiB0b2tlbnMuYWNjZXNzVG9rZW4sXG4gICAgICAgICAgcmVmcmVzaFRva2VuOiB0b2tlbnMucmVmcmVzaFRva2VuLFxuICAgICAgICAgIGV4cGlyZXNBdCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4geyB0b2tlbjogdG9rZW5zLmFjY2Vzc1Rva2VuLCBleHBpcmVzQXQgfTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYmFzZTY0KHM6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIFdvcmtzIGluIE5vZGUgYW5kIGJyb3dzZXIgKEJ1ZmZlciBpcyBwb2x5ZmlsbGVkIHZpYSBAdHlwZXMvbm9kZSBhbmRcbiAgLy8gbW9zdCBidW5kbGVyczsgYnRvYSBpcyBhIGZhbGxiYWNrIGZvciBlbnZzIHdpdGhvdXQgQnVmZmVyKS5cbiAgaWYgKHR5cGVvZiBCdWZmZXIgIT09ICd1bmRlZmluZWQnKSByZXR1cm4gQnVmZmVyLmZyb20ocywgJ3V0ZjgnKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICByZXR1cm4gYnRvYShzKTtcbn1cbiJdfQ==