@coinflowlabs/angular 0.3.0 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -0
- package/esm2022/lib/card-form/coinflow-card-number-input.component.mjs +12 -2
- package/esm2022/lib/card-form/coinflow-card-number-only-input.component.mjs +12 -2
- package/esm2022/lib/card-form/coinflow-cvv-only-input.component.mjs +12 -2
- package/esm2022/lib/common/CoinflowLibMessageHandlers.mjs +71 -31
- package/esm2022/lib/common/CoinflowTypes.mjs +1 -1
- package/esm2022/lib/common/CoinflowUtils.mjs +4 -66
- package/fesm2022/coinflowlabs-angular.mjs +106 -98
- package/fesm2022/coinflowlabs-angular.mjs.map +1 -1
- package/lib/card-form/coinflow-card-number-input.component.d.ts +5 -1
- package/lib/card-form/coinflow-card-number-only-input.component.d.ts +5 -1
- package/lib/card-form/coinflow-cvv-only-input.component.d.ts +5 -1
- package/lib/common/CoinflowLibMessageHandlers.d.ts +4 -4
- package/lib/common/CoinflowTypes.d.ts +39 -13
- package/lib/common/CoinflowUtils.d.ts +2 -15
- package/package.json +2 -2
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import { web3, base58 } from './SolanaPeerDeps';
|
|
2
2
|
import LZString from 'lz-string';
|
|
3
|
-
import { Keypair, Transaction } from '@solana/web3.js';
|
|
4
|
-
import { sign } from 'tweetnacl';
|
|
5
3
|
export class CoinflowUtils {
|
|
6
4
|
constructor(env) {
|
|
7
5
|
this.env = env ?? 'prod';
|
|
@@ -21,17 +19,6 @@ export class CoinflowUtils {
|
|
|
21
19
|
return undefined;
|
|
22
20
|
});
|
|
23
21
|
}
|
|
24
|
-
async getCreditBalance(publicKey, merchantId, blockchain) {
|
|
25
|
-
const response = await fetch(this.url + `/api/customer/balances/${merchantId}`, {
|
|
26
|
-
method: 'GET',
|
|
27
|
-
headers: {
|
|
28
|
-
'x-coinflow-auth-wallet': publicKey,
|
|
29
|
-
'x-coinflow-auth-blockchain': blockchain,
|
|
30
|
-
},
|
|
31
|
-
});
|
|
32
|
-
const { credits } = await response.json();
|
|
33
|
-
return credits;
|
|
34
|
-
}
|
|
35
22
|
static getCoinflowBaseUrl(env) {
|
|
36
23
|
if (!env || env === 'prod')
|
|
37
24
|
return 'https://coinflow.cash';
|
|
@@ -46,7 +33,7 @@ export class CoinflowUtils {
|
|
|
46
33
|
return 'http://localhost:5000';
|
|
47
34
|
return `https://api-${env}.coinflow.cash`;
|
|
48
35
|
}
|
|
49
|
-
static getCoinflowUrl({ walletPubkey, sessionKey, route, routePrefix, env, amount, transaction, blockchain = 'solana', webhookInfo, email, loaderBackground, handleHeightChange, bankAccountLinkRedirect, additionalWallets, nearDeposit, chargebackProtectionData, merchantCss, color, rent, lockDefaultToken, token, tokens, planCode, disableApplePay, disableGooglePay, customerInfo, settlementType, lockAmount, nativeSolToConvert, theme, usePermit, transactionSigner, authOnly, deviceId, jwtToken, origins, threeDsChallengePreference, supportEmail, }) {
|
|
36
|
+
static getCoinflowUrl({ walletPubkey, sessionKey, route, routePrefix, env, amount, transaction, blockchain = 'solana', webhookInfo, email, loaderBackground, handleHeightChange, bankAccountLinkRedirect, additionalWallets, nearDeposit, chargebackProtectionData, merchantCss, color, rent, lockDefaultToken, token, tokens, planCode, disableApplePay, disableGooglePay, customerInfo, settlementType, lockAmount, nativeSolToConvert, theme, usePermit, transactionSigner, authOnly, deviceId, jwtToken, origins, threeDsChallengePreference, supportEmail, destinationAuthKey, }) {
|
|
50
37
|
const prefix = routePrefix
|
|
51
38
|
? `/${routePrefix}/${blockchain}`
|
|
52
39
|
: `/${blockchain}`;
|
|
@@ -140,6 +127,8 @@ export class CoinflowUtils {
|
|
|
140
127
|
url.searchParams.append('origins', LZString.compressToEncodedURIComponent(JSON.stringify(origins)));
|
|
141
128
|
if (threeDsChallengePreference)
|
|
142
129
|
url.searchParams.append('threeDsChallengePreference', threeDsChallengePreference);
|
|
130
|
+
if (destinationAuthKey)
|
|
131
|
+
url.searchParams.append('destinationAuthKey', destinationAuthKey);
|
|
143
132
|
return url.toString();
|
|
144
133
|
}
|
|
145
134
|
static getTransaction(props) {
|
|
@@ -216,56 +205,5 @@ export class CoinflowUtils {
|
|
|
216
205
|
throw new Error('blockchain not supported!');
|
|
217
206
|
}
|
|
218
207
|
}
|
|
219
|
-
static async getWalletFromUserId({ userId, merchantId, env, }) {
|
|
220
|
-
return this.getWalletFromEmail({
|
|
221
|
-
email: userId,
|
|
222
|
-
merchantId,
|
|
223
|
-
env,
|
|
224
|
-
});
|
|
225
|
-
}
|
|
226
|
-
static async getWalletFromEmail({ email, merchantId, env, }) {
|
|
227
|
-
const buffer = new TextEncoder().encode(email);
|
|
228
|
-
const crypto = window.crypto.subtle;
|
|
229
|
-
const hash = await crypto.digest('SHA-256', buffer);
|
|
230
|
-
const seed = new Uint8Array(hash);
|
|
231
|
-
const keypair = Keypair.fromSeed(seed);
|
|
232
|
-
return {
|
|
233
|
-
publicKey: keypair.publicKey,
|
|
234
|
-
signMessage: (message) => Promise.resolve(sign.detached(message, keypair.secretKey)),
|
|
235
|
-
signTransaction: async (transaction) => {
|
|
236
|
-
if (transaction instanceof Transaction) {
|
|
237
|
-
transaction.sign(keypair);
|
|
238
|
-
return transaction;
|
|
239
|
-
}
|
|
240
|
-
else {
|
|
241
|
-
transaction.sign([keypair]);
|
|
242
|
-
return transaction;
|
|
243
|
-
}
|
|
244
|
-
},
|
|
245
|
-
sendTransaction: async (transaction) => {
|
|
246
|
-
if (transaction instanceof Transaction) {
|
|
247
|
-
transaction.sign(keypair);
|
|
248
|
-
}
|
|
249
|
-
else {
|
|
250
|
-
transaction.sign([keypair]);
|
|
251
|
-
}
|
|
252
|
-
const coinflowBaseUrl = this.getCoinflowApiUrl(env);
|
|
253
|
-
const options = {
|
|
254
|
-
method: 'POST',
|
|
255
|
-
headers: {
|
|
256
|
-
'content-type': 'application/json',
|
|
257
|
-
'x-coinflow-auth-wallet': keypair.publicKey.toString(),
|
|
258
|
-
'x-coinflow-auth-blockchain': 'solana',
|
|
259
|
-
},
|
|
260
|
-
body: JSON.stringify({
|
|
261
|
-
merchantId,
|
|
262
|
-
signedTransaction: base58?.encode(transaction.serialize()),
|
|
263
|
-
}),
|
|
264
|
-
};
|
|
265
|
-
const { signature } = await fetch(coinflowBaseUrl + '/api/utils/send-coinflow-tx', options).then(res => res.json());
|
|
266
|
-
return signature;
|
|
267
|
-
},
|
|
268
|
-
};
|
|
269
|
-
}
|
|
270
208
|
}
|
|
271
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29pbmZsb3dVdGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvaW5mbG93bGFicy9zcmMvbGliL2NvbW1vbi9Db2luZmxvd1V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU9BLE9BQU8sRUFBQyxJQUFJLEVBQUUsTUFBTSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDOUMsT0FBTyxRQUFRLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxPQUFPLEVBQUUsV0FBVyxFQUF1QixNQUFNLGlCQUFpQixDQUFDO0FBQzNFLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFFL0IsTUFBTSxPQUFPLGFBQWE7SUFJeEIsWUFBWSxHQUFrQjtRQUM1QixJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxNQUFNLENBQUM7UUFDekIsSUFBSSxJQUFJLENBQUMsR0FBRyxLQUFLLE1BQU07WUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLDJCQUEyQixDQUFDO2FBQzNELElBQUksSUFBSSxDQUFDLEdBQUcsS0FBSyxPQUFPO1lBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyx1QkFBdUIsQ0FBQzs7WUFDN0QsSUFBSSxDQUFDLEdBQUcsR0FBRyxlQUFlLElBQUksQ0FBQyxHQUFHLGdCQUFnQixDQUFDO0lBQzFELENBQUM7SUFFRCxLQUFLLENBQUMsaUJBQWlCLENBQUMsVUFBa0I7UUFDeEMsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxrQkFBa0IsVUFBVSxFQUFFLENBQUM7YUFDcEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO2FBQ2pDLElBQUksQ0FDSCxDQUFDLElBR0EsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxjQUFjLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FDaEU7YUFDQSxLQUFLLENB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O0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb2luZmxvd0Jsb2NrY2hhaW4sXG4gIENvaW5mbG93RW52cyxcbiAgQ29pbmZsb3dJRnJhbWVQcm9wcyxcbiAgQ29pbmZsb3dQdXJjaGFzZVByb3BzLFxuICBTb2xhbmFXYWxsZXQsXG59IGZyb20gJy4vQ29pbmZsb3dUeXBlcyc7XG5pbXBvcnQge3dlYjMsIGJhc2U1OH0gZnJvbSAnLi9Tb2xhbmFQZWVyRGVwcyc7XG5pbXBvcnQgTFpTdHJpbmcgZnJvbSAnbHotc3RyaW5nJztcbmltcG9ydCB7S2V5cGFpciwgVHJhbnNhY3Rpb24sIFZlcnNpb25lZFRyYW5zYWN0aW9ufSBmcm9tICdAc29sYW5hL3dlYjMuanMnO1xuaW1wb3J0IHtzaWdufSBmcm9tICd0d2VldG5hY2wnO1xuXG5leHBvcnQgY2xhc3MgQ29pbmZsb3dVdGlscyB7XG4gIGVudjogQ29pbmZsb3dFbnZzO1xuICB1cmw6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihlbnY/OiBDb2luZmxvd0VudnMpIHtcbiAgICB0aGlzLmVudiA9IGVudiA/PyAncHJvZCc7XG4gICAgaWYgKHRoaXMuZW52ID09PSAncHJvZCcpIHRoaXMudXJsID0gJ2h0dHBzOi8vYXBpLmNvaW5mbG93LmNhc2gnO1xuICAgIGVsc2UgaWYgKHRoaXMuZW52ID09PSAnbG9jYWwnKSB0aGlzLnVybCA9ICdodHRwOi8vbG9jYWxob3N0OjUwMDAnO1xuICAgIGVsc2UgdGhpcy51cmwgPSBgaHR0cHM6Ly9hcGktJHt0aGlzLmVudn0uY29pbmZsb3cuY2FzaGA7XG4gIH1cblxuICBhc3luYyBnZXROU3VyZVBhcnRuZXJJZChtZXJjaGFudElkOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiBmZXRjaCh0aGlzLnVybCArIGAvbWVyY2hhbnQvdmlldy8ke21lcmNoYW50SWR9YClcbiAgICAgIC50aGVuKHJlc3BvbnNlID0+IHJlc3BvbnNlLmpzb24oKSlcbiAgICAgIC50aGVuKFxuICAgICAgICAoanNvbjoge1xuICAgICAgICAgIG5TdXJlUGFydG5lcklkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgblN1cmVTZXR0aW5nczoge25TdXJlUGFydG5lcklkOiBzdHJpbmcgfCB1bmRlZmluZWR9O1xuICAgICAgICB9KSA9PiBqc29uLm5TdXJlU2V0dGluZ3M/Lm5TdXJlUGFydG5lcklkIHx8IGpzb24ublN1cmVQYXJ0bmVySWRcbiAgICAgIClcbiAgICAgIC5jYXRjaChlID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZ2V0Q3JlZGl0QmFsYW5jZShcbiAgICBwdWJsaWNLZXk6IHN0cmluZyxcbiAgICBtZXJjaGFudElkOiBzdHJpbmcsXG4gICAgYmxvY2tjaGFpbjogJ3NvbGFuYScgfCAnbmVhcidcbiAgKTogUHJvbWlzZTx7Y2VudHM6IG51bWJlcn0+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKFxuICAgICAgdGhpcy51cmwgKyBgL2FwaS9jdXN0b21lci9iYWxhbmNlcy8ke21lcmNoYW50SWR9YCxcbiAgICAgIHtcbiAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICd4LWNvaW5mbG93LWF1dGgtd2FsbGV0JzogcHVibGljS2V5LFxuICAgICAgICAgICd4LWNvaW5mbG93LWF1dGgtYmxvY2tjaGFpbic6IGJsb2NrY2hhaW4sXG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgKTtcbiAgICBjb25zdCB7Y3JlZGl0c30gPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgcmV0dXJuIGNyZWRpdHM7XG4gIH1cblxuICBzdGF0aWMgZ2V0Q29pbmZsb3dCYXNlVXJsKGVudj86IENvaW5mbG93RW52cyk6IHN0cmluZyB7XG4gICAgaWYgKCFlbnYgfHwgZW52ID09PSAncHJvZCcpIHJldHVybiAnaHR0cHM6Ly9jb2luZmxvdy5jYXNoJztcbiAgICBpZiAoZW52ID09PSAnbG9jYWwnKSByZXR1cm4gJ2h0dHA6Ly9sb2NhbGhvc3Q6MzAwMCc7XG5cbiAgICByZXR1cm4gYGh0dHBzOi8vJHtlbnZ9LmNvaW5mbG93LmNhc2hgO1xuICB9XG5cbiAgc3RhdGljIGdldENvaW5mbG93QXBpVXJsKGVudj86IENvaW5mbG93RW52cyk6IHN0cmluZyB7XG4gICAgaWYgKCFlbnYgfHwgZW52ID09PSAncHJvZCcpIHJldHVybiAnaHR0cHM6Ly9hcGkuY29pbmZsb3cuY2FzaCc7XG4gICAgaWYgKGVudiA9PT0gJ2xvY2FsJykgcmV0dXJuICdodHRwOi8vbG9jYWxob3N0OjUwMDAnO1xuXG4gICAgcmV0dXJuIGBodHRwczovL2FwaS0ke2Vudn0uY29pbmZsb3cuY2FzaGA7XG4gIH1cblxuICBzdGF0aWMgZ2V0Q29pbmZsb3dVcmwoe1xuICAgIHdhbGxldFB1YmtleSxcbiAgICBzZXNzaW9uS2V5LFxuICAgIHJvdXRlLFxuICAgIHJvdXRlUHJlZml4LFxuICAgIGVudixcbiAgICBhbW91bnQsXG4gICAgdHJhbnNhY3Rpb24sXG4gICAgYmxvY2tjaGFpbiA9ICdzb2xhbmEnLFxuICAgIHdlYmhvb2tJbmZvLFxuICAgIGVtYWlsLFxuICAgIGxvYWRlckJhY2tncm91bmQsXG4gICAgaGFuZGxlSGVpZ2h0Q2hhbmdlLFxuICAgIGJhbmtBY2NvdW50TGlua1JlZGlyZWN0LFxuICAgIGFkZGl0aW9uYWxXYWxsZXRzLFxuICAgIG5lYXJEZXBvc2l0LFxuICAgIGNoYXJnZWJhY2tQcm90ZWN0aW9uRGF0YSxcbiAgICBtZXJjaGFudENzcyxcbiAgICBjb2xvcixcbiAgICByZW50LFxuICAgIGxvY2tEZWZhdWx0VG9rZW4sXG4gICAgdG9rZW4sXG4gICAgdG9rZW5zLFxuICAgIHBsYW5Db2RlLFxuICAgIGRpc2FibGVBcHBsZVBheSxcbiAgICBkaXNhYmxlR29vZ2xlUGF5LFxuICAgIGN1c3RvbWVySW5mbyxcbiAgICBzZXR0bGVtZW50VHlwZSxcbiAgICBsb2NrQW1vdW50LFxuICAgIG5hdGl2ZVNvbFRvQ29udmVydCxcbiAgICB0aGVtZSxcbiAgICB1c2VQZXJtaXQsXG4gICAgdHJhbnNhY3Rpb25TaWduZXIsXG4gICAgYXV0aE9ubHksXG4gICAgZGV2aWNlSWQsXG4gICAgand0VG9rZW4sXG4gICAgb3JpZ2lucyxcbiAgICB0aHJlZURzQ2hhbGxlbmdlUHJlZmVyZW5jZSxcbiAgICBzdXBwb3J0RW1haWwsXG4gIH06IENvaW5mbG93SUZyYW1lUHJvcHMpOiBzdHJpbmcge1xuICAgIGNvbnN0IHByZWZpeCA9IHJvdXRlUHJlZml4XG4gICAgICA/IGAvJHtyb3V0ZVByZWZpeH0vJHtibG9ja2NoYWlufWBcbiAgICAgIDogYC8ke2Jsb2NrY2hhaW59YDtcbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHByZWZpeCArIHJvdXRlLCBDb2luZmxvd1V0aWxzLmdldENvaW5mbG93QmFzZVVybChlbnYpKTtcblxuICAgIGlmICh3YWxsZXRQdWJrZXkpIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKCdwdWJrZXknLCB3YWxsZXRQdWJrZXkpO1xuICAgIGlmIChzZXNzaW9uS2V5KSB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZCgnc2Vzc2lvbktleScsIHNlc3Npb25LZXkpO1xuXG4gICAgaWYgKHRyYW5zYWN0aW9uKSB7XG4gICAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZCgndHJhbnNhY3Rpb24nLCB0cmFuc2FjdGlvbik7XG4gICAgfVxuICAgIGlmIChhbW91bnQpIHtcbiAgICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKCdhbW91bnQnLCBhbW91bnQudG9TdHJpbmcoKSk7XG4gICAgfVxuXG4gICAgaWYgKHdlYmhvb2tJbmZvKSB7XG4gICAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChcbiAgICAgICAgJ3dlYmhvb2tJbmZvJyxcbiAgICAgICAgTFpTdHJpbmcuY29tcHJlc3NUb0VuY29kZWRVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkod2ViaG9va0luZm8pKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodGhlbWUpIHtcbiAgICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKFxuICAgICAgICAndGhlbWUnLFxuICAgICAgICBMWlN0cmluZy5jb21wcmVzc1RvRW5jb2RlZFVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeSh0aGVtZSkpXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChjdXN0b21lckluZm8pIHtcbiAgICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKFxuICAgICAgICAnY3VzdG9tZXJJbmZvJyxcbiAgICAgICAgTFpTdHJpbmcuY29tcHJlc3NUb0VuY29kZWRVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoY3VzdG9tZXJJbmZvKSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGVtYWlsKSB7XG4gICAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZCgnZW1haWwnLCBlbWFpbCk7XG4gICAgfVxuICAgIGlmIChzdXBwb3J0RW1haWwpIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKCdzdXBwb3J0RW1haWwnLCBzdXBwb3J0RW1haWwpO1xuXG4gICAgaWYgKHRva2VuKSB7XG4gICAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZCgndG9rZW4nLCB0b2tlbi50b1N0cmluZygpKTtcbiAgICB9XG5cbiAgICBpZiAodG9rZW5zKSB7XG4gICAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZCgndG9rZW5zJywgdG9rZW5zLnRvU3RyaW5nKCkpO1xuICAgIH1cblxuICAgIGlmIChsb2FkZXJCYWNrZ3JvdW5kKSB7XG4gICAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZCgnbG9hZGVyQmFja2dyb3VuZCcsIGxvYWRlckJhY2tncm91bmQpO1xuICAgIH1cblxuICAgIGlmIChoYW5kbGVIZWlnaHRDaGFuZ2UpIHtcbiAgICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKCd1c2VIZWlnaHRDaGFuZ2UnLCAndHJ1ZScpO1xuICAgIH1cblxuICAgIGlmIChiYW5rQWNjb3VudExpbmtSZWRpcmVjdCkge1xuICAgICAgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoXG4gICAgICAgICdiYW5rQWNjb3VudExpbmtSZWRpcmVjdCcsXG4gICAgICAgIGJhbmtBY2NvdW50TGlua1JlZGlyZWN0XG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChhZGRpdGlvbmFsV2FsbGV0cylcbiAgICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKFxuICAgICAgICAnYWRkaXRpb25hbFdhbGxldHMnLFxuICAgICAgICBMWlN0cmluZy5jb21wcmVzc1RvRW5jb2RlZFVSSUNvbXBvbmVudChcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeShhZGRpdGlvbmFsV2FsbGV0cylcbiAgICAgICAgKVxuICAgICAgKTtcblxuICAgIGlmIChuZWFyRGVwb3NpdCkgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoJ25lYXJEZXBvc2l0JywgbmVhckRlcG9zaXQpO1xuXG4gICAgaWYgKGNoYXJnZWJhY2tQcm90ZWN0aW9uRGF0YSlcbiAgICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKFxuICAgICAgICAnY2hhcmdlYmFja1Byb3RlY3Rpb25EYXRhJyxcbiAgICAgICAgTFpTdHJpbmcuY29tcHJlc3NUb0VuY29kZWRVUklDb21wb25lbnQoXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkoY2hhcmdlYmFja1Byb3RlY3Rpb25EYXRhKVxuICAgICAgICApXG4gICAgICApO1xuICAgIGlmIChkZXZpY2VJZCkge1xuICAgICAgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoJ2RldmljZUlkJywgZGV2aWNlSWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGNvbnN0IGRldmljZUlkID0gd2luZG93Py5uU3VyZVNESz8uZ2V0RGV2aWNlSWQoKTtcbiAgICAgICAgaWYgKGRldmljZUlkKSB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZCgnZGV2aWNlSWQnLCBkZXZpY2VJZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1lcmNoYW50Q3NzKSB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZCgnbWVyY2hhbnRDc3MnLCBtZXJjaGFudENzcyk7XG4gICAgaWYgKGNvbG9yKSB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZCgnY29sb3InLCBjb2xvcik7XG4gICAgaWYgKHJlbnQpIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKCdyZW50JywgcmVudC5sYW1wb3J0cy50b1N0cmluZygpKTtcbiAgICBpZiAobmF0aXZlU29sVG9Db252ZXJ0KVxuICAgICAgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoXG4gICAgICAgICduYXRpdmVTb2xUb0NvbnZlcnQnLFxuICAgICAgICBuYXRpdmVTb2xUb0NvbnZlcnQubGFtcG9ydHMudG9TdHJpbmcoKVxuICAgICAgKTtcbiAgICBpZiAobG9ja0RlZmF1bHRUb2tlbikgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoJ2xvY2tEZWZhdWx0VG9rZW4nLCAndHJ1ZScpO1xuICAgIGlmIChwbGFuQ29kZSkgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoJ3BsYW5Db2RlJywgcGxhbkNvZGUpO1xuXG4gICAgaWYgKGRpc2FibGVBcHBsZVBheSkgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoJ2Rpc2FibGVBcHBsZVBheScsICd0cnVlJyk7XG4gICAgaWYgKGRpc2FibGVHb29nbGVQYXkpIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKCdkaXNhYmxlR29vZ2xlUGF5JywgJ3RydWUnKTtcbiAgICBpZiAoc2V0dGxlbWVudFR5cGUpXG4gICAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZCgnc2V0dGxlbWVudFR5cGUnLCBzZXR0bGVtZW50VHlwZSk7XG5cbiAgICBpZiAobG9ja0Ftb3VudCkgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoJ2xvY2tBbW91bnQnLCAndHJ1ZScpO1xuXG4gICAgaWYgKHVzZVBlcm1pdCA9PT0gZmFsc2UpIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKCd1c2VQZXJtaXQnLCAnZmFsc2UnKTtcbiAgICBpZiAodHJhbnNhY3Rpb25TaWduZXIpXG4gICAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZCgndHJhbnNhY3Rpb25TaWduZXInLCB0cmFuc2FjdGlvblNpZ25lcik7XG4gICAgaWYgKGF1dGhPbmx5ID09PSB0cnVlKSB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZCgnYXV0aE9ubHknLCAndHJ1ZScpO1xuICAgIGlmIChqd3RUb2tlbikgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoJ2p3dFRva2VuJywgand0VG9rZW4pO1xuICAgIGlmIChvcmlnaW5zKVxuICAgICAgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoXG4gICAgICAgICdvcmlnaW5zJyxcbiAgICAgICAgTFpTdHJpbmcuY29tcHJlc3NUb0VuY29kZWRVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkob3JpZ2lucykpXG4gICAgICApO1xuXG4gICAgaWYgKHRocmVlRHNDaGFsbGVuZ2VQcmVmZXJlbmNlKVxuICAgICAgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoXG4gICAgICAgICd0aHJlZURzQ2hhbGxlbmdlUHJlZmVyZW5jZScsXG4gICAgICAgIHRocmVlRHNDaGFsbGVuZ2VQcmVmZXJlbmNlXG4gICAgICApO1xuXG4gICAgcmV0dXJuIHVybC50b1N0cmluZygpO1xuICB9XG5cbiAgc3RhdGljIGdldFRyYW5zYWN0aW9uKHByb3BzOiBDb2luZmxvd1B1cmNoYXNlUHJvcHMpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICghcHJvcHMuYmxvY2tjaGFpbikgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIHJldHVybiB0aGlzLmJ5QmxvY2tjaGFpbjwoKSA9PiBzdHJpbmcgfCB1bmRlZmluZWQ+KHByb3BzLmJsb2NrY2hhaW4sIHtcbiAgICAgIHNvbGFuYTogKCkgPT4ge1xuICAgICAgICBpZiAoISgndHJhbnNhY3Rpb24nIGluIHByb3BzKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3Qge3RyYW5zYWN0aW9ufSA9IHByb3BzO1xuICAgICAgICBpZiAoIXdlYjMpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdAc29sYW5hL3dlYjMuanMgZGVwZW5kZW5jeSBpcyByZXF1aXJlZCBmb3IgU29sYW5hJyk7XG4gICAgICAgIGlmICghYmFzZTU4KSB0aHJvdyBuZXcgRXJyb3IoJ2JzNTggZGVwZW5kZW5jeSBpcyByZXF1aXJlZCBmb3IgU29sYW5hJyk7XG4gICAgICAgIGlmICghdHJhbnNhY3Rpb24pIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiBiYXNlNTguZW5jb2RlKFxuICAgICAgICAgICh0cmFuc2FjdGlvbiBhcyBWZXJzaW9uZWRUcmFuc2FjdGlvbiB8IFRyYW5zYWN0aW9uKS5zZXJpYWxpemUoe1xuICAgICAgICAgICAgcmVxdWlyZUFsbFNpZ25hdHVyZXM6IGZhbHNlLFxuICAgICAgICAgICAgdmVyaWZ5U2lnbmF0dXJlczogZmFsc2UsXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICBwb2x5Z29uOiAoKSA9PiB7XG4gICAgICAgIGlmICghKCd0cmFuc2FjdGlvbicgaW4gcHJvcHMpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCB7dHJhbnNhY3Rpb259ID0gcHJvcHM7XG4gICAgICAgIHJldHVybiBMWlN0cmluZy5jb21wcmVzc1RvRW5jb2RlZFVSSUNvbXBvbmVudChcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0cmFuc2FjdGlvbilcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICBldGg6ICgpID0+IHtcbiAgICAgICAgaWYgKCEoJ3RyYW5zYWN0aW9uJyBpbiBwcm9wcykpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHt0cmFuc2FjdGlvbn0gPSBwcm9wcztcbiAgICAgICAgcmV0dXJuIExaU3RyaW5nLmNvbXByZXNzVG9FbmNvZGVkVVJJQ29tcG9uZW50KFxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRyYW5zYWN0aW9uKVxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIGJhc2U6ICgpID0+IHtcbiAgICAgICAgaWYgKCEoJ3RyYW5zYWN0aW9uJyBpbiBwcm9wcykpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHt0cmFuc2FjdGlvbn0gPSBwcm9wcztcbiAgICAgICAgcmV0dXJuIExaU3RyaW5nLmNvbXByZXNzVG9FbmNvZGVkVVJJQ29tcG9uZW50KFxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRyYW5zYWN0aW9uKVxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIGFyYml0cnVtOiAoKSA9PiB7XG4gICAgICAgIGlmICghKCd0cmFuc2FjdGlvbicgaW4gcHJvcHMpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCB7dHJhbnNhY3Rpb259ID0gcHJvcHM7XG4gICAgICAgIHJldHVybiBMWlN0cmluZy5jb21wcmVzc1RvRW5jb2RlZFVSSUNvbXBvbmVudChcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0cmFuc2FjdGlvbilcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICBuZWFyOiAoKSA9PiB7XG4gICAgICAgIGlmICghKCdhY3Rpb24nIGluIHByb3BzKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3Qge2FjdGlvbn0gPSBwcm9wcztcbiAgICAgICAgcmV0dXJuIExaU3RyaW5nLmNvbXByZXNzVG9FbmNvZGVkVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KGFjdGlvbikpO1xuICAgICAgfSxcbiAgICAgIHVzZXI6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH0sXG4gICAgfSkoKTtcbiAgfVxuXG4gIHN0YXRpYyBieUJsb2NrY2hhaW48VD4oXG4gICAgYmxvY2tjaGFpbjogQ29pbmZsb3dCbG9ja2NoYWluLFxuICAgIGFyZ3M6IHtcbiAgICAgIHNvbGFuYTogVDtcbiAgICAgIG5lYXI6IFQ7XG4gICAgICBldGg6IFQ7XG4gICAgICBwb2x5Z29uOiBUO1xuICAgICAgYmFzZTogVDtcbiAgICAgIGFyYml0cnVtOiBUO1xuICAgICAgdXNlcjogVDtcbiAgICB9XG4gICk6IFQge1xuICAgIHN3aXRjaCAoYmxvY2tjaGFpbikge1xuICAgICAgY2FzZSAnc29sYW5hJzpcbiAgICAgICAgcmV0dXJuIGFyZ3Muc29sYW5hO1xuICAgICAgY2FzZSAnbmVhcic6XG4gICAgICAgIHJldHVybiBhcmdzLm5lYXI7XG4gICAgICBjYXNlICdwb2x5Z29uJzpcbiAgICAgICAgcmV0dXJuIGFyZ3MucG9seWdvbjtcbiAgICAgIGNhc2UgJ2V0aCc6XG4gICAgICAgIHJldHVybiBhcmdzLmV0aDtcbiAgICAgIGNhc2UgJ2Jhc2UnOlxuICAgICAgICByZXR1cm4gYXJncy5iYXNlO1xuICAgICAgY2FzZSAnYXJiaXRydW0nOlxuICAgICAgICByZXR1cm4gYXJncy5hcmJpdHJ1bTtcbiAgICAgIGNhc2UgJ3VzZXInOlxuICAgICAgICByZXR1cm4gYXJncy51c2VyO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdibG9ja2NoYWluIG5vdCBzdXBwb3J0ZWQhJyk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGFzeW5jIGdldFdhbGxldEZyb21Vc2VySWQoe1xuICAgIHVzZXJJZCxcbiAgICBtZXJjaGFudElkLFxuICAgIGVudixcbiAgfToge1xuICAgIHVzZXJJZDogc3RyaW5nO1xuICAgIG1lcmNoYW50SWQ6IHN0cmluZztcbiAgICBlbnY6IENvaW5mbG93RW52cztcbiAgfSk6IFByb21pc2U8U29sYW5hV2FsbGV0PiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0V2FsbGV0RnJvbUVtYWlsKHtcbiAgICAgIGVtYWlsOiB1c2VySWQsXG4gICAgICBtZXJjaGFudElkLFxuICAgICAgZW52LFxuICAgIH0pO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGdldFdhbGxldEZyb21FbWFpbCh7XG4gICAgZW1haWwsXG4gICAgbWVyY2hhbnRJZCxcbiAgICBlbnYsXG4gIH06IHtcbiAgICBlbWFpbDogc3RyaW5nO1xuICAgIG1lcmNoYW50SWQ6IHN0cmluZztcbiAgICBlbnY6IENvaW5mbG93RW52cztcbiAgfSk6IFByb21pc2U8U29sYW5hV2FsbGV0PiB7XG4gICAgY29uc3QgYnVmZmVyID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKGVtYWlsKTtcbiAgICBjb25zdCBjcnlwdG8gPSB3aW5kb3cuY3J5cHRvLnN1YnRsZTtcbiAgICBjb25zdCBoYXNoID0gYXdhaXQgY3J5cHRvLmRpZ2VzdCgnU0hBLTI1NicsIGJ1ZmZlcik7XG4gICAgY29uc3Qgc2VlZCA9IG5ldyBVaW50OEFycmF5KGhhc2gpO1xuICAgIGNvbnN0IGtleXBhaXIgPSBLZXlwYWlyLmZyb21TZWVkKHNlZWQpO1xuICAgIHJldHVybiB7XG4gICAgICBwdWJsaWNLZXk6IGtleXBhaXIucHVibGljS2V5LFxuICAgICAgc2lnbk1lc3NhZ2U6IChtZXNzYWdlOiBVaW50OEFycmF5KSA9PlxuICAgICAgICBQcm9taXNlLnJlc29sdmUoc2lnbi5kZXRhY2hlZChtZXNzYWdlLCBrZXlwYWlyLnNlY3JldEtleSkpLFxuICAgICAgc2lnblRyYW5zYWN0aW9uOiBhc3luYyA8VCBleHRlbmRzIFRyYW5zYWN0aW9uIHwgVmVyc2lvbmVkVHJhbnNhY3Rpb24+KFxuICAgICAgICB0cmFuc2FjdGlvbjogVFxuICAgICAgKTogUHJvbWlzZTxUPiA9PiB7XG4gICAgICAgIGlmICh0cmFuc2FjdGlvbiBpbnN0YW5jZW9mIFRyYW5zYWN0aW9uKSB7XG4gICAgICAgICAgdHJhbnNhY3Rpb24uc2lnbihrZXlwYWlyKTtcbiAgICAgICAgICByZXR1cm4gdHJhbnNhY3Rpb247XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdHJhbnNhY3Rpb24uc2lnbihba2V5cGFpcl0pO1xuICAgICAgICAgIHJldHVybiB0cmFuc2FjdGlvbjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNlbmRUcmFuc2FjdGlvbjogYXN5bmMgPFQgZXh0ZW5kcyBUcmFuc2FjdGlvbiB8IFZlcnNpb25lZFRyYW5zYWN0aW9uPihcbiAgICAgICAgdHJhbnNhY3Rpb246IFRcbiAgICAgICk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gICAgICAgIGlmICh0cmFuc2FjdGlvbiBpbnN0YW5jZW9mIFRyYW5zYWN0aW9uKSB7XG4gICAgICAgICAgdHJhbnNhY3Rpb24uc2lnbihrZXlwYWlyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0cmFuc2FjdGlvbi5zaWduKFtrZXlwYWlyXSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb2luZmxvd0Jhc2VVcmwgPSB0aGlzLmdldENvaW5mbG93QXBpVXJsKGVudik7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICd4LWNvaW5mbG93LWF1dGgtd2FsbGV0Jzoga2V5cGFpci5wdWJsaWNLZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICd4LWNvaW5mbG93LWF1dGgtYmxvY2tjaGFpbic6ICdzb2xhbmEnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgbWVyY2hhbnRJZCxcbiAgICAgICAgICAgIHNpZ25lZFRyYW5zYWN0aW9uOiBiYXNlNTg/LmVuY29kZSh0cmFuc2FjdGlvbi5zZXJpYWxpemUoKSksXG4gICAgICAgICAgfSksXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3Qge3NpZ25hdHVyZX0gPSBhd2FpdCBmZXRjaChcbiAgICAgICAgICBjb2luZmxvd0Jhc2VVcmwgKyAnL2FwaS91dGlscy9zZW5kLWNvaW5mbG93LXR4JyxcbiAgICAgICAgICBvcHRpb25zXG4gICAgICAgICkudGhlbihyZXMgPT4gcmVzLmpzb24oKSk7XG4gICAgICAgIHJldHVybiBzaWduYXR1cmU7XG4gICAgICB9LFxuICAgIH07XG4gIH1cbn1cbiJdfQ==
|
|
209
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29pbmZsb3dVdGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvaW5mbG93bGFicy9zcmMvbGliL2NvbW1vbi9Db2luZmxvd1V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU1BLE9BQU8sRUFBQyxJQUFJLEVBQUUsTUFBTSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDOUMsT0FBTyxRQUFRLE1BQU0sV0FBVyxDQUFDO0FBR2pDLE1BQU0sT0FBTyxhQUFhO0lBSXhCLFlBQVksR0FBa0I7UUFDNUIsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksTUFBTSxDQUFDO1FBQ3pCLElBQUksSUFBSSxDQUFDLEdBQUcsS0FBSyxNQUFNO1lBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRywyQkFBMkIsQ0FBQzthQUMzRCxJQUFJLElBQUksQ0FBQyxHQUFHLEtBQUssT0FBTztZQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsdUJBQXVCLENBQUM7O1lBQzdELElBQUksQ0FBQyxHQUFHLEdBQUcsZUFBZSxJQUFJLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQztJQUMxRCxDQUFDO0lBRUQsS0FBSyxDQUFDLGlCQUFpQixDQUFDLFVBQWtCO1FBQ3hDLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsa0JBQWtCLFVBQVUsRUFBRSxDQUFDO2FBQ3BELElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQzthQUNqQyxJQUFJLENBQ0gsQ0FBQyxJQUdBLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsY0FBYyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQ2hFO2FBQ0EsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ1QsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNqQixPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxNQUFNLENBQUMsa0JBQWtCLENBQUMsR0FBa0I7UUFDMUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLEtBQUssTUFBTTtZQUFFLE9BQU8sdUJBQXVCLENBQUM7UUFDM0QsSUFBSSxHQUFHLEtBQUssT0FBTztZQUFFLE9BQU8sdUJBQXVCLENBQUM7UUFFcEQsT0FBTyxXQUFXLEdBQUcsZ0JBQWdCLENBQUM7SUFDeEMsQ0FBQztJQUVELE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFrQjtRQUN6QyxJQUFJLENBQUMsR0FBRyxJQUFJLEdBQUcsS0FBSyxNQUFNO1lBQUUsT0FBTywyQkFBMkIsQ0FBQztRQUMvRCxJQUFJLEdBQUcsS0FBSyxPQUFPO1lBQUUsT0FBTyx1QkFBdUIsQ0FBQztRQUVwRCxPQUFPLGVBQWUsR0FBRyxnQkFBZ0IsQ0FBQztJQUM1QyxDQUFDO0lBRUQsTUFBTSxDQUFDLGNBQWMsQ0FBQyxFQUNwQixZQUFZLEVBQ1osVUFBVSxFQUNWLEtBQUssRUFDTCxXQUFXLEVBQ1gsR0FBRyxFQUNILE1BQU0sRUFDTixXQUFXLEVBQ1gsVUFBVSxHQUFHLFFBQVEsRUFDckIsV0FBVyxFQUNYLEtBQUssRUFDTCxnQkFBZ0IsRUFDaEIsa0JBQWtCLEVBQ2xCLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsV0FBVyxFQUNYLHdCQUF3QixFQUN4QixXQUFXLEVBQ1gsS0FBSyxFQUNMLElBQUksRUFDSixnQkFBZ0IsRUFDaEIsS0FBSyxFQUNMLE1BQU0sRUFDTixRQUFRLEVBQ1IsZUFBZSxFQUNmLGdCQUFnQixFQUNoQixZQUFZLEVBQ1osY0FBYyxFQUNkLFVBQVUsRUFDVixrQkFBa0IsRUFDbEIsS0FBSyxFQUNMLFNBQVMsRUFDVCxpQkFBaUIsRUFDakIsUUFBUSxFQUNSLFFBQVEsRUFDUixRQUFRLEVBQ1IsT0FBTyxFQUNQLDBCQUEwQixFQUMxQixZQUFZLEVBQ1osa0JBQWtCLEdBQ0U7UUFDcEIsTUFBTSxNQUFNLEdBQUcsV0FBVztZQUN4QixDQUFDLENBQUMsSUFBSSxXQUFXLElBQUksVUFBVSxFQUFFO1lBQ2pDLENBQUMsQ0FBQyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ3JCLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sR0FBRyxLQUFLLEVBQUUsYUFBYSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFM0UsSUFBSSxZQUFZO1lBQUUsR0FBRyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ2xFLElBQUksVUFBVTtZQUFFLEdBQUcsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxVQUFVLENBQUMsQ0FBQztRQUVsRSxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2hCLEdBQUcsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUN0RCxDQUFDO1FBQ0QsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNYLEdBQUcsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUN2RCxDQUFDO1FBRUQsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNoQixHQUFHLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FDckIsYUFBYSxFQUNiLFFBQVEsQ0FBQyw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQ3BFLENBQUM7UUFDSixDQUFDO1FBRUQsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLEdBQUcsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUNyQixPQUFPLEVBQ1AsUUFBUSxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FDOUQsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ2pCLEdBQUcsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUNyQixjQUFjLEVBQ2QsUUFBUSxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FDckUsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsR0FBRyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzFDLENBQUM7UUFDRCxJQUFJLFlBQVk7WUFBRSxHQUFHLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFFeEUsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLEdBQUcsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUNyRCxDQUFDO1FBRUQsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNYLEdBQUcsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUN2RCxDQUFDO1FBRUQsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3JCLEdBQUcsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLGtCQUFrQixFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFDaEUsQ0FBQztRQUVELElBQUksa0JBQWtCLEVBQUUsQ0FBQztZQUN2QixHQUFHLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNyRCxDQUFDO1FBRUQsSUFBSSx1QkFBdUIsRUFBRSxDQUFDO1lBQzVCLEdBQUcsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUNyQix5QkFBeUIsRUFDekIsdUJBQXVCLENBQ3hCLENBQUM7UUFDSixDQUFDO1FBRUQsSUFBSSxpQkFBaUI7WUFDbkIsR0FBRyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQ3JCLG1CQUFtQixFQUNuQixRQUFRLENBQUMsNkJBQTZCLENBQ3BDLElBQUksQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsQ0FDbEMsQ0FDRixDQUFDO1FBRUosSUFBSSxXQUFXO1lBQUUsR0FBRyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBRXJFLElBQUksd0JBQXdCO1lBQzFCLEdBQUcsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUNyQiwwQkFBMEIsRUFDMUIsUUFBUSxDQUFDLDZCQUE2QixDQUNwQyxJQUFJLENBQUMsU0FBUyxDQUFDLHdCQUF3QixDQUFDLENBQ3pDLENBQ0YsQ0FBQztRQUNKLElBQUksUUFBUSxFQUFFLENBQUM7WUFDYixHQUFHLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDaEQsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVcsRUFBRSxDQUFDO2dCQUNsQyw2REFBNkQ7Z0JBQzdELGFBQWE7Z0JBQ2IsTUFBTSxRQUFRLEdBQUcsTUFBTSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsQ0FBQztnQkFDakQsSUFBSSxRQUFRO29CQUFFLEdBQUcsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUM5RCxDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksV0FBVztZQUFFLEdBQUcsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUNyRSxJQUFJLEtBQUs7WUFBRSxHQUFHLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbkQsSUFBSSxJQUFJO1lBQUUsR0FBRyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUNwRSxJQUFJLGtCQUFrQjtZQUNwQixHQUFHLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FDckIsb0JBQW9CLEVBQ3BCLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FDdkMsQ0FBQztRQUNKLElBQUksZ0JBQWdCO1lBQUUsR0FBRyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDMUUsSUFBSSxRQUFRO1lBQUUsR0FBRyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRTVELElBQUksZUFBZTtZQUFFLEdBQUcsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3hFLElBQUksZ0JBQWdCO1lBQUUsR0FBRyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDMUUsSUFBSSxjQUFjO1lBQ2hCLEdBQUcsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBRTVELElBQUksVUFBVTtZQUFFLEdBQUcsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQztRQUU5RCxJQUFJLFNBQVMsS0FBSyxLQUFLO1lBQUUsR0FBRyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZFLElBQUksaUJBQWlCO1lBQ25CLEdBQUcsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLG1CQUFtQixFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFDbEUsSUFBSSxRQUFRLEtBQUssSUFBSTtZQUFFLEdBQUcsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNuRSxJQUFJLFFBQVE7WUFBRSxHQUFHLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDNUQsSUFBSSxPQUFPO1lBQ1QsR0FBRyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQ3JCLFNBQVMsRUFDVCxRQUFRLENBQUMsNkJBQTZCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUNoRSxDQUFDO1FBRUosSUFBSSwwQkFBMEI7WUFDNUIsR0FBRyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQ3JCLDRCQUE0QixFQUM1QiwwQkFBMEIsQ0FDM0IsQ0FBQztRQUVKLElBQUksa0JBQWtCO1lBQ3BCLEdBQUcsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLG9CQUFvQixFQUFFLGtCQUFrQixDQUFDLENBQUM7UUFFcEUsT0FBTyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVELE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBNEI7UUFDaEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFFeEMsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUEyQixLQUFLLENBQUMsVUFBVSxFQUFFO1lBQ25FLE1BQU0sRUFBRSxHQUFHLEVBQUU7Z0JBQ1gsSUFBSSxDQUFDLENBQUMsYUFBYSxJQUFJLEtBQUssQ0FBQztvQkFBRSxPQUFPLFNBQVMsQ0FBQztnQkFDaEQsTUFBTSxFQUFDLFdBQVcsRUFBQyxHQUFHLEtBQUssQ0FBQztnQkFDNUIsSUFBSSxDQUFDLElBQUk7b0JBQ1AsTUFBTSxJQUFJLEtBQUssQ0FBQyxtREFBbUQsQ0FBQyxDQUFDO2dCQUN2RSxJQUFJLENBQUMsTUFBTTtvQkFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHdDQUF3QyxDQUFDLENBQUM7Z0JBQ3ZFLElBQUksQ0FBQyxXQUFXO29CQUFFLE9BQU8sU0FBUyxDQUFDO2dCQUNuQyxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQ2pCLFdBQWtELENBQUMsU0FBUyxDQUFDO29CQUM1RCxvQkFBb0IsRUFBRSxLQUFLO29CQUMzQixnQkFBZ0IsRUFBRSxLQUFLO2lCQUN4QixDQUFDLENBQ0gsQ0FBQztZQUNKLENBQUM7WUFDRCxPQUFPLEVBQUUsR0FBRyxFQUFFO2dCQUNaLElBQUksQ0FBQyxDQUFDLGFBQWEsSUFBSSxLQUFLLENBQUM7b0JBQUUsT0FBTyxTQUFTLENBQUM7Z0JBQ2hELE1BQU0sRUFBQyxXQUFXLEVBQUMsR0FBRyxLQUFLLENBQUM7Z0JBQzVCLE9BQU8sUUFBUSxDQUFDLDZCQUE2QixDQUMzQyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUM1QixDQUFDO1lBQ0osQ0FBQztZQUNELEdBQUcsRUFBRSxHQUFHLEVBQUU7Z0JBQ1IsSUFBSSxDQUFDLENBQUMsYUFBYSxJQUFJLEtBQUssQ0FBQztvQkFBRSxPQUFPLFNBQVMsQ0FBQztnQkFDaEQsTUFBTSxFQUFDLFdBQVcsRUFBQyxHQUFHLEtBQUssQ0FBQztnQkFDNUIsT0FBTyxRQUFRLENBQUMsNkJBQTZCLENBQzNDLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQzVCLENBQUM7WUFDSixDQUFDO1lBQ0QsSUFBSSxFQUFFLEdBQUcsRUFBRTtnQkFDVCxJQUFJLENBQUMsQ0FBQyxhQUFhLElBQUksS0FBSyxDQUFDO29CQUFFLE9BQU8sU0FBUyxDQUFDO2dCQUNoRCxNQUFNLEVBQUMsV0FBVyxFQUFDLEdBQUcsS0FBSyxDQUFDO2dCQUM1QixPQUFPLFFBQVEsQ0FBQyw2QkFBNkIsQ0FDM0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FDNUIsQ0FBQztZQUNKLENBQUM7WUFDRCxRQUFRLEVBQUUsR0FBRyxFQUFFO2dCQUNiLElBQUksQ0FBQyxDQUFDLGFBQWEsSUFBSSxLQUFLLENBQUM7b0JBQUUsT0FBTyxTQUFTLENBQUM7Z0JBQ2hELE1BQU0sRUFBQyxXQUFXLEVBQUMsR0FBRyxLQUFLLENBQUM7Z0JBQzVCLE9BQU8sUUFBUSxDQUFDLDZCQUE2QixDQUMzQyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUM1QixDQUFDO1lBQ0osQ0FBQztZQUNELElBQUksRUFBRSxHQUFHLEVBQUU7Z0JBQ1QsSUFBSSxDQUFDLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQztvQkFBRSxPQUFPLFNBQVMsQ0FBQztnQkFDM0MsTUFBTSxFQUFDLE1BQU0sRUFBQyxHQUFHLEtBQUssQ0FBQztnQkFDdkIsT0FBTyxRQUFRLENBQUMsNkJBQTZCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ3hFLENBQUM7WUFDRCxJQUFJLEVBQUUsR0FBRyxFQUFFO2dCQUNULE9BQU8sU0FBUyxDQUFDO1lBQ25CLENBQUM7U0FDRixDQUFDLEVBQUUsQ0FBQztJQUNQLENBQUM7SUFFRCxNQUFNLENBQUMsWUFBWSxDQUNqQixVQUE4QixFQUM5QixJQVFDO1FBRUQsUUFBUSxVQUFVLEVBQUUsQ0FBQztZQUNuQixLQUFLLFFBQVE7Z0JBQ1gsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQ3JCLEtBQUssTUFBTTtnQkFDVCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDbkIsS0FBSyxTQUFTO2dCQUNaLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUN0QixLQUFLLEtBQUs7Z0JBQ1IsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDO1lBQ2xCLEtBQUssTUFBTTtnQkFDVCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDbkIsS0FBSyxVQUFVO2dCQUNiLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUN2QixLQUFLLE1BQU07Z0JBQ1QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ25CO2dCQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQztRQUNqRCxDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29pbmZsb3dCbG9ja2NoYWluLFxuICBDb2luZmxvd0VudnMsXG4gIENvaW5mbG93SUZyYW1lUHJvcHMsXG4gIENvaW5mbG93UHVyY2hhc2VQcm9wcyxcbn0gZnJvbSAnLi9Db2luZmxvd1R5cGVzJztcbmltcG9ydCB7d2ViMywgYmFzZTU4fSBmcm9tICcuL1NvbGFuYVBlZXJEZXBzJztcbmltcG9ydCBMWlN0cmluZyBmcm9tICdsei1zdHJpbmcnO1xuaW1wb3J0IHR5cGUge1RyYW5zYWN0aW9uLCBWZXJzaW9uZWRUcmFuc2FjdGlvbn0gZnJvbSAnQHNvbGFuYS93ZWIzLmpzJztcblxuZXhwb3J0IGNsYXNzIENvaW5mbG93VXRpbHMge1xuICBlbnY6IENvaW5mbG93RW52cztcbiAgdXJsOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoZW52PzogQ29pbmZsb3dFbnZzKSB7XG4gICAgdGhpcy5lbnYgPSBlbnYgPz8gJ3Byb2QnO1xuICAgIGlmICh0aGlzLmVudiA9PT0gJ3Byb2QnKSB0aGlzLnVybCA9ICdodHRwczovL2FwaS5jb2luZmxvdy5jYXNoJztcbiAgICBlbHNlIGlmICh0aGlzLmVudiA9PT0gJ2xvY2FsJykgdGhpcy51cmwgPSAnaHR0cDovL2xvY2FsaG9zdDo1MDAwJztcbiAgICBlbHNlIHRoaXMudXJsID0gYGh0dHBzOi8vYXBpLSR7dGhpcy5lbnZ9LmNvaW5mbG93LmNhc2hgO1xuICB9XG5cbiAgYXN5bmMgZ2V0TlN1cmVQYXJ0bmVySWQobWVyY2hhbnRJZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICByZXR1cm4gZmV0Y2godGhpcy51cmwgKyBgL21lcmNoYW50L3ZpZXcvJHttZXJjaGFudElkfWApXG4gICAgICAudGhlbihyZXNwb25zZSA9PiByZXNwb25zZS5qc29uKCkpXG4gICAgICAudGhlbihcbiAgICAgICAgKGpzb246IHtcbiAgICAgICAgICBuU3VyZVBhcnRuZXJJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAgIG5TdXJlU2V0dGluZ3M6IHtuU3VyZVBhcnRuZXJJZDogc3RyaW5nIHwgdW5kZWZpbmVkfTtcbiAgICAgICAgfSkgPT4ganNvbi5uU3VyZVNldHRpbmdzPy5uU3VyZVBhcnRuZXJJZCB8fCBqc29uLm5TdXJlUGFydG5lcklkXG4gICAgICApXG4gICAgICAuY2F0Y2goZSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBnZXRDb2luZmxvd0Jhc2VVcmwoZW52PzogQ29pbmZsb3dFbnZzKTogc3RyaW5nIHtcbiAgICBpZiAoIWVudiB8fCBlbnYgPT09ICdwcm9kJykgcmV0dXJuICdodHRwczovL2NvaW5mbG93LmNhc2gnO1xuICAgIGlmIChlbnYgPT09ICdsb2NhbCcpIHJldHVybiAnaHR0cDovL2xvY2FsaG9zdDozMDAwJztcblxuICAgIHJldHVybiBgaHR0cHM6Ly8ke2Vudn0uY29pbmZsb3cuY2FzaGA7XG4gIH1cblxuICBzdGF0aWMgZ2V0Q29pbmZsb3dBcGlVcmwoZW52PzogQ29pbmZsb3dFbnZzKTogc3RyaW5nIHtcbiAgICBpZiAoIWVudiB8fCBlbnYgPT09ICdwcm9kJykgcmV0dXJuICdodHRwczovL2FwaS5jb2luZmxvdy5jYXNoJztcbiAgICBpZiAoZW52ID09PSAnbG9jYWwnKSByZXR1cm4gJ2h0dHA6Ly9sb2NhbGhvc3Q6NTAwMCc7XG5cbiAgICByZXR1cm4gYGh0dHBzOi8vYXBpLSR7ZW52fS5jb2luZmxvdy5jYXNoYDtcbiAgfVxuXG4gIHN0YXRpYyBnZXRDb2luZmxvd1VybCh7XG4gICAgd2FsbGV0UHVia2V5LFxuICAgIHNlc3Npb25LZXksXG4gICAgcm91dGUsXG4gICAgcm91dGVQcmVmaXgsXG4gICAgZW52LFxuICAgIGFtb3VudCxcbiAgICB0cmFuc2FjdGlvbixcbiAgICBibG9ja2NoYWluID0gJ3NvbGFuYScsXG4gICAgd2ViaG9va0luZm8sXG4gICAgZW1haWwsXG4gICAgbG9hZGVyQmFja2dyb3VuZCxcbiAgICBoYW5kbGVIZWlnaHRDaGFuZ2UsXG4gICAgYmFua0FjY291bnRMaW5rUmVkaXJlY3QsXG4gICAgYWRkaXRpb25hbFdhbGxldHMsXG4gICAgbmVhckRlcG9zaXQsXG4gICAgY2hhcmdlYmFja1Byb3RlY3Rpb25EYXRhLFxuICAgIG1lcmNoYW50Q3NzLFxuICAgIGNvbG9yLFxuICAgIHJlbnQsXG4gICAgbG9ja0RlZmF1bHRUb2tlbixcbiAgICB0b2tlbixcbiAgICB0b2tlbnMsXG4gICAgcGxhbkNvZGUsXG4gICAgZGlzYWJsZUFwcGxlUGF5LFxuICAgIGRpc2FibGVHb29nbGVQYXksXG4gICAgY3VzdG9tZXJJbmZvLFxuICAgIHNldHRsZW1lbnRUeXBlLFxuICAgIGxvY2tBbW91bnQsXG4gICAgbmF0aXZlU29sVG9Db252ZXJ0LFxuICAgIHRoZW1lLFxuICAgIHVzZVBlcm1pdCxcbiAgICB0cmFuc2FjdGlvblNpZ25lcixcbiAgICBhdXRoT25seSxcbiAgICBkZXZpY2VJZCxcbiAgICBqd3RUb2tlbixcbiAgICBvcmlnaW5zLFxuICAgIHRocmVlRHNDaGFsbGVuZ2VQcmVmZXJlbmNlLFxuICAgIHN1cHBvcnRFbWFpbCxcbiAgICBkZXN0aW5hdGlvbkF1dGhLZXksXG4gIH06IENvaW5mbG93SUZyYW1lUHJvcHMpOiBzdHJpbmcge1xuICAgIGNvbnN0IHByZWZpeCA9IHJvdXRlUHJlZml4XG4gICAgICA/IGAvJHtyb3V0ZVByZWZpeH0vJHtibG9ja2NoYWlufWBcbiAgICAgIDogYC8ke2Jsb2NrY2hhaW59YDtcbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHByZWZpeCArIHJvdXRlLCBDb2luZmxvd1V0aWxzLmdldENvaW5mbG93QmFzZVVybChlbnYpKTtcblxuICAgIGlmICh3YWxsZXRQdWJrZXkpIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKCdwdWJrZXknLCB3YWxsZXRQdWJrZXkpO1xuICAgIGlmIChzZXNzaW9uS2V5KSB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZCgnc2Vzc2lvbktleScsIHNlc3Npb25LZXkpO1xuXG4gICAgaWYgKHRyYW5zYWN0aW9uKSB7XG4gICAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZCgndHJhbnNhY3Rpb24nLCB0cmFuc2FjdGlvbik7XG4gICAgfVxuICAgIGlmIChhbW91bnQpIHtcbiAgICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKCdhbW91bnQnLCBhbW91bnQudG9TdHJpbmcoKSk7XG4gICAgfVxuXG4gICAgaWYgKHdlYmhvb2tJbmZvKSB7XG4gICAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChcbiAgICAgICAgJ3dlYmhvb2tJbmZvJyxcbiAgICAgICAgTFpTdHJpbmcuY29tcHJlc3NUb0VuY29kZWRVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkod2ViaG9va0luZm8pKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodGhlbWUpIHtcbiAgICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKFxuICAgICAgICAndGhlbWUnLFxuICAgICAgICBMWlN0cmluZy5jb21wcmVzc1RvRW5jb2RlZFVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeSh0aGVtZSkpXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChjdXN0b21lckluZm8pIHtcbiAgICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKFxuICAgICAgICAnY3VzdG9tZXJJbmZvJyxcbiAgICAgICAgTFpTdHJpbmcuY29tcHJlc3NUb0VuY29kZWRVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoY3VzdG9tZXJJbmZvKSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGVtYWlsKSB7XG4gICAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZCgnZW1haWwnLCBlbWFpbCk7XG4gICAgfVxuICAgIGlmIChzdXBwb3J0RW1haWwpIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKCdzdXBwb3J0RW1haWwnLCBzdXBwb3J0RW1haWwpO1xuXG4gICAgaWYgKHRva2VuKSB7XG4gICAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZCgndG9rZW4nLCB0b2tlbi50b1N0cmluZygpKTtcbiAgICB9XG5cbiAgICBpZiAodG9rZW5zKSB7XG4gICAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZCgndG9rZW5zJywgdG9rZW5zLnRvU3RyaW5nKCkpO1xuICAgIH1cblxuICAgIGlmIChsb2FkZXJCYWNrZ3JvdW5kKSB7XG4gICAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZCgnbG9hZGVyQmFja2dyb3VuZCcsIGxvYWRlckJhY2tncm91bmQpO1xuICAgIH1cblxuICAgIGlmIChoYW5kbGVIZWlnaHRDaGFuZ2UpIHtcbiAgICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKCd1c2VIZWlnaHRDaGFuZ2UnLCAndHJ1ZScpO1xuICAgIH1cblxuICAgIGlmIChiYW5rQWNjb3VudExpbmtSZWRpcmVjdCkge1xuICAgICAgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoXG4gICAgICAgICdiYW5rQWNjb3VudExpbmtSZWRpcmVjdCcsXG4gICAgICAgIGJhbmtBY2NvdW50TGlua1JlZGlyZWN0XG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChhZGRpdGlvbmFsV2FsbGV0cylcbiAgICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKFxuICAgICAgICAnYWRkaXRpb25hbFdhbGxldHMnLFxuICAgICAgICBMWlN0cmluZy5jb21wcmVzc1RvRW5jb2RlZFVSSUNvbXBvbmVudChcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeShhZGRpdGlvbmFsV2FsbGV0cylcbiAgICAgICAgKVxuICAgICAgKTtcblxuICAgIGlmIChuZWFyRGVwb3NpdCkgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoJ25lYXJEZXBvc2l0JywgbmVhckRlcG9zaXQpO1xuXG4gICAgaWYgKGNoYXJnZWJhY2tQcm90ZWN0aW9uRGF0YSlcbiAgICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKFxuICAgICAgICAnY2hhcmdlYmFja1Byb3RlY3Rpb25EYXRhJyxcbiAgICAgICAgTFpTdHJpbmcuY29tcHJlc3NUb0VuY29kZWRVUklDb21wb25lbnQoXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkoY2hhcmdlYmFja1Byb3RlY3Rpb25EYXRhKVxuICAgICAgICApXG4gICAgICApO1xuICAgIGlmIChkZXZpY2VJZCkge1xuICAgICAgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoJ2RldmljZUlkJywgZGV2aWNlSWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGNvbnN0IGRldmljZUlkID0gd2luZG93Py5uU3VyZVNESz8uZ2V0RGV2aWNlSWQoKTtcbiAgICAgICAgaWYgKGRldmljZUlkKSB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZCgnZGV2aWNlSWQnLCBkZXZpY2VJZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1lcmNoYW50Q3NzKSB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZCgnbWVyY2hhbnRDc3MnLCBtZXJjaGFudENzcyk7XG4gICAgaWYgKGNvbG9yKSB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZCgnY29sb3InLCBjb2xvcik7XG4gICAgaWYgKHJlbnQpIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKCdyZW50JywgcmVudC5sYW1wb3J0cy50b1N0cmluZygpKTtcbiAgICBpZiAobmF0aXZlU29sVG9Db252ZXJ0KVxuICAgICAgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoXG4gICAgICAgICduYXRpdmVTb2xUb0NvbnZlcnQnLFxuICAgICAgICBuYXRpdmVTb2xUb0NvbnZlcnQubGFtcG9ydHMudG9TdHJpbmcoKVxuICAgICAgKTtcbiAgICBpZiAobG9ja0RlZmF1bHRUb2tlbikgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoJ2xvY2tEZWZhdWx0VG9rZW4nLCAndHJ1ZScpO1xuICAgIGlmIChwbGFuQ29kZSkgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoJ3BsYW5Db2RlJywgcGxhbkNvZGUpO1xuXG4gICAgaWYgKGRpc2FibGVBcHBsZVBheSkgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoJ2Rpc2FibGVBcHBsZVBheScsICd0cnVlJyk7XG4gICAgaWYgKGRpc2FibGVHb29nbGVQYXkpIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKCdkaXNhYmxlR29vZ2xlUGF5JywgJ3RydWUnKTtcbiAgICBpZiAoc2V0dGxlbWVudFR5cGUpXG4gICAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZCgnc2V0dGxlbWVudFR5cGUnLCBzZXR0bGVtZW50VHlwZSk7XG5cbiAgICBpZiAobG9ja0Ftb3VudCkgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoJ2xvY2tBbW91bnQnLCAndHJ1ZScpO1xuXG4gICAgaWYgKHVzZVBlcm1pdCA9PT0gZmFsc2UpIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKCd1c2VQZXJtaXQnLCAnZmFsc2UnKTtcbiAgICBpZiAodHJhbnNhY3Rpb25TaWduZXIpXG4gICAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZCgndHJhbnNhY3Rpb25TaWduZXInLCB0cmFuc2FjdGlvblNpZ25lcik7XG4gICAgaWYgKGF1dGhPbmx5ID09PSB0cnVlKSB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZCgnYXV0aE9ubHknLCAndHJ1ZScpO1xuICAgIGlmIChqd3RUb2tlbikgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoJ2p3dFRva2VuJywgand0VG9rZW4pO1xuICAgIGlmIChvcmlnaW5zKVxuICAgICAgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoXG4gICAgICAgICdvcmlnaW5zJyxcbiAgICAgICAgTFpTdHJpbmcuY29tcHJlc3NUb0VuY29kZWRVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkob3JpZ2lucykpXG4gICAgICApO1xuXG4gICAgaWYgKHRocmVlRHNDaGFsbGVuZ2VQcmVmZXJlbmNlKVxuICAgICAgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoXG4gICAgICAgICd0aHJlZURzQ2hhbGxlbmdlUHJlZmVyZW5jZScsXG4gICAgICAgIHRocmVlRHNDaGFsbGVuZ2VQcmVmZXJlbmNlXG4gICAgICApO1xuXG4gICAgaWYgKGRlc3RpbmF0aW9uQXV0aEtleSlcbiAgICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKCdkZXN0aW5hdGlvbkF1dGhLZXknLCBkZXN0aW5hdGlvbkF1dGhLZXkpO1xuXG4gICAgcmV0dXJuIHVybC50b1N0cmluZygpO1xuICB9XG5cbiAgc3RhdGljIGdldFRyYW5zYWN0aW9uKHByb3BzOiBDb2luZmxvd1B1cmNoYXNlUHJvcHMpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICghcHJvcHMuYmxvY2tjaGFpbikgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIHJldHVybiB0aGlzLmJ5QmxvY2tjaGFpbjwoKSA9PiBzdHJpbmcgfCB1bmRlZmluZWQ+KHByb3BzLmJsb2NrY2hhaW4sIHtcbiAgICAgIHNvbGFuYTogKCkgPT4ge1xuICAgICAgICBpZiAoISgndHJhbnNhY3Rpb24nIGluIHByb3BzKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3Qge3RyYW5zYWN0aW9ufSA9IHByb3BzO1xuICAgICAgICBpZiAoIXdlYjMpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdAc29sYW5hL3dlYjMuanMgZGVwZW5kZW5jeSBpcyByZXF1aXJlZCBmb3IgU29sYW5hJyk7XG4gICAgICAgIGlmICghYmFzZTU4KSB0aHJvdyBuZXcgRXJyb3IoJ2JzNTggZGVwZW5kZW5jeSBpcyByZXF1aXJlZCBmb3IgU29sYW5hJyk7XG4gICAgICAgIGlmICghdHJhbnNhY3Rpb24pIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiBiYXNlNTguZW5jb2RlKFxuICAgICAgICAgICh0cmFuc2FjdGlvbiBhcyBWZXJzaW9uZWRUcmFuc2FjdGlvbiB8IFRyYW5zYWN0aW9uKS5zZXJpYWxpemUoe1xuICAgICAgICAgICAgcmVxdWlyZUFsbFNpZ25hdHVyZXM6IGZhbHNlLFxuICAgICAgICAgICAgdmVyaWZ5U2lnbmF0dXJlczogZmFsc2UsXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICBwb2x5Z29uOiAoKSA9PiB7XG4gICAgICAgIGlmICghKCd0cmFuc2FjdGlvbicgaW4gcHJvcHMpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCB7dHJhbnNhY3Rpb259ID0gcHJvcHM7XG4gICAgICAgIHJldHVybiBMWlN0cmluZy5jb21wcmVzc1RvRW5jb2RlZFVSSUNvbXBvbmVudChcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0cmFuc2FjdGlvbilcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICBldGg6ICgpID0+IHtcbiAgICAgICAgaWYgKCEoJ3RyYW5zYWN0aW9uJyBpbiBwcm9wcykpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHt0cmFuc2FjdGlvbn0gPSBwcm9wcztcbiAgICAgICAgcmV0dXJuIExaU3RyaW5nLmNvbXByZXNzVG9FbmNvZGVkVVJJQ29tcG9uZW50KFxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRyYW5zYWN0aW9uKVxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIGJhc2U6ICgpID0+IHtcbiAgICAgICAgaWYgKCEoJ3RyYW5zYWN0aW9uJyBpbiBwcm9wcykpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHt0cmFuc2FjdGlvbn0gPSBwcm9wcztcbiAgICAgICAgcmV0dXJuIExaU3RyaW5nLmNvbXByZXNzVG9FbmNvZGVkVVJJQ29tcG9uZW50KFxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRyYW5zYWN0aW9uKVxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIGFyYml0cnVtOiAoKSA9PiB7XG4gICAgICAgIGlmICghKCd0cmFuc2FjdGlvbicgaW4gcHJvcHMpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCB7dHJhbnNhY3Rpb259ID0gcHJvcHM7XG4gICAgICAgIHJldHVybiBMWlN0cmluZy5jb21wcmVzc1RvRW5jb2RlZFVSSUNvbXBvbmVudChcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0cmFuc2FjdGlvbilcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICBuZWFyOiAoKSA9PiB7XG4gICAgICAgIGlmICghKCdhY3Rpb24nIGluIHByb3BzKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3Qge2FjdGlvbn0gPSBwcm9wcztcbiAgICAgICAgcmV0dXJuIExaU3RyaW5nLmNvbXByZXNzVG9FbmNvZGVkVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KGFjdGlvbikpO1xuICAgICAgfSxcbiAgICAgIHVzZXI6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH0sXG4gICAgfSkoKTtcbiAgfVxuXG4gIHN0YXRpYyBieUJsb2NrY2hhaW48VD4oXG4gICAgYmxvY2tjaGFpbjogQ29pbmZsb3dCbG9ja2NoYWluLFxuICAgIGFyZ3M6IHtcbiAgICAgIHNvbGFuYTogVDtcbiAgICAgIG5lYXI6IFQ7XG4gICAgICBldGg6IFQ7XG4gICAgICBwb2x5Z29uOiBUO1xuICAgICAgYmFzZTogVDtcbiAgICAgIGFyYml0cnVtOiBUO1xuICAgICAgdXNlcjogVDtcbiAgICB9XG4gICk6IFQge1xuICAgIHN3aXRjaCAoYmxvY2tjaGFpbikge1xuICAgICAgY2FzZSAnc29sYW5hJzpcbiAgICAgICAgcmV0dXJuIGFyZ3Muc29sYW5hO1xuICAgICAgY2FzZSAnbmVhcic6XG4gICAgICAgIHJldHVybiBhcmdzLm5lYXI7XG4gICAgICBjYXNlICdwb2x5Z29uJzpcbiAgICAgICAgcmV0dXJuIGFyZ3MucG9seWdvbjtcbiAgICAgIGNhc2UgJ2V0aCc6XG4gICAgICAgIHJldHVybiBhcmdzLmV0aDtcbiAgICAgIGNhc2UgJ2Jhc2UnOlxuICAgICAgICByZXR1cm4gYXJncy5iYXNlO1xuICAgICAgY2FzZSAnYXJiaXRydW0nOlxuICAgICAgICByZXR1cm4gYXJncy5hcmJpdHJ1bTtcbiAgICAgIGNhc2UgJ3VzZXInOlxuICAgICAgICByZXR1cm4gYXJncy51c2VyO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdibG9ja2NoYWluIG5vdCBzdXBwb3J0ZWQhJyk7XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { EventEmitter, Component, Input, Output, ViewChild, HostListener, Injectable, inject } from '@angular/core';
|
|
3
3
|
import * as SolanaWeb3Js from '@solana/web3.js';
|
|
4
|
-
import { Keypair, Transaction } from '@solana/web3.js';
|
|
5
4
|
import base58Imported from 'bs58';
|
|
6
5
|
import LZString from 'lz-string';
|
|
7
|
-
import { sign } from 'tweetnacl';
|
|
8
6
|
import * as i1 from '@angular/platform-browser';
|
|
9
7
|
|
|
10
8
|
var SettlementType;
|
|
@@ -66,17 +64,6 @@ class CoinflowUtils {
|
|
|
66
64
|
return undefined;
|
|
67
65
|
});
|
|
68
66
|
}
|
|
69
|
-
async getCreditBalance(publicKey, merchantId, blockchain) {
|
|
70
|
-
const response = await fetch(this.url + `/api/customer/balances/${merchantId}`, {
|
|
71
|
-
method: 'GET',
|
|
72
|
-
headers: {
|
|
73
|
-
'x-coinflow-auth-wallet': publicKey,
|
|
74
|
-
'x-coinflow-auth-blockchain': blockchain,
|
|
75
|
-
},
|
|
76
|
-
});
|
|
77
|
-
const { credits } = await response.json();
|
|
78
|
-
return credits;
|
|
79
|
-
}
|
|
80
67
|
static getCoinflowBaseUrl(env) {
|
|
81
68
|
if (!env || env === 'prod')
|
|
82
69
|
return 'https://coinflow.cash';
|
|
@@ -91,7 +78,7 @@ class CoinflowUtils {
|
|
|
91
78
|
return 'http://localhost:5000';
|
|
92
79
|
return `https://api-${env}.coinflow.cash`;
|
|
93
80
|
}
|
|
94
|
-
static getCoinflowUrl({ walletPubkey, sessionKey, route, routePrefix, env, amount, transaction, blockchain = 'solana', webhookInfo, email, loaderBackground, handleHeightChange, bankAccountLinkRedirect, additionalWallets, nearDeposit, chargebackProtectionData, merchantCss, color, rent, lockDefaultToken, token, tokens, planCode, disableApplePay, disableGooglePay, customerInfo, settlementType, lockAmount, nativeSolToConvert, theme, usePermit, transactionSigner, authOnly, deviceId, jwtToken, origins, threeDsChallengePreference, supportEmail, }) {
|
|
81
|
+
static getCoinflowUrl({ walletPubkey, sessionKey, route, routePrefix, env, amount, transaction, blockchain = 'solana', webhookInfo, email, loaderBackground, handleHeightChange, bankAccountLinkRedirect, additionalWallets, nearDeposit, chargebackProtectionData, merchantCss, color, rent, lockDefaultToken, token, tokens, planCode, disableApplePay, disableGooglePay, customerInfo, settlementType, lockAmount, nativeSolToConvert, theme, usePermit, transactionSigner, authOnly, deviceId, jwtToken, origins, threeDsChallengePreference, supportEmail, destinationAuthKey, }) {
|
|
95
82
|
const prefix = routePrefix
|
|
96
83
|
? `/${routePrefix}/${blockchain}`
|
|
97
84
|
: `/${blockchain}`;
|
|
@@ -185,6 +172,8 @@ class CoinflowUtils {
|
|
|
185
172
|
url.searchParams.append('origins', LZString.compressToEncodedURIComponent(JSON.stringify(origins)));
|
|
186
173
|
if (threeDsChallengePreference)
|
|
187
174
|
url.searchParams.append('threeDsChallengePreference', threeDsChallengePreference);
|
|
175
|
+
if (destinationAuthKey)
|
|
176
|
+
url.searchParams.append('destinationAuthKey', destinationAuthKey);
|
|
188
177
|
return url.toString();
|
|
189
178
|
}
|
|
190
179
|
static getTransaction(props) {
|
|
@@ -261,57 +250,6 @@ class CoinflowUtils {
|
|
|
261
250
|
throw new Error('blockchain not supported!');
|
|
262
251
|
}
|
|
263
252
|
}
|
|
264
|
-
static async getWalletFromUserId({ userId, merchantId, env, }) {
|
|
265
|
-
return this.getWalletFromEmail({
|
|
266
|
-
email: userId,
|
|
267
|
-
merchantId,
|
|
268
|
-
env,
|
|
269
|
-
});
|
|
270
|
-
}
|
|
271
|
-
static async getWalletFromEmail({ email, merchantId, env, }) {
|
|
272
|
-
const buffer = new TextEncoder().encode(email);
|
|
273
|
-
const crypto = window.crypto.subtle;
|
|
274
|
-
const hash = await crypto.digest('SHA-256', buffer);
|
|
275
|
-
const seed = new Uint8Array(hash);
|
|
276
|
-
const keypair = Keypair.fromSeed(seed);
|
|
277
|
-
return {
|
|
278
|
-
publicKey: keypair.publicKey,
|
|
279
|
-
signMessage: (message) => Promise.resolve(sign.detached(message, keypair.secretKey)),
|
|
280
|
-
signTransaction: async (transaction) => {
|
|
281
|
-
if (transaction instanceof Transaction) {
|
|
282
|
-
transaction.sign(keypair);
|
|
283
|
-
return transaction;
|
|
284
|
-
}
|
|
285
|
-
else {
|
|
286
|
-
transaction.sign([keypair]);
|
|
287
|
-
return transaction;
|
|
288
|
-
}
|
|
289
|
-
},
|
|
290
|
-
sendTransaction: async (transaction) => {
|
|
291
|
-
if (transaction instanceof Transaction) {
|
|
292
|
-
transaction.sign(keypair);
|
|
293
|
-
}
|
|
294
|
-
else {
|
|
295
|
-
transaction.sign([keypair]);
|
|
296
|
-
}
|
|
297
|
-
const coinflowBaseUrl = this.getCoinflowApiUrl(env);
|
|
298
|
-
const options = {
|
|
299
|
-
method: 'POST',
|
|
300
|
-
headers: {
|
|
301
|
-
'content-type': 'application/json',
|
|
302
|
-
'x-coinflow-auth-wallet': keypair.publicKey.toString(),
|
|
303
|
-
'x-coinflow-auth-blockchain': 'solana',
|
|
304
|
-
},
|
|
305
|
-
body: JSON.stringify({
|
|
306
|
-
merchantId,
|
|
307
|
-
signedTransaction: base58?.encode(transaction.serialize()),
|
|
308
|
-
}),
|
|
309
|
-
};
|
|
310
|
-
const { signature } = await fetch(coinflowBaseUrl + '/api/utils/send-coinflow-tx', options).then(res => res.json());
|
|
311
|
-
return signature;
|
|
312
|
-
},
|
|
313
|
-
};
|
|
314
|
-
}
|
|
315
253
|
}
|
|
316
254
|
|
|
317
255
|
var IFrameMessageMethods;
|
|
@@ -321,20 +259,28 @@ var IFrameMessageMethods;
|
|
|
321
259
|
IFrameMessageMethods["SendTransaction"] = "sendTransaction";
|
|
322
260
|
IFrameMessageMethods["HeightChange"] = "heightChange";
|
|
323
261
|
IFrameMessageMethods["Success"] = "success";
|
|
324
|
-
IFrameMessageMethods["
|
|
262
|
+
IFrameMessageMethods["Loaded"] = "loaded";
|
|
325
263
|
})(IFrameMessageMethods || (IFrameMessageMethods = {}));
|
|
326
264
|
function getWalletPubkey(input) {
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
265
|
+
let wallet;
|
|
266
|
+
if ('signer' in input &&
|
|
267
|
+
typeof input.signer === 'object' &&
|
|
268
|
+
input.signer &&
|
|
269
|
+
'wallet' in input.signer)
|
|
270
|
+
wallet = input.signer.wallet;
|
|
271
|
+
else if ('wallet' in input && input.wallet)
|
|
272
|
+
wallet = input.wallet;
|
|
273
|
+
if (!wallet)
|
|
274
|
+
return;
|
|
275
|
+
if (typeof wallet === 'string')
|
|
276
|
+
return wallet;
|
|
277
|
+
if (typeof wallet === 'object') {
|
|
278
|
+
if ('publicKey' in wallet)
|
|
279
|
+
return wallet.publicKey ? wallet.publicKey.toString() : undefined;
|
|
280
|
+
if ('address' in wallet)
|
|
281
|
+
return wallet.address ? wallet.address : undefined;
|
|
282
|
+
if ('accountId' in wallet)
|
|
283
|
+
return wallet.accountId ? wallet.accountId : undefined;
|
|
338
284
|
}
|
|
339
285
|
return null;
|
|
340
286
|
}
|
|
@@ -370,32 +316,66 @@ function handleIFrameMessage(rawMessage, handlers) {
|
|
|
370
316
|
return;
|
|
371
317
|
handlers.onSuccess(walletCall.info);
|
|
372
318
|
return;
|
|
319
|
+
case IFrameMessageMethods.Loaded:
|
|
320
|
+
return;
|
|
373
321
|
}
|
|
374
322
|
console.warn(`Didn't expect to get here, handleIFrameMessage method:${method} is not one of ${Object.values(IFrameMessageMethods)}`);
|
|
375
323
|
}
|
|
376
324
|
function getHandlers(props) {
|
|
377
|
-
|
|
325
|
+
let chain;
|
|
326
|
+
let wallet;
|
|
327
|
+
if ('signer' in props &&
|
|
328
|
+
typeof props.signer === 'object' &&
|
|
329
|
+
props.signer &&
|
|
330
|
+
'blockchain' in props.signer &&
|
|
331
|
+
'wallet' in props.signer) {
|
|
332
|
+
chain = props.signer.blockchain;
|
|
333
|
+
wallet = props.signer.wallet;
|
|
334
|
+
}
|
|
335
|
+
else if ('blockchain' in props && props.blockchain) {
|
|
336
|
+
chain = props.blockchain;
|
|
337
|
+
wallet = props.wallet;
|
|
338
|
+
}
|
|
339
|
+
if (!chain) {
|
|
378
340
|
return {
|
|
379
341
|
handleSendTransaction: () => {
|
|
380
|
-
throw new Error('handleSendTransaction Not Implemented
|
|
342
|
+
throw new Error('handleSendTransaction Not Implemented');
|
|
381
343
|
},
|
|
382
344
|
handleSignMessage: () => {
|
|
383
|
-
throw new Error('handleSendTransaction Not Implemented
|
|
345
|
+
throw new Error('handleSendTransaction Not Implemented');
|
|
384
346
|
},
|
|
385
347
|
handleSignTransaction: () => {
|
|
386
|
-
throw new Error('handleSendTransaction Not Implemented
|
|
348
|
+
throw new Error('handleSendTransaction Not Implemented');
|
|
387
349
|
},
|
|
388
350
|
onSuccess: props.onSuccess,
|
|
389
351
|
};
|
|
390
352
|
}
|
|
391
|
-
return CoinflowUtils.byBlockchain(
|
|
392
|
-
solana: () => getSolanaWalletHandlers(
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
353
|
+
return CoinflowUtils.byBlockchain(chain, {
|
|
354
|
+
solana: () => getSolanaWalletHandlers({
|
|
355
|
+
wallet: wallet,
|
|
356
|
+
onSuccess: props.onSuccess,
|
|
357
|
+
}),
|
|
358
|
+
near: () => getNearWalletHandlers({
|
|
359
|
+
wallet: wallet,
|
|
360
|
+
onSuccess: props.onSuccess,
|
|
361
|
+
}),
|
|
362
|
+
eth: () => getEvmWalletHandlers({
|
|
363
|
+
wallet: wallet,
|
|
364
|
+
onSuccess: props.onSuccess,
|
|
365
|
+
}),
|
|
366
|
+
polygon: () => getEvmWalletHandlers({
|
|
367
|
+
wallet: wallet,
|
|
368
|
+
onSuccess: props.onSuccess,
|
|
369
|
+
}),
|
|
370
|
+
base: () => getEvmWalletHandlers({
|
|
371
|
+
wallet: wallet,
|
|
372
|
+
onSuccess: props.onSuccess,
|
|
373
|
+
}),
|
|
374
|
+
arbitrum: () => getEvmWalletHandlers({
|
|
375
|
+
wallet: wallet,
|
|
376
|
+
onSuccess: props.onSuccess,
|
|
377
|
+
}),
|
|
378
|
+
user: () => getSessionKeyHandlers(props),
|
|
399
379
|
})();
|
|
400
380
|
}
|
|
401
381
|
function getSolanaWalletHandlers({ wallet, onSuccess, }) {
|
|
@@ -443,11 +423,10 @@ function getSolanaTransaction(data) {
|
|
|
443
423
|
return vtx;
|
|
444
424
|
}
|
|
445
425
|
function getNearWalletHandlers({ wallet, onSuccess, }) {
|
|
446
|
-
const nearWallet = wallet;
|
|
447
426
|
return {
|
|
448
427
|
handleSendTransaction: async (transaction) => {
|
|
449
428
|
const action = JSON.parse(Buffer.from(transaction, 'base64').toString());
|
|
450
|
-
const executionOutcome = await
|
|
429
|
+
const executionOutcome = await wallet.signAndSendTransaction(action);
|
|
451
430
|
if (!executionOutcome)
|
|
452
431
|
throw new Error('Transaction did not send');
|
|
453
432
|
const { transaction: transactionResult } = executionOutcome;
|
|
@@ -457,20 +436,19 @@ function getNearWalletHandlers({ wallet, onSuccess, }) {
|
|
|
457
436
|
};
|
|
458
437
|
}
|
|
459
438
|
function getEvmWalletHandlers({ wallet, onSuccess, }) {
|
|
460
|
-
const evmWallet = wallet;
|
|
461
439
|
return {
|
|
462
440
|
handleSendTransaction: async (transaction) => {
|
|
463
441
|
const tx = JSON.parse(Buffer.from(transaction, 'base64').toString());
|
|
464
|
-
const { hash } = await
|
|
442
|
+
const { hash } = await wallet.sendTransaction(tx);
|
|
465
443
|
return hash;
|
|
466
444
|
},
|
|
467
445
|
handleSignMessage: async (message) => {
|
|
468
|
-
return
|
|
446
|
+
return wallet.signMessage(message);
|
|
469
447
|
},
|
|
470
448
|
onSuccess,
|
|
471
449
|
};
|
|
472
450
|
}
|
|
473
|
-
function
|
|
451
|
+
function getSessionKeyHandlers({ onSuccess, }) {
|
|
474
452
|
return {
|
|
475
453
|
handleSendTransaction: async () => {
|
|
476
454
|
return Promise.resolve('');
|
|
@@ -889,12 +867,22 @@ class CoinflowCardNumberInput {
|
|
|
889
867
|
.then(iframe => (this.iframe = iframe))
|
|
890
868
|
.catch(e => console.error(e));
|
|
891
869
|
}
|
|
892
|
-
|
|
870
|
+
initializeTokenEx() {
|
|
893
871
|
setTokenExScriptTag({
|
|
894
872
|
env: this.args.env,
|
|
895
873
|
setTokenExScriptLoaded: this.onScriptLoaded.bind(this),
|
|
896
874
|
});
|
|
897
875
|
}
|
|
876
|
+
reinitialize() {
|
|
877
|
+
this.iframe = undefined;
|
|
878
|
+
this.initializeTokenEx();
|
|
879
|
+
}
|
|
880
|
+
ngOnInit() {
|
|
881
|
+
this.initializeTokenEx();
|
|
882
|
+
}
|
|
883
|
+
ngOnDestroy() {
|
|
884
|
+
this.iframe = undefined;
|
|
885
|
+
}
|
|
898
886
|
tokenize() {
|
|
899
887
|
return this.iframe.tokenize();
|
|
900
888
|
}
|
|
@@ -931,12 +919,22 @@ class CoinflowCardNumberOnlyInput {
|
|
|
931
919
|
.then(iframe => (this.iframe = iframe))
|
|
932
920
|
.catch(e => console.error(e));
|
|
933
921
|
}
|
|
934
|
-
|
|
922
|
+
initializeTokenEx() {
|
|
935
923
|
setTokenExScriptTag({
|
|
936
924
|
env: this.args.env,
|
|
937
925
|
setTokenExScriptLoaded: this.onScriptLoaded.bind(this),
|
|
938
926
|
});
|
|
939
927
|
}
|
|
928
|
+
reinitialize() {
|
|
929
|
+
this.iframe = undefined;
|
|
930
|
+
this.initializeTokenEx();
|
|
931
|
+
}
|
|
932
|
+
ngOnInit() {
|
|
933
|
+
this.initializeTokenEx();
|
|
934
|
+
}
|
|
935
|
+
ngOnDestroy() {
|
|
936
|
+
this.iframe = undefined;
|
|
937
|
+
}
|
|
940
938
|
tokenize() {
|
|
941
939
|
return this.iframe.tokenize();
|
|
942
940
|
}
|
|
@@ -991,12 +989,22 @@ class CoinflowCvvOnlyInputComponent {
|
|
|
991
989
|
.then(iframe => (this.iframe = iframe))
|
|
992
990
|
.catch(e => console.error(e));
|
|
993
991
|
}
|
|
994
|
-
|
|
992
|
+
initializeTokenEx() {
|
|
995
993
|
setTokenExScriptTag({
|
|
996
994
|
env: this.args.env,
|
|
997
995
|
setTokenExScriptLoaded: this.onScriptLoaded.bind(this),
|
|
998
996
|
});
|
|
999
997
|
}
|
|
998
|
+
reinitialize() {
|
|
999
|
+
this.iframe = undefined;
|
|
1000
|
+
this.initializeTokenEx();
|
|
1001
|
+
}
|
|
1002
|
+
ngOnInit() {
|
|
1003
|
+
this.initializeTokenEx();
|
|
1004
|
+
}
|
|
1005
|
+
ngOnDestroy() {
|
|
1006
|
+
this.iframe = undefined;
|
|
1007
|
+
}
|
|
1000
1008
|
tokenize() {
|
|
1001
1009
|
return this.iframe.tokenize();
|
|
1002
1010
|
}
|