UNPKG

@witnet/ethers

Version:

Wit/Oracle Ethers Framework package for EVM-compatible projects

388 lines 63.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.WitPriceFeeds = void 0; const ethers_1 = require("ethers"); const utils_1 = require("../utils"); const types_1 = require("../types"); const WitAppliance_1 = require("./WitAppliance"); class WitPriceFeeds extends WitAppliance_1.WitAppliance { constructor(witOracle, at) { super(witOracle, "WitPriceFeeds", at); } static async at(witOracle, target) { const priceFeeds = new WitPriceFeeds(witOracle, target); let oracleAddr; try { oracleAddr = await priceFeeds.contract.witOracle.staticCall(); } catch { oracleAddr = await priceFeeds.provider .call({ to: target, data: "0x46d1d21a", // funcSig for 'witnet()' }) .then(result => ethers_1.AbiCoder.defaultAbiCoder().decode(["address"], result)) .then(result => result.toString()); } if (oracleAddr !== witOracle.address) { throw new Error(`${this.constructor.name} at ${target}: mismatching Wit/Oracle address (${oracleAddr})`); } return priceFeeds; } async createChainlinkAggregator(id4, options) { const evmTransaction = await this.contract .createChainlinkAggregator .populateTransaction(id4); evmTransaction.gasPrice = options?.evmGasPrice || evmTransaction?.gasPrice; return this.signer .sendTransaction(evmTransaction) .then(response => { if (options?.onTransaction) { options.onTransaction(response.hash); } return response.wait(options?.evmConfirmations || 1, options?.evmTimeout); }) .then(receipt => { if (options?.onTransactionReceipt) { options.onTransactionReceipt(receipt); } return receipt; }); } async pushDataReport(report, options) { return this.contract .pushDataReport .populateTransaction((0, utils_1.abiEncodeDataPushReport)(report), report?.evm_proof) .then(tx => { if (!options?.gasPrice && tx?.gasPrice && options?.maxGasPrice) { if (tx.gasPrice > options.maxGasPrice) { throw new Error(`${this.constructor.name}: network gas price too high: ${(0, ethers_1.formatUnits)(tx.gasPrice, 9)} > ${(0, ethers_1.formatUnits)(options.maxGasPrice, 9)} gwei`); } } tx.gasPrice = options?.gasPrice || tx?.gasPrice; tx.gasLimit = options?.gasLimit || tx?.gasLimit; return this.signer.sendTransaction(tx); }) .then(response => { if (options?.onTransaction) { options.onTransaction(response.hash); } return response.wait(options?.confirmations || 1, options?.timeout); }) .then(receipt => { if (options?.onTransactionReceipt) { options.onTransactionReceipt(receipt); } return receipt; }); } async settlePriceFeedRadonHash(caption, decimals, radHash, options) { const evmTransaction = await this.contract .settlePriceFeedRadonHash .populateTransaction(caption, decimals, radHash); evmTransaction.gasPrice = options?.evmGasPrice || evmTransaction?.gasPrice; return this.signer .sendTransaction(evmTransaction) .then(response => { if (options?.onTransaction) { options.onTransaction(response.hash); } return response.wait(options?.evmConfirmations || 1, options?.evmTimeout); }) .then(receipt => { if (options?.onTransactionReceipt) { options.onTransactionReceipt(receipt); } return receipt; }); } async settlePriceFeedOracle(caption, decimals, oracle, target, sources, options) { const evmTransaction = await this.contract .settlePriceFeedOracle .populateTransaction(caption, decimals, typeof oracle === "string" ? Object.values(types_1.PriceFeedOracles).indexOf(oracle) : oracle, target, sources || "0x0000000000000000000000000000000000000000000000000000000000000000"); evmTransaction.gasPrice = options?.evmGasPrice || evmTransaction?.gasPrice; return this.signer .sendTransaction(evmTransaction) .then(response => { if (options?.onTransaction) { options.onTransaction(response.hash); } return response.wait(options?.evmConfirmations || 1, options?.evmTimeout); }) .then(receipt => { if (options?.onTransactionReceipt) { options.onTransactionReceipt(receipt); } return receipt; }); } async settlePriceFeedMapper(caption, decimals, mapper, dependencies, options) { const evmTransaction = await this.contract .settlePriceFeedMapper .populateTransaction(caption, decimals, typeof mapper === "string" ? Object.values(types_1.PriceFeedMappers).indexOf(mapper) : mapper, dependencies); evmTransaction.gasPrice = options?.evmGasPrice || evmTransaction?.gasPrice; return this.signer .sendTransaction(evmTransaction) .then(response => { if (options?.onTransaction) { options.onTransaction(response.hash); } return response.wait(options?.evmConfirmations || 1, options?.evmTimeout); }) .then(receipt => { if (options?.onTransactionReceipt) { options.onTransactionReceipt(receipt); } return receipt; }); } async removePriceFeed(caption, options) { const evmTransaction = await this.contract .removePriceFeed .populateTransaction(caption, true); evmTransaction.gasPrice = options?.evmGasPrice || evmTransaction?.gasPrice; return this.signer .sendTransaction(evmTransaction) .then(response => { if (options?.onTransaction) { options.onTransaction(response.hash); } return response.wait(options?.evmConfirmations || 1, options?.evmTimeout); }) .then(receipt => { if (options?.onTransactionReceipt) { options.onTransactionReceipt(receipt); } return receipt; }); } async settleDefaultUpdateConditions(conditions, options) { const evmTransaction = await this.contract .settleDefaultUpdateConditions .populateTransaction((0, utils_1.abiEncodePriceFeedUpdateConditions)(conditions)); evmTransaction.gasPrice = options?.evmGasPrice || evmTransaction?.gasPrice; return this.signer .sendTransaction(evmTransaction) .then(response => { if (options?.onTransaction) { options.onTransaction(response.hash); } return response.wait(options?.evmConfirmations || 1, options?.evmTimeout); }) .then(receipt => { if (options?.onTransactionReceipt) { options.onTransactionReceipt(receipt); } return receipt; }); } async settlePriceFeedUpdateConditions(caption, conditions, options) { const evmTransaction = await this.contract .settlePriceFeedUpdateConditions .populateTransaction(caption, (0, utils_1.abiEncodePriceFeedUpdateConditions)(conditions)); evmTransaction.gasPrice = options?.evmGasPrice || evmTransaction?.gasPrice; return this.signer .sendTransaction(evmTransaction) .then(response => { if (options?.onTransaction) { options.onTransaction(response.hash); } return response.wait(options?.evmConfirmations || 1, options?.evmTimeout); }) .then(receipt => { if (options?.onTransactionReceipt) { options.onTransactionReceipt(receipt); } return receipt; }); } async clone(curator, options) { const tx = await this.contract.clone.populateTransaction(curator); tx.gasPrice = options?.evmGasPrice || tx?.gasPrice; return this.signer .sendTransaction(tx) .then(response => { if (options?.onTransaction) { options.onTransaction(response.hash); } return response.wait(options?.evmConfirmations || 1, options?.evmTimeout); }) .then(receipt => { if (options?.onTransactionReceipt) { options.onTransactionReceipt(receipt); } return receipt; }); } async getDefaultUpdateConditions() { return this.contract .defaultUpdateConditions .staticCall(); } async determineChainlinkAggregatorAddress(id4) { return this.contract .createChainlinkAggregator .staticCall(id4); } async getEvmClonableBase() { return this.contract .base .staticCall(); } async getEvmConsumer() { return this.contract .consumer .staticCall(); } async getEvmCurator() { return this.contract .owner .staticCall(); } async getEvmFootprint() { return this.contract .footprint .staticCall(); } async getId4(caption) { return this.contract .hash .staticCall(caption) .then(id => id.slice(0, 10)); } async getPrice(id4) { return this.contract .getFunction("getPrice(bytes4)") .staticCall(id4) .then((result) => ({ price: Number(result.price) / 10 ** Number(-result.exponent), deltaPrice: Number(result.deltaPrice) / 10 ** Number(-result.exponent), exponent: Number(result.exponent), timestamp: Number(result.timestamp), trail: result.trail, })); } async getPriceNotOlderThan(id4, age) { return this.contract .getFunction("getPriceNotOlderThan(bytes4,uint24)") .staticCall(id4, age) .then((result) => ({ price: Number(result.price) / 10 ** Number(-result.exponent), deltaPrice: Number(result.deltaPrice) / 10 ** Number(-result.exponent), exponent: Number(result.exponent), timestamp: Number(result.timestamp), trail: result.trail, })); } async getPriceUnsafe(id4) { return this.contract .getFunction("getPriceUnsafe(bytes4)") .staticCall(id4) .then((result) => ({ price: Number(result.price) / 10 ** Number(-result.exponent), deltaPrice: Number(result.deltaPrice) / 10 ** Number(-result.exponent), exponent: Number(result.exponent), timestamp: Number(result.timestamp), trail: result.trail, })); } async isCaptionSupported(caption) { return this.contract .supportsCaption .staticCall(caption); } async lookupPriceFeed(id4) { return this.contract .lookupPriceFeed .staticCall(id4) .then((result) => ({ id: result.id, id4: result.id.slice(0, 10), exponent: Number(result.exponent), symbol: result.symbol, ...(result.mapper.class !== 0n ? { mapper: { class: types_1.PriceFeedMappers[result.mapper.class], deps: result.mapper.deps, } } : { oracle: { class: types_1.PriceFeedOracles[result.oracle.class], target: result.oracle.target, sources: result.oracle.sources, }, }), updateConditions: { callbackGas: Number(result.updateConditions.callbackGas), computeEMA: result.updateConditions.computeEma, cooldownSecs: Number(result.updateConditions.cooldownSecs), heartbeatSecs: Number(result.updateConditions.heartbeatSecs), maxDeviationPercentage: Number(result.updateConditions.maxDeviation1000) / 10, minWitnesses: Number(result.updateConditions.minWitnesses), }, lastUpdate: { price: Number(result.lastUpdate.price) / 10 ** Number(-result.lastUpdate.exponent), deltaPrice: Number(result.lastUpdate.deltaPrice) / 10 ** Number(-result.lastUpdate.exponent), exponent: Number(result.lastUpdate.exponent), timestamp: Number(result.lastUpdate.timestamp), trail: result.lastUpdate.trail, }, })); } async lookupPriceFeedCaption(id4) { return this.contract .lookupSymbol .staticCall(id4); } async lookupPriceFeedExponent(id4) { return this.contract .lookupPriceFeedExponent .staticCall(id4) .then(result => Number(result)); } async lookupPriceFeedID(id4) { return this.contract .lookupPriceFeedID .staticCall(id4); } async lookupPriceFeeds() { return this.contract .lookupPriceFeeds .staticCall() .then(results => results.map((result) => ({ id: result.id, id4: result.id.slice(0, 10), exponent: Number(result.exponent), symbol: result.symbol, ...(result.mapper.class !== 0n ? { mapper: { class: types_1.PriceFeedMappers[result.mapper.class], deps: result.mapper.deps, } } : { oracle: { class: types_1.PriceFeedOracles[result.oracle.class], target: result.oracle.target, sources: result.oracle.sources, }, }), updateConditions: { callbackGas: Number(result.updateConditions.callbackGas), computeEMA: result.updateConditions.computeEma, cooldownSecs: Number(result.updateConditions.cooldownSecs), heartbeatSecs: Number(result.updateConditions.heartbeatSecs), maxDeviationPercentage: Number(result.updateConditions.maxDeviation1000) / 10, minWitnesses: Number(result.updateConditions.minWitnesses) }, lastUpdate: { price: Number(result.lastUpdate.price) / 10 ** Number(-result.lastUpdate.exponent), deltaPrice: Number(result.lastUpdate.deltaPrice) / 10 ** Number(-result.lastUpdate.exponent), exponent: Number(result.lastUpdate.exponent), timestamp: BigInt(result.lastUpdate.timestamp), trail: result.lastUpdate.trail, }, }))); } } exports.WitPriceFeeds = WitPriceFeeds; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV2l0UHJpY2VGZWVkcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvd3JhcHBlcnMvV2l0UHJpY2VGZWVkcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtQ0FNZTtBQUdmLG9DQUFzRjtBQUN0RixvQ0FPaUI7QUFFakIsaURBQTZDO0FBRzdDLE1BQWEsYUFBYyxTQUFRLDJCQUFZO0lBRTNDLFlBQXVCLFNBQW9CLEVBQUUsRUFBVTtRQUNuRCxLQUFLLENBQUMsU0FBUyxFQUFFLGVBQWUsRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUN6QyxDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsU0FBb0IsRUFBRSxNQUFjO1FBQ2hELE1BQU0sVUFBVSxHQUFHLElBQUksYUFBYSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQTtRQUN2RCxJQUFJLFVBQVUsQ0FBQTtRQUNkLElBQUksQ0FBQztZQUNELFVBQVUsR0FBRyxNQUFNLFVBQVUsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFBO1FBQ2pFLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDTCxVQUFVLEdBQUcsTUFBTSxVQUFVLENBQUMsUUFBUTtpQkFDakMsSUFBSSxDQUFDO2dCQUNGLEVBQUUsRUFBRSxNQUFNO2dCQUNWLElBQUksRUFBRSxZQUFZLEVBQUUseUJBQXlCO2FBQ2hELENBQUM7aUJBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsaUJBQVEsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztpQkFDdEUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDM0MsQ0FBQztRQUNELElBQUksVUFBVSxLQUFLLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNuQyxN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QU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQztnQkFDNUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQztnQkFDOUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSzthQUNqQztTQUNKLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDYixDQUFDO0NBRUo7QUE3ZUQsc0NBNmVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgXHJcbiAgICBmb3JtYXRVbml0cyxcclxuICAgIEFiaUNvZGVyLFxyXG4gICAgQ29udHJhY3RUcmFuc2FjdGlvbiwgXHJcbiAgICBDb250cmFjdFRyYW5zYWN0aW9uUmVjZWlwdCwgXHJcbiAgICBUcmFuc2FjdGlvblJlY2VpcHQsXHJcbn0gZnJvbSBcImV0aGVyc1wiXHJcblxyXG5pbXBvcnQgeyBXaXRuZXQgfSBmcm9tIFwiQHdpdG5ldC9zZGtcIlxyXG5pbXBvcnQgeyBhYmlFbmNvZGVEYXRhUHVzaFJlcG9ydCwgYWJpRW5jb2RlUHJpY2VGZWVkVXBkYXRlQ29uZGl0aW9ucyB9IGZyb20gXCIuLi91dGlsc1wiXHJcbmltcG9ydCB7IFxyXG4gICAgRGF0YVB1c2hSZXBvcnQsXHJcbiAgICBQcmljZUZlZWQsXHJcbiAgICBQcmljZUZlZWRNYXBwZXJzLFxyXG4gICAgUHJpY2VGZWVkT3JhY2xlcyxcclxuICAgIFByaWNlRmVlZFVwZGF0ZSxcclxuICAgIFByaWNlRmVlZFVwZGF0ZUNvbmRpdGlvbnMsXHJcbn0gZnJvbSBcIi4uL3R5cGVzXCJcclxuXHJcbmltcG9ydCB7IFdpdEFwcGxpYW5jZSB9IGZyb20gXCIuL1dpdEFwcGxpYW5jZVwiXHJcbmltcG9ydCB7IFdpdE9yYWNsZSB9IGZyb20gXCIuL1dpdE9yYWNsZVwiXHJcblxyXG5leHBvcnQgY2xhc3MgV2l0UHJpY2VGZWVkcyBleHRlbmRzIFdpdEFwcGxpYW5jZSB7XHJcbiAgICBcclxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RvciAod2l0T3JhY2xlOiBXaXRPcmFjbGUsIGF0OiBzdHJpbmcpIHtcclxuICAgICAgICBzdXBlcih3aXRPcmFjbGUsIFwiV2l0UHJpY2VGZWVkc1wiLCBhdClcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgYXN5bmMgYXQod2l0T3JhY2xlOiBXaXRPcmFjbGUsIHRhcmdldDogc3RyaW5nKTogUHJvbWlzZTxXaXRQcmljZUZlZWRzPiB7XHJcbiAgICAgICAgY29uc3QgcHJpY2VGZWVkcyA9IG5ldyBXaXRQcmljZUZlZWRzKHdpdE9yYWNsZSwgdGFyZ2V0KVxyXG4gICAgICAgIGxldCBvcmFjbGVBZGRyXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgb3JhY2xlQWRkciA9IGF3YWl0IHByaWNlRmVlZHMuY29udHJhY3Qud2l0T3JhY2xlLnN0YXRpY0NhbGwoKVxyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICBvcmFjbGVBZGRyID0gYXdhaXQgcHJpY2VGZWVkcy5wcm92aWRlclxyXG4gICAgICAgICAgICAgICAgLmNhbGwoe1xyXG4gICAgICAgICAgICAgICAgICAgIHRvOiB0YXJnZXQsXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogXCIweDQ2ZDFkMjFhXCIsIC8vIGZ1bmNTaWcgZm9yICd3aXRuZXQoKSdcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAudGhlbihyZXN1bHQgPT4gQWJpQ29kZXIuZGVmYXVsdEFiaUNvZGVyKCkuZGVjb2RlKFtcImFkZHJlc3NcIl0sIHJlc3VsdCkpXHJcbiAgICAgICAgICAgICAgICAudGhlbihyZXN1bHQgPT4gcmVzdWx0LnRvU3RyaW5nKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAob3JhY2xlQWRkciAhPT0gd2l0T3JhY2xlLmFkZHJlc3MpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0gYXQgJHt0YXJnZXR9OiBtaXNtYXRjaGluZyBXaXQvT3JhY2xlIGFkZHJlc3MgKCR7b3JhY2xlQWRkcn0pYClcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHByaWNlRmVlZHNcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgY3JlYXRlQ2hhaW5saW5rQWdncmVnYXRvcihpZDQ6IFdpdG5ldC5IZXhTdHJpbmcsIG9wdGlvbnM/OiB7XHJcbiAgICAgICAgZXZtQ29uZmlybWF0aW9ucz86IG51bWJlcixcclxuICAgICAgICBldm1HYXNQcmljZT86IGJpZ2ludCxcclxuICAgICAgICBldm1UaW1lb3V0PzogbnVtYmVyLFxyXG4gICAgICAgIG9uVHJhbnNhY3Rpb24/OiAodHhIYXNoOiBXaXRuZXQuSGFzaCkgPT4gYW55LFxyXG4gICAgICAgIG9uVHJhbnNhY3Rpb25SZWNlaXB0PzogKHJlY2VpcHQ6IFRyYW5zYWN0aW9uUmVjZWlwdCB8IG51bGwpID0+IGFueSxcclxuICAgIH0pOiBQcm9taXNlPENvbnRyYWN0VHJhbnNhY3Rpb25SZWNlaXB0IHwgVHJhbnNhY3Rpb25SZWNlaXB0IHwgbnVsbD4ge1xyXG4gICAgICAgIGNvbnN0IGV2bVRyYW5zYWN0aW9uOiBDb250cmFjdFRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5jb250cmFjdFxyXG4gICAgICAgICAgICAuY3JlYXRlQ2hhaW5saW5rQWdncmVnYXRvclxyXG4gICAgICAgICAgICAucG9wdWxhdGVUcmFuc2FjdGlvbihpZDQpXHJcbiAgICAgICAgZXZtVHJhbnNhY3Rpb24uZ2FzUHJpY2UgPSBvcHRpb25zPy5ldm1HYXNQcmljZSB8fCBldm1UcmFuc2FjdGlvbj8uZ2FzUHJpY2VcclxuICAgICAgICByZXR1cm4gdGhpcy5zaWduZXJcclxuICAgICAgICAgICAgLnNlbmRUcmFuc2FjdGlvbihldm1UcmFuc2FjdGlvbilcclxuICAgICAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnM/Lm9uVHJhbnNhY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLm9uVHJhbnNhY3Rpb24ocmVzcG9uc2UuaGFzaCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2Uud2FpdChvcHRpb25zPy5ldm1Db25maXJtYXRpb25zIHx8IDEsIG9wdGlvbnM/LmV2bVRpbWVvdXQpXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC50aGVuKHJlY2VpcHQgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnM/Lm9uVHJhbnNhY3Rpb25SZWNlaXB0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5vblRyYW5zYWN0aW9uUmVjZWlwdChyZWNlaXB0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiByZWNlaXB0XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIHB1c2hEYXRhUmVwb3J0KHJlcG9ydDogRGF0YVB1c2hSZXBvcnQsIG9wdGlvbnM/OiB7IFxyXG4gICAgICAgIGNvbmZpcm1hdGlvbnM/OiBudW1iZXIsIFxyXG4gICAgICAgIGdhc1ByaWNlPzogYmlnaW50LFxyXG4gICAgICAgIGdhc0xpbWl0PzogYmlnaW50LFxyXG4gICAgICAgIG1heEdhc1ByaWNlPzogYmlnaW50LFxyXG4gICAgICAgIHRpbWVvdXQ/OiBudW1iZXIsXHJcbiAgICAgICAgb25UcmFuc2FjdGlvbj86ICh0eEhhc2g6IHN0cmluZykgPT4gYW55LFxyXG4gICAgICAgIG9uVHJhbnNhY3Rpb25SZWNlaXB0PzogKHJlY2VpcHQ6IFRyYW5zYWN0aW9uUmVjZWlwdCB8IG51bGwpID0+IGFueSxcclxuICAgIH0pOiBQcm9taXNlPENvbnRyYWN0VHJhbnNhY3Rpb25SZWNlaXB0IHwgVHJhbnNhY3Rpb25SZWNlaXB0IHwgbnVsbD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRyYWN0XHJcbiAgICAgICAgICAgIC5wdXNoRGF0YVJlcG9ydFxyXG4gICAgICAgICAgICAucG9wdWxhdGVUcmFuc2FjdGlvbihhYmlFbmNvZGVEYXRhUHVzaFJlcG9ydChyZXBvcnQpLCByZXBvcnQ/LmV2bV9wcm9vZilcclxuICAgICAgICAgICAgLnRoZW4odHggPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zPy5nYXNQcmljZSAmJiB0eD8uZ2FzUHJpY2UgJiYgb3B0aW9ucz8ubWF4R2FzUHJpY2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHguZ2FzUHJpY2UgPiBvcHRpb25zLm1heEdhc1ByaWNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9OiBuZXR3b3JrIGdhcyBwcmljZSB0b28gaGlnaDogJHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdFVuaXRzKHR4Lmdhc1ByaWNlLCA5KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA+ICR7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRVbml0cyhvcHRpb25zLm1heEdhc1ByaWNlLCA5KX0gZ3dlaWApXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdHguZ2FzUHJpY2UgPSBvcHRpb25zPy5nYXNQcmljZSB8fCB0eD8uZ2FzUHJpY2UgXHJcbiAgICAgICAgICAgICAgICB0eC5nYXNMaW1pdCA9IG9wdGlvbnM/Lmdhc0xpbWl0IHx8IHR4Py5nYXNMaW1pdFxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2lnbmVyLnNlbmRUcmFuc2FjdGlvbih0eClcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnM/Lm9uVHJhbnNhY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLm9uVHJhbnNhY3Rpb24ocmVzcG9uc2UuaGFzaCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2Uud2FpdChvcHRpb25zPy5jb25maXJtYXRpb25zIHx8IDEsIG9wdGlvbnM/LnRpbWVvdXQpXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC50aGVuKHJlY2VpcHQgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnM/Lm9uVHJhbnNhY3Rpb25SZWNlaXB0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5vblRyYW5zYWN0aW9uUmVjZWlwdChyZWNlaXB0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiByZWNlaXB0XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIHNldHRsZVByaWNlRmVlZFJhZG9uSGFzaChjYXB0aW9uOiBzdHJpbmcsIGRlY2ltYWxzOiBudW1iZXIsIHJhZEhhc2g6IFdpdG5ldC5IZXhTdHJpbmcsIG9wdGlvbnM/OiB7XHJcbiAgICAgICAgZXZtQ29uZmlybWF0aW9ucz86IG51bWJlcixcclxuICAgICAgICBldm1HYXNQcmljZT86IGJpZ2ludCxcclxuICAgICAgICBldm1UaW1lb3V0PzogbnVtYmVyLFxyXG4gICAgICAgIG9uVHJhbnNhY3Rpb24/OiAodHhIYXNoOiBXaXRuZXQuSGFzaCkgPT4gYW55LFxyXG4gICAgICAgIG9uVHJhbnNhY3Rpb25SZWNlaXB0PzogKHJlY2VpcHQ6IFRyYW5zYWN0aW9uUmVjZWlwdCB8IG51bGwpID0+IGFueSxcclxuICAgIH0pOiBQcm9taXNlPENvbnRyYWN0VHJhbnNhY3Rpb25SZWNlaXB0IHwgVHJhbnNhY3Rpb25SZWNlaXB0IHwgbnVsbD4ge1xyXG4gICAgICAgIGNvbnN0IGV2bVRyYW5zYWN0aW9uOiBDb250cmFjdFRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5jb250cmFjdFxyXG4gICAgICAgICAgICAuc2V0dGxlUHJpY2VGZWVkUmFkb25IYXNoXHJcbiAgICAgICAgICAgIC5wb3B1bGF0ZVRyYW5zYWN0aW9uKGNhcHRpb24sIGRlY2ltYWxzLCByYWRIYXNoKVxyXG4gICAgICAgIGV2bVRyYW5zYWN0aW9uLmdhc1ByaWNlID0gb3B0aW9ucz8uZXZtR2FzUHJpY2UgfHwgZXZtVHJhbnNhY3Rpb24/Lmdhc1ByaWNlXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2lnbmVyXHJcbiAgICAgICAgICAgIC5zZW5kVHJhbnNhY3Rpb24oZXZtVHJhbnNhY3Rpb24pXHJcbiAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zPy5vblRyYW5zYWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5vblRyYW5zYWN0aW9uKHJlc3BvbnNlLmhhc2gpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLndhaXQob3B0aW9ucz8uZXZtQ29uZmlybWF0aW9ucyB8fCAxLCBvcHRpb25zPy5ldm1UaW1lb3V0KVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAudGhlbihyZWNlaXB0ID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zPy5vblRyYW5zYWN0aW9uUmVjZWlwdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMub25UcmFuc2FjdGlvblJlY2VpcHQocmVjZWlwdCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVjZWlwdFxyXG4gICAgICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBzZXR0bGVQcmljZUZlZWRPcmFjbGUoXHJcbiAgICAgICAgY2FwdGlvbjogc3RyaW5nLCBcclxuICAgICAgICBkZWNpbWFsczogbnVtYmVyLCBcclxuICAgICAgICBvcmFjbGU6IFByaWNlRmVlZE9yYWNsZXMgfCBzdHJpbmcsXHJcbiAgICAgICAgdGFyZ2V0OiBXaXRuZXQuSGV4U3RyaW5nLFxyXG4gICAgICAgIHNvdXJjZXM/OiBXaXRuZXQuSGV4U3RyaW5nLFxyXG4gICAgICAgIG9wdGlvbnM/OiB7XHJcbiAgICAgICAgICAgIGV2bUNvbmZpcm1hdGlvbnM/OiBudW1iZXIsXHJcbiAgICAgICAgICAgIGV2bUdhc1ByaWNlPzogYmlnaW50LFxyXG4gICAgICAgICAgICBldm1UaW1lb3V0PzogbnVtYmVyLFxyXG4gICAgICAgICAgICBvblRyYW5zYWN0aW9uPzogKHR4SGFzaDogV2l0bmV0Lkhhc2gpID0+IGFueSxcclxuICAgICAgICAgICAgb25UcmFuc2FjdGlvblJlY2VpcHQ/OiAocmVjZWlwdDogVHJhbnNhY3Rpb25SZWNlaXB0IHwgbnVsbCkgPT4gYW55LFxyXG4gICAgICAgIH1cclxuICAgICk6IFByb21pc2U8Q29udHJhY3RUcmFuc2FjdGlvblJlY2VpcHQgfCBUcmFuc2FjdGlvblJlY2VpcHQgfCBudWxsPiB7XHJcbiAgICAgICAgY29uc3QgZXZtVHJhbnNhY3Rpb246IENvbnRyYWN0VHJhbnNhY3Rpb24gPSBhd2FpdCB0aGlzLmNvbnRyYWN0XHJcbiAgICAgICAgICAgIC5zZXR0bGVQcmljZUZlZWRPcmFjbGVcclxuICAgICAgICAgICAgLnBvcHVsYXRlVHJhbnNhY3Rpb24oXHJcbiAgICAgICAgICAgICAgICBjYXB0aW9uLCBcclxuICAgICAgICAgICAgICAgIGRlY2ltYWxzLCBcclxuICAgICAgICAgICAgICAgIHR5cGVvZiBvcmFjbGUgPT09IFwic3RyaW5nXCIgPyBPYmplY3QudmFsdWVzKFByaWNlRmVlZE9yYWNsZXMpLmluZGV4T2Yob3JhY2xlKSA6IG9yYWNsZSwgXHJcbiAgICAgICAgICAgICAgICB0YXJnZXQsIFxyXG4gICAgICAgICAgICAgICAgc291cmNlcyB8fCBcIjB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMFwiLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIGV2bVRyYW5zYWN0aW9uLmdhc1ByaWNlID0gb3B0aW9ucz8uZXZtR2FzUHJpY2UgfHwgZXZtVHJhbnNhY3Rpb24/Lmdhc1ByaWNlXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2lnbmVyXHJcbiAgICAgICAgICAgIC5zZW5kVHJhbnNhY3Rpb24oZXZtVHJhbnNhY3Rpb24pXHJcbiAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zPy5vblRyYW5zYWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5vblRyYW5zYWN0aW9uKHJlc3BvbnNlLmhhc2gpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLndhaXQob3B0aW9ucz8uZXZtQ29uZmlybWF0aW9ucyB8fCAxLCBvcHRpb25zPy5ldm1UaW1lb3V0KVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAudGhlbihyZWNlaXB0ID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zPy5vblRyYW5zYWN0aW9uUmVjZWlwdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMub25UcmFuc2FjdGlvblJlY2VpcHQocmVjZWlwdCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVjZWlwdFxyXG4gICAgICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBzZXR0bGVQcmljZUZlZWRNYXBwZXIoXHJcbiAgICAgICAgY2FwdGlvbjogc3RyaW5nLCBcclxuICAgICAgICBkZWNpbWFsczogbnVtYmVyLCBcclxuICAgICAgICBtYXBwZXI6IFByaWNlRmVlZE1hcHBlcnMgfCBzdHJpbmcsXHJcbiAgICAgICAgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXSxcclxuICAgICAgICBvcHRpb25zPzoge1xyXG4gICAgICAgICAgICBldm1Db25maXJtYXRpb25zPzogbnVtYmVyLFxyXG4gICAgICAgICAgICBldm1HYXNQcmljZT86IGJpZ2ludCxcclxuICAgICAgICAgICAgZXZtVGltZW91dD86IG51bWJlcixcclxuICAgICAgICAgICAgb25UcmFuc2FjdGlvbj86ICh0eEhhc2g6IFdpdG5ldC5IYXNoKSA9PiBhbnksXHJcbiAgICAgICAgICAgIG9uVHJhbnNhY3Rpb25SZWNlaXB0PzogKHJlY2VpcHQ6IFRyYW5zYWN0aW9uUmVjZWlwdCB8IG51bGwpID0+IGFueSxcclxuICAgICAgICB9XHJcbiAgICApOiBQcm9taXNlPENvbnRyYWN0VHJhbnNhY3Rpb25SZWNlaXB0IHwgVHJhbnNhY3Rpb25SZWNlaXB0IHwgbnVsbD4ge1xyXG4gICAgICAgIGNvbnN0IGV2bVRyYW5zYWN0aW9uOiBDb250cmFjdFRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5jb250cmFjdFxyXG4gICAgICAgICAgICAuc2V0dGxlUHJpY2VGZWVkTWFwcGVyXHJcbiAgICAgICAgICAgIC5wb3B1bGF0ZVRyYW5zYWN0aW9uKFxyXG4gICAgICAgICAgICAgICAgY2FwdGlvbiwgXHJcbiAgICAgICAgICAgICAgICBkZWNpbWFscywgXHJcbiAgICAgICAgICAgICAgICB0eXBlb2YgbWFwcGVyID09PSBcInN0cmluZ1wiID8gT2JqZWN0LnZhbHVlcyhQcmljZUZlZWRNYXBwZXJzKS5pbmRleE9mKG1hcHBlcikgOiBtYXBwZXIsIFxyXG4gICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIGV2bVRyYW5zYWN0aW9uLmdhc1ByaWNlID0gb3B0aW9ucz8uZXZtR2FzUHJpY2UgfHwgZXZtVHJhbnNhY3Rpb24/Lmdhc1ByaWNlXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2lnbmVyXHJcbiAgICAgICAgICAgIC5zZW5kVHJhbnNhY3Rpb24oZXZtVHJhbnNhY3Rpb24pXHJcbiAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zPy5vblRyYW5zYWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5vblRyYW5zYWN0aW9uKHJlc3BvbnNlLmhhc2gpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLndhaXQob3B0aW9ucz8uZXZtQ29uZmlybWF0aW9ucyB8fCAxLCBvcHRpb25zPy5ldm1UaW1lb3V0KVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAudGhlbihyZWNlaXB0ID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zPy5vblRyYW5zYWN0aW9uUmVjZWlwdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMub25UcmFuc2FjdGlvblJlY2VpcHQocmVjZWlwdCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVjZWlwdFxyXG4gICAgICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyByZW1vdmVQcmljZUZlZWQoY2FwdGlvbjogc3RyaW5nLCBvcHRpb25zPzoge1xyXG4gICAgICAgIGV2bUNvbmZpcm1hdGlvbnM/OiBudW1iZXIsXHJcbiAgICAgICAgZXZtR2FzUHJpY2U/OiBiaWdpbnQsXHJcbiAgICAgICAgZXZtVGltZW91dD86IG51bWJlcixcclxuICAgICAgICBvblRyYW5zYWN0aW9uPzogKHR4SGFzaDogV2l0bmV0Lkhhc2gpID0+IGFueSxcclxuICAgICAgICBvblRyYW5zYWN0aW9uUmVjZWlwdD86IChyZWNlaXB0OiBUcmFuc2FjdGlvblJlY2VpcHQgfCBudWxsKSA9PiBhbnksXHJcbiAgICB9KTogUHJvbWlzZTxDb250cmFjdFRyYW5zYWN0aW9uUmVjZWlwdCB8IFRyYW5zYWN0aW9uUmVjZWlwdCB8IG51bGw+IHtcclxuICAgICAgICBjb25zdCBldm1UcmFuc2FjdGlvbjogQ29udHJhY3RUcmFuc2FjdGlvbiA9IGF3YWl0IHRoaXMuY29udHJhY3RcclxuICAgICAgICAgICAgLnJlbW92ZVByaWNlRmVlZFxyXG4gICAgICAgICAgICAucG9wdWxhdGVUcmFuc2FjdGlvbihjYXB0aW9uLCB0cnVlKTtcclxuICAgICAgICBldm1UcmFuc2FjdGlvbi5nYXNQcmljZSA9IG9wdGlvbnM/LmV2bUdhc1ByaWNlIHx8IGV2bVRyYW5zYWN0aW9uPy5nYXNQcmljZVxyXG4gICAgICAgIHJldHVybiB0aGlzLnNpZ25lclxyXG4gICAgICAgICAgICAuc2VuZFRyYW5zYWN0aW9uKGV2bVRyYW5zYWN0aW9uKVxyXG4gICAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucz8ub25UcmFuc2FjdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMub25UcmFuc2FjdGlvbihyZXNwb25zZS5oYXNoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZS53YWl0KG9wdGlvbnM/LmV2bUNvbmZpcm1hdGlvbnMgfHwgMSwgb3B0aW9ucz8uZXZtVGltZW91dClcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgLnRoZW4ocmVjZWlwdCA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucz8ub25UcmFuc2FjdGlvblJlY2VpcHQpIHtcclxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLm9uVHJhbnNhY3Rpb25SZWNlaXB0KHJlY2VpcHQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlY2VpcHRcclxuICAgICAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgc2V0dGxlRGVmYXVsdFVwZGF0ZUNvbmRpdGlvbnMoY29uZGl0aW9uczogUHJpY2VGZWVkVXBkYXRlQ29uZGl0aW9ucywgb3B0aW9ucz86IHtcclxuICAgICAgICBldm1Db25maXJtYXRpb25zPzogbnVtYmVyLFxyXG4gICAgICAgIGV2bUdhc1ByaWNlPzogYmlnaW50LFxyXG4gICAgICAgIGV2bVRpbWVvdXQ/OiBudW1iZXIsXHJcbiAgICAgICAgb25UcmFuc2FjdGlvbj86ICh0eEhhc2g6IFdpdG5ldC5IYXNoKSA9PiBhbnksXHJcbiAgICAgICAgb25UcmFuc2FjdGlvblJlY2VpcHQ/OiAocmVjZWlwdDogVHJhbnNhY3Rpb25SZWNlaXB0IHwgbnVsbCkgPT4gYW55LFxyXG4gICAgfSk6IFByb21pc2U8Q29udHJhY3RUcmFuc2FjdGlvblJlY2VpcHQgfCBUcmFuc2FjdGlvblJlY2VpcHQgfCBudWxsPiB7XHJcbiAgICAgICAgY29uc3QgZXZtVHJhbnNhY3Rpb246IENvbnRyYWN0VHJhbnNhY3Rpb24gPSBhd2FpdCB0aGlzLmNvbnRyYWN0XHJcbiAgICAgICAgICAgIC5zZXR0bGVEZWZhdWx0VXBkYXRlQ29uZGl0aW9uc1xyXG4gICAgICAgICAgICAucG9wdWxhdGVUcmFuc2FjdGlvbihcclxuICAgICAgICAgICAgICAgIGFiaUVuY29kZVByaWNlRmVlZFVwZGF0ZUNvbmRpdGlvbnMoY29uZGl0aW9ucyksXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgZXZtVHJhbnNhY3Rpb24uZ2FzUHJpY2UgPSBvcHRpb25zPy5ldm1HYXNQcmljZSB8fCBldm1UcmFuc2FjdGlvbj8uZ2FzUHJpY2VcclxuICAgICAgICByZXR1cm4gdGhpcy5zaWduZXJcclxuICAgICAgICAgICAgLnNlbmRUcmFuc2FjdGlvbihldm1UcmFuc2FjdGlvbilcclxuICAgICAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnM/Lm9uVHJhbnNhY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLm9uVHJhbnNhY3Rpb24ocmVzcG9uc2UuaGFzaCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2Uud2FpdChvcHRpb25zPy5ldm1Db25maXJtYXRpb25zIHx8IDEsIG9wdGlvbnM/LmV2bVRpbWVvdXQpXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC50aGVuKHJlY2VpcHQgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnM/Lm9uVHJhbnNhY3Rpb25SZWNlaXB0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5vblRyYW5zYWN0aW9uUmVjZWlwdChyZWNlaXB0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiByZWNlaXB0XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIHNldHRsZVByaWNlRmVlZFVwZGF0ZUNvbmRpdGlvbnMoY2FwdGlvbjogc3RyaW5nLCBjb25kaXRpb25zOiBQcmljZUZlZWRVcGRhdGVDb25kaXRpb25zLCBvcHRpb25zPzoge1xyXG4gICAgICAgIGV2bUNvbmZpcm1hdGlvbnM/OiBudW1iZXIsXHJcbiAgICAgICAgZXZtR2FzUHJpY2U/OiBiaWdpbnQsXHJcbiAgICAgICAgZXZtVG