@decaf-ts/for-couchdb 0.0.2 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/for-couchdb.bundle.min.esm.js +1 -1
- package/dist/esm/for-couchdb.bundle.min.esm.js.LICENSE.txt +0 -11
- package/dist/for-couchdb.bundle.min.js +1 -1
- package/dist/for-couchdb.bundle.min.js.LICENSE.txt +0 -11
- package/docker/.dockerignore +5 -0
- package/docker/.env +7 -0
- package/docker/Dockerfile-booter +19 -0
- package/docker/Dockerfile-couchdb +4 -0
- package/docker/couchdb.ini +886 -0
- package/docker/docker-compose.yml +109 -0
- package/docker/init-cluster.sh +66 -0
- package/lib/adapter.cjs +1 -88
- package/lib/adapter.d.ts +8 -12
- package/lib/esm/adapter.d.ts +8 -12
- package/lib/esm/adapter.js +1 -88
- package/lib/esm/index.d.ts +4 -1
- package/lib/esm/index.js +5 -2
- package/lib/esm/indexes/generator.d.ts +1 -1
- package/lib/esm/indexes/generator.js +1 -1
- package/lib/esm/indexes/index.d.ts +0 -1
- package/lib/esm/indexes/index.js +1 -2
- package/lib/esm/interfaces/CouchDBRepository.d.ts +1 -1
- package/lib/esm/interfaces/CouchDBRepository.js +1 -1
- package/lib/esm/query/FromClause.d.ts +1 -1
- package/lib/esm/query/FromClause.js +1 -1
- package/lib/esm/query/InsertClause.d.ts +1 -1
- package/lib/esm/query/InsertClause.js +1 -1
- package/lib/esm/query/Paginator.d.ts +1 -1
- package/lib/esm/query/Paginator.js +1 -1
- package/lib/esm/query/SelectClause.d.ts +1 -1
- package/lib/esm/query/SelectClause.js +1 -1
- package/lib/esm/query/Statement.d.ts +3 -3
- package/lib/esm/query/Statement.js +1 -1
- package/lib/esm/query/ValuesClause.d.ts +1 -1
- package/lib/esm/query/ValuesClause.js +1 -1
- package/lib/esm/query/WhereClause.d.ts +1 -1
- package/lib/esm/query/WhereClause.js +1 -1
- package/lib/esm/query/constants.d.ts +1 -1
- package/lib/esm/query/constants.js +1 -1
- package/lib/esm/query/factory.d.ts +1 -1
- package/lib/esm/query/factory.js +1 -1
- package/lib/esm/query/translate.d.ts +1 -1
- package/lib/esm/query/translate.js +1 -1
- package/lib/esm/types.d.ts +358 -0
- package/lib/esm/types.js +3 -0
- package/lib/esm/utils.d.ts +3 -3
- package/lib/esm/utils.js +1 -1
- package/lib/index.cjs +5 -2
- package/lib/index.d.ts +4 -1
- package/lib/indexes/generator.cjs +1 -1
- package/lib/indexes/generator.d.ts +1 -1
- package/lib/indexes/index.cjs +1 -2
- package/lib/indexes/index.d.ts +0 -1
- package/lib/interfaces/CouchDBRepository.cjs +1 -1
- package/lib/interfaces/CouchDBRepository.d.ts +1 -1
- package/lib/query/FromClause.cjs +1 -1
- package/lib/query/FromClause.d.ts +1 -1
- package/lib/query/InsertClause.cjs +1 -1
- package/lib/query/InsertClause.d.ts +1 -1
- package/lib/query/Paginator.cjs +1 -1
- package/lib/query/Paginator.d.ts +1 -1
- package/lib/query/SelectClause.cjs +1 -1
- package/lib/query/SelectClause.d.ts +1 -1
- package/lib/query/Statement.cjs +1 -1
- package/lib/query/Statement.d.ts +3 -3
- package/lib/query/ValuesClause.cjs +1 -1
- package/lib/query/ValuesClause.d.ts +1 -1
- package/lib/query/WhereClause.cjs +1 -1
- package/lib/query/WhereClause.d.ts +1 -1
- package/lib/query/constants.cjs +1 -1
- package/lib/query/constants.d.ts +1 -1
- package/lib/query/factory.cjs +1 -1
- package/lib/query/factory.d.ts +1 -1
- package/lib/query/translate.cjs +1 -1
- package/lib/query/translate.d.ts +1 -1
- package/lib/types.cjs +4 -0
- package/lib/types.d.ts +358 -0
- package/lib/utils.cjs +1 -1
- package/lib/utils.d.ts +3 -3
- package/package.json +10 -16
- package/lib/esm/indexes/types.d.ts +0 -11
- package/lib/esm/indexes/types.js +0 -3
- package/lib/indexes/types.cjs +0 -4
- package/lib/indexes/types.d.ts +0 -11
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
version: "3.9"
|
|
2
|
+
|
|
3
|
+
services:
|
|
4
|
+
replica-0:
|
|
5
|
+
image: ghcr.io/decaf-ts/couchdb:latest
|
|
6
|
+
hostname: replica-0
|
|
7
|
+
container_name: replica-0
|
|
8
|
+
restart: always
|
|
9
|
+
environment:
|
|
10
|
+
COUCHDB_USER: ${COUCHDB_USER}
|
|
11
|
+
COUCHDB_PASSWORD: ${COUCHDB_PASSWORD}
|
|
12
|
+
COUCHDB_SECRET: ${COUCHDB_SECRET}
|
|
13
|
+
NODENAME: replica-0.${COMPOSE_PROJECT_NAME}
|
|
14
|
+
ERL_FLAGS: "-setcookie ${COUCHDB_COOKIE}"
|
|
15
|
+
networks:
|
|
16
|
+
replicas_net:
|
|
17
|
+
aliases:
|
|
18
|
+
- replica-0.${COMPOSE_PROJECT_NAME}
|
|
19
|
+
ports:
|
|
20
|
+
- "${PORT_BASE}0:5984"
|
|
21
|
+
volumes:
|
|
22
|
+
- couch-replica-0:/opt/couchdb/data
|
|
23
|
+
- cfg-replica-0:/opt/couchdb/etc/local.d
|
|
24
|
+
healthcheck:
|
|
25
|
+
test: curl -f http://localhost:5984/ || exit 1
|
|
26
|
+
interval: 3s
|
|
27
|
+
timeout: 3s
|
|
28
|
+
retries: 10
|
|
29
|
+
replica-1:
|
|
30
|
+
image: ghcr.io/decaf-ts/couchdb:latest
|
|
31
|
+
hostname: replica-1
|
|
32
|
+
container_name: replica-1
|
|
33
|
+
restart: always
|
|
34
|
+
environment:
|
|
35
|
+
COUCHDB_USER: ${COUCHDB_USER}
|
|
36
|
+
COUCHDB_PASSWORD: ${COUCHDB_PASSWORD}
|
|
37
|
+
COUCHDB_SECRET: ${COUCHDB_SECRET}
|
|
38
|
+
NODENAME: replica-1.${COMPOSE_PROJECT_NAME}
|
|
39
|
+
ERL_FLAGS: "-setcookie ${COUCHDB_COOKIE}"
|
|
40
|
+
networks:
|
|
41
|
+
replicas_net:
|
|
42
|
+
aliases:
|
|
43
|
+
- replica-1.${COMPOSE_PROJECT_NAME}
|
|
44
|
+
ports:
|
|
45
|
+
- "${PORT_BASE}1:5984"
|
|
46
|
+
volumes:
|
|
47
|
+
- couch-replica-1:/opt/couchdb/data
|
|
48
|
+
- cfg-replica-1:/opt/couchdb/etc/local.d
|
|
49
|
+
healthcheck:
|
|
50
|
+
test: curl -f http://localhost:5984/ || exit 1
|
|
51
|
+
interval: 3s
|
|
52
|
+
timeout: 3s
|
|
53
|
+
retries: 10
|
|
54
|
+
replica-2:
|
|
55
|
+
image: ghcr.io/decaf-ts/couchdb:latest
|
|
56
|
+
hostname: replica-2
|
|
57
|
+
container_name: replica-2
|
|
58
|
+
restart: always
|
|
59
|
+
environment:
|
|
60
|
+
COUCHDB_USER: ${COUCHDB_USER}
|
|
61
|
+
COUCHDB_PASSWORD: ${COUCHDB_PASSWORD}
|
|
62
|
+
COUCHDB_SECRET: ${COUCHDB_SECRET}
|
|
63
|
+
NODENAME: replica-2.${COMPOSE_PROJECT_NAME}
|
|
64
|
+
ERL_FLAGS: "-setcookie ${COUCHDB_COOKIE}"
|
|
65
|
+
networks:
|
|
66
|
+
replicas_net:
|
|
67
|
+
aliases:
|
|
68
|
+
- replica-2.${COMPOSE_PROJECT_NAME}
|
|
69
|
+
ports:
|
|
70
|
+
- "${PORT_BASE}2:5984"
|
|
71
|
+
volumes:
|
|
72
|
+
- couch-replica-2:/opt/couchdb/data
|
|
73
|
+
- cfg-replica-2:/opt/couchdb/etc/local.d
|
|
74
|
+
healthcheck:
|
|
75
|
+
test: curl -f http://localhost:5984/ || exit 1
|
|
76
|
+
interval: 3s
|
|
77
|
+
timeout: 3s
|
|
78
|
+
retries: 10
|
|
79
|
+
booter:
|
|
80
|
+
image: ghcr.io/decaf-ts/couchdb-booter:latest
|
|
81
|
+
container_name: cluster-booter
|
|
82
|
+
hostname: cluster-booter
|
|
83
|
+
restart: on-failure
|
|
84
|
+
depends_on:
|
|
85
|
+
replica-0:
|
|
86
|
+
condition: service_healthy
|
|
87
|
+
replica-1:
|
|
88
|
+
condition: service_healthy
|
|
89
|
+
replica-2:
|
|
90
|
+
condition: service_healthy
|
|
91
|
+
networks:
|
|
92
|
+
replicas_net:
|
|
93
|
+
aliases:
|
|
94
|
+
- booter.${COMPOSE_PROJECT_NAME}
|
|
95
|
+
environment:
|
|
96
|
+
COORDINATOR_HOST: replica-0.${COMPOSE_PROJECT_NAME}
|
|
97
|
+
REPLICA1_HOST: replica-1.${COMPOSE_PROJECT_NAME}
|
|
98
|
+
REPLICA2_HOST: replica-2.${COMPOSE_PROJECT_NAME}
|
|
99
|
+
|
|
100
|
+
networks:
|
|
101
|
+
replicas_net:
|
|
102
|
+
|
|
103
|
+
volumes:
|
|
104
|
+
couch-replica-0:
|
|
105
|
+
cfg-replica-0:
|
|
106
|
+
couch-replica-1:
|
|
107
|
+
cfg-replica-1:
|
|
108
|
+
couch-replica-2:
|
|
109
|
+
cfg-replica-2:
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
#!/bin/bash -e
|
|
2
|
+
|
|
3
|
+
echo "Booting clustered"
|
|
4
|
+
|
|
5
|
+
source .env
|
|
6
|
+
|
|
7
|
+
DEPLOYMENT_NAME=${COMPOSE_PROJECT_NAME}
|
|
8
|
+
IFS=","
|
|
9
|
+
COORDINATOR_NODE="0"
|
|
10
|
+
|
|
11
|
+
OUTER_PORT=$([ -z "$COORDINATOR_HOST" ] && echo "${PORT_BASE}0" || echo "5984")
|
|
12
|
+
|
|
13
|
+
COORDINATOR_HOST=$([ -z "$COORDINATOR_HOST" ] && echo "127.0.0.1" || echo "$COORDINATOR_HOST")
|
|
14
|
+
REPLICA1_HOST=$([ -z "$REPLICA1_HOST" ] && echo "127.0.0.1" || echo "$REPLICA1_HOST")
|
|
15
|
+
REPLICA2_HOST=$([ -z "$REPLICA2_HOST" ] && echo "127.0.0.1" || echo "$REPLICA2_HOST")
|
|
16
|
+
ADDITIONAL_NODES="1,2"
|
|
17
|
+
ALL_NODES="${COORDINATOR_NODE},${ADDITIONAL_NODES}"
|
|
18
|
+
HOSTS=("${COORDINATOR_HOST}" "${REPLICA1_HOST}" "${REPLICA2_HOST}")
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
# check if already running and clustered, and if so, exit
|
|
22
|
+
curl -s "http://${COUCHDB_USER}:${COUCHDB_PASSWORD}@${COORDINATOR_HOST}:${OUTER_PORT}/_cluster_setup"
|
|
23
|
+
STATUS=$(curl -s "http://${COUCHDB_USER}:${COUCHDB_PASSWORD}@${COORDINATOR_HOST}:${OUTER_PORT}/_cluster_setup")
|
|
24
|
+
|
|
25
|
+
if [[ "$STATUS" =~ "cluster_finished" ]]; then
|
|
26
|
+
echo "Cluster already set up"
|
|
27
|
+
exit 0
|
|
28
|
+
else
|
|
29
|
+
echo "Setting up cluster"
|
|
30
|
+
fi
|
|
31
|
+
|
|
32
|
+
# https://docs.couchdb.org/en/stable/setup/single-node.html
|
|
33
|
+
|
|
34
|
+
for NODE_ID in $ALL_NODES
|
|
35
|
+
do
|
|
36
|
+
PORT=$([ "$OUTER_PORT" == "5984" ] && echo "$OUTER_PORT" || echo "${PORT_BASE}${NODE_ID}")
|
|
37
|
+
curl -X PUT "${COUCHDB_USER}:${COUCHDB_PASSWORD}@${HOSTS[${NODE_ID}]}:${PORT}/_users"
|
|
38
|
+
curl -X PUT "http://${COUCHDB_USER}:${COUCHDB_PASSWORD}@${HOSTS[${NODE_ID}]}:${PORT}/_replicator"
|
|
39
|
+
done
|
|
40
|
+
|
|
41
|
+
# see https://docs.couchdb.org/en/master/setup/cluster.html
|
|
42
|
+
|
|
43
|
+
for NODE_ID in $COORDINATOR_NODE
|
|
44
|
+
do
|
|
45
|
+
curl -X POST -H "Content-Type: application/json" "http://${COUCHDB_USER}:${COUCHDB_PASSWORD}@${COORDINATOR_HOST}:${OUTER_PORT}/_cluster_setup" \
|
|
46
|
+
-d '{"action": "enable_cluster", "bind_address":"0.0.0.0", "username": "'"${COUCHDB_USER}"'", "password":"'"${COUCHDB_USER}"'", "node_count":"3"}'
|
|
47
|
+
echo You may safely ignore the warning above.
|
|
48
|
+
done
|
|
49
|
+
|
|
50
|
+
for NODE_ID in $ADDITIONAL_NODES
|
|
51
|
+
do
|
|
52
|
+
curl -X POST -H "Content-Type: application/json" "http://${COUCHDB_USER}:${COUCHDB_PASSWORD}@${COORDINATOR_HOST}:${OUTER_PORT}/_cluster_setup" -d '{"action": "enable_cluster", "bind_address":"0.0.0.0", "username": "'"${COUCHDB_USER}"'", "password":"'"${COUCHDB_PASSWORD}"'", "port": 5984, "node_count": "3", "remote_node": "'"replica-${NODE_ID}.${DEPLOYMENT_NAME}"'", "remote_current_user": "'"${COUCHDB_USER}"'", "remote_current_password": "'"${COUCHDB_PASSWORD}"'" }'
|
|
53
|
+
curl -X POST -H "Content-Type: application/json" "http://${COUCHDB_USER}:${COUCHDB_PASSWORD}@${COORDINATOR_HOST}:${OUTER_PORT}/_cluster_setup" -d '{"action": "add_node", "host":"'"replica-${NODE_ID}.${DEPLOYMENT_NAME}"'", "port": 5984, "username": "'"${COUCHDB_USER}"'", "password":"'"${COUCHDB_PASSWORD}"'"}'
|
|
54
|
+
done
|
|
55
|
+
|
|
56
|
+
curl -s "http://${COUCHDB_USER}:${COUCHDB_PASSWORD}@${COORDINATOR_HOST}:${OUTER_PORT}/_cluster_setup"
|
|
57
|
+
|
|
58
|
+
curl -s "http://${COUCHDB_USER}:${COUCHDB_PASSWORD}@${COORDINATOR_HOST}:${OUTER_PORT}/_membership"
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
echo Your cluster nodes are available at:
|
|
62
|
+
for NODE_ID in ${ALL_NODES}
|
|
63
|
+
do
|
|
64
|
+
PORT=$([ "$OUTER_PORT" == "5984" ] && echo "$OUTER_PORT" || echo "${PORT_BASE}${NODE_ID}")
|
|
65
|
+
echo "http://${COUCHDB_USER}:<password>@${HOSTS[${NODE_ID}]}:${PORT}"
|
|
66
|
+
done
|
package/lib/adapter.cjs
CHANGED
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.CouchDBAdapter = void 0;
|
|
4
4
|
const core_1 = require("@decaf-ts/core");
|
|
5
|
-
const Nano = require("nano");
|
|
6
5
|
const constants_1 = require("./constants.cjs");
|
|
7
6
|
const db_decorators_1 = require("@decaf-ts/db-decorators");
|
|
8
7
|
require("reflect-metadata");
|
|
@@ -68,15 +67,6 @@ class CouchDBAdapter extends core_1.Adapter {
|
|
|
68
67
|
throw new db_decorators_1.ConflictError(`Index for table ${name} with id ${id}`);
|
|
69
68
|
}
|
|
70
69
|
}
|
|
71
|
-
async user() {
|
|
72
|
-
try {
|
|
73
|
-
const user = await this.native[constants_1.CouchDBKeys.NATIVE].session();
|
|
74
|
-
return user.userCtx.name;
|
|
75
|
-
}
|
|
76
|
-
catch (e) {
|
|
77
|
-
throw this.parseError(e);
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
70
|
async raw(rawInput, process = true) {
|
|
81
71
|
try {
|
|
82
72
|
const response = await this.native.find(rawInput);
|
|
@@ -249,84 +239,7 @@ class CouchDBAdapter extends core_1.Adapter {
|
|
|
249
239
|
return new db_decorators_1.InternalError(err);
|
|
250
240
|
}
|
|
251
241
|
}
|
|
252
|
-
static connect(user, pass, host = "localhost:5984", protocol = "http") {
|
|
253
|
-
return Nano(`${protocol}://${user}:${pass}@${host}`);
|
|
254
|
-
}
|
|
255
|
-
static async createDatabase(con, name) {
|
|
256
|
-
let result;
|
|
257
|
-
try {
|
|
258
|
-
result = await con.db.create(name);
|
|
259
|
-
}
|
|
260
|
-
catch (e) {
|
|
261
|
-
throw this.parseError(e);
|
|
262
|
-
}
|
|
263
|
-
const { ok, error, reason } = result;
|
|
264
|
-
if (!ok)
|
|
265
|
-
throw this.parseError(error, reason);
|
|
266
|
-
}
|
|
267
|
-
static async deleteDatabase(con, name) {
|
|
268
|
-
let result;
|
|
269
|
-
try {
|
|
270
|
-
result = await con.db.destroy(name);
|
|
271
|
-
}
|
|
272
|
-
catch (e) {
|
|
273
|
-
throw this.parseError(e);
|
|
274
|
-
}
|
|
275
|
-
const { ok } = result;
|
|
276
|
-
if (!ok)
|
|
277
|
-
throw new db_decorators_1.InternalError(`Failed to delete database with name ${name}`);
|
|
278
|
-
}
|
|
279
|
-
static async createUser(con, dbName, user, pass, roles = ["reader", "writer"]) {
|
|
280
|
-
const users = await con.db.use("_users");
|
|
281
|
-
const usr = {
|
|
282
|
-
_id: "org.couchdb.user:" + user,
|
|
283
|
-
name: user,
|
|
284
|
-
password: pass,
|
|
285
|
-
roles: roles,
|
|
286
|
-
type: "user",
|
|
287
|
-
};
|
|
288
|
-
try {
|
|
289
|
-
const created = await users.insert(usr);
|
|
290
|
-
const { ok } = created;
|
|
291
|
-
if (!ok)
|
|
292
|
-
throw new db_decorators_1.InternalError(`Failed to create user ${user}`);
|
|
293
|
-
const security = await con.request({
|
|
294
|
-
db: dbName,
|
|
295
|
-
method: "put",
|
|
296
|
-
path: "_security",
|
|
297
|
-
// headers: {
|
|
298
|
-
//
|
|
299
|
-
// },
|
|
300
|
-
body: {
|
|
301
|
-
admins: {
|
|
302
|
-
names: [user],
|
|
303
|
-
roles: [],
|
|
304
|
-
},
|
|
305
|
-
members: {
|
|
306
|
-
names: [user],
|
|
307
|
-
roles: roles,
|
|
308
|
-
},
|
|
309
|
-
},
|
|
310
|
-
});
|
|
311
|
-
if (!security.ok)
|
|
312
|
-
throw new db_decorators_1.InternalError(`Failed to authorize user ${user} to db ${dbName}`);
|
|
313
|
-
}
|
|
314
|
-
catch (e) {
|
|
315
|
-
throw this.parseError(e);
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
static async deleteUser(con, dbName, user) {
|
|
319
|
-
const users = await con.db.use("_users");
|
|
320
|
-
const id = "org.couchdb.user:" + user;
|
|
321
|
-
try {
|
|
322
|
-
const usr = await users.get(id);
|
|
323
|
-
await users.destroy(id, usr._rev);
|
|
324
|
-
}
|
|
325
|
-
catch (e) {
|
|
326
|
-
throw this.parseError(e);
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
242
|
}
|
|
330
243
|
exports.CouchDBAdapter = CouchDBAdapter;
|
|
331
244
|
|
|
332
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,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QUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNoQyxNQUFNLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwQyxDQUFDO1FBQUMsT0FBTyxDQUFNLEVBQUUsQ0FBQztZQUNoQixNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0IsQ0FBQztJQUNILENBQUM7Q0FDRjtBQTlYRCx3Q0E4WEMiLCJmaWxlIjoiYWRhcHRlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFkYXB0ZXIsXG4gIFNlcXVlbmNlLFxuICBTZXF1ZW5jZU9wdGlvbnMsXG4gIFBlcnNpc3RlbmNlS2V5cyxcbiAgT3BlcmF0b3IsXG4gIEdyb3VwT3BlcmF0b3IsXG4gIFN0YXRlbWVudCxcbiAgUXVlcnksXG4gIENsYXVzZUZhY3RvcnksXG4gIENvbmRpdGlvbixcbiAgQ29ubmVjdGlvbkVycm9yLFxuICBSZXBvc2l0b3J5LFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7XG4gIE1hbmdvUXVlcnksXG4gIERvY3VtZW50U2NvcGUsXG4gIERvY3VtZW50SW5zZXJ0UmVzcG9uc2UsXG4gIERvY3VtZW50R2V0UmVzcG9uc2UsXG4gIFNlcnZlclNjb3BlLFxuICBEYXRhYmFzZUNyZWF0ZVJlc3BvbnNlLFxuICBNYXliZURvY3VtZW50LFxuICBNYW5nb1Jlc3BvbnNlLFxuICBNYW5nb1NlbGVjdG9yLFxuICBEb2N1bWVudEJ1bGtSZXNwb25zZSxcbiAgTWFuZ29PcGVyYXRvcixcbiAgRGF0YWJhc2VTZXNzaW9uUmVzcG9uc2UsXG4gIENyZWF0ZUluZGV4UmVxdWVzdCxcbn0gZnJvbSBcIm5hbm9cIjtcbmltcG9ydCAqIGFzIE5hbm8gZnJvbSBcIm5hbm9cIjtcbmltcG9ydCB7IENvdWNoREJLZXlzLCByZXNlcnZlZEF0dHJpYnV0ZXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIEJhc2VFcnJvcixcbiAgQ29uZmxpY3RFcnJvcixcbiAgSW50ZXJuYWxFcnJvcixcbiAgTm90Rm91bmRFcnJvcixcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgXCJyZWZsZWN0LW1ldGFkYXRhXCI7XG5pbXBvcnQgeyBDb3VjaERCU3RhdGVtZW50IH0gZnJvbSBcIi4vcXVlcnkvU3RhdGVtZW50XCI7XG5pbXBvcnQgeyBGYWN0b3J5IH0gZnJvbSBcIi4vcXVlcnlcIjtcbmltcG9ydCB7IHRyYW5zbGF0ZU9wZXJhdG9ycyB9IGZyb20gXCIuL3F1ZXJ5L3RyYW5zbGF0ZVwiO1xuaW1wb3J0IHsgQ291Y2hEQlNlcXVlbmNlIH0gZnJvbSBcIi4vc2VxdWVuY2VzL1NlcXVlbmNlXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBJbmRleEVycm9yIH0gZnJvbSBcIi4vZXJyb3JzXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZUluZGV4ZXMgfSBmcm9tIFwiLi9pbmRleGVzL2dlbmVyYXRvclwiO1xuXG5leHBvcnQgY2xhc3MgQ291Y2hEQkFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVyPERvY3VtZW50U2NvcGU8YW55PiwgTWFuZ29RdWVyeT4ge1xuICBwcml2YXRlIGZhY3Rvcnk/OiBGYWN0b3J5O1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBEb2N1bWVudFNjb3BlPGFueT4sIGZsYXZvdXI6IHN0cmluZykge1xuICAgIHN1cGVyKHNjb3BlLCBmbGF2b3VyKTtcbiAgfVxuXG4gIGdldCBDbGF1c2VzKCk6IENsYXVzZUZhY3Rvcnk8RG9jdW1lbnRTY29wZTxhbnk+LCBNYW5nb1F1ZXJ5PiB7XG4gICAgaWYgKCF0aGlzLmZhY3RvcnkpIHRoaXMuZmFjdG9yeSA9IG5ldyBGYWN0b3J5KHRoaXMpO1xuICAgIHJldHVybiB0aGlzLmZhY3Rvcnk7XG4gIH1cblxuICBRdWVyeTxNIGV4dGVuZHMgTW9kZWw+KCk6IFF1ZXJ5PE1hbmdvUXVlcnksIE0+IHtcbiAgICByZXR1cm4gc3VwZXIuUXVlcnkoKTtcbiAgfVxuXG4gIGdldCBTdGF0ZW1lbnQoKTogU3RhdGVtZW50PE1hbmdvUXVlcnk+IHtcbiAgICByZXR1cm4gbmV3IENvdWNoREJTdGF0ZW1lbnQodGhpcyk7XG4gIH1cblxuICBwYXJzZUNvbmRpdGlvbihjb25kaXRpb246IENvbmRpdGlvbik6IE1hbmdvUXVlcnkge1xuICAgIGZ1bmN0aW9uIG1lcmdlKFxuICAgICAgb3A6IE1hbmdvT3BlcmF0b3IsXG4gICAgICBvYmoxOiBNYW5nb1NlbGVjdG9yLFxuICAgICAgb2JqMjogTWFuZ29TZWxlY3RvclxuICAgICk6IE1hbmdvUXVlcnkge1xuICAgICAgY29uc3QgcmVzdWx0OiBNYW5nb1F1ZXJ5ID0geyBzZWxlY3Rvcjoge30gYXMgTWFuZ29TZWxlY3RvciB9O1xuICAgICAgcmVzdWx0LnNlbGVjdG9yW29wXSA9IFtvYmoxLCBvYmoyXTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgY29uc3QgeyBhdHRyMSwgb3BlcmF0b3IsIGNvbXBhcmlzb24gfSA9IGNvbmRpdGlvbiBhcyB1bmtub3duIGFzIHtcbiAgICAgIGF0dHIxOiBzdHJpbmcgfCBDb25kaXRpb247XG4gICAgICBvcGVyYXRvcjogT3BlcmF0b3IgfCBHcm91cE9wZXJhdG9yO1xuICAgICAgY29tcGFyaXNvbjogYW55O1xuICAgIH07XG5cbiAgICBsZXQgb3A6IE1hbmdvU2VsZWN0b3IgPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgIGlmIChcbiAgICAgIFtHcm91cE9wZXJhdG9yLkFORCwgR3JvdXBPcGVyYXRvci5PUiwgT3BlcmF0b3IuTk9UXS5pbmRleE9mKFxuICAgICAgICBvcGVyYXRvciBhcyBHcm91cE9wZXJhdG9yXG4gICAgICApID09PSAtMVxuICAgICkge1xuICAgICAgb3BbYXR0cjEgYXMgc3RyaW5nXSA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICAob3BbYXR0cjEgYXMgc3RyaW5nXSBhcyBNYW5nb1NlbGVjdG9yKVt0cmFuc2xhdGVPcGVyYXRvcnMob3BlcmF0b3IpXSA9XG4gICAgICAgIGNvbXBhcmlzb247XG4gICAgfSBlbHNlIGlmIChvcGVyYXRvciA9PT0gT3BlcmF0b3IuTk9UKSB7XG4gICAgICBvcCA9IHRoaXMucGFyc2VDb25kaXRpb24oYXR0cjEgYXMgQ29uZGl0aW9uKS5zZWxlY3RvciBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgb3BbdHJhbnNsYXRlT3BlcmF0b3JzKE9wZXJhdG9yLk5PVCldID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIChvcFt0cmFuc2xhdGVPcGVyYXRvcnMoT3BlcmF0b3IuTk9UKV0gYXMgTWFuZ29TZWxlY3RvcilbXG4gICAgICAgIChhdHRyMSBhcyB1bmtub3duIGFzIHsgYXR0cjE6IHN0cmluZyB9KS5hdHRyMVxuICAgICAgXSA9IGNvbXBhcmlzb247XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG9wMTogYW55ID0gdGhpcy5wYXJzZUNvbmRpdGlvbihhdHRyMSBhcyBDb25kaXRpb24pLnNlbGVjdG9yO1xuICAgICAgY29uc3Qgb3AyOiBhbnkgPSB0aGlzLnBhcnNlQ29uZGl0aW9uKGNvbXBhcmlzb24gYXMgQ29uZGl0aW9uKS5zZWxlY3RvcjtcbiAgICAgIG9wID0gbWVyZ2UodHJhbnNsYXRlT3BlcmF0b3JzKG9wZXJhdG9yKSwgb3AxLCBvcDIpLnNlbGVjdG9yO1xuICAgIH1cblxuICAgIHJldHVybiB7IHNlbGVjdG9yOiBvcCB9O1xuICB9XG5cbiAgYXN5bmMgU2VxdWVuY2Uob3B0aW9uczogU2VxdWVuY2VPcHRpb25zKTogUHJvbWlzZTxTZXF1ZW5jZT4ge1xuICAgIHJldHVybiBuZXcgQ291Y2hEQlNlcXVlbmNlKG9wdGlvbnMpO1xuICB9XG5cbiAgYXN5bmMgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBtYW5hZ2VkTW9kZWxzID0gQWRhcHRlci5tb2RlbHModGhpcy5mbGF2b3VyKTtcbiAgICByZXR1cm4gdGhpcy5pbmRleCguLi5tYW5hZ2VkTW9kZWxzKTtcbiAgfVxuXG4gIGFzeW5jIGluZGV4PE0gZXh0ZW5kcyBNb2RlbD4oLi4ubW9kZWxzOiBDb25zdHJ1Y3RvcjxNPltdKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBpbmRleGVzOiBDcmVhdGVJbmRleFJlcXVlc3RbXSA9IGdlbmVyYXRlSW5kZXhlcyhtb2RlbHMpO1xuICAgIGZvciAoY29uc3QgaW5kZXggb2YgaW5kZXhlcykge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5uYXRpdmUuY3JlYXRlSW5kZXgoaW5kZXgpO1xuICAgICAgY29uc3QgeyByZXN1bHQsIGlkLCBuYW1lIH0gPSByZXM7XG4gICAgICBpZiAocmVzdWx0ID09PSBcImV4aXN0aW5nXCIpXG4gICAgICAgIHRocm93IG5ldyBDb25mbGljdEVycm9yKGBJbmRleCBmb3IgdGFibGUgJHtuYW1lfSB3aXRoIGlkICR7aWR9YCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgdXNlcigpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdXNlcjogRGF0YWJhc2VTZXNzaW9uUmVzcG9uc2UgPSBhd2FpdCAoXG4gICAgICAgICh0aGlzLm5hdGl2ZSBhcyBhbnkpW0NvdWNoREJLZXlzLk5BVElWRV0gYXMgU2VydmVyU2NvcGVcbiAgICAgICkuc2Vzc2lvbigpO1xuICAgICAgcmV0dXJuIHVzZXIudXNlckN0eC5uYW1lO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHJhdzxWPihyYXdJbnB1dDogTWFuZ29RdWVyeSwgcHJvY2VzcyA9IHRydWUpOiBQcm9taXNlPFY+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2U6IE1hbmdvUmVzcG9uc2U8Vj4gPSBhd2FpdCB0aGlzLm5hdGl2ZS5maW5kKHJhd0lucHV0KTtcbiAgICAgIGlmIChwcm9jZXNzKSByZXR1cm4gcmVzcG9uc2UuZG9jcyBhcyBWO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlIGFzIFY7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgY3JlYXRlKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgcmVjb3JkW0NvdWNoREJLZXlzLlRBQkxFXSA9IHRhYmxlTmFtZTtcbiAgICByZWNvcmRbQ291Y2hEQktleXMuSURdID0gdGhpcy5nZW5lcmF0ZUlkKHRhYmxlTmFtZSwgaWQpO1xuICAgIE9iamVjdC5hc3NpZ24ocmVjb3JkLCBtb2RlbCk7XG4gICAgbGV0IHJlc3BvbnNlOiBEb2N1bWVudEluc2VydFJlc3BvbnNlO1xuICAgIHRyeSB7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IHRoaXMubmF0aXZlLmluc2VydChyZWNvcmQpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH1cblxuICAgIGlmICghcmVzcG9uc2Uub2spXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byBpbnNlcnQgZG9jIGlkOiAke2lkfSBpbiB0YWJsZSAke3RhYmxlTmFtZX1gXG4gICAgICApO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2RlbCwgUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBLCB7XG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB2YWx1ZTogcmVzcG9uc2UucmV2LFxuICAgIH0pO1xuICAgIHJldHVybiBtb2RlbDtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZUFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZHM6IHN0cmluZ1tdIHwgbnVtYmVyW10sXG4gICAgbW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBpZiAoaWRzLmxlbmd0aCAhPT0gbW9kZWxzLmxlbmd0aClcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiSWRzIGFuZCBtb2RlbHMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aFwiKTtcblxuICAgIGNvbnN0IHJlY29yZHMgPSBpZHMubWFwKChpZCwgY291bnQpID0+IHtcbiAgICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgICAgcmVjb3JkW0NvdWNoREJLZXlzLlRBQkxFXSA9IHRhYmxlTmFtZTtcbiAgICAgIHJlY29yZFtDb3VjaERCS2V5cy5JRF0gPSB0aGlzLmdlbmVyYXRlSWQodGFibGVOYW1lLCBpZCk7XG4gICAgICBPYmplY3QuYXNzaWduKHJlY29yZCwgbW9kZWxzW2NvdW50XSk7XG4gICAgICByZXR1cm4gcmVjb3JkO1xuICAgIH0pO1xuICAgIGxldCByZXNwb25zZTogRG9jdW1lbnRCdWxrUmVzcG9uc2VbXTtcbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLm5hdGl2ZS5idWxrKHsgZG9jczogcmVjb3JkcyB9KTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9XG4gICAgaWYgKCFyZXNwb25zZS5ldmVyeSgocikgPT4gIXIuZXJyb3IpKSB7XG4gICAgICBjb25zdCBlcnJvcnMgPSByZXNwb25zZS5yZWR1Y2UoKGFjY3VtOiBzdHJpbmdbXSwgZWwsIGkpID0+IHtcbiAgICAgICAgaWYgKGVsLmVycm9yKVxuICAgICAgICAgIGFjY3VtLnB1c2goXG4gICAgICAgICAgICBgZWwgJHtpfTogJHtlbC5lcnJvcn0ke2VsLnJlYXNvbiA/IGAgLSAke2VsLnJlYXNvbn1gIDogXCJcIn1gXG4gICAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgfSwgW10pO1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoZXJyb3JzLmpvaW4oXCJcXG5cIikpO1xuICAgIH1cblxuICAgIG1vZGVscy5mb3JFYWNoKChtLCBpKSA9PiB7XG4gICAgICBSZXBvc2l0b3J5LnNldE1ldGFkYXRhKG0gYXMgYW55LCByZXNwb25zZVtpXS5yZXYpO1xuICAgICAgcmV0dXJuIG07XG4gICAgfSk7XG4gICAgcmV0dXJuIG1vZGVscztcbiAgfVxuXG4gIGFzeW5jIHJlYWQoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlclxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCBfaWQgPSB0aGlzLmdlbmVyYXRlSWQodGFibGVOYW1lLCBpZCk7XG4gICAgbGV0IHJlY29yZDogRG9jdW1lbnRHZXRSZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgcmVjb3JkID0gYXdhaXQgdGhpcy5uYXRpdmUuZ2V0KF9pZCk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZWNvcmQsIFBlcnNpc3RlbmNlS2V5cy5NRVRBREFUQSwge1xuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB2YWx1ZTogcmVjb3JkLl9yZXYsXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlY29yZDtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIHJlY29yZFtDb3VjaERCS2V5cy5UQUJMRV0gPSB0YWJsZU5hbWU7XG4gICAgcmVjb3JkW0NvdWNoREJLZXlzLklEXSA9IHRoaXMuZ2VuZXJhdGVJZCh0YWJsZU5hbWUsIGlkKTtcbiAgICBjb25zdCByZXYgPSBtb2RlbFtQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEFdO1xuICAgIGlmICghcmV2KVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBObyByZXZpc2lvbiBudW1iZXIgZm91bmQgZm9yIHJlY29yZCB3aXRoIGlkICR7aWR9YFxuICAgICAgKTtcbiAgICBPYmplY3QuYXNzaWduKHJlY29yZCwgbW9kZWwpO1xuICAgIHJlY29yZFtDb3VjaERCS2V5cy5SRVZdID0gcmV2O1xuICAgIGxldCByZXNwb25zZTogRG9jdW1lbnRJbnNlcnRSZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLm5hdGl2ZS5pbnNlcnQocmVjb3JkKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9XG5cbiAgICBpZiAoIXJlc3BvbnNlLm9rKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gdXBkYXRlIGRvYyBpZDogJHtpZH0gaW4gdGFibGUgJHt0YWJsZU5hbWV9YFxuICAgICAgKTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kZWwsIFBlcnNpc3RlbmNlS2V5cy5NRVRBREFUQSwge1xuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgdmFsdWU6IHJlc3BvbnNlLnJldixcbiAgICB9KTtcbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICBhc3luYyBkZWxldGUoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlclxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCBfaWQgPSB0aGlzLmdlbmVyYXRlSWQodGFibGVOYW1lLCBpZCk7XG4gICAgbGV0IHJlY29yZDogRG9jdW1lbnRHZXRSZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgcmVjb3JkID0gYXdhaXQgdGhpcy5uYXRpdmUuZ2V0KF9pZCk7XG4gICAgICBhd2FpdCB0aGlzLm5hdGl2ZS5kZXN0cm95KF9pZCwgcmVjb3JkLl9yZXYpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVjb3JkLCBQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEEsIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIHZhbHVlOiByZWNvcmQuX3JldixcbiAgICB9KTtcbiAgICByZXR1cm4gcmVjb3JkO1xuICB9XG5cbiAgcHJpdmF0ZSBnZW5lcmF0ZUlkKHRhYmxlTmFtZTogc3RyaW5nLCBpZDogc3RyaW5nIHwgbnVtYmVyKSB7XG4gICAgcmV0dXJuIFt0YWJsZU5hbWUsIGlkXS5qb2luKENvdWNoREJLZXlzLlNFUEFSQVRPUik7XG4gIH1cblxuICBwcm90ZWN0ZWQgcGFyc2VFcnJvcihlcnI6IEVycm9yIHwgc3RyaW5nLCByZWFzb24/OiBzdHJpbmcpOiBCYXNlRXJyb3Ige1xuICAgIHJldHVybiBDb3VjaERCQWRhcHRlci5wYXJzZUVycm9yKGVyciwgcmVhc29uKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpc1Jlc2VydmVkKGF0dHI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIWF0dHIubWF0Y2gocmVzZXJ2ZWRBdHRyaWJ1dGVzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGF0aWMgcGFyc2VFcnJvcihlcnI6IEVycm9yIHwgc3RyaW5nLCByZWFzb24/OiBzdHJpbmcpOiBCYXNlRXJyb3Ige1xuICAgIGlmIChlcnIgaW5zdGFuY2VvZiBCYXNlRXJyb3IpIHJldHVybiBlcnIgYXMgYW55O1xuICAgIGxldCBjb2RlOiBzdHJpbmcgPSBcIlwiO1xuICAgIGlmICh0eXBlb2YgZXJyID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBjb2RlID0gZXJyO1xuICAgICAgaWYgKGNvZGUubWF0Y2goL2FscmVhZHkgZXhpc3R8dXBkYXRlIGNvbmZsaWN0L2cpKVxuICAgICAgICByZXR1cm4gbmV3IENvbmZsaWN0RXJyb3IoY29kZSk7XG4gICAgICBpZiAoY29kZS5tYXRjaCgvbWlzc2luZ3xkZWxldGVkL2cpKSByZXR1cm4gbmV3IE5vdEZvdW5kRXJyb3IoY29kZSk7XG4gICAgfSBlbHNlIGlmICgoZXJyIGFzIGFueSkuY29kZSkge1xuICAgICAgY29kZSA9IChlcnIgYXMgYW55KS5jb2RlO1xuICAgICAgcmVhc29uID0gcmVhc29uIHx8IGVyci5tZXNzYWdlO1xuICAgIH0gZWxzZSBpZiAoKGVyciBhcyBhbnkpLnN0YXR1c0NvZGUpIHtcbiAgICAgIGNvZGUgPSAoZXJyIGFzIGFueSkuc3RhdHVzQ29kZTtcbiAgICAgIHJlYXNvbiA9IHJlYXNvbiB8fCBlcnIubWVzc2FnZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29kZSA9IGVyci5tZXNzYWdlO1xuICAgIH1cblxuICAgIHN3aXRjaCAoY29kZS50b1N0cmluZygpKSB7XG4gICAgICBjYXNlIFwiNDAxXCI6XG4gICAgICBjYXNlIFwiNDEyXCI6XG4gICAgICBjYXNlIFwiNDA5XCI6XG4gICAgICAgIHJldHVybiBuZXcgQ29uZmxpY3RFcnJvcihyZWFzb24gYXMgc3RyaW5nKTtcbiAgICAgIGNhc2UgXCI0MDRcIjpcbiAgICAgICAgcmV0dXJuIG5ldyBOb3RGb3VuZEVycm9yKHJlYXNvbiBhcyBzdHJpbmcpO1xuICAgICAgY2FzZSBcIjQwMFwiOlxuICAgICAgICBpZiAoY29kZS50b1N0cmluZygpLm1hdGNoKC9Ob1xcc2luZGV4XFxzZXhpc3RzL2cpKVxuICAgICAgICAgIHJldHVybiBuZXcgSW5kZXhFcnJvcihlcnIpO1xuICAgICAgICByZXR1cm4gbmV3IEludGVybmFsRXJyb3IoZXJyKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChjb2RlLnRvU3RyaW5nKCkubWF0Y2goL0VDT05OUkVGVVNFRC9nKSlcbiAgICAgICAgICByZXR1cm4gbmV3IENvbm5lY3Rpb25FcnJvcihlcnIpO1xuICAgICAgICByZXR1cm4gbmV3IEludGVybmFsRXJyb3IoZXJyKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgY29ubmVjdChcbiAgICB1c2VyOiBzdHJpbmcsXG4gICAgcGFzczogc3RyaW5nLFxuICAgIGhvc3QgPSBcImxvY2FsaG9zdDo1OTg0XCIsXG4gICAgcHJvdG9jb2w6IFwiaHR0cFwiIHwgXCJodHRwc1wiID0gXCJodHRwXCJcbiAgKTogU2VydmVyU2NvcGUge1xuICAgIHJldHVybiBOYW5vKGAke3Byb3RvY29sfTovLyR7dXNlcn06JHtwYXNzfUAke2hvc3R9YCk7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgY3JlYXRlRGF0YWJhc2UoY29uOiBTZXJ2ZXJTY29wZSwgbmFtZTogc3RyaW5nKSB7XG4gICAgbGV0IHJlc3VsdDogRGF0YWJhc2VDcmVhdGVSZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgY29uLmRiLmNyZWF0ZShuYW1lKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9XG4gICAgY29uc3QgeyBvaywgZXJyb3IsIHJlYXNvbiB9ID0gcmVzdWx0O1xuICAgIGlmICghb2spIHRocm93IHRoaXMucGFyc2VFcnJvcihlcnJvciBhcyBzdHJpbmcsIHJlYXNvbik7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgZGVsZXRlRGF0YWJhc2UoY29uOiBTZXJ2ZXJTY29wZSwgbmFtZTogc3RyaW5nKSB7XG4gICAgbGV0IHJlc3VsdDtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgY29uLmRiLmRlc3Ryb3kobmFtZSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICAgIGNvbnN0IHsgb2sgfSA9IHJlc3VsdDtcbiAgICBpZiAoIW9rKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYEZhaWxlZCB0byBkZWxldGUgZGF0YWJhc2Ugd2l0aCBuYW1lICR7bmFtZX1gKTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBjcmVhdGVVc2VyKFxuICAgIGNvbjogU2VydmVyU2NvcGUsXG4gICAgZGJOYW1lOiBzdHJpbmcsXG4gICAgdXNlcjogc3RyaW5nLFxuICAgIHBhc3M6IHN0cmluZyxcbiAgICByb2xlczogc3RyaW5nW10gPSBbXCJyZWFkZXJcIiwgXCJ3cml0ZXJcIl1cbiAgKSB7XG4gICAgY29uc3QgdXNlcnMgPSBhd2FpdCBjb24uZGIudXNlKFwiX3VzZXJzXCIpO1xuICAgIGNvbnN0IHVzciA9IHtcbiAgICAgIF9pZDogXCJvcmcuY291Y2hkYi51c2VyOlwiICsgdXNlcixcbiAgICAgIG5hbWU6IHVzZXIsXG4gICAgICBwYXNzd29yZDogcGFzcyxcbiAgICAgIHJvbGVzOiByb2xlcyxcbiAgICAgIHR5cGU6IFwidXNlclwiLFxuICAgIH07XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNyZWF0ZWQ6IERvY3VtZW50SW5zZXJ0UmVzcG9uc2UgPSBhd2FpdCB1c2Vycy5pbnNlcnQoXG4gICAgICAgIHVzciBhcyBNYXliZURvY3VtZW50XG4gICAgICApO1xuICAgICAgY29uc3QgeyBvayB9ID0gY3JlYXRlZDtcbiAgICAgIGlmICghb2spIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIHVzZXIgJHt1c2VyfWApO1xuICAgICAgY29uc3Qgc2VjdXJpdHk6IGFueSA9IGF3YWl0IGNvbi5yZXF1ZXN0KHtcbiAgICAgICAgZGI6IGRiTmFtZSxcbiAgICAgICAgbWV0aG9kOiBcInB1dFwiLFxuICAgICAgICBwYXRoOiBcIl9zZWN1cml0eVwiLFxuICAgICAgICAvLyBoZWFkZXJzOiB7XG4gICAgICAgIC8vXG4gICAgICAgIC8vIH0sXG4gICAgICAgIGJvZHk6IHtcbiAgICAgICAgICBhZG1pbnM6IHtcbiAgICAgICAgICAgIG5hbWVzOiBbdXNlcl0sXG4gICAgICAgICAgICByb2xlczogW10sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBtZW1iZXJzOiB7XG4gICAgICAgICAgICBuYW1lczogW3VzZXJdLFxuICAgICAgICAgICAgcm9sZXM6IHJvbGVzLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGlmICghc2VjdXJpdHkub2spXG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBGYWlsZWQgdG8gYXV0aG9yaXplIHVzZXIgJHt1c2VyfSB0byBkYiAke2RiTmFtZX1gXG4gICAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGFzeW5jIGRlbGV0ZVVzZXIoY29uOiBTZXJ2ZXJTY29wZSwgZGJOYW1lOiBzdHJpbmcsIHVzZXI6IHN0cmluZykge1xuICAgIGNvbnN0IHVzZXJzID0gYXdhaXQgY29uLmRiLnVzZShcIl91c2Vyc1wiKTtcbiAgICBjb25zdCBpZCA9IFwib3JnLmNvdWNoZGIudXNlcjpcIiArIHVzZXI7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVzciA9IGF3YWl0IHVzZXJzLmdldChpZCk7XG4gICAgICBhd2FpdCB1c2Vycy5kZXN0cm95KGlkLCB1c3IuX3Jldik7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
245
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,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bUJBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDN0IsT0FBTyxJQUFJLDZCQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDaEM7Z0JBQ0UsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQztvQkFDeEMsT0FBTyxJQUFJLHNCQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2xDLE9BQU8sSUFBSSw2QkFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUE3UkQsd0NBNlJDIiwiZmlsZSI6ImFkYXB0ZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZGFwdGVyLFxuICBTZXF1ZW5jZSxcbiAgU2VxdWVuY2VPcHRpb25zLFxuICBQZXJzaXN0ZW5jZUtleXMsXG4gIE9wZXJhdG9yLFxuICBHcm91cE9wZXJhdG9yLFxuICBTdGF0ZW1lbnQsXG4gIFF1ZXJ5LFxuICBDbGF1c2VGYWN0b3J5LFxuICBDb25kaXRpb24sXG4gIENvbm5lY3Rpb25FcnJvcixcbiAgUmVwb3NpdG9yeSxcbiAgVXNlcixcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBDb3VjaERCS2V5cywgcmVzZXJ2ZWRBdHRyaWJ1dGVzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBCYXNlRXJyb3IsXG4gIENvbmZsaWN0RXJyb3IsXG4gIEludGVybmFsRXJyb3IsXG4gIE5vdEZvdW5kRXJyb3IsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IFwicmVmbGVjdC1tZXRhZGF0YVwiO1xuaW1wb3J0IHsgQ291Y2hEQlN0YXRlbWVudCB9IGZyb20gXCIuL3F1ZXJ5L1N0YXRlbWVudFwiO1xuaW1wb3J0IHsgRmFjdG9yeSB9IGZyb20gXCIuL3F1ZXJ5XCI7XG5pbXBvcnQgeyB0cmFuc2xhdGVPcGVyYXRvcnMgfSBmcm9tIFwiLi9xdWVyeS90cmFuc2xhdGVcIjtcbmltcG9ydCB7IENvdWNoREJTZXF1ZW5jZSB9IGZyb20gXCIuL3NlcXVlbmNlcy9TZXF1ZW5jZVwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgSW5kZXhFcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuaW1wb3J0IHsgZ2VuZXJhdGVJbmRleGVzIH0gZnJvbSBcIi4vaW5kZXhlcy9nZW5lcmF0b3JcIjtcbmltcG9ydCB7XG4gIENyZWF0ZUluZGV4UmVxdWVzdCxcbiAgRG9jdW1lbnRCdWxrUmVzcG9uc2UsXG4gIERvY3VtZW50R2V0UmVzcG9uc2UsXG4gIERvY3VtZW50SW5zZXJ0UmVzcG9uc2UsXG4gIERvY3VtZW50U2NvcGUsXG4gIE1hbmdvT3BlcmF0b3IsXG4gIE1hbmdvUXVlcnksXG4gIE1hbmdvUmVzcG9uc2UsXG4gIE1hbmdvU2VsZWN0b3IsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDb3VjaERCQWRhcHRlciBleHRlbmRzIEFkYXB0ZXI8XG4gIERvY3VtZW50U2NvcGU8YW55PixcbiAgTWFuZ29RdWVyeVxuPiB7XG4gIHByb3RlY3RlZCBmYWN0b3J5PzogRmFjdG9yeTtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3Ioc2NvcGU6IERvY3VtZW50U2NvcGU8YW55PiwgZmxhdm91cjogc3RyaW5nKSB7XG4gICAgc3VwZXIoc2NvcGUsIGZsYXZvdXIpO1xuICB9XG5cbiAgZ2V0IENsYXVzZXMoKTogQ2xhdXNlRmFjdG9yeTxEb2N1bWVudFNjb3BlPGFueT4sIE1hbmdvUXVlcnk+IHtcbiAgICBpZiAoIXRoaXMuZmFjdG9yeSkgdGhpcy5mYWN0b3J5ID0gbmV3IEZhY3RvcnkodGhpcyk7XG4gICAgcmV0dXJuIHRoaXMuZmFjdG9yeTtcbiAgfVxuXG4gIFF1ZXJ5PE0gZXh0ZW5kcyBNb2RlbD4oKTogUXVlcnk8TWFuZ29RdWVyeSwgTT4ge1xuICAgIHJldHVybiBzdXBlci5RdWVyeSgpO1xuICB9XG5cbiAgZ2V0IFN0YXRlbWVudCgpOiBTdGF0ZW1lbnQ8TWFuZ29RdWVyeT4ge1xuICAgIHJldHVybiBuZXcgQ291Y2hEQlN0YXRlbWVudCh0aGlzKTtcbiAgfVxuXG4gIHBhcnNlQ29uZGl0aW9uKGNvbmRpdGlvbjogQ29uZGl0aW9uKTogTWFuZ29RdWVyeSB7XG4gICAgZnVuY3Rpb24gbWVyZ2UoXG4gICAgICBvcDogTWFuZ29PcGVyYXRvcixcbiAgICAgIG9iajE6IE1hbmdvU2VsZWN0b3IsXG4gICAgICBvYmoyOiBNYW5nb1NlbGVjdG9yXG4gICAgKTogTWFuZ29RdWVyeSB7XG4gICAgICBjb25zdCByZXN1bHQ6IE1hbmdvUXVlcnkgPSB7IHNlbGVjdG9yOiB7fSBhcyBNYW5nb1NlbGVjdG9yIH07XG4gICAgICByZXN1bHQuc2VsZWN0b3Jbb3BdID0gW29iajEsIG9iajJdO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBjb25zdCB7IGF0dHIxLCBvcGVyYXRvciwgY29tcGFyaXNvbiB9ID0gY29uZGl0aW9uIGFzIHVua25vd24gYXMge1xuICAgICAgYXR0cjE6IHN0cmluZyB8IENvbmRpdGlvbjtcbiAgICAgIG9wZXJhdG9yOiBPcGVyYXRvciB8IEdyb3VwT3BlcmF0b3I7XG4gICAgICBjb21wYXJpc29uOiBhbnk7XG4gICAgfTtcblxuICAgIGxldCBvcDogTWFuZ29TZWxlY3RvciA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgaWYgKFxuICAgICAgW0dyb3VwT3BlcmF0b3IuQU5ELCBHcm91cE9wZXJhdG9yLk9SLCBPcGVyYXRvci5OT1RdLmluZGV4T2YoXG4gICAgICAgIG9wZXJhdG9yIGFzIEdyb3VwT3BlcmF0b3JcbiAgICAgICkgPT09IC0xXG4gICAgKSB7XG4gICAgICBvcFthdHRyMSBhcyBzdHJpbmddID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIChvcFthdHRyMSBhcyBzdHJpbmddIGFzIE1hbmdvU2VsZWN0b3IpW3RyYW5zbGF0ZU9wZXJhdG9ycyhvcGVyYXRvcildID1cbiAgICAgICAgY29tcGFyaXNvbjtcbiAgICB9IGVsc2UgaWYgKG9wZXJhdG9yID09PSBPcGVyYXRvci5OT1QpIHtcbiAgICAgIG9wID0gdGhpcy5wYXJzZUNvbmRpdGlvbihhdHRyMSBhcyBDb25kaXRpb24pLnNlbGVjdG9yIGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICBvcFt0cmFuc2xhdGVPcGVyYXRvcnMoT3BlcmF0b3IuTk9UKV0gPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgKG9wW3RyYW5zbGF0ZU9wZXJhdG9ycyhPcGVyYXRvci5OT1QpXSBhcyBNYW5nb1NlbGVjdG9yKVtcbiAgICAgICAgKGF0dHIxIGFzIHVua25vd24gYXMgeyBhdHRyMTogc3RyaW5nIH0pLmF0dHIxXG4gICAgICBdID0gY29tcGFyaXNvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgb3AxOiBhbnkgPSB0aGlzLnBhcnNlQ29uZGl0aW9uKGF0dHIxIGFzIENvbmRpdGlvbikuc2VsZWN0b3I7XG4gICAgICBjb25zdCBvcDI6IGFueSA9IHRoaXMucGFyc2VDb25kaXRpb24oY29tcGFyaXNvbiBhcyBDb25kaXRpb24pLnNlbGVjdG9yO1xuICAgICAgb3AgPSBtZXJnZSh0cmFuc2xhdGVPcGVyYXRvcnMob3BlcmF0b3IpLCBvcDEsIG9wMikuc2VsZWN0b3I7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgc2VsZWN0b3I6IG9wIH07XG4gIH1cblxuICBhc3luYyBTZXF1ZW5jZShvcHRpb25zOiBTZXF1ZW5jZU9wdGlvbnMpOiBQcm9taXNlPFNlcXVlbmNlPiB7XG4gICAgcmV0dXJuIG5ldyBDb3VjaERCU2VxdWVuY2Uob3B0aW9ucyk7XG4gIH1cblxuICBhc3luYyBpbml0aWFsaXplKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG1hbmFnZWRNb2RlbHMgPSBBZGFwdGVyLm1vZGVscyh0aGlzLmZsYXZvdXIpO1xuICAgIHJldHVybiB0aGlzLmluZGV4KC4uLm1hbmFnZWRNb2RlbHMpO1xuICB9XG5cbiAgYXN5bmMgaW5kZXg8TSBleHRlbmRzIE1vZGVsPiguLi5tb2RlbHM6IENvbnN0cnVjdG9yPE0+W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBpbmRleGVzOiBDcmVhdGVJbmRleFJlcXVlc3RbXSA9IGdlbmVyYXRlSW5kZXhlcyhtb2RlbHMpO1xuICAgIGZvciAoY29uc3QgaW5kZXggb2YgaW5kZXhlcykge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5uYXRpdmUuY3JlYXRlSW5kZXgoaW5kZXgpO1xuICAgICAgY29uc3QgeyByZXN1bHQsIGlkLCBuYW1lIH0gPSByZXM7XG4gICAgICBpZiAocmVzdWx0ID09PSBcImV4aXN0aW5nXCIpXG4gICAgICAgIHRocm93IG5ldyBDb25mbGljdEVycm9yKGBJbmRleCBmb3IgdGFibGUgJHtuYW1lfSB3aXRoIGlkICR7aWR9YCk7XG4gICAgfVxuICB9XG5cbiAgYWJzdHJhY3QgdXNlcigpOiBQcm9taXNlPFVzZXI+O1xuXG4gIGFzeW5jIHJhdzxWPihyYXdJbnB1dDogTWFuZ29RdWVyeSwgcHJvY2VzcyA9IHRydWUpOiBQcm9taXNlPFY+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2U6IE1hbmdvUmVzcG9uc2U8Vj4gPSBhd2FpdCB0aGlzLm5hdGl2ZS5maW5kKHJhd0lucHV0KTtcbiAgICAgIGlmIChwcm9jZXNzKSByZXR1cm4gcmVzcG9uc2UuZG9jcyBhcyBWO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlIGFzIFY7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgY3JlYXRlKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgcmVjb3JkW0NvdWNoREJLZXlzLlRBQkxFXSA9IHRhYmxlTmFtZTtcbiAgICByZWNvcmRbQ291Y2hEQktleXMuSURdID0gdGhpcy5nZW5lcmF0ZUlkKHRhYmxlTmFtZSwgaWQpO1xuICAgIE9iamVjdC5hc3NpZ24ocmVjb3JkLCBtb2RlbCk7XG4gICAgbGV0IHJlc3BvbnNlOiBEb2N1bWVudEluc2VydFJlc3BvbnNlO1xuICAgIHRyeSB7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IHRoaXMubmF0aXZlLmluc2VydChyZWNvcmQpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH1cblxuICAgIGlmICghcmVzcG9uc2Uub2spXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byBpbnNlcnQgZG9jIGlkOiAke2lkfSBpbiB0YWJsZSAke3RhYmxlTmFtZX1gXG4gICAgICApO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2RlbCwgUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBLCB7XG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB2YWx1ZTogcmVzcG9uc2UucmV2LFxuICAgIH0pO1xuICAgIHJldHVybiBtb2RlbDtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZUFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZHM6IHN0cmluZ1tdIHwgbnVtYmVyW10sXG4gICAgbW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBpZiAoaWRzLmxlbmd0aCAhPT0gbW9kZWxzLmxlbmd0aClcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiSWRzIGFuZCBtb2RlbHMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aFwiKTtcblxuICAgIGNvbnN0IHJlY29yZHMgPSBpZHMubWFwKChpZCwgY291bnQpID0+IHtcbiAgICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgICAgcmVjb3JkW0NvdWNoREJLZXlzLlRBQkxFXSA9IHRhYmxlTmFtZTtcbiAgICAgIHJlY29yZFtDb3VjaERCS2V5cy5JRF0gPSB0aGlzLmdlbmVyYXRlSWQodGFibGVOYW1lLCBpZCk7XG4gICAgICBPYmplY3QuYXNzaWduKHJlY29yZCwgbW9kZWxzW2NvdW50XSk7XG4gICAgICByZXR1cm4gcmVjb3JkO1xuICAgIH0pO1xuICAgIGxldCByZXNwb25zZTogRG9jdW1lbnRCdWxrUmVzcG9uc2VbXTtcbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLm5hdGl2ZS5idWxrKHsgZG9jczogcmVjb3JkcyB9KTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9XG4gICAgaWYgKCFyZXNwb25zZS5ldmVyeSgocikgPT4gIXIuZXJyb3IpKSB7XG4gICAgICBjb25zdCBlcnJvcnMgPSByZXNwb25zZS5yZWR1Y2UoKGFjY3VtOiBzdHJpbmdbXSwgZWwsIGkpID0+IHtcbiAgICAgICAgaWYgKGVsLmVycm9yKVxuICAgICAgICAgIGFjY3VtLnB1c2goXG4gICAgICAgICAgICBgZWwgJHtpfTogJHtlbC5lcnJvcn0ke2VsLnJlYXNvbiA/IGAgLSAke2VsLnJlYXNvbn1gIDogXCJcIn1gXG4gICAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgfSwgW10pO1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoZXJyb3JzLmpvaW4oXCJcXG5cIikpO1xuICAgIH1cblxuICAgIG1vZGVscy5mb3JFYWNoKChtLCBpKSA9PiB7XG4gICAgICBSZXBvc2l0b3J5LnNldE1ldGFkYXRhKG0gYXMgYW55LCByZXNwb25zZVtpXS5yZXYpO1xuICAgICAgcmV0dXJuIG07XG4gICAgfSk7XG4gICAgcmV0dXJuIG1vZGVscztcbiAgfVxuXG4gIGFzeW5jIHJlYWQoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlclxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCBfaWQgPSB0aGlzLmdlbmVyYXRlSWQodGFibGVOYW1lLCBpZCk7XG4gICAgbGV0IHJlY29yZDogRG9jdW1lbnRHZXRSZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgcmVjb3JkID0gYXdhaXQgdGhpcy5uYXRpdmUuZ2V0KF9pZCk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZWNvcmQsIFBlcnNpc3RlbmNlS2V5cy5NRVRBREFUQSwge1xuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB2YWx1ZTogcmVjb3JkLl9yZXYsXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlY29yZDtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIHJlY29yZFtDb3VjaERCS2V5cy5UQUJMRV0gPSB0YWJsZU5hbWU7XG4gICAgcmVjb3JkW0NvdWNoREJLZXlzLklEXSA9IHRoaXMuZ2VuZXJhdGVJZCh0YWJsZU5hbWUsIGlkKTtcbiAgICBjb25zdCByZXYgPSBtb2RlbFtQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEFdO1xuICAgIGlmICghcmV2KVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBObyByZXZpc2lvbiBudW1iZXIgZm91bmQgZm9yIHJlY29yZCB3aXRoIGlkICR7aWR9YFxuICAgICAgKTtcbiAgICBPYmplY3QuYXNzaWduKHJlY29yZCwgbW9kZWwpO1xuICAgIHJlY29yZFtDb3VjaERCS2V5cy5SRVZdID0gcmV2O1xuICAgIGxldCByZXNwb25zZTogRG9jdW1lbnRJbnNlcnRSZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLm5hdGl2ZS5pbnNlcnQocmVjb3JkKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9XG5cbiAgICBpZiAoIXJlc3BvbnNlLm9rKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gdXBkYXRlIGRvYyBpZDogJHtpZH0gaW4gdGFibGUgJHt0YWJsZU5hbWV9YFxuICAgICAgKTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kZWwsIFBlcnNpc3RlbmNlS2V5cy5NRVRBREFUQSwge1xuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgdmFsdWU6IHJlc3BvbnNlLnJldixcbiAgICB9KTtcbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICBhc3luYyBkZWxldGUoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlclxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCBfaWQgPSB0aGlzLmdlbmVyYXRlSWQodGFibGVOYW1lLCBpZCk7XG4gICAgbGV0IHJlY29yZDogRG9jdW1lbnRHZXRSZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgcmVjb3JkID0gYXdhaXQgdGhpcy5uYXRpdmUuZ2V0KF9pZCk7XG4gICAgICBhd2FpdCB0aGlzLm5hdGl2ZS5kZXN0cm95KF9pZCwgcmVjb3JkLl9yZXYpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVjb3JkLCBQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEEsIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIHZhbHVlOiByZWNvcmQuX3JldixcbiAgICB9KTtcbiAgICByZXR1cm4gcmVjb3JkO1xuICB9XG5cbiAgcHJpdmF0ZSBnZW5lcmF0ZUlkKHRhYmxlTmFtZTogc3RyaW5nLCBpZDogc3RyaW5nIHwgbnVtYmVyKSB7XG4gICAgcmV0dXJuIFt0YWJsZU5hbWUsIGlkXS5qb2luKENvdWNoREJLZXlzLlNFUEFSQVRPUik7XG4gIH1cblxuICBwcm90ZWN0ZWQgcGFyc2VFcnJvcihlcnI6IEVycm9yIHwgc3RyaW5nLCByZWFzb24/OiBzdHJpbmcpOiBCYXNlRXJyb3Ige1xuICAgIHJldHVybiBDb3VjaERCQWRhcHRlci5wYXJzZUVycm9yKGVyciwgcmVhc29uKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpc1Jlc2VydmVkKGF0dHI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIWF0dHIubWF0Y2gocmVzZXJ2ZWRBdHRyaWJ1dGVzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGF0aWMgcGFyc2VFcnJvcihlcnI6IEVycm9yIHwgc3RyaW5nLCByZWFzb24/OiBzdHJpbmcpOiBCYXNlRXJyb3Ige1xuICAgIGlmIChlcnIgaW5zdGFuY2VvZiBCYXNlRXJyb3IpIHJldHVybiBlcnIgYXMgYW55O1xuICAgIGxldCBjb2RlOiBzdHJpbmcgPSBcIlwiO1xuICAgIGlmICh0eXBlb2YgZXJyID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBjb2RlID0gZXJyO1xuICAgICAgaWYgKGNvZGUubWF0Y2goL2FscmVhZHkgZXhpc3R8dXBkYXRlIGNvbmZsaWN0L2cpKVxuICAgICAgICByZXR1cm4gbmV3IENvbmZsaWN0RXJyb3IoY29kZSk7XG4gICAgICBpZiAoY29kZS5tYXRjaCgvbWlzc2luZ3xkZWxldGVkL2cpKSByZXR1cm4gbmV3IE5vdEZvdW5kRXJyb3IoY29kZSk7XG4gICAgfSBlbHNlIGlmICgoZXJyIGFzIGFueSkuY29kZSkge1xuICAgICAgY29kZSA9IChlcnIgYXMgYW55KS5jb2RlO1xuICAgICAgcmVhc29uID0gcmVhc29uIHx8IGVyci5tZXNzYWdlO1xuICAgIH0gZWxzZSBpZiAoKGVyciBhcyBhbnkpLnN0YXR1c0NvZGUpIHtcbiAgICAgIGNvZGUgPSAoZXJyIGFzIGFueSkuc3RhdHVzQ29kZTtcbiAgICAgIHJlYXNvbiA9IHJlYXNvbiB8fCBlcnIubWVzc2FnZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29kZSA9IGVyci5tZXNzYWdlO1xuICAgIH1cblxuICAgIHN3aXRjaCAoY29kZS50b1N0cmluZygpKSB7XG4gICAgICBjYXNlIFwiNDAxXCI6XG4gICAgICBjYXNlIFwiNDEyXCI6XG4gICAgICBjYXNlIFwiNDA5XCI6XG4gICAgICAgIHJldHVybiBuZXcgQ29uZmxpY3RFcnJvcihyZWFzb24gYXMgc3RyaW5nKTtcbiAgICAgIGNhc2UgXCI0MDRcIjpcbiAgICAgICAgcmV0dXJuIG5ldyBOb3RGb3VuZEVycm9yKHJlYXNvbiBhcyBzdHJpbmcpO1xuICAgICAgY2FzZSBcIjQwMFwiOlxuICAgICAgICBpZiAoY29kZS50b1N0cmluZygpLm1hdGNoKC9Ob1xcc2luZGV4XFxzZXhpc3RzL2cpKVxuICAgICAgICAgIHJldHVybiBuZXcgSW5kZXhFcnJvcihlcnIpO1xuICAgICAgICByZXR1cm4gbmV3IEludGVybmFsRXJyb3IoZXJyKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChjb2RlLnRvU3RyaW5nKCkubWF0Y2goL0VDT05OUkVGVVNFRC9nKSlcbiAgICAgICAgICByZXR1cm4gbmV3IENvbm5lY3Rpb25FcnJvcihlcnIpO1xuICAgICAgICByZXR1cm4gbmV3IEludGVybmFsRXJyb3IoZXJyKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
package/lib/adapter.d.ts
CHANGED
|
@@ -1,19 +1,20 @@
|
|
|
1
|
-
import { Adapter, Sequence, SequenceOptions, Statement, Query, ClauseFactory, Condition } from "@decaf-ts/core";
|
|
2
|
-
import { MangoQuery, DocumentScope, ServerScope } from "nano";
|
|
1
|
+
import { Adapter, Sequence, SequenceOptions, Statement, Query, ClauseFactory, Condition, User } from "@decaf-ts/core";
|
|
3
2
|
import { BaseError } from "@decaf-ts/db-decorators";
|
|
4
3
|
import "reflect-metadata";
|
|
4
|
+
import { Factory } from "./query";
|
|
5
5
|
import { Constructor, Model } from "@decaf-ts/decorator-validation";
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
import { DocumentScope, MangoQuery } from "./types";
|
|
7
|
+
export declare abstract class CouchDBAdapter extends Adapter<DocumentScope<any>, MangoQuery> {
|
|
8
|
+
protected factory?: Factory;
|
|
9
|
+
protected constructor(scope: DocumentScope<any>, flavour: string);
|
|
9
10
|
get Clauses(): ClauseFactory<DocumentScope<any>, MangoQuery>;
|
|
10
11
|
Query<M extends Model>(): Query<MangoQuery, M>;
|
|
11
12
|
get Statement(): Statement<MangoQuery>;
|
|
12
13
|
parseCondition(condition: Condition): MangoQuery;
|
|
13
14
|
Sequence(options: SequenceOptions): Promise<Sequence>;
|
|
14
15
|
initialize(): Promise<void>;
|
|
15
|
-
index<M extends Model>(...models: Constructor<M>[]): Promise<
|
|
16
|
-
user(): Promise<
|
|
16
|
+
index<M extends Model>(...models: Constructor<M>[]): Promise<void>;
|
|
17
|
+
abstract user(): Promise<User>;
|
|
17
18
|
raw<V>(rawInput: MangoQuery, process?: boolean): Promise<V>;
|
|
18
19
|
create(tableName: string, id: string | number, model: Record<string, any>): Promise<Record<string, any>>;
|
|
19
20
|
createAll(tableName: string, ids: string[] | number[], models: Record<string, any>[]): Promise<Record<string, any>[]>;
|
|
@@ -24,9 +25,4 @@ export declare class CouchDBAdapter extends Adapter<DocumentScope<any>, MangoQue
|
|
|
24
25
|
protected parseError(err: Error | string, reason?: string): BaseError;
|
|
25
26
|
protected isReserved(attr: string): boolean;
|
|
26
27
|
protected static parseError(err: Error | string, reason?: string): BaseError;
|
|
27
|
-
static connect(user: string, pass: string, host?: string, protocol?: "http" | "https"): ServerScope;
|
|
28
|
-
static createDatabase(con: ServerScope, name: string): Promise<void>;
|
|
29
|
-
static deleteDatabase(con: ServerScope, name: string): Promise<void>;
|
|
30
|
-
static createUser(con: ServerScope, dbName: string, user: string, pass: string, roles?: string[]): Promise<void>;
|
|
31
|
-
static deleteUser(con: ServerScope, dbName: string, user: string): Promise<void>;
|
|
32
28
|
}
|
package/lib/esm/adapter.d.ts
CHANGED
|
@@ -1,19 +1,20 @@
|
|
|
1
|
-
import { Adapter, Sequence, SequenceOptions, Statement, Query, ClauseFactory, Condition } from "@decaf-ts/core";
|
|
2
|
-
import { MangoQuery, DocumentScope, ServerScope } from "nano";
|
|
1
|
+
import { Adapter, Sequence, SequenceOptions, Statement, Query, ClauseFactory, Condition, User } from "@decaf-ts/core";
|
|
3
2
|
import { BaseError } from "@decaf-ts/db-decorators";
|
|
4
3
|
import "reflect-metadata";
|
|
4
|
+
import { Factory } from "./query";
|
|
5
5
|
import { Constructor, Model } from "@decaf-ts/decorator-validation";
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
import { DocumentScope, MangoQuery } from "./types";
|
|
7
|
+
export declare abstract class CouchDBAdapter extends Adapter<DocumentScope<any>, MangoQuery> {
|
|
8
|
+
protected factory?: Factory;
|
|
9
|
+
protected constructor(scope: DocumentScope<any>, flavour: string);
|
|
9
10
|
get Clauses(): ClauseFactory<DocumentScope<any>, MangoQuery>;
|
|
10
11
|
Query<M extends Model>(): Query<MangoQuery, M>;
|
|
11
12
|
get Statement(): Statement<MangoQuery>;
|
|
12
13
|
parseCondition(condition: Condition): MangoQuery;
|
|
13
14
|
Sequence(options: SequenceOptions): Promise<Sequence>;
|
|
14
15
|
initialize(): Promise<void>;
|
|
15
|
-
index<M extends Model>(...models: Constructor<M>[]): Promise<
|
|
16
|
-
user(): Promise<
|
|
16
|
+
index<M extends Model>(...models: Constructor<M>[]): Promise<void>;
|
|
17
|
+
abstract user(): Promise<User>;
|
|
17
18
|
raw<V>(rawInput: MangoQuery, process?: boolean): Promise<V>;
|
|
18
19
|
create(tableName: string, id: string | number, model: Record<string, any>): Promise<Record<string, any>>;
|
|
19
20
|
createAll(tableName: string, ids: string[] | number[], models: Record<string, any>[]): Promise<Record<string, any>[]>;
|
|
@@ -24,9 +25,4 @@ export declare class CouchDBAdapter extends Adapter<DocumentScope<any>, MangoQue
|
|
|
24
25
|
protected parseError(err: Error | string, reason?: string): BaseError;
|
|
25
26
|
protected isReserved(attr: string): boolean;
|
|
26
27
|
protected static parseError(err: Error | string, reason?: string): BaseError;
|
|
27
|
-
static connect(user: string, pass: string, host?: string, protocol?: "http" | "https"): ServerScope;
|
|
28
|
-
static createDatabase(con: ServerScope, name: string): Promise<void>;
|
|
29
|
-
static deleteDatabase(con: ServerScope, name: string): Promise<void>;
|
|
30
|
-
static createUser(con: ServerScope, dbName: string, user: string, pass: string, roles?: string[]): Promise<void>;
|
|
31
|
-
static deleteUser(con: ServerScope, dbName: string, user: string): Promise<void>;
|
|
32
28
|
}
|