@bitgo-beta/utxo-ord 1.0.1-beta.4 → 1.0.1-beta.400
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/OutputLayout.js +2 -2
- package/dist/src/combinations.d.ts +2 -0
- package/dist/src/combinations.d.ts.map +1 -0
- package/dist/src/combinations.js +14 -0
- package/dist/src/index.js +6 -2
- package/dist/src/inscriptions.d.ts +7 -11
- package/dist/src/inscriptions.d.ts.map +1 -1
- package/dist/src/inscriptions.js +21 -13
- package/dist/src/psbt.d.ts +45 -5
- package/dist/src/psbt.d.ts.map +1 -1
- package/dist/src/psbt.js +92 -22
- package/dist/tsconfig.tsbuildinfo +1 -3864
- package/package.json +7 -5
package/dist/src/psbt.js
CHANGED
|
@@ -1,21 +1,27 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.createPsbtForSingleInscriptionPassingTransaction = exports.findOutputLayoutForWalletUnspents = exports.createPsbtFromOutputLayout = void 0;
|
|
3
|
+
exports.createPsbtForSingleInscriptionPassingTransaction = exports.ErrorNoLayout = exports.MAX_UNSPENTS_FOR_OUTPUT_LAYOUT = exports.findOutputLayoutForWalletUnspents = exports.createPsbtFromOutputLayout = exports.DefaultInscriptionConstraints = void 0;
|
|
4
4
|
const utxo_lib_1 = require("@bitgo-beta/utxo-lib");
|
|
5
5
|
const unspents_1 = require("@bitgo-beta/unspents");
|
|
6
6
|
const OrdOutput_1 = require("./OrdOutput");
|
|
7
7
|
const SatPoint_1 = require("./SatPoint");
|
|
8
8
|
const SatRange_1 = require("./SatRange");
|
|
9
9
|
const OutputLayout_1 = require("./OutputLayout");
|
|
10
|
+
const combinations_1 = require("./combinations");
|
|
11
|
+
exports.DefaultInscriptionConstraints = {
|
|
12
|
+
minChangeOutput: BigInt(10000),
|
|
13
|
+
minInscriptionOutput: BigInt(10000),
|
|
14
|
+
maxInscriptionOutput: BigInt(20000),
|
|
15
|
+
};
|
|
10
16
|
function createPsbtFromOutputLayout(network, inputBuilder, unspents, outputs, outputLayout) {
|
|
11
17
|
const psbt = utxo_lib_1.bitgo.createPsbtForNetwork({ network: network });
|
|
12
|
-
if (unspents.length
|
|
13
|
-
throw new Error(`
|
|
18
|
+
if (unspents.length === 0) {
|
|
19
|
+
throw new Error(`must provide at least one unspent`);
|
|
14
20
|
}
|
|
15
|
-
unspents.forEach((u) => utxo_lib_1.bitgo.addWalletUnspentToPsbt(psbt, u, inputBuilder.walletKeys, inputBuilder.signer, inputBuilder.cosigner
|
|
16
|
-
const
|
|
17
|
-
const ordOutputs = OutputLayout_1.getOrdOutputsForLayout(
|
|
18
|
-
OutputLayout_1.toArray(ordOutputs).forEach((ordOutput) => {
|
|
21
|
+
unspents.forEach((u) => utxo_lib_1.bitgo.addWalletUnspentToPsbt(psbt, u, inputBuilder.walletKeys, inputBuilder.signer, inputBuilder.cosigner));
|
|
22
|
+
const ordInput = OrdOutput_1.OrdOutput.joinAll(unspents.map((u) => new OrdOutput_1.OrdOutput(u.value)));
|
|
23
|
+
const ordOutputs = (0, OutputLayout_1.getOrdOutputsForLayout)(ordInput, outputLayout);
|
|
24
|
+
(0, OutputLayout_1.toArray)(ordOutputs).forEach((ordOutput) => {
|
|
19
25
|
if (ordOutput === null) {
|
|
20
26
|
return;
|
|
21
27
|
}
|
|
@@ -47,38 +53,102 @@ function createPsbtFromOutputLayout(network, inputBuilder, unspents, outputs, ou
|
|
|
47
53
|
}
|
|
48
54
|
exports.createPsbtFromOutputLayout = createPsbtFromOutputLayout;
|
|
49
55
|
function toSatRange(p) {
|
|
50
|
-
const { offset } = SatPoint_1.parseSatPoint(p);
|
|
56
|
+
const { offset } = (0, SatPoint_1.parseSatPoint)(p);
|
|
51
57
|
return new SatRange_1.SatRange(offset, offset);
|
|
52
58
|
}
|
|
53
59
|
function getFee(vsize, rateSatPerKB) {
|
|
54
60
|
return BigInt(Math.ceil((vsize * rateSatPerKB) / 1000));
|
|
55
61
|
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
62
|
+
/**
|
|
63
|
+
* @param inputs - inscription input must come first
|
|
64
|
+
* @param satPoint - location of the inscription
|
|
65
|
+
* @param outputs
|
|
66
|
+
* @param constraints
|
|
67
|
+
* @param minimizeInputs
|
|
68
|
+
*/
|
|
69
|
+
function findOutputLayoutForWalletUnspents(inputs, satPoint, outputs, constraints, { minimizeInputs = false } = {}) {
|
|
70
|
+
if (minimizeInputs) {
|
|
71
|
+
return findSmallestOutputLayoutForWalletUnspents(inputs, satPoint, outputs, constraints);
|
|
72
|
+
}
|
|
73
|
+
if (inputs.length === 0) {
|
|
74
|
+
throw new Error(`must provide at least one input`);
|
|
59
75
|
}
|
|
60
76
|
if (outputs.changeOutputs[0].chain !== outputs.changeOutputs[1].chain) {
|
|
61
77
|
// otherwise our fee calc is too complicated
|
|
62
78
|
throw new Error(`wallet outputs must be on same chain`);
|
|
63
79
|
}
|
|
64
|
-
const { minChangeOutput =
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
80
|
+
const { minChangeOutput = exports.DefaultInscriptionConstraints.minChangeOutput, minInscriptionOutput = exports.DefaultInscriptionConstraints.minInscriptionOutput, maxInscriptionOutput = exports.DefaultInscriptionConstraints.maxInscriptionOutput, } = constraints;
|
|
81
|
+
// Join all the inputs into a single inscriptionOutput.
|
|
82
|
+
// For the purposes of finding a layout there is no difference.
|
|
83
|
+
const inscriptionOutput = OrdOutput_1.OrdOutput.joinAll(inputs.map((i) => new OrdOutput_1.OrdOutput(i.value, i === inputs[0] ? [toSatRange(satPoint)] : [])));
|
|
84
|
+
const layout = (0, OutputLayout_1.findOutputLayout)(inscriptionOutput, {
|
|
68
85
|
minChangeOutput,
|
|
69
86
|
minInscriptionOutput,
|
|
70
87
|
maxInscriptionOutput,
|
|
71
|
-
feeFixed: getFee(unspents_1.VirtualSizes.txSegOverheadVSize +
|
|
88
|
+
feeFixed: getFee(unspents_1.VirtualSizes.txSegOverheadVSize +
|
|
89
|
+
unspents_1.Dimensions.fromUnspents(inputs, {
|
|
90
|
+
p2tr: { scriptPathLevel: 1 },
|
|
91
|
+
p2trMusig2: { scriptPathLevel: undefined },
|
|
92
|
+
}).getInputsVSize(), constraints.feeRateSatKB),
|
|
72
93
|
feePerOutput: getFee(unspents_1.Dimensions.fromOutputOnChain(outputs.changeOutputs[0].chain).getOutputsVSize(), constraints.feeRateSatKB),
|
|
73
94
|
});
|
|
95
|
+
return layout ? { inputs, layout } : undefined;
|
|
74
96
|
}
|
|
75
97
|
exports.findOutputLayoutForWalletUnspents = findOutputLayoutForWalletUnspents;
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
98
|
+
exports.MAX_UNSPENTS_FOR_OUTPUT_LAYOUT = 5;
|
|
99
|
+
/**
|
|
100
|
+
* @param inputs - inscription input must come first
|
|
101
|
+
* @param satPoint - location of the inscription
|
|
102
|
+
* @param outputs
|
|
103
|
+
* @param constraints
|
|
104
|
+
*/
|
|
105
|
+
function findSmallestOutputLayoutForWalletUnspents(inputs, satPoint, outputs, constraints) {
|
|
106
|
+
if (exports.MAX_UNSPENTS_FOR_OUTPUT_LAYOUT < inputs.length) {
|
|
107
|
+
throw new Error(`input array is too large`);
|
|
108
|
+
}
|
|
109
|
+
// create powerset of all supplementary inputs and find the cheapest result
|
|
110
|
+
const inputsArr = [inputs, ...(0, combinations_1.powerset)(inputs.slice(1)).map((s) => [inputs[0], ...s])];
|
|
111
|
+
return inputsArr
|
|
112
|
+
.map((inputs) => findOutputLayoutForWalletUnspents(inputs, satPoint, outputs, constraints))
|
|
113
|
+
.reduce((best, next) => {
|
|
114
|
+
if (best === undefined) {
|
|
115
|
+
return next;
|
|
116
|
+
}
|
|
117
|
+
if (next === undefined) {
|
|
118
|
+
return best;
|
|
119
|
+
}
|
|
120
|
+
return best.layout.feeOutput < next.layout.feeOutput ? best : next;
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
class ErrorNoLayout extends Error {
|
|
124
|
+
constructor() {
|
|
125
|
+
super('Could not find output layout for inscription passing transaction');
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
exports.ErrorNoLayout = ErrorNoLayout;
|
|
129
|
+
/**
|
|
130
|
+
* @param network
|
|
131
|
+
* @param inputBuilder
|
|
132
|
+
* @param unspent
|
|
133
|
+
* @param satPoint
|
|
134
|
+
* @param outputs
|
|
135
|
+
* @param constraints
|
|
136
|
+
* @param supplementaryUnspents - additional inputs to cover fee.
|
|
137
|
+
* @param [minimizeInputs=true] - try to find input combination with minimal fees. Limits supplementaryUnspents to 4.
|
|
138
|
+
*/
|
|
139
|
+
function createPsbtForSingleInscriptionPassingTransaction(network, inputBuilder, unspent, satPoint, outputs, constraints, { supplementaryUnspents = [], minimizeInputs = true, } = {}) {
|
|
140
|
+
// support for legacy call style
|
|
141
|
+
if (Array.isArray(unspent)) {
|
|
142
|
+
if (unspent.length !== 1) {
|
|
143
|
+
throw new Error(`can only pass single unspent`);
|
|
144
|
+
}
|
|
145
|
+
unspent = unspent[0];
|
|
146
|
+
}
|
|
147
|
+
const result = findOutputLayoutForWalletUnspents([unspent, ...supplementaryUnspents], satPoint, outputs, constraints, { minimizeInputs });
|
|
148
|
+
if (!result) {
|
|
149
|
+
throw new ErrorNoLayout();
|
|
80
150
|
}
|
|
81
|
-
return createPsbtFromOutputLayout(network, inputBuilder,
|
|
151
|
+
return createPsbtFromOutputLayout(network, inputBuilder, result.inputs, outputs, result.layout);
|
|
82
152
|
}
|
|
83
153
|
exports.createPsbtForSingleInscriptionPassingTransaction = createPsbtForSingleInscriptionPassingTransaction;
|
|
84
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHNidC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wc2J0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1EQUErRDtBQUMvRCxtREFBZ0U7QUFFaEUsMkNBQXdDO0FBQ3hDLHlDQUFxRDtBQUNyRCx5Q0FBc0M7QUFDdEMsaURBQWlHO0FBMEJqRyxTQUFnQiwwQkFBMEIsQ0FDeEMsT0FBZ0IsRUFDaEIsWUFBZ0MsRUFDaEMsUUFBdUMsRUFDdkMsT0FBMkIsRUFDM0IsWUFBMEI7SUFFMUIsTUFBTSxJQUFJLEdBQUcsZ0JBQUssQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQzlELElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDekIsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO0tBQ3hEO0lBQ0QsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQ3JCLGdCQUFLLENBQUMsc0JBQXNCLENBQzFCLElBQUksRUFDSixDQUFDLEVBQ0QsWUFBWSxDQUFDLFVBQVUsRUFDdkIsWUFBWSxDQUFDLE1BQU0sRUFDbkIsWUFBWSxDQUFDLFFBQVEsRUFDckIsSUFBSSxDQUFDLE9BQU8sQ0FDYixDQUNGLENBQUM7SUFDRixNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSxDQUFDO0lBQ3pCLE1BQU0sVUFBVSxHQUFHLHFDQUFzQixDQUFDLElBQUkscUJBQVMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDcEYsc0JBQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRTtRQUN4QyxJQUFJLFNBQVMsS0FBSyxJQUFJLEVBQUU7WUFDdEIsT0FBTztTQUNSO1FBQ0QsUUFBUSxTQUFTLEVBQUU7WUFDakIsZ0RBQWdEO1lBQ2hELEtBQUss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TUFBTSxDQUFDLENBQUMsY0FBYyxFQUFFLEVBQ2xGLFdBQVcsQ0FBQyxZQUFZLENBQ3pCO1FBQ0QsWUFBWSxFQUFFLE1BQU0sQ0FDbEIscUJBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLGVBQWUsRUFBRSxFQUM5RSxXQUFXLENBQUMsWUFBWSxDQUN6QjtLQUNGLENBQUMsQ0FBQztBQUNMLENBQUM7QUFwQ0QsOEVBb0NDO0FBRUQsU0FBZ0IsZ0RBQWdELENBQzlELE9BQWdCLEVBQ2hCLFlBQWdDLEVBQ2hDLFFBQXVDLEVBQ3ZDLFFBQWtCLEVBQ2xCLE9BQTJCLEVBQzNCLFdBQThDO0lBRTlDLE1BQU0sTUFBTSxHQUFHLGlDQUFpQyxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQzNGLElBQUksQ0FBQyxNQUFNLEVBQUU7UUFDWCxNQUFNLElBQUksS0FBSyxDQUFDLDZEQUE2RCxDQUFDLENBQUM7S0FDaEY7SUFDRCxPQUFPLDBCQUEwQixDQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztBQUN0RixDQUFDO0FBYkQsNEdBYUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZXR3b3JrLCBiaXRnbywgYWRkcmVzcyB9IGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcbmltcG9ydCB7IERpbWVuc2lvbnMsIFZpcnR1YWxTaXplcyB9IGZyb20gJ0BiaXRnby1iZXRhL3Vuc3BlbnRzJztcblxuaW1wb3J0IHsgT3JkT3V0cHV0IH0gZnJvbSAnLi9PcmRPdXRwdXQnO1xuaW1wb3J0IHsgcGFyc2VTYXRQb2ludCwgU2F0UG9pbnQgfSBmcm9tICcuL1NhdFBvaW50JztcbmltcG9ydCB7IFNhdFJhbmdlIH0gZnJvbSAnLi9TYXRSYW5nZSc7XG5pbXBvcnQgeyBnZXRPcmRPdXRwdXRzRm9yTGF5b3V0LCBPdXRwdXRMYXlvdXQsIHRvQXJyYXksIGZpbmRPdXRwdXRMYXlvdXQgfSBmcm9tICcuL091dHB1dExheW91dCc7XG5cbmV4cG9ydCB0eXBlIFdhbGxldE91dHB1dFBhdGggPSB7XG4gIGNoYWluOiBiaXRnby5DaGFpbkNvZGU7XG4gIGluZGV4OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBXYWxsZXRJbnB1dEJ1aWxkZXIgPSB7XG4gIHdhbGxldEtleXM6IGJpdGdvLlJvb3RXYWxsZXRLZXlzO1xuICBzaWduZXI6IGJpdGdvLktleU5hbWU7XG4gIGNvc2lnbmVyOiBiaXRnby5LZXlOYW1lO1xufTtcblxuZXhwb3J0IHR5cGUgSW5zY3JpcHRpb25PdXRwdXRzID0ge1xuICBpbnNjcmlwdGlvblJlY2lwaWVudDogc3RyaW5nIHwgQnVmZmVyO1xuICBjaGFuZ2VPdXRwdXRzOiBbV2FsbGV0T3V0cHV0UGF0aCwgV2FsbGV0T3V0cHV0UGF0aF07XG59O1xuXG5leHBvcnQgdHlwZSBJbnNjcmlwdGlvblRyYW5zYWN0aW9uQ29uc3RyYWludHMgPSB7XG4gIGZlZVJhdGVTYXRLQjogbnVtYmVyO1xuICBtaW5DaGFuZ2VPdXRwdXQ/OiBiaWdpbnQ7XG4gIG1heENoYW5nZU91dHB1dD86IGJpZ2ludDtcbiAgbWluSW5zY3JpcHRpb25PdXRwdXQ/OiBiaWdpbnQ7XG4gIG1heEluc2NyaXB0aW9uT3V0cHV0PzogYmlnaW50O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVBzYnRGcm9tT3V0cHV0TGF5b3V0KFxuICBuZXR3b3JrOiBOZXR3b3JrLFxuICBpbnB1dEJ1aWxkZXI6IFdhbGxldElucHV0QnVpbGRlcixcbiAgdW5zcGVudHM6IGJpdGdvLldhbGxldFVuc3BlbnQ8YmlnaW50PltdLFxuICBvdXRwdXRzOiBJbnNjcmlwdGlvbk91dHB1dHMsXG4gIG91dHB1dExheW91dDogT3V0cHV0TGF5b3V0XG4pOiBiaXRnby5VdHhvUHNidCB7XG4gIGNvbnN0IHBzYnQgPSBiaXRnby5jcmVhdGVQc2J0Rm9yTmV0d29yayh7IG5ldHdvcms6IG5ldHdvcmsgfSk7XG4gIGlmICh1bnNwZW50cy5sZW5ndGggIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYG11bHRpcGxlIHVuc3BlbnRzIG5vdCBzdXBwb3J0ZWQgeWV0YCk7XG4gIH1cbiAgdW5zcGVudHMuZm9yRWFjaCgodSkgPT5cbiAgICBiaXRnby5hZGRXYWxsZXRVbnNwZW50VG9Qc2J0KFxuICAgICAgcHNidCxcbiAgICAgIHUsXG4gICAgICBpbnB1dEJ1aWxkZXIud2FsbGV0S2V5cyxcbiAgICAgIGlucHV0QnVpbGRlci5zaWduZXIsXG4gICAgICBpbnB1dEJ1aWxkZXIuY29zaWduZXIsXG4gICAgICBwc2J0Lm5ldHdvcmtcbiAgICApXG4gICk7XG4gIGNvbnN0IFtpbnB1dF0gPSB1bnNwZW50cztcbiAgY29uc3Qgb3JkT3V0cHV0cyA9IGdldE9yZE91dHB1dHNGb3JMYXlvdXQobmV3IE9yZE91dHB1dChpbnB1dC52YWx1ZSksIG91dHB1dExheW91dCk7XG4gIHRvQXJyYXkob3JkT3V0cHV0cykuZm9yRWFjaCgob3JkT3V0cHV0KSA9PiB7XG4gICAgaWYgKG9yZE91dHB1dCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzd2l0Y2ggKG9yZE91dHB1dCkge1xuICAgICAgLy8gc2tpcCBwYWRkaW5nIG91dHB1dHMgYW5kIGZlZSBvdXRwdXQgKHZpcnR1YWwpXG4gICAgICBjYXNlIG51bGw6XG4gICAgICBjYXNlIG9yZE91dHB1dHMuZmVlT3V0cHV0OlxuICAgICAgICByZXR1cm47XG4gICAgICAvLyBhZGQgcGFkZGluZyBvdXRwdXRzXG4gICAgICBjYXNlIG9yZE91dHB1dHMuZmlyc3RDaGFuZ2VPdXRwdXQ6XG4gICAgICBjYXNlIG9yZE91dHB1dHMuc2Vjb25kQ2hhbmdlT3V0cHV0OlxuICAgICAgICBjb25zdCB7IGNoYWluLCBpbmRleCB9ID1cbiAgICAgICAgICBvcmRPdXRwdXQgPT09IG9yZE91dHB1dHMuZmlyc3RDaGFuZ2VPdXRwdXQgPyBvdXRwdXRzLmNoYW5nZU91dHB1dHNbMF0gOiBvdXRwdXRzLmNoYW5nZU91dHB1dHNbMV07XG4gICAgICAgIGJpdGdvLmFkZFdhbGxldE91dHB1dFRvUHNidChwc2J0LCBpbnB1dEJ1aWxkZXIud2FsbGV0S2V5cywgY2hhaW4sIGluZGV4LCBvcmRPdXRwdXQudmFsdWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIC8vIGFkZCBhY3R1YWwgaW5zY3JpcHRpb24gb3V0cHV0XG4gICAgICBjYXNlIG9yZE91dHB1dHMuaW5zY3JpcHRpb25PdXRwdXQ6XG4gICAgICAgIGxldCB7IGluc2NyaXB0aW9uUmVjaXBpZW50IH0gPSBvdXRwdXRzO1xuICAgICAgICBpZiAodHlwZW9mIGluc2NyaXB0aW9uUmVjaXBpZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGluc2NyaXB0aW9uUmVjaXBpZW50ID0gYWRkcmVzcy50b091dHB1dFNjcmlwdChpbnNjcmlwdGlvblJlY2lwaWVudCwgbmV0d29yayk7XG4gICAgICAgIH1cbiAgICAgICAgcHNidC5hZGRPdXRwdXQoe1xuICAgICAgICAgIHNjcmlwdDogaW5zY3JpcHRpb25SZWNpcGllbnQsXG4gICAgICAgICAgdmFsdWU6IG9yZE91dHB1dC52YWx1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBwc2J0O1xufVxuXG5mdW5jdGlvbiB0b1NhdFJhbmdlKHA6IFNhdFBvaW50KSB7XG4gIGNvbnN0IHsgb2Zmc2V0IH0gPSBwYXJzZVNhdFBvaW50KHApO1xuICByZXR1cm4gbmV3IFNhdFJhbmdlKG9mZnNldCwgb2Zmc2V0KTtcbn1cblxuZnVuY3Rpb24gZ2V0RmVlKHZzaXplOiBudW1iZXIsIHJhdGVTYXRQZXJLQjogbnVtYmVyKTogYmlnaW50IHtcbiAgcmV0dXJuIEJpZ0ludChNYXRoLmNlaWwoKHZzaXplICogcmF0ZVNhdFBlcktCKSAvIDEwMDApKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRPdXRwdXRMYXlvdXRGb3JXYWxsZXRVbnNwZW50cyhcbiAgaW5wdXRzOiBiaXRnby5XYWxsZXRVbnNwZW50PGJpZ2ludD5bXSxcbiAgc2F0UG9pbnQ6IFNhdFBvaW50LFxuICBvdXRwdXRzOiBJbnNjcmlwdGlvbk91dHB1dHMsXG4gIGNvbnN0cmFpbnRzOiBJbnNjcmlwdGlvblRyYW5zYWN0aW9uQ29uc3RyYWludHNcbik6IE91dHB1dExheW91dCB8IHVuZGVmaW5lZCB7XG4gIGlmIChpbnB1dHMubGVuZ3RoICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBvbmx5IHNpbmdsZSBpbnB1dCBzdXBwb3J0ZWQgY3VycmVudGx5YCk7XG4gIH1cblxuICBpZiAob3V0cHV0cy5jaGFuZ2VPdXRwdXRzWzBdLmNoYWluICE9PSBvdXRwdXRzLmNoYW5nZU91dHB1dHNbMV0uY2hhaW4pIHtcbiAgICAvLyBvdGhlcndpc2Ugb3VyIGZlZSBjYWxjIGlzIHRvbyBjb21wbGljYXRlZFxuICAgIHRocm93IG5ldyBFcnJvcihgd2FsbGV0IG91dHB1dHMgbXVzdCBiZSBvbiBzYW1lIGNoYWluYCk7XG4gIH1cblxuICBjb25zdCB7XG4gICAgbWluQ2hhbmdlT3V0cHV0ID0gQmlnSW50KDEwXzAwMCksXG4gICAgbWluSW5zY3JpcHRpb25PdXRwdXQgPSBCaWdJbnQoMTBfMDAwKSxcbiAgICBtYXhJbnNjcmlwdGlvbk91dHB1dCA9IEJpZ0ludCgyMF8wMDApLFxuICB9ID0gY29uc3RyYWludHM7XG5cbiAgY29uc3QgW2lucHV0XSA9IGlucHV0cztcbiAgY29uc3QgaW5zY3JpcHRpb25PdXRwdXQgPSBuZXcgT3JkT3V0cHV0KGlucHV0LnZhbHVlLCBbdG9TYXRSYW5nZShzYXRQb2ludCldKTtcbiAgcmV0dXJuIGZpbmRPdXRwdXRMYXlvdXQoaW5zY3JpcHRpb25PdXRwdXQsIHtcbiAgICBtaW5DaGFuZ2VPdXRwdXQsXG4gICAgbWluSW5zY3JpcHRpb25PdXRwdXQsXG4gICAgbWF4SW5zY3JpcHRpb25PdXRwdXQsXG4gICAgZmVlRml4ZWQ6IGdldEZlZShcbiAgICAgIFZpcnR1YWxTaXplcy50eFNlZ092ZXJoZWFkVlNpemUgKyBEaW1lbnNpb25zLmZyb21VbnNwZW50cyhpbnB1dHMpLmdldElucHV0c1ZTaXplKCksXG4gICAgICBjb25zdHJhaW50cy5mZWVSYXRlU2F0S0JcbiAgICApLFxuICAgIGZlZVBlck91dHB1dDogZ2V0RmVlKFxuICAgICAgRGltZW5zaW9ucy5mcm9tT3V0cHV0T25DaGFpbihvdXRwdXRzLmNoYW5nZU91dHB1dHNbMF0uY2hhaW4pLmdldE91dHB1dHNWU2l6ZSgpLFxuICAgICAgY29uc3RyYWludHMuZmVlUmF0ZVNhdEtCXG4gICAgKSxcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQc2J0Rm9yU2luZ2xlSW5zY3JpcHRpb25QYXNzaW5nVHJhbnNhY3Rpb24oXG4gIG5ldHdvcms6IE5ldHdvcmssXG4gIGlucHV0QnVpbGRlcjogV2FsbGV0SW5wdXRCdWlsZGVyLFxuICB1bnNwZW50czogYml0Z28uV2FsbGV0VW5zcGVudDxiaWdpbnQ+W10sXG4gIHNhdFBvaW50OiBTYXRQb2ludCxcbiAgb3V0cHV0czogSW5zY3JpcHRpb25PdXRwdXRzLFxuICBjb25zdHJhaW50czogSW5zY3JpcHRpb25UcmFuc2FjdGlvbkNvbnN0cmFpbnRzXG4pOiBiaXRnby5VdHhvUHNidCB7XG4gIGNvbnN0IGxheW91dCA9IGZpbmRPdXRwdXRMYXlvdXRGb3JXYWxsZXRVbnNwZW50cyh1bnNwZW50cywgc2F0UG9pbnQsIG91dHB1dHMsIGNvbnN0cmFpbnRzKTtcbiAgaWYgKCFsYXlvdXQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGNvdWxkIG5vdCBvdXRwdXQgbGF5b3V0IGZvciBpbnNjcmlwdGlvbiBwYXNzaW5nIHRyYW5zYWN0aW9uYCk7XG4gIH1cbiAgcmV0dXJuIGNyZWF0ZVBzYnRGcm9tT3V0cHV0TGF5b3V0KG5ldHdvcmssIGlucHV0QnVpbGRlciwgdW5zcGVudHMsIG91dHB1dHMsIGxheW91dCk7XG59XG4iXX0=
|
|
154
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHNidC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wc2J0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1EQUErRDtBQUMvRCxtREFBZ0U7QUFFaEUsMkNBQXdDO0FBQ3hDLHlDQUFxRDtBQUNyRCx5Q0FBc0M7QUFDdEMsaURBQWlHO0FBQ2pHLGlEQUEwQztBQWlDN0IsUUFBQSw2QkFBNkIsR0FBRztJQUMzQyxlQUFlLEVBQUUsTUFBTSxDQUFDLEtBQU0sQ0FBQztJQUMvQixvQkFBb0IsRUFBRSxNQUFNLENBQUMsS0FBTSxDQUFDO0lBQ3BDLG9CQUFvQixFQUFFLE1BQU0sQ0FBQyxLQUFNLENBQUM7Q0FDckMsQ0FBQztBQUVGLFNBQWdCLDBCQUEwQixDQUN4QyxPQUFnQixFQUNoQixZQUFnQyxFQUNoQyxRQUF5QixFQUN6QixPQUFzQyxFQUN0QyxZQUEwQjtJQUUxQixNQUFNLElBQUksR0FBRyxnQkFBSyxDQUFDLG9CQUFvQixDQUFDLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDOUQsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUN6QixNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7S0FDdEQ7SUFDRCxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDckIsZ0JBQUssQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsUUFBUSxDQUFDLENBQzNHLENBQUM7SUFDRixNQUFNLFFBQVEsR0FBRyxxQkFBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLHFCQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoRixNQUFN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O0NBQ0Y7QUFKRCxzQ0FJQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILFNBQWdCLGdEQUFnRCxDQUM5RCxPQUFnQixFQUNoQixZQUFnQyxFQUNoQyxPQUF3QyxFQUN4QyxRQUFrQixFQUNsQixPQUFzQyxFQUN0QyxXQUE4QyxFQUM5QyxFQUNFLHFCQUFxQixHQUFHLEVBQUUsRUFDMUIsY0FBYyxHQUFHLElBQUksTUFJbkIsRUFBRTtJQUVOLGdDQUFnQztJQUNoQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7UUFDMUIsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUN4QixNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUM7U0FDakQ7UUFDRCxPQUFPLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ3RCO0lBRUQsTUFBTSxNQUFNLEdBQUcsaUNBQWlDLENBQzlDLENBQUMsT0FBTyxFQUFFLEdBQUcscUJBQXFCLENBQUMsRUFDbkMsUUFBUSxFQUNSLE9BQU8sRUFDUCxXQUFXLEVBQ1gsRUFBRSxjQUFjLEVBQUUsQ0FDbkIsQ0FBQztJQUVGLElBQUksQ0FBQyxNQUFNLEVBQUU7UUFDWCxNQUFNLElBQUksYUFBYSxFQUFFLENBQUM7S0FDM0I7SUFFRCxPQUFPLDBCQUEwQixDQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ2xHLENBQUM7QUFwQ0QsNEdBb0NDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmV0d29yaywgYml0Z28sIGFkZHJlc3MgfSBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYic7XG5pbXBvcnQgeyBEaW1lbnNpb25zLCBWaXJ0dWFsU2l6ZXMgfSBmcm9tICdAYml0Z28tYmV0YS91bnNwZW50cyc7XG5cbmltcG9ydCB7IE9yZE91dHB1dCB9IGZyb20gJy4vT3JkT3V0cHV0JztcbmltcG9ydCB7IHBhcnNlU2F0UG9pbnQsIFNhdFBvaW50IH0gZnJvbSAnLi9TYXRQb2ludCc7XG5pbXBvcnQgeyBTYXRSYW5nZSB9IGZyb20gJy4vU2F0UmFuZ2UnO1xuaW1wb3J0IHsgZ2V0T3JkT3V0cHV0c0ZvckxheW91dCwgT3V0cHV0TGF5b3V0LCB0b0FycmF5LCBmaW5kT3V0cHV0TGF5b3V0IH0gZnJvbSAnLi9PdXRwdXRMYXlvdXQnO1xuaW1wb3J0IHsgcG93ZXJzZXQgfSBmcm9tICcuL2NvbWJpbmF0aW9ucyc7XG5cbnR5cGUgV2FsbGV0VW5zcGVudCA9IGJpdGdvLldhbGxldFVuc3BlbnQ8YmlnaW50PjtcblxuZXhwb3J0IHR5cGUgV2FsbGV0T3V0cHV0UGF0aCA9IHtcbiAgY2hhaW46IGJpdGdvLkNoYWluQ29kZTtcbiAgaW5kZXg6IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIFdhbGxldElucHV0QnVpbGRlciA9IHtcbiAgd2FsbGV0S2V5czogYml0Z28uUm9vdFdhbGxldEtleXM7XG4gIHNpZ25lcjogYml0Z28uS2V5TmFtZTtcbiAgY29zaWduZXI6IGJpdGdvLktleU5hbWU7XG59O1xuXG4vKipcbiAqIERlc2NyaWJlcyBhbGwgb3V0cHV0cyBvZiBhbiBpbnNjcmlwdGlvbiB0cmFuc2FjdGlvblxuICovXG5leHBvcnQgdHlwZSBJbnNjcmlwdGlvblRyYW5zYWN0aW9uT3V0cHV0cyA9IHtcbiAgaW5zY3JpcHRpb25SZWNpcGllbnQ6IHN0cmluZyB8IEJ1ZmZlcjtcbiAgY2hhbmdlT3V0cHV0czogW1dhbGxldE91dHB1dFBhdGgsIFdhbGxldE91dHB1dFBhdGhdO1xufTtcblxuLyoqIEBkZXByZWNhdGVkICovXG5leHBvcnQgdHlwZSBJbnNjcmlwdGlvbk91dHB1dHMgPSBJbnNjcmlwdGlvblRyYW5zYWN0aW9uT3V0cHV0cztcblxuZXhwb3J0IHR5cGUgSW5zY3JpcHRpb25UcmFuc2FjdGlvbkNvbnN0cmFpbnRzID0ge1xuICBmZWVSYXRlU2F0S0I6IG51bWJlcjtcbiAgbWluQ2hhbmdlT3V0cHV0PzogYmlnaW50O1xuICBtaW5JbnNjcmlwdGlvbk91dHB1dD86IGJpZ2ludDtcbiAgbWF4SW5zY3JpcHRpb25PdXRwdXQ/OiBiaWdpbnQ7XG59O1xuXG5leHBvcnQgY29uc3QgRGVmYXVsdEluc2NyaXB0aW9uQ29uc3RyYWludHMgPSB7XG4gIG1pbkNoYW5nZU91dHB1dDogQmlnSW50KDEwXzAwMCksXG4gIG1pbkluc2NyaXB0aW9uT3V0cHV0OiBCaWdJbnQoMTBfMDAwKSxcbiAgbWF4SW5zY3JpcHRpb25PdXRwdXQ6IEJpZ0ludCgyMF8wMDApLFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVBzYnRGcm9tT3V0cHV0TGF5b3V0KFxuICBuZXR3b3JrOiBOZXR3b3JrLFxuICBpbnB1dEJ1aWxkZXI6IFdhbGxldElucHV0QnVpbGRlcixcbiAgdW5zcGVudHM6IFdhbGxldFVuc3BlbnRbXSxcbiAgb3V0cHV0czogSW5zY3JpcHRpb25UcmFuc2FjdGlvbk91dHB1dHMsXG4gIG91dHB1dExheW91dDogT3V0cHV0TGF5b3V0XG4pOiBiaXRnby5VdHhvUHNidCB7XG4gIGNvbnN0IHBzYnQgPSBiaXRnby5jcmVhdGVQc2J0Rm9yTmV0d29yayh7IG5ldHdvcms6IG5ldHdvcmsgfSk7XG4gIGlmICh1bnNwZW50cy5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYG11c3QgcHJvdmlkZSBhdCBsZWFzdCBvbmUgdW5zcGVudGApO1xuICB9XG4gIHVuc3BlbnRzLmZvckVhY2goKHUpID0+XG4gICAgYml0Z28uYWRkV2FsbGV0VW5zcGVudFRvUHNidChwc2J0LCB1LCBpbnB1dEJ1aWxkZXIud2FsbGV0S2V5cywgaW5wdXRCdWlsZGVyLnNpZ25lciwgaW5wdXRCdWlsZGVyLmNvc2lnbmVyKVxuICApO1xuICBjb25zdCBvcmRJbnB1dCA9IE9yZE91dHB1dC5qb2luQWxsKHVuc3BlbnRzLm1hcCgodSkgPT4gbmV3IE9yZE91dHB1dCh1LnZhbHVlKSkpO1xuICBjb25zdCBvcmRPdXRwdXRzID0gZ2V0T3JkT3V0cHV0c0ZvckxheW91dChvcmRJbnB1dCwgb3V0cHV0TGF5b3V0KTtcbiAgdG9BcnJheShvcmRPdXRwdXRzKS5mb3JFYWNoKChvcmRPdXRwdXQpID0+IHtcbiAgICBpZiAob3JkT3V0cHV0ID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN3aXRjaCAob3JkT3V0cHV0KSB7XG4gICAgICAvLyBza2lwIHBhZGRpbmcgb3V0cHV0cyBhbmQgZmVlIG91dHB1dCAodmlydHVhbClcbiAgICAgIGNhc2UgbnVsbDpcbiAgICAgIGNhc2Ugb3JkT3V0cHV0cy5mZWVPdXRwdXQ6XG4gICAgICAgIHJldHVybjtcbiAgICAgIC8vIGFkZCBwYWRkaW5nIG91dHB1dHNcbiAgICAgIGNhc2Ugb3JkT3V0cHV0cy5maXJzdENoYW5nZU91dHB1dDpcbiAgICAgIGNhc2Ugb3JkT3V0cHV0cy5zZWNvbmRDaGFuZ2VPdXRwdXQ6XG4gICAgICAgIGNvbnN0IHsgY2hhaW4sIGluZGV4IH0gPVxuICAgICAgICAgIG9yZE91dHB1dCA9PT0gb3JkT3V0cHV0cy5maXJzdENoYW5nZU91dHB1dCA/IG91dHB1dHMuY2hhbmdlT3V0cHV0c1swXSA6IG91dHB1dHMuY2hhbmdlT3V0cHV0c1sxXTtcbiAgICAgICAgYml0Z28uYWRkV2FsbGV0T3V0cHV0VG9Qc2J0KHBzYnQsIGlucHV0QnVpbGRlci53YWxsZXRLZXlzLCBjaGFpbiwgaW5kZXgsIG9yZE91dHB1dC52YWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgLy8gYWRkIGFjdHVhbCBpbnNjcmlwdGlvbiBvdXRwdXRcbiAgICAgIGNhc2Ugb3JkT3V0cHV0cy5pbnNjcmlwdGlvbk91dHB1dDpcbiAgICAgICAgbGV0IHsgaW5zY3JpcHRpb25SZWNpcGllbnQgfSA9IG91dHB1dHM7XG4gICAgICAgIGlmICh0eXBlb2YgaW5zY3JpcHRpb25SZWNpcGllbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgaW5zY3JpcHRpb25SZWNpcGllbnQgPSBhZGRyZXNzLnRvT3V0cHV0U2NyaXB0KGluc2NyaXB0aW9uUmVjaXBpZW50LCBuZXR3b3JrKTtcbiAgICAgICAgfVxuICAgICAgICBwc2J0LmFkZE91dHB1dCh7XG4gICAgICAgICAgc2NyaXB0OiBpbnNjcmlwdGlvblJlY2lwaWVudCxcbiAgICAgICAgICB2YWx1ZTogb3JkT3V0cHV0LnZhbHVlLFxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHBzYnQ7XG59XG5cbmZ1bmN0aW9uIHRvU2F0UmFuZ2UocDogU2F0UG9pbnQpIHtcbiAgY29uc3QgeyBvZmZzZXQgfSA9IHBhcnNlU2F0UG9pbnQocCk7XG4gIHJldHVybiBuZXcgU2F0UmFuZ2Uob2Zmc2V0LCBvZmZzZXQpO1xufVxuXG5mdW5jdGlvbiBnZXRGZWUodnNpemU6IG51bWJlciwgcmF0ZVNhdFBlcktCOiBudW1iZXIpOiBiaWdpbnQge1xuICByZXR1cm4gQmlnSW50KE1hdGguY2VpbCgodnNpemUgKiByYXRlU2F0UGVyS0IpIC8gMTAwMCkpO1xufVxuXG4vKipcbiAqIEBwYXJhbSBpbnB1dHMgLSBpbnNjcmlwdGlvbiBpbnB1dCBtdXN0IGNvbWUgZmlyc3RcbiAqIEBwYXJhbSBzYXRQb2ludCAtIGxvY2F0aW9uIG9mIHRoZSBpbnNjcmlwdGlvblxuICogQHBhcmFtIG91dHB1dHNcbiAqIEBwYXJhbSBjb25zdHJhaW50c1xuICogQHBhcmFtIG1pbmltaXplSW5wdXRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kT3V0cHV0TGF5b3V0Rm9yV2FsbGV0VW5zcGVudHMoXG4gIGlucHV0czogV2FsbGV0VW5zcGVudFtdLFxuICBzYXRQb2ludDogU2F0UG9pbnQsXG4gIG91dHB1dHM6IEluc2NyaXB0aW9uVHJhbnNhY3Rpb25PdXRwdXRzLFxuICBjb25zdHJhaW50czogSW5zY3JpcHRpb25UcmFuc2FjdGlvbkNvbnN0cmFpbnRzLFxuICB7IG1pbmltaXplSW5wdXRzID0gZmFsc2UgfSA9IHt9XG4pOiB7IGlucHV0czogV2FsbGV0VW5zcGVudFtdOyBsYXlvdXQ6IE91dHB1dExheW91dCB9IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG1pbmltaXplSW5wdXRzKSB7XG4gICAgcmV0dXJuIGZpbmRTbWFsbGVzdE91dHB1dExheW91dEZvcldhbGxldFVuc3BlbnRzKGlucHV0cywgc2F0UG9pbnQsIG91dHB1dHMsIGNvbnN0cmFpbnRzKTtcbiAgfVxuXG4gIGlmIChpbnB1dHMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBtdXN0IHByb3ZpZGUgYXQgbGVhc3Qgb25lIGlucHV0YCk7XG4gIH1cblxuICBpZiAob3V0cHV0cy5jaGFuZ2VPdXRwdXRzWzBdLmNoYWluICE9PSBvdXRwdXRzLmNoYW5nZU91dHB1dHNbMV0uY2hhaW4pIHtcbiAgICAvLyBvdGhlcndpc2Ugb3VyIGZlZSBjYWxjIGlzIHRvbyBjb21wbGljYXRlZFxuICAgIHRocm93IG5ldyBFcnJvcihgd2FsbGV0IG91dHB1dHMgbXVzdCBiZSBvbiBzYW1lIGNoYWluYCk7XG4gIH1cblxuICBjb25zdCB7XG4gICAgbWluQ2hhbmdlT3V0cHV0ID0gRGVmYXVsdEluc2NyaXB0aW9uQ29uc3RyYWludHMubWluQ2hhbmdlT3V0cHV0LFxuICAgIG1pbkluc2NyaXB0aW9uT3V0cHV0ID0gRGVmYXVsdEluc2NyaXB0aW9uQ29uc3RyYWludHMubWluSW5zY3JpcHRpb25PdXRwdXQsXG4gICAgbWF4SW5zY3JpcHRpb25PdXRwdXQgPSBEZWZhdWx0SW5zY3JpcHRpb25Db25zdHJhaW50cy5tYXhJbnNjcmlwdGlvbk91dHB1dCxcbiAgfSA9IGNvbnN0cmFpbnRzO1xuXG4gIC8vIEpvaW4gYWxsIHRoZSBpbnB1dHMgaW50byBhIHNpbmdsZSBpbnNjcmlwdGlvbk91dHB1dC5cbiAgLy8gRm9yIHRoZSBwdXJwb3NlcyBvZiBmaW5kaW5nIGEgbGF5b3V0IHRoZXJlIGlzIG5vIGRpZmZlcmVuY2UuXG4gIGNvbnN0IGluc2NyaXB0aW9uT3V0cHV0ID0gT3JkT3V0cHV0LmpvaW5BbGwoXG4gICAgaW5wdXRzLm1hcCgoaSkgPT4gbmV3IE9yZE91dHB1dChpLnZhbHVlLCBpID09PSBpbnB1dHNbMF0gPyBbdG9TYXRSYW5nZShzYXRQb2ludCldIDogW10pKVxuICApO1xuICBjb25zdCBsYXlvdXQgPSBmaW5kT3V0cHV0TGF5b3V0KGluc2NyaXB0aW9uT3V0cHV0LCB7XG4gICAgbWluQ2hhbmdlT3V0cHV0LFxuICAgIG1pbkluc2NyaXB0aW9uT3V0cHV0LFxuICAgIG1heEluc2NyaXB0aW9uT3V0cHV0LFxuICAgIGZlZUZpeGVkOiBnZXRGZWUoXG4gICAgICBWaXJ0dWFsU2l6ZXMudHhTZWdPdmVyaGVhZFZTaXplICtcbiAgICAgICAgRGltZW5zaW9ucy5mcm9tVW5zcGVudHMoaW5wdXRzLCB7XG4gICAgICAgICAgcDJ0cjogeyBzY3JpcHRQYXRoTGV2ZWw6IDEgfSxcbiAgICAgICAgICBwMnRyTXVzaWcyOiB7IHNjcmlwdFBhdGhMZXZlbDogdW5kZWZpbmVkIH0sXG4gICAgICAgIH0pLmdldElucHV0c1ZTaXplKCksXG4gICAgICBjb25zdHJhaW50cy5mZWVSYXRlU2F0S0JcbiAgICApLFxuICAgIGZlZVBlck91dHB1dDogZ2V0RmVlKFxuICAgICAgRGltZW5zaW9ucy5mcm9tT3V0cHV0T25DaGFpbihvdXRwdXRzLmNoYW5nZU91dHB1dHNbMF0uY2hhaW4pLmdldE91dHB1dHNWU2l6ZSgpLFxuICAgICAgY29uc3RyYWludHMuZmVlUmF0ZVNhdEtCXG4gICAgKSxcbiAgfSk7XG5cbiAgcmV0dXJuIGxheW91dCA/IHsgaW5wdXRzLCBsYXlvdXQgfSA6IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGNvbnN0IE1BWF9VTlNQRU5UU19GT1JfT1VUUFVUX0xBWU9VVCA9IDU7XG5cbi8qKlxuICogQHBhcmFtIGlucHV0cyAtIGluc2NyaXB0aW9uIGlucHV0IG11c3QgY29tZSBmaXJzdFxuICogQHBhcmFtIHNhdFBvaW50IC0gbG9jYXRpb24gb2YgdGhlIGluc2NyaXB0aW9uXG4gKiBAcGFyYW0gb3V0cHV0c1xuICogQHBhcmFtIGNvbnN0cmFpbnRzXG4gKi9cbmZ1bmN0aW9uIGZpbmRTbWFsbGVzdE91dHB1dExheW91dEZvcldhbGxldFVuc3BlbnRzKFxuICBpbnB1dHM6IFdhbGxldFVuc3BlbnRbXSxcbiAgc2F0UG9pbnQ6IFNhdFBvaW50LFxuICBvdXRwdXRzOiBJbnNjcmlwdGlvblRyYW5zYWN0aW9uT3V0cHV0cyxcbiAgY29uc3RyYWludHM6IEluc2NyaXB0aW9uVHJhbnNhY3Rpb25Db25zdHJhaW50c1xuKTogeyBpbnB1dHM6IFdhbGxldFVuc3BlbnRbXTsgbGF5b3V0OiBPdXRwdXRMYXlvdXQgfSB8IHVuZGVmaW5lZCB7XG4gIGlmIChNQVhfVU5TUEVOVFNfRk9SX09VVFBVVF9MQVlPVVQgPCBpbnB1dHMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBpbnB1dCBhcnJheSBpcyB0b28gbGFyZ2VgKTtcbiAgfVxuICAvLyBjcmVhdGUgcG93ZXJzZXQgb2YgYWxsIHN1cHBsZW1lbnRhcnkgaW5wdXRzIGFuZCBmaW5kIHRoZSBjaGVhcGVzdCByZXN1bHRcbiAgY29uc3QgaW5wdXRzQXJyID0gW2lucHV0cywgLi4ucG93ZXJzZXQoaW5wdXRzLnNsaWNlKDEpKS5tYXAoKHMpID0+IFtpbnB1dHNbMF0sIC4uLnNdKV07XG4gIHJldHVybiBpbnB1dHNBcnJcbiAgICAubWFwKChpbnB1dHMpID0+IGZpbmRPdXRwdXRMYXlvdXRGb3JXYWxsZXRVbnNwZW50cyhpbnB1dHMsIHNhdFBvaW50LCBvdXRwdXRzLCBjb25zdHJhaW50cykpXG4gICAgLnJlZHVjZSgoYmVzdCwgbmV4dCkgPT4ge1xuICAgICAgaWYgKGJlc3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgIH1cbiAgICAgIGlmIChuZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGJlc3Q7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmVzdC5sYXlvdXQuZmVlT3V0cHV0IDwgbmV4dC5sYXlvdXQuZmVlT3V0cHV0ID8gYmVzdCA6IG5leHQ7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBjbGFzcyBFcnJvck5vTGF5b3V0IGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcignQ291bGQgbm90IGZpbmQgb3V0cHV0IGxheW91dCBmb3IgaW5zY3JpcHRpb24gcGFzc2luZyB0cmFuc2FjdGlvbicpO1xuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIG5ldHdvcmtcbiAqIEBwYXJhbSBpbnB1dEJ1aWxkZXJcbiAqIEBwYXJhbSB1bnNwZW50XG4gKiBAcGFyYW0gc2F0UG9pbnRcbiAqIEBwYXJhbSBvdXRwdXRzXG4gKiBAcGFyYW0gY29uc3RyYWludHNcbiAqIEBwYXJhbSBzdXBwbGVtZW50YXJ5VW5zcGVudHMgLSBhZGRpdGlvbmFsIGlucHV0cyB0byBjb3ZlciBmZWUuXG4gKiBAcGFyYW0gW21pbmltaXplSW5wdXRzPXRydWVdIC0gdHJ5IHRvIGZpbmQgaW5wdXQgY29tYmluYXRpb24gd2l0aCBtaW5pbWFsIGZlZXMuIExpbWl0cyBzdXBwbGVtZW50YXJ5VW5zcGVudHMgdG8gNC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVBzYnRGb3JTaW5nbGVJbnNjcmlwdGlvblBhc3NpbmdUcmFuc2FjdGlvbihcbiAgbmV0d29yazogTmV0d29yayxcbiAgaW5wdXRCdWlsZGVyOiBXYWxsZXRJbnB1dEJ1aWxkZXIsXG4gIHVuc3BlbnQ6IFdhbGxldFVuc3BlbnQgfCBXYWxsZXRVbnNwZW50W10sXG4gIHNhdFBvaW50OiBTYXRQb2ludCxcbiAgb3V0cHV0czogSW5zY3JpcHRpb25UcmFuc2FjdGlvbk91dHB1dHMsXG4gIGNvbnN0cmFpbnRzOiBJbnNjcmlwdGlvblRyYW5zYWN0aW9uQ29uc3RyYWludHMsXG4gIHtcbiAgICBzdXBwbGVtZW50YXJ5VW5zcGVudHMgPSBbXSxcbiAgICBtaW5pbWl6ZUlucHV0cyA9IHRydWUsXG4gIH06IHtcbiAgICBzdXBwbGVtZW50YXJ5VW5zcGVudHM/OiBXYWxsZXRVbnNwZW50W107XG4gICAgbWluaW1pemVJbnB1dHM/OiBib29sZWFuO1xuICB9ID0ge31cbik6IGJpdGdvLlV0eG9Qc2J0IHtcbiAgLy8gc3VwcG9ydCBmb3IgbGVnYWN5IGNhbGwgc3R5bGVcbiAgaWYgKEFycmF5LmlzQXJyYXkodW5zcGVudCkpIHtcbiAgICBpZiAodW5zcGVudC5sZW5ndGggIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgY2FuIG9ubHkgcGFzcyBzaW5nbGUgdW5zcGVudGApO1xuICAgIH1cbiAgICB1bnNwZW50ID0gdW5zcGVudFswXTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IGZpbmRPdXRwdXRMYXlvdXRGb3JXYWxsZXRVbnNwZW50cyhcbiAgICBbdW5zcGVudCwgLi4uc3VwcGxlbWVudGFyeVVuc3BlbnRzXSxcbiAgICBzYXRQb2ludCxcbiAgICBvdXRwdXRzLFxuICAgIGNvbnN0cmFpbnRzLFxuICAgIHsgbWluaW1pemVJbnB1dHMgfVxuICApO1xuXG4gIGlmICghcmVzdWx0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yTm9MYXlvdXQoKTtcbiAgfVxuXG4gIHJldHVybiBjcmVhdGVQc2J0RnJvbU91dHB1dExheW91dChuZXR3b3JrLCBpbnB1dEJ1aWxkZXIsIHJlc3VsdC5pbnB1dHMsIG91dHB1dHMsIHJlc3VsdC5sYXlvdXQpO1xufVxuIl19
|