@bitgo-beta/sdk-lib-mpc 8.2.0-beta.168 → 8.2.0-beta.1680

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.
Files changed (78) hide show
  1. package/dist/src/curves/ed25519.d.ts +0 -1
  2. package/dist/src/curves/ed25519.d.ts.map +1 -1
  3. package/dist/src/curves/ed25519.js +12 -12
  4. package/dist/src/curves/ed25519Bip32HdTree.js +14 -14
  5. package/dist/src/curves/index.js +6 -2
  6. package/dist/src/curves/secp256k1.d.ts +0 -1
  7. package/dist/src/curves/secp256k1.d.ts.map +1 -1
  8. package/dist/src/curves/secp256k1.js +22 -38
  9. package/dist/src/curves/secp256k1Bip32HdTree.js +10 -10
  10. package/dist/src/curves/types.d.ts +2 -3
  11. package/dist/src/curves/types.d.ts.map +1 -1
  12. package/dist/src/curves/util.d.ts +2 -0
  13. package/dist/src/curves/util.d.ts.map +1 -1
  14. package/dist/src/curves/util.js +34 -3
  15. package/dist/src/hashCommitment.d.ts +0 -1
  16. package/dist/src/hashCommitment.d.ts.map +1 -1
  17. package/dist/src/hashCommitment.js +7 -8
  18. package/dist/src/index.d.ts +1 -1
  19. package/dist/src/index.d.ts.map +1 -1
  20. package/dist/src/index.js +24 -10
  21. package/dist/src/openssl/index.js +6 -2
  22. package/dist/src/openssl/openssl.d.ts +1 -2
  23. package/dist/src/openssl/openssl.d.ts.map +1 -1
  24. package/dist/src/openssl/openssl.js +4 -12
  25. package/dist/src/safePrime.d.ts +3 -0
  26. package/dist/src/safePrime.d.ts.map +1 -0
  27. package/dist/src/safePrime.js +19 -0
  28. package/dist/src/schnorrProof.d.ts +0 -1
  29. package/dist/src/schnorrProof.d.ts.map +1 -1
  30. package/dist/src/schnorrProof.js +8 -9
  31. package/dist/src/shamir/index.js +6 -2
  32. package/dist/src/shamir/shamir.js +2 -2
  33. package/dist/src/shamir/types.d.ts +1 -1
  34. package/dist/src/shamir/types.d.ts.map +1 -1
  35. package/dist/src/tss/ecdsa/index.js +23 -9
  36. package/dist/src/tss/ecdsa/paillierproof.js +10 -10
  37. package/dist/src/tss/ecdsa/rangeproof.d.ts +1 -2
  38. package/dist/src/tss/ecdsa/rangeproof.d.ts.map +1 -1
  39. package/dist/src/tss/ecdsa/rangeproof.js +108 -118
  40. package/dist/src/tss/ecdsa/types.d.ts +28 -17
  41. package/dist/src/tss/ecdsa/types.d.ts.map +1 -1
  42. package/dist/src/tss/ecdsa/types.js +29 -31
  43. package/dist/src/tss/ecdsa/zkVProof.d.ts +0 -1
  44. package/dist/src/tss/ecdsa/zkVProof.d.ts.map +1 -1
  45. package/dist/src/tss/ecdsa/zkVProof.js +9 -10
  46. package/dist/src/tss/ecdsa-dkls/commsLayer.d.ts +69 -0
  47. package/dist/src/tss/ecdsa-dkls/commsLayer.d.ts.map +1 -0
  48. package/dist/src/tss/ecdsa-dkls/commsLayer.js +261 -0
  49. package/dist/src/tss/ecdsa-dkls/dkg.d.ts +62 -0
  50. package/dist/src/tss/ecdsa-dkls/dkg.d.ts.map +1 -0
  51. package/dist/src/tss/ecdsa-dkls/dkg.js +330 -0
  52. package/dist/src/tss/ecdsa-dkls/dsg.d.ts +47 -0
  53. package/dist/src/tss/ecdsa-dkls/dsg.d.ts.map +1 -0
  54. package/dist/src/tss/ecdsa-dkls/dsg.js +271 -0
  55. package/dist/src/tss/ecdsa-dkls/index.d.ts +6 -0
  56. package/dist/src/tss/ecdsa-dkls/index.d.ts.map +1 -0
  57. package/dist/src/tss/ecdsa-dkls/index.js +42 -0
  58. package/dist/src/tss/ecdsa-dkls/types.d.ts +128 -0
  59. package/dist/src/tss/ecdsa-dkls/types.d.ts.map +1 -0
  60. package/dist/src/tss/ecdsa-dkls/types.js +175 -0
  61. package/dist/src/tss/ecdsa-dkls/util.d.ts +26 -0
  62. package/dist/src/tss/ecdsa-dkls/util.d.ts.map +1 -0
  63. package/dist/src/tss/ecdsa-dkls/util.js +276 -0
  64. package/dist/src/tss/index.d.ts +1 -0
  65. package/dist/src/tss/index.d.ts.map +1 -1
  66. package/dist/src/tss/index.js +7 -2
  67. package/dist/src/types.d.ts +0 -1
  68. package/dist/src/types.d.ts.map +1 -1
  69. package/dist/src/util.d.ts +0 -1
  70. package/dist/src/util.d.ts.map +1 -1
  71. package/dist/src/util.js +21 -22
  72. package/dist/tsconfig.tsbuildinfo +1 -1
  73. package/package.json +27 -5
  74. package/.eslintignore +0 -5
  75. package/CHANGELOG.md +0 -228
  76. package/dist/src/openssl/opensslbytes.d.ts +0 -4
  77. package/dist/src/openssl/opensslbytes.d.ts.map +0 -1
  78. package/dist/src/openssl/opensslbytes.js +0 -20
