@decaf-ts/core 0.5.0 → 0.5.2
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/LICENSE.md +21 -157
- package/README.md +652 -15
- package/dist/core.cjs +2638 -1085
- package/dist/core.esm.cjs +2636 -1070
- package/lib/esm/identity/decorators.d.ts +52 -14
- package/lib/esm/identity/decorators.js +54 -16
- package/lib/esm/identity/utils.d.ts +20 -1
- package/lib/esm/identity/utils.js +22 -2
- package/lib/esm/index.d.ts +11 -15
- package/lib/esm/index.js +17 -19
- package/lib/esm/interfaces/ErrorParser.d.ts +12 -0
- package/lib/esm/interfaces/ErrorParser.js +1 -1
- package/lib/esm/interfaces/Executor.d.ts +10 -13
- package/lib/esm/interfaces/Executor.js +1 -1
- package/lib/esm/interfaces/Observable.d.ts +20 -18
- package/lib/esm/interfaces/Observable.js +1 -1
- package/lib/esm/interfaces/Observer.d.ts +7 -8
- package/lib/esm/interfaces/Observer.js +1 -1
- package/lib/esm/interfaces/Paginatable.d.ts +18 -2
- package/lib/esm/interfaces/Paginatable.js +1 -1
- package/lib/esm/interfaces/Queriable.d.ts +44 -3
- package/lib/esm/interfaces/Queriable.js +1 -1
- package/lib/esm/interfaces/RawExecutor.d.ts +10 -13
- package/lib/esm/interfaces/RawExecutor.js +1 -1
- package/lib/esm/interfaces/SequenceOptions.d.ts +50 -5
- package/lib/esm/interfaces/SequenceOptions.js +19 -1
- package/lib/esm/interfaces/index.d.ts +0 -1
- package/lib/esm/interfaces/index.js +1 -2
- package/lib/esm/model/BaseModel.d.ts +31 -0
- package/lib/esm/model/BaseModel.js +24 -1
- package/lib/esm/model/construction.d.ts +442 -9
- package/lib/esm/model/construction.js +441 -2
- package/lib/esm/model/decorators.d.ts +166 -42
- package/lib/esm/model/decorators.js +161 -37
- package/lib/esm/model/index.js +1 -2
- package/lib/esm/model/types.d.ts +9 -0
- package/lib/esm/model/types.js +1 -1
- package/lib/esm/persistence/Adapter.d.ts +384 -40
- package/lib/esm/persistence/Adapter.js +415 -59
- package/lib/esm/persistence/Dispatch.d.ts +131 -0
- package/lib/esm/persistence/Dispatch.js +187 -0
- package/lib/esm/persistence/ObserverHandler.d.ts +109 -0
- package/lib/esm/persistence/ObserverHandler.js +137 -0
- package/lib/esm/persistence/Sequence.d.ts +89 -8
- package/lib/esm/persistence/Sequence.js +91 -1
- package/lib/esm/persistence/constants.d.ts +22 -5
- package/lib/esm/persistence/constants.js +23 -7
- package/lib/esm/persistence/decorators.d.ts +10 -0
- package/lib/esm/persistence/decorators.js +11 -1
- package/lib/esm/persistence/errors.d.ts +23 -3
- package/lib/esm/persistence/errors.js +25 -7
- package/lib/esm/persistence/index.d.ts +3 -0
- package/lib/esm/persistence/index.js +4 -1
- package/lib/esm/persistence/types.d.ts +21 -0
- package/lib/esm/persistence/types.js +2 -0
- package/lib/esm/query/Condition.d.ts +88 -44
- package/lib/esm/query/Condition.js +144 -62
- package/lib/esm/query/Paginator.d.ts +67 -10
- package/lib/esm/query/Paginator.js +64 -10
- package/lib/esm/query/Statement.d.ts +82 -47
- package/lib/esm/query/Statement.js +175 -122
- package/lib/esm/query/constants.d.ts +25 -64
- package/lib/esm/query/constants.js +26 -68
- package/lib/esm/query/errors.d.ts +14 -0
- package/lib/esm/query/errors.js +15 -1
- package/lib/esm/query/index.d.ts +0 -5
- package/lib/esm/query/index.js +1 -6
- package/lib/esm/query/options.d.ts +69 -178
- package/lib/esm/query/options.js +1 -1
- package/lib/esm/query/selectors.d.ts +20 -24
- package/lib/esm/query/selectors.js +1 -1
- package/lib/esm/ram/RamAdapter.d.ts +322 -20
- package/lib/esm/ram/RamAdapter.js +360 -140
- package/lib/esm/ram/RamContext.d.ts +16 -1
- package/lib/esm/ram/RamContext.js +18 -3
- package/lib/esm/ram/RamPaginator.d.ts +51 -6
- package/lib/esm/ram/RamPaginator.js +58 -6
- package/lib/esm/ram/RamSequence.d.ts +49 -24
- package/lib/esm/ram/RamSequence.js +52 -40
- package/lib/esm/ram/RamStatement.d.ts +84 -6
- package/lib/esm/ram/RamStatement.js +175 -6
- package/lib/esm/ram/constants.d.ts +9 -0
- package/lib/esm/ram/constants.js +10 -0
- package/lib/esm/ram/handlers.d.ts +25 -0
- package/lib/esm/ram/handlers.js +27 -0
- package/lib/esm/ram/index.d.ts +4 -4
- package/lib/esm/ram/index.js +9 -5
- package/lib/esm/ram/model/RamSequence.d.ts +21 -9
- package/lib/esm/ram/model/RamSequence.js +19 -1
- package/lib/esm/ram/types.d.ts +47 -5
- package/lib/esm/ram/types.js +1 -1
- package/lib/esm/repository/Repository.d.ts +381 -22
- package/lib/esm/repository/Repository.js +446 -43
- package/lib/esm/repository/constants.d.ts +23 -13
- package/lib/esm/repository/constants.js +24 -14
- package/lib/esm/repository/decorators.d.ts +27 -0
- package/lib/esm/repository/decorators.js +28 -1
- package/lib/esm/repository/errors.d.ts +12 -11
- package/lib/esm/repository/errors.js +13 -16
- package/lib/esm/repository/injectables.d.ts +18 -0
- package/lib/esm/repository/injectables.js +19 -1
- package/lib/esm/repository/types.d.ts +13 -1
- package/lib/esm/repository/types.js +1 -1
- package/lib/esm/repository/utils.d.ts +11 -0
- package/lib/esm/repository/utils.js +12 -1
- package/lib/esm/utils/decorators.d.ts +9 -0
- package/lib/esm/utils/decorators.js +19 -0
- package/lib/esm/utils/errors.d.ts +56 -0
- package/lib/esm/utils/errors.js +63 -0
- package/lib/esm/utils/index.d.ts +2 -0
- package/lib/esm/utils/index.js +3 -0
- package/lib/identity/decorators.cjs +54 -16
- package/lib/identity/decorators.d.ts +52 -14
- package/lib/identity/utils.cjs +22 -2
- package/lib/identity/utils.d.ts +20 -1
- package/lib/index.cjs +17 -19
- package/lib/index.d.ts +11 -15
- package/lib/interfaces/ErrorParser.cjs +1 -1
- package/lib/interfaces/ErrorParser.d.ts +12 -0
- package/lib/interfaces/Executor.cjs +1 -1
- package/lib/interfaces/Executor.d.ts +10 -13
- package/lib/interfaces/Observable.cjs +1 -1
- package/lib/interfaces/Observable.d.ts +20 -18
- package/lib/interfaces/Observer.cjs +1 -1
- package/lib/interfaces/Observer.d.ts +7 -8
- package/lib/interfaces/Paginatable.cjs +1 -1
- package/lib/interfaces/Paginatable.d.ts +18 -2
- package/lib/interfaces/Queriable.cjs +1 -1
- package/lib/interfaces/Queriable.d.ts +44 -3
- package/lib/interfaces/RawExecutor.cjs +1 -1
- package/lib/interfaces/RawExecutor.d.ts +10 -13
- package/lib/interfaces/SequenceOptions.cjs +19 -1
- package/lib/interfaces/SequenceOptions.d.ts +50 -5
- package/lib/interfaces/index.cjs +1 -2
- package/lib/interfaces/index.d.ts +0 -1
- package/lib/model/BaseModel.cjs +24 -1
- package/lib/model/BaseModel.d.ts +31 -0
- package/lib/model/construction.cjs +441 -2
- package/lib/model/construction.d.ts +442 -9
- package/lib/model/decorators.cjs +161 -37
- package/lib/model/decorators.d.ts +166 -42
- package/lib/model/index.cjs +1 -2
- package/lib/model/types.cjs +1 -1
- package/lib/model/types.d.ts +9 -0
- package/lib/persistence/Adapter.cjs +414 -58
- package/lib/persistence/Adapter.d.ts +384 -40
- package/lib/persistence/Dispatch.cjs +191 -0
- package/lib/persistence/Dispatch.d.ts +131 -0
- package/lib/persistence/ObserverHandler.cjs +141 -0
- package/lib/persistence/ObserverHandler.d.ts +109 -0
- package/lib/persistence/Sequence.cjs +91 -1
- package/lib/persistence/Sequence.d.ts +89 -8
- package/lib/persistence/constants.cjs +24 -8
- package/lib/persistence/constants.d.ts +22 -5
- package/lib/persistence/decorators.cjs +11 -1
- package/lib/persistence/decorators.d.ts +10 -0
- package/lib/persistence/errors.cjs +26 -9
- package/lib/persistence/errors.d.ts +23 -3
- package/lib/persistence/index.cjs +4 -1
- package/lib/persistence/index.d.ts +3 -0
- package/lib/persistence/types.cjs +3 -0
- package/lib/persistence/types.d.ts +21 -0
- package/lib/query/Condition.cjs +143 -61
- package/lib/query/Condition.d.ts +88 -44
- package/lib/query/Paginator.cjs +64 -10
- package/lib/query/Paginator.d.ts +67 -10
- package/lib/query/Statement.cjs +174 -121
- package/lib/query/Statement.d.ts +82 -47
- package/lib/query/constants.cjs +27 -69
- package/lib/query/constants.d.ts +25 -64
- package/lib/query/errors.cjs +15 -1
- package/lib/query/errors.d.ts +14 -0
- package/lib/query/index.cjs +1 -6
- package/lib/query/index.d.ts +0 -5
- package/lib/query/options.cjs +1 -1
- package/lib/query/options.d.ts +69 -178
- package/lib/query/selectors.cjs +1 -1
- package/lib/query/selectors.d.ts +20 -24
- package/lib/ram/RamAdapter.cjs +358 -172
- package/lib/ram/RamAdapter.d.ts +322 -20
- package/lib/ram/RamContext.cjs +18 -3
- package/lib/ram/RamContext.d.ts +16 -1
- package/lib/ram/RamPaginator.cjs +58 -6
- package/lib/ram/RamPaginator.d.ts +51 -6
- package/lib/ram/RamSequence.cjs +52 -41
- package/lib/ram/RamSequence.d.ts +49 -24
- package/lib/ram/RamStatement.cjs +175 -6
- package/lib/ram/RamStatement.d.ts +84 -6
- package/lib/ram/constants.cjs +13 -0
- package/lib/ram/constants.d.ts +9 -0
- package/lib/ram/handlers.cjs +30 -0
- package/lib/ram/handlers.d.ts +25 -0
- package/lib/ram/index.cjs +9 -5
- package/lib/ram/index.d.ts +4 -4
- package/lib/ram/model/RamSequence.cjs +19 -1
- package/lib/ram/model/RamSequence.d.ts +21 -9
- package/lib/ram/types.cjs +1 -1
- package/lib/ram/types.d.ts +47 -5
- package/lib/repository/Repository.cjs +445 -42
- package/lib/repository/Repository.d.ts +381 -22
- package/lib/repository/constants.cjs +24 -14
- package/lib/repository/constants.d.ts +23 -13
- package/lib/repository/decorators.cjs +28 -1
- package/lib/repository/decorators.d.ts +27 -0
- package/lib/repository/errors.cjs +14 -19
- package/lib/repository/errors.d.ts +12 -11
- package/lib/repository/injectables.cjs +19 -1
- package/lib/repository/injectables.d.ts +18 -0
- package/lib/repository/types.cjs +1 -1
- package/lib/repository/types.d.ts +13 -1
- package/lib/repository/utils.cjs +12 -1
- package/lib/repository/utils.d.ts +11 -0
- package/lib/utils/decorators.cjs +22 -0
- package/lib/utils/decorators.d.ts +9 -0
- package/lib/utils/errors.cjs +69 -0
- package/lib/utils/errors.d.ts +56 -0
- package/lib/{validators → utils}/index.cjs +2 -2
- package/lib/utils/index.d.ts +2 -0
- package/package.json +5 -5
- package/lib/esm/interfaces/Builder.d.ts +0 -16
- package/lib/esm/interfaces/Builder.js +0 -2
- package/lib/esm/model/IdentifiedBaseModel.d.ts +0 -7
- package/lib/esm/model/IdentifiedBaseModel.js +0 -25
- package/lib/esm/query/Clause.d.ts +0 -50
- package/lib/esm/query/Clause.js +0 -82
- package/lib/esm/query/ClauseFactory.d.ts +0 -71
- package/lib/esm/query/ClauseFactory.js +0 -6
- package/lib/esm/query/Query.d.ts +0 -43
- package/lib/esm/query/Query.js +0 -54
- package/lib/esm/query/clauses/FromClause.d.ts +0 -45
- package/lib/esm/query/clauses/FromClause.js +0 -59
- package/lib/esm/query/clauses/GroupByClause.d.ts +0 -21
- package/lib/esm/query/clauses/GroupByClause.js +0 -19
- package/lib/esm/query/clauses/InsertClause.d.ts +0 -37
- package/lib/esm/query/clauses/InsertClause.js +0 -55
- package/lib/esm/query/clauses/LimitClause.d.ts +0 -29
- package/lib/esm/query/clauses/LimitClause.js +0 -27
- package/lib/esm/query/clauses/OffsetClause.d.ts +0 -21
- package/lib/esm/query/clauses/OffsetClause.js +0 -19
- package/lib/esm/query/clauses/OrderByClause.d.ts +0 -37
- package/lib/esm/query/clauses/OrderByClause.js +0 -39
- package/lib/esm/query/clauses/SelectClause.d.ts +0 -47
- package/lib/esm/query/clauses/SelectClause.js +0 -62
- package/lib/esm/query/clauses/SelectorBasedClause.d.ts +0 -25
- package/lib/esm/query/clauses/SelectorBasedClause.js +0 -44
- package/lib/esm/query/clauses/ValuesClause.d.ts +0 -21
- package/lib/esm/query/clauses/ValuesClause.js +0 -36
- package/lib/esm/query/clauses/WhereClause.d.ts +0 -46
- package/lib/esm/query/clauses/WhereClause.js +0 -71
- package/lib/esm/query/clauses/index.d.ts +0 -10
- package/lib/esm/query/clauses/index.js +0 -11
- package/lib/esm/query/types.d.ts +0 -2
- package/lib/esm/query/types.js +0 -2
- package/lib/esm/ram/RamClauseFactory.d.ts +0 -17
- package/lib/esm/ram/RamClauseFactory.js +0 -92
- package/lib/esm/ram/clauses/FromClause.d.ts +0 -7
- package/lib/esm/ram/clauses/FromClause.js +0 -11
- package/lib/esm/ram/clauses/InsertClause.d.ts +0 -7
- package/lib/esm/ram/clauses/InsertClause.js +0 -13
- package/lib/esm/ram/clauses/OrderByClause.d.ts +0 -7
- package/lib/esm/ram/clauses/OrderByClause.js +0 -39
- package/lib/esm/ram/clauses/SelectClause.d.ts +0 -7
- package/lib/esm/ram/clauses/SelectClause.js +0 -16
- package/lib/esm/ram/clauses/ValuesClause.d.ts +0 -7
- package/lib/esm/ram/clauses/ValuesClause.js +0 -12
- package/lib/esm/ram/clauses/WhereClause.d.ts +0 -7
- package/lib/esm/ram/clauses/WhereClause.js +0 -11
- package/lib/esm/ram/clauses/index.d.ts +0 -6
- package/lib/esm/ram/clauses/index.js +0 -7
- package/lib/esm/validators/ClauseSequenceValidator.d.ts +0 -28
- package/lib/esm/validators/ClauseSequenceValidator.js +0 -95
- package/lib/esm/validators/decorators.d.ts +0 -10
- package/lib/esm/validators/decorators.js +0 -24
- package/lib/esm/validators/index.d.ts +0 -2
- package/lib/esm/validators/index.js +0 -3
- package/lib/interfaces/Builder.cjs +0 -3
- package/lib/interfaces/Builder.d.ts +0 -16
- package/lib/model/IdentifiedBaseModel.cjs +0 -29
- package/lib/model/IdentifiedBaseModel.d.ts +0 -7
- package/lib/query/Clause.cjs +0 -86
- package/lib/query/Clause.d.ts +0 -50
- package/lib/query/ClauseFactory.cjs +0 -10
- package/lib/query/ClauseFactory.d.ts +0 -71
- package/lib/query/Query.cjs +0 -58
- package/lib/query/Query.d.ts +0 -43
- package/lib/query/clauses/FromClause.cjs +0 -63
- package/lib/query/clauses/FromClause.d.ts +0 -45
- package/lib/query/clauses/GroupByClause.cjs +0 -23
- package/lib/query/clauses/GroupByClause.d.ts +0 -21
- package/lib/query/clauses/InsertClause.cjs +0 -59
- package/lib/query/clauses/InsertClause.d.ts +0 -37
- package/lib/query/clauses/LimitClause.cjs +0 -31
- package/lib/query/clauses/LimitClause.d.ts +0 -29
- package/lib/query/clauses/OffsetClause.cjs +0 -23
- package/lib/query/clauses/OffsetClause.d.ts +0 -21
- package/lib/query/clauses/OrderByClause.cjs +0 -43
- package/lib/query/clauses/OrderByClause.d.ts +0 -37
- package/lib/query/clauses/SelectClause.cjs +0 -66
- package/lib/query/clauses/SelectClause.d.ts +0 -47
- package/lib/query/clauses/SelectorBasedClause.cjs +0 -48
- package/lib/query/clauses/SelectorBasedClause.d.ts +0 -25
- package/lib/query/clauses/ValuesClause.cjs +0 -40
- package/lib/query/clauses/ValuesClause.d.ts +0 -21
- package/lib/query/clauses/WhereClause.cjs +0 -75
- package/lib/query/clauses/WhereClause.d.ts +0 -46
- package/lib/query/clauses/index.cjs +0 -27
- package/lib/query/clauses/index.d.ts +0 -10
- package/lib/query/types.cjs +0 -3
- package/lib/query/types.d.ts +0 -2
- package/lib/ram/RamClauseFactory.cjs +0 -96
- package/lib/ram/RamClauseFactory.d.ts +0 -17
- package/lib/ram/clauses/FromClause.cjs +0 -15
- package/lib/ram/clauses/FromClause.d.ts +0 -7
- package/lib/ram/clauses/InsertClause.cjs +0 -17
- package/lib/ram/clauses/InsertClause.d.ts +0 -7
- package/lib/ram/clauses/OrderByClause.cjs +0 -43
- package/lib/ram/clauses/OrderByClause.d.ts +0 -7
- package/lib/ram/clauses/SelectClause.cjs +0 -20
- package/lib/ram/clauses/SelectClause.d.ts +0 -7
- package/lib/ram/clauses/ValuesClause.cjs +0 -16
- package/lib/ram/clauses/ValuesClause.d.ts +0 -7
- package/lib/ram/clauses/WhereClause.cjs +0 -15
- package/lib/ram/clauses/WhereClause.d.ts +0 -7
- package/lib/ram/clauses/index.cjs +0 -23
- package/lib/ram/clauses/index.d.ts +0 -6
- package/lib/validators/ClauseSequenceValidator.cjs +0 -98
- package/lib/validators/ClauseSequenceValidator.d.ts +0 -28
- package/lib/validators/decorators.cjs +0 -27
- package/lib/validators/decorators.d.ts +0 -10
- package/lib/validators/index.d.ts +0 -2
package/lib/ram/RamAdapter.cjs
CHANGED
@@ -1,176 +1,362 @@
|
|
1
1
|
"use strict";
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
3
|
-
if (k2 === undefined) k2 = k;
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
7
|
-
}
|
8
|
-
Object.defineProperty(o, k2, desc);
|
9
|
-
}) : (function(o, m, k, k2) {
|
10
|
-
if (k2 === undefined) k2 = k;
|
11
|
-
o[k2] = m[k];
|
12
|
-
}));
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
15
|
-
}) : function(o, v) {
|
16
|
-
o["default"] = v;
|
17
|
-
});
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
19
|
-
var ownKeys = function(o) {
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
21
|
-
var ar = [];
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
23
|
-
return ar;
|
24
|
-
};
|
25
|
-
return ownKeys(o);
|
26
|
-
};
|
27
|
-
return function (mod) {
|
28
|
-
if (mod && mod.__esModule) return mod;
|
29
|
-
var result = {};
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
31
|
-
__setModuleDefault(result, mod);
|
32
|
-
return result;
|
33
|
-
};
|
34
|
-
})();
|
35
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
36
3
|
exports.RamAdapter = void 0;
|
37
|
-
exports.createdByOnRamCreateUpdate = createdByOnRamCreateUpdate;
|
38
4
|
const RamStatement_1 = require("./RamStatement.cjs");
|
39
|
-
const RamClauseFactory_1 = require("./RamClauseFactory.cjs");
|
40
|
-
const crypto = __importStar(require("node:crypto"));
|
41
5
|
const RamContext_1 = require("./RamContext.cjs");
|
42
6
|
const Repository_1 = require("./../repository/Repository.cjs");
|
43
|
-
const errors_1 = require("./../persistence/errors.cjs");
|
44
7
|
const persistence_1 = require("./../persistence/index.cjs");
|
45
|
-
const Paginator_1 = require("./../query/Paginator.cjs");
|
46
|
-
const query_1 = require("./../query/index.cjs");
|
47
8
|
const transactional_decorators_1 = require("@decaf-ts/transactional-decorators");
|
48
9
|
const decorator_validation_1 = require("@decaf-ts/decorator-validation");
|
49
10
|
const db_decorators_1 = require("@decaf-ts/db-decorators");
|
50
11
|
const RamSequence_1 = require("./RamSequence.cjs");
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
12
|
+
const handlers_1 = require("./handlers.cjs");
|
13
|
+
const constants_1 = require("./constants.cjs");
|
14
|
+
/**
|
15
|
+
* @description In-memory adapter for data persistence
|
16
|
+
* @summary The RamAdapter provides an in-memory implementation of the persistence layer.
|
17
|
+
* It stores data in JavaScript Maps and provides CRUD operations and query capabilities.
|
18
|
+
* This adapter is useful for testing, prototyping, and applications that don't require
|
19
|
+
* persistent storage across application restarts.
|
20
|
+
* @class RamAdapter
|
21
|
+
* @category Ram
|
22
|
+
* @example
|
23
|
+
* ```typescript
|
24
|
+
* // Create a new RAM adapter
|
25
|
+
* const adapter = new RamAdapter('myRamAdapter');
|
26
|
+
*
|
27
|
+
* // Create a repository for a model
|
28
|
+
* const userRepo = new (adapter.repository<User>())(User, adapter);
|
29
|
+
*
|
30
|
+
* // Perform CRUD operations
|
31
|
+
* const user = new User({ name: 'John', email: 'john@example.com' });
|
32
|
+
* await userRepo.create(user);
|
33
|
+
* const retrievedUser = await userRepo.findById(user.id);
|
34
|
+
* ```
|
35
|
+
* @mermaid
|
36
|
+
* sequenceDiagram
|
37
|
+
* participant Client
|
38
|
+
* participant Repository
|
39
|
+
* participant RamAdapter
|
40
|
+
* participant Storage as In-Memory Storage
|
41
|
+
*
|
42
|
+
* Client->>Repository: create(model)
|
43
|
+
* Repository->>RamAdapter: create(tableName, id, model)
|
44
|
+
* RamAdapter->>RamAdapter: lock.acquire()
|
45
|
+
* RamAdapter->>Storage: set(id, model)
|
46
|
+
* RamAdapter->>RamAdapter: lock.release()
|
47
|
+
* RamAdapter-->>Repository: model
|
48
|
+
* Repository-->>Client: model
|
49
|
+
*
|
50
|
+
* Client->>Repository: findById(id)
|
51
|
+
* Repository->>RamAdapter: read(tableName, id)
|
52
|
+
* RamAdapter->>Storage: get(id)
|
53
|
+
* Storage-->>RamAdapter: model
|
54
|
+
* RamAdapter-->>Repository: model
|
55
|
+
* Repository-->>Client: model
|
56
|
+
*/
|
67
57
|
class RamAdapter extends persistence_1.Adapter {
|
68
|
-
constructor(
|
69
|
-
super(
|
58
|
+
constructor(alias) {
|
59
|
+
super(new Map(), constants_1.RamFlavour, alias);
|
60
|
+
this.Context = RamContext_1.RamContext;
|
70
61
|
this.indexes = {};
|
71
62
|
this.lock = new transactional_decorators_1.Lock();
|
72
|
-
this.sequences = {};
|
73
63
|
}
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
64
|
+
/**
|
65
|
+
* @description Gets the repository constructor for a model
|
66
|
+
* @summary Returns a constructor for creating repositories that work with the specified model type.
|
67
|
+
* This method overrides the base implementation to provide RAM-specific repository functionality.
|
68
|
+
* @template M - The model type for the repository
|
69
|
+
* @return {Constructor<RamRepository<M>>} A constructor for creating RAM repositories
|
70
|
+
*/
|
71
|
+
repository() {
|
72
|
+
return super.repository();
|
73
|
+
}
|
74
|
+
/**
|
75
|
+
* @description Creates operation flags with UUID
|
76
|
+
* @summary Extends the base flags with a UUID for user identification.
|
77
|
+
* This method ensures that all operations have a unique identifier for tracking purposes.
|
78
|
+
* @template M - The model type for the operation
|
79
|
+
* @param {OperationKeys} operation - The type of operation being performed
|
80
|
+
* @param {Constructor<M>} model - The model constructor
|
81
|
+
* @param {Partial<RamFlags>} flags - Partial flags to be extended
|
82
|
+
* @return {RamFlags} Complete flags with UUID
|
83
|
+
*/
|
84
|
+
flags(operation, model, flags) {
|
85
|
+
return Object.assign(super.flags(operation, model, flags), {
|
82
86
|
UUID: crypto.randomUUID(),
|
83
|
-
})
|
87
|
+
});
|
84
88
|
}
|
89
|
+
/**
|
90
|
+
* @description Initializes the RAM adapter
|
91
|
+
* @summary A no-op initialization method for the RAM adapter.
|
92
|
+
* Since RAM adapter doesn't require any setup, this method simply resolves immediately.
|
93
|
+
* @param {...any[]} args - Initialization arguments (unused)
|
94
|
+
* @return {Promise<void>} A promise that resolves when initialization is complete
|
95
|
+
*/
|
85
96
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
86
97
|
async initialize(...args) {
|
87
98
|
return Promise.resolve(undefined);
|
88
99
|
}
|
100
|
+
/**
|
101
|
+
* @description Indexes models in the RAM adapter
|
102
|
+
* @summary A no-op indexing method for the RAM adapter.
|
103
|
+
* Since RAM adapter doesn't require explicit indexing, this method simply resolves immediately.
|
104
|
+
* @param models - Models to be indexed (unused)
|
105
|
+
* @return {Promise<any>} A promise that resolves when indexing is complete
|
106
|
+
*/
|
89
107
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
90
108
|
async index(...models) {
|
91
109
|
return Promise.resolve(undefined);
|
92
110
|
}
|
111
|
+
/**
|
112
|
+
* @description Prepares a model for storage
|
113
|
+
* @summary Converts a model instance to a format suitable for storage in the RAM adapter.
|
114
|
+
* This method extracts the primary key and creates a record without the primary key field.
|
115
|
+
* @template M - The model type being prepared
|
116
|
+
* @param {M} model - The model instance to prepare
|
117
|
+
* @param pk - The primary key property name
|
118
|
+
* @return Object containing the record and ID
|
119
|
+
*/
|
93
120
|
prepare(model, pk) {
|
94
121
|
const prepared = super.prepare(model, pk);
|
95
122
|
delete prepared.record[pk];
|
96
123
|
return prepared;
|
97
124
|
}
|
125
|
+
/**
|
126
|
+
* @description Converts a stored record back to a model instance
|
127
|
+
* @summary Reconstructs a model instance from a stored record by adding back the primary key.
|
128
|
+
* This method is the inverse of the prepare method.
|
129
|
+
* @template M - The model type to revert to
|
130
|
+
* @param {Record<string, any>} obj - The stored record
|
131
|
+
* @param {string | Constructor<M>} clazz - The model class or name
|
132
|
+
* @param pk - The primary key property name
|
133
|
+
* @param {string | number} id - The primary key value
|
134
|
+
* @return {M} The reconstructed model instance
|
135
|
+
*/
|
98
136
|
revert(obj, clazz, pk, id) {
|
99
137
|
const res = super.revert(obj, clazz, pk, id);
|
100
138
|
return res;
|
101
139
|
}
|
140
|
+
/**
|
141
|
+
* @description Creates a new record in the in-memory storage
|
142
|
+
* @summary Stores a new record in the specified table with the given ID.
|
143
|
+
* This method acquires a lock to ensure thread safety, creates the table if it doesn't exist,
|
144
|
+
* checks for conflicts, and stores the model.
|
145
|
+
* @param {string} tableName - The name of the table to store the record in
|
146
|
+
* @param {string | number} id - The unique identifier for the record
|
147
|
+
* @param {Record<string, any>} model - The record data to store
|
148
|
+
* @return {Promise<Record<string, any>>} A promise that resolves to the stored record
|
149
|
+
* @mermaid
|
150
|
+
* sequenceDiagram
|
151
|
+
* participant Caller
|
152
|
+
* participant RamAdapter
|
153
|
+
* participant Storage as In-Memory Storage
|
154
|
+
*
|
155
|
+
* Caller->>RamAdapter: create(tableName, id, model)
|
156
|
+
* RamAdapter->>RamAdapter: lock.acquire()
|
157
|
+
* RamAdapter->>Storage: has(tableName)
|
158
|
+
* alt Table doesn't exist
|
159
|
+
* RamAdapter->>Storage: set(tableName, new Map())
|
160
|
+
* end
|
161
|
+
* RamAdapter->>Storage: has(id)
|
162
|
+
* alt Record exists
|
163
|
+
* RamAdapter-->>Caller: throw ConflictError
|
164
|
+
* end
|
165
|
+
* RamAdapter->>Storage: set(id, model)
|
166
|
+
* RamAdapter->>RamAdapter: lock.release()
|
167
|
+
* RamAdapter-->>Caller: model
|
168
|
+
*/
|
102
169
|
async create(tableName, id, model) {
|
103
170
|
await this.lock.acquire();
|
104
|
-
if (!this.native
|
105
|
-
this.native
|
106
|
-
if (
|
171
|
+
if (!this.native.has(tableName))
|
172
|
+
this.native.set(tableName, new Map());
|
173
|
+
if (this.native.get(tableName) && this.native.get(tableName)?.has(id))
|
107
174
|
throw new db_decorators_1.ConflictError(`Record with id ${id} already exists in table ${tableName}`);
|
108
|
-
this.native
|
175
|
+
this.native.get(tableName)?.set(id, model);
|
109
176
|
this.lock.release();
|
110
177
|
return model;
|
111
178
|
}
|
179
|
+
/**
|
180
|
+
* @description Retrieves a record from in-memory storage
|
181
|
+
* @summary Fetches a record with the specified ID from the given table.
|
182
|
+
* This method checks if the table and record exist and throws appropriate errors if not.
|
183
|
+
* @param {string} tableName - The name of the table to retrieve from
|
184
|
+
* @param {string | number} id - The unique identifier of the record to retrieve
|
185
|
+
* @return {Promise<Record<string, any>>} A promise that resolves to the retrieved record
|
186
|
+
* @mermaid
|
187
|
+
* sequenceDiagram
|
188
|
+
* participant Caller
|
189
|
+
* participant RamAdapter
|
190
|
+
* participant Storage as In-Memory Storage
|
191
|
+
*
|
192
|
+
* Caller->>RamAdapter: read(tableName, id)
|
193
|
+
* RamAdapter->>Storage: has(tableName)
|
194
|
+
* alt Table doesn't exist
|
195
|
+
* RamAdapter-->>Caller: throw NotFoundError
|
196
|
+
* end
|
197
|
+
* RamAdapter->>Storage: has(id)
|
198
|
+
* alt Record doesn't exist
|
199
|
+
* RamAdapter-->>Caller: throw NotFoundError
|
200
|
+
* end
|
201
|
+
* RamAdapter->>Storage: get(id)
|
202
|
+
* Storage-->>RamAdapter: record
|
203
|
+
* RamAdapter-->>Caller: record
|
204
|
+
*/
|
112
205
|
async read(tableName, id) {
|
113
|
-
if (!
|
206
|
+
if (!this.native.has(tableName))
|
114
207
|
throw new db_decorators_1.NotFoundError(`Table ${tableName} not found`);
|
115
|
-
if (!
|
208
|
+
if (!this.native.get(tableName)?.has(id))
|
116
209
|
throw new db_decorators_1.NotFoundError(`Record with id ${id} not found in table ${tableName}`);
|
117
|
-
return this.native
|
210
|
+
return this.native.get(tableName)?.get(id);
|
118
211
|
}
|
212
|
+
/**
|
213
|
+
* @description Updates an existing record in the in-memory storage
|
214
|
+
* @summary Updates a record with the specified ID in the given table.
|
215
|
+
* This method acquires a lock to ensure thread safety, checks if the table and record exist,
|
216
|
+
* and updates the record with the new data.
|
217
|
+
* @param {string} tableName - The name of the table containing the record
|
218
|
+
* @param {string | number} id - The unique identifier of the record to update
|
219
|
+
* @param {Record<string, any>} model - The new record data
|
220
|
+
* @return {Promise<Record<string, any>>} A promise that resolves to the updated record
|
221
|
+
* @mermaid
|
222
|
+
* sequenceDiagram
|
223
|
+
* participant Caller
|
224
|
+
* participant RamAdapter
|
225
|
+
* participant Storage as In-Memory Storage
|
226
|
+
*
|
227
|
+
* Caller->>RamAdapter: update(tableName, id, model)
|
228
|
+
* RamAdapter->>RamAdapter: lock.acquire()
|
229
|
+
* RamAdapter->>Storage: has(tableName)
|
230
|
+
* alt Table doesn't exist
|
231
|
+
* RamAdapter-->>Caller: throw NotFoundError
|
232
|
+
* end
|
233
|
+
* RamAdapter->>Storage: has(id)
|
234
|
+
* alt Record doesn't exist
|
235
|
+
* RamAdapter-->>Caller: throw NotFoundError
|
236
|
+
* end
|
237
|
+
* RamAdapter->>Storage: set(id, model)
|
238
|
+
* RamAdapter->>RamAdapter: lock.release()
|
239
|
+
* RamAdapter-->>Caller: model
|
240
|
+
*/
|
119
241
|
async update(tableName, id, model) {
|
120
242
|
await this.lock.acquire();
|
121
|
-
if (!
|
243
|
+
if (!this.native.has(tableName))
|
122
244
|
throw new db_decorators_1.NotFoundError(`Table ${tableName} not found`);
|
123
|
-
if (!
|
245
|
+
if (!this.native.get(tableName)?.has(id))
|
124
246
|
throw new db_decorators_1.NotFoundError(`Record with id ${id} not found in table ${tableName}`);
|
125
|
-
this.native
|
247
|
+
this.native.get(tableName)?.set(id, model);
|
126
248
|
this.lock.release();
|
127
249
|
return model;
|
128
250
|
}
|
251
|
+
/**
|
252
|
+
* @description Deletes a record from the in-memory storage
|
253
|
+
* @summary Removes a record with the specified ID from the given table.
|
254
|
+
* This method acquires a lock to ensure thread safety, checks if the table and record exist,
|
255
|
+
* retrieves the record before deletion, and then removes it from storage.
|
256
|
+
* @param {string} tableName - The name of the table containing the record
|
257
|
+
* @param {string | number} id - The unique identifier of the record to delete
|
258
|
+
* @return {Promise<Record<string, any>>} A promise that resolves to the deleted record
|
259
|
+
* @mermaid
|
260
|
+
* sequenceDiagram
|
261
|
+
* participant Caller
|
262
|
+
* participant RamAdapter
|
263
|
+
* participant Storage as In-Memory Storage
|
264
|
+
*
|
265
|
+
* Caller->>RamAdapter: delete(tableName, id)
|
266
|
+
* RamAdapter->>RamAdapter: lock.acquire()
|
267
|
+
* RamAdapter->>Storage: has(tableName)
|
268
|
+
* alt Table doesn't exist
|
269
|
+
* RamAdapter-->>Caller: throw NotFoundError
|
270
|
+
* end
|
271
|
+
* RamAdapter->>Storage: has(id)
|
272
|
+
* alt Record doesn't exist
|
273
|
+
* RamAdapter-->>Caller: throw NotFoundError
|
274
|
+
* end
|
275
|
+
* RamAdapter->>Storage: get(id)
|
276
|
+
* Storage-->>RamAdapter: record
|
277
|
+
* RamAdapter->>Storage: delete(id)
|
278
|
+
* RamAdapter->>RamAdapter: lock.release()
|
279
|
+
* RamAdapter-->>Caller: record
|
280
|
+
*/
|
129
281
|
async delete(tableName, id) {
|
130
282
|
await this.lock.acquire();
|
131
|
-
if (!
|
283
|
+
if (!this.native.has(tableName))
|
132
284
|
throw new db_decorators_1.NotFoundError(`Table ${tableName} not found`);
|
133
|
-
if (!
|
285
|
+
if (!this.native.get(tableName)?.has(id))
|
134
286
|
throw new db_decorators_1.NotFoundError(`Record with id ${id} not found in table ${tableName}`);
|
135
|
-
const natived = this.native
|
136
|
-
|
287
|
+
const natived = this.native.get(tableName)?.get(id);
|
288
|
+
this.native.get(tableName)?.delete(id);
|
137
289
|
this.lock.release();
|
138
290
|
return natived;
|
139
291
|
}
|
292
|
+
/**
|
293
|
+
* @description Gets or creates a table in the in-memory storage
|
294
|
+
* @summary Retrieves the Map representing a table for a given model or table name.
|
295
|
+
* If the table doesn't exist, it creates a new one. This is a helper method used
|
296
|
+
* by other methods to access the correct storage location.
|
297
|
+
* @template M - The model type for the table
|
298
|
+
* @param {string | Constructor<M>} from - The model class or table name
|
299
|
+
* @return {Map<string | number, any> | undefined} The table Map or undefined
|
300
|
+
*/
|
140
301
|
tableFor(from) {
|
141
302
|
if (typeof from === "string")
|
142
303
|
from = decorator_validation_1.Model.get(from);
|
143
304
|
const table = Repository_1.Repository.table(from);
|
144
|
-
if (!
|
145
|
-
this.native
|
146
|
-
return this.native
|
305
|
+
if (!this.native.has(table))
|
306
|
+
this.native.set(table, new Map());
|
307
|
+
return this.native.get(table);
|
147
308
|
}
|
148
|
-
|
149
|
-
|
309
|
+
/**
|
310
|
+
* @description Executes a raw query against the in-memory storage
|
311
|
+
* @summary Performs a query operation on the in-memory data store using the provided query specification.
|
312
|
+
* This method supports filtering, sorting, pagination, and field selection.
|
313
|
+
* @template R - The return type of the query
|
314
|
+
* @param {RawRamQuery<any>} rawInput - The query specification
|
315
|
+
* @return {Promise<R>} A promise that resolves to the query results
|
316
|
+
* @mermaid
|
317
|
+
* sequenceDiagram
|
318
|
+
* participant Caller
|
319
|
+
* participant RamAdapter
|
320
|
+
* participant Storage as In-Memory Storage
|
321
|
+
*
|
322
|
+
* Caller->>RamAdapter: raw(rawInput)
|
323
|
+
* RamAdapter->>RamAdapter: tableFor(from)
|
324
|
+
* alt Table doesn't exist
|
325
|
+
* RamAdapter-->>Caller: throw InternalError
|
326
|
+
* end
|
327
|
+
* RamAdapter->>RamAdapter: findPrimaryKey(new from())
|
328
|
+
* RamAdapter->>Storage: entries()
|
329
|
+
* Storage-->>RamAdapter: entries
|
330
|
+
* loop For each entry
|
331
|
+
* RamAdapter->>RamAdapter: revert(r, from, id, pk)
|
332
|
+
* end
|
333
|
+
* alt Where condition exists
|
334
|
+
* RamAdapter->>RamAdapter: result.filter(where)
|
335
|
+
* end
|
336
|
+
* alt Sort condition exists
|
337
|
+
* RamAdapter->>RamAdapter: result.sort(sort)
|
338
|
+
* end
|
339
|
+
* alt Skip specified
|
340
|
+
* RamAdapter->>RamAdapter: result.slice(skip)
|
341
|
+
* end
|
342
|
+
* alt Limit specified
|
343
|
+
* RamAdapter->>RamAdapter: result.slice(0, limit)
|
344
|
+
* end
|
345
|
+
* alt Select fields specified
|
346
|
+
* loop For each result
|
347
|
+
* RamAdapter->>RamAdapter: Filter to selected fields
|
348
|
+
* end
|
349
|
+
* end
|
350
|
+
* RamAdapter-->>Caller: result
|
351
|
+
*/
|
352
|
+
async raw(rawInput) {
|
150
353
|
const { where, sort, limit, skip, from } = rawInput;
|
151
354
|
let { select } = rawInput;
|
152
355
|
const collection = this.tableFor(from);
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
switch (props.type) {
|
158
|
-
case "Number":
|
159
|
-
result = parseInt(result);
|
160
|
-
if (isNaN(result))
|
161
|
-
throw new Error(`Invalid id ${id}`);
|
162
|
-
break;
|
163
|
-
case "BigInt":
|
164
|
-
result = BigInt(parseInt(result));
|
165
|
-
break;
|
166
|
-
case "String":
|
167
|
-
break;
|
168
|
-
default:
|
169
|
-
throw new db_decorators_1.InternalError(`Invalid id type ${props.type}. should be impossible`);
|
170
|
-
}
|
171
|
-
return result;
|
172
|
-
}
|
173
|
-
let result = Object.entries(collection).map(([pk, r]) => this.revert(r, clazz, id, parseId(pk)));
|
356
|
+
if (!collection)
|
357
|
+
throw new db_decorators_1.InternalError(`Table ${from} not found in RamAdapter`);
|
358
|
+
const { id, props } = (0, db_decorators_1.findPrimaryKey)(new from());
|
359
|
+
let result = Array.from(collection.entries()).map(([pk, r]) => this.revert(r, from, id, persistence_1.Sequence.parseValue(props.type, pk)));
|
174
360
|
result = where ? result.filter(where) : result;
|
175
361
|
if (sort)
|
176
362
|
result = result.sort(sort);
|
@@ -188,81 +374,81 @@ class RamAdapter extends persistence_1.Adapter {
|
|
188
374
|
}
|
189
375
|
return result;
|
190
376
|
}
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
}
|
200
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
201
|
-
page(page) {
|
202
|
-
throw new Error("Method not implemented.");
|
203
|
-
}
|
204
|
-
})(10);
|
205
|
-
}
|
377
|
+
/**
|
378
|
+
* @description Parses and converts errors to appropriate types
|
379
|
+
* @summary Ensures that errors are of the correct type for consistent error handling.
|
380
|
+
* If the error is already a BaseError, it's returned as is; otherwise, it's wrapped in an InternalError.
|
381
|
+
* @template V - The expected error type, extending BaseError
|
382
|
+
* @param {Error} err - The error to parse
|
383
|
+
* @return {V} The parsed error of the expected type
|
384
|
+
*/
|
206
385
|
parseError(err) {
|
207
386
|
if (err instanceof db_decorators_1.BaseError)
|
208
387
|
return err;
|
209
388
|
return new db_decorators_1.InternalError(err);
|
210
389
|
}
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
390
|
+
/**
|
391
|
+
* @description Creates a new statement builder for queries
|
392
|
+
* @summary Factory method that creates a new RamStatement instance for building queries.
|
393
|
+
* This method allows for fluent query construction against the RAM adapter.
|
394
|
+
* @template M - The model type for the statement
|
395
|
+
* @return {RamStatement<M, any>} A new statement builder instance
|
396
|
+
*/
|
397
|
+
Statement() {
|
217
398
|
return new RamStatement_1.RamStatement(this);
|
218
399
|
}
|
400
|
+
/**
|
401
|
+
* @description Creates a new sequence for generating sequential IDs
|
402
|
+
* @summary Factory method that creates a new RamSequence instance for ID generation.
|
403
|
+
* This method provides a way to create auto-incrementing sequences for entity IDs.
|
404
|
+
* @param {SequenceOptions} options - Configuration options for the sequence
|
405
|
+
* @return {Promise<Sequence>} A promise that resolves to the new sequence instance
|
406
|
+
*/
|
219
407
|
async Sequence(options) {
|
220
408
|
return new RamSequence_1.RamSequence(options, this);
|
221
409
|
}
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
}
|
263
|
-
},
|
264
|
-
};
|
410
|
+
/**
|
411
|
+
* @description Sets up RAM-specific decorations for model properties
|
412
|
+
* @summary Configures decorations for createdBy and updatedBy fields in the RAM adapter.
|
413
|
+
* This static method is called during initialization to set up handlers that automatically
|
414
|
+
* populate these fields with the current user's UUID during create and update operations.
|
415
|
+
* @return {void}
|
416
|
+
* @mermaid
|
417
|
+
* sequenceDiagram
|
418
|
+
* participant RamAdapter
|
419
|
+
* participant Decoration
|
420
|
+
* participant Repository
|
421
|
+
*
|
422
|
+
* RamAdapter->>Repository: key(PersistenceKeys.CREATED_BY)
|
423
|
+
* Repository-->>RamAdapter: createdByKey
|
424
|
+
* RamAdapter->>Repository: key(PersistenceKeys.UPDATED_BY)
|
425
|
+
* Repository-->>RamAdapter: updatedByKey
|
426
|
+
*
|
427
|
+
* RamAdapter->>Decoration: flavouredAs(RamFlavour)
|
428
|
+
* Decoration-->>RamAdapter: DecoratorBuilder
|
429
|
+
* RamAdapter->>Decoration: for(createdByKey)
|
430
|
+
* RamAdapter->>Decoration: define(onCreate, propMetadata)
|
431
|
+
* RamAdapter->>Decoration: apply()
|
432
|
+
*
|
433
|
+
* RamAdapter->>Decoration: flavouredAs(RamFlavour)
|
434
|
+
* Decoration-->>RamAdapter: DecoratorBuilder
|
435
|
+
* RamAdapter->>Decoration: for(updatedByKey)
|
436
|
+
* RamAdapter->>Decoration: define(onCreate, propMetadata)
|
437
|
+
* RamAdapter->>Decoration: apply()
|
438
|
+
*/
|
439
|
+
static decoration() {
|
440
|
+
const createdByKey = Repository_1.Repository.key(persistence_1.PersistenceKeys.CREATED_BY);
|
441
|
+
const updatedByKey = Repository_1.Repository.key(persistence_1.PersistenceKeys.UPDATED_BY);
|
442
|
+
decorator_validation_1.Decoration.flavouredAs(constants_1.RamFlavour)
|
443
|
+
.for(createdByKey)
|
444
|
+
.define((0, db_decorators_1.onCreate)(handlers_1.createdByOnRamCreateUpdate), (0, decorator_validation_1.propMetadata)(createdByKey, {}))
|
445
|
+
.apply();
|
446
|
+
decorator_validation_1.Decoration.flavouredAs(constants_1.RamFlavour)
|
447
|
+
.for(updatedByKey)
|
448
|
+
.define((0, db_decorators_1.onCreate)(handlers_1.createdByOnRamCreateUpdate), (0, decorator_validation_1.propMetadata)(updatedByKey, {}))
|
449
|
+
.apply();
|
265
450
|
}
|
266
451
|
}
|
267
452
|
exports.RamAdapter = RamAdapter;
|
268
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmFtQWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yYW0vUmFtQWRhcHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFzQ0EsZ0VBbUJDO0FBdkRELHFEQUE4QztBQUM5Qyw2REFBc0Q7QUFDdEQsb0RBQXNDO0FBQ3RDLGlEQUEwQztBQUMxQywrREFBNEQ7QUFFNUQsd0RBQXlEO0FBQ3pELDREQUFvRTtBQUNwRSx3REFBK0M7QUFDL0MsZ0RBTWtCO0FBRWxCLGlGQUEwRDtBQUMxRCx5RUFLd0M7QUFDeEMsMkRBU2lDO0FBQ2pDLG1EQUE0QztBQUVyQyxLQUFLLFVBQVUsMEJBQTBCLENBUTlDLE9BQW1CLEVBQ25CLElBQU8sRUFDUCxHQUFZLEVBQ1osS0FBUTtJQUVSLE1BQU0sSUFBSSxHQUFXLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDekMsSUFBSSxDQUFDLElBQUk7UUFDUCxNQUFNLElBQUkseUJBQWdCLENBQ3hCLG1EQUFtRCxDQUNwRCxDQUFDO0lBQ0osS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQWtCLENBQUM7QUFDbEMsQ0FBQztBQUVELE1BQU0sWUFBWSxHQUFHLHVCQUFVLENBQUMsR0FBRyxDQUFDLDZCQUFlLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDaEUsTUFBTSxZQUFZLEdBQUcsdUJBQVUsQ0FBQyxHQUFHLENBQUMsNkJBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUNoRSxpQ0FBVSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUM7S0FDMUIsR0FBRyxDQUFDLFlBQVksQ0FBQztLQUNqQixNQUFNLENBQUMsSUFBQSx3QkFBUSxFQUFDLDBCQUEwQixDQUFDLEVBQUUsSUFBQSxtQ0FBWSxFQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQztLQUM1RSxLQUFLLEVBQUUsQ0FBQztBQUNYLGlDQUFVLENBQUMs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QUFDLGlCQUFpQixDQUFDLENBQUM7Z0JBQzdDLENBQUM7cUJBQU0sQ0FBQztvQkFDTixNQUFNLEdBQUcsR0FBa0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFrQixDQUFDLENBQUM7b0JBQ25FLE1BQU0sR0FBRyxHQUFrQixJQUFJLENBQUMsY0FBYyxDQUM1QyxVQUF1QixDQUN4QixDQUFDO29CQUNGLFFBQVEsUUFBUSxFQUFFLENBQUM7d0JBQ2pCLEtBQUsscUJBQWEsQ0FBQyxHQUFHOzRCQUNwQixPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDdEMsS0FBSyxxQkFBYSxDQUFDLEVBQUU7NEJBQ25CLE9BQU8sR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUN0Qzs0QkFDRSxNQUFNLElBQUksNkJBQWEsQ0FDckIsNENBQTRDLFFBQVEsRUFBRSxDQUN2RCxDQUFDO29CQUNOLENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7U0FDZSxDQUFDO0lBQ3JCLENBQUM7Q0FDRjtBQTlSRCxnQ0E4UkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb250ZXh0IH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBSYW1GbGFncywgUmFtUXVlcnksIFJhbVN0b3JhZ2UgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgUmFtU3RhdGVtZW50IH0gZnJvbSBcIi4vUmFtU3RhdGVtZW50XCI7XG5pbXBvcnQgeyBSYW1DbGF1c2VGYWN0b3J5IH0gZnJvbSBcIi4vUmFtQ2xhdXNlRmFjdG9yeVwiO1xuaW1wb3J0ICogYXMgY3J5cHRvIGZyb20gXCJub2RlOmNyeXB0b1wiO1xuaW1wb3J0IHsgUmFtQ29udGV4dCB9IGZyb20gXCIuL1JhbUNvbnRleHRcIjtcbmltcG9ydCB7IFJlcG8sIFJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeS9SZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBSZWxhdGlvbnNNZXRhZGF0YSB9IGZyb20gXCIuLi9tb2RlbC90eXBlc1wiO1xuaW1wb3J0IHsgVW5zdXBwb3J0ZWRFcnJvciB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9lcnJvcnNcIjtcbmltcG9ydCB7IEFkYXB0ZXIsIFBlcnNpc3RlbmNlS2V5cywgU2VxdWVuY2UgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2VcIjtcbmltcG9ydCB7IFBhZ2luYXRvciB9IGZyb20gXCIuLi9xdWVyeS9QYWdpbmF0b3JcIjtcbmltcG9ydCB7XG4gIENsYXVzZUZhY3RvcnksXG4gIENvbmRpdGlvbixcbiAgR3JvdXBPcGVyYXRvcixcbiAgT3BlcmF0b3IsXG4gIFF1ZXJ5RXJyb3IsXG59IGZyb20gXCIuLi9xdWVyeVwiO1xuaW1wb3J0IHsgU2VxdWVuY2VPcHRpb25zIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcbmltcG9ydCB7IExvY2sgfSBmcm9tIFwiQGRlY2FmLXRzL3RyYW5zYWN0aW9uYWwtZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHtcbiAgQ29uc3RydWN0b3IsXG4gIERlY29yYXRpb24sXG4gIE1vZGVsLFxuICBwcm9wTWV0YWRhdGEsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7XG4gIEJhc2VFcnJvcixcbiAgQ29uZmxpY3RFcnJvcixcbiAgRGVmYXVsdFJlcG9zaXRvcnlGbGFncyxcbiAgZmluZFByaW1hcnlLZXksXG4gIEludGVybmFsRXJyb3IsXG4gIE5vdEZvdW5kRXJyb3IsXG4gIG9uQ3JlYXRlLFxuICBPcGVyYXRpb25LZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFJhbVNlcXVlbmNlIH0gZnJvbSBcIi4vUmFtU2VxdWVuY2VcIjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZWRCeU9uUmFtQ3JlYXRlVXBkYXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvPE0sIEMsIEY+LFxuICBWIGV4dGVuZHMgUmVsYXRpb25zTWV0YWRhdGEsXG4gIEYgZXh0ZW5kcyBSYW1GbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEY+LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgdXVpZDogc3RyaW5nID0gY29udGV4dC5nZXQoXCJVVUlEXCIpO1xuICBpZiAoIXV1aWQpXG4gICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXG4gICAgICBcIlRoaXMgYWRhcHRlciBkb2VzIG5vdCBzdXBwb3J0IHVzZXIgaWRlbnRpZmljYXRpb25cIlxuICAgICk7XG4gIG1vZGVsW2tleV0gPSB1dWlkIGFzIE1ba2V5b2YgTV07XG59XG5cbmNvbnN0IGNyZWF0ZWRCeUtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5DUkVBVEVEX0JZKTtcbmNvbnN0IHVwZGF0ZWRCeUtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5VUERBVEVEX0JZKTtcbkRlY29yYXRpb24uZmxhdm91cmVkQXMoXCJyYW1cIilcbiAgLmZvcihjcmVhdGVkQnlLZXkpXG4gIC5kZWZpbmUob25DcmVhdGUoY3JlYXRlZEJ5T25SYW1DcmVhdGVVcGRhdGUpLCBwcm9wTWV0YWRhdGEoY3JlYXRlZEJ5S2V5LCB7fSkpXG4gIC5hcHBseSgpO1xuRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhcInJhbVwiKVxuICAuZm9yKHVwZGF0ZWRCeUtleSlcbiAgLmRlZmluZShvbkNyZWF0ZShjcmVhdGVkQnlPblJhbUNyZWF0ZVVwZGF0ZSksIHByb3BNZXRhZGF0YSh1cGRhdGVkQnlLZXksIHt9KSlcbiAgLmFwcGx5KCk7XG5cbmV4cG9ydCBjbGFzcyBSYW1BZGFwdGVyIGV4dGVuZHMgQWRhcHRlcjxcbiAgUmFtU3RvcmFnZSxcbiAgUmFtUXVlcnk8YW55PixcbiAgUmFtRmxhZ3MsXG4gIENvbnRleHQ8UmFtRmxhZ3M+XG4+IHtcbiAgcHJvdGVjdGVkIGZhY3Rvcnk/OiBSYW1DbGF1c2VGYWN0b3J5O1xuXG4gIGNvbnN0cnVjdG9yKGZsYXZvdXI6IHN0cmluZyA9IFwicmFtXCIpIHtcbiAgICBzdXBlcih7fSwgZmxhdm91cik7XG4gIH1cblxuICBhc3luYyBjb250ZXh0PE0gZXh0ZW5kcyBNb2RlbCwgQyBleHRlbmRzIFJhbUNvbnRleHQsIEYgZXh0ZW5kcyBSYW1GbGFncz4oXG4gICAgb3BlcmF0aW9uOiBhbnksXG4gICAgb3ZlcnJpZGVzOiBQYXJ0aWFsPFJhbUZsYWdzPixcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4sXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8Qz4ge1xuICAgIHJldHVybiBuZXcgUmFtQ29udGV4dChcbiAgICAgIE9iamVjdC5hc3NpZ24oe30sIERlZmF1bHRSZXBvc2l0b3J5RmxhZ3MsIG92ZXJyaWRlcywge1xuICAgICAgICBhZmZlY3RlZFRhYmxlczogW21vZGVsLm5hbWVdLFxuICAgICAgICB3cml0ZU9wZXJhdGlvbjogb3BlcmF0aW9uICE9PSBPcGVyYXRpb25LZXlzLlJFQUQsXG4gICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKSxcbiAgICAgICAgb3BlcmF0aW9uOiBvcGVyYXRpb24sXG4gICAgICAgIFVVSUQ6IGNyeXB0by5yYW5kb21VVUlEKCksXG4gICAgICB9KSBhcyBGXG4gICAgKSBhcyBDO1xuICB9XG4gIHByaXZhdGUgaW5kZXhlczogUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICBSZWNvcmQ8c3RyaW5nIHwgbnVtYmVyLCBSZWNvcmQ8c3RyaW5nLCBhbnk+PlxuICA+ID0ge307XG5cbiAgcHJpdmF0ZSBsb2NrID0gbmV3IExvY2soKTtcblxuICBwcml2YXRlIHNlcXVlbmNlczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyPiA9IHt9O1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgYXN5bmMgaW5pdGlhbGl6ZSguLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgYXN5bmMgaW5kZXgoLi4ubW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10pOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcbiAgfVxuXG4gIHByZXBhcmU8TSBleHRlbmRzIE1vZGVsPihcbiAgICBtb2RlbDogTSxcbiAgICBwazoga2V5b2YgTVxuICApOiB7IHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PjsgaWQ6IHN0cmluZyB9IHtcbiAgICBjb25zdCBwcmVwYXJlZCA9IHN1cGVyLnByZXBhcmUobW9kZWwsIHBrKTtcbiAgICBkZWxldGUgcHJlcGFyZWQucmVjb3JkW3BrIGFzIHN0cmluZ107XG4gICAgcmV0dXJuIHByZXBhcmVkO1xuICB9XG5cbiAgcmV2ZXJ0PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGNsYXp6OiBzdHJpbmcgfCBDb25zdHJ1Y3RvcjxNPixcbiAgICBwazoga2V5b2YgTSxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyXG4gICk6IE0ge1xuICAgIGNvbnN0IHJlcyA9IHN1cGVyLnJldmVydChvYmosIGNsYXp6LCBwaywgaWQpO1xuICAgIHJldHVybiByZXM7XG4gIH1cblxuICBhc3luYyBjcmVhdGUoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlcixcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBhd2FpdCB0aGlzLmxvY2suYWNxdWlyZSgpO1xuICAgIGlmICghdGhpcy5uYXRpdmVbdGFibGVOYW1lXSkgdGhpcy5uYXRpdmVbdGFibGVOYW1lXSA9IHt9O1xuICAgIGlmIChpZCBpbiB0aGlzLm5hdGl2ZVt0YWJsZU5hbWVdKVxuICAgICAgdGhyb3cgbmV3IENvbmZsaWN0RXJyb3IoXG4gICAgICAgIGBSZWNvcmQgd2l0aCBpZCAke2lkfSBhbHJlYWR5IGV4aXN0cyBpbiB0YWJsZSAke3RhYmxlTmFtZX1gXG4gICAgICApO1xuICAgIHRoaXMubmF0aXZlW3RhYmxlTmFtZV1baWRdID0gbW9kZWw7XG4gICAgdGhpcy5sb2NrLnJlbGVhc2UoKTtcbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICBhc3luYyByZWFkKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXJcbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgaWYgKCEodGFibGVOYW1lIGluIHRoaXMubmF0aXZlKSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKGBUYWJsZSAke3RhYmxlTmFtZX0gbm90IGZvdW5kYCk7XG4gICAgaWYgKCEoaWQgaW4gdGhpcy5uYXRpdmVbdGFibGVOYW1lXSkpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihcbiAgICAgICAgYFJlY29yZCB3aXRoIGlkICR7aWR9IG5vdCBmb3VuZCBpbiB0YWJsZSAke3RhYmxlTmFtZX1gXG4gICAgICApO1xuICAgIHJldHVybiB0aGlzLm5hdGl2ZVt0YWJsZU5hbWVdW2lkXTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGF3YWl0IHRoaXMubG9jay5hY3F1aXJlKCk7XG4gICAgaWYgKCEodGFibGVOYW1lIGluIHRoaXMubmF0aXZlKSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKGBUYWJsZSAke3RhYmxlTmFtZX0gbm90IGZvdW5kYCk7XG4gICAgaWYgKCEoaWQgaW4gdGhpcy5uYXRpdmVbdGFibGVOYW1lXSkpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihcbiAgICAgICAgYFJlY29yZCB3aXRoIGlkICR7aWR9IG5vdCBmb3VuZCBpbiB0YWJsZSAke3RhYmxlTmFtZX1gXG4gICAgICApO1xuICAgIHRoaXMubmF0aXZlW3RhYmxlTmFtZV1baWRdID0gbW9kZWw7XG4gICAgdGhpcy5sb2NrLnJlbGVhc2UoKTtcbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICBhc3luYyBkZWxldGUoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlclxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBhd2FpdCB0aGlzLmxvY2suYWNxdWlyZSgpO1xuICAgIGlmICghKHRhYmxlTmFtZSBpbiB0aGlzLm5hdGl2ZSkpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihgVGFibGUgJHt0YWJsZU5hbWV9IG5vdCBmb3VuZGApO1xuICAgIGlmICghKGlkIGluIHRoaXMubmF0aXZlW3RhYmxlTmFtZV0pKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoXG4gICAgICAgIGBSZWNvcmQgd2l0aCBpZCAke2lkfSBub3QgZm91bmQgaW4gdGFibGUgJHt0YWJsZU5hbWV9YFxuICAgICAgKTtcbiAgICBjb25zdCBuYXRpdmVkID0gdGhpcy5uYXRpdmVbdGFibGVOYW1lXVtpZF07XG4gICAgZGVsZXRlIHRoaXMubmF0aXZlW3RhYmxlTmFtZV1baWRdO1xuICAgIHRoaXMubG9jay5yZWxlYXNlKCk7XG4gICAgcmV0dXJuIG5hdGl2ZWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgdGFibGVGb3I8TSBleHRlbmRzIE1vZGVsPihmcm9tOiBzdHJpbmcgfCBDb25zdHJ1Y3RvcjxNPikge1xuICAgIGlmICh0eXBlb2YgZnJvbSA9PT0gXCJzdHJpbmdcIikgZnJvbSA9IE1vZGVsLmdldChmcm9tKSBhcyBDb25zdHJ1Y3RvcjxNPjtcbiAgICBjb25zdCB0YWJsZSA9IFJlcG9zaXRvcnkudGFibGUoZnJvbSk7XG4gICAgaWYgKCEodGFibGUgaW4gdGhpcy5uYXRpdmUpKSB0aGlzLm5hdGl2ZVt0YWJsZV0gPSB7fTtcbiAgICByZXR1cm4gdGhpcy5uYXRpdmVbdGFibGVdO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBhc3luYyByYXc8Wj4ocmF3SW5wdXQ6IFJhbVF1ZXJ5PGFueT4sIHByb2Nlc3M6IGJvb2xlYW4pOiBQcm9taXNlPFo+IHtcbiAgICBjb25zdCB7IHdoZXJlLCBzb3J0LCBsaW1pdCwgc2tpcCwgZnJvbSB9ID0gcmF3SW5wdXQ7XG4gICAgbGV0IHsgc2VsZWN0IH0gPSByYXdJbnB1dDtcbiAgICBjb25zdCBjb2xsZWN0aW9uID0gdGhpcy50YWJsZUZvcihmcm9tKTtcblxuICAgIGNvbnN0IGNsYXp6ID0gdHlwZW9mIGZyb20gPT09IFwic3RyaW5nXCIgPyBNb2RlbC5nZXQoZnJvbSkgOiBmcm9tO1xuICAgIGNvbnN0IHsgaWQsIHByb3BzIH0gPSBmaW5kUHJpbWFyeUtleShuZXcgY2xhenooKSk7XG5cbiAgICBmdW5jdGlvbiBwYXJzZUlkKGlkOiBhbnkpIHtcbiAgICAgIGxldCByZXN1bHQgPSBpZDtcbiAgICAgIHN3aXRjaCAocHJvcHMudHlwZSkge1xuICAgICAgICBjYXNlIFwiTnVtYmVyXCI6XG4gICAgICAgICAgcmVzdWx0ID0gcGFyc2VJbnQocmVzdWx0KTtcbiAgICAgICAgICBpZiAoaXNOYU4ocmVzdWx0KSkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGlkICR7aWR9YCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJCaWdJbnRcIjpcbiAgICAgICAgICByZXN1bHQgPSBCaWdJbnQocGFyc2VJbnQocmVzdWx0KSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJTdHJpbmdcIjpcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgIGBJbnZhbGlkIGlkIHR5cGUgJHtwcm9wcy50eXBlfS4gc2hvdWxkIGJlIGltcG9zc2libGVgXG4gICAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgbGV0IHJlc3VsdDogYW55W10gPSBPYmplY3QuZW50cmllcyhjb2xsZWN0aW9uKS5tYXAoKFtwaywgcl0pID0+XG4gICAgICB0aGlzLnJldmVydChyLCBjbGF6eiwgaWQgYXMgYW55LCBwYXJzZUlkKHBrKSlcbiAgICApO1xuXG4gICAgcmVzdWx0ID0gd2hlcmUgPyByZXN1bHQuZmlsdGVyKHdoZXJlKSA6IHJlc3VsdDtcblxuICAgIGlmIChzb3J0KSByZXN1bHQgPSByZXN1bHQuc29ydChzb3J0KTtcblxuICAgIGlmIChza2lwKSByZXN1bHQgPSByZXN1bHQuc2xpY2Uoc2tpcCk7XG4gICAgaWYgKGxpbWl0KSByZXN1bHQgPSByZXN1bHQuc2xpY2UoMCwgbGltaXQpO1xuXG4gICAgaWYgKHNlbGVjdCkge1xuICAgICAgc2VsZWN0ID0gQXJyYXkuaXNBcnJheShzZWxlY3QpID8gc2VsZWN0IDogW3NlbGVjdF07XG4gICAgICByZXN1bHQgPSByZXN1bHQubWFwKChyKSA9PlxuICAgICAgICBPYmplY3QuZW50cmllcyhyKS5yZWR1Y2UoKGFjYzogUmVjb3JkPHN0cmluZywgYW55PiwgW2tleSwgdmFsXSkgPT4ge1xuICAgICAgICAgIGlmICgoc2VsZWN0IGFzIHN0cmluZ1tdKS5pbmNsdWRlcyhrZXkpKSBhY2Nba2V5XSA9IHZhbDtcbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9LCB7fSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdCBhcyB1bmtub3duIGFzIFo7XG4gIH1cblxuICBhc3luYyBwYWdpbmF0ZTxaPihyYXdJbnB1dDogc3RyaW5nKTogUHJvbWlzZTxQYWdpbmF0b3I8Wiwgc3RyaW5nPj4ge1xuICAgIHJldHVybiBuZXcgKGNsYXNzIGV4dGVuZHMgUGFnaW5hdG9yPFosIHN0cmluZz4ge1xuICAgICAgY29uc3RydWN0b3Ioc2l6ZTogbnVtYmVyKSB7XG4gICAgICAgIHN1cGVyKHVuZGVmaW5lZCBhcyB1bmtub3duIGFzIGFueSwgc2l6ZSwgcmF3SW5wdXQpO1xuICAgICAgfVxuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICBwcm90ZWN0ZWQgcHJlcGFyZShyYXdTdGF0ZW1lbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1ldGhvZCBub3QgaW1wbGVtZW50ZWQuXCIpO1xuICAgICAgfVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgcGFnZShwYWdlOiBudW1iZXIpOiBQcm9taXNlPFpbXT4ge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNZXRob2Qgbm90IGltcGxlbWVudGVkLlwiKTtcbiAgICAgIH1cbiAgICB9KSgxMCk7XG4gIH1cblxuICBwYXJzZUVycm9yPFYgZXh0ZW5kcyBCYXNlRXJyb3I+KGVycjogRXJyb3IpOiBWIHtcbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgQmFzZUVycm9yKSByZXR1cm4gZXJyIGFzIFY7XG4gICAgcmV0dXJuIG5ldyBJbnRlcm5hbEVycm9yKGVycikgYXMgVjtcbiAgfVxuXG4gIGdldCBDbGF1c2VzKCk6IENsYXVzZUZhY3Rvcnk8UmFtU3RvcmFnZSwgUmFtUXVlcnk8YW55PiwgdHlwZW9mIHRoaXM+IHtcbiAgICBpZiAoIXRoaXMuZmFjdG9yeSkgdGhpcy5mYWN0b3J5ID0gbmV3IFJhbUNsYXVzZUZhY3RvcnkodGhpcyk7XG4gICAgcmV0dXJuIHRoaXMuZmFjdG9yeSBhcyBhbnk7XG4gIH1cblxuICBnZXQgU3RhdGVtZW50KCk6IFJhbVN0YXRlbWVudDxhbnk+IHtcbiAgICByZXR1cm4gbmV3IFJhbVN0YXRlbWVudCh0aGlzKTtcbiAgfVxuXG4gIGFzeW5jIFNlcXVlbmNlKG9wdGlvbnM6IFNlcXVlbmNlT3B0aW9ucyk6IFByb21pc2U8U2VxdWVuY2U+IHtcbiAgICByZXR1cm4gbmV3IFJhbVNlcXVlbmNlKG9wdGlvbnMsIHRoaXMpO1xuICB9XG5cbiAgcGFyc2VDb25kaXRpb24oY29uZGl0aW9uOiBDb25kaXRpb24pOiBSYW1RdWVyeTxhbnk+IHtcbiAgICByZXR1cm4ge1xuICAgICAgd2hlcmU6IChtOiBNb2RlbCkgPT4ge1xuICAgICAgICBjb25zdCB7IGF0dHIxLCBvcGVyYXRvciwgY29tcGFyaXNvbiB9ID0gY29uZGl0aW9uIGFzIHVua25vd24gYXMge1xuICAgICAgICAgIGF0dHIxOiBzdHJpbmcgfCBDb25kaXRpb247XG4gICAgICAgICAgb3BlcmF0b3I6IE9wZXJhdG9yIHwgR3JvdXBPcGVyYXRvcjtcbiAgICAgICAgICBjb21wYXJpc29uOiBhbnk7XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIFtHcm91cE9wZXJhdG9yLkFORCwgR3JvdXBPcGVyYXRvci5PUiwgT3BlcmF0b3IuTk9UXS5pbmRleE9mKFxuICAgICAgICAgICAgb3BlcmF0b3IgYXMgR3JvdXBPcGVyYXRvclxuICAgICAgICAgICkgPT09IC0xXG4gICAgICAgICkge1xuICAgICAgICAgIHN3aXRjaCAob3BlcmF0b3IpIHtcbiAgICAgICAgICAgIGNhc2UgT3BlcmF0b3IuQklHR0VSOlxuICAgICAgICAgICAgICByZXR1cm4gbVthdHRyMSBhcyBrZXlvZiBNb2RlbF0gPiBjb21wYXJpc29uO1xuICAgICAgICAgICAgY2FzZSBPcGVyYXRvci5CSUdHRVJfRVE6XG4gICAgICAgICAgICAgIHJldHVybiBtW2F0dHIxIGFzIGtleW9mIE1vZGVsXSA+PSBjb21wYXJpc29uO1xuICAgICAgICAgICAgY2FzZSBPcGVyYXRvci5ESUZGRVJFTlQ6XG4gICAgICAgICAgICAgIHJldHVybiBtW2F0dHIxIGFzIGtleW9mIE1vZGVsXSAhPT0gY29tcGFyaXNvbjtcbiAgICAgICAgICAgIGNhc2UgT3BlcmF0b3IuRVFVQUw6XG4gICAgICAgICAgICAgIHJldHVybiBtW2F0dHIxIGFzIGtleW9mIE1vZGVsXSA9PT0gY29tcGFyaXNvbjtcbiAgICAgICAgICAgIGNhc2UgT3BlcmF0b3IuUkVHRVhQOlxuICAgICAgICAgICAgICBpZiAodHlwZW9mIG1bYXR0cjEgYXMga2V5b2YgTW9kZWxdICE9PSBcInN0cmluZ1wiKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFxuICAgICAgICAgICAgICAgICAgYEludmFsaWQgcmVnZXhwIGNvbXBhcmlzb24gb24gYSBub24gc3RyaW5nIGF0dHJpYnV0ZTogJHttW2F0dHIxIGFzIGtleW9mIE1vZGVsXX1gXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgcmV0dXJuICEhKG1bYXR0cjEgYXMga2V5b2YgTW9kZWxdIGFzIHVua25vd24gYXMgc3RyaW5nKS5tYXRjaChcbiAgICAgICAgICAgICAgICBuZXcgUmVnRXhwKGNvbXBhcmlzb24sIFwiZ1wiKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgY2FzZSBPcGVyYXRvci5TTUFMTEVSOlxuICAgICAgICAgICAgICByZXR1cm4gbVthdHRyMSBhcyBrZXlvZiBNb2RlbF0gPCBjb21wYXJpc29uO1xuICAgICAgICAgICAgY2FzZSBPcGVyYXRvci5TTUFMTEVSX0VROlxuICAgICAgICAgICAgICByZXR1cm4gbVthdHRyMSBhcyBrZXlvZiBNb2RlbF0gPD0gY29tcGFyaXNvbjtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgICAgIGBJbnZhbGlkIG9wZXJhdG9yIGZvciBzdGFuZGFyZCBjb21wYXJpc29uczogJHtvcGVyYXRvcn1gXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdG9yID09PSBPcGVyYXRvci5OT1QpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBvcDE6IFJhbVF1ZXJ5PGFueT4gPSB0aGlzLnBhcnNlQ29uZGl0aW9uKGF0dHIxIGFzIENvbmRpdGlvbik7XG4gICAgICAgICAgY29uc3Qgb3AyOiBSYW1RdWVyeTxhbnk+ID0gdGhpcy5wYXJzZUNvbmRpdGlvbihcbiAgICAgICAgICAgIGNvbXBhcmlzb24gYXMgQ29uZGl0aW9uXG4gICAgICAgICAgKTtcbiAgICAgICAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7XG4gICAgICAgICAgICBjYXNlIEdyb3VwT3BlcmF0b3IuQU5EOlxuICAgICAgICAgICAgICByZXR1cm4gb3AxLndoZXJlKG0pICYmIG9wMi53aGVyZShtKTtcbiAgICAgICAgICAgIGNhc2UgR3JvdXBPcGVyYXRvci5PUjpcbiAgICAgICAgICAgICAgcmV0dXJuIG9wMS53aGVyZShtKSB8fCBvcDIud2hlcmUobSk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgICAgICBgSW52YWxpZCBvcGVyYXRvciBmb3IgQW5kL09yIGNvbXBhcmlzb25zOiAke29wZXJhdG9yfWBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSBhcyBSYW1RdWVyeTxhbnk+O1xuICB9XG59XG4iXX0=
|
453
|
+
RamAdapter.decoration();
|
454
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmFtQWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yYW0vUmFtQWRhcHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxxREFBOEM7QUFDOUMsaURBQTBDO0FBQzFDLCtEQUFzRDtBQUN0RCw0REFBb0U7QUFFcEUsaUZBQTBEO0FBQzFELHlFQUt3QztBQUN4QywyREFRaUM7QUFDakMsbURBQTRDO0FBQzVDLDZDQUF3RDtBQUN4RCwrQ0FBeUM7QUFFekM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBDRztBQUNILE1BQWEsVUFBVyxTQUFRLHFCQUsvQjtJQUNDLFlBQVksS0FBYztRQUN4QixLQUFLLENBQUMsSUFBSSxHQUFHLEVBQTRCLEVBQUUsc0JBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQWtDdkQsWUFBTyxHQUFHLHVCQUFVLENBQUM7UUFFdEIsWUFBTyxHQUdYLEVBQUUsQ0FBQztRQUVDLFNBQUksR0FBRyxJQUFJLCtCQUFJLEVBQUUsQ0FBQztJQXhDMUIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNNLFVBQVU7UUFDakIsT0FBTyxLQUFLLENBQUMsVUFBVSxFQUFzQyxDQUFDO0lBQ2hFLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDTSxLQUFLLENBQ1osU0FBd0IsRUFDeEIsS0FBcUIsRUFDckIsS0FBd0I7UUFFeEIsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRTtZQUN6RCxJQUFJLEVBQUUsTUFBTSxDQUFDLFVBQVUsRUFBRTtTQUMxQixDQUFhLENBQUM7SUFDakIsQ0FBQztJQVdEOzs7Ozs7T0FNRztJQUNILDZEQUE2RDtJQUM3RCxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBVztRQUM3QixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENB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Q0FBQztDQUNGO0FBcGRELGdDQW9kQztBQUVELFVBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJhbUZsYWdzLCBSYXdSYW1RdWVyeSwgUmFtU3RvcmFnZSwgUmFtUmVwb3NpdG9yeSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBSYW1TdGF0ZW1lbnQgfSBmcm9tIFwiLi9SYW1TdGF0ZW1lbnRcIjtcbmltcG9ydCB7IFJhbUNvbnRleHQgfSBmcm9tIFwiLi9SYW1Db250ZXh0XCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvUmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgQWRhcHRlciwgUGVyc2lzdGVuY2VLZXlzLCBTZXF1ZW5jZSB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZVwiO1xuaW1wb3J0IHsgU2VxdWVuY2VPcHRpb25zIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcbmltcG9ydCB7IExvY2sgfSBmcm9tIFwiQGRlY2FmLXRzL3RyYW5zYWN0aW9uYWwtZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHtcbiAgQ29uc3RydWN0b3IsXG4gIERlY29yYXRpb24sXG4gIE1vZGVsLFxuICBwcm9wTWV0YWRhdGEsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7XG4gIEJhc2VFcnJvcixcbiAgQ29uZmxpY3RFcnJvcixcbiAgZmluZFByaW1hcnlLZXksXG4gIEludGVybmFsRXJyb3IsXG4gIE5vdEZvdW5kRXJyb3IsXG4gIG9uQ3JlYXRlLFxuICBPcGVyYXRpb25LZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFJhbVNlcXVlbmNlIH0gZnJvbSBcIi4vUmFtU2VxdWVuY2VcIjtcbmltcG9ydCB7IGNyZWF0ZWRCeU9uUmFtQ3JlYXRlVXBkYXRlIH0gZnJvbSBcIi4vaGFuZGxlcnNcIjtcbmltcG9ydCB7IFJhbUZsYXZvdXIgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSW4tbWVtb3J5IGFkYXB0ZXIgZm9yIGRhdGEgcGVyc2lzdGVuY2VcbiAqIEBzdW1tYXJ5IFRoZSBSYW1BZGFwdGVyIHByb3ZpZGVzIGFuIGluLW1lbW9yeSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcGVyc2lzdGVuY2UgbGF5ZXIuXG4gKiBJdCBzdG9yZXMgZGF0YSBpbiBKYXZhU2NyaXB0IE1hcHMgYW5kIHByb3ZpZGVzIENSVUQgb3BlcmF0aW9ucyBhbmQgcXVlcnkgY2FwYWJpbGl0aWVzLlxuICogVGhpcyBhZGFwdGVyIGlzIHVzZWZ1bCBmb3IgdGVzdGluZywgcHJvdG90eXBpbmcsIGFuZCBhcHBsaWNhdGlvbnMgdGhhdCBkb24ndCByZXF1aXJlXG4gKiBwZXJzaXN0ZW50IHN0b3JhZ2UgYWNyb3NzIGFwcGxpY2F0aW9uIHJlc3RhcnRzLlxuICogQGNsYXNzIFJhbUFkYXB0ZXJcbiAqIEBjYXRlZ29yeSBSYW1cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYSBuZXcgUkFNIGFkYXB0ZXJcbiAqIGNvbnN0IGFkYXB0ZXIgPSBuZXcgUmFtQWRhcHRlcignbXlSYW1BZGFwdGVyJyk7XG4gKlxuICogLy8gQ3JlYXRlIGEgcmVwb3NpdG9yeSBmb3IgYSBtb2RlbFxuICogY29uc3QgdXNlclJlcG8gPSBuZXcgKGFkYXB0ZXIucmVwb3NpdG9yeTxVc2VyPigpKShVc2VyLCBhZGFwdGVyKTtcbiAqXG4gKiAvLyBQZXJmb3JtIENSVUQgb3BlcmF0aW9uc1xuICogY29uc3QgdXNlciA9IG5ldyBVc2VyKHsgbmFtZTogJ0pvaG4nLCBlbWFpbDogJ2pvaG5AZXhhbXBsZS5jb20nIH0pO1xuICogYXdhaXQgdXNlclJlcG8uY3JlYXRlKHVzZXIpO1xuICogY29uc3QgcmV0cmlldmVkVXNlciA9IGF3YWl0IHVzZXJSZXBvLmZpbmRCeUlkKHVzZXIuaWQpO1xuICogYGBgXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICBwYXJ0aWNpcGFudCBSZXBvc2l0b3J5XG4gKiAgIHBhcnRpY2lwYW50IFJhbUFkYXB0ZXJcbiAqICAgcGFydGljaXBhbnQgU3RvcmFnZSBhcyBJbi1NZW1vcnkgU3RvcmFnZVxuICpcbiAqICAgQ2xpZW50LT4+UmVwb3NpdG9yeTogY3JlYXRlKG1vZGVsKVxuICogICBSZXBvc2l0b3J5LT4+UmFtQWRhcHRlcjogY3JlYXRlKHRhYmxlTmFtZSwgaWQsIG1vZGVsKVxuICogICBSYW1BZGFwdGVyLT4+UmFtQWRhcHRlcjogbG9jay5hY3F1aXJlKClcbiAqICAgUmFtQWRhcHRlci0+PlN0b3JhZ2U6IHNldChpZCwgbW9kZWwpXG4gKiAgIFJhbUFkYXB0ZXItPj5SYW1BZGFwdGVyOiBsb2NrLnJlbGVhc2UoKVxuICogICBSYW1BZGFwdGVyLS0+PlJlcG9zaXRvcnk6IG1vZGVsXG4gKiAgIFJlcG9zaXRvcnktLT4+Q2xpZW50OiBtb2RlbFxuICpcbiAqICAgQ2xpZW50LT4+UmVwb3NpdG9yeTogZmluZEJ5SWQoaWQpXG4gKiAgIFJlcG9zaXRvcnktPj5SYW1BZGFwdGVyOiByZWFkKHRhYmxlTmFtZSwgaWQpXG4gKiAgIFJhbUFkYXB0ZXItPj5TdG9yYWdlOiBnZXQoaWQpXG4gKiAgIFN0b3JhZ2UtLT4+UmFtQWRhcHRlcjogbW9kZWxcbiAqICAgUmFtQWRhcHRlci0tPj5SZXBvc2l0b3J5OiBtb2RlbFxuICogICBSZXBvc2l0b3J5LS0+PkNsaWVudDogbW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIFJhbUFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVyPFxuICBSYW1TdG9yYWdlLFxuICBSYXdSYW1RdWVyeTxhbnk+LFxuICBSYW1GbGFncyxcbiAgUmFtQ29udGV4dFxuPiB7XG4gIGNvbnN0cnVjdG9yKGFsaWFzPzogc3RyaW5nKSB7XG4gICAgc3VwZXIobmV3IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIGFueT4+KCksIFJhbUZsYXZvdXIsIGFsaWFzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgcmVwb3NpdG9yeSBjb25zdHJ1Y3RvciBmb3IgYSBtb2RlbFxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIGEgY29uc3RydWN0b3IgZm9yIGNyZWF0aW5nIHJlcG9zaXRvcmllcyB0aGF0IHdvcmsgd2l0aCB0aGUgc3BlY2lmaWVkIG1vZGVsIHR5cGUuXG4gICAqIFRoaXMgbWV0aG9kIG92ZXJyaWRlcyB0aGUgYmFzZSBpbXBsZW1lbnRhdGlvbiB0byBwcm92aWRlIFJBTS1zcGVjaWZpYyByZXBvc2l0b3J5IGZ1bmN0aW9uYWxpdHkuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgZm9yIHRoZSByZXBvc2l0b3J5XG4gICAqIEByZXR1cm4ge0NvbnN0cnVjdG9yPFJhbVJlcG9zaXRvcnk8TT4+fSBBIGNvbnN0cnVjdG9yIGZvciBjcmVhdGluZyBSQU0gcmVwb3NpdG9yaWVzXG4gICAqL1xuICBvdmVycmlkZSByZXBvc2l0b3J5PE0gZXh0ZW5kcyBNb2RlbD4oKTogQ29uc3RydWN0b3I8UmFtUmVwb3NpdG9yeTxNPj4ge1xuICAgIHJldHVybiBzdXBlci5yZXBvc2l0b3J5PE0+KCkgYXMgQ29uc3RydWN0b3I8UmFtUmVwb3NpdG9yeTxNPj47XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgb3BlcmF0aW9uIGZsYWdzIHdpdGggVVVJRFxuICAgKiBAc3VtbWFyeSBFeHRlbmRzIHRoZSBiYXNlIGZsYWdzIHdpdGggYSBVVUlEIGZvciB1c2VyIGlkZW50aWZpY2F0aW9uLlxuICAgKiBUaGlzIG1ldGhvZCBlbnN1cmVzIHRoYXQgYWxsIG9wZXJhdGlvbnMgaGF2ZSBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0cmFja2luZyBwdXJwb3Nlcy5cbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBmb3IgdGhlIG9wZXJhdGlvblxuICAgKiBAcGFyYW0ge09wZXJhdGlvbktleXN9IG9wZXJhdGlvbiAtIFRoZSB0eXBlIG9mIG9wZXJhdGlvbiBiZWluZyBwZXJmb3JtZWRcbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgLSBUaGUgbW9kZWwgY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtQYXJ0aWFsPFJhbUZsYWdzPn0gZmxhZ3MgLSBQYXJ0aWFsIGZsYWdzIHRvIGJlIGV4dGVuZGVkXG4gICAqIEByZXR1cm4ge1JhbUZsYWdzfSBDb21wbGV0ZSBmbGFncyB3aXRoIFVVSURcbiAgICovXG4gIG92ZXJyaWRlIGZsYWdzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb3BlcmF0aW9uOiBPcGVyYXRpb25LZXlzLFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgICBmbGFnczogUGFydGlhbDxSYW1GbGFncz5cbiAgKTogUmFtRmxhZ3Mge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHN1cGVyLmZsYWdzKG9wZXJhdGlvbiwgbW9kZWwsIGZsYWdzKSwge1xuICAgICAgVVVJRDogY3J5cHRvLnJhbmRvbVVVSUQoKSxcbiAgICB9KSBhcyBSYW1GbGFncztcbiAgfVxuXG4gIG92ZXJyaWRlIENvbnRleHQgPSBSYW1Db250ZXh0O1xuXG4gIHByaXZhdGUgaW5kZXhlczogUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICBSZWNvcmQ8c3RyaW5nIHwgbnVtYmVyLCBSZWNvcmQ8c3RyaW5nLCBhbnk+PlxuICA+ID0ge307XG5cbiAgcHJpdmF0ZSBsb2NrID0gbmV3IExvY2soKTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemVzIHRoZSBSQU0gYWRhcHRlclxuICAgKiBAc3VtbWFyeSBBIG5vLW9wIGluaXRpYWxpemF0aW9uIG1ldGhvZCBmb3IgdGhlIFJBTSBhZGFwdGVyLlxuICAgKiBTaW5jZSBSQU0gYWRhcHRlciBkb2Vzbid0IHJlcXVpcmUgYW55IHNldHVwLCB0aGlzIG1ldGhvZCBzaW1wbHkgcmVzb2x2ZXMgaW1tZWRpYXRlbHkuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBJbml0aWFsaXphdGlvbiBhcmd1bWVudHMgKHVudXNlZClcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBpbml0aWFsaXphdGlvbiBpcyBjb21wbGV0ZVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBhc3luYyBpbml0aWFsaXplKC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbmRleGVzIG1vZGVscyBpbiB0aGUgUkFNIGFkYXB0ZXJcbiAgICogQHN1bW1hcnkgQSBuby1vcCBpbmRleGluZyBtZXRob2QgZm9yIHRoZSBSQU0gYWRhcHRlci5cbiAgICogU2luY2UgUkFNIGFkYXB0ZXIgZG9lc24ndCByZXF1aXJlIGV4cGxpY2l0IGluZGV4aW5nLCB0aGlzIG1ldGhvZCBzaW1wbHkgcmVzb2x2ZXMgaW1tZWRpYXRlbHkuXG4gICAqIEBwYXJhbSBtb2RlbHMgLSBNb2RlbHMgdG8gYmUgaW5kZXhlZCAodW51c2VkKVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPGFueT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gaW5kZXhpbmcgaXMgY29tcGxldGVcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgYXN5bmMgaW5kZXgoLi4ubW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10pOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgYSBtb2RlbCBmb3Igc3RvcmFnZVxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBhIG1vZGVsIGluc3RhbmNlIHRvIGEgZm9ybWF0IHN1aXRhYmxlIGZvciBzdG9yYWdlIGluIHRoZSBSQU0gYWRhcHRlci5cbiAgICogVGhpcyBtZXRob2QgZXh0cmFjdHMgdGhlIHByaW1hcnkga2V5IGFuZCBjcmVhdGVzIGEgcmVjb3JkIHdpdGhvdXQgdGhlIHByaW1hcnkga2V5IGZpZWxkLlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGJlaW5nIHByZXBhcmVkXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgdG8gcHJlcGFyZVxuICAgKiBAcGFyYW0gcGsgLSBUaGUgcHJpbWFyeSBrZXkgcHJvcGVydHkgbmFtZVxuICAgKiBAcmV0dXJuIE9iamVjdCBjb250YWluaW5nIHRoZSByZWNvcmQgYW5kIElEXG4gICAqL1xuICBvdmVycmlkZSBwcmVwYXJlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgbW9kZWw6IE0sXG4gICAgcGs6IGtleW9mIE1cbiAgKTogeyByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT47IGlkOiBzdHJpbmcgfSB7XG4gICAgY29uc3QgcHJlcGFyZWQgPSBzdXBlci5wcmVwYXJlKG1vZGVsLCBwayk7XG4gICAgZGVsZXRlIHByZXBhcmVkLnJlY29yZFtwayBhcyBzdHJpbmddO1xuICAgIHJldHVybiBwcmVwYXJlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29udmVydHMgYSBzdG9yZWQgcmVjb3JkIGJhY2sgdG8gYSBtb2RlbCBpbnN0YW5jZVxuICAgKiBAc3VtbWFyeSBSZWNvbnN0cnVjdHMgYSBtb2RlbCBpbnN0YW5jZSBmcm9tIGEgc3RvcmVkIHJlY29yZCBieSBhZGRpbmcgYmFjayB0aGUgcHJpbWFyeSBrZXkuXG4gICAqIFRoaXMgbWV0aG9kIGlzIHRoZSBpbnZlcnNlIG9mIHRoZSBwcmVwYXJlIG1ldGhvZC5cbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSB0byByZXZlcnQgdG9cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBvYmogLSBUaGUgc3RvcmVkIHJlY29yZFxuICAgKiBAcGFyYW0ge3N0cmluZyB8IENvbnN0cnVjdG9yPE0+fSBjbGF6eiAtIFRoZSBtb2RlbCBjbGFzcyBvciBuYW1lXG4gICAqIEBwYXJhbSBwayAtIFRoZSBwcmltYXJ5IGtleSBwcm9wZXJ0eSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBpZCAtIFRoZSBwcmltYXJ5IGtleSB2YWx1ZVxuICAgKiBAcmV0dXJuIHtNfSBUaGUgcmVjb25zdHJ1Y3RlZCBtb2RlbCBpbnN0YW5jZVxuICAgKi9cbiAgb3ZlcnJpZGUgcmV2ZXJ0PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGNsYXp6OiBzdHJpbmcgfCBDb25zdHJ1Y3RvcjxNPixcbiAgICBwazoga2V5b2YgTSxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyXG4gICk6IE0ge1xuICAgIGNvbnN0IHJlcyA9IHN1cGVyLnJldmVydChvYmosIGNsYXp6LCBwaywgaWQpO1xuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgcmVjb3JkIGluIHRoZSBpbi1tZW1vcnkgc3RvcmFnZVxuICAgKiBAc3VtbWFyeSBTdG9yZXMgYSBuZXcgcmVjb3JkIGluIHRoZSBzcGVjaWZpZWQgdGFibGUgd2l0aCB0aGUgZ2l2ZW4gSUQuXG4gICAqIFRoaXMgbWV0aG9kIGFjcXVpcmVzIGEgbG9jayB0byBlbnN1cmUgdGhyZWFkIHNhZmV0eSwgY3JlYXRlcyB0aGUgdGFibGUgaWYgaXQgZG9lc24ndCBleGlzdCxcbiAgICogY2hlY2tzIGZvciBjb25mbGljdHMsIGFuZCBzdG9yZXMgdGhlIG1vZGVsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlIHRvIHN0b3JlIHRoZSByZWNvcmQgaW5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVjb3JkXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gbW9kZWwgLSBUaGUgcmVjb3JkIGRhdGEgdG8gc3RvcmVcbiAgICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHN0b3JlZCByZWNvcmRcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gICAqICAgcGFydGljaXBhbnQgUmFtQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IFN0b3JhZ2UgYXMgSW4tTWVtb3J5IFN0b3JhZ2VcbiAgICpcbiAgICogICBDYWxsZXItPj5SYW1BZGFwdGVyOiBjcmVhdGUodGFibGVOYW1lLCBpZCwgbW9kZWwpXG4gICAqICAgUmFtQWRhcHRlci0+PlJhbUFkYXB0ZXI6IGxvY2suYWNxdWlyZSgpXG4gICAqICAgUmFtQWRhcHRlci0+PlN0b3JhZ2U6IGhhcyh0YWJsZU5hbWUpXG4gICAqICAgYWx0IFRhYmxlIGRvZXNuJ3QgZXhpc3RcbiAgICogICAgIFJhbUFkYXB0ZXItPj5TdG9yYWdlOiBzZXQodGFibGVOYW1lLCBuZXcgTWFwKCkpXG4gICAqICAgZW5kXG4gICAqICAgUmFtQWRhcHRlci0+PlN0b3JhZ2U6IGhhcyhpZClcbiAgICogICBhbHQgUmVjb3JkIGV4aXN0c1xuICAgKiAgICAgUmFtQWRhcHRlci0tPj5DYWxsZXI6IHRocm93IENvbmZsaWN0RXJyb3JcbiAgICogICBlbmRcbiAgICogICBSYW1BZGFwdGVyLT4+U3RvcmFnZTogc2V0KGlkLCBtb2RlbClcbiAgICogICBSYW1BZGFwdGVyLT4+UmFtQWRhcHRlcjogbG9jay5yZWxlYXNlKClcbiAgICogICBSYW1BZGFwdGVyLS0+PkNhbGxlcjogbW9kZWxcbiAgICovXG4gIGFzeW5jIGNyZWF0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGF3YWl0IHRoaXMubG9jay5hY3F1aXJlKCk7XG4gICAgaWYgKCF0aGlzLm5hdGl2ZS5oYXModGFibGVOYW1lKSkgdGhpcy5uYXRpdmUuc2V0KHRhYmxlTmFtZSwgbmV3IE1hcCgpKTtcbiAgICBpZiAodGhpcy5uYXRpdmUuZ2V0KHRhYmxlTmFtZSkgJiYgdGhpcy5uYXRpdmUuZ2V0KHRhYmxlTmFtZSk/LmhhcyhpZCkpXG4gICAgICB0aHJvdyBuZXcgQ29uZmxpY3RFcnJvcihcbiAgICAgICAgYFJlY29yZCB3aXRoIGlkICR7aWR9IGFscmVhZHkgZXhpc3RzIGluIHRhYmxlICR7dGFibGVOYW1lfWBcbiAgICAgICk7XG4gICAgdGhpcy5uYXRpdmUuZ2V0KHRhYmxlTmFtZSk/LnNldChpZCwgbW9kZWwpO1xuICAgIHRoaXMubG9jay5yZWxlYXNlKCk7XG4gICAgcmV0dXJuIG1vZGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYSByZWNvcmQgZnJvbSBpbi1tZW1vcnkgc3RvcmFnZVxuICAgKiBAc3VtbWFyeSBGZXRjaGVzIGEgcmVjb3JkIHdpdGggdGhlIHNwZWNpZmllZCBJRCBmcm9tIHRoZSBnaXZlbiB0YWJsZS5cbiAgICogVGhpcyBtZXRob2QgY2hlY2tzIGlmIHRoZSB0YWJsZSBhbmQgcmVjb3JkIGV4aXN0IGFuZCB0aHJvd3MgYXBwcm9wcmlhdGUgZXJyb3JzIGlmIG5vdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB0byByZXRyaWV2ZSBmcm9tXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBpZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgcmVjb3JkIHRvIHJldHJpZXZlXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSByZXRyaWV2ZWQgcmVjb3JkXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICAgKiAgIHBhcnRpY2lwYW50IFJhbUFkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBTdG9yYWdlIGFzIEluLU1lbW9yeSBTdG9yYWdlXG4gICAqXG4gICAqICAgQ2FsbGVyLT4+UmFtQWRhcHRlcjogcmVhZCh0YWJsZU5hbWUsIGlkKVxuICAgKiAgIFJhbUFkYXB0ZXItPj5TdG9yYWdlOiBoYXModGFibGVOYW1lKVxuICAgKiAgIGFsdCBUYWJsZSBkb2Vzbid0IGV4aXN0XG4gICAqICAgICBSYW1BZGFwdGVyLS0+PkNhbGxlcjogdGhyb3cgTm90Rm91bmRFcnJvclxuICAgKiAgIGVuZFxuICAgKiAgIFJhbUFkYXB0ZXItPj5TdG9yYWdlOiBoYXMoaWQpXG4gICAqICAgYWx0IFJlY29yZCBkb2Vzbid0IGV4aXN0XG4gICAqICAgICBSYW1BZGFwdGVyLS0+PkNhbGxlcjogdGhyb3cgTm90Rm91bmRFcnJvclxuICAgKiAgIGVuZFxuICAgKiAgIFJhbUFkYXB0ZXItPj5TdG9yYWdlOiBnZXQoaWQpXG4gICAqICAgU3RvcmFnZS0tPj5SYW1BZGFwdGVyOiByZWNvcmRcbiAgICogICBSYW1BZGFwdGVyLS0+PkNhbGxlcjogcmVjb3JkXG4gICAqL1xuICBhc3luYyByZWFkKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXJcbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgaWYgKCF0aGlzLm5hdGl2ZS5oYXModGFibGVOYW1lKSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKGBUYWJsZSAke3RhYmxlTmFtZX0gbm90IGZvdW5kYCk7XG4gICAgaWYgKCF0aGlzLm5hdGl2ZS5nZXQodGFibGVOYW1lKT8uaGFzKGlkKSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKFxuICAgICAgICBgUmVjb3JkIHdpdGggaWQgJHtpZH0gbm90IGZvdW5kIGluIHRhYmxlICR7dGFibGVOYW1lfWBcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMubmF0aXZlLmdldCh0YWJsZU5hbWUpPy5nZXQoaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIGFuIGV4aXN0aW5nIHJlY29yZCBpbiB0aGUgaW4tbWVtb3J5IHN0b3JhZ2VcbiAgICogQHN1bW1hcnkgVXBkYXRlcyBhIHJlY29yZCB3aXRoIHRoZSBzcGVjaWZpZWQgSUQgaW4gdGhlIGdpdmVuIHRhYmxlLlxuICAgKiBUaGlzIG1ldGhvZCBhY3F1aXJlcyBhIGxvY2sgdG8gZW5zdXJlIHRocmVhZCBzYWZldHksIGNoZWNrcyBpZiB0aGUgdGFibGUgYW5kIHJlY29yZCBleGlzdCxcbiAgICogYW5kIHVwZGF0ZXMgdGhlIHJlY29yZCB3aXRoIHRoZSBuZXcgZGF0YS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSBjb250YWluaW5nIHRoZSByZWNvcmRcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSByZWNvcmQgdG8gdXBkYXRlXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gbW9kZWwgLSBUaGUgbmV3IHJlY29yZCBkYXRhXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSB1cGRhdGVkIHJlY29yZFxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAgICogICBwYXJ0aWNpcGFudCBSYW1BZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgU3RvcmFnZSBhcyBJbi1NZW1vcnkgU3RvcmFnZVxuICAgKlxuICAgKiAgIENhbGxlci0+PlJhbUFkYXB0ZXI6IHVwZGF0ZSh0YWJsZU5hbWUsIGlkLCBtb2RlbClcbiAgICogICBSYW1BZGFwdGVyLT4+UmFtQWRhcHRlcjogbG9jay5hY3F1aXJlKClcbiAgICogICBSYW1BZGFwdGVyLT4+U3RvcmFnZTogaGFzKHRhYmxlTmFtZSlcbiAgICogICBhbHQgVGFibGUgZG9lc24ndCBleGlzdFxuICAgKiAgICAgUmFtQWRhcHRlci0tPj5DYWxsZXI6IHRocm93IE5vdEZvdW5kRXJyb3JcbiAgICogICBlbmRcbiAgICogICBSYW1BZGFwdGVyLT4+U3RvcmFnZTogaGFzKGlkKVxuICAgKiAgIGFsdCBSZWNvcmQgZG9lc24ndCBleGlzdFxuICAgKiAgICAgUmFtQWRhcHRlci0tPj5DYWxsZXI6IHRocm93IE5vdEZvdW5kRXJyb3JcbiAgICogICBlbmRcbiAgICogICBSYW1BZGFwdGVyLT4+U3RvcmFnZTogc2V0KGlkLCBtb2RlbClcbiAgICogICBSYW1BZGFwdGVyLT4+UmFtQWRhcHRlcjogbG9jay5yZWxlYXNlKClcbiAgICogICBSYW1BZGFwdGVyLS0+PkNhbGxlcjogbW9kZWxcbiAgICovXG4gIGFzeW5jIHVwZGF0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGF3YWl0IHRoaXMubG9jay5hY3F1aXJlKCk7XG4gICAgaWYgKCF0aGlzLm5hdGl2ZS5oYXModGFibGVOYW1lKSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKGBUYWJsZSAke3RhYmxlTmFtZX0gbm90IGZvdW5kYCk7XG4gICAgaWYgKCF0aGlzLm5hdGl2ZS5nZXQodGFibGVOYW1lKT8uaGFzKGlkKSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKFxuICAgICAgICBgUmVjb3JkIHdpdGggaWQgJHtpZH0gbm90IGZvdW5kIGluIHRhYmxlICR7dGFibGVOYW1lfWBcbiAgICAgICk7XG4gICAgdGhpcy5uYXRpdmUuZ2V0KHRhYmxlTmFtZSk/LnNldChpZCwgbW9kZWwpO1xuICAgIHRoaXMubG9jay5yZWxlYXNlKCk7XG4gICAgcmV0dXJuIG1vZGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIGEgcmVjb3JkIGZyb20gdGhlIGluLW1lbW9yeSBzdG9yYWdlXG4gICAqIEBzdW1tYXJ5IFJlbW92ZXMgYSByZWNvcmQgd2l0aCB0aGUgc3BlY2lmaWVkIElEIGZyb20gdGhlIGdpdmVuIHRhYmxlLlxuICAgKiBUaGlzIG1ldGhvZCBhY3F1aXJlcyBhIGxvY2sgdG8gZW5zdXJlIHRocmVhZCBzYWZldHksIGNoZWNrcyBpZiB0aGUgdGFibGUgYW5kIHJlY29yZCBleGlzdCxcbiAgICogcmV0cmlldmVzIHRoZSByZWNvcmQgYmVmb3JlIGRlbGV0aW9uLCBhbmQgdGhlbiByZW1vdmVzIGl0IGZyb20gc3RvcmFnZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSBjb250YWluaW5nIHRoZSByZWNvcmRcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSByZWNvcmQgdG8gZGVsZXRlXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBkZWxldGVkIHJlY29yZFxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAgICogICBwYXJ0aWNpcGFudCBSYW1BZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgU3RvcmFnZSBhcyBJbi1NZW1vcnkgU3RvcmFnZVxuICAgKlxuICAgKiAgIENhbGxlci0+PlJhbUFkYXB0ZXI6IGRlbGV0ZSh0YWJsZU5hbWUsIGlkKVxuICAgKiAgIFJhbUFkYXB0ZXItPj5SYW1BZGFwdGVyOiBsb2NrLmFjcXVpcmUoKVxuICAgKiAgIFJhbUFkYXB0ZXItPj5TdG9yYWdlOiBoYXModGFibGVOYW1lKVxuICAgKiAgIGFsdCBUYWJsZSBkb2Vzbid0IGV4aXN0XG4gICAqICAgICBSYW1BZGFwdGVyLS0+PkNhbGxlcjogdGhyb3cgTm90Rm91bmRFcnJvclxuICAgKiAgIGVuZFxuICAgKiAgIFJhbUFkYXB0ZXItPj5TdG9yYWdlOiBoYXMoaWQpXG4gICAqICAgYWx0IFJlY29yZCBkb2Vzbid0IGV4aXN0XG4gICAqICAgICBSYW1BZGFwdGVyLS0+PkNhbGxlcjogdGhyb3cgTm90Rm91bmRFcnJvclxuICAgKiAgIGVuZFxuICAgKiAgIFJhbUFkYXB0ZXItPj5TdG9yYWdlOiBnZXQoaWQpXG4gICAqICAgU3RvcmFnZS0tPj5SYW1BZGFwdGVyOiByZWNvcmRcbiAgICogICBSYW1BZGFwdGVyLT4+U3RvcmFnZTogZGVsZXRlKGlkKVxuICAgKiAgIFJhbUFkYXB0ZXItPj5SYW1BZGFwdGVyOiBsb2NrLnJlbGVhc2UoKVxuICAgKiAgIFJhbUFkYXB0ZXItLT4+Q2FsbGVyOiByZWNvcmRcbiAgICovXG4gIGFzeW5jIGRlbGV0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGF3YWl0IHRoaXMubG9jay5hY3F1aXJlKCk7XG4gICAgaWYgKCF0aGlzLm5hdGl2ZS5oYXModGFibGVOYW1lKSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKGBUYWJsZSAke3RhYmxlTmFtZX0gbm90IGZvdW5kYCk7XG4gICAgaWYgKCF0aGlzLm5hdGl2ZS5nZXQodGFibGVOYW1lKT8uaGFzKGlkKSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKFxuICAgICAgICBgUmVjb3JkIHdpdGggaWQgJHtpZH0gbm90IGZvdW5kIGluIHRhYmxlICR7dGFibGVOYW1lfWBcbiAgICAgICk7XG4gICAgY29uc3QgbmF0aXZlZCA9IHRoaXMubmF0aXZlLmdldCh0YWJsZU5hbWUpPy5nZXQoaWQpO1xuICAgIHRoaXMubmF0aXZlLmdldCh0YWJsZU5hbWUpPy5kZWxldGUoaWQpO1xuICAgIHRoaXMubG9jay5yZWxlYXNlKCk7XG4gICAgcmV0dXJuIG5hdGl2ZWQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgb3IgY3JlYXRlcyBhIHRhYmxlIGluIHRoZSBpbi1tZW1vcnkgc3RvcmFnZVxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIE1hcCByZXByZXNlbnRpbmcgYSB0YWJsZSBmb3IgYSBnaXZlbiBtb2RlbCBvciB0YWJsZSBuYW1lLlxuICAgKiBJZiB0aGUgdGFibGUgZG9lc24ndCBleGlzdCwgaXQgY3JlYXRlcyBhIG5ldyBvbmUuIFRoaXMgaXMgYSBoZWxwZXIgbWV0aG9kIHVzZWRcbiAgICogYnkgb3RoZXIgbWV0aG9kcyB0byBhY2Nlc3MgdGhlIGNvcnJlY3Qgc3RvcmFnZSBsb2NhdGlvbi5cbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBmb3IgdGhlIHRhYmxlXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgQ29uc3RydWN0b3I8TT59IGZyb20gLSBUaGUgbW9kZWwgY2xhc3Mgb3IgdGFibGUgbmFtZVxuICAgKiBAcmV0dXJuIHtNYXA8c3RyaW5nIHwgbnVtYmVyLCBhbnk+IHwgdW5kZWZpbmVkfSBUaGUgdGFibGUgTWFwIG9yIHVuZGVmaW5lZFxuICAgKi9cbiAgcHJvdGVjdGVkIHRhYmxlRm9yPE0gZXh0ZW5kcyBNb2RlbD4oZnJvbTogc3RyaW5nIHwgQ29uc3RydWN0b3I8TT4pIHtcbiAgICBpZiAodHlwZW9mIGZyb20gPT09IFwic3RyaW5nXCIpIGZyb20gPSBNb2RlbC5nZXQoZnJvbSkgYXMgQ29uc3RydWN0b3I8TT47XG4gICAgY29uc3QgdGFibGUgPSBSZXBvc2l0b3J5LnRhYmxlKGZyb20pO1xuICAgIGlmICghdGhpcy5uYXRpdmUuaGFzKHRhYmxlKSkgdGhpcy5uYXRpdmUuc2V0KHRhYmxlLCBuZXcgTWFwKCkpO1xuICAgIHJldHVybiB0aGlzLm5hdGl2ZS5nZXQodGFibGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhIHJhdyBxdWVyeSBhZ2FpbnN0IHRoZSBpbi1tZW1vcnkgc3RvcmFnZVxuICAgKiBAc3VtbWFyeSBQZXJmb3JtcyBhIHF1ZXJ5IG9wZXJhdGlvbiBvbiB0aGUgaW4tbWVtb3J5IGRhdGEgc3RvcmUgdXNpbmcgdGhlIHByb3ZpZGVkIHF1ZXJ5IHNwZWNpZmljYXRpb24uXG4gICAqIFRoaXMgbWV0aG9kIHN1cHBvcnRzIGZpbHRlcmluZywgc29ydGluZywgcGFnaW5hdGlvbiwgYW5kIGZpZWxkIHNlbGVjdGlvbi5cbiAgICogQHRlbXBsYXRlIFIgLSBUaGUgcmV0dXJuIHR5cGUgb2YgdGhlIHF1ZXJ5XG4gICAqIEBwYXJhbSB7UmF3UmFtUXVlcnk8YW55Pn0gcmF3SW5wdXQgLSBUaGUgcXVlcnkgc3BlY2lmaWNhdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFI+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcXVlcnkgcmVzdWx0c1xuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAgICogICBwYXJ0aWNpcGFudCBSYW1BZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgU3RvcmFnZSBhcyBJbi1NZW1vcnkgU3RvcmFnZVxuICAgKlxuICAgKiAgIENhbGxlci0+PlJhbUFkYXB0ZXI6IHJhdyhyYXdJbnB1dClcbiAgICogICBSYW1BZGFwdGVyLT4+UmFtQWRhcHRlcjogdGFibGVGb3IoZnJvbSlcbiAgICogICBhbHQgVGFibGUgZG9lc24ndCBleGlzdFxuICAgKiAgICAgUmFtQWRhcHRlci0tPj5DYWxsZXI6IHRocm93IEludGVybmFsRXJyb3JcbiAgICogICBlbmRcbiAgICogICBSYW1BZGFwdGVyLT4+UmFtQWRhcHRlcjogZmluZFByaW1hcnlLZXkobmV3IGZyb20oKSlcbiAgICogICBSYW1BZGFwdGVyLT4+U3RvcmFnZTogZW50cmllcygpXG4gICAqICAgU3RvcmFnZS0tPj5SYW1BZGFwdGVyOiBlbnRyaWVzXG4gICAqICAgbG9vcCBGb3IgZWFjaCBlbnRyeVxuICAgKiAgICAgUmFtQWRhcHRlci0+PlJhbUFkYXB0ZXI6IHJldmVydChyLCBmcm9tLCBpZCwgcGspXG4gICAqICAgZW5kXG4gICAqICAgYWx0IFdoZXJlIGNvbmRpdGlvbiBleGlzdHNcbiAgICogICAgIFJhbUFkYXB0ZXItPj5SYW1BZGFwdGVyOiByZXN1bHQuZmlsdGVyKHdoZXJlKVxuICAgKiAgIGVuZFxuICAgKiAgIGFsdCBTb3J0IGNvbmRpdGlvbiBleGlzdHNcbiAgICogICAgIFJhbUFkYXB0ZXItPj5SYW1BZGFwdGVyOiByZXN1bHQuc29ydChzb3J0KVxuICAgKiAgIGVuZFxuICAgKiAgIGFsdCBTa2lwIHNwZWNpZmllZFxuICAgKiAgICAgUmFtQWRhcHRlci0+PlJhbUFkYXB0ZXI6IHJlc3VsdC5zbGljZShza2lwKVxuICAgKiAgIGVuZFxuICAgKiAgIGFsdCBMaW1pdCBzcGVjaWZpZWRcbiAgICogICAgIFJhbUFkYXB0ZXItPj5SYW1BZGFwdGVyOiByZXN1bHQuc2xpY2UoMCwgbGltaXQpXG4gICAqICAgZW5kXG4gICAqICAgYWx0IFNlbGVjdCBmaWVsZHMgc3BlY2lmaWVkXG4gICAqICAgICBsb29wIEZvciBlYWNoIHJlc3VsdFxuICAgKiAgICAgICBSYW1BZGFwdGVyLT4+UmFtQWRhcHRlcjogRmlsdGVyIHRvIHNlbGVjdGVkIGZpZWxkc1xuICAgKiAgICAgZW5kXG4gICAqICAgZW5kXG4gICAqICAgUmFtQWRhcHRlci0tPj5DYWxsZXI6IHJlc3VsdFxuICAgKi9cbiAgYXN5bmMgcmF3PFI+KHJhd0lucHV0OiBSYXdSYW1RdWVyeTxhbnk+KTogUHJvbWlzZTxSPiB7XG4gICAgY29uc3QgeyB3aGVyZSwgc29ydCwgbGltaXQsIHNraXAsIGZyb20gfSA9IHJhd0lucHV0O1xuICAgIGxldCB7IHNlbGVjdCB9ID0gcmF3SW5wdXQ7XG4gICAgY29uc3QgY29sbGVjdGlvbiA9IHRoaXMudGFibGVGb3IoZnJvbSk7XG4gICAgaWYgKCFjb2xsZWN0aW9uKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYFRhYmxlICR7ZnJvbX0gbm90IGZvdW5kIGluIFJhbUFkYXB0ZXJgKTtcbiAgICBjb25zdCB7IGlkLCBwcm9wcyB9ID0gZmluZFByaW1hcnlLZXkobmV3IGZyb20oKSk7XG5cbiAgICBsZXQgcmVzdWx0OiBhbnlbXSA9IEFycmF5LmZyb20oY29sbGVjdGlvbi5lbnRyaWVzKCkpLm1hcCgoW3BrLCByXSkgPT5cbiAgICAgIHRoaXMucmV2ZXJ0KFxuICAgICAgICByLFxuICAgICAgICBmcm9tLFxuICAgICAgICBpZCBhcyBhbnksXG4gICAgICAgIFNlcXVlbmNlLnBhcnNlVmFsdWUocHJvcHMudHlwZSBhcyBhbnksIHBrIGFzIHN0cmluZykgYXMgc3RyaW5nXG4gICAgICApXG4gICAgKTtcblxuICAgIHJlc3VsdCA9IHdoZXJlID8gcmVzdWx0LmZpbHRlcih3aGVyZSkgOiByZXN1bHQ7XG5cbiAgICBpZiAoc29ydCkgcmVzdWx0ID0gcmVzdWx0LnNvcnQoc29ydCk7XG5cbiAgICBpZiAoc2tpcCkgcmVzdWx0ID0gcmVzdWx0LnNsaWNlKHNraXApO1xuICAgIGlmIChsaW1pdCkgcmVzdWx0ID0gcmVzdWx0LnNsaWNlKDAsIGxpbWl0KTtcblxuICAgIGlmIChzZWxlY3QpIHtcbiAgICAgIHNlbGVjdCA9IEFycmF5LmlzQXJyYXkoc2VsZWN0KSA/IHNlbGVjdCA6IFtzZWxlY3RdO1xuICAgICAgcmVzdWx0ID0gcmVzdWx0Lm1hcCgocikgPT5cbiAgICAgICAgT2JqZWN0LmVudHJpZXMocikucmVkdWNlKChhY2M6IFJlY29yZDxzdHJpbmcsIGFueT4sIFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgICBpZiAoKHNlbGVjdCBhcyBzdHJpbmdbXSkuaW5jbHVkZXMoa2V5KSkgYWNjW2tleV0gPSB2YWw7XG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSwge30pXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQgYXMgdW5rbm93biBhcyBSO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQYXJzZXMgYW5kIGNvbnZlcnRzIGVycm9ycyB0byBhcHByb3ByaWF0ZSB0eXBlc1xuICAgKiBAc3VtbWFyeSBFbnN1cmVzIHRoYXQgZXJyb3JzIGFyZSBvZiB0aGUgY29ycmVjdCB0eXBlIGZvciBjb25zaXN0ZW50IGVycm9yIGhhbmRsaW5nLlxuICAgKiBJZiB0aGUgZXJyb3IgaXMgYWxyZWFkeSBhIEJhc2VFcnJvciwgaXQncyByZXR1cm5lZCBhcyBpczsgb3RoZXJ3aXNlLCBpdCdzIHdyYXBwZWQgaW4gYW4gSW50ZXJuYWxFcnJvci5cbiAgICogQHRlbXBsYXRlIFYgLSBUaGUgZXhwZWN0ZWQgZXJyb3IgdHlwZSwgZXh0ZW5kaW5nIEJhc2VFcnJvclxuICAgKiBAcGFyYW0ge0Vycm9yfSBlcnIgLSBUaGUgZXJyb3IgdG8gcGFyc2VcbiAgICogQHJldHVybiB7Vn0gVGhlIHBhcnNlZCBlcnJvciBvZiB0aGUgZXhwZWN0ZWQgdHlwZVxuICAgKi9cbiAgcGFyc2VFcnJvcjxWIGV4dGVuZHMgQmFzZUVycm9yPihlcnI6IEVycm9yKTogViB7XG4gICAgaWYgKGVyciBpbnN0YW5jZW9mIEJhc2VFcnJvcikgcmV0dXJuIGVyciBhcyBWO1xuICAgIHJldHVybiBuZXcgSW50ZXJuYWxFcnJvcihlcnIpIGFzIFY7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgc3RhdGVtZW50IGJ1aWxkZXIgZm9yIHF1ZXJpZXNcbiAgICogQHN1bW1hcnkgRmFjdG9yeSBtZXRob2QgdGhhdCBjcmVhdGVzIGEgbmV3IFJhbVN0YXRlbWVudCBpbnN0YW5jZSBmb3IgYnVpbGRpbmcgcXVlcmllcy5cbiAgICogVGhpcyBtZXRob2QgYWxsb3dzIGZvciBmbHVlbnQgcXVlcnkgY29uc3RydWN0aW9uIGFnYWluc3QgdGhlIFJBTSBhZGFwdGVyLlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGZvciB0aGUgc3RhdGVtZW50XG4gICAqIEByZXR1cm4ge1JhbVN0YXRlbWVudDxNLCBhbnk+fSBBIG5ldyBzdGF0ZW1lbnQgYnVpbGRlciBpbnN0YW5jZVxuICAgKi9cbiAgU3RhdGVtZW50PE0gZXh0ZW5kcyBNb2RlbD4oKTogUmFtU3RhdGVtZW50PE0sIGFueT4ge1xuICAgIHJldHVybiBuZXcgUmFtU3RhdGVtZW50PE0sIGFueT4odGhpcyBhcyBhbnkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IHNlcXVlbmNlIGZvciBnZW5lcmF0aW5nIHNlcXVlbnRpYWwgSURzXG4gICAqIEBzdW1tYXJ5IEZhY3RvcnkgbWV0aG9kIHRoYXQgY3JlYXRlcyBhIG5ldyBSYW1TZXF1ZW5jZSBpbnN0YW5jZSBmb3IgSUQgZ2VuZXJhdGlvbi5cbiAgICogVGhpcyBtZXRob2QgcHJvdmlkZXMgYSB3YXkgdG8gY3JlYXRlIGF1dG8taW5jcmVtZW50aW5nIHNlcXVlbmNlcyBmb3IgZW50aXR5IElEcy5cbiAgICogQHBhcmFtIHtTZXF1ZW5jZU9wdGlvbnN9IG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBzZXF1ZW5jZVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFNlcXVlbmNlPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIG5ldyBzZXF1ZW5jZSBpbnN0YW5jZVxuICAgKi9cbiAgYXN5bmMgU2VxdWVuY2Uob3B0aW9uczogU2VxdWVuY2VPcHRpb25zKTogUHJvbWlzZTxTZXF1ZW5jZT4ge1xuICAgIHJldHVybiBuZXcgUmFtU2VxdWVuY2Uob3B0aW9ucywgdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdXAgUkFNLXNwZWNpZmljIGRlY29yYXRpb25zIGZvciBtb2RlbCBwcm9wZXJ0aWVzXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgZGVjb3JhdGlvbnMgZm9yIGNyZWF0ZWRCeSBhbmQgdXBkYXRlZEJ5IGZpZWxkcyBpbiB0aGUgUkFNIGFkYXB0ZXIuXG4gICAqIFRoaXMgc3RhdGljIG1ldGhvZCBpcyBjYWxsZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uIHRvIHNldCB1cCBoYW5kbGVycyB0aGF0IGF1dG9tYXRpY2FsbHlcbiAgICogcG9wdWxhdGUgdGhlc2UgZmllbGRzIHdpdGggdGhlIGN1cnJlbnQgdXNlcidzIFVVSUQgZHVyaW5nIGNyZWF0ZSBhbmQgdXBkYXRlIG9wZXJhdGlvbnMuXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IFJhbUFkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBEZWNvcmF0aW9uXG4gICAqICAgcGFydGljaXBhbnQgUmVwb3NpdG9yeVxuICAgKlxuICAgKiAgIFJhbUFkYXB0ZXItPj5SZXBvc2l0b3J5OiBrZXkoUGVyc2lzdGVuY2VLZXlzLkNSRUFURURfQlkpXG4gICAqICAgUmVwb3NpdG9yeS0tPj5SYW1BZGFwdGVyOiBjcmVhdGVkQnlLZXlcbiAgICogICBSYW1BZGFwdGVyLT4+UmVwb3NpdG9yeToga2V5KFBlcnNpc3RlbmNlS2V5cy5VUERBVEVEX0JZKVxuICAgKiAgIFJlcG9zaXRvcnktLT4+UmFtQWRhcHRlcjogdXBkYXRlZEJ5S2V5XG4gICAqXG4gICAqICAgUmFtQWRhcHRlci0+PkRlY29yYXRpb246IGZsYXZvdXJlZEFzKFJhbUZsYXZvdXIpXG4gICAqICAgRGVjb3JhdGlvbi0tPj5SYW1BZGFwdGVyOiBEZWNvcmF0b3JCdWlsZGVyXG4gICAqICAgUmFtQWRhcHRlci0+PkRlY29yYXRpb246IGZvcihjcmVhdGVkQnlLZXkpXG4gICAqICAgUmFtQWRhcHRlci0+PkRlY29yYXRpb246IGRlZmluZShvbkNyZWF0ZSwgcHJvcE1ldGFkYXRhKVxuICAgKiAgIFJhbUFkYXB0ZXItPj5EZWNvcmF0aW9uOiBhcHBseSgpXG4gICAqXG4gICAqICAgUmFtQWRhcHRlci0+PkRlY29yYXRpb246IGZsYXZvdXJlZEFzKFJhbUZsYXZvdXIpXG4gICAqICAgRGVjb3JhdGlvbi0tPj5SYW1BZGFwdGVyOiBEZWNvcmF0b3JCdWlsZGVyXG4gICAqICAgUmFtQWRhcHRlci0+PkRlY29yYXRpb246IGZvcih1cGRhdGVkQnlLZXkpXG4gICAqICAgUmFtQWRhcHRlci0+PkRlY29yYXRpb246IGRlZmluZShvbkNyZWF0ZSwgcHJvcE1ldGFkYXRhKVxuICAgKiAgIFJhbUFkYXB0ZXItPj5EZWNvcmF0aW9uOiBhcHBseSgpXG4gICAqL1xuICBzdGF0aWMgZGVjb3JhdGlvbigpIHtcbiAgICBjb25zdCBjcmVhdGVkQnlLZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuQ1JFQVRFRF9CWSk7XG4gICAgY29uc3QgdXBkYXRlZEJ5S2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLlVQREFURURfQlkpO1xuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoUmFtRmxhdm91cilcbiAgICAgIC5mb3IoY3JlYXRlZEJ5S2V5KVxuICAgICAgLmRlZmluZShcbiAgICAgICAgb25DcmVhdGUoY3JlYXRlZEJ5T25SYW1DcmVhdGVVcGRhdGUpLFxuICAgICAgICBwcm9wTWV0YWRhdGEoY3JlYXRlZEJ5S2V5LCB7fSlcbiAgICAgIClcbiAgICAgIC5hcHBseSgpO1xuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoUmFtRmxhdm91cilcbiAgICAgIC5mb3IodXBkYXRlZEJ5S2V5KVxuICAgICAgLmRlZmluZShcbiAgICAgICAgb25DcmVhdGUoY3JlYXRlZEJ5T25SYW1DcmVhdGVVcGRhdGUpLFxuICAgICAgICBwcm9wTWV0YWRhdGEodXBkYXRlZEJ5S2V5LCB7fSlcbiAgICAgIClcbiAgICAgIC5hcHBseSgpO1xuICB9XG59XG5cblJhbUFkYXB0ZXIuZGVjb3JhdGlvbigpO1xuIl19
|