@bitgo-beta/utxo-ord 1.0.1-beta.34 → 1.0.1-beta.341

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.
@@ -46,6 +46,10 @@ export declare function findOutputLayoutForWalletUnspents(inputs: WalletUnspent[
46
46
  inputs: WalletUnspent[];
47
47
  layout: OutputLayout;
48
48
  } | undefined;
49
+ export declare const MAX_UNSPENTS_FOR_OUTPUT_LAYOUT = 5;
50
+ export declare class ErrorNoLayout extends Error {
51
+ constructor();
52
+ }
49
53
  /**
50
54
  * @param network
51
55
  * @param inputBuilder
@@ -1 +1 @@
1
- {"version":3,"file":"psbt.d.ts","sourceRoot":"","sources":["../../src/psbt.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAW,MAAM,sBAAsB,CAAC;AAI/D,OAAO,EAAiB,QAAQ,EAAE,MAAM,YAAY,CAAC;AAErD,OAAO,EAA0B,YAAY,EAA6B,MAAM,gBAAgB,CAAC;AAGjG,aAAK,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;AAEjD,oBAAY,gBAAgB,GAAG;IAC7B,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,oBAAY,kBAAkB,GAAG;IAC/B,UAAU,EAAE,KAAK,CAAC,cAAc,CAAC;IACjC,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC;IACtB,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC;CACzB,CAAC;AAEF;;GAEG;AACH,oBAAY,6BAA6B,GAAG;IAC1C,oBAAoB,EAAE,MAAM,GAAG,MAAM,CAAC;IACtC,aAAa,EAAE,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC;CACrD,CAAC;AAEF,kBAAkB;AAClB,oBAAY,kBAAkB,GAAG,6BAA6B,CAAC;AAE/D,oBAAY,iCAAiC,GAAG;IAC9C,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B,CAAC;AAEF,eAAO,MAAM,6BAA6B;;;;CAIzC,CAAC;AAEF,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,kBAAkB,EAChC,QAAQ,EAAE,aAAa,EAAE,EACzB,OAAO,EAAE,6BAA6B,EACtC,YAAY,EAAE,YAAY,GACzB,KAAK,CAAC,QAAQ,CA+ChB;AAWD;;;;;;GAMG;AACH,wBAAgB,iCAAiC,CAC/C,MAAM,EAAE,aAAa,EAAE,EACvB,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,6BAA6B,EACtC,WAAW,EAAE,iCAAiC,EAC9C,EAAE,cAAsB,EAAE;;CAAK,GAC9B;IAAE,MAAM,EAAE,aAAa,EAAE,CAAC;IAAC,MAAM,EAAE,YAAY,CAAA;CAAE,GAAG,SAAS,CAwC/D;AAgCD;;;;;;;;;GASG;AACH,wBAAgB,gDAAgD,CAC9D,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,kBAAkB,EAChC,OAAO,EAAE,aAAa,GAAG,aAAa,EAAE,EACxC,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,6BAA6B,EACtC,WAAW,EAAE,iCAAiC,EAC9C,EACE,qBAA0B,EAC1B,cAAqB,GACtB,GAAE;IACD,qBAAqB,CAAC,EAAE,aAAa,EAAE,CAAC;IACxC,cAAc,CAAC,EAAE,OAAO,CAAC;CACrB,GACL,KAAK,CAAC,QAAQ,CAsBhB"}
1
+ {"version":3,"file":"psbt.d.ts","sourceRoot":"","sources":["../../src/psbt.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAW,MAAM,sBAAsB,CAAC;AAI/D,OAAO,EAAiB,QAAQ,EAAE,MAAM,YAAY,CAAC;AAErD,OAAO,EAA0B,YAAY,EAA6B,MAAM,gBAAgB,CAAC;AAGjG,aAAK,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;AAEjD,oBAAY,gBAAgB,GAAG;IAC7B,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,oBAAY,kBAAkB,GAAG;IAC/B,UAAU,EAAE,KAAK,CAAC,cAAc,CAAC;IACjC,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC;IACtB,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC;CACzB,CAAC;AAEF;;GAEG;AACH,oBAAY,6BAA6B,GAAG;IAC1C,oBAAoB,EAAE,MAAM,GAAG,MAAM,CAAC;IACtC,aAAa,EAAE,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC;CACrD,CAAC;AAEF,kBAAkB;AAClB,oBAAY,kBAAkB,GAAG,6BAA6B,CAAC;AAE/D,oBAAY,iCAAiC,GAAG;IAC9C,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B,CAAC;AAEF,eAAO,MAAM,6BAA6B;;;;CAIzC,CAAC;AAEF,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,kBAAkB,EAChC,QAAQ,EAAE,aAAa,EAAE,EACzB,OAAO,EAAE,6BAA6B,EACtC,YAAY,EAAE,YAAY,GACzB,KAAK,CAAC,QAAQ,CAwChB;AAWD;;;;;;GAMG;AACH,wBAAgB,iCAAiC,CAC/C,MAAM,EAAE,aAAa,EAAE,EACvB,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,6BAA6B,EACtC,WAAW,EAAE,iCAAiC,EAC9C,EAAE,cAAsB,EAAE;;CAAK,GAC9B;IAAE,MAAM,EAAE,aAAa,EAAE,CAAC;IAAC,MAAM,EAAE,YAAY,CAAA;CAAE,GAAG,SAAS,CA4C/D;AAED,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAgChD,qBAAa,aAAc,SAAQ,KAAK;;CAIvC;AAED;;;;;;;;;GASG;AACH,wBAAgB,gDAAgD,CAC9D,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,kBAAkB,EAChC,OAAO,EAAE,aAAa,GAAG,aAAa,EAAE,EACxC,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,6BAA6B,EACtC,WAAW,EAAE,iCAAiC,EAC9C,EACE,qBAA0B,EAC1B,cAAqB,GACtB,GAAE;IACD,qBAAqB,CAAC,EAAE,aAAa,EAAE,CAAC;IACxC,cAAc,CAAC,EAAE,OAAO,CAAC;CACrB,GACL,KAAK,CAAC,QAAQ,CAsBhB"}
package/dist/src/psbt.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createPsbtForSingleInscriptionPassingTransaction = exports.findOutputLayoutForWalletUnspents = exports.createPsbtFromOutputLayout = exports.DefaultInscriptionConstraints = 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");
@@ -18,7 +18,7 @@ function createPsbtFromOutputLayout(network, inputBuilder, unspents, outputs, ou
18
18
  if (unspents.length === 0) {
19
19
  throw new Error(`must provide at least one unspent`);
20
20
  }
21
- unspents.forEach((u) => utxo_lib_1.bitgo.addWalletUnspentToPsbt(psbt, u, inputBuilder.walletKeys, inputBuilder.signer, inputBuilder.cosigner, psbt.network));
21
+ unspents.forEach((u) => utxo_lib_1.bitgo.addWalletUnspentToPsbt(psbt, u, inputBuilder.walletKeys, inputBuilder.signer, inputBuilder.cosigner));
22
22
  const ordInput = OrdOutput_1.OrdOutput.joinAll(unspents.map((u) => new OrdOutput_1.OrdOutput(u.value)));
23
23
  const ordOutputs = OutputLayout_1.getOrdOutputsForLayout(ordInput, outputLayout);
24
24
  OutputLayout_1.toArray(ordOutputs).forEach((ordOutput) => {
@@ -85,12 +85,17 @@ function findOutputLayoutForWalletUnspents(inputs, satPoint, outputs, constraint
85
85
  minChangeOutput,
86
86
  minInscriptionOutput,
87
87
  maxInscriptionOutput,
88
- feeFixed: getFee(unspents_1.VirtualSizes.txSegOverheadVSize + unspents_1.Dimensions.fromUnspents(inputs).getInputsVSize(), constraints.feeRateSatKB),
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),
89
93
  feePerOutput: getFee(unspents_1.Dimensions.fromOutputOnChain(outputs.changeOutputs[0].chain).getOutputsVSize(), constraints.feeRateSatKB),
90
94
  });
91
95
  return layout ? { inputs, layout } : undefined;
92
96
  }
93
97
  exports.findOutputLayoutForWalletUnspents = findOutputLayoutForWalletUnspents;
98
+ exports.MAX_UNSPENTS_FOR_OUTPUT_LAYOUT = 5;
94
99
  /**
95
100
  * @param inputs - inscription input must come first
96
101
  * @param satPoint - location of the inscription
@@ -98,7 +103,7 @@ exports.findOutputLayoutForWalletUnspents = findOutputLayoutForWalletUnspents;
98
103
  * @param constraints
99
104
  */
100
105
  function findSmallestOutputLayoutForWalletUnspents(inputs, satPoint, outputs, constraints) {
101
- if (4 < inputs.length) {
106
+ if (exports.MAX_UNSPENTS_FOR_OUTPUT_LAYOUT < inputs.length) {
102
107
  throw new Error(`input array is too large`);
103
108
  }
104
109
  // create powerset of all supplementary inputs and find the cheapest result
@@ -115,6 +120,12 @@ function findSmallestOutputLayoutForWalletUnspents(inputs, satPoint, outputs, co
115
120
  return best.layout.feeOutput < next.layout.feeOutput ? best : next;
116
121
  });
117
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;
118
129
  /**
119
130
  * @param network
120
131
  * @param inputBuilder
@@ -135,9 +146,9 @@ function createPsbtForSingleInscriptionPassingTransaction(network, inputBuilder,
135
146
  }
136
147
  const result = findOutputLayoutForWalletUnspents([unspent, ...supplementaryUnspents], satPoint, outputs, constraints, { minimizeInputs });
137
148
  if (!result) {
138
- throw new Error(`could not output layout for inscription passing transaction`);
149
+ throw new ErrorNoLayout();
139
150
  }
140
151
  return createPsbtFromOutputLayout(network, inputBuilder, result.inputs, outputs, result.layout);
141
152
  }
142
153
  exports.createPsbtForSingleInscriptionPassingTransaction = createPsbtForSingleInscriptionPassingTransaction;
143
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHNidC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wc2J0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1EQUErRDtBQUMvRCxtREFBZ0U7QUFFaEUsMkNBQXdDO0FBQ3hDLHlDQUFxRDtBQUNyRCx5Q0FBc0M7QUFDdEMsaURBQWlHO0FBQ2pHLGlEQUEwQztBQWlDN0IsUUFBQSw2QkFBNkIsR0FBRztJQUMzQyxlQUFlLEVBQUUsTUFBTSxDQUFDLEtBQU0sQ0FBQztJQUMvQixvQkFBb0IsRUFBRSxNQUFNLENBQUMsS0FBTSxDQUFDO0lBQ3BDLG9CQUFvQixFQUFFLE1BQU0sQ0FBQyxLQUFNLENBQUM7Q0FDckMsQ0FBQztBQUVGLFNBQWdCLDBCQUEwQixDQUN4QyxPQUFnQixFQUNoQixZQUFnQyxFQUNoQyxRQUF5QixFQUN6QixPQUFzQyxFQUN0QyxZQUEwQjtJQUUxQixNQUFNLElBQUksR0FBRyxnQkFBSyxDQUFDLG9CQUFvQixDQUFDLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDOUQsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUN6QixNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7S0FDdEQ7SUFDRCxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDckIsZ0JBQUssQ0FBQyxzQkFBc0IsQ0FDMUIsSUFBSSxFQUNKLENBQUMsRUFDRCxZQUFZLENBQUMsVUFBVSxFQUN2QixZQUFZLENBQUMsTUFBTSxFQUNuQixZQUFZLENBQUMsUUFBUSxFQUNyQixJQUFJLENBQUMsT0FBTyxDQUNiLENBQ0YsQ0FBQztJQUNGLE1BQU0sUUFBUSxHQUFHLHFCQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUkscUJBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENB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Q0FBQyxPQUFPLENBQUMsRUFBRTtRQUMxQixJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQztTQUNqRDtRQUNELE9BQU8sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDdEI7SUFFRCxNQUFNLE1BQU0sR0FBRyxpQ0FBaUMsQ0FDOUMsQ0FBQyxPQUFPLEVBQUUsR0FBRyxxQkFBcUIsQ0FBQyxFQUNuQyxRQUFRLEVBQ1IsT0FBTyxFQUNQLFdBQVcsRUFDWCxFQUFFLGNBQWMsRUFBRSxDQUNuQixDQUFDO0lBRUYsSUFBSSxDQUFDLE1BQU0sRUFBRTtRQUNYLE1BQU0sSUFBSSxLQUFLLENBQUMsNkRBQTZELENBQUMsQ0FBQztLQUNoRjtJQUVELE9BQU8sMEJBQTBCLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDbEcsQ0FBQztBQXBDRCw0R0FvQ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZXR3b3JrLCBiaXRnbywgYWRkcmVzcyB9IGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcbmltcG9ydCB7IERpbWVuc2lvbnMsIFZpcnR1YWxTaXplcyB9IGZyb20gJ0BiaXRnby1iZXRhL3Vuc3BlbnRzJztcblxuaW1wb3J0IHsgT3JkT3V0cHV0IH0gZnJvbSAnLi9PcmRPdXRwdXQnO1xuaW1wb3J0IHsgcGFyc2VTYXRQb2ludCwgU2F0UG9pbnQgfSBmcm9tICcuL1NhdFBvaW50JztcbmltcG9ydCB7IFNhdFJhbmdlIH0gZnJvbSAnLi9TYXRSYW5nZSc7XG5pbXBvcnQgeyBnZXRPcmRPdXRwdXRzRm9yTGF5b3V0LCBPdXRwdXRMYXlvdXQsIHRvQXJyYXksIGZpbmRPdXRwdXRMYXlvdXQgfSBmcm9tICcuL091dHB1dExheW91dCc7XG5pbXBvcnQgeyBwb3dlcnNldCB9IGZyb20gJy4vY29tYmluYXRpb25zJztcblxudHlwZSBXYWxsZXRVbnNwZW50ID0gYml0Z28uV2FsbGV0VW5zcGVudDxiaWdpbnQ+O1xuXG5leHBvcnQgdHlwZSBXYWxsZXRPdXRwdXRQYXRoID0ge1xuICBjaGFpbjogYml0Z28uQ2hhaW5Db2RlO1xuICBpbmRleDogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgV2FsbGV0SW5wdXRCdWlsZGVyID0ge1xuICB3YWxsZXRLZXlzOiBiaXRnby5Sb290V2FsbGV0S2V5cztcbiAgc2lnbmVyOiBiaXRnby5LZXlOYW1lO1xuICBjb3NpZ25lcjogYml0Z28uS2V5TmFtZTtcbn07XG5cbi8qKlxuICogRGVzY3JpYmVzIGFsbCBvdXRwdXRzIG9mIGFuIGluc2NyaXB0aW9uIHRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCB0eXBlIEluc2NyaXB0aW9uVHJhbnNhY3Rpb25PdXRwdXRzID0ge1xuICBpbnNjcmlwdGlvblJlY2lwaWVudDogc3RyaW5nIHwgQnVmZmVyO1xuICBjaGFuZ2VPdXRwdXRzOiBbV2FsbGV0T3V0cHV0UGF0aCwgV2FsbGV0T3V0cHV0UGF0aF07XG59O1xuXG4vKiogQGRlcHJlY2F0ZWQgKi9cbmV4cG9ydCB0eXBlIEluc2NyaXB0aW9uT3V0cHV0cyA9IEluc2NyaXB0aW9uVHJhbnNhY3Rpb25PdXRwdXRzO1xuXG5leHBvcnQgdHlwZSBJbnNjcmlwdGlvblRyYW5zYWN0aW9uQ29uc3RyYWludHMgPSB7XG4gIGZlZVJhdGVTYXRLQjogbnVtYmVyO1xuICBtaW5DaGFuZ2VPdXRwdXQ/OiBiaWdpbnQ7XG4gIG1pbkluc2NyaXB0aW9uT3V0cHV0PzogYmlnaW50O1xuICBtYXhJbnNjcmlwdGlvbk91dHB1dD86IGJpZ2ludDtcbn07XG5cbmV4cG9ydCBjb25zdCBEZWZhdWx0SW5zY3JpcHRpb25Db25zdHJhaW50cyA9IHtcbiAgbWluQ2hhbmdlT3V0cHV0OiBCaWdJbnQoMTBfMDAwKSxcbiAgbWluSW5zY3JpcHRpb25PdXRwdXQ6IEJpZ0ludCgxMF8wMDApLFxuICBtYXhJbnNjcmlwdGlvbk91dHB1dDogQmlnSW50KDIwXzAwMCksXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUHNidEZyb21PdXRwdXRMYXlvdXQoXG4gIG5ldHdvcms6IE5ldHdvcmssXG4gIGlucHV0QnVpbGRlcjogV2FsbGV0SW5wdXRCdWlsZGVyLFxuICB1bnNwZW50czogV2FsbGV0VW5zcGVudFtdLFxuICBvdXRwdXRzOiBJbnNjcmlwdGlvblRyYW5zYWN0aW9uT3V0cHV0cyxcbiAgb3V0cHV0TGF5b3V0OiBPdXRwdXRMYXlvdXRcbik6IGJpdGdvLlV0eG9Qc2J0IHtcbiAgY29uc3QgcHNidCA9IGJpdGdvLmNyZWF0ZVBzYnRGb3JOZXR3b3JrKHsgbmV0d29yazogbmV0d29yayB9KTtcbiAgaWYgKHVuc3BlbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgbXVzdCBwcm92aWRlIGF0IGxlYXN0IG9uZSB1bnNwZW50YCk7XG4gIH1cbiAgdW5zcGVudHMuZm9yRWFjaCgodSkgPT5cbiAgICBiaXRnby5hZGRXYWxsZXRVbnNwZW50VG9Qc2J0KFxuICAgICAgcHNidCxcbiAgICAgIHUsXG4gICAgICBpbnB1dEJ1aWxkZXIud2FsbGV0S2V5cyxcbiAgICAgIGlucHV0QnVpbGRlci5zaWduZXIsXG4gICAgICBpbnB1dEJ1aWxkZXIuY29zaWduZXIsXG4gICAgICBwc2J0Lm5ldHdvcmtcbiAgICApXG4gICk7XG4gIGNvbnN0IG9yZElucHV0ID0gT3JkT3V0cHV0LmpvaW5BbGwodW5zcGVudHMubWFwKCh1KSA9PiBuZXcgT3JkT3V0cHV0KHUudmFsdWUpKSk7XG4gIGNvbnN0IG9yZE91dHB1dHMgPSBnZXRPcmRPdXRwdXRzRm9yTGF5b3V0KG9yZElucHV0LCBvdXRwdXRMYXlvdXQpO1xuICB0b0FycmF5KG9yZE91dHB1dHMpLmZvckVhY2goKG9yZE91dHB1dCkgPT4ge1xuICAgIGlmIChvcmRPdXRwdXQgPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3dpdGNoIChvcmRPdXRwdXQpIHtcbiAgICAgIC8vIHNraXAgcGFkZGluZyBvdXRwdXRzIGFuZCBmZWUgb3V0cHV0ICh2aXJ0dWFsKVxuICAgICAgY2FzZSBudWxsOlxuICAgICAgY2FzZSBvcmRPdXRwdXRzLmZlZU91dHB1dDpcbiAgICAgICAgcmV0dXJuO1xuICAgICAgLy8gYWRkIHBhZGRpbmcgb3V0cHV0c1xuICAgICAgY2FzZSBvcmRPdXRwdXRzLmZpcnN0Q2hhbmdlT3V0cHV0OlxuICAgICAgY2FzZSBvcmRPdXRwdXRzLnNlY29uZENoYW5nZU91dHB1dDpcbiAgICAgICAgY29uc3QgeyBjaGFpbiwgaW5kZXggfSA9XG4gICAgICAgICAgb3JkT3V0cHV0ID09PSBvcmRPdXRwdXRzLmZpcnN0Q2hhbmdlT3V0cHV0ID8gb3V0cHV0cy5jaGFuZ2VPdXRwdXRzWzBdIDogb3V0cHV0cy5jaGFuZ2VPdXRwdXRzWzFdO1xuICAgICAgICBiaXRnby5hZGRXYWxsZXRPdXRwdXRUb1BzYnQocHNidCwgaW5wdXRCdWlsZGVyLndhbGxldEtleXMsIGNoYWluLCBpbmRleCwgb3JkT3V0cHV0LnZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICAvLyBhZGQgYWN0dWFsIGluc2NyaXB0aW9uIG91dHB1dFxuICAgICAgY2FzZSBvcmRPdXRwdXRzLmluc2NyaXB0aW9uT3V0cHV0OlxuICAgICAgICBsZXQgeyBpbnNjcmlwdGlvblJlY2lwaWVudCB9ID0gb3V0cHV0cztcbiAgICAgICAgaWYgKHR5cGVvZiBpbnNjcmlwdGlvblJlY2lwaWVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBpbnNjcmlwdGlvblJlY2lwaWVudCA9IGFkZHJlc3MudG9PdXRwdXRTY3JpcHQoaW5zY3JpcHRpb25SZWNpcGllbnQsIG5ldHdvcmspO1xuICAgICAgICB9XG4gICAgICAgIHBzYnQuYWRkT3V0cHV0KHtcbiAgICAgICAgICBzY3JpcHQ6IGluc2NyaXB0aW9uUmVjaXBpZW50LFxuICAgICAgICAgIHZhbHVlOiBvcmRPdXRwdXQudmFsdWUsXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcHNidDtcbn1cblxuZnVuY3Rpb24gdG9TYXRSYW5nZShwOiBTYXRQb2ludCkge1xuICBjb25zdCB7IG9mZnNldCB9ID0gcGFyc2VTYXRQb2ludChwKTtcbiAgcmV0dXJuIG5ldyBTYXRSYW5nZShvZmZzZXQsIG9mZnNldCk7XG59XG5cbmZ1bmN0aW9uIGdldEZlZSh2c2l6ZTogbnVtYmVyLCByYXRlU2F0UGVyS0I6IG51bWJlcik6IGJpZ2ludCB7XG4gIHJldHVybiBCaWdJbnQoTWF0aC5jZWlsKCh2c2l6ZSAqIHJhdGVTYXRQZXJLQikgLyAxMDAwKSk7XG59XG5cbi8qKlxuICogQHBhcmFtIGlucHV0cyAtIGluc2NyaXB0aW9uIGlucHV0IG11c3QgY29tZSBmaXJzdFxuICogQHBhcmFtIHNhdFBvaW50IC0gbG9jYXRpb24gb2YgdGhlIGluc2NyaXB0aW9uXG4gKiBAcGFyYW0gb3V0cHV0c1xuICogQHBhcmFtIGNvbnN0cmFpbnRzXG4gKiBAcGFyYW0gbWluaW1pemVJbnB1dHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRPdXRwdXRMYXlvdXRGb3JXYWxsZXRVbnNwZW50cyhcbiAgaW5wdXRzOiBXYWxsZXRVbnNwZW50W10sXG4gIHNhdFBvaW50OiBTYXRQb2ludCxcbiAgb3V0cHV0czogSW5zY3JpcHRpb25UcmFuc2FjdGlvbk91dHB1dHMsXG4gIGNvbnN0cmFpbnRzOiBJbnNjcmlwdGlvblRyYW5zYWN0aW9uQ29uc3RyYWludHMsXG4gIHsgbWluaW1pemVJbnB1dHMgPSBmYWxzZSB9ID0ge31cbik6IHsgaW5wdXRzOiBXYWxsZXRVbnNwZW50W107IGxheW91dDogT3V0cHV0TGF5b3V0IH0gfCB1bmRlZmluZWQge1xuICBpZiAobWluaW1pemVJbnB1dHMpIHtcbiAgICByZXR1cm4gZmluZFNtYWxsZXN0T3V0cHV0TGF5b3V0Rm9yV2FsbGV0VW5zcGVudHMoaW5wdXRzLCBzYXRQb2ludCwgb3V0cHV0cywgY29uc3RyYWludHMpO1xuICB9XG5cbiAgaWYgKGlucHV0cy5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYG11c3QgcHJvdmlkZSBhdCBsZWFzdCBvbmUgaW5wdXRgKTtcbiAgfVxuXG4gIGlmIChvdXRwdXRzLmNoYW5nZU91dHB1dHNbMF0uY2hhaW4gIT09IG91dHB1dHMuY2hhbmdlT3V0cHV0c1sxXS5jaGFpbikge1xuICAgIC8vIG90aGVyd2lzZSBvdXIgZmVlIGNhbGMgaXMgdG9vIGNvbXBsaWNhdGVkXG4gICAgdGhyb3cgbmV3IEVycm9yKGB3YWxsZXQgb3V0cHV0cyBtdXN0IGJlIG9uIHNhbWUgY2hhaW5gKTtcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICBtaW5DaGFuZ2VPdXRwdXQgPSBEZWZhdWx0SW5zY3JpcHRpb25Db25zdHJhaW50cy5taW5DaGFuZ2VPdXRwdXQsXG4gICAgbWluSW5zY3JpcHRpb25PdXRwdXQgPSBEZWZhdWx0SW5zY3JpcHRpb25Db25zdHJhaW50cy5taW5JbnNjcmlwdGlvbk91dHB1dCxcbiAgICBtYXhJbnNjcmlwdGlvbk91dHB1dCA9IERlZmF1bHRJbnNjcmlwdGlvbkNvbnN0cmFpbnRzLm1heEluc2NyaXB0aW9uT3V0cHV0LFxuICB9ID0gY29uc3RyYWludHM7XG5cbiAgLy8gSm9pbiBhbGwgdGhlIGlucHV0cyBpbnRvIGEgc2luZ2xlIGluc2NyaXB0aW9uT3V0cHV0LlxuICAvLyBGb3IgdGhlIHB1cnBvc2VzIG9mIGZpbmRpbmcgYSBsYXlvdXQgdGhlcmUgaXMgbm8gZGlmZmVyZW5jZS5cbiAgY29uc3QgaW5zY3JpcHRpb25PdXRwdXQgPSBPcmRPdXRwdXQuam9pbkFsbChcbiAgICBpbnB1dHMubWFwKChpKSA9PiBuZXcgT3JkT3V0cHV0KGkudmFsdWUsIGkgPT09IGlucHV0c1swXSA/IFt0b1NhdFJhbmdlKHNhdFBvaW50KV0gOiBbXSkpXG4gICk7XG4gIGNvbnN0IGxheW91dCA9IGZpbmRPdXRwdXRMYXlvdXQoaW5zY3JpcHRpb25PdXRwdXQsIHtcbiAgICBtaW5DaGFuZ2VPdXRwdXQsXG4gICAgbWluSW5zY3JpcHRpb25PdXRwdXQsXG4gICAgbWF4SW5zY3JpcHRpb25PdXRwdXQsXG4gICAgZmVlRml4ZWQ6IGdldEZlZShcbiAgICAgIFZpcnR1YWxTaXplcy50eFNlZ092ZXJoZWFkVlNpemUgKyBEaW1lbnNpb25zLmZyb21VbnNwZW50cyhpbnB1dHMpLmdldElucHV0c1ZTaXplKCksXG4gICAgICBjb25zdHJhaW50cy5mZWVSYXRlU2F0S0JcbiAgICApLFxuICAgIGZlZVBlck91dHB1dDogZ2V0RmVlKFxuICAgICAgRGltZW5zaW9ucy5mcm9tT3V0cHV0T25DaGFpbihvdXRwdXRzLmNoYW5nZU91dHB1dHNbMF0uY2hhaW4pLmdldE91dHB1dHNWU2l6ZSgpLFxuICAgICAgY29uc3RyYWludHMuZmVlUmF0ZVNhdEtCXG4gICAgKSxcbiAgfSk7XG5cbiAgcmV0dXJuIGxheW91dCA/IHsgaW5wdXRzLCBsYXlvdXQgfSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBAcGFyYW0gaW5wdXRzIC0gaW5zY3JpcHRpb24gaW5wdXQgbXVzdCBjb21lIGZpcnN0XG4gKiBAcGFyYW0gc2F0UG9pbnQgLSBsb2NhdGlvbiBvZiB0aGUgaW5zY3JpcHRpb25cbiAqIEBwYXJhbSBvdXRwdXRzXG4gKiBAcGFyYW0gY29uc3RyYWludHNcbiAqL1xuZnVuY3Rpb24gZmluZFNtYWxsZXN0T3V0cHV0TGF5b3V0Rm9yV2FsbGV0VW5zcGVudHMoXG4gIGlucHV0czogV2FsbGV0VW5zcGVudFtdLFxuICBzYXRQb2ludDogU2F0UG9pbnQsXG4gIG91dHB1dHM6IEluc2NyaXB0aW9uVHJhbnNhY3Rpb25PdXRwdXRzLFxuICBjb25zdHJhaW50czogSW5zY3JpcHRpb25UcmFuc2FjdGlvbkNvbnN0cmFpbnRzXG4pOiB7IGlucHV0czogV2FsbGV0VW5zcGVudFtdOyBsYXlvdXQ6IE91dHB1dExheW91dCB9IHwgdW5kZWZpbmVkIHtcbiAgaWYgKDQgPCBpbnB1dHMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBpbnB1dCBhcnJheSBpcyB0b28gbGFyZ2VgKTtcbiAgfVxuICAvLyBjcmVhdGUgcG93ZXJzZXQgb2YgYWxsIHN1cHBsZW1lbnRhcnkgaW5wdXRzIGFuZCBmaW5kIHRoZSBjaGVhcGVzdCByZXN1bHRcbiAgY29uc3QgaW5wdXRzQXJyID0gW2lucHV0cywgLi4ucG93ZXJzZXQoaW5wdXRzLnNsaWNlKDEpKS5tYXAoKHMpID0+IFtpbnB1dHNbMF0sIC4uLnNdKV07XG4gIHJldHVybiBpbnB1dHNBcnJcbiAgICAubWFwKChpbnB1dHMpID0+IGZpbmRPdXRwdXRMYXlvdXRGb3JXYWxsZXRVbnNwZW50cyhpbnB1dHMsIHNhdFBvaW50LCBvdXRwdXRzLCBjb25zdHJhaW50cykpXG4gICAgLnJlZHVjZSgoYmVzdCwgbmV4dCkgPT4ge1xuICAgICAgaWYgKGJlc3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgIH1cbiAgICAgIGlmIChuZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGJlc3Q7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmVzdC5sYXlvdXQuZmVlT3V0cHV0IDwgbmV4dC5sYXlvdXQuZmVlT3V0cHV0ID8gYmVzdCA6IG5leHQ7XG4gICAgfSk7XG59XG5cbi8qKlxuICogQHBhcmFtIG5ldHdvcmtcbiAqIEBwYXJhbSBpbnB1dEJ1aWxkZXJcbiAqIEBwYXJhbSB1bnNwZW50XG4gKiBAcGFyYW0gc2F0UG9pbnRcbiAqIEBwYXJhbSBvdXRwdXRzXG4gKiBAcGFyYW0gY29uc3RyYWludHNcbiAqIEBwYXJhbSBzdXBwbGVtZW50YXJ5VW5zcGVudHMgLSBhZGRpdGlvbmFsIGlucHV0cyB0byBjb3ZlciBmZWUuXG4gKiBAcGFyYW0gW21pbmltaXplSW5wdXRzPXRydWVdIC0gdHJ5IHRvIGZpbmQgaW5wdXQgY29tYmluYXRpb24gd2l0aCBtaW5pbWFsIGZlZXMuIExpbWl0cyBzdXBwbGVtZW50YXJ5VW5zcGVudHMgdG8gNC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVBzYnRGb3JTaW5nbGVJbnNjcmlwdGlvblBhc3NpbmdUcmFuc2FjdGlvbihcbiAgbmV0d29yazogTmV0d29yayxcbiAgaW5wdXRCdWlsZGVyOiBXYWxsZXRJbnB1dEJ1aWxkZXIsXG4gIHVuc3BlbnQ6IFdhbGxldFVuc3BlbnQgfCBXYWxsZXRVbnNwZW50W10sXG4gIHNhdFBvaW50OiBTYXRQb2ludCxcbiAgb3V0cHV0czogSW5zY3JpcHRpb25UcmFuc2FjdGlvbk91dHB1dHMsXG4gIGNvbnN0cmFpbnRzOiBJbnNjcmlwdGlvblRyYW5zYWN0aW9uQ29uc3RyYWludHMsXG4gIHtcbiAgICBzdXBwbGVtZW50YXJ5VW5zcGVudHMgPSBbXSxcbiAgICBtaW5pbWl6ZUlucHV0cyA9IHRydWUsXG4gIH06IHtcbiAgICBzdXBwbGVtZW50YXJ5VW5zcGVudHM/OiBXYWxsZXRVbnNwZW50W107XG4gICAgbWluaW1pemVJbnB1dHM/OiBib29sZWFuO1xuICB9ID0ge31cbik6IGJpdGdvLlV0eG9Qc2J0IHtcbiAgLy8gc3VwcG9ydCBmb3IgbGVnYWN5IGNhbGwgc3R5bGVcbiAgaWYgKEFycmF5LmlzQXJyYXkodW5zcGVudCkpIHtcbiAgICBpZiAodW5zcGVudC5sZW5ndGggIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgY2FuIG9ubHkgcGFzcyBzaW5nbGUgdW5zcGVudGApO1xuICAgIH1cbiAgICB1bnNwZW50ID0gdW5zcGVudFswXTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IGZpbmRPdXRwdXRMYXlvdXRGb3JXYWxsZXRVbnNwZW50cyhcbiAgICBbdW5zcGVudCwgLi4uc3VwcGxlbWVudGFyeVVuc3BlbnRzXSxcbiAgICBzYXRQb2ludCxcbiAgICBvdXRwdXRzLFxuICAgIGNvbnN0cmFpbnRzLFxuICAgIHsgbWluaW1pemVJbnB1dHMgfVxuICApO1xuXG4gIGlmICghcmVzdWx0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBjb3VsZCBub3Qgb3V0cHV0IGxheW91dCBmb3IgaW5zY3JpcHRpb24gcGFzc2luZyB0cmFuc2FjdGlvbmApO1xuICB9XG5cbiAgcmV0dXJuIGNyZWF0ZVBzYnRGcm9tT3V0cHV0TGF5b3V0KG5ldHdvcmssIGlucHV0QnVpbGRlciwgcmVzdWx0LmlucHV0cywgb3V0cHV0cywgcmVzdWx0LmxheW91dCk7XG59XG4iXX0=
154
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHNidC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wc2J0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1EQUErRDtBQUMvRCxtREFBZ0U7QUFFaEUsMkNBQXdDO0FBQ3hDLHlDQUFxRDtBQUNyRCx5Q0FBc0M7QUFDdEMsaURBQWlHO0FBQ2pHLGlEQUEwQztBQWlDN0IsUUFBQSw2QkFBNkIsR0FBRztJQUMzQyxlQUFlLEVBQUUsTUFBTSxDQUFDLEtBQU0sQ0FBQztJQUMvQixvQkFBb0IsRUFBRSxNQUFNLENBQUMsS0FBTSxDQUFDO0lBQ3BDLG9CQUFvQixFQUFFLE1BQU0sQ0FBQyxLQUFNLENBQUM7Q0FDckMsQ0FBQztBQUVGLFNBQWdCLDBCQUEwQixDQUN4QyxPQUFnQixFQUNoQixZQUFnQyxFQUNoQyxRQUF5QixFQUN6QixPQUFzQyxFQUN0QyxZQUEwQjtJQUUxQixNQUFNLElBQUksR0FBRyxnQkFBSyxDQUFDLG9CQUFvQixDQUFDLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDOUQsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUN6QixNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7S0FDdEQ7SUFDRCxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDckIsZ0JBQUssQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsUUFBUSxDQUFDLENBQzNHLENBQUM7SUFDRixNQUFNLFFBQVEsR0FBRyxxQkFBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLHFCQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoRixNQUFN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Ozs7OztHQVNHO0FBQ0gsU0FBZ0IsZ0RBQWdELENBQzlELE9BQWdCLEVBQ2hCLFlBQWdDLEVBQ2hDLE9BQXdDLEVBQ3hDLFFBQWtCLEVBQ2xCLE9BQXNDLEVBQ3RDLFdBQThDLEVBQzlDLEVBQ0UscUJBQXFCLEdBQUcsRUFBRSxFQUMxQixjQUFjLEdBQUcsSUFBSSxNQUluQixFQUFFO0lBRU4sZ0NBQWdDO0lBQ2hDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUMxQixJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQztTQUNqRDtRQUNELE9BQU8sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDdEI7SUFFRCxNQUFNLE1BQU0sR0FBRyxpQ0FBaUMsQ0FDOUMsQ0FBQyxPQUFPLEVBQUUsR0FBRyxxQkFBcUIsQ0FBQyxFQUNuQyxRQUFRLEVBQ1IsT0FBTyxFQUNQLFdBQVcsRUFDWCxFQUFFLGNBQWMsRUFBRSxDQUNuQixDQUFDO0lBRUYsSUFBSSxDQUFDLE1BQU0sRUFBRTtRQUNYLE1BQU0sSUFBSSxhQUFhLEVBQUUsQ0FBQztLQUMzQjtJQUVELE9BQU8sMEJBQTBCLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDbEcsQ0FBQztBQXBDRCw0R0FvQ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZXR3b3JrLCBiaXRnbywgYWRkcmVzcyB9IGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcbmltcG9ydCB7IERpbWVuc2lvbnMsIFZpcnR1YWxTaXplcyB9IGZyb20gJ0BiaXRnby1iZXRhL3Vuc3BlbnRzJztcblxuaW1wb3J0IHsgT3JkT3V0cHV0IH0gZnJvbSAnLi9PcmRPdXRwdXQnO1xuaW1wb3J0IHsgcGFyc2VTYXRQb2ludCwgU2F0UG9pbnQgfSBmcm9tICcuL1NhdFBvaW50JztcbmltcG9ydCB7IFNhdFJhbmdlIH0gZnJvbSAnLi9TYXRSYW5nZSc7XG5pbXBvcnQgeyBnZXRPcmRPdXRwdXRzRm9yTGF5b3V0LCBPdXRwdXRMYXlvdXQsIHRvQXJyYXksIGZpbmRPdXRwdXRMYXlvdXQgfSBmcm9tICcuL091dHB1dExheW91dCc7XG5pbXBvcnQgeyBwb3dlcnNldCB9IGZyb20gJy4vY29tYmluYXRpb25zJztcblxudHlwZSBXYWxsZXRVbnNwZW50ID0gYml0Z28uV2FsbGV0VW5zcGVudDxiaWdpbnQ+O1xuXG5leHBvcnQgdHlwZSBXYWxsZXRPdXRwdXRQYXRoID0ge1xuICBjaGFpbjogYml0Z28uQ2hhaW5Db2RlO1xuICBpbmRleDogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgV2FsbGV0SW5wdXRCdWlsZGVyID0ge1xuICB3YWxsZXRLZXlzOiBiaXRnby5Sb290V2FsbGV0S2V5cztcbiAgc2lnbmVyOiBiaXRnby5LZXlOYW1lO1xuICBjb3NpZ25lcjogYml0Z28uS2V5TmFtZTtcbn07XG5cbi8qKlxuICogRGVzY3JpYmVzIGFsbCBvdXRwdXRzIG9mIGFuIGluc2NyaXB0aW9uIHRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCB0eXBlIEluc2NyaXB0aW9uVHJhbnNhY3Rpb25PdXRwdXRzID0ge1xuICBpbnNjcmlwdGlvblJlY2lwaWVudDogc3RyaW5nIHwgQnVmZmVyO1xuICBjaGFuZ2VPdXRwdXRzOiBbV2FsbGV0T3V0cHV0UGF0aCwgV2FsbGV0T3V0cHV0UGF0aF07XG59O1xuXG4vKiogQGRlcHJlY2F0ZWQgKi9cbmV4cG9ydCB0eXBlIEluc2NyaXB0aW9uT3V0cHV0cyA9IEluc2NyaXB0aW9uVHJhbnNhY3Rpb25PdXRwdXRzO1xuXG5leHBvcnQgdHlwZSBJbnNjcmlwdGlvblRyYW5zYWN0aW9uQ29uc3RyYWludHMgPSB7XG4gIGZlZVJhdGVTYXRLQjogbnVtYmVyO1xuICBtaW5DaGFuZ2VPdXRwdXQ/OiBiaWdpbnQ7XG4gIG1pbkluc2NyaXB0aW9uT3V0cHV0PzogYmlnaW50O1xuICBtYXhJbnNjcmlwdGlvbk91dHB1dD86IGJpZ2ludDtcbn07XG5cbmV4cG9ydCBjb25zdCBEZWZhdWx0SW5zY3JpcHRpb25Db25zdHJhaW50cyA9IHtcbiAgbWluQ2hhbmdlT3V0cHV0OiBCaWdJbnQoMTBfMDAwKSxcbiAgbWluSW5zY3JpcHRpb25PdXRwdXQ6IEJpZ0ludCgxMF8wMDApLFxuICBtYXhJbnNjcmlwdGlvbk91dHB1dDogQmlnSW50KDIwXzAwMCksXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUHNidEZyb21PdXRwdXRMYXlvdXQoXG4gIG5ldHdvcms6IE5ldHdvcmssXG4gIGlucHV0QnVpbGRlcjogV2FsbGV0SW5wdXRCdWlsZGVyLFxuICB1bnNwZW50czogV2FsbGV0VW5zcGVudFtdLFxuICBvdXRwdXRzOiBJbnNjcmlwdGlvblRyYW5zYWN0aW9uT3V0cHV0cyxcbiAgb3V0cHV0TGF5b3V0OiBPdXRwdXRMYXlvdXRcbik6IGJpdGdvLlV0eG9Qc2J0IHtcbiAgY29uc3QgcHNidCA9IGJpdGdvLmNyZWF0ZVBzYnRGb3JOZXR3b3JrKHsgbmV0d29yazogbmV0d29yayB9KTtcbiAgaWYgKHVuc3BlbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgbXVzdCBwcm92aWRlIGF0IGxlYXN0IG9uZSB1bnNwZW50YCk7XG4gIH1cbiAgdW5zcGVudHMuZm9yRWFjaCgodSkgPT5cbiAgICBiaXRnby5hZGRXYWxsZXRVbnNwZW50VG9Qc2J0KHBzYnQsIHUsIGlucHV0QnVpbGRlci53YWxsZXRLZXlzLCBpbnB1dEJ1aWxkZXIuc2lnbmVyLCBpbnB1dEJ1aWxkZXIuY29zaWduZXIpXG4gICk7XG4gIGNvbnN0IG9yZElucHV0ID0gT3JkT3V0cHV0LmpvaW5BbGwodW5zcGVudHMubWFwKCh1KSA9PiBuZXcgT3JkT3V0cHV0KHUudmFsdWUpKSk7XG4gIGNvbnN0IG9yZE91dHB1dHMgPSBnZXRPcmRPdXRwdXRzRm9yTGF5b3V0KG9yZElucHV0LCBvdXRwdXRMYXlvdXQpO1xuICB0b0FycmF5KG9yZE91dHB1dHMpLmZvckVhY2goKG9yZE91dHB1dCkgPT4ge1xuICAgIGlmIChvcmRPdXRwdXQgPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3dpdGNoIChvcmRPdXRwdXQpIHtcbiAgICAgIC8vIHNraXAgcGFkZGluZyBvdXRwdXRzIGFuZCBmZWUgb3V0cHV0ICh2aXJ0dWFsKVxuICAgICAgY2FzZSBudWxsOlxuICAgICAgY2FzZSBvcmRPdXRwdXRzLmZlZU91dHB1dDpcbiAgICAgICAgcmV0dXJuO1xuICAgICAgLy8gYWRkIHBhZGRpbmcgb3V0cHV0c1xuICAgICAgY2FzZSBvcmRPdXRwdXRzLmZpcnN0Q2hhbmdlT3V0cHV0OlxuICAgICAgY2FzZSBvcmRPdXRwdXRzLnNlY29uZENoYW5nZU91dHB1dDpcbiAgICAgICAgY29uc3QgeyBjaGFpbiwgaW5kZXggfSA9XG4gICAgICAgICAgb3JkT3V0cHV0ID09PSBvcmRPdXRwdXRzLmZpcnN0Q2hhbmdlT3V0cHV0ID8gb3V0cHV0cy5jaGFuZ2VPdXRwdXRzWzBdIDogb3V0cHV0cy5jaGFuZ2VPdXRwdXRzWzFdO1xuICAgICAgICBiaXRnby5hZGRXYWxsZXRPdXRwdXRUb1BzYnQocHNidCwgaW5wdXRCdWlsZGVyLndhbGxldEtleXMsIGNoYWluLCBpbmRleCwgb3JkT3V0cHV0LnZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICAvLyBhZGQgYWN0dWFsIGluc2NyaXB0aW9uIG91dHB1dFxuICAgICAgY2FzZSBvcmRPdXRwdXRzLmluc2NyaXB0aW9uT3V0cHV0OlxuICAgICAgICBsZXQgeyBpbnNjcmlwdGlvblJlY2lwaWVudCB9ID0gb3V0cHV0cztcbiAgICAgICAgaWYgKHR5cGVvZiBpbnNjcmlwdGlvblJlY2lwaWVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBpbnNjcmlwdGlvblJlY2lwaWVudCA9IGFkZHJlc3MudG9PdXRwdXRTY3JpcHQoaW5zY3JpcHRpb25SZWNpcGllbnQsIG5ldHdvcmspO1xuICAgICAgICB9XG4gICAgICAgIHBzYnQuYWRkT3V0cHV0KHtcbiAgICAgICAgICBzY3JpcHQ6IGluc2NyaXB0aW9uUmVjaXBpZW50LFxuICAgICAgICAgIHZhbHVlOiBvcmRPdXRwdXQudmFsdWUsXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcHNidDtcbn1cblxuZnVuY3Rpb24gdG9TYXRSYW5nZShwOiBTYXRQb2ludCkge1xuICBjb25zdCB7IG9mZnNldCB9ID0gcGFyc2VTYXRQb2ludChwKTtcbiAgcmV0dXJuIG5ldyBTYXRSYW5nZShvZmZzZXQsIG9mZnNldCk7XG59XG5cbmZ1bmN0aW9uIGdldEZlZSh2c2l6ZTogbnVtYmVyLCByYXRlU2F0UGVyS0I6IG51bWJlcik6IGJpZ2ludCB7XG4gIHJldHVybiBCaWdJbnQoTWF0aC5jZWlsKCh2c2l6ZSAqIHJhdGVTYXRQZXJLQikgLyAxMDAwKSk7XG59XG5cbi8qKlxuICogQHBhcmFtIGlucHV0cyAtIGluc2NyaXB0aW9uIGlucHV0IG11c3QgY29tZSBmaXJzdFxuICogQHBhcmFtIHNhdFBvaW50IC0gbG9jYXRpb24gb2YgdGhlIGluc2NyaXB0aW9uXG4gKiBAcGFyYW0gb3V0cHV0c1xuICogQHBhcmFtIGNvbnN0cmFpbnRzXG4gKiBAcGFyYW0gbWluaW1pemVJbnB1dHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRPdXRwdXRMYXlvdXRGb3JXYWxsZXRVbnNwZW50cyhcbiAgaW5wdXRzOiBXYWxsZXRVbnNwZW50W10sXG4gIHNhdFBvaW50OiBTYXRQb2ludCxcbiAgb3V0cHV0czogSW5zY3JpcHRpb25UcmFuc2FjdGlvbk91dHB1dHMsXG4gIGNvbnN0cmFpbnRzOiBJbnNjcmlwdGlvblRyYW5zYWN0aW9uQ29uc3RyYWludHMsXG4gIHsgbWluaW1pemVJbnB1dHMgPSBmYWxzZSB9ID0ge31cbik6IHsgaW5wdXRzOiBXYWxsZXRVbnNwZW50W107IGxheW91dDogT3V0cHV0TGF5b3V0IH0gfCB1bmRlZmluZWQge1xuICBpZiAobWluaW1pemVJbnB1dHMpIHtcbiAgICByZXR1cm4gZmluZFNtYWxsZXN0T3V0cHV0TGF5b3V0Rm9yV2FsbGV0VW5zcGVudHMoaW5wdXRzLCBzYXRQb2ludCwgb3V0cHV0cywgY29uc3RyYWludHMpO1xuICB9XG5cbiAgaWYgKGlucHV0cy5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYG11c3QgcHJvdmlkZSBhdCBsZWFzdCBvbmUgaW5wdXRgKTtcbiAgfVxuXG4gIGlmIChvdXRwdXRzLmNoYW5nZU91dHB1dHNbMF0uY2hhaW4gIT09IG91dHB1dHMuY2hhbmdlT3V0cHV0c1sxXS5jaGFpbikge1xuICAgIC8vIG90aGVyd2lzZSBvdXIgZmVlIGNhbGMgaXMgdG9vIGNvbXBsaWNhdGVkXG4gICAgdGhyb3cgbmV3IEVycm9yKGB3YWxsZXQgb3V0cHV0cyBtdXN0IGJlIG9uIHNhbWUgY2hhaW5gKTtcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICBtaW5DaGFuZ2VPdXRwdXQgPSBEZWZhdWx0SW5zY3JpcHRpb25Db25zdHJhaW50cy5taW5DaGFuZ2VPdXRwdXQsXG4gICAgbWluSW5zY3JpcHRpb25PdXRwdXQgPSBEZWZhdWx0SW5zY3JpcHRpb25Db25zdHJhaW50cy5taW5JbnNjcmlwdGlvbk91dHB1dCxcbiAgICBtYXhJbnNjcmlwdGlvbk91dHB1dCA9IERlZmF1bHRJbnNjcmlwdGlvbkNvbnN0cmFpbnRzLm1heEluc2NyaXB0aW9uT3V0cHV0LFxuICB9ID0gY29uc3RyYWludHM7XG5cbiAgLy8gSm9pbiBhbGwgdGhlIGlucHV0cyBpbnRvIGEgc2luZ2xlIGluc2NyaXB0aW9uT3V0cHV0LlxuICAvLyBGb3IgdGhlIHB1cnBvc2VzIG9mIGZpbmRpbmcgYSBsYXlvdXQgdGhlcmUgaXMgbm8gZGlmZmVyZW5jZS5cbiAgY29uc3QgaW5zY3JpcHRpb25PdXRwdXQgPSBPcmRPdXRwdXQuam9pbkFsbChcbiAgICBpbnB1dHMubWFwKChpKSA9PiBuZXcgT3JkT3V0cHV0KGkudmFsdWUsIGkgPT09IGlucHV0c1swXSA/IFt0b1NhdFJhbmdlKHNhdFBvaW50KV0gOiBbXSkpXG4gICk7XG4gIGNvbnN0IGxheW91dCA9IGZpbmRPdXRwdXRMYXlvdXQoaW5zY3JpcHRpb25PdXRwdXQsIHtcbiAgICBtaW5DaGFuZ2VPdXRwdXQsXG4gICAgbWluSW5zY3JpcHRpb25PdXRwdXQsXG4gICAgbWF4SW5zY3JpcHRpb25PdXRwdXQsXG4gICAgZmVlRml4ZWQ6IGdldEZlZShcbiAgICAgIFZpcnR1YWxTaXplcy50eFNlZ092ZXJoZWFkVlNpemUgK1xuICAgICAgICBEaW1lbnNpb25zLmZyb21VbnNwZW50cyhpbnB1dHMsIHtcbiAgICAgICAgICBwMnRyOiB7IHNjcmlwdFBhdGhMZXZlbDogMSB9LFxuICAgICAgICAgIHAydHJNdXNpZzI6IHsgc2NyaXB0UGF0aExldmVsOiB1bmRlZmluZWQgfSxcbiAgICAgICAgfSkuZ2V0SW5wdXRzVlNpemUoKSxcbiAgICAgIGNvbnN0cmFpbnRzLmZlZVJhdGVTYXRLQlxuICAgICksXG4gICAgZmVlUGVyT3V0cHV0OiBnZXRGZWUoXG4gICAgICBEaW1lbnNpb25zLmZyb21PdXRwdXRPbkNoYWluKG91dHB1dHMuY2hhbmdlT3V0cHV0c1swXS5jaGFpbikuZ2V0T3V0cHV0c1ZTaXplKCksXG4gICAgICBjb25zdHJhaW50cy5mZWVSYXRlU2F0S0JcbiAgICApLFxuICB9KTtcblxuICByZXR1cm4gbGF5b3V0ID8geyBpbnB1dHMsIGxheW91dCB9IDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgY29uc3QgTUFYX1VOU1BFTlRTX0ZPUl9PVVRQVVRfTEFZT1VUID0gNTtcblxuLyoqXG4gKiBAcGFyYW0gaW5wdXRzIC0gaW5zY3JpcHRpb24gaW5wdXQgbXVzdCBjb21lIGZpcnN0XG4gKiBAcGFyYW0gc2F0UG9pbnQgLSBsb2NhdGlvbiBvZiB0aGUgaW5zY3JpcHRpb25cbiAqIEBwYXJhbSBvdXRwdXRzXG4gKiBAcGFyYW0gY29uc3RyYWludHNcbiAqL1xuZnVuY3Rpb24gZmluZFNtYWxsZXN0T3V0cHV0TGF5b3V0Rm9yV2FsbGV0VW5zcGVudHMoXG4gIGlucHV0czogV2FsbGV0VW5zcGVudFtdLFxuICBzYXRQb2ludDogU2F0UG9pbnQsXG4gIG91dHB1dHM6IEluc2NyaXB0aW9uVHJhbnNhY3Rpb25PdXRwdXRzLFxuICBjb25zdHJhaW50czogSW5zY3JpcHRpb25UcmFuc2FjdGlvbkNvbnN0cmFpbnRzXG4pOiB7IGlucHV0czogV2FsbGV0VW5zcGVudFtdOyBsYXlvdXQ6IE91dHB1dExheW91dCB9IHwgdW5kZWZpbmVkIHtcbiAgaWYgKE1BWF9VTlNQRU5UU19GT1JfT1VUUFVUX0xBWU9VVCA8IGlucHV0cy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGlucHV0IGFycmF5IGlzIHRvbyBsYXJnZWApO1xuICB9XG4gIC8vIGNyZWF0ZSBwb3dlcnNldCBvZiBhbGwgc3VwcGxlbWVudGFyeSBpbnB1dHMgYW5kIGZpbmQgdGhlIGNoZWFwZXN0IHJlc3VsdFxuICBjb25zdCBpbnB1dHNBcnIgPSBbaW5wdXRzLCAuLi5wb3dlcnNldChpbnB1dHMuc2xpY2UoMSkpLm1hcCgocykgPT4gW2lucHV0c1swXSwgLi4uc10pXTtcbiAgcmV0dXJuIGlucHV0c0FyclxuICAgIC5tYXAoKGlucHV0cykgPT4gZmluZE91dHB1dExheW91dEZvcldhbGxldFVuc3BlbnRzKGlucHV0cywgc2F0UG9pbnQsIG91dHB1dHMsIGNvbnN0cmFpbnRzKSlcbiAgICAucmVkdWNlKChiZXN0LCBuZXh0KSA9PiB7XG4gICAgICBpZiAoYmVzdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgfVxuICAgICAgaWYgKG5leHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gYmVzdDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiZXN0LmxheW91dC5mZWVPdXRwdXQgPCBuZXh0LmxheW91dC5mZWVPdXRwdXQgPyBiZXN0IDogbmV4dDtcbiAgICB9KTtcbn1cblxuZXhwb3J0IGNsYXNzIEVycm9yTm9MYXlvdXQgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCdDb3VsZCBub3QgZmluZCBvdXRwdXQgbGF5b3V0IGZvciBpbnNjcmlwdGlvbiBwYXNzaW5nIHRyYW5zYWN0aW9uJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0gbmV0d29ya1xuICogQHBhcmFtIGlucHV0QnVpbGRlclxuICogQHBhcmFtIHVuc3BlbnRcbiAqIEBwYXJhbSBzYXRQb2ludFxuICogQHBhcmFtIG91dHB1dHNcbiAqIEBwYXJhbSBjb25zdHJhaW50c1xuICogQHBhcmFtIHN1cHBsZW1lbnRhcnlVbnNwZW50cyAtIGFkZGl0aW9uYWwgaW5wdXRzIHRvIGNvdmVyIGZlZS5cbiAqIEBwYXJhbSBbbWluaW1pemVJbnB1dHM9dHJ1ZV0gLSB0cnkgdG8gZmluZCBpbnB1dCBjb21iaW5hdGlvbiB3aXRoIG1pbmltYWwgZmVlcy4gTGltaXRzIHN1cHBsZW1lbnRhcnlVbnNwZW50cyB0byA0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUHNidEZvclNpbmdsZUluc2NyaXB0aW9uUGFzc2luZ1RyYW5zYWN0aW9uKFxuICBuZXR3b3JrOiBOZXR3b3JrLFxuICBpbnB1dEJ1aWxkZXI6IFdhbGxldElucHV0QnVpbGRlcixcbiAgdW5zcGVudDogV2FsbGV0VW5zcGVudCB8IFdhbGxldFVuc3BlbnRbXSxcbiAgc2F0UG9pbnQ6IFNhdFBvaW50LFxuICBvdXRwdXRzOiBJbnNjcmlwdGlvblRyYW5zYWN0aW9uT3V0cHV0cyxcbiAgY29uc3RyYWludHM6IEluc2NyaXB0aW9uVHJhbnNhY3Rpb25Db25zdHJhaW50cyxcbiAge1xuICAgIHN1cHBsZW1lbnRhcnlVbnNwZW50cyA9IFtdLFxuICAgIG1pbmltaXplSW5wdXRzID0gdHJ1ZSxcbiAgfToge1xuICAgIHN1cHBsZW1lbnRhcnlVbnNwZW50cz86IFdhbGxldFVuc3BlbnRbXTtcbiAgICBtaW5pbWl6ZUlucHV0cz86IGJvb2xlYW47XG4gIH0gPSB7fVxuKTogYml0Z28uVXR4b1BzYnQge1xuICAvLyBzdXBwb3J0IGZvciBsZWdhY3kgY2FsbCBzdHlsZVxuICBpZiAoQXJyYXkuaXNBcnJheSh1bnNwZW50KSkge1xuICAgIGlmICh1bnNwZW50Lmxlbmd0aCAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBjYW4gb25seSBwYXNzIHNpbmdsZSB1bnNwZW50YCk7XG4gICAgfVxuICAgIHVuc3BlbnQgPSB1bnNwZW50WzBdO1xuICB9XG5cbiAgY29uc3QgcmVzdWx0ID0gZmluZE91dHB1dExheW91dEZvcldhbGxldFVuc3BlbnRzKFxuICAgIFt1bnNwZW50LCAuLi5zdXBwbGVtZW50YXJ5VW5zcGVudHNdLFxuICAgIHNhdFBvaW50LFxuICAgIG91dHB1dHMsXG4gICAgY29uc3RyYWludHMsXG4gICAgeyBtaW5pbWl6ZUlucHV0cyB9XG4gICk7XG5cbiAgaWYgKCFyZXN1bHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3JOb0xheW91dCgpO1xuICB9XG5cbiAgcmV0dXJuIGNyZWF0ZVBzYnRGcm9tT3V0cHV0TGF5b3V0KG5ldHdvcmssIGlucHV0QnVpbGRlciwgcmVzdWx0LmlucHV0cywgb3V0cHV0cywgcmVzdWx0LmxheW91dCk7XG59XG4iXX0=