@bitgo/sdk-lib-safes 1.4.0 → 1.6.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/src/ed25519Pub.d.ts +11 -0
- package/dist/src/ed25519Pub.d.ts.map +1 -1
- package/dist/src/ed25519Pub.js +60 -1
- package/dist/src/keycardCodec.d.ts +21 -3
- package/dist/src/keycardCodec.d.ts.map +1 -1
- package/dist/src/keycardCodec.js +18 -6
- package/dist/src/safeDerivation.d.ts +68 -11
- package/dist/src/safeDerivation.d.ts.map +1 -1
- package/dist/src/safeDerivation.js +136 -49
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +5 -4
|
@@ -33,20 +33,27 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.
|
|
37
|
-
exports.
|
|
38
|
-
exports.
|
|
39
|
-
exports.
|
|
36
|
+
exports.DerivedFromParentWithSoftPath = exports.DerivedFromParentWithHardenedPath = void 0;
|
|
37
|
+
exports.assertBip32Path = assertBip32Path;
|
|
38
|
+
exports.isDerivedFromParentWithHardenedPath = isDerivedFromParentWithHardenedPath;
|
|
39
|
+
exports.isDerivedFromParentWithSoftPath = isDerivedFromParentWithSoftPath;
|
|
40
|
+
exports.parseSafeBip44Path = parseSafeBip44Path;
|
|
41
|
+
exports.getSafeBip44CoinType = getSafeBip44CoinType;
|
|
42
|
+
exports.buildSafeBip44Path = buildSafeBip44Path;
|
|
43
|
+
exports.toSoftTwinPath = toSoftTwinPath;
|
|
40
44
|
exports.deriveSafeChildHardenedFromXprv = deriveSafeChildHardenedFromXprv;
|
|
41
45
|
exports.deriveAndSelfCheckSafeChildHardened = deriveAndSelfCheckSafeChildHardened;
|
|
42
46
|
exports.deriveSafeChildEd25519Hardened = deriveSafeChildEd25519Hardened;
|
|
47
|
+
exports.deriveSafeChildTriplet = deriveSafeChildTriplet;
|
|
43
48
|
/**
|
|
44
49
|
* @prettier
|
|
45
50
|
*
|
|
46
51
|
* @experimental Shared safe child derivation for mint, sign, and recovery.
|
|
47
52
|
*
|
|
48
|
-
* User child: hardened `m/<
|
|
49
|
-
*
|
|
53
|
+
* User child (every slot): hardened `m/44'/<coinType>'/<slot>'/<account>'`.
|
|
54
|
+
* Multisig co-signers (backup / BitGo): the soft twin `m/44/<coinType>/<slot>/<account>`.
|
|
55
|
+
* `<coinType>` is statics `bip44CoinType`, `<slot>` is statics `SAFE_ROOT_SLOT_ORDINALS[slot]`,
|
|
56
|
+
* and `<account>` is the safe's per-(slot, coinType) counter.
|
|
50
57
|
*
|
|
51
58
|
* Do not use `derivedFromParentWithSeed` / `deriveKeyWithSeed` (`m/999999/a/b`) —
|
|
52
59
|
* that is the custody hashed path and cannot reproduce a safe child.
|
|
@@ -56,48 +63,106 @@ const nacl = __importStar(require("tweetnacl"));
|
|
|
56
63
|
const utxo_lib_1 = require("@bitgo/utxo-lib");
|
|
57
64
|
const statics_1 = require("@bitgo/statics");
|
|
58
65
|
const ed25519KeyDeriver_1 = require("./ed25519KeyDeriver");
|
|
59
|
-
const codecs_1 = require("./codecs");
|
|
60
66
|
const ed25519Pub_1 = require("./ed25519Pub");
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
67
|
+
const HARDENED_BIP44_PATH = /^m\/44'\/(\d+)'\/(\d+)'\/(\d+)'$/;
|
|
68
|
+
const SOFT_BIP44_PATH = /^m\/44\/(\d+)\/(\d+)\/(\d+)$/;
|
|
69
|
+
const SAFE_SLOT_ORDINALS = Object.values(statics_1.SAFE_ROOT_SLOT_ORDINALS);
|
|
70
|
+
/**
|
|
71
|
+
* Assert `path` is a valid BIP32 path for the given derivation kind. Hardened paths require every
|
|
72
|
+
* segment to carry the `'` marker; soft paths reject it. Every segment must be a non-negative
|
|
73
|
+
* integer at or below {@link MAX_BIP32_INDEX}.
|
|
74
|
+
*/
|
|
75
|
+
function assertBip32Path(path, opts) {
|
|
76
|
+
const re = opts.hardened ? /^m(\/\d+')+$/ : /^m(\/\d+)+$/;
|
|
77
|
+
if (!re.test(path)) {
|
|
78
|
+
throw new Error(`Invalid ${opts.hardened ? 'hardened' : 'soft'} derivation path '${path}'`);
|
|
72
79
|
}
|
|
73
|
-
|
|
74
|
-
|
|
80
|
+
const outOfRange = path
|
|
81
|
+
.split('/')
|
|
82
|
+
.slice(1)
|
|
83
|
+
.map((segment) => Number(opts.hardened ? segment.slice(0, -1) : segment))
|
|
84
|
+
.some((index) => !Number.isInteger(index) || index < 0 || index > statics_1.MAX_BIP32_INDEX);
|
|
85
|
+
if (outOfRange) {
|
|
86
|
+
throw new Error(`Invalid ${opts.hardened ? 'hardened' : 'soft'} derivation path '${path}': index out of range`);
|
|
75
87
|
}
|
|
76
|
-
return idx;
|
|
77
88
|
}
|
|
78
|
-
|
|
79
|
-
|
|
89
|
+
/**
|
|
90
|
+
* Canonical decimal only: `044` and `44` name one key under two strings, so string-equality
|
|
91
|
+
* path checks (the server's unique index) would treat one child as two.
|
|
92
|
+
*/
|
|
93
|
+
function parseBip32Index(segment) {
|
|
94
|
+
const index = Number(segment);
|
|
95
|
+
return Number.isInteger(index) && index <= statics_1.MAX_BIP32_INDEX && String(index) === segment ? index : undefined;
|
|
80
96
|
}
|
|
81
|
-
|
|
82
|
-
function parseDerivedFromParentWithHardenedPathIndex(path) {
|
|
83
|
-
const match = exports.DERIVED_FROM_PARENT_WITH_HARDENED_PATH.exec(path);
|
|
97
|
+
function parseBip44Segments(match) {
|
|
84
98
|
if (!match) {
|
|
85
99
|
return undefined;
|
|
86
100
|
}
|
|
87
|
-
|
|
88
|
-
|
|
101
|
+
const coinType = parseBip32Index(match[1]);
|
|
102
|
+
const slotOrdinal = parseBip32Index(match[2]);
|
|
103
|
+
const account = parseBip32Index(match[3]);
|
|
104
|
+
if (coinType === undefined || slotOrdinal === undefined || account === undefined) {
|
|
105
|
+
return undefined;
|
|
89
106
|
}
|
|
90
|
-
|
|
107
|
+
if (!SAFE_SLOT_ORDINALS.includes(slotOrdinal)) {
|
|
91
108
|
return undefined;
|
|
92
109
|
}
|
|
110
|
+
return { coinType, slotOrdinal, account };
|
|
111
|
+
}
|
|
112
|
+
function isDerivedFromParentWithHardenedPath(s) {
|
|
113
|
+
return parseBip44Segments(HARDENED_BIP44_PATH.exec(s)) !== undefined;
|
|
114
|
+
}
|
|
115
|
+
function isDerivedFromParentWithSoftPath(s) {
|
|
116
|
+
return parseBip44Segments(SOFT_BIP44_PATH.exec(s)) !== undefined;
|
|
117
|
+
}
|
|
118
|
+
exports.DerivedFromParentWithHardenedPath = t.brand(t.string, (s) => isDerivedFromParentWithHardenedPath(s), 'DerivedFromParentWithHardenedPath');
|
|
119
|
+
exports.DerivedFromParentWithSoftPath = t.brand(t.string, (s) => isDerivedFromParentWithSoftPath(s), 'DerivedFromParentWithSoftPath');
|
|
120
|
+
/**
|
|
121
|
+
* Reads the numeric segments out of a user/MPC child path. Rejects anything else, including a
|
|
122
|
+
* cast soft path: a hardened derive ceremony must never run at, or register, a soft path.
|
|
123
|
+
*/
|
|
124
|
+
function parseSafeBip44Path(path) {
|
|
125
|
+
const segments = parseBip44Segments(HARDENED_BIP44_PATH.exec(path));
|
|
126
|
+
if (segments === undefined) {
|
|
127
|
+
throw new Error(`Invalid safe BIP44 path '${path}'`);
|
|
128
|
+
}
|
|
129
|
+
return segments;
|
|
93
130
|
}
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
const
|
|
97
|
-
if (
|
|
98
|
-
throw new Error(`
|
|
131
|
+
/** The `<coinType>` segment for a coin. OFC and fiat coins have none and cannot mint a safe child. */
|
|
132
|
+
function getSafeBip44CoinType(coin) {
|
|
133
|
+
const coinType = statics_1.coins.get(coin).bip44CoinType;
|
|
134
|
+
if (coinType === undefined) {
|
|
135
|
+
throw new Error(`Coin '${coin}' has no BIP44 coin type and cannot derive a safe child`);
|
|
136
|
+
}
|
|
137
|
+
return coinType;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Builds the user-child path `m/44'/<coinType>'/<slot>'/<account>'`. `coinType` comes from statics
|
|
141
|
+
* (or the derivation-index response) and `account` from the safe's per-(slot, coinType) counter.
|
|
142
|
+
*/
|
|
143
|
+
function buildSafeBip44Path(coinType, slot, account) {
|
|
144
|
+
const path = `m/44'/${coinType}'/${statics_1.SAFE_ROOT_SLOT_ORDINALS[slot]}'/${account}'`;
|
|
145
|
+
if (!isDerivedFromParentWithHardenedPath(path)) {
|
|
146
|
+
throw new Error(`Invalid safe BIP44 path segments: coinType=${coinType}, slot=${slot}, account=${account}`);
|
|
147
|
+
}
|
|
148
|
+
return path;
|
|
149
|
+
}
|
|
150
|
+
/** Strips hardening from every level: the co-signer path paired with a user-child path. */
|
|
151
|
+
function toSoftTwinPath(path) {
|
|
152
|
+
const softPath = path.replace(/'/g, '');
|
|
153
|
+
if (!isDerivedFromParentWithSoftPath(softPath)) {
|
|
154
|
+
throw new Error(`Invalid safe BIP44 path '${path}': no soft twin`);
|
|
155
|
+
}
|
|
156
|
+
return softPath;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* The type alone is not enough: a cast path with a soft level on a user child would let the
|
|
160
|
+
* parent xpub plus the child prv recover the root.
|
|
161
|
+
*/
|
|
162
|
+
function assertHardenedPath(path) {
|
|
163
|
+
if (!isDerivedFromParentWithHardenedPath(path)) {
|
|
164
|
+
throw new Error(`Invalid safe child path '${path}': expected m/44'/<coinType>'/<slot>'/<account>'`);
|
|
99
165
|
}
|
|
100
|
-
return index;
|
|
101
166
|
}
|
|
102
167
|
function childFromNode(child, derivationPath) {
|
|
103
168
|
if (!child.privateKey) {
|
|
@@ -109,15 +174,14 @@ function childFromNode(child, derivationPath) {
|
|
|
109
174
|
derivationPath,
|
|
110
175
|
};
|
|
111
176
|
}
|
|
112
|
-
function deriveSafeChildHardenedFromXprv(rootXprv,
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
return childFromNode(utxo_lib_1.bip32.fromBase58(rootXprv).deriveHardened(idx), derivationPath);
|
|
177
|
+
function deriveSafeChildHardenedFromXprv(rootXprv, path) {
|
|
178
|
+
assertHardenedPath(path);
|
|
179
|
+
return childFromNode(utxo_lib_1.bip32.fromBase58(rootXprv).derivePath(path), path);
|
|
116
180
|
}
|
|
117
181
|
/** Re-derive and assert both results match before the child is registered. */
|
|
118
|
-
function deriveAndSelfCheckSafeChildHardened(rootXprv,
|
|
119
|
-
const first = deriveSafeChildHardenedFromXprv(rootXprv,
|
|
120
|
-
const second = deriveSafeChildHardenedFromXprv(rootXprv,
|
|
182
|
+
function deriveAndSelfCheckSafeChildHardened(rootXprv, path) {
|
|
183
|
+
const first = deriveSafeChildHardenedFromXprv(rootXprv, path);
|
|
184
|
+
const second = deriveSafeChildHardenedFromXprv(rootXprv, path);
|
|
121
185
|
if (first.pub !== second.pub || first.prv !== second.prv) {
|
|
122
186
|
throw new Error(`Safe child self-check failed at ${first.derivationPath}: derivation was not deterministic`);
|
|
123
187
|
}
|
|
@@ -126,7 +190,7 @@ function deriveAndSelfCheckSafeChildHardened(rootXprv, index) {
|
|
|
126
190
|
/**
|
|
127
191
|
* SLIP-0010 hardened derivation of a safe user child from an ed25519 root secret seed.
|
|
128
192
|
*
|
|
129
|
-
* `rootPrv` is a Stellar StrKey `S…` secret seed (what slot
|
|
193
|
+
* `rootPrv` is a Stellar StrKey `S…` secret seed (what slot-② `ed25519Multisig` user roots store).
|
|
130
194
|
* The derivation reuses the existing SLIP-0010 implementation {@link Ed25519KeyDeriver.derivePath}
|
|
131
195
|
* (hardened-only CKDPriv over the `ed25519 seed` HMAC master), then expands the resulting 32-byte
|
|
132
196
|
* child seed into a keypair with `nacl`. The child `pub` is a bare StrKey `G…`; the `prv` is the
|
|
@@ -135,17 +199,40 @@ function deriveAndSelfCheckSafeChildHardened(rootXprv, index) {
|
|
|
135
199
|
* Unlike the secp256k1 path, ed25519 hardened derivation needs no chain code — the composite
|
|
136
200
|
* `pub‖chainCode` form is only for SOFT co-signer derivation and is not used here.
|
|
137
201
|
*/
|
|
138
|
-
function deriveSafeChildEd25519Hardened(rootPrv,
|
|
139
|
-
|
|
140
|
-
const derivationPath = getSafeHardenedDerivationPath(idx);
|
|
202
|
+
function deriveSafeChildEd25519Hardened(rootPrv, path) {
|
|
203
|
+
assertHardenedPath(path);
|
|
141
204
|
const rawSeedHex = (0, ed25519Pub_1.decodeEd25519StrKeySecretSeed)(rootPrv).toString('hex');
|
|
142
|
-
const childSeed = ed25519KeyDeriver_1.Ed25519KeyDeriver.derivePath(
|
|
205
|
+
const childSeed = ed25519KeyDeriver_1.Ed25519KeyDeriver.derivePath(path, rawSeedHex).key;
|
|
143
206
|
const keyPair = nacl.sign.keyPair.fromSeed(Uint8Array.from(childSeed));
|
|
144
207
|
const pub = (0, ed25519Pub_1.encodeEd25519StrKeyPublicKey)(Buffer.from(keyPair.publicKey));
|
|
145
208
|
return {
|
|
146
209
|
prv: Buffer.from(childSeed).toString('hex'),
|
|
147
210
|
pub,
|
|
148
|
-
derivationPath,
|
|
211
|
+
derivationPath: path,
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Derives the slot-① (secp256k1Multisig) child triplet from the keycard roots: the user child at
|
|
216
|
+
* the hardened `path`, the backup and BitGo children at its soft twin.
|
|
217
|
+
*/
|
|
218
|
+
function deriveSafeChildTriplet(roots, path) {
|
|
219
|
+
assertHardenedPath(path);
|
|
220
|
+
const userRoot = utxo_lib_1.bip32.fromBase58(roots.user);
|
|
221
|
+
const backupRoot = utxo_lib_1.bip32.fromBase58(roots.backup);
|
|
222
|
+
const bitgoRoot = utxo_lib_1.bip32.fromBase58(roots.bitgo);
|
|
223
|
+
if (userRoot.isNeutered() || backupRoot.isNeutered()) {
|
|
224
|
+
throw new Error('deriveSafeChildTriplet: user and backup roots must be private (xprv)');
|
|
225
|
+
}
|
|
226
|
+
if (!bitgoRoot.isNeutered()) {
|
|
227
|
+
throw new Error('deriveSafeChildTriplet: bitgo root must be public (xpub)');
|
|
228
|
+
}
|
|
229
|
+
const softPath = toSoftTwinPath(path);
|
|
230
|
+
const user = userRoot.derivePath(path);
|
|
231
|
+
const backup = backupRoot.derivePath(softPath);
|
|
232
|
+
return {
|
|
233
|
+
user: { prv: user.toBase58(), pub: user.neutered().toBase58() },
|
|
234
|
+
backup: { prv: backup.toBase58(), pub: backup.neutered().toBase58() },
|
|
235
|
+
bitgo: { pub: bitgoRoot.derivePath(softPath).toBase58() },
|
|
149
236
|
};
|
|
150
237
|
}
|
|
151
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FmZURlcml2YXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2FmZURlcml2YXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBcUJBLDREQWFDO0FBRUQsc0VBRUM7QUEwQkQsd0ZBT0M7QUFtQkQsMEVBSUM7QUFHRCxrRkFPQztBQWNELHdFQVlDO0FBbElEOzs7Ozs7Ozs7O0dBVUc7QUFDSCx5Q0FBMkI7QUFDM0IsZ0RBQWtDO0FBQ2xDLDhDQUF3RDtBQUN4RCw0Q0FBaUQ7QUFDakQsMkRBQXdEO0FBQ3hELHFDQUEyQztBQUMzQyw2Q0FBMkY7QUFFOUUsUUFBQSxzQ0FBc0MsR0FBRyxhQUFhLENBQUM7QUFFcEUsU0FBZ0Isd0JBQXdCLENBQUMsS0FBc0I7SUFDN0QsSUFBSSxHQUFXLENBQUM7SUFDaEIsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM5QixHQUFHLEdBQUcsS0FBSyxDQUFDO0lBQ2QsQ0FBQztTQUFNLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQy9CLEdBQUcsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdEIsQ0FBQztTQUFNLENBQUM7UUFDTixNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxLQUFLLG9DQUFvQyxDQUFDLENBQUM7SUFDL0YsQ0FBQztJQUNELElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLHlCQUFlLEVBQUUsQ0FBQztRQUMvRCxNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxLQUFLLG9DQUFvQyxDQUFDLENBQUM7SUFDL0YsQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELFNBQWdCLDZCQUE2QixDQUFDLEtBQXNCO0lBQ2xFLE9BQU8sS0FBSyx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO0FBQ2pELENBQUM7QUFRWSxRQUFBLGlDQUFpQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQ3RELENBQUMsQ0FBQyxNQUFNLEVBQ1IsQ0FBQyxDQUFDLEVBQTBDLEVBQUUsQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLEVBQzNHLG1DQUFtQyxDQUNwQyxDQUFDO0FBRUYsU0FBUywyQ0FBMkMsQ0FBQyxJQUFZO0lBQy9ELE1BQU0sS0FBSyxHQUFHLDhDQUFzQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDWCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsSUFBSSxDQUFDO1FBQ0gsT0FBTyx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFnQixzQ0FBc0MsQ0FBQyxJQUFZO0lBQ2pFLE1BQU0sU0FBUyxHQUFHLElBQUEsd0JBQWUsRUFBQyx5Q0FBaUMsRUFBRSxJQUFJLEVBQUUsbUNBQW1DLENBQUMsQ0FBQztJQUNoSCxNQUFNLEtBQUssR0FBRywyQ0FBMkMsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNyRSxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN4QixNQUFNLElBQUksS0FBSyxDQUFDLDhDQUE4QyxJQUFJLG9CQUFvQixDQUFDLENBQUM7SUFDMUYsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQVFELFNBQVMsYUFBYSxDQUFDLEtBQXFCLEVBQUUsY0FBc0I7SUFDbEUsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN0QixNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO0lBQy9FLENBQUM7SUFDRCxPQUFPO1FBQ0wsR0FBRyxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUU7UUFDckIsR0FBRyxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUU7UUFDaEMsY0FBYztLQUNmLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBZ0IsK0JBQStCLENBQUMsUUFBZ0IsRUFBRSxLQUFzQjtJQUN0RixNQUFNLEdBQUcsR0FBRyx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QyxNQUFNLGNBQWMsR0FBRyw2QkFBNkIsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMxRCxPQUFPLGFBQWEsQ0FBQyxnQkFBSyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUUsY0FBYyxDQUFDLENBQUM7QUFDdkYsQ0FBQztBQUVELDhFQUE4RTtBQUM5RSxTQUFnQixtQ0FBbUMsQ0FBQyxRQUFnQixFQUFFLEtBQXNCO0lBQzFGLE1BQU0sS0FBSyxHQUFHLCtCQUErQixDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMvRCxNQUFNLE1BQU0sR0FBRywrQkFBK0IsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDaEUsSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLE1BQU0sQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDekQsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsS0FBSyxDQUFDLGNBQWMsb0NBQW9DLENBQUMsQ0FBQztJQUMvRyxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxTQUFnQiw4QkFBOEIsQ0FBQyxPQUFlLEVBQUUsS0FBc0I7SUFDcEYsTUFBTSxHQUFHLEdBQUcsd0JBQXdCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUMsTUFBTSxjQUFjLEdBQUcsNkJBQTZCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDMUQsTUFBTSxVQUFVLEdBQUcsSUFBQSwwQ0FBNkIsRUFBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUUsTUFBTSxTQUFTLEdBQUcscUNBQWlCLENBQUMsVUFBVSxDQUFDLGNBQWMsRUFBRSxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDL0UsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUN2RSxNQUFNLEdBQUcsR0FBRyxJQUFBLHlDQUE0QixFQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDekUsT0FBTztRQUNMLEdBQUcsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFDM0MsR0FBRztRQUNILGNBQWM7S0FDZixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHByZXR0aWVyXG4gKlxuICogQGV4cGVyaW1lbnRhbCBTaGFyZWQgc2FmZSBjaGlsZCBkZXJpdmF0aW9uIGZvciBtaW50LCBzaWduLCBhbmQgcmVjb3ZlcnkuXG4gKlxuICogVXNlciBjaGlsZDogaGFyZGVuZWQgYG0vPGluZGV4PidgIGZyb20gdGhlIHNlcXVlbnRpYWwgYHNhZmUuZGVyaXZhdGlvbkluZGV4W3Nsb3RdYC5cbiAqIEJhY2t1cCAvIEJpdEdvIGNoaWxkcmVuIGFyZSBzb2Z0LWRlcml2ZWQgYXQgYG0vPGluZGV4PmAgY2xpZW50LXNpZGUgZm9yIHJlY292ZXJ5LlxuICpcbiAqIERvIG5vdCB1c2UgYGRlcml2ZWRGcm9tUGFyZW50V2l0aFNlZWRgIC8gYGRlcml2ZUtleVdpdGhTZWVkYCAoYG0vOTk5OTk5L2EvYmApIOKAlFxuICogdGhhdCBpcyB0aGUgY3VzdG9keSBoYXNoZWQgcGF0aCBhbmQgY2Fubm90IHJlcHJvZHVjZSBhIHNhZmUgY2hpbGQuXG4gKi9cbmltcG9ydCAqIGFzIHQgZnJvbSAnaW8tdHMnO1xuaW1wb3J0ICogYXMgbmFjbCBmcm9tICd0d2VldG5hY2wnO1xuaW1wb3J0IHsgYmlwMzIsIEJJUDMySW50ZXJmYWNlIH0gZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmltcG9ydCB7IE1BWF9CSVAzMl9JTkRFWCB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCB7IEVkMjU1MTlLZXlEZXJpdmVyIH0gZnJvbSAnLi9lZDI1NTE5S2V5RGVyaXZlcic7XG5pbXBvcnQgeyBkZWNvZGVXaXRoQ29kZWMgfSBmcm9tICcuL2NvZGVjcyc7XG5pbXBvcnQgeyBkZWNvZGVFZDI1NTE5U3RyS2V5U2VjcmV0U2VlZCwgZW5jb2RlRWQyNTUxOVN0cktleVB1YmxpY0tleSB9IGZyb20gJy4vZWQyNTUxOVB1Yic7XG5cbmV4cG9ydCBjb25zdCBERVJJVkVEX0ZST01fUEFSRU5UX1dJVEhfSEFSREVORURfUEFUSCA9IC9ebVxcLyhcXGQrKSckLztcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU2FmZURlcml2YXRpb25JbmRleChpbmRleDogc3RyaW5nIHwgbnVtYmVyKTogbnVtYmVyIHtcbiAgbGV0IGlkeDogbnVtYmVyO1xuICBpZiAodHlwZW9mIGluZGV4ID09PSAnbnVtYmVyJykge1xuICAgIGlkeCA9IGluZGV4O1xuICB9IGVsc2UgaWYgKC9eXFxkKyQvLnRlc3QoaW5kZXgpKSB7XG4gICAgaWR4ID0gTnVtYmVyKGluZGV4KTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2FmZSBkZXJpdmF0aW9uIGluZGV4ICcke2luZGV4fSc6IGV4cGVjdGVkIGEgbm9uLW5lZ2F0aXZlIGludGVnZXJgKTtcbiAgfVxuICBpZiAoIU51bWJlci5pc0ludGVnZXIoaWR4KSB8fCBpZHggPCAwIHx8IGlkeCA+IE1BWF9CSVAzMl9JTkRFWCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzYWZlIGRlcml2YXRpb24gaW5kZXggJyR7aW5kZXh9JzogZXhwZWN0ZWQgYSBub24tbmVnYXRpdmUgaW50ZWdlcmApO1xuICB9XG4gIHJldHVybiBpZHg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTYWZlSGFyZGVuZWREZXJpdmF0aW9uUGF0aChpbmRleDogc3RyaW5nIHwgbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBtLyR7cGFyc2VTYWZlRGVyaXZhdGlvbkluZGV4KGluZGV4KX0nYDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGhCcmFuZCB7XG4gIHJlYWRvbmx5IERlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aDogdW5pcXVlIHN5bWJvbDtcbn1cblxuZXhwb3J0IHR5cGUgRGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoID0gdC5CcmFuZGVkPHN0cmluZywgRGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoQnJhbmQ+O1xuXG5leHBvcnQgY29uc3QgRGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoID0gdC5icmFuZChcbiAgdC5zdHJpbmcsXG4gIChzKTogcyBpcyBEZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGggPT4gcGFyc2VEZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGhJbmRleChzKSAhPT0gdW5kZWZpbmVkLFxuICAnRGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoJ1xuKTtcblxuZnVuY3Rpb24gcGFyc2VEZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGhJbmRleChwYXRoOiBzdHJpbmcpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCBtYXRjaCA9IERFUklWRURfRlJPTV9QQVJFTlRfV0lUSF9IQVJERU5FRF9QQVRILmV4ZWMocGF0aCk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIHBhcnNlU2FmZURlcml2YXRpb25JbmRleChtYXRjaFsxXSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoKHBhdGg6IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IHZhbGlkYXRlZCA9IGRlY29kZVdpdGhDb2RlYyhEZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGgsIHBhdGgsICdkZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGgnKTtcbiAgY29uc3QgaW5kZXggPSBwYXJzZURlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aEluZGV4KHZhbGlkYXRlZCk7XG4gIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGRlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aCAnJHtwYXRofSc6IGV4cGVjdGVkIG0vPG4+J2ApO1xuICB9XG4gIHJldHVybiBpbmRleDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTYWZlSGFyZGVuZWRDaGlsZEtleSB7XG4gIHBydjogc3RyaW5nO1xuICBwdWI6IHN0cmluZztcbiAgZGVyaXZhdGlvblBhdGg6IHN0cmluZztcbn1cblxuZnVuY3Rpb24gY2hpbGRGcm9tTm9kZShjaGlsZDogQklQMzJJbnRlcmZhY2UsIGRlcml2YXRpb25QYXRoOiBzdHJpbmcpOiBTYWZlSGFyZGVuZWRDaGlsZEtleSB7XG4gIGlmICghY2hpbGQucHJpdmF0ZUtleSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGRlcml2ZSBoYXJkZW5lZCBzYWZlIGNoaWxkIGF0ICR7ZGVyaXZhdGlvblBhdGh9YCk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBwcnY6IGNoaWxkLnRvQmFzZTU4KCksXG4gICAgcHViOiBjaGlsZC5uZXV0ZXJlZCgpLnRvQmFzZTU4KCksXG4gICAgZGVyaXZhdGlvblBhdGgsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXJpdmVTYWZlQ2hpbGRIYXJkZW5lZEZyb21YcHJ2KHJvb3RYcHJ2OiBzdHJpbmcsIGluZGV4OiBzdHJpbmcgfCBudW1iZXIpOiBTYWZlSGFyZGVuZWRDaGlsZEtleSB7XG4gIGNvbnN0IGlkeCA9IHBhcnNlU2FmZURlcml2YXRpb25JbmRleChpbmRleCk7XG4gIGNvbnN0IGRlcml2YXRpb25QYXRoID0gZ2V0U2FmZUhhcmRlbmVkRGVyaXZhdGlvblBhdGgoaWR4KTtcbiAgcmV0dXJuIGNoaWxkRnJvbU5vZGUoYmlwMzIuZnJvbUJhc2U1OChyb290WHBydikuZGVyaXZlSGFyZGVuZWQoaWR4KSwgZGVyaXZhdGlvblBhdGgpO1xufVxuXG4vKiogUmUtZGVyaXZlIGFuZCBhc3NlcnQgYm90aCByZXN1bHRzIG1hdGNoIGJlZm9yZSB0aGUgY2hpbGQgaXMgcmVnaXN0ZXJlZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXJpdmVBbmRTZWxmQ2hlY2tTYWZlQ2hpbGRIYXJkZW5lZChyb290WHBydjogc3RyaW5nLCBpbmRleDogc3RyaW5nIHwgbnVtYmVyKTogU2FmZUhhcmRlbmVkQ2hpbGRLZXkge1xuICBjb25zdCBmaXJzdCA9IGRlcml2ZVNhZmVDaGlsZEhhcmRlbmVkRnJvbVhwcnYocm9vdFhwcnYsIGluZGV4KTtcbiAgY29uc3Qgc2Vjb25kID0gZGVyaXZlU2FmZUNoaWxkSGFyZGVuZWRGcm9tWHBydihyb290WHBydiwgaW5kZXgpO1xuICBpZiAoZmlyc3QucHViICE9PSBzZWNvbmQucHViIHx8IGZpcnN0LnBydiAhPT0gc2Vjb25kLnBydikge1xuICAgIHRocm93IG5ldyBFcnJvcihgU2FmZSBjaGlsZCBzZWxmLWNoZWNrIGZhaWxlZCBhdCAke2ZpcnN0LmRlcml2YXRpb25QYXRofTogZGVyaXZhdGlvbiB3YXMgbm90IGRldGVybWluaXN0aWNgKTtcbiAgfVxuICByZXR1cm4gZmlyc3Q7XG59XG5cbi8qKlxuICogU0xJUC0wMDEwIGhhcmRlbmVkIGRlcml2YXRpb24gb2YgYSBzYWZlIHVzZXIgY2hpbGQgZnJvbSBhbiBlZDI1NTE5IHJvb3Qgc2VjcmV0IHNlZWQuXG4gKlxuICogYHJvb3RQcnZgIGlzIGEgU3RlbGxhciBTdHJLZXkgYFPigKZgIHNlY3JldCBzZWVkICh3aGF0IHNsb3Qt4pGjIGBlZDI1NTE5TXVsdGlzaWdgIHVzZXIgcm9vdHMgc3RvcmUpLlxuICogVGhlIGRlcml2YXRpb24gcmV1c2VzIHRoZSBleGlzdGluZyBTTElQLTAwMTAgaW1wbGVtZW50YXRpb24ge0BsaW5rIEVkMjU1MTlLZXlEZXJpdmVyLmRlcml2ZVBhdGh9XG4gKiAoaGFyZGVuZWQtb25seSBDS0RQcml2IG92ZXIgdGhlIGBlZDI1NTE5IHNlZWRgIEhNQUMgbWFzdGVyKSwgdGhlbiBleHBhbmRzIHRoZSByZXN1bHRpbmcgMzItYnl0ZVxuICogY2hpbGQgc2VlZCBpbnRvIGEga2V5cGFpciB3aXRoIGBuYWNsYC4gVGhlIGNoaWxkIGBwdWJgIGlzIGEgYmFyZSBTdHJLZXkgYEfigKZgOyB0aGUgYHBydmAgaXMgdGhlXG4gKiByYXcgMzItYnl0ZSBjaGlsZCBzZWVkIGFzIGhleCAodGhlIHNlZWQgaW5wdXQgYSBzaWduZXIgbmVlZHMpLlxuICpcbiAqIFVubGlrZSB0aGUgc2VjcDI1NmsxIHBhdGgsIGVkMjU1MTkgaGFyZGVuZWQgZGVyaXZhdGlvbiBuZWVkcyBubyBjaGFpbiBjb2RlIOKAlCB0aGUgY29tcG9zaXRlXG4gKiBgcHVi4oCWY2hhaW5Db2RlYCBmb3JtIGlzIG9ubHkgZm9yIFNPRlQgY28tc2lnbmVyIGRlcml2YXRpb24gYW5kIGlzIG5vdCB1c2VkIGhlcmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXJpdmVTYWZlQ2hpbGRFZDI1NTE5SGFyZGVuZWQocm9vdFBydjogc3RyaW5nLCBpbmRleDogc3RyaW5nIHwgbnVtYmVyKTogU2FmZUhhcmRlbmVkQ2hpbGRLZXkge1xuICBjb25zdCBpZHggPSBwYXJzZVNhZmVEZXJpdmF0aW9uSW5kZXgoaW5kZXgpO1xuICBjb25zdCBkZXJpdmF0aW9uUGF0aCA9IGdldFNhZmVIYXJkZW5lZERlcml2YXRpb25QYXRoKGlkeCk7XG4gIGNvbnN0IHJhd1NlZWRIZXggPSBkZWNvZGVFZDI1NTE5U3RyS2V5U2VjcmV0U2VlZChyb290UHJ2KS50b1N0cmluZygnaGV4Jyk7XG4gIGNvbnN0IGNoaWxkU2VlZCA9IEVkMjU1MTlLZXlEZXJpdmVyLmRlcml2ZVBhdGgoZGVyaXZhdGlvblBhdGgsIHJhd1NlZWRIZXgpLmtleTtcbiAgY29uc3Qga2V5UGFpciA9IG5hY2wuc2lnbi5rZXlQYWlyLmZyb21TZWVkKFVpbnQ4QXJyYXkuZnJvbShjaGlsZFNlZWQpKTtcbiAgY29uc3QgcHViID0gZW5jb2RlRWQyNTUxOVN0cktleVB1YmxpY0tleShCdWZmZXIuZnJvbShrZXlQYWlyLnB1YmxpY0tleSkpO1xuICByZXR1cm4ge1xuICAgIHBydjogQnVmZmVyLmZyb20oY2hpbGRTZWVkKS50b1N0cmluZygnaGV4JyksXG4gICAgcHViLFxuICAgIGRlcml2YXRpb25QYXRoLFxuICB9O1xufVxuIl19
|
|
238
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FmZURlcml2YXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2FmZURlcml2YXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0NBLDBDQWFDO0FBeUNELGtGQUVDO0FBRUQsMEVBRUM7QUFrQkQsZ0RBTUM7QUFHRCxvREFNQztBQU1ELGdEQVVDO0FBR0Qsd0NBTUM7QUE2QkQsMEVBTUM7QUFHRCxrRkFVQztBQWNELHdFQWNDO0FBWUQsd0RBc0JDO0FBeFFEOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILHlDQUEyQjtBQUMzQixnREFBa0M7QUFDbEMsOENBQXdEO0FBQ3hELDRDQUFpRjtBQUVqRiwyREFBd0Q7QUFDeEQsNkNBQTJGO0FBRTNGLE1BQU0sbUJBQW1CLEdBQUcsa0NBQWtDLENBQUM7QUFDL0QsTUFBTSxlQUFlLEdBQUcsOEJBQThCLENBQUM7QUFDdkQsTUFBTSxrQkFBa0IsR0FBc0IsTUFBTSxDQUFDLE1BQU0sQ0FBQyxpQ0FBdUIsQ0FBQyxDQUFDO0FBUXJGOzs7O0dBSUc7QUFDSCxTQUFnQixlQUFlLENBQUMsSUFBWSxFQUFFLElBQTJCO0lBQ3ZFLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDO0lBQzFELElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDbkIsTUFBTSxJQUFJLEtBQUssQ0FBQyxXQUFXLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxxQkFBcUIsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUM5RixDQUFDO0lBQ0QsTUFBTSxVQUFVLEdBQUcsSUFBSTtTQUNwQixLQUFLLENBQUMsR0FBRyxDQUFDO1NBQ1YsS0FBSyxDQUFDLENBQUMsQ0FBQztT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S0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2xELE1BQU0sU0FBUyxHQUFHLGdCQUFLLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoRCxJQUFJLFFBQVEsQ0FBQyxVQUFVLEVBQUUsSUFBSSxVQUFVLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQztRQUNyRCxNQUFNLElBQUksS0FBSyxDQUFDLHNFQUFzRSxDQUFDLENBQUM7SUFDMUYsQ0FBQztJQUNELElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQztRQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLDBEQUEwRCxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUNELE1BQU0sUUFBUSxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN0QyxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDL0MsT0FBTztRQUNMLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUUsRUFBRTtRQUMvRCxNQUFNLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUU7UUFDckUsS0FBSyxFQUFFLEVBQUUsR0FBRyxFQUFFLFNBQVMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7S0FDMUQsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwcmV0dGllclxuICpcbiAqIEBleHBlcmltZW50YWwgU2hhcmVkIHNhZmUgY2hpbGQgZGVyaXZhdGlvbiBmb3IgbWludCwgc2lnbiwgYW5kIHJlY292ZXJ5LlxuICpcbiAqIFVzZXIgY2hpbGQgKGV2ZXJ5IHNsb3QpOiBoYXJkZW5lZCBgbS80NCcvPGNvaW5UeXBlPicvPHNsb3Q+Jy88YWNjb3VudD4nYC5cbiAqIE11bHRpc2lnIGNvLXNpZ25lcnMgKGJhY2t1cCAvIEJpdEdvKTogdGhlIHNvZnQgdHdpbiBgbS80NC88Y29pblR5cGU+LzxzbG90Pi88YWNjb3VudD5gLlxuICogYDxjb2luVHlwZT5gIGlzIHN0YXRpY3MgYGJpcDQ0Q29pblR5cGVgLCBgPHNsb3Q+YCBpcyBzdGF0aWNzIGBTQUZFX1JPT1RfU0xPVF9PUkRJTkFMU1tzbG90XWAsXG4gKiBhbmQgYDxhY2NvdW50PmAgaXMgdGhlIHNhZmUncyBwZXItKHNsb3QsIGNvaW5UeXBlKSBjb3VudGVyLlxuICpcbiAqIERvIG5vdCB1c2UgYGRlcml2ZWRGcm9tUGFyZW50V2l0aFNlZWRgIC8gYGRlcml2ZUtleVdpdGhTZWVkYCAoYG0vOTk5OTk5L2EvYmApIOKAlFxuICogdGhhdCBpcyB0aGUgY3VzdG9keSBoYXNoZWQgcGF0aCBhbmQgY2Fubm90IHJlcHJvZHVjZSBhIHNhZmUgY2hpbGQuXG4gKi9cbmltcG9ydCAqIGFzIHQgZnJvbSAnaW8tdHMnO1xuaW1wb3J0ICogYXMgbmFjbCBmcm9tICd0d2VldG5hY2wnO1xuaW1wb3J0IHsgYmlwMzIsIEJJUDMySW50ZXJmYWNlIH0gZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmltcG9ydCB7IGNvaW5zLCBNQVhfQklQMzJfSU5ERVgsIFNBRkVfUk9PVF9TTE9UX09SRElOQUxTIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IHR5cGUgeyBSb290S2V5VHlwZSB9IGZyb20gJ0BiaXRnby9wdWJsaWMtdHlwZXMnO1xuaW1wb3J0IHsgRWQyNTUxOUtleURlcml2ZXIgfSBmcm9tICcuL2VkMjU1MTlLZXlEZXJpdmVyJztcbmltcG9ydCB7IGRlY29kZUVkMjU1MTlTdHJLZXlTZWNyZXRTZWVkLCBlbmNvZGVFZDI1NTE5U3RyS2V5UHVibGljS2V5IH0gZnJvbSAnLi9lZDI1NTE5UHViJztcblxuY29uc3QgSEFSREVORURfQklQNDRfUEFUSCA9IC9ebVxcLzQ0J1xcLyhcXGQrKSdcXC8oXFxkKyknXFwvKFxcZCspJyQvO1xuY29uc3QgU09GVF9CSVA0NF9QQVRIID0gL15tXFwvNDRcXC8oXFxkKylcXC8oXFxkKylcXC8oXFxkKykkLztcbmNvbnN0IFNBRkVfU0xPVF9PUkRJTkFMUzogcmVhZG9ubHkgbnVtYmVyW10gPSBPYmplY3QudmFsdWVzKFNBRkVfUk9PVF9TTE9UX09SRElOQUxTKTtcblxuZXhwb3J0IGludGVyZmFjZSBTYWZlQmlwNDRQYXRoU2VnbWVudHMge1xuICBjb2luVHlwZTogbnVtYmVyO1xuICBzbG90T3JkaW5hbDogbnVtYmVyO1xuICBhY2NvdW50OiBudW1iZXI7XG59XG5cbi8qKlxuICogQXNzZXJ0IGBwYXRoYCBpcyBhIHZhbGlkIEJJUDMyIHBhdGggZm9yIHRoZSBnaXZlbiBkZXJpdmF0aW9uIGtpbmQuIEhhcmRlbmVkIHBhdGhzIHJlcXVpcmUgZXZlcnlcbiAqIHNlZ21lbnQgdG8gY2FycnkgdGhlIGAnYCBtYXJrZXI7IHNvZnQgcGF0aHMgcmVqZWN0IGl0LiBFdmVyeSBzZWdtZW50IG11c3QgYmUgYSBub24tbmVnYXRpdmVcbiAqIGludGVnZXIgYXQgb3IgYmVsb3cge0BsaW5rIE1BWF9CSVAzMl9JTkRFWH0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRCaXAzMlBhdGgocGF0aDogc3RyaW5nLCBvcHRzOiB7IGhhcmRlbmVkOiBib29sZWFuIH0pOiB2b2lkIHtcbiAgY29uc3QgcmUgPSBvcHRzLmhhcmRlbmVkID8gL15tKFxcL1xcZCsnKSskLyA6IC9ebShcXC9cXGQrKSskLztcbiAgaWYgKCFyZS50ZXN0KHBhdGgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkICR7b3B0cy5oYXJkZW5lZCA/ICdoYXJkZW5lZCcgOiAnc29mdCd9IGRlcml2YXRpb24gcGF0aCAnJHtwYXRofSdgKTtcbiAgfVxuICBjb25zdCBvdXRPZlJhbmdlID0gcGF0aFxuICAgIC5zcGxpdCgnLycpXG4gICAgLnNsaWNlKDEpXG4gICAgLm1hcCgoc2VnbWVudCkgPT4gTnVtYmVyKG9wdHMuaGFyZGVuZWQgPyBzZWdtZW50LnNsaWNlKDAsIC0xKSA6IHNlZ21lbnQpKVxuICAgIC5zb21lKChpbmRleCkgPT4gIU51bWJlci5pc0ludGVnZXIoaW5kZXgpIHx8IGluZGV4IDwgMCB8fCBpbmRleCA+IE1BWF9CSVAzMl9JTkRFWCk7XG4gIGlmIChvdXRPZlJhbmdlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkICR7b3B0cy5oYXJkZW5lZCA/ICdoYXJkZW5lZCcgOiAnc29mdCd9IGRlcml2YXRpb24gcGF0aCAnJHtwYXRofSc6IGluZGV4IG91dCBvZiByYW5nZWApO1xuICB9XG59XG5cbi8qKlxuICogQ2Fub25pY2FsIGRlY2ltYWwgb25seTogYDA0NGAgYW5kIGA0NGAgbmFtZSBvbmUga2V5IHVuZGVyIHR3byBzdHJpbmdzLCBzbyBzdHJpbmctZXF1YWxpdHlcbiAqIHBhdGggY2hlY2tzICh0aGUgc2VydmVyJ3MgdW5pcXVlIGluZGV4KSB3b3VsZCB0cmVhdCBvbmUgY2hpbGQgYXMgdHdvLlxuICovXG5mdW5jdGlvbiBwYXJzZUJpcDMySW5kZXgoc2VnbWVudDogc3RyaW5nKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgaW5kZXggPSBOdW1iZXIoc2VnbWVudCk7XG4gIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKGluZGV4KSAmJiBpbmRleCA8PSBNQVhfQklQMzJfSU5ERVggJiYgU3RyaW5nKGluZGV4KSA9PT0gc2VnbWVudCA/IGluZGV4IDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBwYXJzZUJpcDQ0U2VnbWVudHMobWF0Y2g6IFJlZ0V4cEV4ZWNBcnJheSB8IG51bGwpOiBTYWZlQmlwNDRQYXRoU2VnbWVudHMgfCB1bmRlZmluZWQge1xuICBpZiAoIW1hdGNoKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCBjb2luVHlwZSA9IHBhcnNlQmlwMzJJbmRleChtYXRjaFsxXSk7XG4gIGNvbnN0IHNsb3RPcmRpbmFsID0gcGFyc2VCaXAzMkluZGV4KG1hdGNoWzJdKTtcbiAgY29uc3QgYWNjb3VudCA9IHBhcnNlQmlwMzJJbmRleChtYXRjaFszXSk7XG4gIGlmIChjb2luVHlwZSA9PT0gdW5kZWZpbmVkIHx8IHNsb3RPcmRpbmFsID09PSB1bmRlZmluZWQgfHwgYWNjb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBpZiAoIVNBRkVfU0xPVF9PUkRJTkFMUy5pbmNsdWRlcyhzbG90T3JkaW5hbCkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiB7IGNvaW5UeXBlLCBzbG90T3JkaW5hbCwgYWNjb3VudCB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aEJyYW5kIHtcbiAgcmVhZG9ubHkgRGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoOiB1bmlxdWUgc3ltYm9sO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlcml2ZWRGcm9tUGFyZW50V2l0aFNvZnRQYXRoQnJhbmQge1xuICByZWFkb25seSBEZXJpdmVkRnJvbVBhcmVudFdpdGhTb2Z0UGF0aDogdW5pcXVlIHN5bWJvbDtcbn1cblxuLyoqIFNhZmUgdXNlci1jaGlsZCBwYXRoIGBtLzQ0Jy88Y29pblR5cGU+Jy88c2xvdD4nLzxhY2NvdW50PidgOyBhbHNvIGV2ZXJ5IE1QQyBjaGlsZC4gKi9cbmV4cG9ydCB0eXBlIERlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aCA9IHQuQnJhbmRlZDxzdHJpbmcsIERlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aEJyYW5kPjtcblxuLyoqIE11bHRpc2lnIGNvLXNpZ25lciBwYXRoIGBtLzQ0Lzxjb2luVHlwZT4vPHNsb3Q+LzxhY2NvdW50PmAsIHRoZSBzb2Z0IHR3aW4gb2YgYSB1c2VyLWNoaWxkIHBhdGguICovXG5leHBvcnQgdHlwZSBEZXJpdmVkRnJvbVBhcmVudFdpdGhTb2Z0UGF0aCA9IHQuQnJhbmRlZDxzdHJpbmcsIERlcml2ZWRGcm9tUGFyZW50V2l0aFNvZnRQYXRoQnJhbmQ+O1xuXG5leHBvcnQgZnVuY3Rpb24gaXNEZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGgoczogc3RyaW5nKTogcyBpcyBEZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGgge1xuICByZXR1cm4gcGFyc2VCaXA0NFNlZ21lbnRzKEhBUkRFTkVEX0JJUDQ0X1BBVEguZXhlYyhzKSkgIT09IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRGVyaXZlZEZyb21QYXJlbnRXaXRoU29mdFBhdGgoczogc3RyaW5nKTogcyBpcyBEZXJpdmVkRnJvbVBhcmVudFdpdGhTb2Z0UGF0aCB7XG4gIHJldHVybiBwYXJzZUJpcDQ0U2VnbWVudHMoU09GVF9CSVA0NF9QQVRILmV4ZWMocykpICE9PSB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBjb25zdCBEZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGggPSB0LmJyYW5kKFxuICB0LnN0cmluZyxcbiAgKHMpOiBzIGlzIERlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aCA9PiBpc0Rlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aChzKSxcbiAgJ0Rlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aCdcbik7XG5cbmV4cG9ydCBjb25zdCBEZXJpdmVkRnJvbVBhcmVudFdpdGhTb2Z0UGF0aCA9IHQuYnJhbmQoXG4gIHQuc3RyaW5nLFxuICAocyk6IHMgaXMgRGVyaXZlZEZyb21QYXJlbnRXaXRoU29mdFBhdGggPT4gaXNEZXJpdmVkRnJvbVBhcmVudFdpdGhTb2Z0UGF0aChzKSxcbiAgJ0Rlcml2ZWRGcm9tUGFyZW50V2l0aFNvZnRQYXRoJ1xuKTtcblxuLyoqXG4gKiBSZWFkcyB0aGUgbnVtZXJpYyBzZWdtZW50cyBvdXQgb2YgYSB1c2VyL01QQyBjaGlsZCBwYXRoLiBSZWplY3RzIGFueXRoaW5nIGVsc2UsIGluY2x1ZGluZyBhXG4gKiBjYXN0IHNvZnQgcGF0aDogYSBoYXJkZW5lZCBkZXJpdmUgY2VyZW1vbnkgbXVzdCBuZXZlciBydW4gYXQsIG9yIHJlZ2lzdGVyLCBhIHNvZnQgcGF0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU2FmZUJpcDQ0UGF0aChwYXRoOiBEZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGgpOiBTYWZlQmlwNDRQYXRoU2VnbWVudHMge1xuICBjb25zdCBzZWdtZW50cyA9IHBhcnNlQmlwNDRTZWdtZW50cyhIQVJERU5FRF9CSVA0NF9QQVRILmV4ZWMocGF0aCkpO1xuICBpZiAoc2VnbWVudHMgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzYWZlIEJJUDQ0IHBhdGggJyR7cGF0aH0nYCk7XG4gIH1cbiAgcmV0dXJuIHNlZ21lbnRzO1xufVxuXG4vKiogVGhlIGA8Y29pblR5cGU+YCBzZWdtZW50IGZvciBhIGNvaW4uIE9GQyBhbmQgZmlhdCBjb2lucyBoYXZlIG5vbmUgYW5kIGNhbm5vdCBtaW50IGEgc2FmZSBjaGlsZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTYWZlQmlwNDRDb2luVHlwZShjb2luOiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCBjb2luVHlwZSA9IGNvaW5zLmdldChjb2luKS5iaXA0NENvaW5UeXBlO1xuICBpZiAoY29pblR5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ29pbiAnJHtjb2lufScgaGFzIG5vIEJJUDQ0IGNvaW4gdHlwZSBhbmQgY2Fubm90IGRlcml2ZSBhIHNhZmUgY2hpbGRgKTtcbiAgfVxuICByZXR1cm4gY29pblR5cGU7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSB1c2VyLWNoaWxkIHBhdGggYG0vNDQnLzxjb2luVHlwZT4nLzxzbG90PicvPGFjY291bnQ+J2AuIGBjb2luVHlwZWAgY29tZXMgZnJvbSBzdGF0aWNzXG4gKiAob3IgdGhlIGRlcml2YXRpb24taW5kZXggcmVzcG9uc2UpIGFuZCBgYWNjb3VudGAgZnJvbSB0aGUgc2FmZSdzIHBlci0oc2xvdCwgY29pblR5cGUpIGNvdW50ZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFNhZmVCaXA0NFBhdGgoXG4gIGNvaW5UeXBlOiBudW1iZXIsXG4gIHNsb3Q6IFJvb3RLZXlUeXBlLFxuICBhY2NvdW50OiBudW1iZXJcbik6IERlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aCB7XG4gIGNvbnN0IHBhdGggPSBgbS80NCcvJHtjb2luVHlwZX0nLyR7U0FGRV9ST09UX1NMT1RfT1JESU5BTFNbc2xvdF19Jy8ke2FjY291bnR9J2A7XG4gIGlmICghaXNEZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGgocGF0aCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2FmZSBCSVA0NCBwYXRoIHNlZ21lbnRzOiBjb2luVHlwZT0ke2NvaW5UeXBlfSwgc2xvdD0ke3Nsb3R9LCBhY2NvdW50PSR7YWNjb3VudH1gKTtcbiAgfVxuICByZXR1cm4gcGF0aDtcbn1cblxuLyoqIFN0cmlwcyBoYXJkZW5pbmcgZnJvbSBldmVyeSBsZXZlbDogdGhlIGNvLXNpZ25lciBwYXRoIHBhaXJlZCB3aXRoIGEgdXNlci1jaGlsZCBwYXRoLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvU29mdFR3aW5QYXRoKHBhdGg6IERlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aCk6IERlcml2ZWRGcm9tUGFyZW50V2l0aFNvZnRQYXRoIHtcbiAgY29uc3Qgc29mdFBhdGggPSBwYXRoLnJlcGxhY2UoLycvZywgJycpO1xuICBpZiAoIWlzRGVyaXZlZEZyb21QYXJlbnRXaXRoU29mdFBhdGgoc29mdFBhdGgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNhZmUgQklQNDQgcGF0aCAnJHtwYXRofSc6IG5vIHNvZnQgdHdpbmApO1xuICB9XG4gIHJldHVybiBzb2Z0UGF0aDtcbn1cblxuLyoqXG4gKiBUaGUgdHlwZSBhbG9uZSBpcyBub3QgZW5vdWdoOiBhIGNhc3QgcGF0aCB3aXRoIGEgc29mdCBsZXZlbCBvbiBhIHVzZXIgY2hpbGQgd291bGQgbGV0IHRoZVxuICogcGFyZW50IHhwdWIgcGx1cyB0aGUgY2hpbGQgcHJ2IHJlY292ZXIgdGhlIHJvb3QuXG4gKi9cbmZ1bmN0aW9uIGFzc2VydEhhcmRlbmVkUGF0aChwYXRoOiBzdHJpbmcpOiBhc3NlcnRzIHBhdGggaXMgRGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoIHtcbiAgaWYgKCFpc0Rlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aChwYXRoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzYWZlIGNoaWxkIHBhdGggJyR7cGF0aH0nOiBleHBlY3RlZCBtLzQ0Jy88Y29pblR5cGU+Jy88c2xvdD4nLzxhY2NvdW50PidgKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNhZmVIYXJkZW5lZENoaWxkS2V5IHtcbiAgcHJ2OiBzdHJpbmc7XG4gIHB1Yjogc3RyaW5nO1xuICBkZXJpdmF0aW9uUGF0aDogRGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoO1xufVxuXG5mdW5jdGlvbiBjaGlsZEZyb21Ob2RlKGNoaWxkOiBCSVAzMkludGVyZmFjZSwgZGVyaXZhdGlvblBhdGg6IERlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aCk6IFNhZmVIYXJkZW5lZENoaWxkS2V5IHtcbiAgaWYgKCFjaGlsZC5wcml2YXRlS2V5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZGVyaXZlIGhhcmRlbmVkIHNhZmUgY2hpbGQgYXQgJHtkZXJpdmF0aW9uUGF0aH1gKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHBydjogY2hpbGQudG9CYXNlNTgoKSxcbiAgICBwdWI6IGNoaWxkLm5ldXRlcmVkKCkudG9CYXNlNTgoKSxcbiAgICBkZXJpdmF0aW9uUGF0aCxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlcml2ZVNhZmVDaGlsZEhhcmRlbmVkRnJvbVhwcnYoXG4gIHJvb3RYcHJ2OiBzdHJpbmcsXG4gIHBhdGg6IERlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aFxuKTogU2FmZUhhcmRlbmVkQ2hpbGRLZXkge1xuICBhc3NlcnRIYXJkZW5lZFBhdGgocGF0aCk7XG4gIHJldHVybiBjaGlsZEZyb21Ob2RlKGJpcDMyLmZyb21CYXNlNTgocm9vdFhwcnYpLmRlcml2ZVBhdGgocGF0aCksIHBhdGgpO1xufVxuXG4vKiogUmUtZGVyaXZlIGFuZCBhc3NlcnQgYm90aCByZXN1bHRzIG1hdGNoIGJlZm9yZSB0aGUgY2hpbGQgaXMgcmVnaXN0ZXJlZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXJpdmVBbmRTZWxmQ2hlY2tTYWZlQ2hpbGRIYXJkZW5lZChcbiAgcm9vdFhwcnY6IHN0cmluZyxcbiAgcGF0aDogRGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoXG4pOiBTYWZlSGFyZGVuZWRDaGlsZEtleSB7XG4gIGNvbnN0IGZpcnN0ID0gZGVyaXZlU2FmZUNoaWxkSGFyZGVuZWRGcm9tWHBydihyb290WHBydiwgcGF0aCk7XG4gIGNvbnN0IHNlY29uZCA9IGRlcml2ZVNhZmVDaGlsZEhhcmRlbmVkRnJvbVhwcnYocm9vdFhwcnYsIHBhdGgpO1xuICBpZiAoZmlyc3QucHViICE9PSBzZWNvbmQucHViIHx8IGZpcnN0LnBydiAhPT0gc2Vjb25kLnBydikge1xuICAgIHRocm93IG5ldyBFcnJvcihgU2FmZSBjaGlsZCBzZWxmLWNoZWNrIGZhaWxlZCBhdCAke2ZpcnN0LmRlcml2YXRpb25QYXRofTogZGVyaXZhdGlvbiB3YXMgbm90IGRldGVybWluaXN0aWNgKTtcbiAgfVxuICByZXR1cm4gZmlyc3Q7XG59XG5cbi8qKlxuICogU0xJUC0wMDEwIGhhcmRlbmVkIGRlcml2YXRpb24gb2YgYSBzYWZlIHVzZXIgY2hpbGQgZnJvbSBhbiBlZDI1NTE5IHJvb3Qgc2VjcmV0IHNlZWQuXG4gKlxuICogYHJvb3RQcnZgIGlzIGEgU3RlbGxhciBTdHJLZXkgYFPigKZgIHNlY3JldCBzZWVkICh3aGF0IHNsb3Qt4pGhIGBlZDI1NTE5TXVsdGlzaWdgIHVzZXIgcm9vdHMgc3RvcmUpLlxuICogVGhlIGRlcml2YXRpb24gcmV1c2VzIHRoZSBleGlzdGluZyBTTElQLTAwMTAgaW1wbGVtZW50YXRpb24ge0BsaW5rIEVkMjU1MTlLZXlEZXJpdmVyLmRlcml2ZVBhdGh9XG4gKiAoaGFyZGVuZWQtb25seSBDS0RQcml2IG92ZXIgdGhlIGBlZDI1NTE5IHNlZWRgIEhNQUMgbWFzdGVyKSwgdGhlbiBleHBhbmRzIHRoZSByZXN1bHRpbmcgMzItYnl0ZVxuICogY2hpbGQgc2VlZCBpbnRvIGEga2V5cGFpciB3aXRoIGBuYWNsYC4gVGhlIGNoaWxkIGBwdWJgIGlzIGEgYmFyZSBTdHJLZXkgYEfigKZgOyB0aGUgYHBydmAgaXMgdGhlXG4gKiByYXcgMzItYnl0ZSBjaGlsZCBzZWVkIGFzIGhleCAodGhlIHNlZWQgaW5wdXQgYSBzaWduZXIgbmVlZHMpLlxuICpcbiAqIFVubGlrZSB0aGUgc2VjcDI1NmsxIHBhdGgsIGVkMjU1MTkgaGFyZGVuZWQgZGVyaXZhdGlvbiBuZWVkcyBubyBjaGFpbiBjb2RlIOKAlCB0aGUgY29tcG9zaXRlXG4gKiBgcHVi4oCWY2hhaW5Db2RlYCBmb3JtIGlzIG9ubHkgZm9yIFNPRlQgY28tc2lnbmVyIGRlcml2YXRpb24gYW5kIGlzIG5vdCB1c2VkIGhlcmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXJpdmVTYWZlQ2hpbGRFZDI1NTE5SGFyZGVuZWQoXG4gIHJvb3RQcnY6IHN0cmluZyxcbiAgcGF0aDogRGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoXG4pOiBTYWZlSGFyZGVuZWRDaGlsZEtleSB7XG4gIGFzc2VydEhhcmRlbmVkUGF0aChwYXRoKTtcbiAgY29uc3QgcmF3U2VlZEhleCA9IGRlY29kZUVkMjU1MTlTdHJLZXlTZWNyZXRTZWVkKHJvb3RQcnYpLnRvU3RyaW5nKCdoZXgnKTtcbiAgY29uc3QgY2hpbGRTZWVkID0gRWQyNTUxOUtleURlcml2ZXIuZGVyaXZlUGF0aChwYXRoLCByYXdTZWVkSGV4KS5rZXk7XG4gIGNvbnN0IGtleVBhaXIgPSBuYWNsLnNpZ24ua2V5UGFpci5mcm9tU2VlZChVaW50OEFycmF5LmZyb20oY2hpbGRTZWVkKSk7XG4gIGNvbnN0IHB1YiA9IGVuY29kZUVkMjU1MTlTdHJLZXlQdWJsaWNLZXkoQnVmZmVyLmZyb20oa2V5UGFpci5wdWJsaWNLZXkpKTtcbiAgcmV0dXJuIHtcbiAgICBwcnY6IEJ1ZmZlci5mcm9tKGNoaWxkU2VlZCkudG9TdHJpbmcoJ2hleCcpLFxuICAgIHB1YixcbiAgICBkZXJpdmF0aW9uUGF0aDogcGF0aCxcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTYWZlU2VjcDI1NmsxQ2hpbGRUcmlwbGV0IHtcbiAgdXNlcjogeyBwcnY6IHN0cmluZzsgcHViOiBzdHJpbmcgfTtcbiAgYmFja3VwOiB7IHBydjogc3RyaW5nOyBwdWI6IHN0cmluZyB9O1xuICBiaXRnbzogeyBwdWI6IHN0cmluZyB9O1xufVxuXG4vKipcbiAqIERlcml2ZXMgdGhlIHNsb3Qt4pGgIChzZWNwMjU2azFNdWx0aXNpZykgY2hpbGQgdHJpcGxldCBmcm9tIHRoZSBrZXljYXJkIHJvb3RzOiB0aGUgdXNlciBjaGlsZCBhdFxuICogdGhlIGhhcmRlbmVkIGBwYXRoYCwgdGhlIGJhY2t1cCBhbmQgQml0R28gY2hpbGRyZW4gYXQgaXRzIHNvZnQgdHdpbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlcml2ZVNhZmVDaGlsZFRyaXBsZXQoXG4gIHJvb3RzOiB7IHVzZXI6IHN0cmluZzsgYmFja3VwOiBzdHJpbmc7IGJpdGdvOiBzdHJpbmcgfSxcbiAgcGF0aDogRGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoXG4pOiBTYWZlU2VjcDI1NmsxQ2hpbGRUcmlwbGV0IHtcbiAgYXNzZXJ0SGFyZGVuZWRQYXRoKHBhdGgpO1xuICBjb25zdCB1c2VyUm9vdCA9IGJpcDMyLmZyb21CYXNlNTgocm9vdHMudXNlcik7XG4gIGNvbnN0IGJhY2t1cFJvb3QgPSBiaXAzMi5mcm9tQmFzZTU4KHJvb3RzLmJhY2t1cCk7XG4gIGNvbnN0IGJpdGdvUm9vdCA9IGJpcDMyLmZyb21CYXNlNTgocm9vdHMuYml0Z28pO1xuICBpZiAodXNlclJvb3QuaXNOZXV0ZXJlZCgpIHx8IGJhY2t1cFJvb3QuaXNOZXV0ZXJlZCgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdkZXJpdmVTYWZlQ2hpbGRUcmlwbGV0OiB1c2VyIGFuZCBiYWNrdXAgcm9vdHMgbXVzdCBiZSBwcml2YXRlICh4cHJ2KScpO1xuICB9XG4gIGlmICghYml0Z29Sb290LmlzTmV1dGVyZWQoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignZGVyaXZlU2FmZUNoaWxkVHJpcGxldDogYml0Z28gcm9vdCBtdXN0IGJlIHB1YmxpYyAoeHB1YiknKTtcbiAgfVxuICBjb25zdCBzb2Z0UGF0aCA9IHRvU29mdFR3aW5QYXRoKHBhdGgpO1xuICBjb25zdCB1c2VyID0gdXNlclJvb3QuZGVyaXZlUGF0aChwYXRoKTtcbiAgY29uc3QgYmFja3VwID0gYmFja3VwUm9vdC5kZXJpdmVQYXRoKHNvZnRQYXRoKTtcbiAgcmV0dXJuIHtcbiAgICB1c2VyOiB7IHBydjogdXNlci50b0Jhc2U1OCgpLCBwdWI6IHVzZXIubmV1dGVyZWQoKS50b0Jhc2U1OCgpIH0sXG4gICAgYmFja3VwOiB7IHBydjogYmFja3VwLnRvQmFzZTU4KCksIHB1YjogYmFja3VwLm5ldXRlcmVkKCkudG9CYXNlNTgoKSB9LFxuICAgIGJpdGdvOiB7IHB1YjogYml0Z29Sb290LmRlcml2ZVBhdGgoc29mdFBhdGgpLnRvQmFzZTU4KCkgfSxcbiAgfTtcbn1cbiJdfQ==
|