@@ -0,0 +1,330 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.Dkg = void 0;
37
+ const cbor_x_1 = require("cbor-x");
38
+ const curves_1 = require("../../curves");
39
+ const util_1 = require("../../util");
40
+ const types_1 = require("./types");
41
+ class Dkg {
42
+ constructor(n, t, partyIdx, seed, retrofitData, dklsWasm) {
43
+ this.dkgState = types_1.DkgState.Uninitialized;
44
+ this.n = n;
45
+ this.t = t;
46
+ this.partyIdx = partyIdx;
47
+ this.chainCodeCommitment = undefined;
48
+ this.retrofitData = retrofitData;
49
+ this.seed = seed;
50
+ this.dklsWasm = dklsWasm ?? null;
51
+ }
52
+ async loadDklsWasm() {
53
+ if (!this.dklsWasm) {
54
+ this.dklsWasm = await Promise.resolve().then(() => __importStar(require('@silencelaboratories/dkls-wasm-ll-node')));
55
+ }
56
+ }
57
+ getDklsWasm() {
58
+ if (!this.dklsWasm) {
59
+ throw Error('DKLS wasm not loaded');
60
+ }
61
+ return this.dklsWasm;
62
+ }
63
+ _restoreSession() {
64
+ if (!this.dkgSession) {
65
+ this.dkgSession = this.getDklsWasm().KeygenSession.fromBytes(this.dkgSessionBytes);
66
+ }
67
+ }
68
+ _createDKLsRetrofitKeyShare() {
69
+ if (this.retrofitData) {
70
+ if (!this.retrofitData.xShare.y || !this.retrofitData.xShare.chaincode || !this.retrofitData.xShare.x) {
71
+ throw Error('xShare must have a public key, private share value, and a chaincode.');
72
+ }
73
+ const xiList = [];
74
+ for (let i = 0; i < this.n; i++) {
75
+ xiList.push(Array.from((0, util_1.bigIntToBufferBE)(BigInt(i + 1), 32)));
76
+ }
77
+ const secp256k1 = new curves_1.Secp256k1Curve();
78
+ const dklsKeyShare = {
79
+ total_parties: this.n,
80
+ threshold: this.t,
81
+ rank_list: new Array(this.n).fill(0),
82
+ party_id: this.partyIdx,
83
+ public_key: Array.from(Buffer.from(this.retrofitData.xShare.y, 'hex')),
84
+ root_chain_code: Array.from(Buffer.from(this.retrofitData.xShare.chaincode, 'hex')),
85
+ final_session_id: Array(32).fill(0),
86
+ seed_ot_receivers: new Array(this.n - 1).fill(Array(32832).fill(0)),
87
+ seed_ot_senders: new Array(this.n - 1).fill(Array(32768).fill(0)),
88
+ sent_seed_list: [Array(32).fill(0)],
89
+ rec_seed_list: [Array(32).fill(0)],
90
+ s_i: Array.from(Buffer.from(this.retrofitData.xShare.x, 'hex')),
91
+ // big_s_list is now created internally during the protocol so isn't needed here, however a valid KeyShare object needs to have it.
92
+ // a dummy public key is used to fill big_s_list.
93
+ big_s_list: new Array(this.n).fill(Array.from((0, util_1.bigIntToBufferBE)(secp256k1.basePointMult(BigInt('0x' + this.retrofitData.xShare.x))))),
94
+ x_i_list: this.retrofitData.xiList ? this.retrofitData.xiList : xiList,
95
+ };
96
+ this.dklsKeyShareRetrofitObject = this.getDklsWasm().Keyshare.fromBytes((0, cbor_x_1.encode)(dklsKeyShare));
97
+ }
98
+ }
99
+ _deserializeState() {
100
+ if (!this.dkgSession) {
101
+ throw Error('Session not intialized');
102
+ }
103
+ const round = (0, cbor_x_1.decode)(this.dkgSession.toBytes()).round;
104
+ switch (round) {
105
+ case 'WaitMsg1':
106
+ this.dkgState = types_1.DkgState.Round1;
107
+ break;
108
+ case 'WaitMsg2':
109
+ this.dkgState = types_1.DkgState.Round2;
110
+ break;
111
+ case 'WaitMsg3':
112
+ this.dkgState = types_1.DkgState.Round3;
113
+ break;
114
+ case 'WaitMsg4':
115
+ // keyShareBuff present means keyshare() already ran and freed the session; bytes are frozen at WaitMsg4.
116
+ this.dkgState = this.keyShareBuff ? types_1.DkgState.Complete : types_1.DkgState.Round4;
117
+ break;
118
+ case 'Ended':
119
+ this.dkgState = types_1.DkgState.Complete;
120
+ break;
121
+ default:
122
+ this.dkgState = types_1.DkgState.InvalidState;
123
+ throw Error(`Invalid State: ${round}`);
124
+ }
125
+ }
126
+ async initDkg() {
127
+ if (!this.dklsWasm) {
128
+ await this.loadDklsWasm();
129
+ }
130
+ if (this.t > this.n || this.partyIdx >= this.n) {
131
+ throw Error('Invalid parameters for DKG');
132
+ }
133
+ if (this.dkgState != types_1.DkgState.Uninitialized) {
134
+ throw Error('DKG session already initialized');
135
+ }
136
+ if (typeof window !== 'undefined' &&
137
+ /* checks for electron processes */
138
+ !window.process &&
139
+ !window.process?.['type']) {
140
+ /* This is only needed for browsers/web because it uses fetch to resolve the wasm asset for the web */
141
+ const initDkls = await Promise.resolve().then(() => __importStar(require('@silencelaboratories/dkls-wasm-ll-web')));
142
+ await initDkls.default();
143
+ }
144
+ this._createDKLsRetrofitKeyShare();
145
+ if (this.seed && this.seed.length !== 32) {
146
+ throw Error(`Seed should be 32 bytes, got ${this.seed.length}.`);
147
+ }
148
+ const { KeygenSession } = this.getDklsWasm();
149
+ if (this.dklsKeyShareRetrofitObject) {
150
+ this.dkgSession = this.seed
151
+ ? KeygenSession.initKeyRotation(this.dklsKeyShareRetrofitObject, new Uint8Array(this.seed))
152
+ : KeygenSession.initKeyRotation(this.dklsKeyShareRetrofitObject);
153
+ }
154
+ else {
155
+ this.dkgSession = this.seed
156
+ ? new KeygenSession(this.n, this.t, this.partyIdx, new Uint8Array(this.seed))
157
+ : new KeygenSession(this.n, this.t, this.partyIdx);
158
+ }
159
+ try {
160
+ const payload = this.dkgSession.createFirstMessage().payload;
161
+ this.dkgSessionBytes = this.dkgSession.toBytes();
162
+ this._deserializeState();
163
+ return {
164
+ payload: payload,
165
+ from: this.partyIdx,
166
+ };
167
+ }
168
+ catch (e) {
169
+ throw Error(`Error while creating the first message from party ${this.partyIdx}: ${e}`);
170
+ }
171
+ }
172
+ getKeyShare() {
173
+ if (!this.keyShareBuff) {
174
+ throw Error('Can not get key share, DKG is not complete yet.');
175
+ }
176
+ return this.keyShareBuff;
177
+ }
178
+ /**
179
+ * Returns a CBOR-encoded ReducedKeyShare buffer containing the party's private
180
+ * scalar (s_i) in the `prv` field. This buffer is private key material.
181
+ * The caller encrypts it and stores it as `reducedEncryptedPrv` on the key card QR code.
182
+ */
183
+ getReducedKeyShare() {
184
+ if (!this.keyShareBuff) {
185
+ throw Error('Can not get key share, DKG is not complete yet.');
186
+ }
187
+ const decodedKeyshare = (0, cbor_x_1.decode)(this.keyShareBuff);
188
+ const reducedKeyShare = {
189
+ bigSList: decodedKeyshare.big_s_list,
190
+ xList: decodedKeyshare.x_i_list,
191
+ rootChainCode: decodedKeyshare.root_chain_code,
192
+ prv: decodedKeyshare.s_i,
193
+ pub: decodedKeyshare.public_key,
194
+ };
195
+ const encodedKeyShare = (0, cbor_x_1.encode)(reducedKeyShare);
196
+ return encodedKeyShare;
197
+ }
198
+ handleIncomingMessages(messagesForIthRound) {
199
+ let nextRoundMessages = [];
200
+ let nextRoundDeserializedMessages = { broadcastMessages: [], p2pMessages: [] };
201
+ this._restoreSession();
202
+ if (!this.dkgSession) {
203
+ throw Error('Session not initialized');
204
+ }
205
+ const { Message } = this.getDklsWasm();
206
+ try {
207
+ if (this.dkgState === types_1.DkgState.Round3) {
208
+ const commitmentsUnsorted = messagesForIthRound.p2pMessages
209
+ .map((m) => {
210
+ return { from: m.from, commitment: m.commitment };
211
+ })
212
+ .concat([{ from: this.partyIdx, commitment: this.chainCodeCommitment }]);
213
+ const commitmentsSorted = commitmentsUnsorted
214
+ .sort((a, b) => {
215
+ return a.from - b.from;
216
+ })
217
+ .map((c) => c.commitment);
218
+ nextRoundMessages = this.dkgSession.handleMessages(messagesForIthRound.broadcastMessages
219
+ .map((m) => new Message(m.payload, m.from, undefined))
220
+ .concat(messagesForIthRound.p2pMessages.map((m) => new Message(m.payload, m.from, m.to))), commitmentsSorted);
221
+ }
222
+ else {
223
+ nextRoundMessages = this.dkgSession.handleMessages(messagesForIthRound.broadcastMessages
224
+ .map((m) => new Message(m.payload, m.from, undefined))
225
+ .concat(messagesForIthRound.p2pMessages.map((m) => new Message(m.payload, m.from, m.to))), undefined);
226
+ }
227
+ if (this.dkgState === types_1.DkgState.Round4) {
228
+ this.dkgKeyShare = this.dkgSession.keyshare();
229
+ this.keyShareBuff = Buffer.from(this.dkgKeyShare.toBytes());
230
+ this.dkgKeyShare.free();
231
+ if (this.dklsKeyShareRetrofitObject) {
232
+ this.dklsKeyShareRetrofitObject.free();
233
+ }
234
+ this.dkgState = types_1.DkgState.Complete;
235
+ return { broadcastMessages: [], p2pMessages: [] };
236
+ }
237
+ else {
238
+ // Update round data.
239
+ this._deserializeState();
240
+ }
241
+ if (this.dkgState === types_1.DkgState.Round2) {
242
+ this.chainCodeCommitment = this.dkgSession.calculateChainCodeCommitment();
243
+ }
244
+ nextRoundDeserializedMessages = {
245
+ p2pMessages: nextRoundMessages
246
+ .filter((m) => m.to_id !== undefined)
247
+ .map((m) => {
248
+ const p2pReturn = {
249
+ payload: m.payload,
250
+ from: m.from_id,
251
+ to: m.to_id,
252
+ commitment: this.chainCodeCommitment,
253
+ };
254
+ return p2pReturn;
255
+ }),
256
+ broadcastMessages: nextRoundMessages
257
+ .filter((m) => m.to_id === undefined)
258
+ .map((m) => {
259
+ const broadcastReturn = {
260
+ payload: m.payload,
261
+ from: m.from_id,
262
+ };
263
+ return broadcastReturn;
264
+ }),
265
+ };
266
+ }
267
+ catch (e) {
268
+ throw Error(`Error while creating messages from party ${this.partyIdx}, round ${this.dkgState}: ${e}`);
269
+ }
270
+ finally {
271
+ nextRoundMessages.forEach((m) => m.free());
272
+ // Session is freed when keyshare is called.
273
+ if (this.dkgState !== types_1.DkgState.Complete) {
274
+ this.dkgSessionBytes = this.dkgSession.toBytes();
275
+ this.dkgSession = undefined;
276
+ }
277
+ }
278
+ return nextRoundDeserializedMessages;
279
+ }
280
+ /**
281
+ * Get the current session data that can be used to restore the session later
282
+ * @returns The current session data
283
+ */
284
+ getSessionData() {
285
+ const sessionData = {
286
+ dkgSessionBytes: this.dkgSessionBytes,
287
+ dkgState: this.dkgState,
288
+ };
289
+ if (this.chainCodeCommitment) {
290
+ sessionData.chainCodeCommitment = this.chainCodeCommitment;
291
+ }
292
+ if (this.keyShareBuff) {
293
+ sessionData.keyShareBuff = this.keyShareBuff;
294
+ }
295
+ return sessionData;
296
+ }
297
+ /**
298
+ * Restore a DKG session from previous session data
299
+ * Note: This should not be used for Round 1 as that's the initialization phase
300
+ * @param n Number of parties
301
+ * @param t Threshold
302
+ * @param partyIdx Party index
303
+ * @param sessionData Previous session data
304
+ * @param seed Optional seed
305
+ * @param retrofitData Optional retrofit data
306
+ * @param dklsWasm Optional DKLS wasm instance
307
+ * @returns A new DKG instance with the restored session
308
+ */
309
+ static async restoreSession(n, t, partyIdx, sessionData, seed, retrofitData, dklsWasm) {
310
+ const dkg = new Dkg(n, t, partyIdx, seed, retrofitData, dklsWasm);
311
+ if (!dkg.dklsWasm) {
312
+ await dkg.loadDklsWasm();
313
+ }
314
+ dkg.dkgSessionBytes = sessionData.dkgSessionBytes;
315
+ if (sessionData.chainCodeCommitment) {
316
+ dkg.chainCodeCommitment = sessionData.chainCodeCommitment;
317
+ }
318
+ if (sessionData.keyShareBuff) {
319
+ dkg.keyShareBuff = sessionData.keyShareBuff;
320
+ }
321
+ dkg._restoreSession();
322
+ // Re-derive state from WASM bytes rather than trusting the caller-supplied dkgState.
323
+ // This prevents a tampered or corrupted dkgState from causing handleIncomingMessages()
324
+ // to take the wrong branch (e.g. skipping chain code commitment or calling keyshare() prematurely).
325
+ dkg._deserializeState();
326
+ return dkg;
327
+ }
328
+ }
329
+ exports.Dkg = Dkg;
330
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGtnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3Rzcy9lY2RzYS1ka2xzL2RrZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSxtQ0FBd0M7QUFDeEMseUNBQThDO0FBQzlDLHFDQUE4QztBQUM5QyxtQ0FBc0g7QUFldEgsTUFBYSxHQUFHO0lBZWQsWUFDRSxDQUFTLEVBQ1QsQ0FBUyxFQUNULFFBQWdCLEVBQ2hCLElBQWEsRUFDYixZQUEyQixFQUMzQixRQUF3QjtRQVhoQixhQUFRLEdBQWEsZ0JBQVEsQ0FBQyxhQUFhLENBQUM7UUFhcEQsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDWCxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNYLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxTQUFTLENBQUM7UUFDckMsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFDakMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLElBQUksSUFBSSxDQUFDO0lBQ25DLENBQUM7SUFFTyxLQUFLLENBQUMsWUFBWTtRQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxRQUFRLEdBQUcsd0RBQWEsd0NBQXdDLEdBQUMsQ0FBQztRQUN6RSxDQUFDO0lBQ0gsQ0FBQztJQUVPLFdBQVc7UUFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuQixNQUFNLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3RDLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVPLGVBQWU7UUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNyRixDQUFDO0lBQ0gsQ0FBQztJQUVPLDJCQUEyQjtRQUNqQyxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3RHLE1BQU0sS0FBSyxDQUFDLHNFQUFzRSxDQUFDLENBQUM7WUFDdEYsQ0FBQztZQUNELE1BQU0sTUFBTSxHQUF5QixFQUFFLENBQUM7WUFDeEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDaEMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUEsdUJBQWdCLEVBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0QsQ0FBQztZQUNELE1BQU0sU0FBUyxHQUFHLElBQUksdUJBQWMsRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sWUFBWSxHQUFHO2dCQUNuQixhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ3JCLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDakIsU0FBUyxFQUFFLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUNwQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7Z0JBQ3ZCLFVBQVUsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUN0RSxlQUFlLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDbkYsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ25DLGlCQUFpQixFQUFFLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ25FLGVBQWUsRUFBRSxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNqRSxjQUFjLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNuQyxhQUFhLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNsQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDL0QsbUlBQW1JO2dCQUNuSSxpREFBaUQ7Z0JBQ2pELFVBQVUsRUFBRSxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUNoQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUEsdUJBQWdCLEVBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUNqRztnQkFDRCxRQUFRLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNO2FBQ3ZFLENBQUM7WUFDRixJQUFJLENBQUMsMEJBQTBCLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBQSxlQUFNLEVBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztRQUNoRyxDQUFDO0lBQ0gsQ0FBQztJQUVPLGlCQUFpQjtRQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3JCLE1BQU0sS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDeEMsQ0FBQztRQUNELE1BQU0sS0FBSyxHQUFHLElBQUEsZUFBTSxFQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDdEQsUUFBUSxLQUFLLEVBQUUsQ0FBQztZQUNkLEtBQUssVUFBVTtnQkFDYixJQUFJLENBQUMsUUFBUSxHQUFHLGdCQUFRLENBQUMsTUFBTSxDQUFDO2dCQUNoQyxNQUFNO1lBQ1IsS0FBSyxVQUFVO2dCQUNiLElBQUksQ0FBQyxRQUFRLEdBQUcsZ0JBQVEsQ0FBQyxNQUFNLENBQUM7Z0JBQ2hDLE1BQU07WUFDUixLQUFLLFVBQVU7Z0JBQ2IsSUFBSSxDQUFDLFFBQVEsR0FBRyxnQkFBUSxDQUFDLE1BQU0sQ0FBQztnQkFDaEMsTUFBTTtZQUNSLEtBQUssVUFBVTtnQkFDYix5R0FBeUc7Z0JBQ3pHLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsZ0JBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGdCQUFRLENBQUMsTUFBTSxDQUFDO2dCQUN4RSxNQUFNO1lBQ1IsS0FBSyxPQUFPO2dCQUNWLElBQUksQ0FBQyxRQUFRLEdBQUcsZ0JBQVEsQ0FBQyxRQUFRLENBQUM7Z0JBQ2xDLE1BQU07WUFDUjtnQkFDRSxJQUFJLENBQUMsUUFBUSxHQUFHLGdCQUFRLENBQUMsWUFBWSxDQUFDO2dCQUN0QyxNQUFNLEtBQUssQ0FBQyxrQkFBa0IsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUMzQyxDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxPQUFPO1FBQ1gsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuQixNQUFNLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUM1QixDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDL0MsTUFBTSxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztRQUM1QyxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLGdCQUFRLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDNUMsTUFBTSxLQUFLLENBQUMsaUNBQWlDLENBQUMsQ0FBQztRQUNqRCxDQUFDO1FBQ0QsSUFDRSxPQUFPLE1BQU0sS0FBSyxXQUFXO1lBQzdCLG1DQUFtQztZQUNuQyxDQUFDLE1BQU0sQ0FBQyxPQUFPO1lBQ2YsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQ3pCLENBQUM7WUFDRCxzR0FBc0c7WUFDdEcsTUFBTSxRQUFRLEdBQUcsd0RBQWEsdUNBQXVDLEdBQUMsQ0FBQztZQUN2RSxNQUFNLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMzQixDQUFDO1FBQ0QsSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUM7UUFDbkMsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQ3pDLE1BQU0sS0FBSyxDQUFDLGdDQUFnQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDbkUsQ0FBQztRQUNELE1BQU0sRUFBRSxhQUFhLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDN0MsSUFBSSxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztZQUNwQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJO2dCQUN6QixDQUFDLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUMzRixDQUFDLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsQ0FBQztRQUNyRSxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUk7Z0JBQ3pCLENBQUMsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzdFLENBQUMsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7UUFDRCxJQUFJLENBQUM7WUFDSCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGtCQUFrQixFQUFFLENBQUMsT0FBTyxDQUFDO1lBQzdELElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqRCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUN6QixPQUFPO2dCQUNMLE9BQU8sRUFBRSxPQUFPO2dCQUNoQixJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVE7YUFDcEIsQ0FBQztRQUNKLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsTUFBTSxLQUFLLENBQUMscURBQXFELElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMxRixDQUFDO0lBQ0gsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sS0FBSyxDQUFDLGlEQUFpRCxDQUFDLENBQUM7UUFDakUsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGtCQUFrQjtRQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sS0FBSyxDQUFDLGlEQUFpRCxDQUFDLENBQUM7UUFDakUsQ0FBQztRQUNELE1BQU0sZUFBZSxHQUFHLElBQUEsZUFBTSxFQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNsRCxNQUFNLGVBQWUsR0FBb0I7WUFDdkMsUUFBUSxFQUFFLGVBQWUsQ0FBQyxVQUFVO1lBQ3BDLEtBQUssRUFBRSxlQUFlLENBQUMsUUFBUTtZQUMvQixhQUFhLEVBQUUsZUFBZSxDQUFDLGVBQWU7WUFDOUMsR0FBRyxFQUFFLGVBQWUsQ0FBQyxHQUFHO1lBQ3hCLEdBQUcsRUFBRSxlQUFlLENBQUMsVUFBVTtTQUNoQyxDQUFDO1FBQ0YsTUFBTSxlQUFlLEdBQUcsSUFBQSxlQUFNLEVBQUMsZUFBZSxDQUFDLENBQUM7UUFDaEQsT0FBTyxlQUFlLENBQUM7SUFDekIsQ0FBQztJQUVELHNCQUFzQixDQUFDLG1CQUF5QztRQUM5RCxJQUFJLGlCQUFpQixHQUFjLEVBQUUsQ0FBQztRQUN0QyxJQUFJLDZCQUE2QixHQUF5QixFQUFFLGlCQUFpQixFQUFFLEVBQUUsRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLENBQUM7UUFDckcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDckIsTUFBTSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUN6QyxDQUFDO1FBQ0QsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN2QyxJQUFJLENBQUM7WUFDSCxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssZ0JBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDdEMsTUFBTSxtQkFBbUIsR0FBRyxtQkFBbUIsQ0FBQyxXQUFXO3FCQUN4RCxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtvQkFDVCxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDcEQsQ0FBQyxDQUFDO3FCQUNELE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDM0UsTUFBTSxpQkFBaUIsR0FBRyxtQkFBbUI7cUJBQzFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDYixPQUFPLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztnQkFDekIsQ0FBQyxDQUFDO3FCQUNELEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUM1QixpQkFBaUIsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FDaEQsbUJBQW1CLENBQUMsaUJBQWlCO3FCQUNsQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztxQkFDckQsTUFBTSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUMzRixpQkFBaUIsQ0FDbEIsQ0FBQztZQUNKLENBQUM7aUJBQU0sQ0FBQztnQkFDTixpQkFBaUIsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FDaEQsbUJBQW1CLENBQUMsaUJBQWlCO3FCQUNsQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztxQkFDckQsTUFBTSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUMzRixTQUFTLENBQ1YsQ0FBQztZQUNKLENBQUM7WUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssZ0JBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDdEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUM5QyxJQUFJLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO2dCQUM1RCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUN4QixJQUFJLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO29CQUNwQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3pDLENBQUM7Z0JBQ0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxnQkFBUSxDQUFDLFFBQVEsQ0FBQztnQkFDbEMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLEVBQUUsRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLENBQUM7WUFDcEQsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLHFCQUFxQjtnQkFDckIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDM0IsQ0FBQztZQUNELElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxnQkFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUN0QyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO1lBQzVFLENBQUM7WUFDRCw2QkFBNkIsR0FBRztnQkFDOUIsV0FBVyxFQUFFLGlCQUFpQjtxQkFDM0IsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FBQztxQkFDcEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7b0JBQ1QsTUFBTSxTQUFTLEdBQUc7d0JBQ2hCLE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBTzt3QkFDbEIsSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPO3dCQUNmLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBTTt3QkFDWixVQUFVLEVBQUUsSUFBSSxDQUFDLG1CQUFtQjtxQkFDckMsQ0FBQztvQkFDRixPQUFPLFNBQVMsQ0FBQztnQkFDbkIsQ0FBQyxDQUFDO2dCQUNKLGlCQUFpQixFQUFFLGlCQUFpQjtxQkFDakMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FBQztxQkFDcEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7b0JBQ1QsTUFBTSxlQUFlLEdBQUc7d0JBQ3RCLE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBTzt3QkFDbEIsSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPO3FCQUNoQixDQUFDO29CQUNGLE9BQU8sZUFBZSxDQUFDO2dCQUN6QixDQUFDLENBQUM7YUFDTCxDQUFDO1FBQ0osQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxNQUFNLEtBQUssQ0FBQyw0Q0FBNEMsSUFBSSxDQUFDLFFBQVEsV0FBVyxJQUFJLENBQUMsUUFBUSxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDekcsQ0FBQztnQkFBUyxDQUFDO1lBQ1QsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUMzQyw0Q0FBNEM7WUFDNUMsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLGdCQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ3hDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDakQsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7WUFDOUIsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLDZCQUE2QixDQUFDO0lBQ3ZDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxjQUFjO1FBQ1osTUFBTSxXQUFXLEdBQW1CO1lBQ2xDLGVBQWUsRUFBRSxJQUFJLENBQUMsZUFBZTtZQUNyQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7U0FDeEIsQ0FBQztRQUVGLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDN0IsV0FBVyxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztRQUM3RCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdEIsV0FBVyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQy9DLENBQUM7UUFFRCxPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7O09BV0c7SUFDSCxNQUFNLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FDekIsQ0FBUyxFQUNULENBQVMsRUFDVCxRQUFnQixFQUNoQixXQUEyQixFQUMzQixJQUFhLEVBQ2IsWUFBMkIsRUFDM0IsUUFBd0I7UUFFeEIsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQztRQUVsRSxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLE1BQU0sR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzNCLENBQUM7UUFFRCxHQUFHLENBQUMsZUFBZSxHQUFHLFdBQVcsQ0FBQyxlQUFlLENBQUM7UUFFbEQsSUFBSSxXQUFXLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUNwQyxHQUFHLENBQUMsbUJBQW1CLEdBQUcsV0FBVyxDQUFDLG1CQUFtQixDQUFDO1FBQzVELENBQUM7UUFFRCxJQUFJLFdBQVcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUM3QixHQUFHLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQyxZQUFZLENBQUM7UUFDOUMsQ0FBQztRQUVELEdBQUcsQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN0QixxRkFBcUY7UUFDckYsdUZBQXVGO1FBQ3ZGLG9HQUFvRztRQUNwRyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN4QixPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7Q0FDRjtBQW5WRCxrQkFtVkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEtleWdlblNlc3Npb24sIEtleXNoYXJlLCBNZXNzYWdlIH0gZnJvbSAnQHNpbGVuY2VsYWJvcmF0b3JpZXMvZGtscy13YXNtLWxsLW5vZGUnO1xuaW1wb3J0IHsgZGVjb2RlLCBlbmNvZGUgfSBmcm9tICdjYm9yLXgnO1xuaW1wb3J0IHsgU2VjcDI1NmsxQ3VydmUgfSBmcm9tICcuLi8uLi9jdXJ2ZXMnO1xuaW1wb3J0IHsgYmlnSW50VG9CdWZmZXJCRSB9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHsgRGVzZXJpYWxpemVkQnJvYWRjYXN0TWVzc2FnZSwgRGVzZXJpYWxpemVkTWVzc2FnZXMsIERrZ1N0YXRlLCBSZWR1Y2VkS2V5U2hhcmUsIFJldHJvZml0RGF0YSB9IGZyb20gJy4vdHlwZXMnO1xuXG50eXBlIE5vZGVXYXNtZXIgPSB0eXBlb2YgaW1wb3J0KCdAc2lsZW5jZWxhYm9yYXRvcmllcy9ka2xzLXdhc20tbGwtbm9kZScpO1xudHlwZSBXZWJXYXNtZXIgPSB0eXBlb2YgaW1wb3J0KCdAc2lsZW5jZWxhYm9yYXRvcmllcy9ka2xzLXdhc20tbGwtd2ViJyk7XG50eXBlIEJ1bmRsZXJXYXNtZXIgPSB0eXBlb2YgaW1wb3J0KCdAc2lsZW5jZWxhYm9yYXRvcmllcy9ka2xzLXdhc20tbGwtYnVuZGxlcicpO1xuXG50eXBlIERrbHNXYXNtID0gTm9kZVdhc21lciB8IFdlYldhc21lciB8IEJ1bmRsZXJXYXNtZXI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGtnU2Vzc2lvbkRhdGEge1xuICBka2dTZXNzaW9uQnl0ZXM6IFVpbnQ4QXJyYXk7XG4gIGRrZ1N0YXRlOiBEa2dTdGF0ZTtcbiAgY2hhaW5Db2RlQ29tbWl0bWVudD86IFVpbnQ4QXJyYXk7XG4gIGtleVNoYXJlQnVmZj86IEJ1ZmZlcjtcbn1cblxuZXhwb3J0IGNsYXNzIERrZyB7XG4gIHByb3RlY3RlZCBka2dTZXNzaW9uOiBLZXlnZW5TZXNzaW9uIHwgdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQgZGtnU2Vzc2lvbkJ5dGVzOiBVaW50OEFycmF5O1xuICBwcm90ZWN0ZWQgZGtnS2V5U2hhcmU6IEtleXNoYXJlO1xuICBwcm90ZWN0ZWQga2V5U2hhcmVCdWZmOiBCdWZmZXI7XG4gIHByb3RlY3RlZCBuOiBudW1iZXI7XG4gIHByb3RlY3RlZCB0OiBudW1iZXI7XG4gIHByb3RlY3RlZCBzZWVkOiBCdWZmZXIgfCB1bmRlZmluZWQ7XG4gIHByb3RlY3RlZCBjaGFpbkNvZGVDb21taXRtZW50OiBVaW50OEFycmF5IHwgdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQgcGFydHlJZHg6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGRrZ1N0YXRlOiBEa2dTdGF0ZSA9IERrZ1N0YXRlLlVuaW5pdGlhbGl6ZWQ7XG4gIHByb3RlY3RlZCBka2xzS2V5U2hhcmVSZXRyb2ZpdE9iamVjdDogS2V5c2hhcmUgfCB1bmRlZmluZWQ7XG4gIHByb3RlY3RlZCByZXRyb2ZpdERhdGE6IFJldHJvZml0RGF0YSB8IHVuZGVmaW5lZDtcbiAgcHJvdGVjdGVkIGRrbHNXYXNtOiBEa2xzV2FzbSB8IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgbjogbnVtYmVyLFxuICAgIHQ6IG51bWJlcixcbiAgICBwYXJ0eUlkeDogbnVtYmVyLFxuICAgIHNlZWQ/OiBCdWZmZXIsXG4gICAgcmV0cm9maXREYXRhPzogUmV0cm9maXREYXRhLFxuICAgIGRrbHNXYXNtPzogQnVuZGxlcldhc21lclxuICApIHtcbiAgICB0aGlzLm4gPSBuO1xuICAgIHRoaXMudCA9IHQ7XG4gICAgdGhpcy5wYXJ0eUlkeCA9IHBhcnR5SWR4O1xuICAgIHRoaXMuY2hhaW5Db2RlQ29tbWl0bWVudCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnJldHJvZml0RGF0YSA9IHJldHJvZml0RGF0YTtcbiAgICB0aGlzLnNlZWQgPSBzZWVkO1xuICAgIHRoaXMuZGtsc1dhc20gPSBka2xzV2FzbSA/PyBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsb2FkRGtsc1dhc20oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmRrbHNXYXNtKSB7XG4gICAgICB0aGlzLmRrbHNXYXNtID0gYXdhaXQgaW1wb3J0KCdAc2lsZW5jZWxhYm9yYXRvcmllcy9ka2xzLXdhc20tbGwtbm9kZScpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGtsc1dhc20oKSB7XG4gICAgaWYgKCF0aGlzLmRrbHNXYXNtKSB7XG4gICAgICB0aHJvdyBFcnJvcignREtMUyB3YXNtIG5vdCBsb2FkZWQnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5ka2xzV2FzbTtcbiAgfVxuXG4gIHByaXZhdGUgX3Jlc3RvcmVTZXNzaW9uKCkge1xuICAgIGlmICghdGhpcy5ka2dTZXNzaW9uKSB7XG4gICAgICB0aGlzLmRrZ1Nlc3Npb24gPSB0aGlzLmdldERrbHNXYXNtKCkuS2V5Z2VuU2Vzc2lvbi5mcm9tQnl0ZXModGhpcy5ka2dTZXNzaW9uQnl0ZXMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2NyZWF0ZURLTHNSZXRyb2ZpdEtleVNoYXJlKCkge1xuICAgIGlmICh0aGlzLnJldHJvZml0RGF0YSkge1xuICAgICAgaWYgKCF0aGlzLnJldHJvZml0RGF0YS54U2hhcmUueSB8fCAhdGhpcy5yZXRyb2ZpdERhdGEueFNoYXJlLmNoYWluY29kZSB8fCAhdGhpcy5yZXRyb2ZpdERhdGEueFNoYXJlLngpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoJ3hTaGFyZSBtdXN0IGhhdmUgYSBwdWJsaWMga2V5LCBwcml2YXRlIHNoYXJlIHZhbHVlLCBhbmQgYSBjaGFpbmNvZGUuJyk7XG4gICAgICB9XG4gICAgICBjb25zdCB4aUxpc3Q6IEFycmF5PEFycmF5PG51bWJlcj4+ID0gW107XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubjsgaSsrKSB7XG4gICAgICAgIHhpTGlzdC5wdXNoKEFycmF5LmZyb20oYmlnSW50VG9CdWZmZXJCRShCaWdJbnQoaSArIDEpLCAzMikpKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNlY3AyNTZrMSA9IG5ldyBTZWNwMjU2azFDdXJ2ZSgpO1xuICAgICAgY29uc3QgZGtsc0tleVNoYXJlID0ge1xuICAgICAgICB0b3RhbF9wYXJ0aWVzOiB0aGlzLm4sXG4gICAgICAgIHRocmVzaG9sZDogdGhpcy50LFxuICAgICAgICByYW5rX2xpc3Q6IG5ldyBBcnJheSh0aGlzLm4pLmZpbGwoMCksXG4gICAgICAgIHBhcnR5X2lkOiB0aGlzLnBhcnR5SWR4LFxuICAgICAgICBwdWJsaWNfa2V5OiBBcnJheS5mcm9tKEJ1ZmZlci5mcm9tKHRoaXMucmV0cm9maXREYXRhLnhTaGFyZS55LCAnaGV4JykpLFxuICAgICAgICByb290X2NoYWluX2NvZGU6IEFycmF5LmZyb20oQnVmZmVyLmZyb20odGhpcy5yZXRyb2ZpdERhdGEueFNoYXJlLmNoYWluY29kZSwgJ2hleCcpKSxcbiAgICAgICAgZmluYWxfc2Vzc2lvbl9pZDogQXJyYXkoMzIpLmZpbGwoMCksXG4gICAgICAgIHNlZWRfb3RfcmVjZWl2ZXJzOiBuZXcgQXJyYXkodGhpcy5uIC0gMSkuZmlsbChBcnJheSgzMjgzMikuZmlsbCgwKSksXG4gICAgICAgIHNlZWRfb3Rfc2VuZGVyczogbmV3IEFycmF5KHRoaXMubiAtIDEpLmZpbGwoQXJyYXkoMzI3NjgpLmZpbGwoMCkpLFxuICAgICAgICBzZW50X3NlZWRfbGlzdDogW0FycmF5KDMyKS5maWxsKDApXSxcbiAgICAgICAgcmVjX3NlZWRfbGlzdDogW0FycmF5KDMyKS5maWxsKDApXSxcbiAgICAgICAgc19pOiBBcnJheS5mcm9tKEJ1ZmZlci5mcm9tKHRoaXMucmV0cm9maXREYXRhLnhTaGFyZS54LCAnaGV4JykpLFxuICAgICAgICAvLyBiaWdfc19saXN0IGlzIG5vdyBjcmVhdGVkIGludGVybmFsbHkgZHVyaW5nIHRoZSBwcm90b2NvbCBzbyBpc24ndCBuZWVkZWQgaGVyZSwgaG93ZXZlciBhIHZhbGlkIEtleVNoYXJlIG9iamVjdCBuZWVkcyB0byBoYXZlIGl0LlxuICAgICAgICAvLyBhIGR1bW15IHB1YmxpYyBrZXkgaXMgdXNlZCB0byBmaWxsIGJpZ19zX2xpc3QuXG4gICAgICAgIGJpZ19zX2xpc3Q6IG5ldyBBcnJheSh0aGlzLm4pLmZpbGwoXG4gICAgICAgICAgQXJyYXkuZnJvbShiaWdJbnRUb0J1ZmZlckJFKHNlY3AyNTZrMS5iYXNlUG9pbnRNdWx0KEJpZ0ludCgnMHgnICsgdGhpcy5yZXRyb2ZpdERhdGEueFNoYXJlLngpKSkpXG4gICAgICAgICksXG4gICAgICAgIHhfaV9saXN0OiB0aGlzLnJldHJvZml0RGF0YS54aUxpc3QgPyB0aGlzLnJldHJvZml0RGF0YS54aUxpc3QgOiB4aUxpc3QsXG4gICAgICB9O1xuICAgICAgdGhpcy5ka2xzS2V5U2hhcmVSZXRyb2ZpdE9iamVjdCA9IHRoaXMuZ2V0RGtsc1dhc20oKS5LZXlzaGFyZS5mcm9tQnl0ZXMoZW5jb2RlKGRrbHNLZXlTaGFyZSkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2Rlc2VyaWFsaXplU3RhdGUoKSB7XG4gICAgaWYgKCF0aGlzLmRrZ1Nlc3Npb24pIHtcbiAgICAgIHRocm93IEVycm9yKCdTZXNzaW9uIG5vdCBpbnRpYWxpemVkJyk7XG4gICAgfVxuICAgIGNvbnN0IHJvdW5kID0gZGVjb2RlKHRoaXMuZGtnU2Vzc2lvbi50b0J5dGVzKCkpLnJvdW5kO1xuICAgIHN3aXRjaCAocm91bmQpIHtcbiAgICAgIGNhc2UgJ1dhaXRNc2cxJzpcbiAgICAgICAgdGhpcy5ka2dTdGF0ZSA9IERrZ1N0YXRlLlJvdW5kMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdXYWl0TXNnMic6XG4gICAgICAgIHRoaXMuZGtnU3RhdGUgPSBEa2dTdGF0ZS5Sb3VuZDI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnV2FpdE1zZzMnOlxuICAgICAgICB0aGlzLmRrZ1N0YXRlID0gRGtnU3RhdGUuUm91bmQzO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ1dhaXRNc2c0JzpcbiAgICAgICAgLy8ga2V5U2hhcmVCdWZmIHByZXNlbnQgbWVhbnMga2V5c2hhcmUoKSBhbHJlYWR5IHJhbiBhbmQgZnJlZWQgdGhlIHNlc3Npb247IGJ5dGVzIGFyZSBmcm96ZW4gYXQgV2FpdE1zZzQuXG4gICAgICAgIHRoaXMuZGtnU3RhdGUgPSB0aGlzLmtleVNoYXJlQnVmZiA/IERrZ1N0YXRlLkNvbXBsZXRlIDogRGtnU3RhdGUuUm91bmQ0O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0VuZGVkJzpcbiAgICAgICAgdGhpcy5ka2dTdGF0ZSA9IERrZ1N0YXRlLkNvbXBsZXRlO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRoaXMuZGtnU3RhdGUgPSBEa2dTdGF0ZS5JbnZhbGlkU3RhdGU7XG4gICAgICAgIHRocm93IEVycm9yKGBJbnZhbGlkIFN0YXRlOiAke3JvdW5kfWApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGluaXREa2coKTogUHJvbWlzZTxEZXNlcmlhbGl6ZWRCcm9hZGNhc3RNZXNzYWdlPiB7XG4gICAgaWYgKCF0aGlzLmRrbHNXYXNtKSB7XG4gICAgICBhd2FpdCB0aGlzLmxvYWREa2xzV2FzbSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy50ID4gdGhpcy5uIHx8IHRoaXMucGFydHlJZHggPj0gdGhpcy5uKSB7XG4gICAgICB0aHJvdyBFcnJvcignSW52YWxpZCBwYXJhbWV0ZXJzIGZvciBES0cnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGtnU3RhdGUgIT0gRGtnU3RhdGUuVW5pbml0aWFsaXplZCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0RLRyBzZXNzaW9uIGFscmVhZHkgaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgIC8qIGNoZWNrcyBmb3IgZWxlY3Ryb24gcHJvY2Vzc2VzICovXG4gICAgICAhd2luZG93LnByb2Nlc3MgJiZcbiAgICAgICF3aW5kb3cucHJvY2Vzcz8uWyd0eXBlJ11cbiAgICApIHtcbiAgICAgIC8qIFRoaXMgaXMgb25seSBuZWVkZWQgZm9yIGJyb3dzZXJzL3dlYiBiZWNhdXNlIGl0IHVzZXMgZmV0Y2ggdG8gcmVzb2x2ZSB0aGUgd2FzbSBhc3NldCBmb3IgdGhlIHdlYiAqL1xuICAgICAgY29uc3QgaW5pdERrbHMgPSBhd2FpdCBpbXBvcnQoJ0BzaWxlbmNlbGFib3JhdG9yaWVzL2RrbHMtd2FzbS1sbC13ZWInKTtcbiAgICAgIGF3YWl0IGluaXREa2xzLmRlZmF1bHQoKTtcbiAgICB9XG4gICAgdGhpcy5fY3JlYXRlREtMc1JldHJvZml0S2V5U2hhcmUoKTtcbiAgICBpZiAodGhpcy5zZWVkICYmIHRoaXMuc2VlZC5sZW5ndGggIT09IDMyKSB7XG4gICAgICB0aHJvdyBFcnJvcihgU2VlZCBzaG91bGQgYmUgMzIgYnl0ZXMsIGdvdCAke3RoaXMuc2VlZC5sZW5ndGh9LmApO1xuICAgIH1cbiAgICBjb25zdCB7IEtleWdlblNlc3Npb24gfSA9IHRoaXMuZ2V0RGtsc1dhc20oKTtcbiAgICBpZiAodGhpcy5ka2xzS2V5U2hhcmVSZXRyb2ZpdE9iamVjdCkge1xuICAgICAgdGhpcy5ka2dTZXNzaW9uID0gdGhpcy5zZWVkXG4gICAgICAgID8gS2V5Z2VuU2Vzc2lvbi5pbml0S2V5Um90YXRpb24odGhpcy5ka2xzS2V5U2hhcmVSZXRyb2ZpdE9iamVjdCwgbmV3IFVpbnQ4QXJyYXkodGhpcy5zZWVkKSlcbiAgICAgICAgOiBLZXlnZW5TZXNzaW9uLmluaXRLZXlSb3RhdGlvbih0aGlzLmRrbHNLZXlTaGFyZVJldHJvZml0T2JqZWN0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5ka2dTZXNzaW9uID0gdGhpcy5zZWVkXG4gICAgICAgID8gbmV3IEtleWdlblNlc3Npb24odGhpcy5uLCB0aGlzLnQsIHRoaXMucGFydHlJZHgsIG5ldyBVaW50OEFycmF5KHRoaXMuc2VlZCkpXG4gICAgICAgIDogbmV3IEtleWdlblNlc3Npb24odGhpcy5uLCB0aGlzLnQsIHRoaXMucGFydHlJZHgpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3QgcGF5bG9hZCA9IHRoaXMuZGtnU2Vzc2lvbi5jcmVhdGVGaXJzdE1lc3NhZ2UoKS5wYXlsb2FkO1xuICAgICAgdGhpcy5ka2dTZXNzaW9uQnl0ZXMgPSB0aGlzLmRrZ1Nlc3Npb24udG9CeXRlcygpO1xuICAgICAgdGhpcy5fZGVzZXJpYWxpemVTdGF0ZSgpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGF5bG9hZDogcGF5bG9hZCxcbiAgICAgICAgZnJvbTogdGhpcy5wYXJ0eUlkeCxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgRXJyb3IoYEVycm9yIHdoaWxlIGNyZWF0aW5nIHRoZSBmaXJzdCBtZXNzYWdlIGZyb20gcGFydHkgJHt0aGlzLnBhcnR5SWR4fTogJHtlfWApO1xuICAgIH1cbiAgfVxuXG4gIGdldEtleVNoYXJlKCk6IEJ1ZmZlciB7XG4gICAgaWYgKCF0aGlzLmtleVNoYXJlQnVmZikge1xuICAgICAgdGhyb3cgRXJyb3IoJ0NhbiBub3QgZ2V0IGtleSBzaGFyZSwgREtHIGlzIG5vdCBjb21wbGV0ZSB5ZXQuJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmtleVNoYXJlQnVmZjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgQ0JPUi1lbmNvZGVkIFJlZHVjZWRLZXlTaGFyZSBidWZmZXIgY29udGFpbmluZyB0aGUgcGFydHkncyBwcml2YXRlXG4gICAqIHNjYWxhciAoc19pKSBpbiB0aGUgYHBydmAgZmllbGQuIFRoaXMgYnVmZmVyIGlzIHByaXZhdGUga2V5IG1hdGVyaWFsLlxuICAgKiBUaGUgY2FsbGVyIGVuY3J5cHRzIGl0IGFuZCBzdG9yZXMgaXQgYXMgYHJlZHVjZWRFbmNyeXB0ZWRQcnZgIG9uIHRoZSBrZXkgY2FyZCBRUiBjb2RlLlxuICAgKi9cbiAgZ2V0UmVkdWNlZEtleVNoYXJlKCk6IEJ1ZmZlciB7XG4gICAgaWYgKCF0aGlzLmtleVNoYXJlQnVmZikge1xuICAgICAgdGhyb3cgRXJyb3IoJ0NhbiBub3QgZ2V0IGtleSBzaGFyZSwgREtHIGlzIG5vdCBjb21wbGV0ZSB5ZXQuJyk7XG4gICAgfVxuICAgIGNvbnN0IGRlY29kZWRLZXlzaGFyZSA9IGRlY29kZSh0aGlzLmtleVNoYXJlQnVmZik7XG4gICAgY29uc3QgcmVkdWNlZEtleVNoYXJlOiBSZWR1Y2VkS2V5U2hhcmUgPSB7XG4gICAgICBiaWdTTGlzdDogZGVjb2RlZEtleXNoYXJlLmJpZ19zX2xpc3QsXG4gICAgICB4TGlzdDogZGVjb2RlZEtleXNoYXJlLnhfaV9saXN0LFxuICAgICAgcm9vdENoYWluQ29kZTogZGVjb2RlZEtleXNoYXJlLnJvb3RfY2hhaW5fY29kZSxcbiAgICAgIHBydjogZGVjb2RlZEtleXNoYXJlLnNfaSxcbiAgICAgIHB1YjogZGVjb2RlZEtleXNoYXJlLnB1YmxpY19rZXksXG4gICAgfTtcbiAgICBjb25zdCBlbmNvZGVkS2V5U2hhcmUgPSBlbmNvZGUocmVkdWNlZEtleVNoYXJlKTtcbiAgICByZXR1cm4gZW5jb2RlZEtleVNoYXJlO1xuICB9XG5cbiAgaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhtZXNzYWdlc0Zvckl0aFJvdW5kOiBEZXNlcmlhbGl6ZWRNZXNzYWdlcyk6IERlc2VyaWFsaXplZE1lc3NhZ2VzIHtcbiAgICBsZXQgbmV4dFJvdW5kTWVzc2FnZXM6IE1lc3NhZ2VbXSA9IFtdO1xuICAgIGxldCBuZXh0Um91bmREZXNlcmlhbGl6ZWRNZXNzYWdlczogRGVzZXJpYWxpemVkTWVzc2FnZXMgPSB7IGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSwgcDJwTWVzc2FnZXM6IFtdIH07XG4gICAgdGhpcy5fcmVzdG9yZVNlc3Npb24oKTtcbiAgICBpZiAoIXRoaXMuZGtnU2Vzc2lvbikge1xuICAgICAgdGhyb3cgRXJyb3IoJ1Nlc3Npb24gbm90IGluaXRpYWxpemVkJyk7XG4gICAgfVxuICAgIGNvbnN0IHsgTWVzc2FnZSB9ID0gdGhpcy5nZXREa2xzV2FzbSgpO1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5ka2dTdGF0ZSA9PT0gRGtnU3RhdGUuUm91bmQzKSB7XG4gICAgICAgIGNvbnN0IGNvbW1pdG1lbnRzVW5zb3J0ZWQgPSBtZXNzYWdlc0Zvckl0aFJvdW5kLnAycE1lc3NhZ2VzXG4gICAgICAgICAgLm1hcCgobSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHsgZnJvbTogbS5mcm9tLCBjb21taXRtZW50OiBtLmNvbW1pdG1lbnQgfTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5jb25jYXQoW3sgZnJvbTogdGhpcy5wYXJ0eUlkeCwgY29tbWl0bWVudDogdGhpcy5jaGFpbkNvZGVDb21taXRtZW50IH1dKTtcbiAgICAgICAgY29uc3QgY29tbWl0bWVudHNTb3J0ZWQgPSBjb21taXRtZW50c1Vuc29ydGVkXG4gICAgICAgICAgLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhLmZyb20gLSBiLmZyb207XG4gICAgICAgICAgfSlcbiAgICAgICAgICAubWFwKChjKSA9PiBjLmNvbW1pdG1lbnQpO1xuICAgICAgICBuZXh0Um91bmRNZXNzYWdlcyA9IHRoaXMuZGtnU2Vzc2lvbi5oYW5kbGVNZXNzYWdlcyhcbiAgICAgICAgICBtZXNzYWdlc0Zvckl0aFJvdW5kLmJyb2FkY2FzdE1lc3NhZ2VzXG4gICAgICAgICAgICAubWFwKChtKSA9PiBuZXcgTWVzc2FnZShtLnBheWxvYWQsIG0uZnJvbSwgdW5kZWZpbmVkKSlcbiAgICAgICAgICAgIC5jb25jYXQobWVzc2FnZXNGb3JJdGhSb3VuZC5wMnBNZXNzYWdlcy5tYXAoKG0pID0+IG5ldyBNZXNzYWdlKG0ucGF5bG9hZCwgbS5mcm9tLCBtLnRvKSkpLFxuICAgICAgICAgIGNvbW1pdG1lbnRzU29ydGVkXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXh0Um91bmRNZXNzYWdlcyA9IHRoaXMuZGtnU2Vzc2lvbi5oYW5kbGVNZXNzYWdlcyhcbiAgICAgICAgICBtZXNzYWdlc0Zvckl0aFJvdW5kLmJyb2FkY2FzdE1lc3NhZ2VzXG4gICAgICAgICAgICAubWFwKChtKSA9PiBuZXcgTWVzc2FnZShtLnBheWxvYWQsIG0uZnJvbSwgdW5kZWZpbmVkKSlcbiAgICAgICAgICAgIC5jb25jYXQobWVzc2FnZXNGb3JJdGhSb3VuZC5wMnBNZXNzYWdlcy5tYXAoKG0pID0+IG5ldyBNZXNzYWdlKG0ucGF5bG9hZCwgbS5mcm9tLCBtLnRvKSkpLFxuICAgICAgICAgIHVuZGVmaW5lZFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZGtnU3RhdGUgPT09IERrZ1N0YXRlLlJvdW5kNCkge1xuICAgICAgICB0aGlzLmRrZ0tleVNoYXJlID0gdGhpcy5ka2dTZXNzaW9uLmtleXNoYXJlKCk7XG4gICAgICAgIHRoaXMua2V5U2hhcmVCdWZmID0gQnVmZmVyLmZyb20odGhpcy5ka2dLZXlTaGFyZS50b0J5dGVzKCkpO1xuICAgICAgICB0aGlzLmRrZ0tleVNoYXJlLmZyZWUoKTtcbiAgICAgICAgaWYgKHRoaXMuZGtsc0tleVNoYXJlUmV0cm9maXRPYmplY3QpIHtcbiAgICAgICAgICB0aGlzLmRrbHNLZXlTaGFyZVJldHJvZml0T2JqZWN0LmZyZWUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRrZ1N0YXRlID0gRGtnU3RhdGUuQ29tcGxldGU7XG4gICAgICAgIHJldHVybiB7IGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSwgcDJwTWVzc2FnZXM6IFtdIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBVcGRhdGUgcm91bmQgZGF0YS5cbiAgICAgICAgdGhpcy5fZGVzZXJpYWxpemVTdGF0ZSgpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZGtnU3RhdGUgPT09IERrZ1N0YXRlLlJvdW5kMikge1xuICAgICAgICB0aGlzLmNoYWluQ29kZUNvbW1pdG1lbnQgPSB0aGlzLmRrZ1Nlc3Npb24uY2FsY3VsYXRlQ2hhaW5Db2RlQ29tbWl0bWVudCgpO1xuICAgICAgfVxuICAgICAgbmV4dFJvdW5kRGVzZXJpYWxpemVkTWVzc2FnZXMgPSB7XG4gICAgICAgIHAycE1lc3NhZ2VzOiBuZXh0Um91bmRNZXNzYWdlc1xuICAgICAgICAgIC5maWx0ZXIoKG0pID0+IG0udG9faWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAubWFwKChtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwMnBSZXR1cm4gPSB7XG4gICAgICAgICAgICAgIHBheWxvYWQ6IG0ucGF5bG9hZCxcbiAgICAgICAgICAgICAgZnJvbTogbS5mcm9tX2lkLFxuICAgICAgICAgICAgICB0bzogbS50b19pZCEsXG4gICAgICAgICAgICAgIGNvbW1pdG1lbnQ6IHRoaXMuY2hhaW5Db2RlQ29tbWl0bWVudCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gcDJwUmV0dXJuO1xuICAgICAgICAgIH0pLFxuICAgICAgICBicm9hZGNhc3RNZXNzYWdlczogbmV4dFJvdW5kTWVzc2FnZXNcbiAgICAgICAgICAuZmlsdGVyKChtKSA9PiBtLnRvX2lkID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgLm1hcCgobSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYnJvYWRjYXN0UmV0dXJuID0ge1xuICAgICAgICAgICAgICBwYXlsb2FkOiBtLnBheWxvYWQsXG4gICAgICAgICAgICAgIGZyb206IG0uZnJvbV9pZCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gYnJvYWRjYXN0UmV0dXJuO1xuICAgICAgICAgIH0pLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBFcnJvcihgRXJyb3Igd2hpbGUgY3JlYXRpbmcgbWVzc2FnZXMgZnJvbSBwYXJ0eSAke3RoaXMucGFydHlJZHh9LCByb3VuZCAke3RoaXMuZGtnU3RhdGV9OiAke2V9YCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIG5leHRSb3VuZE1lc3NhZ2VzLmZvckVhY2goKG0pID0+IG0uZnJlZSgpKTtcbiAgICAgIC8vIFNlc3Npb24gaXMgZnJlZWQgd2hlbiBrZXlzaGFyZSBpcyBjYWxsZWQuXG4gICAgICBpZiAodGhpcy5ka2dTdGF0ZSAhPT0gRGtnU3RhdGUuQ29tcGxldGUpIHtcbiAgICAgICAgdGhpcy5ka2dTZXNzaW9uQnl0ZXMgPSB0aGlzLmRrZ1Nlc3Npb24udG9CeXRlcygpO1xuICAgICAgICB0aGlzLmRrZ1Nlc3Npb24gPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXh0Um91bmREZXNlcmlhbGl6ZWRNZXNzYWdlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgc2Vzc2lvbiBkYXRhIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVzdG9yZSB0aGUgc2Vzc2lvbiBsYXRlclxuICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCBzZXNzaW9uIGRhdGFcbiAgICovXG4gIGdldFNlc3Npb25EYXRhKCk6IERrZ1Nlc3Npb25EYXRhIHtcbiAgICBjb25zdCBzZXNzaW9uRGF0YTogRGtnU2Vzc2lvbkRhdGEgPSB7XG4gICAgICBka2dTZXNzaW9uQnl0ZXM6IHRoaXMuZGtnU2Vzc2lvbkJ5dGVzLFxuICAgICAgZGtnU3RhdGU6IHRoaXMuZGtnU3RhdGUsXG4gICAgfTtcblxuICAgIGlmICh0aGlzLmNoYWluQ29kZUNvbW1pdG1lbnQpIHtcbiAgICAgIHNlc3Npb25EYXRhLmNoYWluQ29kZUNvbW1pdG1lbnQgPSB0aGlzLmNoYWluQ29kZUNvbW1pdG1lbnQ7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMua2V5U2hhcmVCdWZmKSB7XG4gICAgICBzZXNzaW9uRGF0YS5rZXlTaGFyZUJ1ZmYgPSB0aGlzLmtleVNoYXJlQnVmZjtcbiAgICB9XG5cbiAgICByZXR1cm4gc2Vzc2lvbkRhdGE7XG4gIH1cblxuICAvKipcbiAgICogUmVzdG9yZSBhIERLRyBzZXNzaW9uIGZyb20gcHJldmlvdXMgc2Vzc2lvbiBkYXRhXG4gICAqIE5vdGU6IFRoaXMgc2hvdWxkIG5vdCBiZSB1c2VkIGZvciBSb3VuZCAxIGFzIHRoYXQncyB0aGUgaW5pdGlhbGl6YXRpb24gcGhhc2VcbiAgICogQHBhcmFtIG4gTnVtYmVyIG9mIHBhcnRpZXNcbiAgICogQHBhcmFtIHQgVGhyZXNob2xkXG4gICAqIEBwYXJhbSBwYXJ0eUlkeCBQYXJ0eSBpbmRleFxuICAgKiBAcGFyYW0gc2Vzc2lvbkRhdGEgUHJldmlvdXMgc2Vzc2lvbiBkYXRhXG4gICAqIEBwYXJhbSBzZWVkIE9wdGlvbmFsIHNlZWRcbiAgICogQHBhcmFtIHJldHJvZml0RGF0YSBPcHRpb25hbCByZXRyb2ZpdCBkYXRhXG4gICAqIEBwYXJhbSBka2xzV2FzbSBPcHRpb25hbCBES0xTIHdhc20gaW5zdGFuY2VcbiAgICogQHJldHVybnMgQSBuZXcgREtHIGluc3RhbmNlIHdpdGggdGhlIHJlc3RvcmVkIHNlc3Npb25cbiAgICovXG4gIHN0YXRpYyBhc3luYyByZXN0b3JlU2Vzc2lvbihcbiAgICBuOiBudW1iZXIsXG4gICAgdDogbnVtYmVyLFxuICAgIHBhcnR5SWR4OiBudW1iZXIsXG4gICAgc2Vzc2lvbkRhdGE6IERrZ1Nlc3Npb25EYXRhLFxuICAgIHNlZWQ/OiBCdWZmZXIsXG4gICAgcmV0cm9maXREYXRhPzogUmV0cm9maXREYXRhLFxuICAgIGRrbHNXYXNtPzogQnVuZGxlcldhc21lclxuICApOiBQcm9taXNlPERrZz4ge1xuICAgIGNvbnN0IGRrZyA9IG5ldyBEa2cobiwgdCwgcGFydHlJZHgsIHNlZWQsIHJldHJvZml0RGF0YSwgZGtsc1dhc20pO1xuXG4gICAgaWYgKCFka2cuZGtsc1dhc20pIHtcbiAgICAgIGF3YWl0IGRrZy5sb2FkRGtsc1dhc20oKTtcbiAgICB9XG5cbiAgICBka2cuZGtnU2Vzc2lvbkJ5dGVzID0gc2Vzc2lvbkRhdGEuZGtnU2Vzc2lvbkJ5dGVzO1xuXG4gICAgaWYgKHNlc3Npb25EYXRhLmNoYWluQ29kZUNvbW1pdG1lbnQpIHtcbiAgICAgIGRrZy5jaGFpbkNvZGVDb21taXRtZW50ID0gc2Vzc2lvbkRhdGEuY2hhaW5Db2RlQ29tbWl0bWVudDtcbiAgICB9XG5cbiAgICBpZiAoc2Vzc2lvbkRhdGEua2V5U2hhcmVCdWZmKSB7XG4gICAgICBka2cua2V5U2hhcmVCdWZmID0gc2Vzc2lvbkRhdGEua2V5U2hhcmVCdWZmO1xuICAgIH1cblxuICAgIGRrZy5fcmVzdG9yZVNlc3Npb24oKTtcbiAgICAvLyBSZS1kZXJpdmUgc3RhdGUgZnJvbSBXQVNNIGJ5dGVzIHJhdGhlciB0aGFuIHRydXN0aW5nIHRoZSBjYWxsZXItc3VwcGxpZWQgZGtnU3RhdGUuXG4gICAgLy8gVGhpcyBwcmV2ZW50cyBhIHRhbXBlcmVkIG9yIGNvcnJ1cHRlZCBka2dTdGF0ZSBmcm9tIGNhdXNpbmcgaGFuZGxlSW5jb21pbmdNZXNzYWdlcygpXG4gICAgLy8gdG8gdGFrZSB0aGUgd3JvbmcgYnJhbmNoIChlLmcuIHNraXBwaW5nIGNoYWluIGNvZGUgY29tbWl0bWVudCBvciBjYWxsaW5nIGtleXNoYXJlKCkgcHJlbWF0dXJlbHkpLlxuICAgIGRrZy5fZGVzZXJpYWxpemVTdGF0ZSgpO1xuICAgIHJldHVybiBka2c7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,47 @@
1
+ import { SignSessionOTVariant } from '@silencelaboratories/dkls-wasm-ll-node';
2
+ import { DeserializedBroadcastMessage, DeserializedDklsSignature, DeserializedMessages, DsgState } from './types';
3
+ type NodeWasmer = typeof import('@silencelaboratories/dkls-wasm-ll-node');
4
+ type WebWasmer = typeof import('@silencelaboratories/dkls-wasm-ll-web');
5
+ type BundlerWasmer = typeof import('@silencelaboratories/dkls-wasm-ll-bundler');
6
+ type DklsWasm = NodeWasmer | WebWasmer | BundlerWasmer;
7
+ export declare class Dsg {
8
+ protected dsgSession: SignSessionOTVariant | undefined;
9
+ protected dsgSessionBytes: Uint8Array;
10
+ private _signature;
11
+ protected keyShareBytes: Buffer;
12
+ protected messageHash: Buffer;
13
+ protected derivationPath: string;
14
+ protected partyIdx: number;
15
+ protected dsgState: DsgState;
16
+ protected dklsWasm: DklsWasm | null;
17
+ constructor(keyShare: Buffer, partyIdx: number, derivationPath: string, messageHash: Buffer, dklsWasm?: BundlerWasmer);
18
+ private _restoreSession;
19
+ private _deserializeState;
20
+ private loadDklsWasm;
21
+ private getDklsWasm;
22
+ /**
23
+ * Returns the current DSG session as a base64 string.
24
+ * @returns {string} - base64 string of the current DSG session
25
+ */
26
+ getSession(): string;
27
+ /**
28
+ * Sets the DSG session from a base64 string.
29
+ * @param {string} session - base64 string of the DSG session
30
+ */
31
+ setSession(session: string): Promise<void>;
32
+ init(): Promise<DeserializedBroadcastMessage>;
33
+ get signature(): DeserializedDklsSignature;
34
+ /**
35
+ * Ends the DSG session by freeing any heap allocations from wasm. Note that the session is freed if a signature is produced.
36
+ */
37
+ endSession(): void;
38
+ /**
39
+ * Proccesses incoming messages to this party in the DKLs DSG protocol and
40
+ * produces messages from this party to other parties for the next round.
41
+ * @param messagesForIthRound - messages to process the current round
42
+ * @returns {DeserializedMessages} - messages to send to other parties for the next round
43
+ */
44
+ handleIncomingMessages(messagesForIthRound: DeserializedMessages): DeserializedMessages;
45
+ }
46
+ export {};
47
+ //# sourceMappingURL=dsg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dsg.d.ts","sourceRoot":"","sources":["../../../../src/tss/ecdsa-dkls/dsg.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,oBAAoB,EAAE,MAAM,wCAAwC,CAAC;AACvF,OAAO,EAAE,4BAA4B,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAGlH,KAAK,UAAU,GAAG,cAAc,wCAAwC,CAAC,CAAC;AAC1E,KAAK,SAAS,GAAG,cAAc,uCAAuC,CAAC,CAAC;AACxE,KAAK,aAAa,GAAG,cAAc,2CAA2C,CAAC,CAAC;AAEhF,KAAK,QAAQ,GAAG,UAAU,GAAG,SAAS,GAAG,aAAa,CAAC;AAEvD,qBAAa,GAAG;IACd,SAAS,CAAC,UAAU,EAAE,oBAAoB,GAAG,SAAS,CAAC;IACvD,SAAS,CAAC,eAAe,EAAE,UAAU,CAAC;IACtC,OAAO,CAAC,UAAU,CAAwC;IAC1D,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC;IAChC,SAAS,CAAC,WAAW,EAAE,MAAM,CAAC;IAC9B,SAAS,CAAC,cAAc,EAAE,MAAM,CAAC;IACjC,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAA0B;IACtD,SAAS,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;gBAGlC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM,EACtB,WAAW,EAAE,MAAM,EACnB,QAAQ,CAAC,EAAE,aAAa;IAS1B,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,iBAAiB;YAqBX,YAAY;IAM1B,OAAO,CAAC,WAAW;IAQnB;;;OAGG;IACH,UAAU,IAAI,MAAM;IAIpB;;;OAGG;IACG,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0B1C,IAAI,IAAI,OAAO,CAAC,4BAA4B,CAAC;IAwCnD,IAAI,SAAS,IAAI,yBAAyB,CAKzC;IAED;;OAEG;IACH,UAAU,IAAI,IAAI;IAUlB;;;;;OAKG;IACH,sBAAsB,CAAC,mBAAmB,EAAE,oBAAoB,GAAG,oBAAoB;CAoFxF"}