@dbx-tools/postgres 0.9.58 → 0.9.61
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/README.md +26 -2
- package/exports.ts +8 -0
- package/index.ts +3 -1
- package/lib/exports.d.ts +2 -0
- package/lib/exports.js +2 -1
- package/lib/index.d.ts +3 -1
- package/lib/index.js +4 -2
- package/lib/src/bindings.d.ts +2 -0
- package/lib/src/bindings.js +3 -0
- package/lib/src/persistence.js +11 -11
- package/lib/src/session.d.ts +14 -0
- package/lib/src/session.js +42 -0
- package/lib/src/topic-bus.js +4 -7
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +19 -3
- package/src/bindings.ts +7 -0
- package/src/persistence.ts +10 -10
- package/src/session.ts +58 -0
- package/src/topic-bus.ts +3 -7
package/README.md
CHANGED
|
@@ -35,6 +35,30 @@ them without a second database client or connection pool.
|
|
|
35
35
|
listener reads back — which lifts the 8000-byte `NOTIFY` limit and keeps the
|
|
36
36
|
contents behind a table grant.
|
|
37
37
|
|
|
38
|
+
## Session Roles
|
|
39
|
+
|
|
40
|
+
Set `DBX_TOOLS_POSTGRES_ROLE` when every repository-owned PostgreSQL connection
|
|
41
|
+
should assume one role after authenticating. `postgresConnectionOptions()` adds
|
|
42
|
+
the role to `pg` and AppKit Lakebase pool startup options, while
|
|
43
|
+
`postgresServerSettings()` returns the equivalent `asyncpg` server settings.
|
|
44
|
+
|
|
45
|
+
```ts
|
|
46
|
+
import { postgresConnectionOptions } from "@dbx-tools/postgres";
|
|
47
|
+
import { Pool } from "pg";
|
|
48
|
+
|
|
49
|
+
const pool = new Pool(postgresConnectionOptions({}));
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
An explicit second argument overrides the environment value. The helper retains
|
|
53
|
+
existing `options`, including statement timeouts, and appends the role setting.
|
|
54
|
+
Use `postgresRoleStatement()` only for setup work that must change role after a
|
|
55
|
+
connection is already open.
|
|
56
|
+
|
|
57
|
+
When these options configure an AppKit Lakebase routing pool, they apply to its
|
|
58
|
+
service-principal and per-user OBO pools. Every login identity that can reach the
|
|
59
|
+
pool must therefore be a member of the configured role, or otherwise have
|
|
60
|
+
permission to `SET ROLE`, before the pool can connect successfully.
|
|
61
|
+
|
|
38
62
|
## Why Use This Over Native AppKit
|
|
39
63
|
|
|
40
64
|
Use AppKit `lakebase()` to obtain and refresh the PostgreSQL pool. This package
|
|
@@ -45,10 +69,10 @@ Lakebase plugin does not provide.
|
|
|
45
69
|
## Advisory Locks
|
|
46
70
|
|
|
47
71
|
```ts
|
|
48
|
-
import { withAdvisoryLock } from "@dbx-tools/postgres";
|
|
72
|
+
import { postgresConnectionOptions, withAdvisoryLock } from "@dbx-tools/postgres";
|
|
49
73
|
import { Pool } from "pg";
|
|
50
74
|
|
|
51
|
-
const pool = new Pool();
|
|
75
|
+
const pool = new Pool(postgresConnectionOptions({}));
|
|
52
76
|
|
|
53
77
|
await withAdvisoryLock(pool, ["invoice", invoiceId], async (client) => {
|
|
54
78
|
await client.query("UPDATE invoices SET status = 'sent' WHERE id = $1", [invoiceId]);
|
package/exports.ts
CHANGED
|
@@ -3,6 +3,14 @@
|
|
|
3
3
|
// functions to the package root. These are the call-site names, so they are
|
|
4
4
|
// importable directly from `@dbx-tools/postgres`.
|
|
5
5
|
export { withAdvisoryLock, withAdvisoryTransactionLock } from "./src/advisory-lock.ts";
|
|
6
|
+
export {
|
|
7
|
+
postgresConnectionOptions,
|
|
8
|
+
postgresRoleStatement,
|
|
9
|
+
postgresServerSettings,
|
|
10
|
+
quotePostgresIdentifier,
|
|
11
|
+
resolvePostgresRole,
|
|
12
|
+
} from "./src/session.ts";
|
|
13
|
+
export type { PostgresConnectionOptions } from "./src/session.ts";
|
|
6
14
|
export {
|
|
7
15
|
decodePointer,
|
|
8
16
|
messageBusGrantStatements,
|
package/index.ts
CHANGED
|
@@ -3,10 +3,12 @@
|
|
|
3
3
|
// Hand edits are overwritten on the next watch; this file is read-only.
|
|
4
4
|
|
|
5
5
|
export const PACKAGE_IDENTIFIER = "@dbx-tools/postgres";
|
|
6
|
-
export const PACKAGE_VERSION = "0.9.
|
|
6
|
+
export const PACKAGE_VERSION = "0.9.61";
|
|
7
7
|
export * as advisoryLock from "./src/advisory-lock.ts";
|
|
8
|
+
export * as bindings from "./src/bindings.ts";
|
|
8
9
|
export * as identity from "./src/identity.ts";
|
|
9
10
|
export * as persistence from "./src/persistence.ts";
|
|
11
|
+
export * as session from "./src/session.ts";
|
|
10
12
|
export * as topicBus from "./src/topic-bus.ts";
|
|
11
13
|
export type { AdvisoryLockKey, PgPoolLike, PgQueryable } from "./src/advisory-lock.ts";
|
|
12
14
|
export { POINTER_VERSION } from "./src/persistence.ts";
|
package/lib/exports.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
export { withAdvisoryLock, withAdvisoryTransactionLock } from "./src/advisory-lock.ts";
|
|
2
|
+
export { postgresConnectionOptions, postgresRoleStatement, postgresServerSettings, quotePostgresIdentifier, resolvePostgresRole, } from "./src/session.ts";
|
|
3
|
+
export type { PostgresConnectionOptions } from "./src/session.ts";
|
|
2
4
|
export { decodePointer, messageBusGrantStatements, provisionMessageBusSchema, resolvePersistenceOptions, } from "./src/persistence.ts";
|
|
3
5
|
export type { TopicPersistenceScope, TopicBusPersistenceOptions, StoredTopicMessage, TopicHistoryPage, TopicPointer, } from "./src/persistence.ts";
|
package/lib/exports.js
CHANGED
|
@@ -3,5 +3,6 @@
|
|
|
3
3
|
// functions to the package root. These are the call-site names, so they are
|
|
4
4
|
// importable directly from `@dbx-tools/postgres`.
|
|
5
5
|
export { withAdvisoryLock, withAdvisoryTransactionLock } from "./src/advisory-lock.js";
|
|
6
|
+
export { postgresConnectionOptions, postgresRoleStatement, postgresServerSettings, quotePostgresIdentifier, resolvePostgresRole, } from "./src/session.js";
|
|
6
7
|
export { decodePointer, messageBusGrantStatements, provisionMessageBusSchema, resolvePersistenceOptions, } from "./src/persistence.js";
|
|
7
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwb3J0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL2V4cG9ydHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsZ0ZBQWdGO0FBQ2hGLDRFQUE0RTtBQUM1RSw0RUFBNEU7QUFDNUUsa0RBQWtEO0FBQ2xELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZGLE9BQU8sRUFDTCx5QkFBeUIsRUFDekIscUJBQXFCLEVBQ3JCLHNCQUFzQixFQUN0Qix1QkFBdUIsRUFDdkIsbUJBQW1CLEdBQ3BCLE1BQU0sa0JBQWtCLENBQUM7QUFFMUIsT0FBTyxFQUNMLGFBQWEsRUFDYix5QkFBeUIsRUFDekIseUJBQXlCLEVBQ3pCLHlCQUF5QixHQUMxQixNQUFNLHNCQUFzQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gRmxhdCByZS1leHBvcnRzIGxheWVyZWQgb250byB0aGUgZ2VuZXJhdGVkIGBpbmRleC50c2AgYmFycmVsLCB3aGljaCBwdWJsaXNoZXNcbi8vIGVhY2ggbW9kdWxlIGFzIGEgbmFtZXNwYWNlIChgYWR2aXNvcnlMb2NrYCwgYHRvcGljQnVzYCkgYW5kIGRvZXMgbm90IGxpZnRcbi8vIGZ1bmN0aW9ucyB0byB0aGUgcGFja2FnZSByb290LiBUaGVzZSBhcmUgdGhlIGNhbGwtc2l0ZSBuYW1lcywgc28gdGhleSBhcmVcbi8vIGltcG9ydGFibGUgZGlyZWN0bHkgZnJvbSBgQGRieC10b29scy9wb3N0Z3Jlc2AuXG5leHBvcnQgeyB3aXRoQWR2aXNvcnlMb2NrLCB3aXRoQWR2aXNvcnlUcmFuc2FjdGlvbkxvY2sgfSBmcm9tIFwiLi9zcmMvYWR2aXNvcnktbG9jay50c1wiO1xuZXhwb3J0IHtcbiAgcG9zdGdyZXNDb25uZWN0aW9uT3B0aW9ucyxcbiAgcG9zdGdyZXNSb2xlU3RhdGVtZW50LFxuICBwb3N0Z3Jlc1NlcnZlclNldHRpbmdzLFxuICBxdW90ZVBvc3RncmVzSWRlbnRpZmllcixcbiAgcmVzb2x2ZVBvc3RncmVzUm9sZSxcbn0gZnJvbSBcIi4vc3JjL3Nlc3Npb24udHNcIjtcbmV4cG9ydCB0eXBlIHsgUG9zdGdyZXNDb25uZWN0aW9uT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9zZXNzaW9uLnRzXCI7XG5leHBvcnQge1xuICBkZWNvZGVQb2ludGVyLFxuICBtZXNzYWdlQnVzR3JhbnRTdGF0ZW1lbnRzLFxuICBwcm92aXNpb25NZXNzYWdlQnVzU2NoZW1hLFxuICByZXNvbHZlUGVyc2lzdGVuY2VPcHRpb25zLFxufSBmcm9tIFwiLi9zcmMvcGVyc2lzdGVuY2UudHNcIjtcbmV4cG9ydCB0eXBlIHtcbiAgVG9waWNQZXJzaXN0ZW5jZVNjb3BlLFxuICBUb3BpY0J1c1BlcnNpc3RlbmNlT3B0aW9ucyxcbiAgU3RvcmVkVG9waWNNZXNzYWdlLFxuICBUb3BpY0hpc3RvcnlQYWdlLFxuICBUb3BpY1BvaW50ZXIsXG59IGZyb20gXCIuL3NyYy9wZXJzaXN0ZW5jZS50c1wiO1xuIl19
|
package/lib/index.d.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
export declare const PACKAGE_IDENTIFIER = "@dbx-tools/postgres";
|
|
2
|
-
export declare const PACKAGE_VERSION = "0.9.
|
|
2
|
+
export declare const PACKAGE_VERSION = "0.9.61";
|
|
3
3
|
export * as advisoryLock from "./src/advisory-lock.ts";
|
|
4
|
+
export * as bindings from "./src/bindings.ts";
|
|
4
5
|
export * as identity from "./src/identity.ts";
|
|
5
6
|
export * as persistence from "./src/persistence.ts";
|
|
7
|
+
export * as session from "./src/session.ts";
|
|
6
8
|
export * as topicBus from "./src/topic-bus.ts";
|
|
7
9
|
export type { AdvisoryLockKey, PgPoolLike, PgQueryable } from "./src/advisory-lock.ts";
|
|
8
10
|
export { POINTER_VERSION } from "./src/persistence.ts";
|
package/lib/index.js
CHANGED
|
@@ -2,12 +2,14 @@
|
|
|
2
2
|
// Regenerated from the exporting modules in ./src.
|
|
3
3
|
// Hand edits are overwritten on the next watch; this file is read-only.
|
|
4
4
|
export const PACKAGE_IDENTIFIER = "@dbx-tools/postgres";
|
|
5
|
-
export const PACKAGE_VERSION = "0.9.
|
|
5
|
+
export const PACKAGE_VERSION = "0.9.61";
|
|
6
6
|
export * as advisoryLock from "./src/advisory-lock.js";
|
|
7
|
+
export * as bindings from "./src/bindings.js";
|
|
7
8
|
export * as identity from "./src/identity.js";
|
|
8
9
|
export * as persistence from "./src/persistence.js";
|
|
10
|
+
export * as session from "./src/session.js";
|
|
9
11
|
export * as topicBus from "./src/topic-bus.js";
|
|
10
12
|
export { POINTER_VERSION } from "./src/persistence.js";
|
|
11
13
|
export { PostgresTopicBus } from "./src/topic-bus.js";
|
|
12
14
|
export * from "./exports.js";
|
|
13
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxxQkFBcUIsQ0FBQztBQUN4RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxZQUFZLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxLQUFLLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEtBQUssUUFBUSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sS0FBSyxXQUFXLE1BQU0sc0JBQXNCLENBQUM7QUFDcEQsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEtBQUssUUFBUSxNQUFNLG9CQUFvQixDQUFDO0FBRS9DLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUV0RCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX0lERU5USUZJRVIgPSBcIkBkYngtdG9vbHMvcG9zdGdyZXNcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX1ZFUlNJT04gPSBcIjAuOS42MVwiO1xuZXhwb3J0ICogYXMgYWR2aXNvcnlMb2NrIGZyb20gXCIuL3NyYy9hZHZpc29yeS1sb2NrLnRzXCI7XG5leHBvcnQgKiBhcyBiaW5kaW5ncyBmcm9tIFwiLi9zcmMvYmluZGluZ3MudHNcIjtcbmV4cG9ydCAqIGFzIGlkZW50aXR5IGZyb20gXCIuL3NyYy9pZGVudGl0eS50c1wiO1xuZXhwb3J0ICogYXMgcGVyc2lzdGVuY2UgZnJvbSBcIi4vc3JjL3BlcnNpc3RlbmNlLnRzXCI7XG5leHBvcnQgKiBhcyBzZXNzaW9uIGZyb20gXCIuL3NyYy9zZXNzaW9uLnRzXCI7XG5leHBvcnQgKiBhcyB0b3BpY0J1cyBmcm9tIFwiLi9zcmMvdG9waWMtYnVzLnRzXCI7XG5leHBvcnQgdHlwZSB7IEFkdmlzb3J5TG9ja0tleSwgUGdQb29sTGlrZSwgUGdRdWVyeWFibGUgfSBmcm9tIFwiLi9zcmMvYWR2aXNvcnktbG9jay50c1wiO1xuZXhwb3J0IHsgUE9JTlRFUl9WRVJTSU9OIH0gZnJvbSBcIi4vc3JjL3BlcnNpc3RlbmNlLnRzXCI7XG5leHBvcnQgdHlwZSB7IER1cmF0aW9uSW5wdXQsIFJlc29sdmVkVG9waWNCdXNQZXJzaXN0ZW5jZU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvcGVyc2lzdGVuY2UudHNcIjtcbmV4cG9ydCB7IFBvc3RncmVzVG9waWNCdXMgfSBmcm9tIFwiLi9zcmMvdG9waWMtYnVzLnRzXCI7XG5leHBvcnQgdHlwZSB7IFRvcGljTWV0YWRhdGEsIFRvcGljTWVzc2FnZSwgVG9waWNQdWJsaXNoSW5wdXQsIFRvcGljTGlzdGVuZXIsIFRvcGljTWV0YWRhdGFQcm92aWRlciwgUG9zdGdyZXNUb3BpY0J1c09wdGlvbnMgfSBmcm9tIFwiLi9zcmMvdG9waWMtYnVzLnRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9leHBvcnRzLnRzXCI7XG4iXX0=
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
/** Binding-safe PostgreSQL session helpers. */
|
|
2
|
+
export { postgresRoleStatement, postgresServerSettings, quotePostgresIdentifier, resolvePostgresRole, } from "./session.js";
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmluZGluZ3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYmluZGluZ3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsc0JBQXNCLEVBQ3RCLHVCQUF1QixFQUN2QixtQkFBbUIsR0FDcEIsTUFBTSxjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQmluZGluZy1zYWZlIFBvc3RncmVTUUwgc2Vzc2lvbiBoZWxwZXJzLiAqL1xuZXhwb3J0IHtcbiAgcG9zdGdyZXNSb2xlU3RhdGVtZW50LFxuICBwb3N0Z3Jlc1NlcnZlclNldHRpbmdzLFxuICBxdW90ZVBvc3RncmVzSWRlbnRpZmllcixcbiAgcmVzb2x2ZVBvc3RncmVzUm9sZSxcbn0gZnJvbSBcIi4vc2Vzc2lvbi50c1wiO1xuIl19
|
package/lib/src/persistence.js
CHANGED
|
@@ -9,14 +9,14 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import { object } from "@dbx-tools/shared-core";
|
|
11
11
|
import { withAdvisoryTransactionLock } from "./advisory-lock.js";
|
|
12
|
+
import { quotePostgresIdentifier } from "./session.js";
|
|
12
13
|
const DEFAULT_TTL = "24 hours";
|
|
13
14
|
/**
|
|
14
15
|
* Pointer-payload version. A listener that does not recognize the version treats
|
|
15
16
|
* the notification as foreign traffic rather than guessing at its shape.
|
|
16
17
|
*/
|
|
17
18
|
export const POINTER_VERSION = 1;
|
|
18
|
-
const
|
|
19
|
-
const table = (options, scope) => `${quote(options.schema)}.${quote(options.tables[scope])}`;
|
|
19
|
+
const table = (options, scope) => `${quotePostgresIdentifier(options.schema)}.${quotePostgresIdentifier(options.tables[scope])}`;
|
|
20
20
|
/** Validate persistence scope and apply stable schema, table, TTL, and cleanup defaults. */
|
|
21
21
|
export function resolvePersistenceOptions(value) {
|
|
22
22
|
const configured = value === true ? {} : value;
|
|
@@ -40,24 +40,24 @@ export function resolvePersistenceOptions(value) {
|
|
|
40
40
|
/** Create the persistence schema, open and restricted tables, and replay indexes. */
|
|
41
41
|
export async function provisionMessageBusSchema(pool, options) {
|
|
42
42
|
await withAdvisoryTransactionLock(pool, ["dbx_message_bus", "schema"], async (client) => {
|
|
43
|
-
await client.query(`CREATE SCHEMA IF NOT EXISTS ${
|
|
44
|
-
await client.query(`CREATE TABLE IF NOT EXISTS ${
|
|
43
|
+
await client.query(`CREATE SCHEMA IF NOT EXISTS ${quotePostgresIdentifier(options.schema)}`);
|
|
44
|
+
await client.query(`CREATE TABLE IF NOT EXISTS ${quotePostgresIdentifier(options.schema)}.${quotePostgresIdentifier("schema_version")} (version INTEGER PRIMARY KEY)`);
|
|
45
45
|
for (const scope of ["open", "restricted"]) {
|
|
46
46
|
const name = table(options, scope);
|
|
47
47
|
await client.query(`CREATE TABLE IF NOT EXISTS ${name} (sequence BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, channel TEXT NOT NULL, topic TEXT NOT NULL, message_id TEXT NOT NULL, published_at TIMESTAMPTZ NOT NULL, expires_at TIMESTAMPTZ, xact_id XID8 NOT NULL DEFAULT pg_current_xact_id(), envelope JSONB NOT NULL, UNIQUE (channel, message_id), CHECK (jsonb_typeof(envelope) = 'object'))`);
|
|
48
|
-
await client.query(`CREATE INDEX IF NOT EXISTS ${
|
|
49
|
-
await client.query(`CREATE INDEX IF NOT EXISTS ${
|
|
48
|
+
await client.query(`CREATE INDEX IF NOT EXISTS ${quotePostgresIdentifier(`${options.tables[scope]}_replay_idx`)} ON ${name} (channel, topic, sequence)`);
|
|
49
|
+
await client.query(`CREATE INDEX IF NOT EXISTS ${quotePostgresIdentifier(`${options.tables[scope]}_expiry_idx`)} ON ${name} (expires_at) WHERE expires_at IS NOT NULL`);
|
|
50
50
|
}
|
|
51
|
-
await client.query(`INSERT INTO ${
|
|
51
|
+
await client.query(`INSERT INTO ${quotePostgresIdentifier(options.schema)}.${quotePostgresIdentifier("schema_version")} (version) VALUES (1) ON CONFLICT (version) DO NOTHING`);
|
|
52
52
|
});
|
|
53
53
|
}
|
|
54
54
|
/** Build SQL grants for roles that may read and write one persistence scope. */
|
|
55
55
|
export function messageBusGrantStatements(roles, scope, options) {
|
|
56
56
|
const selected = table(options, scope);
|
|
57
57
|
return (typeof roles === "string" ? [roles] : roles).flatMap((role) => [
|
|
58
|
-
`GRANT USAGE ON SCHEMA ${
|
|
59
|
-
`GRANT SELECT, INSERT, DELETE ON TABLE ${selected} TO ${
|
|
60
|
-
`GRANT SELECT ON TABLE ${
|
|
58
|
+
`GRANT USAGE ON SCHEMA ${quotePostgresIdentifier(options.schema)} TO ${quotePostgresIdentifier(role)};`,
|
|
59
|
+
`GRANT SELECT, INSERT, DELETE ON TABLE ${selected} TO ${quotePostgresIdentifier(role)};`,
|
|
60
|
+
`GRANT SELECT ON TABLE ${quotePostgresIdentifier(options.schema)}.${quotePostgresIdentifier("schema_version")} TO ${quotePostgresIdentifier(role)};`,
|
|
61
61
|
]);
|
|
62
62
|
}
|
|
63
63
|
function cursor(scope, sequence) {
|
|
@@ -160,4 +160,4 @@ export async function readPointer(queryable, channel, pointer, options) {
|
|
|
160
160
|
const result = await queryable.query(`SELECT envelope FROM ${table(options, pointer.scope)} WHERE channel = $1 AND message_id = $2 AND (expires_at IS NULL OR expires_at > clock_timestamp())`, [channel, pointer.id]);
|
|
161
161
|
return result.rows[0]?.envelope;
|
|
162
162
|
}
|
|
163
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVyc2lzdGVuY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGVyc2lzdGVuY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFFSCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFHaEQsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUE0Q2pFLE1BQU0sV0FBVyxHQUFHLFVBQVUsQ0FBQztBQUMvQjs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsQ0FBQyxDQUFDO0FBQ2pDLE1BQU0sS0FBSyxHQUFHLENBQUMsS0FBYSxFQUFVLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUM7QUFDNUUsTUFBTSxLQUFLLEdBQUcsQ0FBQyxPQUEyQyxFQUFFLEtBQTRCLEVBQVUsRUFBRSxDQUNsRyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBRTdELDRGQUE0RjtBQUM1RixNQUFNLFVBQVUseUJBQXlCLENBQ3ZDLEtBQXdDO0lBRXhDLE1BQU0sVUFBVSxHQUFHLEtBQUssS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQy9DLE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLElBQUksTUFBTSxDQUFDO0lBQ3pDLElBQUksS0FBSyxLQUFLLE1BQU0sSUFBSSxLQUFLLEtBQUssWUFBWSxFQUFFLENBQUM7UUFDL0MsTUFBTSxJQUFJLFNBQVMsQ0FBQyw4QkFBOEIsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBQ0QsT0FBTztRQUNMLE1BQU0sRUFBRSxV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QU8sRUFBRSxLQUFLLFFBQVEsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUN4RixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDO0FBQ3hDLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxXQUFXLENBQy9CLFNBQXNCLEVBQ3RCLE9BQWUsRUFDZixPQUFxQixFQUNyQixPQUEyQztJQUUzQyxNQUFNLE1BQU0sR0FBRyxNQUFNLFNBQVMsQ0FBQyxLQUFLLENBQ2xDLHdCQUF3QixLQUFLLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsb0dBQW9HLEVBQ3pKLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FDdEIsQ0FBQztJQUNGLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUEyQyxDQUFDO0FBQ3JFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIER1cmFibGUgcmVwbGF5IGFuZCBwb2ludGVyIHBheWxvYWRzIGZvciB7QGxpbmsgUG9zdGdyZXNUb3BpY0J1c30uXG4gKlxuICogVGhpcyBtb2R1bGUgb3ducyBzY2hlbWEgcHJvdmlzaW9uaW5nLCBncmFudHMsIFRUTCBjbGVhbnVwLCByZXBsYXkgY3Vyc29ycyxcbiAqIGFuZCBvcGVuL3Jlc3RyaWN0ZWQgcGVyc2lzdGVuY2Ugc2NvcGVzLiBSZXVzZSBpdCB3aGVuIGEgdG9waWMtYnVzIGNvbnN1bWVyXG4gKiBuZWVkcyBoaXN0b3J5IG9yIGxhcmdlciBwYXlsb2FkcyBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgcGFyYWxsZWwgbWVzc2FnZSB0YWJsZS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgb2JqZWN0IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB0eXBlIHsgUXVlcnlSZXN1bHRSb3cgfSBmcm9tIFwicGdcIjtcbmltcG9ydCB0eXBlIHsgUGdQb29sTGlrZSwgUGdRdWVyeWFibGUgfSBmcm9tIFwiLi9hZHZpc29yeS1sb2NrLnRzXCI7XG5pbXBvcnQgeyB3aXRoQWR2aXNvcnlUcmFuc2FjdGlvbkxvY2sgfSBmcm9tIFwiLi9hZHZpc29yeS1sb2NrLnRzXCI7XG5pbXBvcnQgdHlwZSB7IFRvcGljTWVzc2FnZSB9IGZyb20gXCIuL3RvcGljLWJ1cy50c1wiO1xuXG4vKiogU3RvcmFnZSBhbmQgZ3JhbnQgdGllciBmb3IgcGVyc2lzdGVkIHRvcGljIG1lc3NhZ2VzLiAqL1xuZXhwb3J0IHR5cGUgVG9waWNQZXJzaXN0ZW5jZVNjb3BlID0gXCJvcGVuXCIgfCBcInJlc3RyaWN0ZWRcIjtcbi8qKiBQb3N0Z3JlU1FMIGludGVydmFsIHRleHQgb3IgbWlsbGlzZWNvbmQgZHVyYXRpb24gYWNjZXB0ZWQgZm9yIG1lc3NhZ2UgZXhwaXJ5LiAqL1xuZXhwb3J0IHR5cGUgRHVyYXRpb25JbnB1dCA9IHN0cmluZyB8IG51bWJlcjtcbi8qKiBPcHRpb25hbCBzY2hlbWEsIHRhYmxlLCBleHBpcnksIHBheWxvYWQsIGFuZCBwcm92aXNpb25pbmcgc2V0dGluZ3MgZm9yIHRvcGljIHBlcnNpc3RlbmNlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb3BpY0J1c1BlcnNpc3RlbmNlT3B0aW9ucyB7XG4gIHNjaGVtYT86IHN0cmluZztcbiAgc2NvcGU/OiBUb3BpY1BlcnNpc3RlbmNlU2NvcGU7XG4gIHRhYmxlcz86IFBhcnRpYWw8UmVjb3JkPFRvcGljUGVyc2lzdGVuY2VTY29wZSwgc3RyaW5nPj47XG4gIHR0bD86IER1cmF0aW9uSW5wdXQgfCBmYWxzZTtcbiAgcGF5bG9hZD86IFwiZW52ZWxvcGVcIiB8IFwicG9pbnRlclwiO1xuICBjbGVhbnVwQmF0Y2hTaXplPzogbnVtYmVyO1xuICBwcm92aXNpb24/OiBib29sZWFuO1xufVxuLyoqIENvbXBsZXRlIHBlcnNpc3RlbmNlIHNldHRpbmdzIGFmdGVyIGRlZmF1bHRzIGFyZSBhcHBsaWVkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZFRvcGljQnVzUGVyc2lzdGVuY2VPcHRpb25zIHtcbiAgc2NoZW1hOiBzdHJpbmc7XG4gIHNjb3BlOiBUb3BpY1BlcnNpc3RlbmNlU2NvcGU7XG4gIHRhYmxlczogUmVjb3JkPFRvcGljUGVyc2lzdGVuY2VTY29wZSwgc3RyaW5nPjtcbiAgdHRsOiBEdXJhdGlvbklucHV0IHwgZmFsc2U7XG4gIHBheWxvYWQ6IFwiZW52ZWxvcGVcIiB8IFwicG9pbnRlclwiO1xuICBjbGVhbnVwQmF0Y2hTaXplOiBudW1iZXI7XG4gIHByb3Zpc2lvbjogYm9vbGVhbjtcbn1cbi8qKiBQZXJzaXN0ZWQgdG9waWMgbWVzc2FnZSBwbHVzIHJlcGxheSBjdXJzb3IsIHNjb3BlLCBhbmQgZXhwaXJ5IG1ldGFkYXRhLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdG9yZWRUb3BpY01lc3NhZ2U8XG4gIFRCb2R5IGV4dGVuZHMgb2JqZWN0LlNlcmlhbGl6YWJsZVZhbHVlID0gb2JqZWN0LlNlcmlhbGl6YWJsZVZhbHVlLFxuPiB7XG4gIGN1cnNvcjogc3RyaW5nO1xuICBleHBpcmVzQXQ6IHN0cmluZyB8IG51bGw7XG4gIHNjb3BlOiBUb3BpY1BlcnNpc3RlbmNlU2NvcGU7XG4gIG1lc3NhZ2U6IFRvcGljTWVzc2FnZTxUQm9keT47XG59XG4vKiogT3JkZXJlZCByZXBsYXkgcGFnZSBhbmQgb3B0aW9uYWwgY3Vyc29yIGZvciB0aGUgbmV4dCBwYWdlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb3BpY0hpc3RvcnlQYWdlPFxuICBUQm9keSBleHRlbmRzIG9iamVjdC5TZXJpYWxpemFibGVWYWx1ZSA9IG9iamVjdC5TZXJpYWxpemFibGVWYWx1ZSxcbj4ge1xuICBtZXNzYWdlczogU3RvcmVkVG9waWNNZXNzYWdlPFRCb2R5PltdO1xuICBuZXh0Q3Vyc29yPzogc3RyaW5nO1xufVxuXG5jb25zdCBERUZBVUxUX1RUTCA9IFwiMjQgaG91cnNcIjtcbi8qKlxuICogUG9pbnRlci1wYXlsb2FkIHZlcnNpb24uIEEgbGlzdGVuZXIgdGhhdCBkb2VzIG5vdCByZWNvZ25pemUgdGhlIHZlcnNpb24gdHJlYXRzXG4gKiB0aGUgbm90aWZpY2F0aW9uIGFzIGZvcmVpZ24gdHJhZmZpYyByYXRoZXIgdGhhbiBndWVzc2luZyBhdCBpdHMgc2hhcGUuXG4gKi9cbmV4cG9ydCBjb25zdCBQT0lOVEVSX1ZFUlNJT04gPSAxO1xuY29uc3QgcXVvdGUgPSAodmFsdWU6IHN0cmluZyk6IHN0cmluZyA9PiBgXCIke3ZhbHVlLnJlcGxhY2VBbGwoJ1wiJywgJ1wiXCInKX1cImA7XG5jb25zdCB0YWJsZSA9IChvcHRpb25zOiBSZXNvbHZlZFRvcGljQnVzUGVyc2lzdGVuY2VPcHRpb25zLCBzY29wZTogVG9waWNQZXJzaXN0ZW5jZVNjb3BlKTogc3RyaW5nID0+XG4gIGAke3F1b3RlKG9wdGlvbnMuc2NoZW1hKX0uJHtxdW90ZShvcHRpb25zLnRhYmxlc1tzY29wZV0pfWA7XG5cbi8qKiBWYWxpZGF0ZSBwZXJzaXN0ZW5jZSBzY29wZSBhbmQgYXBwbHkgc3RhYmxlIHNjaGVtYSwgdGFibGUsIFRUTCwgYW5kIGNsZWFudXAgZGVmYXVsdHMuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVBlcnNpc3RlbmNlT3B0aW9ucyhcbiAgdmFsdWU6IHRydWUgfCBUb3BpY0J1c1BlcnNpc3RlbmNlT3B0aW9ucyxcbik6IFJlc29sdmVkVG9waWNCdXNQZXJzaXN0ZW5jZU9wdGlvbnMge1xuICBjb25zdCBjb25maWd1cmVkID0gdmFsdWUgPT09IHRydWUgPyB7fSA6IHZhbHVlO1xuICBjb25zdCBzY29wZSA9IGNvbmZpZ3VyZWQuc2NvcGUgPz8gXCJvcGVuXCI7XG4gIGlmIChzY29wZSAhPT0gXCJvcGVuXCIgJiYgc2NvcGUgIT09IFwicmVzdHJpY3RlZFwiKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgVW5rbm93biBwZXJzaXN0ZW5jZSBzY29wZTogJHtTdHJpbmcoc2NvcGUpfWApO1xuICB9XG4gIHJldHVybiB7XG4gICAgc2NoZW1hOiBjb25maWd1cmVkLnNjaGVtYSA/PyBcImRieF9tZXNzYWdlX2J1c1wiLFxuICAgIHNjb3BlLFxuICAgIHRhYmxlczoge1xuICAgICAgb3BlbjogY29uZmlndXJlZC50YWJsZXM/Lm9wZW4gPz8gXCJvcGVuX21lc3NhZ2VzXCIsXG4gICAgICByZXN0cmljdGVkOiBjb25maWd1cmVkLnRhYmxlcz8ucmVzdHJpY3RlZCA/PyBcInJlc3RyaWN0ZWRfbWVzc2FnZXNcIixcbiAgICB9LFxuICAgIHR0bDogY29uZmlndXJlZC50dGwgPz8gREVGQVVMVF9UVEwsXG4gICAgcGF5bG9hZDogY29uZmlndXJlZC5wYXlsb2FkID8/IFwiZW52ZWxvcGVcIixcbiAgICBjbGVhbnVwQmF0Y2hTaXplOiBjb25maWd1cmVkLmNsZWFudXBCYXRjaFNpemUgPz8gMTAwMCxcbiAgICBwcm92aXNpb246IGNvbmZpZ3VyZWQucHJvdmlzaW9uID8/IHRydWUsXG4gIH07XG59XG5cbi8qKiBDcmVhdGUgdGhlIHBlcnNpc3RlbmNlIHNjaGVtYSwgb3BlbiBhbmQgcmVzdHJpY3RlZCB0YWJsZXMsIGFuZCByZXBsYXkgaW5kZXhlcy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm92aXNpb25NZXNzYWdlQnVzU2NoZW1hKFxuICBwb29sOiBQZ1Bvb2xMaWtlLFxuICBvcHRpb25zOiBSZXNvbHZlZFRvcGljQnVzUGVyc2lzdGVuY2VPcHRpb25zLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHdpdGhBZHZpc29yeVRyYW5zYWN0aW9uTG9jayhwb29sLCBbXCJkYnhfbWVzc2FnZV9idXNcIiwgXCJzY2hlbWFcIl0sIGFzeW5jIChjbGllbnQpID0+IHtcbiAgICBhd2FpdCBjbGllbnQucXVlcnkoYENSRUFURSBTQ0hFTUEgSUYgTk9UIEVYSVNUUyAke3F1b3RlKG9wdGlvbnMuc2NoZW1hKX1gKTtcbiAgICBhd2FpdCBjbGllbnQucXVlcnkoXG4gICAgICBgQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgJHtxdW90ZShvcHRpb25zLnNjaGVtYSl9LiR7cXVvdGUoXCJzY2hlbWFfdmVyc2lvblwiKX0gKHZlcnNpb24gSU5URUdFUiBQUklNQVJZIEtFWSlgLFxuICAgICk7XG4gICAgZm9yIChjb25zdCBzY29wZSBvZiBbXCJvcGVuXCIsIFwicmVzdHJpY3RlZFwiXSBhcyBjb25zdCkge1xuICAgICAgY29uc3QgbmFtZSA9IHRhYmxlKG9wdGlvbnMsIHNjb3BlKTtcbiAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShcbiAgICAgICAgYENSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTICR7bmFtZX0gKHNlcXVlbmNlIEJJR0lOVCBHRU5FUkFURUQgQUxXQVlTIEFTIElERU5USVRZIFBSSU1BUlkgS0VZLCBjaGFubmVsIFRFWFQgTk9UIE5VTEwsIHRvcGljIFRFWFQgTk9UIE5VTEwsIG1lc3NhZ2VfaWQgVEVYVCBOT1QgTlVMTCwgcHVibGlzaGVkX2F0IFRJTUVTVEFNUFRaIE5PVCBOVUxMLCBleHBpcmVzX2F0IFRJTUVTVEFNUFRaLCB4YWN0X2lkIFhJRDggTk9UIE5VTEwgREVGQVVMVCBwZ19jdXJyZW50X3hhY3RfaWQoKSwgZW52ZWxvcGUgSlNPTkIgTk9UIE5VTEwsIFVOSVFVRSAoY2hhbm5lbCwgbWVzc2FnZV9pZCksIENIRUNLIChqc29uYl90eXBlb2YoZW52ZWxvcGUpID0gJ29iamVjdCcpKWAsXG4gICAgICApO1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KFxuICAgICAgICBgQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgJHtxdW90ZShgJHtvcHRpb25zLnRhYmxlc1tzY29wZV19X3JlcGxheV9pZHhgKX0gT04gJHtuYW1lfSAoY2hhbm5lbCwgdG9waWMsIHNlcXVlbmNlKWAsXG4gICAgICApO1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KFxuICAgICAgICBgQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgJHtxdW90ZShgJHtvcHRpb25zLnRhYmxlc1tzY29wZV19X2V4cGlyeV9pZHhgKX0gT04gJHtuYW1lfSAoZXhwaXJlc19hdCkgV0hFUkUgZXhwaXJlc19hdCBJUyBOT1QgTlVMTGAsXG4gICAgICApO1xuICAgIH1cbiAgICBhd2FpdCBjbGllbnQucXVlcnkoXG4gICAgICBgSU5TRVJUIElOVE8gJHtxdW90ZShvcHRpb25zLnNjaGVtYSl9LiR7cXVvdGUoXCJzY2hlbWFfdmVyc2lvblwiKX0gKHZlcnNpb24pIFZBTFVFUyAoMSkgT04gQ09ORkxJQ1QgKHZlcnNpb24pIERPIE5PVEhJTkdgLFxuICAgICk7XG4gIH0pO1xufVxuXG4vKiogQnVpbGQgU1FMIGdyYW50cyBmb3Igcm9sZXMgdGhhdCBtYXkgcmVhZCBhbmQgd3JpdGUgb25lIHBlcnNpc3RlbmNlIHNjb3BlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lc3NhZ2VCdXNHcmFudFN0YXRlbWVudHMoXG4gIHJvbGVzOiBzdHJpbmcgfCByZWFkb25seSBzdHJpbmdbXSxcbiAgc2NvcGU6IFRvcGljUGVyc2lzdGVuY2VTY29wZSxcbiAgb3B0aW9uczogUmVzb2x2ZWRUb3BpY0J1c1BlcnNpc3RlbmNlT3B0aW9ucyxcbik6IHN0cmluZ1tdIHtcbiAgY29uc3Qgc2VsZWN0ZWQgPSB0YWJsZShvcHRpb25zLCBzY29wZSk7XG4gIHJldHVybiAodHlwZW9mIHJvbGVzID09PSBcInN0cmluZ1wiID8gW3JvbGVzXSA6IHJvbGVzKS5mbGF0TWFwKChyb2xlKSA9PiBbXG4gICAgYEdSQU5UIFVTQUdFIE9OIFNDSEVNQSAke3F1b3RlKG9wdGlvbnMuc2NoZW1hKX0gVE8gJHtxdW90ZShyb2xlKX07YCxcbiAgICBgR1JBTlQgU0VMRUNULCBJTlNFUlQsIERFTEVURSBPTiBUQUJMRSAke3NlbGVjdGVkfSBUTyAke3F1b3RlKHJvbGUpfTtgLFxuICAgIGBHUkFOVCBTRUxFQ1QgT04gVEFCTEUgJHtxdW90ZShvcHRpb25zLnNjaGVtYSl9LiR7cXVvdGUoXCJzY2hlbWFfdmVyc2lvblwiKX0gVE8gJHtxdW90ZShyb2xlKX07YCxcbiAgXSk7XG59XG5cbmZ1bmN0aW9uIGN1cnNvcihzY29wZTogVG9waWNQZXJzaXN0ZW5jZVNjb3BlLCBzZXF1ZW5jZTogc3RyaW5nIHwgbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KFtzY29wZSwgU3RyaW5nKHNlcXVlbmNlKV0pKS50b1N0cmluZyhcImJhc2U2NHVybFwiKTtcbn1cbmZ1bmN0aW9uIGFmdGVyKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQsIHNjb3BlOiBUb3BpY1BlcnNpc3RlbmNlU2NvcGUpOiBzdHJpbmcge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gXCIwXCI7XG4gIGNvbnN0IGRlY29kZWQgPSBKU09OLnBhcnNlKEJ1ZmZlci5mcm9tKHZhbHVlLCBcImJhc2U2NHVybFwiKS50b1N0cmluZygpKSBhcyBbc3RyaW5nLCBzdHJpbmddO1xuICBpZiAoZGVjb2RlZFswXSAhPT0gc2NvcGUpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSGlzdG9yeSBjdXJzb3IgYmVsb25ncyB0byBhbm90aGVyIHBlcnNpc3RlbmNlIHNjb3BlXCIpO1xuICB9XG4gIHJldHVybiBkZWNvZGVkWzFdO1xufVxuXG4vKiogQ29udmVydCBhIHBlcnNpc3RlbmNlIFRUTCB0byBtaWxsaXNlY29uZHMsIHByZXNlcnZpbmcgZGlzYWJsZWQgcmV0ZW50aW9uLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHR0bE1pbGxpc2Vjb25kcyh2YWx1ZTogRHVyYXRpb25JbnB1dCB8IGZhbHNlKTogbnVtYmVyIHwgbnVsbCB7XG4gIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHJldHVybiBudWxsO1xuICBjb25zdCBtaWxsaXNlY29uZHMgPSBvYmplY3QudG9EdXJhdGlvbih2YWx1ZSk7XG4gIGlmIChtaWxsaXNlY29uZHMgPT09IHVuZGVmaW5lZCB8fCBtaWxsaXNlY29uZHMgPD0gMCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgcGVyc2lzdGVuY2UgVFRMOiAke1N0cmluZyh2YWx1ZSl9YCk7XG4gIH1cbiAgcmV0dXJuIG1pbGxpc2Vjb25kcztcbn1cblxuLyoqIERlbGV0ZSBvbmUgYm91bmRlZCBiYXRjaCBvZiBleHBpcmVkIHBlcnNpc3RlZCB0b3BpYyBtZXNzYWdlcy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjbGVhbnVwRXhwaXJlZChcbiAgcXVlcnlhYmxlOiBQZ1F1ZXJ5YWJsZSxcbiAgb3B0aW9uczogUmVzb2x2ZWRUb3BpY0J1c1BlcnNpc3RlbmNlT3B0aW9ucyxcbiAgc2NvcGU6IFRvcGljUGVyc2lzdGVuY2VTY29wZSxcbiAgbGltaXQgPSBvcHRpb25zLmNsZWFudXBCYXRjaFNpemUsXG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBxdWVyeWFibGUucXVlcnkoXG4gICAgYFdJVEggZXhwaXJlZCBBUyAoU0VMRUNUIGN0aWQgRlJPTSAke3RhYmxlKG9wdGlvbnMsIHNjb3BlKX0gV0hFUkUgZXhwaXJlc19hdCBJUyBOT1QgTlVMTCBBTkQgZXhwaXJlc19hdCA8PSBjbG9ja190aW1lc3RhbXAoKSBPUkRFUiBCWSBleHBpcmVzX2F0IExJTUlUICQxKSBERUxFVEUgRlJPTSAke3RhYmxlKG9wdGlvbnMsIHNjb3BlKX0gQVMgbWVzc2FnZXMgVVNJTkcgZXhwaXJlZCBXSEVSRSBtZXNzYWdlcy5jdGlkID0gZXhwaXJlZC5jdGlkYCxcbiAgICBbbGltaXRdLFxuICApO1xuICByZXR1cm4gcmVzdWx0LnJvd0NvdW50ID8/IDA7XG59XG5cbnR5cGUgSGlzdG9yeVJvdyA9IFF1ZXJ5UmVzdWx0Um93ICYge1xuICBzZXF1ZW5jZTogc3RyaW5nO1xuICBleHBpcmVzX2F0OiBEYXRlIHwgc3RyaW5nIHwgbnVsbDtcbiAgZW52ZWxvcGU6IFRvcGljTWVzc2FnZTtcbn07XG5cbi8qKiBSZWFkIGEgY3Vyc29yLXBhZ2luYXRlZCBwYWdlIG9mIHBlcnNpc3RlZCB0b3BpYyBoaXN0b3J5LiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhpc3Rvcnk8VEJvZHkgZXh0ZW5kcyBvYmplY3QuU2VyaWFsaXphYmxlVmFsdWU+KFxuICBxdWVyeWFibGU6IFBnUXVlcnlhYmxlLFxuICBjaGFubmVsOiBzdHJpbmcsXG4gIHRvcGljOiBzdHJpbmcsXG4gIG9wdGlvbnM6IFJlc29sdmVkVG9waWNCdXNQZXJzaXN0ZW5jZU9wdGlvbnMsXG4gIGlucHV0OiB7IGFmdGVyPzogc3RyaW5nOyBsaW1pdD86IG51bWJlcjsgc2NvcGU/OiBUb3BpY1BlcnNpc3RlbmNlU2NvcGUgfSA9IHt9LFxuKTogUHJvbWlzZTxUb3BpY0hpc3RvcnlQYWdlPFRCb2R5Pj4ge1xuICBjb25zdCBzY29wZSA9IGlucHV0LnNjb3BlID8/IG9wdGlvbnMuc2NvcGU7XG4gIGNvbnN0IGxpbWl0ID0gaW5wdXQubGltaXQgPz8gMTAwO1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBxdWVyeWFibGUucXVlcnk8SGlzdG9yeVJvdz4oXG4gICAgYFNFTEVDVCBzZXF1ZW5jZSwgZXhwaXJlc19hdCwgZW52ZWxvcGUgRlJPTSAke3RhYmxlKG9wdGlvbnMsIHNjb3BlKX0gV0hFUkUgY2hhbm5lbCA9ICQxIEFORCB0b3BpYyA9ICQyIEFORCBzZXF1ZW5jZSA+ICQzOjpiaWdpbnQgQU5EIChleHBpcmVzX2F0IElTIE5VTEwgT1IgZXhwaXJlc19hdCA+IGNsb2NrX3RpbWVzdGFtcCgpKSBPUkRFUiBCWSBzZXF1ZW5jZSBMSU1JVCAkNGAsXG4gICAgW2NoYW5uZWwsIHRvcGljLCBhZnRlcihpbnB1dC5hZnRlciwgc2NvcGUpLCBsaW1pdF0sXG4gICk7XG4gIGNvbnN0IG1lc3NhZ2VzID0gcmVzdWx0LnJvd3MubWFwKChyb3cpID0+ICh7XG4gICAgY3Vyc29yOiBjdXJzb3Ioc2NvcGUsIHJvdy5zZXF1ZW5jZSksXG4gICAgZXhwaXJlc0F0OiByb3cuZXhwaXJlc19hdCA9PT0gbnVsbCA/IG51bGwgOiBuZXcgRGF0ZShyb3cuZXhwaXJlc19hdCkudG9JU09TdHJpbmcoKSxcbiAgICBzY29wZSxcbiAgICBtZXNzYWdlOiByb3cuZW52ZWxvcGUgYXMgVG9waWNNZXNzYWdlPFRCb2R5PixcbiAgfSkpO1xuICByZXR1cm4ge1xuICAgIG1lc3NhZ2VzLFxuICAgIC4uLihtZXNzYWdlcy5sZW5ndGggPT09IGxpbWl0ID8geyBuZXh0Q3Vyc29yOiBtZXNzYWdlcy5hdCgtMSkhLmN1cnNvciB9IDoge30pLFxuICB9O1xufVxuXG4vKiogUGVyc2lzdCBhIHRvcGljIG1lc3NhZ2UgYW5kIG5vdGlmeSBsaXN0ZW5lcnMgaW4gb25lIHRyYW5zYWN0aW9uLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBlcnNpc3RlZE5vdGlmeShcbiAgY2xpZW50OiBQZ1F1ZXJ5YWJsZSxcbiAgY2hhbm5lbDogc3RyaW5nLFxuICB0b3BpYzogc3RyaW5nLFxuICBtZXNzYWdlOiBUb3BpY01lc3NhZ2UsXG4gIGVuY29kZWQ6IHN0cmluZyxcbiAgb3B0aW9uczogUmVzb2x2ZWRUb3BpY0J1c1BlcnNpc3RlbmNlT3B0aW9ucyxcbiAgc2NvcGU6IFRvcGljUGVyc2lzdGVuY2VTY29wZSxcbiAgdHRsOiBEdXJhdGlvbklucHV0IHwgZmFsc2UsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgY2xlYW51cEV4cGlyZWQoY2xpZW50LCBvcHRpb25zLCBzY29wZSk7XG4gIGNvbnN0IG1pbGxpc2Vjb25kcyA9IHR0bE1pbGxpc2Vjb25kcyh0dGwpO1xuICBjb25zdCBpbnNlcnRlZCA9IGF3YWl0IGNsaWVudC5xdWVyeTxRdWVyeVJlc3VsdFJvdyAmIHsgc2VxdWVuY2U6IHN0cmluZyB9PihcbiAgICBgSU5TRVJUIElOVE8gJHt0YWJsZShvcHRpb25zLCBzY29wZSl9IChjaGFubmVsLCB0b3BpYywgbWVzc2FnZV9pZCwgcHVibGlzaGVkX2F0LCBleHBpcmVzX2F0LCBlbnZlbG9wZSkgVkFMVUVTICgkMSwgJDIsICQzLCAkNCwgQ0FTRSBXSEVOICQ1OjpiaWdpbnQgSVMgTlVMTCBUSEVOIE5VTEwgRUxTRSBjbG9ja190aW1lc3RhbXAoKSArICgkNTo6YmlnaW50ICogaW50ZXJ2YWwgJzEgbWlsbGlzZWNvbmQnKSBFTkQsICQ2Ojpqc29uYikgUkVUVVJOSU5HIHNlcXVlbmNlYCxcbiAgICBbY2hhbm5lbCwgdG9waWMsIG1lc3NhZ2UuaWQsIG1lc3NhZ2UucHVibGlzaGVkQXQsIG1pbGxpc2Vjb25kcywgZW5jb2RlZF0sXG4gICk7XG4gIC8vIFRoZSByb3cgYW5kIHRoZSBub3RpZmljYXRpb24gY29tbWl0IHRvZ2V0aGVyLCBzbyBhIHBvaW50ZXIgaXMgbmV2ZXIgZGVsaXZlcmVkXG4gIC8vIGJlZm9yZSB0aGUgcm93IGl0IG5hbWVzIGlzIHJlYWRhYmxlIC0gYE5PVElGWWAgaXMgZGVsaXZlcmVkIGF0IENPTU1JVCwgbm90IGF0XG4gIC8vIHN0YXRlbWVudCB0aW1lLlxuICBjb25zdCBwYXlsb2FkID1cbiAgICBvcHRpb25zLnBheWxvYWQgPT09IFwicG9pbnRlclwiXG4gICAgICA/IHBvaW50ZXJQYXlsb2FkKHNjb3BlLCB0b3BpYywgbWVzc2FnZS5pZCwgaW5zZXJ0ZWQucm93c1swXT8uc2VxdWVuY2UgPz8gXCIwXCIpXG4gICAgICA6IGVuY29kZWQ7XG4gIGF3YWl0IGNsaWVudC5xdWVyeShcIlNFTEVDVCBwZ19ub3RpZnkoJDEsICQyKVwiLCBbY2hhbm5lbCwgcGF5bG9hZF0pO1xufVxuXG4vKipcbiAqIFRoZSBgcGF5bG9hZDogXCJwb2ludGVyXCJgIG5vdGlmaWNhdGlvbiBib2R5OiByb3V0aW5nIGFuZCBpZGVudGl0eSBvbmx5LCBzbyB0aGVcbiAqIHNpemUgbGltaXQgZG9lcyBub3QgYXBwbHkgYW5kIGEgbGlzdGVuZXIgd2l0aG91dCB0aGUgdGFibGUgZ3JhbnQgbGVhcm5zIHRoYXRcbiAqIHNvbWV0aGluZyBoYXBwZW5lZCB3aXRob3V0IGxlYXJuaW5nIHdoYXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwb2ludGVyUGF5bG9hZChcbiAgc2NvcGU6IFRvcGljUGVyc2lzdGVuY2VTY29wZSxcbiAgdG9waWM6IHN0cmluZyxcbiAgaWQ6IHN0cmluZyxcbiAgc2VxdWVuY2U6IHN0cmluZyB8IG51bWJlcixcbik6IHN0cmluZyB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeSh7IHY6IFBPSU5URVJfVkVSU0lPTiwgc2NvcGUsIHRvcGljLCBpZCwgc2VxdWVuY2U6IFN0cmluZyhzZXF1ZW5jZSkgfSk7XG59XG5cbi8qKiBBIGRlY29kZWQgcG9pbnRlciBub3RpZmljYXRpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIFRvcGljUG9pbnRlciB7XG4gIHNjb3BlOiBUb3BpY1BlcnNpc3RlbmNlU2NvcGU7XG4gIHRvcGljOiBzdHJpbmc7XG4gIGlkOiBzdHJpbmc7XG4gIHNlcXVlbmNlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVhZCBhIG5vdGlmaWNhdGlvbiBhcyBhIHBvaW50ZXIsIG9yIGB1bmRlZmluZWRgIHdoZW4gaXQgaXMgbm90IG9uZS4gVGhlIGNoYW5uZWxcbiAqIGlzIHNoYXJlZCwgc28gYW4gdW5yZWNvZ25pemVkIHBheWxvYWQgaXMgb3JkaW5hcnkgdHJhZmZpYyByYXRoZXIgdGhhbiBhbiBlcnJvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZVBvaW50ZXIodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IFRvcGljUG9pbnRlciB8IHVuZGVmaW5lZCB7XG4gIGlmICghdmFsdWUpIHJldHVybiB1bmRlZmluZWQ7XG4gIGxldCByZWNvcmQ6IHVua25vd247XG4gIHRyeSB7XG4gICAgcmVjb3JkID0gSlNPTi5wYXJzZSh2YWx1ZSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKCFyZWNvcmQgfHwgdHlwZW9mIHJlY29yZCAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHJlY29yZCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGNhbmRpZGF0ZSA9IHJlY29yZCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgaWYgKGNhbmRpZGF0ZS52ICE9PSBQT0lOVEVSX1ZFUlNJT04pIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHsgc2NvcGUsIHRvcGljLCBpZCwgc2VxdWVuY2UgfSA9IGNhbmRpZGF0ZTtcbiAgaWYgKHNjb3BlICE9PSBcIm9wZW5cIiAmJiBzY29wZSAhPT0gXCJyZXN0cmljdGVkXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICh0eXBlb2YgdG9waWMgIT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIGlkICE9PSBcInN0cmluZ1wiIHx8IHR5cGVvZiBzZXF1ZW5jZSAhPT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIHsgc2NvcGUsIHRvcGljLCBpZCwgc2VxdWVuY2UgfTtcbn1cblxuLyoqXG4gKiBGZXRjaCB0aGUgb25lIHN0b3JlZCBlbnZlbG9wZSBhIHBvaW50ZXIgbmFtZXMuIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiB0aGUgcm93XG4gKiBpcyBnb25lIChUVEwgY2xlYW51cCB3b24gdGhlIHJhY2UpIG9yIHRoZSByZWFkZXIgbGFja3MgdGhlIHRhYmxlJ3MgZ3JhbnQsIGJvdGhcbiAqIG9mIHdoaWNoIGFyZSBleHBlY3RlZCBvbiB0aGUgYHJlc3RyaWN0ZWRgIHRpZXIgcmF0aGVyIHRoYW4gZXJyb3JzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZFBvaW50ZXI8VEJvZHkgZXh0ZW5kcyBvYmplY3QuU2VyaWFsaXphYmxlVmFsdWU+KFxuICBxdWVyeWFibGU6IFBnUXVlcnlhYmxlLFxuICBjaGFubmVsOiBzdHJpbmcsXG4gIHBvaW50ZXI6IFRvcGljUG9pbnRlcixcbiAgb3B0aW9uczogUmVzb2x2ZWRUb3BpY0J1c1BlcnNpc3RlbmNlT3B0aW9ucyxcbik6IFByb21pc2U8VG9waWNNZXNzYWdlPFRCb2R5PiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBxdWVyeWFibGUucXVlcnk8UXVlcnlSZXN1bHRSb3cgJiB7IGVudmVsb3BlOiBUb3BpY01lc3NhZ2UgfT4oXG4gICAgYFNFTEVDVCBlbnZlbG9wZSBGUk9NICR7dGFibGUob3B0aW9ucywgcG9pbnRlci5zY29wZSl9IFdIRVJFIGNoYW5uZWwgPSAkMSBBTkQgbWVzc2FnZV9pZCA9ICQyIEFORCAoZXhwaXJlc19hdCBJUyBOVUxMIE9SIGV4cGlyZXNfYXQgPiBjbG9ja190aW1lc3RhbXAoKSlgLFxuICAgIFtjaGFubmVsLCBwb2ludGVyLmlkXSxcbiAgKTtcbiAgcmV0dXJuIHJlc3VsdC5yb3dzWzBdPy5lbnZlbG9wZSBhcyBUb3BpY01lc3NhZ2U8VEJvZHk+IHwgdW5kZWZpbmVkO1xufVxuIl19
|
|
163
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVyc2lzdGVuY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGVyc2lzdGVuY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFFSCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFHaEQsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDakUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBNEN2RCxNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUM7QUFDL0I7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLENBQUMsQ0FBQztBQUNqQyxNQUFNLEtBQUssR0FBRyxDQUFDLE9BQTJDLEVBQUUsS0FBNEIsRUFBVSxFQUFFLENBQ2xHLEdBQUcsdUJBQXVCLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBRWpHLDRGQUE0RjtBQUM1RixNQUFNLFVBQVUseUJBQXlCLENBQ3ZDLEtBQXdDO0lBRXhDLE1BQU0sVUFBVSxHQUFHLEtBQUssS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQy9DLE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLElBQUksTUFBTSxDQUFDO0lBQ3pDLElBQUksS0FBSyxLQUFLLE1BQU0sSUFBSSxLQUFLLEtBQUssWUFBWSxFQUFFLENBQUM7UUFDL0MsTUFBTSxJQUFJLFNBQVMsQ0FBQyw4QkFBOEIsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBQ0QsT0FBTztRQUNMLE1BQU0sRUFBRSxVQUFVLENBQUMsTUFBTSxJQUFJLGlCQUFpQjtRQUM5QyxLQUFLO1FBQ0wsTUFBTSxFQUFFO1lB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UUFBUSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ3hGLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFDRCxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUM7QUFDeEMsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLFdBQVcsQ0FDL0IsU0FBc0IsRUFDdEIsT0FBZSxFQUNmLE9BQXFCLEVBQ3JCLE9BQTJDO0lBRTNDLE1BQU0sTUFBTSxHQUFHLE1BQU0sU0FBUyxDQUFDLEtBQUssQ0FDbEMsd0JBQXdCLEtBQUssQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxvR0FBb0csRUFDekosQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUN0QixDQUFDO0lBQ0YsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQTJDLENBQUM7QUFDckUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRHVyYWJsZSByZXBsYXkgYW5kIHBvaW50ZXIgcGF5bG9hZHMgZm9yIHtAbGluayBQb3N0Z3Jlc1RvcGljQnVzfS5cbiAqXG4gKiBUaGlzIG1vZHVsZSBvd25zIHNjaGVtYSBwcm92aXNpb25pbmcsIGdyYW50cywgVFRMIGNsZWFudXAsIHJlcGxheSBjdXJzb3JzLFxuICogYW5kIG9wZW4vcmVzdHJpY3RlZCBwZXJzaXN0ZW5jZSBzY29wZXMuIFJldXNlIGl0IHdoZW4gYSB0b3BpYy1idXMgY29uc3VtZXJcbiAqIG5lZWRzIGhpc3Rvcnkgb3IgbGFyZ2VyIHBheWxvYWRzIGluc3RlYWQgb2YgY3JlYXRpbmcgYSBwYXJhbGxlbCBtZXNzYWdlIHRhYmxlLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBvYmplY3QgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBRdWVyeVJlc3VsdFJvdyB9IGZyb20gXCJwZ1wiO1xuaW1wb3J0IHR5cGUgeyBQZ1Bvb2xMaWtlLCBQZ1F1ZXJ5YWJsZSB9IGZyb20gXCIuL2Fkdmlzb3J5LWxvY2sudHNcIjtcbmltcG9ydCB7IHdpdGhBZHZpc29yeVRyYW5zYWN0aW9uTG9jayB9IGZyb20gXCIuL2Fkdmlzb3J5LWxvY2sudHNcIjtcbmltcG9ydCB7IHF1b3RlUG9zdGdyZXNJZGVudGlmaWVyIH0gZnJvbSBcIi4vc2Vzc2lvbi50c1wiO1xuaW1wb3J0IHR5cGUgeyBUb3BpY01lc3NhZ2UgfSBmcm9tIFwiLi90b3BpYy1idXMudHNcIjtcblxuLyoqIFN0b3JhZ2UgYW5kIGdyYW50IHRpZXIgZm9yIHBlcnNpc3RlZCB0b3BpYyBtZXNzYWdlcy4gKi9cbmV4cG9ydCB0eXBlIFRvcGljUGVyc2lzdGVuY2VTY29wZSA9IFwib3BlblwiIHwgXCJyZXN0cmljdGVkXCI7XG4vKiogUG9zdGdyZVNRTCBpbnRlcnZhbCB0ZXh0IG9yIG1pbGxpc2Vjb25kIGR1cmF0aW9uIGFjY2VwdGVkIGZvciBtZXNzYWdlIGV4cGlyeS4gKi9cbmV4cG9ydCB0eXBlIER1cmF0aW9uSW5wdXQgPSBzdHJpbmcgfCBudW1iZXI7XG4vKiogT3B0aW9uYWwgc2NoZW1hLCB0YWJsZSwgZXhwaXJ5LCBwYXlsb2FkLCBhbmQgcHJvdmlzaW9uaW5nIHNldHRpbmdzIGZvciB0b3BpYyBwZXJzaXN0ZW5jZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG9waWNCdXNQZXJzaXN0ZW5jZU9wdGlvbnMge1xuICBzY2hlbWE/OiBzdHJpbmc7XG4gIHNjb3BlPzogVG9waWNQZXJzaXN0ZW5jZVNjb3BlO1xuICB0YWJsZXM/OiBQYXJ0aWFsPFJlY29yZDxUb3BpY1BlcnNpc3RlbmNlU2NvcGUsIHN0cmluZz4+O1xuICB0dGw/OiBEdXJhdGlvbklucHV0IHwgZmFsc2U7XG4gIHBheWxvYWQ/OiBcImVudmVsb3BlXCIgfCBcInBvaW50ZXJcIjtcbiAgY2xlYW51cEJhdGNoU2l6ZT86IG51bWJlcjtcbiAgcHJvdmlzaW9uPzogYm9vbGVhbjtcbn1cbi8qKiBDb21wbGV0ZSBwZXJzaXN0ZW5jZSBzZXR0aW5ncyBhZnRlciBkZWZhdWx0cyBhcmUgYXBwbGllZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRUb3BpY0J1c1BlcnNpc3RlbmNlT3B0aW9ucyB7XG4gIHNjaGVtYTogc3RyaW5nO1xuICBzY29wZTogVG9waWNQZXJzaXN0ZW5jZVNjb3BlO1xuICB0YWJsZXM6IFJlY29yZDxUb3BpY1BlcnNpc3RlbmNlU2NvcGUsIHN0cmluZz47XG4gIHR0bDogRHVyYXRpb25JbnB1dCB8IGZhbHNlO1xuICBwYXlsb2FkOiBcImVudmVsb3BlXCIgfCBcInBvaW50ZXJcIjtcbiAgY2xlYW51cEJhdGNoU2l6ZTogbnVtYmVyO1xuICBwcm92aXNpb246IGJvb2xlYW47XG59XG4vKiogUGVyc2lzdGVkIHRvcGljIG1lc3NhZ2UgcGx1cyByZXBsYXkgY3Vyc29yLCBzY29wZSwgYW5kIGV4cGlyeSBtZXRhZGF0YS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RvcmVkVG9waWNNZXNzYWdlPFxuICBUQm9keSBleHRlbmRzIG9iamVjdC5TZXJpYWxpemFibGVWYWx1ZSA9IG9iamVjdC5TZXJpYWxpemFibGVWYWx1ZSxcbj4ge1xuICBjdXJzb3I6IHN0cmluZztcbiAgZXhwaXJlc0F0OiBzdHJpbmcgfCBudWxsO1xuICBzY29wZTogVG9waWNQZXJzaXN0ZW5jZVNjb3BlO1xuICBtZXNzYWdlOiBUb3BpY01lc3NhZ2U8VEJvZHk+O1xufVxuLyoqIE9yZGVyZWQgcmVwbGF5IHBhZ2UgYW5kIG9wdGlvbmFsIGN1cnNvciBmb3IgdGhlIG5leHQgcGFnZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG9waWNIaXN0b3J5UGFnZTxcbiAgVEJvZHkgZXh0ZW5kcyBvYmplY3QuU2VyaWFsaXphYmxlVmFsdWUgPSBvYmplY3QuU2VyaWFsaXphYmxlVmFsdWUsXG4+IHtcbiAgbWVzc2FnZXM6IFN0b3JlZFRvcGljTWVzc2FnZTxUQm9keT5bXTtcbiAgbmV4dEN1cnNvcj86IHN0cmluZztcbn1cblxuY29uc3QgREVGQVVMVF9UVEwgPSBcIjI0IGhvdXJzXCI7XG4vKipcbiAqIFBvaW50ZXItcGF5bG9hZCB2ZXJzaW9uLiBBIGxpc3RlbmVyIHRoYXQgZG9lcyBub3QgcmVjb2duaXplIHRoZSB2ZXJzaW9uIHRyZWF0c1xuICogdGhlIG5vdGlmaWNhdGlvbiBhcyBmb3JlaWduIHRyYWZmaWMgcmF0aGVyIHRoYW4gZ3Vlc3NpbmcgYXQgaXRzIHNoYXBlLlxuICovXG5leHBvcnQgY29uc3QgUE9JTlRFUl9WRVJTSU9OID0gMTtcbmNvbnN0IHRhYmxlID0gKG9wdGlvbnM6IFJlc29sdmVkVG9waWNCdXNQZXJzaXN0ZW5jZU9wdGlvbnMsIHNjb3BlOiBUb3BpY1BlcnNpc3RlbmNlU2NvcGUpOiBzdHJpbmcgPT5cbiAgYCR7cXVvdGVQb3N0Z3Jlc0lkZW50aWZpZXIob3B0aW9ucy5zY2hlbWEpfS4ke3F1b3RlUG9zdGdyZXNJZGVudGlmaWVyKG9wdGlvbnMudGFibGVzW3Njb3BlXSl9YDtcblxuLyoqIFZhbGlkYXRlIHBlcnNpc3RlbmNlIHNjb3BlIGFuZCBhcHBseSBzdGFibGUgc2NoZW1hLCB0YWJsZSwgVFRMLCBhbmQgY2xlYW51cCBkZWZhdWx0cy4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUGVyc2lzdGVuY2VPcHRpb25zKFxuICB2YWx1ZTogdHJ1ZSB8IFRvcGljQnVzUGVyc2lzdGVuY2VPcHRpb25zLFxuKTogUmVzb2x2ZWRUb3BpY0J1c1BlcnNpc3RlbmNlT3B0aW9ucyB7XG4gIGNvbnN0IGNvbmZpZ3VyZWQgPSB2YWx1ZSA9PT0gdHJ1ZSA/IHt9IDogdmFsdWU7XG4gIGNvbnN0IHNjb3BlID0gY29uZmlndXJlZC5zY29wZSA/PyBcIm9wZW5cIjtcbiAgaWYgKHNjb3BlICE9PSBcIm9wZW5cIiAmJiBzY29wZSAhPT0gXCJyZXN0cmljdGVkXCIpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBVbmtub3duIHBlcnNpc3RlbmNlIHNjb3BlOiAke1N0cmluZyhzY29wZSl9YCk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBzY2hlbWE6IGNvbmZpZ3VyZWQuc2NoZW1hID8/IFwiZGJ4X21lc3NhZ2VfYnVzXCIsXG4gICAgc2NvcGUsXG4gICAgdGFibGVzOiB7XG4gICAgICBvcGVuOiBjb25maWd1cmVkLnRhYmxlcz8ub3BlbiA/PyBcIm9wZW5fbWVzc2FnZXNcIixcbiAgICAgIHJlc3RyaWN0ZWQ6IGNvbmZpZ3VyZWQudGFibGVzPy5yZXN0cmljdGVkID8/IFwicmVzdHJpY3RlZF9tZXNzYWdlc1wiLFxuICAgIH0sXG4gICAgdHRsOiBjb25maWd1cmVkLnR0bCA/PyBERUZBVUxUX1RUTCxcbiAgICBwYXlsb2FkOiBjb25maWd1cmVkLnBheWxvYWQgPz8gXCJlbnZlbG9wZVwiLFxuICAgIGNsZWFudXBCYXRjaFNpemU6IGNvbmZpZ3VyZWQuY2xlYW51cEJhdGNoU2l6ZSA/PyAxMDAwLFxuICAgIHByb3Zpc2lvbjogY29uZmlndXJlZC5wcm92aXNpb24gPz8gdHJ1ZSxcbiAgfTtcbn1cblxuLyoqIENyZWF0ZSB0aGUgcGVyc2lzdGVuY2Ugc2NoZW1hLCBvcGVuIGFuZCByZXN0cmljdGVkIHRhYmxlcywgYW5kIHJlcGxheSBpbmRleGVzLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb3Zpc2lvbk1lc3NhZ2VCdXNTY2hlbWEoXG4gIHBvb2w6IFBnUG9vbExpa2UsXG4gIG9wdGlvbnM6IFJlc29sdmVkVG9waWNCdXNQZXJzaXN0ZW5jZU9wdGlvbnMsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgd2l0aEFkdmlzb3J5VHJhbnNhY3Rpb25Mb2NrKHBvb2wsIFtcImRieF9tZXNzYWdlX2J1c1wiLCBcInNjaGVtYVwiXSwgYXN5bmMgKGNsaWVudCkgPT4ge1xuICAgIGF3YWl0IGNsaWVudC5xdWVyeShgQ1JFQVRFIFNDSEVNQSBJRiBOT1QgRVhJU1RTICR7cXVvdGVQb3N0Z3Jlc0lkZW50aWZpZXIob3B0aW9ucy5zY2hlbWEpfWApO1xuICAgIGF3YWl0IGNsaWVudC5xdWVyeShcbiAgICAgIGBDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyAke3F1b3RlUG9zdGdyZXNJZGVudGlmaWVyKG9wdGlvbnMuc2NoZW1hKX0uJHtxdW90ZVBvc3RncmVzSWRlbnRpZmllcihcInNjaGVtYV92ZXJzaW9uXCIpfSAodmVyc2lvbiBJTlRFR0VSIFBSSU1BUlkgS0VZKWAsXG4gICAgKTtcbiAgICBmb3IgKGNvbnN0IHNjb3BlIG9mIFtcIm9wZW5cIiwgXCJyZXN0cmljdGVkXCJdIGFzIGNvbnN0KSB7XG4gICAgICBjb25zdCBuYW1lID0gdGFibGUob3B0aW9ucywgc2NvcGUpO1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KFxuICAgICAgICBgQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgJHtuYW1lfSAoc2VxdWVuY2UgQklHSU5UIEdFTkVSQVRFRCBBTFdBWVMgQVMgSURFTlRJVFkgUFJJTUFSWSBLRVksIGNoYW5uZWwgVEVYVCBOT1QgTlVMTCwgdG9waWMgVEVYVCBOT1QgTlVMTCwgbWVzc2FnZV9pZCBURVhUIE5PVCBOVUxMLCBwdWJsaXNoZWRfYXQgVElNRVNUQU1QVFogTk9UIE5VTEwsIGV4cGlyZXNfYXQgVElNRVNUQU1QVFosIHhhY3RfaWQgWElEOCBOT1QgTlVMTCBERUZBVUxUIHBnX2N1cnJlbnRfeGFjdF9pZCgpLCBlbnZlbG9wZSBKU09OQiBOT1QgTlVMTCwgVU5JUVVFIChjaGFubmVsLCBtZXNzYWdlX2lkKSwgQ0hFQ0sgKGpzb25iX3R5cGVvZihlbnZlbG9wZSkgPSAnb2JqZWN0JykpYCxcbiAgICAgICk7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoXG4gICAgICAgIGBDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyAke3F1b3RlUG9zdGdyZXNJZGVudGlmaWVyKGAke29wdGlvbnMudGFibGVzW3Njb3BlXX1fcmVwbGF5X2lkeGApfSBPTiAke25hbWV9IChjaGFubmVsLCB0b3BpYywgc2VxdWVuY2UpYCxcbiAgICAgICk7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoXG4gICAgICAgIGBDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyAke3F1b3RlUG9zdGdyZXNJZGVudGlmaWVyKGAke29wdGlvbnMudGFibGVzW3Njb3BlXX1fZXhwaXJ5X2lkeGApfSBPTiAke25hbWV9IChleHBpcmVzX2F0KSBXSEVSRSBleHBpcmVzX2F0IElTIE5PVCBOVUxMYCxcbiAgICAgICk7XG4gICAgfVxuICAgIGF3YWl0IGNsaWVudC5xdWVyeShcbiAgICAgIGBJTlNFUlQgSU5UTyAke3F1b3RlUG9zdGdyZXNJZGVudGlmaWVyKG9wdGlvbnMuc2NoZW1hKX0uJHtxdW90ZVBvc3RncmVzSWRlbnRpZmllcihcInNjaGVtYV92ZXJzaW9uXCIpfSAodmVyc2lvbikgVkFMVUVTICgxKSBPTiBDT05GTElDVCAodmVyc2lvbikgRE8gTk9USElOR2AsXG4gICAgKTtcbiAgfSk7XG59XG5cbi8qKiBCdWlsZCBTUUwgZ3JhbnRzIGZvciByb2xlcyB0aGF0IG1heSByZWFkIGFuZCB3cml0ZSBvbmUgcGVyc2lzdGVuY2Ugc2NvcGUuICovXG5leHBvcnQgZnVuY3Rpb24gbWVzc2FnZUJ1c0dyYW50U3RhdGVtZW50cyhcbiAgcm9sZXM6IHN0cmluZyB8IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBzY29wZTogVG9waWNQZXJzaXN0ZW5jZVNjb3BlLFxuICBvcHRpb25zOiBSZXNvbHZlZFRvcGljQnVzUGVyc2lzdGVuY2VPcHRpb25zLFxuKTogc3RyaW5nW10ge1xuICBjb25zdCBzZWxlY3RlZCA9IHRhYmxlKG9wdGlvbnMsIHNjb3BlKTtcbiAgcmV0dXJuICh0eXBlb2Ygcm9sZXMgPT09IFwic3RyaW5nXCIgPyBbcm9sZXNdIDogcm9sZXMpLmZsYXRNYXAoKHJvbGUpID0+IFtcbiAgICBgR1JBTlQgVVNBR0UgT04gU0NIRU1BICR7cXVvdGVQb3N0Z3Jlc0lkZW50aWZpZXIob3B0aW9ucy5zY2hlbWEpfSBUTyAke3F1b3RlUG9zdGdyZXNJZGVudGlmaWVyKHJvbGUpfTtgLFxuICAgIGBHUkFOVCBTRUxFQ1QsIElOU0VSVCwgREVMRVRFIE9OIFRBQkxFICR7c2VsZWN0ZWR9IFRPICR7cXVvdGVQb3N0Z3Jlc0lkZW50aWZpZXIocm9sZSl9O2AsXG4gICAgYEdSQU5UIFNFTEVDVCBPTiBUQUJMRSAke3F1b3RlUG9zdGdyZXNJZGVudGlmaWVyKG9wdGlvbnMuc2NoZW1hKX0uJHtxdW90ZVBvc3RncmVzSWRlbnRpZmllcihcInNjaGVtYV92ZXJzaW9uXCIpfSBUTyAke3F1b3RlUG9zdGdyZXNJZGVudGlmaWVyKHJvbGUpfTtgLFxuICBdKTtcbn1cblxuZnVuY3Rpb24gY3Vyc29yKHNjb3BlOiBUb3BpY1BlcnNpc3RlbmNlU2NvcGUsIHNlcXVlbmNlOiBzdHJpbmcgfCBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkoW3Njb3BlLCBTdHJpbmcoc2VxdWVuY2UpXSkpLnRvU3RyaW5nKFwiYmFzZTY0dXJsXCIpO1xufVxuZnVuY3Rpb24gYWZ0ZXIodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCwgc2NvcGU6IFRvcGljUGVyc2lzdGVuY2VTY29wZSk6IHN0cmluZyB7XG4gIGlmICghdmFsdWUpIHJldHVybiBcIjBcIjtcbiAgY29uc3QgZGVjb2RlZCA9IEpTT04ucGFyc2UoQnVmZmVyLmZyb20odmFsdWUsIFwiYmFzZTY0dXJsXCIpLnRvU3RyaW5nKCkpIGFzIFtzdHJpbmcsIHN0cmluZ107XG4gIGlmIChkZWNvZGVkWzBdICE9PSBzY29wZSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJIaXN0b3J5IGN1cnNvciBiZWxvbmdzIHRvIGFub3RoZXIgcGVyc2lzdGVuY2Ugc2NvcGVcIik7XG4gIH1cbiAgcmV0dXJuIGRlY29kZWRbMV07XG59XG5cbi8qKiBDb252ZXJ0IGEgcGVyc2lzdGVuY2UgVFRMIHRvIG1pbGxpc2Vjb25kcywgcHJlc2VydmluZyBkaXNhYmxlZCByZXRlbnRpb24uICovXG5leHBvcnQgZnVuY3Rpb24gdHRsTWlsbGlzZWNvbmRzKHZhbHVlOiBEdXJhdGlvbklucHV0IHwgZmFsc2UpOiBudW1iZXIgfCBudWxsIHtcbiAgaWYgKHZhbHVlID09PSBmYWxzZSkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IG1pbGxpc2Vjb25kcyA9IG9iamVjdC50b0R1cmF0aW9uKHZhbHVlKTtcbiAgaWYgKG1pbGxpc2Vjb25kcyA9PT0gdW5kZWZpbmVkIHx8IG1pbGxpc2Vjb25kcyA8PSAwKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBwZXJzaXN0ZW5jZSBUVEw6ICR7U3RyaW5nKHZhbHVlKX1gKTtcbiAgfVxuICByZXR1cm4gbWlsbGlzZWNvbmRzO1xufVxuXG4vKiogRGVsZXRlIG9uZSBib3VuZGVkIGJhdGNoIG9mIGV4cGlyZWQgcGVyc2lzdGVkIHRvcGljIG1lc3NhZ2VzLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNsZWFudXBFeHBpcmVkKFxuICBxdWVyeWFibGU6IFBnUXVlcnlhYmxlLFxuICBvcHRpb25zOiBSZXNvbHZlZFRvcGljQnVzUGVyc2lzdGVuY2VPcHRpb25zLFxuICBzY29wZTogVG9waWNQZXJzaXN0ZW5jZVNjb3BlLFxuICBsaW1pdCA9IG9wdGlvbnMuY2xlYW51cEJhdGNoU2l6ZSxcbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHF1ZXJ5YWJsZS5xdWVyeShcbiAgICBgV0lUSCBleHBpcmVkIEFTIChTRUxFQ1QgY3RpZCBGUk9NICR7dGFibGUob3B0aW9ucywgc2NvcGUpfSBXSEVSRSBleHBpcmVzX2F0IElTIE5PVCBOVUxMIEFORCBleHBpcmVzX2F0IDw9IGNsb2NrX3RpbWVzdGFtcCgpIE9SREVSIEJZIGV4cGlyZXNfYXQgTElNSVQgJDEpIERFTEVURSBGUk9NICR7dGFibGUob3B0aW9ucywgc2NvcGUpfSBBUyBtZXNzYWdlcyBVU0lORyBleHBpcmVkIFdIRVJFIG1lc3NhZ2VzLmN0aWQgPSBleHBpcmVkLmN0aWRgLFxuICAgIFtsaW1pdF0sXG4gICk7XG4gIHJldHVybiByZXN1bHQucm93Q291bnQgPz8gMDtcbn1cblxudHlwZSBIaXN0b3J5Um93ID0gUXVlcnlSZXN1bHRSb3cgJiB7XG4gIHNlcXVlbmNlOiBzdHJpbmc7XG4gIGV4cGlyZXNfYXQ6IERhdGUgfCBzdHJpbmcgfCBudWxsO1xuICBlbnZlbG9wZTogVG9waWNNZXNzYWdlO1xufTtcblxuLyoqIFJlYWQgYSBjdXJzb3ItcGFnaW5hdGVkIHBhZ2Ugb2YgcGVyc2lzdGVkIHRvcGljIGhpc3RvcnkuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaGlzdG9yeTxUQm9keSBleHRlbmRzIG9iamVjdC5TZXJpYWxpemFibGVWYWx1ZT4oXG4gIHF1ZXJ5YWJsZTogUGdRdWVyeWFibGUsXG4gIGNoYW5uZWw6IHN0cmluZyxcbiAgdG9waWM6IHN0cmluZyxcbiAgb3B0aW9uczogUmVzb2x2ZWRUb3BpY0J1c1BlcnNpc3RlbmNlT3B0aW9ucyxcbiAgaW5wdXQ6IHsgYWZ0ZXI/OiBzdHJpbmc7IGxpbWl0PzogbnVtYmVyOyBzY29wZT86IFRvcGljUGVyc2lzdGVuY2VTY29wZSB9ID0ge30sXG4pOiBQcm9taXNlPFRvcGljSGlzdG9yeVBhZ2U8VEJvZHk+PiB7XG4gIGNvbnN0IHNjb3BlID0gaW5wdXQuc2NvcGUgPz8gb3B0aW9ucy5zY29wZTtcbiAgY29uc3QgbGltaXQgPSBpbnB1dC5saW1pdCA/PyAxMDA7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHF1ZXJ5YWJsZS5xdWVyeTxIaXN0b3J5Um93PihcbiAgICBgU0VMRUNUIHNlcXVlbmNlLCBleHBpcmVzX2F0LCBlbnZlbG9wZSBGUk9NICR7dGFibGUob3B0aW9ucywgc2NvcGUpfSBXSEVSRSBjaGFubmVsID0gJDEgQU5EIHRvcGljID0gJDIgQU5EIHNlcXVlbmNlID4gJDM6OmJpZ2ludCBBTkQgKGV4cGlyZXNfYXQgSVMgTlVMTCBPUiBleHBpcmVzX2F0ID4gY2xvY2tfdGltZXN0YW1wKCkpIE9SREVSIEJZIHNlcXVlbmNlIExJTUlUICQ0YCxcbiAgICBbY2hhbm5lbCwgdG9waWMsIGFmdGVyKGlucHV0LmFmdGVyLCBzY29wZSksIGxpbWl0XSxcbiAgKTtcbiAgY29uc3QgbWVzc2FnZXMgPSByZXN1bHQucm93cy5tYXAoKHJvdykgPT4gKHtcbiAgICBjdXJzb3I6IGN1cnNvcihzY29wZSwgcm93LnNlcXVlbmNlKSxcbiAgICBleHBpcmVzQXQ6IHJvdy5leHBpcmVzX2F0ID09PSBudWxsID8gbnVsbCA6IG5ldyBEYXRlKHJvdy5leHBpcmVzX2F0KS50b0lTT1N0cmluZygpLFxuICAgIHNjb3BlLFxuICAgIG1lc3NhZ2U6IHJvdy5lbnZlbG9wZSBhcyBUb3BpY01lc3NhZ2U8VEJvZHk+LFxuICB9KSk7XG4gIHJldHVybiB7XG4gICAgbWVzc2FnZXMsXG4gICAgLi4uKG1lc3NhZ2VzLmxlbmd0aCA9PT0gbGltaXQgPyB7IG5leHRDdXJzb3I6IG1lc3NhZ2VzLmF0KC0xKSEuY3Vyc29yIH0gOiB7fSksXG4gIH07XG59XG5cbi8qKiBQZXJzaXN0IGEgdG9waWMgbWVzc2FnZSBhbmQgbm90aWZ5IGxpc3RlbmVycyBpbiBvbmUgdHJhbnNhY3Rpb24uICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGVyc2lzdGVkTm90aWZ5KFxuICBjbGllbnQ6IFBnUXVlcnlhYmxlLFxuICBjaGFubmVsOiBzdHJpbmcsXG4gIHRvcGljOiBzdHJpbmcsXG4gIG1lc3NhZ2U6IFRvcGljTWVzc2FnZSxcbiAgZW5jb2RlZDogc3RyaW5nLFxuICBvcHRpb25zOiBSZXNvbHZlZFRvcGljQnVzUGVyc2lzdGVuY2VPcHRpb25zLFxuICBzY29wZTogVG9waWNQZXJzaXN0ZW5jZVNjb3BlLFxuICB0dGw6IER1cmF0aW9uSW5wdXQgfCBmYWxzZSxcbik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBjbGVhbnVwRXhwaXJlZChjbGllbnQsIG9wdGlvbnMsIHNjb3BlKTtcbiAgY29uc3QgbWlsbGlzZWNvbmRzID0gdHRsTWlsbGlzZWNvbmRzKHR0bCk7XG4gIGNvbnN0IGluc2VydGVkID0gYXdhaXQgY2xpZW50LnF1ZXJ5PFF1ZXJ5UmVzdWx0Um93ICYgeyBzZXF1ZW5jZTogc3RyaW5nIH0+KFxuICAgIGBJTlNFUlQgSU5UTyAke3RhYmxlKG9wdGlvbnMsIHNjb3BlKX0gKGNoYW5uZWwsIHRvcGljLCBtZXNzYWdlX2lkLCBwdWJsaXNoZWRfYXQsIGV4cGlyZXNfYXQsIGVudmVsb3BlKSBWQUxVRVMgKCQxLCAkMiwgJDMsICQ0LCBDQVNFIFdIRU4gJDU6OmJpZ2ludCBJUyBOVUxMIFRIRU4gTlVMTCBFTFNFIGNsb2NrX3RpbWVzdGFtcCgpICsgKCQ1OjpiaWdpbnQgKiBpbnRlcnZhbCAnMSBtaWxsaXNlY29uZCcpIEVORCwgJDY6Ompzb25iKSBSRVRVUk5JTkcgc2VxdWVuY2VgLFxuICAgIFtjaGFubmVsLCB0b3BpYywgbWVzc2FnZS5pZCwgbWVzc2FnZS5wdWJsaXNoZWRBdCwgbWlsbGlzZWNvbmRzLCBlbmNvZGVkXSxcbiAgKTtcbiAgLy8gVGhlIHJvdyBhbmQgdGhlIG5vdGlmaWNhdGlvbiBjb21taXQgdG9nZXRoZXIsIHNvIGEgcG9pbnRlciBpcyBuZXZlciBkZWxpdmVyZWRcbiAgLy8gYmVmb3JlIHRoZSByb3cgaXQgbmFtZXMgaXMgcmVhZGFibGUgLSBgTk9USUZZYCBpcyBkZWxpdmVyZWQgYXQgQ09NTUlULCBub3QgYXRcbiAgLy8gc3RhdGVtZW50IHRpbWUuXG4gIGNvbnN0IHBheWxvYWQgPVxuICAgIG9wdGlvbnMucGF5bG9hZCA9PT0gXCJwb2ludGVyXCJcbiAgICAgID8gcG9pbnRlclBheWxvYWQoc2NvcGUsIHRvcGljLCBtZXNzYWdlLmlkLCBpbnNlcnRlZC5yb3dzWzBdPy5zZXF1ZW5jZSA/PyBcIjBcIilcbiAgICAgIDogZW5jb2RlZDtcbiAgYXdhaXQgY2xpZW50LnF1ZXJ5KFwiU0VMRUNUIHBnX25vdGlmeSgkMSwgJDIpXCIsIFtjaGFubmVsLCBwYXlsb2FkXSk7XG59XG5cbi8qKlxuICogVGhlIGBwYXlsb2FkOiBcInBvaW50ZXJcImAgbm90aWZpY2F0aW9uIGJvZHk6IHJvdXRpbmcgYW5kIGlkZW50aXR5IG9ubHksIHNvIHRoZVxuICogc2l6ZSBsaW1pdCBkb2VzIG5vdCBhcHBseSBhbmQgYSBsaXN0ZW5lciB3aXRob3V0IHRoZSB0YWJsZSBncmFudCBsZWFybnMgdGhhdFxuICogc29tZXRoaW5nIGhhcHBlbmVkIHdpdGhvdXQgbGVhcm5pbmcgd2hhdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBvaW50ZXJQYXlsb2FkKFxuICBzY29wZTogVG9waWNQZXJzaXN0ZW5jZVNjb3BlLFxuICB0b3BpYzogc3RyaW5nLFxuICBpZDogc3RyaW5nLFxuICBzZXF1ZW5jZTogc3RyaW5nIHwgbnVtYmVyLFxuKTogc3RyaW5nIHtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHsgdjogUE9JTlRFUl9WRVJTSU9OLCBzY29wZSwgdG9waWMsIGlkLCBzZXF1ZW5jZTogU3RyaW5nKHNlcXVlbmNlKSB9KTtcbn1cblxuLyoqIEEgZGVjb2RlZCBwb2ludGVyIG5vdGlmaWNhdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG9waWNQb2ludGVyIHtcbiAgc2NvcGU6IFRvcGljUGVyc2lzdGVuY2VTY29wZTtcbiAgdG9waWM6IHN0cmluZztcbiAgaWQ6IHN0cmluZztcbiAgc2VxdWVuY2U6IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZWFkIGEgbm90aWZpY2F0aW9uIGFzIGEgcG9pbnRlciwgb3IgYHVuZGVmaW5lZGAgd2hlbiBpdCBpcyBub3Qgb25lLiBUaGUgY2hhbm5lbFxuICogaXMgc2hhcmVkLCBzbyBhbiB1bnJlY29nbml6ZWQgcGF5bG9hZCBpcyBvcmRpbmFyeSB0cmFmZmljIHJhdGhlciB0aGFuIGFuIGVycm9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlUG9pbnRlcih2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogVG9waWNQb2ludGVyIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgbGV0IHJlY29yZDogdW5rbm93bjtcbiAgdHJ5IHtcbiAgICByZWNvcmQgPSBKU09OLnBhcnNlKHZhbHVlKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBpZiAoIXJlY29yZCB8fCB0eXBlb2YgcmVjb3JkICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkocmVjb3JkKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgY2FuZGlkYXRlID0gcmVjb3JkIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBpZiAoY2FuZGlkYXRlLnYgIT09IFBPSU5URVJfVkVSU0lPTikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgeyBzY29wZSwgdG9waWMsIGlkLCBzZXF1ZW5jZSB9ID0gY2FuZGlkYXRlO1xuICBpZiAoc2NvcGUgIT09IFwib3BlblwiICYmIHNjb3BlICE9PSBcInJlc3RyaWN0ZWRcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHR5cGVvZiB0b3BpYyAhPT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgaWQgIT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHNlcXVlbmNlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4geyBzY29wZSwgdG9waWMsIGlkLCBzZXF1ZW5jZSB9O1xufVxuXG4vKipcbiAqIEZldGNoIHRoZSBvbmUgc3RvcmVkIGVudmVsb3BlIGEgcG9pbnRlciBuYW1lcy4gUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIHRoZSByb3dcbiAqIGlzIGdvbmUgKFRUTCBjbGVhbnVwIHdvbiB0aGUgcmFjZSkgb3IgdGhlIHJlYWRlciBsYWNrcyB0aGUgdGFibGUncyBncmFudCwgYm90aFxuICogb2Ygd2hpY2ggYXJlIGV4cGVjdGVkIG9uIHRoZSBgcmVzdHJpY3RlZGAgdGllciByYXRoZXIgdGhhbiBlcnJvcnMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkUG9pbnRlcjxUQm9keSBleHRlbmRzIG9iamVjdC5TZXJpYWxpemFibGVWYWx1ZT4oXG4gIHF1ZXJ5YWJsZTogUGdRdWVyeWFibGUsXG4gIGNoYW5uZWw6IHN0cmluZyxcbiAgcG9pbnRlcjogVG9waWNQb2ludGVyLFxuICBvcHRpb25zOiBSZXNvbHZlZFRvcGljQnVzUGVyc2lzdGVuY2VPcHRpb25zLFxuKTogUHJvbWlzZTxUb3BpY01lc3NhZ2U8VEJvZHk+IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHF1ZXJ5YWJsZS5xdWVyeTxRdWVyeVJlc3VsdFJvdyAmIHsgZW52ZWxvcGU6IFRvcGljTWVzc2FnZSB9PihcbiAgICBgU0VMRUNUIGVudmVsb3BlIEZST00gJHt0YWJsZShvcHRpb25zLCBwb2ludGVyLnNjb3BlKX0gV0hFUkUgY2hhbm5lbCA9ICQxIEFORCBtZXNzYWdlX2lkID0gJDIgQU5EIChleHBpcmVzX2F0IElTIE5VTEwgT1IgZXhwaXJlc19hdCA+IGNsb2NrX3RpbWVzdGFtcCgpKWAsXG4gICAgW2NoYW5uZWwsIHBvaW50ZXIuaWRdLFxuICApO1xuICByZXR1cm4gcmVzdWx0LnJvd3NbMF0/LmVudmVsb3BlIGFzIFRvcGljTWVzc2FnZTxUQm9keT4gfCB1bmRlZmluZWQ7XG59XG4iXX0=
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** Pool/client options required to set PostgreSQL startup parameters. */
|
|
2
|
+
export interface PostgresConnectionOptions {
|
|
3
|
+
options?: string;
|
|
4
|
+
}
|
|
5
|
+
/** Resolve and validate an explicit or environment-provided PostgreSQL role. */
|
|
6
|
+
export declare function resolvePostgresRole(role?: string, environment?: NodeJS.ProcessEnv): string | undefined;
|
|
7
|
+
/** Quote one PostgreSQL identifier. */
|
|
8
|
+
export declare function quotePostgresIdentifier(value: string): string;
|
|
9
|
+
/** Build a `SET ROLE` statement, or `undefined` when no role is configured. */
|
|
10
|
+
export declare function postgresRoleStatement(role?: string): string | undefined;
|
|
11
|
+
/** Merge the configured role into asyncpg-compatible server settings. */
|
|
12
|
+
export declare function postgresServerSettings(role?: string, settings?: Readonly<Record<string, string>>): Record<string, string>;
|
|
13
|
+
/** Merge the configured role into `pg` startup options. */
|
|
14
|
+
export declare function postgresConnectionOptions<T extends object>(options: T, role?: string): T & PostgresConnectionOptions;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared PostgreSQL session configuration.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import { postgresEnvironmentNames, postgresRoleSchema } from "@dbx-tools/shared-core/options";
|
|
7
|
+
/** Resolve and validate an explicit or environment-provided PostgreSQL role. */
|
|
8
|
+
export function resolvePostgresRole(role, environment = process.env) {
|
|
9
|
+
return postgresRoleSchema
|
|
10
|
+
.optional()
|
|
11
|
+
.parse(role ?? environment[postgresEnvironmentNames.postgresRole]);
|
|
12
|
+
}
|
|
13
|
+
/** Quote one PostgreSQL identifier. */
|
|
14
|
+
export function quotePostgresIdentifier(value) {
|
|
15
|
+
if (value.includes("\0"))
|
|
16
|
+
throw new TypeError("PostgreSQL identifiers cannot contain NUL");
|
|
17
|
+
return `"${value.replaceAll('"', '""')}"`;
|
|
18
|
+
}
|
|
19
|
+
/** Build a `SET ROLE` statement, or `undefined` when no role is configured. */
|
|
20
|
+
export function postgresRoleStatement(role) {
|
|
21
|
+
const resolved = resolvePostgresRole(role);
|
|
22
|
+
return resolved ? `SET ROLE ${quotePostgresIdentifier(resolved)}` : undefined;
|
|
23
|
+
}
|
|
24
|
+
/** Merge the configured role into asyncpg-compatible server settings. */
|
|
25
|
+
export function postgresServerSettings(role, settings = {}) {
|
|
26
|
+
const resolved = resolvePostgresRole(role);
|
|
27
|
+
return resolved ? { ...settings, role: resolved } : { ...settings };
|
|
28
|
+
}
|
|
29
|
+
/** Merge the configured role into `pg` startup options. */
|
|
30
|
+
export function postgresConnectionOptions(options, role) {
|
|
31
|
+
const resolved = resolvePostgresRole(role);
|
|
32
|
+
if (!resolved)
|
|
33
|
+
return options;
|
|
34
|
+
const connectionOptions = options;
|
|
35
|
+
const configured = connectionOptions.options?.trim();
|
|
36
|
+
const roleOption = `-c role=${resolved}`;
|
|
37
|
+
return {
|
|
38
|
+
...options,
|
|
39
|
+
options: configured ? `${configured} ${roleOption}` : roleOption,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Vzc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXNzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFDSCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQU85RixnRkFBZ0Y7QUFDaEYsTUFBTSxVQUFVLG1CQUFtQixDQUNqQyxJQUFhLEVBQ2IsY0FBaUMsT0FBTyxDQUFDLEdBQUc7SUFFNUMsT0FBTyxrQkFBa0I7U0FDdEIsUUFBUSxFQUFFO1NBQ1YsS0FBSyxDQUFDLElBQUksSUFBSSxXQUFXLENBQUMsd0JBQXdCLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztBQUN2RSxDQUFDO0FBRUQsdUNBQXVDO0FBQ3ZDLE1BQU0sVUFBVSx1QkFBdUIsQ0FBQyxLQUFhO0lBQ25ELElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFBRSxNQUFNLElBQUksU0FBUyxDQUFDLDJDQUEyQyxDQUFDLENBQUM7SUFDM0YsT0FBTyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUM7QUFDNUMsQ0FBQztBQUVELCtFQUErRTtBQUMvRSxNQUFNLFVBQVUscUJBQXFCLENBQUMsSUFBYTtJQUNqRCxNQUFNLFFBQVEsR0FBRyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzQyxPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsWUFBWSx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDaEYsQ0FBQztBQUVELHlFQUF5RTtBQUN6RSxNQUFNLFVBQVUsc0JBQXNCLENBQ3BDLElBQWEsRUFDYixXQUE2QyxFQUFFO0lBRS9DLE1BQU0sUUFBUSxHQUFHLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNDLE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsUUFBUSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLFFBQVEsRUFBRSxDQUFDO0FBQ3RFLENBQUM7QUFFRCwyREFBMkQ7QUFDM0QsTUFBTSxVQUFVLHlCQUF5QixDQUN2QyxPQUFVLEVBQ1YsSUFBYTtJQUViLE1BQU0sUUFBUSxHQUFHLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNDLElBQUksQ0FBQyxRQUFRO1FBQUUsT0FBTyxPQUFPLENBQUM7SUFDOUIsTUFBTSxpQkFBaUIsR0FBRyxPQUF3QyxDQUFDO0lBQ25FLE1BQU0sVUFBVSxHQUFHLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUNyRCxNQUFNLFVBQVUsR0FBRyxXQUFXLFFBQVEsRUFBRSxDQUFDO0lBQ3pDLE9BQU87UUFDTCxHQUFHLE9BQU87UUFDVixPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsSUFBSSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVTtLQUNqRSxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU2hhcmVkIFBvc3RncmVTUUwgc2Vzc2lvbiBjb25maWd1cmF0aW9uLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuaW1wb3J0IHsgcG9zdGdyZXNFbnZpcm9ubWVudE5hbWVzLCBwb3N0Z3Jlc1JvbGVTY2hlbWEgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZS9vcHRpb25zXCI7XG5cbi8qKiBQb29sL2NsaWVudCBvcHRpb25zIHJlcXVpcmVkIHRvIHNldCBQb3N0Z3JlU1FMIHN0YXJ0dXAgcGFyYW1ldGVycy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUG9zdGdyZXNDb25uZWN0aW9uT3B0aW9ucyB7XG4gIG9wdGlvbnM/OiBzdHJpbmc7XG59XG5cbi8qKiBSZXNvbHZlIGFuZCB2YWxpZGF0ZSBhbiBleHBsaWNpdCBvciBlbnZpcm9ubWVudC1wcm92aWRlZCBQb3N0Z3JlU1FMIHJvbGUuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVBvc3RncmVzUm9sZShcbiAgcm9sZT86IHN0cmluZyxcbiAgZW52aXJvbm1lbnQ6IE5vZGVKUy5Qcm9jZXNzRW52ID0gcHJvY2Vzcy5lbnYsXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gcG9zdGdyZXNSb2xlU2NoZW1hXG4gICAgLm9wdGlvbmFsKClcbiAgICAucGFyc2Uocm9sZSA/PyBlbnZpcm9ubWVudFtwb3N0Z3Jlc0Vudmlyb25tZW50TmFtZXMucG9zdGdyZXNSb2xlXSk7XG59XG5cbi8qKiBRdW90ZSBvbmUgUG9zdGdyZVNRTCBpZGVudGlmaWVyLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RlUG9zdGdyZXNJZGVudGlmaWVyKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAodmFsdWUuaW5jbHVkZXMoXCJcXDBcIikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQb3N0Z3JlU1FMIGlkZW50aWZpZXJzIGNhbm5vdCBjb250YWluIE5VTFwiKTtcbiAgcmV0dXJuIGBcIiR7dmFsdWUucmVwbGFjZUFsbCgnXCInLCAnXCJcIicpfVwiYDtcbn1cblxuLyoqIEJ1aWxkIGEgYFNFVCBST0xFYCBzdGF0ZW1lbnQsIG9yIGB1bmRlZmluZWRgIHdoZW4gbm8gcm9sZSBpcyBjb25maWd1cmVkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBvc3RncmVzUm9sZVN0YXRlbWVudChyb2xlPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlUG9zdGdyZXNSb2xlKHJvbGUpO1xuICByZXR1cm4gcmVzb2x2ZWQgPyBgU0VUIFJPTEUgJHtxdW90ZVBvc3RncmVzSWRlbnRpZmllcihyZXNvbHZlZCl9YCA6IHVuZGVmaW5lZDtcbn1cblxuLyoqIE1lcmdlIHRoZSBjb25maWd1cmVkIHJvbGUgaW50byBhc3luY3BnLWNvbXBhdGlibGUgc2VydmVyIHNldHRpbmdzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBvc3RncmVzU2VydmVyU2V0dGluZ3MoXG4gIHJvbGU/OiBzdHJpbmcsXG4gIHNldHRpbmdzOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiA9IHt9LFxuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZVBvc3RncmVzUm9sZShyb2xlKTtcbiAgcmV0dXJuIHJlc29sdmVkID8geyAuLi5zZXR0aW5ncywgcm9sZTogcmVzb2x2ZWQgfSA6IHsgLi4uc2V0dGluZ3MgfTtcbn1cblxuLyoqIE1lcmdlIHRoZSBjb25maWd1cmVkIHJvbGUgaW50byBgcGdgIHN0YXJ0dXAgb3B0aW9ucy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwb3N0Z3Jlc0Nvbm5lY3Rpb25PcHRpb25zPFQgZXh0ZW5kcyBvYmplY3Q+KFxuICBvcHRpb25zOiBULFxuICByb2xlPzogc3RyaW5nLFxuKTogVCAmIFBvc3RncmVzQ29ubmVjdGlvbk9wdGlvbnMge1xuICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmVQb3N0Z3Jlc1JvbGUocm9sZSk7XG4gIGlmICghcmVzb2x2ZWQpIHJldHVybiBvcHRpb25zO1xuICBjb25zdCBjb25uZWN0aW9uT3B0aW9ucyA9IG9wdGlvbnMgYXMgVCAmIFBvc3RncmVzQ29ubmVjdGlvbk9wdGlvbnM7XG4gIGNvbnN0IGNvbmZpZ3VyZWQgPSBjb25uZWN0aW9uT3B0aW9ucy5vcHRpb25zPy50cmltKCk7XG4gIGNvbnN0IHJvbGVPcHRpb24gPSBgLWMgcm9sZT0ke3Jlc29sdmVkfWA7XG4gIHJldHVybiB7XG4gICAgLi4ub3B0aW9ucyxcbiAgICBvcHRpb25zOiBjb25maWd1cmVkID8gYCR7Y29uZmlndXJlZH0gJHtyb2xlT3B0aW9ufWAgOiByb2xlT3B0aW9uLFxuICB9O1xufVxuIl19
|
package/lib/src/topic-bus.js
CHANGED
|
@@ -27,6 +27,7 @@ import { hostname } from "node:os";
|
|
|
27
27
|
import { asyncUtils, errorUtils, hash, json, object, stringUtils } from "@dbx-tools/shared-core";
|
|
28
28
|
import { channelName } from "./identity.js";
|
|
29
29
|
import { cleanupExpired, decodePointer, history, persistedNotify, provisionMessageBusSchema, readPointer, resolvePersistenceOptions, } from "./persistence.js";
|
|
30
|
+
import { quotePostgresIdentifier } from "./session.js";
|
|
30
31
|
/** Channel parts used when a caller names no channel of its own. */
|
|
31
32
|
const DEFAULT_CHANNEL = "dbx_tools_topic_bus";
|
|
32
33
|
/**
|
|
@@ -112,10 +113,6 @@ async function senderMetadata() {
|
|
|
112
113
|
return {};
|
|
113
114
|
}
|
|
114
115
|
}
|
|
115
|
-
/** Quote a validated channel for `LISTEN`/`UNLISTEN`, which take no parameters. */
|
|
116
|
-
function quoteIdentifier(value) {
|
|
117
|
-
return `"${value.replaceAll('"', '""')}"`;
|
|
118
|
-
}
|
|
119
116
|
/**
|
|
120
117
|
* Parse a `NOTIFY` payload into an envelope, returning `undefined` for anything
|
|
121
118
|
* that is not one.
|
|
@@ -374,7 +371,7 @@ export class PostgresTopicBus {
|
|
|
374
371
|
client.removeListener("error", this.handleClientError);
|
|
375
372
|
let releaseError;
|
|
376
373
|
try {
|
|
377
|
-
await client.query(`UNLISTEN ${
|
|
374
|
+
await client.query(`UNLISTEN ${quotePostgresIdentifier(this.channelName)}`);
|
|
378
375
|
}
|
|
379
376
|
catch (cause) {
|
|
380
377
|
releaseError = errorUtils.toError(cause);
|
|
@@ -395,7 +392,7 @@ export class PostgresTopicBus {
|
|
|
395
392
|
try {
|
|
396
393
|
client.on("notification", this.handleNotification);
|
|
397
394
|
client.on("error", this.handleClientError);
|
|
398
|
-
await client.query(`LISTEN ${
|
|
395
|
+
await client.query(`LISTEN ${quotePostgresIdentifier(this.channelName)}`);
|
|
399
396
|
if (this.closed)
|
|
400
397
|
throw new Error("Postgres topic bus is closed");
|
|
401
398
|
this.client = client;
|
|
@@ -503,4 +500,4 @@ export class PostgresTopicBus {
|
|
|
503
500
|
}
|
|
504
501
|
}
|
|
505
502
|
}
|
|
506
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9waWMtYnVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RvcGljLWJ1cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0JHO0FBRUgsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNuQyxPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUlqRyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVDLE9BQU8sRUFDTCxjQUFjLEVBQ2QsYUFBYSxFQUNiLE9BQU8sRUFDUCxlQUFlLEVBQ2YseUJBQXlCLEVBQ3pCLFdBQVcsRUFDWCx5QkFBeUIsR0FNMUIsTUFBTSxrQkFBa0IsQ0FBQztBQVExQixvRUFBb0U7QUFDcEUsTUFBTSxlQUFlLEdBQUcscUJBQXFCLENBQUM7QUFDOUM7Ozs7R0FJRztBQUNILE1BQU0sZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO0FBQy9CLE1BQU0sc0JBQXNCLEdBQUcsR0FBRyxDQUFDO0FBQ25DLE1BQU0sc0JBQXNCLEdBQUcsS0FBSyxDQUFDO0FBa0JyQzs7OztHQUlHO0FBQ0gsSUFBSSxZQUEyRCxDQUFDO0FBZ0hoRTs7OztHQUlHO0FBQ0gsU0FBUyxlQUFlLENBQUMsTUFBcUQ7SUFDNUUsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUN2QixNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBd0MsRUFBRTtRQUM1RSxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUM7SUFDaEMsQ0FBQyxDQUFDLENBQ0gsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsU0FBUyxlQUFlO0lBQ3RCLE9BQU8sZUFBZSxDQUFD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LENBQUMsQ0FBQztZQUM3RixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVG9waWMgZmFuLW91dCBvdmVyIFBvc3RncmVTUUwgYExJU1RFTmAvYE5PVElGWWAsIGZvciB0ZWxsaW5nIGV2ZXJ5IHJ1bm5pbmdcbiAqIGluc3RhbmNlIG9mIGFuIGFwcCB0aGF0IHNvbWV0aGluZyBoYXBwZW5lZC5cbiAqXG4gKiBUaGUgc2libGluZyBgYWR2aXNvcnktbG9ja2AgbW9kdWxlIGlzIGFib3V0IG1ha2luZyBzdXJlIG9ubHkgT05FIGNvbm5lY3Rpb25cbiAqIGRvZXMgYSB0aGluZzsgdGhpcyBvbmUgaXMgdGhlIG9wcG9zaXRlIC0gRVZFUlkgbGlzdGVuaW5nIHNlc3Npb24gZ2V0cyBldmVyeVxuICogbm90aWZpY2F0aW9uLiBUaGF0IG1ha2VzIGl0IHRoZSByaWdodCBwcmltaXRpdmUgZm9yIGxpdmUgVUkgdXBkYXRlc1xuICogKGFuIFNTRSBzdHJlYW0gcGVyIGJyb3dzZXIgdGFiLCBhIGNhY2hlIGludmFsaWRhdGlvbiwgYSBwcmVzZW5jZSBwaW5nKSBhbmQgdGhlXG4gKiB3cm9uZyBvbmUgZm9yIHdvcmsgZGlzdHJpYnV0aW9uOiB0aGVyZSBhcmUgbm8gY29tcGV0aW5nIGNvbnN1bWVycywgbm8gYWNrcywgYW5kXG4gKiBubyByZXBsYXkuXG4gKlxuICogRGVsaXZlcnkgaXMgYmVzdC1lZmZvcnQgYW5kIGxpdmUuIGBOT1RJRllgIHJlYWNoZXMgc2Vzc2lvbnMgdGhhdCBhcmUgbGlzdGVuaW5nXG4gKiBhdCB0aGUgbW9tZW50IGl0IGNvbW1pdHMsIHNvIGEgbGlzdGVuZXIgdGhhdCBjb25uZWN0cyBhIHNlY29uZCBsYXRlciBuZXZlciBzZWVzXG4gKiBpdCwgYW5kIGEgbGlzdGVuZXIgd2hvc2UgY29ubmVjdGlvbiBkcm9wcyBtaXNzZXMgZXZlcnl0aGluZyB1bnRpbCB0aGUgYnVzXG4gKiByZWNvbm5lY3RzLiBVc2UgYSB0YWJsZSBvciBhIHF1ZXVlIHdoZW4gYSBzdWJzY3JpYmVyIG5lZWRzIGR1cmFiaWxpdHkuXG4gKlxuICogT05FIENIQU5ORUwsIE1BTlkgVE9QSUNTLiBFdmVyeSBidXMgaW5zdGFuY2UgbGlzdGVucyBvbiBhIHNpbmdsZSBQb3N0Z3Jlc1xuICogY2hhbm5lbCAoYGNoYW5uZWxgLCBkZWZhdWx0IGBkYnhfdG9vbHNfdG9waWNfYnVzYCkgYW5kIGZpbHRlcnMgYnkgdGhlXG4gKiBlbnZlbG9wZSdzIGB0b3BpY2AgaW4tcHJvY2Vzcywgc28gYWRkaW5nIGEgdG9waWMgY29zdHMgbm8gY29ubmVjdGlvbiBhbmQgbm9cbiAqIGBMSVNURU5gLiBUaGUgdHJhZGVvZmYgaXMgdGhhdCBldmVyeSBsaXN0ZW5pbmcgc2Vzc2lvbiBkZWNvZGVzIGV2ZXJ5IG1lc3NhZ2Ugb25cbiAqIHRoZSBjaGFubmVsOyBnaXZlIGEgZ2VudWluZWx5IGhpZ2gtdm9sdW1lLCB1bnJlbGF0ZWQgc3RyZWFtIGl0cyBvd24gYGNoYW5uZWxgXG4gKiByYXRoZXIgdGhhbiBhIHRvcGljLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBob3N0bmFtZSB9IGZyb20gXCJub2RlOm9zXCI7XG5pbXBvcnQgeyBhc3luY1V0aWxzLCBlcnJvclV0aWxzLCBoYXNoLCBqc29uLCBvYmplY3QsIHN0cmluZ1V0aWxzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB0eXBlIHsgTm90aWZpY2F0aW9uLCBQb29sQ2xpZW50IH0gZnJvbSBcInBnXCI7XG5cbmltcG9ydCB0eXBlIHsgUGdQb29sTGlrZSwgUGdRdWVyeWFibGUgfSBmcm9tIFwiLi9hZHZpc29yeS1sb2NrLnRzXCI7XG5pbXBvcnQgeyBjaGFubmVsTmFtZSB9IGZyb20gXCIuL2lkZW50aXR5LnRzXCI7XG5pbXBvcnQge1xuICBjbGVhbnVwRXhwaXJlZCxcbiAgZGVjb2RlUG9pbnRlcixcbiAgaGlzdG9yeSxcbiAgcGVyc2lzdGVkTm90aWZ5LFxuICBwcm92aXNpb25NZXNzYWdlQnVzU2NoZW1hLFxuICByZWFkUG9pbnRlcixcbiAgcmVzb2x2ZVBlcnNpc3RlbmNlT3B0aW9ucyxcbiAgdHlwZSBEdXJhdGlvbklucHV0LFxuICB0eXBlIFJlc29sdmVkVG9waWNCdXNQZXJzaXN0ZW5jZU9wdGlvbnMsXG4gIHR5cGUgVG9waWNCdXNQZXJzaXN0ZW5jZU9wdGlvbnMsXG4gIHR5cGUgVG9waWNIaXN0b3J5UGFnZSxcbiAgdHlwZSBUb3BpY1BlcnNpc3RlbmNlU2NvcGUsXG59IGZyb20gXCIuL3BlcnNpc3RlbmNlLnRzXCI7XG5cbi8qKlxuICogYEBkYngtdG9vbHMvc2hhcmVkLWNvcmVgIG93bnMgdGhlIEpTT04tcm91bmQtdHJpcCBydWxlOyB0aGlzIGFsaWFzIGp1c3Qga2VlcHMgdGhlXG4gKiBnZW5lcmljIHNpZ25hdHVyZXMgYmVsb3cgcmVhZGFibGUuIENvbnN1bWVycyBpbXBvcnQgdGhlIHR5cGUgZnJvbSBzaGFyZWQtY29yZS5cbiAqL1xudHlwZSBTZXJpYWxpemFibGVWYWx1ZSA9IG9iamVjdC5TZXJpYWxpemFibGVWYWx1ZTtcblxuLyoqIENoYW5uZWwgcGFydHMgdXNlZCB3aGVuIGEgY2FsbGVyIG5hbWVzIG5vIGNoYW5uZWwgb2YgaXRzIG93bi4gKi9cbmNvbnN0IERFRkFVTFRfQ0hBTk5FTCA9IFwiZGJ4X3Rvb2xzX3RvcGljX2J1c1wiO1xuLyoqXG4gKiBFbmNvZGVkLWVudmVsb3BlIGNlaWxpbmcuIFBvc3RncmVTUUwgY2FwcyBhIGBOT1RJRllgIHBheWxvYWQgYXQgODAwMCBieXRlcyBhbmRcbiAqIGZhaWxzIHRoZSBzdGF0ZW1lbnQgcGFzdCB0aGF0LCBzbyB0aGUgYnVzIHJlamVjdHMgdGhlIG1lc3NhZ2UgZmlyc3Qgd2l0aCBhIHNpemVcbiAqIGl0IGNhbiBuYW1lLiBUaGUgbWFyZ2luIGJlbG93IDgwMDAgY292ZXJzIHRoZSBzZXJ2ZXIncyBvd24gYWNjb3VudGluZy5cbiAqL1xuY29uc3QgTUFYX05PVElGWV9CWVRFUyA9IDdfOTAwO1xuY29uc3QgTUlOX1JFQ09OTkVDVF9ERUxBWV9NUyA9IDI1MDtcbmNvbnN0IE1BWF9SRUNPTk5FQ1RfREVMQVlfTVMgPSA1XzAwMDtcblxuLyoqXG4gKiBUaGUgc3Vic2V0IG9mIEFwcEtpdCdzIHBlci1yZXF1ZXN0IGV4ZWN1dGlvbiBjb250ZXh0IHRoZSBidXMgcmVhZHMgZm9yIHNlbmRlclxuICogaWRlbnRpdHkuIEZpZWxkcyBhcmUgYHVua25vd25gIGJlY2F1c2UgdGhpcyBpcyBhIHN0cnVjdHVyYWwgdmlldyBvZiBhbiBPUFRJT05BTFxuICogcGVlcjogdGhlIHZhbHVlcyBhcmUgdHJpbW1lZCBhbmQgdmFsaWRhdGVkIHJhdGhlciB0aGFuIHRydXN0ZWQuXG4gKi9cbnR5cGUgQXBwS2l0RXhlY3V0aW9uQ29udGV4dCA9IHtcbiAgdXNlckVtYWlsPzogdW5rbm93bjtcbiAgdXNlcklkPzogdW5rbm93bjtcbiAgdXNlck5hbWU/OiB1bmtub3duO1xufTtcblxuLyoqIFN0cnVjdHVyYWwgdmlldyBvZiBgQGRhdGFicmlja3MvYXBwa2l0YCwgaW1wb3J0ZWQgbGF6aWx5IGFuZCBuZXZlciByZXF1aXJlZC4gKi9cbnR5cGUgQXBwS2l0TW9kdWxlID0ge1xuICBnZXRFeGVjdXRpb25Db250ZXh0KCk6IEFwcEtpdEV4ZWN1dGlvbkNvbnRleHQ7XG59O1xuXG4vKipcbiAqIENhY2hlZCByZXN1bHQgb2YgdGhlIG9uZSBvcHRpb25hbC1wZWVyIGltcG9ydCwgcmVzb2x2ZWQgdG8gYHVuZGVmaW5lZGAgd2hlblxuICogQXBwS2l0IGlzIG5vdCBpbnN0YWxsZWQuIE1lbW9pemVkIHNvIGEgYnVzIGluIGEgcGxhaW4gUG9zdGdyZXMgcHJvY2VzcyBwYXlzIGZvclxuICogdGhlIGZhaWxlZCByZXNvbHV0aW9uIG9uY2UgaW5zdGVhZCBvZiBwZXIgYnJvYWRjYXN0LlxuICovXG5sZXQgYXBwS2l0TW9kdWxlOiBQcm9taXNlPEFwcEtpdE1vZHVsZSB8IHVuZGVmaW5lZD4gfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogRmxhdC1rZXllZCBjb250ZXh0IHRyYXZlbGxpbmcgYWxvbmdzaWRlIGEgbWVzc2FnZSBib2R5OiB3aG8gc2VudCBpdCwgZnJvbVxuICogd2hlcmUsIGluIHdoaWNoIGRlcGxveW1lbnQuIFZhbHVlcyBtYXkgbmVzdCwgYnV0IHRoZSBrZXlzIGFyZSB0aGUgYWRkcmVzc2FibGVcbiAqIHBhcnQgLSBhIGxpc3RlbmVyIGZpbHRlcmluZyBvciBsYWJlbGxpbmcgbWVzc2FnZXMgcmVhZHMgYG1ldGFkYXRhLnVzZXJgLCBub3QgYVxuICogcGF0aCBpbnRvIHRoZSBib2R5LlxuICovXG5leHBvcnQgdHlwZSBUb3BpY01ldGFkYXRhID0gUmVjb3JkPHN0cmluZywgU2VyaWFsaXphYmxlVmFsdWU+O1xuXG4vKipcbiAqIFRoZSB3aXJlIGVudmVsb3BlIGV2ZXJ5IHN1YnNjcmliZXIgcmVjZWl2ZXMsIGFuZCB3aGF0IHtAbGlua1xuICogUG9zdGdyZXNUb3BpY0J1cy5icm9hZGNhc3R9IHJldHVybnMgdG8gdGhlIHB1Ymxpc2hlci5cbiAqXG4gKiBgaWRgLCBgdG9waWNgLCBhbmQgYHB1Ymxpc2hlZEF0YCBhcmUgYXNzaWduZWQgYnkgdGhlIGJ1czsgYHR5cGVgLCBgbWV0YWRhdGFgLFxuICogYW5kIGBib2R5YCBjb21lIGZyb20gdGhlIGNhbGxlciAod2l0aCBhdXRvbWF0aWMgY29udGV4dCBtZXJnZWQgdW5kZXJcbiAqIGBtZXRhZGF0YWApLiBUaGUgc2hhcGUgaXMgc3RhYmxlIGVub3VnaCB0byBoYW5kIHN0cmFpZ2h0IHRvIGFuIFNTRSBgZGF0YTpgXG4gKiBmcmFtZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb3BpY01lc3NhZ2U8VEJvZHkgZXh0ZW5kcyBTZXJpYWxpemFibGVWYWx1ZSA9IFNlcmlhbGl6YWJsZVZhbHVlPiB7XG4gIC8qKlxuICAgKiBQZXItbWVzc2FnZSBpZGVudGl0eSBnZW5lcmF0ZWQgYnkgdGhlIHB1Ymxpc2hlciwgdW5pcXVlIGFjcm9zcyBpbnN0YW5jZXMuXG4gICAqIFN1aXRhYmxlIGZvciBkZWR1cGUgd2hlbiBhIGNsaWVudCByZWNvbm5lY3RzIGFuZCBmb3IgYW4gU1NFIGBpZDpgIGZpZWxkLiBOb3RcbiAgICogb3JkZXJlZCwgYW5kIG5vdCBhIGRhdGFiYXNlIGtleS5cbiAgICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBUaGUgdG9waWMgdGhpcyB3YXMgYnJvYWRjYXN0IG9uOyBsaXN0ZW5lcnMgb24gb3RoZXIgdG9waWNzIG5ldmVyIHNlZSBpdC4gKi9cbiAgdG9waWM6IHN0cmluZztcbiAgLyoqIENhbGxlci1jaG9zZW4gZXZlbnQgbmFtZSwgZS5nLiBgb3JkZXIudXBkYXRlZGAuIE5ldmVyIGVtcHR5LiAqL1xuICB0eXBlOiBzdHJpbmc7XG4gIC8qKiBBdXRvbWF0aWMgY29udGV4dCBtZXJnZWQgd2l0aCBjYWxsZXIgbWV0YWRhdGEuIFNlZSB7QGxpbmsgVG9waWNNZXRhZGF0YX0uICovXG4gIG1ldGFkYXRhOiBUb3BpY01ldGFkYXRhO1xuICAvKiogVGhlIGNhbGxlcidzIHBheWxvYWQsIHVuY2hhbmdlZC4gKi9cbiAgYm9keTogVEJvZHk7XG4gIC8qKlxuICAgKiBJU08tODYwMSBwdWJsaXNoIHRpbWUgZnJvbSB0aGUgUFVCTElTSElORyBwcm9jZXNzJ3MgY2xvY2ssIG5vdCB0aGUgZGF0YWJhc2Uncy5cbiAgICogRmluZSBmb3IgZGlzcGxheTsgZG8gbm90IG9yZGVyIG1lc3NhZ2VzIGZyb20gZGlmZmVyZW50IGluc3RhbmNlcyBieSBpdC5cbiAgICovXG4gIHB1Ymxpc2hlZEF0OiBzdHJpbmc7XG59XG5cbi8qKiBXaGF0IGEgY2FsbGVyIHN1cHBsaWVzIHRvIHtAbGluayBQb3N0Z3Jlc1RvcGljQnVzLmJyb2FkY2FzdH0uICovXG5leHBvcnQgaW50ZXJmYWNlIFRvcGljUHVibGlzaElucHV0PFRCb2R5IGV4dGVuZHMgU2VyaWFsaXphYmxlVmFsdWUgPSBTZXJpYWxpemFibGVWYWx1ZT4ge1xuICAvKiogRXZlbnQgbmFtZSwgZS5nLiBgY2hhdC5tZXNzYWdlYC4gTXVzdCBiZSBub24tYmxhbmsuICovXG4gIHR5cGU6IHN0cmluZztcbiAgLyoqXG4gICAqIENvbnRleHQgdG8gYXR0YWNoLiBXaW5zIG92ZXIgYW55IGF1dG9tYXRpYyBrZXkgb2YgdGhlIHNhbWUgbmFtZSwgc28gYSBjYWxsZXJcbiAgICogY2FuIG92ZXJyaWRlIGEgbWFjaGluZSBkZWZhdWx0IChgcHJvamVjdGApIG9yIGFkZCBpdHMgb3duIChgdHJhY2VJZGApLlxuICAgKi9cbiAgbWV0YWRhdGE/OiBUb3BpY01ldGFkYXRhO1xuICAvKiogVGhlIHBheWxvYWQuIE11c3Qgc2F0aXNmeSBgb2JqZWN0LmlzU2VyaWFsaXphYmxlVmFsdWVgLiAqL1xuICBib2R5OiBUQm9keTtcbiAgc2NvcGU/OiBUb3BpY1BlcnNpc3RlbmNlU2NvcGU7XG4gIHR0bD86IER1cmF0aW9uSW5wdXQgfCBmYWxzZTtcbn1cblxuLyoqXG4gKiBTdWJzY3JpYmVyIGNhbGxiYWNrLiBJbnZva2VkIG9uY2UgcGVyIG1hdGNoaW5nIG1lc3NhZ2Ugb24gdGhlIG5vdGlmaWNhdGlvblxuICogY29ubmVjdGlvbidzIGNhbGxiYWNrLCBzbyBpdCBzaG91bGQgbm90IGJsb2NrOiBhIHJldHVybmVkIHByb21pc2UgaXMgYXdhaXRlZFxuICogb25seSB0byByb3V0ZSBhIHJlamVjdGlvbiB0byBgb25FcnJvcmAsIGFuZCBsaXN0ZW5lcnMgZm9yIG9uZSBtZXNzYWdlIHJ1blxuICogY29uY3VycmVudGx5IHJhdGhlciB0aGFuIGluIHJlZ2lzdHJhdGlvbiBvcmRlci5cbiAqXG4gKiBgVEJvZHlgIGlzIHVuY2hlY2tlZCBhdCBydW50aW1lLiBUaGUgYnVzIGd1YXJhbnRlZXMgdGhlIGJvZHkgaXMgc2VyaWFsaXphYmxlLFxuICogbm90IHRoYXQgaXQgbWF0Y2hlcyB0aGUgdHlwZSBwYXJhbWV0ZXIsIHNvIHZhbGlkYXRlIGFueXRoaW5nIGEgbGlzdGVuZXJcbiAqIGJyYW5jaGVzIG9uLlxuICovXG5leHBvcnQgdHlwZSBUb3BpY0xpc3RlbmVyPFRCb2R5IGV4dGVuZHMgU2VyaWFsaXphYmxlVmFsdWUgPSBTZXJpYWxpemFibGVWYWx1ZT4gPSAoXG4gIG1lc3NhZ2U6IFRvcGljTWVzc2FnZTxUQm9keT4sXG4pID0+IHZvaWQgfCBQcm9taXNlTGlrZTx2b2lkPjtcblxuLyoqXG4gKiBSZXNvbHZlcyBtZXRhZGF0YSBhdCBwdWJsaXNoIHRpbWUgaW5zdGVhZCBvZiBjb25zdHJ1Y3Rpb24gdGltZSwgZm9yIGNvbnRleHQgYVxuICogcHJvY2VzcyBsZWFybnMgbGF0ZSBvciBhc3luY2hyb25vdXNseSAtIGFuIGluc3RhbmNlIGlkIGZyb20gYSBjb250cm9sIHBsYW5lLCBhXG4gKiBkaXNjb3ZlcmVkIGFkZHJlc3MgYSBjYWxsZXIgY2hvb3NlcyB0byBhdHRhY2guIENhbGxlZCBvbiBldmVyeSBicm9hZGNhc3QsIHNvXG4gKiBtZW1vaXplIGFueXRoaW5nIGV4cGVuc2l2ZTsgYSByZWplY3Rpb24gZmFpbHMgdGhlIGJyb2FkY2FzdC5cbiAqL1xuZXhwb3J0IHR5cGUgVG9waWNNZXRhZGF0YVByb3ZpZGVyID0gKCkgPT4gVG9waWNNZXRhZGF0YSB8IFByb21pc2VMaWtlPFRvcGljTWV0YWRhdGE+O1xuXG4vKiogQ29uc3RydWN0aW9uIG9wdGlvbnMgZm9yIHtAbGluayBQb3N0Z3Jlc1RvcGljQnVzfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUG9zdGdyZXNUb3BpY0J1c09wdGlvbnMge1xuICAvKipcbiAgICogV2hhdCBpZGVudGlmaWVzIHRoaXMgY2hhbm5lbCAtIGFueXRoaW5nLCBub3QganVzdCBhbiBpZGVudGlmaWVyOiBhIG5hbWUsIGFuXG4gICAqIGlkLCBhIGBbZW52LCBmZWF0dXJlXWAgcGFpciwgYSBjb25maWcgb2JqZWN0LiBUaGUgcGFydHMgYXJlIHRva2VuaXplZCBpbnRvIGFcbiAgICogbGVnYWwgUG9zdGdyZXMgY2hhbm5lbCBuYW1lIHdpdGggYSBzaG9ydCBoYXNoIG9mIHRoZSBvcmlnaW5hbHMgYXBwZW5kZWQsIHNvXG4gICAqIHRoZSBkZXJpdmF0aW9uIGlzIGRldGVybWluaXN0aWMgYW5kIG5vIGNhbGwgc2l0ZSBoYXMgdG8gc2FuaXRpemUuIFNlZVxuICAgKiB7QGxpbmsgUG9zdGdyZXNUb3BpY0J1cy5jaGFubmVsTmFtZX0gZm9yIHRoZSByZXNvbHZlZCBuYW1lLlxuICAgKlxuICAgKiBPbmUgdmFsdWUgb3IgbWFueTogYW4gYXJyYXkgaXMgcmVhZCBhcyBtdWx0aXBsZSBwYXJ0c1xuICAgKiAoe0BsaW5rIG9iamVjdC5PbmVPck1hbnl9KSwgYW55dGhpbmcgZWxzZSBhcyBhIHNpbmdsZSBwYXJ0LiBTb1xuICAgKiBgW1wiYmlsbGluZ1wiLCBcInByb2RcIl1gIGFuZCBgXCJiaWxsaW5nX3Byb2RcImAgYXJlIGRpZmZlcmVudCBjaGFubmVscywgc2luY2UgdGhlXG4gICAqIGhhc2ggc2VlcyBkaWZmZXJlbnQgc3RydWN0dXJlLlxuICAgKlxuICAgKiBFdmVyeSBwYXJ0aWNpcGF0aW5nIHByb2Nlc3MgbXVzdCBwYXNzIEVRVUlWQUxFTlQgcGFydHMsIHNpbmNlIGEgZGlmZmVyZW50XG4gICAqIHNwZWxsaW5nIGhhc2hlcyB0byBhIGRpZmZlcmVudCBjaGFubmVsLiBEZWZhdWx0cyB0byBhIHNoYXJlZFxuICAgKiBgZGJ4X3Rvb2xzX3RvcGljX2J1c2AgY2hhbm5lbC5cbiAgICovXG4gIGNoYW5uZWw/OiB1bmtub3duO1xuICAvKipcbiAgICogRXh0cmEgY29udGV4dCBhZGRlZCB0byBldmVyeSBtZXNzYWdlIHRoaXMgYnVzIHB1Ymxpc2hlcywgZWl0aGVyIGEgZml4ZWRcbiAgICogcmVjb3JkIG9yIGEge0BsaW5rIFRvcGljTWV0YWRhdGFQcm92aWRlcn0gY2FsbGVkIHBlciBicm9hZGNhc3QuIE92ZXJyaWRlc1xuICAgKiBhdXRvbWF0aWMgbWFjaGluZSBrZXlzOyBwZXItY2FsbCBgbWV0YWRhdGFgIG92ZXJyaWRlcyB0aGlzLlxuICAgKi9cbiAgbWV0YWRhdGE/OiBUb3BpY01ldGFkYXRhIHwgVG9waWNNZXRhZGF0YVByb3ZpZGVyO1xuICAvKipcbiAgICogU2luayBmb3IgZmFpbHVyZXMgdGhhdCBoYXZlIG5vIGNhbGxlciB0byB0aHJvdyB0bzogYSBsaXN0ZW5lciB0aGF0IHJlamVjdGVkLFxuICAgKiBhIGRyb3BwZWQgbm90aWZpY2F0aW9uIGNvbm5lY3Rpb24sIGEgZmFpbGVkIHJlY29ubmVjdCBhdHRlbXB0LiBEZWZhdWx0cyB0b1xuICAgKiBzd2FsbG93aW5nIHRoZW0sIHNvIHdpcmUgdGhpcyB0byBhIGxvZ2dlciBpbiBhbnl0aGluZyBsb25nLXJ1bm5pbmcuXG4gICAqL1xuICBvbkVycm9yPzogKGNhdXNlOiB1bmtub3duKSA9PiB2b2lkO1xuICBwZXJzaXN0PzogYm9vbGVhbiB8IFRvcGljQnVzUGVyc2lzdGVuY2VPcHRpb25zO1xufVxuXG4vKipcbiAqIERyb3Aga2V5cyB3aG9zZSB2YWx1ZSBpcyBgdW5kZWZpbmVkYCwgc28gYW4gdW5zZXQgZW52aXJvbm1lbnQgdmFyaWFibGUgbGVhdmVzXG4gKiB0aGUga2V5IEFCU0VOVCByYXRoZXIgdGhhbiBwcmVzZW50LWFuZC1udWxsLiBBYnNlbmNlIGlzIHdoYXQgbGV0cyBjYWxsZXJcbiAqIG1ldGFkYXRhIGFuZCBsYXRlciBtZXJnZSBsYXllcnMgc3VwcGx5IHRoZSBrZXkgaW5zdGVhZC5cbiAqL1xuZnVuY3Rpb24gZGVmaW5lZE1ldGFkYXRhKHZhbHVlczogUmVjb3JkPHN0cmluZywgU2VyaWFsaXphYmxlVmFsdWUgfCB1bmRlZmluZWQ+KTogVG9waWNNZXRhZGF0YSB7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXModmFsdWVzKS5maWx0ZXIoKGVudHJ5KTogZW50cnkgaXMgW3N0cmluZywgU2VyaWFsaXphYmxlVmFsdWVdID0+IHtcbiAgICAgIHJldHVybiBlbnRyeVsxXSAhPT0gdW5kZWZpbmVkO1xuICAgIH0pLFxuICApO1xufVxuXG4vKipcbiAqIENvbnRleHQgZXZlcnkgbWVzc2FnZSBnZXRzIGZvciBmcmVlOiB3aGljaCBwcm9qZWN0LCBob3N0LCBhbmQgZGVwbG95bWVudFxuICogcHVibGlzaGVkIGl0LlxuICpcbiAqIFJlYWQgZnJlc2ggcGVyIGJyb2FkY2FzdCByYXRoZXIgdGhhbiBjYWNoZWQsIGJlY2F1c2UgYSBsb25nLWxpdmVkIHByb2Nlc3MgY2FuXG4gKiBiZSByZS1wYXJlbnRlZCAoYSBkZXBsb3ltZW50IGlkIGFwcGVhcmluZyBhZnRlciBib290KS4gS2V5cyB0aGF0IHJlc29sdmUgdG9cbiAqIG5vdGhpbmcgYXJlIG9taXR0ZWQuXG4gKlxuICogRGVsaWJlcmF0ZWx5IE5PVCBpbmNsdWRlZDogcHVibGljL2NsaWVudCBJUCwgcHJvY2VzcyBpZCwgQ1BVIGFyY2hpdGVjdHVyZSxcbiAqIHJ1bnRpbWUgbmFtZSwgYW5kIHJ1bnRpbWUgdmVyc2lvbi4gSVBzIGFuZCBwaWRzIGFyZSBub2lzeSwgb2Z0ZW4gc2Vuc2l0aXZlLFxuICogYW5kIGJ1cm4gYE5PVElGWWAgcGF5bG9hZCBidWRnZXQ7IGFyY2hpdGVjdHVyZS9ydW50aW1lIGFyZSBjb25zdGFudCBwZXJcbiAqIGRlcGxveW1lbnQgYW5kIHBheSB0aGUgc2FtZSBjb3N0LiBBIHByb2Nlc3MgdGhhdCB3YW50cyBhbnkgb2YgdGhlbSBwYXNzZXMgYVxuICoge0BsaW5rIFRvcGljTWV0YWRhdGFQcm92aWRlcn0gb3IgcGVyLW1lc3NhZ2UgYG1ldGFkYXRhYC5cbiAqL1xuZnVuY3Rpb24gbWFjaGluZU1ldGFkYXRhKCk6IFRvcGljTWV0YWRhdGEge1xuICByZXR1cm4gZGVmaW5lZE1ldGFkYXRhKHtcbiAgICBwcm9qZWN0OlxuICAgICAgc3RyaW5nVXRpbHMuZmlyc3ROb25FbXB0eShbXG4gICAgICAgIHByb2Nlc3MuZW52LkRBVEFCUklDS1NfQVBQX05BTUUsXG4gICAgICAgIHByb2Nlc3MuZW52LkRBVEFCUklDS1NfQlVORExFX05BTUUsXG4gICAgICAgIHByb2Nlc3MuZW52LlBST0pFQ1RfTkFNRSxcbiAgICAgICAgcHJvY2Vzcy5lbnYubnBtX3BhY2thZ2VfbmFtZSxcbiAgICAgIF0pID8/IHVuZGVmaW5lZCxcbiAgICBob3N0bmFtZTogaG9zdG5hbWUoKSxcbiAgICBwbGF0Zm9ybTogcHJvY2Vzcy5wbGF0Zm9ybSxcbiAgICBlbnZpcm9ubWVudDogc3RyaW5nVXRpbHMudHJpbVRvTnVsbChwcm9jZXNzLmVudi5OT0RFX0VOVikgPz8gdW5kZWZpbmVkLFxuICAgIGFwcE5hbWU6IHN0cmluZ1V0aWxzLnRyaW1Ub051bGwocHJvY2Vzcy5lbnYuREFUQUJSSUNLU19BUFBfTkFNRSkgPz8gdW5kZWZpbmVkLFxuICAgIGRlcGxveW1lbnRJZDogc3RyaW5nVXRpbHMudHJpbVRvTnVsbChwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX0FQUF9ERVBMT1lNRU5UX0lEKSA/PyB1bmRlZmluZWQsXG4gICAgZGF0YWJyaWNrc0hvc3Q6IHN0cmluZ1V0aWxzLnRyaW1Ub051bGwocHJvY2Vzcy5lbnYuREFUQUJSSUNLU19IT1NUKSA/PyB1bmRlZmluZWQsXG4gIH0pO1xufVxuXG4vKipcbiAqIElkZW50aXR5IG9mIHRoZSBzaWduZWQtaW4gdXNlciBvbiB3aG9zZSBiZWhhbGYgdGhpcyBicm9hZGNhc3QgaGFwcGVucywgd2hlbiB0aGVcbiAqIHByb2Nlc3MgY2FuIHRlbGwuXG4gKlxuICogYEBkYXRhYnJpY2tzL2FwcGtpdGAgaXMgYW4gT1BUSU9OQUwgcGVlciwgc28gdGhlIGltcG9ydCBpcyBsYXp5IGFuZCBhIG1pc3NpbmdcbiAqIG1vZHVsZSBpcyBub3QgYW4gZXJyb3IgLSB0aGlzIGlzIGEgcGxhaW4gUG9zdGdyZXMgcGFja2FnZSB0aGF0IGFkZHMgc2VuZGVyXG4gKiBpZGVudGl0eSB3aGVuIGl0IGhhcHBlbnMgdG8gcnVuIGluc2lkZSBhbiBBcHBLaXQgYXBwLiBPdXRzaWRlIGFuIGFjdGl2ZVxuICogcGVyLXJlcXVlc3QgZXhlY3V0aW9uIGNvbnRleHQgQXBwS2l0IHRocm93cywgd2hpY2ggbWVhbnMgXCJubyB1c2VyIGhlcmVcIiwgc28gdGhlXG4gKiByZXN1bHQgaXMgZW1wdHkgbWV0YWRhdGEgcmF0aGVyIHRoYW4gYSBmYWlsZWQgYnJvYWRjYXN0LlxuICovXG5hc3luYyBmdW5jdGlvbiBzZW5kZXJNZXRhZGF0YSgpOiBQcm9taXNlPFRvcGljTWV0YWRhdGE+IHtcbiAgYXBwS2l0TW9kdWxlID8/PSBpbXBvcnQoXCJAZGF0YWJyaWNrcy9hcHBraXRcIilcbiAgICAudGhlbigobW9kdWxlKSA9PiBtb2R1bGUgYXMgQXBwS2l0TW9kdWxlKVxuICAgIC5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICBjb25zdCBhcHBraXQgPSBhd2FpdCBhcHBLaXRNb2R1bGU7XG4gIGlmICghYXBwa2l0KSByZXR1cm4ge307XG4gIHRyeSB7XG4gICAgY29uc3QgY29udGV4dCA9IGFwcGtpdC5nZXRFeGVjdXRpb25Db250ZXh0KCk7XG4gICAgcmV0dXJuIGRlZmluZWRNZXRhZGF0YSh7XG4gICAgICBzZW5kZXJJZDogc3RyaW5nVXRpbHMudHJpbVRvTnVsbChjb250ZXh0LnVzZXJJZCkgPz8gdW5kZWZpbmVkLFxuICAgICAgc2VuZGVyTmFtZTogc3RyaW5nVXRpbHMudHJpbVRvTnVsbChjb250ZXh0LnVzZXJOYW1lKSA/PyB1bmRlZmluZWQsXG4gICAgICBzZW5kZXJFbWFpbDogc3RyaW5nVXRpbHMudHJpbVRvTnVsbChjb250ZXh0LnVzZXJFbWFpbCkgPz8gdW5kZWZpbmVkLFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4ge307XG4gIH1cbn1cblxuLyoqIFF1b3RlIGEgdmFsaWRhdGVkIGNoYW5uZWwgZm9yIGBMSVNURU5gL2BVTkxJU1RFTmAsIHdoaWNoIHRha2Ugbm8gcGFyYW1ldGVycy4gKi9cbmZ1bmN0aW9uIHF1b3RlSWRlbnRpZmllcih2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBcIiR7dmFsdWUucmVwbGFjZUFsbCgnXCInLCAnXCJcIicpfVwiYDtcbn1cblxuLyoqXG4gKiBQYXJzZSBhIGBOT1RJRllgIHBheWxvYWQgaW50byBhbiBlbnZlbG9wZSwgcmV0dXJuaW5nIGB1bmRlZmluZWRgIGZvciBhbnl0aGluZ1xuICogdGhhdCBpcyBub3Qgb25lLlxuICpcbiAqIFRoZSBjaGFubmVsIGlzIHNoYXJlZCBhbmQgYW55IFBvc3RncmVzIHNlc3Npb24gY2FuIGBwZ19ub3RpZnlgIG9uIGl0LCBzbyBhblxuICogdW5yZWNvZ25pemVkIHBheWxvYWQgaXMgZXhwZWN0ZWQgaW5wdXQsIG5vdCBhbiBleGNlcHRpb24uIFB1Ymxpc2hlcnMgcnVuIHRoaXNcbiAqIG92ZXIgdGhlaXIgb3duIGVuY29kZWQgbWVzc2FnZSB0b28sIHdoaWNoIGlzIGhvdyBhIGJvZHkgdGhhdCBzdHJpbmdpZmllcyBidXRcbiAqIGRvZXMgbm90IHJvdW5kLXRyaXAgaXMgY2F1Z2h0IGJlZm9yZSBpdCBzaGlwcy5cbiAqL1xuZnVuY3Rpb24gZGVjb2RlKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBUb3BpY01lc3NhZ2UgfCB1bmRlZmluZWQge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCByZWNvcmQgPSBqc29uLnBhcnNlUmVjb3JkKHZhbHVlKTtcbiAgaWYgKFxuICAgICFyZWNvcmQgfHxcbiAgICB0eXBlb2YgcmVjb3JkLmlkICE9PSBcInN0cmluZ1wiIHx8XG4gICAgdHlwZW9mIHJlY29yZC50b3BpYyAhPT0gXCJzdHJpbmdcIiB8fFxuICAgIHR5cGVvZiByZWNvcmQudHlwZSAhPT0gXCJzdHJpbmdcIiB8fFxuICAgIHR5cGVvZiByZWNvcmQucHVibGlzaGVkQXQgIT09IFwic3RyaW5nXCIgfHxcbiAgICAhcmVjb3JkLm1ldGFkYXRhIHx8XG4gICAgdHlwZW9mIHJlY29yZC5tZXRhZGF0YSAhPT0gXCJvYmplY3RcIiB8fFxuICAgIEFycmF5LmlzQXJyYXkocmVjb3JkLm1ldGFkYXRhKSB8fFxuICAgICEoXCJib2R5XCIgaW4gcmVjb3JkKSB8fFxuICAgICFvYmplY3QuaXNTZXJpYWxpemFibGVWYWx1ZShyZWNvcmQubWV0YWRhdGEpIHx8XG4gICAgIW9iamVjdC5pc1NlcmlhbGl6YWJsZVZhbHVlKHJlY29yZC5ib2R5KVxuICApIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiB7XG4gICAgaWQ6IHJlY29yZC5pZCxcbiAgICB0b3BpYzogcmVjb3JkLnRvcGljLFxuICAgIHR5cGU6IHJlY29yZC50eXBlLFxuICAgIG1ldGFkYXRhOiByZWNvcmQubWV0YWRhdGEgYXMgVG9waWNNZXRhZGF0YSxcbiAgICBib2R5OiByZWNvcmQuYm9keSBhcyBTZXJpYWxpemFibGVWYWx1ZSxcbiAgICBwdWJsaXNoZWRBdDogcmVjb3JkLnB1Ymxpc2hlZEF0LFxuICB9O1xufVxuXG4vKipcbiAqIEJyb2FkY2FzdHMgc3RydWN0dXJlZCBtZXNzYWdlcyBieSB0b3BpYyBhbmQgZGVsaXZlcnMgdGhlbSB0byBldmVyeSBwcm9jZXNzXG4gKiBsaXN0ZW5pbmcgb24gdGhlIHNhbWUgY2hhbm5lbC5cbiAqXG4gKiBDT05ORUNUSU9OIFNIQVBFLiBQdWJsaXNoaW5nIGJvcnJvd3MgYSBwb29sZWQgY29ubmVjdGlvbiBwZXIgY2FsbCwgbGlrZSBhbnlcbiAqIG90aGVyIHF1ZXJ5LiBMaXN0ZW5pbmcgY2Fubm90OiBgTElTVEVOYCBpcyBzZXNzaW9uIHN0YXRlLCBzbyB0aGUgYnVzIGhvbGRzIE9ORVxuICogZGVkaWNhdGVkIGNsaWVudCBvdXQgb2YgdGhlIHBvb2wgZm9yIGFzIGxvbmcgYXMgaXQgaGFzIHN1YnNjcmliZXJzLCBubyBtYXR0ZXJcbiAqIGhvdyBtYW55IHRvcGljcyBvciBsaXN0ZW5lcnMgYXJlIHJlZ2lzdGVyZWQuIFNpemUgdGhlIHBvb2wgd2l0aCB0aGF0IG9uZVxuICogbG9uZy1saXZlZCBjaGVja291dCBpbiBtaW5kLlxuICpcbiAqIExJRkVDWUNMRS4gQ29uc3RydWN0aW9uIGlzIGluZXJ0IC0gbm90aGluZyBjb25uZWN0cyB1bnRpbCB0aGUgZmlyc3RcbiAqIHtAbGluayBsaXN0ZW59IChvciBhbiBleHBsaWNpdCB7QGxpbmsgc3RhcnR9KS4ge0BsaW5rIGNsb3NlfSBpcyByZXF1aXJlZCB0byBnaXZlXG4gKiB0aGUgY29ubmVjdGlvbiBiYWNrOyBhIGNsb3NlZCBidXMgc3RheXMgY2xvc2VkIGFuZCB0aHJvd3Mgb24gZnVydGhlciB1c2UgcmF0aGVyXG4gKiB0aGFuIHNpbGVudGx5IHJlY29ubmVjdGluZy4gUmVnaXN0ZXIgaXQgd2l0aCB0aGUgaG9zdCdzIHNodXRkb3duIGhvb2suXG4gKlxuICogRkFJTFVSRSBIQU5ETElORy4gQSBsb3N0IG5vdGlmaWNhdGlvbiBjb25uZWN0aW9uIHJlY29ubmVjdHMgb24gaXRzIG93biB3aXRoXG4gKiBib3VuZGVkIGJhY2tvZmYgd2hpbGUgc3Vic2NyaWJlcnMgcmVtYWluLCByZXBvcnRpbmcgZWFjaCBmYWlsZWQgYXR0ZW1wdCB0aHJvdWdoXG4gKiBgb25FcnJvcmAuIE1lc3NhZ2VzIHB1Ymxpc2hlZCBkdXJpbmcgdGhlIGdhcCBhcmUgbG9zdCAtIGBOT1RJRllgIGhhcyBubyByZXBsYXkuXG4gKiBBIHRocm93aW5nIG9yIHJlamVjdGluZyBsaXN0ZW5lciBuZXZlciBhZmZlY3RzIHRoZSBwdWJsaXNoZXIgb3IgdGhlIG90aGVyXG4gKiBsaXN0ZW5lcnM7IGl0cyBmYWlsdXJlIGdvZXMgdG8gYG9uRXJyb3JgLlxuICpcbiAqIE5vdCBzYWZlIHRvIHNoYXJlIG9uZSBpbnN0YW5jZSBhY3Jvc3MgdW5yZWxhdGVkIGNoYW5uZWxzIC0gY29uc3RydWN0IG9uZSBidXNcbiAqIHBlciBjaGFubmVsLiBUaGUgY2hhbm5lbCBpdHNlbGYgaXMgREVSSVZFRCBmcm9tIHRoZSBgY2hhbm5lbGAgb3B0aW9uIHJhdGhlclxuICogdGhhbiB0YWtlbiBsaXRlcmFsbHk7IHNlZSB7QGxpbmsgUG9zdGdyZXNUb3BpY0J1c09wdGlvbnMuY2hhbm5lbH0gYW5kXG4gKiB7QGxpbmsgUG9zdGdyZXNUb3BpY0J1cy5jaGFubmVsTmFtZX0uXG4gKi9cbmV4cG9ydCBjbGFzcyBQb3N0Z3Jlc1RvcGljQnVzIHtcbiAgLyoqXG4gICAqIFRoZSByZXNvbHZlZCBQb3N0Z3JlcyBjaGFubmVsIHRoaXMgYnVzIGxpc3RlbnMgYW5kIHB1Ymxpc2hlcyBvbiwgZGVyaXZlZCBmcm9tXG4gICAqIHRoZSBgY2hhbm5lbGAgb3B0aW9uLiBSZWFkIGl0IHRvIGNvbmZpcm0gdHdvIHByb2Nlc3NlcyBhZ3JlZSwgb3IgdG8gbG9nIHdoYXQgYVxuICAgKiBzZXQgb2YgcGFydHMgYWN0dWFsbHkgcmVzb2x2ZWQgdG8uXG4gICAqL1xuICByZWFkb25seSBjaGFubmVsTmFtZTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IG1ldGFkYXRhOiBUb3BpY01ldGFkYXRhIHwgVG9waWNNZXRhZGF0YVByb3ZpZGVyIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IG9uRXJyb3I6IChjYXVzZTogdW5rbm93bikgPT4gdm9pZDtcbiAgcHJpdmF0ZSByZWFkb25seSBsaXN0ZW5lcnMgPSBuZXcgTWFwPHN0cmluZywgU2V0PFRvcGljTGlzdGVuZXI+PigpO1xuICBwcml2YXRlIGNsaWVudDogUG9vbENsaWVudCB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBzdGFydGluZzogUHJvbWlzZTx2b2lkPiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZWNvbm5lY3Rpbmc6IFByb21pc2U8dm9pZD4gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVjb25uZWN0QWJvcnQgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIHByaXZhdGUgY2xvc2VkID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGVyc2lzdGVuY2U/OiBSZXNvbHZlZFRvcGljQnVzUGVyc2lzdGVuY2VPcHRpb25zO1xuICBwcml2YXRlIHByb3Zpc2lvbmluZz86IFByb21pc2U8dm9pZD47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBwb29sOiBQZ1Bvb2xMaWtlICYgUGdRdWVyeWFibGUsXG4gICAgb3B0aW9uczogUG9zdGdyZXNUb3BpY0J1c09wdGlvbnMgPSB7fSxcbiAgKSB7XG4gICAgdGhpcy5jaGFubmVsTmFtZSA9IGNoYW5uZWxOYW1lKFxuICAgICAgb3B0aW9ucy5jaGFubmVsID09PSB1bmRlZmluZWQgPyBERUZBVUxUX0NIQU5ORUwgOiBvcHRpb25zLmNoYW5uZWwsXG4gICAgKTtcbiAgICB0aGlzLm1ldGFkYXRhID0gb3B0aW9ucy5tZXRhZGF0YTtcbiAgICB0aGlzLm9uRXJyb3IgPSBvcHRpb25zLm9uRXJyb3IgPz8gKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgdGhpcy5wZXJzaXN0ZW5jZSA9IG9wdGlvbnMucGVyc2lzdFxuICAgICAgPyByZXNvbHZlUGVyc2lzdGVuY2VPcHRpb25zKG9wdGlvbnMucGVyc2lzdCA9PT0gdHJ1ZSA/IHRydWUgOiBvcHRpb25zLnBlcnNpc3QpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVuIHRoZSBkZWRpY2F0ZWQgbm90aWZpY2F0aW9uIGNvbm5lY3Rpb24gYW5kIGBMSVNURU5gLlxuICAgKlxuICAgKiBJZGVtcG90ZW50LCBhbmQgc2FmZSB0byBjYWxsIGNvbmN1cnJlbnRseSAtIG92ZXJsYXBwaW5nIGNhbGxzIGF3YWl0IHRoZSBzYW1lXG4gICAqIGluLWZsaWdodCBjb25uZWN0LiB7QGxpbmsgbGlzdGVufSBjYWxscyB0aGlzLCBzbyBpdCBpcyBvbmx5IG5lZWRlZCB0byBzdXJmYWNlXG4gICAqIGEgY29ubmVjdGlvbiBwcm9ibGVtIGF0IHN0YXJ0dXAgcmF0aGVyIHRoYW4gb24gZmlyc3Qgc3Vic2NyaWJlLiBUaHJvd3MgaWYgdGhlXG4gICAqIGJ1cyBpcyBjbG9zZWQsIG9yIGlmIHRoZSBwb29sIGNhbm5vdCBoYW5kIG91dCBhIGNvbm5lY3Rpb24uXG4gICAqL1xuICBhc3luYyBzdGFydCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5jbGllbnQpIHJldHVybjtcbiAgICBpZiAodGhpcy5jbG9zZWQpIHRocm93IG5ldyBFcnJvcihcIlBvc3RncmVzIHRvcGljIGJ1cyBpcyBjbG9zZWRcIik7XG4gICAgdGhpcy5zdGFydGluZyA/Pz0gdGhpcy5jb25uZWN0KCkuZmluYWxseSgoKSA9PiB7XG4gICAgICB0aGlzLnN0YXJ0aW5nID0gdW5kZWZpbmVkO1xuICAgIH0pO1xuICAgIGF3YWl0IHRoaXMuc3RhcnRpbmc7XG4gIH1cblxuICAvKipcbiAgICogUHVibGlzaCBhIG1lc3NhZ2UgdG8gYHRvcGljYCwgcmV0dXJuaW5nIHRoZSBlbnZlbG9wZSB0aGF0IHdhcyBzZW50LlxuICAgKlxuICAgKiBSZXNvbHZlcyBvbmNlIFBvc3RncmVzIGhhcyBhY2NlcHRlZCB0aGUgYE5PVElGWWAsIHdoaWNoIHNheXMgbm90aGluZyBhYm91dFxuICAgKiBhbnlvbmUgcmVjZWl2aW5nIGl0OiBzZXNzaW9ucyBub3QgbGlzdGVuaW5nIGF0IHRoYXQgbW9tZW50IG1pc3MgaXQuIFB1Ymxpc2hpbmdcbiAgICogbmVlZHMgbm8ge0BsaW5rIHN0YXJ0fSBhbmQgbm8gc3Vic2NyaWJlcnMuXG4gICAqXG4gICAqIFZhbGlkYXRpb24gaXMgZGVsaWJlcmF0ZWx5IGZyb250LWxvYWRlZCwgc2luY2UgYSBtZXNzYWdlIHRoYXQgZmFpbHMgb24gdGhlXG4gICAqIHdpcmUgaXMgZmFyIGhhcmRlciB0byBkaWFnbm9zZSB0aGFuIG9uZSByZWplY3RlZCBhdCB0aGUgY2FsbDogYFR5cGVFcnJvcmAgZm9yIGFcbiAgICogYmxhbmsgdG9waWMgb3IgdHlwZSwgb3IgYSBib2R5L21ldGFkYXRhIHRoYXQgd291bGQgbm90IHJvdW5kLXRyaXAgdGhyb3VnaCBKU09OXG4gICAqIHVuY2hhbmdlZCAoYG9iamVjdC5pc1NlcmlhbGl6YWJsZVZhbHVlYCk7IGBSYW5nZUVycm9yYCB3aGVuIHRoZSBlbmNvZGVkXG4gICAqIGVudmVsb3BlIGV4Y2VlZHMgdGhlIGBOT1RJRllgIHBheWxvYWQgbGltaXQsIHdoaWNoIHRoZSBhdXRvbWF0aWMgbWV0YWRhdGFcbiAgICogY291bnRzIGFnYWluc3QgLSBzZW5kIGEgcmVmZXJlbmNlIGFuZCBsZXQgdGhlIHJlY2VpdmVyIGZldGNoIHRoZSBwYXlsb2FkLlxuICAgKiBUaHJvd3MgaWYgdGhlIGJ1cyBpcyBjbG9zZWQuXG4gICAqL1xuICBhc3luYyBicm9hZGNhc3Q8VEJvZHkgZXh0ZW5kcyBTZXJpYWxpemFibGVWYWx1ZT4oXG4gICAgdG9waWM6IHN0cmluZyxcbiAgICBpbnB1dDogVG9waWNQdWJsaXNoSW5wdXQ8VEJvZHk+LFxuICApOiBQcm9taXNlPFRvcGljTWVzc2FnZTxUQm9keT4+IHtcbiAgICBpZiAoIXRvcGljLnRyaW0oKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlRvcGljIG11c3Qgbm90IGJlIGVtcHR5XCIpO1xuICAgIGlmICghaW5wdXQudHlwZS50cmltKCkpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJNZXNzYWdlIHR5cGUgbXVzdCBub3QgYmUgZW1wdHlcIik7XG4gICAgaWYgKFxuICAgICAgIW9iamVjdC5pc1NlcmlhbGl6YWJsZVZhbHVlKGlucHV0Lm1ldGFkYXRhID8/IHt9KSB8fFxuICAgICAgIW9iamVjdC5pc1NlcmlhbGl6YWJsZVZhbHVlKGlucHV0LmJvZHkpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTWVzc2FnZSBtZXRhZGF0YSBhbmQgYm9keSBtdXN0IGJlIEpTT04gc2VyaWFsaXphYmxlIHdpdGhvdXQgY29lcmNpb25cIik7XG4gICAgfVxuICAgIGlmICh0aGlzLmNsb3NlZCkgdGhyb3cgbmV3IEVycm9yKFwiUG9zdGdyZXMgdG9waWMgYnVzIGlzIGNsb3NlZFwiKTtcbiAgICBjb25zdCBhdXRvbWF0aWMgPSBhd2FpdCB0aGlzLnJlc29sdmVNZXRhZGF0YSgpO1xuICAgIGNvbnN0IG1lc3NhZ2U6IFRvcGljTWVzc2FnZTxUQm9keT4gPSB7XG4gICAgICBpZDogaGFzaC5pZCgpLFxuICAgICAgdG9waWMsXG4gICAgICB0eXBlOiBpbnB1dC50eXBlLFxuICAgICAgbWV0YWRhdGE6IHsgLi4uYXV0b21hdGljLCAuLi5pbnB1dC5tZXRhZGF0YSB9LFxuICAgICAgYm9keTogaW5wdXQuYm9keSxcbiAgICAgIHB1Ymxpc2hlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgfTtcbiAgICBsZXQgZW5jb2RlZDogc3RyaW5nO1xuICAgIHRyeSB7XG4gICAgICBlbmNvZGVkID0gSlNPTi5zdHJpbmdpZnkobWVzc2FnZSk7XG4gICAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE1lc3NhZ2UgbXVzdCBiZSBKU09OIHNlcmlhbGl6YWJsZTogJHtlcnJvclV0aWxzLmVycm9yTWVzc2FnZShjYXVzZSl9YCk7XG4gICAgfVxuICAgIGlmICghZGVjb2RlKGVuY29kZWQpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTWVzc2FnZSB0eXBlLCBtZXRhZGF0YSwgYW5kIGJvZHkgbXVzdCBiZSBKU09OIHNlcmlhbGl6YWJsZVwiKTtcbiAgICB9XG4gICAgLy8gT25seSB0aGUgZW52ZWxvcGUgcGF5bG9hZCBpcyBib3VuZGVkIGJ5IHRoZSBgTk9USUZZYCBsaW1pdC4gQSBwb2ludGVyXG4gICAgLy8gbm90aWZpY2F0aW9uIGlzIGEgZml4ZWQgaGFuZGZ1bCBvZiBieXRlcywgc28gcGVyc2lzdGVuY2Ugd2l0aFxuICAgIC8vIGBwYXlsb2FkOiBcInBvaW50ZXJcImAgbGlmdHMgdGhlIGNhcCBlbnRpcmVseS5cbiAgICBpZiAoXG4gICAgICBCdWZmZXIuYnl0ZUxlbmd0aChlbmNvZGVkLCBcInV0ZjhcIikgPiBNQVhfTk9USUZZX0JZVEVTICYmXG4gICAgICB0aGlzLnBlcnNpc3RlbmNlPy5wYXlsb2FkICE9PSBcInBvaW50ZXJcIlxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFBvc3RncmVzIG5vdGlmaWNhdGlvbiBleGNlZWRzICR7TUFYX05PVElGWV9CWVRFU30gYnl0ZXNgKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnBlcnNpc3RlbmNlKSB7XG4gICAgICBhd2FpdCB0aGlzLnBvb2wucXVlcnkoXCJTRUxFQ1QgcGdfbm90aWZ5KCQxLCAkMilcIiwgW3RoaXMuY2hhbm5lbE5hbWUsIGVuY29kZWRdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMucGVyc2lzdGVuY2UucHJvdmlzaW9uKSB7XG4gICAgICAgIHRoaXMucHJvdmlzaW9uaW5nID8/PSBwcm92aXNpb25NZXNzYWdlQnVzU2NoZW1hKHRoaXMucG9vbCwgdGhpcy5wZXJzaXN0ZW5jZSk7XG4gICAgICAgIGF3YWl0IHRoaXMucHJvdmlzaW9uaW5nO1xuICAgICAgfVxuICAgICAgY29uc3QgY2xpZW50ID0gYXdhaXQgdGhpcy5wb29sLmNvbm5lY3QoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShcIkJFR0lOXCIpO1xuICAgICAgICBhd2FpdCBwZXJzaXN0ZWROb3RpZnkoXG4gICAgICAgICAgY2xpZW50LFxuICAgICAgICAgIHRoaXMuY2hhbm5lbE5hbWUsXG4gICAgICAgICAgdG9waWMsXG4gICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgICBlbmNvZGVkLFxuICAgICAgICAgIHRoaXMucGVyc2lzdGVuY2UsXG4gICAgICAgICAgaW5wdXQuc2NvcGUgPz8gdGhpcy5wZXJzaXN0ZW5jZS5zY29wZSxcbiAgICAgICAgICBpbnB1dC50dGwgPz8gdGhpcy5wZXJzaXN0ZW5jZS50dGwsXG4gICAgICAgICk7XG4gICAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShcIkNPTU1JVFwiKTtcbiAgICAgIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShcIlJPTExCQUNLXCIpLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgICAgIHRocm93IGNhdXNlO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgY2xpZW50LnJlbGVhc2UoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1lc3NhZ2U7XG4gIH1cblxuICBhc3luYyBoaXN0b3J5PFRCb2R5IGV4dGVuZHMgU2VyaWFsaXphYmxlVmFsdWU+KFxuICAgIHRvcGljOiBzdHJpbmcsXG4gICAgb3B0aW9uczogeyBhZnRlcj86IHN0cmluZzsgbGltaXQ/OiBudW1iZXI7IHNjb3BlPzogVG9waWNQZXJzaXN0ZW5jZVNjb3BlIH0gPSB7fSxcbiAgKTogUHJvbWlzZTxUb3BpY0hpc3RvcnlQYWdlPFRCb2R5Pj4ge1xuICAgIGlmICghdGhpcy5wZXJzaXN0ZW5jZSkgdGhyb3cgbmV3IEVycm9yKFwiUG9zdGdyZXMgdG9waWMgYnVzIHBlcnNpc3RlbmNlIGlzIGRpc2FibGVkXCIpO1xuICAgIGlmICh0aGlzLnBlcnNpc3RlbmNlLnByb3Zpc2lvbikge1xuICAgICAgdGhpcy5wcm92aXNpb25pbmcgPz89IHByb3Zpc2lvbk1lc3NhZ2VCdXNTY2hlbWEodGhpcy5wb29sLCB0aGlzLnBlcnNpc3RlbmNlKTtcbiAgICAgIGF3YWl0IHRoaXMucHJvdmlzaW9uaW5nO1xuICAgIH1cbiAgICByZXR1cm4gaGlzdG9yeTxUQm9keT4odGhpcy5wb29sLCB0aGlzLmNoYW5uZWxOYW1lLCB0b3BpYywgdGhpcy5wZXJzaXN0ZW5jZSwgb3B0aW9ucyk7XG4gIH1cblxuICBhc3luYyBjbGVhbnVwRXhwaXJlZChcbiAgICBvcHRpb25zOiB7IHNjb3BlPzogVG9waWNQZXJzaXN0ZW5jZVNjb3BlOyBsaW1pdD86IG51bWJlciB9ID0ge30sXG4gICk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgaWYgKCF0aGlzLnBlcnNpc3RlbmNlKSB0aHJvdyBuZXcgRXJyb3IoXCJQb3N0Z3JlcyB0b3BpYyBidXMgcGVyc2lzdGVuY2UgaXMgZGlzYWJsZWRcIik7XG4gICAgcmV0dXJuIGNsZWFudXBFeHBpcmVkKFxuICAgICAgdGhpcy5wb29sLFxuICAgICAgdGhpcy5wZXJzaXN0ZW5jZSxcbiAgICAgIG9wdGlvbnMuc2NvcGUgPz8gdGhpcy5wZXJzaXN0ZW5jZS5zY29wZSxcbiAgICAgIG9wdGlvbnMubGltaXQsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmUgdG8gYHRvcGljYCwgcmV0dXJuaW5nIHRoZSBmdW5jdGlvbiB0aGF0IHVuc3Vic2NyaWJlcy5cbiAgICpcbiAgICogQ29ubmVjdHMgb24gZmlyc3QgdXNlLiBTZXZlcmFsIGxpc3RlbmVycyBtYXkgc2hhcmUgYSB0b3BpYzsgZWFjaCBpcyBjYWxsZWRcbiAgICogb25jZSBwZXIgbWVzc2FnZS4gT25seSBtZXNzYWdlcyBwdWJsaXNoZWQgQUZURVIgdGhpcyByZXNvbHZlcyBhcnJpdmUsIHNvXG4gICAqIHN1YnNjcmliZSBiZWZvcmUgdHJpZ2dlcmluZyB3aGF0ZXZlciB5b3UgZXhwZWN0IHRvIG9ic2VydmUuXG4gICAqXG4gICAqIFRoZSByZXR1cm5lZCBmdW5jdGlvbiByZW1vdmVzIGp1c3QgdGhpcyBsaXN0ZW5lciBhbmQgaXMgc2FmZSB0byBjYWxsIHR3aWNlLlxuICAgKiBUaGUgY29ubmVjdGlvbiBzdGF5cyBvcGVuIG9uY2UgdGhlIGxhc3QgbGlzdGVuZXIgbGVhdmVzIC0ge0BsaW5rIGNsb3NlfVxuICAgKiByZWxlYXNlcyBpdCAtIHNvIGEgYnVzIHRoYXQgc3Vic2NyaWJlcyBhbmQgdW5zdWJzY3JpYmVzIHBlciByZXF1ZXN0IGRvZXMgbm90XG4gICAqIGNodXJuIGNvbm5lY3Rpb25zLlxuICAgKi9cbiAgYXN5bmMgbGlzdGVuPFRCb2R5IGV4dGVuZHMgU2VyaWFsaXphYmxlVmFsdWU+KFxuICAgIHRvcGljOiBzdHJpbmcsXG4gICAgbGlzdGVuZXI6IFRvcGljTGlzdGVuZXI8VEJvZHk+LFxuICApOiBQcm9taXNlPCgpID0+IFByb21pc2U8dm9pZD4+IHtcbiAgICBpZiAoIXRvcGljLnRyaW0oKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlRvcGljIG11c3Qgbm90IGJlIGVtcHR5XCIpO1xuICAgIGF3YWl0IHRoaXMuc3RhcnQoKTtcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbmVycy5nZXQodG9waWMpID8/IG5ldyBTZXQ8VG9waWNMaXN0ZW5lcj4oKTtcbiAgICBsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyIGFzIFRvcGljTGlzdGVuZXIpO1xuICAgIHRoaXMubGlzdGVuZXJzLnNldCh0b3BpYywgbGlzdGVuZXJzKTtcbiAgICByZXR1cm4gYXN5bmMgKCkgPT4ge1xuICAgICAgbGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lciBhcyBUb3BpY0xpc3RlbmVyKTtcbiAgICAgIGlmIChsaXN0ZW5lcnMuc2l6ZSA9PT0gMCkgdGhpcy5saXN0ZW5lcnMuZGVsZXRlKHRvcGljKTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIHRoZSBhdXRvbWF0aWMgaGFsZiBvZiBhIG1lc3NhZ2UncyBtZXRhZGF0YS5cbiAgICpcbiAgICogUHJlY2VkZW5jZSwgd2Vha2VzdCBmaXJzdDogbWFjaGluZS9wcm9jZXNzIGNvbnRleHQsIHRoZW4gQXBwS2l0IHNlbmRlclxuICAgKiBpZGVudGl0eSwgdGhlbiB0aGlzIGJ1cydzIGNvbmZpZ3VyZWQgbWV0YWRhdGEuIFRoZSBjYWxsZXIncyBwZXItbWVzc2FnZVxuICAgKiBtZXRhZGF0YSBpcyBsYXllcmVkIG92ZXIgdGhlIHJlc3VsdCBpbiB7QGxpbmsgYnJvYWRjYXN0fSwgc28gdGhlIG1vc3Qgc3BlY2lmaWNcbiAgICogc291cmNlIGFsd2F5cyB3aW5zIGFuZCBub3RoaW5nIGhlcmUgY2FuIG92ZXJ3cml0ZSBhbiBleHBsaWNpdCBrZXkuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlc29sdmVNZXRhZGF0YSgpOiBQcm9taXNlPFRvcGljTWV0YWRhdGE+IHtcbiAgICBjb25zdCBzZW5kZXIgPSBhd2FpdCBzZW5kZXJNZXRhZGF0YSgpO1xuICAgIGNvbnN0IGNvbmZpZ3VyZWQgPVxuICAgICAgdHlwZW9mIHRoaXMubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIiA/IGF3YWl0IHRoaXMubWV0YWRhdGEoKSA6ICh0aGlzLm1ldGFkYXRhID8/IHt9KTtcbiAgICByZXR1cm4geyAuLi5tYWNoaW5lTWV0YWRhdGEoKSwgLi4uc2VuZGVyLCAuLi5jb25maWd1cmVkIH07XG4gIH1cblxuICAvKipcbiAgICogUmVsZWFzZSB0aGUgbm90aWZpY2F0aW9uIGNvbm5lY3Rpb24gYW5kIHN0b3AgZGVsaXZlcmluZyBtZXNzYWdlcy4gSWRlbXBvdGVudC5cbiAgICpcbiAgICogQ2FuY2VscyBhbnkgcGVuZGluZyByZWNvbm5lY3QsIGRyb3BzIGFsbCBsaXN0ZW5lcnMsIHRoZW4gYFVOTElTVEVOYHMgYW5kXG4gICAqIHJldHVybnMgdGhlIGNsaWVudCB0byB0aGUgcG9vbC4gQSBmYWlsZWQgYFVOTElTVEVOYCBpcyByZXBvcnRlZCB0byB0aGUgcG9vbCBhc1xuICAgKiBhIHJlbGVhc2UgZXJyb3Igc28gdGhlIGNvbm5lY3Rpb24gaXMgRElTQ0FSREVEIHJhdGhlciB0aGFuIGhhbmRlZCB0byB0aGUgbmV4dFxuICAgKiBjYWxsZXIgc3RpbGwgc3Vic2NyaWJlZCB0byB0aGUgY2hhbm5lbC4gRG9lcyBub3QgdGhyb3c7IHRoZSBidXMgc3RheXMgY2xvc2VkLlxuICAgKi9cbiAgYXN5bmMgY2xvc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuY2xvc2VkKSByZXR1cm47XG4gICAgdGhpcy5jbG9zZWQgPSB0cnVlO1xuICAgIHRoaXMucmVjb25uZWN0QWJvcnQuYWJvcnQobmV3IEVycm9yKFwiUG9zdGdyZXMgdG9waWMgYnVzIGlzIGNsb3NlZFwiKSk7XG4gICAgYXdhaXQgdGhpcy5zdGFydGluZz8uY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICBhd2FpdCB0aGlzLnJlY29ubmVjdGluZz8uY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICBjb25zdCBjbGllbnQgPSB0aGlzLmNsaWVudDtcbiAgICB0aGlzLmNsaWVudCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmxpc3RlbmVycy5jbGVhcigpO1xuICAgIGlmICghY2xpZW50KSByZXR1cm47XG4gICAgY2xpZW50LnJlbW92ZUxpc3RlbmVyKFwibm90aWZpY2F0aW9uXCIsIHRoaXMuaGFuZGxlTm90aWZpY2F0aW9uKTtcbiAgICBjbGllbnQucmVtb3ZlTGlzdGVuZXIoXCJlcnJvclwiLCB0aGlzLmhhbmRsZUNsaWVudEVycm9yKTtcbiAgICBsZXQgcmVsZWFzZUVycm9yOiBFcnJvciB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KGBVTkxJU1RFTiAke3F1b3RlSWRlbnRpZmllcih0aGlzLmNoYW5uZWxOYW1lKX1gKTtcbiAgICB9IGNhdGNoIChjYXVzZSkge1xuICAgICAgcmVsZWFzZUVycm9yID0gZXJyb3JVdGlscy50b0Vycm9yKGNhdXNlKTtcbiAgICB9XG4gICAgY2xpZW50LnJlbGVhc2UocmVsZWFzZUVycm9yKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBvdXQgb25lIGNsaWVudCwgYXR0YWNoIHRoZSBoYW5kbGVycywgYW5kIGBMSVNURU5gLlxuICAgKlxuICAgKiBUaGUgaGFuZGxlcnMgYXJlIGF0dGFjaGVkIEJFRk9SRSB0aGUgYExJU1RFTmAgcm91bmQgdHJpcCBzbyBhIG5vdGlmaWNhdGlvbiBvclxuICAgKiBlcnJvciBhcnJpdmluZyBtaWQtc2V0dXAgaXMgbm90IG1pc3NlZC4gQW55IGZhaWx1cmUgLSBpbmNsdWRpbmcgdGhlIGJ1cyBiZWluZ1xuICAgKiBjbG9zZWQgd2hpbGUgdGhlIGNvbm5lY3Qgd2FzIGluIGZsaWdodCAtIGRldGFjaGVzIHRoZSBoYW5kbGVycyBhbmQgcmVsZWFzZXNcbiAgICogdGhlIGNsaWVudCBhcyBlcnJvcmVkLCBzbyBhIGhhbGYtY29uZmlndXJlZCBjb25uZWN0aW9uIG5ldmVyIHJldHVybnMgdG8gdGhlXG4gICAqIHBvb2wuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNvbm5lY3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY2xpZW50ID0gYXdhaXQgdGhpcy5wb29sLmNvbm5lY3QoKTtcbiAgICB0cnkge1xuICAgICAgY2xpZW50Lm9uKFwibm90aWZpY2F0aW9uXCIsIHRoaXMuaGFuZGxlTm90aWZpY2F0aW9uKTtcbiAgICAgIGNsaWVudC5vbihcImVycm9yXCIsIHRoaXMuaGFuZGxlQ2xpZW50RXJyb3IpO1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KGBMSVNURU4gJHtxdW90ZUlkZW50aWZpZXIodGhpcy5jaGFubmVsTmFtZSl9YCk7XG4gICAgICBpZiAodGhpcy5jbG9zZWQpIHRocm93IG5ldyBFcnJvcihcIlBvc3RncmVzIHRvcGljIGJ1cyBpcyBjbG9zZWRcIik7XG4gICAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgICB9IGNhdGNoIChjYXVzZSkge1xuICAgICAgY2xpZW50LnJlbW92ZUxpc3RlbmVyKFwibm90aWZpY2F0aW9uXCIsIHRoaXMuaGFuZGxlTm90aWZpY2F0aW9uKTtcbiAgICAgIGNsaWVudC5yZW1vdmVMaXN0ZW5lcihcImVycm9yXCIsIHRoaXMuaGFuZGxlQ2xpZW50RXJyb3IpO1xuICAgICAgY2xpZW50LnJlbGVhc2UoZXJyb3JVdGlscy50b0Vycm9yKGNhdXNlKSk7XG4gICAgICB0aHJvdyBjYXVzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUm91dGUgb25lIGluYm91bmQgbm90aWZpY2F0aW9uIHRvIHRoZSB0b3BpYydzIGxpc3RlbmVycy5cbiAgICpcbiAgICogSWdub3JlcyBvdGhlciBjaGFubmVscyBhbmQgdW5kZWNvZGFibGUgcGF5bG9hZHMgLSB0aGUgY2hhbm5lbCBpcyBzaGFyZWQsIHNvXG4gICAqIGJvdGggYXJlIG9yZGluYXJ5IHRyYWZmaWMuIExpc3RlbmVycyBhcmUgaW52b2tlZCBjb25jdXJyZW50bHkgYW5kIHRoZWlyXG4gICAqIHJlamVjdGlvbnMgZ28gdG8gYG9uRXJyb3JgLCBrZWVwaW5nIG9uZSBzbG93IG9yIGJyb2tlbiBzdWJzY3JpYmVyIGZyb21cbiAgICogc3RhbGxpbmcgdGhlIG5vdGlmaWNhdGlvbiBjb25uZWN0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBoYW5kbGVOb3RpZmljYXRpb24gPSAobm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24pOiB2b2lkID0+IHtcbiAgICBpZiAobm90aWZpY2F0aW9uLmNoYW5uZWwgIT09IHRoaXMuY2hhbm5lbE5hbWUpIHJldHVybjtcbiAgICBjb25zdCBtZXNzYWdlID0gZGVjb2RlKG5vdGlmaWNhdGlvbi5wYXlsb2FkKTtcbiAgICBpZiAobWVzc2FnZSkge1xuICAgICAgdGhpcy5kZWxpdmVyKG1lc3NhZ2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBgcGF5bG9hZDogXCJwb2ludGVyXCJgIGNhcnJpZXMgb25seSByb3V0aW5nIGFuZCBpZGVudGl0eSwgc28gdGhlIGVudmVsb3BlIGhhc1xuICAgIC8vIHRvIGJlIHJlYWQgYmFjayBiZWZvcmUgYW55dGhpbmcgY2FuIGJlIGRlbGl2ZXJlZC4gT25seSBhdHRlbXB0ZWQgd2hlbiB0aGlzXG4gICAgLy8gYnVzIGlzIGNvbmZpZ3VyZWQgZm9yIHBlcnNpc3RlbmNlOyBvdGhlcndpc2UgdGhlIHBheWxvYWQgaXMgZm9yZWlnbiB0cmFmZmljXG4gICAgLy8gb24gYSBzaGFyZWQgY2hhbm5lbCBhbmQgaWdub3JlZCBhcyBiZWZvcmUuXG4gICAgY29uc3QgcG9pbnRlciA9IHRoaXMucGVyc2lzdGVuY2UgPyBkZWNvZGVQb2ludGVyKG5vdGlmaWNhdGlvbi5wYXlsb2FkKSA6IHVuZGVmaW5lZDtcbiAgICBpZiAoIXBvaW50ZXIpIHJldHVybjtcbiAgICBpZiAoIXRoaXMubGlzdGVuZXJzLmhhcyhwb2ludGVyLnRvcGljKSkgcmV0dXJuO1xuICAgIHJlYWRQb2ludGVyKHRoaXMucG9vbCwgdGhpcy5jaGFubmVsTmFtZSwgcG9pbnRlciwgdGhpcy5wZXJzaXN0ZW5jZSEpXG4gICAgICAudGhlbigoc3RvcmVkKSA9PiB7XG4gICAgICAgIGlmIChzdG9yZWQpIHRoaXMuZGVsaXZlcihzdG9yZWQpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCh0aGlzLm9uRXJyb3IpO1xuICB9O1xuXG4gIC8qKiBIYW5kIG9uZSBkZWNvZGVkIG1lc3NhZ2UgdG8gdGhlIHRvcGljJ3MgbGlzdGVuZXJzLiAqL1xuICBwcml2YXRlIGRlbGl2ZXIobWVzc2FnZTogVG9waWNNZXNzYWdlKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLmxpc3RlbmVycy5nZXQobWVzc2FnZS50b3BpYykgPz8gW10pIHtcbiAgICAgIFByb21pc2UucmVzb2x2ZShsaXN0ZW5lcihtZXNzYWdlKSkuY2F0Y2godGhpcy5vbkVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHRoZSBub3RpZmljYXRpb24gY29ubmVjdGlvbiBkeWluZywgd2hpY2ggYHBnYCByZXBvcnRzIGFzIGFuIGBlcnJvcmBcbiAgICogZXZlbnQgcmF0aGVyIHRoYW4gYSByZWplY3RlZCBxdWVyeS5cbiAgICpcbiAgICogVGhlIGNsaWVudCBpcyB1bnVzYWJsZSBhdCB0aGlzIHBvaW50LCBzbyBpdCBpcyBkZXRhY2hlZCBhbmQgcmVsZWFzZWQgYXNcbiAgICogZXJyb3JlZCAod2hpY2ggZGlzY2FyZHMgaXQpIGJlZm9yZSBhbnl0aGluZyBlbHNlLiBSZWNvbm5lY3Rpb24gb25seSBzdGFydHNcbiAgICogd2hlbiB0aGVyZSBpcyBzdGlsbCBzb21lb25lIHRvIGRlbGl2ZXIgdG8sIHNvIGFuIGlkbGUgb3IgY2xvc2luZyBidXMgZG9lcyBub3RcbiAgICogaG9sZCBhIGNvbm5lY3Rpb24gb3BlbiBjaGFzaW5nIGEgY2hhbm5lbCBub2JvZHkgcmVhZHMuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGhhbmRsZUNsaWVudEVycm9yID0gKGNhdXNlOiBFcnJvcik6IHZvaWQgPT4ge1xuICAgIHRoaXMub25FcnJvcihjYXVzZSk7XG4gICAgY29uc3QgY2xpZW50ID0gdGhpcy5jbGllbnQ7XG4gICAgaWYgKCFjbGllbnQpIHJldHVybjtcbiAgICB0aGlzLmNsaWVudCA9IHVuZGVmaW5lZDtcbiAgICBjbGllbnQucmVtb3ZlTGlzdGVuZXIoXCJub3RpZmljYXRpb25cIiwgdGhpcy5oYW5kbGVOb3RpZmljYXRpb24pO1xuICAgIGNsaWVudC5yZW1vdmVMaXN0ZW5lcihcImVycm9yXCIsIHRoaXMuaGFuZGxlQ2xpZW50RXJyb3IpO1xuICAgIGNsaWVudC5yZWxlYXNlKGNhdXNlKTtcbiAgICBpZiAodGhpcy5jbG9zZWQgfHwgdGhpcy5saXN0ZW5lcnMuc2l6ZSA9PT0gMCkgcmV0dXJuO1xuICAgIHRoaXMucmVjb25uZWN0aW5nID8/PSB0aGlzLnJlY29ubmVjdCgpLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgdGhpcy5yZWNvbm5lY3RpbmcgPSB1bmRlZmluZWQ7XG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJlLWVzdGFibGlzaCB0aGUgbm90aWZpY2F0aW9uIGNvbm5lY3Rpb24gd2l0aCBib3VuZGVkIGV4cG9uZW50aWFsIGJhY2tvZmYuXG4gICAqXG4gICAqIFRoZSBmaXJzdCBhdHRlbXB0IGlzIGltbWVkaWF0ZSwgc2luY2UgdGhlIGNvbW1vbiBjYXNlIGlzIGEgc2luZ2xlIGRyb3BwZWRcbiAgICogY29ubmVjdGlvbiB0aGF0IHJlY29ubmVjdHMgYXQgb25jZTsgc3Vic2VxdWVudCBkZWxheXMgZG91YmxlIGZyb20gMjUwbXMgdXAgdG9cbiAgICogNXMgYW5kIHN0YXkgdGhlcmUuIFJldHJpZXMgaW5kZWZpbml0ZWx5IHJhdGhlciB0aGFuIGdpdmluZyB1cCwgYmVjYXVzZSBhIFBvc3RncmVzIHJlc3RhcnRcbiAgICogb3IgYSByb3RhdGVkIExha2ViYXNlIGNyZWRlbnRpYWwgaXMgYSByZWNvdmVyYWJsZSBvdXRhZ2UgYW5kIGEgc2lsZW50bHkgZGVhZFxuICAgKiBsaXN0ZW5lciBpcyB3b3JzZSB0aGFuIGEgbm9pc3kgb25lLiBTdG9wcyB3aGVuIHRoZSBidXMgY2xvc2VzIG9yIHRoZSBsYXN0XG4gICAqIGxpc3RlbmVyIGxlYXZlcywgYW5kIHJlcG9ydHMgZXZlcnkgZmFpbGVkIGF0dGVtcHQgdGhyb3VnaCBgb25FcnJvcmAuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlY29ubmVjdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgZGVsYXkgPSAwO1xuICAgIHdoaWxlICghdGhpcy5jbG9zZWQgJiYgdGhpcy5saXN0ZW5lcnMuc2l6ZSA+IDApIHtcbiAgICAgIGlmIChkZWxheSA+IDApIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBhc3luY1V0aWxzLnNsZWVwKGRlbGF5LCB0aGlzLnJlY29ubmVjdEFib3J0LnNpZ25hbCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5zdGFydCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChjYXVzZSkge1xuICAgICAgICBpZiAodGhpcy5jbG9zZWQpIHJldHVybjtcbiAgICAgICAgdGhpcy5vbkVycm9yKGNhdXNlKTtcbiAgICAgICAgZGVsYXkgPSBkZWxheSA9PT0gMCA/IE1JTl9SRUNPTk5FQ1RfREVMQVlfTVMgOiBNYXRoLm1pbihkZWxheSAqIDIsIE1BWF9SRUNPTk5FQ1RfREVMQVlfTVMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19
|
|
503
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9waWMtYnVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RvcGljLWJ1cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0JHO0FBRUgsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNuQyxPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUlqRyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVDLE9BQU8sRUFDTCxjQUFjLEVBQ2QsYUFBYSxFQUNiLE9BQU8sRUFDUCxlQUFlLEVBQ2YseUJBQXlCLEVBQ3pCLFdBQVcsRUFDWCx5QkFBeUIsR0FNMUIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFRdkQsb0VBQW9FO0FBQ3BFLE1BQU0sZUFBZSxHQUFHLHFCQUFxQixDQUFDO0FBQzlDOzs7O0dBSUc7QUFDSCxNQUFNLGdCQUFnQixHQUFHLEtBQUssQ0FBQztBQUMvQixNQUFNLHNCQUFzQixHQUFHLEdBQUcsQ0FBQztBQUNuQyxNQUFNLHNCQUFzQixHQUFHLEtBQUssQ0FBQztBQWtCckM7Ozs7R0FJRztBQUNILElBQUksWUFBMkQsQ0FBQztBQWdIaEU7Ozs7R0FJRztBQUNILFNBQVMsZUFBZSxDQUFDLE1BQXFEO0lBQzVFLE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FDdkIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQXdDLEVBQUU7UUFDNUUsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDO0lBQ2hDLENBQUMsQ0FBQyxDQUNILENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7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KipcbiAqIFRvcGljIGZhbi1vdXQgb3ZlciBQb3N0Z3JlU1FMIGBMSVNURU5gL2BOT1RJRllgLCBmb3IgdGVsbGluZyBldmVyeSBydW5uaW5nXG4gKiBpbnN0YW5jZSBvZiBhbiBhcHAgdGhhdCBzb21ldGhpbmcgaGFwcGVuZWQuXG4gKlxuICogVGhlIHNpYmxpbmcgYGFkdmlzb3J5LWxvY2tgIG1vZHVsZSBpcyBhYm91dCBtYWtpbmcgc3VyZSBvbmx5IE9ORSBjb25uZWN0aW9uXG4gKiBkb2VzIGEgdGhpbmc7IHRoaXMgb25lIGlzIHRoZSBvcHBvc2l0ZSAtIEVWRVJZIGxpc3RlbmluZyBzZXNzaW9uIGdldHMgZXZlcnlcbiAqIG5vdGlmaWNhdGlvbi4gVGhhdCBtYWtlcyBpdCB0aGUgcmlnaHQgcHJpbWl0aXZlIGZvciBsaXZlIFVJIHVwZGF0ZXNcbiAqIChhbiBTU0Ugc3RyZWFtIHBlciBicm93c2VyIHRhYiwgYSBjYWNoZSBpbnZhbGlkYXRpb24sIGEgcHJlc2VuY2UgcGluZykgYW5kIHRoZVxuICogd3Jvbmcgb25lIGZvciB3b3JrIGRpc3RyaWJ1dGlvbjogdGhlcmUgYXJlIG5vIGNvbXBldGluZyBjb25zdW1lcnMsIG5vIGFja3MsIGFuZFxuICogbm8gcmVwbGF5LlxuICpcbiAqIERlbGl2ZXJ5IGlzIGJlc3QtZWZmb3J0IGFuZCBsaXZlLiBgTk9USUZZYCByZWFjaGVzIHNlc3Npb25zIHRoYXQgYXJlIGxpc3RlbmluZ1xuICogYXQgdGhlIG1vbWVudCBpdCBjb21taXRzLCBzbyBhIGxpc3RlbmVyIHRoYXQgY29ubmVjdHMgYSBzZWNvbmQgbGF0ZXIgbmV2ZXIgc2Vlc1xuICogaXQsIGFuZCBhIGxpc3RlbmVyIHdob3NlIGNvbm5lY3Rpb24gZHJvcHMgbWlzc2VzIGV2ZXJ5dGhpbmcgdW50aWwgdGhlIGJ1c1xuICogcmVjb25uZWN0cy4gVXNlIGEgdGFibGUgb3IgYSBxdWV1ZSB3aGVuIGEgc3Vic2NyaWJlciBuZWVkcyBkdXJhYmlsaXR5LlxuICpcbiAqIE9ORSBDSEFOTkVMLCBNQU5ZIFRPUElDUy4gRXZlcnkgYnVzIGluc3RhbmNlIGxpc3RlbnMgb24gYSBzaW5nbGUgUG9zdGdyZXNcbiAqIGNoYW5uZWwgKGBjaGFubmVsYCwgZGVmYXVsdCBgZGJ4X3Rvb2xzX3RvcGljX2J1c2ApIGFuZCBmaWx0ZXJzIGJ5IHRoZVxuICogZW52ZWxvcGUncyBgdG9waWNgIGluLXByb2Nlc3MsIHNvIGFkZGluZyBhIHRvcGljIGNvc3RzIG5vIGNvbm5lY3Rpb24gYW5kIG5vXG4gKiBgTElTVEVOYC4gVGhlIHRyYWRlb2ZmIGlzIHRoYXQgZXZlcnkgbGlzdGVuaW5nIHNlc3Npb24gZGVjb2RlcyBldmVyeSBtZXNzYWdlIG9uXG4gKiB0aGUgY2hhbm5lbDsgZ2l2ZSBhIGdlbnVpbmVseSBoaWdoLXZvbHVtZSwgdW5yZWxhdGVkIHN0cmVhbSBpdHMgb3duIGBjaGFubmVsYFxuICogcmF0aGVyIHRoYW4gYSB0b3BpYy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgaG9zdG5hbWUgfSBmcm9tIFwibm9kZTpvc1wiO1xuaW1wb3J0IHsgYXN5bmNVdGlscywgZXJyb3JVdGlscywgaGFzaCwganNvbiwgb2JqZWN0LCBzdHJpbmdVdGlscyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgdHlwZSB7IE5vdGlmaWNhdGlvbiwgUG9vbENsaWVudCB9IGZyb20gXCJwZ1wiO1xuXG5pbXBvcnQgdHlwZSB7IFBnUG9vbExpa2UsIFBnUXVlcnlhYmxlIH0gZnJvbSBcIi4vYWR2aXNvcnktbG9jay50c1wiO1xuaW1wb3J0IHsgY2hhbm5lbE5hbWUgfSBmcm9tIFwiLi9pZGVudGl0eS50c1wiO1xuaW1wb3J0IHtcbiAgY2xlYW51cEV4cGlyZWQsXG4gIGRlY29kZVBvaW50ZXIsXG4gIGhpc3RvcnksXG4gIHBlcnNpc3RlZE5vdGlmeSxcbiAgcHJvdmlzaW9uTWVzc2FnZUJ1c1NjaGVtYSxcbiAgcmVhZFBvaW50ZXIsXG4gIHJlc29sdmVQZXJzaXN0ZW5jZU9wdGlvbnMsXG4gIHR5cGUgRHVyYXRpb25JbnB1dCxcbiAgdHlwZSBSZXNvbHZlZFRvcGljQnVzUGVyc2lzdGVuY2VPcHRpb25zLFxuICB0eXBlIFRvcGljQnVzUGVyc2lzdGVuY2VPcHRpb25zLFxuICB0eXBlIFRvcGljSGlzdG9yeVBhZ2UsXG4gIHR5cGUgVG9waWNQZXJzaXN0ZW5jZVNjb3BlLFxufSBmcm9tIFwiLi9wZXJzaXN0ZW5jZS50c1wiO1xuaW1wb3J0IHsgcXVvdGVQb3N0Z3Jlc0lkZW50aWZpZXIgfSBmcm9tIFwiLi9zZXNzaW9uLnRzXCI7XG5cbi8qKlxuICogYEBkYngtdG9vbHMvc2hhcmVkLWNvcmVgIG93bnMgdGhlIEpTT04tcm91bmQtdHJpcCBydWxlOyB0aGlzIGFsaWFzIGp1c3Qga2VlcHMgdGhlXG4gKiBnZW5lcmljIHNpZ25hdHVyZXMgYmVsb3cgcmVhZGFibGUuIENvbnN1bWVycyBpbXBvcnQgdGhlIHR5cGUgZnJvbSBzaGFyZWQtY29yZS5cbiAqL1xudHlwZSBTZXJpYWxpemFibGVWYWx1ZSA9IG9iamVjdC5TZXJpYWxpemFibGVWYWx1ZTtcblxuLyoqIENoYW5uZWwgcGFydHMgdXNlZCB3aGVuIGEgY2FsbGVyIG5hbWVzIG5vIGNoYW5uZWwgb2YgaXRzIG93bi4gKi9cbmNvbnN0IERFRkFVTFRfQ0hBTk5FTCA9IFwiZGJ4X3Rvb2xzX3RvcGljX2J1c1wiO1xuLyoqXG4gKiBFbmNvZGVkLWVudmVsb3BlIGNlaWxpbmcuIFBvc3RncmVTUUwgY2FwcyBhIGBOT1RJRllgIHBheWxvYWQgYXQgODAwMCBieXRlcyBhbmRcbiAqIGZhaWxzIHRoZSBzdGF0ZW1lbnQgcGFzdCB0aGF0LCBzbyB0aGUgYnVzIHJlamVjdHMgdGhlIG1lc3NhZ2UgZmlyc3Qgd2l0aCBhIHNpemVcbiAqIGl0IGNhbiBuYW1lLiBUaGUgbWFyZ2luIGJlbG93IDgwMDAgY292ZXJzIHRoZSBzZXJ2ZXIncyBvd24gYWNjb3VudGluZy5cbiAqL1xuY29uc3QgTUFYX05PVElGWV9CWVRFUyA9IDdfOTAwO1xuY29uc3QgTUlOX1JFQ09OTkVDVF9ERUxBWV9NUyA9IDI1MDtcbmNvbnN0IE1BWF9SRUNPTk5FQ1RfREVMQVlfTVMgPSA1XzAwMDtcblxuLyoqXG4gKiBUaGUgc3Vic2V0IG9mIEFwcEtpdCdzIHBlci1yZXF1ZXN0IGV4ZWN1dGlvbiBjb250ZXh0IHRoZSBidXMgcmVhZHMgZm9yIHNlbmRlclxuICogaWRlbnRpdHkuIEZpZWxkcyBhcmUgYHVua25vd25gIGJlY2F1c2UgdGhpcyBpcyBhIHN0cnVjdHVyYWwgdmlldyBvZiBhbiBPUFRJT05BTFxuICogcGVlcjogdGhlIHZhbHVlcyBhcmUgdHJpbW1lZCBhbmQgdmFsaWRhdGVkIHJhdGhlciB0aGFuIHRydXN0ZWQuXG4gKi9cbnR5cGUgQXBwS2l0RXhlY3V0aW9uQ29udGV4dCA9IHtcbiAgdXNlckVtYWlsPzogdW5rbm93bjtcbiAgdXNlcklkPzogdW5rbm93bjtcbiAgdXNlck5hbWU/OiB1bmtub3duO1xufTtcblxuLyoqIFN0cnVjdHVyYWwgdmlldyBvZiBgQGRhdGFicmlja3MvYXBwa2l0YCwgaW1wb3J0ZWQgbGF6aWx5IGFuZCBuZXZlciByZXF1aXJlZC4gKi9cbnR5cGUgQXBwS2l0TW9kdWxlID0ge1xuICBnZXRFeGVjdXRpb25Db250ZXh0KCk6IEFwcEtpdEV4ZWN1dGlvbkNvbnRleHQ7XG59O1xuXG4vKipcbiAqIENhY2hlZCByZXN1bHQgb2YgdGhlIG9uZSBvcHRpb25hbC1wZWVyIGltcG9ydCwgcmVzb2x2ZWQgdG8gYHVuZGVmaW5lZGAgd2hlblxuICogQXBwS2l0IGlzIG5vdCBpbnN0YWxsZWQuIE1lbW9pemVkIHNvIGEgYnVzIGluIGEgcGxhaW4gUG9zdGdyZXMgcHJvY2VzcyBwYXlzIGZvclxuICogdGhlIGZhaWxlZCByZXNvbHV0aW9uIG9uY2UgaW5zdGVhZCBvZiBwZXIgYnJvYWRjYXN0LlxuICovXG5sZXQgYXBwS2l0TW9kdWxlOiBQcm9taXNlPEFwcEtpdE1vZHVsZSB8IHVuZGVmaW5lZD4gfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogRmxhdC1rZXllZCBjb250ZXh0IHRyYXZlbGxpbmcgYWxvbmdzaWRlIGEgbWVzc2FnZSBib2R5OiB3aG8gc2VudCBpdCwgZnJvbVxuICogd2hlcmUsIGluIHdoaWNoIGRlcGxveW1lbnQuIFZhbHVlcyBtYXkgbmVzdCwgYnV0IHRoZSBrZXlzIGFyZSB0aGUgYWRkcmVzc2FibGVcbiAqIHBhcnQgLSBhIGxpc3RlbmVyIGZpbHRlcmluZyBvciBsYWJlbGxpbmcgbWVzc2FnZXMgcmVhZHMgYG1ldGFkYXRhLnVzZXJgLCBub3QgYVxuICogcGF0aCBpbnRvIHRoZSBib2R5LlxuICovXG5leHBvcnQgdHlwZSBUb3BpY01ldGFkYXRhID0gUmVjb3JkPHN0cmluZywgU2VyaWFsaXphYmxlVmFsdWU+O1xuXG4vKipcbiAqIFRoZSB3aXJlIGVudmVsb3BlIGV2ZXJ5IHN1YnNjcmliZXIgcmVjZWl2ZXMsIGFuZCB3aGF0IHtAbGlua1xuICogUG9zdGdyZXNUb3BpY0J1cy5icm9hZGNhc3R9IHJldHVybnMgdG8gdGhlIHB1Ymxpc2hlci5cbiAqXG4gKiBgaWRgLCBgdG9waWNgLCBhbmQgYHB1Ymxpc2hlZEF0YCBhcmUgYXNzaWduZWQgYnkgdGhlIGJ1czsgYHR5cGVgLCBgbWV0YWRhdGFgLFxuICogYW5kIGBib2R5YCBjb21lIGZyb20gdGhlIGNhbGxlciAod2l0aCBhdXRvbWF0aWMgY29udGV4dCBtZXJnZWQgdW5kZXJcbiAqIGBtZXRhZGF0YWApLiBUaGUgc2hhcGUgaXMgc3RhYmxlIGVub3VnaCB0byBoYW5kIHN0cmFpZ2h0IHRvIGFuIFNTRSBgZGF0YTpgXG4gKiBmcmFtZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb3BpY01lc3NhZ2U8VEJvZHkgZXh0ZW5kcyBTZXJpYWxpemFibGVWYWx1ZSA9IFNlcmlhbGl6YWJsZVZhbHVlPiB7XG4gIC8qKlxuICAgKiBQZXItbWVzc2FnZSBpZGVudGl0eSBnZW5lcmF0ZWQgYnkgdGhlIHB1Ymxpc2hlciwgdW5pcXVlIGFjcm9zcyBpbnN0YW5jZXMuXG4gICAqIFN1aXRhYmxlIGZvciBkZWR1cGUgd2hlbiBhIGNsaWVudCByZWNvbm5lY3RzIGFuZCBmb3IgYW4gU1NFIGBpZDpgIGZpZWxkLiBOb3RcbiAgICogb3JkZXJlZCwgYW5kIG5vdCBhIGRhdGFiYXNlIGtleS5cbiAgICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBUaGUgdG9waWMgdGhpcyB3YXMgYnJvYWRjYXN0IG9uOyBsaXN0ZW5lcnMgb24gb3RoZXIgdG9waWNzIG5ldmVyIHNlZSBpdC4gKi9cbiAgdG9waWM6IHN0cmluZztcbiAgLyoqIENhbGxlci1jaG9zZW4gZXZlbnQgbmFtZSwgZS5nLiBgb3JkZXIudXBkYXRlZGAuIE5ldmVyIGVtcHR5LiAqL1xuICB0eXBlOiBzdHJpbmc7XG4gIC8qKiBBdXRvbWF0aWMgY29udGV4dCBtZXJnZWQgd2l0aCBjYWxsZXIgbWV0YWRhdGEuIFNlZSB7QGxpbmsgVG9waWNNZXRhZGF0YX0uICovXG4gIG1ldGFkYXRhOiBUb3BpY01ldGFkYXRhO1xuICAvKiogVGhlIGNhbGxlcidzIHBheWxvYWQsIHVuY2hhbmdlZC4gKi9cbiAgYm9keTogVEJvZHk7XG4gIC8qKlxuICAgKiBJU08tODYwMSBwdWJsaXNoIHRpbWUgZnJvbSB0aGUgUFVCTElTSElORyBwcm9jZXNzJ3MgY2xvY2ssIG5vdCB0aGUgZGF0YWJhc2Uncy5cbiAgICogRmluZSBmb3IgZGlzcGxheTsgZG8gbm90IG9yZGVyIG1lc3NhZ2VzIGZyb20gZGlmZmVyZW50IGluc3RhbmNlcyBieSBpdC5cbiAgICovXG4gIHB1Ymxpc2hlZEF0OiBzdHJpbmc7XG59XG5cbi8qKiBXaGF0IGEgY2FsbGVyIHN1cHBsaWVzIHRvIHtAbGluayBQb3N0Z3Jlc1RvcGljQnVzLmJyb2FkY2FzdH0uICovXG5leHBvcnQgaW50ZXJmYWNlIFRvcGljUHVibGlzaElucHV0PFRCb2R5IGV4dGVuZHMgU2VyaWFsaXphYmxlVmFsdWUgPSBTZXJpYWxpemFibGVWYWx1ZT4ge1xuICAvKiogRXZlbnQgbmFtZSwgZS5nLiBgY2hhdC5tZXNzYWdlYC4gTXVzdCBiZSBub24tYmxhbmsuICovXG4gIHR5cGU6IHN0cmluZztcbiAgLyoqXG4gICAqIENvbnRleHQgdG8gYXR0YWNoLiBXaW5zIG92ZXIgYW55IGF1dG9tYXRpYyBrZXkgb2YgdGhlIHNhbWUgbmFtZSwgc28gYSBjYWxsZXJcbiAgICogY2FuIG92ZXJyaWRlIGEgbWFjaGluZSBkZWZhdWx0IChgcHJvamVjdGApIG9yIGFkZCBpdHMgb3duIChgdHJhY2VJZGApLlxuICAgKi9cbiAgbWV0YWRhdGE/OiBUb3BpY01ldGFkYXRhO1xuICAvKiogVGhlIHBheWxvYWQuIE11c3Qgc2F0aXNmeSBgb2JqZWN0LmlzU2VyaWFsaXphYmxlVmFsdWVgLiAqL1xuICBib2R5OiBUQm9keTtcbiAgc2NvcGU/OiBUb3BpY1BlcnNpc3RlbmNlU2NvcGU7XG4gIHR0bD86IER1cmF0aW9uSW5wdXQgfCBmYWxzZTtcbn1cblxuLyoqXG4gKiBTdWJzY3JpYmVyIGNhbGxiYWNrLiBJbnZva2VkIG9uY2UgcGVyIG1hdGNoaW5nIG1lc3NhZ2Ugb24gdGhlIG5vdGlmaWNhdGlvblxuICogY29ubmVjdGlvbidzIGNhbGxiYWNrLCBzbyBpdCBzaG91bGQgbm90IGJsb2NrOiBhIHJldHVybmVkIHByb21pc2UgaXMgYXdhaXRlZFxuICogb25seSB0byByb3V0ZSBhIHJlamVjdGlvbiB0byBgb25FcnJvcmAsIGFuZCBsaXN0ZW5lcnMgZm9yIG9uZSBtZXNzYWdlIHJ1blxuICogY29uY3VycmVudGx5IHJhdGhlciB0aGFuIGluIHJlZ2lzdHJhdGlvbiBvcmRlci5cbiAqXG4gKiBgVEJvZHlgIGlzIHVuY2hlY2tlZCBhdCBydW50aW1lLiBUaGUgYnVzIGd1YXJhbnRlZXMgdGhlIGJvZHkgaXMgc2VyaWFsaXphYmxlLFxuICogbm90IHRoYXQgaXQgbWF0Y2hlcyB0aGUgdHlwZSBwYXJhbWV0ZXIsIHNvIHZhbGlkYXRlIGFueXRoaW5nIGEgbGlzdGVuZXJcbiAqIGJyYW5jaGVzIG9uLlxuICovXG5leHBvcnQgdHlwZSBUb3BpY0xpc3RlbmVyPFRCb2R5IGV4dGVuZHMgU2VyaWFsaXphYmxlVmFsdWUgPSBTZXJpYWxpemFibGVWYWx1ZT4gPSAoXG4gIG1lc3NhZ2U6IFRvcGljTWVzc2FnZTxUQm9keT4sXG4pID0+IHZvaWQgfCBQcm9taXNlTGlrZTx2b2lkPjtcblxuLyoqXG4gKiBSZXNvbHZlcyBtZXRhZGF0YSBhdCBwdWJsaXNoIHRpbWUgaW5zdGVhZCBvZiBjb25zdHJ1Y3Rpb24gdGltZSwgZm9yIGNvbnRleHQgYVxuICogcHJvY2VzcyBsZWFybnMgbGF0ZSBvciBhc3luY2hyb25vdXNseSAtIGFuIGluc3RhbmNlIGlkIGZyb20gYSBjb250cm9sIHBsYW5lLCBhXG4gKiBkaXNjb3ZlcmVkIGFkZHJlc3MgYSBjYWxsZXIgY2hvb3NlcyB0byBhdHRhY2guIENhbGxlZCBvbiBldmVyeSBicm9hZGNhc3QsIHNvXG4gKiBtZW1vaXplIGFueXRoaW5nIGV4cGVuc2l2ZTsgYSByZWplY3Rpb24gZmFpbHMgdGhlIGJyb2FkY2FzdC5cbiAqL1xuZXhwb3J0IHR5cGUgVG9waWNNZXRhZGF0YVByb3ZpZGVyID0gKCkgPT4gVG9waWNNZXRhZGF0YSB8IFByb21pc2VMaWtlPFRvcGljTWV0YWRhdGE+O1xuXG4vKiogQ29uc3RydWN0aW9uIG9wdGlvbnMgZm9yIHtAbGluayBQb3N0Z3Jlc1RvcGljQnVzfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUG9zdGdyZXNUb3BpY0J1c09wdGlvbnMge1xuICAvKipcbiAgICogV2hhdCBpZGVudGlmaWVzIHRoaXMgY2hhbm5lbCAtIGFueXRoaW5nLCBub3QganVzdCBhbiBpZGVudGlmaWVyOiBhIG5hbWUsIGFuXG4gICAqIGlkLCBhIGBbZW52LCBmZWF0dXJlXWAgcGFpciwgYSBjb25maWcgb2JqZWN0LiBUaGUgcGFydHMgYXJlIHRva2VuaXplZCBpbnRvIGFcbiAgICogbGVnYWwgUG9zdGdyZXMgY2hhbm5lbCBuYW1lIHdpdGggYSBzaG9ydCBoYXNoIG9mIHRoZSBvcmlnaW5hbHMgYXBwZW5kZWQsIHNvXG4gICAqIHRoZSBkZXJpdmF0aW9uIGlzIGRldGVybWluaXN0aWMgYW5kIG5vIGNhbGwgc2l0ZSBoYXMgdG8gc2FuaXRpemUuIFNlZVxuICAgKiB7QGxpbmsgUG9zdGdyZXNUb3BpY0J1cy5jaGFubmVsTmFtZX0gZm9yIHRoZSByZXNvbHZlZCBuYW1lLlxuICAgKlxuICAgKiBPbmUgdmFsdWUgb3IgbWFueTogYW4gYXJyYXkgaXMgcmVhZCBhcyBtdWx0aXBsZSBwYXJ0c1xuICAgKiAoe0BsaW5rIG9iamVjdC5PbmVPck1hbnl9KSwgYW55dGhpbmcgZWxzZSBhcyBhIHNpbmdsZSBwYXJ0LiBTb1xuICAgKiBgW1wiYmlsbGluZ1wiLCBcInByb2RcIl1gIGFuZCBgXCJiaWxsaW5nX3Byb2RcImAgYXJlIGRpZmZlcmVudCBjaGFubmVscywgc2luY2UgdGhlXG4gICAqIGhhc2ggc2VlcyBkaWZmZXJlbnQgc3RydWN0dXJlLlxuICAgKlxuICAgKiBFdmVyeSBwYXJ0aWNpcGF0aW5nIHByb2Nlc3MgbXVzdCBwYXNzIEVRVUlWQUxFTlQgcGFydHMsIHNpbmNlIGEgZGlmZmVyZW50XG4gICAqIHNwZWxsaW5nIGhhc2hlcyB0byBhIGRpZmZlcmVudCBjaGFubmVsLiBEZWZhdWx0cyB0byBhIHNoYXJlZFxuICAgKiBgZGJ4X3Rvb2xzX3RvcGljX2J1c2AgY2hhbm5lbC5cbiAgICovXG4gIGNoYW5uZWw/OiB1bmtub3duO1xuICAvKipcbiAgICogRXh0cmEgY29udGV4dCBhZGRlZCB0byBldmVyeSBtZXNzYWdlIHRoaXMgYnVzIHB1Ymxpc2hlcywgZWl0aGVyIGEgZml4ZWRcbiAgICogcmVjb3JkIG9yIGEge0BsaW5rIFRvcGljTWV0YWRhdGFQcm92aWRlcn0gY2FsbGVkIHBlciBicm9hZGNhc3QuIE92ZXJyaWRlc1xuICAgKiBhdXRvbWF0aWMgbWFjaGluZSBrZXlzOyBwZXItY2FsbCBgbWV0YWRhdGFgIG92ZXJyaWRlcyB0aGlzLlxuICAgKi9cbiAgbWV0YWRhdGE/OiBUb3BpY01ldGFkYXRhIHwgVG9waWNNZXRhZGF0YVByb3ZpZGVyO1xuICAvKipcbiAgICogU2luayBmb3IgZmFpbHVyZXMgdGhhdCBoYXZlIG5vIGNhbGxlciB0byB0aHJvdyB0bzogYSBsaXN0ZW5lciB0aGF0IHJlamVjdGVkLFxuICAgKiBhIGRyb3BwZWQgbm90aWZpY2F0aW9uIGNvbm5lY3Rpb24sIGEgZmFpbGVkIHJlY29ubmVjdCBhdHRlbXB0LiBEZWZhdWx0cyB0b1xuICAgKiBzd2FsbG93aW5nIHRoZW0sIHNvIHdpcmUgdGhpcyB0byBhIGxvZ2dlciBpbiBhbnl0aGluZyBsb25nLXJ1bm5pbmcuXG4gICAqL1xuICBvbkVycm9yPzogKGNhdXNlOiB1bmtub3duKSA9PiB2b2lkO1xuICBwZXJzaXN0PzogYm9vbGVhbiB8IFRvcGljQnVzUGVyc2lzdGVuY2VPcHRpb25zO1xufVxuXG4vKipcbiAqIERyb3Aga2V5cyB3aG9zZSB2YWx1ZSBpcyBgdW5kZWZpbmVkYCwgc28gYW4gdW5zZXQgZW52aXJvbm1lbnQgdmFyaWFibGUgbGVhdmVzXG4gKiB0aGUga2V5IEFCU0VOVCByYXRoZXIgdGhhbiBwcmVzZW50LWFuZC1udWxsLiBBYnNlbmNlIGlzIHdoYXQgbGV0cyBjYWxsZXJcbiAqIG1ldGFkYXRhIGFuZCBsYXRlciBtZXJnZSBsYXllcnMgc3VwcGx5IHRoZSBrZXkgaW5zdGVhZC5cbiAqL1xuZnVuY3Rpb24gZGVmaW5lZE1ldGFkYXRhKHZhbHVlczogUmVjb3JkPHN0cmluZywgU2VyaWFsaXphYmxlVmFsdWUgfCB1bmRlZmluZWQ+KTogVG9waWNNZXRhZGF0YSB7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXModmFsdWVzKS5maWx0ZXIoKGVudHJ5KTogZW50cnkgaXMgW3N0cmluZywgU2VyaWFsaXphYmxlVmFsdWVdID0+IHtcbiAgICAgIHJldHVybiBlbnRyeVsxXSAhPT0gdW5kZWZpbmVkO1xuICAgIH0pLFxuICApO1xufVxuXG4vKipcbiAqIENvbnRleHQgZXZlcnkgbWVzc2FnZSBnZXRzIGZvciBmcmVlOiB3aGljaCBwcm9qZWN0LCBob3N0LCBhbmQgZGVwbG95bWVudFxuICogcHVibGlzaGVkIGl0LlxuICpcbiAqIFJlYWQgZnJlc2ggcGVyIGJyb2FkY2FzdCByYXRoZXIgdGhhbiBjYWNoZWQsIGJlY2F1c2UgYSBsb25nLWxpdmVkIHByb2Nlc3MgY2FuXG4gKiBiZSByZS1wYXJlbnRlZCAoYSBkZXBsb3ltZW50IGlkIGFwcGVhcmluZyBhZnRlciBib290KS4gS2V5cyB0aGF0IHJlc29sdmUgdG9cbiAqIG5vdGhpbmcgYXJlIG9taXR0ZWQuXG4gKlxuICogRGVsaWJlcmF0ZWx5IE5PVCBpbmNsdWRlZDogcHVibGljL2NsaWVudCBJUCwgcHJvY2VzcyBpZCwgQ1BVIGFyY2hpdGVjdHVyZSxcbiAqIHJ1bnRpbWUgbmFtZSwgYW5kIHJ1bnRpbWUgdmVyc2lvbi4gSVBzIGFuZCBwaWRzIGFyZSBub2lzeSwgb2Z0ZW4gc2Vuc2l0aXZlLFxuICogYW5kIGJ1cm4gYE5PVElGWWAgcGF5bG9hZCBidWRnZXQ7IGFyY2hpdGVjdHVyZS9ydW50aW1lIGFyZSBjb25zdGFudCBwZXJcbiAqIGRlcGxveW1lbnQgYW5kIHBheSB0aGUgc2FtZSBjb3N0LiBBIHByb2Nlc3MgdGhhdCB3YW50cyBhbnkgb2YgdGhlbSBwYXNzZXMgYVxuICoge0BsaW5rIFRvcGljTWV0YWRhdGFQcm92aWRlcn0gb3IgcGVyLW1lc3NhZ2UgYG1ldGFkYXRhYC5cbiAqL1xuZnVuY3Rpb24gbWFjaGluZU1ldGFkYXRhKCk6IFRvcGljTWV0YWRhdGEge1xuICByZXR1cm4gZGVmaW5lZE1ldGFkYXRhKHtcbiAgICBwcm9qZWN0OlxuICAgICAgc3RyaW5nVXRpbHMuZmlyc3ROb25FbXB0eShbXG4gICAgICAgIHByb2Nlc3MuZW52LkRBVEFCUklDS1NfQVBQX05BTUUsXG4gICAgICAgIHByb2Nlc3MuZW52LkRBVEFCUklDS1NfQlVORExFX05BTUUsXG4gICAgICAgIHByb2Nlc3MuZW52LlBST0pFQ1RfTkFNRSxcbiAgICAgICAgcHJvY2Vzcy5lbnYubnBtX3BhY2thZ2VfbmFtZSxcbiAgICAgIF0pID8/IHVuZGVmaW5lZCxcbiAgICBob3N0bmFtZTogaG9zdG5hbWUoKSxcbiAgICBwbGF0Zm9ybTogcHJvY2Vzcy5wbGF0Zm9ybSxcbiAgICBlbnZpcm9ubWVudDogc3RyaW5nVXRpbHMudHJpbVRvTnVsbChwcm9jZXNzLmVudi5OT0RFX0VOVikgPz8gdW5kZWZpbmVkLFxuICAgIGFwcE5hbWU6IHN0cmluZ1V0aWxzLnRyaW1Ub051bGwocHJvY2Vzcy5lbnYuREFUQUJSSUNLU19BUFBfTkFNRSkgPz8gdW5kZWZpbmVkLFxuICAgIGRlcGxveW1lbnRJZDogc3RyaW5nVXRpbHMudHJpbVRvTnVsbChwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX0FQUF9ERVBMT1lNRU5UX0lEKSA/PyB1bmRlZmluZWQsXG4gICAgZGF0YWJyaWNrc0hvc3Q6IHN0cmluZ1V0aWxzLnRyaW1Ub051bGwocHJvY2Vzcy5lbnYuREFUQUJSSUNLU19IT1NUKSA/PyB1bmRlZmluZWQsXG4gIH0pO1xufVxuXG4vKipcbiAqIElkZW50aXR5IG9mIHRoZSBzaWduZWQtaW4gdXNlciBvbiB3aG9zZSBiZWhhbGYgdGhpcyBicm9hZGNhc3QgaGFwcGVucywgd2hlbiB0aGVcbiAqIHByb2Nlc3MgY2FuIHRlbGwuXG4gKlxuICogYEBkYXRhYnJpY2tzL2FwcGtpdGAgaXMgYW4gT1BUSU9OQUwgcGVlciwgc28gdGhlIGltcG9ydCBpcyBsYXp5IGFuZCBhIG1pc3NpbmdcbiAqIG1vZHVsZSBpcyBub3QgYW4gZXJyb3IgLSB0aGlzIGlzIGEgcGxhaW4gUG9zdGdyZXMgcGFja2FnZSB0aGF0IGFkZHMgc2VuZGVyXG4gKiBpZGVudGl0eSB3aGVuIGl0IGhhcHBlbnMgdG8gcnVuIGluc2lkZSBhbiBBcHBLaXQgYXBwLiBPdXRzaWRlIGFuIGFjdGl2ZVxuICogcGVyLXJlcXVlc3QgZXhlY3V0aW9uIGNvbnRleHQgQXBwS2l0IHRocm93cywgd2hpY2ggbWVhbnMgXCJubyB1c2VyIGhlcmVcIiwgc28gdGhlXG4gKiByZXN1bHQgaXMgZW1wdHkgbWV0YWRhdGEgcmF0aGVyIHRoYW4gYSBmYWlsZWQgYnJvYWRjYXN0LlxuICovXG5hc3luYyBmdW5jdGlvbiBzZW5kZXJNZXRhZGF0YSgpOiBQcm9taXNlPFRvcGljTWV0YWRhdGE+IHtcbiAgYXBwS2l0TW9kdWxlID8/PSBpbXBvcnQoXCJAZGF0YWJyaWNrcy9hcHBraXRcIilcbiAgICAudGhlbigobW9kdWxlKSA9PiBtb2R1bGUgYXMgQXBwS2l0TW9kdWxlKVxuICAgIC5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICBjb25zdCBhcHBraXQgPSBhd2FpdCBhcHBLaXRNb2R1bGU7XG4gIGlmICghYXBwa2l0KSByZXR1cm4ge307XG4gIHRyeSB7XG4gICAgY29uc3QgY29udGV4dCA9IGFwcGtpdC5nZXRFeGVjdXRpb25Db250ZXh0KCk7XG4gICAgcmV0dXJuIGRlZmluZWRNZXRhZGF0YSh7XG4gICAgICBzZW5kZXJJZDogc3RyaW5nVXRpbHMudHJpbVRvTnVsbChjb250ZXh0LnVzZXJJZCkgPz8gdW5kZWZpbmVkLFxuICAgICAgc2VuZGVyTmFtZTogc3RyaW5nVXRpbHMudHJpbVRvTnVsbChjb250ZXh0LnVzZXJOYW1lKSA/PyB1bmRlZmluZWQsXG4gICAgICBzZW5kZXJFbWFpbDogc3RyaW5nVXRpbHMudHJpbVRvTnVsbChjb250ZXh0LnVzZXJFbWFpbCkgPz8gdW5kZWZpbmVkLFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4ge307XG4gIH1cbn1cblxuLyoqXG4gKiBQYXJzZSBhIGBOT1RJRllgIHBheWxvYWQgaW50byBhbiBlbnZlbG9wZSwgcmV0dXJuaW5nIGB1bmRlZmluZWRgIGZvciBhbnl0aGluZ1xuICogdGhhdCBpcyBub3Qgb25lLlxuICpcbiAqIFRoZSBjaGFubmVsIGlzIHNoYXJlZCBhbmQgYW55IFBvc3RncmVzIHNlc3Npb24gY2FuIGBwZ19ub3RpZnlgIG9uIGl0LCBzbyBhblxuICogdW5yZWNvZ25pemVkIHBheWxvYWQgaXMgZXhwZWN0ZWQgaW5wdXQsIG5vdCBhbiBleGNlcHRpb24uIFB1Ymxpc2hlcnMgcnVuIHRoaXNcbiAqIG92ZXIgdGhlaXIgb3duIGVuY29kZWQgbWVzc2FnZSB0b28sIHdoaWNoIGlzIGhvdyBhIGJvZHkgdGhhdCBzdHJpbmdpZmllcyBidXRcbiAqIGRvZXMgbm90IHJvdW5kLXRyaXAgaXMgY2F1Z2h0IGJlZm9yZSBpdCBzaGlwcy5cbiAqL1xuZnVuY3Rpb24gZGVjb2RlKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBUb3BpY01lc3NhZ2UgfCB1bmRlZmluZWQge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCByZWNvcmQgPSBqc29uLnBhcnNlUmVjb3JkKHZhbHVlKTtcbiAgaWYgKFxuICAgICFyZWNvcmQgfHxcbiAgICB0eXBlb2YgcmVjb3JkLmlkICE9PSBcInN0cmluZ1wiIHx8XG4gICAgdHlwZW9mIHJlY29yZC50b3BpYyAhPT0gXCJzdHJpbmdcIiB8fFxuICAgIHR5cGVvZiByZWNvcmQudHlwZSAhPT0gXCJzdHJpbmdcIiB8fFxuICAgIHR5cGVvZiByZWNvcmQucHVibGlzaGVkQXQgIT09IFwic3RyaW5nXCIgfHxcbiAgICAhcmVjb3JkLm1ldGFkYXRhIHx8XG4gICAgdHlwZW9mIHJlY29yZC5tZXRhZGF0YSAhPT0gXCJvYmplY3RcIiB8fFxuICAgIEFycmF5LmlzQXJyYXkocmVjb3JkLm1ldGFkYXRhKSB8fFxuICAgICEoXCJib2R5XCIgaW4gcmVjb3JkKSB8fFxuICAgICFvYmplY3QuaXNTZXJpYWxpemFibGVWYWx1ZShyZWNvcmQubWV0YWRhdGEpIHx8XG4gICAgIW9iamVjdC5pc1NlcmlhbGl6YWJsZVZhbHVlKHJlY29yZC5ib2R5KVxuICApIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiB7XG4gICAgaWQ6IHJlY29yZC5pZCxcbiAgICB0b3BpYzogcmVjb3JkLnRvcGljLFxuICAgIHR5cGU6IHJlY29yZC50eXBlLFxuICAgIG1ldGFkYXRhOiByZWNvcmQubWV0YWRhdGEgYXMgVG9waWNNZXRhZGF0YSxcbiAgICBib2R5OiByZWNvcmQuYm9keSBhcyBTZXJpYWxpemFibGVWYWx1ZSxcbiAgICBwdWJsaXNoZWRBdDogcmVjb3JkLnB1Ymxpc2hlZEF0LFxuICB9O1xufVxuXG4vKipcbiAqIEJyb2FkY2FzdHMgc3RydWN0dXJlZCBtZXNzYWdlcyBieSB0b3BpYyBhbmQgZGVsaXZlcnMgdGhlbSB0byBldmVyeSBwcm9jZXNzXG4gKiBsaXN0ZW5pbmcgb24gdGhlIHNhbWUgY2hhbm5lbC5cbiAqXG4gKiBDT05ORUNUSU9OIFNIQVBFLiBQdWJsaXNoaW5nIGJvcnJvd3MgYSBwb29sZWQgY29ubmVjdGlvbiBwZXIgY2FsbCwgbGlrZSBhbnlcbiAqIG90aGVyIHF1ZXJ5LiBMaXN0ZW5pbmcgY2Fubm90OiBgTElTVEVOYCBpcyBzZXNzaW9uIHN0YXRlLCBzbyB0aGUgYnVzIGhvbGRzIE9ORVxuICogZGVkaWNhdGVkIGNsaWVudCBvdXQgb2YgdGhlIHBvb2wgZm9yIGFzIGxvbmcgYXMgaXQgaGFzIHN1YnNjcmliZXJzLCBubyBtYXR0ZXJcbiAqIGhvdyBtYW55IHRvcGljcyBvciBsaXN0ZW5lcnMgYXJlIHJlZ2lzdGVyZWQuIFNpemUgdGhlIHBvb2wgd2l0aCB0aGF0IG9uZVxuICogbG9uZy1saXZlZCBjaGVja291dCBpbiBtaW5kLlxuICpcbiAqIExJRkVDWUNMRS4gQ29uc3RydWN0aW9uIGlzIGluZXJ0IC0gbm90aGluZyBjb25uZWN0cyB1bnRpbCB0aGUgZmlyc3RcbiAqIHtAbGluayBsaXN0ZW59IChvciBhbiBleHBsaWNpdCB7QGxpbmsgc3RhcnR9KS4ge0BsaW5rIGNsb3NlfSBpcyByZXF1aXJlZCB0byBnaXZlXG4gKiB0aGUgY29ubmVjdGlvbiBiYWNrOyBhIGNsb3NlZCBidXMgc3RheXMgY2xvc2VkIGFuZCB0aHJvd3Mgb24gZnVydGhlciB1c2UgcmF0aGVyXG4gKiB0aGFuIHNpbGVudGx5IHJlY29ubmVjdGluZy4gUmVnaXN0ZXIgaXQgd2l0aCB0aGUgaG9zdCdzIHNodXRkb3duIGhvb2suXG4gKlxuICogRkFJTFVSRSBIQU5ETElORy4gQSBsb3N0IG5vdGlmaWNhdGlvbiBjb25uZWN0aW9uIHJlY29ubmVjdHMgb24gaXRzIG93biB3aXRoXG4gKiBib3VuZGVkIGJhY2tvZmYgd2hpbGUgc3Vic2NyaWJlcnMgcmVtYWluLCByZXBvcnRpbmcgZWFjaCBmYWlsZWQgYXR0ZW1wdCB0aHJvdWdoXG4gKiBgb25FcnJvcmAuIE1lc3NhZ2VzIHB1Ymxpc2hlZCBkdXJpbmcgdGhlIGdhcCBhcmUgbG9zdCAtIGBOT1RJRllgIGhhcyBubyByZXBsYXkuXG4gKiBBIHRocm93aW5nIG9yIHJlamVjdGluZyBsaXN0ZW5lciBuZXZlciBhZmZlY3RzIHRoZSBwdWJsaXNoZXIgb3IgdGhlIG90aGVyXG4gKiBsaXN0ZW5lcnM7IGl0cyBmYWlsdXJlIGdvZXMgdG8gYG9uRXJyb3JgLlxuICpcbiAqIE5vdCBzYWZlIHRvIHNoYXJlIG9uZSBpbnN0YW5jZSBhY3Jvc3MgdW5yZWxhdGVkIGNoYW5uZWxzIC0gY29uc3RydWN0IG9uZSBidXNcbiAqIHBlciBjaGFubmVsLiBUaGUgY2hhbm5lbCBpdHNlbGYgaXMgREVSSVZFRCBmcm9tIHRoZSBgY2hhbm5lbGAgb3B0aW9uIHJhdGhlclxuICogdGhhbiB0YWtlbiBsaXRlcmFsbHk7IHNlZSB7QGxpbmsgUG9zdGdyZXNUb3BpY0J1c09wdGlvbnMuY2hhbm5lbH0gYW5kXG4gKiB7QGxpbmsgUG9zdGdyZXNUb3BpY0J1cy5jaGFubmVsTmFtZX0uXG4gKi9cbmV4cG9ydCBjbGFzcyBQb3N0Z3Jlc1RvcGljQnVzIHtcbiAgLyoqXG4gICAqIFRoZSByZXNvbHZlZCBQb3N0Z3JlcyBjaGFubmVsIHRoaXMgYnVzIGxpc3RlbnMgYW5kIHB1Ymxpc2hlcyBvbiwgZGVyaXZlZCBmcm9tXG4gICAqIHRoZSBgY2hhbm5lbGAgb3B0aW9uLiBSZWFkIGl0IHRvIGNvbmZpcm0gdHdvIHByb2Nlc3NlcyBhZ3JlZSwgb3IgdG8gbG9nIHdoYXQgYVxuICAgKiBzZXQgb2YgcGFydHMgYWN0dWFsbHkgcmVzb2x2ZWQgdG8uXG4gICAqL1xuICByZWFkb25seSBjaGFubmVsTmFtZTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IG1ldGFkYXRhOiBUb3BpY01ldGFkYXRhIHwgVG9waWNNZXRhZGF0YVByb3ZpZGVyIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IG9uRXJyb3I6IChjYXVzZTogdW5rbm93bikgPT4gdm9pZDtcbiAgcHJpdmF0ZSByZWFkb25seSBsaXN0ZW5lcnMgPSBuZXcgTWFwPHN0cmluZywgU2V0PFRvcGljTGlzdGVuZXI+PigpO1xuICBwcml2YXRlIGNsaWVudDogUG9vbENsaWVudCB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBzdGFydGluZzogUHJvbWlzZTx2b2lkPiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZWNvbm5lY3Rpbmc6IFByb21pc2U8dm9pZD4gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVjb25uZWN0QWJvcnQgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIHByaXZhdGUgY2xvc2VkID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGVyc2lzdGVuY2U/OiBSZXNvbHZlZFRvcGljQnVzUGVyc2lzdGVuY2VPcHRpb25zO1xuICBwcml2YXRlIHByb3Zpc2lvbmluZz86IFByb21pc2U8dm9pZD47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBwb29sOiBQZ1Bvb2xMaWtlICYgUGdRdWVyeWFibGUsXG4gICAgb3B0aW9uczogUG9zdGdyZXNUb3BpY0J1c09wdGlvbnMgPSB7fSxcbiAgKSB7XG4gICAgdGhpcy5jaGFubmVsTmFtZSA9IGNoYW5uZWxOYW1lKFxuICAgICAgb3B0aW9ucy5jaGFubmVsID09PSB1bmRlZmluZWQgPyBERUZBVUxUX0NIQU5ORUwgOiBvcHRpb25zLmNoYW5uZWwsXG4gICAgKTtcbiAgICB0aGlzLm1ldGFkYXRhID0gb3B0aW9ucy5tZXRhZGF0YTtcbiAgICB0aGlzLm9uRXJyb3IgPSBvcHRpb25zLm9uRXJyb3IgPz8gKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgdGhpcy5wZXJzaXN0ZW5jZSA9IG9wdGlvbnMucGVyc2lzdFxuICAgICAgPyByZXNvbHZlUGVyc2lzdGVuY2VPcHRpb25zKG9wdGlvbnMucGVyc2lzdCA9PT0gdHJ1ZSA/IHRydWUgOiBvcHRpb25zLnBlcnNpc3QpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVuIHRoZSBkZWRpY2F0ZWQgbm90aWZpY2F0aW9uIGNvbm5lY3Rpb24gYW5kIGBMSVNURU5gLlxuICAgKlxuICAgKiBJZGVtcG90ZW50LCBhbmQgc2FmZSB0byBjYWxsIGNvbmN1cnJlbnRseSAtIG92ZXJsYXBwaW5nIGNhbGxzIGF3YWl0IHRoZSBzYW1lXG4gICAqIGluLWZsaWdodCBjb25uZWN0LiB7QGxpbmsgbGlzdGVufSBjYWxscyB0aGlzLCBzbyBpdCBpcyBvbmx5IG5lZWRlZCB0byBzdXJmYWNlXG4gICAqIGEgY29ubmVjdGlvbiBwcm9ibGVtIGF0IHN0YXJ0dXAgcmF0aGVyIHRoYW4gb24gZmlyc3Qgc3Vic2NyaWJlLiBUaHJvd3MgaWYgdGhlXG4gICAqIGJ1cyBpcyBjbG9zZWQsIG9yIGlmIHRoZSBwb29sIGNhbm5vdCBoYW5kIG91dCBhIGNvbm5lY3Rpb24uXG4gICAqL1xuICBhc3luYyBzdGFydCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5jbGllbnQpIHJldHVybjtcbiAgICBpZiAodGhpcy5jbG9zZWQpIHRocm93IG5ldyBFcnJvcihcIlBvc3RncmVzIHRvcGljIGJ1cyBpcyBjbG9zZWRcIik7XG4gICAgdGhpcy5zdGFydGluZyA/Pz0gdGhpcy5jb25uZWN0KCkuZmluYWxseSgoKSA9PiB7XG4gICAgICB0aGlzLnN0YXJ0aW5nID0gdW5kZWZpbmVkO1xuICAgIH0pO1xuICAgIGF3YWl0IHRoaXMuc3RhcnRpbmc7XG4gIH1cblxuICAvKipcbiAgICogUHVibGlzaCBhIG1lc3NhZ2UgdG8gYHRvcGljYCwgcmV0dXJuaW5nIHRoZSBlbnZlbG9wZSB0aGF0IHdhcyBzZW50LlxuICAgKlxuICAgKiBSZXNvbHZlcyBvbmNlIFBvc3RncmVzIGhhcyBhY2NlcHRlZCB0aGUgYE5PVElGWWAsIHdoaWNoIHNheXMgbm90aGluZyBhYm91dFxuICAgKiBhbnlvbmUgcmVjZWl2aW5nIGl0OiBzZXNzaW9ucyBub3QgbGlzdGVuaW5nIGF0IHRoYXQgbW9tZW50IG1pc3MgaXQuIFB1Ymxpc2hpbmdcbiAgICogbmVlZHMgbm8ge0BsaW5rIHN0YXJ0fSBhbmQgbm8gc3Vic2NyaWJlcnMuXG4gICAqXG4gICAqIFZhbGlkYXRpb24gaXMgZGVsaWJlcmF0ZWx5IGZyb250LWxvYWRlZCwgc2luY2UgYSBtZXNzYWdlIHRoYXQgZmFpbHMgb24gdGhlXG4gICAqIHdpcmUgaXMgZmFyIGhhcmRlciB0byBkaWFnbm9zZSB0aGFuIG9uZSByZWplY3RlZCBhdCB0aGUgY2FsbDogYFR5cGVFcnJvcmAgZm9yIGFcbiAgICogYmxhbmsgdG9waWMgb3IgdHlwZSwgb3IgYSBib2R5L21ldGFkYXRhIHRoYXQgd291bGQgbm90IHJvdW5kLXRyaXAgdGhyb3VnaCBKU09OXG4gICAqIHVuY2hhbmdlZCAoYG9iamVjdC5pc1NlcmlhbGl6YWJsZVZhbHVlYCk7IGBSYW5nZUVycm9yYCB3aGVuIHRoZSBlbmNvZGVkXG4gICAqIGVudmVsb3BlIGV4Y2VlZHMgdGhlIGBOT1RJRllgIHBheWxvYWQgbGltaXQsIHdoaWNoIHRoZSBhdXRvbWF0aWMgbWV0YWRhdGFcbiAgICogY291bnRzIGFnYWluc3QgLSBzZW5kIGEgcmVmZXJlbmNlIGFuZCBsZXQgdGhlIHJlY2VpdmVyIGZldGNoIHRoZSBwYXlsb2FkLlxuICAgKiBUaHJvd3MgaWYgdGhlIGJ1cyBpcyBjbG9zZWQuXG4gICAqL1xuICBhc3luYyBicm9hZGNhc3Q8VEJvZHkgZXh0ZW5kcyBTZXJpYWxpemFibGVWYWx1ZT4oXG4gICAgdG9waWM6IHN0cmluZyxcbiAgICBpbnB1dDogVG9waWNQdWJsaXNoSW5wdXQ8VEJvZHk+LFxuICApOiBQcm9taXNlPFRvcGljTWVzc2FnZTxUQm9keT4+IHtcbiAgICBpZiAoIXRvcGljLnRyaW0oKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlRvcGljIG11c3Qgbm90IGJlIGVtcHR5XCIpO1xuICAgIGlmICghaW5wdXQudHlwZS50cmltKCkpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJNZXNzYWdlIHR5cGUgbXVzdCBub3QgYmUgZW1wdHlcIik7XG4gICAgaWYgKFxuICAgICAgIW9iamVjdC5pc1NlcmlhbGl6YWJsZVZhbHVlKGlucHV0Lm1ldGFkYXRhID8/IHt9KSB8fFxuICAgICAgIW9iamVjdC5pc1NlcmlhbGl6YWJsZVZhbHVlKGlucHV0LmJvZHkpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTWVzc2FnZSBtZXRhZGF0YSBhbmQgYm9keSBtdXN0IGJlIEpTT04gc2VyaWFsaXphYmxlIHdpdGhvdXQgY29lcmNpb25cIik7XG4gICAgfVxuICAgIGlmICh0aGlzLmNsb3NlZCkgdGhyb3cgbmV3IEVycm9yKFwiUG9zdGdyZXMgdG9waWMgYnVzIGlzIGNsb3NlZFwiKTtcbiAgICBjb25zdCBhdXRvbWF0aWMgPSBhd2FpdCB0aGlzLnJlc29sdmVNZXRhZGF0YSgpO1xuICAgIGNvbnN0IG1lc3NhZ2U6IFRvcGljTWVzc2FnZTxUQm9keT4gPSB7XG4gICAgICBpZDogaGFzaC5pZCgpLFxuICAgICAgdG9waWMsXG4gICAgICB0eXBlOiBpbnB1dC50eXBlLFxuICAgICAgbWV0YWRhdGE6IHsgLi4uYXV0b21hdGljLCAuLi5pbnB1dC5tZXRhZGF0YSB9LFxuICAgICAgYm9keTogaW5wdXQuYm9keSxcbiAgICAgIHB1Ymxpc2hlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgfTtcbiAgICBsZXQgZW5jb2RlZDogc3RyaW5nO1xuICAgIHRyeSB7XG4gICAgICBlbmNvZGVkID0gSlNPTi5zdHJpbmdpZnkobWVzc2FnZSk7XG4gICAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE1lc3NhZ2UgbXVzdCBiZSBKU09OIHNlcmlhbGl6YWJsZTogJHtlcnJvclV0aWxzLmVycm9yTWVzc2FnZShjYXVzZSl9YCk7XG4gICAgfVxuICAgIGlmICghZGVjb2RlKGVuY29kZWQpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTWVzc2FnZSB0eXBlLCBtZXRhZGF0YSwgYW5kIGJvZHkgbXVzdCBiZSBKU09OIHNlcmlhbGl6YWJsZVwiKTtcbiAgICB9XG4gICAgLy8gT25seSB0aGUgZW52ZWxvcGUgcGF5bG9hZCBpcyBib3VuZGVkIGJ5IHRoZSBgTk9USUZZYCBsaW1pdC4gQSBwb2ludGVyXG4gICAgLy8gbm90aWZpY2F0aW9uIGlzIGEgZml4ZWQgaGFuZGZ1bCBvZiBieXRlcywgc28gcGVyc2lzdGVuY2Ugd2l0aFxuICAgIC8vIGBwYXlsb2FkOiBcInBvaW50ZXJcImAgbGlmdHMgdGhlIGNhcCBlbnRpcmVseS5cbiAgICBpZiAoXG4gICAgICBCdWZmZXIuYnl0ZUxlbmd0aChlbmNvZGVkLCBcInV0ZjhcIikgPiBNQVhfTk9USUZZX0JZVEVTICYmXG4gICAgICB0aGlzLnBlcnNpc3RlbmNlPy5wYXlsb2FkICE9PSBcInBvaW50ZXJcIlxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFBvc3RncmVzIG5vdGlmaWNhdGlvbiBleGNlZWRzICR7TUFYX05PVElGWV9CWVRFU30gYnl0ZXNgKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnBlcnNpc3RlbmNlKSB7XG4gICAgICBhd2FpdCB0aGlzLnBvb2wucXVlcnkoXCJTRUxFQ1QgcGdfbm90aWZ5KCQxLCAkMilcIiwgW3RoaXMuY2hhbm5lbE5hbWUsIGVuY29kZWRdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMucGVyc2lzdGVuY2UucHJvdmlzaW9uKSB7XG4gICAgICAgIHRoaXMucHJvdmlzaW9uaW5nID8/PSBwcm92aXNpb25NZXNzYWdlQnVzU2NoZW1hKHRoaXMucG9vbCwgdGhpcy5wZXJzaXN0ZW5jZSk7XG4gICAgICAgIGF3YWl0IHRoaXMucHJvdmlzaW9uaW5nO1xuICAgICAgfVxuICAgICAgY29uc3QgY2xpZW50ID0gYXdhaXQgdGhpcy5wb29sLmNvbm5lY3QoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShcIkJFR0lOXCIpO1xuICAgICAgICBhd2FpdCBwZXJzaXN0ZWROb3RpZnkoXG4gICAgICAgICAgY2xpZW50LFxuICAgICAgICAgIHRoaXMuY2hhbm5lbE5hbWUsXG4gICAgICAgICAgdG9waWMsXG4gICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgICBlbmNvZGVkLFxuICAgICAgICAgIHRoaXMucGVyc2lzdGVuY2UsXG4gICAgICAgICAgaW5wdXQuc2NvcGUgPz8gdGhpcy5wZXJzaXN0ZW5jZS5zY29wZSxcbiAgICAgICAgICBpbnB1dC50dGwgPz8gdGhpcy5wZXJzaXN0ZW5jZS50dGwsXG4gICAgICAgICk7XG4gICAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShcIkNPTU1JVFwiKTtcbiAgICAgIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShcIlJPTExCQUNLXCIpLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgICAgIHRocm93IGNhdXNlO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgY2xpZW50LnJlbGVhc2UoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1lc3NhZ2U7XG4gIH1cblxuICBhc3luYyBoaXN0b3J5PFRCb2R5IGV4dGVuZHMgU2VyaWFsaXphYmxlVmFsdWU+KFxuICAgIHRvcGljOiBzdHJpbmcsXG4gICAgb3B0aW9uczogeyBhZnRlcj86IHN0cmluZzsgbGltaXQ/OiBudW1iZXI7IHNjb3BlPzogVG9waWNQZXJzaXN0ZW5jZVNjb3BlIH0gPSB7fSxcbiAgKTogUHJvbWlzZTxUb3BpY0hpc3RvcnlQYWdlPFRCb2R5Pj4ge1xuICAgIGlmICghdGhpcy5wZXJzaXN0ZW5jZSkgdGhyb3cgbmV3IEVycm9yKFwiUG9zdGdyZXMgdG9waWMgYnVzIHBlcnNpc3RlbmNlIGlzIGRpc2FibGVkXCIpO1xuICAgIGlmICh0aGlzLnBlcnNpc3RlbmNlLnByb3Zpc2lvbikge1xuICAgICAgdGhpcy5wcm92aXNpb25pbmcgPz89IHByb3Zpc2lvbk1lc3NhZ2VCdXNTY2hlbWEodGhpcy5wb29sLCB0aGlzLnBlcnNpc3RlbmNlKTtcbiAgICAgIGF3YWl0IHRoaXMucHJvdmlzaW9uaW5nO1xuICAgIH1cbiAgICByZXR1cm4gaGlzdG9yeTxUQm9keT4odGhpcy5wb29sLCB0aGlzLmNoYW5uZWxOYW1lLCB0b3BpYywgdGhpcy5wZXJzaXN0ZW5jZSwgb3B0aW9ucyk7XG4gIH1cblxuICBhc3luYyBjbGVhbnVwRXhwaXJlZChcbiAgICBvcHRpb25zOiB7IHNjb3BlPzogVG9waWNQZXJzaXN0ZW5jZVNjb3BlOyBsaW1pdD86IG51bWJlciB9ID0ge30sXG4gICk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgaWYgKCF0aGlzLnBlcnNpc3RlbmNlKSB0aHJvdyBuZXcgRXJyb3IoXCJQb3N0Z3JlcyB0b3BpYyBidXMgcGVyc2lzdGVuY2UgaXMgZGlzYWJsZWRcIik7XG4gICAgcmV0dXJuIGNsZWFudXBFeHBpcmVkKFxuICAgICAgdGhpcy5wb29sLFxuICAgICAgdGhpcy5wZXJzaXN0ZW5jZSxcbiAgICAgIG9wdGlvbnMuc2NvcGUgPz8gdGhpcy5wZXJzaXN0ZW5jZS5zY29wZSxcbiAgICAgIG9wdGlvbnMubGltaXQsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmUgdG8gYHRvcGljYCwgcmV0dXJuaW5nIHRoZSBmdW5jdGlvbiB0aGF0IHVuc3Vic2NyaWJlcy5cbiAgICpcbiAgICogQ29ubmVjdHMgb24gZmlyc3QgdXNlLiBTZXZlcmFsIGxpc3RlbmVycyBtYXkgc2hhcmUgYSB0b3BpYzsgZWFjaCBpcyBjYWxsZWRcbiAgICogb25jZSBwZXIgbWVzc2FnZS4gT25seSBtZXNzYWdlcyBwdWJsaXNoZWQgQUZURVIgdGhpcyByZXNvbHZlcyBhcnJpdmUsIHNvXG4gICAqIHN1YnNjcmliZSBiZWZvcmUgdHJpZ2dlcmluZyB3aGF0ZXZlciB5b3UgZXhwZWN0IHRvIG9ic2VydmUuXG4gICAqXG4gICAqIFRoZSByZXR1cm5lZCBmdW5jdGlvbiByZW1vdmVzIGp1c3QgdGhpcyBsaXN0ZW5lciBhbmQgaXMgc2FmZSB0byBjYWxsIHR3aWNlLlxuICAgKiBUaGUgY29ubmVjdGlvbiBzdGF5cyBvcGVuIG9uY2UgdGhlIGxhc3QgbGlzdGVuZXIgbGVhdmVzIC0ge0BsaW5rIGNsb3NlfVxuICAgKiByZWxlYXNlcyBpdCAtIHNvIGEgYnVzIHRoYXQgc3Vic2NyaWJlcyBhbmQgdW5zdWJzY3JpYmVzIHBlciByZXF1ZXN0IGRvZXMgbm90XG4gICAqIGNodXJuIGNvbm5lY3Rpb25zLlxuICAgKi9cbiAgYXN5bmMgbGlzdGVuPFRCb2R5IGV4dGVuZHMgU2VyaWFsaXphYmxlVmFsdWU+KFxuICAgIHRvcGljOiBzdHJpbmcsXG4gICAgbGlzdGVuZXI6IFRvcGljTGlzdGVuZXI8VEJvZHk+LFxuICApOiBQcm9taXNlPCgpID0+IFByb21pc2U8dm9pZD4+IHtcbiAgICBpZiAoIXRvcGljLnRyaW0oKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlRvcGljIG11c3Qgbm90IGJlIGVtcHR5XCIpO1xuICAgIGF3YWl0IHRoaXMuc3RhcnQoKTtcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbmVycy5nZXQodG9waWMpID8/IG5ldyBTZXQ8VG9waWNMaXN0ZW5lcj4oKTtcbiAgICBsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyIGFzIFRvcGljTGlzdGVuZXIpO1xuICAgIHRoaXMubGlzdGVuZXJzLnNldCh0b3BpYywgbGlzdGVuZXJzKTtcbiAgICByZXR1cm4gYXN5bmMgKCkgPT4ge1xuICAgICAgbGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lciBhcyBUb3BpY0xpc3RlbmVyKTtcbiAgICAgIGlmIChsaXN0ZW5lcnMuc2l6ZSA9PT0gMCkgdGhpcy5saXN0ZW5lcnMuZGVsZXRlKHRvcGljKTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIHRoZSBhdXRvbWF0aWMgaGFsZiBvZiBhIG1lc3NhZ2UncyBtZXRhZGF0YS5cbiAgICpcbiAgICogUHJlY2VkZW5jZSwgd2Vha2VzdCBmaXJzdDogbWFjaGluZS9wcm9jZXNzIGNvbnRleHQsIHRoZW4gQXBwS2l0IHNlbmRlclxuICAgKiBpZGVudGl0eSwgdGhlbiB0aGlzIGJ1cydzIGNvbmZpZ3VyZWQgbWV0YWRhdGEuIFRoZSBjYWxsZXIncyBwZXItbWVzc2FnZVxuICAgKiBtZXRhZGF0YSBpcyBsYXllcmVkIG92ZXIgdGhlIHJlc3VsdCBpbiB7QGxpbmsgYnJvYWRjYXN0fSwgc28gdGhlIG1vc3Qgc3BlY2lmaWNcbiAgICogc291cmNlIGFsd2F5cyB3aW5zIGFuZCBub3RoaW5nIGhlcmUgY2FuIG92ZXJ3cml0ZSBhbiBleHBsaWNpdCBrZXkuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlc29sdmVNZXRhZGF0YSgpOiBQcm9taXNlPFRvcGljTWV0YWRhdGE+IHtcbiAgICBjb25zdCBzZW5kZXIgPSBhd2FpdCBzZW5kZXJNZXRhZGF0YSgpO1xuICAgIGNvbnN0IGNvbmZpZ3VyZWQgPVxuICAgICAgdHlwZW9mIHRoaXMubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIiA/IGF3YWl0IHRoaXMubWV0YWRhdGEoKSA6ICh0aGlzLm1ldGFkYXRhID8/IHt9KTtcbiAgICByZXR1cm4geyAuLi5tYWNoaW5lTWV0YWRhdGEoKSwgLi4uc2VuZGVyLCAuLi5jb25maWd1cmVkIH07XG4gIH1cblxuICAvKipcbiAgICogUmVsZWFzZSB0aGUgbm90aWZpY2F0aW9uIGNvbm5lY3Rpb24gYW5kIHN0b3AgZGVsaXZlcmluZyBtZXNzYWdlcy4gSWRlbXBvdGVudC5cbiAgICpcbiAgICogQ2FuY2VscyBhbnkgcGVuZGluZyByZWNvbm5lY3QsIGRyb3BzIGFsbCBsaXN0ZW5lcnMsIHRoZW4gYFVOTElTVEVOYHMgYW5kXG4gICAqIHJldHVybnMgdGhlIGNsaWVudCB0byB0aGUgcG9vbC4gQSBmYWlsZWQgYFVOTElTVEVOYCBpcyByZXBvcnRlZCB0byB0aGUgcG9vbCBhc1xuICAgKiBhIHJlbGVhc2UgZXJyb3Igc28gdGhlIGNvbm5lY3Rpb24gaXMgRElTQ0FSREVEIHJhdGhlciB0aGFuIGhhbmRlZCB0byB0aGUgbmV4dFxuICAgKiBjYWxsZXIgc3RpbGwgc3Vic2NyaWJlZCB0byB0aGUgY2hhbm5lbC4gRG9lcyBub3QgdGhyb3c7IHRoZSBidXMgc3RheXMgY2xvc2VkLlxuICAgKi9cbiAgYXN5bmMgY2xvc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuY2xvc2VkKSByZXR1cm47XG4gICAgdGhpcy5jbG9zZWQgPSB0cnVlO1xuICAgIHRoaXMucmVjb25uZWN0QWJvcnQuYWJvcnQobmV3IEVycm9yKFwiUG9zdGdyZXMgdG9waWMgYnVzIGlzIGNsb3NlZFwiKSk7XG4gICAgYXdhaXQgdGhpcy5zdGFydGluZz8uY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICBhd2FpdCB0aGlzLnJlY29ubmVjdGluZz8uY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICBjb25zdCBjbGllbnQgPSB0aGlzLmNsaWVudDtcbiAgICB0aGlzLmNsaWVudCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmxpc3RlbmVycy5jbGVhcigpO1xuICAgIGlmICghY2xpZW50KSByZXR1cm47XG4gICAgY2xpZW50LnJlbW92ZUxpc3RlbmVyKFwibm90aWZpY2F0aW9uXCIsIHRoaXMuaGFuZGxlTm90aWZpY2F0aW9uKTtcbiAgICBjbGllbnQucmVtb3ZlTGlzdGVuZXIoXCJlcnJvclwiLCB0aGlzLmhhbmRsZUNsaWVudEVycm9yKTtcbiAgICBsZXQgcmVsZWFzZUVycm9yOiBFcnJvciB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KGBVTkxJU1RFTiAke3F1b3RlUG9zdGdyZXNJZGVudGlmaWVyKHRoaXMuY2hhbm5lbE5hbWUpfWApO1xuICAgIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgICByZWxlYXNlRXJyb3IgPSBlcnJvclV0aWxzLnRvRXJyb3IoY2F1c2UpO1xuICAgIH1cbiAgICBjbGllbnQucmVsZWFzZShyZWxlYXNlRXJyb3IpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIG91dCBvbmUgY2xpZW50LCBhdHRhY2ggdGhlIGhhbmRsZXJzLCBhbmQgYExJU1RFTmAuXG4gICAqXG4gICAqIFRoZSBoYW5kbGVycyBhcmUgYXR0YWNoZWQgQkVGT1JFIHRoZSBgTElTVEVOYCByb3VuZCB0cmlwIHNvIGEgbm90aWZpY2F0aW9uIG9yXG4gICAqIGVycm9yIGFycml2aW5nIG1pZC1zZXR1cCBpcyBub3QgbWlzc2VkLiBBbnkgZmFpbHVyZSAtIGluY2x1ZGluZyB0aGUgYnVzIGJlaW5nXG4gICAqIGNsb3NlZCB3aGlsZSB0aGUgY29ubmVjdCB3YXMgaW4gZmxpZ2h0IC0gZGV0YWNoZXMgdGhlIGhhbmRsZXJzIGFuZCByZWxlYXNlc1xuICAgKiB0aGUgY2xpZW50IGFzIGVycm9yZWQsIHNvIGEgaGFsZi1jb25maWd1cmVkIGNvbm5lY3Rpb24gbmV2ZXIgcmV0dXJucyB0byB0aGVcbiAgICogcG9vbC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY29ubmVjdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjbGllbnQgPSBhd2FpdCB0aGlzLnBvb2wuY29ubmVjdCgpO1xuICAgIHRyeSB7XG4gICAgICBjbGllbnQub24oXCJub3RpZmljYXRpb25cIiwgdGhpcy5oYW5kbGVOb3RpZmljYXRpb24pO1xuICAgICAgY2xpZW50Lm9uKFwiZXJyb3JcIiwgdGhpcy5oYW5kbGVDbGllbnRFcnJvcik7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoYExJU1RFTiAke3F1b3RlUG9zdGdyZXNJZGVudGlmaWVyKHRoaXMuY2hhbm5lbE5hbWUpfWApO1xuICAgICAgaWYgKHRoaXMuY2xvc2VkKSB0aHJvdyBuZXcgRXJyb3IoXCJQb3N0Z3JlcyB0b3BpYyBidXMgaXMgY2xvc2VkXCIpO1xuICAgICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7XG4gICAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICAgIGNsaWVudC5yZW1vdmVMaXN0ZW5lcihcIm5vdGlmaWNhdGlvblwiLCB0aGlzLmhhbmRsZU5vdGlmaWNhdGlvbik7XG4gICAgICBjbGllbnQucmVtb3ZlTGlzdGVuZXIoXCJlcnJvclwiLCB0aGlzLmhhbmRsZUNsaWVudEVycm9yKTtcbiAgICAgIGNsaWVudC5yZWxlYXNlKGVycm9yVXRpbHMudG9FcnJvcihjYXVzZSkpO1xuICAgICAgdGhyb3cgY2F1c2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJvdXRlIG9uZSBpbmJvdW5kIG5vdGlmaWNhdGlvbiB0byB0aGUgdG9waWMncyBsaXN0ZW5lcnMuXG4gICAqXG4gICAqIElnbm9yZXMgb3RoZXIgY2hhbm5lbHMgYW5kIHVuZGVjb2RhYmxlIHBheWxvYWRzIC0gdGhlIGNoYW5uZWwgaXMgc2hhcmVkLCBzb1xuICAgKiBib3RoIGFyZSBvcmRpbmFyeSB0cmFmZmljLiBMaXN0ZW5lcnMgYXJlIGludm9rZWQgY29uY3VycmVudGx5IGFuZCB0aGVpclxuICAgKiByZWplY3Rpb25zIGdvIHRvIGBvbkVycm9yYCwga2VlcGluZyBvbmUgc2xvdyBvciBicm9rZW4gc3Vic2NyaWJlciBmcm9tXG4gICAqIHN0YWxsaW5nIHRoZSBub3RpZmljYXRpb24gY29ubmVjdGlvbi5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlTm90aWZpY2F0aW9uID0gKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKTogdm9pZCA9PiB7XG4gICAgaWYgKG5vdGlmaWNhdGlvbi5jaGFubmVsICE9PSB0aGlzLmNoYW5uZWxOYW1lKSByZXR1cm47XG4gICAgY29uc3QgbWVzc2FnZSA9IGRlY29kZShub3RpZmljYXRpb24ucGF5bG9hZCk7XG4gICAgaWYgKG1lc3NhZ2UpIHtcbiAgICAgIHRoaXMuZGVsaXZlcihtZXNzYWdlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gYHBheWxvYWQ6IFwicG9pbnRlclwiYCBjYXJyaWVzIG9ubHkgcm91dGluZyBhbmQgaWRlbnRpdHksIHNvIHRoZSBlbnZlbG9wZSBoYXNcbiAgICAvLyB0byBiZSByZWFkIGJhY2sgYmVmb3JlIGFueXRoaW5nIGNhbiBiZSBkZWxpdmVyZWQuIE9ubHkgYXR0ZW1wdGVkIHdoZW4gdGhpc1xuICAgIC8vIGJ1cyBpcyBjb25maWd1cmVkIGZvciBwZXJzaXN0ZW5jZTsgb3RoZXJ3aXNlIHRoZSBwYXlsb2FkIGlzIGZvcmVpZ24gdHJhZmZpY1xuICAgIC8vIG9uIGEgc2hhcmVkIGNoYW5uZWwgYW5kIGlnbm9yZWQgYXMgYmVmb3JlLlxuICAgIGNvbnN0IHBvaW50ZXIgPSB0aGlzLnBlcnNpc3RlbmNlID8gZGVjb2RlUG9pbnRlcihub3RpZmljYXRpb24ucGF5bG9hZCkgOiB1bmRlZmluZWQ7XG4gICAgaWYgKCFwb2ludGVyKSByZXR1cm47XG4gICAgaWYgKCF0aGlzLmxpc3RlbmVycy5oYXMocG9pbnRlci50b3BpYykpIHJldHVybjtcbiAgICByZWFkUG9pbnRlcih0aGlzLnBvb2wsIHRoaXMuY2hhbm5lbE5hbWUsIHBvaW50ZXIsIHRoaXMucGVyc2lzdGVuY2UhKVxuICAgICAgLnRoZW4oKHN0b3JlZCkgPT4ge1xuICAgICAgICBpZiAoc3RvcmVkKSB0aGlzLmRlbGl2ZXIoc3RvcmVkKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2godGhpcy5vbkVycm9yKTtcbiAgfTtcblxuICAvKiogSGFuZCBvbmUgZGVjb2RlZCBtZXNzYWdlIHRvIHRoZSB0b3BpYydzIGxpc3RlbmVycy4gKi9cbiAgcHJpdmF0ZSBkZWxpdmVyKG1lc3NhZ2U6IFRvcGljTWVzc2FnZSk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5saXN0ZW5lcnMuZ2V0KG1lc3NhZ2UudG9waWMpID8/IFtdKSB7XG4gICAgICBQcm9taXNlLnJlc29sdmUobGlzdGVuZXIobWVzc2FnZSkpLmNhdGNoKHRoaXMub25FcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSB0aGUgbm90aWZpY2F0aW9uIGNvbm5lY3Rpb24gZHlpbmcsIHdoaWNoIGBwZ2AgcmVwb3J0cyBhcyBhbiBgZXJyb3JgXG4gICAqIGV2ZW50IHJhdGhlciB0aGFuIGEgcmVqZWN0ZWQgcXVlcnkuXG4gICAqXG4gICAqIFRoZSBjbGllbnQgaXMgdW51c2FibGUgYXQgdGhpcyBwb2ludCwgc28gaXQgaXMgZGV0YWNoZWQgYW5kIHJlbGVhc2VkIGFzXG4gICAqIGVycm9yZWQgKHdoaWNoIGRpc2NhcmRzIGl0KSBiZWZvcmUgYW55dGhpbmcgZWxzZS4gUmVjb25uZWN0aW9uIG9ubHkgc3RhcnRzXG4gICAqIHdoZW4gdGhlcmUgaXMgc3RpbGwgc29tZW9uZSB0byBkZWxpdmVyIHRvLCBzbyBhbiBpZGxlIG9yIGNsb3NpbmcgYnVzIGRvZXMgbm90XG4gICAqIGhvbGQgYSBjb25uZWN0aW9uIG9wZW4gY2hhc2luZyBhIGNoYW5uZWwgbm9ib2R5IHJlYWRzLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBoYW5kbGVDbGllbnRFcnJvciA9IChjYXVzZTogRXJyb3IpOiB2b2lkID0+IHtcbiAgICB0aGlzLm9uRXJyb3IoY2F1c2UpO1xuICAgIGNvbnN0IGNsaWVudCA9IHRoaXMuY2xpZW50O1xuICAgIGlmICghY2xpZW50KSByZXR1cm47XG4gICAgdGhpcy5jbGllbnQgPSB1bmRlZmluZWQ7XG4gICAgY2xpZW50LnJlbW92ZUxpc3RlbmVyKFwibm90aWZpY2F0aW9uXCIsIHRoaXMuaGFuZGxlTm90aWZpY2F0aW9uKTtcbiAgICBjbGllbnQucmVtb3ZlTGlzdGVuZXIoXCJlcnJvclwiLCB0aGlzLmhhbmRsZUNsaWVudEVycm9yKTtcbiAgICBjbGllbnQucmVsZWFzZShjYXVzZSk7XG4gICAgaWYgKHRoaXMuY2xvc2VkIHx8IHRoaXMubGlzdGVuZXJzLnNpemUgPT09IDApIHJldHVybjtcbiAgICB0aGlzLnJlY29ubmVjdGluZyA/Pz0gdGhpcy5yZWNvbm5lY3QoKS5maW5hbGx5KCgpID0+IHtcbiAgICAgIHRoaXMucmVjb25uZWN0aW5nID0gdW5kZWZpbmVkO1xuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZS1lc3RhYmxpc2ggdGhlIG5vdGlmaWNhdGlvbiBjb25uZWN0aW9uIHdpdGggYm91bmRlZCBleHBvbmVudGlhbCBiYWNrb2ZmLlxuICAgKlxuICAgKiBUaGUgZmlyc3QgYXR0ZW1wdCBpcyBpbW1lZGlhdGUsIHNpbmNlIHRoZSBjb21tb24gY2FzZSBpcyBhIHNpbmdsZSBkcm9wcGVkXG4gICAqIGNvbm5lY3Rpb24gdGhhdCByZWNvbm5lY3RzIGF0IG9uY2U7IHN1YnNlcXVlbnQgZGVsYXlzIGRvdWJsZSBmcm9tIDI1MG1zIHVwIHRvXG4gICAqIDVzIGFuZCBzdGF5IHRoZXJlLiBSZXRyaWVzIGluZGVmaW5pdGVseSByYXRoZXIgdGhhbiBnaXZpbmcgdXAsIGJlY2F1c2UgYSBQb3N0Z3JlcyByZXN0YXJ0XG4gICAqIG9yIGEgcm90YXRlZCBMYWtlYmFzZSBjcmVkZW50aWFsIGlzIGEgcmVjb3ZlcmFibGUgb3V0YWdlIGFuZCBhIHNpbGVudGx5IGRlYWRcbiAgICogbGlzdGVuZXIgaXMgd29yc2UgdGhhbiBhIG5vaXN5IG9uZS4gU3RvcHMgd2hlbiB0aGUgYnVzIGNsb3NlcyBvciB0aGUgbGFzdFxuICAgKiBsaXN0ZW5lciBsZWF2ZXMsIGFuZCByZXBvcnRzIGV2ZXJ5IGZhaWxlZCBhdHRlbXB0IHRocm91Z2ggYG9uRXJyb3JgLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZWNvbm5lY3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGRlbGF5ID0gMDtcbiAgICB3aGlsZSAoIXRoaXMuY2xvc2VkICYmIHRoaXMubGlzdGVuZXJzLnNpemUgPiAwKSB7XG4gICAgICBpZiAoZGVsYXkgPiAwKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgYXN5bmNVdGlscy5zbGVlcChkZWxheSwgdGhpcy5yZWNvbm5lY3RBYm9ydC5zaWduYWwpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RhcnQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICAgICAgaWYgKHRoaXMuY2xvc2VkKSByZXR1cm47XG4gICAgICAgIHRoaXMub25FcnJvcihjYXVzZSk7XG4gICAgICAgIGRlbGF5ID0gZGVsYXkgPT09IDAgPyBNSU5fUkVDT05ORUNUX0RFTEFZX01TIDogTWF0aC5taW4oZGVsYXkgKiAyLCBNQVhfUkVDT05ORUNUX0RFTEFZX01TKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
package/lib/tsconfig.tsbuildinfo
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"root":["../src/advisory-lock.ts","../src/identity.ts","../src/persistence.ts","../src/topic-bus.ts","../index.ts"],"version":"5.9.3"}
|
|
1
|
+
{"root":["../src/advisory-lock.ts","../src/bindings.ts","../src/identity.ts","../src/persistence.ts","../src/session.ts","../src/topic-bus.ts","../index.ts"],"version":"5.9.3"}
|
package/package.json
CHANGED
|
@@ -28,8 +28,8 @@
|
|
|
28
28
|
"@databricks/appkit": "0.81.0"
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@dbx-tools/lakebase": "^0.9.
|
|
32
|
-
"@dbx-tools/shared-core": "^0.9.
|
|
31
|
+
"@dbx-tools/lakebase": "^0.9.61",
|
|
32
|
+
"@dbx-tools/shared-core": "^0.9.61",
|
|
33
33
|
"pg": "^8.22.0"
|
|
34
34
|
},
|
|
35
35
|
"main": "./lib/index.js",
|
|
@@ -47,6 +47,10 @@
|
|
|
47
47
|
"types": "./lib/src/advisory-lock.d.ts",
|
|
48
48
|
"default": "./lib/src/advisory-lock.js"
|
|
49
49
|
},
|
|
50
|
+
"./bindings": {
|
|
51
|
+
"types": "./lib/src/bindings.d.ts",
|
|
52
|
+
"default": "./lib/src/bindings.js"
|
|
53
|
+
},
|
|
50
54
|
"./identity": {
|
|
51
55
|
"types": "./lib/src/identity.d.ts",
|
|
52
56
|
"default": "./lib/src/identity.js"
|
|
@@ -55,6 +59,10 @@
|
|
|
55
59
|
"types": "./lib/src/persistence.d.ts",
|
|
56
60
|
"default": "./lib/src/persistence.js"
|
|
57
61
|
},
|
|
62
|
+
"./session": {
|
|
63
|
+
"types": "./lib/src/session.d.ts",
|
|
64
|
+
"default": "./lib/src/session.js"
|
|
65
|
+
},
|
|
58
66
|
"./topic-bus": {
|
|
59
67
|
"types": "./lib/src/topic-bus.d.ts",
|
|
60
68
|
"default": "./lib/src/topic-bus.js"
|
|
@@ -62,7 +70,7 @@
|
|
|
62
70
|
"./package.json": "./package.json"
|
|
63
71
|
}
|
|
64
72
|
},
|
|
65
|
-
"version": "0.9.
|
|
73
|
+
"version": "0.9.61",
|
|
66
74
|
"types": "./lib/index.d.ts",
|
|
67
75
|
"dbxToolsConfig": {
|
|
68
76
|
"tags": [
|
|
@@ -79,6 +87,10 @@
|
|
|
79
87
|
"types": "./lib/src/advisory-lock.d.ts",
|
|
80
88
|
"default": "./lib/src/advisory-lock.js"
|
|
81
89
|
},
|
|
90
|
+
"./bindings": {
|
|
91
|
+
"types": "./lib/src/bindings.d.ts",
|
|
92
|
+
"default": "./lib/src/bindings.js"
|
|
93
|
+
},
|
|
82
94
|
"./identity": {
|
|
83
95
|
"types": "./lib/src/identity.d.ts",
|
|
84
96
|
"default": "./lib/src/identity.js"
|
|
@@ -87,6 +99,10 @@
|
|
|
87
99
|
"types": "./lib/src/persistence.d.ts",
|
|
88
100
|
"default": "./lib/src/persistence.js"
|
|
89
101
|
},
|
|
102
|
+
"./session": {
|
|
103
|
+
"types": "./lib/src/session.d.ts",
|
|
104
|
+
"default": "./lib/src/session.js"
|
|
105
|
+
},
|
|
90
106
|
"./topic-bus": {
|
|
91
107
|
"types": "./lib/src/topic-bus.d.ts",
|
|
92
108
|
"default": "./lib/src/topic-bus.js"
|
package/src/bindings.ts
ADDED
package/src/persistence.ts
CHANGED
|
@@ -12,6 +12,7 @@ import { object } from "@dbx-tools/shared-core";
|
|
|
12
12
|
import type { QueryResultRow } from "pg";
|
|
13
13
|
import type { PgPoolLike, PgQueryable } from "./advisory-lock.ts";
|
|
14
14
|
import { withAdvisoryTransactionLock } from "./advisory-lock.ts";
|
|
15
|
+
import { quotePostgresIdentifier } from "./session.ts";
|
|
15
16
|
import type { TopicMessage } from "./topic-bus.ts";
|
|
16
17
|
|
|
17
18
|
/** Storage and grant tier for persisted topic messages. */
|
|
@@ -61,9 +62,8 @@ const DEFAULT_TTL = "24 hours";
|
|
|
61
62
|
* the notification as foreign traffic rather than guessing at its shape.
|
|
62
63
|
*/
|
|
63
64
|
export const POINTER_VERSION = 1;
|
|
64
|
-
const quote = (value: string): string => `"${value.replaceAll('"', '""')}"`;
|
|
65
65
|
const table = (options: ResolvedTopicBusPersistenceOptions, scope: TopicPersistenceScope): string =>
|
|
66
|
-
`${
|
|
66
|
+
`${quotePostgresIdentifier(options.schema)}.${quotePostgresIdentifier(options.tables[scope])}`;
|
|
67
67
|
|
|
68
68
|
/** Validate persistence scope and apply stable schema, table, TTL, and cleanup defaults. */
|
|
69
69
|
export function resolvePersistenceOptions(
|
|
@@ -94,9 +94,9 @@ export async function provisionMessageBusSchema(
|
|
|
94
94
|
options: ResolvedTopicBusPersistenceOptions,
|
|
95
95
|
): Promise<void> {
|
|
96
96
|
await withAdvisoryTransactionLock(pool, ["dbx_message_bus", "schema"], async (client) => {
|
|
97
|
-
await client.query(`CREATE SCHEMA IF NOT EXISTS ${
|
|
97
|
+
await client.query(`CREATE SCHEMA IF NOT EXISTS ${quotePostgresIdentifier(options.schema)}`);
|
|
98
98
|
await client.query(
|
|
99
|
-
`CREATE TABLE IF NOT EXISTS ${
|
|
99
|
+
`CREATE TABLE IF NOT EXISTS ${quotePostgresIdentifier(options.schema)}.${quotePostgresIdentifier("schema_version")} (version INTEGER PRIMARY KEY)`,
|
|
100
100
|
);
|
|
101
101
|
for (const scope of ["open", "restricted"] as const) {
|
|
102
102
|
const name = table(options, scope);
|
|
@@ -104,14 +104,14 @@ export async function provisionMessageBusSchema(
|
|
|
104
104
|
`CREATE TABLE IF NOT EXISTS ${name} (sequence BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, channel TEXT NOT NULL, topic TEXT NOT NULL, message_id TEXT NOT NULL, published_at TIMESTAMPTZ NOT NULL, expires_at TIMESTAMPTZ, xact_id XID8 NOT NULL DEFAULT pg_current_xact_id(), envelope JSONB NOT NULL, UNIQUE (channel, message_id), CHECK (jsonb_typeof(envelope) = 'object'))`,
|
|
105
105
|
);
|
|
106
106
|
await client.query(
|
|
107
|
-
`CREATE INDEX IF NOT EXISTS ${
|
|
107
|
+
`CREATE INDEX IF NOT EXISTS ${quotePostgresIdentifier(`${options.tables[scope]}_replay_idx`)} ON ${name} (channel, topic, sequence)`,
|
|
108
108
|
);
|
|
109
109
|
await client.query(
|
|
110
|
-
`CREATE INDEX IF NOT EXISTS ${
|
|
110
|
+
`CREATE INDEX IF NOT EXISTS ${quotePostgresIdentifier(`${options.tables[scope]}_expiry_idx`)} ON ${name} (expires_at) WHERE expires_at IS NOT NULL`,
|
|
111
111
|
);
|
|
112
112
|
}
|
|
113
113
|
await client.query(
|
|
114
|
-
`INSERT INTO ${
|
|
114
|
+
`INSERT INTO ${quotePostgresIdentifier(options.schema)}.${quotePostgresIdentifier("schema_version")} (version) VALUES (1) ON CONFLICT (version) DO NOTHING`,
|
|
115
115
|
);
|
|
116
116
|
});
|
|
117
117
|
}
|
|
@@ -124,9 +124,9 @@ export function messageBusGrantStatements(
|
|
|
124
124
|
): string[] {
|
|
125
125
|
const selected = table(options, scope);
|
|
126
126
|
return (typeof roles === "string" ? [roles] : roles).flatMap((role) => [
|
|
127
|
-
`GRANT USAGE ON SCHEMA ${
|
|
128
|
-
`GRANT SELECT, INSERT, DELETE ON TABLE ${selected} TO ${
|
|
129
|
-
`GRANT SELECT ON TABLE ${
|
|
127
|
+
`GRANT USAGE ON SCHEMA ${quotePostgresIdentifier(options.schema)} TO ${quotePostgresIdentifier(role)};`,
|
|
128
|
+
`GRANT SELECT, INSERT, DELETE ON TABLE ${selected} TO ${quotePostgresIdentifier(role)};`,
|
|
129
|
+
`GRANT SELECT ON TABLE ${quotePostgresIdentifier(options.schema)}.${quotePostgresIdentifier("schema_version")} TO ${quotePostgresIdentifier(role)};`,
|
|
130
130
|
]);
|
|
131
131
|
}
|
|
132
132
|
|
package/src/session.ts
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared PostgreSQL session configuration.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import { postgresEnvironmentNames, postgresRoleSchema } from "@dbx-tools/shared-core/options";
|
|
7
|
+
|
|
8
|
+
/** Pool/client options required to set PostgreSQL startup parameters. */
|
|
9
|
+
export interface PostgresConnectionOptions {
|
|
10
|
+
options?: string;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/** Resolve and validate an explicit or environment-provided PostgreSQL role. */
|
|
14
|
+
export function resolvePostgresRole(
|
|
15
|
+
role?: string,
|
|
16
|
+
environment: NodeJS.ProcessEnv = process.env,
|
|
17
|
+
): string | undefined {
|
|
18
|
+
return postgresRoleSchema
|
|
19
|
+
.optional()
|
|
20
|
+
.parse(role ?? environment[postgresEnvironmentNames.postgresRole]);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** Quote one PostgreSQL identifier. */
|
|
24
|
+
export function quotePostgresIdentifier(value: string): string {
|
|
25
|
+
if (value.includes("\0")) throw new TypeError("PostgreSQL identifiers cannot contain NUL");
|
|
26
|
+
return `"${value.replaceAll('"', '""')}"`;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/** Build a `SET ROLE` statement, or `undefined` when no role is configured. */
|
|
30
|
+
export function postgresRoleStatement(role?: string): string | undefined {
|
|
31
|
+
const resolved = resolvePostgresRole(role);
|
|
32
|
+
return resolved ? `SET ROLE ${quotePostgresIdentifier(resolved)}` : undefined;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** Merge the configured role into asyncpg-compatible server settings. */
|
|
36
|
+
export function postgresServerSettings(
|
|
37
|
+
role?: string,
|
|
38
|
+
settings: Readonly<Record<string, string>> = {},
|
|
39
|
+
): Record<string, string> {
|
|
40
|
+
const resolved = resolvePostgresRole(role);
|
|
41
|
+
return resolved ? { ...settings, role: resolved } : { ...settings };
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** Merge the configured role into `pg` startup options. */
|
|
45
|
+
export function postgresConnectionOptions<T extends object>(
|
|
46
|
+
options: T,
|
|
47
|
+
role?: string,
|
|
48
|
+
): T & PostgresConnectionOptions {
|
|
49
|
+
const resolved = resolvePostgresRole(role);
|
|
50
|
+
if (!resolved) return options;
|
|
51
|
+
const connectionOptions = options as T & PostgresConnectionOptions;
|
|
52
|
+
const configured = connectionOptions.options?.trim();
|
|
53
|
+
const roleOption = `-c role=${resolved}`;
|
|
54
|
+
return {
|
|
55
|
+
...options,
|
|
56
|
+
options: configured ? `${configured} ${roleOption}` : roleOption,
|
|
57
|
+
};
|
|
58
|
+
}
|
package/src/topic-bus.ts
CHANGED
|
@@ -44,6 +44,7 @@ import {
|
|
|
44
44
|
type TopicHistoryPage,
|
|
45
45
|
type TopicPersistenceScope,
|
|
46
46
|
} from "./persistence.ts";
|
|
47
|
+
import { quotePostgresIdentifier } from "./session.ts";
|
|
47
48
|
|
|
48
49
|
/**
|
|
49
50
|
* `@dbx-tools/shared-core` owns the JSON-round-trip rule; this alias just keeps the
|
|
@@ -268,11 +269,6 @@ async function senderMetadata(): Promise<TopicMetadata> {
|
|
|
268
269
|
}
|
|
269
270
|
}
|
|
270
271
|
|
|
271
|
-
/** Quote a validated channel for `LISTEN`/`UNLISTEN`, which take no parameters. */
|
|
272
|
-
function quoteIdentifier(value: string): string {
|
|
273
|
-
return `"${value.replaceAll('"', '""')}"`;
|
|
274
|
-
}
|
|
275
|
-
|
|
276
272
|
/**
|
|
277
273
|
* Parse a `NOTIFY` payload into an envelope, returning `undefined` for anything
|
|
278
274
|
* that is not one.
|
|
@@ -559,7 +555,7 @@ export class PostgresTopicBus {
|
|
|
559
555
|
client.removeListener("error", this.handleClientError);
|
|
560
556
|
let releaseError: Error | undefined;
|
|
561
557
|
try {
|
|
562
|
-
await client.query(`UNLISTEN ${
|
|
558
|
+
await client.query(`UNLISTEN ${quotePostgresIdentifier(this.channelName)}`);
|
|
563
559
|
} catch (cause) {
|
|
564
560
|
releaseError = errorUtils.toError(cause);
|
|
565
561
|
}
|
|
@@ -580,7 +576,7 @@ export class PostgresTopicBus {
|
|
|
580
576
|
try {
|
|
581
577
|
client.on("notification", this.handleNotification);
|
|
582
578
|
client.on("error", this.handleClientError);
|
|
583
|
-
await client.query(`LISTEN ${
|
|
579
|
+
await client.query(`LISTEN ${quotePostgresIdentifier(this.channelName)}`);
|
|
584
580
|
if (this.closed) throw new Error("Postgres topic bus is closed");
|
|
585
581
|
this.client = client;
|
|
586
582
|
} catch (cause) {
|