@witnet/sdk 1.1.3 → 1.2.0

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.
Files changed (192) hide show
  1. package/.env_witnet +13 -1
  2. package/dist/package.json +31 -24
  3. package/dist/src/bin/helpers.d.ts +59 -49
  4. package/dist/src/bin/helpers.d.ts.map +1 -1
  5. package/dist/src/bin/helpers.js +228 -229
  6. package/dist/src/index.d.ts +3 -4
  7. package/dist/src/index.d.ts.map +1 -1
  8. package/dist/src/index.js +4 -47
  9. package/dist/src/lib/crypto/account.d.ts +3 -3
  10. package/dist/src/lib/crypto/account.d.ts.map +1 -1
  11. package/dist/src/lib/crypto/account.js +31 -25
  12. package/dist/src/lib/crypto/coinbase.d.ts +4 -4
  13. package/dist/src/lib/crypto/coinbase.d.ts.map +1 -1
  14. package/dist/src/lib/crypto/coinbase.js +8 -13
  15. package/dist/src/lib/crypto/index.d.ts +7 -7
  16. package/dist/src/lib/crypto/index.d.ts.map +1 -1
  17. package/dist/src/lib/crypto/index.js +7 -30
  18. package/dist/src/lib/crypto/interfaces.d.ts +5 -5
  19. package/dist/src/lib/crypto/interfaces.d.ts.map +1 -1
  20. package/dist/src/lib/crypto/interfaces.js +2 -3
  21. package/dist/src/lib/crypto/payloads/DataRequestPayload.d.ts +5 -5
  22. package/dist/src/lib/crypto/payloads/DataRequestPayload.d.ts.map +1 -1
  23. package/dist/src/lib/crypto/payloads/DataRequestPayload.js +107 -95
  24. package/dist/src/lib/crypto/payloads/StakePayload.d.ts +3 -4
  25. package/dist/src/lib/crypto/payloads/StakePayload.d.ts.map +1 -1
  26. package/dist/src/lib/crypto/payloads/StakePayload.js +81 -71
  27. package/dist/src/lib/crypto/payloads/UnstakePayload.d.ts +4 -5
  28. package/dist/src/lib/crypto/payloads/UnstakePayload.d.ts.map +1 -1
  29. package/dist/src/lib/crypto/payloads/UnstakePayload.js +36 -43
  30. package/dist/src/lib/crypto/payloads/ValueTransferPayload.d.ts +3 -4
  31. package/dist/src/lib/crypto/payloads/ValueTransferPayload.d.ts.map +1 -1
  32. package/dist/src/lib/crypto/payloads/ValueTransferPayload.js +46 -48
  33. package/dist/src/lib/crypto/payloads.d.ts +5 -5
  34. package/dist/src/lib/crypto/payloads.d.ts.map +1 -1
  35. package/dist/src/lib/crypto/payloads.js +44 -45
  36. package/dist/src/lib/crypto/signer.d.ts +3 -3
  37. package/dist/src/lib/crypto/signer.d.ts.map +1 -1
  38. package/dist/src/lib/crypto/signer.js +45 -88
  39. package/dist/src/lib/crypto/transmitters/DataRequests.d.ts +6 -6
  40. package/dist/src/lib/crypto/transmitters/DataRequests.d.ts.map +1 -1
  41. package/dist/src/lib/crypto/transmitters/DataRequests.js +6 -10
  42. package/dist/src/lib/crypto/transmitters/StakeDeposits.d.ts +5 -5
  43. package/dist/src/lib/crypto/transmitters/StakeDeposits.d.ts.map +1 -1
  44. package/dist/src/lib/crypto/transmitters/StakeDeposits.js +7 -11
  45. package/dist/src/lib/crypto/transmitters/StakeWithdrawals.d.ts +6 -7
  46. package/dist/src/lib/crypto/transmitters/StakeWithdrawals.d.ts.map +1 -1
  47. package/dist/src/lib/crypto/transmitters/StakeWithdrawals.js +9 -13
  48. package/dist/src/lib/crypto/transmitters/ValueTransfers.d.ts +5 -5
  49. package/dist/src/lib/crypto/transmitters/ValueTransfers.d.ts.map +1 -1
  50. package/dist/src/lib/crypto/transmitters/ValueTransfers.js +6 -10
  51. package/dist/src/lib/crypto/transmitters.d.ts +6 -6
  52. package/dist/src/lib/crypto/transmitters.d.ts.map +1 -1
  53. package/dist/src/lib/crypto/transmitters.js +88 -76
  54. package/dist/src/lib/crypto/types.d.ts +1 -2
  55. package/dist/src/lib/crypto/types.d.ts.map +1 -1
  56. package/dist/src/lib/crypto/types.js +71 -67
  57. package/dist/src/lib/crypto/utils.d.ts +5 -5
  58. package/dist/src/lib/crypto/utils.d.ts.map +1 -1
  59. package/dist/src/lib/crypto/utils.js +48 -66
  60. package/dist/src/lib/crypto/wallet.d.ts +3 -3
  61. package/dist/src/lib/crypto/wallet.d.ts.map +1 -1
  62. package/dist/src/lib/crypto/wallet.js +72 -89
  63. package/dist/src/lib/index.d.ts +5 -4
  64. package/dist/src/lib/index.d.ts.map +1 -1
  65. package/dist/src/lib/index.js +6 -44
  66. package/dist/src/lib/radon/ccdr/eth.d.ts +1 -1
  67. package/dist/src/lib/radon/ccdr/eth.d.ts.map +1 -1
  68. package/dist/src/lib/radon/ccdr/eth.js +95 -83
  69. package/dist/src/lib/radon/ccdr/index.d.ts +2 -2
  70. package/dist/src/lib/radon/ccdr/index.d.ts.map +1 -1
  71. package/dist/src/lib/radon/ccdr/index.js +3 -39
  72. package/dist/src/lib/radon/ccdr/wit.d.ts +2 -2
  73. package/dist/src/lib/radon/ccdr/wit.d.ts.map +1 -1
  74. package/dist/src/lib/radon/ccdr/wit.js +17 -19
  75. package/dist/src/lib/radon/filters.d.ts.map +1 -1
  76. package/dist/src/lib/radon/filters.js +23 -19
  77. package/dist/src/lib/radon/index.d.ts +10 -11
  78. package/dist/src/lib/radon/index.d.ts.map +1 -1
  79. package/dist/src/lib/radon/index.js +205 -187
  80. package/dist/src/lib/radon/reducers.d.ts +2 -2
  81. package/dist/src/lib/radon/reducers.d.ts.map +1 -1
  82. package/dist/src/lib/radon/reducers.js +48 -34
  83. package/dist/src/lib/radon/types.d.ts +2 -2
  84. package/dist/src/lib/radon/types.d.ts.map +1 -1
  85. package/dist/src/lib/radon/types.js +80 -110
  86. package/dist/src/lib/radon/utils.d.ts +3 -3
  87. package/dist/src/lib/radon/utils.d.ts.map +1 -1
  88. package/dist/src/lib/radon/utils.js +49 -52
  89. package/dist/src/lib/rest/kermit.d.ts +20 -0
  90. package/dist/src/lib/rest/kermit.d.ts.map +1 -0
  91. package/dist/src/lib/rest/kermit.js +68 -0
  92. package/dist/src/lib/rest/types.d.ts +5 -0
  93. package/dist/src/lib/rest/types.d.ts.map +1 -0
  94. package/dist/src/lib/rest/types.js +2 -0
  95. package/dist/src/lib/rpc/index.d.ts +2 -2
  96. package/dist/src/lib/rpc/index.d.ts.map +1 -1
  97. package/dist/src/lib/rpc/index.js +3 -19
  98. package/dist/src/lib/rpc/nodes.d.ts +13 -13
  99. package/dist/src/lib/rpc/nodes.d.ts.map +1 -1
  100. package/dist/src/lib/rpc/nodes.js +69 -98
  101. package/dist/src/lib/rpc/provider.d.ts +4 -4
  102. package/dist/src/lib/rpc/provider.d.ts.map +1 -1
  103. package/dist/src/lib/rpc/provider.js +111 -125
  104. package/dist/src/lib/rpc/types.d.ts +2 -2
  105. package/dist/src/lib/rpc/types.d.ts.map +1 -1
  106. package/dist/src/lib/rpc/types.js +13 -16
  107. package/dist/src/lib/types.d.ts +5 -4
  108. package/dist/src/lib/types.d.ts.map +1 -1
  109. package/dist/src/lib/types.js +3 -9
  110. package/dist/src/lib/utils.d.ts +5 -5
  111. package/dist/src/lib/utils.d.ts.map +1 -1
  112. package/dist/src/lib/utils.js +40 -99
  113. package/dist/witnet/assets/index.cjs +6 -0
  114. package/dist/witnet/assets/index.d.cts +29 -0
  115. package/dist/witnet/assets/index.d.cts.map +1 -0
  116. package/dist/witnet/assets/modals/index.cjs +9 -0
  117. package/dist/witnet/assets/modals/index.d.cts +16 -0
  118. package/dist/witnet/assets/modals/index.d.cts.map +1 -0
  119. package/dist/witnet/assets/modals/web3/eth.cjs +23 -0
  120. package/dist/witnet/assets/modals/web3/eth.d.cts +4 -0
  121. package/dist/witnet/assets/modals/web3/eth.d.cts.map +1 -0
  122. package/dist/witnet/assets/modals/web3/ipfs.cjs +18 -0
  123. package/dist/witnet/assets/modals/web3/ipfs.d.cts +3 -0
  124. package/dist/witnet/assets/modals/web3/ipfs.d.cts.map +1 -0
  125. package/dist/witnet/assets/modals/web3/wit.cjs +24 -0
  126. package/dist/witnet/assets/modals/web3/wit.d.cts +3 -0
  127. package/dist/witnet/assets/modals/web3/wit.d.cts.map +1 -0
  128. package/dist/witnet/assets/requests.cjs +43 -0
  129. package/dist/witnet/assets/requests.d.cts +10 -0
  130. package/dist/witnet/assets/requests.d.cts.map +1 -0
  131. package/package.json +31 -24
  132. package/src/bin/bots/watcher.cjs +354 -0
  133. package/src/bin/cli/history.cjs +31 -0
  134. package/src/bin/cli/inspect.js +545 -471
  135. package/src/bin/cli/network.js +658 -557
  136. package/src/bin/cli/nodes.js +392 -332
  137. package/src/bin/cli/radon.js +1071 -844
  138. package/src/bin/cli/wallet.js +1317 -1074
  139. package/src/bin/helpers.js +969 -868
  140. package/src/bin/index.js +329 -0
  141. package/witnet/assets/_index.cjs +5 -0
  142. package/witnet/assets/_requests.cjs +25 -0
  143. package/witnet/assets/_sources.cjs +36 -0
  144. package/witnet/assets/_templates.cjs +36 -0
  145. package/witnet/assets/index.cjs +4 -0
  146. package/witnet/assets/modals/index.cjs +7 -0
  147. package/witnet/assets/modals/web3/eth.cjs +27 -0
  148. package/witnet/assets/modals/web3/ipfs.cjs +22 -0
  149. package/witnet/assets/modals/web3/wit.cjs +28 -0
  150. package/witnet/assets/requests.cjs +49 -0
  151. package/witnet/witnet copy.proto +457 -0
  152. package/witnet/witnet.proto +456 -0
  153. package/witnet/witnet_toolkit-1.6.7-x86_64-pc-windows-msvc.exe +0 -0
  154. package/witnet/witnet_toolkit-1.7.1-x86_64-pc-windows-msvc.exe +0 -0
  155. package/witnet/witnet_toolkit-2.0.0-rc.7-x86_64-pc-windows-msvc.exe +0 -0
  156. package/witnet/witnet_toolkit-2.0.2-x86_64-pc-windows-msvc.exe +0 -0
  157. package/witnet/witnet_toolkit-2.0.21-x86_64-pc-windows-msvc.exe +0 -0
  158. package/witnet/witnet_toolkit-2.0.7-x86_64-pc-windows-msvc.exe +0 -0
  159. package/witnet/witnet_toolkit-2.0.8-x86_64-pc-windows-msvc.exe +0 -0
  160. package/dist/witnet/assets/index.d.ts +0 -29
  161. package/dist/witnet/assets/index.d.ts.map +0 -1
  162. package/dist/witnet/assets/index.js +0 -6
  163. package/dist/witnet/assets/modals/index.d.ts +0 -16
  164. package/dist/witnet/assets/modals/index.d.ts.map +0 -1
  165. package/dist/witnet/assets/modals/index.js +0 -11
  166. package/dist/witnet/assets/modals/web3/eth.d.ts +0 -5
  167. package/dist/witnet/assets/modals/web3/eth.d.ts.map +0 -1
  168. package/dist/witnet/assets/modals/web3/eth.js +0 -26
  169. package/dist/witnet/assets/modals/web3/ipfs.d.ts +0 -4
  170. package/dist/witnet/assets/modals/web3/ipfs.d.ts.map +0 -1
  171. package/dist/witnet/assets/modals/web3/ipfs.js +0 -18
  172. package/dist/witnet/assets/modals/web3/wit.d.ts +0 -4
  173. package/dist/witnet/assets/modals/web3/wit.d.ts.map +0 -1
  174. package/dist/witnet/assets/modals/web3/wit.js +0 -17
  175. package/dist/witnet/assets/requests.d.ts +0 -11
  176. package/dist/witnet/assets/requests.d.ts.map +0 -1
  177. package/dist/witnet/assets/requests.js +0 -43
  178. package/src/bin/cli/history.js +0 -31
  179. package/src/bin/postinstall.js +0 -9
  180. package/src/bin/toolkit.js +0 -290
  181. package/witnet/assets/_index.js +0 -8
  182. package/witnet/assets/_requests.js +0 -25
  183. package/witnet/assets/_sources.js +0 -36
  184. package/witnet/assets/_templates.js +0 -36
  185. package/witnet/assets/index.js +0 -4
  186. package/witnet/assets/modals/index.js +0 -9
  187. package/witnet/assets/modals/web3/eth.js +0 -29
  188. package/witnet/assets/modals/web3/ipfs.js +0 -22
  189. package/witnet/assets/modals/web3/wit.js +0 -21
  190. package/witnet/assets/requests.js +0 -49
  191. /package/witnet/assets/modals/web3/{btc.js → btc.cjs} +0 -0
  192. /package/witnet/assets/modals/web3/{sol.js → sol.cjs} +0 -0
@@ -1,48 +1,12 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.RadonString = exports.RadonMap = exports.RadonInteger = exports.RadonFloat = exports.RadonBytes = exports.RadonBoolean = exports.RadonArray = exports.RadonAny = exports.RadonScript = exports.RadonOperator = exports.RadonOperators = exports.RadonEncodings = void 0;
37
- const cbor_1 = require("cbor");
38
- const helpers = __importStar(require("../../bin/helpers"));
39
- const Utils = __importStar(require("../utils"));
40
- var RadonEncodings;
1
+ import cbor from "cbor";
2
+ import * as helpers from "../../bin/helpers.js";
3
+ import { toHexString } from "../utils.js";
4
+ export var RadonEncodings;
41
5
  (function (RadonEncodings) {
42
6
  RadonEncodings[RadonEncodings["HexString"] = 0] = "HexString";
43
7
  RadonEncodings[RadonEncodings["Base64"] = 1] = "Base64";
44
8
  RadonEncodings[RadonEncodings["Utf8"] = 2] = "Utf8";
45
- })(RadonEncodings || (exports.RadonEncodings = RadonEncodings = {}));
9
+ })(RadonEncodings || (RadonEncodings = {}));
46
10
  var RadonHashFunctions;
47
11
  (function (RadonHashFunctions) {
48
12
  // Blake256 = 0x00,
@@ -64,7 +28,7 @@ var RadonHashFunctions;
64
28
  // SHA3_512 = 0x10,
65
29
  // Whirlpool512 = 0x11,
66
30
  })(RadonHashFunctions || (RadonHashFunctions = {}));
67
- var RadonOperators;
31
+ export var RadonOperators;
68
32
  (function (RadonOperators) {
69
33
  RadonOperators[RadonOperators["ArrayLength"] = 16] = "ArrayLength";
70
34
  RadonOperators[RadonOperators["ArrayFilter"] = 17] = "ArrayFilter";
@@ -134,13 +98,16 @@ var RadonOperators;
134
98
  RadonOperators[RadonOperators["StringReplace"] = 123] = "StringReplace";
135
99
  RadonOperators[RadonOperators["StringSlice"] = 124] = "StringSlice";
136
100
  RadonOperators[RadonOperators["StringSplit"] = 125] = "StringSplit";
137
- })(RadonOperators || (exports.RadonOperators = RadonOperators = {}));
101
+ })(RadonOperators || (RadonOperators = {}));
138
102
  class RadonClass {
103
+ prev;
139
104
  constructor(prev) {
140
105
  this.prev = prev;
141
106
  }
142
107
  }
