@bitgo-beta/sdk-api 1.10.1-beta.1712 → 1.10.1-beta.1714
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/package.json +8 -8
- package/dist/src/encrypt.d.ts +5 -35
- package/dist/src/encrypt.d.ts.map +1 -1
- package/dist/src/encrypt.js +15 -126
- package/dist/src/encryptV2.d.ts +65 -0
- package/dist/src/encryptV2.d.ts.map +1 -0
- package/dist/src/encryptV2.js +187 -0
- package/dist/src/encryptionSession.d.ts +34 -0
- package/dist/src/encryptionSession.d.ts.map +1 -0
- package/dist/src/encryptionSession.js +90 -0
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +3 -1
- package/dist/test/unit/encrypt.js +99 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +8 -8
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runs Argon2id once on creation, then derives per-call AES-256-GCM keys via HKDF.
|
|
3
|
+
* Use when encrypting or decrypting multiple values with the same password.
|
|
4
|
+
*
|
|
5
|
+
* Session envelopes are self-describing and can be decrypted standalone via decryptV2.
|
|
6
|
+
* Call destroy() when done to clear the cached key from memory.
|
|
7
|
+
*/
|
|
8
|
+
export declare class EncryptionSession {
|
|
9
|
+
private hkdfKey;
|
|
10
|
+
private argon2SaltB64;
|
|
11
|
+
private readonly memorySize;
|
|
12
|
+
private readonly iterations;
|
|
13
|
+
private readonly parallelism;
|
|
14
|
+
/** Use createEncryptionSession() instead of calling this directly. */
|
|
15
|
+
constructor(hkdfKey: CryptoKey, argon2SaltB64: string, params: {
|
|
16
|
+
memorySize: number;
|
|
17
|
+
iterations: number;
|
|
18
|
+
parallelism: number;
|
|
19
|
+
});
|
|
20
|
+
encrypt(plaintext: string): Promise<string>;
|
|
21
|
+
decrypt(ciphertext: string): Promise<string>;
|
|
22
|
+
destroy(): void;
|
|
23
|
+
private getKeyOrThrow;
|
|
24
|
+
private getSaltOrThrow;
|
|
25
|
+
private buildEnvelope;
|
|
26
|
+
}
|
|
27
|
+
/** Create an EncryptionSession. Runs Argon2id once; all subsequent calls derive keys via HKDF. */
|
|
28
|
+
export declare function createEncryptionSession(password: string, options?: {
|
|
29
|
+
memorySize?: number;
|
|
30
|
+
iterations?: number;
|
|
31
|
+
parallelism?: number;
|
|
32
|
+
salt?: Uint8Array;
|
|
33
|
+
}): Promise<EncryptionSession>;
|
|
34
|
+
//# sourceMappingURL=encryptionSession.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encryptionSession.d.ts","sourceRoot":"","sources":["../../src/encryptionSession.ts"],"names":[],"mappings":"AAcA;;;;;;GAMG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,sEAAsE;gBAEpE,OAAO,EAAE,SAAS,EAClB,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE;IASnE,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAS3C,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAgBlD,OAAO,IAAI,IAAI;IAKf,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,aAAa;CAYtB;AAED,kGAAkG;AAClG,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,UAAU,CAAA;CAAE,GAC9F,OAAO,CAAC,iBAAiB,CAAC,CAe5B"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EncryptionSession = void 0;
|
|
4
|
+
exports.createEncryptionSession = createEncryptionSession;
|
|
5
|
+
const crypto_1 = require("crypto");
|
|
6
|
+
const encryptV2_1 = require("./encryptV2");
|
|
7
|
+
/**
|
|
8
|
+
* Runs Argon2id once on creation, then derives per-call AES-256-GCM keys via HKDF.
|
|
9
|
+
* Use when encrypting or decrypting multiple values with the same password.
|
|
10
|
+
*
|
|
11
|
+
* Session envelopes are self-describing and can be decrypted standalone via decryptV2.
|
|
12
|
+
* Call destroy() when done to clear the cached key from memory.
|
|
13
|
+
*/
|
|
14
|
+
class EncryptionSession {
|
|
15
|
+
/** Use createEncryptionSession() instead of calling this directly. */
|
|
16
|
+
constructor(hkdfKey, argon2SaltB64, params) {
|
|
17
|
+
this.hkdfKey = hkdfKey;
|
|
18
|
+
this.argon2SaltB64 = argon2SaltB64;
|
|
19
|
+
this.memorySize = params.memorySize;
|
|
20
|
+
this.iterations = params.iterations;
|
|
21
|
+
this.parallelism = params.parallelism;
|
|
22
|
+
}
|
|
23
|
+
async encrypt(plaintext) {
|
|
24
|
+
const key = this.getKeyOrThrow();
|
|
25
|
+
const hkdfSalt = new Uint8Array((0, crypto_1.randomBytes)(encryptV2_1.HKDF_SALT_LENGTH));
|
|
26
|
+
const iv = new Uint8Array((0, crypto_1.randomBytes)(encryptV2_1.GCM_IV_LENGTH));
|
|
27
|
+
const aesKey = await (0, encryptV2_1.hkdfDeriveAesKey)(key, hkdfSalt, 'encrypt');
|
|
28
|
+
const ct = await (0, encryptV2_1.aesGcmEncrypt)(aesKey, iv, plaintext);
|
|
29
|
+
return JSON.stringify(this.buildEnvelope(hkdfSalt, iv, ct));
|
|
30
|
+
}
|
|
31
|
+
async decrypt(ciphertext) {
|
|
32
|
+
const key = this.getKeyOrThrow();
|
|
33
|
+
const envelope = (0, encryptV2_1.parseV2Envelope)(ciphertext);
|
|
34
|
+
if (!envelope.hkdfSalt) {
|
|
35
|
+
throw new Error('envelope was not encrypted with a session; use decryptV2 instead');
|
|
36
|
+
}
|
|
37
|
+
if (envelope.salt !== this.getSaltOrThrow()) {
|
|
38
|
+
throw new Error('envelope was not encrypted with this session');
|
|
39
|
+
}
|
|
40
|
+
const iv = new Uint8Array(Buffer.from(envelope.iv, 'base64'));
|
|
41
|
+
const ct = new Uint8Array(Buffer.from(envelope.ct, 'base64'));
|
|
42
|
+
const hkdfSalt = new Uint8Array(Buffer.from(envelope.hkdfSalt, 'base64'));
|
|
43
|
+
const aesKey = await (0, encryptV2_1.hkdfDeriveAesKey)(key, hkdfSalt, 'decrypt');
|
|
44
|
+
return (0, encryptV2_1.aesGcmDecrypt)(aesKey, iv, ct);
|
|
45
|
+
}
|
|
46
|
+
destroy() {
|
|
47
|
+
this.hkdfKey = null;
|
|
48
|
+
this.argon2SaltB64 = null;
|
|
49
|
+
}
|
|
50
|
+
getKeyOrThrow() {
|
|
51
|
+
if (this.hkdfKey === null || this.argon2SaltB64 === null) {
|
|
52
|
+
throw new Error('EncryptionSession has been destroyed');
|
|
53
|
+
}
|
|
54
|
+
return this.hkdfKey;
|
|
55
|
+
}
|
|
56
|
+
getSaltOrThrow() {
|
|
57
|
+
if (this.argon2SaltB64 === null) {
|
|
58
|
+
throw new Error('EncryptionSession has been destroyed');
|
|
59
|
+
}
|
|
60
|
+
return this.argon2SaltB64;
|
|
61
|
+
}
|
|
62
|
+
buildEnvelope(hkdfSalt, iv, ct) {
|
|
63
|
+
return {
|
|
64
|
+
v: 2,
|
|
65
|
+
m: this.memorySize,
|
|
66
|
+
t: this.iterations,
|
|
67
|
+
p: this.parallelism,
|
|
68
|
+
salt: this.getSaltOrThrow(),
|
|
69
|
+
hkdfSalt: Buffer.from(hkdfSalt).toString('base64'),
|
|
70
|
+
iv: Buffer.from(iv).toString('base64'),
|
|
71
|
+
ct: Buffer.from(ct).toString('base64'),
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
exports.EncryptionSession = EncryptionSession;
|
|
76
|
+
/** Create an EncryptionSession. Runs Argon2id once; all subsequent calls derive keys via HKDF. */
|
|
77
|
+
async function createEncryptionSession(password, options) {
|
|
78
|
+
const memorySize = options?.memorySize ?? encryptV2_1.ARGON2_DEFAULTS.memorySize;
|
|
79
|
+
const iterations = options?.iterations ?? encryptV2_1.ARGON2_DEFAULTS.iterations;
|
|
80
|
+
const parallelism = options?.parallelism ?? encryptV2_1.ARGON2_DEFAULTS.parallelism;
|
|
81
|
+
const params = { memorySize, iterations, parallelism };
|
|
82
|
+
const argon2Salt = options?.salt ?? new Uint8Array((0, crypto_1.randomBytes)(encryptV2_1.ARGON2_DEFAULTS.saltLength));
|
|
83
|
+
if (argon2Salt.length !== encryptV2_1.ARGON2_DEFAULTS.saltLength) {
|
|
84
|
+
throw new Error(`salt must be ${encryptV2_1.ARGON2_DEFAULTS.saltLength} bytes`);
|
|
85
|
+
}
|
|
86
|
+
const hkdfKey = await (0, encryptV2_1.argon2ToHkdfKey)(password, argon2Salt, params);
|
|
87
|
+
const argon2SaltB64 = Buffer.from(argon2Salt).toString('base64');
|
|
88
|
+
return new EncryptionSession(hkdfKey, argon2SaltB64, params);
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jcnlwdGlvblNlc3Npb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZW5jcnlwdGlvblNlc3Npb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBbUdBLDBEQWtCQztBQXJIRCxtQ0FBcUM7QUFFckMsMkNBVXFCO0FBRXJCOzs7Ozs7R0FNRztBQUNILE1BQWEsaUJBQWlCO0lBTTVCLHNFQUFzRTtJQUN0RSxZQUNFLE9BQWtCLEVBQ2xCLGFBQXFCLEVBQ3JCLE1BQXVFO1FBRXZFLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO1FBQ25DLElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQztRQUNwQyxJQUFJLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUM7UUFDcEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQWlCO1FBQzdCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNqQyxNQUFNLFFBQVEsR0FBRyxJQUFJLFVBQVUsQ0FBQyxJQUFBLG9CQUFXLEVBQUMsNEJBQWdCLENBQUMsQ0FBQyxDQUFDO1FBQy9ELE1BQU0sRUFBRSxHQUFHLElBQUksVUFBVSxDQUFDLElBQUEsb0JBQVcsRUFBQyx5QkFBYSxDQUFDLENBQUMsQ0FBQztRQUN0RCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUEsNEJBQWdCLEVBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNoRSxNQUFNLEVBQUUsR0FBRyxNQUFNLElBQUEseUJBQWEsRUFBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3RELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFB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VUFBVSxJQUFJLDJCQUFlLENBQUMsVUFBVSxDQUFDO0lBQ3JFLE1BQU0sVUFBVSxHQUFHLE9BQU8sRUFBRSxVQUFVLElBQUksMkJBQWUsQ0FBQyxVQUFVLENBQUM7SUFDckUsTUFBTSxXQUFXLEdBQUcsT0FBTyxFQUFFLFdBQVcsSUFBSSwyQkFBZSxDQUFDLFdBQVcsQ0FBQztJQUN4RSxNQUFNLE1BQU0sR0FBRyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLENBQUM7SUFFdkQsTUFBTSxVQUFVLEdBQUcsT0FBTyxFQUFFLElBQUksSUFBSSxJQUFJLFVBQVUsQ0FBQyxJQUFBLG9CQUFXLEVBQUMsMkJBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQzVGLElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSywyQkFBZSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3JELE1BQU0sSUFBSSxLQUFLLENBQUMsZ0JBQWdCLDJCQUFlLENBQUMsVUFBVSxRQUFRLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBRUQsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFBLDJCQUFlLEVBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNwRSxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUVqRSxPQUFPLElBQUksaUJBQWlCLENBQUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUMvRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmFuZG9tQnl0ZXMgfSBmcm9tICdjcnlwdG8nO1xuXG5pbXBvcnQge1xuICBhZXNHY21EZWNyeXB0LFxuICBhZXNHY21FbmNyeXB0LFxuICBBUkdPTjJfREVGQVVMVFMsXG4gIGFyZ29uMlRvSGtkZktleSxcbiAgR0NNX0lWX0xFTkdUSCxcbiAgaGtkZkRlcml2ZUFlc0tleSxcbiAgSEtERl9TQUxUX0xFTkdUSCxcbiAgcGFyc2VWMkVudmVsb3BlLFxuICBWMkVudmVsb3BlLFxufSBmcm9tICcuL2VuY3J5cHRWMic7XG5cbi8qKlxuICogUnVucyBBcmdvbjJpZCBvbmNlIG9uIGNyZWF0aW9uLCB0aGVuIGRlcml2ZXMgcGVyLWNhbGwgQUVTLTI1Ni1HQ00ga2V5cyB2aWEgSEtERi5cbiAqIFVzZSB3aGVuIGVuY3J5cHRpbmcgb3IgZGVjcnlwdGluZyBtdWx0aXBsZSB2YWx1ZXMgd2l0aCB0aGUgc2FtZSBwYXNzd29yZC5cbiAqXG4gKiBTZXNzaW9uIGVudmVsb3BlcyBhcmUgc2VsZi1kZXNjcmliaW5nIGFuZCBjYW4gYmUgZGVjcnlwdGVkIHN0YW5kYWxvbmUgdmlhIGRlY3J5cHRWMi5cbiAqIENhbGwgZGVzdHJveSgpIHdoZW4gZG9uZSB0byBjbGVhciB0aGUgY2FjaGVkIGtleSBmcm9tIG1lbW9yeS5cbiAqL1xuZXhwb3J0IGNsYXNzIEVuY3J5cHRpb25TZXNzaW9uIHtcbiAgcHJpdmF0ZSBoa2RmS2V5OiBDcnlwdG9LZXkgfCBudWxsO1xuICBwcml2YXRlIGFyZ29uMlNhbHRCNjQ6IHN0cmluZyB8IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWVtb3J5U2l6ZTogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGl0ZXJhdGlvbnM6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBwYXJhbGxlbGlzbTogbnVtYmVyO1xuICAvKiogVXNlIGNyZWF0ZUVuY3J5cHRpb25TZXNzaW9uKCkgaW5zdGVhZCBvZiBjYWxsaW5nIHRoaXMgZGlyZWN0bHkuICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIGhrZGZLZXk6IENyeXB0b0tleSxcbiAgICBhcmdvbjJTYWx0QjY0OiBzdHJpbmcsXG4gICAgcGFyYW1zOiB7IG1lbW9yeVNpemU6IG51bWJlcjsgaXRlcmF0aW9uczogbnVtYmVyOyBwYXJhbGxlbGlzbTogbnVtYmVyIH1cbiAgKSB7XG4gICAgdGhpcy5oa2RmS2V5ID0gaGtkZktleTtcbiAgICB0aGlzLmFyZ29uMlNhbHRCNjQgPSBhcmdvbjJTYWx0QjY0O1xuICAgIHRoaXMubWVtb3J5U2l6ZSA9IHBhcmFtcy5tZW1vcnlTaXplO1xuICAgIHRoaXMuaXRlcmF0aW9ucyA9IHBhcmFtcy5pdGVyYXRpb25zO1xuICAgIHRoaXMucGFyYWxsZWxpc20gPSBwYXJhbXMucGFyYWxsZWxpc207XG4gIH1cblxuICBhc3luYyBlbmNyeXB0KHBsYWludGV4dDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmdldEtleU9yVGhyb3coKTtcbiAgICBjb25zdCBoa2RmU2FsdCA9IG5ldyBVaW50OEFycmF5KHJhbmRvbUJ5dGVzKEhLREZfU0FMVF9MRU5HVEgpKTtcbiAgICBjb25zdCBpdiA9IG5ldyBVaW50OEFycmF5KHJhbmRvbUJ5dGVzKEdDTV9JVl9MRU5HVEgpKTtcbiAgICBjb25zdCBhZXNLZXkgPSBhd2FpdCBoa2RmRGVyaXZlQWVzS2V5KGtleSwgaGtkZlNhbHQsICdlbmNyeXB0Jyk7XG4gICAgY29uc3QgY3QgPSBhd2FpdCBhZXNHY21FbmNyeXB0KGFlc0tleSwgaXYsIHBsYWludGV4dCk7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMuYnVpbGRFbnZlbG9wZShoa2RmU2FsdCwgaXYsIGN0KSk7XG4gIH1cblxuICBhc3luYyBkZWNyeXB0KGNpcGhlcnRleHQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5nZXRLZXlPclRocm93KCk7XG4gICAgY29uc3QgZW52ZWxvcGUgPSBwYXJzZVYyRW52ZWxvcGUoY2lwaGVydGV4dCk7XG4gICAgaWYgKCFlbnZlbG9wZS5oa2RmU2FsdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdlbnZlbG9wZSB3YXMgbm90IGVuY3J5cHRlZCB3aXRoIGEgc2Vzc2lvbjsgdXNlIGRlY3J5cHRWMiBpbnN0ZWFkJyk7XG4gICAgfVxuICAgIGlmIChlbnZlbG9wZS5zYWx0ICE9PSB0aGlzLmdldFNhbHRPclRocm93KCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZW52ZWxvcGUgd2FzIG5vdCBlbmNyeXB0ZWQgd2l0aCB0aGlzIHNlc3Npb24nKTtcbiAgICB9XG4gICAgY29uc3QgaXYgPSBuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbShlbnZlbG9wZS5pdiwgJ2Jhc2U2NCcpKTtcbiAgICBjb25zdCBjdCA9IG5ldyBVaW50OEFycmF5KEJ1ZmZlci5mcm9tKGVudmVsb3BlLmN0LCAnYmFzZTY0JykpO1xuICAgIGNvbnN0IGhrZGZTYWx0ID0gbmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmZyb20oZW52ZWxvcGUuaGtkZlNhbHQsICdiYXNlNjQnKSk7XG4gICAgY29uc3QgYWVzS2V5ID0gYXdhaXQgaGtkZkRlcml2ZUFlc0tleShrZXksIGhrZGZTYWx0LCAnZGVjcnlwdCcpO1xuICAgIHJldHVybiBhZXNHY21EZWNyeXB0KGFlc0tleSwgaXYsIGN0KTtcbiAgfVxuXG4gIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5oa2RmS2V5ID0gbnVsbDtcbiAgICB0aGlzLmFyZ29uMlNhbHRCNjQgPSBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRLZXlPclRocm93KCk6IENyeXB0b0tleSB7XG4gICAgaWYgKHRoaXMuaGtkZktleSA9PT0gbnVsbCB8fCB0aGlzLmFyZ29uMlNhbHRCNjQgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRW5jcnlwdGlvblNlc3Npb24gaGFzIGJlZW4gZGVzdHJveWVkJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmhrZGZLZXk7XG4gIH1cblxuICBwcml2YXRlIGdldFNhbHRPclRocm93KCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuYXJnb24yU2FsdEI2NCA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbmNyeXB0aW9uU2Vzc2lvbiBoYXMgYmVlbiBkZXN0cm95ZWQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYXJnb24yU2FsdEI2NDtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRFbnZlbG9wZShoa2RmU2FsdDogVWludDhBcnJheSwgaXY6IFVpbnQ4QXJyYXksIGN0OiBVaW50OEFycmF5KTogVjJFbnZlbG9wZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHY6IDIsXG4gICAgICBtOiB0aGlzLm1lbW9yeVNpemUsXG4gICAgICB0OiB0aGlzLml0ZXJhdGlvbnMsXG4gICAgICBwOiB0aGlzLnBhcmFsbGVsaXNtLFxuICAgICAgc2FsdDogdGhpcy5nZXRTYWx0T3JUaHJvdygpLFxuICAgICAgaGtkZlNhbHQ6IEJ1ZmZlci5mcm9tKGhrZGZTYWx0KS50b1N0cmluZygnYmFzZTY0JyksXG4gICAgICBpdjogQnVmZmVyLmZyb20oaXYpLnRvU3RyaW5nKCdiYXNlNjQnKSxcbiAgICAgIGN0OiBCdWZmZXIuZnJvbShjdCkudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICAgIH07XG4gIH1cbn1cblxuLyoqIENyZWF0ZSBhbiBFbmNyeXB0aW9uU2Vzc2lvbi4gUnVucyBBcmdvbjJpZCBvbmNlOyBhbGwgc3Vic2VxdWVudCBjYWxscyBkZXJpdmUga2V5cyB2aWEgSEtERi4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVFbmNyeXB0aW9uU2Vzc2lvbihcbiAgcGFzc3dvcmQ6IHN0cmluZyxcbiAgb3B0aW9ucz86IHsgbWVtb3J5U2l6ZT86IG51bWJlcjsgaXRlcmF0aW9ucz86IG51bWJlcjsgcGFyYWxsZWxpc20/OiBudW1iZXI7IHNhbHQ/OiBVaW50OEFycmF5IH1cbik6IFByb21pc2U8RW5jcnlwdGlvblNlc3Npb24+IHtcbiAgY29uc3QgbWVtb3J5U2l6ZSA9IG9wdGlvbnM/Lm1lbW9yeVNpemUgPz8gQVJHT04yX0RFRkFVTFRTLm1lbW9yeVNpemU7XG4gIGNvbnN0IGl0ZXJhdGlvbnMgPSBvcHRpb25zPy5pdGVyYXRpb25zID8/IEFSR09OMl9ERUZBVUxUUy5pdGVyYXRpb25zO1xuICBjb25zdCBwYXJhbGxlbGlzbSA9IG9wdGlvbnM/LnBhcmFsbGVsaXNtID8/IEFSR09OMl9ERUZBVUxUUy5wYXJhbGxlbGlzbTtcbiAgY29uc3QgcGFyYW1zID0geyBtZW1vcnlTaXplLCBpdGVyYXRpb25zLCBwYXJhbGxlbGlzbSB9O1xuXG4gIGNvbnN0IGFyZ29uMlNhbHQgPSBvcHRpb25zPy5zYWx0ID8/IG5ldyBVaW50OEFycmF5KHJhbmRvbUJ5dGVzKEFSR09OMl9ERUZBVUxUUy5zYWx0TGVuZ3RoKSk7XG4gIGlmIChhcmdvbjJTYWx0Lmxlbmd0aCAhPT0gQVJHT04yX0RFRkFVTFRTLnNhbHRMZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHNhbHQgbXVzdCBiZSAke0FSR09OMl9ERUZBVUxUUy5zYWx0TGVuZ3RofSBieXRlc2ApO1xuICB9XG5cbiAgY29uc3QgaGtkZktleSA9IGF3YWl0IGFyZ29uMlRvSGtkZktleShwYXNzd29yZCwgYXJnb24yU2FsdCwgcGFyYW1zKTtcbiAgY29uc3QgYXJnb24yU2FsdEI2NCA9IEJ1ZmZlci5mcm9tKGFyZ29uMlNhbHQpLnRvU3RyaW5nKCdiYXNlNjQnKTtcblxuICByZXR1cm4gbmV3IEVuY3J5cHRpb25TZXNzaW9uKGhrZGZLZXksIGFyZ29uMlNhbHRCNjQsIHBhcmFtcyk7XG59XG4iXX0=
|
package/dist/src/index.d.ts
CHANGED
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAC;AACtB,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAC;AACtB,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,qBAAqB,CAAC;AACpC,cAAc,aAAa,CAAC;AAC5B,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC"}
|
package/dist/src/index.js
CHANGED
|
@@ -17,6 +17,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
17
17
|
__exportStar(require("./api"), exports);
|
|
18
18
|
__exportStar(require("./bitgoAPI"), exports);
|
|
19
19
|
__exportStar(require("./encrypt"), exports);
|
|
20
|
+
__exportStar(require("./encryptionSession"), exports);
|
|
21
|
+
__exportStar(require("./encryptV2"), exports);
|
|
20
22
|
__exportStar(require("./util"), exports);
|
|
21
23
|
__exportStar(require("./types"), exports);
|
|
22
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHdDQUFzQjtBQUN0Qiw2Q0FBMkI7QUFDM0IsNENBQTBCO0FBQzFCLHNEQUFvQztBQUNwQyw4Q0FBNEI7QUFDNUIseUNBQXVCO0FBQ3ZCLDBDQUF3QiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vYXBpJztcbmV4cG9ydCAqIGZyb20gJy4vYml0Z29BUEknO1xuZXhwb3J0ICogZnJvbSAnLi9lbmNyeXB0JztcbmV4cG9ydCAqIGZyb20gJy4vZW5jcnlwdGlvblNlc3Npb24nO1xuZXhwb3J0ICogZnJvbSAnLi9lbmNyeXB0VjInO1xuZXhwb3J0ICogZnJvbSAnLi91dGlsJztcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMnO1xuIl19
|
|
@@ -161,6 +161,9 @@ describe('encryption methods tests', () => {
|
|
|
161
161
|
const v2ct = await (0, src_1.encryptV2)(password, plaintext);
|
|
162
162
|
await assert_1.default.rejects(() => (0, src_1.decryptAsync)('wrong', v2ct));
|
|
163
163
|
});
|
|
164
|
+
it('throws on invalid JSON input', async () => {
|
|
165
|
+
await assert_1.default.rejects(() => (0, src_1.decryptAsync)(password, 'not-json'), /ciphertext is not valid JSON/);
|
|
166
|
+
});
|
|
164
167
|
it('wrong password on v2 data does not fall through to v1 decrypt', async () => {
|
|
165
168
|
const v2ct = await (0, src_1.encryptV2)(password, plaintext, { memorySize: 1024, iterations: 1, parallelism: 1 });
|
|
166
169
|
let caughtError;
|
|
@@ -174,5 +177,100 @@ describe('encryption methods tests', () => {
|
|
|
174
177
|
assert_1.default.ok(!caughtError.message?.includes('sjcl'), 'error must not be from SJCL');
|
|
175
178
|
});
|
|
176
179
|
});
|
|
180
|
+
describe('EncryptionSession (HKDF caching)', () => {
|
|
181
|
+
const opts = { memorySize: 1024, iterations: 1, parallelism: 1 };
|
|
182
|
+
const password = 'test-password';
|
|
183
|
+
const plaintext = 'hello session';
|
|
184
|
+
it('session-produced envelope contains salt and hkdfSalt', async () => {
|
|
185
|
+
const session = await (0, src_1.createEncryptionSession)(password, opts);
|
|
186
|
+
const ct = await session.encrypt(plaintext);
|
|
187
|
+
session.destroy();
|
|
188
|
+
const envelope = JSON.parse(ct);
|
|
189
|
+
assert_1.default.strictEqual(envelope.v, 2);
|
|
190
|
+
assert_1.default.ok(envelope.salt, 'must have argon2 salt');
|
|
191
|
+
assert_1.default.ok(envelope.hkdfSalt, 'must have hkdf salt');
|
|
192
|
+
assert_1.default.ok(envelope.iv, 'must have iv');
|
|
193
|
+
assert_1.default.ok(envelope.ct, 'must have ciphertext');
|
|
194
|
+
});
|
|
195
|
+
it('session round-trip via session.decrypt', async () => {
|
|
196
|
+
const session = await (0, src_1.createEncryptionSession)(password, opts);
|
|
197
|
+
const ct = await session.encrypt(plaintext);
|
|
198
|
+
const result = await session.decrypt(ct);
|
|
199
|
+
session.destroy();
|
|
200
|
+
assert_1.default.strictEqual(result, plaintext);
|
|
201
|
+
});
|
|
202
|
+
it('session envelope can be decrypted standalone via decryptV2', async () => {
|
|
203
|
+
const session = await (0, src_1.createEncryptionSession)(password, opts);
|
|
204
|
+
const ct = await session.encrypt(plaintext);
|
|
205
|
+
session.destroy();
|
|
206
|
+
const result = await (0, src_1.decryptV2)(password, ct);
|
|
207
|
+
assert_1.default.strictEqual(result, plaintext);
|
|
208
|
+
});
|
|
209
|
+
it('session envelope can be decrypted via decryptAsync', async () => {
|
|
210
|
+
const session = await (0, src_1.createEncryptionSession)(password, opts);
|
|
211
|
+
const ct = await session.encrypt(plaintext);
|
|
212
|
+
session.destroy();
|
|
213
|
+
const result = await (0, src_1.decryptAsync)(password, ct);
|
|
214
|
+
assert_1.default.strictEqual(result, plaintext);
|
|
215
|
+
});
|
|
216
|
+
it('multiple encrypts produce different hkdfSalt values', async () => {
|
|
217
|
+
const session = await (0, src_1.createEncryptionSession)(password, opts);
|
|
218
|
+
const ct1 = await session.encrypt(plaintext);
|
|
219
|
+
const ct2 = await session.encrypt(plaintext);
|
|
220
|
+
session.destroy();
|
|
221
|
+
const e1 = JSON.parse(ct1);
|
|
222
|
+
const e2 = JSON.parse(ct2);
|
|
223
|
+
assert_1.default.notStrictEqual(e1.hkdfSalt, e2.hkdfSalt);
|
|
224
|
+
});
|
|
225
|
+
it('all session encrypts share the same argon2 salt', async () => {
|
|
226
|
+
const session = await (0, src_1.createEncryptionSession)(password, opts);
|
|
227
|
+
const ct1 = await session.encrypt(plaintext);
|
|
228
|
+
const ct2 = await session.encrypt(plaintext);
|
|
229
|
+
session.destroy();
|
|
230
|
+
const e1 = JSON.parse(ct1);
|
|
231
|
+
const e2 = JSON.parse(ct2);
|
|
232
|
+
assert_1.default.strictEqual(e1.salt, e2.salt);
|
|
233
|
+
});
|
|
234
|
+
it('wrong password rejected by decryptV2', async () => {
|
|
235
|
+
const session = await (0, src_1.createEncryptionSession)(password, opts);
|
|
236
|
+
const ct = await session.encrypt(plaintext);
|
|
237
|
+
session.destroy();
|
|
238
|
+
await assert_1.default.rejects(() => (0, src_1.decryptV2)('wrong-password', ct));
|
|
239
|
+
});
|
|
240
|
+
it('destroy prevents further encrypt calls', async () => {
|
|
241
|
+
const session = await (0, src_1.createEncryptionSession)(password, opts);
|
|
242
|
+
session.destroy();
|
|
243
|
+
await assert_1.default.rejects(() => session.encrypt(plaintext), /destroyed/);
|
|
244
|
+
});
|
|
245
|
+
it('destroy prevents further decrypt calls', async () => {
|
|
246
|
+
const session = await (0, src_1.createEncryptionSession)(password, opts);
|
|
247
|
+
const ct = await session.encrypt(plaintext);
|
|
248
|
+
session.destroy();
|
|
249
|
+
await assert_1.default.rejects(() => session.decrypt(ct), /destroyed/);
|
|
250
|
+
});
|
|
251
|
+
it('session rejects envelopes from a different session', async () => {
|
|
252
|
+
const session1 = await (0, src_1.createEncryptionSession)(password, opts);
|
|
253
|
+
const session2 = await (0, src_1.createEncryptionSession)(password, opts);
|
|
254
|
+
const ct = await session1.encrypt(plaintext);
|
|
255
|
+
await assert_1.default.rejects(() => session2.decrypt(ct), /not encrypted with this session/);
|
|
256
|
+
session1.destroy();
|
|
257
|
+
session2.destroy();
|
|
258
|
+
});
|
|
259
|
+
it('session rejects standard v2 envelopes (no hkdfSalt)', async () => {
|
|
260
|
+
const v2ct = await (0, src_1.encryptV2)(password, plaintext, opts);
|
|
261
|
+
const session = await (0, src_1.createEncryptionSession)(password, opts);
|
|
262
|
+
await assert_1.default.rejects(() => session.decrypt(v2ct), /use decryptV2/);
|
|
263
|
+
session.destroy();
|
|
264
|
+
});
|
|
265
|
+
it('Argon2id params are stored in envelope', async () => {
|
|
266
|
+
const session = await (0, src_1.createEncryptionSession)(password, { memorySize: 2048, iterations: 2, parallelism: 2 });
|
|
267
|
+
const ct = await session.encrypt(plaintext);
|
|
268
|
+
session.destroy();
|
|
269
|
+
const envelope = JSON.parse(ct);
|
|
270
|
+
assert_1.default.strictEqual(envelope.m, 2048);
|
|
271
|
+
assert_1.default.strictEqual(envelope.t, 2);
|
|
272
|
+
assert_1.default.strictEqual(envelope.p, 2);
|
|
273
|
+
});
|
|
274
|
+
});
|
|
177
275
|
});
|
|
178
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jcnlwdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdW5pdC9lbmNyeXB0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLG1DQUFxQztBQUVyQyxtQ0FBNkY7QUFFN0YsUUFBUSxDQUFDLDBCQUEwQixFQUFFLEdBQUcsRUFBRTtJQUN4QyxRQUFRLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRTtRQUN2QixFQUFFLENBQUMsZ0RBQWdELEVBQUUsR0FBRyxFQUFFO1lBQ3hELE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQztZQUM5QixNQUFNLFNBQVMsR0FBRyxlQUFlLENBQUM7WUFDbEMsTUFBTSxVQUFVLEdBQUcsSUFBQSxhQUFPLEVBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBRWhELElBQUEsZ0JBQU0sRUFBQyxVQUFVLEtBQUssU0FBUyxFQUFFLDZDQUE2QyxDQUFDLENBQUM7UUFDbEYsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsb0VBQW9FLEVBQUUsR0FBRyxFQUFFO1lBQzVFLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQztZQUM5QixNQUFNLFNBQVMsR0FBRyxlQUFlLENBQUM7WUFDbEMsTUFBTSxXQUFXLEdBQUcsSUFBQSxhQUFPLEVBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ2pELE1BQU0sV0FBVyxHQUFHLElBQUEsYUFBTyxFQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUVqRCxJQUFBLGdCQUFNLEVBQUMsV0FBVyxLQUFLLFdBQVcsRUFBRSxpQ0FBaUMsQ0FBQyxDQUFDO1FBQ3pFLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLG1EQUFtRCxFQUFFLEdBQUcsRUFBRTtZQUMzRCxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUM7WUFDOUIsTUFBTSxTQUFTLEdBQUcsZUFBZSxDQUFDO1lBQ2xDLE1BQU0sT0FBTyxHQUFHLEVBQUUs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QUNwQyxDQUFDO1lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDWCxXQUFXLEdBQUcsQ0FBVSxDQUFDO1lBQzNCLENBQUM7WUFDRCxnQkFBTSxDQUFDLEVBQUUsQ0FBQyxXQUFXLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztZQUM3QyxnQkFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLDZCQUE2QixDQUFDLENBQUM7UUFDbkYsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgcmFuZG9tQnl0ZXMgfSBmcm9tICdjcnlwdG8nO1xuXG5pbXBvcnQgeyBkZWNyeXB0LCBkZWNyeXB0QXN5bmMsIGRlY3J5cHRWMiwgZW5jcnlwdCwgZW5jcnlwdFYyLCBWMkVudmVsb3BlIH0gZnJvbSAnLi4vLi4vc3JjJztcblxuZGVzY3JpYmUoJ2VuY3J5cHRpb24gbWV0aG9kcyB0ZXN0cycsICgpID0+IHtcbiAgZGVzY3JpYmUoJ2VuY3J5cHQnLCAoKSA9PiB7XG4gICAgaXQoJ2VuY3J5cHRzIHRoZSBwbGFpbnRleHQgd2l0aCB0aGUgZ2l2ZW4gcGFzc3dvcmQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwYXNzd29yZCA9ICdteVBhc3N3b3JkJztcbiAgICAgIGNvbnN0IHBsYWludGV4dCA9ICdIZWxsbywgV29ybGQhJztcbiAgICAgIGNvbnN0IGNpcGhlcnRleHQgPSBlbmNyeXB0KHBhc3N3b3JkLCBwbGFpbnRleHQpO1xuXG4gICAgICBhc3NlcnQoY2lwaGVydGV4dCAhPT0gcGxhaW50ZXh0LCAnY2lwaGVydGV4dCBzaG91bGQgbm90IGJlIGVxdWFsIHRvIHBsYWludGV4dCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgYSBkaWZmZXJlbnQgY2lwaGVydGV4dCBmb3IgdGhlIHNhbWUgcGxhaW50ZXh0IGFuZCBwYXNzd29yZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHBhc3N3b3JkID0gJ215UGFzc3dvcmQnO1xuICAgICAgY29uc3QgcGxhaW50ZXh0ID0gJ0hlbGxvLCBXb3JsZCEnO1xuICAgICAgY29uc3QgY2lwaGVydGV4dDEgPSBlbmNyeXB0KHBhc3N3b3JkLCBwbGFpbnRleHQpO1xuICAgICAgY29uc3QgY2lwaGVydGV4dDIgPSBlbmNyeXB0KHBhc3N3b3JkLCBwbGFpbnRleHQpO1xuXG4gICAgICBhc3NlcnQoY2lwaGVydGV4dDEgIT09IGNpcGhlcnRleHQyLCAnY2lwaGVydGV4dHMgc2hvdWxkIG5vdCBiZSBlcXVhbCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Rocm93cyBhbiBlcnJvciBpZiB0aGUgc2FsdCBsZW5ndGggaXMgbm90IDggYnl0ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwYXNzd29yZCA9ICdteVBhc3N3b3JkJztcbiAgICAgIGNvbnN0IHBsYWludGV4dCA9ICdIZWxsbywgV29ybGQhJztcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7IHNhbHQ6IHJhbmRvbUJ5dGVzKDQpIH07XG5cbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gZW5jcnlwdChwYXNzd29yZCwgcGxhaW50ZXh0LCBvcHRpb25zKSwgbmV3IEVycm9yKGBzYWx0IG11c3QgYmUgOCBieXRlc2ApKTtcbiAgICB9KTtcblxuICAgIGl0KCd0aHJvd3MgYW4gZXJyb3IgaWYgdGhlIGl2IGxlbmd0aCBpcyBub3QgMTYgYnl0ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwYXNzd29yZCA9ICdteVBhc3N3b3JkJztcbiAgICAgIGNvbnN0IHBsYWludGV4dCA9ICdIZWxsbywgV29ybGQhJztcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7IGl2OiByYW5kb21CeXRlcyg0KSB9O1xuXG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGVuY3J5cHQocGFzc3dvcmQsIHBsYWludGV4dCwgb3B0aW9ucyksIG5ldyBFcnJvcihgaXYgbXVzdCBiZSAxNiBieXRlc2ApKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2RlY3J5cHQnLCAoKSA9PiB7XG4gICAgaXQoJ2RlY3J5cHRzIHRoZSBjaXBoZXJ0ZXh0IHdpdGggdGhlIGdpdmVuIHBhc3N3b3JkJywgKCkgPT4ge1xuICAgICAgY29uc3QgcGFzc3dvcmQgPSAnbXlQYXNzd29yZCc7XG4gICAgICBjb25zdCBwbGFpbnRleHQgPSAnSGVsbG8sIFdvcmxkISc7XG4gICAgICBjb25zdCBjaXBoZXJ0ZXh0ID0gZW5jcnlwdChwYXNzd29yZCwgcGxhaW50ZXh0KTtcbiAgICAgIGNvbnN0IGRlY3J5cHRlZCA9IGRlY3J5cHQocGFzc3dvcmQsIGNpcGhlcnRleHQpO1xuXG4gICAgICBhc3NlcnQoZGVjcnlwdGVkID09PSBwbGFpbnRleHQsICdkZWNyeXB0ZWQgc2hvdWxkIGJlIGVxdWFsIHRvIHBsYWludGV4dCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Rocm93cyBhbiBlcnJvciBpZiB0aGUgcGFzc3dvcmQgaXMgd3JvbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwYXNzd29yZCA9ICdteVBhc3N3b3JkJztcbiAgICAgIGNvbnN0IHBsYWludGV4dCA9ICdIZWxsbywgV29ybGQhJztcbiAgICAgIGNvbnN0IGNpcGhlcnRleHQgPSBlbmNyeXB0KHBhc3N3b3JkLCBwbGFpbnRleHQpO1xuICAgICAgY29uc3Qgd3JvbmdQYXNzd29yZCA9ICd3cm9uZ1Bhc3N3b3JkJztcblxuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBkZWNyeXB0KHdyb25nUGFzc3dvcmQsIGNpcGhlcnRleHQpLCAnc2pjbCBleGNlcHRpb246IGNjOiBpbnZhbGlkIGFlcyBrZXknKTtcbiAgICB9KTtcblxuICAgIGl0KCdkZWNyeXB0cyB0aGUgY2lwaGVydGV4dCB3aXRoIHRoZSBnaXZlbiBwYXNzd29yZCBhbmQgYWRhdGEnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwYXNzd29yZCA9ICdteVBhc3N3b3JkJztcbiAgICAgIGNvbnN0IHBsYWludGV4dCA9ICdIZWxsbywgV29ybGQhJztcbiAgICAgIGNvbnN0IGFkYXRhID0gJ2FkZGl0aW9uYWwgZGF0YSc7XG4gICAgICBjb25zdCBjaXBoZXJ0ZXh0ID0gZW5jcnlwdChwYXNzd29yZCwgcGxhaW50ZXh0LCB7IGFkYXRhIH0pO1xuICAgICAgY29uc3QgZGVjcnlwdGVkID0gZGVjcnlwdChwYXNzd29yZCwgY2lwaGVydGV4dCk7XG5cbiAgICAgIGFzc2VydChkZWNyeXB0ZWQgPT09IHBsYWludGV4dCwgJ2RlY3J5cHRlZCBzaG91bGQgYmUgZXF1YWwgdG8gcGxhaW50ZXh0Jyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd2MiBlbmNyeXB0L2RlY3J5cHQgKEFyZ29uMmlkICsgQUVTLTI1Ni1HQ00pJywgKCkgPT4ge1xuICAgIGNvbnN0IHBhc3N3b3JkID0gJ215UGFzc3dvcmQnO1xuICAgIGNvbnN0IHBsYWludGV4dCA9ICdIZWxsbywgV29ybGQhJztcblxuICAgIGl0KCdlbmNyeXB0cyBhbmQgZGVjcnlwdHMgcm91bmQtdHJpcCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGNpcGhlcnRleHQgPSBhd2FpdCBlbmNyeXB0VjIocGFzc3dvcmQsIHBsYWludGV4dCk7XG4gICAgICBjb25zdCBkZWNyeXB0ZWQgPSBhd2FpdCBkZWNyeXB0VjIocGFzc3dvcmQsIGNpcGhlcnRleHQpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGRlY3J5cHRlZCwgcGxhaW50ZXh0KTtcbiAgICB9KTtcblxuICAgIGl0KCdwcm9kdWNlcyBhIHZhbGlkIHYyIGVudmVsb3BlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY2lwaGVydGV4dCA9IGF3YWl0IGVuY3J5cHRWMihwYXNzd29yZCwgcGxhaW50ZXh0KTtcbiAgICAgIGNvbnN0IGVudmVsb3BlOiBWMkVudmVsb3BlID0gSlNPTi5wYXJzZShjaXBoZXJ0ZXh0KTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChlbnZlbG9wZS52LCAyKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChlbnZlbG9wZS5tLCA2NTUzNik7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZW52ZWxvcGUudCwgMyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZW52ZWxvcGUucCwgNCk7XG4gICAgICBhc3NlcnQub2soZW52ZWxvcGUuc2FsdCwgJ2VudmVsb3BlIG11c3QgaGF2ZSBzYWx0Jyk7XG4gICAgICBhc3NlcnQub2soZW52ZWxvcGUuaXYsICdlbnZlbG9wZSBtdXN0IGhhdmUgaXYnKTtcbiAgICAgIGFzc2VydC5vayhlbnZlbG9wZS5jdCwgJ2VudmVsb3BlIG11c3QgaGF2ZSBjdCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgZGlmZmVyZW50IGNpcGhlcnRleHQgZm9yIHRoZSBzYW1lIHBsYWludGV4dCBhbmQgcGFzc3dvcmQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjdDEgPSBhd2FpdCBlbmNyeXB0VjIocGFzc3dvcmQsIHBsYWludGV4dCk7XG4gICAgICBjb25zdCBjdDIgPSBhd2FpdCBlbmNyeXB0VjIocGFzc3dvcmQsIHBsYWludGV4dCk7XG4gICAgICBhc3NlcnQubm90U3RyaWN0RXF1YWwoY3QxLCBjdDIpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RlY3J5cHRzIHdpdGggY3VzdG9tIEFyZ29uMmlkIHBhcmFtZXRlcnMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjaXBoZXJ0ZXh0ID0gYXdhaXQgZW5jcnlwdFYyKHBhc3N3b3JkLCBwbGFpbnRleHQsIHtcbiAgICAgICAgbWVtb3J5U2l6ZTogMTAyNCxcbiAgICAgICAgaXRlcmF0aW9uczogMSxcbiAgICAgICAgcGFyYWxsZWxpc206IDEsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGVudmVsb3BlOiBWMkVudmVsb3BlID0gSlNPTi5wYXJzZShjaXBoZXJ0ZXh0KTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChlbnZlbG9wZS5tLCAxMDI0KTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChlbnZlbG9wZS50LCAxKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChlbnZlbG9wZS5wLCAxKTtcblxuICAgICAgY29uc3QgZGVjcnlwdGVkID0gYXdhaXQgZGVjcnlwdFYyKHBhc3N3b3JkLCBjaXBoZXJ0ZXh0KTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChkZWNyeXB0ZWQsIHBsYWludGV4dCk7XG4gICAgfSk7XG5cbiAgICBpdCgndGhyb3dzIG9uIHdyb25nIHBhc3N3b3JkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY2lwaGVydGV4dCA9IGF3YWl0IGVuY3J5cHRWMihwYXNzd29yZCwgcGxhaW50ZXh0KTtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlY3J5cHRWMignd3JvbmdQYXNzd29yZCcsIGNpcGhlcnRleHQpKTtcbiAgICB9KTtcblxuICAgIGl0KCd0aHJvd3Mgb24gaW52YWxpZCBKU09OJywgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoKCkgPT4gZGVjcnlwdFYyKHBhc3N3b3JkLCAnbm90LWpzb24nKSwgL2ludmFsaWQgSlNPTiBlbnZlbG9wZS8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Rocm93cyBvbiB3cm9uZyBlbnZlbG9wZSB2ZXJzaW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoKCkgPT4gZGVjcnlwdFYyKHBhc3N3b3JkLCBKU09OLnN0cmluZ2lmeSh7IHY6IDk5IH0pKSwgL2ludmFsaWQgZW52ZWxvcGUvKTtcbiAgICB9KTtcblxuICAgIGl0KCd0aHJvd3Mgb24gaW52YWxpZCBzYWx0IGxlbmd0aCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGVuY3J5cHRWMihwYXNzd29yZCwgcGxhaW50ZXh0LCB7IHNhbHQ6IG5ldyBVaW50OEFycmF5KDgpIH0pLCAvc2FsdCBtdXN0IGJlIDE2IGJ5dGVzLyk7XG4gICAgfSk7XG5cbiAgICBpdCgndGhyb3dzIG9uIGludmFsaWQgaXYgbGVuZ3RoJywgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoKCkgPT4gZW5jcnlwdFYyKHBhc3N3b3JkLCBwbGFpbnRleHQsIHsgaXY6IG5ldyBVaW50OEFycmF5KDgpIH0pLCAvaXYgbXVzdCBiZSAxMiBieXRlcy8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3YxIGFuZCB2MiBhcmUgaW5kZXBlbmRlbnQgKHYxIGRhdGEgZG9lcyBub3QgZGVjcnlwdCB3aXRoIHYyKScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHYxY3QgPSBlbmNyeXB0KHBhc3N3b3JkLCBwbGFpbnRleHQpO1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoKCkgPT4gZGVjcnlwdFYyKHBhc3N3b3JkLCB2MWN0KSwgL2ludmFsaWQgZW52ZWxvcGUvKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZWplY3RzIGVudmVsb3BlIHdpdGggbWVtb3J5U2l6ZSBleGNlZWRpbmcgbWF4JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZW52ZWxvcGUgPSB7IHY6IDIsIG06IDk5OTk5OTk5OSwgdDogMywgcDogNCwgc2FsdDogJ0FBQUEnLCBpdjogJ0FBQUEnLCBjdDogJ0FBQUEnIH07XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBkZWNyeXB0VjIocGFzc3dvcmQsIEpTT04uc3RyaW5naWZ5KGVudmVsb3BlKSksIC9pbnZhbGlkIGVudmVsb3BlLyk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVqZWN0cyBlbnZlbG9wZSB3aXRoIGl0ZXJhdGlvbnMgZXhjZWVkaW5nIG1heCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGVudmVsb3BlID0geyB2OiAyLCBtOiA2NTUzNiwgdDogMTAwLCBwOiA0LCBzYWx0OiAnQUFBQScsIGl2OiAnQUFBQScsIGN0OiAnQUFBQScgfTtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlY3J5cHRWMihwYXNzd29yZCwgSlNPTi5zdHJpbmdpZnkoZW52ZWxvcGUpKSwgL2ludmFsaWQgZW52ZWxvcGUvKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZWplY3RzIGVudmVsb3BlIHdpdGggcGFyYWxsZWxpc20gZXhjZWVkaW5nIG1heCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGVudmVsb3BlID0geyB2OiAyLCBtOiA2NTUzNiwgdDogMywgcDogMTAwLCBzYWx0OiAnQUFBQScsIGl2OiAnQUFBQScsIGN0OiAnQUFBQScgfTtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlY3J5cHRWMihwYXNzd29yZCwgSlNPTi5zdHJpbmdpZnkoZW52ZWxvcGUpKSwgL2ludmFsaWQgZW52ZWxvcGUvKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZWplY3RzIGVudmVsb3BlIHdpdGggemVyby12YWx1ZWQgcGFyYW1ldGVycycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGVudmVsb3BlID0geyB2OiAyLCBtOiAwLCB0OiAzLCBwOiA0LCBzYWx0OiAnQUFBQScsIGl2OiAnQUFBQScsIGN0OiAnQUFBQScgfTtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlY3J5cHRWMihwYXNzd29yZCwgSlNPTi5zdHJpbmdpZnkoZW52ZWxvcGUpKSwgL2ludmFsaWQgZW52ZWxvcGUvKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZWplY3RzIGVudmVsb3BlIHdpdGggbm9uLW51bWVyaWMgcGFyYW1ldGVyIHR5cGVzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZW52ZWxvcGUgPSB7IHY6IDIsIG06ICc2NTUzNicsIHQ6IDMsIHA6IDQsIHNhbHQ6ICdBQUFBJywgaXY6ICdBQUFBJywgY3Q6ICdBQUFBJyB9O1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoKCkgPT4gZGVjcnlwdFYyKHBhc3N3b3JkLCBKU09OLnN0cmluZ2lmeShlbnZlbG9wZSkpLCAvaW52YWxpZCBlbnZlbG9wZS8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlamVjdHMgZW52ZWxvcGUgd2l0aCBlbXB0eSBzYWx0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZW52ZWxvcGUgPSB7IHY6IDIsIG06IDY1NTM2LCB0OiAzLCBwOiA0LCBzYWx0OiAnJywgaXY6ICdBQUFBJywgY3Q6ICdBQUFBJyB9O1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoKCkgPT4gZGVjcnlwdFYyKHBhc3N3b3JkLCBKU09OLnN0cmluZ2lmeShlbnZlbG9wZSkpLCAvaW52YWxpZCBlbnZlbG9wZS8pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZGVjcnlwdEFzeW5jIChhdXRvLWRldGVjdCB2MS92MiknLCAoKSA9PiB7XG4gICAgY29uc3QgcGFzc3dvcmQgPSAnbXlQYXNzd29yZCc7XG4gICAgY29uc3QgcGxhaW50ZXh0ID0gJ0hlbGxvLCBXb3JsZCEnO1xuXG4gICAgaXQoJ2RlY3J5cHRzIHYxIGRhdGEnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB2MWN0ID0gZW5jcnlwdChwYXNzd29yZCwgcGxhaW50ZXh0KTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRlY3J5cHRBc3luYyhwYXNzd29yZCwgdjFjdCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCBwbGFpbnRleHQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RlY3J5cHRzIHYyIGRhdGEnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB2MmN0ID0gYXdhaXQgZW5jcnlwdFYyKHBhc3N3b3JkLCBwbGFpbnRleHQpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGVjcnlwdEFzeW5jKHBhc3N3b3JkLCB2MmN0KTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQsIHBsYWludGV4dCk7XG4gICAgfSk7XG5cbiAgICBpdCgndGhyb3dzIG9uIHdyb25nIHBhc3N3b3JkIGZvciB2MScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHYxY3QgPSBlbmNyeXB0KHBhc3N3b3JkLCBwbGFpbnRleHQpO1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoKCkgPT4gZGVjcnlwdEFzeW5jKCd3cm9uZycsIHYxY3QpKTtcbiAgICB9KTtcblxuICAgIGl0KCd0aHJvd3Mgb24gd3JvbmcgcGFzc3dvcmQgZm9yIHYyJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdjJjdCA9IGF3YWl0IGVuY3J5cHRWMihwYXNzd29yZCwgcGxhaW50ZXh0KTtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlY3J5cHRBc3luYygnd3JvbmcnLCB2MmN0KSk7XG4gICAgfSk7XG5cbiAgICBpdCgnd3JvbmcgcGFzc3dvcmQgb24gdjIgZGF0YSBkb2VzIG5vdCBmYWxsIHRocm91Z2ggdG8gdjEgZGVjcnlwdCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHYyY3QgPSBhd2FpdCBlbmNyeXB0VjIocGFzc3dvcmQsIHBsYWludGV4dCwgeyBtZW1vcnlTaXplOiAxMDI0LCBpdGVyYXRpb25zOiAxLCBwYXJhbGxlbGlzbTogMSB9KTtcbiAgICAgIGxldCBjYXVnaHRFcnJvcjogRXJyb3IgfCB1bmRlZmluZWQ7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBkZWNyeXB0QXN5bmMoJ3dyb25nJywgdjJjdCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhdWdodEVycm9yID0gZSBhcyBFcnJvcjtcbiAgICAgIH1cbiAgICAgIGFzc2VydC5vayhjYXVnaHRFcnJvciwgJ3Nob3VsZCBoYXZlIHRocm93bicpO1xuICAgICAgYXNzZXJ0Lm9rKCFjYXVnaHRFcnJvci5tZXNzYWdlPy5pbmNsdWRlcygnc2pjbCcpLCAnZXJyb3IgbXVzdCBub3QgYmUgZnJvbSBTSkNMJyk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
|
|
276
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jcnlwdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdW5pdC9lbmNyeXB0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLG1DQUFxQztBQUVyQyxtQ0FBc0g7QUFFdEgsUUFBUSxDQUFDLDBCQUEwQixFQUFFLEdBQUcsRUFBRTtJQUN4QyxRQUFRLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRTtRQUN2QixFQUFFLENBQUMsZ0RBQWdELEVBQUUsR0FBRyxFQUFFO1lBQ3hELE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQztZQUM5QixNQUFNLFNBQVMsR0FBRyxlQUFlLENBQUM7WUFDbEMsTUFBTSxVQUFVLEdBQUcsSUFBQSxhQUFPLEVBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBRWhELElBQUEsZ0JBQU0sRUFBQyxVQUFVLEtBQUssU0FBUyxFQUFFLDZDQUE2QyxDQUFDLENBQUM7UUFDbEYsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsb0VBQW9FLEVBQUUsR0FBRyxFQUFFO1lBQzVFLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQztZQUM5QixNQUFNLFNBQVMsR0FBRyxlQUFlLENBQUM7WUFDbEMsTUFBTSxXQUFXLEdBQUcsSUFBQSxhQUFPLEVBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ2pELE1BQU0sV0FBVyxHQUFHLElBQUEsYUFBTyxFQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUVqRCxJQUFBLGdCQUFNLEVBQUMsV0FBVyxLQUFLLFdBQVcsRUFBRSxpQ0FBaUMsQ0FBQyxDQUFDO1FBQ3pFLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLG1EQUFtRCxFQUFFLEdBQUcsRUFBRTtZQUMzRCxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUM7WUFDOUIsTUFBTSxTQUFTLEdBQUcsZUFBZSxDQUFDO1lBQ2xDLE1BQU0sT0FBTyxHQUFHLEVBQUUs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bnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgcmFuZG9tQnl0ZXMgfSBmcm9tICdjcnlwdG8nO1xuXG5pbXBvcnQgeyBkZWNyeXB0LCBkZWNyeXB0QXN5bmMsIGRlY3J5cHRWMiwgZW5jcnlwdCwgZW5jcnlwdFYyLCBWMkVudmVsb3BlLCBjcmVhdGVFbmNyeXB0aW9uU2Vzc2lvbiB9IGZyb20gJy4uLy4uL3NyYyc7XG5cbmRlc2NyaWJlKCdlbmNyeXB0aW9uIG1ldGhvZHMgdGVzdHMnLCAoKSA9PiB7XG4gIGRlc2NyaWJlKCdlbmNyeXB0JywgKCkgPT4ge1xuICAgIGl0KCdlbmNyeXB0cyB0aGUgcGxhaW50ZXh0IHdpdGggdGhlIGdpdmVuIHBhc3N3b3JkJywgKCkgPT4ge1xuICAgICAgY29uc3QgcGFzc3dvcmQgPSAnbXlQYXNzd29yZCc7XG4gICAgICBjb25zdCBwbGFpbnRleHQgPSAnSGVsbG8sIFdvcmxkISc7XG4gICAgICBjb25zdCBjaXBoZXJ0ZXh0ID0gZW5jcnlwdChwYXNzd29yZCwgcGxhaW50ZXh0KTtcblxuICAgICAgYXNzZXJ0KGNpcGhlcnRleHQgIT09IHBsYWludGV4dCwgJ2NpcGhlcnRleHQgc2hvdWxkIG5vdCBiZSBlcXVhbCB0byBwbGFpbnRleHQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZXR1cm5zIGEgZGlmZmVyZW50IGNpcGhlcnRleHQgZm9yIHRoZSBzYW1lIHBsYWludGV4dCBhbmQgcGFzc3dvcmQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwYXNzd29yZCA9ICdteVBhc3N3b3JkJztcbiAgICAgIGNvbnN0IHBsYWludGV4dCA9ICdIZWxsbywgV29ybGQhJztcbiAgICAgIGNvbnN0IGNpcGhlcnRleHQxID0gZW5jcnlwdChwYXNzd29yZCwgcGxhaW50ZXh0KTtcbiAgICAgIGNvbnN0IGNpcGhlcnRleHQyID0gZW5jcnlwdChwYXNzd29yZCwgcGxhaW50ZXh0KTtcblxuICAgICAgYXNzZXJ0KGNpcGhlcnRleHQxICE9PSBjaXBoZXJ0ZXh0MiwgJ2NpcGhlcnRleHRzIHNob3VsZCBub3QgYmUgZXF1YWwnKTtcbiAgICB9KTtcblxuICAgIGl0KCd0aHJvd3MgYW4gZXJyb3IgaWYgdGhlIHNhbHQgbGVuZ3RoIGlzIG5vdCA4IGJ5dGVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgcGFzc3dvcmQgPSAnbXlQYXNzd29yZCc7XG4gICAgICBjb25zdCBwbGFpbnRleHQgPSAnSGVsbG8sIFdvcmxkISc7XG4gICAgICBjb25zdCBvcHRpb25zID0geyBzYWx0OiByYW5kb21CeXRlcyg0KSB9O1xuXG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGVuY3J5cHQocGFzc3dvcmQsIHBsYWludGV4dCwgb3B0aW9ucyksIG5ldyBFcnJvcihgc2FsdCBtdXN0IGJlIDggYnl0ZXNgKSk7XG4gICAgfSk7XG5cbiAgICBpdCgndGhyb3dzIGFuIGVycm9yIGlmIHRoZSBpdiBsZW5ndGggaXMgbm90IDE2IGJ5dGVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgcGFzc3dvcmQgPSAnbXlQYXNzd29yZCc7XG4gICAgICBjb25zdCBwbGFpbnRleHQgPSAnSGVsbG8sIFdvcmxkISc7XG4gICAgICBjb25zdCBvcHRpb25zID0geyBpdjogcmFuZG9tQnl0ZXMoNCkgfTtcblxuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBlbmNyeXB0KHBhc3N3b3JkLCBwbGFpbnRleHQsIG9wdGlvbnMpLCBuZXcgRXJyb3IoYGl2IG11c3QgYmUgMTYgYnl0ZXNgKSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdkZWNyeXB0JywgKCkgPT4ge1xuICAgIGl0KCdkZWNyeXB0cyB0aGUgY2lwaGVydGV4dCB3aXRoIHRoZSBnaXZlbiBwYXNzd29yZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHBhc3N3b3JkID0gJ215UGFzc3dvcmQnO1xuICAgICAgY29uc3QgcGxhaW50ZXh0ID0gJ0hlbGxvLCBXb3JsZCEnO1xuICAgICAgY29uc3QgY2lwaGVydGV4dCA9IGVuY3J5cHQocGFzc3dvcmQsIHBsYWludGV4dCk7XG4gICAgICBjb25zdCBkZWNyeXB0ZWQgPSBkZWNyeXB0KHBhc3N3b3JkLCBjaXBoZXJ0ZXh0KTtcblxuICAgICAgYXNzZXJ0KGRlY3J5cHRlZCA9PT0gcGxhaW50ZXh0LCAnZGVjcnlwdGVkIHNob3VsZCBiZSBlcXVhbCB0byBwbGFpbnRleHQnKTtcbiAgICB9KTtcblxuICAgIGl0KCd0aHJvd3MgYW4gZXJyb3IgaWYgdGhlIHBhc3N3b3JkIGlzIHdyb25nJywgKCkgPT4ge1xuICAgICAgY29uc3QgcGFzc3dvcmQgPSAnbXlQYXNzd29yZCc7XG4gICAgICBjb25zdCBwbGFpbnRleHQgPSAnSGVsbG8sIFdvcmxkISc7XG4gICAgICBjb25zdCBjaXBoZXJ0ZXh0ID0gZW5jcnlwdChwYXNzd29yZCwgcGxhaW50ZXh0KTtcbiAgICAgIGNvbnN0IHdyb25nUGFzc3dvcmQgPSAnd3JvbmdQYXNzd29yZCc7XG5cbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gZGVjcnlwdCh3cm9uZ1Bhc3N3b3JkLCBjaXBoZXJ0ZXh0KSwgJ3NqY2wgZXhjZXB0aW9uOiBjYzogaW52YWxpZCBhZXMga2V5Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnZGVjcnlwdHMgdGhlIGNpcGhlcnRleHQgd2l0aCB0aGUgZ2l2ZW4gcGFzc3dvcmQgYW5kIGFkYXRhJywgKCkgPT4ge1xuICAgICAgY29uc3QgcGFzc3dvcmQgPSAnbXlQYXNzd29yZCc7XG4gICAgICBjb25zdCBwbGFpbnRleHQgPSAnSGVsbG8sIFdvcmxkISc7XG4gICAgICBjb25zdCBhZGF0YSA9ICdhZGRpdGlvbmFsIGRhdGEnO1xuICAgICAgY29uc3QgY2lwaGVydGV4dCA9IGVuY3J5cHQocGFzc3dvcmQsIHBsYWludGV4dCwgeyBhZGF0YSB9KTtcbiAgICAgIGNvbnN0IGRlY3J5cHRlZCA9IGRlY3J5cHQocGFzc3dvcmQsIGNpcGhlcnRleHQpO1xuXG4gICAgICBhc3NlcnQoZGVjcnlwdGVkID09PSBwbGFpbnRleHQsICdkZWNyeXB0ZWQgc2hvdWxkIGJlIGVxdWFsIHRvIHBsYWludGV4dCcpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndjIgZW5jcnlwdC9kZWNyeXB0IChBcmdvbjJpZCArIEFFUy0yNTYtR0NNKScsICgpID0+IHtcbiAgICBjb25zdCBwYXNzd29yZCA9ICdteVBhc3N3b3JkJztcbiAgICBjb25zdCBwbGFpbnRleHQgPSAnSGVsbG8sIFdvcmxkISc7XG5cbiAgICBpdCgnZW5jcnlwdHMgYW5kIGRlY3J5cHRzIHJvdW5kLXRyaXAnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjaXBoZXJ0ZXh0ID0gYXdhaXQgZW5jcnlwdFYyKHBhc3N3b3JkLCBwbGFpbnRleHQpO1xuICAgICAgY29uc3QgZGVjcnlwdGVkID0gYXdhaXQgZGVjcnlwdFYyKHBhc3N3b3JkLCBjaXBoZXJ0ZXh0KTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChkZWNyeXB0ZWQsIHBsYWludGV4dCk7XG4gICAgfSk7XG5cbiAgICBpdCgncHJvZHVjZXMgYSB2YWxpZCB2MiBlbnZlbG9wZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGNpcGhlcnRleHQgPSBhd2FpdCBlbmNyeXB0VjIocGFzc3dvcmQsIHBsYWludGV4dCk7XG4gICAgICBjb25zdCBlbnZlbG9wZTogVjJFbnZlbG9wZSA9IEpTT04ucGFyc2UoY2lwaGVydGV4dCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZW52ZWxvcGUudiwgMik7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZW52ZWxvcGUubSwgNjU1MzYpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGVudmVsb3BlLnQsIDMpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGVudmVsb3BlLnAsIDQpO1xuICAgICAgYXNzZXJ0Lm9rKGVudmVsb3BlLnNhbHQsICdlbnZlbG9wZSBtdXN0IGhhdmUgc2FsdCcpO1xuICAgICAgYXNzZXJ0Lm9rKGVudmVsb3BlLml2LCAnZW52ZWxvcGUgbXVzdCBoYXZlIGl2Jyk7XG4gICAgICBhc3NlcnQub2soZW52ZWxvcGUuY3QsICdlbnZlbG9wZSBtdXN0IGhhdmUgY3QnKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZXR1cm5zIGRpZmZlcmVudCBjaXBoZXJ0ZXh0IGZvciB0aGUgc2FtZSBwbGFpbnRleHQgYW5kIHBhc3N3b3JkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY3QxID0gYXdhaXQgZW5jcnlwdFYyKHBhc3N3b3JkLCBwbGFpbnRleHQpO1xuICAgICAgY29uc3QgY3QyID0gYXdhaXQgZW5jcnlwdFYyKHBhc3N3b3JkLCBwbGFpbnRleHQpO1xuICAgICAgYXNzZXJ0Lm5vdFN0cmljdEVxdWFsKGN0MSwgY3QyKTtcbiAgICB9KTtcblxuICAgIGl0KCdkZWNyeXB0cyB3aXRoIGN1c3RvbSBBcmdvbjJpZCBwYXJhbWV0ZXJzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY2lwaGVydGV4dCA9IGF3YWl0IGVuY3J5cHRWMihwYXNzd29yZCwgcGxhaW50ZXh0LCB7XG4gICAgICAgIG1lbW9yeVNpemU6IDEwMjQsXG4gICAgICAgIGl0ZXJhdGlvbnM6IDEsXG4gICAgICAgIHBhcmFsbGVsaXNtOiAxLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBlbnZlbG9wZTogVjJFbnZlbG9wZSA9IEpTT04ucGFyc2UoY2lwaGVydGV4dCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZW52ZWxvcGUubSwgMTAyNCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZW52ZWxvcGUudCwgMSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZW52ZWxvcGUucCwgMSk7XG5cbiAgICAgIGNvbnN0IGRlY3J5cHRlZCA9IGF3YWl0IGRlY3J5cHRWMihwYXNzd29yZCwgY2lwaGVydGV4dCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZGVjcnlwdGVkLCBwbGFpbnRleHQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Rocm93cyBvbiB3cm9uZyBwYXNzd29yZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGNpcGhlcnRleHQgPSBhd2FpdCBlbmNyeXB0VjIocGFzc3dvcmQsIHBsYWludGV4dCk7XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBkZWNyeXB0VjIoJ3dyb25nUGFzc3dvcmQnLCBjaXBoZXJ0ZXh0KSk7XG4gICAgfSk7XG5cbiAgICBpdCgndGhyb3dzIG9uIGludmFsaWQgSlNPTicsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlY3J5cHRWMihwYXNzd29yZCwgJ25vdC1qc29uJyksIC9pbnZhbGlkIEpTT04gZW52ZWxvcGUvKTtcbiAgICB9KTtcblxuICAgIGl0KCd0aHJvd3Mgb24gd3JvbmcgZW52ZWxvcGUgdmVyc2lvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlY3J5cHRWMihwYXNzd29yZCwgSlNPTi5zdHJpbmdpZnkoeyB2OiA5OSB9KSksIC9pbnZhbGlkIGVudmVsb3BlLyk7XG4gICAgfSk7XG5cbiAgICBpdCgndGhyb3dzIG9uIGludmFsaWQgc2FsdCBsZW5ndGgnLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBlbmNyeXB0VjIocGFzc3dvcmQsIHBsYWludGV4dCwgeyBzYWx0OiBuZXcgVWludDhBcnJheSg4KSB9KSwgL3NhbHQgbXVzdCBiZSAxNiBieXRlcy8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Rocm93cyBvbiBpbnZhbGlkIGl2IGxlbmd0aCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGVuY3J5cHRWMihwYXNzd29yZCwgcGxhaW50ZXh0LCB7IGl2OiBuZXcgVWludDhBcnJheSg4KSB9KSwgL2l2IG11c3QgYmUgMTIgYnl0ZXMvKTtcbiAgICB9KTtcblxuICAgIGl0KCd2MSBhbmQgdjIgYXJlIGluZGVwZW5kZW50ICh2MSBkYXRhIGRvZXMgbm90IGRlY3J5cHQgd2l0aCB2MiknLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB2MWN0ID0gZW5jcnlwdChwYXNzd29yZCwgcGxhaW50ZXh0KTtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlY3J5cHRWMihwYXNzd29yZCwgdjFjdCksIC9pbnZhbGlkIGVudmVsb3BlLyk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVqZWN0cyBlbnZlbG9wZSB3aXRoIG1lbW9yeVNpemUgZXhjZWVkaW5nIG1heCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGVudmVsb3BlID0geyB2OiAyLCBtOiA5OTk5OTk5OTksIHQ6IDMsIHA6IDQsIHNhbHQ6ICdBQUFBJywgaXY6ICdBQUFBJywgY3Q6ICdBQUFBJyB9O1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoKCkgPT4gZGVjcnlwdFYyKHBhc3N3b3JkLCBKU09OLnN0cmluZ2lmeShlbnZlbG9wZSkpLCAvaW52YWxpZCBlbnZlbG9wZS8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlamVjdHMgZW52ZWxvcGUgd2l0aCBpdGVyYXRpb25zIGV4Y2VlZGluZyBtYXgnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBlbnZlbG9wZSA9IHsgdjogMiwgbTogNjU1MzYsIHQ6IDEwMCwgcDogNCwgc2FsdDogJ0FBQUEnLCBpdjogJ0FBQUEnLCBjdDogJ0FBQUEnIH07XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBkZWNyeXB0VjIocGFzc3dvcmQsIEpTT04uc3RyaW5naWZ5KGVudmVsb3BlKSksIC9pbnZhbGlkIGVudmVsb3BlLyk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVqZWN0cyBlbnZlbG9wZSB3aXRoIHBhcmFsbGVsaXNtIGV4Y2VlZGluZyBtYXgnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBlbnZlbG9wZSA9IHsgdjogMiwgbTogNjU1MzYsIHQ6IDMsIHA6IDEwMCwgc2FsdDogJ0FBQUEnLCBpdjogJ0FBQUEnLCBjdDogJ0FBQUEnIH07XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBkZWNyeXB0VjIocGFzc3dvcmQsIEpTT04uc3RyaW5naWZ5KGVudmVsb3BlKSksIC9pbnZhbGlkIGVudmVsb3BlLyk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVqZWN0cyBlbnZlbG9wZSB3aXRoIHplcm8tdmFsdWVkIHBhcmFtZXRlcnMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBlbnZlbG9wZSA9IHsgdjogMiwgbTogMCwgdDogMywgcDogNCwgc2FsdDogJ0FBQUEnLCBpdjogJ0FBQUEnLCBjdDogJ0FBQUEnIH07XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBkZWNyeXB0VjIocGFzc3dvcmQsIEpTT04uc3RyaW5naWZ5KGVudmVsb3BlKSksIC9pbnZhbGlkIGVudmVsb3BlLyk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVqZWN0cyBlbnZlbG9wZSB3aXRoIG5vbi1udW1lcmljIHBhcmFtZXRlciB0eXBlcycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGVudmVsb3BlID0geyB2OiAyLCBtOiAnNjU1MzYnLCB0OiAzLCBwOiA0LCBzYWx0OiAnQUFBQScsIGl2OiAnQUFBQScsIGN0OiAnQUFBQScgfTtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlY3J5cHRWMihwYXNzd29yZCwgSlNPTi5zdHJpbmdpZnkoZW52ZWxvcGUpKSwgL2ludmFsaWQgZW52ZWxvcGUvKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZWplY3RzIGVudmVsb3BlIHdpdGggZW1wdHkgc2FsdCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGVudmVsb3BlID0geyB2OiAyLCBtOiA2NTUzNiwgdDogMywgcDogNCwgc2FsdDogJycsIGl2OiAnQUFBQScsIGN0OiAnQUFBQScgfTtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlY3J5cHRWMihwYXNzd29yZCwgSlNPTi5zdHJpbmdpZnkoZW52ZWxvcGUpKSwgL2ludmFsaWQgZW52ZWxvcGUvKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2RlY3J5cHRBc3luYyAoYXV0by1kZXRlY3QgdjEvdjIpJywgKCkgPT4ge1xuICAgIGNvbnN0IHBhc3N3b3JkID0gJ215UGFzc3dvcmQnO1xuICAgIGNvbnN0IHBsYWludGV4dCA9ICdIZWxsbywgV29ybGQhJztcblxuICAgIGl0KCdkZWNyeXB0cyB2MSBkYXRhJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdjFjdCA9IGVuY3J5cHQocGFzc3dvcmQsIHBsYWludGV4dCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkZWNyeXB0QXN5bmMocGFzc3dvcmQsIHYxY3QpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgcGxhaW50ZXh0KTtcbiAgICB9KTtcblxuICAgIGl0KCdkZWNyeXB0cyB2MiBkYXRhJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdjJjdCA9IGF3YWl0IGVuY3J5cHRWMihwYXNzd29yZCwgcGxhaW50ZXh0KTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRlY3J5cHRBc3luYyhwYXNzd29yZCwgdjJjdCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCBwbGFpbnRleHQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Rocm93cyBvbiB3cm9uZyBwYXNzd29yZCBmb3IgdjEnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB2MWN0ID0gZW5jcnlwdChwYXNzd29yZCwgcGxhaW50ZXh0KTtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlY3J5cHRBc3luYygnd3JvbmcnLCB2MWN0KSk7XG4gICAgfSk7XG5cbiAgICBpdCgndGhyb3dzIG9uIHdyb25nIHBhc3N3b3JkIGZvciB2MicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHYyY3QgPSBhd2FpdCBlbmNyeXB0VjIocGFzc3dvcmQsIHBsYWludGV4dCk7XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBkZWNyeXB0QXN5bmMoJ3dyb25nJywgdjJjdCkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Rocm93cyBvbiBpbnZhbGlkIEpTT04gaW5wdXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBkZWNyeXB0QXN5bmMocGFzc3dvcmQsICdub3QtanNvbicpLCAvY2lwaGVydGV4dCBpcyBub3QgdmFsaWQgSlNPTi8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3dyb25nIHBhc3N3b3JkIG9uIHYyIGRhdGEgZG9lcyBub3QgZmFsbCB0aHJvdWdoIHRvIHYxIGRlY3J5cHQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB2MmN0ID0gYXdhaXQgZW5jcnlwdFYyKHBhc3N3b3JkLCBwbGFpbnRleHQsIHsgbWVtb3J5U2l6ZTogMTAyNCwgaXRlcmF0aW9uczogMSwgcGFyYWxsZWxpc206IDEgfSk7XG4gICAgICBsZXQgY2F1Z2h0RXJyb3I6IEVycm9yIHwgdW5kZWZpbmVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZGVjcnlwdEFzeW5jKCd3cm9uZycsIHYyY3QpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYXVnaHRFcnJvciA9IGUgYXMgRXJyb3I7XG4gICAgICB9XG4gICAgICBhc3NlcnQub2soY2F1Z2h0RXJyb3IsICdzaG91bGQgaGF2ZSB0aHJvd24nKTtcbiAgICAgIGFzc2VydC5vayghY2F1Z2h0RXJyb3IubWVzc2FnZT8uaW5jbHVkZXMoJ3NqY2wnKSwgJ2Vycm9yIG11c3Qgbm90IGJlIGZyb20gU0pDTCcpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnRW5jcnlwdGlvblNlc3Npb24gKEhLREYgY2FjaGluZyknLCAoKSA9PiB7XG4gICAgY29uc3Qgb3B0cyA9IHsgbWVtb3J5U2l6ZTogMTAyNCwgaXRlcmF0aW9uczogMSwgcGFyYWxsZWxpc206IDEgfTtcbiAgICBjb25zdCBwYXNzd29yZCA9ICd0ZXN0LXBhc3N3b3JkJztcbiAgICBjb25zdCBwbGFpbnRleHQgPSAnaGVsbG8gc2Vzc2lvbic7XG5cbiAgICBpdCgnc2Vzc2lvbi1wcm9kdWNlZCBlbnZlbG9wZSBjb250YWlucyBzYWx0IGFuZCBoa2RmU2FsdCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHNlc3Npb24gPSBhd2FpdCBjcmVhdGVFbmNyeXB0aW9uU2Vzc2lvbihwYXNzd29yZCwgb3B0cyk7XG4gICAgICBjb25zdCBjdCA9IGF3YWl0IHNlc3Npb24uZW5jcnlwdChwbGFpbnRleHQpO1xuICAgICAgc2Vzc2lvbi5kZXN0cm95KCk7XG5cbiAgICAgIGNvbnN0IGVudmVsb3BlOiBWMkVudmVsb3BlID0gSlNPTi5wYXJzZShjdCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZW52ZWxvcGUudiwgMik7XG4gICAgICBhc3NlcnQub2soZW52ZWxvcGUuc2FsdCwgJ211c3QgaGF2ZSBhcmdvbjIgc2FsdCcpO1xuICAgICAgYXNzZXJ0Lm9rKGVudmVsb3BlLmhrZGZTYWx0LCAnbXVzdCBoYXZlIGhrZGYgc2FsdCcpO1xuICAgICAgYXNzZXJ0Lm9rKGVudmVsb3BlLml2LCAnbXVzdCBoYXZlIGl2Jyk7XG4gICAgICBhc3NlcnQub2soZW52ZWxvcGUuY3QsICdtdXN0IGhhdmUgY2lwaGVydGV4dCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nlc3Npb24gcm91bmQtdHJpcCB2aWEgc2Vzc2lvbi5kZWNyeXB0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IGNyZWF0ZUVuY3J5cHRpb25TZXNzaW9uKHBhc3N3b3JkLCBvcHRzKTtcbiAgICAgIGNvbnN0IGN0ID0gYXdhaXQgc2Vzc2lvbi5lbmNyeXB0KHBsYWludGV4dCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzZXNzaW9uLmRlY3J5cHQoY3QpO1xuICAgICAgc2Vzc2lvbi5kZXN0cm95KCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCBwbGFpbnRleHQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nlc3Npb24gZW52ZWxvcGUgY2FuIGJlIGRlY3J5cHRlZCBzdGFuZGFsb25lIHZpYSBkZWNyeXB0VjInLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzZXNzaW9uID0gYXdhaXQgY3JlYXRlRW5jcnlwdGlvblNlc3Npb24ocGFzc3dvcmQsIG9wdHMpO1xuICAgICAgY29uc3QgY3QgPSBhd2FpdCBzZXNzaW9uLmVuY3J5cHQocGxhaW50ZXh0KTtcbiAgICAgIHNlc3Npb24uZGVzdHJveSgpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGVjcnlwdFYyKHBhc3N3b3JkLCBjdCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCBwbGFpbnRleHQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nlc3Npb24gZW52ZWxvcGUgY2FuIGJlIGRlY3J5cHRlZCB2aWEgZGVjcnlwdEFzeW5jJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IGNyZWF0ZUVuY3J5cHRpb25TZXNzaW9uKHBhc3N3b3JkLCBvcHRzKTtcbiAgICAgIGNvbnN0IGN0ID0gYXdhaXQgc2Vzc2lvbi5lbmNyeXB0KHBsYWludGV4dCk7XG4gICAgICBzZXNzaW9uLmRlc3Ryb3koKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRlY3J5cHRBc3luYyhwYXNzd29yZCwgY3QpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgcGxhaW50ZXh0KTtcbiAgICB9KTtcblxuICAgIGl0KCdtdWx0aXBsZSBlbmNyeXB0cyBwcm9kdWNlIGRpZmZlcmVudCBoa2RmU2FsdCB2YWx1ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzZXNzaW9uID0gYXdhaXQgY3JlYXRlRW5jcnlwdGlvblNlc3Npb24ocGFzc3dvcmQsIG9wdHMpO1xuICAgICAgY29uc3QgY3QxID0gYXdhaXQgc2Vzc2lvbi5lbmNyeXB0KHBsYWludGV4dCk7XG4gICAgICBjb25zdCBjdDIgPSBhd2FpdCBzZXNzaW9uLmVuY3J5cHQocGxhaW50ZXh0KTtcbiAgICAgIHNlc3Npb24uZGVzdHJveSgpO1xuICAgICAgY29uc3QgZTE6IFYyRW52ZWxvcGUgPSBKU09OLnBhcnNlKGN0MSk7XG4gICAgICBjb25zdCBlMjogVjJFbnZlbG9wZSA9IEpTT04ucGFyc2UoY3QyKTtcbiAgICAgIGFzc2VydC5ub3RTdHJpY3RFcXVhbChlMS5oa2RmU2FsdCwgZTIuaGtkZlNhbHQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2FsbCBzZXNzaW9uIGVuY3J5cHRzIHNoYXJlIHRoZSBzYW1lIGFyZ29uMiBzYWx0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IGNyZWF0ZUVuY3J5cHRpb25TZXNzaW9uKHBhc3N3b3JkLCBvcHRzKTtcbiAgICAgIGNvbnN0IGN0MSA9IGF3YWl0IHNlc3Npb24uZW5jcnlwdChwbGFpbnRleHQpO1xuICAgICAgY29uc3QgY3QyID0gYXdhaXQgc2Vzc2lvbi5lbmNyeXB0KHBsYWludGV4dCk7XG4gICAgICBzZXNzaW9uLmRlc3Ryb3koKTtcbiAgICAgIGNvbnN0IGUxOiBWMkVudmVsb3BlID0gSlNPTi5wYXJzZShjdDEpO1xuICAgICAgY29uc3QgZTI6IFYyRW52ZWxvcGUgPSBKU09OLnBhcnNlKGN0Mik7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZTEuc2FsdCwgZTIuc2FsdCk7XG4gICAgfSk7XG5cbiAgICBpdCgnd3JvbmcgcGFzc3dvcmQgcmVqZWN0ZWQgYnkgZGVjcnlwdFYyJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IGNyZWF0ZUVuY3J5cHRpb25TZXNzaW9uKHBhc3N3b3JkLCBvcHRzKTtcbiAgICAgIGNvbnN0IGN0ID0gYXdhaXQgc2Vzc2lvbi5lbmNyeXB0KHBsYWludGV4dCk7XG4gICAgICBzZXNzaW9uLmRlc3Ryb3koKTtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlY3J5cHRWMignd3JvbmctcGFzc3dvcmQnLCBjdCkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Rlc3Ryb3kgcHJldmVudHMgZnVydGhlciBlbmNyeXB0IGNhbGxzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IGNyZWF0ZUVuY3J5cHRpb25TZXNzaW9uKHBhc3N3b3JkLCBvcHRzKTtcbiAgICAgIHNlc3Npb24uZGVzdHJveSgpO1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoKCkgPT4gc2Vzc2lvbi5lbmNyeXB0KHBsYWludGV4dCksIC9kZXN0cm95ZWQvKTtcbiAgICB9KTtcblxuICAgIGl0KCdkZXN0cm95IHByZXZlbnRzIGZ1cnRoZXIgZGVjcnlwdCBjYWxscycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHNlc3Npb24gPSBhd2FpdCBjcmVhdGVFbmNyeXB0aW9uU2Vzc2lvbihwYXNzd29yZCwgb3B0cyk7XG4gICAgICBjb25zdCBjdCA9IGF3YWl0IHNlc3Npb24uZW5jcnlwdChwbGFpbnRleHQpO1xuICAgICAgc2Vzc2lvbi5kZXN0cm95KCk7XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBzZXNzaW9uLmRlY3J5cHQoY3QpLCAvZGVzdHJveWVkLyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2Vzc2lvbiByZWplY3RzIGVudmVsb3BlcyBmcm9tIGEgZGlmZmVyZW50IHNlc3Npb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzZXNzaW9uMSA9IGF3YWl0IGNyZWF0ZUVuY3J5cHRpb25TZXNzaW9uKHBhc3N3b3JkLCBvcHRzKTtcbiAgICAgIGNvbnN0IHNlc3Npb24yID0gYXdhaXQgY3JlYXRlRW5jcnlwdGlvblNlc3Npb24ocGFzc3dvcmQsIG9wdHMpO1xuICAgICAgY29uc3QgY3QgPSBhd2FpdCBzZXNzaW9uMS5lbmNyeXB0KHBsYWludGV4dCk7XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBzZXNzaW9uMi5kZWNyeXB0KGN0KSwgL25vdCBlbmNyeXB0ZWQgd2l0aCB0aGlzIHNlc3Npb24vKTtcbiAgICAgIHNlc3Npb24xLmRlc3Ryb3koKTtcbiAgICAgIHNlc3Npb24yLmRlc3Ryb3koKTtcbiAgICB9KTtcblxuICAgIGl0KCdzZXNzaW9uIHJlamVjdHMgc3RhbmRhcmQgdjIgZW52ZWxvcGVzIChubyBoa2RmU2FsdCknLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB2MmN0ID0gYXdhaXQgZW5jcnlwdFYyKHBhc3N3b3JkLCBwbGFpbnRleHQsIG9wdHMpO1xuICAgICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IGNyZWF0ZUVuY3J5cHRpb25TZXNzaW9uKHBhc3N3b3JkLCBvcHRzKTtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IHNlc3Npb24uZGVjcnlwdCh2MmN0KSwgL3VzZSBkZWNyeXB0VjIvKTtcbiAgICAgIHNlc3Npb24uZGVzdHJveSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ0FyZ29uMmlkIHBhcmFtcyBhcmUgc3RvcmVkIGluIGVudmVsb3BlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IGNyZWF0ZUVuY3J5cHRpb25TZXNzaW9uKHBhc3N3b3JkLCB7IG1lbW9yeVNpemU6IDIwNDgsIGl0ZXJhdGlvbnM6IDIsIHBhcmFsbGVsaXNtOiAyIH0pO1xuICAgICAgY29uc3QgY3QgPSBhd2FpdCBzZXNzaW9uLmVuY3J5cHQocGxhaW50ZXh0KTtcbiAgICAgIHNlc3Npb24uZGVzdHJveSgpO1xuICAgICAgY29uc3QgZW52ZWxvcGU6IFYyRW52ZWxvcGUgPSBKU09OLnBhcnNlKGN0KTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChlbnZlbG9wZS5tLCAyMDQ4KTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChlbnZlbG9wZS50LCAyKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChlbnZlbG9wZS5wLCAyKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|