@bitgo-beta/sdk-coin-eth 4.4.1-beta.1872 → 4.4.1-beta.1874
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.
|
@@ -43,6 +43,20 @@ export declare class Erc7984Token extends Eth {
|
|
|
43
43
|
protected getTransactionBuilder(): TransactionBuilder;
|
|
44
44
|
/** @inheritDoc */
|
|
45
45
|
verifyTransaction(params: VerifyEthTransactionOptions): Promise<boolean>;
|
|
46
|
+
private isConsolidationTransaction;
|
|
47
|
+
private getWalletBaseAddress;
|
|
48
|
+
/**
|
|
49
|
+
* Verifies ERC-7984 forwarder consolidation (flush) transactions.
|
|
50
|
+
*
|
|
51
|
+
* Multisig shape:
|
|
52
|
+
* tx.to = wallet contract
|
|
53
|
+
* tx.data = sendMultiSig(forwarder, 0, callFromParent(token, 0, confidentialTransferNoProof(base, handle)), ...)
|
|
54
|
+
*
|
|
55
|
+
* TSS / direct shape:
|
|
56
|
+
* tx.to = forwarder contract
|
|
57
|
+
* tx.data = callFromParent(token, 0, confidentialTransferNoProof(base, handle))
|
|
58
|
+
*/
|
|
59
|
+
private verifyConfidentialConsolidation;
|
|
46
60
|
/**
|
|
47
61
|
* Verifies a confidential token transfer (SendERC7984) transaction.
|
|
48
62
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"erc7984Token.d.ts","sourceRoot":"","sources":["../../src/erc7984Token.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEtG,OAAO,EAAS,kBAAkB,EAA2B,MAAM,qBAAqB,CAAC;AACzF,OAAO,EACL,SAAS,EACT,2BAA2B,
|
|
1
|
+
{"version":3,"file":"erc7984Token.d.ts","sourceRoot":"","sources":["../../src/erc7984Token.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEtG,OAAO,EAAS,kBAAkB,EAA2B,MAAM,qBAAqB,CAAC;AACzF,OAAO,EACL,SAAS,EACT,2BAA2B,EAQ3B,2BAA2B,EAG5B,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,OAAO,EAAE,kBAAkB,EAAE,MAAM,OAAO,CAAC;AAE3C,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAE9B,qBAAa,YAAa,SAAQ,GAAG;IACnC,SAAgB,WAAW,EAAE,kBAAkB,CAAC;IAChD,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,cAAc,GAAG,mBAAmB,CAAC;IACxE,MAAM,CAAC,SAAS,EAAE,SAAS,CAGzB;gBAEU,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,kBAAkB;IAU7D,MAAM,CAAC,sBAAsB,CAAC,MAAM,EAAE,kBAAkB,GAAG,eAAe;IAI1E,MAAM,CAAC,uBAAuB,CAC5B,YAAY,GAAE,kBAAkB,EAG/B,GACA,oBAAoB,EAAE;IAUzB,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,oBAAoB,IAAI,MAAM,CAEjC;IAED,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED,QAAQ,IAAI,MAAM;IAIlB,WAAW,IAAI,MAAM;IAIrB,aAAa,IAAI,MAAM;IAIvB;;;OAGG;IACH,wBAAwB,IAAI,OAAO;IAInC;;;;;;OAMG;IACH,sBAAsB,IAAI,OAAO;IAIjC,kBAAkB;IAClB,WAAW,IAAI,OAAO;IAItB,kBAAkB;IAClB,eAAe,IAAI,YAAY;IAI/B,SAAS,CAAC,qBAAqB,IAAI,kBAAkB;IAIrD,kBAAkB;IACZ,iBAAiB,CAAC,MAAM,EAAE,2BAA2B,GAAG,OAAO,CAAC,OAAO,CAAC;IAU9E,OAAO,CAAC,0BAA0B;IAUlC,OAAO,CAAC,oBAAoB;IAS5B;;;;;;;;;;OAUG;YACW,+BAA+B;IA4E7C;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;YACW,0BAA0B;IAuIxC,OAAO,CAAC,MAAM,CAAC,uBAAuB;IAItC;;;;;;;;OAQG;YACW,4BAA4B;IAqH1C;;;;;;;;;;;;;;;;OAgBG;IACH,8BAA8B,IAAI,2BAA2B;CAG9D"}
|
package/dist/src/erc7984Token.js
CHANGED
|
@@ -90,8 +90,98 @@ class Erc7984Token extends eth_1.Eth {
|
|
|
90
90
|
if (params.txParams?.type === 'enabletoken') {
|
|
91
91
|
return this.verifyEnableTokenTransaction(params);
|
|
92
92
|
}
|
|
93
|
+
if (this.isConsolidationTransaction(params)) {
|
|
94
|
+
return this.verifyConfidentialConsolidation(params);
|
|
95
|
+
}
|
|
93
96
|
return this.verifyConfidentialTransfer(params);
|
|
94
97
|
}
|
|
98
|
+
isConsolidationTransaction(params) {
|
|
99
|
+
const { txParams, txPrebuild, verification } = params;
|
|
100
|
+
return !!(verification?.consolidationToBaseAddress ||
|
|
101
|
+
txPrebuild?.consolidateId ||
|
|
102
|
+
txParams?.type === 'consolidate' ||
|
|
103
|
+
txParams?.prebuildTx?.consolidateId);
|
|
104
|
+
}
|
|
105
|
+
getWalletBaseAddress(wallet) {
|
|
106
|
+
if (!wallet) {
|
|
107
|
+
return undefined;
|
|
108
|
+
}
|
|
109
|
+
const coinSpecific = typeof wallet.coinSpecific === 'function' ? wallet.coinSpecific() : wallet.coinSpecific;
|
|
110
|
+
const ethCoinSpecific = coinSpecific;
|
|
111
|
+
return ethCoinSpecific?.baseAddress ?? ethCoinSpecific?.rootAddress;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Verifies ERC-7984 forwarder consolidation (flush) transactions.
|
|
115
|
+
*
|
|
116
|
+
* Multisig shape:
|
|
117
|
+
* tx.to = wallet contract
|
|
118
|
+
* tx.data = sendMultiSig(forwarder, 0, callFromParent(token, 0, confidentialTransferNoProof(base, handle)), ...)
|
|
119
|
+
*
|
|
120
|
+
* TSS / direct shape:
|
|
121
|
+
* tx.to = forwarder contract
|
|
122
|
+
* tx.data = callFromParent(token, 0, confidentialTransferNoProof(base, handle))
|
|
123
|
+
*/
|
|
124
|
+
async verifyConfidentialConsolidation(params) {
|
|
125
|
+
const { txParams, txPrebuild, wallet } = params;
|
|
126
|
+
if (!txPrebuild?.txHex) {
|
|
127
|
+
if (!txPrebuild?.consolidateId && !txParams?.prebuildTx?.consolidateId) {
|
|
128
|
+
throw new Error('verifyConfidentialConsolidation: missing consolidateId');
|
|
129
|
+
}
|
|
130
|
+
return true;
|
|
131
|
+
}
|
|
132
|
+
const txBuilder = this.getTransactionBuilder();
|
|
133
|
+
txBuilder.from(txPrebuild.txHex);
|
|
134
|
+
const tx = await txBuilder.build();
|
|
135
|
+
const txJson = tx.toJson();
|
|
136
|
+
let tokenContractAddress;
|
|
137
|
+
let parentAddress;
|
|
138
|
+
let encryptedHandle;
|
|
139
|
+
let forwarderAddress;
|
|
140
|
+
try {
|
|
141
|
+
if (txJson.data.startsWith(abstract_eth_1.sendMultisigMethodId)) {
|
|
142
|
+
const decoded = (0, abstract_eth_1.decodeSendMultiSigFlushERC7984Data)(txJson.data);
|
|
143
|
+
forwarderAddress = decoded.forwarderAddress;
|
|
144
|
+
tokenContractAddress = decoded.tokenContractAddress;
|
|
145
|
+
parentAddress = decoded.parentAddress;
|
|
146
|
+
encryptedHandle = decoded.encryptedHandle;
|
|
147
|
+
}
|
|
148
|
+
else if (txJson.data.startsWith(abstract_eth_1.callFromParentMethodId)) {
|
|
149
|
+
const decoded = (0, abstract_eth_1.decodeFlushERC7984ForwarderTokenCalldata)(txJson.data);
|
|
150
|
+
tokenContractAddress = decoded.tokenContractAddress;
|
|
151
|
+
parentAddress = decoded.parentAddress;
|
|
152
|
+
encryptedHandle = decoded.encryptedHandle;
|
|
153
|
+
forwarderAddress = txJson.to;
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
throw new Error(`unexpected method ID ${txJson.data.slice(0, 10)}`);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
catch (e) {
|
|
160
|
+
throw new Error(`verifyConfidentialConsolidation: failed to decode consolidation calldata — ${e.message}`);
|
|
161
|
+
}
|
|
162
|
+
if (tokenContractAddress.toLowerCase() !== this.tokenContractAddress.toLowerCase()) {
|
|
163
|
+
throw new Error(`verifyConfidentialConsolidation: token contract address mismatch — ` +
|
|
164
|
+
`expected ${this.tokenContractAddress}, got ${tokenContractAddress}`);
|
|
165
|
+
}
|
|
166
|
+
const baseAddress = this.getWalletBaseAddress(wallet);
|
|
167
|
+
if (!baseAddress) {
|
|
168
|
+
throw new Error('verifyConfidentialConsolidation: unable to determine wallet base address');
|
|
169
|
+
}
|
|
170
|
+
if (parentAddress.toLowerCase() !== baseAddress.toLowerCase()) {
|
|
171
|
+
throw new Error(`verifyConfidentialConsolidation: parent address mismatch — expected ${baseAddress}, got ${parentAddress}`);
|
|
172
|
+
}
|
|
173
|
+
if (!encryptedHandle || encryptedHandle === '0x') {
|
|
174
|
+
throw new Error('verifyConfidentialConsolidation: encryptedHandle is missing or empty in transaction calldata');
|
|
175
|
+
}
|
|
176
|
+
const expectedForwarder = txPrebuild.recipients?.[0]?.address ?? txParams?.recipients?.[0]?.address;
|
|
177
|
+
if (forwarderAddress && expectedForwarder) {
|
|
178
|
+
if (forwarderAddress.toLowerCase() !== expectedForwarder.toLowerCase()) {
|
|
179
|
+
throw new Error(`verifyConfidentialConsolidation: forwarder address mismatch — ` +
|
|
180
|
+
`expected ${expectedForwarder}, got ${forwarderAddress}`);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return true;
|
|
184
|
+
}
|
|
95
185
|
/**
|
|
96
186
|
* Verifies a confidential token transfer (SendERC7984) transaction.
|
|
97
187
|
*
|
|
@@ -360,4 +450,4 @@ Erc7984Token.coinNames = {
|
|
|
360
450
|
Mainnet: 'eth',
|
|
361
451
|
Testnet: 'hteth',
|
|
362
452
|
};
|
|
363
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJjNzk4NFRva2VuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2VyYzc5ODRUb2tlbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFLQSxpREFBeUY7QUFDekYsMkRBV2tDO0FBRWxDLCtCQUE0QjtBQUM1QiwrQkFBMkM7QUFJM0MsTUFBYSxZQUFhLFNBQVEsU0FBRztJQVFuQyxZQUFZLEtBQWdCLEVBQUUsV0FBK0I7UUFDM0QsTUFBTSxXQUFXLEdBQUcsZUFBSyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQzNFLEtBQUssQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFDL0Isa0ZBQWtGO1FBQ2xGLDRHQUE0RztRQUM1RywyRUFBMkU7UUFDM0UsSUFBSSxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUM7SUFDdkMsQ0FBQztJQUVELE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxNQUEwQjtRQUN0RCxPQUFPLENBQUMsS0FBZ0IsRUFBRSxFQUFFLENBQUMsSUFBSSxZQUFZLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRCxNQUFNLENBQUMsdUJBQXVCLENBQzVCLGVBQXFDO1FBQ25DLEdBQUcsZ0JBQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQjtRQUN4QyxHQUFHLGdCQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0I7S0FDekM7UUFFRCxNQUFNLFdBQVcsR0FBMkIsRUFBRSxDQUFDO1FBQy9DLEtBQUssTUFBTSxLQUFLLElBQUksWUFBWSxFQUFFLENBQUM7WUFDakMsTUFBTSxnQkFBZ0IsR0FBRyxZQUFZLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDcEUsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFF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SUFDM0MsQ0FBQzs7QUF6YUgsb0NBMGFDO0FBdmFRLHNCQUFTLEdBQWM7SUFDNUIsT0FBTyxFQUFFLEtBQUs7SUFDZCxPQUFPLEVBQUUsT0FBTztDQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcHJldHRpZXJcbiAqL1xuaW1wb3J0IHsgQml0R29CYXNlLCBDb2luQ29uc3RydWN0b3IsIE1QQ0FsZ29yaXRobSwgTmFtZWRDb2luQ29uc3RydWN0b3IgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5cbmltcG9ydCB7IGNvaW5zLCBFcmM3OTg0VG9rZW5Db25maWcsIEV0aGVyZXVtTmV0d29yaywgdG9rZW5zIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQge1xuICBDb2luTmFtZXMsXG4gIERlY3J5cHRpb25EZWxlZ2F0aW9uQnVpbGRlcixcbiAgZGVjb2RlVG9rZW5BZGRyZXNzZXNGcm9tRGVsZWdhdGlvbkNhbGxkYXRhLFxuICBkZWNvZGVDb25maWRlbnRpYWxUcmFuc2ZlckRhdGEsXG4gIGRlY29kZURpcmVjdENvbmZpZGVudGlhbFRyYW5zZmVyQ2FsbGRhdGEsXG4gIHNlbmRNdWx0aXNpZ01ldGhvZElkLFxuICBjb25maWRlbnRpYWxUcmFuc2ZlcldpdGhQcm9vZk1ldGhvZElkLFxuICBWZXJpZnlFdGhUcmFuc2FjdGlvbk9wdGlvbnMsXG4gIGFjbE11bHRpY2FsbE1ldGhvZElkLFxuICBjYWxsRnJvbVBhcmVudE1ldGhvZElkLFxufSBmcm9tICdAYml0Z28tYmV0YS9hYnN0cmFjdC1ldGgnO1xuXG5pbXBvcnQgeyBFdGggfSBmcm9tICcuL2V0aCc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXIgfSBmcm9tICcuL2xpYic7XG5cbmV4cG9ydCB7IEVyYzc5ODRUb2tlbkNvbmZpZyB9O1xuXG5leHBvcnQgY2xhc3MgRXJjNzk4NFRva2VuIGV4dGVuZHMgRXRoIHtcbiAgcHVibGljIHJlYWRvbmx5IHRva2VuQ29uZmlnOiBFcmM3OTg0VG9rZW5Db25maWc7XG4gIHByb3RlY3RlZCByZWFkb25seSBzZW5kTWV0aG9kTmFtZTogJ3NlbmRNdWx0aVNpZycgfCAnc2VuZE11bHRpU2lnVG9rZW4nO1xuICBzdGF0aWMgY29pbk5hbWVzOiBDb2luTmFtZXMgPSB7XG4gICAgTWFpbm5ldDogJ2V0aCcsXG4gICAgVGVzdG5ldDogJ2h0ZXRoJyxcbiAgfTtcblxuICBjb25zdHJ1Y3RvcihiaXRnbzogQml0R29CYXNlLCB0b2tlbkNvbmZpZzogRXJjNzk4NFRva2VuQ29uZmlnKSB7XG4gICAgY29uc3Qgc3RhdGljc0NvaW4gPSBjb2lucy5nZXQoRXJjNzk4NFRva2VuLmNvaW5OYW1lc1t0b2tlbkNvbmZpZy5uZXR3b3JrXSk7XG4gICAgc3VwZXIoYml0Z28sIHN0YXRpY3NDb2luKTtcbiAgICB0aGlzLnRva2VuQ29uZmlnID0gdG9rZW5Db25maWc7XG4gICAgLy8gRVJDNzk4NCBjb25maWRlbnRpYWwgdHJhbnNmZXJzIHVzZSBzZW5kTXVsdGlTaWcgKG5vdCBzZW5kTXVsdGlTaWdUb2tlbikgYmVjYXVzZVxuICAgIC8vIHRoZSBjYWxsZGF0YSBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQgdG8gY2FycnkgY29uZmlkZW50aWFsVHJhbnNmZXIocmVjaXBpZW50LCBlbmNyeXB0ZWRIYW5kbGUsIGlucHV0UHJvb2YpLlxuICAgIC8vIHNlbmRNdWx0aVNpZ1Rva2VuIGhhcyBubyBkYXRhIHBhcmFtZXRlciBhbmQgY2Fubm90IGNhcnJ5IGlubmVyIGNhbGxkYXRhLlxuICAgIHRoaXMuc2VuZE1ldGhvZE5hbWUgPSAnc2VuZE11bHRpU2lnJztcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVUb2tlbkNvbnN0cnVjdG9yKGNvbmZpZzogRXJjNzk4NFRva2VuQ29uZmlnKTogQ29pbkNvbnN0cnVjdG9yIHtcbiAgICByZXR1cm4gKGJpdGdvOiBCaXRHb0Jhc2UpID0+IG5ldyBFcmM3OTg0VG9rZW4oYml0Z28sIGNvbmZpZyk7XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlVG9rZW5Db25zdHJ1Y3RvcnMoXG4gICAgdG9rZW5Db25maWdzOiBFcmM3OTg0VG9rZW5Db25maWdbXSA9IFtcbiAgICAgIC4uLnRva2Vucy5iaXRjb2luLmV0aC5jb25maWRlbnRpYWxUb2tlbnMsXG4gICAgICAuLi50b2tlbnMudGVzdG5ldC5ldGguY29uZmlkZW50aWFsVG9rZW5zLFxuICAgIF1cbiAgKTogTmFtZWRDb2luQ29uc3RydWN0b3JbXSB7XG4gICAgY29uc3QgdG9rZW5zQ3RvcnM6IE5hbWVkQ29pbkNvbnN0cnVjdG9yW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHRva2VuQ29uZmlncykge1xuICAgICAgY29uc3QgdG9rZW5Db25zdHJ1Y3RvciA9IEVyYzc5ODRUb2tlbi5jcmVhdGVUb2tlbkNvbnN0cnVjdG9yKHRva2VuKTtcbiAgICAgIHRva2Vuc0N0b3JzLnB1c2goeyBuYW1lOiB0b2tlbi50eXBlLCBjb2luQ29uc3RydWN0b3I6IHRva2VuQ29uc3RydWN0b3IgfSk7XG4gICAgICB0b2tlbnNDdG9ycy5wdXNoKHsgbmFtZTogdG9rZW4udG9rZW5Db250cmFjdEFkZHJlc3MsIGNvaW5Db25zdHJ1Y3RvcjogdG9rZW5Db25zdHJ1Y3RvciB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRva2Vuc0N0b3JzO1xuICB9XG5cbiAgZ2V0IHR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50b2tlbkNvbmZpZy50eXBlO1xuICB9XG5cbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50b2tlbkNvbmZpZy5uYW1lO1xuICB9XG5cbiAgZ2V0IGNvaW4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50b2tlbkNvbmZpZy5jb2luO1xuICB9XG5cbiAgZ2V0IG5ldHdvcmsoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50b2tlbkNvbmZpZy5uZXR3b3JrO1xuICB9XG5cbiAgZ2V0IHRva2VuQ29udHJhY3RBZGRyZXNzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5Db25maWcudG9rZW5Db250cmFjdEFkZHJlc3M7XG4gIH1cblxuICBnZXQgZGVjaW1hbFBsYWNlcygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnRva2VuQ29uZmlnLmRlY2ltYWxQbGFjZXM7XG4gIH1cblxuICBnZXRDaGFpbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRva2VuQ29uZmlnLnR5cGU7XG4gIH1cblxuICBnZXRGdWxsTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAnRVJDNzk4NCBDb25maWRlbnRpYWwgVG9rZW4nO1xuICB9XG5cbiAgZ2V0QmFzZUZhY3RvcigpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLnBvdygxMCwgdGhpcy50b2tlbkNvbmZpZy5kZWNpbWFsUGxhY2VzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGbGFnIGZvciBzZW5kaW5nIHZhbHVlIG9mIDAuXG4gICAqIEVSQy03OTg0IGNvbmZpZGVudGlhbCB0cmFuc2ZlcnMgYWx3YXlzIGNhcnJ5IGFuIGVuY3J5cHRlZCBhbW91bnQ7IHplcm8tdmFsdWUgc2VuZHMgYXJlIG5vdCBtZWFuaW5nZnVsLlxuICAgKi9cbiAgdmFsdWVsZXNzVHJhbnNmZXJBbGxvd2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGbGFnIGZvciBzZW5kaW5nIGRhdGEgYWxvbmcgd2l0aCB0cmFuc2FjdGlvbnMgdmlhIHRoZSBzdGFuZGFyZCB0b2tlbi1zZW5kIEFQSS5cbiAgICogUmV0dXJucyBmYWxzZSBiZWNhdXNlIEVSQy03OTg0IHNlbmRzIHVzZSBjb25maWRlbnRpYWxUcmFuc2ZlcigpIGNhbGxkYXRhIGJ1aWx0XG4gICAqIGJ5IFdQLCBub3QgYW4gYXJiaXRyYXJ5IGRhdGEgZmllbGQgb24gdGhlIHNlbmQgcGFyYW1zLlxuICAgKiBOb3RlOiB0aGlzIGRvZXMgbm90IHByZXZlbnQgY2FsbGRhdGEtYmFzZWQgZmxvd3MgbGlrZSBnZXREZWxlZ2F0aW9uQnVpbGRlcigpLFxuICAgKiB3aGljaCBieXBhc3MgdGhlIHRva2VuLXNlbmQgcGF0aCBlbnRpcmVseS5cbiAgICovXG4gIHRyYW5zYWN0aW9uRGF0YUFsbG93ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIHN1cHBvcnRzVHNzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIGdldE1QQ0FsZ29yaXRobSgpOiBNUENBbGdvcml0aG0ge1xuICAgIHJldHVybiAnZWNkc2EnO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFRyYW5zYWN0aW9uQnVpbGRlcigpOiBUcmFuc2FjdGlvbkJ1aWxkZXIge1xuICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyKGNvaW5zLmdldCh0aGlzLmdldEJhc2VDaGFpbigpKSk7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgYXN5bmMgdmVyaWZ5VHJhbnNhY3Rpb24ocGFyYW1zOiBWZXJpZnlFdGhUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAocGFyYW1zLnR4UGFyYW1zPy50eXBlID09PSAnZW5hYmxldG9rZW4nKSB7XG4gICAgICByZXR1cm4gdGhpcy52ZXJpZnlFbmFibGVUb2tlblRyYW5zYWN0aW9uKHBhcmFtcyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnZlcmlmeUNvbmZpZGVudGlhbFRyYW5zZmVyKHBhcmFtcyk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgYSBjb25maWRlbnRpYWwgdG9rZW4gdHJhbnNmZXIgKFNlbmRFUkM3OTg0KSB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogV2l0aCB0eEhleCDigJQgdHdvIG9uLWNoYWluIHNoYXBlcyBhcmUgc3VwcG9ydGVkOlxuICAgKlxuICAgKiAgIHNlbmRNdWx0aVNpZy13cmFwcGVkIChtdWx0aXNpZyAvIHNtYXJ0LWNvbnRyYWN0IHdhbGxldCk6XG4gICAqICAgICB0eC50byAgID0gd2FsbGV0IGNvbnRyYWN0XG4gICAqICAgICB0eC5kYXRhID0gc2VuZE11bHRpU2lnKHRva2VuQWRkciwgMCwgY29uZmlkZW50aWFsVHJhbnNmZXIocmVjaXBpZW50LCBoYW5kbGUsIHByb29mKSwgLi4uKVxuICAgKiAgICAgVG9rZW4gY29udHJhY3QgYWRkcmVzcyBpcyBkZWNvZGVkIGZyb20gdGhlIHNlbmRNdWx0aVNpZyBpbm5lciBjYWxsZGF0YS5cbiAgICpcbiAgICogICBEaXJlY3QgY2FsbCAoaG90IC8gVFNTIEVPQSB3YWxsZXQpOlxuICAgKiAgICAgdHgudG8gICA9IHRva2VuIGNvbnRyYWN0XG4gICAqICAgICB0eC5kYXRhID0gY29uZmlkZW50aWFsVHJhbnNmZXIocmVjaXBpZW50LCBoYW5kbGUsIHByb29mKVxuICAgKiAgICAgVG9rZW4gY29udHJhY3QgYWRkcmVzcyBpcyB0YWtlbiBmcm9tIHR4LnRvLlxuICAgKlxuICAgKiAgIEZvciBib3RoIHNoYXBlcyB0aGUgdmVyaWZpZXIgY2hlY2tzOlxuICAgKiAgICAgMS4gVG9rZW4gY29udHJhY3QgYWRkcmVzcyBtYXRjaGVzIHRoaXMgY29pbidzIHRva2VuQ29udHJhY3RBZGRyZXNzLlxuICAgKiAgICAgMi4gRGVjb2RlZCByZWNpcGllbnQgbWF0Y2hlcyB0eFBhcmFtcy5yZWNpcGllbnRzWzBdLmFkZHJlc3Mgb3IgYnVpbGRQYXJhbXMucmVjaXBpZW50c1swXS5hZGRyZXNzLlxuICAgKiAgICAgMy4gZW5jcnlwdGVkSGFuZGxlIGFuZCBpbnB1dFByb29mIGFyZSBzdHJ1Y3R1cmFsbHkgcHJlc2VudCAobm9uLWVtcHR5KS5cbiAgICogICAgIDQuIHR4UGFyYW1zLnJlY2lwaWVudHNbMF0uYW1vdW50IGlzIGEgcG9zaXRpdmUgaW50ZWdlciBhbmQgbWF0Y2hlcyBidWlsZFBhcmFtcyB3aGVuIGJvdGggcHJlc2VudC5cbiAgICpcbiAgICogV2l0aG91dCB0eEhleCAoZmlyc3Qtc2lnbmVyIC8gcHJlLXNpZ25pbmcgcGF0aCk6XG4gICAqICAxLiBSZXF1aXJlcyBleGFjdGx5IG9uZSByZWNpcGllbnQgaW4gdHhQYXJhbXMuXG4gICAqICAyLiBWYWxpZGF0ZXMgdHhQYXJhbXMucmVjaXBpZW50c1swXS5hZGRyZXNzIGlzIGEgdmFsaWQgRXRoZXJldW0gYWRkcmVzcy5cbiAgICogIDMuIFZhbGlkYXRlcyB0eFBhcmFtcy5yZWNpcGllbnRzWzBdLmFtb3VudCBpcyBhIHBvc2l0aXZlIGludGVnZXIuXG4gICAqICA0LiBDcm9zcy1jaGVja3MgYWRkcmVzcyBhbmQgYW1vdW50IGFnYWluc3QgYnVpbGRQYXJhbXMgd2hlbiB0aGUgc2VydmVyIGhhcyBzdG9yZWQgdGhlIGludGVudC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgdmVyaWZ5Q29uZmlkZW50aWFsVHJhbnNmZXIocGFyYW1zOiBWZXJpZnlFdGhUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB7IHR4UGFyYW1zLCB0eFByZWJ1aWxkIH0gPSBwYXJhbXM7XG5cbiAgICBpZiAoIXR4UHJlYnVpbGQ/LnR4SGV4KSB7XG4gICAgICAvLyBObyByYXcgdHggYXZhaWxhYmxlIChtdWx0aXNpZyBmaXJzdC1zaWduZXIgcGF0aCkuXG4gICAgICAvLyBWYWxpZGF0ZSBFUkM3OTg0LXNwZWNpZmljIGludmFyaWFudHMgZnJvbSB0eFBhcmFtcyBhbmQgYnVpbGRQYXJhbXMuXG4gICAgICBjb25zdCByZWNpcGllbnRzID0gdHhQYXJhbXM/LnJlY2lwaWVudHM7XG4gICAgICBpZiAoIXJlY2lwaWVudHMgfHwgcmVjaXBpZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd2ZXJpZnlDb25maWRlbnRpYWxUcmFuc2ZlcjogcmVjaXBpZW50cyBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGVudHJ5Jyk7XG4gICAgICB9XG4gICAgICBpZiAocmVjaXBpZW50cy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGB2ZXJpZnlDb25maWRlbnRpYWxUcmFuc2ZlcjogY29uZmlkZW50aWFsIHRyYW5zZmVycyBzdXBwb3J0IGV4YWN0bHkgMSByZWNpcGllbnQsIGdvdCAke3JlY2lwaWVudHMubGVuZ3RofWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlY2lwaWVudCA9IHJlY2lwaWVudHNbMF07XG4gICAgICBpZiAoIXJlY2lwaWVudC5hZGRyZXNzIHx8ICF0aGlzLmlzVmFsaWRBZGRyZXNzKHJlY2lwaWVudC5hZGRyZXNzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHZlcmlmeUNvbmZpZGVudGlhbFRyYW5zZmVyOiByZWNpcGllbnQgYWRkcmVzcyBpcyBtaXNzaW5nIG9yIGludmFsaWQ6ICR7cmVjaXBpZW50LmFkZHJlc3N9YCk7XG4gICAgICB9XG4gICAgICBjb25zdCBhbW91bnRTdHIgPSBTdHJpbmcocmVjaXBpZW50LmFtb3VudCk7XG4gICAgICBpZiAoIUVyYzc5ODRUb2tlbi5pc1Bvc2l0aXZlSW50ZWdlclN0cmluZyhhbW91bnRTdHIpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgdmVyaWZ5Q29uZmlkZW50aWFsVHJhbnNmZXI6IGFtb3VudCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBzdHJpbmcgaW4gYmFzZSB1bml0cywgZ290ICcke2Ftb3VudFN0cn0nYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgLy8gQ3Jvc3MtY2hlY2sgYWdhaW5zdCBidWlsZFBhcmFtcyB3aGVuIHRoZSBzZXJ2ZXIgaGFzIGFscmVhZHkgc3RvcmVkIHRoZSBpbnRlbnRcbiAgICAgIGNvbnN0IGJ1aWxkUGFyYW1zUmVjaXBpZW50ID0gdHhQcmVidWlsZD8uYnVpbGRQYXJhbXM/LnJlY2lwaWVudHM/LlswXTtcbiAgICAgIGlmIChidWlsZFBhcmFtc1JlY2lwaWVudD8uYWRkcmVzcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChyZWNpcGllbnQuYWRkcmVzcy50b0xvd2VyQ2FzZSgpICE9PSBidWlsZFBhcmFtc1JlY2lwaWVudC5hZGRyZXNzLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgdmVyaWZ5Q29uZmlkZW50aWFsVHJhbnNmZXI6IHJlY2lwaWVudCBhZGRyZXNzIG1pc21hdGNoIOKAlCBgICtcbiAgICAgICAgICAgICAgYHR4UGFyYW1zIGhhcyAnJHtyZWNpcGllbnQuYWRkcmVzc30nIGJ1dCBidWlsZFBhcmFtcyBoYXMgJyR7YnVpbGRQYXJhbXNSZWNpcGllbnQuYWRkcmVzc30nYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IGJ1aWxkUGFyYW1zQW1vdW50ID0gYnVpbGRQYXJhbXNSZWNpcGllbnQ/LmFtb3VudDtcbiAgICAgIGlmIChidWlsZFBhcmFtc0Ftb3VudCAhPT0gdW5kZWZpbmVkICYmIGJ1aWxkUGFyYW1zQW1vdW50ICE9PSBhbW91bnRTdHIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGB2ZXJpZnlDb25maWRlbnRpYWxUcmFuc2ZlcjogYW1vdW50IG1pc21hdGNoIOKAlCB0eFBhcmFtcyBoYXMgJyR7YW1vdW50U3RyfScgYnV0IGJ1aWxkUGFyYW1zIGhhcyAnJHtidWlsZFBhcmFtc0Ftb3VudH0nYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gUGFyc2UgYW5kIGRlY29kZSB0aGUgcmF3IHRyYW5zYWN0aW9uXG4gICAgY29uc3QgdHhCdWlsZGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkJ1aWxkZXIoKTtcbiAgICB0eEJ1aWxkZXIuZnJvbSh0eFByZWJ1aWxkLnR4SGV4KTtcbiAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuXG4gICAgbGV0IHRvQWRkcmVzczogc3RyaW5nO1xuICAgIGxldCB0b2tlbkNvbnRyYWN0QWRkcmVzczogc3RyaW5nO1xuICAgIGxldCBlbmNyeXB0ZWRIYW5kbGU6IHN0cmluZztcbiAgICBsZXQgaW5wdXRQcm9vZjogc3RyaW5nO1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmICh0eEpzb24uZGF0YS5zdGFydHNXaXRoKHNlbmRNdWx0aXNpZ01ldGhvZElkKSkge1xuICAgICAgICAvLyBzZW5kTXVsdGlTaWctd3JhcHBlZCBwYXRoOiBzbWFydC1jb250cmFjdCB3YWxsZXQgcmVsYXlzIHRoZSBjb25maWRlbnRpYWxUcmFuc2ZlciBjYWxsLlxuICAgICAgICAvLyBUb2tlbiBjb250cmFjdCBhZGRyZXNzIGlzIGVuY29kZWQgaW5zaWRlIHRoZSBzZW5kTXVsdGlTaWcgY2FsbGRhdGEuXG4gICAgICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVDb25maWRlbnRpYWxUcmFuc2ZlckRhdGEodHhKc29uLmRhdGEpO1xuICAgICAgICB0b0FkZHJlc3MgPSBkZWNvZGVkLnRvQWRkcmVzcztcbiAgICAgICAgdG9rZW5Db250cmFjdEFkZHJlc3MgPSBkZWNvZGVkLnRva2VuQ29udHJhY3RBZGRyZXNzO1xuICAgICAgICBlbmNyeXB0ZWRIYW5kbGUgPSBkZWNvZGVkLmVuY3J5cHRlZEhhbmRsZTtcbiAgICAgICAgaW5wdXRQcm9vZiA9IGRlY29kZWQuaW5wdXRQcm9vZjtcbiAgICAgIH0gZWxzZSBpZiAodHhKc29uLmRhdGEuc3RhcnRzV2l0aChjb25maWRlbnRpYWxUcmFuc2ZlcldpdGhQcm9vZk1ldGhvZElkKSkge1xuICAgICAgICAvLyBEaXJlY3QgY2FsbCBwYXRoOiBob3QvVFNTIEVPQSB3YWxsZXQgY2FsbHMgdGhlIHRva2VuIGNvbnRyYWN0IGRpcmVjdGx5LlxuICAgICAgICAvLyBUaGUgdHJhbnNhY3Rpb24ncyBgdG9gIGZpZWxkIGlzIHRoZSB0b2tlbiBjb250cmFjdCBhZGRyZXNzLlxuICAgICAgICBpZiAoIXR4SnNvbi50bykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZGlyZWN0IGNvbmZpZGVudGlhbFRyYW5zZmVyIGNhbGwgaXMgbWlzc2luZyB0cmFuc2FjdGlvbiB0byBhZGRyZXNzJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGVjb2RlZCA9IGRlY29kZURpcmVjdENvbmZpZGVudGlhbFRyYW5zZmVyQ2FsbGRhdGEodHhKc29uLmRhdGEpO1xuICAgICAgICB0b0FkZHJlc3MgPSBkZWNvZGVkLnRvQWRkcmVzcztcbiAgICAgICAgdG9rZW5Db250cmFjdEFkZHJlc3MgPSB0eEpzb24udG87XG4gICAgICAgIGVuY3J5cHRlZEhhbmRsZSA9IGRlY29kZWQuZW5jcnlwdGVkSGFuZGxlO1xuICAgICAgICBpbnB1dFByb29mID0gZGVjb2RlZC5pbnB1dFByb29mO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bmV4cGVjdGVkIG1ldGhvZCBJRCAke3R4SnNvbi5kYXRhLnNsaWNlKDAsIDEwKX1gKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGB2ZXJpZnlDb25maWRlbnRpYWxUcmFuc2ZlcjogZmFpbGVkIHRvIGRlY29kZSBjb25maWRlbnRpYWwgdHJhbnNmZXIgY2FsbGRhdGEg4oCUICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyAxLiBUb2tlbiBjb250cmFjdCBhZGRyZXNzIG11c3QgbWF0Y2ggdGhpcyBjb2luXG4gICAgaWYgKHRva2VuQ29udHJhY3RBZGRyZXNzLnRvTG93ZXJDYXNlKCkgIT09IHRoaXMudG9rZW5Db250cmFjdEFkZHJlc3MudG9Mb3dlckNhc2UoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgdmVyaWZ5Q29uZmlkZW50aWFsVHJhbnNmZXI6IHRva2VuIGNvbnRyYWN0IGFkZHJlc3MgbWlzbWF0Y2gg4oCUIGAgK1xuICAgICAgICAgIGBleHBlY3RlZCAke3RoaXMudG9rZW5Db250cmFjdEFkZHJlc3N9LCBnb3QgJHt0b2tlbkNvbnRyYWN0QWRkcmVzc31gXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIDIuIFJlY2lwaWVudCBhZGRyZXNzIG11c3QgbWF0Y2ggdHhQYXJhbXMucmVjaXBpZW50c1swXSBvciBidWlsZFBhcmFtcy5yZWNpcGllbnRzWzBdXG4gICAgY29uc3QgZXhwZWN0ZWRSZWNpcGllbnQgPSB0eFBhcmFtcz8ucmVjaXBpZW50cz8uWzBdPy5hZGRyZXNzID8/IHR4UHJlYnVpbGQuYnVpbGRQYXJhbXM/LnJlY2lwaWVudHM/LlswXT8uYWRkcmVzcztcbiAgICBpZiAoIWV4cGVjdGVkUmVjaXBpZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICd2ZXJpZnlDb25maWRlbnRpYWxUcmFuc2ZlcjogbWlzc2luZyBleHBlY3RlZCByZWNpcGllbnQgKHByb3ZpZGUgdHhQYXJhbXMucmVjaXBpZW50cyBvciB0eFByZWJ1aWxkLmJ1aWxkUGFyYW1zLnJlY2lwaWVudHMpJ1xuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHRvQWRkcmVzcy50b0xvd2VyQ2FzZSgpICE9PSBleHBlY3RlZFJlY2lwaWVudC50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGB2ZXJpZnlDb25maWRlbnRpYWxUcmFuc2ZlcjogcmVjaXBpZW50IGFkZHJlc3MgbWlzbWF0Y2gg4oCUIGAgKyBgZXhwZWN0ZWQgJHtleHBlY3RlZFJlY2lwaWVudH0sIGdvdCAke3RvQWRkcmVzc31gXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIDMuIGVuY3J5cHRlZEhhbmRsZSBtdXN0IGJlIGEgbm9uLXRyaXZpYWwgaGV4IHZhbHVlIChub3QgYmFyZSAnMHgnKVxuICAgIGlmICghZW5jcnlwdGVkSGFuZGxlIHx8IGVuY3J5cHRlZEhhbmRsZSA9PT0gJzB4Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd2ZXJpZnlDb25maWRlbnRpYWxUcmFuc2ZlcjogZW5jcnlwdGVkSGFuZGxlIGlzIG1pc3Npbmcgb3IgZW1wdHkgaW4gdHJhbnNhY3Rpb24gY2FsbGRhdGEnKTtcbiAgICB9XG5cbiAgICAvLyA0LiBpbnB1dFByb29mIG11c3QgYmUgYSBub24tdHJpdmlhbCBoZXggdmFsdWVcbiAgICBpZiAoIWlucHV0UHJvb2YgfHwgaW5wdXRQcm9vZiA9PT0gJzB4Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd2ZXJpZnlDb25maWRlbnRpYWxUcmFuc2ZlcjogaW5wdXRQcm9vZiBpcyBtaXNzaW5nIG9yIGVtcHR5IGluIHRyYW5zYWN0aW9uIGNhbGxkYXRhJyk7XG4gICAgfVxuXG4gICAgLy8gNS4gVmVyaWZ5IHBsYWludGV4dCBpbnRlbnQ6IHR4UGFyYW1zIGFtb3VudCBtdXN0IGJlIHZhbGlkIGFuZCBjb25zaXN0ZW50IHdpdGggYnVpbGRQYXJhbXNcbiAgICBjb25zdCByYXdUeFBhcmFtc0Ftb3VudCA9IHR4UGFyYW1zPy5yZWNpcGllbnRzPy5bMF0/LmFtb3VudDtcbiAgICBpZiAocmF3VHhQYXJhbXNBbW91bnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgdHhQYXJhbXNBbW91bnQgPSBTdHJpbmcocmF3VHhQYXJhbXNBbW91bnQpO1xuICAgICAgaWYgKCFFcmM3OTg0VG9rZW4uaXNQb3NpdGl2ZUludGVnZXJTdHJpbmcodHhQYXJhbXNBbW91bnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgdmVyaWZ5Q29uZmlkZW50aWFsVHJhbnNmZXI6IGFtb3VudCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBzdHJpbmcgaW4gYmFzZSB1bml0cywgZ290ICcke3R4UGFyYW1zQW1vdW50fSdgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBidWlsZFBhcmFtc0Ftb3VudCA9IHR4UHJlYnVpbGQuYnVpbGRQYXJhbXM/LnJlY2lwaWVudHM/LlswXT8uYW1vdW50O1xuICAgICAgaWYgKGJ1aWxkUGFyYW1zQW1vdW50ICE9PSB1bmRlZmluZWQgJiYgdHhQYXJhbXNBbW91bnQgIT09IGJ1aWxkUGFyYW1zQW1vdW50KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgdmVyaWZ5Q29uZmlkZW50aWFsVHJhbnNmZXI6IGFtb3VudCBtaXNtYXRjaCDigJQgdHhQYXJhbXMgaGFzICcke3R4UGFyYW1zQW1vdW50fScgYnV0IGJ1aWxkUGFyYW1zIGhhcyAnJHtidWlsZFBhcmFtc0Ftb3VudH0nYFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgaXNQb3NpdGl2ZUludGVnZXJTdHJpbmcodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAvXlxcZCskLy50ZXN0KHZhbHVlKSAmJiBCaWdJbnQodmFsdWUpID4gMG47XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgYSB0b2tlbiBlbmFibGVtZW50IHRyYW5zYWN0aW9uIGZvciBFUkMtNzk4NCBkZWNyeXB0aW9uIGRlbGVnYXRpb24uXG4gICAqXG4gICAqIFRTUyBwYXRoOiBkZWNvZGVzIHRoZSByYXcgdHggYW5kIHZlcmlmaWVzIGl0IGNhbGxzIHRoZSBBQ0wgY29udHJhY3Qgd2l0aFxuICAgKiBjYWxsZGF0YSB0aGF0IGNvdmVycyBhbGwgcmVxdWVzdGVkIHRva2VuIGNvbnRyYWN0IGFkZHJlc3Nlcy5cbiAgICpcbiAgICogTXVsdGlzaWcgcGF0aDogdmVyaWZpZXMgdGhlIGJ1aWxkUGFyYW1zIHJlY2lwaWVudHMgY2FycnkgdGhlIGNvcnJlY3QgdG9rZW5OYW1lc1xuICAgKiBhbmQgemVybyBhbW91bnRzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB2ZXJpZnlFbmFibGVUb2tlblRyYW5zYWN0aW9uKHBhcmFtczogVmVyaWZ5RXRoVHJhbnNhY3Rpb25PcHRpb25zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgeyB0eFBhcmFtcywgdHhQcmVidWlsZCwgd2FsbGV0VHlwZSB9ID0gcGFyYW1zO1xuXG4gICAgaWYgKHdhbGxldFR5cGUgPT09ICd0c3MnKSB7XG4gICAgICAvLyBUU1MgcGF0aDogZnVsbCByYXctdHggZGVjb2RlXG4gICAgICBjb25zdCBlbmFibGVUb2tlbnMgPSB0eFBhcmFtcy5lbmFibGVUb2tlbnM7XG4gICAgICBpZiAoIWVuYWJsZVRva2VucyB8fCBlbmFibGVUb2tlbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndmVyaWZ5RW5hYmxlVG9rZW5UcmFuc2FjdGlvbjogZW5hYmxlVG9rZW5zIG11c3QgYmUgbm9uLWVtcHR5IGZvciBUU1MgcGF0aCcpO1xuICAgICAgfVxuICAgICAgaWYgKCF0eFByZWJ1aWxkLnR4SGV4KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndmVyaWZ5RW5hYmxlVG9rZW5UcmFuc2FjdGlvbjogbWlzc2luZyB0eEhleCBpbiB0eFByZWJ1aWxkJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlc29sdmUgcmVxdWVzdGVkIHRva2VuIG5hbWVzIOKGkiBjb250cmFjdCBhZGRyZXNzZXNcbiAgICAgIGNvbnN0IHJlcXVlc3RlZEFkZHJlc3NlcyA9IGVuYWJsZVRva2Vucy5tYXAoKHQpID0+IHtcbiAgICAgICAgY29uc3QgdG9rZW5Db2luID0gdGhpcy5iaXRnby5jb2luKHQubmFtZSkgYXMgRXJjNzk4NFRva2VuO1xuICAgICAgICByZXR1cm4gdG9rZW5Db2luLnRva2VuQ29udHJhY3RBZGRyZXNzLnRvTG93ZXJDYXNlKCk7XG4gICAgICB9KTtcblxuICAgICAgLy8gUGFyc2UgdGhlIHJhdyB0cmFuc2FjdGlvblxuICAgICAgY29uc3QgdHhCdWlsZGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5mcm9tKHR4UHJlYnVpbGQudHhIZXgpO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuXG4gICAgICAvLyBWZXJpZnkgdHJhbnNhY3Rpb24gdGFyZ2V0cyB0aGUgY29ycmVjdCBjb250cmFjdCBiYXNlZCBvbiBjYWxsZGF0YSBzaGFwZVxuICAgICAgY29uc3QgbmV0d29yayA9IHRoaXMuZ2V0TmV0d29yaygpIGFzIEV0aGVyZXVtTmV0d29yaztcbiAgICAgIGNvbnN0IGFjbENvbnRyYWN0QWRkcmVzcyA9IG5ldHdvcms/LnphbWFBY2xDb250cmFjdEFkZHJlc3M7XG4gICAgICBpZiAoIWFjbENvbnRyYWN0QWRkcmVzcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ZlcmlmeUVuYWJsZVRva2VuVHJhbnNhY3Rpb246IHphbWFBY2xDb250cmFjdEFkZHJlc3Mgbm90IGNvbmZpZ3VyZWQgZm9yIHRoaXMgbmV0d29yaycpO1xuICAgICAgfVxuICAgICAgaWYgKCF0eEpzb24udG8pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd2ZXJpZnlFbmFibGVUb2tlblRyYW5zYWN0aW9uOiB0cmFuc2FjdGlvbiBpcyBtaXNzaW5nIHJlY2lwaWVudCBhZGRyZXNzJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIEluc3BlY3QgY2FsbGRhdGEgbWV0aG9kIElEIHRvIGRpc3Rpbmd1aXNoIHJvb3Qgd2FsbGV0IGZyb20gZm9yd2FyZGVyIHdhbGxldDpcbiAgICAgIC8vICAgYWNsTXVsdGljYWxsTWV0aG9kSWQgICDihpIgcm9vdCB3YWxsZXQ6IHRvID0gQUNMIGNvbnRyYWN0IGRpcmVjdGx5XG4gICAgICAvLyAgIGNhbGxGcm9tUGFyZW50TWV0aG9kSWQg4oaSIGZvcndhcmRlciB3YWxsZXQ6IHRvID0gZm9yd2FyZGVyLCBBQ0wgYWRkcmVzcyBpcyBpbnNpZGUgY2FsbGRhdGFcbiAgICAgIGNvbnN0IGNhbGxkYXRhTWV0aG9kSWQgPSB0eEpzb24uZGF0YS5zbGljZSgwLCAxMCk7XG4gICAgICBpZiAoY2FsbGRhdGFNZXRob2RJZCA9PT0gYWNsTXVsdGljYWxsTWV0aG9kSWQpIHtcbiAgICAgICAgLy8gUm9vdCB3YWxsZXQgKGJhc2UgYWRkcmVzcyk6IHR4IGNhbGxzIHRoZSBBQ0wgY29udHJhY3QgZGlyZWN0bHlcbiAgICAgICAgaWYgKHR4SnNvbi50by50b0xvd2VyQ2FzZSgpICE9PSBhY2xDb250cmFjdEFkZHJlc3MudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGB2ZXJpZnlFbmFibGVUb2tlblRyYW5zYWN0aW9uOiB0cmFuc2FjdGlvbiB0YXJnZXQgJHt0eEpzb24udG99IGRvZXMgbm90IG1hdGNoIEFDTCBjb250cmFjdCAke2FjbENvbnRyYWN0QWRkcmVzc31gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjYWxsZGF0YU1ldGhvZElkID09PSBjYWxsRnJvbVBhcmVudE1ldGhvZElkKSB7XG4gICAgICAgIC8vIEZvcndhcmRlciB3YWxsZXQ6IHR4IGNhbGxzIHRoZSBmb3J3YXJkZXIsIHdoaWNoIGNhbGxzIHRoZSBBQ0wgdmlhIGNhbGxGcm9tUGFyZW50LlxuICAgICAgICAvLyBUaGUgZm9yd2FyZGVyIGFkZHJlc3MgaXMgd2FsbGV0LXNwZWNpZmljIGFuZCBjYW5ub3QgYmUgc3RhdGljYWxseSB2ZXJpZmllZCBoZXJlO1xuICAgICAgICAvLyB0b2tlbiBhZGRyZXNzIGNvcnJlY3RuZXNzIGlzIHN0aWxsIHZlcmlmaWVkIGJlbG93IHZpYSBjYWxsZGF0YSBkZWNvZGluZy5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgdmVyaWZ5RW5hYmxlVG9rZW5UcmFuc2FjdGlvbjogdW5yZWNvZ25pc2VkIGNhbGxkYXRhIG1ldGhvZCBJRCAke2NhbGxkYXRhTWV0aG9kSWR9OyBleHBlY3RlZCBtdWx0aWNhbGwgb3IgY2FsbEZyb21QYXJlbnRgXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFZlcmlmeSB2YWx1ZSBpcyAwXG4gICAgICBpZiAodHhKc29uLnZhbHVlICE9PSAnMCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB2ZXJpZnlFbmFibGVUb2tlblRyYW5zYWN0aW9uOiBleHBlY3RlZCB0cmFuc2FjdGlvbiB2YWx1ZSAwIGJ1dCBnb3QgJHt0eEpzb24udmFsdWV9YCk7XG4gICAgICB9XG5cbiAgICAgIC8vIERlY29kZSB0b2tlbiBhZGRyZXNzZXMgZnJvbSBjYWxsZGF0YSBhbmQgdmVyaWZ5IGFsbCByZXF1ZXN0ZWQgdG9rZW5zIGFyZSBwcmVzZW50XG4gICAgICBjb25zdCBkZWNvZGVkQWRkcmVzc2VzID0gZGVjb2RlVG9rZW5BZGRyZXNzZXNGcm9tRGVsZWdhdGlvbkNhbGxkYXRhKHR4SnNvbi5kYXRhKTtcbiAgICAgIGZvciAoY29uc3QgcmVxdWVzdGVkIG9mIHJlcXVlc3RlZEFkZHJlc3Nlcykge1xuICAgICAgICBpZiAoIWRlY29kZWRBZGRyZXNzZXMuaW5jbHVkZXMocmVxdWVzdGVkKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGB2ZXJpZnlFbmFibGVUb2tlblRyYW5zYWN0aW9uOiByZXF1ZXN0ZWQgdG9rZW4gJHtyZXF1ZXN0ZWR9IG5vdCBmb3VuZCBpbiBkZWxlZ2F0aW9uIGNhbGxkYXRhYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE11bHRpc2lnIHBhdGg6IGJ1aWxkUGFyYW1zLWxldmVsIGNoZWNrXG4gICAgICBjb25zdCByZWNpcGllbnRzID0gdHhQcmVidWlsZC5idWlsZFBhcmFtcz8ucmVjaXBpZW50cyBhc1xuICAgICAgICB8IEFycmF5PHsgdG9rZW5OYW1lPzogc3RyaW5nOyBhbW91bnQ/OiBzdHJpbmcgfT5cbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoIXJlY2lwaWVudHMgfHwgcmVjaXBpZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd2ZXJpZnlFbmFibGVUb2tlblRyYW5zYWN0aW9uOiBtaXNzaW5nIGJ1aWxkUGFyYW1zLnJlY2lwaWVudHMgZm9yIG11bHRpc2lnIHBhdGgnKTtcbiAgICAgIH1cblxuICAgICAgLy8gRGV0ZXJtaW5lIHJlcXVlc3RlZCB0b2tlbiBuYW1lcyBmcm9tIHR4UGFyYW1zXG4gICAgICBjb25zdCByZXF1ZXN0ZWRUb2tlbk5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgaWYgKHR4UGFyYW1zLmVuYWJsZVRva2VucyAmJiB0eFBhcmFtcy5lbmFibGVUb2tlbnMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXF1ZXN0ZWRUb2tlbk5hbWVzLnB1c2goLi4udHhQYXJhbXMuZW5hYmxlVG9rZW5zLm1hcCgodCkgPT4gdC5uYW1lKSk7XG4gICAgICB9IGVsc2UgaWYgKHR4UGFyYW1zLnJlY2lwaWVudHMgJiYgdHhQYXJhbXMucmVjaXBpZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlcXVlc3RlZFRva2VuTmFtZXMucHVzaCguLi50eFBhcmFtcy5yZWNpcGllbnRzLm1hcCgocjogYW55KSA9PiByLnRva2VuTmFtZSkuZmlsdGVyKEJvb2xlYW4pKTtcbiAgICAgIH1cblxuICAgICAgLy8gVmVyaWZ5IGFsbCByZWNpcGllbnRzIGhhdmUgdG9rZW5OYW1lIGFuZCBhbW91bnQgPSAnMCdcbiAgICAgIGZvciAoY29uc3QgcmVjaXBpZW50IG9mIHJlY2lwaWVudHMpIHtcbiAgICAgICAgaWYgKCFyZWNpcGllbnQudG9rZW5OYW1lKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd2ZXJpZnlFbmFibGVUb2tlblRyYW5zYWN0aW9uOiByZWNpcGllbnQgaXMgbWlzc2luZyB0b2tlbk5hbWUgaW4gYnVpbGRQYXJhbXMnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVjaXBpZW50LmFtb3VudCAhPT0gJzAnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYHZlcmlmeUVuYWJsZVRva2VuVHJhbnNhY3Rpb246IGV4cGVjdGVkIGFtb3VudCAwIGZvciB0b2tlbiBlbmFibGVtZW50IGJ1dCBnb3QgJHtyZWNpcGllbnQuYW1vdW50fWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFZlcmlmeSByZXF1ZXN0ZWQgdG9rZW4gbmFtZXMgYXJlIHByZXNlbnQgaW4gcmVjaXBpZW50c1xuICAgICAgaWYgKHJlcXVlc3RlZFRva2VuTmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCByZWNpcGllbnRUb2tlbk5hbWVzID0gcmVjaXBpZW50cy5tYXAoKHIpID0+IHIudG9rZW5OYW1lKTtcbiAgICAgICAgZm9yIChjb25zdCByZXF1ZXN0ZWQgb2YgcmVxdWVzdGVkVG9rZW5OYW1lcykge1xuICAgICAgICAgIGlmICghcmVjaXBpZW50VG9rZW5OYW1lcy5pbmNsdWRlcyhyZXF1ZXN0ZWQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGB2ZXJpZnlFbmFibGVUb2tlblRyYW5zYWN0aW9uOiByZXF1ZXN0ZWQgdG9rZW4gJHtyZXF1ZXN0ZWR9IG5vdCBmb3VuZCBpbiBidWlsZFBhcmFtcyByZWNpcGllbnRzYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBEZWNyeXB0aW9uRGVsZWdhdGlvbkJ1aWxkZXIgZm9yIGNvbnN0cnVjdGluZyBaYW1hIEFDTCBkZWNyeXB0aW9uXG4gICAqIGRlbGVnYXRpb24gdHJhbnNhY3Rpb25zLlxuICAgKlxuICAgKiBUaGUgYnVpbGRlciBwcm9kdWNlcyBhIERlY3J5cHRpb25EZWxlZ2F0aW9uVHhSZXF1ZXN0IHt0bywgZGF0YSwgdmFsdWV9IHRoYXQgaXNcbiAgICogd2FsbGV0LXR5cGUtYWdub3N0aWMg4oCUIFdQIHJvdXRlcyBpdCB0byB0aGUgY29ycmVjdCBzaWduaW5nIHBhdGg6XG4gICAqIC0gTVBDOiBzdWJtaXQgYXMgYSByYXcgVFNTIHRyYW5zYWN0aW9uXG4gICAqIC0gTXVsdGlzaWc6IHdyYXAgaW4gc2VuZE11bHRpU2lnKHdhbGxldENvbnRyYWN0LCB0bywgMCwgZGF0YSwgLi4uKVxuICAgKlxuICAgKiBFeGFtcGxlOlxuICAgKiAgIGNvbnN0IHJlcSA9IGNvaW4uZ2V0RGVjcnlwdGlvbkRlbGVnYXRpb25CdWlsZGVyKCkuYnVpbGQoe1xuICAgKiAgICAgYWNsQ29udHJhY3RBZGRyZXNzOiAnMHhmMEZmLi4uJyxcbiAgICogICAgIGRlbGVnYXRlQWRkcmVzczogICAgZW50ZXJwcmlzZVZpZXdpbmdLZXksXG4gICAqICAgICB0b2tlbkNvbnRyYWN0QWRkcmVzc2VzOiBbdG9rZW5BZGRyZXNzXSxcbiAgICogICAgIGV4cGlyeVRpbWVzdGFtcDogICAgTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCkgKyAzNjUgKiA4NjQwMCxcbiAgICogICB9KTtcbiAgICovXG4gIGdldERlY3J5cHRpb25EZWxlZ2F0aW9uQnVpbGRlcigpOiBEZWNyeXB0aW9uRGVsZWdhdGlvbkJ1aWxkZXIge1xuICAgIHJldHVybiBuZXcgRGVjcnlwdGlvbkRlbGVnYXRpb25CdWlsZGVyKCk7XG4gIH1cbn1cbiJdfQ==
|
|
453
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJjNzk4NFRva2VuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2VyYzc5ODRUb2tlbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFLQSxpREFBeUY7QUFDekYsMkRBYWtDO0FBRWxDLCtCQUE0QjtBQUM1QiwrQkFBMkM7QUFJM0MsTUFBYSxZQUFhLFNBQVEsU0FBRztJQVFuQyxZQUFZLEtBQWdCLEVBQUUsV0FBK0I7UUFDM0QsTUFBTSxXQUFXLEdBQUcsZUFBSyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQzNFLEtBQUssQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFDL0Isa0ZBQWtGO1FBQ2xGLDRHQUE0RztRQUM1RywyRUFBMkU7UUFDM0UsSUFBSSxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUM7SUFDdkMsQ0FBQztJQUVELE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxNQUEwQjtRQUN0RCxPQUFPLENBQUMsS0FBZ0IsRUFBRSxFQUFFLENBQUMsSUFBSSxZQUFZLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRCxNQUFNLENBQUMsdUJBQXVCLENBQzVCLGVBQXFDO1FBQ25DLEdBQUcsZ0JBQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQjtRQUN4QyxHQUFHLGdCQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0I7S0FDekM7UUFFRCxNQUFNLFdBQVcsR0FBMkIsRUFBRSxDQUFDO1FBQy9DLEtBQUssTUFBTSxLQUFLLElBQUksWUFBWSxFQUFFLENBQUM7WUFDakMsTUFBTSxnQkFBZ0IsR0FBRyxZQUFZLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDcEUsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFF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LEtBQUssTUFBTSxTQUFTLElBQUksbUJBQW1CLEVBQUUsQ0FBQztvQkFDNUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO3dCQUM3QyxNQUFNLElBQUksS0FBSyxDQUNiLGlEQUFpRCxTQUFTLHNDQUFzQyxDQUNqRyxDQUFDO29CQUNKLENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7WUFFRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7T0FnQkc7SUFDSCw4QkFBOEI7UUFDNUIsT0FBTyxJQUFJLDBDQUEyQixFQUFFLENBQUM7SUFDM0MsQ0FBQzs7QUF0aEJILG9DQXVoQkM7QUFwaEJRLHNCQUFTLEdBQWM7SUFDNUIsT0FBTyxFQUFFLEtBQUs7SUFDZCxPQUFPLEVBQUUsT0FBTztDQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcHJldHRpZXJcbiAqL1xuaW1wb3J0IHsgQml0R29CYXNlLCBDb2luQ29uc3RydWN0b3IsIE1QQ0FsZ29yaXRobSwgTmFtZWRDb2luQ29uc3RydWN0b3IgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5cbmltcG9ydCB7IGNvaW5zLCBFcmM3OTg0VG9rZW5Db25maWcsIEV0aGVyZXVtTmV0d29yaywgdG9rZW5zIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQge1xuICBDb2luTmFtZXMsXG4gIERlY3J5cHRpb25EZWxlZ2F0aW9uQnVpbGRlcixcbiAgZGVjb2RlVG9rZW5BZGRyZXNzZXNGcm9tRGVsZWdhdGlvbkNhbGxkYXRhLFxuICBkZWNvZGVDb25maWRlbnRpYWxUcmFuc2ZlckRhdGEsXG4gIGRlY29kZURpcmVjdENvbmZpZGVudGlhbFRyYW5zZmVyQ2FsbGRhdGEsXG4gIGRlY29kZUZsdXNoRVJDNzk4NEZvcndhcmRlclRva2VuQ2FsbGRhdGEsXG4gIGRlY29kZVNlbmRNdWx0aVNpZ0ZsdXNoRVJDNzk4NERhdGEsXG4gIHNlbmRNdWx0aXNpZ01ldGhvZElkLFxuICBjb25maWRlbnRpYWxUcmFuc2ZlcldpdGhQcm9vZk1ldGhvZElkLFxuICBWZXJpZnlFdGhUcmFuc2FjdGlvbk9wdGlvbnMsXG4gIGFjbE11bHRpY2FsbE1ldGhvZElkLFxuICBjYWxsRnJvbVBhcmVudE1ldGhvZElkLFxufSBmcm9tICdAYml0Z28tYmV0YS9hYnN0cmFjdC1ldGgnO1xuXG5pbXBvcnQgeyBFdGggfSBmcm9tICcuL2V0aCc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXIgfSBmcm9tICcuL2xpYic7XG5cbmV4cG9ydCB7IEVyYzc5ODRUb2tlbkNvbmZpZyB9O1xuXG5leHBvcnQgY2xhc3MgRXJjNzk4NFRva2VuIGV4dGVuZHMgRXRoIHtcbiAgcHVibGljIHJlYWRvbmx5IHRva2VuQ29uZmlnOiBFcmM3OTg0VG9rZW5Db25maWc7XG4gIHByb3RlY3RlZCByZWFkb25seSBzZW5kTWV0aG9kTmFtZTogJ3NlbmRNdWx0aVNpZycgfCAnc2VuZE11bHRpU2lnVG9rZW4nO1xuICBzdGF0aWMgY29pbk5hbWVzOiBDb2luTmFtZXMgPSB7XG4gICAgTWFpbm5ldDogJ2V0aCcsXG4gICAgVGVzdG5ldDogJ2h0ZXRoJyxcbiAgfTtcblxuICBjb25zdHJ1Y3RvcihiaXRnbzogQml0R29CYXNlLCB0b2tlbkNvbmZpZzogRXJjNzk4NFRva2VuQ29uZmlnKSB7XG4gICAgY29uc3Qgc3RhdGljc0NvaW4gPSBjb2lucy5nZXQoRXJjNzk4NFRva2VuLmNvaW5OYW1lc1t0b2tlbkNvbmZpZy5uZXR3b3JrXSk7XG4gICAgc3VwZXIoYml0Z28sIHN0YXRpY3NDb2luKTtcbiAgICB0aGlzLnRva2VuQ29uZmlnID0gdG9rZW5Db25maWc7XG4gICAgLy8gRVJDNzk4NCBjb25maWRlbnRpYWwgdHJhbnNmZXJzIHVzZSBzZW5kTXVsdGlTaWcgKG5vdCBzZW5kTXVsdGlTaWdUb2tlbikgYmVjYXVzZVxuICAgIC8vIHRoZSBjYWxsZGF0YSBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQgdG8gY2FycnkgY29uZmlkZW50aWFsVHJhbnNmZXIocmVjaXBpZW50LCBlbmNyeXB0ZWRIYW5kbGUsIGlucHV0UHJvb2YpLlxuICAgIC8vIHNlbmRNdWx0aVNpZ1Rva2VuIGhhcyBubyBkYXRhIHBhcmFtZXRlciBhbmQgY2Fubm90IGNhcnJ5IGlubmVyIGNhbGxkYXRhLlxuICAgIHRoaXMuc2VuZE1ldGhvZE5hbWUgPSAnc2VuZE11bHRpU2lnJztcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVUb2tlbkNvbnN0cnVjdG9yKGNvbmZpZzogRXJjNzk4NFRva2VuQ29uZmlnKTogQ29pbkNvbnN0cnVjdG9yIHtcbiAgICByZXR1cm4gKGJpdGdvOiBCaXRHb0Jhc2UpID0+IG5ldyBFcmM3OTg0VG9rZW4oYml0Z28sIGNvbmZpZyk7XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlVG9rZW5Db25zdHJ1Y3RvcnMoXG4gICAgdG9rZW5Db25maWdzOiBFcmM3OTg0VG9rZW5Db25maWdbXSA9IFtcbiAgICAgIC4uLnRva2Vucy5iaXRjb2luLmV0aC5jb25maWRlbnRpYWxUb2tlbnMsXG4gICAgICAuLi50b2tlbnMudGVzdG5ldC5ldGguY29uZmlkZW50aWFsVG9rZW5zLFxuICAgIF1cbiAgKTogTmFtZWRDb2luQ29uc3RydWN0b3JbXSB7XG4gICAgY29uc3QgdG9rZW5zQ3RvcnM6IE5hbWVkQ29pbkNvbnN0cnVjdG9yW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHRva2VuQ29uZmlncykge1xuICAgICAgY29uc3QgdG9rZW5Db25zdHJ1Y3RvciA9IEVyYzc5ODRUb2tlbi5jcmVhdGVUb2tlbkNvbnN0cnVjdG9yKHRva2VuKTtcbiAgICAgIHRva2Vuc0N0b3JzLnB1c2goeyBuYW1lOiB0b2tlbi50eXBlLCBjb2luQ29uc3RydWN0b3I6IHRva2VuQ29uc3RydWN0b3IgfSk7XG4gICAgICB0b2tlbnNDdG9ycy5wdXNoKHsgbmFtZTogdG9rZW4udG9rZW5Db250cmFjdEFkZHJlc3MsIGNvaW5Db25zdHJ1Y3RvcjogdG9rZW5Db25zdHJ1Y3RvciB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRva2Vuc0N0b3JzO1xuICB9XG5cbiAgZ2V0IHR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50b2tlbkNvbmZpZy50eXBlO1xuICB9XG5cbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50b2tlbkNvbmZpZy5uYW1lO1xuICB9XG5cbiAgZ2V0IGNvaW4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50b2tlbkNvbmZpZy5jb2luO1xuICB9XG5cbiAgZ2V0IG5ldHdvcmsoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50b2tlbkNvbmZpZy5uZXR3b3JrO1xuICB9XG5cbiAgZ2V0IHRva2VuQ29udHJhY3RBZGRyZXNzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5Db25maWcudG9rZW5Db250cmFjdEFkZHJlc3M7XG4gIH1cblxuICBnZXQgZGVjaW1hbFBsYWNlcygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnRva2VuQ29uZmlnLmRlY2ltYWxQbGFjZXM7XG4gIH1cblxuICBnZXRDaGFpbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRva2VuQ29uZmlnLnR5cGU7XG4gIH1cblxuICBnZXRGdWxsTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAnRVJDNzk4NCBDb25maWRlbnRpYWwgVG9rZW4nO1xuICB9XG5cbiAgZ2V0QmFzZUZhY3RvcigpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLnBvdygxMCwgdGhpcy50b2tlbkNvbmZpZy5kZWNpbWFsUGxhY2VzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGbGFnIGZvciBzZW5kaW5nIHZhbHVlIG9mIDAuXG4gICAqIEVSQy03OTg0IGNvbmZpZGVudGlhbCB0cmFuc2ZlcnMgYWx3YXlzIGNhcnJ5IGFuIGVuY3J5cHRlZCBhbW91bnQ7IHplcm8tdmFsdWUgc2VuZHMgYXJlIG5vdCBtZWFuaW5nZnVsLlxuICAgKi9cbiAgdmFsdWVsZXNzVHJhbnNmZXJBbGxvd2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGbGFnIGZvciBzZW5kaW5nIGRhdGEgYWxvbmcgd2l0aCB0cmFuc2FjdGlvbnMgdmlhIHRoZSBzdGFuZGFyZCB0b2tlbi1zZW5kIEFQSS5cbiAgICogUmV0dXJucyBmYWxzZSBiZWNhdXNlIEVSQy03OTg0IHNlbmRzIHVzZSBjb25maWRlbnRpYWxUcmFuc2ZlcigpIGNhbGxkYXRhIGJ1aWx0XG4gICAqIGJ5IFdQLCBub3QgYW4gYXJiaXRyYXJ5IGRhdGEgZmllbGQgb24gdGhlIHNlbmQgcGFyYW1zLlxuICAgKiBOb3RlOiB0aGlzIGRvZXMgbm90IHByZXZlbnQgY2FsbGRhdGEtYmFzZWQgZmxvd3MgbGlrZSBnZXREZWxlZ2F0aW9uQnVpbGRlcigpLFxuICAgKiB3aGljaCBieXBhc3MgdGhlIHRva2VuLXNlbmQgcGF0aCBlbnRpcmVseS5cbiAgICovXG4gIHRyYW5zYWN0aW9uRGF0YUFsbG93ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIHN1cHBvcnRzVHNzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIGdldE1QQ0FsZ29yaXRobSgpOiBNUENBbGdvcml0aG0ge1xuICAgIHJldHVybiAnZWNkc2EnO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFRyYW5zYWN0aW9uQnVpbGRlcigpOiBUcmFuc2FjdGlvbkJ1aWxkZXIge1xuICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyKGNvaW5zLmdldCh0aGlzLmdldEJhc2VDaGFpbigpKSk7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgYXN5bmMgdmVyaWZ5VHJhbnNhY3Rpb24ocGFyYW1zOiBWZXJpZnlFdGhUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAocGFyYW1zLnR4UGFyYW1zPy50eXBlID09PSAnZW5hYmxldG9rZW4nKSB7XG4gICAgICByZXR1cm4gdGhpcy52ZXJpZnlFbmFibGVUb2tlblRyYW5zYWN0aW9uKHBhcmFtcyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmlzQ29uc29saWRhdGlvblRyYW5zYWN0aW9uKHBhcmFtcykpIHtcbiAgICAgIHJldHVybiB0aGlzLnZlcmlmeUNvbmZpZGVudGlhbENvbnNvbGlkYXRpb24ocGFyYW1zKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudmVyaWZ5Q29uZmlkZW50aWFsVHJhbnNmZXIocGFyYW1zKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNDb25zb2xpZGF0aW9uVHJhbnNhY3Rpb24ocGFyYW1zOiBWZXJpZnlFdGhUcmFuc2FjdGlvbk9wdGlvbnMpOiBib29sZWFuIHtcbiAgICBjb25zdCB7IHR4UGFyYW1zLCB0eFByZWJ1aWxkLCB2ZXJpZmljYXRpb24gfSA9IHBhcmFtcztcbiAgICByZXR1cm4gISEoXG4gICAgICB2ZXJpZmljYXRpb24/LmNvbnNvbGlkYXRpb25Ub0Jhc2VBZGRyZXNzIHx8XG4gICAgICB0eFByZWJ1aWxkPy5jb25zb2xpZGF0ZUlkIHx8XG4gICAgICB0eFBhcmFtcz8udHlwZSA9PT0gJ2NvbnNvbGlkYXRlJyB8fFxuICAgICAgdHhQYXJhbXM/LnByZWJ1aWxkVHg/LmNvbnNvbGlkYXRlSWRcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRXYWxsZXRCYXNlQWRkcmVzcyh3YWxsZXQ6IFZlcmlmeUV0aFRyYW5zYWN0aW9uT3B0aW9uc1snd2FsbGV0J10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICghd2FsbGV0KSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBjb2luU3BlY2lmaWMgPSB0eXBlb2Ygd2FsbGV0LmNvaW5TcGVjaWZpYyA9PT0gJ2Z1bmN0aW9uJyA/IHdhbGxldC5jb2luU3BlY2lmaWMoKSA6IHdhbGxldC5jb2luU3BlY2lmaWM7XG4gICAgY29uc3QgZXRoQ29pblNwZWNpZmljID0gY29pblNwZWNpZmljIGFzIHsgYmFzZUFkZHJlc3M/OiBzdHJpbmc7IHJvb3RBZGRyZXNzPzogc3RyaW5nIH0gfCB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGV0aENvaW5TcGVjaWZpYz8uYmFzZUFkZHJlc3MgPz8gZXRoQ29pblNwZWNpZmljPy5yb290QWRkcmVzcztcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyBFUkMtNzk4NCBmb3J3YXJkZXIgY29uc29saWRhdGlvbiAoZmx1c2gpIHRyYW5zYWN0aW9ucy5cbiAgICpcbiAgICogTXVsdGlzaWcgc2hhcGU6XG4gICAqICAgdHgudG8gICA9IHdhbGxldCBjb250cmFjdFxuICAgKiAgIHR4LmRhdGEgPSBzZW5kTXVsdGlTaWcoZm9yd2FyZGVyLCAwLCBjYWxsRnJvbVBhcmVudCh0b2tlbiwgMCwgY29uZmlkZW50aWFsVHJhbnNmZXJOb1Byb29mKGJhc2UsIGhhbmRsZSkpLCAuLi4pXG4gICAqXG4gICAqIFRTUyAvIGRpcmVjdCBzaGFwZTpcbiAgICogICB0eC50byAgID0gZm9yd2FyZGVyIGNvbnRyYWN0XG4gICAqICAgdHguZGF0YSA9IGNhbGxGcm9tUGFyZW50KHRva2VuLCAwLCBjb25maWRlbnRpYWxUcmFuc2Zlck5vUHJvb2YoYmFzZSwgaGFuZGxlKSlcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgdmVyaWZ5Q29uZmlkZW50aWFsQ29uc29saWRhdGlvbihwYXJhbXM6IFZlcmlmeUV0aFRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHsgdHhQYXJhbXMsIHR4UHJlYnVpbGQsIHdhbGxldCB9ID0gcGFyYW1zO1xuXG4gICAgaWYgKCF0eFByZWJ1aWxkPy50eEhleCkge1xuICAgICAgaWYgKCF0eFByZWJ1aWxkPy5jb25zb2xpZGF0ZUlkICYmICF0eFBhcmFtcz8ucHJlYnVpbGRUeD8uY29uc29saWRhdGVJZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ZlcmlmeUNvbmZpZGVudGlhbENvbnNvbGlkYXRpb246IG1pc3NpbmcgY29uc29saWRhdGVJZCcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgdHhCdWlsZGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkJ1aWxkZXIoKTtcbiAgICB0eEJ1aWxkZXIuZnJvbSh0eFByZWJ1aWxkLnR4SGV4KTtcbiAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuXG4gICAgbGV0IHRva2VuQ29udHJhY3RBZGRyZXNzOiBzdHJpbmc7XG4gICAgbGV0IHBhcmVudEFkZHJlc3M6IHN0cmluZztcbiAgICBsZXQgZW5jcnlwdGVkSGFuZGxlOiBzdHJpbmc7XG4gICAgbGV0IGZvcndhcmRlckFkZHJlc3M6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIHRyeSB7XG4gICAgICBpZiAodHhKc29uLmRhdGEuc3RhcnRzV2l0aChzZW5kTXVsdGlzaWdNZXRob2RJZCkpIHtcbiAgICAgICAgY29uc3QgZGVjb2RlZCA9IGRlY29kZVNlbmRNdWx0aVNpZ0ZsdXNoRVJDNzk4NERhdGEodHhKc29uLmRhdGEpO1xuICAgICAgICBmb3J3YXJkZXJBZGRyZXNzID0gZGVjb2RlZC5mb3J3YXJkZXJBZGRyZXNzO1xuICAgICAgICB0b2tlbkNvbnRyYWN0QWRkcmVzcyA9IGRlY29kZWQudG9rZW5Db250cmFjdEFkZHJlc3M7XG4gICAgICAgIHBhcmVudEFkZHJlc3MgPSBkZWNvZGVkLnBhcmVudEFkZHJlc3M7XG4gICAgICAgIGVuY3J5cHRlZEhhbmRsZSA9IGRlY29kZWQuZW5jcnlwdGVkSGFuZGxlO1xuICAgICAgfSBlbHNlIGlmICh0eEpzb24uZGF0YS5zdGFydHNXaXRoKGNhbGxGcm9tUGFyZW50TWV0aG9kSWQpKSB7XG4gICAgICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVGbHVzaEVSQzc5ODRGb3J3YXJkZXJUb2tlbkNhbGxkYXRhKHR4SnNvbi5kYXRhKTtcbiAgICAgICAgdG9rZW5Db250cmFjdEFkZHJlc3MgPSBkZWNvZGVkLnRva2VuQ29udHJhY3RBZGRyZXNzO1xuICAgICAgICBwYXJlbnRBZGRyZXNzID0gZGVjb2RlZC5wYXJlbnRBZGRyZXNzO1xuICAgICAgICBlbmNyeXB0ZWRIYW5kbGUgPSBkZWNvZGVkLmVuY3J5cHRlZEhhbmRsZTtcbiAgICAgICAgZm9yd2FyZGVyQWRkcmVzcyA9IHR4SnNvbi50bztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgdW5leHBlY3RlZCBtZXRob2QgSUQgJHt0eEpzb24uZGF0YS5zbGljZSgwLCAxMCl9YCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgdmVyaWZ5Q29uZmlkZW50aWFsQ29uc29saWRhdGlvbjogZmFpbGVkIHRvIGRlY29kZSBjb25zb2xpZGF0aW9uIGNhbGxkYXRhIOKAlCAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHRva2VuQ29udHJhY3RBZGRyZXNzLnRvTG93ZXJDYXNlKCkgIT09IHRoaXMudG9rZW5Db250cmFjdEFkZHJlc3MudG9Mb3dlckNhc2UoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgdmVyaWZ5Q29uZmlkZW50aWFsQ29uc29saWRhdGlvbjogdG9rZW4gY29udHJhY3QgYWRkcmVzcyBtaXNtYXRjaCDigJQgYCArXG4gICAgICAgICAgYGV4cGVjdGVkICR7dGhpcy50b2tlbkNvbnRyYWN0QWRkcmVzc30sIGdvdCAke3Rva2VuQ29udHJhY3RBZGRyZXNzfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgYmFzZUFkZHJlc3MgPSB0aGlzLmdldFdhbGxldEJhc2VBZGRyZXNzKHdhbGxldCk7XG4gICAgaWYgKCFiYXNlQWRkcmVzcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd2ZXJpZnlDb25maWRlbnRpYWxDb25zb2xpZGF0aW9uOiB1bmFibGUgdG8gZGV0ZXJtaW5lIHdhbGxldCBiYXNlIGFkZHJlc3MnKTtcbiAgICB9XG4gICAgaWYgKHBhcmVudEFkZHJlc3MudG9Mb3dlckNhc2UoKSAhPT0gYmFzZUFkZHJlc3MudG9Mb3dlckNhc2UoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgdmVyaWZ5Q29uZmlkZW50aWFsQ29uc29saWRhdGlvbjogcGFyZW50IGFkZHJlc3MgbWlzbWF0Y2gg4oCUIGV4cGVjdGVkICR7YmFzZUFkZHJlc3N9LCBnb3QgJHtwYXJlbnRBZGRyZXNzfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFlbmNyeXB0ZWRIYW5kbGUgfHwgZW5jcnlwdGVkSGFuZGxlID09PSAnMHgnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ZlcmlmeUNvbmZpZGVudGlhbENvbnNvbGlkYXRpb246IGVuY3J5cHRlZEhhbmRsZSBpcyBtaXNzaW5nIG9yIGVtcHR5IGluIHRyYW5zYWN0aW9uIGNhbGxkYXRhJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZXhwZWN0ZWRGb3J3YXJkZXIgPSB0eFByZWJ1aWxkLnJlY2lwaWVudHM/LlswXT8uYWRkcmVzcyA/PyB0eFBhcmFtcz8ucmVjaXBpZW50cz8uWzBdPy5hZGRyZXNzO1xuICAgIGlmIChmb3J3YXJkZXJBZGRyZXNzICYmIGV4cGVjdGVkRm9yd2FyZGVyKSB7XG4gICAgICBpZiAoZm9yd2FyZGVyQWRkcmVzcy50b0xvd2VyQ2FzZSgpICE9PSBleHBlY3RlZEZvcndhcmRlci50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgdmVyaWZ5Q29uZmlkZW50aWFsQ29uc29saWRhdGlvbjogZm9yd2FyZGVyIGFkZHJlc3MgbWlzbWF0Y2gg4oCUIGAgK1xuICAgICAgICAgICAgYGV4cGVjdGVkICR7ZXhwZWN0ZWRGb3J3YXJkZXJ9LCBnb3QgJHtmb3J3YXJkZXJBZGRyZXNzfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyBhIGNvbmZpZGVudGlhbCB0b2tlbiB0cmFuc2ZlciAoU2VuZEVSQzc5ODQpIHRyYW5zYWN0aW9uLlxuICAgKlxuICAgKiBXaXRoIHR4SGV4IOKAlCB0d28gb24tY2hhaW4gc2hhcGVzIGFyZSBzdXBwb3J0ZWQ6XG4gICAqXG4gICAqICAgc2VuZE11bHRpU2lnLXdyYXBwZWQgKG11bHRpc2lnIC8gc21hcnQtY29udHJhY3Qgd2FsbGV0KTpcbiAgICogICAgIHR4LnRvICAgPSB3YWxsZXQgY29udHJhY3RcbiAgICogICAgIHR4LmRhdGEgPSBzZW5kTXVsdGlTaWcodG9rZW5BZGRyLCAwLCBjb25maWRlbnRpYWxUcmFuc2ZlcihyZWNpcGllbnQsIGhhbmRsZSwgcHJvb2YpLCAuLi4pXG4gICAqICAgICBUb2tlbiBjb250cmFjdCBhZGRyZXNzIGlzIGRlY29kZWQgZnJvbSB0aGUgc2VuZE11bHRpU2lnIGlubmVyIGNhbGxkYXRhLlxuICAgKlxuICAgKiAgIERpcmVjdCBjYWxsIChob3QgLyBUU1MgRU9BIHdhbGxldCk6XG4gICAqICAgICB0eC50byAgID0gdG9rZW4gY29udHJhY3RcbiAgICogICAgIHR4LmRhdGEgPSBjb25maWRlbnRpYWxUcmFuc2ZlcihyZWNpcGllbnQsIGhhbmRsZSwgcHJvb2YpXG4gICAqICAgICBUb2tlbiBjb250cmFjdCBhZGRyZXNzIGlzIHRha2VuIGZyb20gdHgudG8uXG4gICAqXG4gICAqICAgRm9yIGJvdGggc2hhcGVzIHRoZSB2ZXJpZmllciBjaGVja3M6XG4gICAqICAgICAxLiBUb2tlbiBjb250cmFjdCBhZGRyZXNzIG1hdGNoZXMgdGhpcyBjb2luJ3MgdG9rZW5Db250cmFjdEFkZHJlc3MuXG4gICAqICAgICAyLiBEZWNvZGVkIHJlY2lwaWVudCBtYXRjaGVzIHR4UGFyYW1zLnJlY2lwaWVudHNbMF0uYWRkcmVzcyBvciBidWlsZFBhcmFtcy5yZWNpcGllbnRzWzBdLmFkZHJlc3MuXG4gICAqICAgICAzLiBlbmNyeXB0ZWRIYW5kbGUgYW5kIGlucHV0UHJvb2YgYXJlIHN0cnVjdHVyYWxseSBwcmVzZW50IChub24tZW1wdHkpLlxuICAgKiAgICAgNC4gdHhQYXJhbXMucmVjaXBpZW50c1swXS5hbW91bnQgaXMgYSBwb3NpdGl2ZSBpbnRlZ2VyIGFuZCBtYXRjaGVzIGJ1aWxkUGFyYW1zIHdoZW4gYm90aCBwcmVzZW50LlxuICAgKlxuICAgKiBXaXRob3V0IHR4SGV4IChmaXJzdC1zaWduZXIgLyBwcmUtc2lnbmluZyBwYXRoKTpcbiAgICogIDEuIFJlcXVpcmVzIGV4YWN0bHkgb25lIHJlY2lwaWVudCBpbiB0eFBhcmFtcy5cbiAgICogIDIuIFZhbGlkYXRlcyB0eFBhcmFtcy5yZWNpcGllbnRzWzBdLmFkZHJlc3MgaXMgYSB2YWxpZCBFdGhlcmV1bSBhZGRyZXNzLlxuICAgKiAgMy4gVmFsaWRhdGVzIHR4UGFyYW1zLnJlY2lwaWVudHNbMF0uYW1vdW50IGlzIGEgcG9zaXRpdmUgaW50ZWdlci5cbiAgICogIDQuIENyb3NzLWNoZWNrcyBhZGRyZXNzIGFuZCBhbW91bnQgYWdhaW5zdCBidWlsZFBhcmFtcyB3aGVuIHRoZSBzZXJ2ZXIgaGFzIHN0b3JlZCB0aGUgaW50ZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB2ZXJpZnlDb25maWRlbnRpYWxUcmFuc2ZlcihwYXJhbXM6IFZlcmlmeUV0aFRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHsgdHhQYXJhbXMsIHR4UHJlYnVpbGQgfSA9IHBhcmFtcztcblxuICAgIGlmICghdHhQcmVidWlsZD8udHhIZXgpIHtcbiAgICAgIC8vIE5vIHJhdyB0eCBhdmFpbGFibGUgKG11bHRpc2lnIGZpcnN0LXNpZ25lciBwYXRoKS5cbiAgICAgIC8vIFZhbGlkYXRlIEVSQzc5ODQtc3BlY2lmaWMgaW52YXJpYW50cyBmcm9tIHR4UGFyYW1zIGFuZCBidWlsZFBhcmFtcy5cbiAgICAgIGNvbnN0IHJlY2lwaWVudHMgPSB0eFBhcmFtcz8ucmVjaXBpZW50cztcbiAgICAgIGlmICghcmVjaXBpZW50cyB8fCByZWNpcGllbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ZlcmlmeUNvbmZpZGVudGlhbFRyYW5zZmVyOiByZWNpcGllbnRzIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgZW50cnknKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZWNpcGllbnRzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYHZlcmlmeUNvbmZpZGVudGlhbFRyYW5zZmVyOiBjb25maWRlbnRpYWwgdHJhbnNmZXJzIHN1cHBvcnQgZXhhY3RseSAxIHJlY2lwaWVudCwgZ290ICR7cmVjaXBpZW50cy5sZW5ndGh9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVjaXBpZW50ID0gcmVjaXBpZW50c1swXTtcbiAgICAgIGlmICghcmVjaXBpZW50LmFkZHJlc3MgfHwgIXRoaXMuaXNWYWxpZEFkZHJlc3MocmVjaXBpZW50LmFkZHJlc3MpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgdmVyaWZ5Q29uZmlkZW50aWFsVHJhbnNmZXI6IHJlY2lwaWVudCBhZGRyZXNzIGlzIG1pc3Npbmcgb3IgaW52YWxpZDogJHtyZWNpcGllbnQuYWRkcmVzc31gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFtb3VudFN0ciA9IFN0cmluZyhyZWNpcGllbnQuYW1vdW50KTtcbiAgICAgIGlmICghRXJjNzk4NFRva2VuLmlzUG9zaXRpdmVJbnRlZ2VyU3RyaW5nKGFtb3VudFN0cikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGB2ZXJpZnlDb25maWRlbnRpYWxUcmFuc2ZlcjogYW1vdW50IG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIHN0cmluZyBpbiBiYXNlIHVuaXRzLCBnb3QgJyR7YW1vdW50U3RyfSdgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICAvLyBDcm9zcy1jaGVjayBhZ2FpbnN0IGJ1aWxkUGFyYW1zIHdoZW4gdGhlIHNlcnZlciBoYXMgYWxyZWFkeSBzdG9yZWQgdGhlIGludGVudFxuICAgICAgY29uc3QgYnVpbGRQYXJhbXNSZWNpcGllbnQgPSB0eFByZWJ1aWxkPy5idWlsZFBhcmFtcz8ucmVjaXBpZW50cz8uWzBdO1xuICAgICAgaWYgKGJ1aWxkUGFyYW1zUmVjaXBpZW50Py5hZGRyZXNzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHJlY2lwaWVudC5hZGRyZXNzLnRvTG93ZXJDYXNlKCkgIT09IGJ1aWxkUGFyYW1zUmVjaXBpZW50LmFkZHJlc3MudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGB2ZXJpZnlDb25maWRlbnRpYWxUcmFuc2ZlcjogcmVjaXBpZW50IGFkZHJlc3MgbWlzbWF0Y2gg4oCUIGAgK1xuICAgICAgICAgICAgICBgdHhQYXJhbXMgaGFzICcke3JlY2lwaWVudC5hZGRyZXNzfScgYnV0IGJ1aWxkUGFyYW1zIGhhcyAnJHtidWlsZFBhcmFtc1JlY2lwaWVudC5hZGRyZXNzfSdgXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgYnVpbGRQYXJhbXNBbW91bnQgPSBidWlsZFBhcmFtc1JlY2lwaWVudD8uYW1vdW50O1xuICAgICAgaWYgKGJ1aWxkUGFyYW1zQW1vdW50ICE9PSB1bmRlZmluZWQgJiYgYnVpbGRQYXJhbXNBbW91bnQgIT09IGFtb3VudFN0cikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYHZlcmlmeUNvbmZpZGVudGlhbFRyYW5zZmVyOiBhbW91bnQgbWlzbWF0Y2gg4oCUIHR4UGFyYW1zIGhhcyAnJHthbW91bnRTdHJ9JyBidXQgYnVpbGRQYXJhbXMgaGFzICcke2J1aWxkUGFyYW1zQW1vdW50fSdgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBQYXJzZSBhbmQgZGVjb2RlIHRoZSByYXcgdHJhbnNhY3Rpb25cbiAgICBjb25zdCB0eEJ1aWxkZXIgPSB0aGlzLmdldFRyYW5zYWN0aW9uQnVpbGRlcigpO1xuICAgIHR4QnVpbGRlci5mcm9tKHR4UHJlYnVpbGQudHhIZXgpO1xuICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG5cbiAgICBsZXQgdG9BZGRyZXNzOiBzdHJpbmc7XG4gICAgbGV0IHRva2VuQ29udHJhY3RBZGRyZXNzOiBzdHJpbmc7XG4gICAgbGV0IGVuY3J5cHRlZEhhbmRsZTogc3RyaW5nO1xuICAgIGxldCBpbnB1dFByb29mOiBzdHJpbmc7XG5cbiAgICB0cnkge1xuICAgICAgaWYgKHR4SnNvbi5kYXRhLnN0YXJ0c1dpdGgoc2VuZE11bHRpc2lnTWV0aG9kSWQpKSB7XG4gICAgICAgIC8vIHNlbmRNdWx0aVNpZy13cmFwcGVkIHBhdGg6IHNtYXJ0LWNvbnRyYWN0IHdhbGxldCByZWxheXMgdGhlIGNvbmZpZGVudGlhbFRyYW5zZmVyIGNhbGwuXG4gICAgICAgIC8vIFRva2VuIGNvbnRyYWN0IGFkZHJlc3MgaXMgZW5jb2RlZCBpbnNpZGUgdGhlIHNlbmRNdWx0aVNpZyBjYWxsZGF0YS5cbiAgICAgICAgY29uc3QgZGVjb2RlZCA9IGRlY29kZUNvbmZpZGVudGlhbFRyYW5zZmVyRGF0YSh0eEpzb24uZGF0YSk7XG4gICAgICAgIHRvQWRkcmVzcyA9IGRlY29kZWQudG9BZGRyZXNzO1xuICAgICAgICB0b2tlbkNvbnRyYWN0QWRkcmVzcyA9IGRlY29kZWQudG9rZW5Db250cmFjdEFkZHJlc3M7XG4gICAgICAgIGVuY3J5cHRlZEhhbmRsZSA9IGRlY29kZWQuZW5jcnlwdGVkSGFuZGxlO1xuICAgICAgICBpbnB1dFByb29mID0gZGVjb2RlZC5pbnB1dFByb29mO1xuICAgICAgfSBlbHNlIGlmICh0eEpzb24uZGF0YS5zdGFydHNXaXRoKGNvbmZpZGVudGlhbFRyYW5zZmVyV2l0aFByb29mTWV0aG9kSWQpKSB7XG4gICAgICAgIC8vIERpcmVjdCBjYWxsIHBhdGg6IGhvdC9UU1MgRU9BIHdhbGxldCBjYWxscyB0aGUgdG9rZW4gY29udHJhY3QgZGlyZWN0bHkuXG4gICAgICAgIC8vIFRoZSB0cmFuc2FjdGlvbidzIGB0b2AgZmllbGQgaXMgdGhlIHRva2VuIGNvbnRyYWN0IGFkZHJlc3MuXG4gICAgICAgIGlmICghdHhKc29uLnRvKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdkaXJlY3QgY29uZmlkZW50aWFsVHJhbnNmZXIgY2FsbCBpcyBtaXNzaW5nIHRyYW5zYWN0aW9uIHRvIGFkZHJlc3MnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlRGlyZWN0Q29uZmlkZW50aWFsVHJhbnNmZXJDYWxsZGF0YSh0eEpzb24uZGF0YSk7XG4gICAgICAgIHRvQWRkcmVzcyA9IGRlY29kZWQudG9BZGRyZXNzO1xuICAgICAgICB0b2tlbkNvbnRyYWN0QWRkcmVzcyA9IHR4SnNvbi50bztcbiAgICAgICAgZW5jcnlwdGVkSGFuZGxlID0gZGVjb2RlZC5lbmNyeXB0ZWRIYW5kbGU7XG4gICAgICAgIGlucHV0UHJvb2YgPSBkZWNvZGVkLmlucHV0UHJvb2Y7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHVuZXhwZWN0ZWQgbWV0aG9kIElEICR7dHhKc29uLmRhdGEuc2xpY2UoMCwgMTApfWApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYHZlcmlmeUNvbmZpZGVudGlhbFRyYW5zZmVyOiBmYWlsZWQgdG8gZGVjb2RlIGNvbmZpZGVudGlhbCB0cmFuc2ZlciBjYWxsZGF0YSDigJQgJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIDEuIFRva2VuIGNvbnRyYWN0IGFkZHJlc3MgbXVzdCBtYXRjaCB0aGlzIGNvaW5cbiAgICBpZiAodG9rZW5Db250cmFjdEFkZHJlc3MudG9Mb3dlckNhc2UoKSAhPT0gdGhpcy50b2tlbkNvbnRyYWN0QWRkcmVzcy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGB2ZXJpZnlDb25maWRlbnRpYWxUcmFuc2ZlcjogdG9rZW4gY29udHJhY3QgYWRkcmVzcyBtaXNtYXRjaCDigJQgYCArXG4gICAgICAgICAgYGV4cGVjdGVkICR7dGhpcy50b2tlbkNvbnRyYWN0QWRkcmVzc30sIGdvdCAke3Rva2VuQ29udHJhY3RBZGRyZXNzfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gMi4gUmVjaXBpZW50IGFkZHJlc3MgbXVzdCBtYXRjaCB0eFBhcmFtcy5yZWNpcGllbnRzWzBdIG9yIGJ1aWxkUGFyYW1zLnJlY2lwaWVudHNbMF1cbiAgICBjb25zdCBleHBlY3RlZFJlY2lwaWVudCA9IHR4UGFyYW1zPy5yZWNpcGllbnRzPy5bMF0/LmFkZHJlc3MgPz8gdHhQcmVidWlsZC5idWlsZFBhcmFtcz8ucmVjaXBpZW50cz8uWzBdPy5hZGRyZXNzO1xuICAgIGlmICghZXhwZWN0ZWRSZWNpcGllbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ3ZlcmlmeUNvbmZpZGVudGlhbFRyYW5zZmVyOiBtaXNzaW5nIGV4cGVjdGVkIHJlY2lwaWVudCAocHJvdmlkZSB0eFBhcmFtcy5yZWNpcGllbnRzIG9yIHR4UHJlYnVpbGQuYnVpbGRQYXJhbXMucmVjaXBpZW50cyknXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodG9BZGRyZXNzLnRvTG93ZXJDYXNlKCkgIT09IGV4cGVjdGVkUmVjaXBpZW50LnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYHZlcmlmeUNvbmZpZGVudGlhbFRyYW5zZmVyOiByZWNpcGllbnQgYWRkcmVzcyBtaXNtYXRjaCDigJQgYCArIGBleHBlY3RlZCAke2V4cGVjdGVkUmVjaXBpZW50fSwgZ290ICR7dG9BZGRyZXNzfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gMy4gZW5jcnlwdGVkSGFuZGxlIG11c3QgYmUgYSBub24tdHJpdmlhbCBoZXggdmFsdWUgKG5vdCBiYXJlICcweCcpXG4gICAgaWYgKCFlbmNyeXB0ZWRIYW5kbGUgfHwgZW5jcnlwdGVkSGFuZGxlID09PSAnMHgnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ZlcmlmeUNvbmZpZGVudGlhbFRyYW5zZmVyOiBlbmNyeXB0ZWRIYW5kbGUgaXMgbWlzc2luZyBvciBlbXB0eSBpbiB0cmFuc2FjdGlvbiBjYWxsZGF0YScpO1xuICAgIH1cblxuICAgIC8vIDQuIGlucHV0UHJvb2YgbXVzdCBiZSBhIG5vbi10cml2aWFsIGhleCB2YWx1ZVxuICAgIGlmICghaW5wdXRQcm9vZiB8fCBpbnB1dFByb29mID09PSAnMHgnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ZlcmlmeUNvbmZpZGVudGlhbFRyYW5zZmVyOiBpbnB1dFByb29mIGlzIG1pc3Npbmcgb3IgZW1wdHkgaW4gdHJhbnNhY3Rpb24gY2FsbGRhdGEnKTtcbiAgICB9XG5cbiAgICAvLyA1LiBWZXJpZnkgcGxhaW50ZXh0IGludGVudDogdHhQYXJhbXMgYW1vdW50IG11c3QgYmUgdmFsaWQgYW5kIGNvbnNpc3RlbnQgd2l0aCBidWlsZFBhcmFtc1xuICAgIGNvbnN0IHJhd1R4UGFyYW1zQW1vdW50ID0gdHhQYXJhbXM/LnJlY2lwaWVudHM/LlswXT8uYW1vdW50O1xuICAgIGlmIChyYXdUeFBhcmFtc0Ftb3VudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCB0eFBhcmFtc0Ftb3VudCA9IFN0cmluZyhyYXdUeFBhcmFtc0Ftb3VudCk7XG4gICAgICBpZiAoIUVyYzc5ODRUb2tlbi5pc1Bvc2l0aXZlSW50ZWdlclN0cmluZyh0eFBhcmFtc0Ftb3VudCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGB2ZXJpZnlDb25maWRlbnRpYWxUcmFuc2ZlcjogYW1vdW50IG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIHN0cmluZyBpbiBiYXNlIHVuaXRzLCBnb3QgJyR7dHhQYXJhbXNBbW91bnR9J2BcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJ1aWxkUGFyYW1zQW1vdW50ID0gdHhQcmVidWlsZC5idWlsZFBhcmFtcz8ucmVjaXBpZW50cz8uWzBdPy5hbW91bnQ7XG4gICAgICBpZiAoYnVpbGRQYXJhbXNBbW91bnQgIT09IHVuZGVmaW5lZCAmJiB0eFBhcmFtc0Ftb3VudCAhPT0gYnVpbGRQYXJhbXNBbW91bnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGB2ZXJpZnlDb25maWRlbnRpYWxUcmFuc2ZlcjogYW1vdW50IG1pc21hdGNoIOKAlCB0eFBhcmFtcyBoYXMgJyR7dHhQYXJhbXNBbW91bnR9JyBidXQgYnVpbGRQYXJhbXMgaGFzICcke2J1aWxkUGFyYW1zQW1vdW50fSdgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBpc1Bvc2l0aXZlSW50ZWdlclN0cmluZyh2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIC9eXFxkKyQvLnRlc3QodmFsdWUpICYmIEJpZ0ludCh2YWx1ZSkgPiAwbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyBhIHRva2VuIGVuYWJsZW1lbnQgdHJhbnNhY3Rpb24gZm9yIEVSQy03OTg0IGRlY3J5cHRpb24gZGVsZWdhdGlvbi5cbiAgICpcbiAgICogVFNTIHBhdGg6IGRlY29kZXMgdGhlIHJhdyB0eCBhbmQgdmVyaWZpZXMgaXQgY2FsbHMgdGhlIEFDTCBjb250cmFjdCB3aXRoXG4gICAqIGNhbGxkYXRhIHRoYXQgY292ZXJzIGFsbCByZXF1ZXN0ZWQgdG9rZW4gY29udHJhY3QgYWRkcmVzc2VzLlxuICAgKlxuICAgKiBNdWx0aXNpZyBwYXRoOiB2ZXJpZmllcyB0aGUgYnVpbGRQYXJhbXMgcmVjaXBpZW50cyBjYXJyeSB0aGUgY29ycmVjdCB0b2tlbk5hbWVzXG4gICAqIGFuZCB6ZXJvIGFtb3VudHMuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHZlcmlmeUVuYWJsZVRva2VuVHJhbnNhY3Rpb24ocGFyYW1zOiBWZXJpZnlFdGhUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB7IHR4UGFyYW1zLCB0eFByZWJ1aWxkLCB3YWxsZXRUeXBlIH0gPSBwYXJhbXM7XG5cbiAgICBpZiAod2FsbGV0VHlwZSA9PT0gJ3RzcycpIHtcbiAgICAgIC8vIFRTUyBwYXRoOiBmdWxsIHJhdy10eCBkZWNvZGVcbiAgICAgIGNvbnN0IGVuYWJsZVRva2VucyA9IHR4UGFyYW1zLmVuYWJsZVRva2VucztcbiAgICAgIGlmICghZW5hYmxlVG9rZW5zIHx8IGVuYWJsZVRva2Vucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd2ZXJpZnlFbmFibGVUb2tlblRyYW5zYWN0aW9uOiBlbmFibGVUb2tlbnMgbXVzdCBiZSBub24tZW1wdHkgZm9yIFRTUyBwYXRoJyk7XG4gICAgICB9XG4gICAgICBpZiAoIXR4UHJlYnVpbGQudHhIZXgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd2ZXJpZnlFbmFibGVUb2tlblRyYW5zYWN0aW9uOiBtaXNzaW5nIHR4SGV4IGluIHR4UHJlYnVpbGQnKTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVzb2x2ZSByZXF1ZXN0ZWQgdG9rZW4gbmFtZXMg4oaSIGNvbnRyYWN0IGFkZHJlc3Nlc1xuICAgICAgY29uc3QgcmVxdWVzdGVkQWRkcmVzc2VzID0gZW5hYmxlVG9rZW5zLm1hcCgodCkgPT4ge1xuICAgICAgICBjb25zdCB0b2tlbkNvaW4gPSB0aGlzLmJpdGdvLmNvaW4odC5uYW1lKSBhcyBFcmM3OTg0VG9rZW47XG4gICAgICAgIHJldHVybiB0b2tlbkNvaW4udG9rZW5Db250cmFjdEFkZHJlc3MudG9Mb3dlckNhc2UoKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBQYXJzZSB0aGUgcmF3IHRyYW5zYWN0aW9uXG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSB0aGlzLmdldFRyYW5zYWN0aW9uQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLmZyb20odHhQcmVidWlsZC50eEhleCk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG5cbiAgICAgIC8vIFZlcmlmeSB0cmFuc2FjdGlvbiB0YXJnZXRzIHRoZSBjb3JyZWN0IGNvbnRyYWN0IGJhc2VkIG9uIGNhbGxkYXRhIHNoYXBlXG4gICAgICBjb25zdCBuZXR3b3JrID0gdGhpcy5nZXROZXR3b3JrKCkgYXMgRXRoZXJldW1OZXR3b3JrO1xuICAgICAgY29uc3QgYWNsQ29udHJhY3RBZGRyZXNzID0gbmV0d29yaz8uemFtYUFjbENvbnRyYWN0QWRkcmVzcztcbiAgICAgIGlmICghYWNsQ29udHJhY3RBZGRyZXNzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndmVyaWZ5RW5hYmxlVG9rZW5UcmFuc2FjdGlvbjogemFtYUFjbENvbnRyYWN0QWRkcmVzcyBub3QgY29uZmlndXJlZCBmb3IgdGhpcyBuZXR3b3JrJyk7XG4gICAgICB9XG4gICAgICBpZiAoIXR4SnNvbi50bykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ZlcmlmeUVuYWJsZVRva2VuVHJhbnNhY3Rpb246IHRyYW5zYWN0aW9uIGlzIG1pc3NpbmcgcmVjaXBpZW50IGFkZHJlc3MnKTtcbiAgICAgIH1cblxuICAgICAgLy8gSW5zcGVjdCBjYWxsZGF0YSBtZXRob2QgSUQgdG8gZGlzdGluZ3Vpc2ggcm9vdCB3YWxsZXQgZnJvbSBmb3J3YXJkZXIgd2FsbGV0OlxuICAgICAgLy8gICBhY2xNdWx0aWNhbGxNZXRob2RJZCAgIOKGkiByb290IHdhbGxldDogdG8gPSBBQ0wgY29udHJhY3QgZGlyZWN0bHlcbiAgICAgIC8vICAgY2FsbEZyb21QYXJlbnRNZXRob2RJZCDihpIgZm9yd2FyZGVyIHdhbGxldDogdG8gPSBmb3J3YXJkZXIsIEFDTCBhZGRyZXNzIGlzIGluc2lkZSBjYWxsZGF0YVxuICAgICAgY29uc3QgY2FsbGRhdGFNZXRob2RJZCA9IHR4SnNvbi5kYXRhLnNsaWNlKDAsIDEwKTtcbiAgICAgIGlmIChjYWxsZGF0YU1ldGhvZElkID09PSBhY2xNdWx0aWNhbGxNZXRob2RJZCkge1xuICAgICAgICAvLyBSb290IHdhbGxldCAoYmFzZSBhZGRyZXNzKTogdHggY2FsbHMgdGhlIEFDTCBjb250cmFjdCBkaXJlY3RseVxuICAgICAgICBpZiAodHhKc29uLnRvLnRvTG93ZXJDYXNlKCkgIT09IGFjbENvbnRyYWN0QWRkcmVzcy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYHZlcmlmeUVuYWJsZVRva2VuVHJhbnNhY3Rpb246IHRyYW5zYWN0aW9uIHRhcmdldCAke3R4SnNvbi50b30gZG9lcyBub3QgbWF0Y2ggQUNMIGNvbnRyYWN0ICR7YWNsQ29udHJhY3RBZGRyZXNzfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNhbGxkYXRhTWV0aG9kSWQgPT09IGNhbGxGcm9tUGFyZW50TWV0aG9kSWQpIHtcbiAgICAgICAgLy8gRm9yd2FyZGVyIHdhbGxldDogdHggY2FsbHMgdGhlIGZvcndhcmRlciwgd2hpY2ggY2FsbHMgdGhlIEFDTCB2aWEgY2FsbEZyb21QYXJlbnQuXG4gICAgICAgIC8vIFRoZSBmb3J3YXJkZXIgYWRkcmVzcyBpcyB3YWxsZXQtc3BlY2lmaWMgYW5kIGNhbm5vdCBiZSBzdGF0aWNhbGx5IHZlcmlmaWVkIGhlcmU7XG4gICAgICAgIC8vIHRva2VuIGFkZHJlc3MgY29ycmVjdG5lc3MgaXMgc3RpbGwgdmVyaWZpZWQgYmVsb3cgdmlhIGNhbGxkYXRhIGRlY29kaW5nLlxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGB2ZXJpZnlFbmFibGVUb2tlblRyYW5zYWN0aW9uOiB1bnJlY29nbmlzZWQgY2FsbGRhdGEgbWV0aG9kIElEICR7Y2FsbGRhdGFNZXRob2RJZH07IGV4cGVjdGVkIG11bHRpY2FsbCBvciBjYWxsRnJvbVBhcmVudGBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gVmVyaWZ5IHZhbHVlIGlzIDBcbiAgICAgIGlmICh0eEpzb24udmFsdWUgIT09ICcwJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHZlcmlmeUVuYWJsZVRva2VuVHJhbnNhY3Rpb246IGV4cGVjdGVkIHRyYW5zYWN0aW9uIHZhbHVlIDAgYnV0IGdvdCAke3R4SnNvbi52YWx1ZX1gKTtcbiAgICAgIH1cblxuICAgICAgLy8gRGVjb2RlIHRva2VuIGFkZHJlc3NlcyBmcm9tIGNhbGxkYXRhIGFuZCB2ZXJpZnkgYWxsIHJlcXVlc3RlZCB0b2tlbnMgYXJlIHByZXNlbnRcbiAgICAgIGNvbnN0IGRlY29kZWRBZGRyZXNzZXMgPSBkZWNvZGVUb2tlbkFkZHJlc3Nlc0Zyb21EZWxlZ2F0aW9uQ2FsbGRhdGEodHhKc29uLmRhdGEpO1xuICAgICAgZm9yIChjb25zdCByZXF1ZXN0ZWQgb2YgcmVxdWVzdGVkQWRkcmVzc2VzKSB7XG4gICAgICAgIGlmICghZGVjb2RlZEFkZHJlc3Nlcy5pbmNsdWRlcyhyZXF1ZXN0ZWQpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYHZlcmlmeUVuYWJsZVRva2VuVHJhbnNhY3Rpb246IHJlcXVlc3RlZCB0b2tlbiAke3JlcXVlc3RlZH0gbm90IGZvdW5kIGluIGRlbGVnYXRpb24gY2FsbGRhdGFgXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTXVsdGlzaWcgcGF0aDogYnVpbGRQYXJhbXMtbGV2ZWwgY2hlY2tcbiAgICAgIGNvbnN0IHJlY2lwaWVudHMgPSB0eFByZWJ1aWxkLmJ1aWxkUGFyYW1zPy5yZWNpcGllbnRzIGFzXG4gICAgICAgIHwgQXJyYXk8eyB0b2tlbk5hbWU/OiBzdHJpbmc7IGFtb3VudD86IHN0cmluZyB9PlxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgIGlmICghcmVjaXBpZW50cyB8fCByZWNpcGllbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ZlcmlmeUVuYWJsZVRva2VuVHJhbnNhY3Rpb246IG1pc3NpbmcgYnVpbGRQYXJhbXMucmVjaXBpZW50cyBmb3IgbXVsdGlzaWcgcGF0aCcpO1xuICAgICAgfVxuXG4gICAgICAvLyBEZXRlcm1pbmUgcmVxdWVzdGVkIHRva2VuIG5hbWVzIGZyb20gdHhQYXJhbXNcbiAgICAgIGNvbnN0IHJlcXVlc3RlZFRva2VuTmFtZXM6IHN0cmluZ1tdID0gW107XG4gICAgICBpZiAodHhQYXJhbXMuZW5hYmxlVG9rZW5zICYmIHR4UGFyYW1zLmVuYWJsZVRva2Vucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlcXVlc3RlZFRva2VuTmFtZXMucHVzaCguLi50eFBhcmFtcy5lbmFibGVUb2tlbnMubWFwKCh0KSA9PiB0Lm5hbWUpKTtcbiAgICAgIH0gZWxzZSBpZiAodHhQYXJhbXMucmVjaXBpZW50cyAmJiB0eFBhcmFtcy5yZWNpcGllbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVxdWVzdGVkVG9rZW5OYW1lcy5wdXNoKC4uLnR4UGFyYW1zLnJlY2lwaWVudHMubWFwKChyOiBhbnkpID0+IHIudG9rZW5OYW1lKS5maWx0ZXIoQm9vbGVhbikpO1xuICAgICAgfVxuXG4gICAgICAvLyBWZXJpZnkgYWxsIHJlY2lwaWVudHMgaGF2ZSB0b2tlbk5hbWUgYW5kIGFtb3VudCA9ICcwJ1xuICAgICAgZm9yIChjb25zdCByZWNpcGllbnQgb2YgcmVjaXBpZW50cykge1xuICAgICAgICBpZiAoIXJlY2lwaWVudC50b2tlbk5hbWUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ZlcmlmeUVuYWJsZVRva2VuVHJhbnNhY3Rpb246IHJlY2lwaWVudCBpcyBtaXNzaW5nIHRva2VuTmFtZSBpbiBidWlsZFBhcmFtcycpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZWNpcGllbnQuYW1vdW50ICE9PSAnMCcpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgdmVyaWZ5RW5hYmxlVG9rZW5UcmFuc2FjdGlvbjogZXhwZWN0ZWQgYW1vdW50IDAgZm9yIHRva2VuIGVuYWJsZW1lbnQgYnV0IGdvdCAke3JlY2lwaWVudC5hbW91bnR9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVmVyaWZ5IHJlcXVlc3RlZCB0b2tlbiBuYW1lcyBhcmUgcHJlc2VudCBpbiByZWNpcGllbnRzXG4gICAgICBpZiAocmVxdWVzdGVkVG9rZW5OYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHJlY2lwaWVudFRva2VuTmFtZXMgPSByZWNpcGllbnRzLm1hcCgocikgPT4gci50b2tlbk5hbWUpO1xuICAgICAgICBmb3IgKGNvbnN0IHJlcXVlc3RlZCBvZiByZXF1ZXN0ZWRUb2tlbk5hbWVzKSB7XG4gICAgICAgICAgaWYgKCFyZWNpcGllbnRUb2tlbk5hbWVzLmluY2x1ZGVzKHJlcXVlc3RlZCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYHZlcmlmeUVuYWJsZVRva2VuVHJhbnNhY3Rpb246IHJlcXVlc3RlZCB0b2tlbiAke3JlcXVlc3RlZH0gbm90IGZvdW5kIGluIGJ1aWxkUGFyYW1zIHJlY2lwaWVudHNgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIERlY3J5cHRpb25EZWxlZ2F0aW9uQnVpbGRlciBmb3IgY29uc3RydWN0aW5nIFphbWEgQUNMIGRlY3J5cHRpb25cbiAgICogZGVsZWdhdGlvbiB0cmFuc2FjdGlvbnMuXG4gICAqXG4gICAqIFRoZSBidWlsZGVyIHByb2R1Y2VzIGEgRGVjcnlwdGlvbkRlbGVnYXRpb25UeFJlcXVlc3Qge3RvLCBkYXRhLCB2YWx1ZX0gdGhhdCBpc1xuICAgKiB3YWxsZXQtdHlwZS1hZ25vc3RpYyDigJQgV1Agcm91dGVzIGl0IHRvIHRoZSBjb3JyZWN0IHNpZ25pbmcgcGF0aDpcbiAgICogLSBNUEM6IHN1Ym1pdCBhcyBhIHJhdyBUU1MgdHJhbnNhY3Rpb25cbiAgICogLSBNdWx0aXNpZzogd3JhcCBpbiBzZW5kTXVsdGlTaWcod2FsbGV0Q29udHJhY3QsIHRvLCAwLCBkYXRhLCAuLi4pXG4gICAqXG4gICAqIEV4YW1wbGU6XG4gICAqICAgY29uc3QgcmVxID0gY29pbi5nZXREZWNyeXB0aW9uRGVsZWdhdGlvbkJ1aWxkZXIoKS5idWlsZCh7XG4gICAqICAgICBhY2xDb250cmFjdEFkZHJlc3M6ICcweGYwRmYuLi4nLFxuICAgKiAgICAgZGVsZWdhdGVBZGRyZXNzOiAgICBlbnRlcnByaXNlVmlld2luZ0tleSxcbiAgICogICAgIHRva2VuQ29udHJhY3RBZGRyZXNzZXM6IFt0b2tlbkFkZHJlc3NdLFxuICAgKiAgICAgZXhwaXJ5VGltZXN0YW1wOiAgICBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKSArIDM2NSAqIDg2NDAwLFxuICAgKiAgIH0pO1xuICAgKi9cbiAgZ2V0RGVjcnlwdGlvbkRlbGVnYXRpb25CdWlsZGVyKCk6IERlY3J5cHRpb25EZWxlZ2F0aW9uQnVpbGRlciB7XG4gICAgcmV0dXJuIG5ldyBEZWNyeXB0aW9uRGVsZWdhdGlvbkJ1aWxkZXIoKTtcbiAgfVxufVxuIl19
|