143
- class RadonOperator extends RadonClass {
108
+ export class RadonOperator extends RadonClass {
109
+ opcode;
110
+ params;
144
111
  constructor(opcode, params, ops) {
145
112
  super(ops);
146
113
  this.opcode = opcode;
@@ -148,13 +115,13 @@ class RadonOperator extends RadonClass {
148
115
  }
149
116
  argsCount() {
150
117
  let maxCount = 0;
151
- this.params?.forEach(param => {
152
- if (typeof param === 'string') {
118
+ this.params?.forEach((param) => {
119
+ if (typeof param === "string") {
153
120
  const count = helpers.getWildcardsCountFromString(param);
154
121
  if (count > maxCount)
155
122
  maxCount = count;
156
123
  }
157
- else if (typeof param === 'object' && param instanceof RadonScript) {
124
+ else if (typeof param === "object" && param instanceof RadonScript) {
158
125
  const count = param.argsCount();
159
126
  if (count > maxCount)
160
127
  maxCount = count;
@@ -166,14 +133,17 @@ class RadonOperator extends RadonClass {
166
133
  const result = this?.prev?.disect(level) || [];
167
134
  const operator = RadonOperators[this.opcode];
168
135
  const inputType = `Radon${operator.split(/(?=[A-Z])/)[0]}`;
169
- let radonCall = operator.split(/(?=[A-Z])/).slice(1).join('');
136
+ let radonCall = operator
137
+ .split(/(?=[A-Z])/)
138
+ .slice(1)
139
+ .join("");
170
140
  radonCall = radonCall.charAt(0).toLowerCase() + radonCall.slice(1);
171
141
  let args = "";
172
142
  let script;
173
143
  if (this.params && this.params[0] !== undefined) {
174
- this.params.map(param => {
175
- if (typeof param !== 'object' || !(param instanceof RadonScript)) {
176
- args += (typeof param === 'string' ? `"${param}"` : JSON.stringify(param)) + ", ";
144
+ this.params.map((param) => {
145
+ if (typeof param !== "object" || !(param instanceof RadonScript)) {
146
+ args += `${typeof param === "string" ? `"${param}"` : JSON.stringify(param)}, `;
177
147
  }
178
148
  else {
179
149
  script = param;
@@ -200,8 +170,8 @@ class RadonOperator extends RadonClass {
200
170
  encode() {
201
171
  let encoded;
202
172
  if (this?.params && this.params[0] !== undefined) {
203
- const args = this.params.map(param => {
204
- if (typeof param === 'object') {
173
+ const args = this.params.map((param) => {
174
+ if (typeof param === "object") {
205
175
  if (param instanceof RadonAny) {
206
176
  return param.prev?.encode();
207
177
  }
@@ -235,11 +205,11 @@ class RadonOperator extends RadonClass {
235
205
  if (args.length < this.argsCount()) {
236
206
  throw EvalError(`Insufficent args were provided (${args.length} < ${this.argsCount()})`);
237
207
  }
238
- return new RadonOperator(this.opcode, this.params?.map(param => {
239
- if (typeof param === 'string') {
208
+ return new RadonOperator(this.opcode, this.params?.map((param) => {
209
+ if (typeof param === "string") {
240
210
  return helpers.replaceWildcards(param, args);
241
211
  }
242
- else if (typeof param === 'object') {
212
+ else if (typeof param === "object") {
243
213
  if (param instanceof RadonScript) {
244
214
  return param.replaceWildcards(...args);
245
215
  }
@@ -253,11 +223,11 @@ class RadonOperator extends RadonClass {
253
223
  }), this?.prev?.replaceWildcards(args));
254
224
  }
255
225
  spliceWildcard(argIndex, argValue) {
256
- return new RadonOperator(this.opcode, this.params?.map(param => {
257
- if (typeof param === 'string') {
226
+ return new RadonOperator(this.opcode, this.params?.map((param) => {
227
+ if (typeof param === "string") {
258
228
  return helpers.spliceWildcard(param, argIndex, argValue, this.argsCount());
259
229
  }
260
- else if (typeof param === 'object' && param instanceof RadonScript) {
230
+ else if (typeof param === "object" && param instanceof RadonScript) {
261
231
  return param.spliceWildcard(argIndex, argValue);
262
232
  }
263
233
  else {
@@ -268,19 +238,22 @@ class RadonOperator extends RadonClass {
268
238
  toString(left = "", indent = 4, level = 0) {
269
239
  const lf = left !== "" ? "\n" : "";
270
240
  let str = this?.prev?.toString(left, indent, level) || "";
271
- let methodName = RadonOperators[this.opcode].split(/(?=[A-Z])/).slice(1).join('');
241
+ let methodName = RadonOperators[this.opcode]
242
+ .split(/(?=[A-Z])/)
243
+ .slice(1)
244
+ .join("");
272
245
  methodName = methodName.charAt(0).toLowerCase() + methodName.slice(1);
273
246
  str += `${left}${" ".repeat(indent * level)}.${methodName}(`;
274
247
  if (this.params && this.params[0] !== undefined) {
275
- this.params.forEach(param => {
276
- if (typeof param === 'string') {
248
+ this.params.forEach((param) => {
249
+ if (typeof param === "string") {
277
250
  str += `"${param}", `;
278
251
  }
279
- else if (typeof param === 'object' && param instanceof RadonScript) {
252
+ else if (typeof param === "object" && param instanceof RadonScript) {
280
253
  str += `${param.toString(left, indent, level + 1)}${left}${" ".repeat(indent * level)}, `;
281
254
  }
282
255
  else {
283
- str += param.toString() + ", ";
256
+ str += `${param.toString()}, `;
284
257
  }
285
258
  });
286
259
  str = str.slice(0, -2);
@@ -289,26 +262,28 @@ class RadonOperator extends RadonClass {
289
262
  return str;
290
263
  }
291
264
  }
292
- exports.RadonOperator = RadonOperator;
293
- class RadonScript {
265
+ export class RadonScript {
266
+ ops;
267
+ inputType;
268
+ outputType;
294
269
  constructor(output) {
295
270
  this.ops = output?.prev;
296
271
  const radonTypes = {
297
- "Array": RadonArray,
298
- "Boolean": RadonBoolean,
299
- "Bytes": RadonBytes,
300
- "Float": RadonFloat,
301
- "Integer": RadonInteger,
302
- "Map": RadonMap,
303
- "String": RadonString,
272
+ Array: RadonArray,
273
+ Boolean: RadonBoolean,
274
+ Bytes: RadonBytes,
275
+ Float: RadonFloat,
276
+ Integer: RadonInteger,
277
+ Map: RadonMap,
278
+ String: RadonString,
304
279
  };
305
280
  let input = output?.prev;
306
281
  while (input?.prev)
307
282
  input = input?.prev;
308
283
  const inputType = Object.entries(radonTypes).find(([prefix, _]) => input && RadonOperators[input.opcode].startsWith(prefix));
309
- if (inputType && inputType[1])
284
+ if (inputType?.[1])
310
285
  this.inputType = new inputType[1]();
311
- const outputType = Object.values(radonTypes).find(outputType => output instanceof outputType);
286
+ const outputType = Object.values(radonTypes).find((outputType) => output instanceof outputType);
312
287
  if (outputType)
313
288
  this.outputType = new outputType();
314
289
  }
@@ -324,7 +299,7 @@ class RadonScript {
324
299
  RadonInteger,
325
300
  RadonMap,
326
301
  RadonString,
327
- ].find(OutputType => this.outputType instanceof OutputType);
302
+ ].find((OutputType) => this.outputType instanceof OutputType);
328
303
  if (OutputType) {
329
304
  return new OutputType(this.ops);
330
305
  }
@@ -347,7 +322,7 @@ class RadonScript {
347
322
  RadonInteger,
348
323
  RadonMap,
349
324
  RadonString,
350
- ].find(OutputType => this.outputType instanceof OutputType);
325
+ ].find((OutputType) => this.outputType instanceof OutputType);
351
326
  if (OutputType) {
352
327
  return new OutputType(this.ops?.replaceWildcards(args));
353
328
  }
@@ -364,7 +339,7 @@ class RadonScript {
364
339
  RadonInteger,
365
340
  RadonMap,
366
341
  RadonString,
367
- ].find(OutputType => this.outputType instanceof OutputType);
342
+ ].find((OutputType) => this.outputType instanceof OutputType);
368
343
  if (OutputType) {
369
344
  return new OutputType(this.ops?.spliceWildcard(argIndex, argValue));
370
345
  }
@@ -373,15 +348,14 @@ class RadonScript {
373
348
  }
374
349
  }
375
350
  toBytecode() {
376
- return Utils.toHexString(Object.values(Uint8Array.from((0, cbor_1.encode)(this.encode()))), true);
351
+ return toHexString(Object.values(Uint8Array.from(cbor.encode(this.encode()))), true);
377
352
  }
378
353
  toString(left = "", indent = 0, level = 0) {
379
354
  const lf = left !== "" ? "\n" : "";
380
355
  return `RadonOperator(${this.inputType?.constructor.name || ""})${lf}${this.ops?.toString(left, indent, level + 1)}`;
381
356
  }
382
357
  }
383
- exports.RadonScript = RadonScript;
384
- class RadonAny extends RadonClass {
358
+ export class RadonAny extends RadonClass {
385
359
  _pushOperator(outputType, params) {
386
360
  let name;
387
361
  try {
@@ -389,13 +363,15 @@ class RadonAny extends RadonClass {
389
363
  }
390
364
  catch (err) {
391
365
  const result = err;
392
- name = result.stack?.split(' at ')[2]
393
- .split(' ')[0]
394
- .split('.')
395
- .map(part => helpers.toUpperCamelCase(part))
396
- .join('')
397
- .split(/(?=[A-Z])/).slice(1)
398
- .join('');
366
+ name = result.stack
367
+ ?.split(" at ")[2]
368
+ .split(" ")[0]
369
+ .split(".")
370
+ .map((part) => helpers.toUpperCamelCase(part))
371
+ .join("")
372
+ .split(/(?=[A-Z])/)
373
+ .slice(1)
374
+ .join("");
399
375
  }
400
376
  const opcode = RadonOperators[name];
401
377
  if (!opcode) {
@@ -406,8 +382,7 @@ class RadonAny extends RadonClass {
406
382
  }
407
383
  }
408
384
  }
409
- exports.RadonAny = RadonAny;
410
- class RadonArray extends RadonAny {
385
+ export class RadonArray extends RadonAny {
411
386
  /**
412
387
  * Discard the items in the input array that make the given `innerScript` to return a `false` value.
413
388
  * @param script Filtering script ultimately returning a `RadonBoolean` object.
@@ -418,7 +393,9 @@ class RadonArray extends RadonAny {
418
393
  if (!(innerScript instanceof RadonBoolean)) {
419
394
  throw new EvalError(`Inner script must fetch a RadonBoolean value`);
420
395
  }
421
- return this._pushOperator((RadonArray), [new RadonScript(innerScript)]);
396
+ return this._pushOperator((RadonArray), [
397
+ new RadonScript(innerScript),
398
+ ]);
422
399
  }
423
400
  /**
424
401
  * Fetch the item at the given `index` as a `RadonArray` object.
@@ -519,8 +496,7 @@ class RadonArray extends RadonAny {
519
496
  return this._pushOperator((RadonArray), [innerScript]);
520
497
  }
521
498
  }
522
- exports.RadonArray = RadonArray;
523
- class RadonBoolean extends RadonAny {
499
+ export class RadonBoolean extends RadonAny {
524
500
  /**
525
501
  * Reverse value.
526
502
  * @returns A `RadonBoolean` object.
@@ -536,8 +512,9 @@ class RadonBoolean extends RadonAny {
536
512
  return this._pushOperator(RadonString, []);
537
513
  }
538
514
  }
539
- exports.RadonBoolean = RadonBoolean;
540
- class RadonBytes extends RadonAny {
515
+ export class RadonBytes extends RadonAny {
516
+ static Encodings = RadonEncodings;
517
+ static Hashers = RadonHashFunctions;
541
518
  /**
542
519
  * Convert buffer into (big-endian) integer.
543
520
  * @returns A `RadonInteger` object.
@@ -582,10 +559,7 @@ class RadonBytes extends RadonAny {
582
559
  return this._pushOperator(RadonString, [encoding]);
583
560
  }
584
561
  }
585
- exports.RadonBytes = RadonBytes;
586
- RadonBytes.Encodings = RadonEncodings;
587
- RadonBytes.Hashers = RadonHashFunctions;
588
- class RadonFloat extends RadonAny {
562
+ export class RadonFloat extends RadonAny {
589
563
  /**
590
564
  * Compute the absolute value.
591
565
  * @returns A `RadonFloat` object.
@@ -676,8 +650,7 @@ class RadonFloat extends RadonAny {
676
650
  return this._pushOperator(RadonInteger, []);
677
651
  }
678
652
  }
679
- exports.RadonFloat = RadonFloat;
680
- class RadonInteger extends RadonAny {
653
+ export class RadonInteger extends RadonAny {
681
654
  /**
682
655
  * Compute the absolute value.
683
656
  * @returns A `RadonInteger` object.
@@ -754,8 +727,7 @@ class RadonInteger extends RadonAny {
754
727
  return this._pushOperator(RadonFloat, []);
755
728
  }
756
729
  }
757
- exports.RadonInteger = RadonInteger;
758
- class RadonMap extends RadonAny {
730
+ export class RadonMap extends RadonAny {
759
731
  /**
760
732
  * Alter the value of the item(s) identified by `keys`, applying the given `innerScript` to each one of them.
761
733
  * @param keys
@@ -827,7 +799,7 @@ class RadonMap extends RadonAny {
827
799
  * @return A `RadonMap` object.
828
800
  */
829
801
  pick(...keys) {
830
- if (Array(keys).length == 0) {
802
+ if (Array(keys).length === 0) {
831
803
  throw new EvalError(`\x1b[1;33mRadonMap::pick: a non-empty array of key strings must be provided\x1b[0m`);
832
804
  }
833
805
  return this._pushOperator(RadonMap, [...keys]);
@@ -847,8 +819,7 @@ class RadonMap extends RadonAny {
847
819
  return this._pushOperator(RadonString, []);
848
820
  }
849
821
  }
850
- exports.RadonMap = RadonMap;
851
- class RadonString extends RadonAny {
822
+ export class RadonString extends RadonAny {
852
823
  /**
853
824
  * Cast into a boolean value.
854
825
  * @returns A `RadonBoolean` object.
@@ -897,8 +868,8 @@ class RadonString extends RadonAny {
897
868
  */
898
869
  match(outputType, matchingMap, defaultValue) {
899
870
  return this._pushOperator(outputType, [matchingMap, defaultValue]);
900
- // this._bytecode = [
901
- // 0x75,
871
+ // this._bytecode = [
872
+ // 0x75,
902
873
  // matchingMap,
903
874
  // defaultValue
904
875
  // ]
@@ -974,5 +945,4 @@ class RadonString extends RadonAny {
974
945
  return this._pushOperator(RadonString, []);
975
946
  }
976
947
  }
977
- exports.RadonString = RadonString;
978
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JhZG9uL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLCtCQUEyQztBQUMzQywyREFBNEM7QUFHNUMsZ0RBQWlDO0FBSWpDLElBQVksY0FJWDtBQUpELFdBQVksY0FBYztJQUN0Qiw2REFBYSxDQUFBO0lBQ2IsdURBQVUsQ0FBQTtJQUNWLG1EQUFRLENBQUE7QUFDWixDQUFDLEVBSlcsY0FBYyw4QkFBZCxjQUFjLFFBSXpCO0FBRUQsSUFBSyxrQkFtQko7QUFuQkQsV0FBSyxrQkFBa0I7SUFDbkIsbUJBQW1CO0lBQ25CLG1CQUFtQjtJQUNuQixxQkFBcUI7SUFDckIscUJBQXFCO0lBQ3JCLGtCQUFrQjtJQUNsQixvQkFBb0I7SUFDcEIsb0JBQW9CO0lBQ3BCLG9CQUFvQjtJQUNwQixtQkFBbUI7SUFDbkIsbUJBQW1CO0lBQ25CLG9FQUFlLENBQUE7SUFDZixtQkFBbUI7SUFDbkIsbUJBQW1CO0lBQ25CLG1CQUFtQjtJQUNuQixtQkFBbUI7SUFDbkIsbUJBQW1CO0lBQ25CLG1CQUFtQjtJQUNuQix1QkFBdUI7QUFDM0IsQ0FBQyxFQW5CSSxrQkFBa0IsS0FBbEIsa0JBQWtCLFFBbUJ0QjtBQUVELElBQVksY0FxRVg7QUFyRUQsV0FBWSxjQUFjO0lBQ3RCLGtFQUFrQixDQUFBO0lBQ2xCLGtFQUFrQixDQUFBO0lBQ2xCLG9CQUFvQjtJQUNwQixzRUFBb0IsQ0FBQTtJQUNwQiwwRUFBc0IsQ0FBQTtJQUN0QixzRUFBb0IsQ0FBQTtJQUNwQixzRUFBb0IsQ0FBQTtJQUNwQiwwRUFBc0IsQ0FBQTtJQUN0QixrRUFBa0IsQ0FBQTtJQUNsQix3RUFBcUIsQ0FBQTtJQUNyQiw0REFBZSxDQUFBO0lBQ2Ysa0VBQWtCLENBQUE7SUFDbEIsOERBQWdCLENBQUE7SUFDaEIsb0JBQW9CO0lB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QUFBLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO0lBQy9ELENBQUM7SUFDRDs7O09BR0c7SUFDSSxXQUFXO1FBQ2QsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUM5QyxDQUFDO0lBQ0Q7OztPQUdHO0lBQ0ksV0FBVztRQUNkLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUE7SUFDOUMsQ0FBQztDQUNKO0FBaklELGtDQWlJQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGVuY29kZSBhcyBjYm9yRW5jb2RlIH0gZnJvbSBcImNib3JcIlxyXG5pbXBvcnQgKiBhcyBoZWxwZXJzIGZyb20gXCIuLi8uLi9iaW4vaGVscGVyc1wiXHJcblxyXG5pbXBvcnQgeyBPcGNvZGVzIGFzIFJhZG9uUmVkdWNlck9wY29kZXMgfSBmcm9tICcuL3JlZHVjZXJzJ1xyXG5pbXBvcnQgKiBhcyBVdGlscyBmcm9tICcuLi91dGlscydcclxuXHJcbmV4cG9ydCB7IEhleFN0cmluZyBhcyBSYWRvbkJ5dGVjb2RlIH0gZnJvbSBcIi4uL3R5cGVzXCJcclxuXHJcbmV4cG9ydCBlbnVtIFJhZG9uRW5jb2RpbmdzIHtcclxuICAgIEhleFN0cmluZyA9IDAsXHJcbiAgICBCYXNlNjQgPSAxLFxyXG4gICAgVXRmOCA9IDIsXHJcbn1cclxuXHJcbmVudW0gUmFkb25IYXNoRnVuY3Rpb25zIHtcclxuICAgIC8vIEJsYWtlMjU2ID0gMHgwMCxcclxuICAgIC8vIEJsYWtlNTEyID0gMHgwMSxcclxuICAgIC8vIEJsYWtlMnMyNTYgPSAweDAyLFxyXG4gICAgLy8gQmxha2UyYjUxMiA9IDB4MDMsXHJcbiAgICAvLyBNRDVfMTI4ID0gMHgwNCxcclxuICAgIC8vIFJpcGVtZDEyOCA9IDB4MDUsXHJcbiAgICAvLyBSaXBlbWQxNjAgPSAweDA2LFxyXG4gICAgLy8gUmlwZW1kMzIwID0gMHgwNyxcclxuICAgIC8vIFNIQTFfMTYwID0gMHgwOCxcclxuICAgIC8vIFNIQTJfMjI0ID0gMHgwOSxcclxuICAgIFNIQTJfMjU2ID0gMHgwQSxcclxuICAgIC8vIFNIQTJfMzg0ID0gMHgwQixcclxuICAgIC8vIFNIQTJfNTEyID0gMHgwQyxcclxuICAgIC8vIFNIQTNfMjI0ID0gMHgwRCxcclxuICAgIC8vIFNIQTNfMjU2ID0gMHgwRSxcclxuICAgIC8vIFNIQTNfMzg0ID0gMHgwRixcclxuICAgIC8vIFNIQTNfNTEyID0gMHgxMCxcclxuICAgIC8vIFdoaXJscG9vbDUxMiA9IDB4MTEsXHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIFJhZG9uT3BlcmF0b3JzIHtcclxuICAgIEFycmF5TGVuZ3RoID0gMHgxMCxcclxuICAgIEFycmF5RmlsdGVyID0gMHgxMSxcclxuICAgIC8vIEFycmF5Sm9pbiA9IDB4MTIsXHJcbiAgICBBcnJheUdldEFycmF5ID0gMHgxMyxcclxuICAgIEFycmF5R2V0Qm9vbGVhbiA9IDB4MTQsXHJcbiAgICBBcnJheUdldEJ5dGVzID0gMHgxNSxcclxuICAgIEFycmF5R2V0RmxvYXQgPSAweDE2LFxyXG4gICAgQXJyYXlHZXRJbnRlZ2VyID0gMHgxNyxcclxuICAgIEFycmF5R2V0TWFwID0gMHgxOCxcclxuICAgIEFycmF5R2V0U3RyaW5nID0gMHgxOSxcclxuICAgIEFycmF5TWFwID0gMHgxYSxcclxuICAgIEFycmF5UmVkdWNlID0gMHgxYixcclxuICAgIEFycmF5U29ydCA9IDB4MWQsXHJcbiAgICAvLyBBcnJheVBpY2sgPSAweDFlLFxyXG4gICAgQm9vbGVhblRvU3RyaW5nID0gMHgyMCxcclxuICAgIEJvb2xlYW5OZWdhdGUgPSAweDIyLFxyXG4gICAgQnl0ZXNUb1N0cmluZyA9IDB4MzAsXHJcbiAgICBCeXRlc0hhc2ggPSAweDMxLFxyXG4gICAgQnl0ZXNBc0ludGVnZXIgPSAweDMyLFxyXG4gICAgQnl0ZXNMZW5ndGggPSAweDM0LFxyXG4gICAgQnl0ZXNTbGljZSA9IDB4M2MsXHJcbiAgICBGbG9hdEFic29sdXRlID0gMHg1MCxcclxuICAgIEZsb2F0VG9TdHJpbmcgPSAweDUxLFxyXG4gICAgRmxvYXRDZWlsaW5nID0gMHg1MixcclxuICAgIEZsb2F0R3JlYXRlclRoYW4gPSAweDUzLFxyXG4gICAgRmxvYXRGbG9vciA9IDB4NTQsXHJcbiAgICBGbG9hdExlc3NUaGFuID0gMHg1NSxcclxuICAgIEZsb2F0TW9kdWxlID0gMHg1NixcclxuICAgIEZsb2F0TXVsdGlwbHkgPSAweDU3LFxyXG4gICAgRmxvYXROZWdhdGUgPSAweDU4LFxyXG4gICAgRmxvYXRQb3dlciA9IDB4NTksXHJcbiAgICBGbG9hdFJvdW5kID0gMHg1YixcclxuICAgIEZsb2F0VHJ1bmNhdGUgPSAweDVkLFxyXG4gICAgSW50ZWdlckFic29sdXRlID0gMHg0MCxcclxuICAgIEludGVnZXJUb0Zsb2F0ID0gMHg0MSxcclxuICAgIEludGVnZXJUb1N0cmluZyA9IDB4NDIsXHJcbiAgICBJbnRlZ2VyR3JlYXRlclRoYW4gPSAweDQzLFxyXG4gICAgSW50ZWdlckxlc3NUaGFuID0gMHg0NCxcclxuICAgIEludGVnZXJNb2R1bG8gPSAweDQ2LFxyXG4gICAgSW50ZWdlck11bHRpcGx5ID0gMHg0NyxcclxuICAgIEludGVnZXJOZWdhdGUgPSAweDQ4LFxyXG4gICAgSW50ZWdlclBvd2VyID0gMHg0OSxcclxuICAgIEludGVnZXJUb0J5dGVzID0gMHg0YSxcclxuICAgIE1hcFRvU3RyaW5nID0gMHg2MCxcclxuICAgIE1hcEdldEFycmF5ID0gMHg2MSxcclxuICAgIE1hcEdldEJvb2xlYW4gPSAweDYyLFxyXG4gICAgTWFwR2V0RmxvYXQgPSAweDY0LFxyXG4gICAgTWFwR2V0SW50ZWdlciA9IDB4NjUsXHJcbiAgICBNYXBHZXRNYXAgPSAweDY2LFxyXG4gICAgTWFwR2V0U3RyaW5nID0gMHg2NyxcclxuICAgIE1hcEtleXMgPSAweDY4LFxyXG4gICAgTWFwVmFsdWVzID0gMHg2OSxcclxuICAgIE1hcEFsdGVyID0gMHg2YixcclxuICAgIE1hcFBpY2sgPSAweDZlLCAgIFxyXG4gICAgU3RyaW5nQXNCb29sZWFuID0gMHg3MCxcclxuICAgIFN0cmluZ0FzQnl0ZXMgPSAweDcxLFxyXG4gICAgU3RyaW5nQXNGbG9hdCA9IDB4NzIsXHJcbiAgICBTdHJpbmdBc0ludGVnZXIgPSAweDczLFxyXG4gICAgU3RyaW5nTGVuZ3RoID0gMHg3NCxcclxuICAgIFN0cmluZ01hdGNoID0gMHg3NSxcclxuICAgIFN0cmluZ1BhcnNlSlNPTkFycmF5ID0gMHg3NixcclxuICAgIFN0cmluZ1BhcnNlSlNPTk1hcCA9IDB4NzcsXHJcbiAgICBTdHJpbmdQYXJzZVhNTE1hcCA9IDB4NzgsXHJcbiAgICBTdHJpbmdUb0xvd2VyQ2FzZSA9IDB4NzksXHJcbiAgICBTdHJpbmdUb1VwcHNlckNhc2UgPSAweDdhLFxyXG4gICAgU3RyaW5nUmVwbGFjZSA9IDB4N2IsXHJcbiAgICBTdHJpbmdTbGljZSA9IDB4N2MsXHJcbiAgICBTdHJpbmdTcGxpdCA9IDB4N2QsXHJcbn1cclxuXHJcbmFic3RyYWN0IGNsYXNzIFJhZG9uQ2xhc3Mge1xyXG4gICAgcmVhZG9ubHkgcHJldj86IFJhZG9uT3BlcmF0b3I7XHJcbiAgICBjb25zdHJ1Y3RvcihwcmV2PzogUmFkb25PcGVyYXRvcikge1xyXG4gICAgICAgIHRoaXMucHJldiA9IHByZXZcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFJhZG9uT3BlcmF0b3IgZXh0ZW5kcyBSYWRvbkNsYXNzIHtcclxuICAgIHJlYWRvbmx5IG9wY29kZTogUmFkb25PcGVyYXRvcnNcclxuICAgIHJlYWRvbmx5IHBhcmFtcz86IGFueVtdXHJcbiAgICBjb25zdHJ1Y3RvcihvcGNvZGU6IFJhZG9uT3BlcmF0b3JzLCBwYXJhbXM/OiBhbnlbXSwgb3BzPzogUmFkb25PcGVyYXRvcikge1xyXG4gICAgICAgIHN1cGVyKG9wcylcclxuICAgICAgICB0aGlzLm9wY29kZSA9IG9wY29kZVxyXG4gICAgICAgIHRoaXMucGFyYW1zID0gcGFyYW1zIHx8IFtdXHJcbiAgICB9XHJcbiAgICBwdWJsaWMgYXJnc0NvdW50KCk6IG51bWJlciB7IFxyXG4gICAgICAgIGxldCBtYXhDb3VudDogbnVtYmVyID0gMFxyXG4gICAgICAgIHRoaXMucGFyYW1zPy5mb3JFYWNoKHBhcmFtID0+IHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJhbSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvdW50ID0gaGVscGVycy5nZXRXaWxkY2FyZHNDb3VudEZyb21TdHJpbmcocGFyYW0pXHJcbiAgICAgICAgICAgICAgICBpZiAoY291bnQgPiBtYXhDb3VudCkgbWF4Q291bnQgPSBjb3VudFxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBwYXJhbSA9PT0gJ29iamVjdCcgJiYgcGFyYW0gaW5zdGFuY2VvZiBSYWRvblNjcmlwdCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY291bnQgPSBwYXJhbS5hcmdzQ291bnQoKVxyXG4gICAgICAgICAgICAgICAgaWYgKGNvdW50ID4gbWF4Q291bnQpIG1heENvdW50ID0gY291bnRcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KFxyXG4gICAgICAgICAgICBtYXhDb3VudCxcclxuICAgICAgICAgICAgdGhpcy5wcmV2Py5hcmdzQ291bnQoKSB8fCAwXHJcbiAgICAgICAgKVxyXG4gICAgfVxyXG4gICAgcHVibGljIGRpc2VjdChsZXZlbCA9IDApOiBbbnVtYmVyLCBzdHJpbmcsIHN0cmluZ11bXSB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcz8ucHJldj8uZGlzZWN0KGxldmVsKSB8fCBbXVxyXG4gICAgICAgIGNvbnN0IG9wZXJhdG9yID0gUmFkb25PcGVyYXRvcnNbdGhpcy5vcGNvZGVdXHJcbiAgICAgICAgY29uc3QgaW5wdXRUeXBlID0gYFJhZG9uJHtvcGVyYXRvci5zcGxpdCgvKD89W0EtWl0pLylbMF19YFxyXG4gICAgICAgIGxldCByYWRvbkNhbGwgPSBvcGVyYXRvci5zcGxpdCgvKD89W0EtWl0pLykuc2xpY2UoMSkuam9pbignJylcclxuICAgICAgICByYWRvbkNhbGwgPSByYWRvbkNhbGwuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgKyByYWRvbkNhbGwuc2xpY2UoMSlcclxuICAgICAgICBsZXQgYXJncyA9IFwiXCJcclxuICAgICAgICBsZXQgc2NyaXB0XHJcbiAgICAgICAgaWYgKHRoaXMucGFyYW1zICYmIHRoaXMucGFyYW1zWzBdICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5wYXJhbXMubWFwKHBhcmFtID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcGFyYW0gIT09ICdvYmplY3QnIHx8ICEocGFyYW0gaW5zdGFuY2VvZiBSYWRvblNjcmlwdCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBhcmdzICs9ICh0eXBlb2YgcGFyYW0gPT09ICdzdHJpbmcnID8gIGBcIiR7cGFyYW19XCJgIDogSlNPTi5zdHJpbmdpZnkocGFyYW0pKSArIFwiLCBcIlxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBzY3JpcHQgPSBwYXJhbVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICBpZiAoc2NyaXB0KSBhcmdzICs9IFwiUmFkb25PcGVyYXRvciB7XCJcclxuICAgICAgICAgICAgZWxzZSBhcmdzID0gYXJncy5zbGljZSgwLCAtMilcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHNjcmlwdCkge1xyXG4gICAgICAgICAgICBjb25zdCBvdXRwdXRUeXBlID0gYCR7KHNjcmlwdCBhcyBSYWRvblNjcmlwdCkub3V0cHV0VHlwZT8uY29uc3RydWN0b3IubmFtZSB8fCBcIlJhZG9uQW55XCJ9YFxyXG4gICAgICAgICAgICByYWRvbkNhbGwgKz0gYCgke2FyZ3N9YFxyXG4gICAgICAgICAgICByZXN1bHQucHVzaChbbGV2ZWwsIGlucHV0VHlwZSwgcmFkb25DYWxsXSlcclxuICAgICAgICAgICAgcmVzdWx0LnB1c2goLi4uKHNjcmlwdCBhcyBSYWRvblNjcmlwdCkuZGlzZWN0KGxldmVsICsgMSkpXHJcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKFtsZXZlbCwgb3V0cHV0VHlwZSwgXCJ9KVwiXSlcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByYWRvbkNhbGwgKz0gYCgke2FyZ3N9KWBcclxuICAgICAgICAgICAgcmVzdWx0LnB1c2goW2xldmVsLCBpbnB1dFR5cGUsIHJhZG9uQ2FsbF0pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHRcclxuICAgIH1cclxuICAgIHB1YmxpYyBlbmNvZGUoKTogYW55W10geyBcclxuICAgICAgICBsZXQgZW5jb2RlZFxyXG4gICAgICAgIGlmICh0aGlzPy5wYXJhbXMgJiYgdGhpcy5wYXJhbXNbMF0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBjb25zdCBhcmdzID0gdGhpcy5wYXJhbXMubWFwKHBhcmFtID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcGFyYW0gPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtIGluc3RhbmNlb2YgUmFkb25BbnkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtLnByZXY/LmVuY29kZSgpXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbSBpbnN0YW5jZW9mIFJhZG9uT3BlcmF0b3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtLmVuY29kZSgpXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbSBpbnN0YW5jZW9mIFJhZG9uU2NyaXB0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbS5lbmNvZGUoKVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIGVuY29kZWQgPSBbdGhpcy5vcGNvZGUsIC4uLmFyZ3NdXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZW5jb2RlZCA9IHRoaXMub3Bjb2RlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnByZXYpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFsuLi50aGlzLnByZXYuZW5jb2RlKCksIGVuY29kZWRdXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtlbmNvZGVkXVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHB1YmxpYyByZXBsYWNlV2lsZGNhcmRzKGFyZ3M6IHN0cmluZ1tdKTogUmFkb25PcGVyYXRvciB7XHJcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgdGhpcy5hcmdzQ291bnQoKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBFdmFsRXJyb3IoYEluc3VmZmljZW50IGFyZ3Mgd2VyZSBwcm92aWRlZCAoJHthcmdzLmxlbmd0aH0gPCAke3RoaXMuYXJnc0NvdW50KCl9KWApXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuZXcgUmFkb25PcGVyYXRvcihcclxuICAgICAgICAgICAgdGhpcy5vcGNvZGUsIFxyXG4gICAgICAgICAgICB0aGlzLnBhcmFtcz8ubWFwKHBhcmFtID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcGFyYW0gPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhlbHBlcnMucmVwbGFjZVdpbGRjYXJkcyhwYXJhbSwgYXJncylcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHBhcmFtID09PSAnb2JqZWN0Jykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbSBpbnN0YW5jZW9mIFJhZG9uU2NyaXB0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbS5yZXBsYWNlV2lsZGNhcmRzKC4uLmFyZ3MpXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhlbHBlcnMucmVwbGFjZVdpbGRjYXJkcyhwYXJhbSwgYXJncylcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KSwgXHJcbiAgICAgICAgICAgIHRoaXM/LnByZXY/LnJlcGxhY2VXaWxkY2FyZHMoYXJncylcclxuICAgICAgICApXHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc3BsaWNlV2lsZGNhcmQoYXJnSW5kZXg6IG51bWJlciwgYXJnVmFsdWU6IHN0cmluZyk6IFJhZG9uT3BlcmF0b3Ige1xyXG4gICAgICAgIHJldHVybiBuZXcgUmFkb25PcGVyYXRvcihcclxuICAgICAgICAgICAgdGhpcy5vcGNvZGUsXHJcbiAgICAgICAgICAgIHRoaXMucGFyYW1zPy5tYXAocGFyYW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJhbSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGVscGVycy5zcGxpY2VXaWxkY2FyZChwYXJhbSwgYXJnSW5kZXgsIGFyZ1ZhbHVlLCB0aGlzLmFyZ3NDb3VudCgpKVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcGFyYW0gPT09ICdvYmplY3QnICYmIHBhcmFtIGluc3RhbmNlb2YgUmFkb25TY3JpcHQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyYW0uc3BsaWNlV2lsZGNhcmQoYXJnSW5kZXgsIGFyZ1ZhbHVlKVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyYW1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIHRoaXM/LnByZXY/LnNwbGljZVdpbGRjYXJkKGFyZ0luZGV4LCBhcmdWYWx1ZSlcclxuICAgICAgICApXHJcbiAgICB9XHJcbiAgICBwdWJsaWMgdG9TdHJpbmcobGVmdCA9IFwiXCIsIGluZGVudCA9IDQsIGxldmVsID0gMCk6IHN0cmluZyB7IFxyXG4gICAgICAgIGNvbnN0IGxmID0gbGVmdCAhPT0gXCJcIiA/IFwiXFxuXCIgOiBcIlwiXHJcbiAgICAgICAgbGV0IHN0ciA9IHRoaXM/LnByZXY/LnRvU3RyaW5nKGxlZnQsIGluZGVudCwgbGV2ZWwpIHx8IFwiXCJcclxuICAgICAgICBsZXQgbWV0aG9kTmFtZSA9IFJhZG9uT3BlcmF0b3JzW3RoaXMub3Bjb2RlXS5zcGxpdCgvKD89W0EtWl0pLykuc2xpY2UoMSkuam9pbignJylcclxuICAgICAgICBtZXRob2ROYW1lID0gbWV0aG9kTmFtZS5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSArIG1ldGhvZE5hbWUuc2xpY2UoMSlcclxuICAgICAgICBzdHIgKz0gYCR7bGVmdH0ke1wiIFwiLnJlcGVhdChpbmRlbnQgKiBsZXZlbCl9LiR7bWV0aG9kTmFtZX0oYFxyXG4gICAgICAgIGlmICh0aGlzLnBhcmFtcyAmJiB0aGlzLnBhcmFtc1swXSAhPT0gdW5kZWZpbmVkKSB7IFxyXG4gICAgICAgICAgICB0aGlzLnBhcmFtcy5mb3JFYWNoKHBhcmFtID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcGFyYW0gPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RyICs9IGBcIiR7cGFyYW19XCIsIGBcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHBhcmFtID09PSAnb2JqZWN0JyAmJiBwYXJhbSBpbnN0YW5jZW9mIFJhZG9uU2NyaXB0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RyICs9IGAke3BhcmFtLnRvU3RyaW5nKGxlZnQsIGluZGVudCwgbGV2ZWwgKyAxKX0ke2xlZnR9JHtcIiBcIi5yZXBlYXQoaW5kZW50ICogbGV2ZWwpfSwgYFxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBzdHIgKz0gcGFyYW0udG9TdHJpbmcoKSArIFwiLCBcIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICBzdHIgPSBzdHIuc2xpY2UoMCwgLTIpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHN0ciArPSBgKSR7bGZ9YFxyXG4gICAgICAgIHJldHVybiBzdHJcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFJhZG9uU2NyaXB0IHtcclxuICAgIHByb3RlY3RlZCByZWFkb25seSBvcHM/OiBSYWRvbk9wZXJhdG9yO1xyXG4gICAgcHVibGljIHJlYWRvbmx5IGlucHV0VHlwZT86IFJhZG9uQW55O1xyXG4gICAgcHVibGljIHJlYWRvbmx5IG91dHB1dFR5cGU/OiBSYWRvbkFueTtcclxuICAgIGNvbnN0cnVjdG9yIChvdXRwdXQ6IFJhZG9uQW55KSB7XHJcbiAgICAgICAgdGhpcy5vcHMgPSBvdXRwdXQ/LnByZXY7XHJcbiAgICAgICAgY29uc3QgcmFkb25UeXBlcyA9IHtcclxuICAgICAgICAgICAgXCJBcnJheVwiOiBSYWRvbkFycmF5LFxyXG4gICAgICAgICAgICBcIkJvb2xlYW5cIjogUmFkb25Cb29sZWFuLFxyXG4gICAgICAgICAgICBcIkJ5dGVzXCI6IFJhZG9uQnl0ZXMsXHJcbiAgICAgICAgICAgIFwiRmxvYXRcIjogUmFkb25GbG9hdCxcclxuICAgICAgICAgICAgXCJJbnRlZ2VyXCI6IFJhZG9uSW50ZWdlcixcclxuICAgICAgICAgICAgXCJNYXBcIjogUmFkb25NYXAsXHJcbiAgICAgICAgICAgIFwiU3RyaW5nXCI6IFJhZG9uU3RyaW5nLFxyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgaW5wdXQgPSBvdXRwdXQ/LnByZXZcclxuICAgICAgICB3aGlsZSAoaW5wdXQ/LnByZXYpIGlucHV0ID0gaW5wdXQ/LnByZXZcclxuICAgICAgICBjb25zdCBpbnB1dFR5cGUgPSBPYmplY3QuZW50cmllcyhyYWRvblR5cGVzKS5maW5kKChbcHJlZml4LCBfXSkgPT4gaW5wdXQgJiYgUmFkb25PcGVyYXRvcnNbaW5wdXQub3Bjb2RlXS5zdGFydHNXaXRoKHByZWZpeCkpXHJcbiAgICAgICAgaWYgKGlucHV0VHlwZSAmJiBpbnB1dFR5cGVbMV0pIHRoaXMuaW5wdXRUeXBlID0gbmV3IGlucHV0VHlwZVsxXSgpXHJcbiAgICAgICAgY29uc3Qgb3V0cHV0VHlwZSA9IE9iamVjdC52YWx1ZXMocmFkb25UeXBlcykuZmluZChvdXRwdXRUeXBlID0+IG91dHB1dCBpbnN0YW5jZW9mIG91dHB1dFR5cGUpO1xyXG4gICAgICAgIGlmIChvdXRwdXRUeXBlKSB0aGlzLm91dHB1dFR5cGUgPSBuZXcgb3V0cHV0VHlwZSgpXHJcbiAgICB9XHJcbiAgICBwdWJsaWMgYXJnc0NvdW50KCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub3BzPy5hcmdzQ291bnQoKSB8fCAwO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGNsb25lKCk6IFJhZG9uQW55IHtcclxuICAgICAgICBjb25zdCBPdXRwdXRUeXBlID0gW1xyXG4gICAgICAgICAgICBSYWRvbkFycmF5LFxyXG4gICAgICAgICAgICBSYWRvbkJvb2xlYW4sXHJcbiAgICAgICAgICAgIFJhZG9uQnl0ZXMsXHJcbiAgICAgICAgICAgIFJhZG9uRmxvYXQsXHJcbiAgICAgICAgICAgIFJhZG9uSW50ZWdlcixcclxuICAgICAgICAgICAgUmFkb25NYXAsXHJcbiAgICAgICAgICAgIFJhZG9uU3RyaW5nLFxyXG4gICAgICAgIF0uZmluZChPdXRwdXRUeXBlID0+IHRoaXMub3V0cHV0VHlwZSBpbnN0YW5jZW9mIE91dHB1dFR5cGUpO1xyXG4gICAgICAgIGlmIChPdXRwdXRUeXBlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgT3V0cHV0VHlwZSh0aGlzLm9wcylcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aHJvdyBFdmFsRXJyb3IoYENhbm5vdCBjbG9uZSBmcm9tIGVtcHR5IHNjcmlwdGApXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcHVibGljIGRpc2VjdChsZXZlbCA9IDApOiBbbnVtYmVyLCBzdHJpbmcsIHN0cmluZ11bXSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub3BzPy5kaXNlY3QobGV2ZWwpIHx8IFtbbGV2ZWwsIFwiUmFkb25BbnlcIiwgXCJcIl1dXHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZW5jb2RlKCk6IGFueVtdIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5vcHM/LmVuY29kZSgpIHx8IFtdO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHJlcGxhY2VXaWxkY2FyZHMoLi4uYXJnczogc3RyaW5nW10pOiBSYWRvbkFueSB7XHJcbiAgICAgICAgY29uc3QgT3V0cHV0VHlwZSA9IFtcclxuICAgICAgICAgICAgUmFkb25BcnJheSxcclxuICAgICAgICAgICAgUmFkb25Cb29sZWFuLFxyXG4gICAgICAgICAgICBSYWRvbkJ5dGVzLFxyXG4gICAgICAgICAgICBSYWRvbkZsb2F0LFxyXG4gICAgICAgICAgICBSYWRvbkludGVnZXIsXHJcbiAgICAgICAgICAgIFJhZG9uTWFwLFxyXG4gICAgICAgICAgICBSYWRvblN0cmluZyxcclxuICAgICAgICBdLmZpbmQoT3V0cHV0VHlwZSA9PiB0aGlzLm91dHB1dFR5cGUgaW5zdGFuY2VvZiBPdXRwdXRUeXBlKTtcclxuICAgICAgICBpZiAoT3V0cHV0VHlwZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IE91dHB1dFR5cGUodGhpcy5vcHM/LnJlcGxhY2VXaWxkY2FyZHMoYXJncykpXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhyb3cgRXZhbEVycm9yKGBDYW5ub3QgcmVwbGFjZSB3aWxkY2FyZHMgb24gZW1wdHkgc2NyaXB0YClcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc3BsaWNlV2lsZGNhcmQoYXJnSW5kZXg6IG51bWJlciwgYXJnVmFsdWU6IHN0cmluZyk6IFJhZG9uQW55IHtcclxuICAgICAgICBjb25zdCBPdXRwdXRUeXBlID0gW1xyXG4gICAgICAgICAgICBSYWRvbkFycmF5LFxyXG4gICAgICAgICAgICBSYWRvbkJvb2xlYW4sXHJcbiAgICAgICAgICAgIFJhZG9uQnl0ZXMsXHJcbiAgICAgICAgICAgIFJhZG9uRmxvYXQsXHJcbiAgICAgICAgICAgIFJhZG9uSW50ZWdlcixcclxuICAgICAgICAgICAgUmFkb25NYXAsXHJcbiAgICAgICAgICAgIFJhZG9uU3RyaW5nLFxyXG4gICAgICAgIF0uZmluZChPdXRwdXRUeXBlID0+IHRoaXMub3V0cHV0VHlwZSBpbnN0YW5jZW9mIE91dHB1dFR5cGUpO1xyXG4gICAgICAgIGlmIChPdXRwdXRUeXBlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgT3V0cHV0VHlwZSh0aGlzLm9wcz8uc3BsaWNlV2lsZGNhcmQoYXJnSW5kZXgsIGFyZ1ZhbHVlKSlcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aHJvdyBFdmFsRXJyb3IoYENhbm5vdCBzcGxpY2Ugd2lsZGNhcmRzIG9uIGVtcHR5IHNjcmlwdGApXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcHVibGljIHRvQnl0ZWNvZGUoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gVXRpbHMudG9IZXhTdHJpbmcoT2JqZWN0LnZhbHVlcyhVaW50OEFycmF5LmZyb20oY2JvckVuY29kZSh0aGlzLmVuY29kZSgpKSkpLCB0cnVlKVxyXG4gICAgfVxyXG4gICAgcHVibGljIHRvU3RyaW5nKGxlZnQgPSBcIlwiLCBpbmRlbnQgPSAwLCBsZXZlbCA9IDApOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IGxmID0gbGVmdCAhPT0gXCJcIiA/IFwiXFxuXCIgOiBcIlwiXHJcbiAgICAgICAgcmV0dXJuIGBSYWRvbk9wZXJhdG9yKCR7dGhpcy5pbnB1dFR5cGU/LmNvbnN0cnVjdG9yLm5hbWUgfHwgXCJcIn0pJHtsZn0ke3RoaXMub3BzPy50b1N0cmluZyhsZWZ0LCBpbmRlbnQsIGxldmVsICsgMSl9YFxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUmFkb25BbnkgZXh0ZW5kcyBSYWRvbkNsYXNzIHtcclxuICAgIHByb3RlY3RlZCBfcHVzaE9wZXJhdG9yPE91dHB1dFR5cGUgZXh0ZW5kcyBSYWRvbkFueT4oXHJcbiAgICAgICAgb3V0cHV0VHlwZTogeyBuZXcob3BzPzogUmFkb25PcGVyYXRvcik6IE91dHB1dFR5cGU7IH0sIFxyXG4gICAgICAgIHBhcmFtczogYW55W10sXHJcbiAgICApOiBPdXRwdXRUeXBlIHtcclxuICAgICAgICBsZXQgbmFtZVxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSAoZXJyIGFzIEVycm9yKVxyXG4gICAgICAgICAgICBuYW1lID0gcmVzdWx0LnN0YWNrPy5zcGxpdCgnIGF0ICcpWzJdXHJcbiAgICAgICAgICAgICAgICAuc3BsaXQoJyAnKVswXVxyXG4gICAgICAgICAgICAgICAgLnNwbGl0KCcuJylcclxuICAgICAgICAgICAgICAgIC5tYXAocGFydCA9PiBoZWxwZXJzLnRvVXBwZXJDYW1lbENhc2UocGFydCkpXHJcbiAgICAgICAgICAgICAgICAuam9pbignJylcclxuICAgICAgICAgICAgICAgIC5zcGxpdCgvKD89W0EtWl0pLykuc2xpY2UoMSlcclxuICAgICAgICAgICAgICAgIC5qb2luKCcnKVxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBvcGNvZGUgPSBSYWRvbk9wZXJhdG9yc1tuYW1lIGFzIGtleW9mIHR5cGVvZiBSYWRvbk9wZXJhdG9yc11cclxuICAgICAgICBpZiAoIW9wY29kZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBFcnJvcihgRmF0YWw6IHVua25vd24gUmFkb24gT3BlcmF0b3Igb3Bjb2RlICcke25hbWV9J2ApXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBvdXRwdXRUeXBlKG5ldyBSYWRvbk9wZXJhdG9yKFxyXG4gICAgICAgICAgICAgICAgb3Bjb2RlLCBcclxuICAgICAgICAgICAgICAgIFsuLi5wYXJhbXNdLCBcclxuICAgICAgICAgICAgICAgIHRoaXM/LnByZXZcclxuICAgICAgICAgICAgKSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmFkb25BcnJheTxJdGVtc1R5cGUgZXh0ZW5kcyBSYWRvbkFueT4ge1xyXG4gICAgaXRlbXNUeXBlOiBJdGVtc1R5cGU7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBSYWRvbkFycmF5PEl0ZW1zVHlwZSBleHRlbmRzIFJhZG9uQW55ID0gUmFkb25Bbnk+IGV4dGVuZHMgUmFkb25Bbnkge1xyXG4gICAgLyoqXHJcbiAgICAgKiBEaXNjYXJkIHRoZSBpdGVtcyBpbiB0aGUgaW5wdXQgYXJyYXkgdGhhdCBtYWtlIHRoZSBnaXZlbiBgaW5uZXJTY3JpcHRgIHRvIHJldHVybiBhIGBmYWxzZWAgdmFsdWUuIFxyXG4gICAgICogQHBhcmFtIHNjcmlwdCBGaWx0ZXJpbmcgc2NyaXB0IHVsdGltYXRlbHkgcmV0dXJuaW5nIGEgYFJhZG9uQm9vbGVhbmAgb2JqZWN0LlxyXG4gICAgICogTXVzdCBhY2NlcHQgYXMgaW5wdXQgdGhlIHNhbWUgZGF0YSB0eXBlcyBhcyB0aGUgb25lcyBvZiB0aGUgaXRlbXMgYmVpbmcgaXRlcmF0ZWQuIFxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25BcnJheWAgb2JqZWN0IGNvbnRhaW5pbmcgb25seSB0aGUgaXRlbXMgdGhhdCBtYWtlIHRoZSBgaW5uZXJTY3JpcHRgIHRvIHJldHVybiBhIGB0cnVlYCB2YWx1ZS4gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBmaWx0ZXIoaW5uZXJTY3JpcHQ6IFJhZG9uQm9vbGVhbikge1xyXG4gICAgICAgIGlmICghKGlubmVyU2NyaXB0IGluc3RhbmNlb2YgUmFkb25Cb29sZWFuKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXZhbEVycm9yKGBJbm5lciBzY3JpcHQgbXVzdCBmZXRjaCBhIFJhZG9uQm9vbGVhbiB2YWx1ZWApXHJcbiAgICAgICAgfSBcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQXJyYXk8SXRlbXNUeXBlPiwgW25ldyBSYWRvblNjcmlwdChpbm5lclNjcmlwdCldKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBGZXRjaCB0aGUgaXRlbSBhdCB0aGUgZ2l2ZW4gYGluZGV4YCBhcyBhIGBSYWRvbkFycmF5YCBvYmplY3QuXHJcbiAgICAgKiBAcGFyYW0gaW5kZXggXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRBcnJheTxTdWJJdGVtc1R5cGUgZXh0ZW5kcyBSYWRvbkFueSA9IFJhZG9uQW55PihpbmRleDogbnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkFycmF5PFN1Ykl0ZW1zVHlwZT4sIFtpbmRleF0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEZldGNoIHRoZSBpdGVtIGF0IHRoZSBnaXZlbiBgaW5kZXhgIGFzIGEgYFJhZG9uQm9vbGVhbmAgb2JqZWN0LlxyXG4gICAgICogQHBhcmFtIGluZGV4IFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Qm9vbGVhbihpbmRleDogbnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkJvb2xlYW4sIFtpbmRleF0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEZldGNoIHRoZSBpdGVtIGF0IHRoZSBnaXZlbiBgaW5kZXhgIGFzIGEgYFJhZG9uQnl0ZXNgIG9iamVjdC5cclxuICAgICAqIEBwYXJhbSBpbmRleCBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEJ5dGVzKGluZGV4OiBudW1iZXIpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQnl0ZXMsIFtpbmRleF0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEZldGNoIHRoZSBpdGVtIGF0IHRoZSBnaXZlbiBgaW5kZXhgIGFzIGEgYFJhZG9uRmxvYXRgIG9iamVjdC5cclxuICAgICAqIEBwYXJhbSBpbmRleCBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEZsb2F0KGluZGV4OiBudW1iZXIpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uRmxvYXQsIFtpbmRleF0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEZldGNoIHRoZSBpdGVtIGF0IHRoZSBnaXZlbiBgaW5kZXhgIGFzIGEgYFJhZG9uSW50ZWdlcmAgb2JqZWN0LlxyXG4gICAgICogQHBhcmFtIGluZGV4IFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0SW50ZWdlcihpbmRleDogbnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkludGVnZXIsIFtpbmRleF0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEZldGNoIHRoZSBpdGVtIGF0IHRoZSBnaXZlbiBgaW5kZXhgIGFzIGEgYFJhZG9uTWFwYCBvYmplY3QuXHJcbiAgICAgKiBAcGFyYW0gaW5kZXggXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRNYXAoaW5kZXg6IG51bWJlcikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25NYXAsIFtpbmRleF0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEZldGNoIHRoZSBpdGVtIGF0IHRoZSBnaXZlbiBgaW5kZXhgIGFzIGEgYFJhZG9uU3RyaW5nYCBvYmplY3QuXHJcbiAgICAgKiBAcGFyYW0gaW5kZXggXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRTdHJpbmcoaW5kZXg6IG51bWJlcikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25TdHJpbmcsIFtpbmRleF0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEpvaW4gYWxsIGl0ZW1zIG9mIHRoZSBhcnJheSBpbnRvIGEgdmFsdWUgb2YgdGhlIGdpdmVuIHR5cGUuIFRoZSBhcnJheSBtdXN0IGJlIGhvbW9nZW5lb3VzLCBcclxuICAgICAqIGFsbCBpdGVtcyBiZWluZyBvZiB0aGUgc2FtZSB0eXBlIGFzIHRoZSBvdXRwdXRUeXBlYCwgaWYgc3BlY2lmaWVkLCBvciB0aGUgQXJyYXkncyBpdGVtc1R5cGUgb3RoZXJ3aXNlLlxyXG4gICAgICogQHBhcmFtIHNlcGFyYXRvciBTZXBhcmF0b3IgdG8gYmUgdXNlZCB3aGVuIGpvaW5pbmcgc3RyaW5ncy4gV2hlbiBqb2luaW5nIFJhZG9uTWFwcywgaXQgY2FuIGJlIHVzZWQgdG8gc2V0dGxlIGJhc2Ugc2NoZW1hIG9uIHJlc3VsdGluZyBvYmplY3QuXHJcbiAgICAgKiBAcGFyYW0gb3V0cHV0VHlwZSBSYWRvbiB0eXBlIG9mIHRoZSBvdXRwdXQgdmFsdWUuIFxyXG4gICAgICovXHJcbiAgICAvLyBwdWJsaWMgam9pbjxPdXRwdXRUeXBlIGV4dGVuZHMgUmFkb25BbnkgPSBSYWRvbkFueT4oc2VwYXJhdG9yID0gXCJcIiwgb3V0cHV0VHlwZT86IHsgbmV3KCk6IEl0ZW1zVHlwZTsgfSkge1xyXG4gICAgLy8gICAgIGlmIChvdXRwdXRUeXBlKSB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25BcnJheTxPdXRwdXRUeXBlPiwgW3NlcGFyYXRvcl0pXHJcbiAgICAvLyAgICAgZWxzZSB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25BcnJheTxJdGVtc1R5cGU+LCBbc2VwYXJhdG9yXSlcclxuICAgIC8vIH1cclxuICAgIC8qKlxyXG4gICAgICogQ291bnQgdGhlIG51bWJlciBvZiBpdGVtcy4gXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkludGVnZXJgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGxlbmd0aCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uSW50ZWdlciwgW10pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIE1hcCBhbGwgaXRlbXMgaW4gdGhlIGFycmF5IHdpdGggdGhlIGdpdmVuIGBpbm5lclNjcmlwdGAuIFxyXG4gICAgICogQHBhcmFtIGlubmVyU2NyaXB0IE1hcHBpbmcgc2NyaXB0IHJldHVybmluZyBzb21lIGBSYWRvbkFueWAgb2JqZWN0LlxyXG4gICAgICogTXVzdCBhY2NlcHQgYXMgaW5wdXQgdGhlIHNhbWUgZGF0YSB0eXBlIGFzIHRoZSBvbmUgb2YgdGhlIGl0ZW1zIGJlaW5nIGl0ZXJhdGVkLiBcclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uQXJyYXlgIG9iamVjdCBjb250YWluaW5nIHRoZSBtYXBwZWQgdmFsdWVzLiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIG1hcChpbm5lclNjcmlwdDogUmFkb25PcGVyYXRvcikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25BcnJheSwgW2lubmVyU2NyaXB0XSlcclxuICAgIH1cclxuICAgIC8vIHB1YmxpYyBtYXA8T3V0cHV0SXRlbXNUeXBlIGV4dGVuZHMgUmFkb25Bbnk+KGlubmVyU2NyaXB0OiBSYWRvbk9wZXJhdG9yPE91dHB1dEl0ZW1zVHlwZT4pIHtcclxuICAgIC8vICAgICAvLyB0b2RvOiBjaGVjayBzY3JpcHQncyBpbnB1dCB0eXBlIG1hdGNoZXMgYXJyYXkncyBpdGVtcyB0eXBlLCBpZiBhbnkgPz9cclxuICAgIC8vICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQXJyYXk8T3V0cHV0SXRlbXNUeXBlPiwgW2lubmVyU2NyaXB0XSlcclxuICAgIC8vIH1cclxuICAgIC8qKlxyXG4gICAgICogUmVkdWNlIGFsbCBpdGVtcyBpbiB0aGUgYXJyYXkgaW50byBhIHNpbmdsZSB2YWx1ZS5cclxuICAgICAqIEBwYXJhbSByZWR1Y3RvciBUaGUgcmVkdWN0b3IgbWV0aG9kIHRvIGJlIGFwcGxpZWQuIEFsbCBhcnJheSBpdGVtcyBtdXN0IGJlIFxyXG4gICAgICogY29udmVydGFibGUgaW50byBmbG9hdCB2YWx1ZXMuXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkZsb2F0YCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZWR1Y2UocmVkdWN0b3I6IFJhZG9uUmVkdWNlck9wY29kZXMpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uRmxvYXQsIFtyZWR1Y3Rvcl0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIE9yZGVyIHRoZSBhcnJheSBpdGVtcyBiYXNlZCBlaXRoZXIgb24gdGhlIHJlc3VsdHMgb2YgYXBwbHlpbmcgdGhlIGdpdmVuIGBpbm5lclNjcmlwdGAgdG8gZXZlcnkgaXRlbSwgb3Igb24gdGhlIFxyXG4gICAgICogYWN0dWFsIGl0ZW0gdmFsdWVzIChhcyBsb25nIGFzIHRoZXNlIGFyZSBlaXRoZXIgaW50ZWdlcnMgb3Igc3RyaW5ncykuXHJcbiAgICAgKiBGYWlscyBpZiBhcHBsaWVkIG9uIG5vbi1ob21lZ2Vub3VzIGFycmF5cyAoaS5lLiBub3QgYWxsIGl0ZW1zIHNoYXJpbmcgdGhlIHNhbWUgYFJhZG9uQW55YCkuIFxyXG4gICAgICogQHBhcmFtIGlubmVyU2NyaXB0IChPcHRpb25hbCkgU29ydGluZyBzY3JpcHQgcmV0dXJuaW5nIGVpdGhlciBhIGBSYWRvbkludGVnZXJgIG9yIGEgYFJhZG9uU3RyaW5nYCBvYmplY3QuXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkFycmF5YCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzb3J0KGlubmVyU2NyaXB0PzogUmFkb25PcGVyYXRvcikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25BcnJheTxJdGVtc1R5cGU+LCBbaW5uZXJTY3JpcHRdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBUYWtlIGEgc2VsZWN0aW9uIG9mIGl0ZW1zIGZyb20gdGhlIGlucHV0IGFycmF5LlxyXG4gICAgICogQHBhcmFtIGluZGV4ZXMgSW5kZXhlcyBvZiB0aGUgaW5wdXQgaXRlbXMgdG8gdGFrZSBpbnRvIHRoZSBvdXRwdXQgYXJyYXkuIFxyXG4gICAgICogQHJldHVybiBBIGBSYWRvbkFycmF5YCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIC8vIHB1YmxpYyBwaWNrKC4uLmluZGV4ZXM6IG51bWJlcltdKSB7XHJcbiAgICAvLyAgICAgaWYgKEFycmF5KGluZGV4ZXMpLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAvLyAgICAgICAgIHRocm93IG5ldyBFdmFsRXJyb3IoYFxceDFiWzE7MzNtUmFkb25BcnJheTo6cGljazogYSBub24tZW1wdHkgYXJyYXkgb2YgbnVtYmVycyBtdXN0IGJlIHByb3ZpZGVkXFx4MWJbMG1gKVxyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQXJyYXk8SXRlbXNUeXBlPiwgWy4uLmluZGV4ZXNdKVxyXG4gICAgLy8gfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUmFkb25Cb29sZWFuIGV4dGVuZHMgUmFkb25Bbnkge1xyXG4gICAgLyoqXHJcbiAgICAgKiBSZXZlcnNlIHZhbHVlLlxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25Cb29sZWFuYCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBuZWdhdGUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkJvb2xlYW4sIFtdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBDYXN0IHZhbHVlIGludG8gYSBzdHJpbmcuIFxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25TdHJpbmdgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHRvU3RyaW5nKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25TdHJpbmcsIFtdKVxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUmFkb25CeXRlcyBleHRlbmRzIFJhZG9uQW55IHtcclxuICAgIHN0YXRpYyByZWFkb25seSBFbmNvZGluZ3MgPSBSYWRvbkVuY29kaW5ncztcclxuICAgIHN0YXRpYyByZWFkb25seSBIYXNoZXJzID0gUmFkb25IYXNoRnVuY3Rpb25zO1xyXG4gICAgLyoqXHJcbiAgICAgKiBDb252ZXJ0IGJ1ZmZlciBpbnRvIChiaWctZW5kaWFuKSBpbnRlZ2VyLlxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25JbnRlZ2VyYCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc0ludGVnZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkludGVnZXIsIFtdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBBcHBseSB0aGUgU0hBMi0yNTYgaGFzaCBmdW5jdGlvbi5cclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uQnl0ZXNgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGhhc2goKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkJ5dGVzLCBbUmFkb25CeXRlcy5IYXNoZXJzLlNIQTJfMjU2XSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ291bnQgdGhlIG51bWJlciBvZiBieXRlcy4gXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkludGVnZXJgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGxlbmd0aCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uSW50ZWdlciwgW10pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBzbGljZSBleHRyYWN0ZWQgZnJvbSB0aGUgaW5wdXQgYnVmZmVyLiBcclxuICAgICAqIEEgYHN0YXJ0SW5kZXhgIG9mIDAgcmVmZXJzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGlucHV0IGJ1ZmZlci4gSWYgbm8gYGVuZEluZGV4YCBpcyBwcm92aWRlZCwgaXQgd2lsbCBiZSBhc3N1bWVkIFxyXG4gICAgICogdGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQgYnVmZmVyLiBOZWdhdGl2ZSB2YWx1ZXMgd2lsbCBiZSByZWxhdGl2ZSB0byB0aGUgZW5kIG9mIHRoZSBpbnB1dCBidWZmZXIuXHJcbiAgICAgKiBAcGFyYW0gc3RhcnRJbmRleCBQb3NpdGlvbiB3aXRoaW4gaW5wdXQgYnVmZmVyIHdoZXJlIHRoZSBvdXRwdXQgYnVmZmVyIHdpbGwgc3RhcnQuXHJcbiAgICAgKiBAcGFyYW0gZW5kSW5kZXggUG9zaXRpb24gd2l0aGluIGlucHV0IGJ1ZmZlciB3aGVyZSB0aGUgb3V0cHV0IGJ1ZmZlciB3aWxsIGVuZFxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25CeXRlc2Agb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2xpY2Uoc3RhcnRJbmRleDogbnVtYmVyID0gMCwgZW5kSW5kZXg/OiBudW1iZXIpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQnl0ZXMsIFtzdGFydEluZGV4LCBlbmRJbmRleF0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENvbnZlcnQgdGhlIGlucHV0IGJ1ZmZlciBpbnRvIGEgc3RyaW5nLlxyXG4gICAgICogQHBhcmFtIGVuY29kaW5nIEVudW0gaW50ZWdlciB2YWx1ZSBzcGVjaWZ5aW5nIHRoZSBlbmNvZGluZyBzY2hlbWEgb24gdGhlIG91dHB1dCBzdHJpbmcsIHN0YW5kaW5nOlxyXG4gICAgICogICAwIC0+IEhleCBzdHJpbmcgKGRlZmF1bHQsIGlmIG5vbmUgd2FzIHNwZWNpZmllZClcclxuICAgICAqICAgMSAtPiBCYXNlNjQgc3RyaW5nXHJcbiAgICAgKiAgIDIgLT4gVXRmLTggc3RyaW5nXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvblN0cmluZ2Agb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdG9TdHJpbmcoZW5jb2RpbmcgPSBSYWRvbkVuY29kaW5ncy5IZXhTdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uU3RyaW5nLCBbZW5jb2RpbmddKVxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUmFkb25GbG9hdCBleHRlbmRzIFJhZG9uQW55IHtcclxuICAgIC8qKlxyXG4gICAgICogQ29tcHV0ZSB0aGUgYWJzb2x1dGUgdmFsdWUuXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkZsb2F0YCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhYnNvbHV0ZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uRmxvYXQsIFtdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBDb21wdXRlIHRoZSBsb3dlc3QgaW50ZWdlciBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGZsb2F0IHZhbHVlLlxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25JbnRlZ2VyYCBvYmplY3QuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY2VpbGluZygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uRmxvYXQsIFtdKVxyXG5cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ29tcHV0ZSB0aGUgZ3JlYXRlc3QgaW50ZWdlciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGZsb2F0IHZhbHVlLlxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25JbnRlZ2VyYCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBmbG9vcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uSW50ZWdlciwgW10pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIERldGVybWluZSBpZiB0aGUgZmxvYXQgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHRoZSBnaXZlbiBgaW5wdXRgLiBcclxuICAgICAqIEBwYXJhbSBpbnB1dFxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25Cb29sZWFuYCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBncmVhdGVyVGhhbihpbnB1dDogbnVtYmVyIHwgc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkJvb2xlYW4sIFtpbnB1dF0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIERldGVybWluZSBpZiB0aGUgZmxvYXQgdmFsdWUgaXMgbGVzcyB0aGFuIHRoZSBnaXZlbiBgaW5wdXRgLlxyXG4gICAgICogQHBhcmFtIGlucHV0IFxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25Cb29sZWFuYCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBsZXNzVGhhbihpbnB1dDogbnVtYmVyIHwgc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkJvb2xlYW4sIFtpbnB1dF0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENvbXB1dGUgdGhlIGZsb2F0IHJlbWFpbmRlciBvZiBkaXZpZGluZyB0aGUgdmFsdWUgYnkgdGhlIGdpdmVuIGBpbnRlZ2VyYC5cclxuICAgICAqIEBwYXJhbSBpbnRlZ2VyIFxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25GbG9hdGAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbW9kdWxvKGludGVnZXI6IG51bWJlciB8IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25GbG9hdCwgW2ludGVnZXJdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBNdWx0aXBseSB0aGUgZmxvYXQgdmFsdWUgYnkgdGhlIGdpdmVuIGBmYWN0b3JgLlxyXG4gICAgICogQHBhcmFtIGZhY3RvciBcclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uRmxvYXRgIG9iamVjdC4gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtdWx0aXBseShmYWN0b3I6IG51bWJlciB8IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25GbG9hdCwgW2ZhY3Rvcl0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIE5lZ2F0ZSB0aGUgZmxvYXQgdmFsdWUuIFxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25GbG9hdGAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbmVnYXRlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25GbG9hdCwgW10pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENvbXB1dGUgdGhlIGZsb2F0IHZhbHVlIHJhaXNlZCB0byB0aGUgcG93ZXIgb2YgZ2l2ZW4gYGV4cG9uZW50YFxyXG4gICAgICogQHBhcmFtIGV4cG9uZW50XHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkZsb2F0YCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwb3dlcihleHBvbmVudDogbnVtYmVyIHwgc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkZsb2F0LCBbZXhwb25lbnRdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSb3VuZCB0byB0aGUgY2xvc2VzdCBpbnRlZ2VyIHZhbHVlLlxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25JbnRlZ2VyYCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByb3VuZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uSW50ZWdlciwgW10pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFN0cmluZ2lmeSB0aGUgZmxvYXQgdmFsdWUuXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvblN0cmluZ2Agb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdG9TdHJpbmcoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvblN0cmluZywgW10pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFRha2UgdGhlIGludGVnZXIgcGFydCBvZiB0aGUgZmxvYXQgdmFsdWUuIFxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25JbnRlZ2VyYCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0cnVuY2F0ZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uSW50ZWdlciwgW10pXHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBSYWRvbkludGVnZXIgZXh0ZW5kcyBSYWRvbkFueSB7XHJcbiAgICAvKipcclxuICAgICAqIENvbXB1dGUgdGhlIGFic29sdXRlIHZhbHVlLlxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25JbnRlZ2VyYCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhYnNvbHV0ZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uSW50ZWdlciwgW10pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIERldGVybWluZSBpZiB0aGUgaW50ZWdlciB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlIGdpdmVuIGBpbnB1dGAuIFxyXG4gICAgICogQHBhcmFtIGlucHV0XHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkJvb2xlYW5gIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdyZWF0ZXJUaGFuKGlucHV0OiBudW1iZXIgfCBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQm9vbGVhbiwgW2lucHV0XSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRGV0ZXJtaW5lIGlmIHRoZSBpbnRlZ2VyIHZhbHVlIGlzIGxlc3MgdGhhbiB0aGUgZ2l2ZW4gYGlucHV0YC4gXHJcbiAgICAgKiBAcGFyYW0gaW5wdXRcclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uQm9vbGVhbmAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbGVzc1RoYW4oaW5wdXQ6IG51bWJlciB8IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25Cb29sZWFuLCBbaW5wdXRdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBDb21wdXRlIHRoZSByZW1haW5kZXIgb2YgZGl2aWRpbmcgdGhlIHZhbHVlIGJ5IHRoZSBnaXZlbiBgaW50ZWdlcmAuXHJcbiAgICAgKiBAcGFyYW0gaW50ZWdlciBcclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uRmxvYXRgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG1vZHVsbyhpbnRlZ2VyOiBudW1iZXIgfCBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uSW50ZWdlciwgW2ludGVnZXJdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBNdWx0aXBseSB0aGUgdmFsdWUgYnkgdGhlIGdpdmVuIGBpbnRlZ2VyYC5cclxuICAgICAqIEBwYXJhbSBpbnRlZ2VyIFxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25JbnRlZ2VyYCBvYmplY3QuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbXVsdGlwbHkoaW50ZWdlcjogbnVtYmVyIHwgc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkludGVnZXIsIFtpbnRlZ2VyXSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogTmVnYXRlIHRoZSBpbnRlZ2VyIHZhbHVlLiBcclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uRmxvYXRgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG5lZ2F0ZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uSW50ZWdlciwgW10pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENvbXB1dGUgdGhlIHZhbHVlIHJhaXNlZCB0byB0aGUgcG93ZXIgb2YgZ2l2ZW4gYGV4cG9uZW50YFxyXG4gICAgICogQHBhcmFtIGV4cG9uZW50XHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkludGVnZXJgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHBvd2VyKGV4cG9uZW50OiBudW1iZXIgfCBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uSW50ZWdlciwgW2V4cG9uZW50XSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogU3RyaW5naWZ5IHRoZSB2YWx1ZS5cclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uU3RyaW5nYCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0b1N0cmluZygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uU3RyaW5nLCBbXSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ2FzdCBpbnRvIGEgYmlnLWVuZGlhbiBieXRlcyBidWZmZXIuXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkJ5dGVzYCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0b0J5dGVzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25CeXRlcywgW10pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENhc3QgaW50byBhIGZsb2F0IHZhbHVlLlxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25GbG9hdGAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdG9GbG9hdCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uRmxvYXQsIFtdKVxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUmFkb25NYXAgZXh0ZW5kcyBSYWRvbkFueSB7XHJcbiAgICAvKipcclxuICAgICAqIEFsdGVyIHRoZSB2YWx1ZSBvZiB0aGUgaXRlbShzKSBpZGVudGlmaWVkIGJ5IGBrZXlzYCwgYXBwbHlpbmcgdGhlIGdpdmVuIGBpbm5lclNjcmlwdGAgdG8gZWFjaCBvbmUgb2YgdGhlbS5cclxuICAgICAqIEBwYXJhbSBrZXlzICBcclxuICAgICAqIEBwYXJhbSBpbm5lclNjcmlwdCBcclxuICAgICAqIEByZXR1cm5zIFRoZSBzYW1lIFJhZG9uTWFwIHVwb24gd2hpY2ggdGhpcyBvcGVyYXRvciBpcyBleGVjdXRlZCwgd2l0aCB0aGUgc3BlY2lmaWVkIGl0ZW0ocykgYWx0ZXJlZFxyXG4gICAgICogYnkgdGhlIGdpdmVuIGBpbm5lclNjcmlwdGAuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhbHRlcihpbm5lclNjcmlwdDogUmFkb25PcGVyYXRvciwgLi4ua2V5czogc3RyaW5nW10pIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uTWFwLCBbWy4uLmtleXNdLCBpbm5lclNjcmlwdF0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEZldGNoIHRoZSBhcnJheSB3aXRoaW4gdGhlIHNwZWNpZmllZCBga2V5YCBmaWVsZC5cclxuICAgICAqIEBwYXJhbSBrZXkgXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkFycmF5YCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRBcnJheTxJdGVtc1R5cGUgZXh0ZW5kcyBSYWRvbkFueSA9IFJhZG9uQW55PihrZXk6IHN0cmluZywgX2l0ZW1zVHlwZT86IHsgbmV3KCk6IEl0ZW1zVHlwZTsgfSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25BcnJheTxJdGVtc1R5cGU+LCBba2V5XSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRmV0Y2ggdGhlIGJvb2xlYW4gd2l0aGluIHRoZSBzcGVjaWZpZWQgYGtleWAgZmllbGQuIFxyXG4gICAgICogQHBhcmFtIGtleSBcclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uQm9vbGVhbmAgb2JqZWN0LiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEJvb2xlYW4oa2V5OiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQm9vbGVhbiwgW2tleV0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEZldGNoIHRoZSBmbG9hdCB2YWx1ZSB3aXRoaW4gdGhlIHNwZWNpZmllZCBga2V5YCBmaWVsZC5cclxuICAgICAqIEBwYXJhbSBrZXkgXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkZsb2F0YCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRGbG9hdChrZXk6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25GbG9hdCwgW2tleV0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEZldGNoIHRoZSBpbnRlZ2VyIHZhbHVlIHdpdGhpbiB0aGUgc3BlY2lmaWVkIGBrZXlgIGZpZWxkLiBcclxuICAgICAqIEBwYXJhbSBrZXkgXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkludGVnZXJgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEludGVnZXIoa2V5OiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uSW50ZWdlciwgW2tleV0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEZldGNoIHRoZSBtYXAgb2JqZWN0IHdpdGhpbiB0aGUgc3BlY2lmaWVkIGBrZXlgIGZpZWxkLiBcclxuICAgICAqIEBwYXJhbSBrZXkgXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbk1hcGAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0TWFwKGtleTogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbk1hcCwgW2tleV0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEZldGNoIHRoZSBzdHJpbmcgd2l0aGluIHRoZSBzcGVjaWZpZWQgYGtleWAgZmllbGQuXHJcbiAgICAgKiBAcGFyYW0ga2V5IFxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25TdHJpbmdgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFN0cmluZyhrZXk6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25TdHJpbmcsIFtrZXldKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBFeHRyYWN0IGtleSBuYW1lcyBvZiB0aGUgbWFwIGludG8gYW4gYXJyYXkgb2Ygc3RyaW5ncy5cclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uQXJyYXlgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGtleXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkFycmF5PFJhZG9uU3RyaW5nPiwgW10pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFRha2UgYSBzZWxlY3Rpb24gb2YgaXRlbXMgZnJvbSB0aGUgaW5wdXQgbWFwLiBGYWlscyBpZiB1bmV4aXN0ZW50IGl0ZW1zIGFyZSByZWZlcnJlZC5cclxuICAgICAqIEBwYXJhbSBrZXlzIEtleSBzdHJpbmcgb2YgdGhlIGlucHV0IGl0ZW1zIHRvIHRha2UgaW50byB0aGUgb3V0cHV0IG1hcC4gXHJcbiAgICAgKiBAcmV0dXJuIEEgYFJhZG9uTWFwYCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwaWNrKC4uLmtleXM6IHN0cmluZ1tdKSB7XHJcbiAgICAgICAgaWYgKEFycmF5KGtleXMpLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFdmFsRXJyb3IoYFxceDFiWzE7MzNtUmFkb25NYXA6OnBpY2s6IGEgbm9uLWVtcHR5IGFycmF5IG9mIGtleSBzdHJpbmdzIG11c3QgYmUgcHJvdmlkZWRcXHgxYlswbWApXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25NYXAsIFsuLi5rZXlzXSlcclxuXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEV4dHJhY3QgdGhlIG1hcCB2YWx1ZXMgaW50byBhbiBhcnJheS5cclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uQXJyYXlgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHZhbHVlcygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQXJyYXksIFtdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBTdHJpbmdpZnkgaW5wdXQgYFJhZG9uTWFwYCBvYmplY3QgaW50byBhIEpTT04gc3RyaW5nLlxyXG4gICAgICogQHJldHVybiBBIGBSYWRvblN0cmluZ2Agb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdG9TdHJpbmcoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvblN0cmluZywgW10pXHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBSYWRvblN0cmluZyBleHRlbmRzIFJhZG9uQW55IHtcclxuICAgIC8qKlxyXG4gICAgICogQ2FzdCBpbnRvIGEgYm9vbGVhbiB2YWx1ZS5cclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uQm9vbGVhbmAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXNCb29sZWFuKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25Cb29sZWFuLCBbXSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ29udmVydCB0aGUgaW5wdXQgc3RyaW5nIGludG8gYSBieXRlcyBidWZmZXIuXHJcbiAgICAgKiBAcGFyYW0gZW5jb2RpbmcgRW51bSBpbnRlZ2VyIHZhbHVlIHNwZWNpZnlpbmcgdGhlIGVuY29kaW5nIHNjaGVtYSBvbiB0aGUgaW5wdXQgc3RyaW5nLCBzdGFuZGluZzpcclxuICAgICAqICAgMCAtPiBIZXggc3RyaW5nIChkZWZhdWx0LCBpZiBub25lIHdhcyBzcGVjaWZpZWQpXHJcbiAgICAgKiAgIDEgLT4gQmFzZTY0IHN0cmluZ1xyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25CeXRlc2Agb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXNCeXRlcyhlbmNvZGluZyA9IFJhZG9uRW5jb2RpbmdzLkhleFN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25CeXRlcywgW2VuY29kaW5nXSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ2FzdCBpbnRvIGEgZmxvYXQgbnVtYmVyLlxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25GbG9hdGAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXNGbG9hdCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uRmxvYXQsIFtdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBDYXN0IGludG8gYW4gaW50ZWdlciBudW1iZXIuXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkludGVnZXJgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzSW50ZWdlcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uSW50ZWdlciwgW10pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENvdW50IHRoZSBudW1iZXIgb2YgY2hhcnMuIFxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25JbnRlZ2VyYCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBsZW5ndGgoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkludGVnZXIsIFtdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXBsYWNlIHRoZSBzdHJpbmcgYnkgYSB2YWx1ZSBvZiB0eXBlIGBvdXRwdXRUeXBlYCwgZGV0ZXJtaW5lZCBvbiB3aGV0aGVyIHRoZSBzdHJpbmcgdmFsdWUgbWF0Y2hlcyBcclxuICAgICAqIGFueSBvZiB0aGUga2V5cyB3aXRoaW4gdGhlIHByb3ZpZGVkIGBtYXRjaGluZ01hcGAsIG9yIHNldCB0byBhIGBkZWZhdWx0VmFsdWVgIGlmIG5vIG1hdGNoIGlzIGZvdW5kLlxyXG4gICAgICogQHBhcmFtIG91dHB1dFR5cGUgUmFkb24gdHlwZSBvZiB0aGUgb3V0cHV0IHZhbHVlLiBcclxuICAgICAqIEBwYXJhbSBtYXRjaGluZ01hcCBNYXAgZGV0ZXJtaW5pbmcgdGhlIG91dHB1dCB2YWx1ZSBkZXBlbmRpbmcgb24gdGhlIHN0cmluZyB2YWx1ZS5cclxuICAgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVmFsdWUgcmV0dXJuZWQgaWYgbm8gbWF0Y2ggaXMgZm91bmQuIFxyXG4gICAgICogQHJldHVybnMgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtYXRjaDxPdXRwdXRUeXBlIGV4dGVuZHMgUmFkb25BbnkgPSBSYWRvblN0cmluZz4oXHJcbiAgICAgICAgb3V0cHV0VHlwZTogeyBuZXcocHJldj86IFJhZG9uT3BlcmF0b3IpOiBPdXRwdXRUeXBlOyB9LCBcclxuICAgICAgICBtYXRjaGluZ01hcDogTWFwPHN0cmluZywgYW55PiwgXHJcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBhbnlcclxuICAgICkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3Iob3V0cHV0VHlwZSwgW21hdGNoaW5nTWFwLCBkZWZhdWx0VmFsdWVdKVxyXG4gICAgICAgIC8vIHRoaXMuX2J5dGVjb2RlID0gWyBcclxuICAgICAgICAvLyAgICAgMHg3NSwgIFxyXG4gICAgICAgIC8vICAgICBtYXRjaGluZ01hcCxcclxuICAgICAgICAvLyAgICAgZGVmYXVsdFZhbHVlXHJcbiAgICAgICAgLy8gXVxyXG4gICAgICAgIC8vIHRoaXMuX21ldGhvZCA9IFwibWF0Y2hcIlxyXG4gICAgICAgIC8vIHRoaXMuX3BhcmFtcyA9IGB7ICR7T2JqZWN0LmVudHJpZXMobWF0Y2hpbmdNYXApLm1hcCgoZW50cnk6IFtzdHJpbmcsIGFueV0pID0+IGBcXFwiJHtlbnRyeVswXX1cXFwiOiAke2VudHJ5WzFdfSwgYCl9fSwgJHtkZWZhdWx0VmFsdWV9YFxyXG4gICAgICAgIC8vIGxldCBrZXlzOiBzdHJpbmcgPSBcIlwiXHJcbiAgICAgICAgLy8gT2JqZWN0LmtleXMobWF0Y2hpbmdNYXApLm1hcCgoa2V5OiBzdHJpbmcpID0+IGtleXMgKz0ga2V5ICsgXCI7XCIpXHJcbiAgICAgICAgLy8gcmV0dXJuIG5ldyBvdXRwdXRUeXBlKHRoaXMsIGtleXMpXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFBhcnNlIGlucHV0IHN0cmluZyBhcyBhbiBhcnJheSBvZiBKU09OIGl0ZW1zLiBcclxuICAgICAqIEBwYXJhbSBqc29uUGF0aHMgKG9wdGlvbmFsKSBBcnJheSBvZiBKU09OIHBhdGhzIHdpdGhpbiBpbnB1dCBgUmFkb25TdHJpbmdgIGZyb20gd2hlcmUgdG8gZmV0Y2ggaXRlbXMgdGhhdCB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBvdXRwdXQgYFJhZG9uQXJyYXlgLiBcclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uQXJyYXlgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHBhcnNlSlNPTkFycmF5KC4uLmpzb25QYXRoczogc3RyaW5nW10pOiBSYWRvbkFycmF5PFJhZG9uQW55PiB7IFxyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25BcnJheTxSYWRvbkFueT4sIFsuLi5qc29uUGF0aHNdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBQYXJzZSBzdHJpbmcgYXMgYSBKU09OLWVuY29kZWQgbWFwLiBcclxuICAgICAqIEBwYXJhbSBqc29uUGF0aCAob3B0aW9uYWwpIEpTT04gcGF0aCB3aXRoaW4gaW5wdXQgYFJhZG9uU3RyaW5nYCBmcm9tIHdoZXJlIHRvIGV4dHJhY3QgdGhlIG91dHB1dCBgUmFkb25NYXBgLiBcclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uTWFwYCBvYmplY3QuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcGFyc2VKU09OTWFwKGpzb25QYXRoPzogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbk1hcCwgW2pzb25QYXRoXSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUGFyc2Ugc3RyaW5nIGFzIGFuIFhNTC1lbmNvZGVkIG1hcC4gXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbk1hcGAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcGFyc2VYTUxNYXAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbk1hcCwgW10pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJlcGxhY2Ugd2l0aCBnaXZlbiBgcmVwbGFjZW1lbnRgIHN0cmluZywgYWxsIHBhcnRzIG9mIHRoZSBpbnB1dCBzdHJpbmcgdGhhdCBtYXRjaCB3aXRoIGdpdmVuIHJlZ3VsYXIgZXhwcmVzc2lvbi4gXHJcbiAgICAgKiBAcGFyYW0gcmVnZXggUmVndWxhciBleHByZXNzaW9uIHRvIGJlIG1hdGNoZWQuXHJcbiAgICAgKiBAcGFyYW0gcmVwbGFjZW1lbnQgVGV4dCB0aGF0IHdpbGwgcmVwbGFjZSBhbGwgb2NjdXJlbmNlcy4gXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvblN0cmluZ2Agb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVwbGFjZShyZWdleDogc3RyaW5nID0gXCJcIiwgcmVwbGFjZW1lbnQ6IHN0cmluZyA9IFwiXCIpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uU3RyaW5nLCBbcmVnZXgsIHJlcGxhY2VtZW50XSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHNsaWNlIGV4dHJhY3RlZCBmcm9tIHRoZSBpbnB1dCBzdHJpbmcuIFxyXG4gICAgICogQSBgc3RhcnRJbmRleGAgb2YgMCByZWZlcnMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5wdXQgc3RyaW5nLiBJZiBubyBgZW5kSW5kZXhgIGlzIHByb3ZpZGVkLCBpdCB3aWxsIGJlIGFzc3VtZWQgXHJcbiAgICAgKiB0aGUgbGVuZ3RoIG9mIHRoZSBpbnB1dCBzdHJpbmcuIE5lZ2F0aXZlIHZhbHVlcyB3aWxsIGJlIHJlbGF0aXZlIHRvIHRoZSBlbmQgb2YgdGhlIGlucHV0IHN0cmluZy5cclxuICAgICAqIEBwYXJhbSBzdGFydEluZGV4IFBvc2l0aW9uIHdpdGhpbiBpbnB1dCBzdHJpbmcgd2hlcmUgdGhlIG91dHB1dCBzdHJpbmcgd2lsbCBzdGFydC5cclxuICAgICAqIEBwYXJhbSBlbmRJbmRleCBQb3NpdGlvbiB3aXRoaW4gaW5wdXQgc3RyaW5nIHdoZXJlIHRoZSBvdXRwdXQgc3RyaW5nIHdpbGwgZW5kLlxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25TdHJpbmdgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNsaWNlKHN0YXJ0SW5kZXg6IG51bWJlciA9IDAsIGVuZEluZGV4PzogbnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvblN0cmluZywgW3N0YXJ0SW5kZXgsIGVuZEluZGV4XSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRGl2aWRlcyBpbnB1dCBzdHJpbmcgaW50byBhbiBhcnJheSBvZiBzdWJzdHJpbmdzLCBcclxuICAgICAqIEBwYXJhbSByZWdleCBUaGUgc3RyaW5nIG9yIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byB1c2UgZm9yIHNwbGl0dGluZy5cclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uQXJyYXlgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNwbGl0KHJlZ2V4OiBzdHJpbmcgPSBcIlxcclwiKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkFycmF5PFJhZG9uU3RyaW5nPiwgW3JlZ2V4XSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogTG93ZXIgY2FzZSBhbGwgY2hhcmFjdGVycy5cclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uU3RyaW5nYCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0b0xvd2VyY2FzZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uU3RyaW5nLCBbXSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogVXBwZXIgY2FzZSBhbGwgY2hhcmFjdGVycy5cclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uU3RyaW5nYCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0b1VwcGVyQ2FzZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uU3RyaW5nLCBbXSlcclxuICAgIH1cclxufVxyXG4iXX0=
948
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JhZG9uL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUV4QixPQUFPLEtBQUssT0FBTyxNQUFNLHNCQUFzQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFNMUMsTUFBTSxDQUFOLElBQVksY0FJWDtBQUpELFdBQVksY0FBYztJQUN6Qiw2REFBYSxDQUFBO0lBQ2IsdURBQVUsQ0FBQTtJQUNWLG1EQUFRLENBQUE7QUFDVCxDQUFDLEVBSlcsY0FBYyxLQUFkLGNBQWMsUUFJekI7QUFFRCxJQUFLLGtCQW1CSjtBQW5CRCxXQUFLLGtCQUFrQjtJQUN0QixtQkFBbUI7SUFDbkIsbUJBQW1CO0lBQ25CLHFCQUFxQjtJQUNyQixxQkFBcUI7SUFDckIsa0JBQWtCO0lBQ2xCLG9CQUFvQjtJQUNwQixvQkFBb0I7SUFDcEIsb0JBQW9CO0lBQ3BCLG1CQUFtQjtJQUNuQixtQkFBbUI7SUFDbkIsb0VBQWUsQ0FBQTtJQUNmLG1CQUFtQjtJQUNuQixtQkFBbUI7SUFDbkIsbUJBQW1CO0lBQ25CLG1CQUFtQjtJQUNuQixtQkFBbUI7SUFDbkIsbUJBQW1CO0lBQ25CLHVCQUF1QjtBQUN4QixDQUFDLEVBbkJJLGtCQUFrQixLQUFsQixrQkFBa0IsUUFtQnRCO0FBRUQsTUFBTSxDQUFOLElBQVksY0FxRVg7QUFyRUQsV0FBWSxjQUFjO0lBQ3pCLGtFQUFrQixDQUFBO0lBQ2xCLGtFQUFrQixDQUFBO0lBQ2xCLG9CQUFvQjtJQUNwQixzRUFBb0IsQ0FBQTtJQUNwQiwwRUFBc0IsQ0FBQTtJQUN0QixzRUFBb0IsQ0FBQTtJQUNwQixzRUFBb0IsQ0FBQTtJQUNwQiwwRUFBc0IsQ0FBQTtJQUN0QixrRUFBa0IsQ0FBQTtJQUNsQix3RUFBcUIsQ0FBQTtJQUNyQiw0REFBZSxD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Q0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUNEOzs7O09BSUc7SUFDSSxLQUFLLENBQUMsUUFBZ0IsSUFBSTtRQUNoQyxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQSxVQUF1QixDQUFBLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFDRDs7O09BR0c7SUFDSSxXQUFXO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUNEOzs7T0FHRztJQUNJLFdBQVc7UUFDakIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM1QyxDQUFDO0NBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY2JvciBmcm9tIFwiY2JvclwiO1xyXG5cclxuaW1wb3J0ICogYXMgaGVscGVycyBmcm9tIFwiLi4vLi4vYmluL2hlbHBlcnMuanNcIjtcclxuaW1wb3J0IHsgdG9IZXhTdHJpbmcgfSBmcm9tIFwiLi4vdXRpbHMuanNcIjtcclxuXHJcbmltcG9ydCB0eXBlIHsgT3Bjb2RlcyBhcyBSYWRvblJlZHVjZXJPcGNvZGVzIH0gZnJvbSBcIi4vcmVkdWNlcnMuanNcIjtcclxuXHJcbmV4cG9ydCB7IEhleFN0cmluZyBhcyBSYWRvbkJ5dGVjb2RlIH0gZnJvbSBcIi4uL3R5cGVzLmpzXCI7XHJcblxyXG5leHBvcnQgZW51bSBSYWRvbkVuY29kaW5ncyB7XHJcblx0SGV4U3RyaW5nID0gMCxcclxuXHRCYXNlNjQgPSAxLFxyXG5cdFV0ZjggPSAyLFxyXG59XHJcblxyXG5lbnVtIFJhZG9uSGFzaEZ1bmN0aW9ucyB7XHJcblx0Ly8gQmxha2UyNTYgPSAweDAwLFxyXG5cdC8vIEJsYWtlNTEyID0gMHgwMSxcclxuXHQvLyBCbGFrZTJzMjU2ID0gMHgwMixcclxuXHQvLyBCbGFrZTJiNTEyID0gMHgwMyxcclxuXHQvLyBNRDVfMTI4ID0gMHgwNCxcclxuXHQvLyBSaXBlbWQxMjggPSAweDA1LFxyXG5cdC8vIFJpcGVtZDE2MCA9IDB4MDYsXHJcblx0Ly8gUmlwZW1kMzIwID0gMHgwNyxcclxuXHQvLyBTSEExXzE2MCA9IDB4MDgsXHJcblx0Ly8gU0hBMl8yMjQgPSAweDA5LFxyXG5cdFNIQTJfMjU2ID0gMHgwYSxcclxuXHQvLyBTSEEyXzM4NCA9IDB4MEIsXHJcblx0Ly8gU0hBMl81MTIgPSAweDBDLFxyXG5cdC8vIFNIQTNfMjI0ID0gMHgwRCxcclxuXHQvLyBTSEEzXzI1NiA9IDB4MEUsXHJcblx0Ly8gU0hBM18zODQgPSAweDBGLFxyXG5cdC8vIFNIQTNfNTEyID0gMHgxMCxcclxuXHQvLyBXaGlybHBvb2w1MTIgPSAweDExLFxyXG59XHJcblxyXG5leHBvcnQgZW51bSBSYWRvbk9wZXJhdG9ycyB7XHJcblx0QXJyYXlMZW5ndGggPSAweDEwLFxyXG5cdEFycmF5RmlsdGVyID0gMHgxMSxcclxuXHQvLyBBcnJheUpvaW4gPSAweDEyLFxyXG5cdEFycmF5R2V0QXJyYXkgPSAweDEzLFxyXG5cdEFycmF5R2V0Qm9vbGVhbiA9IDB4MTQsXHJcblx0QXJyYXlHZXRCeXRlcyA9IDB4MTUsXHJcblx0QXJyYXlHZXRGbG9hdCA9IDB4MTYsXHJcblx0QXJyYXlHZXRJbnRlZ2VyID0gMHgxNyxcclxuXHRBcnJheUdldE1hcCA9IDB4MTgsXHJcblx0QXJyYXlHZXRTdHJpbmcgPSAweDE5LFxyXG5cdEFycmF5TWFwID0gMHgxYSxcclxuXHRBcnJheVJlZHVjZSA9IDB4MWIsXHJcblx0QXJyYXlTb3J0ID0gMHgxZCxcclxuXHQvLyBBcnJheVBpY2sgPSAweDFlLFxyXG5cdEJvb2xlYW5Ub1N0cmluZyA9IDB4MjAsXHJcblx0Qm9vbGVhbk5lZ2F0ZSA9IDB4MjIsXHJcblx0Qnl0ZXNUb1N0cmluZyA9IDB4MzAsXHJcblx0Qnl0ZXNIYXNoID0gMHgzMSxcclxuXHRCeXRlc0FzSW50ZWdlciA9IDB4MzIsXHJcblx0Qnl0ZXNMZW5ndGggPSAweDM0LFxyXG5cdEJ5dGVzU2xpY2UgPSAweDNjLFxyXG5cdEZsb2F0QWJzb2x1dGUgPSAweDUwLFxyXG5cdEZsb2F0VG9TdHJpbmcgPSAweDUxLFxyXG5cdEZsb2F0Q2VpbGluZyA9IDB4NTIsXHJcblx0RmxvYXRHcmVhdGVyVGhhbiA9IDB4NTMsXHJcblx0RmxvYXRGbG9vciA9IDB4NTQsXHJcblx0RmxvYXRMZXNzVGhhbiA9IDB4NTUsXHJcblx0RmxvYXRNb2R1bGUgPSAweDU2LFxyXG5cdEZsb2F0TXVsdGlwbHkgPSAweDU3LFxyXG5cdEZsb2F0TmVnYXRlID0gMHg1OCxcclxuXHRGbG9hdFBvd2VyID0gMHg1OSxcclxuXHRGbG9hdFJvdW5kID0gMHg1YixcclxuXHRGbG9hdFRydW5jYXRlID0gMHg1ZCxcclxuXHRJbnRlZ2VyQWJzb2x1dGUgPSAweDQwLFxyXG5cdEludGVnZXJUb0Zsb2F0ID0gMHg0MSxcclxuXHRJbnRlZ2VyVG9TdHJpbmcgPSAweDQyLFxyXG5cdEludGVnZXJHcmVhdGVyVGhhbiA9IDB4NDMsXHJcblx0SW50ZWdlckxlc3NUaGFuID0gMHg0NCxcclxuXHRJbnRlZ2VyTW9kdWxvID0gMHg0NixcclxuXHRJbnRlZ2VyTXVsdGlwbHkgPSAweDQ3LFxyXG5cdEludGVnZXJOZWdhdGUgPSAweDQ4LFxyXG5cdEludGVnZXJQb3dlciA9IDB4NDksXHJcblx0SW50ZWdlclRvQnl0ZXMgPSAweDRhLFxyXG5cdE1hcFRvU3RyaW5nID0gMHg2MCxcclxuXHRNYXBHZXRBcnJheSA9IDB4NjEsXHJcblx0TWFwR2V0Qm9vbGVhbiA9IDB4NjIsXHJcblx0TWFwR2V0RmxvYXQgPSAweDY0LFxyXG5cdE1hcEdldEludGVnZXIgPSAweDY1LFxyXG5cdE1hcEdldE1hcCA9IDB4NjYsXHJcblx0TWFwR2V0U3RyaW5nID0gMHg2NyxcclxuXHRNYXBLZXlzID0gMHg2OCxcclxuXHRNYXBWYWx1ZXMgPSAweDY5LFxyXG5cdE1hcEFsdGVyID0gMHg2YixcclxuXHRNYXBQaWNrID0gMHg2ZSxcclxuXHRTdHJpbmdBc0Jvb2xlYW4gPSAweDcwLFxyXG5cdFN0cmluZ0FzQnl0ZXMgPSAweDcxLFxyXG5cdFN0cmluZ0FzRmxvYXQgPSAweDcyLFxyXG5cdFN0cmluZ0FzSW50ZWdlciA9IDB4NzMsXHJcblx0U3RyaW5nTGVuZ3RoID0gMHg3NCxcclxuXHRTdHJpbmdNYXRjaCA9IDB4NzUsXHJcblx0U3RyaW5nUGFyc2VKU09OQXJyYXkgPSAweDc2LFxyXG5cdFN0cmluZ1BhcnNlSlNPTk1hcCA9IDB4NzcsXHJcblx0U3RyaW5nUGFyc2VYTUxNYXAgPSAweDc4LFxyXG5cdFN0cmluZ1RvTG93ZXJDYXNlID0gMHg3OSxcclxuXHRTdHJpbmdUb1VwcHNlckNhc2UgPSAweDdhLFxyXG5cdFN0cmluZ1JlcGxhY2UgPSAweDdiLFxyXG5cdFN0cmluZ1NsaWNlID0gMHg3YyxcclxuXHRTdHJpbmdTcGxpdCA9IDB4N2QsXHJcbn1cclxuXHJcbmFic3RyYWN0IGNsYXNzIFJhZG9uQ2xhc3Mge1xyXG5cdHJlYWRvbmx5IHByZXY/OiBSYWRvbk9wZXJhdG9yO1xyXG5cdGNvbnN0cnVjdG9yKHByZXY/OiBSYWRvbk9wZXJhdG9yKSB7XHJcblx0XHR0aGlzLnByZXYgPSBwcmV2O1xyXG5cdH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFJhZG9uT3BlcmF0b3IgZXh0ZW5kcyBSYWRvbkNsYXNzIHtcclxuXHRyZWFkb25seSBvcGNvZGU6IFJhZG9uT3BlcmF0b3JzO1xyXG5cdHJlYWRvbmx5IHBhcmFtcz86IGFueVtdO1xyXG5cdGNvbnN0cnVjdG9yKG9wY29kZTogUmFkb25PcGVyYXRvcnMsIHBhcmFtcz86IGFueVtdLCBvcHM/OiBSYWRvbk9wZXJhdG9yKSB7XHJcblx0XHRzdXBlcihvcHMpO1xyXG5cdFx0dGhpcy5vcGNvZGUgPSBvcGNvZGU7XHJcblx0XHR0aGlzLnBhcmFtcyA9IHBhcmFtcyB8fCBbXTtcclxuXHR9XHJcblx0cHVibGljIGFyZ3NDb3VudCgpOiBudW1iZXIge1xyXG5cdFx0bGV0IG1heENvdW50OiBudW1iZXIgPSAwO1xyXG5cdFx0dGhpcy5wYXJhbXM/LmZvckVhY2goKHBhcmFtKSA9PiB7XHJcblx0XHRcdGlmICh0eXBlb2YgcGFyYW0gPT09IFwic3RyaW5nXCIpIHtcclxuXHRcdFx0XHRjb25zdCBjb3VudCA9IGhlbHBlcnMuZ2V0V2lsZGNhcmRzQ291bnRGcm9tU3RyaW5nKHBhcmFtKTtcclxuXHRcdFx0XHRpZiAoY291bnQgPiBtYXhDb3VudCkgbWF4Q291bnQgPSBjb3VudDtcclxuXHRcdFx0fSBlbHNlIGlmICh0eXBlb2YgcGFyYW0gPT09IFwib2JqZWN0XCIgJiYgcGFyYW0gaW5zdGFuY2VvZiBSYWRvblNjcmlwdCkge1xyXG5cdFx0XHRcdGNvbnN0IGNvdW50ID0gcGFyYW0uYXJnc0NvdW50KCk7XHJcblx0XHRcdFx0aWYgKGNvdW50ID4gbWF4Q291bnQpIG1heENvdW50ID0gY291bnQ7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdFx0cmV0dXJuIE1hdGgubWF4KG1heENvdW50LCB0aGlzLnByZXY/LmFyZ3NDb3VudCgpIHx8IDApO1xyXG5cdH1cclxuXHRwdWJsaWMgZGlzZWN0KGxldmVsID0gMCk6IFtudW1iZXIsIHN0cmluZywgc3RyaW5nXVtdIHtcclxuXHRcdGNvbnN0IHJlc3VsdCA9IHRoaXM/LnByZXY/LmRpc2VjdChsZXZlbCkgfHwgW107XHJcblx0XHRjb25zdCBvcGVyYXRvciA9IFJhZG9uT3BlcmF0b3JzW3RoaXMub3Bjb2RlXTtcclxuXHRcdGNvbnN0IGlucHV0VHlwZSA9IGBSYWRvbiR7b3BlcmF0b3Iuc3BsaXQoLyg/PVtBLVpdKS8pWzBdfWA7XHJcblx0XHRsZXQgcmFkb25DYWxsID0gb3BlcmF0b3JcclxuXHRcdFx0LnNwbGl0KC8oPz1bQS1aXSkvKVxyXG5cdFx0XHQuc2xpY2UoMSlcclxuXHRcdFx0LmpvaW4oXCJcIik7XHJcblx0XHRyYWRvbkNhbGwgPSByYWRvbkNhbGwuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgKyByYWRvbkNhbGwuc2xpY2UoMSk7XHJcblx0XHRsZXQgYXJncyA9IFwiXCI7XHJcblx0XHRsZXQgc2NyaXB0O1xyXG5cdFx0aWYgKHRoaXMucGFyYW1zICYmIHRoaXMucGFyYW1zWzBdICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0dGhpcy5wYXJhbXMubWFwKChwYXJhbSkgPT4ge1xyXG5cdFx0XHRcdGlmICh0eXBlb2YgcGFyYW0gIT09IFwib2JqZWN0XCIgfHwgIShwYXJhbSBpbnN0YW5jZW9mIFJhZG9uU2NyaXB0KSkge1xyXG5cdFx0XHRcdFx0YXJncyArPSBgJHt0eXBlb2YgcGFyYW0gPT09IFwic3RyaW5nXCIgPyBgXCIke3BhcmFtfVwiYCA6IEpTT04uc3RyaW5naWZ5KHBhcmFtKX0sIGA7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdHNjcmlwdCA9IHBhcmFtO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHRcdGlmIChzY3JpcHQpIGFyZ3MgKz0gXCJSYWRvbk9wZXJhdG9yIHtcIjtcclxuXHRcdFx0ZWxzZSBhcmdzID0gYXJncy5zbGljZSgwLCAtMik7XHJcblx0XHR9XHJcblx0XHRpZiAoc2NyaXB0KSB7XHJcblx0XHRcdGNvbnN0IG91dHB1dFR5cGUgPSBgJHsoc2NyaXB0IGFzIFJhZG9uU2NyaXB0KS5vdXRwdXRUeXBlPy5jb25zdHJ1Y3Rvci5uYW1lIHx8IFwiUmFkb25BbnlcIn1gO1xyXG5cdFx0XHRyYWRvbkNhbGwgKz0gYCgke2FyZ3N9YDtcclxuXHRcdFx0cmVzdWx0LnB1c2goW2xldmVsLCBpbnB1dFR5cGUsIHJhZG9uQ2FsbF0pO1xyXG5cdFx0XHRyZXN1bHQucHVzaCguLi4oc2NyaXB0IGFzIFJhZG9uU2NyaXB0KS5kaXNlY3QobGV2ZWwgKyAxKSk7XHJcblx0XHRcdHJlc3VsdC5wdXNoKFtsZXZlbCwgb3V0cHV0VHlwZSwgXCJ9KVwiXSk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRyYWRvbkNhbGwgKz0gYCgke2FyZ3N9KWA7XHJcblx0XHRcdHJlc3VsdC5wdXNoKFtsZXZlbCwgaW5wdXRUeXBlLCByYWRvbkNhbGxdKTtcclxuXHRcdH1cclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cdHB1YmxpYyBlbmNvZGUoKTogYW55W10ge1xyXG5cdFx0bGV0IGVuY29kZWQ7XHJcblx0XHRpZiAodGhpcz8ucGFyYW1zICYmIHRoaXMucGFyYW1zWzBdICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0Y29uc3QgYXJncyA9IHRoaXMucGFyYW1zLm1hcCgocGFyYW0pID0+IHtcclxuXHRcdFx0XHRpZiAodHlwZW9mIHBhcmFtID09PSBcIm9iamVjdFwiKSB7XHJcblx0XHRcdFx0XHRpZiAocGFyYW0gaW5zdGFuY2VvZiBSYWRvbkFueSkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gcGFyYW0ucHJldj8uZW5jb2RlKCk7XHJcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHBhcmFtIGluc3RhbmNlb2YgUmFkb25PcGVyYXRvcikge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gcGFyYW0uZW5jb2RlKCk7XHJcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHBhcmFtIGluc3RhbmNlb2YgUmFkb25TY3JpcHQpIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHBhcmFtLmVuY29kZSgpO1xyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHBhcmFtO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gcGFyYW07XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHRcdFx0ZW5jb2RlZCA9IFt0aGlzLm9wY29kZSwgLi4uYXJnc107XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRlbmNvZGVkID0gdGhpcy5vcGNvZGU7XHJcblx0XHR9XHJcblx0XHRpZiAodGhpcy5wcmV2KSB7XHJcblx0XHRcdHJldHVybiBbLi4udGhpcy5wcmV2LmVuY29kZSgpLCBlbmNvZGVkXTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHJldHVybiBbZW5jb2RlZF07XHJcblx0XHR9XHJcblx0fVxyXG5cdHB1YmxpYyByZXBsYWNlV2lsZGNhcmRzKGFyZ3M6IHN0cmluZ1tdKTogUmFkb25PcGVyYXRvciB7XHJcblx0XHRpZiAoYXJncy5sZW5ndGggPCB0aGlzLmFyZ3NDb3VudCgpKSB7XHJcblx0XHRcdHRocm93IEV2YWxFcnJvcihcclxuXHRcdFx0XHRgSW5zdWZmaWNlbnQgYXJncyB3ZXJlIHByb3ZpZGVkICgke2FyZ3MubGVuZ3RofSA8ICR7dGhpcy5hcmdzQ291bnQoKX0pYCxcclxuXHRcdFx0KTtcclxuXHRcdH1cclxuXHRcdHJldHVybiBuZXcgUmFkb25PcGVyYXRvcihcclxuXHRcdFx0dGhpcy5vcGNvZGUsXHJcblx0XHRcdHRoaXMucGFyYW1zPy5tYXAoKHBhcmFtKSA9PiB7XHJcblx0XHRcdFx0aWYgKHR5cGVvZiBwYXJhbSA9PT0gXCJzdHJpbmdcIikge1xyXG5cdFx0XHRcdFx0cmV0dXJuIGhlbHBlcnMucmVwbGFjZVdpbGRjYXJkcyhwYXJhbSwgYXJncyk7XHJcblx0XHRcdFx0fSBlbHNlIGlmICh0eXBlb2YgcGFyYW0gPT09IFwib2JqZWN0XCIpIHtcclxuXHRcdFx0XHRcdGlmIChwYXJhbSBpbnN0YW5jZW9mIFJhZG9uU2NyaXB0KSB7XHJcblx0XHRcdFx0XHRcdHJldHVybiBwYXJhbS5yZXBsYWNlV2lsZGNhcmRzKC4uLmFyZ3MpO1xyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIGhlbHBlcnMucmVwbGFjZVdpbGRjYXJkcyhwYXJhbSwgYXJncyk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdHJldHVybiBwYXJhbTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pLFxyXG5cdFx0XHR0aGlzPy5wcmV2Py5yZXBsYWNlV2lsZGNhcmRzKGFyZ3MpLFxyXG5cdFx0KTtcclxuXHR9XHJcblx0cHVibGljIHNwbGljZVdpbGRjYXJkKGFyZ0luZGV4OiBudW1iZXIsIGFyZ1ZhbHVlOiBzdHJpbmcpOiBSYWRvbk9wZXJhdG9yIHtcclxuXHRcdHJldHVybiBuZXcgUmFkb25PcGVyYXRvcihcclxuXHRcdFx0dGhpcy5vcGNvZGUsXHJcblx0XHRcdHRoaXMucGFyYW1zPy5tYXAoKHBhcmFtKSA9PiB7XHJcblx0XHRcdFx0aWYgKHR5cGVvZiBwYXJhbSA9PT0gXCJzdHJpbmdcIikge1xyXG5cdFx0XHRcdFx0cmV0dXJuIGhlbHBlcnMuc3BsaWNlV2lsZGNhcmQoXHJcblx0XHRcdFx0XHRcdHBhcmFtLFxyXG5cdFx0XHRcdFx0XHRhcmdJbmRleCxcclxuXHRcdFx0XHRcdFx0YXJnVmFsdWUsXHJcblx0XHRcdFx0XHRcdHRoaXMuYXJnc0NvdW50KCksXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdH0gZWxzZSBpZiAodHlwZW9mIHBhcmFtID09PSBcIm9iamVjdFwiICYmIHBhcmFtIGluc3RhbmNlb2YgUmFkb25TY3JpcHQpIHtcclxuXHRcdFx0XHRcdHJldHVybiBwYXJhbS5zcGxpY2VXaWxkY2FyZChhcmdJbmRleCwgYXJnVmFsdWUpO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gcGFyYW07XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KSxcclxuXHRcdFx0dGhpcz8ucHJldj8uc3BsaWNlV2lsZGNhcmQoYXJnSW5kZXgsIGFyZ1ZhbHVlKSxcclxuXHRcdCk7XHJcblx0fVxyXG5cdHB1YmxpYyB0b1N0cmluZyhsZWZ0ID0gXCJcIiwgaW5kZW50ID0gNCwgbGV2ZWwgPSAwKTogc3RyaW5nIHtcclxuXHRcdGNvbnN0IGxmID0gbGVmdCAhPT0gXCJcIiA/IFwiXFxuXCIgOiBcIlwiO1xyXG5cdFx0bGV0IHN0ciA9IHRoaXM/LnByZXY/LnRvU3RyaW5nKGxlZnQsIGluZGVudCwgbGV2ZWwpIHx8IFwiXCI7XHJcblx0XHRsZXQgbWV0aG9kTmFtZSA9IFJhZG9uT3BlcmF0b3JzW3RoaXMub3Bjb2RlXVxyXG5cdFx0XHQuc3BsaXQoLyg/PVtBLVpdKS8pXHJcblx0XHRcdC5zbGljZSgxKVxyXG5cdFx0XHQuam9pbihcIlwiKTtcclxuXHRcdG1ldGhvZE5hbWUgPSBtZXRob2ROYW1lLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpICsgbWV0aG9kTmFtZS5zbGljZSgxKTtcclxuXHRcdHN0ciArPSBgJHtsZWZ0fSR7XCIgXCIucmVwZWF0KGluZGVudCAqIGxldmVsKX0uJHttZXRob2ROYW1lfShgO1xyXG5cdFx0aWYgKHRoaXMucGFyYW1zICYmIHRoaXMucGFyYW1zWzBdICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0dGhpcy5wYXJhbXMuZm9yRWFjaCgocGFyYW0pID0+IHtcclxuXHRcdFx0XHRpZiAodHlwZW9mIHBhcmFtID09PSBcInN0cmluZ1wiKSB7XHJcblx0XHRcdFx0XHRzdHIgKz0gYFwiJHtwYXJhbX1cIiwgYDtcclxuXHRcdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiBwYXJhbSA9PT0gXCJvYmplY3RcIiAmJiBwYXJhbSBpbnN0YW5jZW9mIFJhZG9uU2NyaXB0KSB7XHJcblx0XHRcdFx0XHRzdHIgKz0gYCR7cGFyYW0udG9TdHJpbmcobGVmdCwgaW5kZW50LCBsZXZlbCArIDEpfSR7bGVmdH0ke1wiIFwiLnJlcGVhdChpbmRlbnQgKiBsZXZlbCl9LCBgO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRzdHIgKz0gYCR7cGFyYW0udG9TdHJpbmcoKX0sIGA7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHRcdFx0c3RyID0gc3RyLnNsaWNlKDAsIC0yKTtcclxuXHRcdH1cclxuXHRcdHN0ciArPSBgKSR7bGZ9YDtcclxuXHRcdHJldHVybiBzdHI7XHJcblx0fVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUmFkb25TY3JpcHQge1xyXG5cdHByb3RlY3RlZCByZWFkb25seSBvcHM/OiBSYWRvbk9wZXJhdG9yO1xyXG5cdHB1YmxpYyByZWFkb25seSBpbnB1dFR5cGU/OiBSYWRvbkFueTtcclxuXHRwdWJsaWMgcmVhZG9ubHkgb3V0cHV0VHlwZT86IFJhZG9uQW55O1xyXG5cdGNvbnN0cnVjdG9yKG91dHB1dDogUmFkb25BbnkpIHtcclxuXHRcdHRoaXMub3BzID0gb3V0cHV0Py5wcmV2O1xyXG5cdFx0Y29uc3QgcmFkb25UeXBlcyA9IHtcclxuXHRcdFx0QXJyYXk6IFJhZG9uQXJyYXksXHJcblx0XHRcdEJvb2xlYW46IFJhZG9uQm9vbGVhbixcclxuXHRcdFx0Qnl0ZXM6IFJhZG9uQnl0ZXMsXHJcblx0XHRcdEZsb2F0OiBSYWRvbkZsb2F0LFxyXG5cdFx0XHRJbnRlZ2VyOiBSYWRvbkludGVnZXIsXHJcblx0XHRcdE1hcDogUmFkb25NYXAsXHJcblx0XHRcdFN0cmluZzogUmFkb25TdHJpbmcsXHJcblx0XHR9O1xyXG5cdFx0bGV0IGlucHV0ID0gb3V0cHV0Py5wcmV2O1xyXG5cdFx0d2hpbGUgKGlucHV0Py5wcmV2KSBpbnB1dCA9IGlucHV0Py5wcmV2O1xyXG5cdFx0Y29uc3QgaW5wdXRUeXBlID0gT2JqZWN0LmVudHJpZXMocmFkb25UeXBlcykuZmluZChcclxuXHRcdFx0KFtwcmVmaXgsIF9dKSA9PiBpbnB1dCAmJiBSYWRvbk9wZXJhdG9yc1tpbnB1dC5vcGNvZGVdLnN0YXJ0c1dpdGgocHJlZml4KSxcclxuXHRcdCk7XHJcblx0XHRpZiAoaW5wdXRUeXBlPy5bMV0pIHRoaXMuaW5wdXRUeXBlID0gbmV3IGlucHV0VHlwZVsxXSgpO1xyXG5cdFx0Y29uc3Qgb3V0cHV0VHlwZSA9IE9iamVjdC52YWx1ZXMocmFkb25UeXBlcykuZmluZChcclxuXHRcdFx0KG91dHB1dFR5cGUpID0+IG91dHB1dCBpbnN0YW5jZW9mIG91dHB1dFR5cGUsXHJcblx0XHQpO1xyXG5cdFx0aWYgKG91dHB1dFR5cGUpIHRoaXMub3V0cHV0VHlwZSA9IG5ldyBvdXRwdXRUeXBlKCk7XHJcblx0fVxyXG5cdHB1YmxpYyBhcmdzQ291bnQoKTogbnVtYmVyIHtcclxuXHRcdHJldHVybiB0aGlzLm9wcz8uYXJnc0NvdW50KCkgfHwgMDtcclxuXHR9XHJcblx0cHVibGljIGNsb25lKCk6IFJhZG9uQW55IHtcclxuXHRcdGNvbnN0IE91dHB1dFR5cGUgPSBbXHJcblx0XHRcdFJhZG9uQXJyYXksXHJcblx0XHRcdFJhZG9uQm9vbGVhbixcclxuXHRcdFx0UmFkb25CeXRlcyxcclxuXHRcdFx0UmFkb25GbG9hdCxcclxuXHRcdFx0UmFkb25JbnRlZ2VyLFxyXG5cdFx0XHRSYWRvbk1hcCxcclxuXHRcdFx0UmFkb25TdHJpbmcsXHJcblx0XHRdLmZpbmQoKE91dHB1dFR5cGUpID0+IHRoaXMub3V0cHV0VHlwZSBpbnN0YW5jZW9mIE91dHB1dFR5cGUpO1xyXG5cdFx0aWYgKE91dHB1dFR5cGUpIHtcclxuXHRcdFx0cmV0dXJuIG5ldyBPdXRwdXRUeXBlKHRoaXMub3BzKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHRocm93IEV2YWxFcnJvcihgQ2Fubm90IGNsb25lIGZyb20gZW1wdHkgc2NyaXB0YCk7XHJcblx0XHR9XHJcblx0fVxyXG5cdHB1YmxpYyBkaXNlY3QobGV2ZWwgPSAwKTogW251bWJlciwgc3RyaW5nLCBzdHJpbmddW10ge1xyXG5cdFx0cmV0dXJuIHRoaXMub3BzPy5kaXNlY3QobGV2ZWwpIHx8IFtbbGV2ZWwsIFwiUmFkb25BbnlcIiwgXCJcIl1dO1xyXG5cdH1cclxuXHRwdWJsaWMgZW5jb2RlKCk6IGFueVtdIHtcclxuXHRcdHJldHVybiB0aGlzLm9wcz8uZW5jb2RlKCkgfHwgW107XHJcblx0fVxyXG5cdHB1YmxpYyByZXBsYWNlV2lsZGNhcmRzKC4uLmFyZ3M6IHN0cmluZ1tdKTogUmFkb25Bbnkge1xyXG5cdFx0Y29uc3QgT3V0cHV0VHlwZSA9IFtcclxuXHRcdFx0UmFkb25BcnJheSxcclxuXHRcdFx0UmFkb25Cb29sZWFuLFxyXG5cdFx0XHRSYWRvbkJ5dGVzLFxyXG5cdFx0XHRSYWRvbkZsb2F0LFxyXG5cdFx0XHRSYWRvbkludGVnZXIsXHJcblx0XHRcdFJhZG9uTWFwLFxyXG5cdFx0XHRSYWRvblN0cmluZyxcclxuXHRcdF0uZmluZCgoT3V0cHV0VHlwZSkgPT4gdGhpcy5vdXRwdXRUeXBlIGluc3RhbmNlb2YgT3V0cHV0VHlwZSk7XHJcblx0XHRpZiAoT3V0cHV0VHlwZSkge1xyXG5cdFx0XHRyZXR1cm4gbmV3IE91dHB1dFR5cGUodGhpcy5vcHM/LnJlcGxhY2VXaWxkY2FyZHMoYXJncykpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhyb3cgRXZhbEVycm9yKGBDYW5ub3QgcmVwbGFjZSB3aWxkY2FyZHMgb24gZW1wdHkgc2NyaXB0YCk7XHJcblx0XHR9XHJcblx0fVxyXG5cdHB1YmxpYyBzcGxpY2VXaWxkY2FyZChhcmdJbmRleDogbnVtYmVyLCBhcmdWYWx1ZTogc3RyaW5nKTogUmFkb25Bbnkge1xyXG5cdFx0Y29uc3QgT3V0cHV0VHlwZSA9IFtcclxuXHRcdFx0UmFkb25BcnJheSxcclxuXHRcdFx0UmFkb25Cb29sZWFuLFxyXG5cdFx0XHRSYWRvbkJ5dGVzLFxyXG5cdFx0XHRSYWRvbkZsb2F0LFxyXG5cdFx0XHRSYWRvbkludGVnZXIsXHJcblx0XHRcdFJhZG9uTWFwLFxyXG5cdFx0XHRSYWRvblN0cmluZyxcclxuXHRcdF0uZmluZCgoT3V0cHV0VHlwZSkgPT4gdGhpcy5vdXRwdXRUeXBlIGluc3RhbmNlb2YgT3V0cHV0VHlwZSk7XHJcblx0XHRpZiAoT3V0cHV0VHlwZSkge1xyXG5cdFx0XHRyZXR1cm4gbmV3IE91dHB1dFR5cGUodGhpcy5vcHM/LnNwbGljZVdpbGRjYXJkKGFyZ0luZGV4LCBhcmdWYWx1ZSkpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhyb3cgRXZhbEVycm9yKGBDYW5ub3Qgc3BsaWNlIHdpbGRjYXJkcyBvbiBlbXB0eSBzY3JpcHRgKTtcclxuXHRcdH1cclxuXHR9XHJcblx0cHVibGljIHRvQnl0ZWNvZGUoKTogc3RyaW5nIHtcclxuXHRcdHJldHVybiB0b0hleFN0cmluZyhcclxuXHRcdFx0T2JqZWN0LnZhbHVlcyhVaW50OEFycmF5LmZyb20oY2Jvci5lbmNvZGUodGhpcy5lbmNvZGUoKSkpKSxcclxuXHRcdFx0dHJ1ZSxcclxuXHRcdCk7XHJcblx0fVxyXG5cdHB1YmxpYyB0b1N0cmluZyhsZWZ0ID0gXCJcIiwgaW5kZW50ID0gMCwgbGV2ZWwgPSAwKTogc3RyaW5nIHtcclxuXHRcdGNvbnN0IGxmID0gbGVmdCAhPT0gXCJcIiA/IFwiXFxuXCIgOiBcIlwiO1xyXG5cdFx0cmV0dXJuIGBSYWRvbk9wZXJhdG9yKCR7dGhpcy5pbnB1dFR5cGU/LmNvbnN0cnVjdG9yLm5hbWUgfHwgXCJcIn0pJHtsZn0ke3RoaXMub3BzPy50b1N0cmluZyhsZWZ0LCBpbmRlbnQsIGxldmVsICsgMSl9YDtcclxuXHR9XHJcbn1cclxuXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBSYWRvbkFueSBleHRlbmRzIFJhZG9uQ2xhc3Mge1xyXG5cdHByb3RlY3RlZCBfcHVzaE9wZXJhdG9yPE91dHB1dFR5cGUgZXh0ZW5kcyBSYWRvbkFueT4oXHJcblx0XHRvdXRwdXRUeXBlOiB7IG5ldyAob3BzPzogUmFkb25PcGVyYXRvcik6IE91dHB1dFR5cGUgfSxcclxuXHRcdHBhcmFtczogYW55W10sXHJcblx0KTogT3V0cHV0VHlwZSB7XHJcblx0XHRsZXQgbmFtZTtcclxuXHRcdHRyeSB7XHJcblx0XHRcdHRocm93IG5ldyBFcnJvcigpO1xyXG5cdFx0fSBjYXRjaCAoZXJyKSB7XHJcblx0XHRcdGNvbnN0IHJlc3VsdCA9IGVyciBhcyBFcnJvcjtcclxuXHRcdFx0bmFtZSA9IHJlc3VsdC5zdGFja1xyXG5cdFx0XHRcdD8uc3BsaXQoXCIgYXQgXCIpWzJdXHJcblx0XHRcdFx0LnNwbGl0KFwiIFwiKVswXVxyXG5cdFx0XHRcdC5zcGxpdChcIi5cIilcclxuXHRcdFx0XHQubWFwKChwYXJ0KSA9PiBoZWxwZXJzLnRvVXBwZXJDYW1lbENhc2UocGFydCkpXHJcblx0XHRcdFx0LmpvaW4oXCJcIilcclxuXHRcdFx0XHQuc3BsaXQoLyg/PVtBLVpdKS8pXHJcblx0XHRcdFx0LnNsaWNlKDEpXHJcblx0XHRcdFx0LmpvaW4oXCJcIik7XHJcblx0XHR9XHJcblx0XHRjb25zdCBvcGNvZGUgPSBSYWRvbk9wZXJhdG9yc1tuYW1lIGFzIGtleW9mIHR5cGVvZiBSYWRvbk9wZXJhdG9yc107XHJcblx0XHRpZiAoIW9wY29kZSkge1xyXG5cdFx0XHR0aHJvdyBFcnJvcihgRmF0YWw6IHVua25vd24gUmFkb24gT3BlcmF0b3Igb3Bjb2RlICcke25hbWV9J2ApO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0cmV0dXJuIG5ldyBvdXRwdXRUeXBlKG5ldyBSYWRvbk9wZXJhdG9yKG9wY29kZSwgWy4uLnBhcmFtc10sIHRoaXM/LnByZXYpKTtcclxuXHRcdH1cclxuXHR9XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmFkb25BcnJheTxJdGVtc1R5cGUgZXh0ZW5kcyBSYWRvbkFueT4ge1xyXG5cdGl0ZW1zVHlwZTogSXRlbXNUeXBlO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUmFkb25BcnJheTxcclxuXHRJdGVtc1R5cGUgZXh0ZW5kcyBSYWRvbkFueSA9IFJhZG9uQW55LFxyXG4+IGV4dGVuZHMgUmFkb25Bbnkge1xyXG5cdC8qKlxyXG5cdCAqIERpc2NhcmQgdGhlIGl0ZW1zIGluIHRoZSBpbnB1dCBhcnJheSB0aGF0IG1ha2UgdGhlIGdpdmVuIGBpbm5lclNjcmlwdGAgdG8gcmV0dXJuIGEgYGZhbHNlYCB2YWx1ZS5cclxuXHQgKiBAcGFyYW0gc2NyaXB0IEZpbHRlcmluZyBzY3JpcHQgdWx0aW1hdGVseSByZXR1cm5pbmcgYSBgUmFkb25Cb29sZWFuYCBvYmplY3QuXHJcblx0ICogTXVzdCBhY2NlcHQgYXMgaW5wdXQgdGhlIHNhbWUgZGF0YSB0eXBlcyBhcyB0aGUgb25lcyBvZiB0aGUgaXRlbXMgYmVpbmcgaXRlcmF0ZWQuXHJcblx0ICogQHJldHVybnMgQSBgUmFkb25BcnJheWAgb2JqZWN0IGNvbnRhaW5pbmcgb25seSB0aGUgaXRlbXMgdGhhdCBtYWtlIHRoZSBgaW5uZXJTY3JpcHRgIHRvIHJldHVybiBhIGB0cnVlYCB2YWx1ZS5cclxuXHQgKi9cclxuXHRwdWJsaWMgZmlsdGVyKGlubmVyU2NyaXB0OiBSYWRvbkJvb2xlYW4pIHtcclxuXHRcdGlmICghKGlubmVyU2NyaXB0IGluc3RhbmNlb2YgUmFkb25Cb29sZWFuKSkge1xyXG5cdFx0XHR0aHJvdyBuZXcgRXZhbEVycm9yKGBJbm5lciBzY3JpcHQgbXVzdCBmZXRjaCBhIFJhZG9uQm9vbGVhbiB2YWx1ZWApO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkFycmF5PEl0ZW1zVHlwZT4sIFtcclxuXHRcdFx0bmV3IFJhZG9uU2NyaXB0KGlubmVyU2NyaXB0KSxcclxuXHRcdF0pO1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBGZXRjaCB0aGUgaXRlbSBhdCB0aGUgZ2l2ZW4gYGluZGV4YCBhcyBhIGBSYWRvbkFycmF5YCBvYmplY3QuXHJcblx0ICogQHBhcmFtIGluZGV4XHJcblx0ICovXHJcblx0cHVibGljIGdldEFycmF5PFN1Ykl0ZW1zVHlwZSBleHRlbmRzIFJhZG9uQW55ID0gUmFkb25Bbnk+KGluZGV4OiBudW1iZXIpIHtcclxuXHRcdHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25BcnJheTxTdWJJdGVtc1R5cGU+LCBbaW5kZXhdKTtcclxuXHR9XHJcblx0LyoqXHJcblx0ICogRmV0Y2ggdGhlIGl0ZW0gYXQgdGhlIGdpdmVuIGBpbmRleGAgYXMgYSBgUmFkb25Cb29sZWFuYCBvYmplY3QuXHJcblx0ICogQHBhcmFtIGluZGV4XHJcblx0ICovXHJcblx0cHVibGljIGdldEJvb2xlYW4oaW5kZXg6IG51bWJlcikge1xyXG5cdFx0cmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkJvb2xlYW4sIFtpbmRleF0pO1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBGZXRjaCB0aGUgaXRlbSBhdCB0aGUgZ2l2ZW4gYGluZGV4YCBhcyBhIGBSYWRvbkJ5dGVzYCBvYmplY3QuXHJcblx0ICogQHBhcmFtIGluZGV4XHJcblx0ICovXHJcblx0cHVibGljIGdldEJ5dGVzKGluZGV4OiBudW1iZXIpIHtcclxuXHRcdHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25CeXRlcywgW2luZGV4XSk7XHJcblx0fVxyXG5cdC8qKlxyXG5cdCAqIEZldGNoIHRoZSBpdGVtIGF0IHRoZSBnaXZlbiBgaW5kZXhgIGFzIGEgYFJhZG9uRmxvYXRgIG9iamVjdC5cclxuXHQgKiBAcGFyYW0gaW5kZXhcclxuXHQgKi9cclxuXHRwdWJsaWMgZ2V0RmxvYXQoaW5kZXg6IG51bWJlcikge1xyXG5cdFx0cmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkZsb2F0LCBbaW5kZXhdKTtcclxuXHR9XHJcblx0LyoqXHJcblx0ICogRmV0Y2ggdGhlIGl0ZW0gYXQgdGhlIGdpdmVuIGBpbmRleGAgYXMgYSBgUmFkb25JbnRlZ2VyYCBvYmplY3QuXHJcblx0ICogQHBhcmFtIGluZGV4XHJcblx0ICovXHJcblx0cHVibGljIGdldEludGVnZXIoaW5kZXg6IG51bWJlcikge1xyXG5cdFx0cmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkludGVnZXIsIFtpbmRleF0pO1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBGZXRjaCB0aGUgaXRlbSBhdCB0aGUgZ2l2ZW4gYGluZGV4YCBhcyBhIGBSYWRvbk1hcGAgb2JqZWN0LlxyXG5cdCAqIEBwYXJhbSBpbmRleFxyXG5cdCAqL1xyXG5cdHB1YmxpYyBnZXRNYXAoaW5kZXg6IG51bWJlcikge1xyXG5cdFx0cmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbk1hcCwgW2luZGV4XSk7XHJcblx0fVxyXG5cdC8qKlxyXG5cdCAqIEZldGNoIHRoZSBpdGVtIGF0IHRoZSBnaXZlbiBgaW5kZXhgIGFzIGEgYFJhZG9uU3RyaW5nYCBvYmplY3QuXHJcblx0ICogQHBhcmFtIGluZGV4XHJcblx0ICovXHJcblx0cHVibGljIGdldFN0cmluZyhpbmRleDogbnVtYmVyKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uU3RyaW5nLCBbaW5kZXhdKTtcclxuXHR9XHJcblx0LyoqXHJcblx0ICogSm9pbiBhbGwgaXRlbXMgb2YgdGhlIGFycmF5IGludG8gYSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gdHlwZS4gVGhlIGFycmF5IG11c3QgYmUgaG9tb2dlbmVvdXMsXHJcblx0ICogYWxsIGl0ZW1zIGJlaW5nIG9mIHRoZSBzYW1lIHR5cGUgYXMgdGhlIG91dHB1dFR5cGVgLCBpZiBzcGVjaWZpZWQsIG9yIHRoZSBBcnJheSdzIGl0ZW1zVHlwZSBvdGhlcndpc2UuXHJcblx0ICogQHBhcmFtIHNlcGFyYXRvciBTZXBhcmF0b3IgdG8gYmUgdXNlZCB3aGVuIGpvaW5pbmcgc3RyaW5ncy4gV2hlbiBqb2luaW5nIFJhZG9uTWFwcywgaXQgY2FuIGJlIHVzZWQgdG8gc2V0dGxlIGJhc2Ugc2NoZW1hIG9uIHJlc3VsdGluZyBvYmplY3QuXHJcblx0ICogQHBhcmFtIG91dHB1dFR5cGUgUmFkb24gdHlwZSBvZiB0aGUgb3V0cHV0IHZhbHVlLlxyXG5cdCAqL1xyXG5cdC8vIHB1YmxpYyBqb2luPE91dHB1dFR5cGUgZXh0ZW5kcyBSYWRvbkFueSA9IFJhZG9uQW55PihzZXBhcmF0b3IgPSBcIlwiLCBvdXRwdXRUeXBlPzogeyBuZXcoKTogSXRlbXNUeXBlOyB9KSB7XHJcblx0Ly8gICAgIGlmIChvdXRwdXRUeXBlKSB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25BcnJheTxPdXRwdXRUeXBlPiwgW3NlcGFyYXRvcl0pXHJcblx0Ly8gICAgIGVsc2UgdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQXJyYXk8SXRlbXNUeXBlPiwgW3NlcGFyYXRvcl0pXHJcblx0Ly8gfVxyXG5cdC8qKlxyXG5cdCAqIENvdW50IHRoZSBudW1iZXIgb2YgaXRlbXMuXHJcblx0ICogQHJldHVybnMgQSBgUmFkb25JbnRlZ2VyYCBvYmplY3QuXHJcblx0ICovXHJcblx0cHVibGljIGxlbmd0aCgpIHtcclxuXHRcdHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25JbnRlZ2VyLCBbXSk7XHJcblx0fVxyXG5cdC8qKlxyXG5cdCAqIE1hcCBhbGwgaXRlbXMgaW4gdGhlIGFycmF5IHdpdGggdGhlIGdpdmVuIGBpbm5lclNjcmlwdGAuXHJcblx0ICogQHBhcmFtIGlubmVyU2NyaXB0IE1hcHBpbmcgc2NyaXB0IHJldHVybmluZyBzb21lIGBSYWRvbkFueWAgb2JqZWN0LlxyXG5cdCAqIE11c3QgYWNjZXB0IGFzIGlucHV0IHRoZSBzYW1lIGRhdGEgdHlwZSBhcyB0aGUgb25lIG9mIHRoZSBpdGVtcyBiZWluZyBpdGVyYXRlZC5cclxuXHQgKiBAcmV0dXJucyBBIGBSYWRvbkFycmF5YCBvYmplY3QgY29udGFpbmluZyB0aGUgbWFwcGVkIHZhbHVlcy5cclxuXHQgKi9cclxuXHRwdWJsaWMgbWFwKGlubmVyU2NyaXB0OiBSYWRvbk9wZXJhdG9yKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQXJyYXksIFtpbm5lclNjcmlwdF0pO1xyXG5cdH1cclxuXHQvLyBwdWJsaWMgbWFwPE91dHB1dEl0ZW1zVHlwZSBleHRlbmRzIFJhZG9uQW55Pihpbm5lclNjcmlwdDogUmFkb25PcGVyYXRvcjxPdXRwdXRJdGVtc1R5cGU+KSB7XHJcblx0Ly8gICAgIC8vIHRvZG86IGNoZWNrIHNjcmlwdCdzIGlucHV0IHR5cGUgbWF0Y2hlcyBhcnJheSdzIGl0ZW1zIHR5cGUsIGlmIGFueSA/P1xyXG5cdC8vICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQXJyYXk8T3V0cHV0SXRlbXNUeXBlPiwgW2lubmVyU2NyaXB0XSlcclxuXHQvLyB9XHJcblx0LyoqXHJcblx0ICogUmVkdWNlIGFsbCBpdGVtcyBpbiB0aGUgYXJyYXkgaW50byBhIHNpbmdsZSB2YWx1ZS5cclxuXHQgKiBAcGFyYW0gcmVkdWN0b3IgVGhlIHJlZHVjdG9yIG1ldGhvZCB0byBiZSBhcHBsaWVkLiBBbGwgYXJyYXkgaXRlbXMgbXVzdCBiZVxyXG5cdCAqIGNvbnZlcnRhYmxlIGludG8gZmxvYXQgdmFsdWVzLlxyXG5cdCAqIEByZXR1cm5zIEEgYFJhZG9uRmxvYXRgIG9iamVjdC5cclxuXHQgKi9cclxuXHRwdWJsaWMgcmVkdWNlKHJlZHVjdG9yOiBSYWRvblJlZHVjZXJPcGNvZGVzKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uRmxvYXQsIFtyZWR1Y3Rvcl0pO1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBPcmRlciB0aGUgYXJyYXkgaXRlbXMgYmFzZWQgZWl0aGVyIG9uIHRoZSByZXN1bHRzIG9mIGFwcGx5aW5nIHRoZSBnaXZlbiBgaW5uZXJTY3JpcHRgIHRvIGV2ZXJ5IGl0ZW0sIG9yIG9uIHRoZVxyXG5cdCAqIGFjdHVhbCBpdGVtIHZhbHVlcyAoYXMgbG9uZyBhcyB0aGVzZSBhcmUgZWl0aGVyIGludGVnZXJzIG9yIHN0cmluZ3MpLlxyXG5cdCAqIEZhaWxzIGlmIGFwcGxpZWQgb24gbm9uLWhvbWVnZW5vdXMgYXJyYXlzIChpLmUuIG5vdCBhbGwgaXRlbXMgc2hhcmluZyB0aGUgc2FtZSBgUmFkb25BbnlgKS5cclxuXHQgKiBAcGFyYW0gaW5uZXJTY3JpcHQgKE9wdGlvbmFsKSBTb3J0aW5nIHNjcmlwdCByZXR1cm5pbmcgZWl0aGVyIGEgYFJhZG9uSW50ZWdlcmAgb3IgYSBgUmFkb25TdHJpbmdgIG9iamVjdC5cclxuXHQgKiBAcmV0dXJucyBBIGBSYWRvbkFycmF5YCBvYmplY3QuXHJcblx0ICovXHJcblx0cHVibGljIHNvcnQoaW5uZXJTY3JpcHQ/OiBSYWRvbk9wZXJhdG9yKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQXJyYXk8SXRlbXNUeXBlPiwgW2lubmVyU2NyaXB0XSk7XHJcblx0fVxyXG5cdC8qKlxyXG5cdCAqIFRha2UgYSBzZWxlY3Rpb24gb2YgaXRlbXMgZnJvbSB0aGUgaW5wdXQgYXJyYXkuXHJcblx0ICogQHBhcmFtIGluZGV4ZXMgSW5kZXhlcyBvZiB0aGUgaW5wdXQgaXRlbXMgdG8gdGFrZSBpbnRvIHRoZSBvdXRwdXQgYXJyYXkuXHJcblx0ICogQHJldHVybiBBIGBSYWRvbkFycmF5YCBvYmplY3QuXHJcblx0ICovXHJcblx0Ly8gcHVibGljIHBpY2soLi4uaW5kZXhlczogbnVtYmVyW10pIHtcclxuXHQvLyAgICAgaWYgKEFycmF5KGluZGV4ZXMpLmxlbmd0aCA9PSAwKSB7XHJcblx0Ly8gICAgICAgICB0aHJvdyBuZXcgRXZhbEVycm9yKGBcXHgxYlsxOzMzbVJhZG9uQXJyYXk6OnBpY2s6IGEgbm9uLWVtcHR5IGFycmF5IG9mIG51bWJlcnMgbXVzdCBiZSBwcm92aWRlZFxceDFiWzBtYClcclxuXHQvLyAgICAgfVxyXG5cdC8vICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQXJyYXk8SXRlbXNUeXBlPiwgWy4uLmluZGV4ZXNdKVxyXG5cdC8vIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFJhZG9uQm9vbGVhbiBleHRlbmRzIFJhZG9uQW55IHtcclxuXHQvKipcclxuXHQgKiBSZXZlcnNlIHZhbHVlLlxyXG5cdCAqIEByZXR1cm5zIEEgYFJhZG9uQm9vbGVhbmAgb2JqZWN0LlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBuZWdhdGUoKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQm9vbGVhbiwgW10pO1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBDYXN0IHZhbHVlIGludG8gYSBzdHJpbmcuXHJcblx0ICogQHJldHVybnMgQSBgUmFkb25TdHJpbmdgIG9iamVjdC5cclxuXHQgKi9cclxuXHRwdWJsaWMgdG9TdHJpbmcoKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uU3RyaW5nLCBbXSk7XHJcblx0fVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUmFkb25CeXRlcyBleHRlbmRzIFJhZG9uQW55IHtcclxuXHRzdGF0aWMgcmVhZG9ubHkgRW5jb2RpbmdzID0gUmFkb25FbmNvZGluZ3M7XHJcblx0c3RhdGljIHJlYWRvbmx5IEhhc2hlcnMgPSBSYWRvbkhhc2hGdW5jdGlvbnM7XHJcblx0LyoqXHJcblx0ICogQ29udmVydCBidWZmZXIgaW50byAoYmlnLWVuZGlhbikgaW50ZWdlci5cclxuXHQgKiBAcmV0dXJucyBBIGBSYWRvbkludGVnZXJgIG9iamVjdC5cclxuXHQgKi9cclxuXHRwdWJsaWMgYXNJbnRlZ2VyKCkge1xyXG5cdFx0cmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkludGVnZXIsIFtdKTtcclxuXHR9XHJcblx0LyoqXHJcblx0ICogQXBwbHkgdGhlIFNIQTItMjU2IGhhc2ggZnVuY3Rpb24uXHJcblx0ICogQHJldHVybnMgQSBgUmFkb25CeXRlc2Agb2JqZWN0LlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBoYXNoKCkge1xyXG5cdFx0cmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkJ5dGVzLCBbUmFkb25CeXRlcy5IYXNoZXJzLlNIQTJfMjU2XSk7XHJcblx0fVxyXG5cdC8qKlxyXG5cdCAqIENvdW50IHRoZSBudW1iZXIgb2YgYnl0ZXMuXHJcblx0ICogQHJldHVybnMgQSBgUmFkb25JbnRlZ2VyYCBvYmplY3QuXHJcblx0ICovXHJcblx0cHVibGljIGxlbmd0aCgpIHtcclxuXHRcdHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25JbnRlZ2VyLCBbXSk7XHJcblx0fVxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBzbGljZSBleHRyYWN0ZWQgZnJvbSB0aGUgaW5wdXQgYnVmZmVyLlxyXG5cdCAqIEEgYHN0YXJ0SW5kZXhgIG9mIDAgcmVmZXJzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGlucHV0IGJ1ZmZlci4gSWYgbm8gYGVuZEluZGV4YCBpcyBwcm92aWRlZCwgaXQgd2lsbCBiZSBhc3N1bWVkXHJcblx0ICogdGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQgYnVmZmVyLiBOZWdhdGl2ZSB2YWx1ZXMgd2lsbCBiZSByZWxhdGl2ZSB0byB0aGUgZW5kIG9mIHRoZSBpbnB1dCBidWZmZXIuXHJcblx0ICogQHBhcmFtIHN0YXJ0SW5kZXggUG9zaXRpb24gd2l0aGluIGlucHV0IGJ1ZmZlciB3aGVyZSB0aGUgb3V0cHV0IGJ1ZmZlciB3aWxsIHN0YXJ0LlxyXG5cdCAqIEBwYXJhbSBlbmRJbmRleCBQb3NpdGlvbiB3aXRoaW4gaW5wdXQgYnVmZmVyIHdoZXJlIHRoZSBvdXRwdXQgYnVmZmVyIHdpbGwgZW5kXHJcblx0ICogQHJldHVybnMgQSBgUmFkb25CeXRlc2Agb2JqZWN0LlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBzbGljZShzdGFydEluZGV4OiBudW1iZXIgPSAwLCBlbmRJbmRleD86IG51bWJlcikge1xyXG5cdFx0cmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkJ5dGVzLCBbc3RhcnRJbmRleCwgZW5kSW5kZXhdKTtcclxuXHR9XHJcblx0LyoqXHJcblx0ICogQ29udmVydCB0aGUgaW5wdXQgYnVmZmVyIGludG8gYSBzdHJpbmcuXHJcblx0ICogQHBhcmFtIGVuY29kaW5nIEVudW0gaW50ZWdlciB2YWx1ZSBzcGVjaWZ5aW5nIHRoZSBlbmNvZGluZyBzY2hlbWEgb24gdGhlIG91dHB1dCBzdHJpbmcsIHN0YW5kaW5nOlxyXG5cdCAqICAgMCAtPiBIZXggc3RyaW5nIChkZWZhdWx0LCBpZiBub25lIHdhcyBzcGVjaWZpZWQpXHJcblx0ICogICAxIC0+IEJhc2U2NCBzdHJpbmdcclxuXHQgKiAgIDIgLT4gVXRmLTggc3RyaW5nXHJcblx0ICogQHJldHVybnMgQSBgUmFkb25TdHJpbmdgIG9iamVjdC5cclxuXHQgKi9cclxuXHRwdWJsaWMgdG9TdHJpbmcoZW5jb2RpbmcgPSBSYWRvbkVuY29kaW5ncy5IZXhTdHJpbmcpIHtcclxuXHRcdHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25TdHJpbmcsIFtlbmNvZGluZ10pO1xyXG5cdH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFJhZG9uRmxvYXQgZXh0ZW5kcyBSYWRvbkFueSB7XHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZSB0aGUgYWJzb2x1dGUgdmFsdWUuXHJcblx0ICogQHJldHVybnMgQSBgUmFkb25GbG9hdGAgb2JqZWN0LlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBhYnNvbHV0ZSgpIHtcclxuXHRcdHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25GbG9hdCwgW10pO1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBDb21wdXRlIHRoZSBsb3dlc3QgaW50ZWdlciBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGZsb2F0IHZhbHVlLlxyXG5cdCAqIEByZXR1cm5zIEEgYFJhZG9uSW50ZWdlcmAgb2JqZWN0LlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBjZWlsaW5nKCkge1xyXG5cdFx0cmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkZsb2F0LCBbXSk7XHJcblx0fVxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGUgdGhlIGdyZWF0ZXN0IGludGVnZXIgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBmbG9hdCB2YWx1ZS5cclxuXHQgKiBAcmV0dXJucyBBIGBSYWRvbkludGVnZXJgIG9iamVjdC5cclxuXHQgKi9cclxuXHRwdWJsaWMgZmxvb3IoKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uSW50ZWdlciwgW10pO1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBEZXRlcm1pbmUgaWYgdGhlIGZsb2F0IHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgZ2l2ZW4gYGlucHV0YC5cclxuXHQgKiBAcGFyYW0gaW5wdXRcclxuXHQgKiBAcmV0dXJucyBBIGBSYWRvbkJvb2xlYW5gIG9iamVjdC5cclxuXHQgKi9cclxuXHRwdWJsaWMgZ3JlYXRlclRoYW4oaW5wdXQ6IG51bWJlciB8IHN0cmluZykge1xyXG5cdFx0cmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkJvb2xlYW4sIFtpbnB1dF0pO1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBEZXRlcm1pbmUgaWYgdGhlIGZsb2F0IHZhbHVlIGlzIGxlc3MgdGhhbiB0aGUgZ2l2ZW4gYGlucHV0YC5cclxuXHQgKiBAcGFyYW0gaW5wdXRcclxuXHQgKiBAcmV0dXJucyBBIGBSYWRvbkJvb2xlYW5gIG9iamVjdC5cclxuXHQgKi9cclxuXHRwdWJsaWMgbGVzc1RoYW4oaW5wdXQ6IG51bWJlciB8IHN0cmluZykge1xyXG5cdFx0cmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkJvb2xlYW4sIFtpbnB1dF0pO1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBDb21wdXRlIHRoZSBmbG9hdCByZW1haW5kZXIgb2YgZGl2aWRpbmcgdGhlIHZhbHVlIGJ5IHRoZSBnaXZlbiBgaW50ZWdlcmAuXHJcblx0ICogQHBhcmFtIGludGVnZXJcclxuXHQgKiBAcmV0dXJucyBBIGBSYWRvbkZsb2F0YCBvYmplY3QuXHJcblx0ICovXHJcblx0cHVibGljIG1vZHVsbyhpbnRlZ2VyOiBudW1iZXIgfCBzdHJpbmcpIHtcclxuXHRcdHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25GbG9hdCwgW2ludGVnZXJdKTtcclxuXHR9XHJcblx0LyoqXHJcblx0ICogTXVsdGlwbHkgdGhlIGZsb2F0IHZhbHVlIGJ5IHRoZSBnaXZlbiBgZmFjdG9yYC5cclxuXHQgKiBAcGFyYW0gZmFjdG9yXHJcblx0ICogQHJldHVybnMgQSBgUmFkb25GbG9hdGAgb2JqZWN0LlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBtdWx0aXBseShmYWN0b3I6IG51bWJlciB8IHN0cmluZykge1xyXG5cdFx0cmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkZsb2F0LCBbZmFjdG9yXSk7XHJcblx0fVxyXG5cdC8qKlxyXG5cdCAqIE5lZ2F0ZSB0aGUgZmxvYXQgdmFsdWUuXHJcblx0ICogQHJldHVybnMgQSBgUmFkb25GbG9hdGAgb2JqZWN0LlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBuZWdhdGUoKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uRmxvYXQsIFtdKTtcclxuXHR9XHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZSB0aGUgZmxvYXQgdmFsdWUgcmFpc2VkIHRvIHRoZSBwb3dlciBvZiBnaXZlbiBgZXhwb25lbnRgXHJcblx0ICogQHBhcmFtIGV4cG9uZW50XHJcblx0ICogQHJldHVybnMgQSBgUmFkb25GbG9hdGAgb2JqZWN0LlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBwb3dlcihleHBvbmVudDogbnVtYmVyIHwgc3RyaW5nKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uRmxvYXQsIFtleHBvbmVudF0pO1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBSb3VuZCB0byB0aGUgY2xvc2VzdCBpbnRlZ2VyIHZhbHVlLlxyXG5cdCAqIEByZXR1cm5zIEEgYFJhZG9uSW50ZWdlcmAgb2JqZWN0LlxyXG5cdCAqL1xyXG5cdHB1YmxpYyByb3VuZCgpIHtcclxuXHRcdHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25JbnRlZ2VyLCBbXSk7XHJcblx0fVxyXG5cdC8qKlxyXG5cdCAqIFN0cmluZ2lmeSB0aGUgZmxvYXQgdmFsdWUuXHJcblx0ICogQHJldHVybnMgQSBgUmFkb25TdHJpbmdgIG9iamVjdC5cclxuXHQgKi9cclxuXHRwdWJsaWMgdG9TdHJpbmcoKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uU3RyaW5nLCBbXSk7XHJcblx0fVxyXG5cdC8qKlxyXG5cdCAqIFRha2UgdGhlIGludGVnZXIgcGFydCBvZiB0aGUgZmxvYXQgdmFsdWUuXHJcblx0ICogQHJldHVybnMgQSBgUmFkb25JbnRlZ2VyYCBvYmplY3QuXHJcblx0ICovXHJcblx0cHVibGljIHRydW5jYXRlKCkge1xyXG5cdFx0cmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkludGVnZXIsIFtdKTtcclxuXHR9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBSYWRvbkludGVnZXIgZXh0ZW5kcyBSYWRvbkFueSB7XHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZSB0aGUgYWJzb2x1dGUgdmFsdWUuXHJcblx0ICogQHJldHVybnMgQSBgUmFkb25JbnRlZ2VyYCBvYmplY3QuXHJcblx0ICovXHJcblx0cHVibGljIGFic29sdXRlKCkge1xyXG5cdFx0cmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkludGVnZXIsIFtdKTtcclxuXHR9XHJcblx0LyoqXHJcblx0ICogRGV0ZXJtaW5lIGlmIHRoZSBpbnRlZ2VyIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgZ2l2ZW4gYGlucHV0YC5cclxuXHQgKiBAcGFyYW0gaW5wdXRcclxuXHQgKiBAcmV0dXJucyBBIGBSYWRvbkJvb2xlYW5gIG9iamVjdC5cclxuXHQgKi9cclxuXHRwdWJsaWMgZ3JlYXRlclRoYW4oaW5wdXQ6IG51bWJlciB8IHN0cmluZykge1xyXG5cdFx0cmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkJvb2xlYW4sIFtpbnB1dF0pO1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBEZXRlcm1pbmUgaWYgdGhlIGludGVnZXIgdmFsdWUgaXMgbGVzcyB0aGFuIHRoZSBnaXZlbiBgaW5wdXRgLlxyXG5cdCAqIEBwYXJhbSBpbnB1dFxyXG5cdCAqIEByZXR1cm5zIEEgYFJhZG9uQm9vbGVhbmAgb2JqZWN0LlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBsZXNzVGhhbihpbnB1dDogbnVtYmVyIHwgc3RyaW5nKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQm9vbGVhbiwgW2lucHV0XSk7XHJcblx0fVxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGUgdGhlIHJlbWFpbmRlciBvZiBkaXZpZGluZyB0aGUgdmFsdWUgYnkgdGhlIGdpdmVuIGBpbnRlZ2VyYC5cclxuXHQgKiBAcGFyYW0gaW50ZWdlclxyXG5cdCAqIEByZXR1cm5zIEEgYFJhZG9uRmxvYXRgIG9iamVjdC5cclxuXHQgKi9cclxuXHRwdWJsaWMgbW9kdWxvKGludGVnZXI6IG51bWJlciB8IHN0cmluZykge1xyXG5cdFx0cmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkludGVnZXIsIFtpbnRlZ2VyXSk7XHJcblx0fVxyXG5cdC8qKlxyXG5cdCAqIE11bHRpcGx5IHRoZSB2YWx1ZSBieSB0aGUgZ2l2ZW4gYGludGVnZXJgLlxyXG5cdCAqIEBwYXJhbSBpbnRlZ2VyXHJcblx0ICogQHJldHVybnMgQSBgUmFkb25JbnRlZ2VyYCBvYmplY3QuXHJcblx0ICovXHJcblx0cHVibGljIG11bHRpcGx5KGludGVnZXI6IG51bWJlciB8IHN0cmluZykge1xyXG5cdFx0cmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkludGVnZXIsIFtpbnRlZ2VyXSk7XHJcblx0fVxyXG5cdC8qKlxyXG5cdCAqIE5lZ2F0ZSB0aGUgaW50ZWdlciB2YWx1ZS5cclxuXHQgKiBAcmV0dXJucyBBIGBSYWRvbkZsb2F0YCBvYmplY3QuXHJcblx0ICovXHJcblx0cHVibGljIG5lZ2F0ZSgpIHtcclxuXHRcdHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25JbnRlZ2VyLCBbXSk7XHJcblx0fVxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGUgdGhlIHZhbHVlIHJhaXNlZCB0byB0aGUgcG93ZXIgb2YgZ2l2ZW4gYGV4cG9uZW50YFxyXG5cdCAqIEBwYXJhbSBleHBvbmVudFxyXG5cdCAqIEByZXR1cm5zIEEgYFJhZG9uSW50ZWdlcmAgb2JqZWN0LlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBwb3dlcihleHBvbmVudDogbnVtYmVyIHwgc3RyaW5nKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uSW50ZWdlciwgW2V4cG9uZW50XSk7XHJcblx0fVxyXG5cdC8qKlxyXG5cdCAqIFN0cmluZ2lmeSB0aGUgdmFsdWUuXHJcblx0ICogQHJldHVybnMgQSBgUmFkb25TdHJpbmdgIG9iamVjdC5cclxuXHQgKi9cclxuXHRwdWJsaWMgdG9TdHJpbmcoKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uU3RyaW5nLCBbXSk7XHJcblx0fVxyXG5cdC8qKlxyXG5cdCAqIENhc3QgaW50byBhIGJpZy1lbmRpYW4gYnl0ZXMgYnVmZmVyLlxyXG5cdCAqIEByZXR1cm5zIEEgYFJhZG9uQnl0ZXNgIG9iamVjdC5cclxuXHQgKi9cclxuXHRwdWJsaWMgdG9CeXRlcygpIHtcclxuXHRcdHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25CeXRlcywgW10pO1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBDYXN0IGludG8gYSBmbG9hdCB2YWx1ZS5cclxuXHQgKiBAcmV0dXJucyBBIGBSYWRvbkZsb2F0YCBvYmplY3QuXHJcblx0ICovXHJcblx0cHVibGljIHRvRmxvYXQoKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uRmxvYXQsIFtdKTtcclxuXHR9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBSYWRvbk1hcCBleHRlbmRzIFJhZG9uQW55IHtcclxuXHQvKipcclxuXHQgKiBBbHRlciB0aGUgdmFsdWUgb2YgdGhlIGl0ZW0ocykgaWRlbnRpZmllZCBieSBga2V5c2AsIGFwcGx5aW5nIHRoZSBnaXZlbiBgaW5uZXJTY3JpcHRgIHRvIGVhY2ggb25lIG9mIHRoZW0uXHJcblx0ICogQHBhcmFtIGtleXNcclxuXHQgKiBAcGFyYW0gaW5uZXJTY3JpcHRcclxuXHQgKiBAcmV0dXJucyBUaGUgc2FtZSBSYWRvbk1hcCB1cG9uIHdoaWNoIHRoaXMgb3BlcmF0b3IgaXMgZXhlY3V0ZWQsIHdpdGggdGhlIHNwZWNpZmllZCBpdGVtKHMpIGFsdGVyZWRcclxuXHQgKiBieSB0aGUgZ2l2ZW4gYGlubmVyU2NyaXB0YC5cclxuXHQgKi9cclxuXHRwdWJsaWMgYWx0ZXIoaW5uZXJTY3JpcHQ6IFJhZG9uT3BlcmF0b3IsIC4uLmtleXM6IHN0cmluZ1tdKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uTWFwLCBbWy4uLmtleXNdLCBpbm5lclNjcmlwdF0pO1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBGZXRjaCB0aGUgYXJyYXkgd2l0aGluIHRoZSBzcGVjaWZpZWQgYGtleWAgZmllbGQuXHJcblx0ICogQHBhcmFtIGtleVxyXG5cdCAqIEByZXR1cm5zIEEgYFJhZG9uQXJyYXlgIG9iamVjdC5cclxuXHQgKi9cclxuXHRwdWJsaWMgZ2V0QXJyYXk8SXRlbXNUeXBlIGV4dGVuZHMgUmFkb25BbnkgPSBSYWRvbkFueT4oXHJcblx0XHRrZXk6IHN0cmluZyxcclxuXHRcdF9pdGVtc1R5cGU/OiB7IG5ldyAoKTogSXRlbXNUeXBlIH0sXHJcblx0KSB7XHJcblx0XHRyZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQXJyYXk8SXRlbXNUeXBlPiwgW2tleV0pO1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBGZXRjaCB0aGUgYm9vbGVhbiB3aXRoaW4gdGhlIHNwZWNpZmllZCBga2V5YCBmaWVsZC5cclxuXHQgKiBAcGFyYW0ga2V5XHJcblx0ICogQHJldHVybnMgQSBgUmFkb25Cb29sZWFuYCBvYmplY3QuXHJcblx0ICovXHJcblx0cHVibGljIGdldEJvb2xlYW4oa2V5OiBzdHJpbmcpIHtcclxuXHRcdHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25Cb29sZWFuLCBba2V5XSk7XHJcblx0fVxyXG5cdC8qKlxyXG5cdCAqIEZldGNoIHRoZSBmbG9hdCB2YWx1ZSB3aXRoaW4gdGhlIHNwZWNpZmllZCBga2V5YCBmaWVsZC5cclxuXHQgKiBAcGFyYW0ga2V5XHJcblx0ICogQHJldHVybnMgQSBgUmFkb25GbG9hdGAgb2JqZWN0LlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBnZXRGbG9hdChrZXk6IHN0cmluZykge1xyXG5cdFx0cmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkZsb2F0LCBba2V5XSk7XHJcblx0fVxyXG5cdC8qKlxyXG5cdCAqIEZldGNoIHRoZSBpbnRlZ2VyIHZhbHVlIHdpdGhpbiB0aGUgc3BlY2lmaWVkIGBrZXlgIGZpZWxkLlxyXG5cdCAqIEBwYXJhbSBrZXlcclxuXHQgKiBAcmV0dXJucyBBIGBSYWRvbkludGVnZXJgIG9iamVjdC5cclxuXHQgKi9cclxuXHRwdWJsaWMgZ2V0SW50ZWdlcihrZXk6IHN0cmluZykge1xyXG5cdFx0cmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkludGVnZXIsIFtrZXldKTtcclxuXHR9XHJcblx0LyoqXHJcblx0ICogRmV0Y2ggdGhlIG1hcCBvYmplY3Qgd2l0aGluIHRoZSBzcGVjaWZpZWQgYGtleWAgZmllbGQuXHJcblx0ICogQHBhcmFtIGtleVxyXG5cdCAqIEByZXR1cm5zIEEgYFJhZG9uTWFwYCBvYmplY3QuXHJcblx0ICovXHJcblx0cHVibGljIGdldE1hcChrZXk6IHN0cmluZykge1xyXG5cdFx0cmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbk1hcCwgW2tleV0pO1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBGZXRjaCB0aGUgc3RyaW5nIHdpdGhpbiB0aGUgc3BlY2lmaWVkIGBrZXlgIGZpZWxkLlxyXG5cdCAqIEBwYXJhbSBrZXlcclxuXHQgKiBAcmV0dXJucyBBIGBSYWRvblN0cmluZ2Agb2JqZWN0LlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBnZXRTdHJpbmcoa2V5OiBzdHJpbmcpIHtcclxuXHRcdHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25TdHJpbmcsIFtrZXldKTtcclxuXHR9XHJcblx0LyoqXHJcblx0ICogRXh0cmFjdCBrZXkgbmFtZXMgb2YgdGhlIG1hcCBpbnRvIGFuIGFycmF5IG9mIHN0cmluZ3MuXHJcblx0ICogQHJldHVybnMgQSBgUmFkb25BcnJheWAgb2JqZWN0LlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBrZXlzKCkge1xyXG5cdFx0cmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkFycmF5PFJhZG9uU3RyaW5nPiwgW10pO1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBUYWtlIGEgc2VsZWN0aW9uIG9mIGl0ZW1zIGZyb20gdGhlIGlucHV0IG1hcC4gRmFpbHMgaWYgdW5leGlzdGVudCBpdGVtcyBhcmUgcmVmZXJyZWQuXHJcblx0ICogQHBhcmFtIGtleXMgS2V5IHN0cmluZyBvZiB0aGUgaW5wdXQgaXRlbXMgdG8gdGFrZSBpbnRvIHRoZSBvdXRwdXQgbWFwLlxyXG5cdCAqIEByZXR1cm4gQSBgUmFkb25NYXBgIG9iamVjdC5cclxuXHQgKi9cclxuXHRwdWJsaWMgcGljayguLi5rZXlzOiBzdHJpbmdbXSkge1xyXG5cdFx0aWYgKEFycmF5KGtleXMpLmxlbmd0aCA9PT0gMCkge1xyXG5cdFx0XHR0aHJvdyBuZXcgRXZhbEVycm9yKFxyXG5cdFx0XHRcdGBcXHgxYlsxOzMzbVJhZG9uTWFwOjpwaWNrOiBhIG5vbi1lbXB0eSBhcnJheSBvZiBrZXkgc3RyaW5ncyBtdXN0IGJlIHByb3ZpZGVkXFx4MWJbMG1gLFxyXG5cdFx0XHQpO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbk1hcCwgWy4uLmtleXNdKTtcclxuXHR9XHJcblx0LyoqXHJcblx0ICogRXh0cmFjdCB0aGUgbWFwIHZhbHVlcyBpbnRvIGFuIGFycmF5LlxyXG5cdCAqIEByZXR1cm5zIEEgYFJhZG9uQXJyYXlgIG9iamVjdC5cclxuXHQgKi9cclxuXHRwdWJsaWMgdmFsdWVzKCkge1xyXG5cdFx0cmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkFycmF5LCBbXSk7XHJcblx0fVxyXG5cdC8qKlxyXG5cdCAqIFN0cmluZ2lmeSBpbnB1dCBgUmFkb25NYXBgIG9iamVjdCBpbnRvIGEgSlNPTiBzdHJpbmcuXHJcblx0ICogQHJldHVybiBBIGBSYWRvblN0cmluZ2Agb2JqZWN0LlxyXG5cdCAqL1xyXG5cdHB1YmxpYyB0b1N0cmluZygpIHtcclxuXHRcdHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25TdHJpbmcsIFtdKTtcclxuXHR9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBSYWRvblN0cmluZyBleHRlbmRzIFJhZG9uQW55IHtcclxuXHQvKipcclxuXHQgKiBDYXN0IGludG8gYSBib29sZWFuIHZhbHVlLlxyXG5cdCAqIEByZXR1cm5zIEEgYFJhZG9uQm9vbGVhbmAgb2JqZWN0LlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBhc0Jvb2xlYW4oKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQm9vbGVhbiwgW10pO1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBDb252ZXJ0IHRoZSBpbnB1dCBzdHJpbmcgaW50byBhIGJ5dGVzIGJ1ZmZlci5cclxuXHQgKiBAcGFyYW0gZW5jb2RpbmcgRW51bSBpbnRlZ2VyIHZhbHVlIHNwZWNpZnlpbmcgdGhlIGVuY29kaW5nIHNjaGVtYSBvbiB0aGUgaW5wdXQgc3RyaW5nLCBzdGFuZGluZzpcclxuXHQgKiAgIDAgLT4gSGV4IHN0cmluZyAoZGVmYXVsdCwgaWYgbm9uZSB3YXMgc3BlY2lmaWVkKVxyXG5cdCAqICAgMSAtPiBCYXNlNjQgc3RyaW5nXHJcblx0ICogQHJldHVybnMgQSBgUmFkb25CeXRlc2Agb2JqZWN0LlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBhc0J5dGVzKGVuY29kaW5nID0gUmFkb25FbmNvZGluZ3MuSGV4U3RyaW5nKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQnl0ZXMsIFtlbmNvZGluZ10pO1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBDYXN0IGludG8gYSBmbG9hdCBudW1iZXIuXHJcblx0ICogQHJldHVybnMgQSBgUmFkb25GbG9hdGAgb2JqZWN0LlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBhc0Zsb2F0KCkge1xyXG5cdFx0cmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkZsb2F0LCBbXSk7XHJcblx0fVxyXG5cdC8qKlxyXG5cdCAqIENhc3QgaW50byBhbiBpbnRlZ2VyIG51bWJlci5cclxuXHQgKiBAcmV0dXJucyBBIGBSYWRvbkludGVnZXJgIG9iamVjdC5cclxuXHQgKi9cclxuXHRwdWJsaWMgYXNJbnRlZ2VyKCkge1xyXG5cdFx0cmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkludGVnZXIsIFtdKTtcclxuXHR9XHJcblx0LyoqXHJcblx0ICogQ291bnQgdGhlIG51bWJlciBvZiBjaGFycy5cclxuXHQgKiBAcmV0dXJucyBBIGBSYWRvbkludGVnZXJgIG9iamVjdC5cclxuXHQgKi9cclxuXHRwdWJsaWMgbGVuZ3RoKCkge1xyXG5cdFx0cmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkludGVnZXIsIFtdKTtcclxuXHR9XHJcblx0LyoqXHJcblx0ICogUmVwbGFjZSB0aGUgc3RyaW5nIGJ5IGEgdmFsdWUgb2YgdHlwZSBgb3V0cHV0VHlwZWAsIGRldGVybWluZWQgb24gd2hldGhlciB0aGUgc3RyaW5nIHZhbHVlIG1hdGNoZXNcclxuXHQgKiBhbnkgb2YgdGhlIGtleXMgd2l0aGluIHRoZSBwcm92aWRlZCBgbWF0Y2hpbmdNYXBgLCBvciBzZXQgdG8gYSBgZGVmYXVsdFZhbHVlYCBpZiBubyBtYXRjaCBpcyBmb3VuZC5cclxuXHQgKiBAcGFyYW0gb3V0cHV0VHlwZSBSYWRvbiB0eXBlIG9mIHRoZSBvdXRwdXQgdmFsdWUuXHJcblx0ICogQHBhcmFtIG1hdGNoaW5nTWFwIE1hcCBkZXRlcm1pbmluZyB0aGUgb3V0cHV0IHZhbHVlIGRlcGVuZGluZyBvbiB0aGUgc3RyaW5nIHZhbHVlLlxyXG5cdCAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVmFsdWUgcmV0dXJuZWQgaWYgbm8gbWF0Y2ggaXMgZm91bmQuXHJcblx0ICogQHJldHVybnNcclxuXHQgKi9cclxuXHRwdWJsaWMgbWF0Y2g8T3V0cHV0VHlwZSBleHRlbmRzIFJhZG9uQW55ID0gUmFkb25TdHJpbmc+KFxyXG5cdFx0b3V0cHV0VHlwZTogeyBuZXcgKHByZXY/OiBSYWRvbk9wZXJhdG9yKTogT3V0cHV0VHlwZSB9LFxyXG5cdFx0bWF0Y2hpbmdNYXA6IE1hcDxzdHJpbmcsIGFueT4sXHJcblx0XHRkZWZhdWx0VmFsdWU6IGFueSxcclxuXHQpIHtcclxuXHRcdHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3Iob3V0cHV0VHlwZSwgW21hdGNoaW5nTWFwLCBkZWZhdWx0VmFsdWVdKTtcclxuXHRcdC8vIHRoaXMuX2J5dGVjb2RlID0gW1xyXG5cdFx0Ly8gICAgIDB4NzUsXHJcblx0XHQvLyAgICAgbWF0Y2hpbmdNYXAsXHJcblx0XHQvLyAgICAgZGVmYXVsdFZhbHVlXHJcblx0XHQvLyBdXHJcblx0XHQvLyB0aGlzLl9tZXRob2QgPSBcIm1hdGNoXCJcclxuXHRcdC8vIHRoaXMuX3BhcmFtcyA9IGB7ICR7T2JqZWN0LmVudHJpZXMobWF0Y2hpbmdNYXApLm1hcCgoZW50cnk6IFtzdHJpbmcsIGFueV0pID0+IGBcXFwiJHtlbnRyeVswXX1cXFwiOiAke2VudHJ5WzFdfSwgYCl9fSwgJHtkZWZhdWx0VmFsdWV9YFxyXG5cdFx0Ly8gbGV0IGtleXM6IHN0cmluZyA9IFwiXCJcclxuXHRcdC8vIE9iamVjdC5rZXlzKG1hdGNoaW5nTWFwKS5tYXAoKGtleTogc3RyaW5nKSA9PiBrZXlzICs9IGtleSArIFwiO1wiKVxyXG5cdFx0Ly8gcmV0dXJuIG5ldyBvdXRwdXRUeXBlKHRoaXMsIGtleXMpXHJcblx0fVxyXG5cdC8qKlxyXG5cdCAqIFBhcnNlIGlucHV0IHN0cmluZyBhcyBhbiBhcnJheSBvZiBKU09OIGl0ZW1zLlxyXG5cdCAqIEBwYXJhbSBqc29uUGF0aHMgKG9wdGlvbmFsKSBBcnJheSBvZiBKU09OIHBhdGhzIHdpdGhpbiBpbnB1dCBgUmFkb25TdHJpbmdgIGZyb20gd2hlcmUgdG8gZmV0Y2ggaXRlbXMgdGhhdCB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBvdXRwdXQgYFJhZG9uQXJyYXlgLlxyXG5cdCAqIEByZXR1cm5zIEEgYFJhZG9uQXJyYXlgIG9iamVjdC5cclxuXHQgKi9cclxuXHRwdWJsaWMgcGFyc2VKU09OQXJyYXkoLi4uanNvblBhdGhzOiBzdHJpbmdbXSk6IFJhZG9uQXJyYXk8UmFkb25Bbnk+IHtcclxuXHRcdHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25BcnJheTxSYWRvbkFueT4sIFsuLi5qc29uUGF0aHNdKTtcclxuXHR9XHJcblx0LyoqXHJcblx0ICogUGFyc2Ugc3RyaW5nIGFzIGEgSlNPTi1lbmNvZGVkIG1hcC5cclxuXHQgKiBAcGFyYW0ganNvblBhdGggKG9wdGlvbmFsKSBKU09OIHBhdGggd2l0aGluIGlucHV0IGBSYWRvblN0cmluZ2AgZnJvbSB3aGVyZSB0byBleHRyYWN0IHRoZSBvdXRwdXQgYFJhZG9uTWFwYC5cclxuXHQgKiBAcmV0dXJucyBBIGBSYWRvbk1hcGAgb2JqZWN0LlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBwYXJzZUpTT05NYXAoanNvblBhdGg/OiBzdHJpbmcpIHtcclxuXHRcdHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25NYXAsIFtqc29uUGF0aF0pO1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBQYXJzZSBzdHJpbmcgYXMgYW4gWE1MLWVuY29kZWQgbWFwLlxyXG5cdCAqIEByZXR1cm5zIEEgYFJhZG9uTWFwYCBvYmplY3QuXHJcblx0ICovXHJcblx0cHVibGljIHBhcnNlWE1MTWFwKCkge1xyXG5cdFx0cmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbk1hcCwgW10pO1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBSZXBsYWNlIHdpdGggZ2l2ZW4gYHJlcGxhY2VtZW50YCBzdHJpbmcsIGFsbCBwYXJ0cyBvZiB0aGUgaW5wdXQgc3RyaW5nIHRoYXQgbWF0Y2ggd2l0aCBnaXZlbiByZWd1bGFyIGV4cHJlc3Npb24uXHJcblx0ICogQHBhcmFtIHJlZ2V4IFJlZ3VsYXIgZXhwcmVzc2lvbiB0byBiZSBtYXRjaGVkLlxyXG5cdCAqIEBwYXJhbSByZXBsYWNlbWVudCBUZXh0IHRoYXQgd2lsbCByZXBsYWNlIGFsbCBvY2N1cmVuY2VzLlxyXG5cdCAqIEByZXR1cm5zIEEgYFJhZG9uU3RyaW5nYCBvYmplY3QuXHJcblx0ICovXHJcblx0cHVibGljIHJlcGxhY2UocmVnZXg6IHN0cmluZyA9IFwiXCIsIHJlcGxhY2VtZW50OiBzdHJpbmcgPSBcIlwiKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uU3RyaW5nLCBbcmVnZXgsIHJlcGxhY2VtZW50XSk7XHJcblx0fVxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBzbGljZSBleHRyYWN0ZWQgZnJvbSB0aGUgaW5wdXQgc3RyaW5nLlxyXG5cdCAqIEEgYHN0YXJ0SW5kZXhgIG9mIDAgcmVmZXJzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGlucHV0IHN0cmluZy4gSWYgbm8gYGVuZEluZGV4YCBpcyBwcm92aWRlZCwgaXQgd2lsbCBiZSBhc3N1bWVkXHJcblx0ICogdGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQgc3RyaW5nLiBOZWdhdGl2ZSB2YWx1ZXMgd2lsbCBiZSByZWxhdGl2ZSB0byB0aGUgZW5kIG9mIHRoZSBpbnB1dCBzdHJpbmcuXHJcblx0ICogQHBhcmFtIHN0YXJ0SW5kZXggUG9zaXRpb24gd2l0aGluIGlucHV0IHN0cmluZyB3aGVyZSB0aGUgb3V0cHV0IHN0cmluZyB3aWxsIHN0YXJ0LlxyXG5cdCAqIEBwYXJhbSBlbmRJbmRleCBQb3NpdGlvbiB3aXRoaW4gaW5wdXQgc3RyaW5nIHdoZXJlIHRoZSBvdXRwdXQgc3RyaW5nIHdpbGwgZW5kLlxyXG5cdCAqIEByZXR1cm5zIEEgYFJhZG9uU3RyaW5nYCBvYmplY3QuXHJcblx0ICovXHJcblx0cHVibGljIHNsaWNlKHN0YXJ0SW5kZXg6IG51bWJlciA9IDAsIGVuZEluZGV4PzogbnVtYmVyKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uU3RyaW5nLCBbc3RhcnRJbmRleCwgZW5kSW5kZXhdKTtcclxuXHR9XHJcblx0LyoqXHJcblx0ICogRGl2aWRlcyBpbnB1dCBzdHJpbmcgaW50byBhbiBhcnJheSBvZiBzdWJzdHJpbmdzLFxyXG5cdCAqIEBwYXJhbSByZWdleCBUaGUgc3RyaW5nIG9yIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byB1c2UgZm9yIHNwbGl0dGluZy5cclxuXHQgKiBAcmV0dXJucyBBIGBSYWRvbkFycmF5YCBvYmplY3QuXHJcblx0ICovXHJcblx0cHVibGljIHNwbGl0KHJlZ2V4OiBzdHJpbmcgPSBcIlxcclwiKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQXJyYXk8UmFkb25TdHJpbmc+LCBbcmVnZXhdKTtcclxuXHR9XHJcblx0LyoqXHJcblx0ICogTG93ZXIgY2FzZSBhbGwgY2hhcmFjdGVycy5cclxuXHQgKiBAcmV0dXJucyBBIGBSYWRvblN0cmluZ2Agb2JqZWN0LlxyXG5cdCAqL1xyXG5cdHB1YmxpYyB0b0xvd2VyY2FzZSgpIHtcclxuXHRcdHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25TdHJpbmcsIFtdKTtcclxuXHR9XHJcblx0LyoqXHJcblx0ICogVXBwZXIgY2FzZSBhbGwgY2hhcmFjdGVycy5cclxuXHQgKiBAcmV0dXJucyBBIGBSYWRvblN0cmluZ2Agb2JqZWN0LlxyXG5cdCAqL1xyXG5cdHB1YmxpYyB0b1VwcGVyQ2FzZSgpIHtcclxuXHRcdHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25TdHJpbmcsIFtdKTtcclxuXHR9XHJcbn1cclxuIl19